jobs/looker-utils/looker_utils/main.py (81 lines of code) (raw):
import os
from datetime import datetime, timedelta, timezone
import click
import looker_sdk
from looker_sdk import methods40 as methods
from looker_sdk.sdk.api40 import models
def setup_sdk(client_id, client_secret, instance) -> methods.Looker40SDK:
os.environ["LOOKERSDK_BASE_URL"] = instance
os.environ["LOOKERSDK_API_VERSION"] = "4.0"
os.environ["LOOKERSDK_VERIFY_SSL"] = "true"
os.environ["LOOKERSDK_TIMEOUT"] = "9000"
os.environ["LOOKERSDK_CLIENT_ID"] = client_id
os.environ["LOOKERSDK_CLIENT_SECRET"] = client_secret
return looker_sdk.init40()
@click.group()
@click.option("--client_id", "--client-id", envvar="LOOKER_CLIENT_ID", required=True)
@click.option(
"--client_secret",
"--client-secret",
envvar="LOOKER_CLIENT_SECRET",
required=True,
)
@click.option(
"--instance_uri", "--instance-uri", envvar="LOOKER_INSTANCE_URI", required=True
)
@click.pass_context
def cli(ctx: dict, client_id: str, client_secret: str, instance_uri: str):
sdk = setup_sdk(client_id, client_secret, instance_uri)
ctx.ensure_object(dict)
ctx.obj["SDK"] = sdk
@cli.command()
@click.option(
"--project",
help="Looker project name",
multiple=True,
default=["spoke-default", "looker-hub"],
)
@click.option(
"--inactive_days",
"--inactive-days",
help="Delete branches that haven't been updated within the last n days",
default=180,
)
@click.option(
"--exclude",
multiple=True,
help="Branches to exclude from deletion",
default=[
"main",
"master",
"main-dev",
"prod",
"main-validation",
"main-stage",
"base",
],
)
@click.pass_context
def delete_branches(ctx, project, inactive_days, exclude):
sdk = ctx.obj["SDK"]
date_cutoff = datetime.now().replace(tzinfo=timezone.utc) - timedelta(
days=inactive_days
)
# switch to dev mode
sdk.update_session(models.WriteApiSession(workspace_id="dev"))
for lookml_project in project:
branches = sdk.all_git_branches(project_id=lookml_project)
for branch in branches:
commit_date = datetime.fromtimestamp(branch.commit_at, timezone.utc)
if (
commit_date < date_cutoff
and not branch.name.startswith("dev")
and branch.name not in exclude
):
print(
f"{branch.name} in {lookml_project}, last commit on {commit_date}"
)
sdk.delete_git_branch(
project_id=lookml_project, branch_name=branch.name
)
if __name__ == "__main__":
cli()