Add provisioner formatters

This commit is contained in:
Joshua Boniface 2023-08-16 23:48:56 -04:00
parent b2e6feeba3
commit 30ebd6b42c
3 changed files with 223 additions and 198 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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