deb-python-fuelclient/fuelclient/cli/arguments.py

788 lines
17 KiB
Python

# Copyright 2014 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import argparse
from itertools import chain
import os
from fuelclient import __version__
from fuelclient.cli.error import ArgumentException
from fuelclient.client import DefaultAPIClient
substitutions = {
# replace from: to
"env": "environment",
"nodes": "node",
"statuses": "status",
"net": "network",
"rel": "release",
"list": "--list",
"set": "--set",
"delete": "--delete",
"download": "--download",
"upload": "--upload",
"default": "--default",
"create": "--create",
"remove": "--delete",
"config": "--config",
"--roles": "--role",
"help": "--help",
"change-password": "--change-password",
"hostname": "--hostname",
}
def group(*args, **kwargs):
required = kwargs.get("required", False)
return (required,) + args
class ArrayAction(argparse.Action):
"""Custom argparse.Action subclass to store ids
:returns: list of ids
"""
def __call__(self, parser, namespace, values, option_string=None):
list_ids = [int(value) for value in chain(*values)]
setattr(namespace, self.dest, list_ids)
class NodeAction(argparse.Action):
"""Custom argparse.Action subclass to store node identity
:returns: list of ids
"""
def __call__(self, parser, namespace, values, option_string=None):
if values:
node_identities = set(chain(*values))
input_macs = set(n for n in node_identities if ":" in n)
only_ids = set()
for _id in (node_identities - input_macs):
try:
only_ids.add(int(_id))
except ValueError:
raise ArgumentException(
"'{0}' is not valid node id.".format(_id))
if input_macs:
nodes_mac_to_id_map = dict(
(n["mac"], n["id"])
for n in DefaultAPIClient.get_request("nodes/")
)
for short_mac in input_macs:
target_node = None
for mac in nodes_mac_to_id_map:
if mac.endswith(short_mac):
target_node = mac
break
if target_node:
only_ids.add(nodes_mac_to_id_map[target_node])
else:
raise ArgumentException(
'Node with mac endfix "{0}" was not found.'
.format(short_mac)
)
node_ids = [int(node_id) for node_id in only_ids]
setattr(namespace, self.dest, node_ids)
class SetAction(argparse.Action):
"""Custom argparse.Action subclass to store distinct values
:returns: Set of arguments
"""
def __call__(self, _parser, namespace, values, option_string=None):
try:
getattr(namespace, self.dest).update(values)
except AttributeError:
setattr(namespace, self.dest, set(values))
def get_debug_arg():
return {
"args": ["--debug"],
"params": {
"dest": "debug",
"action": "store_true",
"help": "prints details of all HTTP request",
"default": False
}
}
def get_version_arg():
return {
"args": ["-v", "--version"],
"params": {
"action": "version",
"version": __version__
}
}
def get_arg(name, flags=None, aliases=None, help_=None, **kwargs):
name = name.replace("_", "-")
args = ["--" + name, ]
if flags is not None:
args.extend(flags)
if aliases is not None:
substitutions.update(
dict((alias, args[0]) for alias in aliases)
)
all_args = {
"args": args,
"params": {
"dest": name,
"help": help_ or name
}
}
all_args["params"].update(kwargs)
return all_args
def get_boolean_arg(name, **kwargs):
kwargs.update({
"action": "store_true",
"default": False
})
return get_arg(name, **kwargs)
def get_env_arg(required=False):
return get_int_arg(
"env",
flags=("--env-id",),
help="environment id",
required=required
)
def get_single_task_arg(required=False):
return get_int_arg(
"task",
flags=("--task-id", "--tid"),
help="task id",
required=required
)
def get_new_password_arg(help_msg):
return get_str_arg(
"newpass",
flags=("--new-pass",),
help=help_msg,
required=False
)
def get_str_arg(name, **kwargs):
default_kwargs = {
"action": "store",
"type": str,
"default": None
}
default_kwargs.update(kwargs)
return get_arg(name, **default_kwargs)
def get_int_arg(name, **kwargs):
default_kwargs = {
"action": "store",
"type": int,
"default": None
}
default_kwargs.update(kwargs)
return get_arg(name, **default_kwargs)
def get_array_arg(name, **kwargs):
default_kwargs = {
"action": ArrayAction,
"nargs": '+',
"type": lambda v: v.split(","),
"default": None
}
default_kwargs.update(kwargs)
return get_arg(name, **default_kwargs)
def get_set_type_arg(name, **kwargs):
default_kwargs = {
"type": lambda v: v.split(','),
"action": SetAction,
"default": None
}
default_kwargs.update(kwargs)
return get_arg(name, **default_kwargs)
def get_delete_from_db_arg(help_msg):
return get_boolean_arg("delete-from-db", help=help_msg)
def get_deployment_tasks_arg(help_msg):
return get_boolean_arg(
"deployment-tasks", help=help_msg)
def get_attributes_arg(help_msg):
return get_boolean_arg("attributes", help=help_msg)
def get_sync_deployment_tasks_arg():
return get_boolean_arg(
"sync-deployment-tasks",
help="Update tasks for each release.")
def get_dry_run_deployment_arg():
return get_boolean_arg(
"dry-run",
dest='dry_run',
help="Specifies to dry-run a deployment by configuring task executor"
"to dump the deployment graph to a dot file.")
def get_noop_run_deployment_arg():
return get_boolean_arg(
"noop",
dest='noop_run',
help="Specifies noop-run deployment configuring tasks executor to run "
"puppet and shell tasks in noop mode and skip all other. "
"Stores noop-run result summary in nailgun database")
def get_file_pattern_arg():
return get_str_arg(
"filepattern",
flags=("--fp", "--file-pattern"),
default="*tasks.yaml",
help="Provide unix file pattern to filter tasks with files.")
def get_node_name_arg(help_msg):
return get_str_arg("name", help=help_msg)
def get_hostname_arg(help_msg):
return get_str_arg("hostname", help=help_msg)
def get_network_arg(help_msg):
return get_boolean_arg("network", flags=("--net",), help=help_msg)
def get_force_arg(help_msg):
return get_boolean_arg("force", flags=("-f",), help=help_msg)
def get_disk_arg(help_msg):
return get_boolean_arg("disk", help=help_msg)
def get_deploy_arg(help_msg):
return get_boolean_arg("deploy", help=help_msg)
def get_provision_arg(help_msg):
return get_boolean_arg("provision", help=help_msg)
def get_role_arg(help_msg):
return get_set_type_arg("role", flags=("-r",), help=help_msg)
def get_single_role_arg(help_msg):
return get_str_arg("role", flags=('--role', ), help=help_msg)
def get_check_arg(help_msg):
return get_set_type_arg("check", help=help_msg)
def get_ostf_username_arg():
return get_str_arg(
"ostf_username",
dest="ostf_username",
help="OSTF username",
required=False
)
def get_ostf_password_arg():
return get_str_arg(
"ostf_password",
dest="ostf_password",
help="OSTF password",
required=False
)
def get_ostf_tenant_name_arg():
return get_str_arg(
"ostf_tenant_name",
dest="ostf_tenant_name",
help="OSTF tenant name",
required=False
)
def get_change_password_arg(help_msg):
return get_boolean_arg("change-password", help=help_msg)
def get_name_arg(help_msg):
return get_str_arg("name", flags=("--env-name",), help=help_msg)
def get_graph_endpoint():
return get_arg(
'end',
action="store",
default=None,
help="Specify endpoint for the graph traversal.",
metavar='TASK',
)
def get_graph_startpoint():
return get_arg(
'start',
action="store",
default=None,
help="Specify start point for the graph traversal.",
metavar='TASK',
)
def get_skip_tasks():
return get_arg(
'skip',
nargs='+',
default=[],
help="Get list of tasks to be skipped.",
metavar='TASK',
)
def get_tasks():
return get_arg(
'tasks',
nargs='+',
default=[],
help="Get list of tasks to be executed.",
metavar='TASK',
)
def get_parents_arg():
return get_arg(
'parents-for',
help="Get parent for given task",
metavar='TASK',
)
def get_remove_type_arg(types):
return get_arg(
'remove',
nargs='+',
default=[],
choices=types,
help="Select task types to remove from graph.",
)
def get_nst_arg(help_msg):
return get_arg("nst",
flags=("--net-segment-type",),
action="store",
choices=("gre", "vlan", "tun"),
help_=help_msg,
default="vlan")
def get_all_arg(help_msg):
return get_boolean_arg("all", help=help_msg)
def get_create_arg(help_msg):
return get_boolean_arg(
"create",
flags=("-c", "--env-create"),
help=help_msg)
def get_download_arg(help_msg):
return get_boolean_arg("download", flags=("-d",), help=help_msg)
def get_list_arg(help_msg):
return get_boolean_arg("list", flags=("-l",), help=help_msg)
def get_dir_arg(help_msg):
return get_str_arg("dir", default=os.curdir, help=help_msg)
def get_file_arg(help_msg):
return get_str_arg("file", help=help_msg)
def get_verify_arg(help_msg):
return get_boolean_arg("verify", flags=("-v",), help=help_msg)
def get_upload_arg(help_msg):
return get_boolean_arg("upload", flags=("-u",), help=help_msg)
def get_default_arg(help_msg):
return get_boolean_arg("default", help=help_msg)
def get_set_arg(help_msg):
return get_boolean_arg("set", flags=("-s",), help=help_msg)
def get_delete_arg(help_msg):
return get_boolean_arg("delete", help=help_msg)
def get_execute_arg(help_msg):
return get_boolean_arg("execute", help=help_msg)
def get_assign_arg(help_msg):
return get_boolean_arg("assign", help=help_msg)
def get_group_arg(help_msg):
return get_set_type_arg("group", help=help_msg)
def get_node_group_arg(help_msg):
return get_set_type_arg("nodegroup", flags=("--node-group",),
help=help_msg)
def get_vlan_arg(help_msg):
return get_int_arg("vlan", help=help_msg)
def get_cidr_arg(help_msg):
return get_str_arg("cidr", help=help_msg)
def get_gateway_arg(help_msg):
return get_str_arg("gateway", help=help_msg)
def get_meta_arg(help_msg):
return get_str_arg("meta", help=help_msg)
def get_create_network_arg(help_msg):
return get_boolean_arg(
"create",
flags=("-c", "--create"),
help=help_msg)
def get_network_group_arg(help_msg):
return get_set_type_arg("network", help=help_msg)
def get_release_arg(help_msg, required=False):
return get_int_arg(
"release",
flags=("--rel",),
required=required,
help=help_msg)
def get_render_arg(help_msg):
return get_str_arg(
"render",
metavar='INPUT',
help=help_msg)
def get_tred_arg(help_msg):
return get_boolean_arg("tred", help=help_msg)
def get_node_arg(help_msg):
default_kwargs = {
"action": NodeAction,
"flags": ("--node-id",),
"nargs": '+',
"type": lambda v: v.split(","),
"default": None,
"help": help_msg
}
return get_arg("node", **default_kwargs)
def get_single_node_arg(help_msg):
return get_int_arg('node', flags=('--node-id',), help=help_msg)
def get_task_arg(help_msg):
return get_array_arg(
'task',
flags=("--task-id", "--tid"),
help=help_msg
)
def get_config_id_arg(help_msg):
return get_int_arg(
'config-id',
help=help_msg)
def get_deleted_arg(help_msg):
return get_boolean_arg(
'deleted', help=help_msg)
def get_plugin_install_arg(help_msg):
return get_str_arg(
"install",
metavar='PLUGIN_FILE',
help=help_msg
)
def get_plugin_remove_arg(help_msg):
return get_str_arg(
"remove",
metavar='PLUGIN_NAME==VERSION',
help=help_msg
)
def get_plugin_register_arg(help_msg):
return get_str_arg(
"register",
metavar='PLUGIN_NAME==VERSION',
help=help_msg
)
def get_plugin_unregister_arg(help_msg):
return get_str_arg(
"unregister",
metavar='PLUGIN_NAME==VERSION',
help=help_msg
)
def get_plugin_update_arg(help_msg):
return get_str_arg(
"update",
metavar='PLUGIN_FILE',
help=help_msg
)
def get_plugin_downgrade_arg(help_msg):
return get_str_arg(
"downgrade",
metavar='PLUGIN_FILE',
help=help_msg
)
def get_plugin_sync_arg(help_msg):
return get_boolean_arg(
"sync",
help=help_msg
)
def get_plugin_arg(help_msg):
return get_array_arg(
'plugin',
flags=('--plugin-id',),
help=help_msg
)
def get_notify_all_messages_arg(help_msg):
return get_boolean_arg(
'all',
flags=('-a',),
help=help_msg
)
def get_notify_mark_as_read_arg(help_msg):
return get_str_arg(
"mark-as-read",
flags=('-r',),
nargs='+',
help=help_msg,
)
def get_notify_message_arg(help_msg):
return get_str_arg(
"send",
nargs='+',
flags=('-m',),
help=help_msg,
)
def get_notify_send_arg(help_msg):
return get_str_arg(
"send",
flags=("--send",),
help=help_msg
)
def get_notify_topic_arg(help_msg):
return get_str_arg(
"topic",
flags=("--topic",),
choices=(
'discover',
'done',
'error',
'warning',
'release'
),
help=help_msg
)
def get_vip_arg(help_msg):
return get_boolean_arg(
"vip",
flags=("--vip",),
help=help_msg
)
def get_vip_name_arg(help_msg):
return get_str_arg(
"vip-name",
flags=("--name",),
help=help_msg
)
def get_vip_namespace_arg(help_msg, required=False):
return get_str_arg(
"vip-namespace",
flags=("--namespace",),
required=required,
help=help_msg
)
def get_ip_address_arg(help_msg):
return get_str_arg(
"ip-address",
flags=("--address", "--ip-addr"),
help=help_msg
)
def get_ip_id_arg(help_msg):
return get_int_arg(
"ip-address-id",
flags=("--ip-address-id",),
help=help_msg
)
def get_network_id_arg(help_msg):
return get_int_arg(
"network",
flags=("--network",),
help=help_msg
)
def get_network_role_arg(help_msg):
return get_str_arg(
"network-role",
flags=("--network-role",),
help=help_msg
)
def get_upload_file_arg(help_msg):
return get_str_arg(
"upload",
flags=("-u", "--upload",),
help=help_msg
)
def get_status_arg(help_msg):
default_kwargs = {
"flags": ("--status",),
"default": None,
"help": help_msg
}
return get_arg("status", **default_kwargs)
def get_deployment_node_arg(help_msg):
default_kwargs = {
"flags": ("--node-id",),
"default": None,
"help": help_msg
}
return get_arg("node", **default_kwargs)
def get_tasks_names_arg(help_msg):
default_kwargs = {
"flags": ("-d", "--task-name",),
"default": None,
"help": help_msg
}
return get_arg("task-name", **default_kwargs)
def get_show_parameters_arg(help_msg):
default_kwargs = {
"flags": ("-p", "--show-parameters",),
"help": help_msg
}
return get_boolean_arg("show-parameters", **default_kwargs)
def get_include_summary_arg(help_msg):
default_kwargs = {
"flags": ("--include-summary",),
"help": help_msg
}
return get_boolean_arg("include-summary", **default_kwargs)
def get_not_split_facts_args():
kwargs = {
"action": "store_false",
"default": True,
"dest": "split",
"help": "Do not split deployment info for node and cluster parts."
}
return get_arg('no-split', **kwargs)