From 6267116c7d9907533853f9633b4ea087d6cf78e5 Mon Sep 17 00:00:00 2001 From: tengqm Date: Mon, 2 Nov 2015 04:41:30 -0500 Subject: [PATCH] Revised client interface This is an effort to make the interface exposed by senlinclient more usable for other software. Eventually, all these logic will go to either openstackclient or openstacksdk, but for now we keep it locally to make things work. Change-Id: I25fdb0f3bb224951256ccb0eeafa09e906195805 --- senlinclient/v1/client.py | 254 ++++++++++++++++++++++++++++ senlinclient/v1/shell.py | 338 +++++++++++++------------------------- 2 files changed, 368 insertions(+), 224 deletions(-) diff --git a/senlinclient/v1/client.py b/senlinclient/v1/client.py index fa70ae1c..995ada55 100644 --- a/senlinclient/v1/client.py +++ b/senlinclient/v1/client.py @@ -17,6 +17,7 @@ from openstack import transport as trans from senlinclient.common import exc as client_exc from senlinclient.common import sdk +from senlinclient.v1 import models class Client(object): @@ -31,6 +32,259 @@ class Client(object): self.session = session self.auth = session.authenticator + ###################################################################### + # The following operations are interfaces exposed to other software + # which invokes senlinclient today. + # These methods form a temporary translation layer. This layer will be + # useless when OpenStackSDK has adopted all senlin resources. + ###################################################################### + + def get_build_info(self, **kwargs): + return self.get(models.BuildInfo) + + def profile_types(self, **kwargs): + return self.list(models.ProfileType, paginated=False) + + def get_profile_type_schema(self, value): + params = {'profile_type': value} + return self.get(models.ProfileTypeSchema, params) + + def profiles(self, **queries): + return self.list(models.Profile, **queries) + + def create_profile(self, **attrs): + return self.create(models.Profile, attrs) + + def get_profile(self, value): + return self.get(models.Profile, dict(id=value)) + + def update_profile(self, value, **attrs): + return self.update(models.Profile, attrs) + + def delete_profile(self, value, ignore_missing=True): + return self.delete(models.Profile, + dict(id=value, ignore_missing=ignore_missing)) + + def policy_types(self, **kwargs): + return self.list(models.PolicyType, paginated=False) + + def get_policy_type_schema(self, value): + params = {'policy_type': value} + return self.get(models.PolicyTypeSchema, params) + + def webhooks(self, **queries): + return self.list(models.Webhook, **queries) + + def create_webhook(self, **attrs): + return self.create(models.Webhook, attrs, extra_attrs=True) + + def get_webhook(self, value): + return self.get(models.Webhook, dict(id=value)) + + def delete_webhook(self, value, ignore_missing=True): + return self.delete(models.Webhook, + dict(id=value, ignore_missing=ignore_missing)) + + def policies(self, **queries): + return self.list(models.Policy, **queries) + + def create_policy(self, **attrs): + return self.create(models.Policy, attrs) + + def get_policy(self, value): + return self.get(models.Policy, dict(id=value)) + + def update_policy(self, value, **attrs): + attrs['id'] = value + return self.update(models.Policy, attrs) + + def delete_policy(self, value, ignore_missing=True): + return self.delete(models.Policy, + dict(id=value, ignore_missing=ignore_missing)) + + def clusters(self, **queries): + return self.list(models.Cluster, **queries) + + def create_cluster(self, **attrs): + return self.create(models.Cluster, attrs) + + def get_cluster(self, value): + return self.get(models.Cluster, dict(id=value)) + + def update_cluster(self, value, **attrs): + attrs['id'] = value + return self.update(models.Cluster, attrs) + + def delete_cluster(self, value, ignore_missing=True): + return self.delete(models.Cluster, + dict(id=value, ignore_missing=ignore_missing)) + + def cluster_add_nodes(self, value, nodes): + params = { + 'id': value, + 'action': 'add_nodes', + 'action_args': { + 'nodes': nodes, + } + } + return self.action(models.Cluster, params) + + def cluster_del_nodes(self, value, nodes): + params = { + 'id': value, + 'action': 'del_nodes', + 'action_args': { + 'nodes': nodes, + } + } + return self.action(models.Cluster, params) + + def cluster_resize(self, value, **kwargs): + params = { + 'id': value, + 'action': 'resize', + 'action_args': kwargs, + } + return self.action(models.Cluster, params) + + def cluster_scale_out(self, value, count): + params = { + 'id': value, + 'action': 'scale_out', + 'action_args': { + 'count': count + } + } + return self.action(models.Cluster, params) + + def cluster_scale_in(self, value, count): + params = { + 'id': value, + 'action': 'scale_in', + 'action_args': { + 'count': count + } + } + return self.action(models.Cluster, params) + + def cluster_policies(self, value, **queries): + return self.list(models.ClusterPolicy, path_args={'cluster_id': value}, + **queries) + + def get_cluster_policy(self, value): + return self.get(models.ClusterPolicy, value) + + def cluster_attach_policy(self, value, **kwargs): + params = { + 'id': value, + 'action': 'policy_attach', + 'action_args': kwargs + } + return self.action(models.Cluster, params) + + def cluster_detach_policy(self, value, policy): + params = { + 'id': value, + 'action': 'policy_detach', + 'action_args': { + 'policy_id': policy, + } + } + return self.action(models.Cluster, params) + + def cluster_update_policy(self, value, **attrs): + params = { + 'id': value, + 'action': 'policy_update', + 'action_args': attrs + } + return self.action(models.Cluster, params) + + def cluster_enable_policy(self, value, policy): + params = { + 'id': value, + 'action': 'policy_enable', + 'action_args': { + 'policy_id': policy + } + } + return self.action(models.Cluster, params) + + def cluster_disable_policy(self, value, policy): + params = { + 'id': value, + 'action': 'policy_disable', + 'action_args': { + 'policy_id': policy + } + } + return self.action(models.Cluster, params) + + def nodes(self, **queries): + return self.list(models.Node, **queries) + + def create_node(self, **attrs): + return self.create(models.Node, attrs) + + def get_node(self, value, show_details=False): + return self.get_with_args(models.Node, + dict(id=value, show_details=show_details)) + + def update_node(self, value, **attrs): + attrs['id'] = value + return self.update(models.Node, attrs) + + def delete_node(self, value, ignore_missing=True): + return self.delete(models.Node, + dict(id=value, ignore_missing=ignore_missing)) + + def node_join(self, value, cluster): + params = { + 'id': value, + 'action': 'join', + 'action_args': { + 'cluster_id': cluster, + } + } + return self.action(models.Node, params) + + def node_leave(self, value): + params = { + 'id': value, + 'action': 'leave', + } + return self.action(models.Node, params) + + def triggers(self, **queries): + return self.list(models.Trigger, **queries) + + def create_trigger(self, **attrs): + return self.create(models.Trigger, attrs) + + def get_trigger(self, value): + return self.get(models.Trigger, dict(id=value)) + + def delete_trigger(self, value, ignore_missing=True): + return self.delete(models.Trigger, + dict(id=value, ignore_missing=ignore_missing)) + + def events(self, **queries): + return self.list(models.Event, **queries) + + def get_event(self, value): + return self.get(models.Event, dict(id=value)) + + def actions(self, **queries): + return self.list(models.Action, **queries) + + def get_action(self, value): + return self.get(models.Action, dict(id=value)) + + ###################################################################### + # The operations below should go away when Senlin resources are all + # adopted into OpenStack SDK. + ###################################################################### + def get_options(self, options): return json.loads(options) diff --git a/senlinclient/v1/shell.py b/senlinclient/v1/shell.py index 1326f841..29fbb113 100644 --- a/senlinclient/v1/shell.py +++ b/senlinclient/v1/shell.py @@ -22,9 +22,14 @@ from senlinclient.v1 import models logger = logging.getLogger(__name__) -def do_build_info(sc, args): - '''Retrieve build information.''' - result = sc.get(models.BuildInfo) +def do_build_info(sc, args=None): + """Retrieve build information. + + :param sc: Instance of senlinclient. + :param args: Additional command line arguments, if any. + """ + result = sc.get_build_info() + formatters = { 'api': utils.json_formatter, 'engine': utils.json_formatter, @@ -35,9 +40,13 @@ def do_build_info(sc, args): # PROFILE TYPES -def do_profile_type_list(sc, args): - '''List the available profile types.''' - types = sc.list(models.ProfileType, paginated=False) +def do_profile_type_list(sc, args=None): + """List the available profile types. + + :param sc: Instance of senlinclient. + :param args: Additional command line arguments, if any. + """ + types = sc.profile_types() utils.print_list(types, ['name'], sortby_index=0) @@ -49,8 +58,7 @@ def do_profile_type_list(sc, args): def do_profile_type_schema(sc, args): '''Get the spec of a profile type.''' try: - params = {'profile_type': args.profile_type} - schema = sc.get(models.ProfileTypeSchema, params) + schema = sc.get_profile_type_schema(args.profile_type) except exc.HTTPNotFound: raise exc.CommandError( _('Profile Type %s not found.') % args.profile_type) @@ -86,7 +94,7 @@ def do_profile_list(sc, args=None): 'marker': args.marker, } - profiles = sc.list(models.Profile, **queries) + profiles = sc.profiles(**queries) formatters = {} if not args.full_id: formatters = { @@ -97,8 +105,7 @@ def do_profile_list(sc, args=None): def _show_profile(sc, profile_id): try: - params = {'id': profile_id} - profile = sc.get(models.Profile, params) + profile = sc.get_profile(profile_id) except exc.HTTPNotFound: raise exc.CommandError(_('Profile not found: %s') % profile_id) @@ -148,7 +155,7 @@ def do_profile_create(sc, args): 'metadata': utils.format_parameters(args.metadata), } - profile = sc.create(models.Profile, params) + profile = sc.create_profile(**params) _show_profile(sc, profile.id) @@ -190,35 +197,29 @@ def do_profile_update(sc, args): # Find the profile first, we need its id try: - profile = sc.get(models.Profile, {'id': args.id}) + profile = sc.get_profile(args.id) except exc.HTTPNotFound: raise exc.CommandError(_('Profile not found: %s') % args.id) params['id'] = profile.id - sc.update(models.Profile, params) + sc.update_profile(params) _show_profile(sc, profile.id) -@utils.arg('-f', '--force', default=False, action="store_true", - help=_('Delete the profile completely from database.')) @utils.arg('id', metavar='', nargs='+', help=_('Name or ID of profile(s) to delete.')) def do_profile_delete(sc, args): '''Delete profile(s).''' failure_count = 0 - for cid in args.id: + for pid in args.id: try: - query = { - 'id': cid, - 'force': args.force - } - sc.delete(models.Profile, query) - except exc.HTTPNotFound as ex: + sc.delete_profile(pid) + except Exception as ex: failure_count += 1 print(ex) - if failure_count == len(args.id): - msg = _('Failed to delete any of the specified profile(s).') + if failure_count > 0: + msg = _('Failed to delete some of the specified profile(s).') raise exc.CommandError(msg) print('Profile deleted: %s' % args.id) @@ -228,7 +229,7 @@ def do_profile_delete(sc, args): def do_policy_type_list(sc, args): '''List the available policy types.''' - types = sc.list(models.PolicyType, paginated=False) + types = sc.policy_types() utils.print_list(types, ['name'], sortby_index=0) @@ -254,14 +255,12 @@ def do_policy_type_show(sc, args): def do_policy_type_schema(sc, args): '''Get the spec of a policy type.''' try: - params = {'policy_type': args.policy_type} - schema = sc.get(models.PolicyTypeSchema, params) + schema = sc.get_policy_type_schema(args.policy_type) except exc.HTTPNotFound: raise exc.CommandError( _('Policy type %s not found.') % args.policy_type) schema = dict(schema) - if args.format: print(utils.format_output(schema, format=args.format)) else: @@ -292,7 +291,7 @@ def do_webhook_list(sc, args=None): 'marker': args.marker, } - webhooks = sc.list(models.Webhook, **queries) + webhooks = sc.webhooks(**queries) formatters = {} if not args.full_id: formatters = { @@ -304,8 +303,7 @@ def do_webhook_list(sc, args=None): def _show_webhook(sc, webhook_id=None, webhook=None): if webhook is None: try: - params = {'id': webhook_id} - webhook = sc.get(models.Webhook, params) + webhook = sc.get_webhook(webhook_id) except exc.HTTPNotFound: raise exc.CommandError(_('Webhook not found: %s') % webhook_id) @@ -361,7 +359,7 @@ def do_webhook_create(sc, args): 'params': utils.format_parameters(args.params) } - webhook = sc.create(models.Webhook, params, True) + webhook = sc.create_webhook(**params) _show_webhook(sc, webhook=webhook) @@ -371,17 +369,14 @@ def do_webhook_delete(sc, args): '''Delete webhook(s).''' failure_count = 0 - for cid in args.id: + for wid in args.id: try: - query = { - 'id': cid, - } - sc.delete(models.Webhook, query) + sc.delete_webhook(wid) except exc.HTTPNotFound as ex: failure_count += 1 print(ex) - if failure_count == len(args.id): - msg = _('Failed to delete any of the specified webhook(s).') + if failure_count > 0: + msg = _('Failed to delete some of the specified webhook(s).') raise exc.CommandError(msg) print('Webhook deleted: %s' % args.id) @@ -409,7 +404,7 @@ def do_policy_list(sc, args=None): 'marker': args.marker, } - policies = sc.list(models.Policy, **queries) + policies = sc.policies(**queries) formatters = {} if not args.full_id: formatters = { @@ -421,8 +416,7 @@ def do_policy_list(sc, args=None): def _show_policy(sc, policy_id=None, policy=None): if policy is None: try: - params = {'id': policy_id} - policy = sc.get(models.Policy, params) + policy = sc.get_policy(policy_id) except exc.HTTPNotFound: raise exc.CommandError(_('Policy not found: %s') % policy_id) @@ -446,14 +440,14 @@ def _show_policy(sc, policy_id=None, policy=None): def do_policy_create(sc, args): '''Create a policy.''' spec = utils.get_spec_content(args.spec_file) - params = { + attrs = { 'name': args.name, 'spec': spec, 'cooldown': args.cooldown, 'level': args.enforcement_level, } - policy = sc.create(models.Policy, params) + policy = sc.create_policy(**attrs) _show_policy(sc, policy=policy) @@ -482,33 +476,27 @@ def do_policy_update(sc, args): 'level': args.enforcement_level, } - policy = sc.get(models.Policy, {'id': args.id}) + policy = sc.get_policy(args.id) if policy is not None: params['id'] = policy.id - sc.update(models.Policy, params) + sc.update_policy(policy.id, params) _show_policy(sc, policy_id=policy.id) -@utils.arg('-f', '--force', default=False, action="store_true", - help=_('Delete the policy completely from database.')) @utils.arg('id', metavar='', nargs='+', help=_('Name or ID of policy(s) to delete.')) def do_policy_delete(sc, args): '''Delete policy(s).''' failure_count = 0 - for cid in args.id: + for pid in args.id: try: - query = { - 'id': cid, - 'force': args.force - } - sc.delete(models.Policy, query) + sc.delete_policy(pid) except exc.HTTPNotFound as ex: failure_count += 1 print(ex) - if failure_count == len(args.id): - msg = _('Failed to delete any of the specified policy(s).') + if failure_count > 0: + msg = _('Failed to delete some of the specified policy(s).') raise exc.CommandError(msg) print('Policy deleted: %s' % args.id) @@ -569,7 +557,7 @@ def do_cluster_list(sc, args=None): else: sortby_index = 3 - clusters = sc.list(models.Cluster, **queries) + clusters = sc.clusters(**queries) formatters = {} if not args.full_id: formatters = { @@ -581,8 +569,7 @@ def do_cluster_list(sc, args=None): def _show_cluster(sc, cluster_id): try: - query = {'id': cluster_id} - cluster = sc.get(models.Cluster, query) + cluster = sc.get_cluster(cluster_id) except exc.HTTPNotFound: raise exc.CommandError(_('Cluster %s is not found') % cluster_id) @@ -614,7 +601,7 @@ def _show_cluster(sc, cluster_id): help=_('Name of the cluster to create.')) def do_cluster_create(sc, args): '''Create the cluster.''' - params = { + attrs = { 'name': args.name, 'profile_id': args.profile, 'min_size': args.min_size, @@ -625,7 +612,7 @@ def do_cluster_create(sc, args): 'timeout': args.timeout } - cluster = sc.create(models.Cluster, params) + cluster = sc.create_cluster(**attrs) _show_cluster(sc, cluster.id) @@ -637,13 +624,12 @@ def do_cluster_delete(sc, args): for cid in args.id: try: - query = {'id': cid} - sc.delete(models.Cluster, query) + sc.delete_cluster(cid) except exc.HTTPNotFound as ex: failure_count += 1 print(ex) - if failure_count == len(args.id): - msg = _('Failed to delete any of the specified clusters.') + if failure_count > 0: + msg = _('Failed to delete some of the specified clusters.') raise exc.CommandError(msg) print('Request accepted') @@ -666,9 +652,8 @@ def do_cluster_delete(sc, args): help=_('Name or ID of cluster to be updated.')) def do_cluster_update(sc, args): '''Update the cluster.''' - cluster = sc.get(models.Cluster, {'id': args.id}) - params = { - 'id': cluster.id, + cluster = sc.get_cluster(args.id) + attrs = { 'name': args.name, 'profile_id': args.profile, 'parent': args.parent, @@ -676,7 +661,7 @@ def do_cluster_update(sc, args): 'timeout': args.timeout, } - sc.update(models.Cluster, params) + sc.update_cluster(cluster.id, **attrs) _show_cluster(sc, cluster.id) @@ -720,7 +705,7 @@ def do_cluster_node_list(sc, args): queries.update(utils.format_parameters(args.filters)) try: - nodes = sc.list(models.Node, **queries) + nodes = sc.nodes(**queries) except exc.HTTPNotFound: msg = _('No node matching criteria is found') raise exc.CommandError(msg) @@ -745,15 +730,8 @@ def do_cluster_node_list(sc, args): def do_cluster_node_add(sc, args): '''Add specified nodes to cluster.''' node_ids = args.nodes.split(',') - params = { - 'id': args.id, - 'action': 'add_nodes', - 'action_args': { - 'nodes': node_ids, - } - } - resp = sc.action(models.Cluster, params) - print('Request accepted by action %s' % resp['action']) + resp = sc.cluster_add_nodes(args.id, node_ids) + print('Request accepted by action: %s' % resp['action']) @utils.arg('-n', '--nodes', metavar='', required=True, @@ -764,15 +742,8 @@ def do_cluster_node_add(sc, args): def do_cluster_node_del(sc, args): '''Delete specified nodes from cluster.''' node_ids = args.nodes.split(',') - params = { - 'id': args.id, - 'action': 'del_nodes', - 'action_args': { - 'nodes': node_ids, - } - } - resp = sc.action(models.Cluster, params) - print('Request accepted by action %s' % resp['action']) + resp = sc.cluster_del_nodes(args.id, node_ids) + print('Request accepted by action: %s' % resp['action']) @utils.arg('-c', '--capacity', metavar='', type=int, @@ -865,14 +836,8 @@ def do_cluster_resize(sc, args): action_args['min_step'] = min_step action_args['strict'] = args.strict - params = { - 'id': args.id, - 'action': 'resize', - 'action_args': action_args, - } - - resp = sc.action(models.Cluster, params) - print('Request accepted by action %s' % resp['action']) + resp = sc.cluster_resize(args.id, **action_args) + print('Request accepted by action: %s' % resp['action']) @utils.arg('-c', '--count', metavar='', @@ -881,15 +846,7 @@ def do_cluster_resize(sc, args): help=_('Name or ID of cluster to operate on.')) def do_cluster_scale_out(sc, args): '''Scale out a cluster by the specified number of nodes.''' - params = { - 'id': args.id, - 'action': 'scale_out', - 'action_args': { - 'count': args.count - } - } - - resp = sc.action(models.Cluster, params) + resp = sc.cluster_scale_out(args.id, args.count) print('Request accepted by action %s' % resp['action']) @@ -899,17 +856,7 @@ def do_cluster_scale_out(sc, args): help=_('Name or ID of cluster to operate on.')) def do_cluster_scale_in(sc, args): '''Scale in a cluster by the specified number of nodes.''' - if args.count is not None: - action_args = {'count': args.count} - else: - action_args = {} - - params = { - 'id': args.id, - 'action': 'scale_in', - 'action_args': action_args, - } - resp = sc.action(models.Cluster, params) + resp = sc.cluster_scale_in(args.id, args.count) print('Request accepted by action %s' % resp['action']) @@ -926,13 +873,11 @@ def do_cluster_scale_in(sc, args): help=_('Name or ID of cluster to query on.')) def do_cluster_policy_list(sc, args): '''List policies from cluster.''' - query = {'id': args.id} - cluster = sc.get(models.Cluster, query) - fields = ['policy_id', 'policy', 'type', 'priority', 'level', 'cooldown', 'enabled'] sort_keys = ['priority', 'level', 'cooldown', 'enabled'] + cluster = sc.get_cluster(args.id) queries = { 'sort_keys': args.sort_keys, 'sort_dir': args.sort_dir, @@ -949,9 +894,7 @@ def do_cluster_policy_list(sc, args): else: sortby_index = 3 - policies = sc.list(models.ClusterPolicy, - path_args={'cluster_id': cluster.id}, - **queries) + policies = sc.cluster_policies(cluster.id, **queries) utils.print_list(policies, fields, sortby_index=sortby_index) @@ -965,7 +908,7 @@ def do_cluster_policy_show(sc, args): 'cluster_id': args.id, 'policy_id': args.policy } - binding = sc.get(models.ClusterPolicy, queries) + binding = sc.get_cluster_policy(queries) utils.print_dict(binding.to_dict()) @@ -988,20 +931,16 @@ def do_cluster_policy_show(sc, args): help=_('Name or ID of cluster to operate on.')) def do_cluster_policy_attach(sc, args): '''Attach policy to cluster.''' - params = { - 'id': args.id, - 'action': 'policy_attach', - 'action_args': { - 'policy_id': args.policy, - 'priority': args.priority, - 'level': args.enforcement_level, - 'cooldown': args.cooldown, - 'enabled': args.enabled, - } + kwargs = { + 'policy_id': args.policy, + 'priority': args.priority, + 'level': args.enforcement_level, + 'cooldown': args.cooldown, + 'enabled': args.enabled, } - resp = sc.action(models.Cluster, params) - print('Request accepted by action %s' % resp['action']) + resp = sc.cluster_attach_policy(args.id, **kwargs) + print('Request accepted by action: %s' % resp['action']) @utils.arg('-p', '--policy', metavar='', required=True, @@ -1010,15 +949,7 @@ def do_cluster_policy_attach(sc, args): help=_('Name or ID of cluster to operate on.')) def do_cluster_policy_detach(sc, args): '''Detach policy from cluster.''' - params = { - 'id': args.id, - 'action': 'policy_detach', - 'action_args': { - 'policy_id': args.policy, - } - } - - resp = sc.action(models.Cluster, params) + resp = sc.cluster_detach_policy(args.id, args.policy) print('Request accepted by action %s' % resp['action']) @@ -1038,20 +969,16 @@ def do_cluster_policy_detach(sc, args): help=_('Name or ID of cluster to operate on.')) def do_cluster_policy_update(sc, args): '''Update a policy on cluster.''' - params = { - 'id': args.id, - 'action': 'policy_update', - 'action_args': { - 'policy_id': args.policy, - 'priority': args.priority, - 'level': args.enforcement_level, - 'cooldown': args.cooldown, - 'enabled': args.enabled, - } + kwargs = { + 'policy_id': args.policy, + 'priority': args.priority, + 'level': args.enforcement_level, + 'cooldown': args.cooldown, + 'enabled': args.enabled, } - resp = sc.action(models.Cluster, params) - print('Request accepted by action %s' % resp['action']) + resp = sc.cluster_update_policy(args.id, **kwargs) + print('Request accepted by action: %s' % resp['action']) @utils.arg('-p', '--policy', metavar='', required=True, @@ -1060,15 +987,8 @@ def do_cluster_policy_update(sc, args): help=_('Name or ID of cluster to operate on.')) def do_cluster_policy_enable(sc, args): '''Enable a policy on cluster.''' - params = { - 'id': args.id, - 'action': 'policy_enable', - 'action_args': { - 'policy_id': args.policy, - } - } - resp = sc.action(models.Cluster, params) - print('Request accepted by action %s' % resp['action']) + resp = sc.cluster_enable_policy(args.id, args.policy) + print('Request accepted by action: %s' % resp['action']) @utils.arg('-p', '--policy', metavar='', required=True, @@ -1077,15 +997,8 @@ def do_cluster_policy_enable(sc, args): help=_('Name or ID of cluster to operate on.')) def do_cluster_policy_disable(sc, args): '''Disable a policy on a cluster.''' - params = { - 'id': args.id, - 'action': 'policy_disable', - 'action_args': { - 'policy_id': args.policy, - } - } - resp = sc.action(models.Cluster, params) - print('Request accepted by action %s' % resp['action']) + resp = sc.cluster_disable_policy(args.id, args.policy) + print('Request accepted by action: %s' % resp['action']) # NODES @@ -1154,7 +1067,7 @@ def do_node_list(sc, args): else: sortby_index = 6 - nodes = sc.list(models.Node, **queries) + nodes = sc.nodes(**queries) if not args.full_id: formatters = { @@ -1172,11 +1085,7 @@ def do_node_list(sc, args): def _show_node(sc, node_id, show_details=False): '''Show detailed info about the specified node.''' try: - query = { - 'id': node_id, - 'show_details': show_details, - } - node = sc.get_with_args(models.Node, query) + node = sc.get_node(node_id, show_details) except exc.HTTPNotFound: msg = _('Node %s is not found') % node_id raise exc.CommandError(msg) @@ -1208,7 +1117,7 @@ def _show_node(sc, node_id, show_details=False): help=_('Name of the node to create.')) def do_node_create(sc, args): '''Create the node.''' - params = { + attrs = { 'name': args.name, 'cluster_id': args.cluster, 'profile_id': args.profile, @@ -1216,7 +1125,7 @@ def do_node_create(sc, args): 'metadata': utils.format_parameters(args.metadata), } - node = sc.create(models.Node, params) + node = sc.create_node(**attrs) _show_node(sc, node.id) @@ -1237,13 +1146,12 @@ def do_node_delete(sc, args): for nid in args.id: try: - query = {'id': nid} - sc.delete(models.Node, query) + sc.delete_node(nid) except exc.HTTPNotFound: failure_count += 1 print('Node id "%s" not found' % nid) - if failure_count == len(args.id): - msg = _('Failed to delete any of the specified nodes.') + if failure_count > 0: + msg = _('Failed to delete some of the specified nodes.') raise exc.CommandError(msg) print('Request accepted') @@ -1265,19 +1173,18 @@ def do_node_update(sc, args): '''Update the node.''' # Find the node first, we need its UUID try: - node = sc.get(models.Node, {'id': args.id}) + node = sc.get_node(args.id) except exc.HTTPNotFound: raise exc.CommandError(_('Node not found: %s') % args.id) - params = { - 'id': node.id, + attrs = { 'name': args.name, 'role': args.role, 'profile_id': args.profile, 'metadata': utils.format_parameters(args.metadata), } - sc.update(models.Node, params) + sc.update_node(args.id, **attrs) _show_node(sc, node.id) @@ -1287,15 +1194,8 @@ def do_node_update(sc, args): help=_('Name or ID of node to operate on.')) def do_node_join(sc, args): '''Make node join the specified cluster.''' - params = { - 'id': args.id, - 'action': 'join', - 'action_args': { - 'cluster_id': args.cluster, - } - } - resp = sc.action(models.Node, params) - print('Request accepted by action %s' % resp['action']) + resp = sc.node_join(args.id, args.cluster) + print('Request accepted by action: %s' % resp['action']) _show_node(sc, args.id) @@ -1303,12 +1203,8 @@ def do_node_join(sc, args): help=_('Name or ID of node to operate on.')) def do_node_leave(sc, args): '''Make node leave its current cluster.''' - params = { - 'id': args.id, - 'action': 'leave', - } - resp = sc.action(models.Node, params) - print('Request accepted by action %s' % resp['action']) + resp = sc.node_leave(args.id) + print('Request accepted by action: %s' % resp['action']) _show_node(sc, args.id) @@ -1367,7 +1263,7 @@ def do_trigger_list(sc, args=None): else: sortby_index = 1 - triggers = sc.list(models.Trigger, **queries) + triggers = sc.triggers(**queries) formatters = {} if not args.full_id: formatters = { @@ -1379,8 +1275,7 @@ def do_trigger_list(sc, args=None): def _show_trigger(sc, trigger_id): try: - params = {'id': trigger_id} - trigger = sc.get(models.Trigger, params) + trigger = sc.get_trigger(trigger_id) except exc.HTTPNotFound: raise exc.CommandError(_('Trigger not found: %s') % trigger_id) @@ -1416,7 +1311,7 @@ def do_trigger_create(sc, args): 'description': args.desc, } - trigger = sc.create(models.Trigger, params) + trigger = sc.create_trigger(**params) _show_trigger(sc, trigger.id) @@ -1433,17 +1328,14 @@ def do_trigger_delete(sc, args): '''Delete trigger(s).''' failure_count = 0 - for cid in args.id: + for tid in args.id: try: - query = { - 'id': cid, - } - sc.delete(models.Trigger, query) + sc.delete_trigger(tid) except exc.HTTPNotFound as ex: failure_count += 1 print(ex) - if failure_count == len(args.id): - msg = _('Failed to delete any of the specified trigger(s).') + if failure_count > 0: + msg = _('Failed to delete some of the specified trigger(s).') raise exc.CommandError(msg) print('Triggers deleted: %s' % args.id) @@ -1510,18 +1402,17 @@ def do_event_list(sc, args): formatters['id'] = _short_id formatters['obj_id'] = _short_obj_id - events = sc.list(models.Event, **queries) + events = sc.events(**queries) utils.print_list(events, fields, formatters=formatters, sortby_index=sortby_index) -@utils.arg('event', metavar='', +@utils.arg('id', metavar='', help=_('ID of event to display details for.')) def do_event_show(sc, args): '''Describe the event.''' try: - query = {'id': args.event} - event = sc.get(models.Event, query) + event = sc.get_event(args.id) except exc.HTTPNotFound as ex: raise exc.CommandError(str(ex)) @@ -1597,7 +1488,7 @@ def do_action_list(sc, args): else: sortby_index = 0 - actions = sc.list(models.Action, **queries) + actions = sc.actions(**queries) formatters = { 'depends_on': _fmt_depends_on, @@ -1616,8 +1507,7 @@ def do_action_list(sc, args): def do_action_show(sc, args): '''Show detailed info about the specified action.''' try: - query = {'id': args.id} - action = sc.get(models.Action, query) + action = sc.get_action(args.id) except exc.HTTPNotFound: msg = _('Action %(id)s is not found') % {'id': args.id} raise exc.CommandError(msg)