From 30ebd6b42caea0d343a2a2dbda39c49b8180e572 Mon Sep 17 00:00:00 2001 From: "Joshua M. Boniface" Date: Wed, 16 Aug 2023 23:48:56 -0400 Subject: [PATCH] Add provisioner formatters --- cli-client-new/pvc/cli/cli.py | 296 +++++++++++--------------- cli-client-new/pvc/cli/formatters.py | 70 ++++++ cli-client-new/pvc/lib/provisioner.py | 55 +++-- 3 files changed, 223 insertions(+), 198 deletions(-) diff --git a/cli-client-new/pvc/cli/cli.py b/cli-client-new/pvc/cli/cli.py index 1ccd00ca..68cbe7f4 100644 --- a/cli-client-new/pvc/cli/cli.py +++ b/cli-client-new/pvc/cli/cli.py @@ -4091,23 +4091,27 @@ def cli_provisioner_template_system_remove(name): ############################################################################### -# > pvc provisioner template system list TODO:formatter +# > pvc provisioner template system list ############################################################################### @click.command(name="list", short_help="List all system templates.") @connection_req @click.argument("limit", default=None, required=False) -def cli_provisioner_template_system_list(limit): +@format_opt( + { + "pretty": cli_provisioner_template_system_list_format_pretty, + "raw": lambda d: "\n".join([t["name"] for t in d]), + "json": lambda d: jdumps(d), + "json-pretty": lambda d: jdumps(d, indent=2), + } +) +def cli_provisioner_template_system_list(limit, format_function): """ List all system templates in the PVC cluster provisioner. """ retcode, retdata = pvc.lib.provisioner.template_list( CLI_CONFIG, limit, template_type="system" ) - if retcode: - retdata = pvc.lib.provisioner.format_list_template( - retdata, template_type="system" - ) - finish(retcode, retdata) + finish(retcode, retdata, format_function) ############################################################################### @@ -4203,23 +4207,27 @@ def cli_provisioner_template_network_remove(name): ############################################################################### -# > pvc provisioner template network list TODO:formatter +# > pvc provisioner template network list ############################################################################### @click.command(name="list", short_help="List all network templates.") @connection_req @click.argument("limit", default=None, required=False) -def cli_provisioner_template_network_list(limit): +@format_opt( + { + "pretty": cli_provisioner_template_network_list_format_pretty, + "raw": lambda d: "\n".join([t["name"] for t in d]), + "json": lambda d: jdumps(d), + "json-pretty": lambda d: jdumps(d, indent=2), + } +) +def cli_provisioner_template_network_list(limit, format_function): """ List all network templates in the PVC cluster provisioner. """ retcode, retdata = pvc.lib.provisioner.template_list( CLI_CONFIG, limit, template_type="network" ) - if retcode: - retdata = pvc.lib.provisioner.format_list_template( - retdata, template_type="network" - ) - finish(retcode, retdata) + finish(retcode, retdata, format_function) ############################################################################### @@ -4336,23 +4344,27 @@ def cli_provisioner_template_storage_remove(name): ############################################################################### -# > pvc provisioner template storage list TODO:formatter +# > pvc provisioner template storage list ############################################################################### @click.command(name="list", short_help="List all storage templates.") @connection_req @click.argument("limit", default=None, required=False) -def cli_provisioner_template_storage_list(limit): +@format_opt( + { + "pretty": cli_provisioner_template_storage_list_format_pretty, + "raw": lambda d: "\n".join([t["name"] for t in d]), + "json": lambda d: jdumps(d), + "json-pretty": lambda d: jdumps(d, indent=2), + } +) +def cli_provisioner_template_storage_list(limit, format_function): """ List all storage templates in the PVC cluster provisioner. """ retcode, retdata = pvc.lib.provisioner.template_list( CLI_CONFIG, limit, template_type="storage" ) - if retcode: - retdata = pvc.lib.provisioner.format_list_template( - retdata, template_type="storage" - ) - finish(retcode, retdata) + finish(retcode, retdata, format_function) ############################################################################### @@ -4633,32 +4645,35 @@ def cli_provisioner_userdata_show(name): ############################################################################### -# > pvc provisioner userdata list TODO:formatter +# > pvc provisioner userdata list ############################################################################### @click.command(name="list", short_help="List all userdata documents.") @connection_req @click.argument("limit", default=None, required=False) @click.option( - "-f", - "--full", - "full", + "-l", + "--long", + "long_output", is_flag=True, default=False, - help="Show all lines of the document instead of first 4.", + help="Show all lines of the document instead of first 4 ('pretty' format only).", ) -def cli_provisioner_userdata_list(limit, full): +@format_opt( + { + "pretty": cli_provisioner_userdata_list_format_pretty, + "raw": lambda d: "\n".join([u["name"] for u in d]), + "json": lambda d: jdumps(d), + "json-pretty": lambda d: jdumps(d, indent=2), + } +) +def cli_provisioner_userdata_list(limit, long_output, format_function): """ List all userdata documents in the PVC cluster provisioner. """ retcode, retdata = pvc.lib.provisioner.userdata_list(CLI_CONFIG, limit) - if retcode: - if not full: - lines = 4 - else: - lines = None - retdata = pvc.lib.provisioner.format_list_userdata(retdata, lines) - finish(retcode, retdata) + CLI_CONFIG["long_output"] = long_output + finish(retcode, retdata, format_function) ############################################################################### @@ -4812,32 +4827,35 @@ def cli_provisioner_script_show(name): ############################################################################### -# > pvc provisioner script list TODO:formatter +# > pvc provisioner script list ############################################################################### @click.command(name="list", short_help="List all scripts.") @connection_req @click.argument("limit", default=None, required=False) @click.option( - "-f", - "--full", - "full", + "-l", + "--long", + "long_output", is_flag=True, default=False, - help="Show all lines of the document instead of first 4.", + help="Show all lines of the document instead of first 4 ('pretty' format only).", ) -def cli_provisioner_script_list(limit, full): +@format_opt( + { + "pretty": cli_provisioner_script_list_format_pretty, + "raw": lambda d: "\n".join([s["name"] for s in d]), + "json": lambda d: jdumps(d), + "json-pretty": lambda d: jdumps(d, indent=2), + } +) +def cli_provisioner_script_list(limit, long_output, format_function): """ List all scripts in the PVC cluster provisioner. """ retcode, retdata = pvc.lib.provisioner.script_list(CLI_CONFIG, limit) - if retcode: - if not full: - lines = 4 - else: - lines = None - retdata = pvc.lib.provisioner.format_list_script(retdata, lines) - finish(retcode, retdata) + CLI_CONFIG["long_output"] = long_output + finish(retcode, retdata, format_function) ############################################################################### @@ -4915,20 +4933,26 @@ def cli_provisioner_ova_remove(name): ############################################################################### -# > pvc provisioner ova list TODO:formatter +# > pvc provisioner ova list ############################################################################### @click.command(name="list", short_help="List all OVA images.") @connection_req @click.argument("limit", default=None, required=False) -def cli_provisioner_ova_list(limit): +@format_opt( + { + "pretty": cli_provisioner_ova_list_format_pretty, + "raw": lambda d: "\n".join([o["name"] for o in d]), + "json": lambda d: jdumps(d), + "json-pretty": lambda d: jdumps(d, indent=2), + } +) +def cli_provisioner_ova_list(limit, format_function): """ List all OVA images in the PVC cluster provisioner. """ retcode, retdata = pvc.lib.provisioner.ova_list(CLI_CONFIG, limit) - if retcode: - retdata = pvc.lib.provisioner.format_list_ova(retdata) - finish(retcode, retdata) + finish(retcode, retdata, format_function) ############################################################################### @@ -5140,6 +5164,34 @@ def cli_provisioner_profile_remove(name): finish(retcode, retdata) +############################################################################### +# > pvc provisioner profile info +############################################################################### +# Not implemented + + +############################################################################### +# > pvc provisioner profile list +############################################################################### +@click.command(name="list", short_help="List all profiles.") +@connection_req +@click.argument("limit", default=None, required=False) +@format_opt( + { + "pretty": cli_provisioner_profile_list_format_pretty, + "raw": lambda d: "\n".join([o["name"] for o in d]), + "json": lambda d: jdumps(d), + "json-pretty": lambda d: jdumps(d, indent=2), + } +) +def cli_provisioner_profile_list(limit, format_function): + """ + List all profiles in the PVC cluster provisioner. + """ + retcode, retdata = pvc.lib.provisioner.profile_list(CLI_CONFIG, limit) + finish(retcode, retdata, format_function) + + ############################################################################### # > pvc provisioner create ############################################################################### @@ -5262,139 +5314,27 @@ def cli_provisioner_create( ############################################################################### -# > pvc provisioner status TODO:formatter +# > pvc provisioner status ############################################################################### @click.command(name="status", short_help="Show status of provisioner job.") @connection_req @click.argument("job", required=False, default=None) -def cli_provisioner_status(job): +@format_opt( + { + "pretty": cli_provisioner_status_format_pretty, + "raw": lambda d: "\n".join([t["id"] for t in d]) + if isinstance(d, list) + else d["state"], + "json": lambda d: jdumps(d), + "json-pretty": lambda d: jdumps(d, indent=2), + } +) +def cli_provisioner_status(job, format_function): """ Show status of provisioner job JOB or a list of jobs. """ retcode, retdata = pvc.lib.provisioner.task_status(CLI_CONFIG, job) - if job is None and retcode: - retdata = pvc.lib.provisioner.format_list_task(retdata) - finish(retcode, retdata) - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### - - -############################################################################### -# > pvc -############################################################################### + finish(retcode, retdata, format_function) ############################################################################### @@ -5862,6 +5802,7 @@ cli_provisioner_template_storage_disk.add_command( ) cli_provisioner_template_storage.add_command(cli_provisioner_template_storage_disk) cli_provisioner_template.add_command(cli_provisioner_template_storage) +cli_provisioner.add_command(cli_provisioner_template) cli_provisioner_userdata.add_command(cli_provisioner_userdata_add) cli_provisioner_userdata.add_command(cli_provisioner_userdata_modify) cli_provisioner_userdata.add_command(cli_provisioner_userdata_remove) @@ -5881,6 +5822,7 @@ cli_provisioner.add_command(cli_provisioner_ova) cli_provisioner_profile.add_command(cli_provisioner_profile_add) cli_provisioner_profile.add_command(cli_provisioner_profile_modify) cli_provisioner_profile.add_command(cli_provisioner_profile_remove) +cli_provisioner_profile.add_command(cli_provisioner_profile_list) cli_provisioner.add_command(cli_provisioner_profile) cli_provisioner.add_command(cli_provisioner_create) cli_provisioner.add_command(cli_provisioner_status) diff --git a/cli-client-new/pvc/cli/formatters.py b/cli-client-new/pvc/cli/formatters.py index aa3fb0a7..ba039567 100644 --- a/cli-client-new/pvc/cli/formatters.py +++ b/cli-client-new/pvc/cli/formatters.py @@ -42,6 +42,12 @@ from pvc.lib.storage import format_list_osd as storage_format_osd_list from pvc.lib.storage import format_list_pool as storage_format_pool_list from pvc.lib.storage import format_list_volume as storage_format_volume_list from pvc.lib.storage import format_list_snapshot as storage_format_snapshot_list +from pvc.lib.provisioner import format_list_template as provisioner_format_template_list +from pvc.lib.provisioner import format_list_userdata as provisioner_format_userdata_list +from pvc.lib.provisioner import format_list_script as provisioner_format_script_list +from pvc.lib.provisioner import format_list_ova as provisioner_format_ova_list +from pvc.lib.provisioner import format_list_profile as provisioner_format_profile_list +from pvc.lib.provisioner import format_list_task as provisioner_format_task_status # Define colour values for use in formatters @@ -660,3 +666,67 @@ def cli_storage_snapshot_list_format_pretty(CLI_CONFIG, data): """ return storage_format_snapshot_list(CLI_CONFIG, data) + + +def cli_provisioner_template_system_list_format_pretty(CLI_CONFIG, data): + """ + Pretty format the output of cli_provisioner_template_system_list + """ + + return provisioner_format_template_list(CLI_CONFIG, data, template_type="system") + + +def cli_provisioner_template_network_list_format_pretty(CLI_CONFIG, data): + """ + Pretty format the output of cli_provisioner_template_network_list + """ + + return provisioner_format_template_list(CLI_CONFIG, data, template_type="network") + + +def cli_provisioner_template_storage_list_format_pretty(CLI_CONFIG, data): + """ + Pretty format the output of cli_provisioner_template_storage_list + """ + + return provisioner_format_template_list(CLI_CONFIG, data, template_type="storage") + + +def cli_provisioner_userdata_list_format_pretty(CLI_CONFIG, data): + """ + Pretty format the output of cli_provisioner_userdata_list + """ + + return provisioner_format_userdata_list(CLI_CONFIG, data) + + +def cli_provisioner_script_list_format_pretty(CLI_CONFIG, data): + """ + Pretty format the output of cli_provisioner_script_list + """ + + return provisioner_format_script_list(CLI_CONFIG, data) + + +def cli_provisioner_ova_list_format_pretty(CLI_CONFIG, data): + """ + Pretty format the output of cli_provisioner_ova_list + """ + + return provisioner_format_ova_list(CLI_CONFIG, data) + + +def cli_provisioner_profile_list_format_pretty(CLI_CONFIG, data): + """ + Pretty format the output of cli_provisioner_profile_list + """ + + return provisioner_format_profile_list(CLI_CONFIG, data) + + +def cli_provisioner_status_format_pretty(CLI_CONFIG, data): + """ + Pretty format the output of cli_provisioner_status + """ + + return provisioner_format_task_status(CLI_CONFIG, data) diff --git a/cli-client-new/pvc/lib/provisioner.py b/cli-client-new/pvc/lib/provisioner.py index f533621d..cc183e22 100644 --- a/cli-client-new/pvc/lib/provisioner.py +++ b/cli-client-new/pvc/lib/provisioner.py @@ -750,24 +750,11 @@ def task_status(config, task_id=None, is_watching=False): if response.status_code == 200: retvalue = True respjson = response.json() - if is_watching: - # Just return the raw JSON to the watching process instead of formatting it + # Just return the raw JSON to the watching process instead of including value return respjson - - job_state = respjson["state"] - if job_state == "RUNNING": - retdata = "Job state: RUNNING\nStage: {}/{}\nStatus: {}".format( - respjson["current"], respjson["total"], respjson["status"] - ) - elif job_state == "FAILED": - retdata = "Job state: FAILED\nStatus: {}".format(respjson["status"]) - elif job_state == "COMPLETED": - retdata = "Job state: COMPLETED\nStatus: {}".format(respjson["status"]) else: - retdata = "Job state: {}\nStatus: {}".format( - respjson["state"], respjson["status"] - ) + return retvalue, respjson else: retvalue = False retdata = response.json().get("message", "") @@ -814,7 +801,7 @@ def task_status(config, task_id=None, is_watching=False): # # Format functions # -def format_list_template(template_data, template_type=None): +def format_list_template(config, template_data, template_type=None): """ Format the returned template template @@ -1330,7 +1317,12 @@ def format_list_template_storage(template_template): return "\n".join(template_list_output) -def format_list_userdata(userdata_data, lines=None): +def format_list_userdata(config, userdata_data): + if not config.get("long_output"): + lines = 4 + else: + lines = None + if isinstance(userdata_data, dict): userdata_data = [userdata_data] @@ -1432,7 +1424,12 @@ def format_list_userdata(userdata_data, lines=None): return "\n".join(userdata_list_output) -def format_list_script(script_data, lines=None): +def format_list_script(config, script_data): + if not config.get("long_output"): + lines = 4 + else: + lines = None + if isinstance(script_data, dict): script_data = [script_data] @@ -1531,7 +1528,7 @@ def format_list_script(script_data, lines=None): return "\n".join(script_list_output) -def format_list_ova(ova_data): +def format_list_ova(config, ova_data): if isinstance(ova_data, dict): ova_data = [ova_data] @@ -1678,7 +1675,7 @@ def format_list_ova(ova_data): return "\n".join(ova_list_output) -def format_list_profile(profile_data): +def format_list_profile(config, profile_data): if isinstance(profile_data, dict): profile_data = [profile_data] @@ -1867,7 +1864,23 @@ def format_list_profile(profile_data): return "\n".join(profile_list_output) -def format_list_task(task_data): +def format_list_task(config, task_data): + if not isinstance(task_data, list): + job_state = task_data["state"] + if job_state == "RUNNING": + retdata = "Job state: RUNNING\nStage: {}/{}\nStatus: {}".format( + task_data["current"], task_data["total"], task_data["status"] + ) + elif job_state == "FAILED": + retdata = "Job state: FAILED\nStatus: {}".format(task_data["status"]) + elif job_state == "COMPLETED": + retdata = "Job state: COMPLETED\nStatus: {}".format(task_data["status"]) + else: + retdata = "Job state: {}\nStatus: {}".format( + task_data["state"], task_data["status"] + ) + return retdata + task_list_output = [] # Determine optimal column widths