def rollback(ctx, appname, cluster, revision): appname = get_appname(appname=appname) kae = ctx.obj['kae_api'] kae.set_cluster(cluster) with handle_console_err(): kae.rollback(appname, revision) click.echo(info('Rollback %s(revision %s) done.' % (appname, revision)))
def renew(ctx, appname, cluster): appname = get_appname(appname=appname) kae = ctx.obj['kae_api'] kae.set_cluster(cluster) with handle_console_err(): kae.renew(appname) click.echo(info('Renew %s done.' % (appname, )))
def kill_build_task(ctx, appname): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) with handle_console_err(): kae.kill_build_task(appname) click.echo(info('Kill app %s\'s build task done.' % (appname, )))
def register_release(ctx, appname, tag, git, f, literal, force): appname = get_appname(appname=appname) tag = get_git_tag(git_tag=tag) specs_text = get_specs_text(f, literal) if specs_text is None: errmsg = [ "specs_text is required, please use one of the instructions to specify it.", "1. specify --literal or -f in coomand line", "2. make the current workdir in the source code dir which contains app.yaml" ] fatal('\n'.join(errmsg)) kae = ctx.obj['kae_api'] git = git or get_remote_url(remote=ctx.obj['remotename']) if not git: fatal("git url not found, please check repository or pass argument") branch = get_current_branch() with handle_console_err(): kae.register_release(appname, tag, git, specs_text, branch=branch, force=force) click.echo(info('Register %s %s %s done.' % (appname, tag, git)))
def delete_app(ctx, appname): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) with handle_console_err(): ret = kae.delete_app(appname) click.echo(info(json.dumps(ret)))
def get_config(ctx, appname, cluster): kae = ctx.obj['kae_api'] kae.set_cluster(cluster) appname = get_appname(appname=appname) with handle_console_err(): d = kae.get_config(appname) newest = d.get("newest") current = d.get("current") click.echo(info("------------------ newest ----------------------")) if isinstance(newest, dict): for k, v in newest.items(): click.echo(info("key:")) click.echo(k) click.echo(info("data:")) click.echo(v) else: click.echo(newest) click.echo("\n\n") click.echo(info("----------------- current --------------------")) if isinstance(current, dict): for k, v in current.items(): click.echo(info("key:")) click.echo(k) click.echo(info("data:")) click.echo(v) else: click.echo(current)
def set_secret(ctx, appname, cluster, f, literal, replace): data = None if literal: try: data = json.loads(literal) except Exception: fatal( "can't load secret from literal, pls ensure it's a valid json") try: if f: with open(f, "r") as fp: data = json.load(fp) except Exception: fatal("can't read secret data from {}".format(f)) if data is None: fatal("you must specify literal or filename") for k, v in data.items(): if not isinstance(v, str): fatal("value of secret must be string") if not isinstance(k, str): fatal("key of secret must be string") kae = ctx.obj['kae_api'] kae.set_cluster(cluster) appname = get_appname(appname=appname) with handle_console_err(): d = kae.set_secret(appname, data, replace) click.echo(info(str(d)))
def get_secret(ctx, appname): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) with handle_console_err(): d = kae.get_secret(appname) ss = pprint.pformat(d) click.echo(info(ss))
def get_release_specs(ctx, appname, tag): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) tag = get_git_tag(git_tag=tag) with handle_console_err(): release = kae.get_release(appname, tag) click.echo(info(release['specs_text']))
def watch_app_pods(ctx, appname, cluster, raw): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) kae.set_cluster(cluster) # with handle_console_err(): watcher = kae.watch_app_pods(appname) display_pods(kae, watcher, appname, forever=True)
def delete_app_canary(ctx, appname, cluster): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) kae.set_cluster(cluster) with handle_console_err(): ret = kae.delete_app_canary(appname) click.echo(info(json.dumps(ret)))
def set_app_abtesting_rules(ctx, appname, rules, cluster): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) rules = json.loads(rules) kae.set_cluster(cluster) with handle_console_err(): ret = kae.set_app_abtesting_rules(appname, rules) click.echo(info(json.dumps(ret)))
def get_app(ctx, appname, raw): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) with handle_console_err(): app = kae.get_app(appname) if raw: click.echo(str(app)) else: table = PrettyTable(['name', 'type', 'git', 'created']) table.align['git'] = 'l' table.add_row([app['name'], app['type'], app['git'], app['created']]) click.echo(table)
def register_release(ctx, appname, tag, git, f, literal): appname = get_appname(appname=appname) tag = get_git_tag(git_tag=tag) specs_text = get_specs_text(f, literal) kae = ctx.obj['kae_api'] git = git or get_remote_url(remote=ctx.obj['remotename']) if not git: fatal("git url not found, please check repository or pass argument") branch = get_current_branch() with handle_console_err(): kae.register_release(appname, tag, git, specs_text, branch=branch) click.echo(info('Register %s %s %s done.' % (appname, tag, git)))
def get_config(ctx, appname): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) with handle_console_err(): d = kae.get_config(appname) if isinstance(d, dict): for k, v in d.items(): click.echo(info("key:")) click.echo(k) click.echo(info("data:")) click.echo(v) else: click.echo(d)
def get_app_releases(ctx, appname, raw): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) with handle_console_err(): releases = kae.get_app_releases(appname) if raw: click.echo(str(releases)) else: table = PrettyTable(['name', 'tag', 'created']) for r in releases: table.add_row([appname, r['tag'], r['created']]) click.echo(table)
def get_release(ctx, appname, tag, raw): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) tag = get_git_tag(git_tag=tag) with handle_console_err(): r = kae.get_release(appname, tag) if raw: click.echo(str(r)) else: table = PrettyTable(['name', 'tag', 'created']) table.add_row([appname, r['tag'], r['created']]) click.echo(table)
def set_config(ctx, appname, name, f, literal): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) if literal: data = literal elif f: try: with open(f, "r") as fp: data = fp.read() except Exception: fatal("can't read config data from {}".format(f)) with handle_console_err(): d = kae.set_config(appname, name, data) ss = pprint.pformat(d) click.echo(info(ss))
def test(appname, tag, f, literal): """build test image and run test script in app.yaml""" repo_dir = os.getcwd() if f: repo_dir = os.path.dirname(os.path.abspath(f)) appname = get_appname(cwd=repo_dir, appname=appname) tag = get_git_tag(cwd=repo_dir, git_tag=tag, required=False) if tag is None: tag = 'latest' specs_text = get_specs_text(f, literal) if specs_text is None: errmsg = [ "specs_text is required, please use one of the instructions to specify it.", "1. specify --literal or -f in coomand line", "2. make the current workdir in the source code dir which contains app.yaml" ] fatal('\n'.join(errmsg)) try: yaml_dict = yaml.load(specs_text) except yaml.YAMLError as e: fatal('specs text is invalid yaml {}'.format(str(e))) try: specs = app_specs_schema.load(yaml_dict).data except Exception as e: fatal('specs text is invalid: {}'.format(str(e))) if "test" not in specs: fatal("no test specified in app.yaml") builds = specs['test']['builds'] if len(builds) == 0: builds = specs["builds"] for build in builds: image_tag = build.tag if build.tag else tag dockerfile = build.get('dockerfile', None) if dockerfile is None: dockerfile = os.path.join(repo_dir, "Dockerfile") full_image_name = "{}:{}".format(build.name, image_tag) build_image(full_image_name, repo_dir, None, dockerfile=dockerfile) default_image_name = "{}:{}".format(appname, tag) for entrypoint in specs['test']['entrypoints']: image = entrypoint.image if entrypoint.image else default_image_name cmd = entrypoint.script volumes = entrypoint.get('volumes', []) run_container(image, volumes, cmd)
def get_app_pods(ctx, appname, raw): kae = ctx.obj['kae_api'] appname = get_appname(appname=appname) with handle_console_err(): pods = kae.get_app_pods(appname) if raw: click.echo(str(pods)) else: table = PrettyTable(['name', 'status', 'ready']) for item in pods['items']: name = item['metadata']['name'] status = item['status']['phase'] ready = sum([ 1 if c_status['ready'] else 0 for c_status in item['status']['container_statuses'] ]) table.add_row([name, status, ready]) click.echo(table)