Blacken openstack.common
Black used with the '-l 79 -S' flags. A future change will ignore this commit in git-blame history by adding a 'git-blame-ignore-revs' file. Change-Id: Ifcb3c798666d74d596b8ecb3d6d507f782de7ba5 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
parent
7ca43885c2
commit
7d80f9e962
@ -28,8 +28,9 @@ LOG = logging.getLogger(__name__)
|
||||
|
||||
def _xform_common_availability_zone(az, zone_info):
|
||||
if hasattr(az, 'zoneState'):
|
||||
zone_info['zone_status'] = ('available' if az.zoneState['available']
|
||||
else 'not available')
|
||||
zone_info['zone_status'] = (
|
||||
'available' if az.zoneState['available'] else 'not available'
|
||||
)
|
||||
if hasattr(az, 'zoneName'):
|
||||
zone_info['zone_name'] = az.zoneName
|
||||
|
||||
@ -56,7 +57,8 @@ def _xform_compute_availability_zone(az, include_extra):
|
||||
info['service_status'] = '%s %s %s' % (
|
||||
'enabled' if state['active'] else 'disabled',
|
||||
':-)' if state['available'] else 'XXX',
|
||||
state['updated_at'])
|
||||
state['updated_at'],
|
||||
)
|
||||
result.append(info)
|
||||
else:
|
||||
zone_info['host_name'] = ''
|
||||
@ -141,8 +143,10 @@ class ListAvailabilityZone(command.Lister):
|
||||
except Exception as e:
|
||||
LOG.debug('Volume availability zone exception: %s', e)
|
||||
if parsed_args.volume:
|
||||
message = _("Availability zones list not supported by "
|
||||
"Block Storage API")
|
||||
message = _(
|
||||
"Availability zones list not supported by "
|
||||
"Block Storage API"
|
||||
)
|
||||
LOG.warning(message)
|
||||
|
||||
result = []
|
||||
@ -154,13 +158,15 @@ class ListAvailabilityZone(command.Lister):
|
||||
network_client = self.app.client_manager.network
|
||||
try:
|
||||
# Verify that the extension exists.
|
||||
network_client.find_extension('Availability Zone',
|
||||
ignore_missing=False)
|
||||
network_client.find_extension(
|
||||
'Availability Zone', ignore_missing=False
|
||||
)
|
||||
except Exception as e:
|
||||
LOG.debug('Network availability zone exception: ', e)
|
||||
if parsed_args.network:
|
||||
message = _("Availability zones list not supported by "
|
||||
"Network API")
|
||||
message = _(
|
||||
"Availability zones list not supported by " "Network API"
|
||||
)
|
||||
LOG.warning(message)
|
||||
return []
|
||||
|
||||
@ -170,17 +176,24 @@ class ListAvailabilityZone(command.Lister):
|
||||
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')
|
||||
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)
|
||||
show_all = (
|
||||
not parsed_args.compute
|
||||
and not parsed_args.volume
|
||||
and not parsed_args.network
|
||||
)
|
||||
|
||||
result = []
|
||||
if parsed_args.compute or show_all:
|
||||
@ -190,7 +203,7 @@ class ListAvailabilityZone(command.Lister):
|
||||
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))
|
||||
return (
|
||||
columns,
|
||||
(utils.get_dict_properties(s, columns) for s in result),
|
||||
)
|
||||
|
@ -77,18 +77,20 @@ class ClientManager(clientmanager.ClientManager):
|
||||
# CloudConfig.__init__() and we'll die if it was not
|
||||
# passed.
|
||||
if (
|
||||
self._auth_required and
|
||||
self._cli_options._openstack_config is not None
|
||||
self._auth_required
|
||||
and self._cli_options._openstack_config is not None
|
||||
):
|
||||
self._cli_options._openstack_config._pw_callback = \
|
||||
self._cli_options._openstack_config._pw_callback = (
|
||||
shell.prompt_for_password
|
||||
)
|
||||
try:
|
||||
# We might already get auth from SDK caching
|
||||
if not self._cli_options._auth:
|
||||
self._cli_options._auth = \
|
||||
self._cli_options._auth = (
|
||||
self._cli_options._openstack_config.load_auth_plugin(
|
||||
self._cli_options.config,
|
||||
)
|
||||
)
|
||||
except TypeError as e:
|
||||
self._fallback_load_auth_plugin(e)
|
||||
|
||||
@ -101,14 +103,14 @@ class ClientManager(clientmanager.ClientManager):
|
||||
# We know it looks ugly, but it's necessary.
|
||||
if self._cli_options.config['auth']['token'] == 'x':
|
||||
# restore original auth_type
|
||||
self._cli_options.config['auth_type'] = \
|
||||
self._original_auth_type
|
||||
self._cli_options.config['auth_type'] = self._original_auth_type
|
||||
del self._cli_options.config['auth']['token']
|
||||
del self._cli_options.config['auth']['endpoint']
|
||||
self._cli_options._auth = \
|
||||
self._cli_options._auth = (
|
||||
self._cli_options._openstack_config.load_auth_plugin(
|
||||
self._cli_options.config,
|
||||
)
|
||||
)
|
||||
else:
|
||||
raise e
|
||||
|
||||
@ -132,8 +134,10 @@ class ClientManager(clientmanager.ClientManager):
|
||||
# name so we need to figure out which version to look
|
||||
# for when calling is_service_available()
|
||||
volume_version = volume_client.api_version.ver_major
|
||||
if self.is_service_available(
|
||||
"volumev%s" % volume_version) is not False:
|
||||
if (
|
||||
self.is_service_available("volumev%s" % volume_version)
|
||||
is not False
|
||||
):
|
||||
return True
|
||||
elif self.is_service_available('volume') is not False:
|
||||
return True
|
||||
@ -143,6 +147,7 @@ class ClientManager(clientmanager.ClientManager):
|
||||
|
||||
# Plugin Support
|
||||
|
||||
|
||||
def get_plugin_modules(group):
|
||||
"""Find plugin entry points"""
|
||||
mod_list = []
|
||||
@ -165,7 +170,8 @@ def get_plugin_modules(group):
|
||||
module = importlib.import_module(module_name)
|
||||
except Exception as err:
|
||||
sys.stderr.write(
|
||||
"WARNING: Failed to import plugin %s: %s.\n" % (ep.name, err))
|
||||
"WARNING: Failed to import plugin %s: %s.\n" % (ep.name, err)
|
||||
)
|
||||
continue
|
||||
|
||||
mod_list.append(module)
|
||||
@ -198,6 +204,8 @@ PLUGIN_MODULES = get_plugin_modules(
|
||||
'openstack.cli.base',
|
||||
)
|
||||
# Append list of external plugin modules
|
||||
PLUGIN_MODULES.extend(get_plugin_modules(
|
||||
'openstack.cli.extension',
|
||||
))
|
||||
PLUGIN_MODULES.extend(
|
||||
get_plugin_modules(
|
||||
'openstack.cli.extension',
|
||||
)
|
||||
)
|
||||
|
@ -53,7 +53,8 @@ class ShowConfiguration(command.ShowOne):
|
||||
if getattr(self.app.client_manager, "auth_plugin_name", None):
|
||||
auth_plg_name = self.app.client_manager.auth_plugin_name
|
||||
secret_opts = [
|
||||
o.dest for o in base.get_plugin_options(auth_plg_name)
|
||||
o.dest
|
||||
for o in base.get_plugin_options(auth_plg_name)
|
||||
if o.secret
|
||||
]
|
||||
|
||||
|
@ -65,8 +65,14 @@ class ListExtension(command.Lister):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
if parsed_args.long:
|
||||
columns = ('Name', 'Alias', 'Description',
|
||||
'Namespace', 'Updated', 'Links')
|
||||
columns = (
|
||||
'Name',
|
||||
'Alias',
|
||||
'Description',
|
||||
'Namespace',
|
||||
'Updated',
|
||||
'Links',
|
||||
)
|
||||
else:
|
||||
columns = ('Name', 'Alias', 'Description')
|
||||
|
||||
@ -75,10 +81,12 @@ class ListExtension(command.Lister):
|
||||
# by default we want to show everything, unless the
|
||||
# user specifies one or more of the APIs to show
|
||||
# for now, only identity and compute are supported.
|
||||
show_all = (not parsed_args.identity and
|
||||
not parsed_args.compute and
|
||||
not parsed_args.volume and
|
||||
not parsed_args.network)
|
||||
show_all = (
|
||||
not parsed_args.identity
|
||||
and not parsed_args.compute
|
||||
and not parsed_args.volume
|
||||
and not parsed_args.network
|
||||
)
|
||||
|
||||
if parsed_args.identity or show_all:
|
||||
identity_client = self.app.client_manager.identity
|
||||
@ -101,8 +109,9 @@ class ListExtension(command.Lister):
|
||||
try:
|
||||
data += volume_client.list_extensions.show_all()
|
||||
except Exception:
|
||||
message = _("Extensions list not supported by "
|
||||
"Block Storage API")
|
||||
message = _(
|
||||
"Extensions list not supported by " "Block Storage API"
|
||||
)
|
||||
LOG.warning(message)
|
||||
|
||||
if parsed_args.network or show_all:
|
||||
@ -110,15 +119,17 @@ class ListExtension(command.Lister):
|
||||
try:
|
||||
data += network_client.extensions()
|
||||
except Exception:
|
||||
message = _("Failed to retrieve extensions list "
|
||||
"from Network API")
|
||||
message = _(
|
||||
"Failed to retrieve extensions list " "from Network API"
|
||||
)
|
||||
LOG.warning(message)
|
||||
|
||||
extension_tuples = (
|
||||
utils.get_item_properties(
|
||||
s,
|
||||
columns,
|
||||
) for s in data
|
||||
)
|
||||
for s in data
|
||||
)
|
||||
|
||||
return (columns, extension_tuples)
|
||||
@ -132,9 +143,11 @@ class ShowExtension(command.ShowOne):
|
||||
parser.add_argument(
|
||||
'extension',
|
||||
metavar='<extension>',
|
||||
help=_('Extension to display. '
|
||||
'Currently, only network extensions are supported. '
|
||||
'(Name or Alias)'),
|
||||
help=_(
|
||||
'Extension to display. '
|
||||
'Currently, only network extensions are supported. '
|
||||
'(Name or Alias)'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
|
@ -54,19 +54,22 @@ class ShowLimits(command.Lister):
|
||||
parser.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Show limits for a specific project (name or ID)'
|
||||
' [only valid with --absolute]'),
|
||||
help=_(
|
||||
'Show limits for a specific project (name or ID)'
|
||||
' [only valid with --absolute]'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--domain',
|
||||
metavar='<domain>',
|
||||
help=_('Domain the project belongs to (name or ID)'
|
||||
' [only valid with --absolute]'),
|
||||
help=_(
|
||||
'Domain the project belongs to (name or ID)'
|
||||
' [only valid with --absolute]'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
|
||||
compute_client = self.app.client_manager.compute
|
||||
volume_client = self.app.client_manager.volume
|
||||
|
||||
@ -74,21 +77,26 @@ class ShowLimits(command.Lister):
|
||||
if parsed_args.project is not None:
|
||||
identity_client = self.app.client_manager.identity
|
||||
if parsed_args.domain is not None:
|
||||
domain = identity_common.find_domain(identity_client,
|
||||
parsed_args.domain)
|
||||
project_id = utils.find_resource(identity_client.projects,
|
||||
parsed_args.project,
|
||||
domain_id=domain.id).id
|
||||
domain = identity_common.find_domain(
|
||||
identity_client, parsed_args.domain
|
||||
)
|
||||
project_id = utils.find_resource(
|
||||
identity_client.projects,
|
||||
parsed_args.project,
|
||||
domain_id=domain.id,
|
||||
).id
|
||||
else:
|
||||
project_id = utils.find_resource(identity_client.projects,
|
||||
parsed_args.project).id
|
||||
project_id = utils.find_resource(
|
||||
identity_client.projects, parsed_args.project
|
||||
).id
|
||||
|
||||
compute_limits = None
|
||||
volume_limits = None
|
||||
|
||||
if self.app.client_manager.is_compute_endpoint_enabled():
|
||||
compute_limits = compute_client.limits.get(parsed_args.is_reserved,
|
||||
tenant_id=project_id)
|
||||
compute_limits = compute_client.limits.get(
|
||||
parsed_args.is_reserved, tenant_id=project_id
|
||||
)
|
||||
|
||||
if self.app.client_manager.is_volume_endpoint_enabled(volume_client):
|
||||
volume_limits = volume_client.limits.get()
|
||||
@ -100,17 +108,33 @@ class ShowLimits(command.Lister):
|
||||
if volume_limits:
|
||||
data.append(volume_limits.absolute)
|
||||
columns = ["Name", "Value"]
|
||||
return (columns, (utils.get_item_properties(s, columns)
|
||||
for s in itertools.chain(*data)))
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(s, columns)
|
||||
for s in itertools.chain(*data)
|
||||
),
|
||||
)
|
||||
|
||||
elif parsed_args.is_rate:
|
||||
if compute_limits:
|
||||
data.append(compute_limits.rate)
|
||||
if volume_limits:
|
||||
data.append(volume_limits.rate)
|
||||
columns = ["Verb", "URI", "Value", "Remain", "Unit",
|
||||
"Next Available"]
|
||||
return (columns, (utils.get_item_properties(s, columns)
|
||||
for s in itertools.chain(*data)))
|
||||
columns = [
|
||||
"Verb",
|
||||
"URI",
|
||||
"Value",
|
||||
"Remain",
|
||||
"Unit",
|
||||
"Next Available",
|
||||
]
|
||||
return (
|
||||
columns,
|
||||
(
|
||||
utils.get_item_properties(s, columns)
|
||||
for s in itertools.chain(*data)
|
||||
),
|
||||
)
|
||||
else:
|
||||
return {}, {}
|
||||
|
@ -33,9 +33,11 @@ class ListCommand(command.Lister):
|
||||
parser.add_argument(
|
||||
'--group',
|
||||
metavar='<group-keyword>',
|
||||
help=_('Show commands filtered by a command group, for example: '
|
||||
'identity, volume, compute, image, network and '
|
||||
'other keywords'),
|
||||
help=_(
|
||||
'Show commands filtered by a command group, for example: '
|
||||
'identity, volume, compute, image, network and '
|
||||
'other keywords'
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
@ -54,7 +56,6 @@ class ListCommand(command.Lister):
|
||||
command_names = sorted(command_names)
|
||||
|
||||
if command_names != []:
|
||||
|
||||
# TODO(bapalm): Fix this when cliff properly supports
|
||||
# handling the detection rather than using the hard-code below.
|
||||
if parsed_args.formatter == 'table':
|
||||
@ -81,7 +82,6 @@ class ListModule(command.ShowOne):
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
|
||||
data = {}
|
||||
# Get module versions
|
||||
mods = sys.modules
|
||||
@ -95,9 +95,12 @@ class ListModule(command.ShowOne):
|
||||
# show for the default (not --all) invocation.
|
||||
# It should be just the things we actually care
|
||||
# about like client and plugin modules...
|
||||
if (parsed_args.all or
|
||||
# Handle xxxclient and openstacksdk
|
||||
(k.endswith('client') or k == 'openstack')):
|
||||
if (
|
||||
parsed_args.all
|
||||
or
|
||||
# Handle xxxclient and openstacksdk
|
||||
(k.endswith('client') or k == 'openstack')
|
||||
):
|
||||
try:
|
||||
# NOTE(RuiChen): openstacksdk bug/1588823 exist,
|
||||
# no good way to add __version__ for
|
||||
|
@ -38,9 +38,11 @@ class _ProgressBarBase(object):
|
||||
if self._show_progress:
|
||||
self._percent += size_read / self._totalsize
|
||||
# Output something like this: [==========> ] 49%
|
||||
sys.stdout.write('\r[{0:<30}] {1:.0%}'.format(
|
||||
'=' * int(round(self._percent * 29)) + '>', self._percent
|
||||
))
|
||||
sys.stdout.write(
|
||||
'\r[{0:<30}] {1:.0%}'.format(
|
||||
'=' * int(round(self._percent * 29)) + '>', self._percent
|
||||
)
|
||||
)
|
||||
sys.stdout.flush()
|
||||
|
||||
def __getattr__(self, attr):
|
||||
|
@ -35,8 +35,7 @@ def ask_user_yesno(msg):
|
||||
:return bool: User choice
|
||||
"""
|
||||
while True:
|
||||
answer = getpass._raw_input(
|
||||
'{} [{}]: '.format(msg, 'y/n'))
|
||||
answer = getpass._raw_input('{} [{}]: '.format(msg, 'y/n'))
|
||||
if answer in ('y', 'Y', 'yes'):
|
||||
return True
|
||||
elif answer in ('n', 'N', 'no'):
|
||||
@ -52,33 +51,33 @@ class ProjectCleanup(command.Command):
|
||||
action_group.add_argument(
|
||||
'--dry-run',
|
||||
action='store_true',
|
||||
help=_("List a project's resources but do not delete them")
|
||||
help=_("List a project's resources but do not delete them"),
|
||||
)
|
||||
action_group.add_argument(
|
||||
'--auto-approve',
|
||||
action='store_true',
|
||||
help=_("Delete resources without asking for confirmation")
|
||||
help=_("Delete resources without asking for confirmation"),
|
||||
)
|
||||
project_group = parser.add_mutually_exclusive_group(required=True)
|
||||
project_group.add_argument(
|
||||
'--auth-project',
|
||||
action='store_true',
|
||||
help=_('Delete resources of the project used to authenticate')
|
||||
help=_('Delete resources of the project used to authenticate'),
|
||||
)
|
||||
project_group.add_argument(
|
||||
'--project',
|
||||
metavar='<project>',
|
||||
help=_('Project to clean (name or ID)')
|
||||
help=_('Project to clean (name or ID)'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--created-before',
|
||||
metavar='<YYYY-MM-DDTHH24:MI:SS>',
|
||||
help=_('Only delete resources created before the given time')
|
||||
help=_('Only delete resources created before the given time'),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--updated-before',
|
||||
metavar='<YYYY-MM-DDTHH24:MI:SS>',
|
||||
help=_('Only delete resources updated before the given time')
|
||||
help=_('Only delete resources updated before the given time'),
|
||||
)
|
||||
identity_common.add_project_domain_option_to_parser(parser)
|
||||
return parser
|
||||
@ -90,16 +89,18 @@ class ProjectCleanup(command.Command):
|
||||
project_connect = sdk
|
||||
elif parsed_args.project:
|
||||
project = sdk.identity.find_project(
|
||||
name_or_id=parsed_args.project,
|
||||
ignore_missing=False)
|
||||
name_or_id=parsed_args.project, ignore_missing=False
|
||||
)
|
||||
project_connect = sdk.connect_as_project(project)
|
||||
|
||||
if project_connect:
|
||||
status_queue = queue.Queue()
|
||||
parsed_args.max_width = int(os.environ.get('CLIFF_MAX_TERM_WIDTH',
|
||||
0))
|
||||
parsed_args.fit_width = bool(int(os.environ.get('CLIFF_FIT_WIDTH',
|
||||
0)))
|
||||
parsed_args.max_width = int(
|
||||
os.environ.get('CLIFF_MAX_TERM_WIDTH', 0)
|
||||
)
|
||||
parsed_args.fit_width = bool(
|
||||
int(os.environ.get('CLIFF_FIT_WIDTH', 0))
|
||||
)
|
||||
parsed_args.print_empty = False
|
||||
table_fmt = table.TableFormatter()
|
||||
|
||||
@ -112,22 +113,20 @@ class ProjectCleanup(command.Command):
|
||||
if parsed_args.updated_before:
|
||||
filters['updated_at'] = parsed_args.updated_before
|
||||
|
||||
project_connect.project_cleanup(dry_run=True,
|
||||
status_queue=status_queue,
|
||||
filters=filters)
|
||||
project_connect.project_cleanup(
|
||||
dry_run=True, status_queue=status_queue, filters=filters
|
||||
)
|
||||
|
||||
data = []
|
||||
while not status_queue.empty():
|
||||
resource = status_queue.get_nowait()
|
||||
data.append(
|
||||
(type(resource).__name__, resource.id, resource.name))
|
||||
(type(resource).__name__, resource.id, resource.name)
|
||||
)
|
||||
status_queue.task_done()
|
||||
status_queue.join()
|
||||
table_fmt.emit_list(
|
||||
('Type', 'ID', 'Name'),
|
||||
data,
|
||||
self.app.stdout,
|
||||
parsed_args
|
||||
('Type', 'ID', 'Name'), data, self.app.stdout, parsed_args
|
||||
)
|
||||
|
||||
if parsed_args.dry_run:
|
||||
@ -135,11 +134,12 @@ class ProjectCleanup(command.Command):
|
||||
|
||||
if not parsed_args.auto_approve:
|
||||
if not ask_user_yesno(
|
||||
_("These resources will be deleted. Are you sure")):
|
||||
_("These resources will be deleted. Are you sure")
|
||||
):
|
||||
return
|
||||
|
||||
self.log.warning(_('Deleting resources'))
|
||||
|
||||
project_connect.project_cleanup(dry_run=False,
|
||||
status_queue=status_queue,
|
||||
filters=filters)
|
||||
project_connect.project_cleanup(
|
||||
dry_run=False, status_queue=status_queue, filters=filters
|
||||
)
|
||||
|
@ -88,7 +88,8 @@ class ProjectPurge(command.Command):
|
||||
search_opts = {'tenant_id': project_id, 'all_tenants': True}
|
||||
data = compute_client.servers.list(search_opts=search_opts)
|
||||
self.delete_objects(
|
||||
compute_client.servers.delete, data, 'server', dry_run)
|
||||
compute_client.servers.delete, data, 'server', dry_run
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
@ -104,7 +105,8 @@ class ProjectPurge(command.Command):
|
||||
else:
|
||||
raise NotImplementedError
|
||||
self.delete_objects(
|
||||
image_client.images.delete, data, 'image', dry_run)
|
||||
image_client.images.delete, data, 'image', dry_run
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
@ -117,45 +119,49 @@ class ProjectPurge(command.Command):
|
||||
self.delete_one_volume_snapshot,
|
||||
data,
|
||||
'volume snapshot',
|
||||
dry_run)
|
||||
dry_run,
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
data = volume_client.backups.list(search_opts=search_opts)
|
||||
self.delete_objects(
|
||||
self.delete_one_volume_backup,
|
||||
data,
|
||||
'volume backup',
|
||||
dry_run)
|
||||
self.delete_one_volume_backup, data, 'volume backup', dry_run
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
data = volume_client.volumes.list(search_opts=search_opts)
|
||||
self.delete_objects(
|
||||
volume_client.volumes.force_delete, data, 'volume', dry_run)
|
||||
volume_client.volumes.force_delete, data, 'volume', dry_run
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def delete_objects(self, func_delete, data, resource, dry_run):
|
||||
result = 0
|
||||
for i in data:
|
||||
LOG.warning(_('Deleting %(resource)s : %(id)s') %
|
||||
{'resource': resource, 'id': i.id})
|
||||
LOG.warning(
|
||||
_('Deleting %(resource)s : %(id)s')
|
||||
% {'resource': resource, 'id': i.id}
|
||||
)
|
||||
if not dry_run:
|
||||
try:
|
||||
func_delete(i.id)
|
||||
except Exception as e:
|
||||
result += 1
|
||||
LOG.error(_("Failed to delete %(resource)s with "
|
||||
"ID '%(id)s': %(e)s")
|
||||
% {'resource': resource, 'id': i.id, 'e': e})
|
||||
LOG.error(
|
||||
_(
|
||||
"Failed to delete %(resource)s with "
|
||||
"ID '%(id)s': %(e)s"
|
||||
)
|
||||
% {'resource': resource, 'id': i.id, 'e': e}
|
||||
)
|
||||
if result > 0:
|
||||
total = len(data)
|
||||
msg = (_("%(result)s of %(total)s %(resource)ss failed "
|
||||
"to delete.") %
|
||||
{'result': result,
|
||||
'total': total,
|
||||
'resource': resource})
|
||||
msg = _(
|
||||
"%(result)s of %(total)s %(resource)ss failed " "to delete."
|
||||
) % {'result': result, 'total': total, 'resource': resource}
|
||||
LOG.error(msg)
|
||||
|
||||
def delete_one_volume_snapshot(self, snapshot_id):
|
||||
|
@ -749,10 +749,12 @@ class SetQuota(common.NetDetectionMixin, command.Command):
|
||||
|
||||
|
||||
class ShowQuota(command.Lister):
|
||||
_description = _("""Show quotas for project or class.
|
||||
_description = _(
|
||||
"""Show quotas for project or class.
|
||||
|
||||
Specify ``--os-compute-api-version 2.50`` or higher to see ``server-groups``
|
||||
and ``server-group-members`` output for a given quota class.""")
|
||||
and ``server-group-members`` output for a given quota class."""
|
||||
)
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super().get_parser(prog_name)
|
||||
|
@ -46,26 +46,29 @@ class ShowVersions(command.Lister):
|
||||
parser.add_argument(
|
||||
'--service',
|
||||
metavar='<service>',
|
||||
help=_('Show versions for a specific service. The argument should '
|
||||
'be either an exact match to what is in the catalog or a '
|
||||
'known official value or alias from '
|
||||
'service-types-authority '
|
||||
'(https://service-types.openstack.org/)'),
|
||||
help=_(
|
||||
'Show versions for a specific service. The argument should '
|
||||
'be either an exact match to what is in the catalog or a '
|
||||
'known official value or alias from '
|
||||
'service-types-authority '
|
||||
'(https://service-types.openstack.org/)'
|
||||
),
|
||||
)
|
||||
parser.add_argument(
|
||||
'--status',
|
||||
metavar='<status>',
|
||||
help=_("""Show versions for a specific status. Valid values are:
|
||||
help=_(
|
||||
"""Show versions for a specific status. Valid values are:
|
||||
|
||||
- SUPPORTED
|
||||
- CURRENT
|
||||
- DEPRECATED
|
||||
- EXPERIMENTAL""")
|
||||
- EXPERIMENTAL"""
|
||||
),
|
||||
)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
|
||||
interface = parsed_args.interface
|
||||
if parsed_args.is_all_interfaces:
|
||||
interface = None
|
||||
@ -74,7 +77,8 @@ class ShowVersions(command.Lister):
|
||||
version_data = session.get_all_version_data(
|
||||
interface=interface,
|
||||
region_name=parsed_args.region_name,
|
||||
service_type=parsed_args.service)
|
||||
service_type=parsed_args.service,
|
||||
)
|
||||
|
||||
columns = [
|
||||
"Region Name",
|
||||
@ -97,13 +101,15 @@ class ShowVersions(command.Lister):
|
||||
for data in service_versions:
|
||||
if status and status != data['status']:
|
||||
continue
|
||||
versions.append((
|
||||
region_name,
|
||||
service_type,
|
||||
data['version'],
|
||||
data['status'],
|
||||
data['url'],
|
||||
data['min_microversion'],
|
||||
data['max_microversion'],
|
||||
))
|
||||
versions.append(
|
||||
(
|
||||
region_name,
|
||||
service_type,
|
||||
data['version'],
|
||||
data['status'],
|
||||
data['url'],
|
||||
data['min_microversion'],
|
||||
data['max_microversion'],
|
||||
)
|
||||
)
|
||||
return (columns, versions)
|
||||
|
@ -14,7 +14,7 @@ from openstackclient.tests.functional import base
|
||||
|
||||
|
||||
class AvailabilityZoneTests(base.TestCase):
|
||||
"""Functional tests for availability zone. """
|
||||
"""Functional tests for availability zone."""
|
||||
|
||||
def test_availability_zone_list(self):
|
||||
cmd_output = self.openstack(
|
||||
@ -22,11 +22,5 @@ class AvailabilityZoneTests(base.TestCase):
|
||||
parse_output=True,
|
||||
)
|
||||
zones = [x['Zone Name'] for x in cmd_output]
|
||||
self.assertIn(
|
||||
'internal',
|
||||
zones
|
||||
)
|
||||
self.assertIn(
|
||||
'nova',
|
||||
zones
|
||||
)
|
||||
self.assertIn('internal', zones)
|
||||
self.assertIn('nova', zones)
|
||||
|
@ -23,17 +23,13 @@ class ConfigurationTests(base.TestCase):
|
||||
"""Functional test for configuration."""
|
||||
|
||||
def test_configuration_show(self):
|
||||
|
||||
# Test show without option
|
||||
raw_output = self.openstack('configuration show')
|
||||
items = self.parse_listing(raw_output)
|
||||
self.assert_table_structure(items, BASIC_CONFIG_HEADERS)
|
||||
|
||||
cmd_output = self.openstack('configuration show', parse_output=True)
|
||||
self.assertEqual(
|
||||
configuration.REDACTED,
|
||||
cmd_output['auth.password']
|
||||
)
|
||||
self.assertEqual(configuration.REDACTED, cmd_output['auth.password'])
|
||||
self.assertIn(
|
||||
'auth.password',
|
||||
cmd_output.keys(),
|
||||
@ -41,30 +37,25 @@ class ConfigurationTests(base.TestCase):
|
||||
|
||||
# Test show --mask
|
||||
cmd_output = self.openstack(
|
||||
'configuration show --mask', parse_output=True,
|
||||
)
|
||||
self.assertEqual(
|
||||
configuration.REDACTED,
|
||||
cmd_output['auth.password']
|
||||
'configuration show --mask',
|
||||
parse_output=True,
|
||||
)
|
||||
self.assertEqual(configuration.REDACTED, cmd_output['auth.password'])
|
||||
|
||||
# Test show --unmask
|
||||
cmd_output = self.openstack(
|
||||
'configuration show --unmask', parse_output=True,
|
||||
'configuration show --unmask',
|
||||
parse_output=True,
|
||||
)
|
||||
# If we are using os-client-config, this will not be set. Rather than
|
||||
# parse clouds.yaml to get the right value, just make sure
|
||||
# we are not getting redacted.
|
||||
passwd = os.environ.get('OS_PASSWORD')
|
||||
if passwd:
|
||||
self.assertEqual(
|
||||
passwd,
|
||||
cmd_output['auth.password']
|
||||
)
|
||||
self.assertEqual(passwd, cmd_output['auth.password'])
|
||||
else:
|
||||
self.assertNotEqual(
|
||||
configuration.REDACTED,
|
||||
cmd_output['auth.password']
|
||||
configuration.REDACTED, cmd_output['auth.password']
|
||||
)
|
||||
|
||||
|
||||
@ -72,7 +63,6 @@ class ConfigurationTestsNoAuth(base.TestCase):
|
||||
"""Functional test for configuration with no auth"""
|
||||
|
||||
def test_configuration_show(self):
|
||||
|
||||
# Test show without option
|
||||
raw_output = self.openstack(
|
||||
'configuration show',
|
||||
|
@ -27,8 +27,10 @@ class HelpTests(base.TestCase):
|
||||
('server create', 'Create a new server'),
|
||||
('server delete', 'Delete server(s)'),
|
||||
('server dump create', 'Create a dump file in server(s)'),
|
||||
('server image create',
|
||||
'Create a new server disk image from an existing server'),
|
||||
(
|
||||
'server image create',
|
||||
'Create a new server disk image from an existing server',
|
||||
),
|
||||
('server list', 'List servers'),
|
||||
('server lock', 'Lock server(s)'),
|
||||
('server migrate', 'Migrate server to different host'),
|
||||
@ -51,7 +53,7 @@ class HelpTests(base.TestCase):
|
||||
('server unpause', 'Unpause server(s)'),
|
||||
('server unrescue', 'Restore server from rescue mode'),
|
||||
('server unset', 'Unset server properties'),
|
||||
('server unshelve', 'Unshelve server(s)')
|
||||
('server unshelve', 'Unshelve server(s)'),
|
||||
]
|
||||
|
||||
def test_server_commands_main_help(self):
|
||||
@ -59,10 +61,14 @@ class HelpTests(base.TestCase):
|
||||
raw_output = self.openstack('help')
|
||||
for command, description in self.SERVER_COMMANDS:
|
||||
msg = 'Command: %s not found in help output:\n%s' % (
|
||||
command, raw_output)
|
||||
command,
|
||||
raw_output,
|
||||
)
|
||||
self.assertIn(command, raw_output, msg)
|
||||
msg = 'Description: %s not found in help output:\n%s' % (
|
||||
description, raw_output)
|
||||
description,
|
||||
raw_output,
|
||||
)
|
||||
self.assertIn(description, raw_output, msg)
|
||||
|
||||
def test_server_only_help(self):
|
||||
|
@ -18,13 +18,9 @@ from openstackclient.tests.functional import base
|
||||
class ModuleTest(base.TestCase):
|
||||
"""Functional tests for openstackclient module list output."""
|
||||
|
||||
CLIENTS = ['openstackclient',
|
||||
'keystoneclient',
|
||||
'novaclient',
|
||||
'openstack']
|
||||
CLIENTS = ['openstackclient', 'keystoneclient', 'novaclient', 'openstack']
|
||||
|
||||
LIBS = ['osc_lib',
|
||||
'keystoneauth1']
|
||||
LIBS = ['osc_lib', 'keystoneauth1']
|
||||
|
||||
def test_module_list(self):
|
||||
# Test module list
|
||||
@ -42,6 +38,7 @@ class ModuleTest(base.TestCase):
|
||||
|
||||
class CommandTest(base.TestCase):
|
||||
"""Functional tests for openstackclient command list."""
|
||||
|
||||
GROUPS = [
|
||||
'openstack.volume.v3',
|
||||
'openstack.network.v2',
|
||||
@ -59,13 +56,7 @@ class CommandTest(base.TestCase):
|
||||
self.assertIn(one_group, group_names)
|
||||
|
||||
def test_command_list_with_group(self):
|
||||
input_groups = [
|
||||
'volume',
|
||||
'network',
|
||||
'image',
|
||||
'identity',
|
||||
'compute.v2'
|
||||
]
|
||||
input_groups = ['volume', 'network', 'image', 'identity', 'compute.v2']
|
||||
for each_input in input_groups:
|
||||
cmd_output = self.openstack(
|
||||
'command list --group %s' % each_input,
|
||||
|
@ -30,8 +30,9 @@ class QuotaTests(base.TestCase):
|
||||
def setUpClass(cls):
|
||||
super(QuotaTests, cls).setUpClass()
|
||||
cls.haz_network = cls.is_service_enabled('network')
|
||||
cls.PROJECT_NAME =\
|
||||
cls.get_openstack_configuration_value('auth.project_name')
|
||||
cls.PROJECT_NAME = cls.get_openstack_configuration_value(
|
||||
'auth.project_name'
|
||||
)
|
||||
|
||||
def test_quota_list_details_compute(self):
|
||||
expected_headers = ["Resource", "In Use", "Reserved", "Limit"]
|
||||
@ -111,9 +112,9 @@ class QuotaTests(base.TestCase):
|
||||
if self.haz_network:
|
||||
network_option = "--routers 21 "
|
||||
self.openstack(
|
||||
'quota set --cores 31 --backups 41 ' +
|
||||
network_option +
|
||||
self.PROJECT_NAME
|
||||
'quota set --cores 31 --backups 41 '
|
||||
+ network_option
|
||||
+ self.PROJECT_NAME
|
||||
)
|
||||
cmd_output = self.openstack(
|
||||
'quota show ' + self.PROJECT_NAME,
|
||||
@ -151,8 +152,7 @@ class QuotaTests(base.TestCase):
|
||||
|
||||
def test_quota_set_class(self):
|
||||
self.openstack(
|
||||
'quota set --key-pairs 33 --snapshots 43 ' +
|
||||
'--class default'
|
||||
'quota set --key-pairs 33 --snapshots 43 ' + '--class default'
|
||||
)
|
||||
cmd_output = self.openstack(
|
||||
'quota show --class default',
|
||||
@ -194,8 +194,12 @@ class QuotaTests(base.TestCase):
|
||||
'quota list --network',
|
||||
parse_output=True,
|
||||
)
|
||||
self.addCleanup(self._restore_quota_limit, 'network',
|
||||
cmd_output[0]['Networks'], self.PROJECT_NAME)
|
||||
self.addCleanup(
|
||||
self._restore_quota_limit,
|
||||
'network',
|
||||
cmd_output[0]['Networks'],
|
||||
self.PROJECT_NAME,
|
||||
)
|
||||
|
||||
self.openstack('quota set --networks 40 ' + self.PROJECT_NAME)
|
||||
cmd_output = self.openstack(
|
||||
@ -207,12 +211,16 @@ class QuotaTests(base.TestCase):
|
||||
|
||||
# That will ensure we have at least two networks in the system.
|
||||
for _ in range(2):
|
||||
self.openstack('network create --project %s %s' %
|
||||
(self.PROJECT_NAME, uuid.uuid4().hex))
|
||||
self.openstack(
|
||||
'network create --project %s %s'
|
||||
% (self.PROJECT_NAME, uuid.uuid4().hex)
|
||||
)
|
||||
|
||||
self.assertRaises(exceptions.CommandFailed, self.openstack,
|
||||
'quota set --networks 1 --no-force ' +
|
||||
self.PROJECT_NAME)
|
||||
self.assertRaises(
|
||||
exceptions.CommandFailed,
|
||||
self.openstack,
|
||||
'quota set --networks 1 --no-force ' + self.PROJECT_NAME,
|
||||
)
|
||||
|
||||
def test_quota_network_set_with_force(self):
|
||||
self.skipTest('story 2010110')
|
||||
@ -232,8 +240,12 @@ class QuotaTests(base.TestCase):
|
||||
'quota list --network',
|
||||
parse_output=True,
|
||||
)
|
||||
self.addCleanup(self._restore_quota_limit, 'network',
|
||||
cmd_output[0]['Networks'], self.PROJECT_NAME)
|
||||
self.addCleanup(
|
||||
self._restore_quota_limit,
|
||||
'network',
|
||||
cmd_output[0]['Networks'],
|
||||
self.PROJECT_NAME,
|
||||
)
|
||||
|
||||
self.openstack('quota set --networks 40 ' + self.PROJECT_NAME)
|
||||
cmd_output = self.openstack(
|
||||
@ -245,8 +257,10 @@ class QuotaTests(base.TestCase):
|
||||
|
||||
# That will ensure we have at least two networks in the system.
|
||||
for _ in range(2):
|
||||
self.openstack('network create --project %s %s' %
|
||||
(self.PROJECT_NAME, uuid.uuid4().hex))
|
||||
self.openstack(
|
||||
'network create --project %s %s'
|
||||
% (self.PROJECT_NAME, uuid.uuid4().hex)
|
||||
)
|
||||
|
||||
self.openstack('quota set --networks 1 --force ' + self.PROJECT_NAME)
|
||||
cmd_output = self.openstack(
|
||||
|
@ -53,7 +53,10 @@ def _build_volume_az_datalist(volume_az, long_datalist=False):
|
||||
datalist = (
|
||||
volume_az.zoneName,
|
||||
'available',
|
||||
'', '', '', '',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
)
|
||||
return (datalist,)
|
||||
|
||||
@ -70,13 +73,14 @@ def _build_network_az_datalist(network_az, long_datalist=False):
|
||||
network_az.name,
|
||||
network_az.state,
|
||||
network_az.resource,
|
||||
'', '', '',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
)
|
||||
return (datalist,)
|
||||
|
||||
|
||||
class TestAvailabilityZone(utils.TestCommand):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
||||
@ -110,9 +114,9 @@ class TestAvailabilityZone(utils.TestCommand):
|
||||
|
||||
|
||||
class TestAvailabilityZoneList(TestAvailabilityZone):
|
||||
|
||||
compute_azs = \
|
||||
compute_azs = (
|
||||
compute_fakes.FakeAvailabilityZone.create_availability_zones()
|
||||
)
|
||||
volume_azs = volume_fakes.create_availability_zones(count=1)
|
||||
network_azs = network_fakes.create_availability_zones()
|
||||
|
||||
@ -181,14 +185,17 @@ class TestAvailabilityZoneList(TestAvailabilityZone):
|
||||
self.assertEqual(self.long_columnslist, columns)
|
||||
datalist = ()
|
||||
for compute_az in self.compute_azs:
|
||||
datalist += _build_compute_az_datalist(compute_az,
|
||||
long_datalist=True)
|
||||
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)
|
||||
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)
|
||||
datalist += _build_network_az_datalist(
|
||||
network_az, long_datalist=True
|
||||
)
|
||||
self.assertEqual(datalist, tuple(data))
|
||||
|
||||
def test_availability_zone_list_compute(self):
|
||||
|
@ -23,7 +23,6 @@ from openstackclient.tests.unit import fakes
|
||||
|
||||
|
||||
class TestClientManager(osc_lib_test_utils.TestClientManager):
|
||||
|
||||
def _clientmanager_class(self):
|
||||
"""Allow subclasses to override the ClientManager class"""
|
||||
return clientmanager.ClientManager
|
||||
@ -54,10 +53,12 @@ class TestClientManager(osc_lib_test_utils.TestClientManager):
|
||||
|
||||
def test_client_manager_network_endpoint_disabled(self):
|
||||
auth_args = copy.deepcopy(self.default_password_auth)
|
||||
auth_args.update({
|
||||
'user_domain_name': 'default',
|
||||
'project_domain_name': 'default',
|
||||
})
|
||||
auth_args.update(
|
||||
{
|
||||
'user_domain_name': 'default',
|
||||
'project_domain_name': 'default',
|
||||
}
|
||||
)
|
||||
# v3 fake doesn't have network endpoint
|
||||
client_manager = self._make_clientmanager(
|
||||
auth_args=auth_args,
|
||||
|
@ -22,18 +22,18 @@ from openstackclient.tests.unit import utils as test_utils
|
||||
|
||||
|
||||
class FakeCommand(command.Command):
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
pass
|
||||
|
||||
|
||||
class TestCommand(test_utils.TestCase):
|
||||
|
||||
def test_command_has_logger(self):
|
||||
cmd = FakeCommand(mock.Mock(), mock.Mock())
|
||||
self.assertTrue(hasattr(cmd, 'log'))
|
||||
self.assertEqual('openstackclient.tests.unit.common.test_command.'
|
||||
'FakeCommand', cmd.log.name)
|
||||
self.assertEqual(
|
||||
'openstackclient.tests.unit.common.test_command.' 'FakeCommand',
|
||||
cmd.log.name,
|
||||
)
|
||||
|
||||
def test_validate_os_beta_command_enabled(self):
|
||||
cmd = FakeCommand(mock.Mock(), mock.Mock())
|
||||
@ -45,5 +45,6 @@ class TestCommand(test_utils.TestCase):
|
||||
cmd.validate_os_beta_command_enabled()
|
||||
|
||||
cmd.app.options.os_beta_command = False
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
cmd.validate_os_beta_command_enabled)
|
||||
self.assertRaises(
|
||||
exceptions.CommandError, cmd.validate_os_beta_command_enabled
|
||||
)
|
||||
|
@ -19,7 +19,6 @@ from openstackclient.tests.unit import utils
|
||||
|
||||
|
||||
class TestConfiguration(utils.TestCommand):
|
||||
|
||||
columns = (
|
||||
'auth.password',
|
||||
'auth.token',
|
||||
|
@ -24,7 +24,6 @@ from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
|
||||
|
||||
|
||||
class TestExtension(utils.TestCommand):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
||||
@ -61,10 +60,15 @@ class TestExtension(utils.TestCommand):
|
||||
|
||||
|
||||
class TestExtensionList(TestExtension):
|
||||
|
||||
columns = ('Name', 'Alias', 'Description')
|
||||
long_columns = ('Name', 'Alias', 'Description', 'Namespace', 'Updated',
|
||||
'Links')
|
||||
long_columns = (
|
||||
'Name',
|
||||
'Alias',
|
||||
'Description',
|
||||
'Namespace',
|
||||
'Updated',
|
||||
'Links',
|
||||
)
|
||||
|
||||
volume_extension = volume_fakes.create_one_extension()
|
||||
identity_extension = identity_fakes.FakeExtension.create_one_extension()
|
||||
@ -75,17 +79,20 @@ class TestExtensionList(TestExtension):
|
||||
super().setUp()
|
||||
|
||||
self.identity_extensions_mock.list.return_value = [
|
||||
self.identity_extension]
|
||||
self.identity_extension
|
||||
]
|
||||
self.compute_extensions_mock.return_value = [self.compute_extension]
|
||||
self.volume_extensions_mock.show_all.return_value = [
|
||||
self.volume_extension]
|
||||
self.volume_extension
|
||||
]
|
||||
self.network_extensions_mock.return_value = [self.network_extension]
|
||||
|
||||
# Get the command object to test
|
||||
self.cmd = extension.ListExtension(self.app, None)
|
||||
|
||||
def _test_extension_list_helper(self, arglist, verifylist,
|
||||
expected_data, long=False):
|
||||
def _test_extension_list_helper(
|
||||
self, arglist, verifylist, expected_data, long=False
|
||||
):
|
||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||
|
||||
# In base command class Lister in cliff, abstract method take_action()
|
||||
@ -184,11 +191,13 @@ class TestExtensionList(TestExtension):
|
||||
verifylist = [
|
||||
('identity', True),
|
||||
]
|
||||
datalist = ((
|
||||
self.identity_extension.name,
|
||||
self.identity_extension.alias,
|
||||
self.identity_extension.description,
|
||||
), )
|
||||
datalist = (
|
||||
(
|
||||
self.identity_extension.name,
|
||||
self.identity_extension.alias,
|
||||
self.identity_extension.description,
|
||||
),
|
||||
)
|
||||
self._test_extension_list_helper(arglist, verifylist, datalist)
|
||||
self.identity_extensions_mock.list.assert_called_with()
|
||||
|
||||
@ -218,16 +227,19 @@ class TestExtensionList(TestExtension):
|
||||
('network', True),
|
||||
('long', True),
|
||||
]
|
||||
datalist = ((
|
||||
self.network_extension.name,
|
||||
self.network_extension.alias,
|
||||
self.network_extension.description,
|
||||
self.network_extension.namespace,
|
||||
self.network_extension.updated,
|
||||
self.network_extension.links,
|
||||
), )
|
||||
self._test_extension_list_helper(arglist, verifylist, datalist,
|
||||
long=True)
|
||||
datalist = (
|
||||
(
|
||||
self.network_extension.name,
|
||||
self.network_extension.alias,
|
||||
self.network_extension.description,
|
||||
self.network_extension.namespace,
|
||||
self.network_extension.updated,
|
||||
self.network_extension.links,
|
||||
),
|
||||
)
|
||||
self._test_extension_list_helper(
|
||||
arglist, verifylist, datalist, long=True
|
||||
)
|
||||
self.network_extensions_mock.assert_called_with()
|
||||
|
||||
def test_extension_list_compute(self):
|
||||
@ -237,11 +249,13 @@ class TestExtensionList(TestExtension):
|
||||
verifylist = [
|
||||
('compute', True),
|
||||
]
|
||||
datalist = ((
|
||||
self.compute_extension.name,
|
||||
self.compute_extension.alias,
|
||||
self.compute_extension.description,
|
||||
), )
|
||||
datalist = (
|
||||
(
|
||||
self.compute_extension.name,
|
||||
self.compute_extension.alias,
|
||||
self.compute_extension.description,
|
||||
),
|
||||
)
|
||||
self._test_extension_list_helper(arglist, verifylist, datalist)
|
||||
self.compute_extensions_mock.assert_called_with()
|
||||
|
||||
@ -277,19 +291,19 @@ class TestExtensionList(TestExtension):
|
||||
verifylist = [
|
||||
('volume', True),
|
||||
]
|
||||
datalist = ((
|
||||
self.volume_extension.name,
|
||||
self.volume_extension.alias,
|
||||
self.volume_extension.description,
|
||||
), )
|
||||
datalist = (
|
||||
(
|
||||
self.volume_extension.name,
|
||||
self.volume_extension.alias,
|
||||
self.volume_extension.description,
|
||||
),
|
||||
)
|
||||
self._test_extension_list_helper(arglist, verifylist, datalist)
|
||||
self.volume_extensions_mock.show_all.assert_called_with()
|
||||
|
||||
|
||||
class TestExtensionShow(TestExtension):
|
||||
extension_details = (
|
||||
network_fakes.FakeExtension.create_one_extension()
|
||||
)
|
||||
extension_details = network_fakes.FakeExtension.create_one_extension()
|
||||
|
||||
columns = (
|
||||
'alias',
|
||||
@ -306,7 +320,7 @@ class TestExtensionShow(TestExtension):
|
||||
extension_details.links,
|
||||
extension_details.name,
|
||||
extension_details.namespace,
|
||||
extension_details.updated
|
||||
extension_details.updated,
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
@ -315,14 +329,20 @@ class TestExtensionShow(TestExtension):
|
||||
self.cmd = extension.ShowExtension(self.app, None)
|
||||
|
||||
self.app.client_manager.network.find_extension = mock.Mock(
|
||||
return_value=self.extension_details)
|
||||
return_value=self.extension_details
|
||||
)
|
||||
|
||||
def test_show_no_options(self):
|
||||
arglist = []
|
||||
verifylist = []
|
||||
|
||||
self.assertRaises(tests_utils.ParserException, self.check_parser,
|
||||
self.cmd, arglist, verifylist)
|
||||
self.assertRaises(
|
||||
tests_utils.ParserException,
|
||||
self.check_parser,
|
||||
self.cmd,
|
||||
arglist,
|
||||
verifylist,
|
||||
)
|
||||
|
||||
def test_show_all_options(self):
|
||||
arglist = [
|
||||
@ -337,7 +357,8 @@ class TestExtensionShow(TestExtension):
|
||||
columns, data = self.cmd.take_action(parsed_args)
|
||||
|
||||
self.app.client_manager.network.find_extension.assert_called_with(
|
||||
self.extension_details.alias, ignore_missing=False)
|
||||
self.extension_details.alias, ignore_missing=False
|
||||
)
|
||||
|
||||
self.assertEqual(self.columns, columns)
|
||||
self.assertEqual(self.data, data)
|
||||
|
@ -17,20 +17,12 @@ from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
|
||||
|
||||
|
||||
class TestComputeLimits(compute_fakes.TestComputev2):
|
||||
|
||||
absolute_columns = [
|
||||
'Name',
|
||||
'Value',
|
||||
]
|
||||
|
||||
rate_columns = [
|
||||
"Verb",
|
||||
"URI",
|
||||
"Value",
|
||||
"Remain",
|
||||
"Unit",
|
||||
"Next Available"
|
||||
]
|
||||
rate_columns = ["Verb", "URI", "Value", "Remain", "Unit", "Next Available"]
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
@ -77,14 +69,7 @@ class TestVolumeLimits(volume_fakes.TestVolume):
|
||||
'Value',
|
||||
]
|
||||
|
||||
rate_columns = [
|
||||
"Verb",
|
||||
"URI",
|
||||
"Value",
|
||||
"Remain",
|
||||
"Unit",
|
||||
"Next Available"
|
||||
]
|
||||
rate_columns = ["Verb", "URI", "Value", "Remain", "Unit", "Next Available"]
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
@ -23,7 +23,6 @@ from openstackclient.tests.unit import utils
|
||||
|
||||
|
||||
class TestContext(utils.TestCase):
|
||||
|
||||
def test_log_level_from_options(self):
|
||||
opts = mock.Mock()
|
||||
opts.verbose_level = 0
|
||||
@ -70,35 +69,47 @@ class TestContext(utils.TestCase):
|
||||
|
||||
|
||||
class TestFileFormatter(utils.TestCase):
|
||||
|
||||
def test_nothing(self):
|
||||
formatter = logs._FileFormatter()
|
||||
self.assertEqual(('%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
|
||||
'%(name)s %(message)s'), formatter.fmt)
|
||||
self.assertEqual(
|
||||
(
|
||||
'%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
|
||||
'%(name)s %(message)s'
|
||||
),
|
||||
formatter.fmt,
|
||||
)
|
||||
|
||||
def test_options(self):
|
||||
class Opts(object):
|
||||
cloud = 'cloudy'
|
||||
os_project_name = 'projecty'
|
||||
username = 'usernamey'
|
||||
|
||||
options = Opts()
|
||||
formatter = logs._FileFormatter(options=options)
|
||||
self.assertEqual(('%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
|
||||
'%(name)s [cloudy usernamey projecty] %(message)s'),
|
||||
formatter.fmt)
|
||||
self.assertEqual(
|
||||
(
|
||||
'%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
|
||||
'%(name)s [cloudy usernamey projecty] %(message)s'
|
||||
),
|
||||
formatter.fmt,
|
||||
)
|
||||
|
||||
def test_config(self):
|
||||
config = mock.Mock()
|
||||
config.config = {'cloud': 'cloudy'}
|
||||
config.auth = {'project_name': 'projecty', 'username': 'usernamey'}
|
||||
formatter = logs._FileFormatter(config=config)
|
||||
self.assertEqual(('%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
|
||||
'%(name)s [cloudy usernamey projecty] %(message)s'),
|
||||
formatter.fmt)
|
||||
self.assertEqual(
|
||||
(
|
||||
'%(asctime)s.%(msecs)03d %(process)d %(levelname)s '
|
||||
'%(name)s [cloudy usernamey projecty] %(message)s'
|
||||
),
|
||||
formatter.fmt,
|
||||
)
|
||||
|
||||
|
||||
class TestLogConfigurator(utils.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestLogConfigurator, self).setUp()
|
||||
self.options = mock.Mock()
|
||||
@ -121,7 +132,8 @@ class TestLogConfigurator(utils.TestCase):
|
||||
self.requests_log,
|
||||
self.cliff_log,
|
||||
self.stevedore_log,
|
||||
self.iso8601_log]
|
||||
self.iso8601_log,
|
||||
]
|
||||
|
||||
@mock.patch('logging.StreamHandler')
|
||||
@mock.patch('logging.getLogger')
|
||||
@ -190,7 +202,8 @@ class TestLogConfigurator(utils.TestCase):
|
||||
cloud_config.config = {
|
||||
'log_file': config_log,
|
||||
'verbose_level': 1,
|
||||
'log_level': 'info'}
|
||||
'log_level': 'info',
|
||||
}
|
||||
file_logger = mock.Mock()
|
||||
file_logger.setFormatter = mock.Mock()
|
||||
file_logger.setLevel = mock.Mock()
|
||||
|
@ -52,7 +52,6 @@ MODULES = {
|
||||
|
||||
|
||||
class TestCommandList(utils.TestCommand):
|
||||
|
||||
def setUp(self):
|
||||
super(TestCommandList, self).setUp()
|
||||
|
||||
@ -81,16 +80,14 @@ class TestCommandList(utils.TestCommand):
|
||||
# handling the detection rather than using the hard-code below.
|
||||
collist = ('Command Group', 'Commands')
|
||||
self.assertEqual(collist, columns)
|
||||
datalist = ((
|
||||
'openstack.common',
|
||||
'limits show\nextension list'
|
||||
),)
|
||||
datalist = (('openstack.common', 'limits show\nextension list'),)
|
||||
|
||||
self.assertEqual(datalist, tuple(data))
|
||||
|
||||
def test_command_list_with_group_not_found(self):
|
||||
arglist = [
|
||||
'--group', 'not_exist',
|
||||
'--group',
|
||||
'not_exist',
|
||||
]
|
||||
verifylist = [
|
||||
('group', 'not_exist'),
|
||||
@ -105,7 +102,8 @@ class TestCommandList(utils.TestCommand):
|
||||
|
||||
def test_command_list_with_group(self):
|
||||
arglist = [
|
||||
'--group', 'common',
|
||||
'--group',
|
||||
'common',
|
||||
]
|
||||
verifylist = [
|
||||
('group', 'common'),
|
||||
@ -116,10 +114,7 @@ class TestCommandList(utils.TestCommand):
|
||||
|
||||
collist = ('Command Group', 'Commands')
|
||||
self.assertEqual(collist, columns)
|
||||
datalist = ((
|
||||
'openstack.common',
|
||||
'limits show\nextension list'
|
||||
),)
|
||||
datalist = (('openstack.common', 'limits show\nextension list'),)
|
||||
|
||||
self.assertEqual(datalist, tuple(data))
|
||||
|
||||
@ -130,7 +125,6 @@ class TestCommandList(utils.TestCommand):
|
||||
clear=True,
|
||||
)
|
||||
class TestModuleList(utils.TestCommand):
|
||||
|
||||
def setUp(self):
|
||||
super(TestModuleList, self).setUp()
|
||||
|
||||
|
@ -24,7 +24,6 @@ from openstackclient.tests.unit import utils
|
||||
|
||||
|
||||
class TestKeyValueAction(utils.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestKeyValueAction, self).setUp()
|
||||
|
||||
@ -37,15 +36,20 @@ class TestKeyValueAction(utils.TestCase):
|
||||
action=parseractions.KeyValueAction,
|
||||
default={'green': '20%', 'format': '#rgb'},
|
||||
help='Property to store for this volume '
|
||||
'(repeat option to set multiple properties)',
|
||||
'(repeat option to set multiple properties)',
|
||||
)
|
||||
|
||||
def test_good_values(self):
|
||||
results = self.parser.parse_args([
|
||||
'--property', 'red=',
|
||||
'--property', 'green=100%',
|
||||
'--property', 'blue=50%',
|
||||
])
|
||||
results = self.parser.parse_args(
|
||||
[
|
||||
'--property',
|
||||
'red=',
|
||||
'--property',
|
||||
'green=100%',
|
||||
'--property',
|
||||
'blue=50%',
|
||||
]
|
||||
)
|
||||
|
||||
actual = getattr(results, 'property', {})
|
||||
# All should pass through unmolested
|
||||
@ -57,13 +61,13 @@ class TestKeyValueAction(utils.TestCase):
|
||||
argparse.ArgumentTypeError,
|
||||
self.parser.parse_args,
|
||||
[
|
||||
'--property', 'red',
|
||||
]
|
||||
'--property',
|
||||
'red',
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
class TestMultiKeyValueAction(utils.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestMultiKeyValueAction, self).setUp()
|
||||
|
||||
@ -78,14 +82,18 @@ class TestMultiKeyValueAction(utils.TestCase):
|
||||
default=None,
|
||||
required_keys=['req1', 'req2'],
|
||||
optional_keys=['opt1', 'opt2'],
|
||||
help='Test'
|
||||
help='Test',
|
||||
)
|
||||
|
||||
def test_good_values(self):
|
||||
results = self.parser.parse_args([
|
||||
'--test', 'req1=aaa,req2=bbb',
|
||||
'--test', 'req1=,req2=',
|
||||
])
|
||||
results = self.parser.parse_args(
|
||||
[
|
||||
'--test',
|
||||
'req1=aaa,req2=bbb',
|
||||
'--test',
|
||||
'req1=,req2=',
|
||||
]
|
||||
)
|
||||
|
||||
actual = getattr(results, 'test', [])
|
||||
expect = [
|
||||
@ -103,13 +111,17 @@ class TestMultiKeyValueAction(utils.TestCase):
|
||||
default=None,
|
||||
required_keys=[],
|
||||
optional_keys=[],
|
||||
help='Test'
|
||||
help='Test',
|
||||
)
|
||||
|
||||
results = self.parser.parse_args([
|
||||
'--test-empty', 'req1=aaa,req2=bbb',
|
||||
'--test-empty', 'req1=,req2=',
|
||||
])
|
||||
results = self.parser.parse_args(
|
||||
[
|
||||
'--test-empty',
|
||||
'req1=aaa,req2=bbb',
|
||||
'--test-empty',
|
||||
'req1=,req2=',
|
||||
]
|
||||
)
|
||||
|
||||
actual = getattr(results, 'test_empty', [])
|
||||
expect = [
|
||||
@ -123,8 +135,9 @@ class TestMultiKeyValueAction(utils.TestCase):
|
||||
argparse.ArgumentTypeError,
|
||||
self.parser.parse_args,
|
||||
[
|
||||
'--test', 'mmm,nnn=zzz',
|
||||
]
|
||||
'--test',
|
||||
'mmm,nnn=zzz',
|
||||
],
|
||||
)
|
||||
|
||||
def test_error_values_without_comma(self):
|
||||
@ -132,8 +145,9 @@ class TestMultiKeyValueAction(utils.TestCase):
|
||||
argparse.ArgumentTypeError,
|
||||
self.parser.parse_args,
|
||||
[
|
||||
'--test', 'mmmnnn',
|
||||
]
|
||||
'--test',
|
||||
'mmmnnn',
|
||||
],
|
||||
)
|
||||
|
||||
def test_missing_key(self):
|
||||
@ -141,8 +155,9 @@ class TestMultiKeyValueAction(utils.TestCase):
|
||||
argparse.ArgumentTypeError,
|
||||
self.parser.parse_args,
|
||||
[
|
||||
'--test', 'req2=ddd',
|
||||
]
|
||||
'--test',
|
||||
'req2=ddd',
|
||||
],
|
||||
)
|
||||
|
||||
def test_invalid_key(self):
|
||||
@ -150,8 +165,9 @@ class TestMultiKeyValueAction(utils.TestCase):
|
||||
argparse.ArgumentTypeError,
|
||||
self.parser.parse_args,
|
||||
[
|
||||
'--test', 'req1=aaa,req2=bbb,aaa=req1',
|
||||
]
|
||||
'--test',
|
||||
'req1=aaa,req2=bbb,aaa=req1',
|
||||
],
|
||||
)
|
||||
|
||||
def test_required_keys_not_list(self):
|
||||
@ -165,7 +181,7 @@ class TestMultiKeyValueAction(utils.TestCase):
|
||||
default=None,
|
||||
required_keys={'aaa': 'bbb'},
|
||||
optional_keys=['opt1', 'opt2'],
|
||||
help='Test'
|
||||
help='Test',
|
||||
)
|
||||
|
||||
def test_optional_keys_not_list(self):
|
||||
@ -179,12 +195,11 @@ class TestMultiKeyValueAction(utils.TestCase):
|
||||
default=None,
|
||||
required_keys=['req1', 'req2'],
|
||||
optional_keys={'aaa': 'bbb'},
|
||||
help='Test'
|
||||
help='Test',
|
||||
)
|
||||
|
||||
|
||||
class TestNonNegativeAction(utils.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestNonNegativeAction, self).setUp()
|
||||
|
||||
@ -202,21 +217,17 @@ class TestNonNegativeAction(utils.TestCase):
|
||||
self.assertRaises(
|
||||
argparse.ArgumentTypeError,
|
||||
self.parser.parse_args,
|
||||
"--foo -1".split()
|
||||
"--foo -1".split(),
|
||||
)
|
||||
|
||||
def test_zero_values(self):
|
||||
results = self.parser.parse_args(
|
||||
'--foo 0'.split()
|
||||
)
|
||||
results = self.parser.parse_args('--foo 0'.split())
|
||||
|
||||
actual = getattr(results, 'foo', None)
|
||||
self.assertEqual(actual, 0)
|
||||
|
||||
def test_positive_values(self):
|
||||
results = self.parser.parse_args(
|
||||
'--foo 1'.split()
|
||||
)
|
||||
results = self.parser.parse_args('--foo 1'.split())
|
||||
|
||||
actual = getattr(results, 'foo', None)
|
||||
self.assertEqual(actual, 1)
|
||||
|
@ -19,7 +19,6 @@ from openstackclient.tests.unit import utils
|
||||
|
||||
|
||||
class TestProgressBarWrapper(utils.TestCase):
|
||||
|
||||
def test_iter_file_display_progress_bar(self):
|
||||
size = 98304
|
||||
file_obj = io.StringIO('X' * size)
|
||||
@ -31,10 +30,7 @@ class TestProgressBarWrapper(utils.TestCase):
|
||||
chunk = file_obj.read(chunksize)
|
||||
while chunk:
|
||||
chunk = file_obj.read(chunksize)
|
||||
self.assertEqual(
|
||||
'[%s>] 100%%\n' % ('=' * 29),
|
||||
output.getvalue()
|
||||
)
|
||||
self.assertEqual('[%s>] 100%%\n' % ('=' * 29), output.getvalue())
|
||||
finally:
|
||||
sys.stdout = saved_stdout
|
||||
|
||||
|
@ -19,7 +19,6 @@ from openstackclient.tests.unit import utils as tests_utils
|
||||
|
||||
|
||||
class TestProjectCleanupBase(tests_utils.TestCommand):
|
||||
|
||||
def setUp(self):
|
||||
super(TestProjectCleanupBase, self).setUp()
|
||||
|
||||
@ -27,7 +26,6 @@ class TestProjectCleanupBase(tests_utils.TestCommand):
|
||||
|
||||
|
||||
class TestProjectCleanup(TestProjectCleanupBase):
|
||||
|
||||
project = identity_fakes.FakeProject.create_one_project()
|
||||
|
||||
def setUp(self):
|
||||
@ -35,34 +33,46 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
self.cmd = project_cleanup.ProjectCleanup(self.app, None)
|
||||
|
||||
self.project_cleanup_mock = mock.Mock()
|
||||
self.sdk_connect_as_project_mock = \
|
||||
mock.Mock(return_value=self.app.client_manager.sdk_connection)
|
||||
self.app.client_manager.sdk_connection.project_cleanup = \
|
||||
self.sdk_connect_as_project_mock = mock.Mock(
|
||||
return_value=self.app.client_manager.sdk_connection
|
||||
)
|
||||
self.app.client_manager.sdk_connection.project_cleanup = (
|
||||
self.project_cleanup_mock
|
||||
self.app.client_manager.sdk_connection.identity.find_project = \
|
||||
)
|
||||
self.app.client_manager.sdk_connection.identity.find_project = (
|
||||
mock.Mock(return_value=self.project)
|
||||
self.app.client_manager.sdk_connection.connect_as_project = \
|
||||
)
|
||||
self.app.client_manager.sdk_connection.connect_as_project = (
|
||||
self.sdk_connect_as_project_mock
|
||||
)
|
||||
|
||||
def test_project_no_options(self):
|
||||
arglist = []
|
||||
verifylist = []
|
||||
|
||||
self.assertRaises(tests_utils.ParserException, self.check_parser,
|
||||
self.cmd, arglist, verifylist)
|
||||
self.assertRaises(
|
||||
tests_utils.ParserException,
|
||||
self.check_parser,
|
||||
self.cmd,
|
||||
arglist,
|
||||
verifylist,
|
||||
)
|
||||
|
||||
def test_project_cleanup_with_filters(self):
|
||||
arglist = [
|
||||
'--project', self.project.id,
|
||||
'--created-before', '2200-01-01',
|
||||
'--updated-before', '2200-01-02'
|
||||
'--project',
|
||||
self.project.id,
|
||||
'--created-before',
|
||||
'2200-01-01',
|
||||
'--updated-before',
|
||||
'2200-01-02',
|
||||
]
|
||||
verifylist = [
|
||||
('dry_run', False),
|
||||
('auth_project', False),
|
||||
('project', self.project.id),
|
||||
('created_before', '2200-01-01'),
|
||||
('updated_before', '2200-01-02')
|
||||
('updated_before', '2200-01-02'),
|
||||
]
|
||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||
result = None
|
||||
@ -70,16 +80,12 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
with mock.patch('sys.stdin', StringIO('y')):
|
||||
result = self.cmd.take_action(parsed_args)
|
||||
|
||||
self.sdk_connect_as_project_mock.assert_called_with(
|
||||
self.project)
|
||||
filters = {
|
||||
'created_at': '2200-01-01',
|
||||
'updated_at': '2200-01-02'
|
||||
}
|
||||
self.sdk_connect_as_project_mock.assert_called_with(self.project)
|
||||
filters = {'created_at': '2200-01-01', 'updated_at': '2200-01-02'}
|
||||
|
||||
calls = [
|
||||
mock.call(dry_run=True, status_queue=mock.ANY, filters=filters),
|
||||
mock.call(dry_run=False, status_queue=mock.ANY, filters=filters)
|
||||
mock.call(dry_run=False, status_queue=mock.ANY, filters=filters),
|
||||
]
|
||||
self.project_cleanup_mock.assert_has_calls(calls)
|
||||
|
||||
@ -87,7 +93,8 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
|
||||
def test_project_cleanup_with_auto_approve(self):
|
||||
arglist = [
|
||||
'--project', self.project.id,
|
||||
'--project',
|
||||
self.project.id,
|
||||
'--auto-approve',
|
||||
]
|
||||
verifylist = [
|
||||
@ -101,11 +108,10 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
|
||||
result = self.cmd.take_action(parsed_args)
|
||||
|
||||
self.sdk_connect_as_project_mock.assert_called_with(
|
||||
self.project)
|
||||
self.sdk_connect_as_project_mock.assert_called_with(self.project)
|
||||
calls = [
|
||||
mock.call(dry_run=True, status_queue=mock.ANY, filters={}),
|
||||
mock.call(dry_run=False, status_queue=mock.ANY, filters={})
|
||||
mock.call(dry_run=False, status_queue=mock.ANY, filters={}),
|
||||
]
|
||||
self.project_cleanup_mock.assert_has_calls(calls)
|
||||
|
||||
@ -113,7 +119,8 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
|
||||
def test_project_cleanup_with_project(self):
|
||||
arglist = [
|
||||
'--project', self.project.id,
|
||||
'--project',
|
||||
self.project.id,
|
||||
]
|
||||
verifylist = [
|
||||
('dry_run', False),
|
||||
@ -126,11 +133,10 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
with mock.patch('sys.stdin', StringIO('y')):
|
||||
result = self.cmd.take_action(parsed_args)
|
||||
|
||||
self.sdk_connect_as_project_mock.assert_called_with(
|
||||
self.project)
|
||||
self.sdk_connect_as_project_mock.assert_called_with(self.project)
|
||||
calls = [
|
||||
mock.call(dry_run=True, status_queue=mock.ANY, filters={}),
|
||||
mock.call(dry_run=False, status_queue=mock.ANY, filters={})
|
||||
mock.call(dry_run=False, status_queue=mock.ANY, filters={}),
|
||||
]
|
||||
self.project_cleanup_mock.assert_has_calls(calls)
|
||||
|
||||
@ -138,7 +144,8 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
|
||||
def test_project_cleanup_with_project_abort(self):
|
||||
arglist = [
|
||||
'--project', self.project.id,
|
||||
'--project',
|
||||
self.project.id,
|
||||
]
|
||||
verifylist = [
|
||||
('dry_run', False),
|
||||
@ -151,8 +158,7 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
with mock.patch('sys.stdin', StringIO('n')):
|
||||
result = self.cmd.take_action(parsed_args)
|
||||
|
||||
self.sdk_connect_as_project_mock.assert_called_with(
|
||||
self.project)
|
||||
self.sdk_connect_as_project_mock.assert_called_with(self.project)
|
||||
calls = [
|
||||
mock.call(dry_run=True, status_queue=mock.ANY, filters={}),
|
||||
]
|
||||
@ -163,7 +169,8 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
def test_project_cleanup_with_dry_run(self):
|
||||
arglist = [
|
||||
'--dry-run',
|
||||
'--project', self.project.id,
|
||||
'--project',
|
||||
self.project.id,
|
||||
]
|
||||
verifylist = [
|
||||
('dry_run', True),
|
||||
@ -175,10 +182,10 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
|
||||
result = self.cmd.take_action(parsed_args)
|
||||
|
||||
self.sdk_connect_as_project_mock.assert_called_with(
|
||||
self.project)
|
||||
self.sdk_connect_as_project_mock.assert_called_with(self.project)
|
||||
self.project_cleanup_mock.assert_called_once_with(
|
||||
dry_run=True, status_queue=mock.ANY, filters={})
|
||||
dry_run=True, status_queue=mock.ANY, filters={}
|
||||
)
|
||||
|
||||
self.assertIsNone(result)
|
||||
|
||||
@ -202,7 +209,7 @@ class TestProjectCleanup(TestProjectCleanupBase):
|
||||
self.sdk_connect_as_project_mock.assert_not_called()
|
||||
calls = [
|
||||
mock.call(dry_run=True, status_queue=mock.ANY, filters={}),
|
||||
mock.call(dry_run=False, status_queue=mock.ANY, filters={})
|
||||
mock.call(dry_run=False, status_queue=mock.ANY, filters={}),
|
||||
]
|
||||
self.project_cleanup_mock.assert_has_calls(calls)
|
||||
|
||||
|
@ -24,7 +24,6 @@ from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
|
||||
|
||||
|
||||
class TestProjectPurgeInit(tests_utils.TestCommand):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
compute_client = compute_fakes.FakeComputev2Client(
|
||||
@ -67,7 +66,6 @@ class TestProjectPurgeInit(tests_utils.TestCommand):
|
||||
|
||||
|
||||
class TestProjectPurge(TestProjectPurgeInit):
|
||||
|
||||
project = identity_fakes.FakeProject.create_one_project()
|
||||
server = compute_fakes.FakeServer.create_one_server()
|
||||
image = image_fakes.create_one_image()
|
||||
@ -97,12 +95,18 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
arglist = []
|
||||
verifylist = []
|
||||
|
||||
self.assertRaises(tests_utils.ParserException, self.check_parser,
|
||||
self.cmd, arglist, verifylist)
|
||||
self.assertRaises(
|
||||
tests_utils.ParserException,
|
||||
self.check_parser,
|
||||
self.cmd,
|
||||
arglist,
|
||||
verifylist,
|
||||
)
|
||||
|
||||
def test_project_purge_with_project(self):
|
||||
arglist = [
|
||||
'--project', self.project.id,
|
||||
'--project',
|
||||
self.project.id,
|
||||
]
|
||||
verifylist = [
|
||||
('dry_run', False),
|
||||
@ -117,17 +121,23 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
self.projects_mock.get.assert_called_once_with(self.project.id)
|
||||
self.projects_mock.delete.assert_called_once_with(self.project.id)
|
||||
self.servers_mock.list.assert_called_once_with(
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True})
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True}
|
||||
)
|
||||
kwargs = {'filters': {'owner': self.project.id}}
|
||||
self.images_mock.list.assert_called_once_with(**kwargs)
|
||||
volume_search_opts = {'project_id': self.project.id,
|
||||
'all_tenants': True}
|
||||
volume_search_opts = {
|
||||
'project_id': self.project.id,
|
||||
'all_tenants': True,
|
||||
}
|
||||
self.volumes_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.snapshots_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.backups_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.servers_mock.delete.assert_called_once_with(self.server.id)
|
||||
self.images_mock.delete.assert_called_once_with(self.image.id)
|
||||
self.volumes_mock.force_delete.assert_called_once_with(self.volume.id)
|
||||
@ -138,7 +148,8 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
def test_project_purge_with_dry_run(self):
|
||||
arglist = [
|
||||
'--dry-run',
|
||||
'--project', self.project.id,
|
||||
'--project',
|
||||
self.project.id,
|
||||
]
|
||||
verifylist = [
|
||||
('dry_run', True),
|
||||
@ -153,17 +164,23 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
self.projects_mock.get.assert_called_once_with(self.project.id)
|
||||
self.projects_mock.delete.assert_not_called()
|
||||
self.servers_mock.list.assert_called_once_with(
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True})
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True}
|
||||
)
|
||||
kwargs = {'filters': {'owner': self.project.id}}
|
||||
self.images_mock.list.assert_called_once_with(**kwargs)
|
||||
volume_search_opts = {'project_id': self.project.id,
|
||||
'all_tenants': True}
|
||||
volume_search_opts = {
|
||||
'project_id': self.project.id,
|
||||
'all_tenants': True,
|
||||
}
|
||||
self.volumes_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.snapshots_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.backups_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.servers_mock.delete.assert_not_called()
|
||||
self.images_mock.delete.assert_not_called()
|
||||
self.volumes_mock.force_delete.assert_not_called()
|
||||
@ -174,7 +191,8 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
def test_project_purge_with_keep_project(self):
|
||||
arglist = [
|
||||
'--keep-project',
|
||||
'--project', self.project.id,
|
||||
'--project',
|
||||
self.project.id,
|
||||
]
|
||||
verifylist = [
|
||||
('dry_run', False),
|
||||
@ -189,17 +207,23 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
self.projects_mock.get.assert_called_once_with(self.project.id)
|
||||
self.projects_mock.delete.assert_not_called()
|
||||
self.servers_mock.list.assert_called_once_with(
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True})
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True}
|
||||
)
|
||||
kwargs = {'filters': {'owner': self.project.id}}
|
||||
self.images_mock.list.assert_called_once_with(**kwargs)
|
||||
volume_search_opts = {'project_id': self.project.id,
|
||||
'all_tenants': True}
|
||||
volume_search_opts = {
|
||||
'project_id': self.project.id,
|
||||
'all_tenants': True,
|
||||
}
|
||||
self.volumes_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.snapshots_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.backups_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.servers_mock.delete.assert_called_once_with(self.server.id)
|
||||
self.images_mock.delete.assert_called_once_with(self.image.id)
|
||||
self.volumes_mock.force_delete.assert_called_once_with(self.volume.id)
|
||||
@ -226,17 +250,23 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
self.projects_mock.get.assert_not_called()
|
||||
self.projects_mock.delete.assert_called_once_with(self.project.id)
|
||||
self.servers_mock.list.assert_called_once_with(
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True})
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True}
|
||||
)
|
||||
kwargs = {'filters': {'owner': self.project.id}}
|
||||
self.images_mock.list.assert_called_once_with(**kwargs)
|
||||
volume_search_opts = {'project_id': self.project.id,
|
||||
'all_tenants': True}
|
||||
volume_search_opts = {
|
||||
'project_id': self.project.id,
|
||||
'all_tenants': True,
|
||||
}
|
||||
self.volumes_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.snapshots_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.backups_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.servers_mock.delete.assert_called_once_with(self.server.id)
|
||||
self.images_mock.delete.assert_called_once_with(self.image.id)
|
||||
self.volumes_mock.force_delete.assert_called_once_with(self.volume.id)
|
||||
@ -248,7 +278,8 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
def test_project_purge_with_exception(self, mock_error):
|
||||
self.servers_mock.delete.side_effect = exceptions.CommandError()
|
||||
arglist = [
|
||||
'--project', self.project.id,
|
||||
'--project',
|
||||
self.project.id,
|
||||
]
|
||||
verifylist = [
|
||||
('dry_run', False),
|
||||
@ -263,17 +294,23 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
self.projects_mock.get.assert_called_once_with(self.project.id)
|
||||
self.projects_mock.delete.assert_called_once_with(self.project.id)
|
||||
self.servers_mock.list.assert_called_once_with(
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True})
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True}
|
||||
)
|
||||
kwargs = {'filters': {'owner': self.project.id}}
|
||||
self.images_mock.list.assert_called_once_with(**kwargs)
|
||||
volume_search_opts = {'project_id': self.project.id,
|
||||
'all_tenants': True}
|
||||
volume_search_opts = {
|
||||
'project_id': self.project.id,
|
||||
'all_tenants': True,
|
||||
}
|
||||
self.volumes_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.snapshots_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.backups_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.servers_mock.delete.assert_called_once_with(self.server.id)
|
||||
self.images_mock.delete.assert_called_once_with(self.image.id)
|
||||
self.volumes_mock.force_delete.assert_called_once_with(self.volume.id)
|
||||
@ -285,7 +322,8 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
def test_project_purge_with_force_delete_backup(self):
|
||||
self.backups_mock.delete.side_effect = [exceptions.CommandError, None]
|
||||
arglist = [
|
||||
'--project', self.project.id,
|
||||
'--project',
|
||||
self.project.id,
|
||||
]
|
||||
verifylist = [
|
||||
('dry_run', False),
|
||||
@ -300,17 +338,23 @@ class TestProjectPurge(TestProjectPurgeInit):
|
||||
self.projects_mock.get.assert_called_once_with(self.project.id)
|
||||
self.projects_mock.delete.assert_called_once_with(self.project.id)
|
||||
self.servers_mock.list.assert_called_once_with(
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True})
|
||||
search_opts={'tenant_id': self.project.id, 'all_tenants': True}
|
||||
)
|
||||
kwargs = {'filters': {'owner': self.project.id}}
|
||||
self.images_mock.list.assert_called_once_with(**kwargs)
|
||||
volume_search_opts = {'project_id': self.project.id,
|
||||
'all_tenants': True}
|
||||
volume_search_opts = {
|
||||
'project_id': self.project.id,
|
||||
'all_tenants': True,
|
||||
}
|
||||
self.volumes_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.snapshots_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.backups_mock.list.assert_called_once_with(
|
||||
search_opts=volume_search_opts)
|
||||
search_opts=volume_search_opts
|
||||
)
|
||||
self.servers_mock.delete.assert_called_once_with(self.server.id)
|
||||
self.images_mock.delete.assert_called_once_with(self.image.id)
|
||||
self.volumes_mock.force_delete.assert_called_once_with(self.volume.id)
|
||||
|
@ -25,7 +25,6 @@ from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
|
||||
|
||||
|
||||
class FakeQuotaResource(fakes.FakeResource):
|
||||
|
||||
_keys = {'property': 'value'}
|
||||
|
||||
def set_keys(self, args):
|
||||
@ -40,7 +39,6 @@ class FakeQuotaResource(fakes.FakeResource):
|
||||
|
||||
|
||||
class TestQuota(compute_fakes.TestComputev2):
|
||||
|
||||
def setUp(self):
|
||||
super(TestQuota, self).setUp()
|
||||
|
||||
@ -52,14 +50,16 @@ class TestQuota(compute_fakes.TestComputev2):
|
||||
|
||||
self.compute_quotas_mock = self.app.client_manager.compute.quotas
|
||||
self.compute_quotas_mock.reset_mock()
|
||||
self.compute_quotas_class_mock = \
|
||||
self.compute_quotas_class_mock = (
|
||||
self.app.client_manager.compute.quota_classes
|
||||
)
|
||||
self.compute_quotas_class_mock.reset_mock()
|
||||
|
||||
self.volume_quotas_mock = self.app.client_manager.volume.quotas
|
||||
self.volume_quotas_mock.reset_mock()
|
||||
self.volume_quotas_class_mock = \
|
||||
self.volume_quotas_class_mock = (
|
||||
self.app.client_manager.volume.quota_classes
|
||||
)
|
||||
self.volume_quotas_class_mock.reset_mock()
|
||||
|
||||
self.app.client_manager.network = mock.Mock()
|
||||
@ -67,8 +67,9 @@ class TestQuota(compute_fakes.TestComputev2):
|
||||
|
||||
self.app.client_manager.auth_ref = mock.Mock()
|
||||
self.app.client_manager.auth_ref.service_catalog = mock.Mock()
|
||||
self.service_catalog_mock = \
|
||||
self.service_catalog_mock = (
|
||||
self.app.client_manager.auth_ref.service_catalog
|
||||
)
|
||||
self.service_catalog_mock.reset_mock()
|
||||
self.app.client_manager.auth_ref.project_id = identity_fakes.project_id
|
||||
|
||||
@ -101,7 +102,7 @@ class TestQuotaList(TestQuota):
|
||||
'Security Groups',
|
||||
'Security Group Rules',
|
||||
'Subnets',
|
||||
'Subnet Pools'
|
||||
'Subnet Pools',
|
||||
)
|
||||
|
||||
volume_column_header = (
|
||||
@ -210,16 +211,14 @@ class TestQuotaList(TestQuota):
|
||||
in_use = values['used']
|
||||
else:
|
||||
in_use = values['in_use']
|
||||
resource_values = [
|
||||
in_use,
|
||||
values['reserved'],
|
||||
values['limit']]
|
||||
resource_values = [in_use, values['reserved'], values['limit']]
|
||||
reference_data.append(tuple([name] + resource_values))
|
||||
return reference_data
|
||||
|
||||
def test_quota_list_details_compute(self):
|
||||
detailed_quota = (
|
||||
compute_fakes.FakeQuota.create_one_comp_detailed_quota())
|
||||
compute_fakes.FakeQuota.create_one_comp_detailed_quota()
|
||||
)
|
||||
|
||||
detailed_column_header = (
|
||||
'Resource',
|
||||
@ -227,13 +226,15 @@ class TestQuotaList(TestQuota):
|
||||
'Reserved',
|
||||
'Limit',
|
||||
)
|
||||
detailed_reference_data = (
|
||||
self._get_detailed_reference_data(detailed_quota))
|
||||
detailed_reference_data = self._get_detailed_reference_data(
|
||||
detailed_quota
|
||||
)
|
||||
|
||||
self.compute.quotas.get = mock.Mock(return_value=detailed_quota)
|
||||
|
||||
arglist = [
|
||||
'--detail', '--compute',
|
||||
'--detail',
|
||||
'--compute',
|
||||
]
|
||||
verifylist = [
|
||||
('detail', True),
|
||||
@ -245,12 +246,12 @@ class TestQuotaList(TestQuota):
|
||||
ret_quotas = list(data)
|
||||
|
||||
self.assertEqual(detailed_column_header, columns)
|
||||
self.assertEqual(
|
||||
sorted(detailed_reference_data), sorted(ret_quotas))
|
||||
self.assertEqual(sorted(detailed_reference_data), sorted(ret_quotas))
|
||||
|
||||
def test_quota_list_details_network(self):
|
||||
detailed_quota = (
|
||||
network_fakes.FakeQuota.create_one_net_detailed_quota())
|
||||
network_fakes.FakeQuota.create_one_net_detailed_quota()
|
||||
)
|
||||
|
||||
detailed_column_header = (
|
||||
'Resource',
|
||||
@ -258,13 +259,15 @@ class TestQuotaList(TestQuota):
|
||||
'Reserved',
|
||||
'Limit',
|
||||
)
|
||||
detailed_reference_data = (
|
||||
self._get_detailed_reference_data(detailed_quota))
|
||||
detailed_reference_data = self._get_detailed_reference_data(
|
||||
detailed_quota
|
||||
)
|
||||
|
||||
self.network.get_quota = mock.Mock(return_value=detailed_quota)
|
||||
|
||||
arglist = [
|
||||
'--detail', '--network',
|
||||
'--detail',
|
||||
'--network',
|
||||
]
|
||||
verifylist = [
|
||||
('detail', True),
|
||||
@ -276,8 +279,7 @@ class TestQuotaList(TestQuota):
|
||||
ret_quotas = list(data)
|
||||
|
||||
self.assertEqual(detailed_column_header, columns)
|
||||
self.assertEqual(
|
||||
sorted(detailed_reference_data), sorted(ret_quotas))
|
||||
self.assertEqual(sorted(detailed_reference_data), sorted(ret_quotas))
|
||||
|
||||
def test_quota_list_details_volume(self):
|
||||
detailed_quota = volume_fakes.create_one_detailed_quota()
|
||||
@ -288,8 +290,9 @@ class TestQuotaList(TestQuota):
|
||||
'Reserved',
|
||||
'Limit',
|
||||
)
|
||||
detailed_reference_data = (
|
||||
self._get_detailed_reference_data(detailed_quota))
|
||||
detailed_reference_data = self._get_detailed_reference_data(
|
||||
detailed_quota
|
||||
)
|
||||
|
||||
self.volume.quotas.get = mock.Mock(return_value=detailed_quota)
|
||||
|
||||
@ -433,7 +436,8 @@ class TestQuotaList(TestQuota):
|
||||
|
||||
arglist = [
|
||||
'--compute',
|
||||
'--project', self.projects[0].name,
|
||||
'--project',
|
||||
self.projects[0].name,
|
||||
]
|
||||
verifylist = [
|
||||
('compute', True),
|
||||
@ -525,7 +529,8 @@ class TestQuotaList(TestQuota):
|
||||
|
||||
arglist = [
|
||||
'--network',
|
||||
'--project', self.projects[0].name,
|
||||
'--project',
|
||||
self.projects[0].name,
|
||||
]
|
||||
verifylist = [
|
||||
('network', True),
|
||||
@ -617,7 +622,8 @@ class TestQuotaList(TestQuota):
|
||||
|
||||
arglist = [
|
||||
'--volume',
|
||||
'--project', self.projects[0].name,
|
||||
'--project',
|
||||
self.projects[0].name,
|
||||
]
|
||||
verifylist = [
|
||||
('volume', True),
|
||||
@ -634,7 +640,6 @@ class TestQuotaList(TestQuota):
|
||||
|
||||
|
||||
class TestQuotaSet(TestQuota):
|
||||
|
||||
def setUp(self):
|
||||
super(TestQuotaSet, self).setUp()
|
||||
|
||||
@ -666,28 +671,44 @@ class TestQuotaSet(TestQuota):
|
||||
|
||||
def test_quota_set(self):
|
||||
arglist = [
|
||||
'--floating-ips', str(compute_fakes.floating_ip_num),
|
||||
'--fixed-ips', str(compute_fakes.fix_ip_num),
|
||||
'--injected-files', str(compute_fakes.injected_file_num),
|
||||
'--injected-file-size', str(compute_fakes.injected_file_size_num),
|
||||
'--injected-path-size', str(compute_fakes.injected_path_size_num),
|
||||
'--key-pairs', str(compute_fakes.key_pair_num),
|
||||
'--cores', str(compute_fakes.core_num),
|
||||
'--ram', str(compute_fakes.ram_num),
|
||||
'--instances', str(compute_fakes.instance_num),
|
||||
'--properties', str(compute_fakes.property_num),
|
||||
'--secgroup-rules', str(compute_fakes.secgroup_rule_num),
|
||||
'--secgroups', str(compute_fakes.secgroup_num),
|
||||
'--server-groups', str(compute_fakes.servgroup_num),
|
||||
'--server-group-members', str(compute_fakes.servgroup_members_num),
|
||||
'--floating-ips',
|
||||
str(compute_fakes.floating_ip_num),
|
||||
'--fixed-ips',
|
||||
str(compute_fakes.fix_ip_num),
|
||||
'--injected-files',
|
||||
str(compute_fakes.injected_file_num),
|
||||
'--injected-file-size',
|
||||
str(compute_fakes.injected_file_size_num),
|
||||
'--injected-path-size',
|
||||
str(compute_fakes.injected_path_size_num),
|
||||
'--key-pairs',
|
||||
str(compute_fakes.key_pair_num),
|
||||
'--cores',
|
||||
str(compute_fakes.core_num),
|
||||
'--ram',
|
||||
str(compute_fakes.ram_num),
|
||||
'--instances',
|
||||
str(compute_fakes.instance_num),
|
||||
'--properties',
|
||||
str(compute_fakes.property_num),
|
||||
'--secgroup-rules',
|
||||
str(compute_fakes.secgroup_rule_num),
|
||||
'--secgroups',
|
||||
str(compute_fakes.secgroup_num),
|
||||
'--server-groups',
|
||||
str(compute_fakes.servgroup_num),
|
||||
'--server-group-members',
|
||||
str(compute_fakes.servgroup_members_num),
|
||||
self.projects[0].name,
|
||||
]
|
||||
verifylist = [
|
||||
('floating_ips', compute_fakes.floating_ip_num),
|
||||
('fixed_ips', compute_fakes.fix_ip_num),
|
||||
('injected_files', compute_fakes.injected_file_num),
|
||||
('injected_file_content_bytes',
|
||||
compute_fakes.injected_file_size_num),
|
||||
(
|
||||
'injected_file_content_bytes',
|
||||
compute_fakes.injected_file_size_num,
|
||||
),
|
||||
('injected_file_path_bytes', compute_fakes.injected_path_size_num),
|
||||
('key_pairs', compute_fakes.key_pair_num),
|
||||
('cores', compute_fakes.core_num),
|
||||
@ -709,8 +730,7 @@ class TestQuotaSet(TestQuota):
|
||||
'floating_ips': compute_fakes.floating_ip_num,
|
||||
'fixed_ips': compute_fakes.fix_ip_num,
|
||||
'injected_files': compute_fakes.injected_file_num,
|
||||
'injected_file_content_bytes':
|
||||
compute_fakes.injected_file_size_num,
|
||||
'injected_file_content_bytes': compute_fakes.injected_file_size_num, # noqa: E501
|
||||
'injected_file_path_bytes': compute_fakes.injected_path_size_num,
|
||||
'key_pairs': compute_fakes.key_pair_num,
|
||||
'cores': compute_fakes.core_num,
|
||||
@ -724,18 +744,22 @@ class TestQuotaSet(TestQuota):
|
||||
}
|
||||
|
||||
self.compute_quotas_mock.update.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs
|
||||
self.projects[0].id, **kwargs
|
||||
)
|
||||
self.assertIsNone(result)
|
||||
|
||||
def test_quota_set_volume(self):
|
||||
arglist = [
|
||||
'--gigabytes', str(volume_fakes.QUOTA['gigabytes']),
|
||||
'--snapshots', str(volume_fakes.QUOTA['snapshots']),
|
||||
'--volumes', str(volume_fakes.QUOTA['volumes']),
|
||||
'--backups', str(volume_fakes.QUOTA['backups']),
|
||||
'--backup-gigabytes', str(volume_fakes.QUOTA['backup_gigabytes']),
|
||||
'--gigabytes',
|
||||
str(volume_fakes.QUOTA['gigabytes']),
|
||||
'--snapshots',
|
||||
str(volume_fakes.QUOTA['snapshots']),
|
||||
'--volumes',
|
||||
str(volume_fakes.QUOTA['volumes']),
|
||||
'--backups',
|
||||
str(volume_fakes.QUOTA['backups']),
|
||||
'--backup-gigabytes',
|
||||
str(volume_fakes.QUOTA['backup_gigabytes']),
|
||||
'--per-volume-gigabytes',
|
||||
str(volume_fakes.QUOTA['per_volume_gigabytes']),
|
||||
self.projects[0].name,
|
||||
@ -746,8 +770,10 @@ class TestQuotaSet(TestQuota):
|
||||
('volumes', volume_fakes.QUOTA['volumes']),
|
||||
('backups', volume_fakes.QUOTA['backups']),
|
||||
('backup_gigabytes', volume_fakes.QUOTA['backup_gigabytes']),
|
||||
('per_volume_gigabytes',
|
||||
volume_fakes.QUOTA['per_volume_gigabytes']),
|
||||
(
|
||||
'per_volume_gigabytes',
|
||||
volume_fakes.QUOTA['per_volume_gigabytes'],
|
||||
),
|
||||
('project', self.projects[0].name),
|
||||
]
|
||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||
@ -760,26 +786,31 @@ class TestQuotaSet(TestQuota):
|
||||
'volumes': volume_fakes.QUOTA['volumes'],
|
||||
'backups': volume_fakes.QUOTA['backups'],
|
||||
'backup_gigabytes': volume_fakes.QUOTA['backup_gigabytes'],
|
||||
'per_volume_gigabytes': volume_fakes.QUOTA['per_volume_gigabytes']
|
||||
'per_volume_gigabytes': volume_fakes.QUOTA['per_volume_gigabytes'],
|
||||
}
|
||||
|
||||
self.volume_quotas_mock.update.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs
|
||||
self.projects[0].id, **kwargs
|
||||
)
|
||||
|
||||
self.assertIsNone(result)
|
||||
|
||||
def test_quota_set_volume_with_volume_type(self):
|
||||
arglist = [
|
||||
'--gigabytes', str(volume_fakes.QUOTA['gigabytes']),
|
||||
'--snapshots', str(volume_fakes.QUOTA['snapshots']),
|
||||
'--volumes', str(volume_fakes.QUOTA['volumes']),
|
||||
'--backups', str(volume_fakes.QUOTA['backups']),
|
||||
'--backup-gigabytes', str(volume_fakes.QUOTA['backup_gigabytes']),
|
||||
'--gigabytes',
|
||||
str(volume_fakes.QUOTA['gigabytes']),
|
||||
'--snapshots',
|
||||
str(volume_fakes.QUOTA['snapshots']),
|
||||
'--volumes',
|
||||
str(volume_fakes.QUOTA['volumes']),
|
||||
'--backups',
|
||||
str(volume_fakes.QUOTA['backups']),
|
||||
'--backup-gigabytes',
|
||||
str(volume_fakes.QUOTA['backup_gigabytes']),
|
||||
'--per-volume-gigabytes',
|
||||
str(volume_fakes.QUOTA['per_volume_gigabytes']),
|
||||
'--volume-type', 'volume_type_backend',
|
||||
'--volume-type',
|
||||
'volume_type_backend',
|
||||
self.projects[0].name,
|
||||
]
|
||||
verifylist = [
|
||||
@ -788,8 +819,10 @@ class TestQuotaSet(TestQuota):
|
||||
('volumes', volume_fakes.QUOTA['volumes']),
|
||||
('backups', volume_fakes.QUOTA['backups']),
|
||||
('backup_gigabytes', volume_fakes.QUOTA['backup_gigabytes']),
|
||||
('per_volume_gigabytes',
|
||||
volume_fakes.QUOTA['per_volume_gigabytes']),
|
||||
(
|
||||
'per_volume_gigabytes',
|
||||
volume_fakes.QUOTA['per_volume_gigabytes'],
|
||||
),
|
||||
('volume_type', 'volume_type_backend'),
|
||||
('project', self.projects[0].name),
|
||||
]
|
||||
@ -803,27 +836,34 @@ class TestQuotaSet(TestQuota):
|
||||
'volumes_volume_type_backend': volume_fakes.QUOTA['volumes'],
|
||||
'backups': volume_fakes.QUOTA['backups'],
|
||||
'backup_gigabytes': volume_fakes.QUOTA['backup_gigabytes'],
|
||||
'per_volume_gigabytes': volume_fakes.QUOTA['per_volume_gigabytes']
|
||||
'per_volume_gigabytes': volume_fakes.QUOTA['per_volume_gigabytes'],
|
||||
}
|
||||
|
||||
self.volume_quotas_mock.update.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs
|
||||
self.projects[0].id, **kwargs
|
||||
)
|
||||
self.assertIsNone(result)
|
||||
|
||||
def test_quota_set_network(self):
|
||||
arglist = [
|
||||
'--subnets', str(network_fakes.QUOTA['subnet']),
|
||||
'--networks', str(network_fakes.QUOTA['network']),
|
||||
'--floating-ips', str(network_fakes.QUOTA['floatingip']),
|
||||
'--subnetpools', str(network_fakes.QUOTA['subnetpool']),
|
||||
'--subnets',
|
||||
str(network_fakes.QUOTA['subnet']),
|
||||
'--networks',
|
||||
str(network_fakes.QUOTA['network']),
|
||||
'--floating-ips',
|
||||
str(network_fakes.QUOTA['floatingip']),
|
||||
'--subnetpools',
|
||||
str(network_fakes.QUOTA['subnetpool']),
|
||||
'--secgroup-rules',
|
||||
str(network_fakes.QUOTA['security_group_rule']),
|
||||
'--secgroups', str(network_fakes.QUOTA['security_group']),
|
||||
'--routers', str(network_fakes.QUOTA['router']),
|
||||
'--rbac-policies', str(network_fakes.QUOTA['rbac_policy']),
|
||||
'--ports', str(network_fakes.QUOTA['port']),
|
||||
'--secgroups',
|
||||
str(network_fakes.QUOTA['security_group']),
|
||||
'--routers',
|
||||
str(network_fakes.QUOTA['router']),
|
||||
'--rbac-policies',
|
||||
str(network_fakes.QUOTA['rbac_policy']),
|
||||
'--ports',
|
||||
str(network_fakes.QUOTA['port']),
|
||||
self.projects[0].name,
|
||||
]
|
||||
verifylist = [
|
||||
@ -831,8 +871,10 @@ class TestQuotaSet(TestQuota):
|
||||
('network', network_fakes.QUOTA['network']),
|
||||
('floatingip', network_fakes.QUOTA['floatingip']),
|
||||
('subnetpool', network_fakes.QUOTA['subnetpool']),
|
||||
('security_group_rule',
|
||||
network_fakes.QUOTA['security_group_rule']),
|
||||
(
|
||||
'security_group_rule',
|
||||
network_fakes.QUOTA['security_group_rule'],
|
||||
),
|
||||
('security_group', network_fakes.QUOTA['security_group']),
|
||||
('router', network_fakes.QUOTA['router']),
|
||||
('rbac_policy', network_fakes.QUOTA['rbac_policy']),
|
||||
@ -847,42 +889,56 @@ class TestQuotaSet(TestQuota):
|
||||
'network': network_fakes.QUOTA['network'],
|
||||
'floatingip': network_fakes.QUOTA['floatingip'],
|
||||
'subnetpool': network_fakes.QUOTA['subnetpool'],
|
||||
'security_group_rule':
|
||||
network_fakes.QUOTA['security_group_rule'],
|
||||
'security_group_rule': network_fakes.QUOTA['security_group_rule'],
|
||||
'security_group': network_fakes.QUOTA['security_group'],
|
||||
'router': network_fakes.QUOTA['router'],
|
||||
'rbac_policy': network_fakes.QUOTA['rbac_policy'],
|
||||
'port': network_fakes.QUOTA['port'],
|
||||
}
|
||||
self.network_mock.update_quota.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs
|
||||
self.projects[0].id, **kwargs
|
||||
)
|
||||
self.assertIsNone(result)
|
||||
|
||||
def test_quota_set_with_class(self):
|
||||
arglist = [
|
||||
'--injected-files', str(compute_fakes.injected_file_num),
|
||||
'--injected-file-size', str(compute_fakes.injected_file_size_num),
|
||||
'--injected-path-size', str(compute_fakes.injected_path_size_num),
|
||||
'--key-pairs', str(compute_fakes.key_pair_num),
|
||||
'--cores', str(compute_fakes.core_num),
|
||||
'--ram', str(compute_fakes.ram_num),
|
||||
'--instances', str(compute_fakes.instance_num),
|
||||
'--properties', str(compute_fakes.property_num),
|
||||
'--server-groups', str(compute_fakes.servgroup_num),
|
||||
'--server-group-members', str(compute_fakes.servgroup_members_num),
|
||||
'--gigabytes', str(compute_fakes.floating_ip_num),
|
||||
'--snapshots', str(compute_fakes.fix_ip_num),
|
||||
'--volumes', str(volume_fakes.QUOTA['volumes']),
|
||||
'--network', str(network_fakes.QUOTA['network']),
|
||||
'--injected-files',
|
||||
str(compute_fakes.injected_file_num),
|
||||
'--injected-file-size',
|
||||
str(compute_fakes.injected_file_size_num),
|
||||
'--injected-path-size',
|
||||
str(compute_fakes.injected_path_size_num),
|
||||
'--key-pairs',
|
||||
str(compute_fakes.key_pair_num),
|
||||
'--cores',
|
||||
str(compute_fakes.core_num),
|
||||
'--ram',
|
||||
str(compute_fakes.ram_num),
|
||||
'--instances',
|
||||
str(compute_fakes.instance_num),
|
||||
'--properties',
|
||||
str(compute_fakes.property_num),
|
||||
'--server-groups',
|
||||
str(compute_fakes.servgroup_num),
|
||||
'--server-group-members',
|
||||
str(compute_fakes.servgroup_members_num),
|
||||
'--gigabytes',
|
||||
str(compute_fakes.floating_ip_num),
|
||||
'--snapshots',
|
||||
str(compute_fakes.fix_ip_num),
|
||||
'--volumes',
|
||||
str(volume_fakes.QUOTA['volumes']),
|
||||
'--network',
|
||||
str(network_fakes.QUOTA['network']),
|
||||
'--class',
|
||||
self.projects[0].name,
|
||||
]
|
||||
verifylist = [
|
||||
('injected_files', compute_fakes.injected_file_num),
|
||||
('injected_file_content_bytes',
|
||||
compute_fakes.injected_file_size_num),
|
||||
(
|
||||
'injected_file_content_bytes',
|
||||
compute_fakes.injected_file_size_num,
|
||||
),
|
||||
('injected_file_path_bytes', compute_fakes.injected_path_size_num),
|
||||
('key_pairs', compute_fakes.key_pair_num),
|
||||
('cores', compute_fakes.core_num),
|
||||
@ -904,8 +960,7 @@ class TestQuotaSet(TestQuota):
|
||||
|
||||
kwargs_compute = {
|
||||
'injected_files': compute_fakes.injected_file_num,
|
||||
'injected_file_content_bytes':
|
||||
compute_fakes.injected_file_size_num,
|
||||
'injected_file_content_bytes': compute_fakes.injected_file_size_num, # noqa: E501
|
||||
'injected_file_path_bytes': compute_fakes.injected_path_size_num,
|
||||
'key_pairs': compute_fakes.key_pair_num,
|
||||
'cores': compute_fakes.core_num,
|
||||
@ -922,23 +977,26 @@ class TestQuotaSet(TestQuota):
|
||||
}
|
||||
|
||||
self.compute_quotas_class_mock.update.assert_called_with(
|
||||
self.projects[0].name,
|
||||
**kwargs_compute
|
||||
self.projects[0].name, **kwargs_compute
|
||||
)
|
||||
self.volume_quotas_class_mock.update.assert_called_with(
|
||||
self.projects[0].name,
|
||||
**kwargs_volume
|
||||
self.projects[0].name, **kwargs_volume
|
||||
)
|
||||
self.assertNotCalled(self.network_mock.update_quota)
|
||||
self.assertIsNone(result)
|
||||
|
||||
def test_quota_set_with_force(self):
|
||||
arglist = [
|
||||
'--cores', str(compute_fakes.core_num),
|
||||
'--ram', str(compute_fakes.ram_num),
|
||||
'--instances', str(compute_fakes.instance_num),
|
||||
'--volumes', str(volume_fakes.QUOTA['volumes']),
|
||||
'--subnets', str(network_fakes.QUOTA['subnet']),
|
||||
'--cores',
|
||||
str(compute_fakes.core_num),
|
||||
'--ram',
|
||||
str(compute_fakes.ram_num),
|
||||
'--instances',
|
||||
str(compute_fakes.instance_num),
|
||||
'--volumes',
|
||||
str(volume_fakes.QUOTA['volumes']),
|
||||
'--subnets',
|
||||
str(network_fakes.QUOTA['subnet']),
|
||||
'--force',
|
||||
self.projects[0].name,
|
||||
]
|
||||
@ -970,24 +1028,24 @@ class TestQuotaSet(TestQuota):
|
||||
'force': True,
|
||||
}
|
||||
self.compute_quotas_mock.update.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs_compute
|
||||
self.projects[0].id, **kwargs_compute
|
||||
)
|
||||
self.volume_quotas_mock.update.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs_volume
|
||||
self.projects[0].id, **kwargs_volume
|
||||
)
|
||||
self.network_mock.update_quota.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs_network
|
||||
self.projects[0].id, **kwargs_network
|
||||
)
|
||||
self.assertIsNone(result)
|
||||
|
||||
def test_quota_set_with_no_force(self):
|
||||
arglist = [
|
||||
'--subnets', str(network_fakes.QUOTA['subnet']),
|
||||
'--volumes', str(volume_fakes.QUOTA['volumes']),
|
||||
'--cores', str(compute_fakes.core_num),
|
||||
'--subnets',
|
||||
str(network_fakes.QUOTA['subnet']),
|
||||
'--volumes',
|
||||
str(volume_fakes.QUOTA['volumes']),
|
||||
'--cores',
|
||||
str(compute_fakes.core_num),
|
||||
'--no-force',
|
||||
self.projects[0].name,
|
||||
]
|
||||
@ -1014,31 +1072,29 @@ class TestQuotaSet(TestQuota):
|
||||
'check_limit': True,
|
||||
}
|
||||
self.compute_quotas_mock.update.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs_compute
|
||||
self.projects[0].id, **kwargs_compute
|
||||
)
|
||||
self.volume_quotas_mock.update.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs_volume
|
||||
self.projects[0].id, **kwargs_volume
|
||||
)
|
||||
self.network_mock.update_quota.assert_called_once_with(
|
||||
self.projects[0].id,
|
||||
**kwargs_network
|
||||
self.projects[0].id, **kwargs_network
|
||||
)
|
||||
self.assertIsNone(result)
|
||||
|
||||
|
||||
class TestQuotaShow(TestQuota):
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
||||
self.compute_quota = compute_fakes.FakeQuota.create_one_comp_quota()
|
||||
self.compute_quotas_mock.get.return_value = self.compute_quota
|
||||
self.compute_default_quota = \
|
||||
self.compute_default_quota = (
|
||||
compute_fakes.FakeQuota.create_one_default_comp_quota()
|
||||
self.compute_quotas_mock.defaults.return_value = \
|
||||
)
|
||||
self.compute_quotas_mock.defaults.return_value = (
|
||||
self.compute_default_quota
|
||||
)
|
||||
self.compute_quotas_class_mock.get.return_value = FakeQuotaResource(
|
||||
None,
|
||||
copy.deepcopy(compute_fakes.QUOTA),
|
||||
@ -1048,8 +1104,9 @@ class TestQuotaShow(TestQuota):
|
||||
self.volume_quota = volume_fakes.create_one_vol_quota()
|
||||
self.volume_quotas_mock.get.return_value = self.volume_quota
|
||||
self.volume_default_quota = volume_fakes.create_one_default_vol_quota()
|
||||
self.volume_quotas_mock.defaults.return_value = \
|
||||
self.volume_quotas_mock.defaults.return_value = (
|
||||
self.volume_default_quota
|
||||
)
|
||||
self.volume_quotas_class_mock.get.return_value = FakeQuotaResource(
|
||||
None,
|
||||
copy.deepcopy(volume_fakes.QUOTA),
|
||||
@ -1212,13 +1269,15 @@ class TestQuotaShow(TestQuota):
|
||||
|
||||
def test_quota_show__with_usage(self):
|
||||
# update mocks to return detailed quota instead
|
||||
self.compute_quota = \
|
||||
self.compute_quota = (
|
||||
compute_fakes.FakeQuota.create_one_comp_detailed_quota()
|
||||
)
|
||||
self.compute_quotas_mock.get.return_value = self.compute_quota
|
||||
self.volume_quota = volume_fakes.create_one_detailed_quota()
|
||||
self.volume_quotas_mock.get.return_value = self.volume_quota
|
||||
self.network.get_quota.return_value = \
|
||||
self.network.get_quota.return_value = (
|
||||
network_fakes.FakeQuota.create_one_net_detailed_quota()
|
||||
)
|
||||
|
||||
arglist = [
|
||||
'--usage',
|
||||
|
Loading…
Reference in New Issue
Block a user