diff options
Diffstat (limited to 'openstackclient')
142 files changed, 6205 insertions, 2884 deletions
diff --git a/openstackclient/api/utils.py b/openstackclient/api/utils.py index b7ff7f23..fa759cd3 100644 --- a/openstackclient/api/utils.py +++ b/openstackclient/api/utils.py @@ -27,11 +27,11 @@ def simple_filter( be changed if any filtering occurs. :param string attr: The name of the attribute to filter. If attr does not exist no - match will succeed and no rows will be retrurned. If attr is + match will succeed and no rows will be returned. If attr is None no filtering will be performed and all rows will be returned. :param sring value: The value to filter. None is considered to be a 'no filter' value. - '' matches agains a Python empty string. + '' matches against a Python empty string. :param string property_field: The name of the data field containing a property dict to filter. If property_field is None, attr is a field name. If property_field diff --git a/openstackclient/common/availability_zone.py b/openstackclient/common/availability_zone.py new file mode 100644 index 00000000..a941418b --- /dev/null +++ b/openstackclient/common/availability_zone.py @@ -0,0 +1,191 @@ +# 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. +# + +"""Availability Zone action implementations""" + +import copy + +from novaclient import exceptions as nova_exceptions +import six + +from openstackclient.common import command +from openstackclient.common import utils +from openstackclient.i18n import _ # noqa + + +def _xform_common_availability_zone(az, zone_info): + if hasattr(az, 'zoneState'): + zone_info['zone_status'] = ('available' if az.zoneState['available'] + else 'not available') + if hasattr(az, 'zoneName'): + zone_info['zone_name'] = az.zoneName + + zone_info['zone_resource'] = '' + + +def _xform_compute_availability_zone(az, include_extra): + result = [] + zone_info = {} + _xform_common_availability_zone(az, zone_info) + + if not include_extra: + result.append(zone_info) + return result + + if hasattr(az, 'hosts') and az.hosts: + for host, services in six.iteritems(az.hosts): + host_info = copy.deepcopy(zone_info) + host_info['host_name'] = host + + for svc, state in six.iteritems(services): + info = copy.deepcopy(host_info) + info['service_name'] = svc + info['service_status'] = '%s %s %s' % ( + 'enabled' if state['active'] else 'disabled', + ':-)' if state['available'] else 'XXX', + state['updated_at']) + result.append(info) + else: + zone_info['host_name'] = '' + zone_info['service_name'] = '' + zone_info['service_status'] = '' + result.append(zone_info) + return result + + +def _xform_volume_availability_zone(az): + result = [] + zone_info = {} + _xform_common_availability_zone(az, zone_info) + result.append(zone_info) + return result + + +def _xform_network_availability_zone(az): + result = [] + zone_info = {} + zone_info['zone_name'] = getattr(az, 'name', '') + zone_info['zone_status'] = getattr(az, 'state', '') + if 'unavailable' == zone_info['zone_status']: + zone_info['zone_status'] = 'not available' + zone_info['zone_resource'] = getattr(az, 'resource', '') + result.append(zone_info) + return result + + +class ListAvailabilityZone(command.Lister): + """List availability zones and their status""" + + def get_parser(self, prog_name): + parser = super(ListAvailabilityZone, self).get_parser(prog_name) + parser.add_argument( + '--compute', + action='store_true', + default=False, + help='List compute availability zones') + parser.add_argument( + '--network', + action='store_true', + default=False, + help='List network availability zones') + parser.add_argument( + '--volume', + action='store_true', + default=False, + help='List volume availability zones') + parser.add_argument( + '--long', + action='store_true', + default=False, + help=_('List additional fields in output'), + ) + return parser + + def _get_compute_availability_zones(self, parsed_args): + compute_client = self.app.client_manager.compute + try: + data = compute_client.availability_zones.list() + except nova_exceptions.Forbidden as e: # policy doesn't allow + try: + data = compute_client.availability_zones.list(detailed=False) + except Exception: + raise e + + # Argh, the availability zones are not iterable... + result = [] + for zone in data: + result += _xform_compute_availability_zone(zone, parsed_args.long) + return result + + def _get_volume_availability_zones(self, parsed_args): + volume_client = self.app.client_manager.volume + data = [] + try: + data = volume_client.availability_zones.list() + except Exception as e: + self.log.debug('Volume availability zone exception: ' + str(e)) + if parsed_args.volume: + message = "Availability zones list not supported by " \ + "Block Storage API" + self.log.warning(message) + + result = [] + for zone in data: + result += _xform_volume_availability_zone(zone) + return result + + def _get_network_availability_zones(self, parsed_args): + network_client = self.app.client_manager.network + data = [] + try: + # Verify that the extension exists. + network_client.find_extension('Availability Zone', + ignore_missing=False) + data = network_client.availability_zones() + except Exception as e: + self.log.debug('Network availability zone exception: ' + str(e)) + if parsed_args.network: + message = "Availability zones list not supported by " \ + "Network API" + self.log.warning(message) + + result = [] + for zone in data: + result += _xform_network_availability_zone(zone) + return result + + def take_action(self, parsed_args): + + if parsed_args.long: + columns = ('Zone Name', 'Zone Status', 'Zone Resource', + 'Host Name', 'Service Name', 'Service Status') + else: + columns = ('Zone Name', 'Zone Status') + + # Show everything by default. + show_all = (not parsed_args.compute and + not parsed_args.volume and + not parsed_args.network) + + result = [] + if parsed_args.compute or show_all: + result += self._get_compute_availability_zones(parsed_args) + if parsed_args.volume or show_all: + result += self._get_volume_availability_zones(parsed_args) + if parsed_args.network or show_all: + result += self._get_network_availability_zones(parsed_args) + + return (columns, + (utils.get_dict_properties( + s, columns + ) for s in result)) diff --git a/openstackclient/common/command.py b/openstackclient/common/command.py index b8d9fc6f..13b0bcc2 100644 --- a/openstackclient/common/command.py +++ b/openstackclient/common/command.py @@ -31,7 +31,10 @@ class CommandMeta(abc.ABCMeta): @six.add_metaclass(CommandMeta) class Command(command.Command): - pass + + def run(self, parsed_args): + self.log.debug('run(%s)', parsed_args) + return super(Command, self).run(parsed_args) class Lister(Command, lister.Lister): diff --git a/openstackclient/common/configuration.py b/openstackclient/common/configuration.py index ac2792dd..a70e4d14 100644 --- a/openstackclient/common/configuration.py +++ b/openstackclient/common/configuration.py @@ -13,21 +13,16 @@ """Configuration action implementations""" -import logging - -from cliff import show import six -from openstackclient.common import utils +from openstackclient.common import command REDACTED = "<redacted>" -class ShowConfiguration(show.ShowOne): +class ShowConfiguration(command.ShowOne): """Display configuration details""" - log = logging.getLogger(__name__ + '.ShowConfiguration') - def get_parser(self, prog_name): parser = super(ShowConfiguration, self).get_parser(prog_name) mask_group = parser.add_mutually_exclusive_group() @@ -46,7 +41,6 @@ class ShowConfiguration(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): info = self.app.client_manager.get_configuration() diff --git a/openstackclient/common/extension.py b/openstackclient/common/extension.py index d1ae208d..8b556b4c 100644 --- a/openstackclient/common/extension.py +++ b/openstackclient/common/extension.py @@ -16,18 +16,14 @@ """Extension action implementations""" import itertools -import logging - -from cliff import lister +from openstackclient.common import command from openstackclient.common import utils -class ListExtension(lister.Lister): +class ListExtension(command.Lister): """List API extensions""" - log = logging.getLogger(__name__ + '.ListExtension') - def get_parser(self, prog_name): parser = super(ListExtension, self).get_parser(prog_name) parser.add_argument( @@ -58,8 +54,6 @@ class ListExtension(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - if parsed_args.long: columns = ('Name', 'Namespace', 'Description', 'Alias', 'Updated', 'Links') diff --git a/openstackclient/common/limits.py b/openstackclient/common/limits.py index 57703670..bd546c01 100644 --- a/openstackclient/common/limits.py +++ b/openstackclient/common/limits.py @@ -16,19 +16,15 @@ """Limits Action Implementation""" import itertools -import logging - -from cliff import lister +from openstackclient.common import command from openstackclient.common import utils from openstackclient.identity import common as identity_common -class ShowLimits(lister.Lister): +class ShowLimits(command.Lister): """Show compute and block storage limits""" - log = logging.getLogger(__name__ + '.ShowLimits') - def get_parser(self, prog_name): parser = super(ShowLimits, self).get_parser(prog_name) type_group = parser.add_mutually_exclusive_group(required=True) @@ -64,7 +60,6 @@ class ShowLimits(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute diff --git a/openstackclient/common/logs.py b/openstackclient/common/logs.py index 6d1aec13..7ad6e832 100644 --- a/openstackclient/common/logs.py +++ b/openstackclient/common/logs.py @@ -18,6 +18,13 @@ import sys import warnings +def get_loggers(): + loggers = {} + for logkey in logging.Logger.manager.loggerDict.keys(): + loggers[logkey] = logging.getLevelName(logging.getLogger(logkey).level) + return loggers + + def log_level_from_options(options): # if --debug, --quiet or --verbose is not specified, # the default logging level is warning @@ -34,6 +41,17 @@ def log_level_from_options(options): return log_level +def log_level_from_string(level_string): + log_level = { + 'critical': logging.CRITICAL, + 'error': logging.ERROR, + 'warning': logging.WARNING, + 'info': logging.INFO, + 'debug': logging.DEBUG, + }.get(level_string, logging.WARNING) + return log_level + + def log_level_from_config(config): # Check the command line option verbose_level = config.get('verbose_level') @@ -49,15 +67,7 @@ def log_level_from_config(config): verbose_level = 'info' else: verbose_level = 'debug' - - log_level = { - 'critical': logging.CRITICAL, - 'error': logging.ERROR, - 'warning': logging.WARNING, - 'info': logging.INFO, - 'debug': logging.DEBUG, - }.get(verbose_level, logging.WARNING) - return log_level + return log_level_from_string(verbose_level) def set_warning_filter(log_level): @@ -168,3 +178,21 @@ class LogConfigurator(object): self.file_logger.setFormatter(_FileFormatter(config=cloud_config)) self.file_logger.setLevel(log_level) self.root_logger.addHandler(self.file_logger) + + logconfig = cloud_config.config.get('logging', None) + if logconfig: + highest_level = logging.NOTSET + for k in logconfig.keys(): + level = log_level_from_string(logconfig[k]) + logging.getLogger(k).setLevel(level) + if (highest_level < level): + highest_level = level + self.console_logger.setLevel(highest_level) + if self.file_logger: + self.file_logger.setLevel(highest_level) + # loggers that are not set will use the handler level, so we + # need to set the global level for all the loggers + for logkey in logging.Logger.manager.loggerDict.keys(): + logger = logging.getLogger(logkey) + if logger.level == logging.NOTSET: + logger.setLevel(log_level) diff --git a/openstackclient/common/module.py b/openstackclient/common/module.py index f0ed23b2..a3dea5da 100644 --- a/openstackclient/common/module.py +++ b/openstackclient/common/module.py @@ -15,23 +15,17 @@ """Module action implementation""" -import logging import six import sys -from cliff import lister -from cliff import show +from openstackclient.common import command -from openstackclient.common import utils - -class ListCommand(lister.Lister): +class ListCommand(command.Lister): """List recognized commands by group""" auth_required = False - log = logging.getLogger(__name__ + '.ListCommand') - @utils.log_method(log) def take_action(self, parsed_args): cm = self.app.command_manager groups = cm.get_command_groups() @@ -40,11 +34,10 @@ class ListCommand(lister.Lister): return (columns, ((c, cm.get_command_names(group=c)) for c in groups)) -class ListModule(show.ShowOne): +class ListModule(command.ShowOne): """List module versions""" auth_required = False - log = logging.getLogger(__name__ + '.ListModule') def get_parser(self, prog_name): parser = super(ListModule, self).get_parser(prog_name) @@ -56,7 +49,6 @@ class ListModule(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): data = {} diff --git a/openstackclient/common/quota.py b/openstackclient/common/quota.py index 8a9b910f..f208948e 100644 --- a/openstackclient/common/quota.py +++ b/openstackclient/common/quota.py @@ -16,13 +16,10 @@ """Quota action implementations""" import itertools -import logging import six import sys -from cliff import command -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils @@ -60,8 +57,6 @@ NETWORK_QUOTAS = { class SetQuota(command.Command): """Set quotas for project or class""" - log = logging.getLogger(__name__ + '.SetQuota') - def get_parser(self, prog_name): parser = super(SetQuota, self).get_parser(prog_name) parser.add_argument( @@ -92,7 +87,6 @@ class SetQuota(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -143,11 +137,9 @@ class SetQuota(command.Command): **volume_kwargs) -class ShowQuota(show.ShowOne): +class ShowQuota(command.ShowOne): """Show quotas for project or class""" - log = logging.getLogger(__name__ + '.ShowQuota') - def get_parser(self, prog_name): parser = super(ShowQuota, self).get_parser(prog_name) parser.add_argument( @@ -196,14 +188,16 @@ class ShowQuota(show.ShowOne): def get_network_quota(self, parsed_args): if parsed_args.quota_class or parsed_args.default: return {} - service_catalog = self.app.client_manager.auth_ref.service_catalog - if 'network' in service_catalog.get_endpoints(): - network_client = self.app.client_manager.network - return network_client.show_quota(parsed_args.project)['quota'] + if self.app.client_manager.is_network_endpoint_enabled(): + identity_client = self.app.client_manager.identity + project = utils.find_resource( + identity_client.projects, + parsed_args.project, + ).id + return self.app.client_manager.network.get_quota(project) else: return {} - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute diff --git a/openstackclient/common/timing.py b/openstackclient/common/timing.py index d13c86e7..5f628759 100644 --- a/openstackclient/common/timing.py +++ b/openstackclient/common/timing.py @@ -13,19 +13,13 @@ """Timing Implementation""" -import logging +from openstackclient.common import command -from cliff import lister - -class Timing(lister.Lister): +class Timing(command.Lister): """Show timing data""" - log = logging.getLogger(__name__ + '.Timing') - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - column_headers = ( 'URL', 'Seconds', diff --git a/openstackclient/common/utils.py b/openstackclient/common/utils.py index 3ae30c8f..4142f830 100644 --- a/openstackclient/common/utils.py +++ b/openstackclient/common/utils.py @@ -26,33 +26,6 @@ from oslo_utils import importutils from openstackclient.common import exceptions -class log_method(object): - - def __init__(self, log=None, level=logging.DEBUG): - self._log = log - self._level = level - - def __call__(self, func): - func_name = func.__name__ - if not self._log: - self._log = logging.getLogger(func.__class__.__name__) - - @six.wraps(func) - def wrapper(*args, **kwargs): - if self._log.isEnabledFor(self._level): - pretty_args = [] - if args: - pretty_args.extend(str(a) for a in args) - if kwargs: - pretty_args.extend( - "%s=%s" % (k, v) for k, v in six.iteritems(kwargs)) - self._log.log(self._level, "%s(%s)", - func_name, ", ".join(pretty_args)) - return func(*args, **kwargs) - - return wrapper - - def find_resource(manager, name_or_id, **kwargs): """Helper for the _find_* methods. @@ -169,6 +142,16 @@ def format_list(data, separator=', '): return separator.join(sorted(data)) +def format_list_of_dicts(data): + """Return a formatted string of key value pairs for each dict + + :param data: a list of dicts + :rtype: a string formatted to key='value' with dicts separated by new line + """ + + return '\n'.join(format_dict(i) for i in data) + + def get_field(item, field): try: if isinstance(item, dict): @@ -331,6 +314,8 @@ def wait_for_status(status_f, def wait_for_delete(manager, res_id, status_field='status', + error_status=['error'], + exception_name=['NotFound'], sleep_time=5, timeout=300, callback=None): @@ -341,6 +326,8 @@ def wait_for_delete(manager, :param status_field: the status attribute in the returned resource object, this is used to check for error states while the resource is being deleted + :param error_status: a list of status strings for error + :param exception_name: a list of exception strings for deleted case :param sleep_time: wait this long between checks (seconds) :param timeout: check until this long (seconds) :param callback: called per sleep cycle, useful to display progress; this @@ -357,12 +344,12 @@ def wait_for_delete(manager, # handle a NotFound exception here without parsing the message res = manager.get(res_id) except Exception as ex: - if type(ex).__name__ == 'NotFound': + if type(ex).__name__ in exception_name: return True raise status = getattr(res, status_field, '').lower() - if status == 'error': + if status in error_status: return False if callback: diff --git a/openstackclient/compute/v2/agent.py b/openstackclient/compute/v2/agent.py index 75c67f31..59d7dc66 100644 --- a/openstackclient/compute/v2/agent.py +++ b/openstackclient/compute/v2/agent.py @@ -15,21 +15,15 @@ """Agent action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils -class CreateAgent(show.ShowOne): +class CreateAgent(command.ShowOne): """Create compute agent command""" - log = logging.getLogger(__name__ + ".CreateAgent") - def get_parser(self, prog_name): parser = super(CreateAgent, self).get_parser(prog_name) parser.add_argument( @@ -60,7 +54,6 @@ class CreateAgent(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute args = ( parsed_args.os, @@ -77,8 +70,6 @@ class CreateAgent(show.ShowOne): class DeleteAgent(command.Command): """Delete compute agent command""" - log = logging.getLogger(__name__ + ".DeleteAgent") - def get_parser(self, prog_name): parser = super(DeleteAgent, self).get_parser(prog_name) parser.add_argument( @@ -88,16 +79,13 @@ class DeleteAgent(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute compute_client.agents.delete(parsed_args.id) -class ListAgent(lister.Lister): +class ListAgent(command.Lister): """List compute agent command""" - log = logging.getLogger(__name__ + ".ListAgent") - def get_parser(self, prog_name): parser = super(ListAgent, self).get_parser(prog_name) parser.add_argument( @@ -107,7 +95,6 @@ class ListAgent(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute columns = ( "Agent ID", @@ -125,11 +112,9 @@ class ListAgent(lister.Lister): ) for s in data)) -class SetAgent(show.ShowOne): +class SetAgent(command.ShowOne): """Set compute agent command""" - log = logging.getLogger(__name__ + ".SetAgent") - def get_parser(self, prog_name): parser = super(SetAgent, self).get_parser(prog_name) parser.add_argument( @@ -151,7 +136,6 @@ class SetAgent(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute args = ( parsed_args.id, diff --git a/openstackclient/compute/v2/aggregate.py b/openstackclient/compute/v2/aggregate.py index 97ad127c..5f297257 100644 --- a/openstackclient/compute/v2/aggregate.py +++ b/openstackclient/compute/v2/aggregate.py @@ -16,22 +16,16 @@ """Compute v2 Aggregate action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils -class AddAggregateHost(show.ShowOne): +class AddAggregateHost(command.ShowOne): """Add host to aggregate""" - log = logging.getLogger(__name__ + '.AddAggregateHost') - def get_parser(self, prog_name): parser = super(AddAggregateHost, self).get_parser(prog_name) parser.add_argument( @@ -47,8 +41,6 @@ class AddAggregateHost(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute aggregate = utils.find_resource( @@ -62,11 +54,9 @@ class AddAggregateHost(show.ShowOne): return zip(*sorted(six.iteritems(info))) -class CreateAggregate(show.ShowOne): +class CreateAggregate(command.ShowOne): """Create a new aggregate""" - log = logging.getLogger(__name__ + ".CreateAggregate") - def get_parser(self, prog_name): parser = super(CreateAggregate, self).get_parser(prog_name) parser.add_argument( @@ -89,8 +79,6 @@ class CreateAggregate(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute info = {} @@ -112,8 +100,6 @@ class CreateAggregate(show.ShowOne): class DeleteAggregate(command.Command): """Delete an existing aggregate""" - log = logging.getLogger(__name__ + '.DeleteAggregate') - def get_parser(self, prog_name): parser = super(DeleteAggregate, self).get_parser(prog_name) parser.add_argument( @@ -123,7 +109,6 @@ class DeleteAggregate(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -134,11 +119,9 @@ class DeleteAggregate(command.Command): compute_client.aggregates.delete(data.id) -class ListAggregate(lister.Lister): +class ListAggregate(command.Lister): """List all aggregates""" - log = logging.getLogger(__name__ + ".ListAggregate") - def get_parser(self, prog_name): parser = super(ListAggregate, self).get_parser(prog_name) parser.add_argument( @@ -149,8 +132,6 @@ class ListAggregate(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute data = compute_client.aggregates.list() @@ -186,11 +167,9 @@ class ListAggregate(lister.Lister): ) for s in data)) -class RemoveAggregateHost(show.ShowOne): +class RemoveAggregateHost(command.ShowOne): """Remove host from aggregate""" - log = logging.getLogger(__name__ + '.RemoveAggregateHost') - def get_parser(self, prog_name): parser = super(RemoveAggregateHost, self).get_parser(prog_name) parser.add_argument( @@ -206,8 +185,6 @@ class RemoveAggregateHost(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute aggregate = utils.find_resource( @@ -224,11 +201,9 @@ class RemoveAggregateHost(show.ShowOne): return zip(*sorted(six.iteritems(info))) -class SetAggregate(show.ShowOne): +class SetAggregate(command.ShowOne): """Set aggregate properties""" - log = logging.getLogger(__name__ + '.SetAggregate') - def get_parser(self, prog_name): parser = super(SetAggregate, self).get_parser(prog_name) parser.add_argument( @@ -255,7 +230,6 @@ class SetAggregate(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -288,11 +262,9 @@ class SetAggregate(show.ShowOne): return ({}, {}) -class ShowAggregate(show.ShowOne): +class ShowAggregate(command.ShowOne): """Display aggregate details""" - log = logging.getLogger(__name__ + '.ShowAggregate') - def get_parser(self, prog_name): parser = super(ShowAggregate, self).get_parser(prog_name) parser.add_argument( @@ -302,7 +274,6 @@ class ShowAggregate(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute diff --git a/openstackclient/compute/v2/availability_zone.py b/openstackclient/compute/v2/availability_zone.py deleted file mode 100644 index 0fe6c73a..00000000 --- a/openstackclient/compute/v2/availability_zone.py +++ /dev/null @@ -1,102 +0,0 @@ -# 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. -# - -"""Compute v2 Availability Zone action implementations""" - -import copy -import logging - -from cliff import lister -from novaclient import exceptions as nova_exceptions -import six - -from openstackclient.common import utils -from openstackclient.i18n import _ # noqa - - -def _xform_availability_zone(az, include_extra): - result = [] - zone_info = {} - if hasattr(az, 'zoneState'): - zone_info['zone_status'] = ('available' if az.zoneState['available'] - else 'not available') - if hasattr(az, 'zoneName'): - zone_info['zone_name'] = az.zoneName - - if not include_extra: - result.append(zone_info) - return result - - if hasattr(az, 'hosts') and az.hosts: - for host, services in six.iteritems(az.hosts): - host_info = copy.deepcopy(zone_info) - host_info['host_name'] = host - - for svc, state in six.iteritems(services): - info = copy.deepcopy(host_info) - info['service_name'] = svc - info['service_status'] = '%s %s %s' % ( - 'enabled' if state['active'] else 'disabled', - ':-)' if state['available'] else 'XXX', - state['updated_at']) - result.append(info) - else: - zone_info['host_name'] = '' - zone_info['service_name'] = '' - zone_info['service_status'] = '' - result.append(zone_info) - return result - - -class ListAvailabilityZone(lister.Lister): - """List availability zones and their status""" - - log = logging.getLogger(__name__ + '.ListAvailabilityZone') - - def get_parser(self, prog_name): - parser = super(ListAvailabilityZone, self).get_parser(prog_name) - parser.add_argument( - '--long', - action='store_true', - default=False, - help=_('List additional fields in output'), - ) - return parser - - @utils.log_method(log) - def take_action(self, parsed_args): - - if parsed_args.long: - columns = ('Zone Name', 'Zone Status', - 'Host Name', 'Service Name', 'Service Status') - else: - columns = ('Zone Name', 'Zone Status') - - compute_client = self.app.client_manager.compute - try: - data = compute_client.availability_zones.list() - except nova_exceptions.Forbidden as e: # policy doesn't allow - try: - data = compute_client.availability_zones.list(detailed=False) - except Exception: - raise e - - # Argh, the availability zones are not iterable... - result = [] - for zone in data: - result += _xform_availability_zone(zone, parsed_args.long) - - return (columns, - (utils.get_dict_properties( - s, columns - ) for s in result)) diff --git a/openstackclient/compute/v2/console.py b/openstackclient/compute/v2/console.py index f0864786..6c0ec31a 100644 --- a/openstackclient/compute/v2/console.py +++ b/openstackclient/compute/v2/console.py @@ -15,13 +15,10 @@ """Compute v2 Console action implementations""" -import logging import six import sys -from cliff import command -from cliff import show - +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils @@ -29,8 +26,6 @@ from openstackclient.common import utils class ShowConsoleLog(command.Command): """Show server's console output""" - log = logging.getLogger(__name__ + '.ShowConsoleLog') - def get_parser(self, prog_name): parser = super(ShowConsoleLog, self).get_parser(prog_name) parser.add_argument( @@ -49,7 +44,6 @@ class ShowConsoleLog(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -67,11 +61,9 @@ class ShowConsoleLog(command.Command): sys.stdout.write(data) -class ShowConsoleURL(show.ShowOne): +class ShowConsoleURL(command.ShowOne): """Show server's remote console URL""" - log = logging.getLogger(__name__ + '.ShowConsoleURL') - def get_parser(self, prog_name): parser = super(ShowConsoleURL, self).get_parser(prog_name) parser.add_argument( @@ -104,7 +96,6 @@ class ShowConsoleURL(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute server = utils.find_resource( diff --git a/openstackclient/compute/v2/fixedip.py b/openstackclient/compute/v2/fixedip.py index 1ab8a18c..daac97d1 100644 --- a/openstackclient/compute/v2/fixedip.py +++ b/openstackclient/compute/v2/fixedip.py @@ -15,18 +15,13 @@ """Fixed IP action implementations""" -import logging - -from cliff import command - +from openstackclient.common import command from openstackclient.common import utils class AddFixedIP(command.Command): """Add fixed IP address to server""" - log = logging.getLogger(__name__ + ".AddFixedIP") - def get_parser(self, prog_name): parser = super(AddFixedIP, self).get_parser(prog_name) parser.add_argument( @@ -42,7 +37,6 @@ class AddFixedIP(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute network = utils.find_resource( @@ -57,8 +51,6 @@ class AddFixedIP(command.Command): class RemoveFixedIP(command.Command): """Remove fixed IP address from server""" - log = logging.getLogger(__name__ + ".RemoveFixedIP") - def get_parser(self, prog_name): parser = super(RemoveFixedIP, self).get_parser(prog_name) parser.add_argument( @@ -74,7 +66,6 @@ class RemoveFixedIP(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute server = utils.find_resource( diff --git a/openstackclient/compute/v2/flavor.py b/openstackclient/compute/v2/flavor.py index 1af5fe70..093592cd 100644 --- a/openstackclient/compute/v2/flavor.py +++ b/openstackclient/compute/v2/flavor.py @@ -98,7 +98,6 @@ class CreateFlavor(command.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute args = ( @@ -132,7 +131,6 @@ class DeleteFlavor(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute flavor = utils.find_resource(compute_client.flavors, parsed_args.flavor) @@ -182,7 +180,6 @@ class ListFlavor(command.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute columns = ( "ID", @@ -234,7 +231,6 @@ class ShowFlavor(command.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute resource_flavor = utils.find_resource(compute_client.flavors, parsed_args.flavor) @@ -266,7 +262,6 @@ class SetFlavor(command.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute resource_flavor = compute_client.flavors.find(name=parsed_args.flavor) @@ -299,7 +294,6 @@ class UnsetFlavor(command.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute resource_flavor = compute_client.flavors.find(name=parsed_args.flavor) diff --git a/openstackclient/compute/v2/floatingip.py b/openstackclient/compute/v2/floatingip.py index 6f2e360c..6212989f 100644 --- a/openstackclient/compute/v2/floatingip.py +++ b/openstackclient/compute/v2/floatingip.py @@ -15,21 +15,15 @@ """Floating IP action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils class AddFloatingIP(command.Command): """Add floating IP address to server""" - log = logging.getLogger(__name__ + ".AddFloatingIP") - def get_parser(self, prog_name): parser = super(AddFloatingIP, self).get_parser(prog_name) parser.add_argument( @@ -45,7 +39,6 @@ class AddFloatingIP(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute server = utils.find_resource( @@ -54,11 +47,9 @@ class AddFloatingIP(command.Command): server.add_floating_ip(parsed_args.ip_address) -class CreateFloatingIP(show.ShowOne): +class CreateFloatingIP(command.ShowOne): """Create new floating IP address""" - log = logging.getLogger(__name__ + '.CreateFloatingIP') - def get_parser(self, prog_name): parser = super(CreateFloatingIP, self).get_parser(prog_name) parser.add_argument( @@ -68,7 +59,6 @@ class CreateFloatingIP(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute floating_ip = compute_client.floating_ips.create(parsed_args.pool) @@ -78,57 +68,9 @@ class CreateFloatingIP(show.ShowOne): return zip(*sorted(six.iteritems(info))) -class DeleteFloatingIP(command.Command): - """Delete a floating IP address""" - - log = logging.getLogger(__name__ + '.DeleteFloatingIP') - - def get_parser(self, prog_name): - parser = super(DeleteFloatingIP, self).get_parser(prog_name) - parser.add_argument( - "ip_address", - metavar="<ip-address>", - help="IP address to delete (ID only)", - ) - return parser - - @utils.log_method(log) - def take_action(self, parsed_args): - compute_client = self.app.client_manager.compute - - floating_ip = utils.find_resource( - compute_client.floating_ips, - parsed_args.ip_address, - ) - - compute_client.floating_ips.delete(floating_ip) - - -class ListFloatingIP(lister.Lister): - """List floating IP addresses""" - - log = logging.getLogger(__name__ + '.ListFloatingIP') - - @utils.log_method(log) - def take_action(self, parsed_args): - compute_client = self.app.client_manager.compute - - columns = ('ID', 'Pool', 'IP', 'Fixed IP', 'Instance ID') - - data = compute_client.floating_ips.list() - - return (columns, - (utils.get_item_properties( - s, columns, - formatters={}, - ) for s in data)) - - class RemoveFloatingIP(command.Command): """Remove floating IP address from server""" - log = logging.getLogger(__name__ + ".RemoveFloatingIP") - def get_parser(self, prog_name): parser = super(RemoveFloatingIP, self).get_parser(prog_name) parser.add_argument( @@ -144,7 +86,6 @@ class RemoveFloatingIP(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute server = utils.find_resource( diff --git a/openstackclient/compute/v2/floatingippool.py b/openstackclient/compute/v2/floatingippool.py index 39a2d8fe..997e0324 100644 --- a/openstackclient/compute/v2/floatingippool.py +++ b/openstackclient/compute/v2/floatingippool.py @@ -15,19 +15,13 @@ """Floating IP Pool action implementations""" -import logging - -from cliff import lister - +from openstackclient.common import command from openstackclient.common import utils -class ListFloatingIPPool(lister.Lister): +class ListFloatingIPPool(command.Lister): """List pools of floating IP addresses""" - log = logging.getLogger(__name__ + '.ListFloatingIPPool') - - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute diff --git a/openstackclient/compute/v2/host.py b/openstackclient/compute/v2/host.py index 4f727388..f2257d12 100644 --- a/openstackclient/compute/v2/host.py +++ b/openstackclient/compute/v2/host.py @@ -15,18 +15,13 @@ """Host action implementations""" -import logging - -from cliff import lister - +from openstackclient.common import command from openstackclient.common import utils -class ListHost(lister.Lister): +class ListHost(command.Lister): """List host command""" - log = logging.getLogger(__name__ + ".ListHost") - def get_parser(self, prog_name): parser = super(ListHost, self).get_parser(prog_name) parser.add_argument( @@ -36,7 +31,6 @@ class ListHost(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute columns = ( "Host Name", @@ -50,11 +44,9 @@ class ListHost(lister.Lister): ) for s in data)) -class ShowHost(lister.Lister): +class ShowHost(command.Lister): """Show host command""" - log = logging.getLogger(__name__ + ".ShowHost") - def get_parser(self, prog_name): parser = super(ShowHost, self).get_parser(prog_name) parser.add_argument( @@ -64,7 +56,6 @@ class ShowHost(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute columns = ( "Host", diff --git a/openstackclient/compute/v2/hypervisor.py b/openstackclient/compute/v2/hypervisor.py index f33beb08..f5288a35 100644 --- a/openstackclient/compute/v2/hypervisor.py +++ b/openstackclient/compute/v2/hypervisor.py @@ -15,21 +15,16 @@ """Hypervisor action implementations""" -import logging import re import six -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils -class ListHypervisor(lister.Lister): +class ListHypervisor(command.Lister): """List hypervisors""" - log = logging.getLogger(__name__ + ".ListHypervisor") - def get_parser(self, prog_name): parser = super(ListHypervisor, self).get_parser(prog_name) parser.add_argument( @@ -40,7 +35,6 @@ class ListHypervisor(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute columns = ( "ID", @@ -58,11 +52,9 @@ class ListHypervisor(lister.Lister): ) for s in data)) -class ShowHypervisor(show.ShowOne): +class ShowHypervisor(command.ShowOne): """Display hypervisor details""" - log = logging.getLogger(__name__ + ".ShowHypervisor") - def get_parser(self, prog_name): parser = super(ShowHypervisor, self).get_parser(prog_name) parser.add_argument( @@ -72,7 +64,6 @@ class ShowHypervisor(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute hypervisor = utils.find_resource(compute_client.hypervisors, parsed_args.hypervisor)._info.copy() diff --git a/openstackclient/compute/v2/hypervisor_stats.py b/openstackclient/compute/v2/hypervisor_stats.py index 43ba9fc8..290f5418 100644 --- a/openstackclient/compute/v2/hypervisor_stats.py +++ b/openstackclient/compute/v2/hypervisor_stats.py @@ -14,19 +14,15 @@ """Hypervisor Stats action implementations""" -import logging import six -from cliff import show +from openstackclient.common import command -class ShowHypervisorStats(show.ShowOne): +class ShowHypervisorStats(command.ShowOne): """Display hypervisor stats details""" - log = logging.getLogger(__name__ + ".ShowHypervisorStats") - def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute hypervisor_stats = compute_client.hypervisors.statistics().to_dict() diff --git a/openstackclient/compute/v2/keypair.py b/openstackclient/compute/v2/keypair.py index 96562985..71c9d674 100644 --- a/openstackclient/compute/v2/keypair.py +++ b/openstackclient/compute/v2/keypair.py @@ -15,24 +15,18 @@ """Keypair action implementations""" -import logging import os import six import sys -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import exceptions from openstackclient.common import utils -class CreateKeypair(show.ShowOne): +class CreateKeypair(command.ShowOne): """Create new public key""" - log = logging.getLogger(__name__ + '.CreateKeypair') - def get_parser(self, prog_name): parser = super(CreateKeypair, self).get_parser(prog_name) parser.add_argument( @@ -47,7 +41,6 @@ class CreateKeypair(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -82,8 +75,6 @@ class CreateKeypair(show.ShowOne): class DeleteKeypair(command.Command): """Delete public key""" - log = logging.getLogger(__name__ + '.DeleteKeypair') - def get_parser(self, prog_name): parser = super(DeleteKeypair, self).get_parser(prog_name) parser.add_argument( @@ -93,19 +84,15 @@ class DeleteKeypair(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute compute_client.keypairs.delete(parsed_args.name) -class ListKeypair(lister.Lister): +class ListKeypair(command.Lister): """List public key fingerprints""" - log = logging.getLogger(__name__ + ".ListKeypair") - def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute columns = ( "Name", @@ -119,11 +106,9 @@ class ListKeypair(lister.Lister): ) for s in data)) -class ShowKeypair(show.ShowOne): +class ShowKeypair(command.ShowOne): """Display public key details""" - log = logging.getLogger(__name__ + '.ShowKeypair') - def get_parser(self, prog_name): parser = super(ShowKeypair, self).get_parser(prog_name) parser.add_argument( @@ -139,7 +124,6 @@ class ShowKeypair(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute keypair = utils.find_resource(compute_client.keypairs, diff --git a/openstackclient/compute/v2/security_group.py b/openstackclient/compute/v2/security_group.py index 6395e102..2a8908d7 100644 --- a/openstackclient/compute/v2/security_group.py +++ b/openstackclient/compute/v2/security_group.py @@ -16,13 +16,8 @@ """Compute v2 Security Group action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - from keystoneauth1 import exceptions as ks_exc try: @@ -30,6 +25,7 @@ try: except ImportError: from novaclient.v1_1 import security_group_rules +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils @@ -79,11 +75,9 @@ def _xform_and_trim_security_group_rule(sgroup): return info -class CreateSecurityGroup(show.ShowOne): +class CreateSecurityGroup(command.ShowOne): """Create a new security group""" - log = logging.getLogger(__name__ + ".CreateSecurityGroup") - def get_parser(self, prog_name): parser = super(CreateSecurityGroup, self).get_parser(prog_name) parser.add_argument( @@ -99,8 +93,6 @@ class CreateSecurityGroup(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute description = parsed_args.description or parsed_args.name @@ -115,11 +107,9 @@ class CreateSecurityGroup(show.ShowOne): return zip(*sorted(six.iteritems(info))) -class CreateSecurityGroupRule(show.ShowOne): +class CreateSecurityGroupRule(command.ShowOne): """Create a new security group rule""" - log = logging.getLogger(__name__ + ".CreateSecurityGroupRule") - def get_parser(self, prog_name): parser = super(CreateSecurityGroupRule, self).get_parser(prog_name) parser.add_argument( @@ -157,8 +147,6 @@ class CreateSecurityGroupRule(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute group = utils.find_resource( compute_client.security_groups, @@ -181,36 +169,9 @@ class CreateSecurityGroupRule(show.ShowOne): return zip(*sorted(six.iteritems(info))) -class DeleteSecurityGroup(command.Command): - """Delete a security group""" - - log = logging.getLogger(__name__ + '.DeleteSecurityGroup') - - def get_parser(self, prog_name): - parser = super(DeleteSecurityGroup, self).get_parser(prog_name) - parser.add_argument( - 'group', - metavar='<group>', - help='Security group to delete (name or ID)', - ) - return parser - - @utils.log_method(log) - def take_action(self, parsed_args): - - compute_client = self.app.client_manager.compute - data = utils.find_resource( - compute_client.security_groups, - parsed_args.group, - ) - compute_client.security_groups.delete(data.id) - - class DeleteSecurityGroupRule(command.Command): """Delete a security group rule""" - log = logging.getLogger(__name__ + '.DeleteSecurityGroupRule') - def get_parser(self, prog_name): parser = super(DeleteSecurityGroupRule, self).get_parser(prog_name) parser.add_argument( @@ -220,18 +181,15 @@ class DeleteSecurityGroupRule(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute compute_client.security_group_rules.delete(parsed_args.rule) -class ListSecurityGroup(lister.Lister): +class ListSecurityGroup(command.Lister): """List security groups""" - log = logging.getLogger(__name__ + ".ListSecurityGroup") - def get_parser(self, prog_name): parser = super(ListSecurityGroup, self).get_parser(prog_name) parser.add_argument( @@ -250,8 +208,6 @@ class ListSecurityGroup(lister.Lister): except KeyError: return project_id - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute columns = ( "ID", @@ -283,11 +239,9 @@ class ListSecurityGroup(lister.Lister): ) for s in data)) -class ListSecurityGroupRule(lister.Lister): +class ListSecurityGroupRule(command.Lister): """List security group rules""" - log = logging.getLogger(__name__ + ".ListSecurityGroupRule") - def get_parser(self, prog_name): parser = super(ListSecurityGroupRule, self).get_parser(prog_name) parser.add_argument( @@ -299,8 +253,6 @@ class ListSecurityGroupRule(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute columns = column_headers = ( "ID", @@ -337,11 +289,9 @@ class ListSecurityGroupRule(lister.Lister): ) for s in rules)) -class SetSecurityGroup(show.ShowOne): +class SetSecurityGroup(command.ShowOne): """Set security group properties""" - log = logging.getLogger(__name__ + '.SetSecurityGroup') - def get_parser(self, prog_name): parser = super(SetSecurityGroup, self).get_parser(prog_name) parser.add_argument( @@ -361,7 +311,6 @@ class SetSecurityGroup(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -388,11 +337,9 @@ class SetSecurityGroup(show.ShowOne): return ({}, {}) -class ShowSecurityGroup(show.ShowOne): +class ShowSecurityGroup(command.ShowOne): """Display security group details""" - log = logging.getLogger(__name__ + '.ShowSecurityGroup') - def get_parser(self, prog_name): parser = super(ShowSecurityGroup, self).get_parser(prog_name) parser.add_argument( @@ -402,7 +349,6 @@ class ShowSecurityGroup(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): compute_client = self.app.client_manager.compute diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py index b4db6216..4cb94822 100644 --- a/openstackclient/compute/v2/server.py +++ b/openstackclient/compute/v2/server.py @@ -185,8 +185,6 @@ class AddServerSecurityGroup(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute server = utils.find_resource( @@ -224,8 +222,6 @@ class AddServerVolume(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute volume_client = self.app.client_manager.volume @@ -370,7 +366,6 @@ class CreateServer(command.ShowOne): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute volume_client = self.app.client_manager.volume @@ -547,6 +542,34 @@ class CreateServer(command.ShowOne): return zip(*sorted(six.iteritems(details))) +class CreateServerDump(command.Command): + """Create a dump file in server(s) + + Trigger crash dump in server(s) with features like kdump in Linux. + It will create a dump file in the server(s) dumping the server(s)' + memory, and also crash the server(s). OSC sees the dump file + (server dump) as a kind of resource. + """ + + def get_parser(self, prog_name): + parser = super(CreateServerDump, self).get_parser(prog_name) + parser.add_argument( + 'server', + metavar='<server>', + nargs='+', + help=_('Server(s) to create dump file (name or ID)'), + ) + return parser + + def take_action(self, parsed_args): + compute_client = self.app.client_manager.compute + for server in parsed_args.server: + utils.find_resource( + compute_client.servers, + server, + ).trigger_crash_dump() + + class CreateServerImage(command.ShowOne): """Create a new disk image from a running server""" @@ -569,7 +592,6 @@ class CreateServerImage(command.ShowOne): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute image_client = self.app.client_manager.image @@ -626,7 +648,6 @@ class DeleteServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute for server in parsed_args.server: @@ -741,7 +762,6 @@ class ListServer(command.Lister): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute identity_client = self.app.client_manager.identity @@ -872,7 +892,6 @@ class LockServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -944,7 +963,6 @@ class MigrateServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -987,7 +1005,6 @@ class PauseServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute for server in parsed_args.server: @@ -1031,7 +1048,6 @@ class RebootServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute server = utils.find_resource( @@ -1078,7 +1094,6 @@ class RebuildServer(command.ShowOne): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1123,8 +1138,6 @@ class RemoveServerSecurityGroup(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute server = utils.find_resource( @@ -1157,8 +1170,6 @@ class RemoveServerVolume(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - compute_client = self.app.client_manager.compute volume_client = self.app.client_manager.volume @@ -1189,7 +1200,6 @@ class RescueServer(command.ShowOne): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1233,7 +1243,6 @@ class ResizeServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1277,7 +1286,6 @@ class ResumeServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1317,7 +1325,6 @@ class SetServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1358,7 +1365,6 @@ class ShelveServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute for server in parsed_args.server: @@ -1386,7 +1392,6 @@ class ShowServer(command.ShowOne): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute server = utils.find_resource(compute_client.servers, @@ -1507,7 +1512,6 @@ class SshServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1561,7 +1565,6 @@ class StartServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute for server in parsed_args.server: @@ -1584,7 +1587,6 @@ class StopServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute for server in parsed_args.server: @@ -1607,7 +1609,6 @@ class SuspendServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1631,7 +1632,6 @@ class UnlockServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1655,7 +1655,6 @@ class UnpauseServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1678,7 +1677,6 @@ class UnrescueServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute @@ -1708,7 +1706,6 @@ class UnsetServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute server = utils.find_resource( @@ -1736,7 +1733,6 @@ class UnshelveServer(command.Command): ) return parser - @utils.log_method() def take_action(self, parsed_args): compute_client = self.app.client_manager.compute for server in parsed_args.server: diff --git a/openstackclient/compute/v2/service.py b/openstackclient/compute/v2/service.py index af3e940a..3c062724 100644 --- a/openstackclient/compute/v2/service.py +++ b/openstackclient/compute/v2/service.py @@ -15,19 +15,13 @@ """Service action implementations""" -import logging - -from cliff import command -from cliff import lister - +from openstackclient.common import command from openstackclient.common import utils class DeleteService(command.Command): """Delete service command""" - log = logging.getLogger(__name__ + ".DeleteService") - def get_parser(self, prog_name): parser = super(DeleteService, self).get_parser(prog_name) parser.add_argument( @@ -37,17 +31,14 @@ class DeleteService(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute compute_client.services.delete(parsed_args.service) -class ListService(lister.Lister): +class ListService(command.Lister): """List service command""" - log = logging.getLogger(__name__ + ".ListService") - def get_parser(self, prog_name): parser = super(ListService, self).get_parser(prog_name) parser.add_argument( @@ -61,7 +52,6 @@ class ListService(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute columns = ( "Id", @@ -83,8 +73,6 @@ class ListService(lister.Lister): class SetService(command.Command): """Set service command""" - log = logging.getLogger(__name__ + ".SetService") - def get_parser(self, prog_name): parser = super(SetService, self).get_parser(prog_name) parser.add_argument( @@ -110,7 +98,6 @@ class SetService(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute if parsed_args.enabled: diff --git a/openstackclient/compute/v2/usage.py b/openstackclient/compute/v2/usage.py index 4e7cf100..baa50170 100644 --- a/openstackclient/compute/v2/usage.py +++ b/openstackclient/compute/v2/usage.py @@ -16,21 +16,17 @@ """Usage action implementations""" import datetime -import logging import sys -from cliff import lister -from cliff import show import six +from openstackclient.common import command from openstackclient.common import utils -class ListUsage(lister.Lister): +class ListUsage(command.Lister): """List resource usage per project""" - log = logging.getLogger(__name__ + ".ListUsage") - def get_parser(self, prog_name): parser = super(ListUsage, self).get_parser(prog_name) parser.add_argument( @@ -49,7 +45,6 @@ class ListUsage(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) def _format_project(project): if not project: @@ -118,11 +113,9 @@ class ListUsage(lister.Lister): ) for s in usage_list)) -class ShowUsage(show.ShowOne): +class ShowUsage(command.ShowOne): """Show resource usage for a single project""" - log = logging.getLogger(__name__ + ".ShowUsage") - def get_parser(self, prog_name): parser = super(ShowUsage, self).get_parser(prog_name) parser.add_argument( @@ -147,8 +140,6 @@ class ShowUsage(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - identity_client = self.app.client_manager.identity compute_client = self.app.client_manager.compute dateformat = "%Y-%m-%d" diff --git a/openstackclient/i18n.py b/openstackclient/i18n.py index 3a11c1d0..1d09772c 100644 --- a/openstackclient/i18n.py +++ b/openstackclient/i18n.py @@ -15,7 +15,7 @@ import oslo_i18n -_translators = oslo_i18n.TranslatorFactory(domain='python-openstackclient') +_translators = oslo_i18n.TranslatorFactory(domain='openstackclient') # The primary translation function using the well-known name "_" _ = _translators.primary diff --git a/openstackclient/identity/v2_0/catalog.py b/openstackclient/identity/v2_0/catalog.py index 9bc2755a..c927943f 100644 --- a/openstackclient/identity/v2_0/catalog.py +++ b/openstackclient/identity/v2_0/catalog.py @@ -13,12 +13,9 @@ """Identity v2 Service Catalog action implementations""" -import logging import six -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa @@ -37,12 +34,9 @@ def _format_endpoints(eps=None): return ret -class ListCatalog(lister.Lister): +class ListCatalog(command.Lister): """List services in the service catalog""" - log = logging.getLogger(__name__ + '.ListCatalog') - - @utils.log_method(log) def take_action(self, parsed_args): # This is ugly because if auth hasn't happened yet we need @@ -62,11 +56,9 @@ class ListCatalog(lister.Lister): ) for s in data)) -class ShowCatalog(show.ShowOne): +class ShowCatalog(command.ShowOne): """Display service catalog details""" - log = logging.getLogger(__name__ + '.ShowCatalog') - def get_parser(self, prog_name): parser = super(ShowCatalog, self).get_parser(prog_name) parser.add_argument( @@ -76,7 +68,6 @@ class ShowCatalog(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): # This is ugly because if auth hasn't happened yet we need diff --git a/openstackclient/identity/v2_0/ec2creds.py b/openstackclient/identity/v2_0/ec2creds.py index a7730ce2..a16b3d9e 100644 --- a/openstackclient/identity/v2_0/ec2creds.py +++ b/openstackclient/identity/v2_0/ec2creds.py @@ -16,22 +16,16 @@ """Identity v2 EC2 Credentials action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa -class CreateEC2Creds(show.ShowOne): +class CreateEC2Creds(command.ShowOne): """Create EC2 credentials""" - log = logging.getLogger(__name__ + ".CreateEC2Creds") - def get_parser(self, prog_name): parser = super(CreateEC2Creds, self).get_parser(prog_name) parser.add_argument( @@ -52,7 +46,6 @@ class CreateEC2Creds(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -89,8 +82,6 @@ class CreateEC2Creds(show.ShowOne): class DeleteEC2Creds(command.Command): """Delete EC2 credentials""" - log = logging.getLogger(__name__ + '.DeleteEC2Creds') - def get_parser(self, prog_name): parser = super(DeleteEC2Creds, self).get_parser(prog_name) parser.add_argument( @@ -105,7 +96,6 @@ class DeleteEC2Creds(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -121,11 +111,9 @@ class DeleteEC2Creds(command.Command): identity_client.ec2.delete(user, parsed_args.access_key) -class ListEC2Creds(lister.Lister): +class ListEC2Creds(command.Lister): """List EC2 credentials""" - log = logging.getLogger(__name__ + '.ListEC2Creds') - def get_parser(self, prog_name): parser = super(ListEC2Creds, self).get_parser(prog_name) parser.add_argument( @@ -135,7 +123,6 @@ class ListEC2Creds(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -159,11 +146,9 @@ class ListEC2Creds(lister.Lister): ) for s in data)) -class ShowEC2Creds(show.ShowOne): +class ShowEC2Creds(command.ShowOne): """Display EC2 credentials details""" - log = logging.getLogger(__name__ + '.ShowEC2Creds') - def get_parser(self, prog_name): parser = super(ShowEC2Creds, self).get_parser(prog_name) parser.add_argument( @@ -178,7 +163,6 @@ class ShowEC2Creds(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity diff --git a/openstackclient/identity/v2_0/endpoint.py b/openstackclient/identity/v2_0/endpoint.py index 1744cc72..08c09565 100644 --- a/openstackclient/identity/v2_0/endpoint.py +++ b/openstackclient/identity/v2_0/endpoint.py @@ -15,23 +15,17 @@ """Endpoint action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa from openstackclient.identity import common -class CreateEndpoint(show.ShowOne): +class CreateEndpoint(command.ShowOne): """Create new endpoint""" - log = logging.getLogger(__name__ + '.CreateEndpoint') - def get_parser(self, prog_name): parser = super(CreateEndpoint, self).get_parser(prog_name) parser.add_argument( @@ -62,7 +56,6 @@ class CreateEndpoint(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity service = common.find_service(identity_client, parsed_args.service) @@ -83,8 +76,6 @@ class CreateEndpoint(show.ShowOne): class DeleteEndpoint(command.Command): """Delete endpoint""" - log = logging.getLogger(__name__ + '.DeleteEndpoint') - def get_parser(self, prog_name): parser = super(DeleteEndpoint, self).get_parser(prog_name) parser.add_argument( @@ -93,18 +84,15 @@ class DeleteEndpoint(command.Command): help=_('Endpoint ID to delete')) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity identity_client.endpoints.delete(parsed_args.endpoint) return -class ListEndpoint(lister.Lister): +class ListEndpoint(command.Lister): """List endpoints""" - log = logging.getLogger(__name__ + '.ListEndpoint') - def get_parser(self, prog_name): parser = super(ListEndpoint, self).get_parser(prog_name) parser.add_argument( @@ -115,7 +103,6 @@ class ListEndpoint(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity if parsed_args.long: @@ -136,11 +123,9 @@ class ListEndpoint(lister.Lister): ) for s in data)) -class ShowEndpoint(show.ShowOne): +class ShowEndpoint(command.ShowOne): """Display endpoint details""" - log = logging.getLogger(__name__ + '.ShowEndpoint') - def get_parser(self, prog_name): parser = super(ShowEndpoint, self).get_parser(prog_name) parser.add_argument( @@ -150,7 +135,6 @@ class ShowEndpoint(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity data = identity_client.endpoints.list() diff --git a/openstackclient/identity/v2_0/project.py b/openstackclient/identity/v2_0/project.py index 4330c79c..9e26c308 100644 --- a/openstackclient/identity/v2_0/project.py +++ b/openstackclient/identity/v2_0/project.py @@ -15,24 +15,19 @@ """Identity v2 Project action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show from keystoneauth1 import exceptions as ks_exc +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils from openstackclient.i18n import _ # noqa -class CreateProject(show.ShowOne): +class CreateProject(command.ShowOne): """Create new project""" - log = logging.getLogger(__name__ + '.CreateProject') - def get_parser(self, prog_name): parser = super(CreateProject, self).get_parser(prog_name) parser.add_argument( @@ -70,7 +65,6 @@ class CreateProject(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -106,8 +100,6 @@ class CreateProject(show.ShowOne): class DeleteProject(command.Command): """Delete project(s)""" - log = logging.getLogger(__name__ + '.DeleteProject') - def get_parser(self, prog_name): parser = super(DeleteProject, self).get_parser(prog_name) parser.add_argument( @@ -118,7 +110,6 @@ class DeleteProject(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -131,11 +122,9 @@ class DeleteProject(command.Command): return -class ListProject(lister.Lister): +class ListProject(command.Lister): """List projects""" - log = logging.getLogger(__name__ + '.ListProject') - def get_parser(self, prog_name): parser = super(ListProject, self).get_parser(prog_name) parser.add_argument( @@ -146,7 +135,6 @@ class ListProject(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): if parsed_args.long: columns = ('ID', 'Name', 'Description', 'Enabled') @@ -163,8 +151,6 @@ class ListProject(lister.Lister): class SetProject(command.Command): """Set project properties""" - log = logging.getLogger(__name__ + '.SetProject') - def get_parser(self, prog_name): parser = super(SetProject, self).get_parser(prog_name) parser.add_argument( @@ -202,7 +188,6 @@ class SetProject(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -240,11 +225,9 @@ class SetProject(command.Command): return -class ShowProject(show.ShowOne): +class ShowProject(command.ShowOne): """Display project details""" - log = logging.getLogger(__name__ + '.ShowProject') - def get_parser(self, prog_name): parser = super(ShowProject, self).get_parser(prog_name) parser.add_argument( @@ -253,7 +236,6 @@ class ShowProject(show.ShowOne): help=_('Project to display (name or ID)')) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -303,8 +285,6 @@ class ShowProject(show.ShowOne): class UnsetProject(command.Command): """Unset project properties""" - log = logging.getLogger(__name__ + '.UnsetProject') - def get_parser(self, prog_name): parser = super(UnsetProject, self).get_parser(prog_name) parser.add_argument( @@ -323,7 +303,6 @@ class UnsetProject(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity project = utils.find_resource( diff --git a/openstackclient/identity/v2_0/role.py b/openstackclient/identity/v2_0/role.py index cab6b4a5..892ce006 100644 --- a/openstackclient/identity/v2_0/role.py +++ b/openstackclient/identity/v2_0/role.py @@ -15,24 +15,19 @@ """Identity v2 Role action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show from keystoneauth1 import exceptions as ks_exc +from openstackclient.common import command from openstackclient.common import exceptions from openstackclient.common import utils from openstackclient.i18n import _ # noqa -class AddRole(show.ShowOne): +class AddRole(command.ShowOne): """Add role to project:user""" - log = logging.getLogger(__name__ + '.AddRole') - def get_parser(self, prog_name): parser = super(AddRole, self).get_parser(prog_name) parser.add_argument( @@ -54,7 +49,6 @@ class AddRole(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity role = utils.find_resource(identity_client.roles, parsed_args.role) @@ -74,11 +68,9 @@ class AddRole(show.ShowOne): return zip(*sorted(six.iteritems(info))) -class CreateRole(show.ShowOne): +class CreateRole(command.ShowOne): """Create new role""" - log = logging.getLogger(__name__ + '.CreateRole') - def get_parser(self, prog_name): parser = super(CreateRole, self).get_parser(prog_name) parser.add_argument( @@ -93,7 +85,6 @@ class CreateRole(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity try: @@ -116,8 +107,6 @@ class CreateRole(show.ShowOne): class DeleteRole(command.Command): """Delete role(s)""" - log = logging.getLogger(__name__ + '.DeleteRole') - def get_parser(self, prog_name): parser = super(DeleteRole, self).get_parser(prog_name) parser.add_argument( @@ -128,7 +117,6 @@ class DeleteRole(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -141,11 +129,9 @@ class DeleteRole(command.Command): return -class ListRole(lister.Lister): +class ListRole(command.Lister): """List roles""" - log = logging.getLogger(__name__ + '.ListRole') - def get_parser(self, prog_name): parser = super(ListRole, self).get_parser(prog_name) parser.add_argument( @@ -160,7 +146,6 @@ class ListRole(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity auth_ref = self.app.client_manager.auth_ref @@ -222,11 +207,9 @@ class ListRole(lister.Lister): ) for s in data)) -class ListUserRole(lister.Lister): +class ListUserRole(command.Lister): """List user-role assignments""" - log = logging.getLogger(__name__ + '.ListUserRole') - def get_parser(self, prog_name): parser = super(ListUserRole, self).get_parser(prog_name) parser.add_argument( @@ -242,7 +225,6 @@ class ListUserRole(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity auth_ref = self.app.client_manager.auth_ref @@ -293,8 +275,6 @@ class ListUserRole(lister.Lister): class RemoveRole(command.Command): """Remove role from project : user""" - log = logging.getLogger(__name__ + '.RemoveRole') - def get_parser(self, prog_name): parser = super(RemoveRole, self).get_parser(prog_name) parser.add_argument( @@ -316,7 +296,6 @@ class RemoveRole(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity role = utils.find_resource(identity_client.roles, parsed_args.role) @@ -331,11 +310,9 @@ class RemoveRole(command.Command): project.id) -class ShowRole(show.ShowOne): +class ShowRole(command.ShowOne): """Display role details""" - log = logging.getLogger(__name__ + '.ShowRole') - def get_parser(self, prog_name): parser = super(ShowRole, self).get_parser(prog_name) parser.add_argument( @@ -345,7 +322,6 @@ class ShowRole(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity role = utils.find_resource(identity_client.roles, parsed_args.role) diff --git a/openstackclient/identity/v2_0/service.py b/openstackclient/identity/v2_0/service.py index c9d48441..3af85d7d 100644 --- a/openstackclient/identity/v2_0/service.py +++ b/openstackclient/identity/v2_0/service.py @@ -16,24 +16,18 @@ """Service action implementations""" import argparse -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import exceptions from openstackclient.common import utils from openstackclient.i18n import _ # noqa from openstackclient.identity import common -class CreateService(show.ShowOne): +class CreateService(command.ShowOne): """Create new service""" - log = logging.getLogger(__name__ + '.CreateService') - def get_parser(self, prog_name): parser = super(CreateService, self).get_parser(prog_name) parser.add_argument( @@ -59,7 +53,6 @@ class CreateService(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -95,8 +88,6 @@ class CreateService(show.ShowOne): class DeleteService(command.Command): """Delete service""" - log = logging.getLogger(__name__ + '.DeleteService') - def get_parser(self, prog_name): parser = super(DeleteService, self).get_parser(prog_name) parser.add_argument( @@ -106,7 +97,6 @@ class DeleteService(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity service = common.find_service(identity_client, parsed_args.service) @@ -114,11 +104,9 @@ class DeleteService(command.Command): return -class ListService(lister.Lister): +class ListService(command.Lister): """List services""" - log = logging.getLogger(__name__ + '.ListService') - def get_parser(self, prog_name): parser = super(ListService, self).get_parser(prog_name) parser.add_argument( @@ -129,7 +117,6 @@ class ListService(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): if parsed_args.long: @@ -143,11 +130,9 @@ class ListService(lister.Lister): ) -class ShowService(show.ShowOne): +class ShowService(command.ShowOne): """Display service details""" - log = logging.getLogger(__name__ + '.ShowService') - def get_parser(self, prog_name): parser = super(ShowService, self).get_parser(prog_name) parser.add_argument( @@ -163,7 +148,6 @@ class ShowService(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity auth_ref = self.app.client_manager.auth_ref diff --git a/openstackclient/identity/v2_0/token.py b/openstackclient/identity/v2_0/token.py index 5fed58e5..db38fae8 100644 --- a/openstackclient/identity/v2_0/token.py +++ b/openstackclient/identity/v2_0/token.py @@ -15,26 +15,19 @@ """Identity v2 Token action implementations""" -import logging import six -from cliff import command -from cliff import show - -from openstackclient.common import utils +from openstackclient.common import command from openstackclient.i18n import _ # noqa -class IssueToken(show.ShowOne): +class IssueToken(command.ShowOne): """Issue new token""" - log = logging.getLogger(__name__ + '.IssueToken') - def get_parser(self, prog_name): parser = super(IssueToken, self).get_parser(prog_name) return parser - @utils.log_method(log) def take_action(self, parsed_args): token = self.app.client_manager.auth_ref.service_catalog.get_token() @@ -45,8 +38,6 @@ class IssueToken(show.ShowOne): class RevokeToken(command.Command): """Revoke existing token""" - log = logging.getLogger(__name__ + '.RevokeToken') - def get_parser(self, prog_name): parser = super(RevokeToken, self).get_parser(prog_name) parser.add_argument( @@ -57,7 +48,6 @@ class RevokeToken(command.Command): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity identity_client.tokens.delete(parsed_args.token) diff --git a/openstackclient/identity/v2_0/user.py b/openstackclient/identity/v2_0/user.py index e2b285bd..3d848737 100644 --- a/openstackclient/identity/v2_0/user.py +++ b/openstackclient/identity/v2_0/user.py @@ -15,23 +15,18 @@ """Identity v2.0 User action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show from keystoneauth1 import exceptions as ks_exc +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa -class CreateUser(show.ShowOne): +class CreateUser(command.ShowOne): """Create new user""" - log = logging.getLogger(__name__ + '.CreateUser') - def get_parser(self, prog_name): parser = super(CreateUser, self).get_parser(prog_name) parser.add_argument( @@ -78,7 +73,6 @@ class CreateUser(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -130,8 +124,6 @@ class CreateUser(show.ShowOne): class DeleteUser(command.Command): """Delete user(s)""" - log = logging.getLogger(__name__ + '.DeleteUser') - def get_parser(self, prog_name): parser = super(DeleteUser, self).get_parser(prog_name) parser.add_argument( @@ -142,7 +134,6 @@ class DeleteUser(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -155,11 +146,9 @@ class DeleteUser(command.Command): return -class ListUser(lister.Lister): +class ListUser(command.Lister): """List users""" - log = logging.getLogger(__name__ + '.ListUser') - def get_parser(self, prog_name): parser = super(ListUser, self).get_parser(prog_name) parser.add_argument( @@ -174,7 +163,6 @@ class ListUser(lister.Lister): help=_('List additional fields in output')) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -248,8 +236,6 @@ class ListUser(lister.Lister): class SetUser(command.Command): """Set user properties""" - log = logging.getLogger(__name__ + '.SetUser') - def get_parser(self, prog_name): parser = super(SetUser, self).get_parser(prog_name) parser.add_argument( @@ -296,7 +282,6 @@ class SetUser(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -348,11 +333,9 @@ class SetUser(command.Command): return -class ShowUser(show.ShowOne): +class ShowUser(command.ShowOne): """Display user details""" - log = logging.getLogger(__name__ + '.ShowUser') - def get_parser(self, prog_name): parser = super(ShowUser, self).get_parser(prog_name) parser.add_argument( @@ -362,7 +345,6 @@ class ShowUser(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity diff --git a/openstackclient/identity/v3/catalog.py b/openstackclient/identity/v3/catalog.py index 76f7da51..795f5d5c 100644 --- a/openstackclient/identity/v3/catalog.py +++ b/openstackclient/identity/v3/catalog.py @@ -13,12 +13,9 @@ """Identity v3 Service Catalog action implementations""" -import logging - -from cliff import lister -from cliff import show import six +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa @@ -34,12 +31,9 @@ def _format_endpoints(eps=None): return ret -class ListCatalog(lister.Lister): +class ListCatalog(command.Lister): """List services in the service catalog""" - log = logging.getLogger(__name__ + '.ListCatalog') - - @utils.log_method(log) def take_action(self, parsed_args): # This is ugly because if auth hasn't happened yet we need @@ -59,11 +53,9 @@ class ListCatalog(lister.Lister): ) for s in data)) -class ShowCatalog(show.ShowOne): +class ShowCatalog(command.ShowOne): """Display service catalog details""" - log = logging.getLogger(__name__ + '.ShowCatalog') - def get_parser(self, prog_name): parser = super(ShowCatalog, self).get_parser(prog_name) parser.add_argument( @@ -73,7 +65,6 @@ class ShowCatalog(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): # This is ugly because if auth hasn't happened yet we need diff --git a/openstackclient/identity/v3/consumer.py b/openstackclient/identity/v3/consumer.py index 0a6ade67..72983988 100644 --- a/openstackclient/identity/v3/consumer.py +++ b/openstackclient/identity/v3/consumer.py @@ -15,22 +15,16 @@ """Identity v3 Consumer action implementations""" -import logging import six import sys -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils -class CreateConsumer(show.ShowOne): +class CreateConsumer(command.ShowOne): """Create new consumer""" - log = logging.getLogger(__name__ + '.CreateConsumer') - def get_parser(self, prog_name): parser = super(CreateConsumer, self).get_parser(prog_name) parser.add_argument( @@ -40,7 +34,6 @@ class CreateConsumer(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity consumer = identity_client.oauth1.consumers.create( @@ -53,8 +46,6 @@ class CreateConsumer(show.ShowOne): class DeleteConsumer(command.Command): """Delete consumer""" - log = logging.getLogger(__name__ + '.DeleteConsumer') - def get_parser(self, prog_name): parser = super(DeleteConsumer, self).get_parser(prog_name) parser.add_argument( @@ -64,7 +55,6 @@ class DeleteConsumer(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity consumer = utils.find_resource( @@ -73,12 +63,9 @@ class DeleteConsumer(command.Command): return -class ListConsumer(lister.Lister): +class ListConsumer(command.Lister): """List consumers""" - log = logging.getLogger(__name__ + '.ListConsumer') - - @utils.log_method(log) def take_action(self, parsed_args): columns = ('ID', 'Description') data = self.app.client_manager.identity.oauth1.consumers.list() @@ -92,8 +79,6 @@ class ListConsumer(lister.Lister): class SetConsumer(command.Command): """Set consumer properties""" - log = logging.getLogger(__name__ + '.SetConsumer') - def get_parser(self, prog_name): parser = super(SetConsumer, self).get_parser(prog_name) parser.add_argument( @@ -108,7 +93,6 @@ class SetConsumer(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity consumer = utils.find_resource( @@ -126,11 +110,9 @@ class SetConsumer(command.Command): return -class ShowConsumer(show.ShowOne): +class ShowConsumer(command.ShowOne): """Display consumer details""" - log = logging.getLogger(__name__ + '.ShowConsumer') - def get_parser(self, prog_name): parser = super(ShowConsumer, self).get_parser(prog_name) parser.add_argument( @@ -140,7 +122,6 @@ class ShowConsumer(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity consumer = utils.find_resource( diff --git a/openstackclient/identity/v3/credential.py b/openstackclient/identity/v3/credential.py index f22092d4..6208b320 100644 --- a/openstackclient/identity/v3/credential.py +++ b/openstackclient/identity/v3/credential.py @@ -15,21 +15,15 @@ """Identity v3 Credential action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils -class CreateCredential(show.ShowOne): +class CreateCredential(command.ShowOne): """Create credential command""" - log = logging.getLogger(__name__ + '.CreateCredential') - def get_parser(self, prog_name): parser = super(CreateCredential, self).get_parser(prog_name) parser.add_argument( @@ -56,7 +50,6 @@ class CreateCredential(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity user_id = utils.find_resource(identity_client.users, @@ -79,8 +72,6 @@ class CreateCredential(show.ShowOne): class DeleteCredential(command.Command): """Delete credential command""" - log = logging.getLogger(__name__ + '.DeleteCredential') - def get_parser(self, prog_name): parser = super(DeleteCredential, self).get_parser(prog_name) parser.add_argument( @@ -90,19 +81,15 @@ class DeleteCredential(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity identity_client.credentials.delete(parsed_args.credential) return -class ListCredential(lister.Lister): +class ListCredential(command.Lister): """List credential command""" - log = logging.getLogger(__name__ + '.ListCredential') - - @utils.log_method(log) def take_action(self, parsed_args): columns = ('ID', 'Type', 'User ID', 'Blob', 'Project ID') column_headers = ('ID', 'Type', 'User ID', 'Data', 'Project ID') @@ -117,8 +104,6 @@ class ListCredential(lister.Lister): class SetCredential(command.Command): """Set credential command""" - log = logging.getLogger(__name__ + '.SetCredential') - def get_parser(self, prog_name): parser = super(SetCredential, self).get_parser(prog_name) parser.add_argument( @@ -152,7 +137,6 @@ class SetCredential(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -174,11 +158,9 @@ class SetCredential(command.Command): return -class ShowCredential(show.ShowOne): +class ShowCredential(command.ShowOne): """Show credential command""" - log = logging.getLogger(__name__ + '.ShowCredential') - def get_parser(self, prog_name): parser = super(ShowCredential, self).get_parser(prog_name) parser.add_argument( @@ -188,7 +170,6 @@ class ShowCredential(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity credential = utils.find_resource(identity_client.credentials, diff --git a/openstackclient/identity/v3/domain.py b/openstackclient/identity/v3/domain.py index 8278a300..cec967b8 100644 --- a/openstackclient/identity/v3/domain.py +++ b/openstackclient/identity/v3/domain.py @@ -15,24 +15,19 @@ """Identity v3 Domain action implementations""" -import logging import six import sys -from cliff import command -from cliff import lister -from cliff import show from keystoneauth1 import exceptions as ks_exc +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa -class CreateDomain(show.ShowOne): +class CreateDomain(command.ShowOne): """Create new domain""" - log = logging.getLogger(__name__ + '.CreateDomain') - def get_parser(self, prog_name): parser = super(CreateDomain, self).get_parser(prog_name) parser.add_argument( @@ -63,7 +58,6 @@ class CreateDomain(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -92,8 +86,6 @@ class CreateDomain(show.ShowOne): class DeleteDomain(command.Command): """Delete domain""" - log = logging.getLogger(__name__ + '.DeleteDomain') - def get_parser(self, prog_name): parser = super(DeleteDomain, self).get_parser(prog_name) parser.add_argument( @@ -103,7 +95,6 @@ class DeleteDomain(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity domain = utils.find_resource(identity_client.domains, @@ -112,12 +103,9 @@ class DeleteDomain(command.Command): return -class ListDomain(lister.Lister): +class ListDomain(command.Lister): """List domains""" - log = logging.getLogger(__name__ + '.ListDomain') - - @utils.log_method(log) def take_action(self, parsed_args): columns = ('ID', 'Name', 'Enabled', 'Description') data = self.app.client_manager.identity.domains.list() @@ -131,8 +119,6 @@ class ListDomain(lister.Lister): class SetDomain(command.Command): """Set domain properties""" - log = logging.getLogger(__name__ + '.SetDomain') - def get_parser(self, prog_name): parser = super(SetDomain, self).get_parser(prog_name) parser.add_argument( @@ -163,7 +149,6 @@ class SetDomain(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity domain = utils.find_resource(identity_client.domains, @@ -186,11 +171,9 @@ class SetDomain(command.Command): return -class ShowDomain(show.ShowOne): +class ShowDomain(command.ShowOne): """Display domain details""" - log = logging.getLogger(__name__ + '.ShowDomain') - def get_parser(self, prog_name): parser = super(ShowDomain, self).get_parser(prog_name) parser.add_argument( @@ -200,7 +183,6 @@ class ShowDomain(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity domain = utils.find_resource(identity_client.domains, diff --git a/openstackclient/identity/v3/ec2creds.py b/openstackclient/identity/v3/ec2creds.py index a12ee25e..777c0430 100644 --- a/openstackclient/identity/v3/ec2creds.py +++ b/openstackclient/identity/v3/ec2creds.py @@ -12,13 +12,9 @@ """Identity v3 EC2 Credentials action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa from openstackclient.identity import common @@ -52,11 +48,9 @@ def _determine_ec2_user(parsed_args, client_manager): return user -class CreateEC2Creds(show.ShowOne): +class CreateEC2Creds(command.ShowOne): """Create EC2 credentials""" - log = logging.getLogger(__name__ + ".CreateEC2Creds") - def get_parser(self, prog_name): parser = super(CreateEC2Creds, self).get_parser(prog_name) parser.add_argument( @@ -79,7 +73,6 @@ class CreateEC2Creds(show.ShowOne): common.add_project_domain_option_to_parser(parser) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity client_manager = self.app.client_manager @@ -119,8 +112,6 @@ class CreateEC2Creds(show.ShowOne): class DeleteEC2Creds(command.Command): """Delete EC2 credentials""" - log = logging.getLogger(__name__ + '.DeleteEC2Creds') - def get_parser(self, prog_name): parser = super(DeleteEC2Creds, self).get_parser(prog_name) parser.add_argument( @@ -136,18 +127,15 @@ class DeleteEC2Creds(command.Command): common.add_user_domain_option_to_parser(parser) return parser - @utils.log_method(log) def take_action(self, parsed_args): client_manager = self.app.client_manager user = _determine_ec2_user(parsed_args, client_manager) client_manager.identity.ec2.delete(user, parsed_args.access_key) -class ListEC2Creds(lister.Lister): +class ListEC2Creds(command.Lister): """List EC2 credentials""" - log = logging.getLogger(__name__ + '.ListEC2Creds') - def get_parser(self, prog_name): parser = super(ListEC2Creds, self).get_parser(prog_name) parser.add_argument( @@ -158,7 +146,6 @@ class ListEC2Creds(lister.Lister): common.add_user_domain_option_to_parser(parser) return parser - @utils.log_method(log) def take_action(self, parsed_args): client_manager = self.app.client_manager user = _determine_ec2_user(parsed_args, client_manager) @@ -174,11 +161,9 @@ class ListEC2Creds(lister.Lister): ) for s in data)) -class ShowEC2Creds(show.ShowOne): +class ShowEC2Creds(command.ShowOne): """Display EC2 credentials details""" - log = logging.getLogger(__name__ + '.ShowEC2Creds') - def get_parser(self, prog_name): parser = super(ShowEC2Creds, self).get_parser(prog_name) parser.add_argument( @@ -194,7 +179,6 @@ class ShowEC2Creds(show.ShowOne): common.add_user_domain_option_to_parser(parser) return parser - @utils.log_method(log) def take_action(self, parsed_args): client_manager = self.app.client_manager user = _determine_ec2_user(parsed_args, client_manager) diff --git a/openstackclient/identity/v3/endpoint.py b/openstackclient/identity/v3/endpoint.py index 3d1c6f54..1eff3b3b 100644 --- a/openstackclient/identity/v3/endpoint.py +++ b/openstackclient/identity/v3/endpoint.py @@ -15,14 +15,10 @@ """Identity v3 Endpoint action implementations""" -import logging import six import sys -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.identity import common @@ -34,11 +30,9 @@ def get_service_name(service): return '' -class CreateEndpoint(show.ShowOne): +class CreateEndpoint(command.ShowOne): """Create new endpoint""" - log = logging.getLogger(__name__ + '.CreateEndpoint') - def get_parser(self, prog_name): parser = super(CreateEndpoint, self).get_parser(prog_name) parser.add_argument( @@ -78,7 +72,6 @@ class CreateEndpoint(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity service = common.find_service(identity_client, parsed_args.service) @@ -102,8 +95,6 @@ class CreateEndpoint(show.ShowOne): class DeleteEndpoint(command.Command): """Delete endpoint""" - log = logging.getLogger(__name__ + '.DeleteEndpoint') - def get_parser(self, prog_name): parser = super(DeleteEndpoint, self).get_parser(prog_name) parser.add_argument( @@ -113,7 +104,6 @@ class DeleteEndpoint(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity endpoint_id = utils.find_resource(identity_client.endpoints, @@ -122,11 +112,9 @@ class DeleteEndpoint(command.Command): return -class ListEndpoint(lister.Lister): +class ListEndpoint(command.Lister): """List endpoints""" - log = logging.getLogger(__name__ + '.ListEndpoint') - def get_parser(self, prog_name): parser = super(ListEndpoint, self).get_parser(prog_name) parser.add_argument( @@ -147,7 +135,6 @@ class ListEndpoint(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity columns = ('ID', 'Region', 'Service Name', 'Service Type', @@ -176,8 +163,6 @@ class ListEndpoint(lister.Lister): class SetEndpoint(command.Command): """Set endpoint properties""" - log = logging.getLogger(__name__ + '.SetEndpoint') - def get_parser(self, prog_name): parser = super(SetEndpoint, self).get_parser(prog_name) parser.add_argument( @@ -221,7 +206,6 @@ class SetEndpoint(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity endpoint = utils.find_resource(identity_client.endpoints, @@ -256,11 +240,9 @@ class SetEndpoint(command.Command): return -class ShowEndpoint(show.ShowOne): +class ShowEndpoint(command.ShowOne): """Display endpoint details""" - log = logging.getLogger(__name__ + '.ShowEndpoint') - def get_parser(self, prog_name): parser = super(ShowEndpoint, self).get_parser(prog_name) parser.add_argument( @@ -270,7 +252,6 @@ class ShowEndpoint(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity endpoint = utils.find_resource(identity_client.endpoints, diff --git a/openstackclient/identity/v3/federation_protocol.py b/openstackclient/identity/v3/federation_protocol.py index 20877fcd..2d7ab15d 100644 --- a/openstackclient/identity/v3/federation_protocol.py +++ b/openstackclient/identity/v3/federation_protocol.py @@ -14,21 +14,15 @@ """Identity v3 Protocols actions implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils -class CreateProtocol(show.ShowOne): +class CreateProtocol(command.ShowOne): """Create new federation protocol""" - log = logging.getLogger(__name__ + 'CreateProtocol') - def get_parser(self, prog_name): parser = super(CreateProtocol, self).get_parser(prog_name) parser.add_argument( @@ -50,7 +44,6 @@ class CreateProtocol(show.ShowOne): return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity protocol = identity_client.federation.protocols.create( @@ -71,8 +64,6 @@ class CreateProtocol(show.ShowOne): class DeleteProtocol(command.Command): """Delete federation protocol""" - log = logging.getLogger(__name__ + '.DeleteProtocol') - def get_parser(self, prog_name): parser = super(DeleteProtocol, self).get_parser(prog_name) parser.add_argument( @@ -88,7 +79,6 @@ class DeleteProtocol(command.Command): return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity identity_client.federation.protocols.delete( @@ -96,11 +86,9 @@ class DeleteProtocol(command.Command): return -class ListProtocols(lister.Lister): +class ListProtocols(command.Lister): """List federation protocols""" - log = logging.getLogger(__name__ + '.ListProtocols') - def get_parser(self, prog_name): parser = super(ListProtocols, self).get_parser(prog_name) parser.add_argument( @@ -126,8 +114,6 @@ class ListProtocols(lister.Lister): class SetProtocol(command.Command): """Set federation protocol properties""" - log = logging.getLogger(__name__ + '.SetProtocol') - def get_parser(self, prog_name): parser = super(SetProtocol, self).get_parser(prog_name) parser.add_argument( @@ -166,11 +152,9 @@ class SetProtocol(command.Command): return zip(*sorted(six.iteritems(info))) -class ShowProtocol(show.ShowOne): +class ShowProtocol(command.ShowOne): """Display federation protocol details""" - log = logging.getLogger(__name__ + '.ShowProtocol') - def get_parser(self, prog_name): parser = super(ShowProtocol, self).get_parser(prog_name) parser.add_argument( diff --git a/openstackclient/identity/v3/group.py b/openstackclient/identity/v3/group.py index d503a6b8..b3d893ce 100644 --- a/openstackclient/identity/v3/group.py +++ b/openstackclient/identity/v3/group.py @@ -15,15 +15,12 @@ """Group action implementations""" -import logging import six import sys -from cliff import command -from cliff import lister -from cliff import show from keystoneauth1 import exceptions as ks_exc +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa from openstackclient.identity import common @@ -32,8 +29,6 @@ from openstackclient.identity import common class AddUserToGroup(command.Command): """Add user to group""" - log = logging.getLogger(__name__ + '.AddUserToGroup') - def get_parser(self, prog_name): parser = super(AddUserToGroup, self).get_parser(prog_name) parser.add_argument( @@ -50,7 +45,6 @@ class AddUserToGroup(command.Command): common.add_user_domain_option_to_parser(parser) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -74,8 +68,6 @@ class AddUserToGroup(command.Command): class CheckUserInGroup(command.Command): """Check user membership in group""" - log = logging.getLogger(__name__ + '.CheckUserInGroup') - def get_parser(self, prog_name): parser = super(CheckUserInGroup, self).get_parser(prog_name) parser.add_argument( @@ -92,7 +84,6 @@ class CheckUserInGroup(command.Command): common.add_user_domain_option_to_parser(parser) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -113,11 +104,9 @@ class CheckUserInGroup(command.Command): (parsed_args.user, parsed_args.group)) -class CreateGroup(show.ShowOne): +class CreateGroup(command.ShowOne): """Create new group""" - log = logging.getLogger(__name__ + '.CreateGroup') - def get_parser(self, prog_name): parser = super(CreateGroup, self).get_parser(prog_name) parser.add_argument( @@ -142,7 +131,6 @@ class CreateGroup(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -172,8 +160,6 @@ class CreateGroup(show.ShowOne): class DeleteGroup(command.Command): """Delete group(s)""" - log = logging.getLogger(__name__ + '.DeleteGroup') - def get_parser(self, prog_name): parser = super(DeleteGroup, self).get_parser(prog_name) parser.add_argument( @@ -188,7 +174,6 @@ class DeleteGroup(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -200,11 +185,9 @@ class DeleteGroup(command.Command): return -class ListGroup(lister.Lister): +class ListGroup(command.Lister): """List groups""" - log = logging.getLogger(__name__ + '.ListGroup') - def get_parser(self, prog_name): parser = super(ListGroup, self).get_parser(prog_name) parser.add_argument( @@ -226,7 +209,6 @@ class ListGroup(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -266,8 +248,6 @@ class ListGroup(lister.Lister): class RemoveUserFromGroup(command.Command): """Remove user from group""" - log = logging.getLogger(__name__ + '.RemoveUserFromGroup') - def get_parser(self, prog_name): parser = super(RemoveUserFromGroup, self).get_parser(prog_name) parser.add_argument( @@ -284,7 +264,6 @@ class RemoveUserFromGroup(command.Command): common.add_user_domain_option_to_parser(parser) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -308,8 +287,6 @@ class RemoveUserFromGroup(command.Command): class SetGroup(command.Command): """Set group properties""" - log = logging.getLogger(__name__ + '.SetGroup') - def get_parser(self, prog_name): parser = super(SetGroup, self).get_parser(prog_name) parser.add_argument( @@ -331,7 +308,6 @@ class SetGroup(command.Command): help='New group description') return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity group = common.find_group(identity_client, parsed_args.group, @@ -349,11 +325,9 @@ class SetGroup(command.Command): return -class ShowGroup(show.ShowOne): +class ShowGroup(command.ShowOne): """Display group details""" - log = logging.getLogger(__name__ + '.ShowGroup') - def get_parser(self, prog_name): parser = super(ShowGroup, self).get_parser(prog_name) parser.add_argument( @@ -368,7 +342,6 @@ class ShowGroup(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity diff --git a/openstackclient/identity/v3/identity_provider.py b/openstackclient/identity/v3/identity_provider.py index 4e086b68..0ff8acb9 100644 --- a/openstackclient/identity/v3/identity_provider.py +++ b/openstackclient/identity/v3/identity_provider.py @@ -13,21 +13,15 @@ """Identity v3 IdentityProvider action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils -class CreateIdentityProvider(show.ShowOne): +class CreateIdentityProvider(command.ShowOne): """Create new identity provider""" - log = logging.getLogger(__name__ + '.CreateIdentityProvider') - def get_parser(self, prog_name): parser = super(CreateIdentityProvider, self).get_parser(prog_name) parser.add_argument( @@ -70,7 +64,6 @@ class CreateIdentityProvider(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity if parsed_args.remote_id_file: @@ -96,8 +89,6 @@ class CreateIdentityProvider(show.ShowOne): class DeleteIdentityProvider(command.Command): """Delete identity provider""" - log = logging.getLogger(__name__ + '.DeleteIdentityProvider') - def get_parser(self, prog_name): parser = super(DeleteIdentityProvider, self).get_parser(prog_name) parser.add_argument( @@ -107,7 +98,6 @@ class DeleteIdentityProvider(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity identity_client.federation.identity_providers.delete( @@ -115,12 +105,9 @@ class DeleteIdentityProvider(command.Command): return -class ListIdentityProvider(lister.Lister): +class ListIdentityProvider(command.Lister): """List identity providers""" - log = logging.getLogger(__name__ + '.ListIdentityProvider') - - @utils.log_method(log) def take_action(self, parsed_args): columns = ('ID', 'Enabled', 'Description') identity_client = self.app.client_manager.identity @@ -135,8 +122,6 @@ class ListIdentityProvider(lister.Lister): class SetIdentityProvider(command.Command): """Set identity provider properties""" - log = logging.getLogger(__name__ + '.SetIdentityProvider') - def get_parser(self, prog_name): parser = super(SetIdentityProvider, self).get_parser(prog_name) parser.add_argument( @@ -176,7 +161,6 @@ class SetIdentityProvider(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): federation_client = self.app.client_manager.identity.federation @@ -215,11 +199,9 @@ class SetIdentityProvider(command.Command): return zip(*sorted(six.iteritems(identity_provider._info))) -class ShowIdentityProvider(show.ShowOne): +class ShowIdentityProvider(command.ShowOne): """Display identity provider details""" - log = logging.getLogger(__name__ + '.ShowIdentityProvider') - def get_parser(self, prog_name): parser = super(ShowIdentityProvider, self).get_parser(prog_name) parser.add_argument( @@ -229,7 +211,6 @@ class ShowIdentityProvider(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity idp = utils.find_resource( diff --git a/openstackclient/identity/v3/mapping.py b/openstackclient/identity/v3/mapping.py index c79331ec..422d66bc 100644 --- a/openstackclient/identity/v3/mapping.py +++ b/openstackclient/identity/v3/mapping.py @@ -16,13 +16,10 @@ """Identity v3 federation mapping action implementations""" import json -import logging -from cliff import command -from cliff import lister -from cliff import show import six +from openstackclient.common import command from openstackclient.common import exceptions from openstackclient.common import utils @@ -79,11 +76,9 @@ class _RulesReader(object): return rules -class CreateMapping(show.ShowOne, _RulesReader): +class CreateMapping(command.ShowOne, _RulesReader): """Create new mapping""" - log = logging.getLogger(__name__ + '.CreateMapping') - def get_parser(self, prog_name): parser = super(CreateMapping, self).get_parser(prog_name) parser.add_argument( @@ -99,7 +94,6 @@ class CreateMapping(show.ShowOne, _RulesReader): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity rules = self._read_rules(parsed_args.rules) @@ -114,8 +108,6 @@ class CreateMapping(show.ShowOne, _RulesReader): class DeleteMapping(command.Command): """Delete mapping""" - log = logging.getLogger(__name__ + '.DeleteMapping') - def get_parser(self, prog_name): parser = super(DeleteMapping, self).get_parser(prog_name) parser.add_argument( @@ -126,19 +118,16 @@ class DeleteMapping(command.Command): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity identity_client.federation.mappings.delete(parsed_args.mapping) return -class ListMapping(lister.Lister): +class ListMapping(command.Lister): """List mappings""" - log = logging.getLogger(__name__ + '.ListMapping') def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) # NOTE(marek-denis): Since rules can be long and tedious I have decided # to only list ids of the mappings. If somebody wants to check the # rules, (s)he should show specific ones. @@ -152,8 +141,6 @@ class ListMapping(lister.Lister): class SetMapping(command.Command, _RulesReader): """Set mapping properties""" - log = logging.getLogger(__name__ + '.SetMapping') - def get_parser(self, prog_name): parser = super(SetMapping, self).get_parser(prog_name) parser.add_argument( @@ -169,7 +156,6 @@ class SetMapping(command.Command, _RulesReader): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity if not parsed_args.rules: @@ -186,11 +172,9 @@ class SetMapping(command.Command, _RulesReader): return zip(*sorted(six.iteritems(mapping._info))) -class ShowMapping(show.ShowOne): +class ShowMapping(command.ShowOne): """Display mapping details""" - log = logging.getLogger(__name__ + '.ShowMapping') - def get_parser(self, prog_name): parser = super(ShowMapping, self).get_parser(prog_name) parser.add_argument( @@ -201,7 +185,6 @@ class ShowMapping(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity mapping = identity_client.federation.mappings.get(parsed_args.mapping) diff --git a/openstackclient/identity/v3/policy.py b/openstackclient/identity/v3/policy.py index 9da94863..503df374 100644 --- a/openstackclient/identity/v3/policy.py +++ b/openstackclient/identity/v3/policy.py @@ -15,22 +15,16 @@ """Identity v3 Policy action implementations""" -import logging import six import sys -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils -class CreatePolicy(show.ShowOne): +class CreatePolicy(command.ShowOne): """Create new policy""" - log = logging.getLogger(__name__ + '.CreatePolicy') - def get_parser(self, prog_name): parser = super(CreatePolicy, self).get_parser(prog_name) parser.add_argument( @@ -47,7 +41,6 @@ class CreatePolicy(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): blob = utils.read_blob_file_contents(parsed_args.rules) @@ -64,8 +57,6 @@ class CreatePolicy(show.ShowOne): class DeletePolicy(command.Command): """Delete policy""" - log = logging.getLogger(__name__ + '.DeletePolicy') - def get_parser(self, prog_name): parser = super(DeletePolicy, self).get_parser(prog_name) parser.add_argument( @@ -75,18 +66,15 @@ class DeletePolicy(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity identity_client.policies.delete(parsed_args.policy) return -class ListPolicy(lister.Lister): +class ListPolicy(command.Lister): """List policies""" - log = logging.getLogger(__name__ + '.ListPolicy') - def get_parser(self, prog_name): parser = super(ListPolicy, self).get_parser(prog_name) parser.add_argument( @@ -97,7 +85,6 @@ class ListPolicy(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): if parsed_args.long: columns = ('ID', 'Type', 'Blob') @@ -116,8 +103,6 @@ class ListPolicy(lister.Lister): class SetPolicy(command.Command): """Set policy properties""" - log = logging.getLogger(__name__ + '.SetPolicy') - def get_parser(self, prog_name): parser = super(SetPolicy, self).get_parser(prog_name) parser.add_argument( @@ -137,7 +122,6 @@ class SetPolicy(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity blob = None @@ -158,11 +142,9 @@ class SetPolicy(command.Command): return -class ShowPolicy(show.ShowOne): +class ShowPolicy(command.ShowOne): """Display policy details""" - log = logging.getLogger(__name__ + '.ShowPolicy') - def get_parser(self, prog_name): parser = super(ShowPolicy, self).get_parser(prog_name) parser.add_argument( @@ -172,7 +154,6 @@ class ShowPolicy(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity policy = utils.find_resource(identity_client.policies, diff --git a/openstackclient/identity/v3/project.py b/openstackclient/identity/v3/project.py index 22745aa4..61db8614 100644 --- a/openstackclient/identity/v3/project.py +++ b/openstackclient/identity/v3/project.py @@ -15,25 +15,20 @@ """Project action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show from keystoneauth1 import exceptions as ks_exc +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils from openstackclient.i18n import _ # noqa from openstackclient.identity import common -class CreateProject(show.ShowOne): +class CreateProject(command.ShowOne): """Create new project""" - log = logging.getLogger(__name__ + '.CreateProject') - def get_parser(self, prog_name): parser = super(CreateProject, self).get_parser(prog_name) parser.add_argument( @@ -81,7 +76,6 @@ class CreateProject(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -129,8 +123,6 @@ class CreateProject(show.ShowOne): class DeleteProject(command.Command): """Delete project(s)""" - log = logging.getLogger(__name__ + '.DeleteProject') - def get_parser(self, prog_name): parser = super(DeleteProject, self).get_parser(prog_name) parser.add_argument( @@ -146,7 +138,6 @@ class DeleteProject(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -165,11 +156,9 @@ class DeleteProject(command.Command): return -class ListProject(lister.Lister): +class ListProject(command.Lister): """List projects""" - log = logging.getLogger(__name__ + '.ListProject') - def get_parser(self, prog_name): parser = super(ListProject, self).get_parser(prog_name) parser.add_argument( @@ -190,7 +179,6 @@ class ListProject(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity if parsed_args.long: @@ -227,8 +215,6 @@ class ListProject(lister.Lister): class SetProject(command.Command): """Set project properties""" - log = logging.getLogger(__name__ + '.SetProject') - def get_parser(self, prog_name): parser = super(SetProject, self).get_parser(prog_name) parser.add_argument( @@ -271,7 +257,6 @@ class SetProject(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -302,11 +287,9 @@ class SetProject(command.Command): return -class ShowProject(show.ShowOne): +class ShowProject(command.ShowOne): """Display project details""" - log = logging.getLogger(__name__ + '.ShowProject') - def get_parser(self, prog_name): parser = super(ShowProject, self).get_parser(prog_name) parser.add_argument( @@ -333,7 +316,6 @@ class ShowProject(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity diff --git a/openstackclient/identity/v3/region.py b/openstackclient/identity/v3/region.py index 1ff0b8c0..1e15fd20 100644 --- a/openstackclient/identity/v3/region.py +++ b/openstackclient/identity/v3/region.py @@ -13,22 +13,16 @@ """Identity v3 Region action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa -class CreateRegion(show.ShowOne): +class CreateRegion(command.ShowOne): """Create new region""" - log = logging.getLogger(__name__ + '.CreateRegion') - def get_parser(self, prog_name): parser = super(CreateRegion, self).get_parser(prog_name) # NOTE(stevemar): The API supports an optional region ID, but that @@ -50,7 +44,6 @@ class CreateRegion(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -69,8 +62,6 @@ class CreateRegion(show.ShowOne): class DeleteRegion(command.Command): """Delete region""" - log = logging.getLogger(__name__ + '.DeleteRegion') - def get_parser(self, prog_name): parser = super(DeleteRegion, self).get_parser(prog_name) parser.add_argument( @@ -80,7 +71,6 @@ class DeleteRegion(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -88,11 +78,9 @@ class DeleteRegion(command.Command): return -class ListRegion(lister.Lister): +class ListRegion(command.Lister): """List regions""" - log = logging.getLogger(__name__ + '.ListRegion') - def get_parser(self, prog_name): parser = super(ListRegion, self).get_parser(prog_name) parser.add_argument( @@ -102,7 +90,6 @@ class ListRegion(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -124,8 +111,6 @@ class ListRegion(lister.Lister): class SetRegion(command.Command): """Set region properties""" - log = logging.getLogger(__name__ + '.SetRegion') - def get_parser(self, prog_name): parser = super(SetRegion, self).get_parser(prog_name) parser.add_argument( @@ -145,7 +130,6 @@ class SetRegion(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -162,11 +146,9 @@ class SetRegion(command.Command): return -class ShowRegion(show.ShowOne): +class ShowRegion(command.ShowOne): """Display region details""" - log = logging.getLogger(__name__ + '.ShowRegion') - def get_parser(self, prog_name): parser = super(ShowRegion, self).get_parser(prog_name) parser.add_argument( @@ -176,7 +158,6 @@ class ShowRegion(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity diff --git a/openstackclient/identity/v3/role.py b/openstackclient/identity/v3/role.py index 66f18964..4cced611 100644 --- a/openstackclient/identity/v3/role.py +++ b/openstackclient/identity/v3/role.py @@ -15,15 +15,12 @@ """Identity v3 Role action implementations""" -import logging import six import sys -from cliff import command -from cliff import lister -from cliff import show from keystoneauth1 import exceptions as ks_exc +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa from openstackclient.identity import common @@ -110,8 +107,6 @@ def _process_identity_and_resource_options(parsed_args, class AddRole(command.Command): """Adds a role to a user or group on a domain or project""" - log = logging.getLogger(__name__ + '.AddRole') - def get_parser(self, prog_name): parser = super(AddRole, self).get_parser(prog_name) parser.add_argument( @@ -122,7 +117,6 @@ class AddRole(command.Command): _add_identity_and_resource_options_to_parser(parser) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -147,11 +141,9 @@ class AddRole(command.Command): return -class CreateRole(show.ShowOne): +class CreateRole(command.ShowOne): """Create new role""" - log = logging.getLogger(__name__ + '.CreateRole') - def get_parser(self, prog_name): parser = super(CreateRole, self).get_parser(prog_name) parser.add_argument( @@ -166,7 +158,6 @@ class CreateRole(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -187,8 +178,6 @@ class CreateRole(show.ShowOne): class DeleteRole(command.Command): """Delete role(s)""" - log = logging.getLogger(__name__ + '.DeleteRole') - def get_parser(self, prog_name): parser = super(DeleteRole, self).get_parser(prog_name) parser.add_argument( @@ -199,7 +188,6 @@ class DeleteRole(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -212,18 +200,15 @@ class DeleteRole(command.Command): return -class ListRole(lister.Lister): +class ListRole(command.Lister): """List roles""" - log = logging.getLogger(__name__ + '.ListRole') - def get_parser(self, prog_name): parser = super(ListRole, self).get_parser(prog_name) _add_identity_and_resource_options_to_parser(parser) return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity if parsed_args.user: @@ -318,8 +303,6 @@ class ListRole(lister.Lister): class RemoveRole(command.Command): """Remove role from domain/project : user/group""" - log = logging.getLogger(__name__ + '.RemoveRole') - def get_parser(self, prog_name): parser = super(RemoveRole, self).get_parser(prog_name) parser.add_argument( @@ -330,7 +313,6 @@ class RemoveRole(command.Command): _add_identity_and_resource_options_to_parser(parser) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -357,8 +339,6 @@ class RemoveRole(command.Command): class SetRole(command.Command): """Set role properties""" - log = logging.getLogger(__name__ + '.SetRole') - def get_parser(self, prog_name): parser = super(SetRole, self).get_parser(prog_name) parser.add_argument( @@ -373,7 +353,6 @@ class SetRole(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -389,11 +368,9 @@ class SetRole(command.Command): return -class ShowRole(show.ShowOne): +class ShowRole(command.ShowOne): """Display role details""" - log = logging.getLogger(__name__ + '.ShowRole') - def get_parser(self, prog_name): parser = super(ShowRole, self).get_parser(prog_name) parser.add_argument( @@ -403,7 +380,6 @@ class ShowRole(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity diff --git a/openstackclient/identity/v3/role_assignment.py b/openstackclient/identity/v3/role_assignment.py index 771afeb2..e2b0fe1f 100644 --- a/openstackclient/identity/v3/role_assignment.py +++ b/openstackclient/identity/v3/role_assignment.py @@ -13,19 +13,14 @@ """Identity v3 Assignment action implementations """ -import logging - -from cliff import lister - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.identity import common -class ListRoleAssignment(lister.Lister): +class ListRoleAssignment(command.Lister): """List role assignments""" - log = logging.getLogger(__name__ + '.ListRoleAssignment') - def get_parser(self, prog_name): parser = super(ListRoleAssignment, self).get_parser(prog_name) parser.add_argument( @@ -77,7 +72,6 @@ class ListRoleAssignment(lister.Lister): assignment.project, assignment.domain, assignment.inherited) def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity role = None @@ -120,7 +114,6 @@ class ListRoleAssignment(lister.Lister): include_names = True if parsed_args.names else False effective = True if parsed_args.effective else False - self.log.debug('take_action(%s)' % parsed_args) columns = ('Role', 'User', 'Group', 'Project', 'Domain', 'Inherited') inherited_to = 'projects' if parsed_args.inherited else None diff --git a/openstackclient/identity/v3/service.py b/openstackclient/identity/v3/service.py index 85081aa7..42117c8d 100644 --- a/openstackclient/identity/v3/service.py +++ b/openstackclient/identity/v3/service.py @@ -15,22 +15,16 @@ """Identity v3 Service action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.identity import common -class CreateService(show.ShowOne): +class CreateService(command.ShowOne): """Create new service""" - log = logging.getLogger(__name__ + '.CreateService') - def get_parser(self, prog_name): parser = super(CreateService, self).get_parser(prog_name) parser.add_argument( @@ -61,7 +55,6 @@ class CreateService(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -83,8 +76,6 @@ class CreateService(show.ShowOne): class DeleteService(command.Command): """Delete service""" - log = logging.getLogger(__name__ + '.DeleteService') - def get_parser(self, prog_name): parser = super(DeleteService, self).get_parser(prog_name) parser.add_argument( @@ -94,7 +85,6 @@ class DeleteService(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -104,11 +94,9 @@ class DeleteService(command.Command): return -class ListService(lister.Lister): +class ListService(command.Lister): """List services""" - log = logging.getLogger(__name__ + '.ListService') - def get_parser(self, prog_name): parser = super(ListService, self).get_parser(prog_name) parser.add_argument( @@ -119,7 +107,6 @@ class ListService(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): if parsed_args.long: @@ -136,8 +123,6 @@ class ListService(lister.Lister): class SetService(command.Command): """Set service properties""" - log = logging.getLogger(__name__ + '.SetService') - def get_parser(self, prog_name): parser = super(SetService, self).get_parser(prog_name) parser.add_argument( @@ -173,7 +158,6 @@ class SetService(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -205,11 +189,9 @@ class SetService(command.Command): return -class ShowService(show.ShowOne): +class ShowService(command.ShowOne): """Display service details""" - log = logging.getLogger(__name__ + '.ShowService') - def get_parser(self, prog_name): parser = super(ShowService, self).get_parser(prog_name) parser.add_argument( @@ -219,7 +201,6 @@ class ShowService(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity diff --git a/openstackclient/identity/v3/service_provider.py b/openstackclient/identity/v3/service_provider.py index 838ad4a2..6016928c 100644 --- a/openstackclient/identity/v3/service_provider.py +++ b/openstackclient/identity/v3/service_provider.py @@ -13,22 +13,16 @@ """Service Provider action implementations""" -import logging import six import sys -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils -class CreateServiceProvider(show.ShowOne): +class CreateServiceProvider(command.ShowOne): """Create new service provider""" - log = logging.getLogger(__name__ + '.CreateServiceProvider') - def get_parser(self, prog_name): parser = super(CreateServiceProvider, self).get_parser(prog_name) parser.add_argument( @@ -73,7 +67,6 @@ class CreateServiceProvider(show.ShowOne): return parser - @utils.log_method(log) def take_action(self, parsed_args): service_client = self.app.client_manager.identity sp = service_client.federation.service_providers.create( @@ -90,8 +83,6 @@ class CreateServiceProvider(show.ShowOne): class DeleteServiceProvider(command.Command): """Delete service provider""" - log = logging.getLogger(__name__ + '.DeleteServiceProvider') - def get_parser(self, prog_name): parser = super(DeleteServiceProvider, self).get_parser(prog_name) parser.add_argument( @@ -101,7 +92,6 @@ class DeleteServiceProvider(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): service_client = self.app.client_manager.identity service_client.federation.service_providers.delete( @@ -109,12 +99,9 @@ class DeleteServiceProvider(command.Command): return -class ListServiceProvider(lister.Lister): +class ListServiceProvider(command.Lister): """List service providers""" - log = logging.getLogger(__name__ + '.ListServiceProvider') - - @utils.log_method(log) def take_action(self, parsed_args): service_client = self.app.client_manager.identity data = service_client.federation.service_providers.list() @@ -130,8 +117,6 @@ class ListServiceProvider(lister.Lister): class SetServiceProvider(command.Command): """Set service provider properties""" - log = logging.getLogger(__name__ + '.SetServiceProvider') - def get_parser(self, prog_name): parser = super(SetServiceProvider, self).get_parser(prog_name) parser.add_argument( @@ -168,7 +153,6 @@ class SetServiceProvider(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): federation_client = self.app.client_manager.identity.federation @@ -193,11 +177,9 @@ class SetServiceProvider(command.Command): return zip(*sorted(six.iteritems(service_provider._info))) -class ShowServiceProvider(show.ShowOne): +class ShowServiceProvider(command.ShowOne): """Display service provider details""" - log = logging.getLogger(__name__ + '.ShowServiceProvider') - def get_parser(self, prog_name): parser = super(ShowServiceProvider, self).get_parser(prog_name) parser.add_argument( @@ -207,7 +189,6 @@ class ShowServiceProvider(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): service_client = self.app.client_manager.identity service_provider = utils.find_resource( diff --git a/openstackclient/identity/v3/token.py b/openstackclient/identity/v3/token.py index cd3dc798..9ebd1799 100644 --- a/openstackclient/identity/v3/token.py +++ b/openstackclient/identity/v3/token.py @@ -15,20 +15,16 @@ """Identity v3 Token action implementations""" -import logging import six -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.identity import common -class AuthorizeRequestToken(show.ShowOne): +class AuthorizeRequestToken(command.ShowOne): """Authorize a request token""" - log = logging.getLogger(__name__ + '.AuthorizeRequestToken') - def get_parser(self, prog_name): parser = super(AuthorizeRequestToken, self).get_parser(prog_name) parser.add_argument( @@ -49,7 +45,6 @@ class AuthorizeRequestToken(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity # NOTE(stevemar): We want a list of role ids @@ -68,11 +63,9 @@ class AuthorizeRequestToken(show.ShowOne): return zip(*sorted(six.iteritems(verifier_pin._info))) -class CreateAccessToken(show.ShowOne): +class CreateAccessToken(command.ShowOne): """Create an access token""" - log = logging.getLogger(__name__ + '.CreateAccessToken') - def get_parser(self, prog_name): parser = super(CreateAccessToken, self).get_parser(prog_name) parser.add_argument( @@ -108,7 +101,6 @@ class CreateAccessToken(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) token_client = self.app.client_manager.identity.oauth1.access_tokens access_token = token_client.create( parsed_args.consumer_key, parsed_args.consumer_secret, @@ -117,11 +109,9 @@ class CreateAccessToken(show.ShowOne): return zip(*sorted(six.iteritems(access_token._info))) -class CreateRequestToken(show.ShowOne): +class CreateRequestToken(command.ShowOne): """Create a request token""" - log = logging.getLogger(__name__ + '.CreateRequestToken') - def get_parser(self, prog_name): parser = super(CreateRequestToken, self).get_parser(prog_name) parser.add_argument( @@ -151,8 +141,6 @@ class CreateRequestToken(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - identity_client = self.app.client_manager.identity if parsed_args.domain: @@ -173,18 +161,34 @@ class CreateRequestToken(show.ShowOne): return zip(*sorted(six.iteritems(request_token._info))) -class IssueToken(show.ShowOne): +class IssueToken(command.ShowOne): """Issue new token""" - log = logging.getLogger(__name__ + '.IssueToken') - def get_parser(self, prog_name): parser = super(IssueToken, self).get_parser(prog_name) return parser - @utils.log_method(log) def take_action(self, parsed_args): token = self.app.client_manager.auth_ref.service_catalog.get_token() if 'tenant_id' in token: token['project_id'] = token.pop('tenant_id') return zip(*sorted(six.iteritems(token))) + + +class RevokeToken(command.Command): + """Revoke existing token""" + + def get_parser(self, prog_name): + parser = super(RevokeToken, self).get_parser(prog_name) + parser.add_argument( + 'token', + metavar='<token>', + help='Token to be deleted', + ) + return parser + + def take_action(self, parsed_args): + identity_client = self.app.client_manager.identity + + identity_client.tokens.revoke_token(parsed_args.token) + return diff --git a/openstackclient/identity/v3/trust.py b/openstackclient/identity/v3/trust.py index 2c3cf537..26fb8338 100644 --- a/openstackclient/identity/v3/trust.py +++ b/openstackclient/identity/v3/trust.py @@ -14,22 +14,16 @@ """Identity v3 Trust action implementations""" import datetime -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils from openstackclient.identity import common -class CreateTrust(show.ShowOne): +class CreateTrust(command.ShowOne): """Create new trust""" - log = logging.getLogger(__name__ + '.CreateTrust') - def get_parser(self, prog_name): parser = super(CreateTrust, self).get_parser(prog_name) parser.add_argument( @@ -85,7 +79,6 @@ class CreateTrust(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity # NOTE(stevemar): Find the two users, project and roles that @@ -138,8 +131,6 @@ class CreateTrust(show.ShowOne): class DeleteTrust(command.Command): """Delete trust(s)""" - log = logging.getLogger(__name__ + '.DeleteTrust') - def get_parser(self, prog_name): parser = super(DeleteTrust, self).get_parser(prog_name) parser.add_argument( @@ -151,20 +142,16 @@ class DeleteTrust(command.Command): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity for t in parsed_args.trust: trust_obj = utils.find_resource(identity_client.trusts, t) identity_client.trusts.delete(trust_obj.id) -class ListTrust(lister.Lister): +class ListTrust(command.Lister): """List trusts""" - log = logging.getLogger(__name__ + '.ListTrust') - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) columns = ('ID', 'Expires At', 'Impersonation', 'Project ID', 'Trustee User ID', 'Trustor User ID') data = self.app.client_manager.identity.trusts.list() @@ -175,11 +162,9 @@ class ListTrust(lister.Lister): ) for s in data)) -class ShowTrust(show.ShowOne): +class ShowTrust(command.ShowOne): """Display trust details""" - log = logging.getLogger(__name__ + '.ShowTrust') - def get_parser(self, prog_name): parser = super(ShowTrust, self).get_parser(prog_name) parser.add_argument( @@ -190,7 +175,6 @@ class ShowTrust(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) identity_client = self.app.client_manager.identity trust = utils.find_resource(identity_client.trusts, parsed_args.trust) diff --git a/openstackclient/identity/v3/unscoped_saml.py b/openstackclient/identity/v3/unscoped_saml.py index e659e75e..a42637dd 100644 --- a/openstackclient/identity/v3/unscoped_saml.py +++ b/openstackclient/identity/v3/unscoped_saml.py @@ -17,10 +17,7 @@ The first step of federated auth is to fetch an unscoped token. From there, the user can list domains and projects they are allowed to access, and request a scoped token.""" -import logging - -from cliff import lister - +from openstackclient.common import command from openstackclient.common import exceptions from openstackclient.common import utils @@ -43,13 +40,10 @@ def auth_with_unscoped_saml(func): return _decorated -class ListAccessibleDomains(lister.Lister): +class ListAccessibleDomains(command.Lister): """List accessible domains""" - log = logging.getLogger(__name__ + '.ListAccessibleDomains') - @auth_with_unscoped_saml - @utils.log_method(log) def take_action(self, parsed_args): columns = ('ID', 'Enabled', 'Name', 'Description') identity_client = self.app.client_manager.identity @@ -61,13 +55,10 @@ class ListAccessibleDomains(lister.Lister): ) for s in data)) -class ListAccessibleProjects(lister.Lister): +class ListAccessibleProjects(command.Lister): """List accessible projects""" - log = logging.getLogger(__name__ + '.ListAccessibleProjects') - @auth_with_unscoped_saml - @utils.log_method(log) def take_action(self, parsed_args): columns = ('ID', 'Domain ID', 'Enabled', 'Name') identity_client = self.app.client_manager.identity diff --git a/openstackclient/identity/v3/user.py b/openstackclient/identity/v3/user.py index 43a116cb..c694c6ae 100644 --- a/openstackclient/identity/v3/user.py +++ b/openstackclient/identity/v3/user.py @@ -16,24 +16,19 @@ """Identity v3 User action implementations""" import copy -import logging import six -from cliff import command -from cliff import lister -from cliff import show from keystoneauth1 import exceptions as ks_exc +from openstackclient.common import command from openstackclient.common import utils from openstackclient.i18n import _ # noqa from openstackclient.identity import common -class CreateUser(show.ShowOne): +class CreateUser(command.ShowOne): """Create new user""" - log = logging.getLogger(__name__ + '.CreateUser') - def get_parser(self, prog_name): parser = super(CreateUser, self).get_parser(prog_name) parser.add_argument( @@ -91,7 +86,6 @@ class CreateUser(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -138,8 +132,6 @@ class CreateUser(show.ShowOne): class DeleteUser(command.Command): """Delete user(s)""" - log = logging.getLogger(__name__ + '.DeleteUser') - def get_parser(self, prog_name): parser = super(DeleteUser, self).get_parser(prog_name) parser.add_argument( @@ -155,7 +147,6 @@ class DeleteUser(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -174,11 +165,9 @@ class DeleteUser(command.Command): return -class ListUser(lister.Lister): +class ListUser(command.Lister): """List users""" - log = logging.getLogger(__name__ + '.ListUser') - def get_parser(self, prog_name): parser = super(ListUser, self).get_parser(prog_name) parser.add_argument( @@ -205,7 +194,6 @@ class ListUser(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -280,8 +268,6 @@ class ListUser(lister.Lister): class SetUser(command.Command): """Set user properties""" - log = logging.getLogger(__name__ + '.SetUser') - def get_parser(self, prog_name): parser = super(SetUser, self).get_parser(prog_name) parser.add_argument( @@ -334,7 +320,6 @@ class SetUser(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -383,8 +368,6 @@ class SetUser(command.Command): class SetPasswordUser(command.Command): """Change current user password""" - log = logging.getLogger(__name__ + '.SetPasswordUser') - def get_parser(self, prog_name): parser = super(SetPasswordUser, self).get_parser(prog_name) parser.add_argument( @@ -399,7 +382,6 @@ class SetPasswordUser(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -436,11 +418,9 @@ class SetPasswordUser(command.Command): identity_client.users.update_password(current_password, password) -class ShowUser(show.ShowOne): +class ShowUser(command.ShowOne): """Display user details""" - log = logging.getLogger(__name__ + '.ShowUser') - def get_parser(self, prog_name): parser = super(ShowUser, self).get_parser(prog_name) parser.add_argument( @@ -455,7 +435,6 @@ class ShowUser(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py index c18f3fc7..9cc5facd 100644 --- a/openstackclient/image/v1/image.py +++ b/openstackclient/image/v1/image.py @@ -17,7 +17,6 @@ import argparse import io -import logging import os import six import sys @@ -27,12 +26,9 @@ if os.name == "nt": else: msvcrt = None -from cliff import command -from cliff import lister -from cliff import show - from glanceclient.common import utils as gc_utils from openstackclient.api import utils as api_utils +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils from openstackclient.i18n import _ # noqa @@ -57,11 +53,9 @@ def _format_visibility(data): return 'private' -class CreateImage(show.ShowOne): +class CreateImage(command.ShowOne): """Create/upload an image""" - log = logging.getLogger(__name__ + ".CreateImage") - def get_parser(self, prog_name): parser = super(CreateImage, self).get_parser(prog_name) parser.add_argument( @@ -191,7 +185,6 @@ class CreateImage(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image if getattr(parsed_args, 'owner', None) is not None: @@ -283,8 +276,6 @@ class CreateImage(show.ShowOne): class DeleteImage(command.Command): """Delete image(s)""" - log = logging.getLogger(__name__ + ".DeleteImage") - def get_parser(self, prog_name): parser = super(DeleteImage, self).get_parser(prog_name) parser.add_argument( @@ -296,8 +287,6 @@ class DeleteImage(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image for image in parsed_args.images: image_obj = utils.find_resource( @@ -307,11 +296,9 @@ class DeleteImage(command.Command): image_client.images.delete(image_obj.id) -class ListImage(lister.Lister): +class ListImage(command.Lister): """List available images""" - log = logging.getLogger(__name__ + ".ListImage") - def get_parser(self, prog_name): parser = super(ListImage, self).get_parser(prog_name) public_group = parser.add_mutually_exclusive_group() @@ -367,8 +354,6 @@ class ListImage(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image kwargs = {} @@ -452,8 +437,6 @@ class ListImage(lister.Lister): class SaveImage(command.Command): """Save an image locally""" - log = logging.getLogger(__name__ + ".SaveImage") - def get_parser(self, prog_name): parser = super(SaveImage, self).get_parser(prog_name) parser.add_argument( @@ -469,8 +452,6 @@ class SaveImage(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image image = utils.find_resource( image_client.images, @@ -484,8 +465,6 @@ class SaveImage(command.Command): class SetImage(command.Command): """Set image properties""" - log = logging.getLogger(__name__ + ".SetImage") - def get_parser(self, prog_name): parser = super(SetImage, self).get_parser(prog_name) parser.add_argument( @@ -624,7 +603,6 @@ class SetImage(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) image_client = self.app.client_manager.image if getattr(parsed_args, 'owner', None) is not None: @@ -723,11 +701,9 @@ class SetImage(command.Command): kwargs['data'].close() -class ShowImage(show.ShowOne): +class ShowImage(command.ShowOne): """Display image details""" - log = logging.getLogger(__name__ + ".ShowImage") - def get_parser(self, prog_name): parser = super(ShowImage, self).get_parser(prog_name) parser.add_argument( @@ -738,8 +714,6 @@ class ShowImage(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image image = utils.find_resource( image_client.images, diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index 3c1faf59..3f162181 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -16,15 +16,12 @@ """Image V2 Action Implementations""" import argparse -import logging import six -from cliff import command -from cliff import lister -from cliff import show from glanceclient.common import utils as gc_utils from openstackclient.api import utils as api_utils +from openstackclient.common import command from openstackclient.common import exceptions from openstackclient.common import parseractions from openstackclient.common import utils @@ -67,11 +64,9 @@ def _format_image(image): return info -class AddProjectToImage(show.ShowOne): +class AddProjectToImage(command.ShowOne): """Associate project with image""" - log = logging.getLogger(__name__ + ".AddProjectToImage") - def get_parser(self, prog_name): parser = super(AddProjectToImage, self).get_parser(prog_name) parser.add_argument( @@ -88,8 +83,6 @@ class AddProjectToImage(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image identity_client = self.app.client_manager.identity @@ -109,10 +102,9 @@ class AddProjectToImage(show.ShowOne): return zip(*sorted(six.iteritems(image_member))) -class CreateImage(show.ShowOne): +class CreateImage(command.ShowOne): """Create/upload an image""" - log = logging.getLogger(__name__ + ".CreateImage") deadopts = ('size', 'location', 'copy-from', 'checksum', 'store') def get_parser(self, prog_name): @@ -241,7 +233,6 @@ class CreateImage(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) identity_client = self.app.client_manager.identity image_client = self.app.client_manager.image @@ -366,8 +357,6 @@ class CreateImage(show.ShowOne): class DeleteImage(command.Command): """Delete image(s)""" - log = logging.getLogger(__name__ + ".DeleteImage") - def get_parser(self, prog_name): parser = super(DeleteImage, self).get_parser(prog_name) parser.add_argument( @@ -379,8 +368,6 @@ class DeleteImage(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image for image in parsed_args.images: image_obj = utils.find_resource( @@ -390,11 +377,9 @@ class DeleteImage(command.Command): image_client.images.delete(image_obj.id) -class ListImage(lister.Lister): +class ListImage(command.Lister): """List available images""" - log = logging.getLogger(__name__ + ".ListImage") - def get_parser(self, prog_name): parser = super(ListImage, self).get_parser(prog_name) public_group = parser.add_mutually_exclusive_group() @@ -446,11 +431,23 @@ class ListImage(lister.Lister): "(default: asc), multiple keys and directions can be " "specified separated by comma", ) + parser.add_argument( + "--limit", + metavar="<limit>", + type=int, + help="Maximum number of images to display.", + ) + parser.add_argument( + '--marker', + metavar='<marker>', + default=None, + help="The last image (name or ID) of the previous page. Display " + "list of images after marker. Display all images if not " + "specified." + ) return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image kwargs = {} @@ -460,6 +457,11 @@ class ListImage(lister.Lister): kwargs['private'] = True if parsed_args.shared: kwargs['shared'] = True + if parsed_args.limit: + kwargs['limit'] = parsed_args.limit + if parsed_args.marker: + kwargs['marker'] = utils.find_resource(image_client.images, + parsed_args.marker).id if parsed_args.long: columns = ( @@ -491,16 +493,7 @@ class ListImage(lister.Lister): column_headers = columns # List of image data received - data = [] - # No pages received yet, so start the page marker at None. - marker = None - while True: - page = image_client.api.image_list(marker=marker, **kwargs) - if not page: - break - data.extend(page) - # Set the marker to the id of the last item we received - marker = page[-1]['id'] + data = image_client.api.image_list(**kwargs) if parsed_args.property: # NOTE(dtroyer): coerce to a list to subscript it in py3 @@ -529,8 +522,6 @@ class ListImage(lister.Lister): class RemoveProjectImage(command.Command): """Disassociate project with image""" - log = logging.getLogger(__name__ + ".RemoveProjectImage") - def get_parser(self, prog_name): parser = super(RemoveProjectImage, self).get_parser(prog_name) parser.add_argument( @@ -547,8 +538,6 @@ class RemoveProjectImage(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image identity_client = self.app.client_manager.identity @@ -566,8 +555,6 @@ class RemoveProjectImage(command.Command): class SaveImage(command.Command): """Save an image locally""" - log = logging.getLogger(__name__ + ".SaveImage") - def get_parser(self, prog_name): parser = super(SaveImage, self).get_parser(prog_name) parser.add_argument( @@ -583,8 +570,6 @@ class SaveImage(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image image = utils.find_resource( image_client.images, @@ -598,7 +583,6 @@ class SaveImage(command.Command): class SetImage(command.Command): """Set image properties""" - log = logging.getLogger(__name__ + ".SetImage") deadopts = ('visibility',) def get_parser(self, prog_name): @@ -758,7 +742,6 @@ class SetImage(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) identity_client = self.app.client_manager.identity image_client = self.app.client_manager.image @@ -824,6 +807,7 @@ class SetImage(command.Command): image = utils.find_resource( image_client.images, parsed_args.image) + activation_status = None if parsed_args.deactivate: image_client.images.deactivate(image.id) activation_status = "deactivated" @@ -847,11 +831,9 @@ class SetImage(command.Command): raise e -class ShowImage(show.ShowOne): +class ShowImage(command.ShowOne): """Display image details""" - log = logging.getLogger(__name__ + ".ShowImage") - def get_parser(self, prog_name): parser = super(ShowImage, self).get_parser(prog_name) parser.add_argument( @@ -862,8 +844,6 @@ class ShowImage(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - image_client = self.app.client_manager.image image = utils.find_resource( image_client.images, diff --git a/openstackclient/locale/de/LC_MESSAGES/openstackclient.po b/openstackclient/locale/de/LC_MESSAGES/openstackclient.po new file mode 100644 index 00000000..1c94b9d4 --- /dev/null +++ b/openstackclient/locale/de/LC_MESSAGES/openstackclient.po @@ -0,0 +1,600 @@ +# Translations template for python-openstackclient. +# Copyright (C) 2015 ORGANIZATION +# This file is distributed under the same license as the +# python-openstackclient project. +# +# Translators: +# Ettore Atalan <atalanttore@googlemail.com>, 2014-2015 +# Andreas Jaeger <jaegerandi@gmail.com>, 2015. #zanata +# OpenStack Infra <zanata@openstack.org>, 2015. #zanata +msgid "" +msgstr "" +"Project-Id-Version: python-openstackclient 2.0.1.dev168\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2016-01-19 02:20+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2015-09-19 07:10+0000\n" +"Last-Translator: Andreas Jaeger <jaegerandi@gmail.com>\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Generated-By: Babel 2.0\n" +"X-Generator: Zanata 3.7.3\n" +"Language-Team: German\n" + +msgid "" +"\n" +"Complete\n" +msgstr "" +"\n" +"Fertig\n" + +msgid "" +"\n" +"Error creating server" +msgstr "" +"\n" +"Fehler beim Erstellen des Servers" + +msgid "" +"\n" +"Error creating server snapshot" +msgstr "" +"\n" +"Fehler beim Erstellen der Server-Schattenkopie" + +msgid "" +"\n" +"Error deleting server" +msgstr "" +"\n" +"Fehler beim Löschen des Servers" + +msgid "" +"\n" +"Error migrating server" +msgstr "" +"\n" +"Fehler beim Migrieren des Servers" + +msgid "" +"\n" +"Error rebooting server\n" +msgstr "" +"\n" +"Fehler beim Neustarten des Servers\n" + +msgid "" +"\n" +"Error rebuilding server" +msgstr "" +"\n" +"Fehler bei der Wiederherstellung des Servers" + +msgid "" +"\n" +"Error resizing server" +msgstr "" +"\n" +"Fehler bei der Größenänderung des Servers" + +msgid "" +"\n" +"Reboot complete\n" +msgstr "" +"\n" +"Neustart abgeschlossen\n" + +msgid "Add a property to <name> (repeat option to set multiple properties)" +msgstr "" +"Fügen Sie eine Eigenschaft zu <Name> hinzu (wiederholen Sie die Option, um " +"mehrere Eigenschaften festzulegen)" + +msgid "Allow disk over-commit on the destination host" +msgstr "Festplattenüberladung auf dem Zielhost erlauben" + +msgid "Complete\n" +msgstr "Fertig\n" + +msgid "Confirm server resize is complete" +msgstr "Bestätigen Sie, ob die Größenänderung des Servers abgeschlossen ist" + +msgid "" +"Create a NIC on the server. Specify option multiple times to create multiple " +"NICs. Either net-id or port-id must be provided, but not both. net-id: " +"attach NIC to network with this UUID, port-id: attach NIC to port with this " +"UUID, v4-fixed-ip: IPv4 fixed address for NIC (optional), v6-fixed-ip: IPv6 " +"fixed address for NIC (optional)." +msgstr "" +"Erstellen Sie ein NIC auf dem Server. Geben Sie die Option mehrfach an, um " +"mehrere NICs zu erstellen. Entweder net-id oder port-id müssen " +"bereitgestellt werden, aber nicht beide. net-id: NIC an Netzwerk mit dieser " +"UUID binden, port-id: NIC an Port mit dieser UUID binden, v4-fixed-ip: Feste " +"IPv4-Adresse für NIC (optional), v6-fixed-ip: Feste IPv6-Adresse für NIC " +"(optional)." + +msgid "" +"Create credentials for user (name or ID; default: current authenticated user)" +msgstr "" +"Anmeldedaten für Benutzer erstellen (Name oder Kennung; Standard: aktuell " +"authentifizierter Benutzer)" + +msgid "" +"Create credentials in project (name or ID; default: current authenticated " +"project)" +msgstr "" +"Anmeldedaten in Projekt erstellen (Name oder Kennung; Standard: aktuell " +"authentifiziertes Projekt)" + +msgid "Credentials access key" +msgstr "Anmeldedaten-Zugriffsschlüssel" + +msgid "Default project (name or ID)" +msgstr "Standardprojekt (Name oder Kennung)" + +msgid "Delete credentials for user (name or ID)" +msgstr "Anmeldedaten für Benutzer löschen (name or ID)" + +msgid "Destination port (ssh -p option)" +msgstr "Zielport (ssh -p Option)" + +msgid "Disable project" +msgstr "Projekt deaktivieren" + +msgid "Disable user" +msgstr "Benutzer deaktivieren" + +msgid "Display server diagnostics information" +msgstr "Serverdiagnoseinformationen anzeigen" + +msgid "Do not over-commit disk on the destination host (default)" +msgstr "Festplatte auf dem Zielhost nicht überladen (Standard)" + +msgid "Enable project" +msgstr "Projekt aktivieren" + +msgid "Enable project (default)" +msgstr "Projekt aktivieren (Standardeinstellung)" + +msgid "Enable user (default)" +msgstr "Benutzer aktivieren (Standardeinstellung)" + +msgid "Endpoint ID to delete" +msgstr "Zu löschende Endpunktkennung" + +msgid "Endpoint ID to display" +msgstr "Anzuzeigende Endpunktkennung" + +#, python-format +msgid "Error creating server snapshot: %s" +msgstr "Fehler beim Erstellen der Server-Schattenkopie: %s" + +#, python-format +msgid "Error creating server: %s" +msgstr "Fehler beim Erstellen des Servers: %s" + +#, python-format +msgid "Error deleting server: %s" +msgstr "Fehler beim Löschen des Servers: %s" + +msgid "Error retrieving diagnostics data" +msgstr "Fehler beim Abrufen der Diagnosedaten" + +msgid "File to inject into image before boot (repeat for multiple files)" +msgstr "" +"Vor dem Start auf diesem Abbild einzufügende Datei (für mehrere Dateien " +"wiederholen)" + +msgid "Filter by parent region ID" +msgstr "Nach übergeordneter Regionskennung filtern" + +msgid "Filter list by user (name or ID)" +msgstr "Liste nach Benutzer filtern (Name oder Kennung)" + +msgid "Filter users by <project> (name or ID)" +msgstr "Benutzer nach <project> filtern (Name oder Kennung)" + +msgid "Filter users by project (name or ID)" +msgstr "Benutzer nach Projekt filtern (Name oder Kennung)" + +msgid "Hints for the scheduler (optional extension)" +msgstr "Hinweise für den Planer (optionale Erweiterung)" + +msgid "Include <project> (name or ID)" +msgstr "<project> miteinbeziehen (Name oder Kennung)" + +msgid "Include <user> (name or ID)" +msgstr "<user> miteinbeziehen (Name oder Kennung)" + +msgid "Include all projects (admin only)" +msgstr "Alle Projekte miteinbeziehen (nur Administrator)" + +msgid "Keypair to inject into this server (optional extension)" +msgstr "In diesem Server einzufügendes Schlüsselpaar (optionale Erweiterung)" + +msgid "List additional fields in output" +msgstr "Zusätzliche Felder in der Ausgabe auflisten" + +msgid "Login name (ssh -l option)" +msgstr "Anmeldename (ssh -l Option)" + +msgid "" +"Map block devices; map is <id>:<type>:<size(GB)>:<delete_on_terminate> " +"(optional extension)" +msgstr "" +"Blockorientierte Geräte abbilden; Abbildung ist <Kennung>:<Typ>:<Größe(GB)>:" +"<beim_Beenden_löschen> (optionale Erweiterung)" + +msgid "Maximum number of servers to launch (default=1)" +msgstr "Maximale Anzahl der zu startenden Server (Standard=1)" + +msgid "Minimum number of servers to launch (default=1)" +msgstr "Minimale Anzahl der zu startenden Server (Standard=1)" + +msgid "Name of new image (default is server name)" +msgstr "Name des neuen Abbilds (Servername ist Standard)" + +msgid "Name or ID of security group to remove from server" +msgstr "Name oder Kennung der vom Server zu entfernenden Sicherheitsgruppe" + +msgid "Name or ID of server to use" +msgstr "Name oder Kennung des zu verwendenden Servers" + +msgid "New endpoint admin URL" +msgstr "Administrator-URL des neuen Endpunktes" + +msgid "New endpoint internal URL" +msgstr "Interne URL des neuen Endpunktes" + +msgid "New endpoint public URL (required)" +msgstr "Öffentliche URL des neuen Endpunktes (erforderlich)" + +msgid "New endpoint region ID" +msgstr "Neue Endpunkt-Regionskennung" + +msgid "New endpoint service (name or ID)" +msgstr "Neuer Endpunktdienst (Name oder Kennung)" + +msgid "New parent region ID" +msgstr "Neue übergeordnete Regionskennung" + +msgid "New password: " +msgstr "Neues Passwort:" + +msgid "New project name" +msgstr "Name des neuen Projekts" + +msgid "New region ID" +msgstr "Neue Regionskennung" + +msgid "New region description" +msgstr "Beschreibung des neuen Bereichs" + +msgid "New role name" +msgstr "Name der neuen Rolle" + +msgid "New server name" +msgstr "Neuer Servername" + +msgid "New service description" +msgstr "Beschreibung des neuen Dienstes" + +msgid "New service name" +msgstr "Name des neuen Dienstes" + +msgid "New service type (compute, image, identity, volume, etc)" +msgstr "Neuer Diensttyp (Berechnen, Abbild, Identität, Datenträger, usw.)" + +msgid "New user name" +msgstr "Neuer Benutzername" + +#, python-format +msgid "No service catalog with a type, name or ID of '%s' exists." +msgstr "Kein Dienstkatalog mit Typ, Namen oder Kennung von '%s' ist vorhanden." + +msgid "Only return instances that match the reservation" +msgstr "Nur Instanzen zurückgeben, die der Einschränkung entsprechen" + +msgid "Options in ssh_config(5) format (ssh -o option)" +msgstr "Optionen im ssh_config(5)-Format (ssh -o Option)" + +msgid "Parent region ID" +msgstr "Übergeordnete Regionskennung" + +msgid "Passwords do not match, password unchanged" +msgstr "Passwörter stimmen nicht überein, Passwort unverändert" + +msgid "Perform a block live migration" +msgstr "Blockorientierte Live-Migration ausführen" + +msgid "Perform a hard reboot" +msgstr "Harten Neustart ausführen" + +msgid "Perform a shared live migration (default)" +msgstr "Gemeinsame Live-Migration ausführen (Standard)" + +msgid "Perform a soft reboot" +msgstr "Weichen Neustart ausführen" + +msgid "Private key file (ssh -i option)" +msgstr "Private Schlüsseldatei (ssh -i Option)" + +msgid "Project description" +msgstr "Projektbeschreibung" + +msgid "Project must be specified" +msgstr "Projekt muss angegeben werden" + +msgid "Project to display (name or ID)" +msgstr "Anzuzeigendes Projekt (Name oder Kennung)" + +msgid "Project to modify (name or ID)" +msgstr "Zu änderndes Projekt (Name oder Kennung)" + +msgid "Project(s) to delete (name or ID)" +msgstr "Zu löschende(s) Projekt(e) (Name oder Kennung)" + +msgid "Prompt interactively for password" +msgstr "Interaktiv nach dem Passwort abfragen" + +msgid "Property key to remove from server (repeat to unset multiple values)" +msgstr "" +"Vom Server zu entfernender Eigenschaftsschlüssel (zum Aufheben von mehreren " +"Werten wiederholen)" + +msgid "" +"Property to add/change for this server (repeat option to set multiple " +"properties)" +msgstr "" +"Zu hinzufügende/ändernde Eigenschaft für diesen Server (wiederholen Sie die " +"Option, um mehrere Eigenschaften festzulegen)" + +msgid "Region ID to delete" +msgstr "Zu löschende Regionskennung" + +msgid "Region to display" +msgstr "Anzuzeigende Region" + +msgid "Region to modify" +msgstr "Zu ändernde Region" + +msgid "Regular expression to match IP addresses" +msgstr "Regulärer Ausdruck zum Abgleichen mit IP-Adressen" + +msgid "Regular expression to match IPv6 addresses" +msgstr "Regulärer Ausdruck zum Abgleichen mit IPv6-Adressen" + +msgid "Regular expression to match instance name (admin only)" +msgstr "" +"Regulärer Ausdruck zum Abgleichen des Instanznamens (nur Administrator) " + +msgid "Regular expression to match names" +msgstr "Regulärer Ausdruck zum Abgleichen mit Namen" + +msgid "Resize server to specified flavor" +msgstr "Servergröße auf angegebene Variante ändern" + +msgid "Restore server state before resize" +msgstr "Serverstatus vor der Größenänderung wiederherstellen" + +msgid "Return existing domain" +msgstr "Vorhandene Domäne zurückgeben" + +msgid "Return existing group" +msgstr "Vorhandene Gruppe zurückgeben" + +msgid "Return existing project" +msgstr "Vorhandenes Projekt zurückgeben" + +msgid "Return existing role" +msgstr "Vorhandene Rolle zurückgeben" + +msgid "Return existing user" +msgstr "Vorhandenen Benutzer zurückgeben" + +msgid "Retype new password: " +msgstr "Neues Passwort erneut eingeben:" + +msgid "Role to add to <project>:<user> (name or ID)" +msgstr "Zu <project>:<user> hinzuzufügende Rolle (Name oder Kennung)" + +msgid "Role to display (name or ID)" +msgstr "Anzuzeigende Rolle (Name oder Kennung)" + +msgid "Role to remove (name or ID)" +msgstr "Zu entfernende Rolle (Name oder Kennung)" + +msgid "Role(s) to delete (name or ID)" +msgstr "Zu löschende Rolle(n) (Name oder Kennung)" + +msgid "Search by hostname" +msgstr "Nach Hostname suchen" + +msgid "Search by server status" +msgstr "Nach Serverstatus suchen" + +msgid "Search by user (admin only) (name or ID)" +msgstr "Nach Benutzer suchen (nur Administrator) (Name oder Kennung)" + +msgid "Security group to add (name or ID)" +msgstr "Zu hinzufügende Sicherheitsgruppe (Name oder Kennung)" + +msgid "Select an availability zone for the server" +msgstr "Wählen Sie eine Verfügbarkeitszone für den Server aus" + +msgid "Server (name or ID)" +msgstr "Server (Name oder Kennung)" + +msgid "Server internal device name for volume" +msgstr "Serverinterner Gerätename für Datenträger" + +msgid "Server(s) to delete (name or ID)" +msgstr "Zu löschende(r) Server (Name oder Kennung)" + +msgid "Service to delete (name or ID)" +msgstr "Zu löschender Dienst (Name oder Kennung)" + +msgid "Service to display (type or name)" +msgstr "Anzuzeigender Dienst (Typ oder Name)" + +msgid "Service to display (type, name or ID)" +msgstr "Anzuzeigender Dienst (Typ, Name oder Kennung)" + +msgid "Set a project property (repeat option to set multiple properties)" +msgstr "" +"Legen Sie eine Projekteigenschaft fest (wiederholen Sie die Option, um " +"mehrere Eigenschaften festzulegen)" + +msgid "Set a property on this server (repeat for multiple values)" +msgstr "" +"Legen Sie eine Eigenschaft auf diesem Server fest (für mehrere Werte " +"wiederholen)" + +msgid "" +"Set a scope, such as a project or domain, set a project scope with --os-" +"project-name, OS_PROJECT_NAME or auth.project_name, set a domain scope with " +"--os-domain-name, OS_DOMAIN_NAME or auth.domain_name" +msgstr "" +"Setzen Sie eine Eigenschaft, wie Projekt oder Domäne, setzen Sie eine " +"Projekteigenschaft mit --os-project-name, OS_PROJECT_NAME oder auth." +"project_name, setzen Sie eine Dömaneneigenschaft mit --os-domain-name, " +"OS_DOMAIN_NAME oder auth.domain_name." + +msgid "" +"Set a service AUTH_URL, with --os-auth-url, OS_AUTH_URL or auth.auth_url\n" +msgstr "" +"Legen Sie eine Dienst-AUTH_URL mit --os-auth-url, OS_AUTH_URL oder auth." +"auth_url fest\n" + +msgid "Set a service URL, with --os-url, OS_URL or auth.url\n" +msgstr "Legen Sie eine Dienst-URL mit --os-url, OS_URL oder auth.url fest\n" + +msgid "Set a token with --os-token, OS_TOKEN or auth.token\n" +msgstr "Legen Sie einen Token mit --os-token, OS_TOKEN oder auth.token fest\n" + +msgid "Set a username with --os-username, OS_USERNAME, or auth.username\n" +msgstr "" +"Legen Sie einen Benutzernamen mit --os-username, OS_USERNAME oder auth." +"username fest\n" + +msgid "" +"Set an authentication URL, with --os-auth-url, OS_AUTH_URL or auth.auth_url\n" +msgstr "" +"Legen Sie eine Authentifizierungs-URL mit --os-auth-url, OS_AUTH_URL oder " +"auth.auth_url fest\n" + +msgid "Set default project (name or ID)" +msgstr "Standardprojekt festlegen (Name oder Kennung)" + +msgid "Set new root password (interactive only)" +msgstr "Neues root-Passwort festlegen (Nur interaktiv)" + +msgid "Set project description" +msgstr "Projektbeschreibung festlegen" + +msgid "Set project name" +msgstr "Projektname festlegen" + +msgid "Set user email address" +msgstr "E-Mail-Adresse des Benutzers festlegen" + +msgid "Set user name" +msgstr "Benutzername festlegen" + +msgid "Set user password" +msgstr "Benutzerpasswort festlegen" + +msgid "Show credentials for user (name or ID)" +msgstr "Anmeldedaten für Benutzer anzeigen (name or ID)" + +msgid "Show service catalog information" +msgstr "Dienstkataloginformation anzeigen" + +msgid "Target hostname" +msgstr "Zielhostname" + +msgid "" +"The argument --type is deprecated, use service create --name <service-name> " +"type instead." +msgstr "" +"Das Argument --type ist veraltet, verwenden Sie stattdessen service create --" +"name <Dienstname> type." + +msgid "Token to be deleted" +msgstr "Zu löschender Token" + +msgid "Use only IPv4 addresses" +msgstr "Nur IPv4-Adressen verwenden" + +msgid "Use only IPv6 addresses" +msgstr "Nur IPv6-Adressen verwenden" + +msgid "Use other IP address (public, private, etc)" +msgstr "Andere IP-Adresse verwenden (öffentlich, privat, usw.)" + +msgid "Use private IP address" +msgstr "Private IP-Adresse verwenden" + +msgid "Use public IP address" +msgstr "Öffentliche IP-Adresse verwenden" + +msgid "" +"Use specified volume as the config drive, or 'True' to use an ephemeral drive" +msgstr "" +"Benutzerdefinierter Datenträger als Konfigurationslaufwerk oder 'True', um " +"ein flüchtiges Laufwerk zu verwenden" + +msgid "User data file to serve from the metadata server" +msgstr "Vom Metadatenserver anzubietende Benutzerdatendatei" + +msgid "User must be specified" +msgstr "Benutzer muss angegeben werden" + +msgid "User to change (name or ID)" +msgstr "Zu ändernder Benutzer (Name oder Kennung)" + +msgid "User to display (name or ID)" +msgstr "Anzuzeigender Benutzer (Name oder Kennung)" + +msgid "User to list (name or ID)" +msgstr "Aufzulistender Benutzer (Name oder Kennung)" + +msgid "User(s) to delete (name or ID)" +msgstr "Zu löschende(r) Benutzer (Name oder Kennung)" + +msgid "Volume to add (name or ID)" +msgstr "Zu hinzufügender Datenträger (Name oder Kennung)" + +msgid "Volume to remove (name or ID)" +msgstr "Zu entfernender Datenträger (Name oder Kennung)" + +msgid "Wait for build to complete" +msgstr "Warten Sie, bis die Herstellung abgeschlossen ist" + +msgid "Wait for delete to complete" +msgstr "Warten Sie, bis das Löschen abgeschlossen ist" + +msgid "Wait for image create to complete" +msgstr "Warten Sie, bis die Abbilderstellung abgeschlossen ist" + +msgid "Wait for reboot to complete" +msgstr "Warten Sie, bis der Neustart abgeschlossen ist" + +msgid "Wait for rebuild to complete" +msgstr "Warten Sie, bis die Wiederherstellung abgeschlossen ist" + +msgid "Wait for resize to complete" +msgstr "Warten Sie, bis die Größenänderung abgeschlossen ist" + +msgid "either net-id or port-id should be specified but not both" +msgstr "entweder net-id oder port-id sollten angegeben sein, aber nicht beide" + +msgid "max instances should be > 0" +msgstr "max. Instanzen sollten > 0 sein" + +msgid "min instances should be <= max instances" +msgstr "min. Instanzen sollten <= max. Instanzen sein" + +msgid "min instances should be > 0" +msgstr "min. Instanzen sollten > 0 sein" diff --git a/openstackclient/locale/openstackclient.pot b/openstackclient/locale/openstackclient.pot new file mode 100644 index 00000000..afc89266 --- /dev/null +++ b/openstackclient/locale/openstackclient.pot @@ -0,0 +1,829 @@ +# Translations template for python-openstackclient. +# Copyright (C) 2016 ORGANIZATION +# This file is distributed under the same license as the +# python-openstackclient project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2016. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: python-openstackclient 2.0.1.dev168\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2016-01-19 06:03+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.2.0\n" + +#: openstackclient/api/auth.py:144 +msgid "Set a username with --os-username, OS_USERNAME, or auth.username\n" +msgstr "" + +#: openstackclient/api/auth.py:147 +msgid "" +"Set an authentication URL, with --os-auth-url, OS_AUTH_URL or " +"auth.auth_url\n" +msgstr "" + +#: openstackclient/api/auth.py:155 +msgid "" +"Set a scope, such as a project or domain, set a project scope with --os-" +"project-name, OS_PROJECT_NAME or auth.project_name, set a domain scope " +"with --os-domain-name, OS_DOMAIN_NAME or auth.domain_name" +msgstr "" + +#: openstackclient/api/auth.py:161 openstackclient/api/auth.py:167 +msgid "Set a token with --os-token, OS_TOKEN or auth.token\n" +msgstr "" + +#: openstackclient/api/auth.py:163 +msgid "Set a service AUTH_URL, with --os-auth-url, OS_AUTH_URL or auth.auth_url\n" +msgstr "" + +#: openstackclient/api/auth.py:169 +msgid "Set a service URL, with --os-url, OS_URL or auth.url\n" +msgstr "" + +#: openstackclient/compute/v2/availability_zone.py:72 +#: openstackclient/compute/v2/server.py:737 +#: openstackclient/identity/v2_0/endpoint.py:114 +#: openstackclient/identity/v2_0/project.py:145 +#: openstackclient/identity/v2_0/service.py:128 +#: openstackclient/identity/v2_0/user.py:174 +msgid "List additional fields in output" +msgstr "" + +#: openstackclient/compute/v2/server.py:183 +#: openstackclient/compute/v2/server.py:219 +#: openstackclient/compute/v2/server.py:569 +#: openstackclient/compute/v2/server.py:923 +#: openstackclient/compute/v2/server.py:1031 +#: openstackclient/compute/v2/server.py:1086 +#: openstackclient/compute/v2/server.py:1179 +#: openstackclient/compute/v2/server.py:1219 +#: openstackclient/compute/v2/server.py:1245 +#: openstackclient/compute/v2/server.py:1336 +#: openstackclient/compute/v2/server.py:1420 +#: openstackclient/compute/v2/server.py:1457 +#: openstackclient/compute/v2/server.py:1732 +#: openstackclient/compute/v2/server.py:1756 +msgid "Server (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:188 +msgid "Security group to add (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:224 +msgid "Volume to add (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:229 +msgid "Server internal device name for volume" +msgstr "" + +#: openstackclient/compute/v2/server.py:265 +#: openstackclient/compute/v2/server.py:1341 +msgid "New server name" +msgstr "" + +#: openstackclient/compute/v2/server.py:273 +msgid "Create server from this image (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:278 +msgid "Create server from this volume (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:284 +msgid "Create server with this flavor (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:291 +msgid "" +"Security group to assign to this server (name or ID) (repeat for multiple" +" groups)" +msgstr "" + +#: openstackclient/compute/v2/server.py:297 +msgid "Keypair to inject into this server (optional extension)" +msgstr "" + +#: openstackclient/compute/v2/server.py:303 +msgid "Set a property on this server (repeat for multiple values)" +msgstr "" + +#: openstackclient/compute/v2/server.py:311 +msgid "File to inject into image before boot (repeat for multiple files)" +msgstr "" + +#: openstackclient/compute/v2/server.py:317 +msgid "User data file to serve from the metadata server" +msgstr "" + +#: openstackclient/compute/v2/server.py:322 +msgid "Select an availability zone for the server" +msgstr "" + +#: openstackclient/compute/v2/server.py:329 +msgid "" +"Map block devices; map is <id>:<type>:<size(GB)>:<delete_on_terminate> " +"(optional extension)" +msgstr "" + +#: openstackclient/compute/v2/server.py:339 +msgid "" +"Create a NIC on the server. Specify option multiple times to create " +"multiple NICs. Either net-id or port-id must be provided, but not both. " +"net-id: attach NIC to network with this UUID, port-id: attach NIC to port" +" with this UUID, v4-fixed-ip: IPv4 fixed address for NIC (optional), v6" +"-fixed-ip: IPv6 fixed address for NIC (optional)." +msgstr "" + +#: openstackclient/compute/v2/server.py:352 +msgid "Hints for the scheduler (optional extension)" +msgstr "" + +#: openstackclient/compute/v2/server.py:358 +msgid "" +"Use specified volume as the config drive, or 'True' to use an ephemeral " +"drive" +msgstr "" + +#: openstackclient/compute/v2/server.py:366 +msgid "Minimum number of servers to launch (default=1)" +msgstr "" + +#: openstackclient/compute/v2/server.py:373 +msgid "Maximum number of servers to launch (default=1)" +msgstr "" + +#: openstackclient/compute/v2/server.py:378 +msgid "Wait for build to complete" +msgstr "" + +#: openstackclient/compute/v2/server.py:418 +msgid "min instances should be <= max instances" +msgstr "" + +#: openstackclient/compute/v2/server.py:421 +msgid "min instances should be > 0" +msgstr "" + +#: openstackclient/compute/v2/server.py:424 +msgid "max instances should be > 0" +msgstr "" + +#: openstackclient/compute/v2/server.py:453 +msgid "Volume name or ID must be specified if --block-device-mapping is specified" +msgstr "" + +#: openstackclient/compute/v2/server.py:465 +msgid "either net-id or port-id should be specified but not both" +msgstr "" + +#: openstackclient/compute/v2/server.py:485 +msgid "can't create server with port specified since network endpoint not enabled" +msgstr "" + +#: openstackclient/compute/v2/server.py:550 +#, python-format +msgid "Error creating server: %s" +msgstr "" + +#: openstackclient/compute/v2/server.py:552 +msgid "" +"\n" +"Error creating server" +msgstr "" + +#: openstackclient/compute/v2/server.py:574 +msgid "Name of new image (default is server name)" +msgstr "" + +#: openstackclient/compute/v2/server.py:579 +msgid "Wait for image create to complete" +msgstr "" + +#: openstackclient/compute/v2/server.py:609 +#, python-format +msgid "Error creating server snapshot: %s" +msgstr "" + +#: openstackclient/compute/v2/server.py:611 +msgid "" +"\n" +"Error creating server snapshot" +msgstr "" + +#: openstackclient/compute/v2/server.py:633 +msgid "Server(s) to delete (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:638 +msgid "Wait for delete to complete" +msgstr "" + +#: openstackclient/compute/v2/server.py:657 +#, python-format +msgid "Error deleting server: %s" +msgstr "" + +#: openstackclient/compute/v2/server.py:659 +msgid "" +"\n" +"Error deleting server" +msgstr "" + +#: openstackclient/compute/v2/server.py:673 +msgid "Only return instances that match the reservation" +msgstr "" + +#: openstackclient/compute/v2/server.py:678 +msgid "Regular expression to match IP addresses" +msgstr "" + +#: openstackclient/compute/v2/server.py:683 +msgid "Regular expression to match IPv6 addresses" +msgstr "" + +#: openstackclient/compute/v2/server.py:688 +msgid "Regular expression to match names" +msgstr "" + +#: openstackclient/compute/v2/server.py:693 +msgid "Regular expression to match instance name (admin only)" +msgstr "" + +#: openstackclient/compute/v2/server.py:699 +msgid "Search by server status" +msgstr "" + +#: openstackclient/compute/v2/server.py:704 +msgid "Search by flavor (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:709 +msgid "Search by image (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:714 +msgid "Search by hostname" +msgstr "" + +#: openstackclient/compute/v2/server.py:720 +msgid "Include all projects (admin only)" +msgstr "" + +#: openstackclient/compute/v2/server.py:730 +msgid "Search by user (admin only) (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:888 +msgid "Server(s) to lock (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:928 +msgid "Target hostname" +msgstr "" + +#: openstackclient/compute/v2/server.py:936 +msgid "Perform a shared live migration (default)" +msgstr "" + +#: openstackclient/compute/v2/server.py:942 +msgid "Perform a block live migration" +msgstr "" + +#: openstackclient/compute/v2/server.py:949 +msgid "Allow disk over-commit on the destination host" +msgstr "" + +#: openstackclient/compute/v2/server.py:956 +msgid "Do not over-commit disk on the destination host (default)" +msgstr "" + +#: openstackclient/compute/v2/server.py:962 +#: openstackclient/compute/v2/server.py:1265 +msgid "Wait for resize to complete" +msgstr "" + +#: openstackclient/compute/v2/server.py:990 +#: openstackclient/compute/v2/server.py:1290 +msgid "Complete\n" +msgstr "" + +#: openstackclient/compute/v2/server.py:992 +msgid "" +"\n" +"Error migrating server" +msgstr "" + +#: openstackclient/compute/v2/server.py:1007 +msgid "Server(s) to pause (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1040 +msgid "Perform a hard reboot" +msgstr "" + +#: openstackclient/compute/v2/server.py:1048 +msgid "Perform a soft reboot" +msgstr "" + +#: openstackclient/compute/v2/server.py:1053 +msgid "Wait for reboot to complete" +msgstr "" + +#: openstackclient/compute/v2/server.py:1070 +msgid "" +"\n" +"Reboot complete\n" +msgstr "" + +#: openstackclient/compute/v2/server.py:1072 +msgid "" +"\n" +"Error rebooting server\n" +msgstr "" + +#: openstackclient/compute/v2/server.py:1091 +msgid "" +"Recreate server from the specified image (name or ID). Defaults to the " +"currently used one." +msgstr "" + +#: openstackclient/compute/v2/server.py:1102 +msgid "Wait for rebuild to complete" +msgstr "" + +#: openstackclient/compute/v2/server.py:1124 +msgid "" +"\n" +"Complete\n" +msgstr "" + +#: openstackclient/compute/v2/server.py:1126 +msgid "" +"\n" +"Error rebuilding server" +msgstr "" + +#: openstackclient/compute/v2/server.py:1143 +msgid "Name or ID of server to use" +msgstr "" + +#: openstackclient/compute/v2/server.py:1148 +msgid "Name or ID of security group to remove from server" +msgstr "" + +#: openstackclient/compute/v2/server.py:1184 +msgid "Volume to remove (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1250 +msgid "Resize server to specified flavor" +msgstr "" + +#: openstackclient/compute/v2/server.py:1255 +msgid "Confirm server resize is complete" +msgstr "" + +#: openstackclient/compute/v2/server.py:1260 +msgid "Restore server state before resize" +msgstr "" + +#: openstackclient/compute/v2/server.py:1292 +msgid "" +"\n" +"Error resizing server" +msgstr "" + +#: openstackclient/compute/v2/server.py:1311 +msgid "Server(s) to resume (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1346 +msgid "Set new root password (interactive only)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1352 +msgid "" +"Property to add/change for this server (repeat option to set multiple " +"properties)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1376 +msgid "New password: " +msgstr "" + +#: openstackclient/compute/v2/server.py:1377 +msgid "Retype new password: " +msgstr "" + +#: openstackclient/compute/v2/server.py:1381 +msgid "Passwords do not match, password unchanged" +msgstr "" + +#: openstackclient/compute/v2/server.py:1396 +msgid "Server(s) to shelve (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1426 +msgid "Display server diagnostics information" +msgstr "" + +#: openstackclient/compute/v2/server.py:1439 +msgid "Error retrieving diagnostics data" +msgstr "" + +#: openstackclient/compute/v2/server.py:1462 +msgid "Login name (ssh -l option)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1474 +msgid "Destination port (ssh -p option)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1486 +msgid "Private key file (ssh -i option)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1497 +msgid "Options in ssh_config(5) format (ssh -o option)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1511 +msgid "Use only IPv4 addresses" +msgstr "" + +#: openstackclient/compute/v2/server.py:1518 +msgid "Use only IPv6 addresses" +msgstr "" + +#: openstackclient/compute/v2/server.py:1527 +msgid "Use public IP address" +msgstr "" + +#: openstackclient/compute/v2/server.py:1535 +msgid "Use private IP address" +msgstr "" + +#: openstackclient/compute/v2/server.py:1542 +msgid "Use other IP address (public, private, etc)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1605 +msgid "Server(s) to start (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1630 +msgid "Server(s) to stop (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1655 +msgid "Server(s) to suspend (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1681 +msgid "Server(s) to unlock (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1707 +msgid "Server(s) to unpause (name or ID)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1763 +msgid "Property key to remove from server (repeat to unset multiple values)" +msgstr "" + +#: openstackclient/compute/v2/server.py:1794 +msgid "Server(s) to unshelve (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/catalog.py:75 +#: openstackclient/identity/v3/catalog.py:72 +msgid "Service to display (type or name)" +msgstr "" + +#: openstackclient/identity/v2_0/ec2creds.py:40 +#: openstackclient/identity/v3/ec2creds.py:65 +msgid "" +"Create credentials in project (name or ID; default: current authenticated" +" project)" +msgstr "" + +#: openstackclient/identity/v2_0/ec2creds.py:48 +#: openstackclient/identity/v3/ec2creds.py:73 +msgid "" +"Create credentials for user (name or ID; default: current authenticated " +"user)" +msgstr "" + +#: openstackclient/identity/v2_0/ec2creds.py:99 +#: openstackclient/identity/v2_0/ec2creds.py:172 +#: openstackclient/identity/v3/ec2creds.py:129 +#: openstackclient/identity/v3/ec2creds.py:187 +msgid "Credentials access key" +msgstr "" + +#: openstackclient/identity/v2_0/ec2creds.py:104 +#: openstackclient/identity/v3/ec2creds.py:134 +msgid "Delete credentials for user (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/ec2creds.py:134 +#: openstackclient/identity/v3/ec2creds.py:156 +msgid "Filter list by user (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/ec2creds.py:177 +#: openstackclient/identity/v3/ec2creds.py:192 +msgid "Show credentials for user (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/endpoint.py:40 +msgid "New endpoint service (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/endpoint.py:46 +msgid "New endpoint public URL (required)" +msgstr "" + +#: openstackclient/identity/v2_0/endpoint.py:51 +msgid "New endpoint admin URL" +msgstr "" + +#: openstackclient/identity/v2_0/endpoint.py:56 +msgid "New endpoint internal URL" +msgstr "" + +#: openstackclient/identity/v2_0/endpoint.py:61 +msgid "New endpoint region ID" +msgstr "" + +#: openstackclient/identity/v2_0/endpoint.py:93 +msgid "Endpoint ID to delete" +msgstr "" + +#: openstackclient/identity/v2_0/endpoint.py:149 +msgid "Endpoint ID to display" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:41 +msgid "New project name" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:46 +msgid "Project description" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:52 +msgid "Enable project (default)" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:57 +#: openstackclient/identity/v2_0/project.py:194 +msgid "Disable project" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:63 +msgid "Add a property to <name> (repeat option to set multiple properties)" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:69 +#: openstackclient/identity/v3/project.py:80 +msgid "Return existing project" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:117 +msgid "Project(s) to delete (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:173 +#: openstackclient/identity/v2_0/project.py:313 +msgid "Project to modify (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:178 +msgid "Set project name" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:183 +msgid "Set project description" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:189 +msgid "Enable project" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:200 +msgid "Set a project property (repeat option to set multiple properties)" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:253 +msgid "Project to display (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/project.py:320 +msgid "Unset a project property (repeat option to unset multiple properties)" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:41 +msgid "Role to add to <project>:<user> (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:47 +#: openstackclient/identity/v2_0/role.py:309 +msgid "Include <project> (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:53 +#: openstackclient/identity/v2_0/role.py:315 +msgid "Include <user> (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:87 +msgid "New role name" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:92 +#: openstackclient/identity/v3/role.py:165 +msgid "Return existing role" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:127 +msgid "Role(s) to delete (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:194 +#: openstackclient/identity/v2_0/role.py:257 +msgid "Project must be specified" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:208 +#: openstackclient/identity/v2_0/role.py:263 +msgid "User must be specified" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:236 +msgid "User to list (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:241 +msgid "Filter users by <project> (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:303 +msgid "Role to remove (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/role.py:344 +msgid "Role to display (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/service.py:42 +msgid "New service type (compute, image, identity, volume, etc)" +msgstr "" + +#: openstackclient/identity/v2_0/service.py:53 +msgid "New service name" +msgstr "" + +#: openstackclient/identity/v2_0/service.py:58 +msgid "New service description" +msgstr "" + +#: openstackclient/identity/v2_0/service.py:78 +msgid "" +"The argument --type is deprecated, use service create --name <service-" +"name> type instead." +msgstr "" + +#: openstackclient/identity/v2_0/service.py:105 +msgid "Service to delete (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/service.py:156 +msgid "Service to display (type, name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/service.py:162 +msgid "Show service catalog information" +msgstr "" + +#: openstackclient/identity/v2_0/service.py:180 +#, python-format +msgid "No service catalog with a type, name or ID of '%s' exists." +msgstr "" + +#: openstackclient/identity/v2_0/token.py:55 +msgid "Token to be deleted" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:40 +msgid "New user name" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:45 +msgid "Default project (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:50 +#: openstackclient/identity/v2_0/user.py:273 +msgid "Set user password" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:56 +#: openstackclient/identity/v2_0/user.py:279 +msgid "Prompt interactively for password" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:61 +#: openstackclient/identity/v2_0/user.py:284 +msgid "Set user email address" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:67 +#: openstackclient/identity/v2_0/user.py:290 +msgid "Enable user (default)" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:72 +#: openstackclient/identity/v2_0/user.py:295 +msgid "Disable user" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:77 +#: openstackclient/identity/v3/user.py:90 +msgid "Return existing user" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:141 +msgid "User(s) to delete (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:168 +msgid "Filter users by project (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:258 +msgid "User to change (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:263 +msgid "Set user name" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:268 +msgid "Set default project (name or ID)" +msgstr "" + +#: openstackclient/identity/v2_0/user.py:361 +msgid "User to display (name or ID)" +msgstr "" + +#: openstackclient/identity/v3/domain.py:62 +msgid "Return existing domain" +msgstr "" + +#: openstackclient/identity/v3/group.py:141 +msgid "Return existing group" +msgstr "" + +#: openstackclient/identity/v3/region.py:39 +msgid "New region ID" +msgstr "" + +#: openstackclient/identity/v3/region.py:44 +msgid "Parent region ID" +msgstr "" + +#: openstackclient/identity/v3/region.py:49 +#: openstackclient/identity/v3/region.py:144 +msgid "New region description" +msgstr "" + +#: openstackclient/identity/v3/region.py:79 +msgid "Region ID to delete" +msgstr "" + +#: openstackclient/identity/v3/region.py:101 +msgid "Filter by parent region ID" +msgstr "" + +#: openstackclient/identity/v3/region.py:134 +msgid "Region to modify" +msgstr "" + +#: openstackclient/identity/v3/region.py:139 +msgid "New parent region ID" +msgstr "" + +#: openstackclient/identity/v3/region.py:175 +msgid "Region to display" +msgstr "" + diff --git a/openstackclient/locale/zh_TW/LC_MESSAGES/openstackclient.po b/openstackclient/locale/zh_TW/LC_MESSAGES/openstackclient.po new file mode 100644 index 00000000..26032666 --- /dev/null +++ b/openstackclient/locale/zh_TW/LC_MESSAGES/openstackclient.po @@ -0,0 +1,495 @@ +# Translations template for python-openstackclient. +# Copyright (C) 2015 ORGANIZATION +# This file is distributed under the same license as the +# python-openstackclient project. +# +# Translators: +# OpenStack Infra <zanata@openstack.org>, 2015. #zanata +msgid "" +msgstr "" +"Project-Id-Version: python-openstackclient 2.0.1.dev168\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2016-01-19 02:20+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2015-06-14 06:41+0000\n" +"Last-Translator: openstackjenkins <jenkins@openstack.org>\n" +"Language: zh-TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Generated-By: Babel 2.0\n" +"X-Generator: Zanata 3.7.3\n" +"Language-Team: Chinese (Taiwan)\n" + +msgid "" +"\n" +"Complete\n" +msgstr "" +"\n" +"完成\n" + +msgid "" +"\n" +"Error creating server" +msgstr "" +"\n" +"新增雲實例時出錯" + +msgid "" +"\n" +"Error creating server snapshot" +msgstr "" +"\n" +"新增雲實例即時存檔時出錯" + +msgid "" +"\n" +"Error migrating server" +msgstr "" +"\n" +"轉移雲實例出錯" + +msgid "" +"\n" +"Error rebooting server\n" +msgstr "" +"\n" +"重開雲實例出錯\n" + +msgid "" +"\n" +"Error rebuilding server" +msgstr "" +"\n" +"重建雲實例出錯" + +msgid "" +"\n" +"Error resizing server" +msgstr "" +"\n" +"調整雲實例容量時出錯" + +msgid "" +"\n" +"Reboot complete\n" +msgstr "" +"\n" +"重開機完成\n" + +msgid "Add a property to <name> (repeat option to set multiple properties)" +msgstr "加入屬性到 <name>(重復這選項來設定多個屬性)" + +msgid "Allow disk over-commit on the destination host" +msgstr "允許目標主機過量使用" + +msgid "Complete\n" +msgstr "完成\n" + +msgid "Confirm server resize is complete" +msgstr "確認調整雲實例容量完成" + +msgid "Credentials access key" +msgstr "憑鑰存取密鑰" + +msgid "Default project (name or ID)" +msgstr "預設專案(名稱或識別號)" + +msgid "Destination port (ssh -p option)" +msgstr "目標埠口(ssh -p 選項)" + +msgid "Disable project" +msgstr "關閉專案" + +msgid "Disable user" +msgstr "關閉用戶" + +msgid "Display server diagnostics information" +msgstr "顯示雲實例診斷資訊" + +msgid "Do not over-commit disk on the destination host (default)" +msgstr "不準目標主機過量使用(預設)" + +msgid "Enable project" +msgstr "啟用專案" + +msgid "Enable project (default)" +msgstr "啟用專案(預設)" + +msgid "Enable user (default)" +msgstr "啟用用戶(預設)" + +msgid "Endpoint ID to delete" +msgstr "要刪除的端點識別號" + +msgid "Endpoint ID to display" +msgstr "要顯示的端點識別號" + +#, python-format +msgid "Error creating server snapshot: %s" +msgstr "新增雲實例即時存檔時出錯:%s" + +#, python-format +msgid "Error creating server: %s" +msgstr "新增雲實例時出錯:%s" + +msgid "Error retrieving diagnostics data" +msgstr "獲得診斷資料時出錯" + +msgid "File to inject into image before boot (repeat for multiple files)" +msgstr "在開機前要注入映像檔的檔案(為多個檔案重復指定)" + +msgid "Filter by parent region ID" +msgstr "以父地區識別號來篩選" + +msgid "Filter users by <project> (name or ID)" +msgstr "以 <project> 來篩選用戶(名稱或識別號)" + +msgid "Filter users by project (name or ID)" +msgstr "以專案篩選用戶(名稱或識別號)" + +msgid "Hints for the scheduler (optional extension)" +msgstr "給排程器的提示(選用)" + +msgid "Include <project> (name or ID)" +msgstr "包括 <project>(名稱或識別號)" + +msgid "Include <user> (name or ID)" +msgstr "包括 <user>(名稱或識別號)" + +msgid "Include all projects (admin only)" +msgstr "包括所有的專案(管理員專用)" + +msgid "Keypair to inject into this server (optional extension)" +msgstr "要注入到此伺服器的密鑰對(選用)" + +msgid "List additional fields in output" +msgstr "列出額外的欄位" + +msgid "Login name (ssh -l option)" +msgstr "登入名稱(ssh -l 選項)" + +msgid "" +"Map block devices; map is <id>:<type>:<size(GB)>:<delete_on_terminate> " +"(optional extension)" +msgstr "" +"映射區塊裝置;映射是 <id>:<type>:<size(GB)>:<delete_on_terminate>(選用)" + +msgid "Maximum number of servers to launch (default=1)" +msgstr "最多要發動的雲實例(預設為 1)" + +msgid "Minimum number of servers to launch (default=1)" +msgstr "最少要發動的雲實例(預設為 1)" + +msgid "Name of new image (default is server name)" +msgstr "新映像檔的名稱(預設為雲實例名稱)" + +msgid "Name or ID of security group to remove from server" +msgstr "要從雲實例移除的安全性群組名稱或識別號" + +msgid "Name or ID of server to use" +msgstr "要用的雲實例名稱或識別號" + +msgid "New endpoint admin URL" +msgstr "新端點管理員網址" + +msgid "New endpoint internal URL" +msgstr "新端點內部網址" + +msgid "New endpoint public URL (required)" +msgstr "新端點公開網址(需要)" + +msgid "New endpoint region ID" +msgstr "新端點地區識別號" + +msgid "New endpoint service (name or ID)" +msgstr "新端點伺服器(名稱或識別號)" + +msgid "New parent region ID" +msgstr "新父地區識別號" + +msgid "New password: " +msgstr "新密碼:" + +msgid "New project name" +msgstr "新專案名稱" + +msgid "New region ID" +msgstr "新地區識別號" + +msgid "New region description" +msgstr "新地區描述" + +msgid "New role name" +msgstr "新角色名稱" + +msgid "New server name" +msgstr "新雲實例名稱" + +msgid "New service description" +msgstr "新伺服器描述" + +msgid "New service name" +msgstr "新伺服器名稱" + +msgid "New service type (compute, image, identity, volume, etc)" +msgstr "新伺服器類型(compute、image、identity 或 volume 等等)" + +msgid "New user name" +msgstr "新用戶名稱" + +#, python-format +msgid "No service catalog with a type, name or ID of '%s' exists." +msgstr "沒有相似「%s」類型、名稱或識別號的伺服器分類。" + +msgid "Only return instances that match the reservation" +msgstr "只回傳要保留的雲實例" + +msgid "Options in ssh_config(5) format (ssh -o option)" +msgstr "ssh_config(5) 格式的選項(ssh -o 選項)" + +msgid "Parent region ID" +msgstr "父地區識別號" + +msgid "Passwords do not match, password unchanged" +msgstr "密碼不一樣,未更換密碼" + +msgid "Perform a block live migration" +msgstr "覆行區塊的即時轉移" + +msgid "Perform a hard reboot" +msgstr "履行強制重開機" + +msgid "Perform a shared live migration (default)" +msgstr "覆行已分享的即時轉移(預設)" + +msgid "Perform a soft reboot" +msgstr "履行重開機" + +msgid "Private key file (ssh -i option)" +msgstr "私鑰檔案(ssh -i 選項)" + +msgid "Project description" +msgstr "專案描述" + +msgid "Project must be specified" +msgstr "必須指定專案" + +msgid "Project to display (name or ID)" +msgstr "要顯示的專案(名稱或識別號)" + +msgid "Project to modify (name or ID)" +msgstr "要更改的專案(名稱或識別號)" + +msgid "Project(s) to delete (name or ID)" +msgstr "要刪除的專案(名稱或識別號)" + +msgid "Prompt interactively for password" +msgstr "為密碼互動提示" + +msgid "Property key to remove from server (repeat to unset multiple values)" +msgstr "要從雲實例上移除的屬性鍵(重復來取消選擇多個值)" + +msgid "" +"Property to add/change for this server (repeat option to set multiple " +"properties)" +msgstr "要加入這個雲實例的屬性(重復這選項來設定多個屬性)" + +msgid "Region ID to delete" +msgstr "要刪除的地區識別號" + +msgid "Region to display" +msgstr "要顯示的地區" + +msgid "Region to modify" +msgstr "要更改的地區" + +msgid "Regular expression to match IP addresses" +msgstr "以正規式來匹配 IP 位址" + +msgid "Regular expression to match IPv6 addresses" +msgstr "以正規式來匹配 IPv6 位址" + +msgid "Regular expression to match instance name (admin only)" +msgstr "以正規式來匹配雲實例名稱(管理員專用)" + +msgid "Regular expression to match names" +msgstr "以正規式來匹配名稱" + +msgid "Resize server to specified flavor" +msgstr "調整雲實例容量來符合指定的虛擬硬體樣板" + +msgid "Restore server state before resize" +msgstr "恢復雲實例狀態到未調整容量前" + +msgid "Return existing domain" +msgstr "回傳存在的地域" + +msgid "Return existing group" +msgstr "回傳存在的群組" + +msgid "Return existing project" +msgstr "回傳存在的專案" + +msgid "Return existing role" +msgstr "回傳存在的角色" + +msgid "Return existing user" +msgstr "回傳存在的用戶" + +msgid "Retype new password: " +msgstr "重新輸入新密碼:" + +msgid "Role to add to <project>:<user> (name or ID)" +msgstr "加入角色到 <project>:<user>(名稱或識別號)" + +msgid "Role to display (name or ID)" +msgstr "要顯示的角色(名稱或識別號)" + +msgid "Role to remove (name or ID)" +msgstr "要移除的角色(名稱或識別號)" + +msgid "Role(s) to delete (name or ID)" +msgstr "要刪除的角色(名稱或識別號)" + +msgid "Search by hostname" +msgstr "以主機名稱來尋找" + +msgid "Search by server status" +msgstr "以雲實例狀態來尋找" + +msgid "Security group to add (name or ID)" +msgstr "要加入的安全性群組(名稱或識別號)" + +msgid "Select an availability zone for the server" +msgstr "為雲實例選擇可用的區域。" + +msgid "Server (name or ID)" +msgstr "伺服器(名稱或識別號)" + +msgid "Server internal device name for volume" +msgstr "雲硬碟在雲實例內的裝置名稱" + +msgid "Server(s) to delete (name or ID)" +msgstr "要刪除的雲實例(名稱或識別號)" + +msgid "Service to delete (name or ID)" +msgstr "要刪除的伺服器(名稱或識別號)" + +msgid "Service to display (type or name)" +msgstr "要顯示的伺服器(類型或名稱)" + +msgid "Service to display (type, name or ID)" +msgstr "要顯示的伺服器(類型、名稱或識別號)" + +msgid "Set a project property (repeat option to set multiple properties)" +msgstr "設定專案屬性(重復這選項來設定多個屬性)" + +msgid "Set a property on this server (repeat for multiple values)" +msgstr "為此伺服器設定屬性(為多個值重複設定)" + +msgid "Set default project (name or ID)" +msgstr "設定預設專案(名稱或識別號)" + +msgid "Set new root password (interactive only)" +msgstr "設定新密碼(只限互動)" + +msgid "Set project description" +msgstr "設定專案描述" + +msgid "Set project name" +msgstr "設定專案名稱" + +msgid "Set user email address" +msgstr "設定用戶電子信箱位址" + +msgid "Set user name" +msgstr "設定用戶名稱" + +msgid "Set user password" +msgstr "設定用戶密碼" + +msgid "Show service catalog information" +msgstr "顯示伺服器分類資訊" + +msgid "Target hostname" +msgstr "目標主機名稱" + +msgid "" +"The argument --type is deprecated, use service create --name <service-name> " +"type instead." +msgstr "" +"已經淘汰 --type 參數,請用 service create --name <service-name> 來代替。" + +msgid "Token to be deleted" +msgstr "要刪除的記號" + +msgid "Use only IPv4 addresses" +msgstr "只使用 IPv4 位址" + +msgid "Use only IPv6 addresses" +msgstr "只使用 IPv6 位址" + +msgid "Use other IP address (public, private, etc)" +msgstr "使用其他 IP 位址(公開、私人等等)" + +msgid "Use private IP address" +msgstr "使用私人 IP 位址" + +msgid "Use public IP address" +msgstr "使用公開 IP 位址" + +msgid "" +"Use specified volume as the config drive, or 'True' to use an ephemeral drive" +msgstr "使用指定的雲硬碟為設定檔硬碟,或「True」來使用暫時性硬碟" + +msgid "User data file to serve from the metadata server" +msgstr "來自詮釋資料伺服器要服務的用戶資料檔案" + +msgid "User must be specified" +msgstr "必須指定用戶" + +msgid "User to change (name or ID)" +msgstr "要更換的用戶(名稱或識別號)" + +msgid "User to display (name or ID)" +msgstr "要顯示的用戶(名稱或識別號)" + +msgid "User to list (name or ID)" +msgstr "要列出的用戶(名稱或識別號)" + +msgid "User(s) to delete (name or ID)" +msgstr "要刪除的用戶(名稱或識別號)" + +msgid "Volume to add (name or ID)" +msgstr "要加入的雲硬碟(名稱或識別號)" + +msgid "Volume to remove (name or ID)" +msgstr "要移除的雲硬碟(名稱或識別號)" + +msgid "Wait for build to complete" +msgstr "等待完成建立" + +msgid "Wait for image create to complete" +msgstr "等待映像檔新增完成" + +msgid "Wait for reboot to complete" +msgstr "等待重開機完成" + +msgid "Wait for rebuild to complete" +msgstr "等待重建完成" + +msgid "Wait for resize to complete" +msgstr "等待調整容量完成" + +msgid "either net-id or port-id should be specified but not both" +msgstr "任選網路識別號或接口識別號,但不能兩者都指定" + +msgid "max instances should be > 0" +msgstr "雲實例發動的最大值要大於 0" + +msgid "min instances should be <= max instances" +msgstr "雲實例發動的最少值不應大於最大值" + +msgid "min instances should be > 0" +msgstr "雲實例發動的最少值要大於 0" diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py new file mode 100644 index 00000000..cc343c3c --- /dev/null +++ b/openstackclient/network/common.py @@ -0,0 +1,164 @@ +# 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 abc +import six + +from openstackclient.common import command + + +@six.add_metaclass(abc.ABCMeta) +class NetworkAndComputeCommand(command.Command): + """Network and Compute Command""" + + def take_action(self, parsed_args): + if self.app.client_manager.is_network_endpoint_enabled(): + return self.take_action_network(self.app.client_manager.network, + parsed_args) + else: + return self.take_action_compute(self.app.client_manager.compute, + parsed_args) + + def get_parser(self, prog_name): + self.log.debug('get_parser(%s)', prog_name) + parser = super(NetworkAndComputeCommand, self).get_parser(prog_name) + parser = self.update_parser_common(parser) + self.log.debug('common parser: %s', parser) + if self.app.client_manager.is_network_endpoint_enabled(): + return self.update_parser_network(parser) + else: + return self.update_parser_compute(parser) + + def update_parser_common(self, parser): + """Default is no updates to parser.""" + return parser + + def update_parser_network(self, parser): + """Default is no updates to parser.""" + return parser + + def update_parser_compute(self, parser): + """Default is no updates to parser.""" + return parser + + @abc.abstractmethod + def take_action_network(self, client, parsed_args): + """Override to do something useful.""" + pass + + @abc.abstractmethod + def take_action_compute(self, client, parsed_args): + """Override to do something useful.""" + pass + + +@six.add_metaclass(abc.ABCMeta) +class NetworkAndComputeLister(command.Lister): + """Network and Compute Lister + + Lister class for commands that support implementation via + the network or compute endpoint. Such commands have different + implementations for take_action() and may even have different + arguments. + """ + + def take_action(self, parsed_args): + if self.app.client_manager.is_network_endpoint_enabled(): + return self.take_action_network(self.app.client_manager.network, + parsed_args) + else: + return self.take_action_compute(self.app.client_manager.compute, + parsed_args) + + def get_parser(self, prog_name): + self.log.debug('get_parser(%s)', prog_name) + parser = super(NetworkAndComputeLister, self).get_parser(prog_name) + parser = self.update_parser_common(parser) + self.log.debug('common parser: %s', parser) + if self.app.client_manager.is_network_endpoint_enabled(): + return self.update_parser_network(parser) + else: + return self.update_parser_compute(parser) + + def update_parser_common(self, parser): + """Default is no updates to parser.""" + return parser + + def update_parser_network(self, parser): + """Default is no updates to parser.""" + return parser + + def update_parser_compute(self, parser): + """Default is no updates to parser.""" + return parser + + @abc.abstractmethod + def take_action_network(self, client, parsed_args): + """Override to do something useful.""" + pass + + @abc.abstractmethod + def take_action_compute(self, client, parsed_args): + """Override to do something useful.""" + pass + + +@six.add_metaclass(abc.ABCMeta) +class NetworkAndComputeShowOne(command.ShowOne): + """Network and Compute ShowOne + + ShowOne class for commands that support implementation via + the network or compute endpoint. Such commands have different + implementations for take_action() and may even have different + arguments. + """ + + def take_action(self, parsed_args): + if self.app.client_manager.is_network_endpoint_enabled(): + return self.take_action_network(self.app.client_manager.network, + parsed_args) + else: + return self.take_action_compute(self.app.client_manager.compute, + parsed_args) + + def get_parser(self, prog_name): + self.log.debug('get_parser(%s)', prog_name) + parser = super(NetworkAndComputeShowOne, self).get_parser(prog_name) + parser = self.update_parser_common(parser) + self.log.debug('common parser: %s', parser) + if self.app.client_manager.is_network_endpoint_enabled(): + return self.update_parser_network(parser) + else: + return self.update_parser_compute(parser) + + def update_parser_common(self, parser): + """Default is no updates to parser.""" + return parser + + def update_parser_network(self, parser): + """Default is no updates to parser.""" + return parser + + def update_parser_compute(self, parser): + """Default is no updates to parser.""" + return parser + + @abc.abstractmethod + def take_action_network(self, client, parsed_args): + """Override to do something useful.""" + pass + + @abc.abstractmethod + def take_action_compute(self, client, parsed_args): + """Override to do something useful.""" + pass diff --git a/openstackclient/network/v2/floating_ip.py b/openstackclient/network/v2/floating_ip.py new file mode 100644 index 00000000..48895048 --- /dev/null +++ b/openstackclient/network/v2/floating_ip.py @@ -0,0 +1,66 @@ +# 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. +# + +"""IP Floating action implementations""" + +from openstackclient.common import utils +from openstackclient.network import common + + +class DeleteFloatingIP(common.NetworkAndComputeCommand): + """Delete floating IP""" + + def update_parser_common(self, parser): + parser.add_argument( + 'floating_ip', + metavar="<floating-ip>", + help=("Floating IP to delete (IP address or ID)") + ) + return parser + + def take_action_network(self, client, parsed_args): + obj = client.find_ip(parsed_args.floating_ip) + client.delete_ip(obj) + + def take_action_compute(self, client, parsed_args): + obj = utils.find_resource( + client.floating_ips, + parsed_args.floating_ip, + ) + client.floating_ips.delete(obj.id) + + +class ListFloatingIP(common.NetworkAndComputeLister): + """List floating IP(s)""" + + columns = ('ID', 'IP', 'Fixed IP', 'Instance ID', 'Pool') + column_headers = ('ID', 'Floating IP', 'Fixed IP', 'Server ID', 'Pool') + + def take_action_network(self, client, parsed_args): + query = {} + data = client.ips(**query) + + return (self.column_headers, + (utils.get_item_properties( + s, self.columns, + formatters={}, + ) for s in data)) + + def take_action_compute(self, client, parsed_args): + data = client.floating_ips.list() + + return (self.column_headers, + (utils.get_item_properties( + s, self.columns, + formatters={}, + ) for s in data)) diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py index 38dff8d9..636c333e 100644 --- a/openstackclient/network/v2/network.py +++ b/openstackclient/network/v2/network.py @@ -13,15 +13,11 @@ """Network action implementations""" -import logging - -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import exceptions from openstackclient.common import utils from openstackclient.identity import common as identity_common +from openstackclient.network import common def _format_admin_state(item): @@ -36,6 +32,8 @@ _formatters = { 'subnets': utils.format_list, 'admin_state_up': _format_admin_state, 'router_external': _format_router_external, + 'availability_zones': utils.format_list, + 'availability_zone_hints': utils.format_list, } @@ -50,10 +48,35 @@ def _get_columns(item): return tuple(sorted(columns)) -class CreateNetwork(show.ShowOne): - """Create new network""" +def _get_attrs(client_manager, parsed_args): + attrs = {} + if parsed_args.name is not None: + attrs['name'] = str(parsed_args.name) + if parsed_args.admin_state is not None: + attrs['admin_state_up'] = parsed_args.admin_state + if parsed_args.shared is not None: + attrs['shared'] = parsed_args.shared + + # "network set" command doesn't support setting project. + if 'project' in parsed_args and parsed_args.project is not None: + identity_client = client_manager.identity + project_id = identity_common.find_project( + identity_client, + parsed_args.project, + parsed_args.project_domain, + ).id + attrs['tenant_id'] = project_id + + # "network set" command doesn't support setting availability zone hints. + if 'availability_zone_hints' in parsed_args and \ + parsed_args.availability_zone_hints is not None: + attrs['availability_zone_hints'] = parsed_args.availability_zone_hints + + return attrs + - log = logging.getLogger(__name__ + '.CreateNetwork') +class CreateNetwork(command.ShowOne): + """Create new network""" def get_parser(self, prog_name): parser = super(CreateNetwork, self).get_parser(prog_name) @@ -93,42 +116,36 @@ class CreateNetwork(show.ShowOne): parser.add_argument( '--project', metavar='<project>', - help="Owner's project (name or ID)") + help="Owner's project (name or ID)" + ) identity_common.add_project_domain_option_to_parser(parser) + + parser.add_argument( + '--availability-zone-hint', + action='append', + dest='availability_zone_hints', + metavar='<availability-zone>', + help='Availability Zone in which to create this network ' + '(requires the Network Availability Zone extension, ' + 'this option can be repeated).', + ) return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network - body = self.get_body(parsed_args) - obj = client.create_network(**body) + + attrs = _get_attrs(self.app.client_manager, parsed_args) + obj = client.create_network(**attrs) columns = _get_columns(obj) + data = utils.get_item_properties(obj, columns, formatters=_formatters) return (columns, data) - def get_body(self, parsed_args): - body = {'name': str(parsed_args.name), - 'admin_state_up': parsed_args.admin_state} - if parsed_args.shared is not None: - body['shared'] = parsed_args.shared - if parsed_args.project is not None: - identity_client = self.app.client_manager.identity - project_id = identity_common.find_project( - identity_client, - parsed_args.project, - parsed_args.project_domain, - ).id - body['tenant_id'] = project_id - return body - - -class DeleteNetwork(command.Command): - """Delete network(s)""" - log = logging.getLogger(__name__ + '.DeleteNetwork') +class DeleteNetwork(common.NetworkAndComputeCommand): + """Delete network(s)""" - def get_parser(self, prog_name): - parser = super(DeleteNetwork, self).get_parser(prog_name) + def update_parser_common(self, parser): parser.add_argument( 'network', metavar="<network>", @@ -137,19 +154,23 @@ class DeleteNetwork(command.Command): ) return parser - def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) - client = self.app.client_manager.network + def take_action_network(self, client, parsed_args): for network in parsed_args.network: obj = client.find_network(network) client.delete_network(obj) + def take_action_compute(self, client, parsed_args): + for network in parsed_args.network: + network = utils.find_resource( + client.networks, + network, + ) + client.networks.delete(network.id) + -class ListNetwork(lister.Lister): +class ListNetwork(command.Lister): """List networks""" - log = logging.getLogger(__name__ + '.ListNetwork') - def get_parser(self, prog_name): parser = super(ListNetwork, self).get_parser(prog_name) parser.add_argument( @@ -167,7 +188,6 @@ class ListNetwork(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network if parsed_args.long: @@ -181,6 +201,7 @@ class ListNetwork(lister.Lister): 'subnets', 'provider_network_type', 'router_external', + 'availability_zones', ) column_headers = ( 'ID', @@ -192,6 +213,7 @@ class ListNetwork(lister.Lister): 'Subnets', 'Network Type', 'Router Type', + 'Availability Zones', ) else: columns = ( @@ -220,12 +242,10 @@ class ListNetwork(lister.Lister): class SetNetwork(command.Command): """Set network properties""" - log = logging.getLogger(__name__ + '.SetNetwork') - def get_parser(self, prog_name): parser = super(SetNetwork, self).get_parser(prog_name) parser.add_argument( - 'identifier', + 'network', metavar="<network>", help=("Network to modify (name or ID)") ) @@ -265,42 +285,33 @@ class SetNetwork(command.Command): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network - obj = client.find_network(parsed_args.identifier, ignore_missing=False) + obj = client.find_network(parsed_args.network, ignore_missing=False) - if parsed_args.name is not None: - obj.name = str(parsed_args.name) - if parsed_args.admin_state is not None: - obj.admin_state_up = parsed_args.admin_state - if parsed_args.shared is not None: - obj.shared = parsed_args.shared - - if not obj.is_dirty: + attrs = _get_attrs(self.app.client_manager, parsed_args) + if attrs == {}: msg = "Nothing specified to be set" raise exceptions.CommandError(msg) - client.update_network(obj) + client.update_network(obj, **attrs) + return -class ShowNetwork(show.ShowOne): +class ShowNetwork(command.ShowOne): """Show network details""" - log = logging.getLogger(__name__ + '.ShowNetwork') - def get_parser(self, prog_name): parser = super(ShowNetwork, self).get_parser(prog_name) parser.add_argument( - 'identifier', + 'network', metavar="<network>", help=("Network to display (name or ID)") ) return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network - obj = client.find_network(parsed_args.identifier, ignore_missing=False) + obj = client.find_network(parsed_args.network, ignore_missing=False) columns = _get_columns(obj) data = utils.get_item_properties(obj, columns, formatters=_formatters) return (columns, data) diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py index ad906a28..46cb031f 100644 --- a/openstackclient/network/v2/port.py +++ b/openstackclient/network/v2/port.py @@ -13,16 +13,48 @@ """Port action implementations""" -import logging +from openstackclient.common import command +from openstackclient.common import utils -from cliff import command + +def _format_admin_state(state): + return 'UP' if state else 'DOWN' + + +_formatters = { + 'admin_state_up': _format_admin_state, + 'allowed_address_pairs': utils.format_list_of_dicts, + 'binding_profile': utils.format_dict, + 'binding_vif_details': utils.format_dict, + 'dns_assignment': utils.format_list_of_dicts, + 'extra_dhcp_opts': utils.format_list_of_dicts, + 'fixed_ips': utils.format_list_of_dicts, + 'security_groups': utils.format_list, +} + + +def _get_columns(item): + columns = item.keys() + if 'tenant_id' in columns: + columns.remove('tenant_id') + columns.append('project_id') + binding_columns = [ + 'binding:host_id', + 'binding:profile', + 'binding:vif_details', + 'binding:vif_type', + 'binding:vnic_type', + ] + for binding_column in binding_columns: + if binding_column in columns: + columns.remove(binding_column) + columns.append(binding_column.replace('binding:', 'binding_', 1)) + return sorted(columns) class DeletePort(command.Command): """Delete port(s)""" - log = logging.getLogger(__name__ + '.DeletePort') - def get_parser(self, prog_name): parser = super(DeletePort, self).get_parser(prog_name) parser.add_argument( @@ -34,9 +66,28 @@ class DeletePort(command.Command): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network for port in parsed_args.port: res = client.find_port(port) client.delete_port(res) + + +class ShowPort(command.ShowOne): + """Display port details""" + + def get_parser(self, prog_name): + parser = super(ShowPort, self).get_parser(prog_name) + parser.add_argument( + 'port', + metavar="<port>", + help="Port to display (name or ID)" + ) + return parser + + def take_action(self, parsed_args): + client = self.app.client_manager.network + obj = client.find_port(parsed_args.port, ignore_missing=False) + columns = _get_columns(obj) + data = utils.get_item_properties(obj, columns, formatters=_formatters) + return (tuple(columns), data) diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py index 09e0fe4c..60db816a 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -14,12 +14,8 @@ """Router action implementations""" import json -import logging - -from cliff import command -from cliff import lister -from cliff import show +from openstackclient.common import command from openstackclient.common import exceptions from openstackclient.common import utils from openstackclient.identity import common as identity_common @@ -39,6 +35,8 @@ def _format_external_gateway_info(info): _formatters = { 'admin_state_up': _format_admin_state, 'external_gateway_info': _format_external_gateway_info, + 'availability_zones': utils.format_list, + 'availability_zone_hints': utils.format_list, } @@ -50,6 +48,9 @@ def _get_attrs(client_manager, parsed_args): attrs['admin_state_up'] = parsed_args.admin_state_up if parsed_args.distributed is not None: attrs['distributed'] = parsed_args.distributed + if ('availability_zone_hints' in parsed_args + and parsed_args.availability_zone_hints is not None): + attrs['availability_zone_hints'] = parsed_args.availability_zone_hints # "router set" command doesn't support setting project. if 'project' in parsed_args and parsed_args.project is not None: identity_client = client_manager.identity @@ -67,11 +68,9 @@ def _get_attrs(client_manager, parsed_args): return attrs -class CreateRouter(show.ShowOne): +class CreateRouter(command.ShowOne): """Create a new router""" - log = logging.getLogger(__name__ + '.CreateRouter') - def get_parser(self, prog_name): parser = super(CreateRouter, self).get_parser(prog_name) parser.add_argument( @@ -102,14 +101,23 @@ class CreateRouter(show.ShowOne): ) parser.add_argument( '--project', - metavar='<poroject>', + metavar='<project>', help="Owner's project (name or ID)", ) + parser.add_argument( + '--availability-zone-hint', + metavar='<availability-zone>', + action='append', + dest='availability_zone_hints', + help='Availability Zone in which to create this router ' + '(requires the Router Availability Zone extension, ' + 'this option can be repeated).', + ) + identity_common.add_project_domain_option_to_parser(parser) return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network attrs = _get_attrs(self.app.client_manager, parsed_args) @@ -128,8 +136,6 @@ class CreateRouter(show.ShowOne): class DeleteRouter(command.Command): """Delete router(s)""" - log = logging.getLogger(__name__ + '.DeleteRouter') - def get_parser(self, prog_name): parser = super(DeleteRouter, self).get_parser(prog_name) parser.add_argument( @@ -141,18 +147,15 @@ class DeleteRouter(command.Command): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network for router in parsed_args.router: obj = client.find_router(router) client.delete_router(obj) -class ListRouter(lister.Lister): +class ListRouter(command.Lister): """List routers""" - log = logging.getLogger(__name__ + '.ListRouter') - def get_parser(self, prog_name): parser = super(ListRouter, self).get_parser(prog_name) parser.add_argument( @@ -164,7 +167,6 @@ class ListRouter(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network columns = ( @@ -189,10 +191,12 @@ class ListRouter(lister.Lister): columns = columns + ( 'routes', 'external_gateway_info', + 'availability_zones' ) column_headers = column_headers + ( 'Routes', 'External gateway info', + 'Availability zones' ) data = client.routers() @@ -206,8 +210,6 @@ class ListRouter(lister.Lister): class SetRouter(command.Command): """Set router properties""" - log = logging.getLogger(__name__ + '.SetRouter') - def get_parser(self, prog_name): parser = super(SetRouter, self).get_parser(prog_name) parser.add_argument( @@ -262,7 +264,6 @@ class SetRouter(command.Command): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network obj = client.find_router(parsed_args.router, ignore_missing=False) @@ -274,11 +275,9 @@ class SetRouter(command.Command): client.update_router(obj, **attrs) -class ShowRouter(show.ShowOne): +class ShowRouter(command.ShowOne): """Display router details""" - log = logging.getLogger(__name__ + '.ShowRouter') - def get_parser(self, prog_name): parser = super(ShowRouter, self).get_parser(prog_name) parser.add_argument( @@ -289,7 +288,6 @@ class ShowRouter(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug('take_action(%s)' % parsed_args) client = self.app.client_manager.network obj = client.find_router(parsed_args.router, ignore_missing=False) columns = sorted(obj.keys()) diff --git a/openstackclient/network/v2/security_group.py b/openstackclient/network/v2/security_group.py new file mode 100644 index 00000000..4e122f21 --- /dev/null +++ b/openstackclient/network/v2/security_group.py @@ -0,0 +1,40 @@ +# 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. +# + +"""Security Group action implementations""" + +from openstackclient.common import utils +from openstackclient.network import common + + +class DeleteSecurityGroup(common.NetworkAndComputeCommand): + """Delete a security group""" + + def update_parser_common(self, parser): + parser.add_argument( + 'group', + metavar='<group>', + help='Security group to delete (name or ID)', + ) + return parser + + def take_action_network(self, client, parsed_args): + obj = client.find_security_group(parsed_args.group) + client.delete_security_group(obj) + + def take_action_compute(self, client, parsed_args): + data = utils.find_resource( + client.security_groups, + parsed_args.group, + ) + client.security_groups.delete(data.id) diff --git a/openstackclient/network/v2/subnet.py b/openstackclient/network/v2/subnet.py new file mode 100644 index 00000000..b948c656 --- /dev/null +++ b/openstackclient/network/v2/subnet.py @@ -0,0 +1,63 @@ +# 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. +# + +"""Subnet action implementations""" + +from openstackclient.common import command +from openstackclient.common import utils + + +def _format_allocation_pools(data): + pool_formatted = ['%s-%s' % (pool.get('start', ''), pool.get('end', '')) + for pool in data] + return ','.join(pool_formatted) + + +_formatters = { + 'allocation_pools': _format_allocation_pools, + 'dns_nameservers': utils.format_list, + 'host_routes': utils.format_list, +} + + +class ListSubnet(command.Lister): + """List subnets""" + + def get_parser(self, prog_name): + parser = super(ListSubnet, self).get_parser(prog_name) + parser.add_argument( + '--long', + action='store_true', + default=False, + help='List additional fields in output', + ) + return parser + + def take_action(self, parsed_args): + data = self.app.client_manager.network.subnets() + + headers = ('ID', 'Name', 'Network', 'Subnet') + columns = ('id', 'name', 'network_id', 'cidr') + if parsed_args.long: + headers += ('Project', 'DHCP', 'Name Servers', + 'Allocation Pools', 'Host Routes', 'IP Version', + 'Gateway') + columns += ('tenant_id', 'enable_dhcp', 'dns_nameservers', + 'allocation_pools', 'host_routes', 'ip_version', + 'gateway_ip') + + return (headers, + (utils.get_item_properties( + s, columns, + formatters=_formatters, + ) for s in data)) diff --git a/openstackclient/object/v1/account.py b/openstackclient/object/v1/account.py index aa94ff5c..543ce4f3 100644 --- a/openstackclient/object/v1/account.py +++ b/openstackclient/object/v1/account.py @@ -13,12 +13,9 @@ """Account v1 action implementations""" -import logging - -from cliff import command -from cliff import show import six +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils @@ -26,8 +23,6 @@ from openstackclient.common import utils class SetAccount(command.Command): """Set account properties""" - log = logging.getLogger(__name__ + '.SetAccount') - def get_parser(self, prog_name): parser = super(SetAccount, self).get_parser(prog_name) parser.add_argument( @@ -40,19 +35,15 @@ class SetAccount(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): self.app.client_manager.object_store.account_set( properties=parsed_args.property, ) -class ShowAccount(show.ShowOne): +class ShowAccount(command.ShowOne): """Display account details""" - log = logging.getLogger(__name__ + '.ShowAccount') - - @utils.log_method(log) def take_action(self, parsed_args): data = self.app.client_manager.object_store.account_show() if 'properties' in data: @@ -63,8 +54,6 @@ class ShowAccount(show.ShowOne): class UnsetAccount(command.Command): """Unset account properties""" - log = logging.getLogger(__name__ + '.UnsetAccount') - def get_parser(self, prog_name): parser = super(UnsetAccount, self).get_parser(prog_name) parser.add_argument( @@ -78,7 +67,6 @@ class UnsetAccount(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): self.app.client_manager.object_store.account_unset( properties=parsed_args.property, diff --git a/openstackclient/object/v1/container.py b/openstackclient/object/v1/container.py index 8c8844e2..80b84238 100644 --- a/openstackclient/object/v1/container.py +++ b/openstackclient/object/v1/container.py @@ -16,22 +16,16 @@ """Container v1 action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils -class CreateContainer(lister.Lister): +class CreateContainer(command.Lister): """Create new container""" - log = logging.getLogger(__name__ + '.CreateContainer') - def get_parser(self, prog_name): parser = super(CreateContainer, self).get_parser(prog_name) parser.add_argument( @@ -42,7 +36,6 @@ class CreateContainer(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): results = [] @@ -63,11 +56,15 @@ class CreateContainer(lister.Lister): class DeleteContainer(command.Command): """Delete container""" - log = logging.getLogger(__name__ + '.DeleteContainer') - def get_parser(self, prog_name): parser = super(DeleteContainer, self).get_parser(prog_name) parser.add_argument( + '--recursive', '-r', + action='store_true', + default=False, + help='Recursively delete objects and container', + ) + parser.add_argument( 'containers', metavar='<container>', nargs="+", @@ -75,20 +72,25 @@ class DeleteContainer(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): for container in parsed_args.containers: + if parsed_args.recursive: + objs = self.app.client_manager.object_store.object_list( + container=container) + for obj in objs: + self.app.client_manager.object_store.object_delete( + container=container, + object=obj['name'], + ) self.app.client_manager.object_store.container_delete( container=container, ) -class ListContainer(lister.Lister): +class ListContainer(command.Lister): """List containers""" - log = logging.getLogger(__name__ + '.ListContainer') - def get_parser(self, prog_name): parser = super(ListContainer, self).get_parser(prog_name) parser.add_argument( @@ -126,7 +128,6 @@ class ListContainer(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): if parsed_args.long: @@ -160,8 +161,6 @@ class ListContainer(lister.Lister): class SaveContainer(command.Command): """Save container contents locally""" - log = logging.getLogger(__name__ + ".SaveContainer") - def get_parser(self, prog_name): parser = super(SaveContainer, self).get_parser(prog_name) parser.add_argument( @@ -172,8 +171,6 @@ class SaveContainer(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - self.app.client_manager.object_store.container_save( container=parsed_args.container, ) @@ -182,8 +179,6 @@ class SaveContainer(command.Command): class SetContainer(command.Command): """Set container properties""" - log = logging.getLogger(__name__ + '.SetContainer') - def get_parser(self, prog_name): parser = super(SetContainer, self).get_parser(prog_name) parser.add_argument( @@ -201,7 +196,6 @@ class SetContainer(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): self.app.client_manager.object_store.container_set( parsed_args.container, @@ -209,11 +203,9 @@ class SetContainer(command.Command): ) -class ShowContainer(show.ShowOne): +class ShowContainer(command.ShowOne): """Display container details""" - log = logging.getLogger(__name__ + '.ShowContainer') - def get_parser(self, prog_name): parser = super(ShowContainer, self).get_parser(prog_name) parser.add_argument( @@ -223,7 +215,6 @@ class ShowContainer(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): data = self.app.client_manager.object_store.container_show( @@ -238,8 +229,6 @@ class ShowContainer(show.ShowOne): class UnsetContainer(command.Command): """Unset container properties""" - log = logging.getLogger(__name__ + '.UnsetContainer') - def get_parser(self, prog_name): parser = super(UnsetContainer, self).get_parser(prog_name) parser.add_argument( @@ -258,7 +247,6 @@ class UnsetContainer(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): self.app.client_manager.object_store.container_unset( parsed_args.container, diff --git a/openstackclient/object/v1/object.py b/openstackclient/object/v1/object.py index 4bd06124..f9a55e9c 100644 --- a/openstackclient/object/v1/object.py +++ b/openstackclient/object/v1/object.py @@ -16,22 +16,16 @@ """Object v1 action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils -class CreateObject(lister.Lister): +class CreateObject(command.Lister): """Upload object to container""" - log = logging.getLogger(__name__ + '.CreateObject') - def get_parser(self, prog_name): parser = super(CreateObject, self).get_parser(prog_name) parser.add_argument( @@ -47,7 +41,6 @@ class CreateObject(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): results = [] @@ -69,8 +62,6 @@ class CreateObject(lister.Lister): class DeleteObject(command.Command): """Delete object from container""" - log = logging.getLogger(__name__ + '.DeleteObject') - def get_parser(self, prog_name): parser = super(DeleteObject, self).get_parser(prog_name) parser.add_argument( @@ -86,7 +77,6 @@ class DeleteObject(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): for obj in parsed_args.objects: @@ -96,11 +86,9 @@ class DeleteObject(command.Command): ) -class ListObject(lister.Lister): +class ListObject(command.Lister): """List objects""" - log = logging.getLogger(__name__ + '.ListObject') - def get_parser(self, prog_name): parser = super(ListObject, self).get_parser(prog_name) parser.add_argument( @@ -148,7 +136,6 @@ class ListObject(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): if parsed_args.long: @@ -191,8 +178,6 @@ class ListObject(lister.Lister): class SaveObject(command.Command): """Save object locally""" - log = logging.getLogger(__name__ + ".SaveObject") - def get_parser(self, prog_name): parser = super(SaveObject, self).get_parser(prog_name) parser.add_argument( @@ -213,8 +198,6 @@ class SaveObject(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action(%s)", parsed_args) - self.app.client_manager.object_store.object_save( container=parsed_args.container, object=parsed_args.object, @@ -225,8 +208,6 @@ class SaveObject(command.Command): class SetObject(command.Command): """Set object properties""" - log = logging.getLogger(__name__ + '.SetObject') - def get_parser(self, prog_name): parser = super(SetObject, self).get_parser(prog_name) parser.add_argument( @@ -249,7 +230,6 @@ class SetObject(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): self.app.client_manager.object_store.object_set( parsed_args.container, @@ -258,11 +238,9 @@ class SetObject(command.Command): ) -class ShowObject(show.ShowOne): +class ShowObject(command.ShowOne): """Display object details""" - log = logging.getLogger(__name__ + '.ShowObject') - def get_parser(self, prog_name): parser = super(ShowObject, self).get_parser(prog_name) parser.add_argument( @@ -277,7 +255,6 @@ class ShowObject(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): data = self.app.client_manager.object_store.object_show( @@ -293,8 +270,6 @@ class ShowObject(show.ShowOne): class UnsetObject(command.Command): """Unset object properties""" - log = logging.getLogger(__name__ + '.UnsetObject') - def get_parser(self, prog_name): parser = super(UnsetObject, self).get_parser(prog_name) parser.add_argument( @@ -318,7 +293,6 @@ class UnsetObject(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): self.app.client_manager.object_store.object_unset( parsed_args.container, diff --git a/openstackclient/shell.py b/openstackclient/shell.py index c84e2b1d..137446ef 100644 --- a/openstackclient/shell.py +++ b/openstackclient/shell.py @@ -234,12 +234,17 @@ class OpenStackShell(app.App): # Do configuration file handling # Ignore the default value of interface. Only if it is set later # will it be used. - cc = cloud_config.OpenStackConfig( - override_defaults={ - 'interface': None, - 'auth_type': auth_type, + try: + cc = cloud_config.OpenStackConfig( + override_defaults={ + 'interface': None, + 'auth_type': auth_type, }, ) + except (IOError, OSError) as e: + self.log.critical("Could not read clouds.yaml configuration file") + self.print_help_if_requested() + raise e # TODO(thowe): Change cliff so the default value for debug # can be set to None. diff --git a/openstackclient/tests/common/test_availability_zone.py b/openstackclient/tests/common/test_availability_zone.py new file mode 100644 index 00000000..feecaf55 --- /dev/null +++ b/openstackclient/tests/common/test_availability_zone.py @@ -0,0 +1,267 @@ +# 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 mock +import six + +from openstackclient.common import availability_zone +from openstackclient.tests.compute.v2 import fakes as compute_fakes +from openstackclient.tests import fakes +from openstackclient.tests.network.v2 import fakes as network_fakes +from openstackclient.tests import utils +from openstackclient.tests.volume.v2 import fakes as volume_fakes + + +def _build_compute_az_datalist(compute_az, long_datalist=False): + datalist = () + if not long_datalist: + datalist = ( + compute_az.zoneName, + 'available', + ) + else: + for host, services in six.iteritems(compute_az.hosts): + for service, state in six.iteritems(services): + datalist += ( + compute_az.zoneName, + 'available', + '', + host, + service, + 'enabled :-) ' + state['updated_at'], + ) + return (datalist,) + + +def _build_volume_az_datalist(volume_az, long_datalist=False): + datalist = () + if not long_datalist: + datalist = ( + volume_az.zoneName, + 'available', + ) + else: + datalist = ( + volume_az.zoneName, + 'available', + '', '', '', '', + ) + return (datalist,) + + +def _build_network_az_datalist(network_az, long_datalist=False): + datalist = () + if not long_datalist: + datalist = ( + network_az.name, + network_az.state, + ) + else: + datalist = ( + network_az.name, + network_az.state, + network_az.resource, + '', '', '', + ) + return (datalist,) + + +class TestAvailabilityZone(utils.TestCommand): + + def setUp(self): + super(TestAvailabilityZone, self).setUp() + + compute_client = compute_fakes.FakeComputev2Client( + endpoint=fakes.AUTH_URL, + token=fakes.AUTH_TOKEN, + ) + self.app.client_manager.compute = compute_client + + self.compute_azs_mock = compute_client.availability_zones + self.compute_azs_mock.reset_mock() + + volume_client = volume_fakes.FakeVolumeClient( + endpoint=fakes.AUTH_URL, + token=fakes.AUTH_TOKEN, + ) + self.app.client_manager.volume = volume_client + + self.volume_azs_mock = volume_client.availability_zones + self.volume_azs_mock.reset_mock() + + network_client = network_fakes.FakeNetworkV2Client( + endpoint=fakes.AUTH_URL, + token=fakes.AUTH_TOKEN, + ) + self.app.client_manager.network = network_client + + network_client.availability_zones = mock.Mock() + network_client.find_extension = mock.Mock() + self.network_azs_mock = network_client.availability_zones + + +class TestAvailabilityZoneList(TestAvailabilityZone): + + compute_azs = \ + compute_fakes.FakeAvailabilityZone.create_availability_zones() + volume_azs = \ + volume_fakes.FakeAvailabilityZone.create_availability_zones(count=1) + network_azs = \ + network_fakes.FakeAvailabilityZone.create_availability_zones() + + short_columnslist = ('Zone Name', 'Zone Status') + long_columnslist = ( + 'Zone Name', + 'Zone Status', + 'Zone Resource', + 'Host Name', + 'Service Name', + 'Service Status', + ) + + def setUp(self): + super(TestAvailabilityZoneList, self).setUp() + + self.compute_azs_mock.list.return_value = self.compute_azs + self.volume_azs_mock.list.return_value = self.volume_azs + self.network_azs_mock.return_value = self.network_azs + + # Get the command object to test + self.cmd = availability_zone.ListAvailabilityZone(self.app, None) + + def test_availability_zone_list_no_options(self): + arglist = [] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. + columns, data = self.cmd.take_action(parsed_args) + + self.compute_azs_mock.list.assert_called_with() + self.volume_azs_mock.list.assert_called_with() + self.network_azs_mock.assert_called_with() + + self.assertEqual(self.short_columnslist, columns) + datalist = () + for compute_az in self.compute_azs: + datalist += _build_compute_az_datalist(compute_az) + for volume_az in self.volume_azs: + datalist += _build_volume_az_datalist(volume_az) + for network_az in self.network_azs: + datalist += _build_network_az_datalist(network_az) + self.assertEqual(datalist, tuple(data)) + + def test_availability_zone_list_long(self): + arglist = [ + '--long', + ] + verifylist = [ + ('long', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. + columns, data = self.cmd.take_action(parsed_args) + + self.compute_azs_mock.list.assert_called_with() + self.volume_azs_mock.list.assert_called_with() + self.network_azs_mock.assert_called_with() + + self.assertEqual(self.long_columnslist, columns) + datalist = () + for compute_az in self.compute_azs: + datalist += _build_compute_az_datalist(compute_az, + long_datalist=True) + for volume_az in self.volume_azs: + datalist += _build_volume_az_datalist(volume_az, + long_datalist=True) + for network_az in self.network_azs: + datalist += _build_network_az_datalist(network_az, + long_datalist=True) + self.assertEqual(datalist, tuple(data)) + + def test_availability_zone_list_compute(self): + arglist = [ + '--compute', + ] + verifylist = [ + ('compute', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. + columns, data = self.cmd.take_action(parsed_args) + + self.compute_azs_mock.list.assert_called_with() + self.volume_azs_mock.list.assert_not_called() + self.network_azs_mock.assert_not_called() + + self.assertEqual(self.short_columnslist, columns) + datalist = () + for compute_az in self.compute_azs: + datalist += _build_compute_az_datalist(compute_az) + self.assertEqual(datalist, tuple(data)) + + def test_availability_zone_list_volume(self): + arglist = [ + '--volume', + ] + verifylist = [ + ('volume', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. + columns, data = self.cmd.take_action(parsed_args) + + self.compute_azs_mock.list.assert_not_called() + self.volume_azs_mock.list.assert_called_with() + self.network_azs_mock.assert_not_called() + + self.assertEqual(self.short_columnslist, columns) + datalist = () + for volume_az in self.volume_azs: + datalist += _build_volume_az_datalist(volume_az) + self.assertEqual(datalist, tuple(data)) + + def test_availability_zone_list_network(self): + arglist = [ + '--network', + ] + verifylist = [ + ('network', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. + columns, data = self.cmd.take_action(parsed_args) + + self.compute_azs_mock.list.assert_not_called() + self.volume_azs_mock.list.assert_not_called() + self.network_azs_mock.assert_called_with() + + self.assertEqual(self.short_columnslist, columns) + datalist = () + for network_az in self.network_azs: + datalist += _build_network_az_datalist(network_az) + self.assertEqual(datalist, tuple(data)) diff --git a/openstackclient/tests/common/test_extension.py b/openstackclient/tests/common/test_extension.py index 21c2cc24..66532827 100644 --- a/openstackclient/tests/common/test_extension.py +++ b/openstackclient/tests/common/test_extension.py @@ -63,7 +63,9 @@ class TestExtensionList(TestExtension): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # no args should output from all services @@ -93,7 +95,9 @@ class TestExtensionList(TestExtension): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # no args should output from all services @@ -131,7 +135,9 @@ class TestExtensionList(TestExtension): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.identity_extensions_mock.list.assert_called_with() diff --git a/openstackclient/tests/common/test_module.py b/openstackclient/tests/common/test_module.py index 6918c1b4..2821da9e 100644 --- a/openstackclient/tests/common/test_module.py +++ b/openstackclient/tests/common/test_module.py @@ -62,7 +62,9 @@ class TestCommandList(utils.TestCommand): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) collist = ('Command Group', 'Commands') @@ -94,7 +96,9 @@ class TestModuleList(utils.TestCommand): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Additional modules may be present, just check our additions @@ -110,7 +114,9 @@ class TestModuleList(utils.TestCommand): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Additional modules may be present, just check our additions diff --git a/openstackclient/tests/common/test_quota.py b/openstackclient/tests/common/test_quota.py index 485b8a8b..edf29c9b 100644 --- a/openstackclient/tests/common/test_quota.py +++ b/openstackclient/tests/common/test_quota.py @@ -214,13 +214,15 @@ class TestQuotaShow(TestQuota): loaded=True, ) - self.service_catalog_mock.get_endpoints.return_value = [ - fakes.FakeResource( - None, - copy.deepcopy(identity_fakes.ENDPOINT), - loaded=True, - ) - ] + fake_network_endpoint = fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.ENDPOINT), + loaded=True, + ) + + self.service_catalog_mock.get_endpoints.return_value = { + 'network': fake_network_endpoint + } self.quotas_class_mock.get.return_value = FakeQuotaResource( None, @@ -244,6 +246,8 @@ class TestQuotaShow(TestQuota): endpoint=fakes.AUTH_URL, token=fakes.AUTH_TOKEN, ) + self.network = self.app.client_manager.network + self.network.get_quota = mock.Mock(return_value=network_fakes.QUOTA) self.cmd = quota.ShowQuota(self.app, None) @@ -260,6 +264,9 @@ class TestQuotaShow(TestQuota): self.cmd.take_action(parsed_args) self.quotas_mock.get.assert_called_with(identity_fakes.project_id) + self.volume_quotas_mock.get.assert_called_with( + identity_fakes.project_id) + self.network.get_quota.assert_called_with(identity_fakes.project_id) def test_quota_show_with_default(self): arglist = [ @@ -276,6 +283,8 @@ class TestQuotaShow(TestQuota): self.cmd.take_action(parsed_args) self.quotas_mock.defaults.assert_called_with(identity_fakes.project_id) + self.volume_quotas_mock.defaults.assert_called_with( + identity_fakes.project_id) def test_quota_show_with_class(self): arglist = [ @@ -293,3 +302,5 @@ class TestQuotaShow(TestQuota): self.quotas_class_mock.get.assert_called_with( identity_fakes.project_id) + self.volume_quotas_class_mock.get.assert_called_with( + identity_fakes.project_id) diff --git a/openstackclient/tests/common/test_timing.py b/openstackclient/tests/common/test_timing.py index e7b9a040..c4c738b2 100644 --- a/openstackclient/tests/common/test_timing.py +++ b/openstackclient/tests/common/test_timing.py @@ -61,7 +61,9 @@ class TestTiming(utils.TestCommand): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) @@ -80,7 +82,9 @@ class TestTiming(utils.TestCommand): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) datalist = [ diff --git a/openstackclient/tests/common/test_utils.py b/openstackclient/tests/common/test_utils.py index 064ad417..da7ce063 100644 --- a/openstackclient/tests/common/test_utils.py +++ b/openstackclient/tests/common/test_utils.py @@ -143,7 +143,7 @@ class TestUtils(test_utils.TestCase): status_f = mock.Mock(return_value=resource) res_id = str(uuid.uuid4()) self.assertTrue(utils.wait_for_status(status_f, res_id,)) - self.assertFalse(mock_sleep.called) + mock_sleep.assert_not_called() @mock.patch.object(time, 'sleep') def test_wait_for_status_ok__with_overrides(self, mock_sleep): @@ -154,7 +154,7 @@ class TestUtils(test_utils.TestCase): self.assertTrue(utils.wait_for_status(status_f, res_id, status_field='my_status', success_status=['complete'])) - self.assertFalse(mock_sleep.called) + mock_sleep.assert_not_called() @mock.patch.object(time, 'sleep') def test_wait_for_status_error(self, mock_sleep): @@ -163,7 +163,7 @@ class TestUtils(test_utils.TestCase): status_f = mock.Mock(return_value=resource) res_id = str(uuid.uuid4()) self.assertFalse(utils.wait_for_status(status_f, res_id)) - self.assertFalse(mock_sleep.called) + mock_sleep.assert_not_called() @mock.patch.object(time, 'sleep') def test_wait_for_status_error_with_overrides(self, mock_sleep): @@ -174,7 +174,7 @@ class TestUtils(test_utils.TestCase): self.assertFalse(utils.wait_for_status(status_f, res_id, status_field='my_status', error_status=['failed'])) - self.assertFalse(mock_sleep.called) + mock_sleep.assert_not_called() @mock.patch.object(time, 'sleep') def test_wait_for_delete_ok(self, mock_sleep): @@ -210,7 +210,29 @@ class TestUtils(test_utils.TestCase): manager = mock.MagicMock(get=mock_get) res_id = str(uuid.uuid4()) self.assertFalse(utils.wait_for_delete(manager, res_id)) - self.assertFalse(mock_sleep.called) + mock_sleep.assert_not_called() + + @mock.patch.object(time, 'sleep') + def test_wait_for_delete_error_with_overrides(self, mock_sleep): + # Tests that we fail if the resource is my_status=failed + resource = mock.MagicMock(my_status='FAILED') + mock_get = mock.Mock(return_value=resource) + manager = mock.MagicMock(get=mock_get) + res_id = str(uuid.uuid4()) + self.assertFalse(utils.wait_for_delete(manager, res_id, + status_field='my_status', + error_status=['failed'])) + mock_sleep.assert_not_called() + + @mock.patch.object(time, 'sleep') + def test_wait_for_delete_error_with_overrides_exception(self, mock_sleep): + # Tests that we succeed if the resource is specific exception + mock_get = mock.Mock(side_effect=Exception) + manager = mock.MagicMock(get=mock_get) + res_id = str(uuid.uuid4()) + self.assertTrue(utils.wait_for_delete(manager, res_id, + exception_name=['Exception'])) + mock_sleep.assert_not_called() def test_build_kwargs_dict_value_set(self): self.assertEqual({'arg_bla': 'bla'}, @@ -348,6 +370,15 @@ class TestFindResource(test_utils.TestCase): self.assertEqual(expected, utils.format_list(['a', 'b', 'c'])) self.assertEqual(expected, utils.format_list(['c', 'b', 'a'])) + def test_format_list_of_dicts(self): + expected = "a='b', c='d'\ne='f'" + sorted_data = [{'a': 'b', 'c': 'd'}, {'e': 'f'}] + unsorted_data = [{'c': 'd', 'a': 'b'}, {'e': 'f'}] + self.assertEqual(expected, utils.format_list_of_dicts(sorted_data)) + self.assertEqual(expected, utils.format_list_of_dicts(unsorted_data)) + self.assertEqual('', utils.format_list_of_dicts([])) + self.assertEqual('', utils.format_list_of_dicts([{}])) + def test_format_list_separator(self): expected = 'a\nb\nc' actual_pre_sorted = utils.format_list(['a', 'b', 'c'], separator='\n') diff --git a/openstackclient/tests/compute/v2/fakes.py b/openstackclient/tests/compute/v2/fakes.py index ecf7f599..00f73748 100644 --- a/openstackclient/tests/compute/v2/fakes.py +++ b/openstackclient/tests/compute/v2/fakes.py @@ -88,23 +88,53 @@ SERVICE = { class FakeComputev2Client(object): def __init__(self, **kwargs): + self.aggregates = mock.Mock() + self.aggregates.resource_class = fakes.FakeResource(None, {}) + + self.availability_zones = mock.Mock() + self.availability_zones.resource_class = fakes.FakeResource(None, {}) + self.images = mock.Mock() self.images.resource_class = fakes.FakeResource(None, {}) + self.servers = mock.Mock() self.servers.resource_class = fakes.FakeResource(None, {}) + self.services = mock.Mock() self.services.resource_class = fakes.FakeResource(None, {}) + self.extensions = mock.Mock() self.extensions.resource_class = fakes.FakeResource(None, {}) + self.flavors = mock.Mock() self.flavors.resource_class = fakes.FakeResource(None, {}) + self.quotas = mock.Mock() self.quotas.resource_class = fakes.FakeResource(None, {}) + self.quota_classes = mock.Mock() self.quota_classes.resource_class = fakes.FakeResource(None, {}) + self.volumes = mock.Mock() self.volumes.resource_class = fakes.FakeResource(None, {}) + + self.hypervisors = mock.Mock() + self.hypervisors.resource_class = fakes.FakeResource(None, {}) + + self.security_groups = mock.Mock() + self.security_groups.resource_class = fakes.FakeResource(None, {}) + + self.security_group_rules = mock.Mock() + self.security_group_rules.resource_class = fakes.FakeResource(None, {}) + + self.floating_ips = mock.Mock() + self.floating_ips.resource_class = fakes.FakeResource(None, {}) + + self.networks = mock.Mock() + self.networks.resource_class = fakes.FakeResource(None, {}) + self.auth_token = kwargs['token'] + self.management_url = kwargs['endpoint'] @@ -138,6 +168,73 @@ class TestComputev2(utils.TestCommand): ) +class FakeHypervisor(object): + """Fake one or more hypervisor.""" + + @staticmethod + def create_one_hypervisor(attrs={}): + """Create a fake hypervisor. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + A FakeResource object, with id, hypervisor_hostname, and so on + """ + # Set default attributes. + hypervisor_info = { + 'id': 'hypervisor-id-' + uuid.uuid4().hex, + 'hypervisor_hostname': 'hypervisor-hostname-' + uuid.uuid4().hex, + 'status': 'enabled', + 'host_ip': '192.168.0.10', + 'cpu_info': { + 'aaa': 'aaa', + }, + 'free_disk_gb': 50, + 'hypervisor_version': 2004001, + 'disk_available_least': 50, + 'local_gb': 50, + 'free_ram_mb': 1024, + 'service': { + 'host': 'aaa', + 'disabled_reason': None, + 'id': 1, + }, + 'vcpus_used': 0, + 'hypervisor_type': 'QEMU', + 'local_gb_used': 0, + 'vcpus': 4, + 'memory_mb_used': 512, + 'memory_mb': 1024, + 'current_workload': 0, + 'state': 'up', + 'running_vms': 0, + } + + # Overwrite default attributes. + hypervisor_info.update(attrs) + + hypervisor = fakes.FakeResource(info=copy.deepcopy(hypervisor_info), + loaded=True) + return hypervisor + + @staticmethod + def create_hypervisors(attrs={}, count=2): + """Create multiple fake hypervisors. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of hypervisors to fake + :return: + A list of FakeResource objects faking the hypervisors + """ + hypervisors = [] + for i in range(0, count): + hypervisors.append(FakeHypervisor.create_one_hypervisor(attrs)) + + return hypervisors + + class FakeServer(object): """Fake one or more compute servers.""" @@ -289,3 +386,142 @@ class FakeFlavor(object): if flavors is None: flavors = FakeServer.create_flavors(count) return mock.MagicMock(side_effect=flavors) + + +class FakeAvailabilityZone(object): + """Fake one or more compute availability zones (AZs).""" + + @staticmethod + def create_one_availability_zone(attrs={}, methods={}): + """Create a fake AZ. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :return: + A FakeResource object with zoneName, zoneState, etc. + """ + # Set default attributes. + host_name = uuid.uuid4().hex + service_name = uuid.uuid4().hex + service_updated_at = uuid.uuid4().hex + availability_zone = { + 'zoneName': uuid.uuid4().hex, + 'zoneState': {'available': True}, + 'hosts': {host_name: {service_name: { + 'available': True, + 'active': True, + 'updated_at': service_updated_at, + }}}, + } + + # Overwrite default attributes. + availability_zone.update(attrs) + + availability_zone = fakes.FakeResource( + info=copy.deepcopy(availability_zone), + methods=methods, + loaded=True) + return availability_zone + + @staticmethod + def create_availability_zones(attrs={}, methods={}, count=2): + """Create multiple fake AZs. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :param int count: + The number of AZs to fake + :return: + A list of FakeResource objects faking the AZs + """ + availability_zones = [] + for i in range(0, count): + availability_zone = \ + FakeAvailabilityZone.create_one_availability_zone( + attrs, methods) + availability_zones.append(availability_zone) + + return availability_zones + + +class FakeFloatingIP(object): + """Fake one or more floating ip.""" + + @staticmethod + def create_one_floating_ip(attrs={}, methods={}): + """Create a fake floating ip. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :return: + A FakeResource object, with id, ip, and so on + """ + # Set default attributes. + floating_ip_attrs = { + 'id': 'floating-ip-id-' + uuid.uuid4().hex, + 'ip': '1.0.9.0', + 'fixed_ip': '2.0.9.0', + 'instance_id': 'server-id-' + uuid.uuid4().hex, + 'pool': 'public', + } + + # Overwrite default attributes. + floating_ip_attrs.update(attrs) + + # Set default methods. + floating_ip_methods = {} + + # Overwrite default methods. + floating_ip_methods.update(methods) + + floating_ip = fakes.FakeResource( + info=copy.deepcopy(floating_ip_attrs), + methods=copy.deepcopy(floating_ip_methods), + loaded=True) + return floating_ip + + @staticmethod + def create_floating_ips(attrs={}, methods={}, count=2): + """Create multiple fake floating ips. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :param int count: + The number of floating ips to fake + :return: + A list of FakeResource objects faking the floating ips + """ + floating_ips = [] + for i in range(0, count): + floating_ips.append(FakeFloatingIP.create_one_floating_ip( + attrs, + methods + )) + return floating_ips + + @staticmethod + def get_floating_ips(floating_ips=None, count=2): + """Get an iterable MagicMock object with a list of faked floating ips. + + If floating_ips list is provided, then initialize the Mock object + with the list. Otherwise create one. + + :param List floating ips: + A list of FakeResource objects faking floating ips + :param int count: + The number of floating ips to fake + :return: + An iterable Mock object with side_effect set to a list of faked + floating ips + """ + if floating_ips is None: + floating_ips = FakeFloatingIP.create_floating_ips(count) + return mock.MagicMock(side_effect=floating_ips) diff --git a/openstackclient/tests/compute/v2/test_flavor.py b/openstackclient/tests/compute/v2/test_flavor.py index 3a59020c..bf78bee8 100644 --- a/openstackclient/tests/compute/v2/test_flavor.py +++ b/openstackclient/tests/compute/v2/test_flavor.py @@ -126,7 +126,9 @@ class TestFlavorList(TestFlavor): parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -153,7 +155,9 @@ class TestFlavorList(TestFlavor): parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -180,7 +184,9 @@ class TestFlavorList(TestFlavor): parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -207,7 +213,9 @@ class TestFlavorList(TestFlavor): parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -234,7 +242,9 @@ class TestFlavorList(TestFlavor): parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values diff --git a/openstackclient/tests/compute/v2/test_hypervisor.py b/openstackclient/tests/compute/v2/test_hypervisor.py new file mode 100644 index 00000000..8d717ba7 --- /dev/null +++ b/openstackclient/tests/compute/v2/test_hypervisor.py @@ -0,0 +1,220 @@ +# Copyright 2016 EasyStack Corporation +# +# 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 copy + +from openstackclient.common import exceptions +from openstackclient.compute.v2 import hypervisor +from openstackclient.tests.compute.v2 import fakes as compute_fakes +from openstackclient.tests import fakes + + +class TestHypervisor(compute_fakes.TestComputev2): + + def setUp(self): + super(TestHypervisor, self).setUp() + + # Get a shortcut to the compute client hypervisors mock + self.hypervisors_mock = self.app.client_manager.compute.hypervisors + self.hypervisors_mock.reset_mock() + + # Get a shortcut to the compute client aggregates mock + self.aggregates_mock = self.app.client_manager.compute.aggregates + self.aggregates_mock.reset_mock() + + +class TestHypervisorList(TestHypervisor): + + def setUp(self): + super(TestHypervisorList, self).setUp() + + # Fake hypervisors to be listed up + self.hypervisors = compute_fakes.FakeHypervisor.create_hypervisors() + self.hypervisors_mock.list.return_value = self.hypervisors + + self.columns = ( + "ID", + "Hypervisor Hostname" + ) + self.data = ( + ( + self.hypervisors[0].id, + self.hypervisors[0].hypervisor_hostname, + ), + ( + self.hypervisors[1].id, + self.hypervisors[1].hypervisor_hostname, + ), + ) + + # Get the command object to test + self.cmd = hypervisor.ListHypervisor(self.app, None) + + def test_hypervisor_list_no_option(self): + arglist = [] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. + columns, data = self.cmd.take_action(parsed_args) + + self.hypervisors_mock.list.assert_called_with() + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, tuple(data)) + + def test_hypervisor_list_matching_option_found(self): + arglist = [ + '--matching', self.hypervisors[0].hypervisor_hostname, + ] + verifylist = [ + ('matching', self.hypervisors[0].hypervisor_hostname), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # Fake the return value of search() + self.hypervisors_mock.search.return_value = [self.hypervisors[0]] + self.data = ( + ( + self.hypervisors[0].id, + self.hypervisors[0].hypervisor_hostname, + ), + ) + + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. + columns, data = self.cmd.take_action(parsed_args) + + self.hypervisors_mock.search.assert_called_with( + self.hypervisors[0].hypervisor_hostname + ) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, tuple(data)) + + def test_hypervisor_list_matching_option_not_found(self): + arglist = [ + '--matching', 'xxx', + ] + verifylist = [ + ('matching', 'xxx'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # Fake exception raised from search() + self.hypervisors_mock.search.side_effect = exceptions.NotFound(None) + + self.assertRaises(exceptions.NotFound, + self.cmd.take_action, + parsed_args) + + +class TestHypervisorShow(TestHypervisor): + + def setUp(self): + super(TestHypervisorShow, self).setUp() + + # Fake hypervisors to be listed up + self.hypervisor = compute_fakes.FakeHypervisor.create_one_hypervisor() + + # Return value of utils.find_resource() + self.hypervisors_mock.get.return_value = self.hypervisor + + # Return value of compute_client.aggregates.list() + self.aggregates_mock.list.return_value = [] + + # Return value of compute_client.hypervisors.uptime() + uptime_info = { + 'status': self.hypervisor.status, + 'state': self.hypervisor.state, + 'id': self.hypervisor.id, + 'hypervisor_hostname': self.hypervisor.hypervisor_hostname, + 'uptime': ' 01:28:24 up 3 days, 11:15, 1 user, ' + ' load average: 0.94, 0.62, 0.50\n', + } + self.hypervisors_mock.uptime.return_value = fakes.FakeResource( + info=copy.deepcopy(uptime_info), + loaded=True + ) + + self.columns = ( + 'aggregates', + 'cpu_info', + 'current_workload', + 'disk_available_least', + 'free_disk_gb', + 'free_ram_mb', + 'host_ip', + 'hypervisor_hostname', + 'hypervisor_type', + 'hypervisor_version', + 'id', + 'local_gb', + 'local_gb_used', + 'memory_mb', + 'memory_mb_used', + 'running_vms', + 'service_host', + 'service_id', + 'state', + 'status', + 'vcpus', + 'vcpus_used', + ) + self.data = ( + [], + {'aaa': 'aaa'}, + 0, + 50, + 50, + 1024, + '192.168.0.10', + self.hypervisor.hypervisor_hostname, + 'QEMU', + 2004001, + self.hypervisor.id, + 50, + 0, + 1024, + 512, + 0, + 'aaa', + 1, + 'up', + 'enabled', + 4, + 0, + ) + + # Get the command object to test + self.cmd = hypervisor.ShowHypervisor(self.app, None) + + def test_hypervisor_show(self): + arglist = [ + self.hypervisor.hypervisor_hostname, + ] + verifylist = [ + ('hypervisor', self.hypervisor.hypervisor_hostname), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) diff --git a/openstackclient/tests/compute/v2/test_security_group.py b/openstackclient/tests/compute/v2/test_security_group.py index 87cc4870..c6998cb5 100644 --- a/openstackclient/tests/compute/v2/test_security_group.py +++ b/openstackclient/tests/compute/v2/test_security_group.py @@ -12,7 +12,6 @@ # import copy -import mock from openstackclient.compute.v2 import security_group from openstackclient.tests.compute.v2 import fakes as compute_fakes @@ -43,14 +42,12 @@ class TestSecurityGroup(compute_fakes.TestComputev2): def setUp(self): super(TestSecurityGroup, self).setUp() - self.secgroups_mock = mock.Mock() - self.secgroups_mock.resource_class = fakes.FakeResource(None, {}) - self.app.client_manager.compute.security_groups = self.secgroups_mock + # Get a shortcut compute client security_groups mock + self.secgroups_mock = self.app.client_manager.compute.security_groups self.secgroups_mock.reset_mock() - self.projects_mock = mock.Mock() - self.projects_mock.resource_class = fakes.FakeResource(None, {}) - self.app.client_manager.identity.projects = self.projects_mock + # Get a shortcut identity client projects mock + self.projects_mock = self.app.client_manager.identity.projects self.projects_mock.reset_mock() @@ -90,7 +87,9 @@ class TestSecurityGroupCreate(TestSecurityGroup): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # SecurityGroupManager.create(name, description) @@ -113,7 +112,9 @@ class TestSecurityGroupCreate(TestSecurityGroup): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # SecurityGroupManager.create(name, description) @@ -158,7 +159,9 @@ class TestSecurityGroupList(TestSecurityGroup): parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values diff --git a/openstackclient/tests/compute/v2/test_security_group_rule.py b/openstackclient/tests/compute/v2/test_security_group_rule.py index a2f9b108..9a8003f3 100644 --- a/openstackclient/tests/compute/v2/test_security_group_rule.py +++ b/openstackclient/tests/compute/v2/test_security_group_rule.py @@ -12,7 +12,6 @@ # import copy -import mock from openstackclient.compute.v2 import security_group from openstackclient.tests.compute.v2 import fakes as compute_fakes @@ -102,15 +101,13 @@ class TestSecurityGroupRule(compute_fakes.TestComputev2): def setUp(self): super(TestSecurityGroupRule, self).setUp() - self.secgroups_mock = mock.Mock() - self.secgroups_mock.resource_class = fakes.FakeResource(None, {}) - self.app.client_manager.compute.security_groups = self.secgroups_mock + # Get a shortcut compute client security_groups mock + self.secgroups_mock = self.app.client_manager.compute.security_groups self.secgroups_mock.reset_mock() - self.sg_rules_mock = mock.Mock() - self.sg_rules_mock.resource_class = fakes.FakeResource(None, {}) - self.app.client_manager.compute.security_group_rules = \ - self.sg_rules_mock + # Get a shortcut compute client security_group_rules mock + self.sg_rules_mock = \ + self.app.client_manager.compute.security_group_rules self.sg_rules_mock.reset_mock() @@ -152,7 +149,9 @@ class TestSecurityGroupRuleCreate(TestSecurityGroupRule): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # SecurityGroupManager.create(name, description) @@ -196,7 +195,9 @@ class TestSecurityGroupRuleCreate(TestSecurityGroupRule): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # SecurityGroupManager.create(name, description) @@ -244,7 +245,9 @@ class TestSecurityGroupRuleCreate(TestSecurityGroupRule): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # SecurityGroupManager.create(name, description) @@ -287,7 +290,9 @@ class TestSecurityGroupRuleCreate(TestSecurityGroupRule): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # SecurityGroupManager.create(name, description) @@ -333,7 +338,9 @@ class TestSecurityGroupRuleCreate(TestSecurityGroupRule): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # SecurityGroupManager.create(name, description) @@ -404,7 +411,9 @@ class TestSecurityGroupRuleList(TestSecurityGroupRule): parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) collist = ( @@ -440,7 +449,9 @@ class TestSecurityGroupRuleList(TestSecurityGroupRule): parsed_args = self.check_parser(self.cmd, [], []) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) collist = ( diff --git a/openstackclient/tests/compute/v2/test_server.py b/openstackclient/tests/compute/v2/test_server.py index f6b62291..95188522 100644 --- a/openstackclient/tests/compute/v2/test_server.py +++ b/openstackclient/tests/compute/v2/test_server.py @@ -79,7 +79,6 @@ class TestServer(compute_fakes.TestComputev2): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) for s in servers: @@ -144,11 +143,10 @@ class TestServerCreate(TestServer): verifylist = [ ('server_name', self.new_server.name), ] - try: - # Missing required args should bail here - self.check_parser(self.cmd, arglist, verifylist) - except utils.ParserException: - pass + + # Missing required args should bail here + self.assertRaises(utils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) def test_server_create_minimal(self): arglist = [ @@ -164,7 +162,9 @@ class TestServerCreate(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -242,7 +242,9 @@ class TestServerCreate(TestServer): self.app.client_manager.network.find_network = find_network self.app.client_manager.network.find_port = find_port - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -300,7 +302,9 @@ class TestServerCreate(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Ensure the userdata file is opened @@ -411,7 +415,6 @@ class TestServerDelete(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.servers_mock.delete.assert_called_with( @@ -431,7 +434,6 @@ class TestServerDelete(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) calls = [] @@ -451,7 +453,6 @@ class TestServerDelete(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.servers_mock.delete.assert_called_with( @@ -476,7 +477,6 @@ class TestServerDelete(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.assertRaises(SystemExit, self.cmd.take_action, parsed_args) self.servers_mock.delete.assert_called_with( @@ -490,6 +490,26 @@ class TestServerDelete(TestServer): ) +class TestServerDumpCreate(TestServer): + + def setUp(self): + super(TestServerDumpCreate, self).setUp() + + # Get the command object to test + self.cmd = server.CreateServerDump(self.app, None) + + # Set methods to be tested. + self.methods = { + 'trigger_crash_dump': None, + } + + def test_server_dump_one_server(self): + self.run_method_with_servers('trigger_crash_dump', 1) + + def test_server_dump_multi_servers(self): + self.run_method_with_servers('trigger_crash_dump', 3) + + class TestServerImageCreate(TestServer): columns = ( @@ -536,7 +556,9 @@ class TestServerImageCreate(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServerManager.create_image(server, image_name, metadata=) @@ -559,7 +581,9 @@ class TestServerImageCreate(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServerManager.create_image(server, image_name, metadata=) @@ -841,7 +865,6 @@ class TestServerResize(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.servers_mock.get.assert_called_with( @@ -865,7 +888,6 @@ class TestServerResize(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.servers_mock.get.assert_called_with( @@ -894,7 +916,6 @@ class TestServerResize(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.servers_mock.get.assert_called_with( @@ -919,7 +940,6 @@ class TestServerResize(TestServer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.servers_mock.get.assert_called_with( diff --git a/openstackclient/tests/compute/v2/test_service.py b/openstackclient/tests/compute/v2/test_service.py index 380fbc4f..54adaab3 100644 --- a/openstackclient/tests/compute/v2/test_service.py +++ b/openstackclient/tests/compute/v2/test_service.py @@ -49,7 +49,6 @@ class TestServiceDelete(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.service_mock.delete.assert_called_with( @@ -82,7 +81,9 @@ class TestServiceList(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. self.cmd.take_action(parsed_args) self.service_mock.list.assert_called_with( diff --git a/openstackclient/tests/identity/v2_0/test_catalog.py b/openstackclient/tests/identity/v2_0/test_catalog.py index ff1d993e..1e27bb3c 100644 --- a/openstackclient/tests/identity/v2_0/test_catalog.py +++ b/openstackclient/tests/identity/v2_0/test_catalog.py @@ -72,7 +72,9 @@ class TestCatalogList(TestCatalog): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.sc_mock.service_catalog.get_data.assert_called_with() @@ -114,7 +116,9 @@ class TestCatalogList(TestCatalog): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.sc_mock.service_catalog.get_data.assert_called_with() @@ -146,7 +150,9 @@ class TestCatalogShow(TestCatalog): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.sc_mock.service_catalog.get_data.assert_called_with() diff --git a/openstackclient/tests/identity/v2_0/test_endpoint.py b/openstackclient/tests/identity/v2_0/test_endpoint.py index 354b1e40..088fdcd1 100644 --- a/openstackclient/tests/identity/v2_0/test_endpoint.py +++ b/openstackclient/tests/identity/v2_0/test_endpoint.py @@ -69,7 +69,9 @@ class TestEndpointCreate(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # EndpointManager.create(region, service_id, publicurl, adminurl, @@ -130,7 +132,6 @@ class TestEndpointDelete(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.endpoints_mock.delete.assert_called_with( @@ -165,7 +166,9 @@ class TestEndpointList(TestEndpoint): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.endpoints_mock.list.assert_called_with() @@ -189,7 +192,9 @@ class TestEndpointList(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.endpoints_mock.list.assert_called_with() @@ -240,7 +245,9 @@ class TestEndpointShow(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # EndpointManager.list() diff --git a/openstackclient/tests/identity/v2_0/test_project.py b/openstackclient/tests/identity/v2_0/test_project.py index 69b29268..669c3eab 100644 --- a/openstackclient/tests/identity/v2_0/test_project.py +++ b/openstackclient/tests/identity/v2_0/test_project.py @@ -70,7 +70,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -96,7 +98,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -124,7 +128,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -152,7 +158,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -180,7 +188,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -221,7 +231,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ProjectManager.create(name, description, enabled) @@ -251,7 +263,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -322,7 +336,9 @@ class TestProjectList(TestProject): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.projects_mock.list.assert_called_with() @@ -343,7 +359,9 @@ class TestProjectList(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.projects_mock.list.assert_called_with() @@ -549,7 +567,9 @@ class TestProjectShow(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.projects_mock.get.assert_called_with( identity_fakes.project_id, diff --git a/openstackclient/tests/identity/v2_0/test_role.py b/openstackclient/tests/identity/v2_0/test_role.py index c2bacc52..03b7f924 100644 --- a/openstackclient/tests/identity/v2_0/test_role.py +++ b/openstackclient/tests/identity/v2_0/test_role.py @@ -86,7 +86,9 @@ class TestRoleAdd(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # RoleManager.add_user_role(user, role, tenant=None) @@ -137,7 +139,9 @@ class TestRoleCreate(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # RoleManager.create(name) @@ -171,7 +175,9 @@ class TestRoleCreate(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # RoleManager.get(name, description, enabled) @@ -196,7 +202,9 @@ class TestRoleCreate(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # RoleManager.create(name) @@ -232,7 +240,6 @@ class TestRoleDelete(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.roles_mock.delete.assert_called_with( @@ -261,7 +268,9 @@ class TestRoleList(TestRole): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.roles_mock.list.assert_called_with() @@ -331,7 +340,9 @@ class TestUserRoleList(TestRole): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.roles_mock.roles_for_user.assert_called_with( @@ -388,7 +399,9 @@ class TestUserRoleList(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.roles_mock.roles_for_user.assert_called_with( @@ -446,7 +459,6 @@ class TestRoleRemove(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # RoleManager.remove_user_role(user, role, tenant=None) @@ -480,7 +492,9 @@ class TestRoleShow(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # RoleManager.get(role) diff --git a/openstackclient/tests/identity/v2_0/test_service.py b/openstackclient/tests/identity/v2_0/test_service.py index b97786b4..606b1433 100644 --- a/openstackclient/tests/identity/v2_0/test_service.py +++ b/openstackclient/tests/identity/v2_0/test_service.py @@ -69,7 +69,9 @@ class TestServiceCreate(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.create(name, service_type, description) @@ -95,7 +97,9 @@ class TestServiceCreate(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.create(name, service_type, description) @@ -121,7 +125,9 @@ class TestServiceCreate(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.create(name, service_type, description) @@ -148,7 +154,9 @@ class TestServiceCreate(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.create(name, service_type, description) @@ -186,7 +194,6 @@ class TestServiceDelete(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.services_mock.delete.assert_called_with( @@ -215,7 +222,9 @@ class TestServiceList(TestService): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.services_mock.list.assert_called_with() @@ -238,7 +247,9 @@ class TestServiceList(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.services_mock.list.assert_called_with() @@ -277,7 +288,9 @@ class TestServiceShow(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.get(id) diff --git a/openstackclient/tests/identity/v2_0/test_token.py b/openstackclient/tests/identity/v2_0/test_token.py index ce2faef3..7687a063 100644 --- a/openstackclient/tests/identity/v2_0/test_token.py +++ b/openstackclient/tests/identity/v2_0/test_token.py @@ -43,7 +43,9 @@ class TestTokenIssue(TestToken): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.sc_mock.get_token.assert_called_with() diff --git a/openstackclient/tests/identity/v2_0/test_user.py b/openstackclient/tests/identity/v2_0/test_user.py index a25def87..a7332e63 100644 --- a/openstackclient/tests/identity/v2_0/test_user.py +++ b/openstackclient/tests/identity/v2_0/test_user.py @@ -83,7 +83,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -114,7 +116,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -143,7 +147,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. mocker = mock.Mock() mocker.return_value = 'abc123' with mock.patch("openstackclient.common.utils.get_password", mocker): @@ -176,7 +182,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -221,7 +229,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -259,7 +269,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -290,7 +302,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -332,7 +346,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # UserManager.create(name, password, email, tenant_id=, enabled=) @@ -352,7 +368,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -396,7 +414,6 @@ class TestUserDelete(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.users_mock.delete.assert_called_with( @@ -449,7 +466,9 @@ class TestUserList(TestUser): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.users_mock.list.assert_called_with(tenant_id=None) @@ -467,7 +486,9 @@ class TestUserList(TestUser): parsed_args = self.check_parser(self.cmd, arglist, verifylist) project_id = identity_fakes.PROJECT_2['id'] - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.users_mock.list.assert_called_with(tenant_id=project_id) @@ -484,7 +505,9 @@ class TestUserList(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.users_mock.list.assert_called_with(tenant_id=None) @@ -554,7 +577,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -585,7 +607,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # UserManager.update_password(user, password) @@ -611,7 +632,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples mocker = mock.Mock() mocker.return_value = 'abc123' with mock.patch("openstackclient.common.utils.get_password", mocker): @@ -639,7 +659,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -669,7 +688,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # UserManager.update_tenant(user, tenant) @@ -694,7 +712,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -723,7 +740,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -760,7 +776,9 @@ class TestUserShow(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.users_mock.get.assert_called_with(identity_fakes.user_id) diff --git a/openstackclient/tests/identity/v3/fakes.py b/openstackclient/tests/identity/v3/fakes.py index 59b08973..a06802c5 100644 --- a/openstackclient/tests/identity/v3/fakes.py +++ b/openstackclient/tests/identity/v3/fakes.py @@ -449,6 +449,8 @@ class FakeIdentityv3Client(object): self.session = mock.Mock() self.session.auth.auth_ref.service_catalog.resource_class = \ fakes.FakeResource(None, {}) + self.tokens = mock.Mock() + self.tokens.resource_class = fakes.FakeResource(None, {}) self.trusts = mock.Mock() self.trusts.resource_class = fakes.FakeResource(None, {}) self.users = mock.Mock() diff --git a/openstackclient/tests/identity/v3/test_catalog.py b/openstackclient/tests/identity/v3/test_catalog.py index 6bb962de..a03c9d3e 100644 --- a/openstackclient/tests/identity/v3/test_catalog.py +++ b/openstackclient/tests/identity/v3/test_catalog.py @@ -68,7 +68,9 @@ class TestCatalogList(TestCatalog): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.sc_mock.service_catalog.get_data.assert_called_with() @@ -101,7 +103,9 @@ class TestCatalogShow(TestCatalog): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.sc_mock.service_catalog.get_data.assert_called_with() diff --git a/openstackclient/tests/identity/v3/test_consumer.py b/openstackclient/tests/identity/v3/test_consumer.py index 4e807562..7f6af734 100644 --- a/openstackclient/tests/identity/v3/test_consumer.py +++ b/openstackclient/tests/identity/v3/test_consumer.py @@ -121,7 +121,9 @@ class TestConsumerList(TestOAuth1): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.consumers_mock.list.assert_called_with() diff --git a/openstackclient/tests/identity/v3/test_domain.py b/openstackclient/tests/identity/v3/test_domain.py index 969c2df7..9de6b26a 100644 --- a/openstackclient/tests/identity/v3/test_domain.py +++ b/openstackclient/tests/identity/v3/test_domain.py @@ -63,7 +63,9 @@ class TestDomainCreate(TestDomain): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -90,7 +92,9 @@ class TestDomainCreate(TestDomain): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -117,7 +121,9 @@ class TestDomainCreate(TestDomain): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -144,7 +150,9 @@ class TestDomainCreate(TestDomain): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -215,7 +223,9 @@ class TestDomainList(TestDomain): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.domains_mock.list.assert_called_with() @@ -380,7 +390,9 @@ class TestDomainShow(TestDomain): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.domains_mock.get.assert_called_with( identity_fakes.domain_id, diff --git a/openstackclient/tests/identity/v3/test_endpoint.py b/openstackclient/tests/identity/v3/test_endpoint.py index fb88e004..1c481930 100644 --- a/openstackclient/tests/identity/v3/test_endpoint.py +++ b/openstackclient/tests/identity/v3/test_endpoint.py @@ -81,7 +81,9 @@ class TestEndpointCreate(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -126,7 +128,9 @@ class TestEndpointCreate(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -170,7 +174,9 @@ class TestEndpointCreate(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -214,7 +220,9 @@ class TestEndpointCreate(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -315,7 +323,9 @@ class TestEndpointList(TestEndpoint): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.endpoints_mock.list.assert_called_with() @@ -342,7 +352,9 @@ class TestEndpointList(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -374,7 +386,9 @@ class TestEndpointList(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -406,7 +420,9 @@ class TestEndpointList(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -665,7 +681,9 @@ class TestEndpointShow(TestEndpoint): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.endpoints_mock.get.assert_called_with( identity_fakes.endpoint_id, diff --git a/openstackclient/tests/identity/v3/test_group.py b/openstackclient/tests/identity/v3/test_group.py index 59a36819..c5f5dbca 100644 --- a/openstackclient/tests/identity/v3/test_group.py +++ b/openstackclient/tests/identity/v3/test_group.py @@ -85,7 +85,9 @@ class TestGroupList(TestGroup): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -110,7 +112,9 @@ class TestGroupList(TestGroup): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -135,7 +139,9 @@ class TestGroupList(TestGroup): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -160,7 +166,9 @@ class TestGroupList(TestGroup): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values diff --git a/openstackclient/tests/identity/v3/test_identity_provider.py b/openstackclient/tests/identity/v3/test_identity_provider.py index 50a922b8..75911510 100644 --- a/openstackclient/tests/identity/v3/test_identity_provider.py +++ b/openstackclient/tests/identity/v3/test_identity_provider.py @@ -290,7 +290,9 @@ class TestIdentityProviderList(TestIdentityProvider): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.identity_providers_mock.list.assert_called_with() diff --git a/openstackclient/tests/identity/v3/test_project.py b/openstackclient/tests/identity/v3/test_project.py index 36540201..b834e943 100644 --- a/openstackclient/tests/identity/v3/test_project.py +++ b/openstackclient/tests/identity/v3/test_project.py @@ -83,7 +83,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -125,7 +127,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -159,7 +163,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -225,7 +231,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -258,7 +266,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -290,7 +300,9 @@ class TestProjectCreate(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -464,7 +476,9 @@ class TestProjectList(TestProject): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.projects_mock.list.assert_called_with() @@ -480,7 +494,9 @@ class TestProjectList(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.projects_mock.list.assert_called_with() @@ -511,7 +527,9 @@ class TestProjectList(TestProject): parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.projects_mock.list.assert_called_with( domain=identity_fakes.domain_id) @@ -737,7 +755,9 @@ class TestProjectShow(TestProject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.projects_mock.get.assert_called_with( identity_fakes.project_id, diff --git a/openstackclient/tests/identity/v3/test_region.py b/openstackclient/tests/identity/v3/test_region.py index 9ac9ddf8..f5f50793 100644 --- a/openstackclient/tests/identity/v3/test_region.py +++ b/openstackclient/tests/identity/v3/test_region.py @@ -64,7 +64,9 @@ class TestRegionCreate(TestRegion): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -89,7 +91,9 @@ class TestRegionCreate(TestRegion): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -116,7 +120,9 @@ class TestRegionCreate(TestRegion): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -193,7 +199,9 @@ class TestRegionList(TestRegion): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.regions_mock.list.assert_called_with() @@ -209,7 +217,9 @@ class TestRegionList(TestRegion): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.regions_mock.list.assert_called_with( parent_region_id=identity_fakes.region_parent_region_id) @@ -316,7 +326,9 @@ class TestRegionShow(TestRegion): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.regions_mock.get.assert_called_with( identity_fakes.region_id, diff --git a/openstackclient/tests/identity/v3/test_role.py b/openstackclient/tests/identity/v3/test_role.py index 1910c874..f3661324 100644 --- a/openstackclient/tests/identity/v3/test_role.py +++ b/openstackclient/tests/identity/v3/test_role.py @@ -258,7 +258,9 @@ class TestRoleCreate(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -304,7 +306,6 @@ class TestRoleDelete(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.roles_mock.delete.assert_called_with( @@ -365,7 +366,9 @@ class TestRoleList(TestRole): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.roles_mock.list.assert_called_with() @@ -384,7 +387,9 @@ class TestRoleList(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -410,7 +415,9 @@ class TestRoleList(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -438,7 +445,9 @@ class TestRoleList(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -473,7 +482,9 @@ class TestRoleList(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -508,7 +519,9 @@ class TestRoleList(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -543,7 +556,9 @@ class TestRoleList(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -625,7 +640,6 @@ class TestRoleRemove(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -658,7 +672,6 @@ class TestRoleRemove(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -692,7 +705,6 @@ class TestRoleRemove(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -725,7 +737,6 @@ class TestRoleRemove(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -767,7 +778,6 @@ class TestRoleSet(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -804,7 +814,9 @@ class TestRoleShow(TestRole): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # RoleManager.get(role) diff --git a/openstackclient/tests/identity/v3/test_role_assignment.py b/openstackclient/tests/identity/v3/test_role_assignment.py index 067a9537..5def7632 100644 --- a/openstackclient/tests/identity/v3/test_role_assignment.py +++ b/openstackclient/tests/identity/v3/test_role_assignment.py @@ -86,7 +86,9 @@ class TestRoleAssignmentList(TestRoleAssignment): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.role_assignments_mock.list.assert_called_with( @@ -148,7 +150,9 @@ class TestRoleAssignmentList(TestRoleAssignment): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.role_assignments_mock.list.assert_called_with( @@ -210,7 +214,9 @@ class TestRoleAssignmentList(TestRoleAssignment): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.role_assignments_mock.list.assert_called_with( @@ -272,7 +278,9 @@ class TestRoleAssignmentList(TestRoleAssignment): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.role_assignments_mock.list.assert_called_with( @@ -334,7 +342,9 @@ class TestRoleAssignmentList(TestRoleAssignment): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.role_assignments_mock.list.assert_called_with( @@ -394,7 +404,9 @@ class TestRoleAssignmentList(TestRoleAssignment): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.role_assignments_mock.list.assert_called_with( @@ -456,7 +468,9 @@ class TestRoleAssignmentList(TestRoleAssignment): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.role_assignments_mock.list.assert_called_with( diff --git a/openstackclient/tests/identity/v3/test_service.py b/openstackclient/tests/identity/v3/test_service.py index c609142c..2bc5927f 100644 --- a/openstackclient/tests/identity/v3/test_service.py +++ b/openstackclient/tests/identity/v3/test_service.py @@ -73,7 +73,9 @@ class TestServiceCreate(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.create(name=, type=, enabled=, **kwargs) @@ -101,7 +103,9 @@ class TestServiceCreate(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.create(name=, type=, enabled=, **kwargs) @@ -129,7 +133,9 @@ class TestServiceCreate(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.create(name=, type=, enabled=, **kwargs) @@ -157,7 +163,9 @@ class TestServiceCreate(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.create(name=, type=, enabled=, **kwargs) @@ -225,7 +233,9 @@ class TestServiceList(TestService): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.services_mock.list.assert_called_with() @@ -248,7 +258,9 @@ class TestServiceList(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.services_mock.list.assert_called_with() @@ -465,7 +477,9 @@ class TestServiceShow(TestService): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ServiceManager.get(id) diff --git a/openstackclient/tests/identity/v3/test_service_provider.py b/openstackclient/tests/identity/v3/test_service_provider.py index 24fa7c7b..fb7576f1 100644 --- a/openstackclient/tests/identity/v3/test_service_provider.py +++ b/openstackclient/tests/identity/v3/test_service_provider.py @@ -220,7 +220,9 @@ class TestServiceProviderList(TestServiceProvider): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.service_providers_mock.list.assert_called_with() diff --git a/openstackclient/tests/identity/v3/test_token.py b/openstackclient/tests/identity/v3/test_token.py index 6ad4845d..b051aacb 100644 --- a/openstackclient/tests/identity/v3/test_token.py +++ b/openstackclient/tests/identity/v3/test_token.py @@ -44,7 +44,9 @@ class TestTokenIssue(TestToken): self.sc_mock.get_token.return_value = \ identity_fakes.TOKEN_WITH_PROJECT_ID - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.sc_mock.get_token.assert_called_with() @@ -66,7 +68,9 @@ class TestTokenIssue(TestToken): self.sc_mock.get_token.return_value = \ identity_fakes.TOKEN_WITH_DOMAIN_ID - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.sc_mock.get_token.assert_called_with() @@ -80,3 +84,24 @@ class TestTokenIssue(TestToken): identity_fakes.user_id, ) self.assertEqual(datalist, data) + + +class TestTokenRevoke(TestToken): + + TOKEN = 'fob' + + def setUp(self): + super(TestTokenRevoke, self).setUp() + self.tokens_mock = self.app.client_manager.identity.tokens + self.tokens_mock.reset_mock() + self.tokens_mock.revoke_token.return_value = True + self.cmd = token.RevokeToken(self.app, None) + + def test_token_revoke(self): + arglist = [self.TOKEN] + verifylist = [('token', self.TOKEN)] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + self.tokens_mock.revoke_token.assert_called_with(self.TOKEN) diff --git a/openstackclient/tests/identity/v3/test_trust.py b/openstackclient/tests/identity/v3/test_trust.py index b90e7815..2a748872 100644 --- a/openstackclient/tests/identity/v3/test_trust.py +++ b/openstackclient/tests/identity/v3/test_trust.py @@ -81,7 +81,9 @@ class TestTrustCreate(TestTrust): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -167,7 +169,9 @@ class TestTrustList(TestTrust): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.trusts_mock.list.assert_called_with() @@ -209,7 +213,9 @@ class TestTrustShow(TestTrust): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.trusts_mock.get.assert_called_with(identity_fakes.trust_id) diff --git a/openstackclient/tests/identity/v3/test_unscoped_saml.py b/openstackclient/tests/identity/v3/test_unscoped_saml.py index 6a799094..c2f14493 100644 --- a/openstackclient/tests/identity/v3/test_unscoped_saml.py +++ b/openstackclient/tests/identity/v3/test_unscoped_saml.py @@ -52,7 +52,9 @@ class TestProjectList(TestUnscopedSAML): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.projects_mock.list.assert_called_with() @@ -101,7 +103,9 @@ class TestDomainList(TestUnscopedSAML): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.domains_mock.list.assert_called_with() diff --git a/openstackclient/tests/identity/v3/test_user.py b/openstackclient/tests/identity/v3/test_user.py index 1871ed18..3757c5f8 100644 --- a/openstackclient/tests/identity/v3/test_user.py +++ b/openstackclient/tests/identity/v3/test_user.py @@ -104,7 +104,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -141,7 +143,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -176,7 +180,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. mocker = mock.Mock() mocker.return_value = 'abc123' with mock.patch("openstackclient.common.utils.get_password", mocker): @@ -214,7 +220,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -264,7 +272,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -324,7 +334,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -367,7 +379,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -401,7 +415,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -435,7 +451,9 @@ class TestUserCreate(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -481,7 +499,6 @@ class TestUserDelete(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.users_mock.delete.assert_called_with( @@ -553,7 +570,9 @@ class TestUserList(TestUser): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -578,7 +597,9 @@ class TestUserList(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -603,7 +624,9 @@ class TestUserList(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -628,7 +651,9 @@ class TestUserList(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -673,7 +698,9 @@ class TestUserList(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) kwargs = { @@ -746,7 +773,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -778,7 +804,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -810,7 +835,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples mocker = mock.Mock() mocker.return_value = 'abc123' with mock.patch("openstackclient.common.utils.get_password", mocker): @@ -844,7 +868,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -875,7 +898,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -908,7 +930,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -939,7 +960,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -969,7 +989,6 @@ class TestUserSet(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -1072,7 +1091,9 @@ class TestUserShow(TestUser): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.users_mock.get.assert_called_with(identity_fakes.user_id) diff --git a/openstackclient/tests/image/v1/test_image.py b/openstackclient/tests/image/v1/test_image.py index 60b7f309..201105a4 100644 --- a/openstackclient/tests/image/v1/test_image.py +++ b/openstackclient/tests/image/v1/test_image.py @@ -73,7 +73,9 @@ class TestImageCreate(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ImageManager.create(name=, **) @@ -120,7 +122,9 @@ class TestImageCreate(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ImageManager.create(name=, **) @@ -172,7 +176,9 @@ class TestImageCreate(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Ensure input file is opened @@ -230,7 +236,6 @@ class TestImageDelete(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.images_mock.delete.assert_called_with( @@ -240,6 +245,19 @@ class TestImageDelete(TestImage): class TestImageList(TestImage): + columns = ( + 'ID', + 'Name', + 'Status', + ) + datalist = ( + ( + image_fakes.image_id, + image_fakes.image_name, + '', + ), + ) + def setUp(self): super(TestImageList, self).setUp() @@ -261,22 +279,17 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.api_mock.image_list.assert_called_with( detailed=True, marker=image_fakes.image_id, ) - collist = ('ID', 'Name', 'Status') - - self.assertEqual(collist, columns) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_image_list_public_option(self): arglist = [ @@ -289,7 +302,9 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.api_mock.image_list.assert_called_with( detailed=True, @@ -297,15 +312,8 @@ class TestImageList(TestImage): marker=image_fakes.image_id, ) - collist = ('ID', 'Name', 'Status') - - self.assertEqual(collist, columns) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_image_list_private_option(self): arglist = [ @@ -318,7 +326,9 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.api_mock.image_list.assert_called_with( detailed=True, @@ -326,15 +336,8 @@ class TestImageList(TestImage): marker=image_fakes.image_id, ) - collist = ('ID', 'Name', 'Status') - - self.assertEqual(collist, columns) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_image_list_long_option(self): arglist = [ @@ -345,7 +348,9 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.api_mock.image_list.assert_called_with( detailed=True, @@ -394,7 +399,9 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.api_mock.image_list.assert_called_with( detailed=True, @@ -407,15 +414,8 @@ class TestImageList(TestImage): property_field='properties', ) - collist = ('ID', 'Name', 'Status') - - self.assertEqual(columns, collist) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) @mock.patch('openstackclient.common.utils.sort_items') def test_image_list_sort_option(self, si_mock): @@ -427,7 +427,9 @@ class TestImageList(TestImage): verifylist = [('sort', 'name:asc')] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.api_mock.image_list.assert_called_with( detailed=True, @@ -438,15 +440,8 @@ class TestImageList(TestImage): 'name:asc' ) - collist = ('ID', 'Name', 'Status') - - self.assertEqual(collist, columns) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) class TestImageSet(TestImage): @@ -478,7 +473,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Verify update() was not called, if it was show the args @@ -539,7 +533,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -567,7 +560,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -592,7 +584,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -691,7 +682,9 @@ class TestImageShow(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.images_mock.get.assert_called_with( image_fakes.image_id, diff --git a/openstackclient/tests/image/v2/test_image.py b/openstackclient/tests/image/v2/test_image.py index 3534a3a4..de37512f 100644 --- a/openstackclient/tests/image/v2/test_image.py +++ b/openstackclient/tests/image/v2/test_image.py @@ -31,11 +31,13 @@ class TestImage(image_fakes.TestImagev2): def setUp(self): super(TestImage, self).setUp() - # Get a shortcut to the ServerManager Mock + # Get shortcuts to the Mocks in image client self.images_mock = self.app.client_manager.image.images self.images_mock.reset_mock() self.image_members_mock = self.app.client_manager.image.image_members self.image_members_mock.reset_mock() + + # Get shortcut to the Mocks in identity client self.project_mock = self.app.client_manager.identity.projects self.project_mock.reset_mock() self.domain_mock = self.app.client_manager.identity.domains @@ -93,7 +95,9 @@ class TestImageCreate(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ImageManager.create(name=, **) @@ -154,7 +158,9 @@ class TestImageCreate(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ImageManager.create(name=, **) @@ -286,7 +292,9 @@ class TestImageCreate(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # ImageManager.create(name=, **) @@ -333,6 +341,17 @@ class TestImageCreate(TestImage): class TestAddProjectToImage(TestImage): + columns = ( + 'image_id', + 'member_id', + 'status', + ) + datalist = ( + image_fakes.image_id, + identity_fakes.project_id, + image_fakes.member_status, + ) + def setUp(self): super(TestAddProjectToImage, self).setUp() @@ -369,20 +388,16 @@ class TestAddProjectToImage(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.image_members_mock.create.assert_called_with( image_fakes.image_id, identity_fakes.project_id ) - collist = ('image_id', 'member_id', 'status') - self.assertEqual(collist, columns) - datalist = ( - image_fakes.image_id, - identity_fakes.project_id, - image_fakes.member_status - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_add_project_to_image_with_option(self): arglist = [ @@ -397,20 +412,16 @@ class TestAddProjectToImage(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.image_members_mock.create.assert_called_with( image_fakes.image_id, identity_fakes.project_id ) - collist = ('image_id', 'member_id', 'status') - self.assertEqual(collist, columns) - datalist = ( - image_fakes.image_id, - identity_fakes.project_id, - image_fakes.member_status - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) class TestImageDelete(TestImage): @@ -434,7 +445,6 @@ class TestImageDelete(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.images_mock.delete.assert_called_with( @@ -460,6 +470,19 @@ class TestImageDelete(TestImage): class TestImageList(TestImage): + columns = ( + 'ID', + 'Name', + 'Status', + ) + datalist = ( + ( + image_fakes.image_id, + image_fakes.image_name, + '', + ), + ) + def setUp(self): super(TestImageList, self).setUp() @@ -482,21 +505,14 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - marker=image_fakes.image_id, - ) - - collist = ('ID', 'Name', 'Status') + self.api_mock.image_list.assert_called_with() - self.assertEqual(collist, columns) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_image_list_public_option(self): arglist = [ @@ -510,22 +526,16 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.api_mock.image_list.assert_called_with( public=True, - marker=image_fakes.image_id, ) - collist = ('ID', 'Name', 'Status') - - self.assertEqual(collist, columns) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_image_list_private_option(self): arglist = [ @@ -539,22 +549,16 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.api_mock.image_list.assert_called_with( private=True, - marker=image_fakes.image_id, ) - collist = ('ID', 'Name', 'Status') - - self.assertEqual(collist, columns) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_image_list_shared_option(self): arglist = [ @@ -568,22 +572,16 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.api_mock.image_list.assert_called_with( shared=True, - marker=image_fakes.image_id, ) - collist = ('ID', 'Name', 'Status') - - self.assertEqual(columns, collist) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_image_list_long_option(self): arglist = [ @@ -594,11 +592,11 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - marker=image_fakes.image_id, - ) + self.api_mock.image_list.assert_called_with() collist = ( 'ID', @@ -642,11 +640,11 @@ class TestImageList(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - marker=image_fakes.image_id, - ) + self.api_mock.image_list.assert_called_with() sf_mock.assert_called_with( [image_fakes.IMAGE], attr='a', @@ -654,15 +652,8 @@ class TestImageList(TestImage): property_field='properties', ) - collist = ('ID', 'Name', 'Status') - - self.assertEqual(columns, collist) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) @mock.patch('openstackclient.common.utils.sort_items') def test_image_list_sort_option(self, si_mock): @@ -674,25 +665,56 @@ class TestImageList(TestImage): verifylist = [('sort', 'name:asc')] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) - self.api_mock.image_list.assert_called_with( - marker=image_fakes.image_id, - ) + self.api_mock.image_list.assert_called_with() si_mock.assert_called_with( [image_fakes.IMAGE], 'name:asc' ) - collist = ('ID', 'Name', 'Status') + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) - self.assertEqual(collist, columns) - datalist = (( - image_fakes.image_id, - image_fakes.image_name, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + def test_image_list_limit_option(self): + arglist = [ + '--limit', str(1), + ] + verifylist = [ + ('limit', 1), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + self.api_mock.image_list.assert_called_with( + limit=1, + ) + + self.assertEqual(self.columns, columns) + self.assertEqual(len(self.datalist), len(tuple(data))) + + @mock.patch('openstackclient.common.utils.find_resource') + def test_image_list_marker_option(self, fr_mock): + # tangchen: Since image_fakes.IMAGE is a dict, it cannot offer a .id + # operation. Will fix this by using FakeImage class instead + # of IMAGE dict. + fr_mock.return_value = mock.Mock() + fr_mock.return_value.id = image_fakes.image_id + + arglist = [ + '--marker', image_fakes.image_name, + ] + verifylist = [ + ('marker', image_fakes.image_name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + self.api_mock.image_list.assert_called_with( + marker=image_fakes.image_id, + ) class TestRemoveProjectImage(TestImage): @@ -731,7 +753,6 @@ class TestRemoveProjectImage(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.image_members_mock.delete.assert_called_with( image_fakes.image_id, @@ -751,7 +772,6 @@ class TestRemoveProjectImage(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) self.image_members_mock.delete.assert_called_with( image_fakes.image_id, @@ -809,7 +829,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -877,7 +896,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -905,7 +923,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -930,7 +947,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -964,7 +980,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -992,7 +1007,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -1016,7 +1030,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -1045,7 +1058,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -1076,7 +1088,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -1102,7 +1113,6 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) kwargs = { @@ -1156,7 +1166,9 @@ class TestImageShow(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.images_mock.get.assert_called_with( image_fakes.image_id, diff --git a/openstackclient/tests/network/test_common.py b/openstackclient/tests/network/test_common.py new file mode 100644 index 00000000..4700c66a --- /dev/null +++ b/openstackclient/tests/network/test_common.py @@ -0,0 +1,167 @@ +# 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 +import mock + +from openstackclient.network import common +from openstackclient.tests import utils + + +def _add_common_argument(parser): + parser.add_argument( + 'common', + metavar='<common>', + help='Common argument', + ) + return parser + + +def _add_network_argument(parser): + parser.add_argument( + 'network', + metavar='<network>', + help='Network argument', + ) + return parser + + +def _add_compute_argument(parser): + parser.add_argument( + 'compute', + metavar='<compute>', + help='Compute argument', + ) + return parser + + +class FakeNetworkAndComputeCommand(common.NetworkAndComputeCommand): + def update_parser_common(self, parser): + return _add_common_argument(parser) + + def update_parser_network(self, parser): + return _add_network_argument(parser) + + def update_parser_compute(self, parser): + return _add_compute_argument(parser) + + def take_action_network(self, client, parsed_args): + return client.network_action(parsed_args) + + def take_action_compute(self, client, parsed_args): + return client.compute_action(parsed_args) + + +class FakeNetworkAndComputeLister(common.NetworkAndComputeLister): + def update_parser_common(self, parser): + return _add_common_argument(parser) + + def update_parser_network(self, parser): + return _add_network_argument(parser) + + def update_parser_compute(self, parser): + return _add_compute_argument(parser) + + def take_action_network(self, client, parsed_args): + return client.network_action(parsed_args) + + def take_action_compute(self, client, parsed_args): + return client.compute_action(parsed_args) + + +class FakeNetworkAndComputeShowOne(common.NetworkAndComputeShowOne): + def update_parser_common(self, parser): + return _add_common_argument(parser) + + def update_parser_network(self, parser): + return _add_network_argument(parser) + + def update_parser_compute(self, parser): + return _add_compute_argument(parser) + + def take_action_network(self, client, parsed_args): + return client.network_action(parsed_args) + + def take_action_compute(self, client, parsed_args): + return client.compute_action(parsed_args) + + +class TestNetworkAndCompute(utils.TestCommand): + def setUp(self): + super(TestNetworkAndCompute, self).setUp() + + self.namespace = argparse.Namespace() + + # Create network client mocks. + self.app.client_manager.network = mock.Mock() + self.network = self.app.client_manager.network + self.network.network_action = mock.Mock( + return_value='take_action_network') + + # Create compute client mocks. + self.app.client_manager.compute = mock.Mock() + self.compute = self.app.client_manager.compute + self.compute.compute_action = mock.Mock( + return_value='take_action_compute') + + # Subclasses can override the command object to test. + self.cmd = FakeNetworkAndComputeCommand(self.app, self.namespace) + + def test_take_action_network(self): + arglist = [ + 'common', + 'network' + ] + verifylist = [ + ('common', 'common'), + ('network', 'network') + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + self.network.network_action.assert_called_with(parsed_args) + self.assertEqual('take_action_network', result) + + def test_take_action_compute(self): + arglist = [ + 'common', + 'compute' + ] + verifylist = [ + ('common', 'common'), + ('compute', 'compute') + ] + + self.app.client_manager.network_endpoint_enabled = False + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + self.compute.compute_action.assert_called_with(parsed_args) + self.assertEqual('take_action_compute', result) + + +class TestNetworkAndComputeCommand(TestNetworkAndCompute): + def setUp(self): + super(TestNetworkAndComputeCommand, self).setUp() + self.cmd = FakeNetworkAndComputeCommand(self.app, self.namespace) + + +class TestNetworkAndComputeLister(TestNetworkAndCompute): + def setUp(self): + super(TestNetworkAndComputeLister, self).setUp() + self.cmd = FakeNetworkAndComputeLister(self.app, self.namespace) + + +class TestNetworkAndComputeShowOne(TestNetworkAndCompute): + def setUp(self): + super(TestNetworkAndComputeShowOne, self).setUp() + self.cmd = FakeNetworkAndComputeShowOne(self.app, self.namespace) diff --git a/openstackclient/tests/network/v2/fakes.py b/openstackclient/tests/network/v2/fakes.py index de885c62..77720ee0 100644 --- a/openstackclient/tests/network/v2/fakes.py +++ b/openstackclient/tests/network/v2/fakes.py @@ -26,6 +26,18 @@ extension_updated = '2013-07-09T12:00:0-00:00' extension_alias = 'Dystopian' extension_links = '[{"href":''"https://github.com/os/network", "type"}]' +QUOTA = { + "subnet": 10, + "network": 10, + "floatingip": 50, + "subnetpool": -1, + "security_group_rule": 100, + "security_group": 10, + "router": 10, + "rbac_policy": -1, + "port": 50, +} + def create_extension(): extension = mock.Mock() @@ -57,6 +69,59 @@ class TestNetworkV2(utils.TestCommand): ) +class FakeAvailabilityZone(object): + """Fake one or more network availability zones (AZs).""" + + @staticmethod + def create_one_availability_zone(attrs={}, methods={}): + """Create a fake AZ. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :return: + A FakeResource object with name, state, etc. + """ + # Set default attributes. + availability_zone = { + 'name': uuid.uuid4().hex, + 'state': 'available', + 'resource': 'network', + } + + # Overwrite default attributes. + availability_zone.update(attrs) + + availability_zone = fakes.FakeResource( + info=copy.deepcopy(availability_zone), + methods=methods, + loaded=True) + return availability_zone + + @staticmethod + def create_availability_zones(attrs={}, methods={}, count=2): + """Create multiple fake AZs. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :param int count: + The number of AZs to fake + :return: + A list of FakeResource objects faking the AZs + """ + availability_zones = [] + for i in range(0, count): + availability_zone = \ + FakeAvailabilityZone.create_one_availability_zone( + attrs, methods) + availability_zones.append(availability_zone) + + return availability_zones + + class FakeNetwork(object): """Fake one or more networks.""" @@ -84,7 +149,8 @@ class FakeNetwork(object): 'subnets': ['a', 'b'], 'provider_network_type': 'vlan', 'router_external': True, - 'is_dirty': True, + 'availability_zones': [], + 'availability_zone_hints': [], } # Overwrite default attributes. @@ -93,7 +159,8 @@ class FakeNetwork(object): # Set default methods. network_methods = { 'keys': ['id', 'name', 'admin_state_up', 'router_external', - 'status', 'subnets', 'tenant_id'], + 'status', 'subnets', 'tenant_id', 'availability_zones', + 'availability_zone_hints'], } # Overwrite default methods. @@ -157,15 +224,30 @@ class FakePort(object): :param Dictionary methods: A dictionary with all methods :return: - A FakeResource object, with id, name, admin_state_up, - status, tenant_id + A FakeResource object, with id, name, etc. """ # Set default attributes. port_attrs = { + 'admin_state_up': True, + 'allowed_address_pairs': [{}], + 'binding:host_id': 'binding-host-id-' + uuid.uuid4().hex, + 'binding:profile': {}, + 'binding:vif_details': {}, + 'binding:vif_type': 'ovs', + 'binding:vnic_type': 'normal', + 'device_id': 'device-id-' + uuid.uuid4().hex, + 'device_owner': 'compute:nova', + 'dns_assignment': [{}], + 'dns_name': 'dns-name-' + uuid.uuid4().hex, + 'extra_dhcp_opts': [{}], + 'fixed_ips': [{}], 'id': 'port-id-' + uuid.uuid4().hex, + 'mac_address': 'fa:16:3e:a9:4e:72', 'name': 'port-name-' + uuid.uuid4().hex, + 'network_id': 'network-id-' + uuid.uuid4().hex, + 'port_security_enabled': True, + 'security_groups': [], 'status': 'ACTIVE', - 'admin_state_up': True, 'tenant_id': 'project-id-' + uuid.uuid4().hex, } @@ -173,7 +255,16 @@ class FakePort(object): port_attrs.update(attrs) # Set default methods. - port_methods = {} + port_methods = { + 'keys': ['admin_state_up', 'allowed_address_pairs', + 'binding:host_id', 'binding:profile', + 'binding:vif_details', 'binding:vif_type', + 'binding:vnic_type', 'device_id', 'device_owner', + 'dns_assignment', 'dns_name', 'extra_dhcp_opts', + 'fixed_ips', 'id', 'mac_address', 'name', + 'network_id', 'port_security_enabled', + 'security_groups', 'status', 'tenant_id'], + } # Overwrite default methods. port_methods.update(methods) @@ -181,6 +272,15 @@ class FakePort(object): port = fakes.FakeResource(info=copy.deepcopy(port_attrs), methods=copy.deepcopy(port_methods), loaded=True) + + # Set attributes with special mappings. + port.project_id = port_attrs['tenant_id'] + port.binding_host_id = port_attrs['binding:host_id'] + port.binding_profile = port_attrs['binding:profile'] + port.binding_vif_details = port_attrs['binding:vif_details'] + port.binding_vif_type = port_attrs['binding:vif_type'] + port.binding_vnic_type = port_attrs['binding:vnic_type'] + return port @staticmethod @@ -248,6 +348,8 @@ class FakeRouter(object): 'tenant_id': 'project-id-' + uuid.uuid4().hex, 'routes': [], 'external_gateway_info': {}, + 'availability_zone_hints': [], + 'availability_zones': [], } # Overwrite default attributes. @@ -304,3 +406,228 @@ class FakeRouter(object): if routers is None: routers = FakeRouter.create_routers(count) return mock.MagicMock(side_effect=routers) + + +class FakeSecurityGroup(object): + """Fake one or more security groups.""" + + @staticmethod + def create_one_security_group(attrs={}, methods={}): + """Create a fake security group. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :return: + A FakeResource object, with id, name, etc. + """ + # Set default attributes. + security_group_attrs = { + 'id': 'security-group-id-' + uuid.uuid4().hex, + 'name': 'security-group-name-' + uuid.uuid4().hex, + 'description': 'security-group-description-' + uuid.uuid4().hex, + 'tenant_id': 'project-id-' + uuid.uuid4().hex, + 'security_group_rules': [], + } + + # Overwrite default attributes. + security_group_attrs.update(attrs) + + # Set default methods. + security_group_methods = {} + + # Overwrite default methods. + security_group_methods.update(methods) + + security_group = fakes.FakeResource( + info=copy.deepcopy(security_group_attrs), + methods=copy.deepcopy(security_group_methods), + loaded=True) + return security_group + + @staticmethod + def create_security_groups(attrs={}, methods={}, count=2): + """Create multiple fake security groups. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :param int count: + The number of security groups to fake + :return: + A list of FakeResource objects faking the security groups + """ + security_groups = [] + for i in range(0, count): + security_groups.append( + FakeRouter.create_one_security_group(attrs, methods)) + + return security_groups + + @staticmethod + def get_security_groups(security_groups=None, count=2): + """Get an iterable MagicMock object with a list of faked security groups. + + If security group list is provided, then initialize the Mock object + with the list. Otherwise create one. + + :param List security groups: + A list of FakeResource objects faking security groups + :param int count: + The number of security groups to fake + :return: + An iterable Mock object with side_effect set to a list of faked + security groups + """ + if security_groups is None: + security_groups = FakeRouter.create_security_groups(count) + return mock.MagicMock(side_effect=security_groups) + + +class FakeSubnet(object): + """Fake one or more subnets.""" + + @staticmethod + def create_one_subnet(attrs={}, methods={}): + """Create a fake subnet. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :return: + A FakeResource object faking the subnet + """ + # Set default attributes. + subnet_attrs = { + 'id': 'subnet-id-' + uuid.uuid4().hex, + 'name': 'subnet-name-' + uuid.uuid4().hex, + 'network_id': 'network-id-' + uuid.uuid4().hex, + 'cidr': '10.10.10.0/24', + 'tenant_id': 'project-id-' + uuid.uuid4().hex, + 'enable_dhcp': True, + 'dns_nameservers': [], + 'allocation_pools': [], + 'host_routes': [], + 'ip_version': '4', + 'gateway_ip': '10.10.10.1', + } + + # Overwrite default attributes. + subnet_attrs.update(attrs) + + # Set default methods. + subnet_methods = { + 'keys': ['id', 'name', 'network_id', 'cidr', 'enable_dhcp', + 'allocation_pools', 'dns_nameservers', 'gateway_ip', + 'host_routes', 'ip_version', 'tenant_id'] + } + + # Overwrite default methods. + subnet_methods.update(methods) + + subnet = fakes.FakeResource(info=copy.deepcopy(subnet_attrs), + methods=copy.deepcopy(subnet_methods), + loaded=True) + + return subnet + + @staticmethod + def create_subnets(attrs={}, methods={}, count=2): + """Create multiple fake subnets. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :param int count: + The number of subnets to fake + :return: + A list of FakeResource objects faking the subnets + """ + subnets = [] + for i in range(0, count): + subnets.append(FakeSubnet.create_one_subnet(attrs, methods)) + + return subnets + + +class FakeFloatingIP(object): + """Fake one or more floating ip.""" + + @staticmethod + def create_one_floating_ip(attrs={}, methods={}): + """Create a fake floating ip. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :return: + A FakeResource object, with id, ip, and so on + """ + # Set default attributes. + floating_ip_attrs = { + 'id': 'floating-ip-id-' + uuid.uuid4().hex, + 'ip': '1.0.9.0', + 'fixed_ip': '2.0.9.0', + 'instance_id': 'server-id-' + uuid.uuid4().hex, + 'pool': 'public', + } + + # Overwrite default attributes. + floating_ip_attrs.update(attrs) + + # Set default methods. + floating_ip_methods = {} + + # Overwrite default methods. + floating_ip_methods.update(methods) + + floating_ip = fakes.FakeResource( + info=copy.deepcopy(floating_ip_attrs), + methods=copy.deepcopy(floating_ip_methods), + loaded=True) + return floating_ip + + @staticmethod + def create_floating_ips(attrs={}, methods={}, count=2): + """Create multiple fake floating ips. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :param int count: + The number of floating ips to fake + :return: + A list of FakeResource objects faking the floating ips + """ + floating_ips = [] + for i in range(0, count): + floating_ips.append(FakeFloatingIP.create_one_floating_ip( + attrs, + methods + )) + return floating_ips + + @staticmethod + def get_floating_ips(floating_ips=None, count=2): + """Get an iterable MagicMock object with a list of faked floating ips. + + If floating_ips list is provided, then initialize the Mock object + with the list. Otherwise create one. + + :param List floating ips: + A list of FakeResource objects faking floating ips + :param int count: + The number of floating ips to fake + :return: + An iterable Mock object with side_effect set to a list of faked + floating ips + """ + if floating_ips is None: + floating_ips = FakeFloatingIP.create_floating_ips(count) + return mock.MagicMock(side_effect=floating_ips) diff --git a/openstackclient/tests/network/v2/test_floating_ip.py b/openstackclient/tests/network/v2/test_floating_ip.py new file mode 100644 index 00000000..031dcdac --- /dev/null +++ b/openstackclient/tests/network/v2/test_floating_ip.py @@ -0,0 +1,181 @@ +# 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 mock + +from openstackclient.network.v2 import floating_ip +from openstackclient.tests.compute.v2 import fakes as compute_fakes +from openstackclient.tests.network.v2 import fakes as network_fakes + + +# Tests for Neutron network +# +class TestFloatingIPNetwork(network_fakes.TestNetworkV2): + + def setUp(self): + super(TestFloatingIPNetwork, self).setUp() + + # Get a shortcut to the network client + self.network = self.app.client_manager.network + + +class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork): + + # The floating ip to be deleted. + floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip() + + def setUp(self): + super(TestDeleteFloatingIPNetwork, self).setUp() + + self.network.delete_ip = mock.Mock(return_value=self.floating_ip) + self.network.find_ip = mock.Mock(return_value=self.floating_ip) + + # Get the command object to test + self.cmd = floating_ip.DeleteFloatingIP(self.app, self.namespace) + + def test_floating_ip_delete(self): + arglist = [ + self.floating_ip.id, + ] + verifylist = [ + ('floating_ip', self.floating_ip.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.network.find_ip.assert_called_with(self.floating_ip.id) + self.network.delete_ip.assert_called_with(self.floating_ip) + self.assertIsNone(result) + + +class TestListFloatingIPNetwork(TestFloatingIPNetwork): + + # The floating ips to list up + floating_ips = network_fakes.FakeFloatingIP.create_floating_ips(count=3) + + columns = ('ID', 'Floating IP', 'Fixed IP', 'Server ID', 'Pool') + + data = [] + for ip in floating_ips: + data.append(( + ip.id, + ip.ip, + ip.fixed_ip, + ip.instance_id, + ip.pool, + )) + + def setUp(self): + super(TestListFloatingIPNetwork, self).setUp() + + self.network.ips = mock.Mock(return_value=self.floating_ips) + + # Get the command object to test + self.cmd = floating_ip.ListFloatingIP(self.app, self.namespace) + + def test_floating_ip_list(self): + arglist = [] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.network.ips.assert_called_with(**{}) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, list(data)) + + +# Tests for Nova network +# +class TestFloatingIPCompute(compute_fakes.TestComputev2): + + def setUp(self): + super(TestFloatingIPCompute, self).setUp() + + # Get a shortcut to the compute client + self.compute = self.app.client_manager.compute + + +class TestDeleteFloatingIPCompute(TestFloatingIPCompute): + + # The floating ip to be deleted. + floating_ip = compute_fakes.FakeFloatingIP.create_one_floating_ip() + + def setUp(self): + super(TestDeleteFloatingIPCompute, self).setUp() + + self.app.client_manager.network_endpoint_enabled = False + + self.compute.floating_ips.delete.return_value = None + + # Return value of utils.find_resource() + self.compute.floating_ips.get.return_value = self.floating_ip + + # Get the command object to test + self.cmd = floating_ip.DeleteFloatingIP(self.app, None) + + def test_floating_ip_delete(self): + arglist = [ + self.floating_ip.id, + ] + verifylist = [ + ('floating_ip', self.floating_ip.id), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.compute.floating_ips.delete.assert_called_with( + self.floating_ip.id + ) + self.assertIsNone(result) + + +class TestListFloatingIPCompute(TestFloatingIPCompute): + + # The floating ips to be list up + floating_ips = compute_fakes.FakeFloatingIP.create_floating_ips(count=3) + + columns = ('ID', 'Floating IP', 'Fixed IP', 'Server ID', 'Pool') + + data = [] + for ip in floating_ips: + data.append(( + ip.id, + ip.ip, + ip.fixed_ip, + ip.instance_id, + ip.pool, + )) + + def setUp(self): + super(TestListFloatingIPCompute, self).setUp() + + self.app.client_manager.network_endpoint_enabled = False + + self.compute.floating_ips.list.return_value = self.floating_ips + + # Get the command object to test + self.cmd = floating_ip.ListFloatingIP(self.app, None) + + def test_floating_ip_list(self): + arglist = [] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.compute.floating_ips.list.assert_called_with() + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, list(data)) diff --git a/openstackclient/tests/network/v2/test_network.py b/openstackclient/tests/network/v2/test_network.py index 12ac802c..f7721951 100644 --- a/openstackclient/tests/network/v2/test_network.py +++ b/openstackclient/tests/network/v2/test_network.py @@ -17,6 +17,7 @@ import mock from openstackclient.common import exceptions from openstackclient.common import utils from openstackclient.network.v2 import network +from openstackclient.tests.compute.v2 import fakes as compute_fakes from openstackclient.tests import fakes from openstackclient.tests.identity.v2_0 import fakes as identity_fakes_v2 from openstackclient.tests.identity.v3 import fakes as identity_fakes_v3 @@ -24,6 +25,8 @@ from openstackclient.tests.network.v2 import fakes as network_fakes from openstackclient.tests import utils as tests_utils +# Tests for Neutron network +# class TestNetwork(network_fakes.TestNetworkV2): def setUp(self): @@ -37,11 +40,16 @@ class TestCreateNetworkIdentityV3(TestNetwork): # The new network created. _network = network_fakes.FakeNetwork.create_one_network( - attrs={'tenant_id': identity_fakes_v3.project_id} + attrs={ + 'tenant_id': identity_fakes_v3.project_id, + 'availability_zone_hints': ["nova"], + } ) columns = ( 'admin_state_up', + 'availability_zone_hints', + 'availability_zones', 'id', 'name', 'project_id', @@ -52,6 +60,8 @@ class TestCreateNetworkIdentityV3(TestNetwork): data = ( network._format_admin_state(_network.admin_state_up), + utils.format_list(_network.availability_zone_hints), + utils.format_list(_network.availability_zones), _network.id, _network.name, _network.project_id, @@ -96,11 +106,9 @@ class TestCreateNetworkIdentityV3(TestNetwork): arglist = [] verifylist = [] - try: - # Missing required args should bail here - self.check_parser(self.cmd, arglist, verifylist) - except tests_utils.ParserException: - pass + # Missing required args should bail here + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) def test_create_default_options(self): arglist = [ @@ -129,6 +137,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): "--share", "--project", identity_fakes_v3.project_name, "--project-domain", identity_fakes_v3.domain_name, + "--availability-zone-hint", "nova", self._network.name, ] verifylist = [ @@ -136,6 +145,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): ('shared', True), ('project', identity_fakes_v3.project_name), ('project_domain', identity_fakes_v3.domain_name), + ('availability_zone_hints', ["nova"]), ('name', self._network.name), ] @@ -144,6 +154,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): self.network.create_network.assert_called_with(**{ 'admin_state_up': False, + 'availability_zone_hints': ["nova"], 'name': self._network.name, 'shared': True, 'tenant_id': identity_fakes_v3.project_id, @@ -184,6 +195,8 @@ class TestCreateNetworkIdentityV2(TestNetwork): columns = ( 'admin_state_up', + 'availability_zone_hints', + 'availability_zones', 'id', 'name', 'project_id', @@ -194,6 +207,8 @@ class TestCreateNetworkIdentityV2(TestNetwork): data = ( network._format_admin_state(_network.admin_state_up), + utils.format_list(_network.availability_zone_hints), + utils.format_list(_network.availability_zones), _network.id, _network.name, _network.project_id, @@ -324,6 +339,7 @@ class TestListNetwork(TestNetwork): 'Subnets', 'Network Type', 'Router Type', + 'Availability Zones', ) data = [] @@ -346,6 +362,7 @@ class TestListNetwork(TestNetwork): utils.format_list(net.subnets), net.provider_network_type, network._format_router_external(net.router_external), + utils.format_list(net.availability_zones), )) def setUp(self): @@ -364,7 +381,9 @@ class TestListNetwork(TestNetwork): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.network.networks.assert_called_with() @@ -381,7 +400,9 @@ class TestListNetwork(TestNetwork): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.network.networks.assert_called_with( @@ -400,7 +421,9 @@ class TestListNetwork(TestNetwork): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.network.networks.assert_called_with() @@ -424,8 +447,6 @@ class TestSetNetwork(TestNetwork): self.cmd = network.SetNetwork(self.app, self.namespace) def test_set_this(self): - self._network.is_dirty = True - arglist = [ self._network.name, '--enable', @@ -433,7 +454,7 @@ class TestSetNetwork(TestNetwork): '--share', ] verifylist = [ - ('identifier', self._network.name), + ('network', self._network.name), ('admin_state', True), ('name', 'noob'), ('shared', True), @@ -442,19 +463,22 @@ class TestSetNetwork(TestNetwork): parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) - self.network.update_network.assert_called_with(self._network) + attrs = { + 'name': 'noob', + 'admin_state_up': True, + 'shared': True, + } + self.network.update_network.assert_called_with(self._network, **attrs) self.assertIsNone(result) def test_set_that(self): - self._network.is_dirty = True - arglist = [ self._network.name, '--disable', '--no-share', ] verifylist = [ - ('identifier', self._network.name), + ('network', self._network.name), ('admin_state', False), ('shared', False), ] @@ -462,14 +486,16 @@ class TestSetNetwork(TestNetwork): parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) - self.network.update_network.assert_called_with(self._network) + attrs = { + 'admin_state_up': False, + 'shared': False, + } + self.network.update_network.assert_called_with(self._network, **attrs) self.assertIsNone(result) def test_set_nothing(self): - self._network.is_dirty = False - arglist = [self._network.name, ] - verifylist = [('identifier', self._network.name), ] + verifylist = [('network', self._network.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) self.assertRaises(exceptions.CommandError, self.cmd.take_action, @@ -478,11 +504,13 @@ class TestSetNetwork(TestNetwork): class TestShowNetwork(TestNetwork): - # The network to set. + # The network to show. _network = network_fakes.FakeNetwork.create_one_network() columns = ( 'admin_state_up', + 'availability_zone_hints', + 'availability_zones', 'id', 'name', 'project_id', @@ -493,6 +521,8 @@ class TestShowNetwork(TestNetwork): data = ( network._format_admin_state(_network.admin_state_up), + utils.format_list(_network.availability_zone_hints), + utils.format_list(_network.availability_zones), _network.id, _network.name, _network.project_id, @@ -513,18 +543,16 @@ class TestShowNetwork(TestNetwork): arglist = [] verifylist = [] - try: - # Missing required args should bail here - self.check_parser(self.cmd, arglist, verifylist) - except tests_utils.ParserException: - pass + # Missing required args should bail here + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) def test_show_all_options(self): arglist = [ self._network.name, ] verifylist = [ - ('identifier', self._network.name), + ('network', self._network.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -535,3 +563,47 @@ class TestShowNetwork(TestNetwork): self.assertEqual(tuple(self.columns), columns) self.assertEqual(list(self.data), list(data)) + + +# Tests for Nova network +# +class TestNetworkCompute(compute_fakes.TestComputev2): + + def setUp(self): + super(TestNetworkCompute, self).setUp() + + # Get a shortcut to the compute client + self.compute = self.app.client_manager.compute + + +class TestDeleteNetworkCompute(TestNetworkCompute): + + # The network to delete. + _network = network_fakes.FakeNetwork.create_one_network() + + def setUp(self): + super(TestDeleteNetworkCompute, self).setUp() + + self.app.client_manager.network_endpoint_enabled = False + + self.compute.networks.delete.return_value = None + + # Return value of utils.find_resource() + self.compute.networks.get.return_value = self._network + + # Get the command object to test + self.cmd = network.DeleteNetwork(self.app, None) + + def test_network_delete(self): + arglist = [ + self._network.name, + ] + verifylist = [ + ('network', [self._network.name]), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + self.compute.networks.delete.assert_called_with(self._network.id) + self.assertIsNone(result) diff --git a/openstackclient/tests/network/v2/test_port.py b/openstackclient/tests/network/v2/test_port.py index a1ddefa1..bc246bd8 100644 --- a/openstackclient/tests/network/v2/test_port.py +++ b/openstackclient/tests/network/v2/test_port.py @@ -13,8 +13,10 @@ import mock +from openstackclient.common import utils from openstackclient.network.v2 import port from openstackclient.tests.network.v2 import fakes as network_fakes +from openstackclient.tests import utils as tests_utils class TestPort(network_fakes.TestNetworkV2): @@ -51,3 +53,88 @@ class TestDeletePort(TestPort): result = self.cmd.take_action(parsed_args) self.network.delete_port.assert_called_with(self._port) self.assertIsNone(result) + + +class TestShowPort(TestPort): + + # The port to show. + _port = network_fakes.FakePort.create_one_port() + + columns = ( + 'admin_state_up', + 'allowed_address_pairs', + 'binding_host_id', + 'binding_profile', + 'binding_vif_details', + 'binding_vif_type', + 'binding_vnic_type', + 'device_id', + 'device_owner', + 'dns_assignment', + 'dns_name', + 'extra_dhcp_opts', + 'fixed_ips', + 'id', + 'mac_address', + 'name', + 'network_id', + 'port_security_enabled', + 'project_id', + 'security_groups', + 'status', + ) + + data = ( + port._format_admin_state(_port.admin_state_up), + utils.format_list_of_dicts(_port.allowed_address_pairs), + _port.binding_host_id, + utils.format_dict(_port.binding_profile), + utils.format_dict(_port.binding_vif_details), + _port.binding_vif_type, + _port.binding_vnic_type, + _port.device_id, + _port.device_owner, + utils.format_list_of_dicts(_port.dns_assignment), + _port.dns_name, + utils.format_list_of_dicts(_port.extra_dhcp_opts), + utils.format_list_of_dicts(_port.fixed_ips), + _port.id, + _port.mac_address, + _port.name, + _port.network_id, + _port.port_security_enabled, + _port.project_id, + utils.format_list(_port.security_groups), + _port.status, + ) + + def setUp(self): + super(TestShowPort, self).setUp() + + self.network.find_port = mock.Mock(return_value=self._port) + + # Get the command object to test + self.cmd = port.ShowPort(self.app, self.namespace) + + def test_show_no_options(self): + arglist = [] + verifylist = [] + + self.assertRaises(tests_utils.ParserException, + self.check_parser, self.cmd, arglist, verifylist) + + def test_show_all_options(self): + arglist = [ + self._port.name, + ] + verifylist = [ + ('port', self._port.name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.network.find_port.assert_called_with(self._port.name, + ignore_missing=False) + self.assertEqual(tuple(self.columns), columns) + self.assertEqual(self.data, data) diff --git a/openstackclient/tests/network/v2/test_router.py b/openstackclient/tests/network/v2/test_router.py index fba6e192..05bb7857 100644 --- a/openstackclient/tests/network/v2/test_router.py +++ b/openstackclient/tests/network/v2/test_router.py @@ -14,6 +14,7 @@ import mock from openstackclient.common import exceptions +from openstackclient.common import utils as osc_utils from openstackclient.network.v2 import router from openstackclient.tests.network.v2 import fakes as network_fakes from openstackclient.tests import utils as tests_utils @@ -62,10 +63,9 @@ class TestCreateRouter(TestRouter): arglist = [] verifylist = [] - try: - self.check_parser(self.cmd, arglist, verifylist) - except tests_utils.ParserException: - pass + # Missing required args should bail here + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) def test_create_default_options(self): arglist = [ @@ -88,6 +88,31 @@ class TestCreateRouter(TestRouter): self.assertEqual(self.columns, columns) self.assertEqual(self.data, data) + def test_create_with_AZ_hints(self): + arglist = [ + self.new_router.name, + '--availability-zone-hint', 'fake-az', + '--availability-zone-hint', 'fake-az2', + ] + verifylist = [ + ('name', self.new_router.name), + ('availability_zone_hints', ['fake-az', 'fake-az2']), + ('admin_state_up', True), + ('distributed', False), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = (self.cmd.take_action(parsed_args)) + self.network.create_router.assert_called_with(**{ + 'admin_state_up': True, + 'name': self.new_router.name, + 'distributed': False, + 'availability_zone_hints': ['fake-az', 'fake-az2'], + }) + + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + class TestDeleteRouter(TestRouter): @@ -135,6 +160,7 @@ class TestListRouter(TestRouter): columns_long = columns + ( 'Routes', 'External gateway info', + 'Availability zones' ) data = [] @@ -155,6 +181,7 @@ class TestListRouter(TestRouter): data[i] + ( r.routes, router._format_external_gateway_info(r.external_gateway_info), + osc_utils.format_list(r.availability_zones), ) ) @@ -173,7 +200,9 @@ class TestListRouter(TestRouter): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.network.routers.assert_called_with() @@ -189,7 +218,9 @@ class TestListRouter(TestRouter): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) self.network.routers.assert_called_with() @@ -271,11 +302,9 @@ class TestSetRouter(TestRouter): ('distributed', False), ] - try: - # Argument parse failing should bail here - self.check_parser(self.cmd, arglist, verifylist) - except tests_utils.ParserException: - pass + # Missing required args should bail here + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) def test_set_nothing(self): arglist = [self._router.name, ] @@ -321,11 +350,9 @@ class TestShowRouter(TestRouter): arglist = [] verifylist = [] - try: - # Missing required args should bail here - self.check_parser(self.cmd, arglist, verifylist) - except tests_utils.ParserException: - pass + # Missing required args should bail here + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) def test_show_all_options(self): arglist = [ diff --git a/openstackclient/tests/network/v2/test_security_group.py b/openstackclient/tests/network/v2/test_security_group.py new file mode 100644 index 00000000..98388ec7 --- /dev/null +++ b/openstackclient/tests/network/v2/test_security_group.py @@ -0,0 +1,99 @@ +# 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 mock + +from openstackclient.network.v2 import security_group +from openstackclient.tests.network.v2 import fakes as network_fakes + + +class TestSecurityGroup(network_fakes.TestNetworkV2): + + def setUp(self): + super(TestSecurityGroup, self).setUp() + + # Get a shortcut to the network client + self.network = self.app.client_manager.network + + # Create compute client mocks. + self.app.client_manager.compute = mock.Mock() + self.compute = self.app.client_manager.compute + self.compute.security_groups = mock.Mock() + + +class TestDeleteSecurityGroupNetwork(TestSecurityGroup): + + # The security group to be deleted. + _security_group = \ + network_fakes.FakeSecurityGroup.create_one_security_group() + + def setUp(self): + super(TestDeleteSecurityGroupNetwork, self).setUp() + + self.network.delete_security_group = mock.Mock(return_value=None) + + self.network.find_security_group = mock.Mock( + return_value=self._security_group) + + # Get the command object to test + self.cmd = security_group.DeleteSecurityGroup(self.app, self.namespace) + + def test_security_group_delete(self): + arglist = [ + self._security_group.name, + ] + verifylist = [ + ('group', self._security_group.name), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + self.network.delete_security_group.assert_called_with( + self._security_group) + self.assertEqual(None, result) + + +class TestDeleteSecurityGroupCompute(TestSecurityGroup): + + # The security group to be deleted. + _security_group = \ + network_fakes.FakeSecurityGroup.create_one_security_group() + + def setUp(self): + super(TestDeleteSecurityGroupCompute, self).setUp() + + self.app.client_manager.network_endpoint_enabled = False + + self.compute.security_groups.delete = mock.Mock(return_value=None) + + self.compute.security_groups.get = mock.Mock( + return_value=self._security_group) + + # Get the command object to test + self.cmd = security_group.DeleteSecurityGroup(self.app, self.namespace) + + def test_security_group_delete(self): + arglist = [ + self._security_group.name, + ] + verifylist = [ + ('group', self._security_group.name), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + self.compute.security_groups.delete.assert_called_with( + self._security_group.id) + self.assertEqual(None, result) diff --git a/openstackclient/tests/network/v2/test_subnet.py b/openstackclient/tests/network/v2/test_subnet.py new file mode 100644 index 00000000..5fca5edd --- /dev/null +++ b/openstackclient/tests/network/v2/test_subnet.py @@ -0,0 +1,108 @@ +# 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 mock + +from openstackclient.common import utils +from openstackclient.network.v2 import subnet as subnet_v2 +from openstackclient.tests.network.v2 import fakes as network_fakes + + +class TestSubnet(network_fakes.TestNetworkV2): + def setUp(self): + super(TestSubnet, self).setUp() + + # Get a shortcut to the network client + self.network = self.app.client_manager.network + + +class TestListSubnet(TestSubnet): + # The subnets going to be listed up. + _subnet = network_fakes.FakeSubnet.create_subnets(count=3) + + columns = ( + 'ID', + 'Name', + 'Network', + 'Subnet' + ) + columns_long = columns + ( + 'Project', + 'DHCP', + 'Name Servers', + 'Allocation Pools', + 'Host Routes', + 'IP Version', + 'Gateway' + ) + + data = [] + for subnet in _subnet: + data.append(( + subnet.id, + subnet.name, + subnet.network_id, + subnet.cidr, + )) + + data_long = [] + for subnet in _subnet: + data_long.append(( + subnet.id, + subnet.name, + subnet.network_id, + subnet.cidr, + subnet.tenant_id, + subnet.enable_dhcp, + utils.format_list(subnet.dns_nameservers), + subnet_v2._format_allocation_pools(subnet.allocation_pools), + utils.format_list(subnet.host_routes), + subnet.ip_version, + subnet.gateway_ip + )) + + def setUp(self): + super(TestListSubnet, self).setUp() + + # Get the command object to test + self.cmd = subnet_v2.ListSubnet(self.app, self.namespace) + + self.network.subnets = mock.Mock(return_value=self._subnet) + + def test_subnet_list_no_options(self): + arglist = [] + verifylist = [ + ('long', False), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.network.subnets.assert_called_with() + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, list(data)) + + def test_subnet_list_long(self): + arglist = [ + '--long', + ] + verifylist = [ + ('long', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.network.subnets.assert_called_with() + self.assertEqual(self.columns_long, columns) + self.assertEqual(self.data_long, list(data)) diff --git a/openstackclient/tests/object/v1/test_container.py b/openstackclient/tests/object/v1/test_container.py index 2ef2f7b5..5b0fb48a 100644 --- a/openstackclient/tests/object/v1/test_container.py +++ b/openstackclient/tests/object/v1/test_container.py @@ -32,6 +32,9 @@ class FakeClient(object): class TestContainer(object_fakes.TestObjectv1): + + columns = ('Name',) + def setUp(self): super(TestContainer, self).setUp() self.app.client_manager.object_store = object_store.APIv1( @@ -41,6 +44,96 @@ class TestContainer(object_fakes.TestObjectv1): self.api = self.app.client_manager.object_store +@mock.patch('openstackclient.api.object_store_v1.APIv1.object_delete') +@mock.patch('openstackclient.api.object_store_v1.APIv1.object_list') +@mock.patch('openstackclient.api.object_store_v1.APIv1.container_delete') +class TestContainerDelete(TestContainer): + + def setUp(self): + super(TestContainerDelete, self).setUp() + + # Get the command object to test + self.cmd = container.DeleteContainer(self.app, None) + + def test_container_delete(self, c_mock, o_list_mock, o_delete_mock): + c_mock.return_value = None + + arglist = [ + object_fakes.container_name, + ] + verifylist = [ + ('containers', [object_fakes.container_name]), + ('recursive', False), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.assertEqual(None, self.cmd.take_action(parsed_args)) + + kwargs = {} + c_mock.assert_called_with( + container=object_fakes.container_name, + **kwargs + ) + self.assertFalse(o_list_mock.called) + self.assertFalse(o_delete_mock.called) + + def test_recursive_delete(self, c_mock, o_list_mock, o_delete_mock): + c_mock.return_value = None + o_list_mock.return_value = [object_fakes.OBJECT] + o_delete_mock.return_value = None + + arglist = [ + '--recursive', + object_fakes.container_name, + ] + verifylist = [ + ('containers', [object_fakes.container_name]), + ('recursive', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.assertEqual(None, self.cmd.take_action(parsed_args)) + + kwargs = {} + c_mock.assert_called_with( + container=object_fakes.container_name, + **kwargs + ) + o_list_mock.assert_called_with(container=object_fakes.container_name) + o_delete_mock.assert_called_with( + container=object_fakes.container_name, + object=object_fakes.OBJECT['name'], + ) + + def test_r_delete(self, c_mock, o_list_mock, o_delete_mock): + c_mock.return_value = None + o_list_mock.return_value = [object_fakes.OBJECT] + o_delete_mock.return_value = None + + arglist = [ + '-r', + object_fakes.container_name, + ] + verifylist = [ + ('containers', [object_fakes.container_name]), + ('recursive', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.assertEqual(None, self.cmd.take_action(parsed_args)) + + kwargs = {} + c_mock.assert_called_with( + container=object_fakes.container_name, + **kwargs + ) + o_list_mock.assert_called_with(container=object_fakes.container_name) + o_delete_mock.assert_called_with( + container=object_fakes.container_name, + object=object_fakes.OBJECT['name'], + ) + + @mock.patch( 'openstackclient.api.object_store_v1.APIv1.container_list' ) @@ -63,7 +156,9 @@ class TestContainerList(TestContainer): verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -73,8 +168,7 @@ class TestContainerList(TestContainer): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( (object_fakes.container_name, ), (object_fakes.container_name_3, ), @@ -96,7 +190,9 @@ class TestContainerList(TestContainer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -107,8 +203,7 @@ class TestContainerList(TestContainer): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( (object_fakes.container_name, ), (object_fakes.container_name_3, ), @@ -131,7 +226,9 @@ class TestContainerList(TestContainer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -143,8 +240,7 @@ class TestContainerList(TestContainer): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( (object_fakes.container_name, ), (object_fakes.container_name_3, ), @@ -165,7 +261,9 @@ class TestContainerList(TestContainer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -176,8 +274,7 @@ class TestContainerList(TestContainer): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( (object_fakes.container_name, ), (object_fakes.container_name_3, ), @@ -198,7 +295,9 @@ class TestContainerList(TestContainer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -239,7 +338,9 @@ class TestContainerList(TestContainer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -250,8 +351,7 @@ class TestContainerList(TestContainer): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( (object_fakes.container_name, ), (object_fakes.container_name_2, ), @@ -282,7 +382,9 @@ class TestContainerShow(TestContainer): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values diff --git a/openstackclient/tests/object/v1/test_container_all.py b/openstackclient/tests/object/v1/test_container_all.py index 69fc0f39..95e12f47 100644 --- a/openstackclient/tests/object/v1/test_container_all.py +++ b/openstackclient/tests/object/v1/test_container_all.py @@ -29,6 +29,12 @@ class TestContainerAll(object_fakes.TestObjectv1): class TestContainerCreate(TestContainerAll): + columns = ( + 'account', + 'container', + 'x-trans-id', + ) + def setUp(self): super(TestContainerCreate, self).setUp() @@ -51,11 +57,12 @@ class TestContainerCreate(TestContainerAll): )] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) - collist = ('account', 'container', 'x-trans-id') - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = [( object_fakes.ACCOUNT_ID, 'ernie', @@ -86,11 +93,12 @@ class TestContainerCreate(TestContainerAll): )] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) - collist = ('account', 'container', 'x-trans-id') - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = [ ( object_fakes.ACCOUNT_ID, @@ -161,6 +169,8 @@ class TestContainerDelete(TestContainerAll): class TestContainerList(TestContainerAll): + columns = ('Name',) + def setUp(self): super(TestContainerList, self).setUp() @@ -187,8 +197,7 @@ class TestContainerList(TestContainerAll): # Lister.take_action() returns two tuples columns, data = self.cmd.take_action(parsed_args) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = [ (object_fakes.container_name, ), (object_fakes.container_name_3, ), @@ -219,8 +228,7 @@ class TestContainerList(TestContainerAll): # Lister.take_action() returns two tuples columns, data = self.cmd.take_action(parsed_args) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = [ (object_fakes.container_name, ), (object_fakes.container_name_3, ), @@ -308,7 +316,9 @@ class TestContainerShow(TestContainerAll): )] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) collist = ( diff --git a/openstackclient/tests/object/v1/test_object.py b/openstackclient/tests/object/v1/test_object.py index 305fe8f8..990e4f46 100644 --- a/openstackclient/tests/object/v1/test_object.py +++ b/openstackclient/tests/object/v1/test_object.py @@ -40,6 +40,13 @@ class TestObject(object_fakes.TestObjectv1): ) class TestObjectList(TestObject): + columns = ('Name',) + datalist = ( + ( + object_fakes.object_name_2, + ), + ) + def setUp(self): super(TestObjectList, self).setUp() @@ -60,15 +67,16 @@ class TestObjectList(TestObject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) o_mock.assert_called_with( container=object_fakes.container_name, ) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( (object_fakes.object_name_1, ), (object_fakes.object_name_2, ), @@ -90,7 +98,9 @@ class TestObjectList(TestObject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -102,12 +112,8 @@ class TestObjectList(TestObject): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) - datalist = ( - (object_fakes.object_name_2, ), - ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_object_list_objects_delimiter(self, o_mock): o_mock.return_value = [ @@ -124,7 +130,9 @@ class TestObjectList(TestObject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -136,12 +144,8 @@ class TestObjectList(TestObject): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) - datalist = ( - (object_fakes.object_name_2, ), - ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_object_list_objects_marker(self, o_mock): o_mock.return_value = [ @@ -158,7 +162,9 @@ class TestObjectList(TestObject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -170,12 +176,8 @@ class TestObjectList(TestObject): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) - datalist = ( - (object_fakes.object_name_2, ), - ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_object_list_objects_end_marker(self, o_mock): o_mock.return_value = [ @@ -192,7 +194,9 @@ class TestObjectList(TestObject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -204,12 +208,8 @@ class TestObjectList(TestObject): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) - datalist = ( - (object_fakes.object_name_2, ), - ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_object_list_objects_limit(self, o_mock): o_mock.return_value = [ @@ -226,7 +226,9 @@ class TestObjectList(TestObject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -238,12 +240,8 @@ class TestObjectList(TestObject): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) - datalist = ( - (object_fakes.object_name_2, ), - ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_object_list_objects_long(self, o_mock): o_mock.return_value = [ @@ -261,7 +259,9 @@ class TestObjectList(TestObject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -308,7 +308,9 @@ class TestObjectList(TestObject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) # Set expected values @@ -320,8 +322,7 @@ class TestObjectList(TestObject): **kwargs ) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( (object_fakes.object_name_1, ), (object_fakes.object_name_2, ), @@ -353,7 +354,9 @@ class TestObjectShow(TestObject): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # Set expected values diff --git a/openstackclient/tests/object/v1/test_object_all.py b/openstackclient/tests/object/v1/test_object_all.py index 7a76ab76..89286b00 100644 --- a/openstackclient/tests/object/v1/test_object_all.py +++ b/openstackclient/tests/object/v1/test_object_all.py @@ -37,6 +37,8 @@ class TestObjectCreate(TestObjectAll): class TestObjectList(TestObjectAll): + columns = ('Name',) + def setUp(self): super(TestObjectList, self).setUp() @@ -69,8 +71,7 @@ class TestObjectList(TestObjectAll): # Lister.take_action() returns two tuples columns, data = self.cmd.take_action(parsed_args) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = [ (object_fakes.object_name_1, ), (object_fakes.object_name_2, ), @@ -101,11 +102,12 @@ class TestObjectList(TestObjectAll): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class Lister in cliff, abstract method take_action() + # returns a tuple containing the column names and an iterable + # containing the data to be listed. columns, data = self.cmd.take_action(parsed_args) - collist = ('Name',) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( (object_fakes.object_name_2, ), ) @@ -150,7 +152,9 @@ class TestObjectShow(TestObjectAll): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) collist = ( diff --git a/openstackclient/tests/volume/v1/test_qos_specs.py b/openstackclient/tests/volume/v1/test_qos_specs.py index c2e6c0af..7ecc8ee8 100644 --- a/openstackclient/tests/volume/v1/test_qos_specs.py +++ b/openstackclient/tests/volume/v1/test_qos_specs.py @@ -69,6 +69,18 @@ class TestQosAssociate(TestQos): class TestQosCreate(TestQos): + + columns = ( + 'consumer', + 'id', + 'name', + ) + datalist = ( + volume_fakes.qos_consumer, + volume_fakes.qos_id, + volume_fakes.qos_name + ) + def setUp(self): super(TestQosCreate, self).setUp() @@ -97,12 +109,7 @@ class TestQosCreate(TestQos): {'consumer': volume_fakes.qos_default_consumer} ) - collist = ( - 'consumer', - 'id', - 'name' - ) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( volume_fakes.qos_default_consumer, volume_fakes.qos_id, @@ -133,19 +140,8 @@ class TestQosCreate(TestQos): volume_fakes.qos_name, {'consumer': volume_fakes.qos_consumer} ) - - collist = ( - 'consumer', - 'id', - 'name' - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.qos_consumer, - volume_fakes.qos_id, - volume_fakes.qos_name - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_qos_create_with_properties(self): self.qos_mock.create.return_value = fakes.FakeResource( @@ -176,17 +172,11 @@ class TestQosCreate(TestQos): specs ) - collist = ( - 'consumer', - 'id', - 'name', + columns = self.columns + ( 'specs', ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.qos_consumer, - volume_fakes.qos_id, - volume_fakes.qos_name, + self.assertEqual(columns, columns) + datalist = self.datalist + ( volume_fakes.qos_specs, ) self.assertEqual(datalist, data) diff --git a/openstackclient/tests/volume/v1/test_volume.py b/openstackclient/tests/volume/v1/test_volume.py index 70ff50de..00c509b5 100644 --- a/openstackclient/tests/volume/v1/test_volume.py +++ b/openstackclient/tests/volume/v1/test_volume.py @@ -49,6 +49,29 @@ class TestVolume(volume_fakes.TestVolumev1): class TestVolumeCreate(TestVolume): + columns = ( + 'attach_status', + 'availability_zone', + 'display_description', + 'display_name', + 'id', + 'properties', + 'size', + 'status', + 'type', + ) + datalist = ( + 'detached', + volume_fakes.volume_zone, + volume_fakes.volume_description, + volume_fakes.volume_name, + volume_fakes.volume_id, + volume_fakes.volume_metadata_str, + volume_fakes.volume_size, + volume_fakes.volume_status, + volume_fakes.volume_type, + ) + def setUp(self): super(TestVolumeCreate, self).setUp() @@ -72,7 +95,9 @@ class TestVolumeCreate(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # VolumeManager.create(size, snapshot_id=, source_volid=, @@ -93,31 +118,8 @@ class TestVolumeCreate(TestVolume): None, None, ) - - collist = ( - 'attach_status', - 'availability_zone', - 'display_description', - 'display_name', - 'id', - 'properties', - 'size', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - 'detached', - volume_fakes.volume_zone, - volume_fakes.volume_description, - volume_fakes.volume_name, - volume_fakes.volume_id, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_options(self): arglist = [ @@ -136,7 +138,9 @@ class TestVolumeCreate(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # VolumeManager.create(size, snapshot_id=, source_volid=, @@ -158,30 +162,8 @@ class TestVolumeCreate(TestVolume): None, ) - collist = ( - 'attach_status', - 'availability_zone', - 'display_description', - 'display_name', - 'id', - 'properties', - 'size', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - 'detached', - volume_fakes.volume_zone, - volume_fakes.volume_description, - volume_fakes.volume_name, - volume_fakes.volume_id, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_user_project_id(self): # Return a project @@ -211,7 +193,9 @@ class TestVolumeCreate(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # VolumeManager.create(size, snapshot_id=, source_volid=, @@ -233,30 +217,8 @@ class TestVolumeCreate(TestVolume): None, ) - collist = ( - 'attach_status', - 'availability_zone', - 'display_description', - 'display_name', - 'id', - 'properties', - 'size', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - 'detached', - volume_fakes.volume_zone, - volume_fakes.volume_description, - volume_fakes.volume_name, - volume_fakes.volume_id, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_user_project_name(self): # Return a project @@ -286,7 +248,9 @@ class TestVolumeCreate(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # VolumeManager.create(size, snapshot_id=, source_volid=, @@ -308,30 +272,8 @@ class TestVolumeCreate(TestVolume): None, ) - collist = ( - 'attach_status', - 'availability_zone', - 'display_description', - 'display_name', - 'id', - 'properties', - 'size', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - 'detached', - volume_fakes.volume_zone, - volume_fakes.volume_description, - volume_fakes.volume_name, - volume_fakes.volume_id, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_properties(self): arglist = [ @@ -347,7 +289,9 @@ class TestVolumeCreate(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # VolumeManager.create(size, snapshot_id=, source_volid=, @@ -369,30 +313,8 @@ class TestVolumeCreate(TestVolume): None, ) - collist = ( - 'attach_status', - 'availability_zone', - 'display_description', - 'display_name', - 'id', - 'properties', - 'size', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - 'detached', - volume_fakes.volume_zone, - volume_fakes.volume_description, - volume_fakes.volume_name, - volume_fakes.volume_id, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_image_id(self): self.images_mock.get.return_value = fakes.FakeResource( @@ -413,7 +335,9 @@ class TestVolumeCreate(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # VolumeManager.create(size, snapshot_id=, source_volid=, @@ -435,30 +359,8 @@ class TestVolumeCreate(TestVolume): volume_fakes.image_id, ) - collist = ( - 'attach_status', - 'availability_zone', - 'display_description', - 'display_name', - 'id', - 'properties', - 'size', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - 'detached', - volume_fakes.volume_zone, - volume_fakes.volume_description, - volume_fakes.volume_name, - volume_fakes.volume_id, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_image_name(self): self.images_mock.get.return_value = fakes.FakeResource( @@ -479,7 +381,9 @@ class TestVolumeCreate(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) # VolumeManager.create(size, snapshot_id=, source_volid=, @@ -501,34 +405,29 @@ class TestVolumeCreate(TestVolume): volume_fakes.image_id, ) - collist = ( - 'attach_status', - 'availability_zone', - 'display_description', - 'display_name', - 'id', - 'properties', - 'size', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - 'detached', - volume_fakes.volume_zone, - volume_fakes.volume_description, - volume_fakes.volume_name, - volume_fakes.volume_id, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) class TestVolumeList(TestVolume): + columns = ( + 'ID', + 'Display Name', + 'Status', + 'Size', + 'Attached to', + ) + datalist = ( + ( + volume_fakes.volume_id, + volume_fakes.volume_name, + volume_fakes.volume_status, + volume_fakes.volume_size, + '', + ), + ) + def setUp(self): super(TestVolumeList, self).setUp() @@ -555,23 +454,8 @@ class TestVolumeList(TestVolume): columns, data = self.cmd.take_action(parsed_args) - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, columns) - - datalist = (( - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_status, - volume_fakes.volume_size, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_volume_list_name(self): arglist = [ @@ -586,24 +470,8 @@ class TestVolumeList(TestVolume): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, tuple(columns)) - - datalist = (( - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_status, - volume_fakes.volume_size, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, tuple(columns)) + self.assertEqual(self.datalist, tuple(data)) def test_volume_list_status(self): arglist = [ @@ -618,24 +486,8 @@ class TestVolumeList(TestVolume): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, tuple(columns)) - - datalist = (( - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_status, - volume_fakes.volume_size, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, tuple(columns)) + self.assertEqual(self.datalist, tuple(data)) def test_volume_list_all_projects(self): arglist = [ @@ -650,24 +502,8 @@ class TestVolumeList(TestVolume): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, columns) - - datalist = (( - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_status, - volume_fakes.volume_size, - '', - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, tuple(columns)) + self.assertEqual(self.datalist, tuple(data)) def test_volume_list_long(self): arglist = [ @@ -760,7 +596,6 @@ class TestVolumeSet(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -786,7 +621,6 @@ class TestVolumeSet(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -812,7 +646,6 @@ class TestVolumeSet(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values @@ -878,7 +711,6 @@ class TestVolumeSet(TestVolume): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples self.cmd.take_action(parsed_args) # Set expected values diff --git a/openstackclient/tests/volume/v2/fakes.py b/openstackclient/tests/volume/v2/fakes.py index 60cec335..2fc5c8ff 100644 --- a/openstackclient/tests/volume/v2/fakes.py +++ b/openstackclient/tests/volume/v2/fakes.py @@ -202,6 +202,8 @@ class FakeVolumeClient(object): self.restores.resource_class = fakes.FakeResource(None, {}) self.qos_specs = mock.Mock() self.qos_specs.resource_class = fakes.FakeResource(None, {}) + self.availability_zones = mock.Mock() + self.availability_zones.resource_class = fakes.FakeResource(None, {}) self.auth_token = kwargs['token'] self.management_url = kwargs['endpoint'] @@ -254,9 +256,10 @@ class FakeVolume(object): 'key' + uuid.uuid4().hex: 'val' + uuid.uuid4().hex}, 'snapshot_id': random.randint(1, 5), 'availability_zone': 'zone' + uuid.uuid4().hex, - 'attachments': { + 'attachments': [{ 'device': '/dev/' + uuid.uuid4().hex, - 'server_id': uuid.uuid4().hex}, + 'server_id': uuid.uuid4().hex, + }, ], } # Overwrite default attributes if there are some attributes set @@ -304,3 +307,55 @@ class FakeVolume(object): volumes = FakeVolume.create_volumes(count) return mock.MagicMock(side_effect=volumes) + + +class FakeAvailabilityZone(object): + """Fake one or more volume availability zones (AZs).""" + + @staticmethod + def create_one_availability_zone(attrs={}, methods={}): + """Create a fake AZ. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :return: + A FakeResource object with zoneName, zoneState, etc. + """ + # Set default attributes. + availability_zone = { + 'zoneName': uuid.uuid4().hex, + 'zoneState': {'available': True}, + } + + # Overwrite default attributes. + availability_zone.update(attrs) + + availability_zone = fakes.FakeResource( + info=copy.deepcopy(availability_zone), + methods=methods, + loaded=True) + return availability_zone + + @staticmethod + def create_availability_zones(attrs={}, methods={}, count=2): + """Create multiple fake AZs. + + :param Dictionary attrs: + A dictionary with all attributes + :param Dictionary methods: + A dictionary with all methods + :param int count: + The number of AZs to fake + :return: + A list of FakeResource objects faking the AZs + """ + availability_zones = [] + for i in range(0, count): + availability_zone = \ + FakeAvailabilityZone.create_one_availability_zone( + attrs, methods) + availability_zones.append(availability_zone) + + return availability_zones diff --git a/openstackclient/tests/volume/v2/test_backup.py b/openstackclient/tests/volume/v2/test_backup.py index 7af22e8a..dc1d7877 100644 --- a/openstackclient/tests/volume/v2/test_backup.py +++ b/openstackclient/tests/volume/v2/test_backup.py @@ -166,6 +166,24 @@ class TestBackupRestore(TestBackup): class TestBackupList(TestBackup): + + columns = [ + 'ID', + 'Name', + 'Description', + 'Status', + 'Size', + ] + datalist = ( + ( + volume_fakes.backup_id, + volume_fakes.backup_name, + volume_fakes.backup_description, + volume_fakes.backup_status, + volume_fakes.backup_size + ), + ) + def setUp(self): super(TestBackupList, self).setUp() @@ -193,17 +211,8 @@ class TestBackupList(TestBackup): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - collist = ['ID', 'Name', 'Description', 'Status', 'Size'] - self.assertEqual(collist, columns) - - datalist = (( - volume_fakes.backup_id, - volume_fakes.backup_name, - volume_fakes.backup_description, - volume_fakes.backup_status, - volume_fakes.backup_size - ),) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, tuple(data)) def test_backup_list_with_options(self): arglist = ["--long"] @@ -212,9 +221,13 @@ class TestBackupList(TestBackup): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - collist = ['ID', 'Name', 'Description', 'Status', 'Size', - 'Availability Zone', 'Volume', 'Container'] - self.assertEqual(collist, columns) + columns = self.columns + [ + 'Availability Zone', + 'Volume', + 'Container', + ] + + self.assertEqual(columns, columns) datalist = (( volume_fakes.backup_id, diff --git a/openstackclient/tests/volume/v2/test_qos_specs.py b/openstackclient/tests/volume/v2/test_qos_specs.py index 4222ed07..403634a3 100644 --- a/openstackclient/tests/volume/v2/test_qos_specs.py +++ b/openstackclient/tests/volume/v2/test_qos_specs.py @@ -69,6 +69,18 @@ class TestQosAssociate(TestQos): class TestQosCreate(TestQos): + + columns = ( + 'consumer', + 'id', + 'name' + ) + datalist = ( + volume_fakes.qos_consumer, + volume_fakes.qos_id, + volume_fakes.qos_name + ) + def setUp(self): super(TestQosCreate, self).setUp() @@ -97,12 +109,7 @@ class TestQosCreate(TestQos): {'consumer': volume_fakes.qos_default_consumer} ) - collist = ( - 'consumer', - 'id', - 'name' - ) - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = ( volume_fakes.qos_default_consumer, volume_fakes.qos_id, @@ -134,18 +141,8 @@ class TestQosCreate(TestQos): {'consumer': volume_fakes.qos_consumer} ) - collist = ( - 'consumer', - 'id', - 'name' - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.qos_consumer, - volume_fakes.qos_id, - volume_fakes.qos_name - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_qos_create_with_properties(self): self.qos_mock.create.return_value = fakes.FakeResource( @@ -176,17 +173,11 @@ class TestQosCreate(TestQos): specs ) - collist = ( - 'consumer', - 'id', - 'name', + columns = self.columns + ( 'specs', ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.qos_consumer, - volume_fakes.qos_id, - volume_fakes.qos_name, + self.assertEqual(columns, columns) + datalist = self.datalist + ( volume_fakes.qos_specs, ) self.assertEqual(datalist, data) diff --git a/openstackclient/tests/volume/v2/test_snapshot.py b/openstackclient/tests/volume/v2/test_snapshot.py index 3b30d4ef..1c1dd437 100644 --- a/openstackclient/tests/volume/v2/test_snapshot.py +++ b/openstackclient/tests/volume/v2/test_snapshot.py @@ -202,6 +202,15 @@ class TestSnapshotUnset(TestSnapshot): class TestSnapshotList(TestSnapshot): + + columns = [ + "ID", + "Name", + "Description", + "Status", + "Size" + ] + def setUp(self): super(TestSnapshotList, self).setUp() @@ -231,8 +240,7 @@ class TestSnapshotList(TestSnapshot): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - collist = ["ID", "Name", "Description", "Status", "Size"] - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = (( volume_fakes.snapshot_id, volume_fakes.snapshot_name, @@ -249,9 +257,12 @@ class TestSnapshotList(TestSnapshot): columns, data = self.cmd.take_action(parsed_args) - collist = ["ID", "Name", "Description", "Status", "Size", "Created At", - "Volume", "Properties"] - self.assertEqual(collist, columns) + columns = self.columns + [ + "Created At", + "Volume", + "Properties" + ] + self.assertEqual(columns, columns) datalist = (( volume_fakes.snapshot_id, @@ -277,14 +288,7 @@ class TestSnapshotList(TestSnapshot): columns, data = self.cmd.take_action(parsed_args) - collist = [ - "ID", - "Name", - "Description", - "Status", - "Size" - ] - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = (( volume_fakes.snapshot_id, diff --git a/openstackclient/tests/volume/v2/test_type.py b/openstackclient/tests/volume/v2/test_type.py index c63cd1fa..9bf60363 100644 --- a/openstackclient/tests/volume/v2/test_type.py +++ b/openstackclient/tests/volume/v2/test_type.py @@ -44,6 +44,17 @@ class TestType(volume_fakes.TestVolume): class TestTypeCreate(TestType): + columns = ( + 'description', + 'id', + 'name', + ) + datalist = ( + volume_fakes.type_description, + volume_fakes.type_id, + volume_fakes.type_name, + ) + def setUp(self): super(TestTypeCreate, self).setUp() @@ -76,18 +87,8 @@ class TestTypeCreate(TestType): is_public=True, ) - collist = ( - 'description', - 'id', - 'name', - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.type_description, - volume_fakes.type_id, - volume_fakes.type_name, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_type_create_private(self): arglist = [ @@ -110,21 +111,17 @@ class TestTypeCreate(TestType): is_public=False, ) - collist = ( - 'description', - 'id', - 'name', - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.type_description, - volume_fakes.type_id, - volume_fakes.type_name, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) class TestTypeList(TestType): + + columns = [ + "ID", + "Name" + ] + def setUp(self): super(TestTypeList, self).setUp() @@ -146,8 +143,7 @@ class TestTypeList(TestType): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - collist = ["ID", "Name"] - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) datalist = (( volume_fakes.type_id, volume_fakes.type_name, @@ -160,8 +156,11 @@ class TestTypeList(TestType): parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - collist = ["ID", "Name", "Description", "Properties"] - self.assertEqual(collist, columns) + columns = self.columns + [ + "Description", + "Properties" + ] + self.assertEqual(columns, columns) datalist = (( volume_fakes.type_id, volume_fakes.type_name, diff --git a/openstackclient/tests/volume/v2/test_volume.py b/openstackclient/tests/volume/v2/test_volume.py index 50826c31..df43cb2b 100644 --- a/openstackclient/tests/volume/v2/test_volume.py +++ b/openstackclient/tests/volume/v2/test_volume.py @@ -16,6 +16,7 @@ import copy from mock import call +from openstackclient.common import utils from openstackclient.tests import fakes from openstackclient.tests.identity.v3 import fakes as identity_fakes from openstackclient.tests.volume.v2 import fakes as volume_fakes @@ -48,13 +49,37 @@ class TestVolume(volume_fakes.TestVolume): class TestVolumeCreate(TestVolume): + + columns = ( + 'attachments', + 'availability_zone', + 'description', + 'id', + 'name', + 'properties', + 'size', + 'snapshot_id', + 'status', + 'type', + ) + def setUp(self): super(TestVolumeCreate, self).setUp() - self.volumes_mock.create.return_value = fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.VOLUME), - loaded=True, + self.new_volume = volume_fakes.FakeVolume.create_one_volume() + self.volumes_mock.create.return_value = self.new_volume + + self.datalist = ( + self.new_volume.attachments, + self.new_volume.availability_zone, + self.new_volume.description, + self.new_volume.id, + self.new_volume.name, + utils.format_dict(self.new_volume.metadata), + self.new_volume.size, + self.new_volume.snapshot_id, + self.new_volume.status, + self.new_volume.volume_type, ) # Get the command object to test @@ -62,22 +87,24 @@ class TestVolumeCreate(TestVolume): def test_volume_create_min_options(self): arglist = [ - '--size', str(volume_fakes.volume_size), - volume_fakes.volume_name, + '--size', str(self.new_volume.size), + self.new_volume.name, ] verifylist = [ - ('size', volume_fakes.volume_size), - ('name', volume_fakes.volume_name), + ('size', self.new_volume.size), + ('name', self.new_volume.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.volumes_mock.create.assert_called_with( - size=volume_fakes.volume_size, + size=self.new_volume.size, snapshot_id=None, - name=volume_fakes.volume_name, + name=self.new_volume.name, description=None, volume_type=None, user_id=None, @@ -88,93 +115,47 @@ class TestVolumeCreate(TestVolume): source_volid=None ) - collist = ( - 'attachments', - 'availability_zone', - 'description', - 'id', - 'name', - 'properties', - 'size', - 'snapshot_id', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.volume_attachments, - volume_fakes.volume_availability_zone, - volume_fakes.volume_description, - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_snapshot_id, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_options(self): arglist = [ - '--size', str(volume_fakes.volume_size), - '--description', volume_fakes.volume_description, - '--type', volume_fakes.volume_type, - '--availability-zone', volume_fakes.volume_availability_zone, - volume_fakes.volume_name, + '--size', str(self.new_volume.size), + '--description', self.new_volume.description, + '--type', self.new_volume.volume_type, + '--availability-zone', self.new_volume.availability_zone, + self.new_volume.name, ] verifylist = [ - ('size', volume_fakes.volume_size), - ('description', volume_fakes.volume_description), - ('type', volume_fakes.volume_type), - ('availability_zone', volume_fakes.volume_availability_zone), - ('name', volume_fakes.volume_name), + ('size', self.new_volume.size), + ('description', self.new_volume.description), + ('type', self.new_volume.volume_type), + ('availability_zone', self.new_volume.availability_zone), + ('name', self.new_volume.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.volumes_mock.create.assert_called_with( - size=volume_fakes.volume_size, + size=self.new_volume.size, snapshot_id=None, - name=volume_fakes.volume_name, - description=volume_fakes.volume_description, - volume_type=volume_fakes.volume_type, + name=self.new_volume.name, + description=self.new_volume.description, + volume_type=self.new_volume.volume_type, user_id=None, project_id=None, - availability_zone=volume_fakes.volume_availability_zone, + availability_zone=self.new_volume.availability_zone, metadata=None, imageRef=None, source_volid=None ) - collist = ( - 'attachments', - 'availability_zone', - 'description', - 'id', - 'name', - 'properties', - 'size', - 'snapshot_id', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.volume_attachments, - volume_fakes.volume_availability_zone, - volume_fakes.volume_description, - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_snapshot_id, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_user_project_id(self): # Return a project @@ -191,26 +172,28 @@ class TestVolumeCreate(TestVolume): ) arglist = [ - '--size', str(volume_fakes.volume_size), + '--size', str(self.new_volume.size), '--project', identity_fakes.project_id, '--user', identity_fakes.user_id, - volume_fakes.volume_name, + self.new_volume.name, ] verifylist = [ - ('size', volume_fakes.volume_size), + ('size', self.new_volume.size), ('project', identity_fakes.project_id), ('user', identity_fakes.user_id), - ('name', volume_fakes.volume_name), + ('name', self.new_volume.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.volumes_mock.create.assert_called_with( - size=volume_fakes.volume_size, + size=self.new_volume.size, snapshot_id=None, - name=volume_fakes.volume_name, + name=self.new_volume.name, description=None, volume_type=None, user_id=identity_fakes.user_id, @@ -221,32 +204,8 @@ class TestVolumeCreate(TestVolume): source_volid=None ) - collist = ( - 'attachments', - 'availability_zone', - 'description', - 'id', - 'name', - 'properties', - 'size', - 'snapshot_id', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.volume_attachments, - volume_fakes.volume_availability_zone, - volume_fakes.volume_description, - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_snapshot_id, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_user_project_name(self): # Return a project @@ -263,26 +222,28 @@ class TestVolumeCreate(TestVolume): ) arglist = [ - '--size', str(volume_fakes.volume_size), + '--size', str(self.new_volume.size), '--project', identity_fakes.project_name, '--user', identity_fakes.user_name, - volume_fakes.volume_name, + self.new_volume.name, ] verifylist = [ - ('size', volume_fakes.volume_size), + ('size', self.new_volume.size), ('project', identity_fakes.project_name), ('user', identity_fakes.user_name), - ('name', volume_fakes.volume_name), + ('name', self.new_volume.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.volumes_mock.create.assert_called_with( - size=volume_fakes.volume_size, + size=self.new_volume.size, snapshot_id=None, - name=volume_fakes.volume_name, + name=self.new_volume.name, description=None, volume_type=None, user_id=identity_fakes.user_id, @@ -293,54 +254,32 @@ class TestVolumeCreate(TestVolume): source_volid=None ) - collist = ( - 'attachments', - 'availability_zone', - 'description', - 'id', - 'name', - 'properties', - 'size', - 'snapshot_id', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.volume_attachments, - volume_fakes.volume_availability_zone, - volume_fakes.volume_description, - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_snapshot_id, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_properties(self): arglist = [ '--property', 'Alpha=a', '--property', 'Beta=b', - '--size', str(volume_fakes.volume_size), - volume_fakes.volume_name, + '--size', str(self.new_volume.size), + self.new_volume.name, ] verifylist = [ ('property', {'Alpha': 'a', 'Beta': 'b'}), - ('size', volume_fakes.volume_size), - ('name', volume_fakes.volume_name), + ('size', self.new_volume.size), + ('name', self.new_volume.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.volumes_mock.create.assert_called_with( - size=volume_fakes.volume_size, + size=self.new_volume.size, snapshot_id=None, - name=volume_fakes.volume_name, + name=self.new_volume.name, description=None, volume_type=None, user_id=None, @@ -351,32 +290,8 @@ class TestVolumeCreate(TestVolume): source_volid=None ) - collist = ( - 'attachments', - 'availability_zone', - 'description', - 'id', - 'name', - 'properties', - 'size', - 'snapshot_id', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.volume_attachments, - volume_fakes.volume_availability_zone, - volume_fakes.volume_description, - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_snapshot_id, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_image_id(self): self.images_mock.get.return_value = fakes.FakeResource( @@ -387,23 +302,25 @@ class TestVolumeCreate(TestVolume): arglist = [ '--image', volume_fakes.image_id, - '--size', str(volume_fakes.volume_size), - volume_fakes.volume_name, + '--size', str(self.new_volume.size), + self.new_volume.name, ] verifylist = [ ('image', volume_fakes.image_id), - ('size', volume_fakes.volume_size), - ('name', volume_fakes.volume_name), + ('size', self.new_volume.size), + ('name', self.new_volume.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.volumes_mock.create.assert_called_with( - size=volume_fakes.volume_size, + size=self.new_volume.size, snapshot_id=None, - name=volume_fakes.volume_name, + name=self.new_volume.name, description=None, volume_type=None, user_id=None, @@ -411,35 +328,11 @@ class TestVolumeCreate(TestVolume): availability_zone=None, metadata=None, imageRef=volume_fakes.image_id, - source_volid=None + source_volid=None, ) - collist = ( - 'attachments', - 'availability_zone', - 'description', - 'id', - 'name', - 'properties', - 'size', - 'snapshot_id', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.volume_attachments, - volume_fakes.volume_availability_zone, - volume_fakes.volume_description, - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_snapshot_id, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) def test_volume_create_image_name(self): self.images_mock.get.return_value = fakes.FakeResource( @@ -450,23 +343,25 @@ class TestVolumeCreate(TestVolume): arglist = [ '--image', volume_fakes.image_name, - '--size', str(volume_fakes.volume_size), - volume_fakes.volume_name, + '--size', str(self.new_volume.size), + self.new_volume.name, ] verifylist = [ ('image', volume_fakes.image_name), - ('size', volume_fakes.volume_size), - ('name', volume_fakes.volume_name), + ('size', self.new_volume.size), + ('name', self.new_volume.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples + # In base command class ShowOne in cliff, abstract method take_action() + # returns a two-part tuple with a tuple of column names and a tuple of + # data to be shown. columns, data = self.cmd.take_action(parsed_args) self.volumes_mock.create.assert_called_with( - size=volume_fakes.volume_size, + size=self.new_volume.size, snapshot_id=None, - name=volume_fakes.volume_name, + name=self.new_volume.name, description=None, volume_type=None, user_id=None, @@ -477,36 +372,61 @@ class TestVolumeCreate(TestVolume): source_volid=None ) - collist = ( - 'attachments', - 'availability_zone', - 'description', - 'id', - 'name', - 'properties', - 'size', - 'snapshot_id', - 'status', - 'type', - ) - self.assertEqual(collist, columns) - datalist = ( - volume_fakes.volume_attachments, - volume_fakes.volume_availability_zone, - volume_fakes.volume_description, - volume_fakes.volume_id, - volume_fakes.volume_name, - volume_fakes.volume_metadata_str, - volume_fakes.volume_size, - volume_fakes.volume_snapshot_id, - volume_fakes.volume_status, - volume_fakes.volume_type, - ) - self.assertEqual(datalist, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.datalist, data) + + +class TestVolumeDelete(TestVolume): + def setUp(self): + super(TestVolumeDelete, self).setUp() + + self.volumes_mock.delete.return_value = None + + # Get the command object to mock + self.cmd = volume.DeleteVolume(self.app, None) + + def test_volume_delete_one_volume(self): + volumes = self.setup_volumes_mock(count=1) + + arglist = [ + volumes[0].id + ] + verifylist = [ + ("volumes", [volumes[0].id]) + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + self.volumes_mock.delete.assert_called_with(volumes[0].id) + + def test_volume_delete_multi_volumes(self): + volumes = self.setup_volumes_mock(count=3) + + arglist = [v.id for v in volumes] + verifylist = [ + ('volumes', arglist), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + calls = [call(v.id) for v in volumes] + + self.volumes_mock.delete.assert_has_calls(calls) class TestVolumeList(TestVolume): + columns = [ + 'ID', + 'Display Name', + 'Status', + 'Size', + 'Attached to', + ] + def setUp(self): super(TestVolumeList, self).setUp() @@ -549,14 +469,7 @@ class TestVolumeList(TestVolume): columns, data = self.cmd.take_action(parsed_args) - collist = [ - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ] - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) server = volume_fakes.volume_attachment_server['server_id'] device = volume_fakes.volume_attachment_server['device'] @@ -584,19 +497,11 @@ class TestVolumeList(TestVolume): columns, data = self.cmd.take_action(parsed_args) - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, tuple(columns)) + self.assertEqual(self.columns, columns) server = volume_fakes.volume_attachment_server['server_id'] device = volume_fakes.volume_attachment_server['device'] msg = 'Attached to %s on %s ' % (server, device) - datalist = (( volume_fakes.volume_id, volume_fakes.volume_name, @@ -622,19 +527,11 @@ class TestVolumeList(TestVolume): columns, data = self.cmd.take_action(parsed_args) - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, tuple(columns)) + self.assertEqual(self.columns, columns) server = volume_fakes.volume_attachment_server['server_id'] device = volume_fakes.volume_attachment_server['device'] msg = 'Attached to %s on %s ' % (server, device) - datalist = (( volume_fakes.volume_id, volume_fakes.volume_name, @@ -658,19 +555,10 @@ class TestVolumeList(TestVolume): columns, data = self.cmd.take_action(parsed_args) - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, tuple(columns)) - + self.assertEqual(self.columns, columns) server = volume_fakes.volume_attachment_server['server_id'] device = volume_fakes.volume_attachment_server['device'] msg = 'Attached to %s on %s ' % (server, device) - datalist = (( volume_fakes.volume_id, volume_fakes.volume_name, @@ -696,19 +584,11 @@ class TestVolumeList(TestVolume): columns, data = self.cmd.take_action(parsed_args) - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, tuple(columns)) + self.assertEqual(self.columns, columns) server = volume_fakes.volume_attachment_server['server_id'] device = volume_fakes.volume_attachment_server['device'] msg = 'Attached to %s on %s ' % (server, device) - datalist = (( volume_fakes.volume_id, volume_fakes.volume_name, @@ -732,19 +612,11 @@ class TestVolumeList(TestVolume): columns, data = self.cmd.take_action(parsed_args) - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, tuple(columns)) + self.assertEqual(self.columns, columns) server = volume_fakes.volume_attachment_server['server_id'] device = volume_fakes.volume_attachment_server['device'] msg = 'Attached to %s on %s ' % (server, device) - datalist = (( volume_fakes.volume_id, volume_fakes.volume_name, @@ -768,14 +640,7 @@ class TestVolumeList(TestVolume): columns, data = self.cmd.take_action(parsed_args) - collist = ( - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ) - self.assertEqual(collist, tuple(columns)) + self.assertEqual(self.columns, columns) server = volume_fakes.volume_attachment_server['server_id'] device = volume_fakes.volume_attachment_server['device'] @@ -803,14 +668,7 @@ class TestVolumeList(TestVolume): columns, data = self.cmd.take_action(parsed_args) - collist = [ - 'ID', - 'Display Name', - 'Status', - 'Size', - 'Attached to', - ] - self.assertEqual(collist, columns) + self.assertEqual(self.columns, columns) server = volume_fakes.volume_attachment_server['server_id'] device = volume_fakes.volume_attachment_server['device'] @@ -892,44 +750,3 @@ class TestVolumeShow(TestVolume): self.assertEqual(volume_fakes.VOLUME_columns, columns) self.assertEqual(volume_fakes.VOLUME_data, data) - - -class TestVolumeDelete(TestVolume): - def setUp(self): - super(TestVolumeDelete, self).setUp() - - self.volumes_mock.delete.return_value = None - - # Get the command object to mock - self.cmd = volume.DeleteVolume(self.app, None) - - def test_volume_delete_one_volume(self): - volumes = self.setup_volumes_mock(count=1) - - arglist = [ - volumes[0].id - ] - verifylist = [ - ("volumes", [volumes[0].id]) - ] - - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - self.cmd.take_action(parsed_args) - self.volumes_mock.delete.assert_called_with(volumes[0].id) - - def test_volume_delete_multi_volumes(self): - volumes = self.setup_volumes_mock(count=3) - - arglist = [v.id for v in volumes] - verifylist = [ - ('volumes', arglist), - ] - - parsed_args = self.check_parser(self.cmd, arglist, verifylist) - - self.cmd.take_action(parsed_args) - - calls = [call(v.id) for v in volumes] - - self.volumes_mock.delete.assert_has_calls(calls) diff --git a/openstackclient/volume/v1/backup.py b/openstackclient/volume/v1/backup.py index 4f2ff8bb..32f39fb5 100644 --- a/openstackclient/volume/v1/backup.py +++ b/openstackclient/volume/v1/backup.py @@ -16,21 +16,15 @@ """Volume v1 Backup action implementations""" import copy -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import utils -class CreateBackup(show.ShowOne): +class CreateBackup(command.ShowOne): """Create new backup""" - log = logging.getLogger(__name__ + '.CreateBackup') - def get_parser(self, prog_name): parser = super(CreateBackup, self).get_parser(prog_name) parser.add_argument( @@ -57,7 +51,6 @@ class CreateBackup(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume_id = utils.find_resource(volume_client.volumes, @@ -76,8 +69,6 @@ class CreateBackup(show.ShowOne): class DeleteBackup(command.Command): """Delete backup(s)""" - log = logging.getLogger(__name__ + '.DeleteBackup') - def get_parser(self, prog_name): parser = super(DeleteBackup, self).get_parser(prog_name) parser.add_argument( @@ -88,7 +79,6 @@ class DeleteBackup(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume for backup in parsed_args.backups: @@ -97,11 +87,9 @@ class DeleteBackup(command.Command): volume_client.backups.delete(backup_id) -class ListBackup(lister.Lister): +class ListBackup(command.Lister): """List backups""" - log = logging.getLogger(__name__ + '.ListBackup') - def get_parser(self, prog_name): parser = super(ListBackup, self).get_parser(prog_name) parser.add_argument( @@ -112,7 +100,6 @@ class ListBackup(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): def _format_volume_id(volume_id): @@ -157,8 +144,6 @@ class ListBackup(lister.Lister): class RestoreBackup(command.Command): """Restore backup""" - log = logging.getLogger(__name__ + '.RestoreBackup') - def get_parser(self, prog_name): parser = super(RestoreBackup, self).get_parser(prog_name) parser.add_argument( @@ -171,7 +156,6 @@ class RestoreBackup(command.Command): help='Volume to restore to (name or ID)') return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume backup = utils.find_resource(volume_client.backups, @@ -182,11 +166,9 @@ class RestoreBackup(command.Command): destination_volume.id) -class ShowBackup(show.ShowOne): +class ShowBackup(command.ShowOne): """Display backup details""" - log = logging.getLogger(__name__ + '.ShowBackup') - def get_parser(self, prog_name): parser = super(ShowBackup, self).get_parser(prog_name) parser.add_argument( @@ -195,7 +177,6 @@ class ShowBackup(show.ShowOne): help='Backup to display (ID only)') return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume backup = utils.find_resource(volume_client.backups, diff --git a/openstackclient/volume/v1/qos_specs.py b/openstackclient/volume/v1/qos_specs.py index 73e70a21..826e5c49 100644 --- a/openstackclient/volume/v1/qos_specs.py +++ b/openstackclient/volume/v1/qos_specs.py @@ -15,13 +15,9 @@ """Volume v1 QoS action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils @@ -29,8 +25,6 @@ from openstackclient.common import utils class AssociateQos(command.Command): """Associate a QoS specification to a volume type""" - log = logging.getLogger(__name__ + '.AssociateQos') - def get_parser(self, prog_name): parser = super(AssociateQos, self).get_parser(prog_name) parser.add_argument( @@ -45,7 +39,6 @@ class AssociateQos(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, @@ -56,11 +49,9 @@ class AssociateQos(command.Command): volume_client.qos_specs.associate(qos_spec.id, volume_type.id) -class CreateQos(show.ShowOne): +class CreateQos(command.ShowOne): """Create new QoS specification""" - log = logging.getLogger(__name__ + '.CreateQos') - def get_parser(self, prog_name): parser = super(CreateQos, self).get_parser(prog_name) parser.add_argument( @@ -86,7 +77,6 @@ class CreateQos(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume specs = {} @@ -103,8 +93,6 @@ class CreateQos(show.ShowOne): class DeleteQos(command.Command): """Delete QoS specification""" - log = logging.getLogger(__name__ + '.DeleteQos') - def get_parser(self, prog_name): parser = super(DeleteQos, self).get_parser(prog_name) parser.add_argument( @@ -115,7 +103,6 @@ class DeleteQos(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume for qos in parsed_args.qos_specs: @@ -126,8 +113,6 @@ class DeleteQos(command.Command): class DisassociateQos(command.Command): """Disassociate a QoS specification from a volume type""" - log = logging.getLogger(__name__ + '.DisassociateQos') - def get_parser(self, prog_name): parser = super(DisassociateQos, self).get_parser(prog_name) parser.add_argument( @@ -150,7 +135,6 @@ class DisassociateQos(command.Command): return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, @@ -164,12 +148,9 @@ class DisassociateQos(command.Command): volume_client.qos_specs.disassociate_all(qos_spec.id) -class ListQos(lister.Lister): +class ListQos(command.Lister): """List QoS specifications""" - log = logging.getLogger(__name__ + '.ListQos') - - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_specs_list = volume_client.qos_specs.list() @@ -195,8 +176,6 @@ class ListQos(lister.Lister): class SetQos(command.Command): """Set QoS specification properties""" - log = logging.getLogger(__name__ + '.SetQos') - def get_parser(self, prog_name): parser = super(SetQos, self).get_parser(prog_name) parser.add_argument( @@ -213,7 +192,6 @@ class SetQos(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, @@ -226,11 +204,9 @@ class SetQos(command.Command): self.app.log.error("No changes requested\n") -class ShowQos(show.ShowOne): +class ShowQos(command.ShowOne): """Display QoS specification details""" - log = logging.getLogger(__name__ + '.ShowQos') - def get_parser(self, prog_name): parser = super(ShowQos, self).get_parser(prog_name) parser.add_argument( @@ -240,7 +216,6 @@ class ShowQos(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, @@ -261,8 +236,6 @@ class ShowQos(show.ShowOne): class UnsetQos(command.Command): """Unset QoS specification properties""" - log = logging.getLogger(__name__ + '.SetQos') - def get_parser(self, prog_name): parser = super(UnsetQos, self).get_parser(prog_name) parser.add_argument( @@ -280,7 +253,6 @@ class UnsetQos(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, diff --git a/openstackclient/volume/v1/snapshot.py b/openstackclient/volume/v1/snapshot.py index 24379a9a..95200e40 100644 --- a/openstackclient/volume/v1/snapshot.py +++ b/openstackclient/volume/v1/snapshot.py @@ -16,22 +16,16 @@ """Volume v1 Snapshot action implementations""" import copy -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils -class CreateSnapshot(show.ShowOne): +class CreateSnapshot(command.ShowOne): """Create new snapshot""" - log = logging.getLogger(__name__ + '.CreateSnapshot') - def get_parser(self, prog_name): parser = super(CreateSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -59,7 +53,6 @@ class CreateSnapshot(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume_id = utils.find_resource(volume_client.volumes, @@ -81,8 +74,6 @@ class CreateSnapshot(show.ShowOne): class DeleteSnapshot(command.Command): """Delete snapshot(s)""" - log = logging.getLogger(__name__ + '.DeleteSnapshot') - def get_parser(self, prog_name): parser = super(DeleteSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -93,7 +84,6 @@ class DeleteSnapshot(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume for snapshot in parsed_args.snapshots: @@ -102,11 +92,9 @@ class DeleteSnapshot(command.Command): volume_client.volume_snapshots.delete(snapshot_id) -class ListSnapshot(lister.Lister): +class ListSnapshot(command.Lister): """List snapshots""" - log = logging.getLogger(__name__ + '.ListSnapshot') - def get_parser(self, prog_name): parser = super(ListSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -123,7 +111,6 @@ class ListSnapshot(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): def _format_volume_id(volume_id): @@ -179,8 +166,6 @@ class ListSnapshot(lister.Lister): class SetSnapshot(command.Command): """Set snapshot properties""" - log = logging.getLogger(__name__ + '.SetSnapshot') - def get_parser(self, prog_name): parser = super(SetSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -204,7 +189,6 @@ class SetSnapshot(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume snapshot = utils.find_resource(volume_client.volume_snapshots, @@ -227,11 +211,9 @@ class SetSnapshot(command.Command): snapshot.update(**kwargs) -class ShowSnapshot(show.ShowOne): +class ShowSnapshot(command.ShowOne): """Display snapshot details""" - log = logging.getLogger(__name__ + '.ShowSnapshot') - def get_parser(self, prog_name): parser = super(ShowSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -240,7 +222,6 @@ class ShowSnapshot(show.ShowOne): help='Snapshot to display (name or ID)') return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume snapshot = utils.find_resource(volume_client.volume_snapshots, @@ -256,8 +237,6 @@ class ShowSnapshot(show.ShowOne): class UnsetSnapshot(command.Command): """Unset snapshot properties""" - log = logging.getLogger(__name__ + '.UnsetSnapshot') - def get_parser(self, prog_name): parser = super(UnsetSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -276,7 +255,6 @@ class UnsetSnapshot(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume snapshot = utils.find_resource( diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py index 17b6c9c8..90827d20 100644 --- a/openstackclient/volume/v1/volume.py +++ b/openstackclient/volume/v1/volume.py @@ -16,22 +16,16 @@ """Volume v1 Volume action implementations""" import argparse -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils -class CreateVolume(show.ShowOne): +class CreateVolume(command.ShowOne): """Create new volume""" - log = logging.getLogger(__name__ + '.CreateVolume') - def get_parser(self, prog_name): parser = super(CreateVolume, self).get_parser(prog_name) parser.add_argument( @@ -102,7 +96,6 @@ class CreateVolume(show.ShowOne): return parser - @utils.log_method(log) def take_action(self, parsed_args): identity_client = self.app.client_manager.identity @@ -166,8 +159,6 @@ class CreateVolume(show.ShowOne): class DeleteVolume(command.Command): """Delete volume(s)""" - log = logging.getLogger(__name__ + '.DeleteVolume') - def get_parser(self, prog_name): parser = super(DeleteVolume, self).get_parser(prog_name) parser.add_argument( @@ -186,7 +177,6 @@ class DeleteVolume(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume for volume in parsed_args.volumes: @@ -198,11 +188,9 @@ class DeleteVolume(command.Command): volume_client.volumes.delete(volume_obj.id) -class ListVolume(lister.Lister): +class ListVolume(command.Lister): """List volumes""" - log = logging.getLogger(__name__ + '.ListVolume') - def get_parser(self, prog_name): parser = super(ListVolume, self).get_parser(prog_name) parser.add_argument( @@ -229,7 +217,6 @@ class ListVolume(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume @@ -316,8 +303,6 @@ class ListVolume(lister.Lister): class SetVolume(command.Command): """Set volume properties""" - log = logging.getLogger(__name__ + '.SetVolume') - def get_parser(self, prog_name): parser = super(SetVolume, self).get_parser(prog_name) parser.add_argument( @@ -350,7 +335,6 @@ class SetVolume(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume = utils.find_resource(volume_client.volumes, parsed_args.volume) @@ -382,11 +366,9 @@ class SetVolume(command.Command): self.app.log.error("No changes requested\n") -class ShowVolume(show.ShowOne): +class ShowVolume(command.ShowOne): """Show volume details""" - log = logging.getLogger(__name__ + '.ShowVolume') - def get_parser(self, prog_name): parser = super(ShowVolume, self).get_parser(prog_name) parser.add_argument( @@ -396,7 +378,6 @@ class ShowVolume(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume = utils.find_resource(volume_client.volumes, parsed_args.volume) @@ -418,8 +399,6 @@ class ShowVolume(show.ShowOne): class UnsetVolume(command.Command): """Unset volume properties""" - log = logging.getLogger(__name__ + '.UnsetVolume') - def get_parser(self, prog_name): parser = super(UnsetVolume, self).get_parser(prog_name) parser.add_argument( @@ -438,7 +417,6 @@ class UnsetVolume(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume = utils.find_resource( diff --git a/openstackclient/volume/v1/volume_type.py b/openstackclient/volume/v1/volume_type.py index b664adfb..24d0b235 100644 --- a/openstackclient/volume/v1/volume_type.py +++ b/openstackclient/volume/v1/volume_type.py @@ -15,22 +15,16 @@ """Volume v1 Type action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils -class CreateVolumeType(show.ShowOne): +class CreateVolumeType(command.ShowOne): """Create new volume type""" - log = logging.getLogger(__name__ + '.CreateVolumeType') - def get_parser(self, prog_name): parser = super(CreateVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -47,7 +41,6 @@ class CreateVolumeType(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume_type = volume_client.volume_types.create(parsed_args.name) @@ -64,8 +57,6 @@ class CreateVolumeType(show.ShowOne): class DeleteVolumeType(command.Command): """Delete volume type""" - log = logging.getLogger(__name__ + '.DeleteVolumeType') - def get_parser(self, prog_name): parser = super(DeleteVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -75,7 +66,6 @@ class DeleteVolumeType(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume_type_id = utils.find_resource( @@ -83,11 +73,9 @@ class DeleteVolumeType(command.Command): volume_client.volume_types.delete(volume_type_id) -class ListVolumeType(lister.Lister): +class ListVolumeType(command.Lister): """List volume types""" - log = logging.getLogger(__name__ + '.ListVolumeType') - def get_parser(self, prog_name): parser = super(ListVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -97,7 +85,6 @@ class ListVolumeType(lister.Lister): help='List additional fields in output') return parser - @utils.log_method(log) def take_action(self, parsed_args): if parsed_args.long: columns = ('ID', 'Name', 'Extra Specs') @@ -116,8 +103,6 @@ class ListVolumeType(lister.Lister): class SetVolumeType(command.Command): """Set volume type properties""" - log = logging.getLogger(__name__ + '.SetVolumeType') - def get_parser(self, prog_name): parser = super(SetVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -134,7 +119,6 @@ class SetVolumeType(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume_type = utils.find_resource( @@ -147,8 +131,6 @@ class SetVolumeType(command.Command): class UnsetVolumeType(command.Command): """Unset volume type properties""" - log = logging.getLogger(__name__ + '.UnsetVolumeType') - def get_parser(self, prog_name): parser = super(UnsetVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -167,7 +149,6 @@ class UnsetVolumeType(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume_type = utils.find_resource( @@ -181,11 +162,9 @@ class UnsetVolumeType(command.Command): self.app.log.error("No changes requested\n") -class ShowVolumeType(show.ShowOne): +class ShowVolumeType(command.ShowOne): """Display volume type details""" - log = logging.getLogger(__name__ + ".ShowVolumeType") - def get_parser(self, prog_name): parser = super(ShowVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -196,7 +175,6 @@ class ShowVolumeType(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume volume_type = utils.find_resource( volume_client.volume_types, parsed_args.volume_type) diff --git a/openstackclient/volume/v2/backup.py b/openstackclient/volume/v2/backup.py index bc919d0b..64ca97ae 100644 --- a/openstackclient/volume/v2/backup.py +++ b/openstackclient/volume/v2/backup.py @@ -15,21 +15,16 @@ """Volume v2 Backup action implementations""" import copy -import logging -from cliff import command -from cliff import lister -from cliff import show import six +from openstackclient.common import command from openstackclient.common import utils -class CreateBackup(show.ShowOne): +class CreateBackup(command.ShowOne): """Create new backup""" - log = logging.getLogger(__name__ + ".CreateBackup") - def get_parser(self, prog_name): parser = super(CreateBackup, self).get_parser(prog_name) parser.add_argument( @@ -56,7 +51,6 @@ class CreateBackup(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume volume_id = utils.find_resource( volume_client.volumes, parsed_args.volume).id @@ -73,8 +67,6 @@ class CreateBackup(show.ShowOne): class DeleteBackup(command.Command): """Delete backup(s)""" - log = logging.getLogger(__name__ + ".DeleteBackup") - def get_parser(self, prog_name): parser = super(DeleteBackup, self).get_parser(prog_name) parser.add_argument( @@ -86,7 +78,6 @@ class DeleteBackup(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume for backup in parsed_args.backups: backup_id = utils.find_resource( @@ -94,11 +85,9 @@ class DeleteBackup(command.Command): volume_client.backups.delete(backup_id) -class ListBackup(lister.Lister): +class ListBackup(command.Lister): """List backups""" - log = logging.getLogger(__name__ + ".ListBackup") - def get_parser(self, prog_name): parser = super(ListBackup, self).get_parser(prog_name) parser.add_argument( @@ -110,7 +99,6 @@ class ListBackup(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) def _format_volume_id(volume_id): """Return a volume name if available @@ -151,11 +139,9 @@ class ListBackup(lister.Lister): ) for s in data)) -class RestoreBackup(show.ShowOne): +class RestoreBackup(command.ShowOne): """Restore backup""" - log = logging.getLogger(__name__ + ".RestoreBackup") - def get_parser(self, prog_name): parser = super(RestoreBackup, self).get_parser(prog_name) parser.add_argument( @@ -171,7 +157,6 @@ class RestoreBackup(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume backup = utils.find_resource(volume_client.backups, parsed_args.backup) destination_volume = utils.find_resource(volume_client.volumes, @@ -179,11 +164,9 @@ class RestoreBackup(show.ShowOne): return volume_client.restores.restore(backup.id, destination_volume.id) -class ShowBackup(show.ShowOne): +class ShowBackup(command.ShowOne): """Display backup details""" - log = logging.getLogger(__name__ + ".ShowBackup") - def get_parser(self, prog_name): parser = super(ShowBackup, self).get_parser(prog_name) parser.add_argument( @@ -193,7 +176,6 @@ class ShowBackup(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume backup = utils.find_resource(volume_client.backups, parsed_args.backup) diff --git a/openstackclient/volume/v2/qos_specs.py b/openstackclient/volume/v2/qos_specs.py index 678fde4f..961cc27e 100644 --- a/openstackclient/volume/v2/qos_specs.py +++ b/openstackclient/volume/v2/qos_specs.py @@ -15,13 +15,9 @@ """Volume v2 QoS action implementations""" -import logging import six -from cliff import command -from cliff import lister -from cliff import show - +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils @@ -29,8 +25,6 @@ from openstackclient.common import utils class AssociateQos(command.Command): """Associate a QoS specification to a volume type""" - log = logging.getLogger(__name__ + '.AssociateQos') - def get_parser(self, prog_name): parser = super(AssociateQos, self).get_parser(prog_name) parser.add_argument( @@ -45,7 +39,6 @@ class AssociateQos(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, @@ -56,11 +49,9 @@ class AssociateQos(command.Command): volume_client.qos_specs.associate(qos_spec.id, volume_type.id) -class CreateQos(show.ShowOne): +class CreateQos(command.ShowOne): """Create new QoS specification""" - log = logging.getLogger(__name__ + '.CreateQos') - def get_parser(self, prog_name): parser = super(CreateQos, self).get_parser(prog_name) parser.add_argument( @@ -86,7 +77,6 @@ class CreateQos(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume specs = {} @@ -103,8 +93,6 @@ class CreateQos(show.ShowOne): class DeleteQos(command.Command): """Delete QoS specification""" - log = logging.getLogger(__name__ + '.DeleteQos') - def get_parser(self, prog_name): parser = super(DeleteQos, self).get_parser(prog_name) parser.add_argument( @@ -115,7 +103,6 @@ class DeleteQos(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume for qos in parsed_args.qos_specs: @@ -126,8 +113,6 @@ class DeleteQos(command.Command): class DisassociateQos(command.Command): """Disassociate a QoS specification from a volume type""" - log = logging.getLogger(__name__ + '.DisassociateQos') - def get_parser(self, prog_name): parser = super(DisassociateQos, self).get_parser(prog_name) parser.add_argument( @@ -150,7 +135,6 @@ class DisassociateQos(command.Command): return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, @@ -164,12 +148,9 @@ class DisassociateQos(command.Command): volume_client.qos_specs.disassociate_all(qos_spec.id) -class ListQos(lister.Lister): +class ListQos(command.Lister): """List QoS specifications""" - log = logging.getLogger(__name__ + '.ListQos') - - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_specs_list = volume_client.qos_specs.list() @@ -195,8 +176,6 @@ class ListQos(lister.Lister): class SetQos(command.Command): """Set QoS specification properties""" - log = logging.getLogger(__name__ + '.SetQos') - def get_parser(self, prog_name): parser = super(SetQos, self).get_parser(prog_name) parser.add_argument( @@ -213,7 +192,6 @@ class SetQos(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, @@ -226,11 +204,9 @@ class SetQos(command.Command): self.app.log.error("No changes requested\n") -class ShowQos(show.ShowOne): +class ShowQos(command.ShowOne): """Display QoS specification details""" - log = logging.getLogger(__name__ + '.ShowQos') - def get_parser(self, prog_name): parser = super(ShowQos, self).get_parser(prog_name) parser.add_argument( @@ -240,7 +216,6 @@ class ShowQos(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, @@ -261,8 +236,6 @@ class ShowQos(show.ShowOne): class UnsetQos(command.Command): """Unset QoS specification properties""" - log = logging.getLogger(__name__ + '.SetQos') - def get_parser(self, prog_name): parser = super(UnsetQos, self).get_parser(prog_name) parser.add_argument( @@ -280,7 +253,6 @@ class UnsetQos(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume qos_spec = utils.find_resource(volume_client.qos_specs, diff --git a/openstackclient/volume/v2/snapshot.py b/openstackclient/volume/v2/snapshot.py index f939a553..4d00b726 100644 --- a/openstackclient/volume/v2/snapshot.py +++ b/openstackclient/volume/v2/snapshot.py @@ -15,22 +15,17 @@ """Volume v2 snapshot action implementations""" import copy -import logging -from cliff import command -from cliff import lister -from cliff import show import six +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils -class CreateSnapshot(show.ShowOne): +class CreateSnapshot(command.ShowOne): """Create new snapshot""" - log = logging.getLogger(__name__ + ".CreateSnapshot") - def get_parser(self, prog_name): parser = super(CreateSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -59,7 +54,6 @@ class CreateSnapshot(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume volume_id = utils.find_resource( volume_client.volumes, parsed_args.volume).id @@ -78,8 +72,6 @@ class CreateSnapshot(show.ShowOne): class DeleteSnapshot(command.Command): """Delete volume snapshot(s)""" - log = logging.getLogger(__name__ + ".DeleteSnapshot") - def get_parser(self, prog_name): parser = super(DeleteSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -91,7 +83,6 @@ class DeleteSnapshot(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume for snapshot in parsed_args.snapshots: snapshot_id = utils.find_resource( @@ -99,11 +90,9 @@ class DeleteSnapshot(command.Command): volume_client.volume_snapshots.delete(snapshot_id) -class ListSnapshot(lister.Lister): +class ListSnapshot(command.Lister): """List snapshots""" - log = logging.getLogger(__name__ + ".ListSnapshot") - def get_parser(self, prog_name): parser = super(ListSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -121,7 +110,6 @@ class ListSnapshot(lister.Lister): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) def _format_volume_id(volume_id): """Return a volume name if available @@ -171,8 +159,6 @@ class ListSnapshot(lister.Lister): class SetSnapshot(command.Command): """Set snapshot properties""" - log = logging.getLogger(__name__ + '.SetSnapshot') - def get_parser(self, prog_name): parser = super(SetSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -196,7 +182,6 @@ class SetSnapshot(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume snapshot = utils.find_resource(volume_client.volume_snapshots, @@ -218,11 +203,9 @@ class SetSnapshot(command.Command): volume_client.volume_snapshots.update(snapshot.id, **kwargs) -class ShowSnapshot(show.ShowOne): +class ShowSnapshot(command.ShowOne): """Display snapshot details""" - log = logging.getLogger(__name__ + ".ShowSnapshot") - def get_parser(self, prog_name): parser = super(ShowSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -233,7 +216,6 @@ class ShowSnapshot(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume snapshot = utils.find_resource( volume_client.volume_snapshots, parsed_args.snapshot) @@ -246,8 +228,6 @@ class ShowSnapshot(show.ShowOne): class UnsetSnapshot(command.Command): """Unset snapshot properties""" - log = logging.getLogger(__name__ + '.UnsetSnapshot') - def get_parser(self, prog_name): parser = super(UnsetSnapshot, self).get_parser(prog_name) parser.add_argument( @@ -265,7 +245,6 @@ class UnsetSnapshot(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume snapshot = utils.find_resource( diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py index c636cf2f..436ec689 100644 --- a/openstackclient/volume/v2/volume.py +++ b/openstackclient/volume/v2/volume.py @@ -15,23 +15,18 @@ """Volume V2 Volume action implementations""" import copy -import logging -from cliff import command -from cliff import lister -from cliff import show import six +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils from openstackclient.identity import common as identity_common -class CreateVolume(show.ShowOne): +class CreateVolume(command.ShowOne): """Create new volume""" - log = logging.getLogger(__name__ + ".CreateVolume") - def get_parser(self, prog_name): parser = super(CreateVolume, self).get_parser(prog_name) parser.add_argument( @@ -96,8 +91,6 @@ class CreateVolume(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) - identity_client = self.app.client_manager.identity volume_client = self.app.client_manager.volume image_client = self.app.client_manager.image @@ -159,8 +152,6 @@ class CreateVolume(show.ShowOne): class DeleteVolume(command.Command): """Delete volume(s)""" - log = logging.getLogger(__name__ + ".DeleteVolume") - def get_parser(self, prog_name): parser = super(DeleteVolume, self).get_parser(prog_name) parser.add_argument( @@ -180,7 +171,6 @@ class DeleteVolume(command.Command): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume for volume in parsed_args.volumes: volume_obj = utils.find_resource( @@ -191,11 +181,9 @@ class DeleteVolume(command.Command): volume_client.volumes.delete(volume_obj.id) -class ListVolume(lister.Lister): +class ListVolume(command.Lister): """List volumes""" - log = logging.getLogger(__name__ + '.ListVolume') - def get_parser(self, prog_name): parser = super(ListVolume, self).get_parser(prog_name) parser.add_argument( @@ -234,7 +222,6 @@ class ListVolume(lister.Lister): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume @@ -328,8 +315,6 @@ class ListVolume(lister.Lister): class SetVolume(command.Command): """Set volume properties""" - log = logging.getLogger(__name__ + '.SetVolume') - def get_parser(self, prog_name): parser = super(SetVolume, self).get_parser(prog_name) parser.add_argument( @@ -362,7 +347,6 @@ class SetVolume(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume = utils.find_resource(volume_client.volumes, parsed_args.volume) @@ -394,11 +378,9 @@ class SetVolume(command.Command): self.app.log.error("No changes requested\n") -class ShowVolume(show.ShowOne): +class ShowVolume(command.ShowOne): """Display volume details""" - log = logging.getLogger(__name__ + '.ShowVolume') - def get_parser(self, prog_name): parser = super(ShowVolume, self).get_parser(prog_name) parser.add_argument( @@ -408,7 +390,6 @@ class ShowVolume(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume = utils.find_resource(volume_client.volumes, parsed_args.volume) @@ -421,8 +402,6 @@ class ShowVolume(show.ShowOne): class UnsetVolume(command.Command): """Unset volume properties""" - log = logging.getLogger(__name__ + '.UnsetVolume') - def get_parser(self, prog_name): parser = super(UnsetVolume, self).get_parser(prog_name) parser.add_argument( @@ -441,7 +420,6 @@ class UnsetVolume(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume = utils.find_resource( diff --git a/openstackclient/volume/v2/volume_type.py b/openstackclient/volume/v2/volume_type.py index 06ab8f82..d2b3ed6a 100644 --- a/openstackclient/volume/v2/volume_type.py +++ b/openstackclient/volume/v2/volume_type.py @@ -14,22 +14,16 @@ """Volume v2 Type action implementations""" -import logging - -from cliff import command -from cliff import lister -from cliff import show import six +from openstackclient.common import command from openstackclient.common import parseractions from openstackclient.common import utils -class CreateVolumeType(show.ShowOne): +class CreateVolumeType(command.ShowOne): """Create new volume type""" - log = logging.getLogger(__name__ + ".CreateVolumeType") - def get_parser(self, prog_name): parser = super(CreateVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -66,7 +60,6 @@ class CreateVolumeType(show.ShowOne): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume @@ -93,8 +86,6 @@ class CreateVolumeType(show.ShowOne): class DeleteVolumeType(command.Command): """Delete volume type""" - log = logging.getLogger(__name__ + ".DeleteVolumeType") - def get_parser(self, prog_name): parser = super(DeleteVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -105,18 +96,15 @@ class DeleteVolumeType(command.Command): return parser def take_action(self, parsed_args): - self.log.info("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume volume_type = utils.find_resource( volume_client.volume_types, parsed_args.volume_type) volume_client.volume_types.delete(volume_type.id) -class ListVolumeType(lister.Lister): +class ListVolumeType(command.Lister): """List volume types""" - log = logging.getLogger(__name__ + '.ListVolumeType') - def get_parser(self, prog_name): parser = super(ListVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -126,7 +114,6 @@ class ListVolumeType(lister.Lister): help='List additional fields in output') return parser - @utils.log_method(log) def take_action(self, parsed_args): if parsed_args.long: columns = ['ID', 'Name', 'Description', 'Extra Specs'] @@ -145,8 +132,6 @@ class ListVolumeType(lister.Lister): class SetVolumeType(command.Command): """Set volume type properties""" - log = logging.getLogger(__name__ + '.SetVolumeType') - def get_parser(self, prog_name): parser = super(SetVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -173,7 +158,6 @@ class SetVolumeType(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume_type = utils.find_resource( @@ -201,11 +185,9 @@ class SetVolumeType(command.Command): volume_type.set_keys(parsed_args.property) -class ShowVolumeType(show.ShowOne): +class ShowVolumeType(command.ShowOne): """Display volume type details""" - log = logging.getLogger(__name__ + ".ShowVolumeType") - def get_parser(self, prog_name): parser = super(ShowVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -216,7 +198,6 @@ class ShowVolumeType(show.ShowOne): return parser def take_action(self, parsed_args): - self.log.debug("take_action: (%s)", parsed_args) volume_client = self.app.client_manager.volume volume_type = utils.find_resource( volume_client.volume_types, parsed_args.volume_type) @@ -228,8 +209,6 @@ class ShowVolumeType(show.ShowOne): class UnsetVolumeType(command.Command): """Unset volume type properties""" - log = logging.getLogger(__name__ + '.UnsetVolumeType') - def get_parser(self, prog_name): parser = super(UnsetVolumeType, self).get_parser(prog_name) parser.add_argument( @@ -247,7 +226,6 @@ class UnsetVolumeType(command.Command): ) return parser - @utils.log_method(log) def take_action(self, parsed_args): volume_client = self.app.client_manager.volume volume_type = utils.find_resource( |
