Blacken openstackclient.compute

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: I9af45c062d179ab3dc2a5e969e1c467932753a2b
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane
2023-05-08 10:48:54 +01:00
parent 5cb16aebcc
commit 28ffa2bf9f
43 changed files with 4898 additions and 4150 deletions

View File

@@ -51,11 +51,13 @@ def make_client(instance):
else: else:
version = instance._api_version[API_NAME] version = instance._api_version[API_NAME]
from novaclient import api_versions from novaclient import api_versions
# convert to APIVersion object # convert to APIVersion object
version = api_versions.get_api_version(version) version = api_versions.get_api_version(version)
if version.is_latest(): if version.is_latest():
import novaclient import novaclient
# NOTE(RuiChen): executing version discovery make sense, but that need # NOTE(RuiChen): executing version discovery make sense, but that need
# an initialized REST client, it's not available now, # an initialized REST client, it's not available now,
# fallback to use the max version of novaclient side. # fallback to use the max version of novaclient side.
@@ -73,8 +75,11 @@ def make_client(instance):
# Set client http_log_debug to True if verbosity level is high enough # Set client http_log_debug to True if verbosity level is high enough
http_log_debug = utils.get_effective_log_level() <= logging.DEBUG http_log_debug = utils.get_effective_log_level() <= logging.DEBUG
extensions = [ext for ext in nova_client.discover_extensions(version) extensions = [
if ext.name == "list_extensions"] ext
for ext in nova_client.discover_extensions(version)
if ext.name == "list_extensions"
]
# Remember interface only if it is set # Remember interface only if it is set
kwargs = utils.build_kwargs_dict('endpoint_type', instance.interface) kwargs = utils.build_kwargs_dict('endpoint_type', instance.interface)
@@ -96,7 +101,7 @@ def make_client(instance):
COMPUTE_API_TYPE, COMPUTE_API_TYPE,
region_name=instance.region_name, region_name=instance.region_name,
interface=instance.interface, interface=instance.interface,
) ),
) )
return client return client
@@ -108,8 +113,10 @@ def build_option_parser(parser):
'--os-compute-api-version', '--os-compute-api-version',
metavar='<compute-api-version>', metavar='<compute-api-version>',
default=utils.env('OS_COMPUTE_API_VERSION'), default=utils.env('OS_COMPUTE_API_VERSION'),
help=_("Compute API version, default=%s " help=_(
"(Env: OS_COMPUTE_API_VERSION)") % DEFAULT_API_VERSION "Compute API version, default=%s " "(Env: OS_COMPUTE_API_VERSION)"
)
% DEFAULT_API_VERSION,
) )
return parser return parser

View File

@@ -37,36 +37,20 @@ class CreateAgent(command.ShowOne):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(CreateAgent, self).get_parser(prog_name) parser = super(CreateAgent, self).get_parser(prog_name)
parser.add_argument( parser.add_argument("os", metavar="<os>", help=_("Type of OS"))
"os",
metavar="<os>",
help=_("Type of OS")
)
parser.add_argument( parser.add_argument(
"architecture", "architecture",
metavar="<architecture>", metavar="<architecture>",
help=_("Type of architecture") help=_("Type of architecture"),
)
parser.add_argument(
"version",
metavar="<version>",
help=_("Version")
)
parser.add_argument(
"url",
metavar="<url>",
help=_("URL")
)
parser.add_argument(
"md5hash",
metavar="<md5hash>",
help=_("MD5 hash")
) )
parser.add_argument("version", metavar="<version>", help=_("Version"))
parser.add_argument("url", metavar="<url>", help=_("URL"))
parser.add_argument("md5hash", metavar="<md5hash>", help=_("MD5 hash"))
parser.add_argument( parser.add_argument(
"hypervisor", "hypervisor",
metavar="<hypervisor>", metavar="<hypervisor>",
default="xen", default="xen",
help=_("Type of hypervisor") help=_("Type of hypervisor"),
) )
return parser return parser
@@ -78,7 +62,7 @@ class CreateAgent(command.ShowOne):
parsed_args.version, parsed_args.version,
parsed_args.url, parsed_args.url,
parsed_args.md5hash, parsed_args.md5hash,
parsed_args.hypervisor parsed_args.hypervisor,
) )
agent = compute_client.agents.create(*args)._info.copy() agent = compute_client.agents.create(*args)._info.copy()
return zip(*sorted(agent.items())) return zip(*sorted(agent.items()))
@@ -95,10 +79,7 @@ class DeleteAgent(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(DeleteAgent, self).get_parser(prog_name) parser = super(DeleteAgent, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
"id", "id", metavar="<id>", nargs='+', help=_("ID of agent(s) to delete")
metavar="<id>",
nargs='+',
help=_("ID of agent(s) to delete")
) )
return parser return parser
@@ -110,13 +91,17 @@ class DeleteAgent(command.Command):
compute_client.agents.delete(id) compute_client.agents.delete(id)
except Exception as e: except Exception as e:
result += 1 result += 1
LOG.error(_("Failed to delete agent with ID '%(id)s': %(e)s"), LOG.error(
{'id': id, 'e': e}) _("Failed to delete agent with ID '%(id)s': %(e)s"),
{'id': id, 'e': e},
)
if result > 0: if result > 0:
total = len(parsed_args.id) total = len(parsed_args.id)
msg = (_("%(result)s of %(total)s agents failed " msg = _("%(result)s of %(total)s agents failed " "to delete.") % {
"to delete.") % {'result': result, 'total': total}) 'result': result,
'total': total,
}
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
@@ -133,7 +118,7 @@ class ListAgent(command.Lister):
parser.add_argument( parser.add_argument(
"--hypervisor", "--hypervisor",
metavar="<hypervisor>", metavar="<hypervisor>",
help=_("Type of hypervisor") help=_("Type of hypervisor"),
) )
return parser return parser
@@ -146,13 +131,19 @@ class ListAgent(command.Lister):
"Architecture", "Architecture",
"Version", "Version",
"Md5Hash", "Md5Hash",
"URL" "URL",
) )
data = compute_client.agents.list(parsed_args.hypervisor) data = compute_client.agents.list(parsed_args.hypervisor)
return (columns, return (
(utils.get_item_properties( columns,
s, columns, (
) for s in data)) utils.get_item_properties(
s,
columns,
)
for s in data
),
)
class SetAgent(command.Command): class SetAgent(command.Command):
@@ -165,26 +156,18 @@ class SetAgent(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(SetAgent, self).get_parser(prog_name) parser = super(SetAgent, self).get_parser(prog_name)
parser.add_argument( parser.add_argument("id", metavar="<id>", help=_("ID of the agent"))
"id",
metavar="<id>",
help=_("ID of the agent")
)
parser.add_argument( parser.add_argument(
"--agent-version", "--agent-version",
dest="version", dest="version",
metavar="<version>", metavar="<version>",
help=_("Version of the agent") help=_("Version of the agent"),
) )
parser.add_argument( parser.add_argument(
"--url", "--url", metavar="<url>", help=_("URL of the agent")
metavar="<url>",
help=_("URL of the agent")
) )
parser.add_argument( parser.add_argument(
"--md5hash", "--md5hash", metavar="<md5hash>", help=_("MD5 hash of the agent")
metavar="<md5hash>",
help=_("MD5 hash of the agent")
) )
return parser return parser

View File

@@ -47,7 +47,8 @@ def _get_aggregate_columns(item):
} }
hidden_columns = ['links', 'location'] hidden_columns = ['links', 'location']
return utils.get_osc_show_columns_for_sdk_resource( return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns) item, column_map, hidden_columns
)
class AddAggregateHost(command.ShowOne): class AddAggregateHost(command.ShowOne):
@@ -58,12 +59,10 @@ class AddAggregateHost(command.ShowOne):
parser.add_argument( parser.add_argument(
'aggregate', 'aggregate',
metavar='<aggregate>', metavar='<aggregate>',
help=_("Aggregate (name or ID)") help=_("Aggregate (name or ID)"),
) )
parser.add_argument( parser.add_argument(
'host', 'host', metavar='<host>', help=_("Host to add to <aggregate>")
metavar='<host>',
help=_("Host to add to <aggregate>")
) )
return parser return parser
@@ -71,14 +70,17 @@ class AddAggregateHost(command.ShowOne):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
aggregate = compute_client.find_aggregate( aggregate = compute_client.find_aggregate(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
aggregate = compute_client.add_host_to_aggregate( aggregate = compute_client.add_host_to_aggregate(
aggregate.id, parsed_args.host) aggregate.id, parsed_args.host
)
display_columns, columns = _get_aggregate_columns(aggregate) display_columns, columns = _get_aggregate_columns(aggregate)
data = utils.get_item_properties( data = utils.get_item_properties(
aggregate, columns, formatters=_aggregate_formatters) aggregate, columns, formatters=_aggregate_formatters
)
return (display_columns, data) return (display_columns, data)
@@ -88,22 +90,22 @@ class CreateAggregate(command.ShowOne):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(CreateAggregate, self).get_parser(prog_name) parser = super(CreateAggregate, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
"name", "name", metavar="<name>", help=_("New aggregate name")
metavar="<name>",
help=_("New aggregate name")
) )
parser.add_argument( parser.add_argument(
"--zone", "--zone",
metavar="<availability-zone>", metavar="<availability-zone>",
help=_("Availability zone name") help=_("Availability zone name"),
) )
parser.add_argument( parser.add_argument(
"--property", "--property",
metavar="<key=value>", metavar="<key=value>",
action=parseractions.KeyValueAction, action=parseractions.KeyValueAction,
dest="properties", dest="properties",
help=_("Property to add to this aggregate " help=_(
"(repeat option to set multiple properties)") "Property to add to this aggregate "
"(repeat option to set multiple properties)"
),
) )
return parser return parser
@@ -125,7 +127,8 @@ class CreateAggregate(command.ShowOne):
display_columns, columns = _get_aggregate_columns(aggregate) display_columns, columns = _get_aggregate_columns(aggregate)
data = utils.get_item_properties( data = utils.get_item_properties(
aggregate, columns, formatters=_aggregate_formatters) aggregate, columns, formatters=_aggregate_formatters
)
return (display_columns, data) return (display_columns, data)
@@ -138,7 +141,7 @@ class DeleteAggregate(command.Command):
'aggregate', 'aggregate',
metavar='<aggregate>', metavar='<aggregate>',
nargs='+', nargs='+',
help=_("Aggregate(s) to delete (name or ID)") help=_("Aggregate(s) to delete (name or ID)"),
) )
return parser return parser
@@ -148,19 +151,26 @@ class DeleteAggregate(command.Command):
for a in parsed_args.aggregate: for a in parsed_args.aggregate:
try: try:
aggregate = compute_client.find_aggregate( aggregate = compute_client.find_aggregate(
a, ignore_missing=False) a, ignore_missing=False
)
compute_client.delete_aggregate( compute_client.delete_aggregate(
aggregate.id, ignore_missing=False) aggregate.id, ignore_missing=False
)
except Exception as e: except Exception as e:
result += 1 result += 1
LOG.error(_("Failed to delete aggregate with name or " LOG.error(
"ID '%(aggregate)s': %(e)s"), _(
{'aggregate': a, 'e': e}) "Failed to delete aggregate with name or "
"ID '%(aggregate)s': %(e)s"
),
{'aggregate': a, 'e': e},
)
if result > 0: if result > 0:
total = len(parsed_args.aggregate) total = len(parsed_args.aggregate)
msg = (_("%(result)s of %(total)s aggregates failed " msg = _(
"to delete.") % {'result': result, 'total': total}) "%(result)s of %(total)s aggregates failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
@@ -173,7 +183,7 @@ class ListAggregate(command.Lister):
'--long', '--long',
action='store_true', action='store_true',
default=False, default=False,
help=_("List additional fields in output") help=_("List additional fields in output"),
) )
return parser return parser
@@ -212,7 +222,9 @@ class ListAggregate(command.Lister):
data = ( data = (
utils.get_item_properties( utils.get_item_properties(
s, columns, formatters=_aggregate_formatters s, columns, formatters=_aggregate_formatters
) for s in aggregates) )
for s in aggregates
)
return (column_headers, data) return (column_headers, data)
@@ -224,12 +236,10 @@ class RemoveAggregateHost(command.ShowOne):
parser.add_argument( parser.add_argument(
'aggregate', 'aggregate',
metavar='<aggregate>', metavar='<aggregate>',
help=_("Aggregate (name or ID)") help=_("Aggregate (name or ID)"),
) )
parser.add_argument( parser.add_argument(
'host', 'host', metavar='<host>', help=_("Host to remove from <aggregate>")
metavar='<host>',
help=_("Host to remove from <aggregate>")
) )
return parser return parser
@@ -237,14 +247,17 @@ class RemoveAggregateHost(command.ShowOne):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
aggregate = compute_client.find_aggregate( aggregate = compute_client.find_aggregate(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
aggregate = compute_client.remove_host_from_aggregate( aggregate = compute_client.remove_host_from_aggregate(
aggregate.id, parsed_args.host) aggregate.id, parsed_args.host
)
display_columns, columns = _get_aggregate_columns(aggregate) display_columns, columns = _get_aggregate_columns(aggregate)
data = utils.get_item_properties( data = utils.get_item_properties(
aggregate, columns, formatters=_aggregate_formatters) aggregate, columns, formatters=_aggregate_formatters
)
return (display_columns, data) return (display_columns, data)
@@ -256,40 +269,42 @@ class SetAggregate(command.Command):
parser.add_argument( parser.add_argument(
'aggregate', 'aggregate',
metavar='<aggregate>', metavar='<aggregate>',
help=_("Aggregate to modify (name or ID)") help=_("Aggregate to modify (name or ID)"),
) )
parser.add_argument( parser.add_argument(
'--name', '--name', metavar='<name>', help=_("Set aggregate name")
metavar='<name>',
help=_("Set aggregate name")
) )
parser.add_argument( parser.add_argument(
"--zone", "--zone",
metavar="<availability-zone>", metavar="<availability-zone>",
help=_("Set availability zone name") help=_("Set availability zone name"),
) )
parser.add_argument( parser.add_argument(
"--property", "--property",
metavar="<key=value>", metavar="<key=value>",
action=parseractions.KeyValueAction, action=parseractions.KeyValueAction,
dest="properties", dest="properties",
help=_("Property to set on <aggregate> " help=_(
"(repeat option to set multiple properties)") "Property to set on <aggregate> "
"(repeat option to set multiple properties)"
),
) )
parser.add_argument( parser.add_argument(
"--no-property", "--no-property",
action="store_true", action="store_true",
help=_("Remove all properties from <aggregate> " help=_(
"(specify both --property and --no-property to " "Remove all properties from <aggregate> "
"overwrite the current properties)"), "(specify both --property and --no-property to "
"overwrite the current properties)"
),
) )
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
aggregate = compute_client.find_aggregate( aggregate = compute_client.find_aggregate(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
kwargs = {} kwargs = {}
if parsed_args.name: if parsed_args.name:
@@ -303,10 +318,13 @@ class SetAggregate(command.Command):
if parsed_args.no_property: if parsed_args.no_property:
# NOTE(RuiChen): "availability_zone" can not be unset from # NOTE(RuiChen): "availability_zone" can not be unset from
# properties. It is already excluded from show and create output. # properties. It is already excluded from show and create output.
properties.update({ properties.update(
key: None for key in aggregate.metadata.keys() {
if key != 'availability_zone' key: None
}) for key in aggregate.metadata.keys()
if key != 'availability_zone'
}
)
if parsed_args.properties: if parsed_args.properties:
properties.update(parsed_args.properties) properties.update(parsed_args.properties)
@@ -323,15 +341,15 @@ class ShowAggregate(command.ShowOne):
parser.add_argument( parser.add_argument(
'aggregate', 'aggregate',
metavar='<aggregate>', metavar='<aggregate>',
help=_("Aggregate to display (name or ID)") help=_("Aggregate to display (name or ID)"),
) )
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
aggregate = compute_client.find_aggregate( aggregate = compute_client.find_aggregate(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
# Remove availability_zone from metadata because Nova doesn't # Remove availability_zone from metadata because Nova doesn't
if 'availability_zone' in aggregate.metadata: if 'availability_zone' in aggregate.metadata:
@@ -339,7 +357,8 @@ class ShowAggregate(command.ShowOne):
display_columns, columns = _get_aggregate_columns(aggregate) display_columns, columns = _get_aggregate_columns(aggregate)
data = utils.get_item_properties( data = utils.get_item_properties(
aggregate, columns, formatters=_aggregate_formatters) aggregate, columns, formatters=_aggregate_formatters
)
return (display_columns, data) return (display_columns, data)
@@ -351,7 +370,7 @@ class UnsetAggregate(command.Command):
parser.add_argument( parser.add_argument(
"aggregate", "aggregate",
metavar="<aggregate>", metavar="<aggregate>",
help=_("Aggregate to modify (name or ID)") help=_("Aggregate to modify (name or ID)"),
) )
parser.add_argument( parser.add_argument(
"--property", "--property",
@@ -359,15 +378,18 @@ class UnsetAggregate(command.Command):
action="append", action="append",
default=[], default=[],
dest="properties", dest="properties",
help=_("Property to remove from aggregate " help=_(
"(repeat option to remove multiple properties)") "Property to remove from aggregate "
"(repeat option to remove multiple properties)"
),
) )
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
aggregate = compute_client.find_aggregate( aggregate = compute_client.find_aggregate(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
properties = {key: None for key in parsed_args.properties} properties = {key: None for key in parsed_args.properties}
@@ -385,14 +407,16 @@ class CacheImageForAggregate(command.Command):
parser.add_argument( parser.add_argument(
'aggregate', 'aggregate',
metavar='<aggregate>', metavar='<aggregate>',
help=_("Aggregate (name or ID)") help=_("Aggregate (name or ID)"),
) )
parser.add_argument( parser.add_argument(
'image', 'image',
metavar='<image>', metavar='<image>',
nargs='+', nargs='+',
help=_("Image ID to request caching for aggregate (name or ID). " help=_(
"May be specified multiple times.") "Image ID to request caching for aggregate (name or ID). "
"May be specified multiple times."
),
) )
return parser return parser
@@ -407,12 +431,14 @@ class CacheImageForAggregate(command.Command):
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
aggregate = compute_client.find_aggregate( aggregate = compute_client.find_aggregate(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
images = [] images = []
for img in parsed_args.image: for img in parsed_args.image:
image = self.app.client_manager.sdk_connection.image.find_image( image = self.app.client_manager.sdk_connection.image.find_image(
img, ignore_missing=False) img, ignore_missing=False
)
images.append(image.id) images.append(image.id)
compute_client.aggregate_precache_images(aggregate.id, images) compute_client.aggregate_precache_images(aggregate.id, images)

View File

@@ -28,7 +28,8 @@ def _get_console_columns(item):
column_map = {} column_map = {}
hidden_columns = ['id', 'links', 'location', 'name'] hidden_columns = ['id', 'links', 'location', 'name']
return utils.get_osc_show_columns_for_sdk_resource( return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns) item, column_map, hidden_columns
)
class ShowConsoleLog(command.Command): class ShowConsoleLog(command.Command):
@@ -39,7 +40,7 @@ class ShowConsoleLog(command.Command):
parser.add_argument( parser.add_argument(
'server', 'server',
metavar='<server>', metavar='<server>',
help=_("Server to show console log (name or ID)") help=_("Server to show console log (name or ID)"),
) )
parser.add_argument( parser.add_argument(
'--lines', '--lines',
@@ -47,8 +48,10 @@ class ShowConsoleLog(command.Command):
type=int, type=int,
default=None, default=None,
action=parseractions.NonNegativeAction, action=parseractions.NonNegativeAction,
help=_("Number of lines to display from the end of the log " help=_(
"(default=all)") "Number of lines to display from the end of the log "
"(default=all)"
),
) )
return parser return parser
@@ -56,12 +59,12 @@ class ShowConsoleLog(command.Command):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
server = compute_client.find_server( server = compute_client.find_server(
name_or_id=parsed_args.server, name_or_id=parsed_args.server, ignore_missing=False
ignore_missing=False
) )
output = compute_client.get_server_console_output( output = compute_client.get_server_console_output(
server.id, length=parsed_args.lines) server.id, length=parsed_args.lines
)
data = None data = None
if output: if output:
data = output.get('output', None) data = output.get('output', None)
@@ -79,7 +82,7 @@ class ShowConsoleURL(command.ShowOne):
parser.add_argument( parser.add_argument(
'server', 'server',
metavar='<server>', metavar='<server>',
help=_("Server to show URL (name or ID)") help=_("Server to show URL (name or ID)"),
) )
type_group = parser.add_mutually_exclusive_group() type_group = parser.add_mutually_exclusive_group()
type_group.add_argument( type_group.add_argument(
@@ -88,21 +91,21 @@ class ShowConsoleURL(command.ShowOne):
action='store_const', action='store_const',
const='novnc', const='novnc',
default='novnc', default='novnc',
help=_("Show noVNC console URL (default)") help=_("Show noVNC console URL (default)"),
) )
type_group.add_argument( type_group.add_argument(
'--xvpvnc', '--xvpvnc',
dest='url_type', dest='url_type',
action='store_const', action='store_const',
const='xvpvnc', const='xvpvnc',
help=_("Show xvpvnc console URL") help=_("Show xvpvnc console URL"),
) )
type_group.add_argument( type_group.add_argument(
'--spice', '--spice',
dest='url_type', dest='url_type',
action='store_const', action='store_const',
const='spice-html5', const='spice-html5',
help=_("Show SPICE console URL") help=_("Show SPICE console URL"),
) )
type_group.add_argument( type_group.add_argument(
'--rdp', '--rdp',
@@ -130,11 +133,12 @@ class ShowConsoleURL(command.ShowOne):
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
server = compute_client.find_server( server = compute_client.find_server(
parsed_args.server, parsed_args.server, ignore_missing=False
ignore_missing=False) )
data = compute_client.create_console(server.id, data = compute_client.create_console(
console_type=parsed_args.url_type) server.id, console_type=parsed_args.url_type
)
display_columns, columns = _get_console_columns(data) display_columns, columns = _get_console_columns(data)
data = utils.get_dict_properties(data, columns) data = utils.get_dict_properties(data, columns)

View File

@@ -34,7 +34,7 @@ LOG = logging.getLogger(__name__)
_formatters = { _formatters = {
'extra_specs': format_columns.DictColumn, 'extra_specs': format_columns.DictColumn,
'properties': format_columns.DictColumn 'properties': format_columns.DictColumn,
} }
@@ -45,12 +45,12 @@ def _get_flavor_columns(item):
'extra_specs': 'properties', 'extra_specs': 'properties',
'ephemeral': 'OS-FLV-EXT-DATA:ephemeral', 'ephemeral': 'OS-FLV-EXT-DATA:ephemeral',
'is_disabled': 'OS-FLV-DISABLED:disabled', 'is_disabled': 'OS-FLV-DISABLED:disabled',
'is_public': 'os-flavor-access:is_public' 'is_public': 'os-flavor-access:is_public',
} }
hidden_columns = ['links', 'location', 'original_name'] hidden_columns = ['links', 'location', 'original_name']
return utils.get_osc_show_columns_for_sdk_resource( return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns) item, column_map, hidden_columns
)
class CreateFlavor(command.ShowOne): class CreateFlavor(command.ShowOne):
@@ -59,56 +59,50 @@ class CreateFlavor(command.ShowOne):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(CreateFlavor, self).get_parser(prog_name) parser = super(CreateFlavor, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
"name", "name", metavar="<flavor-name>", help=_("New flavor name")
metavar="<flavor-name>",
help=_("New flavor name")
)
parser.add_argument(
"--id",
metavar="<id>",
help=_("Unique flavor ID")
) )
parser.add_argument("--id", metavar="<id>", help=_("Unique flavor ID"))
parser.add_argument( parser.add_argument(
"--ram", "--ram",
type=int, type=int,
metavar="<size-mb>", metavar="<size-mb>",
default=256, default=256,
help=_("Memory size in MB (default 256M)") help=_("Memory size in MB (default 256M)"),
) )
parser.add_argument( parser.add_argument(
"--disk", "--disk",
type=int, type=int,
metavar="<size-gb>", metavar="<size-gb>",
default=0, default=0,
help=_("Disk size in GB (default 0G)") help=_("Disk size in GB (default 0G)"),
) )
parser.add_argument( parser.add_argument(
"--ephemeral", "--ephemeral",
type=int, type=int,
metavar="<size-gb>", metavar="<size-gb>",
default=0, default=0,
help=_("Ephemeral disk size in GB (default 0G)") help=_("Ephemeral disk size in GB (default 0G)"),
) )
parser.add_argument( parser.add_argument(
"--swap", "--swap",
type=int, type=int,
metavar="<size-mb>", metavar="<size-mb>",
default=0, default=0,
help=_("Additional swap space size in MB (default 0M)") help=_("Additional swap space size in MB (default 0M)"),
) )
parser.add_argument( parser.add_argument(
"--vcpus", "--vcpus",
type=int, type=int,
metavar="<vcpus>", metavar="<vcpus>",
default=1, default=1,
help=_("Number of vcpus (default 1)") help=_("Number of vcpus (default 1)"),
) )
parser.add_argument( parser.add_argument(
"--rxtx-factor", "--rxtx-factor",
type=float, type=float,
metavar="<factor>", metavar="<factor>",
default=1.0, default=1.0,
help=_("RX/TX factor (default 1.0)") help=_("RX/TX factor (default 1.0)"),
) )
public_group = parser.add_mutually_exclusive_group() public_group = parser.add_mutually_exclusive_group()
public_group.add_argument( public_group.add_argument(
@@ -116,33 +110,39 @@ class CreateFlavor(command.ShowOne):
dest="public", dest="public",
action="store_true", action="store_true",
default=True, default=True,
help=_("Flavor is available to other projects (default)") help=_("Flavor is available to other projects (default)"),
) )
public_group.add_argument( public_group.add_argument(
"--private", "--private",
dest="public", dest="public",
action="store_false", action="store_false",
help=_("Flavor is not available to other projects") help=_("Flavor is not available to other projects"),
) )
parser.add_argument( parser.add_argument(
"--property", "--property",
metavar="<key=value>", metavar="<key=value>",
action=parseractions.KeyValueAction, action=parseractions.KeyValueAction,
dest="properties", dest="properties",
help=_("Property to add for this flavor " help=_(
"(repeat option to set multiple properties)") "Property to add for this flavor "
"(repeat option to set multiple properties)"
),
) )
parser.add_argument( parser.add_argument(
'--project', '--project',
metavar='<project>', metavar='<project>',
help=_("Allow <project> to access private flavor (name or ID) " help=_(
"(Must be used with --private option)"), "Allow <project> to access private flavor (name or ID) "
"(Must be used with --private option)"
),
) )
parser.add_argument( parser.add_argument(
'--description', '--description',
metavar='<description>', metavar='<description>',
help=_("Description for the flavor.(Supported by API versions " help=_(
"'2.55' - '2.latest'") "Description for the flavor.(Supported by API versions "
"'2.55' - '2.latest'"
),
) )
identity_common.add_project_domain_option_to_parser(parser) identity_common.add_project_domain_option_to_parser(parser)
return parser return parser
@@ -186,22 +186,25 @@ class CreateFlavor(command.ShowOne):
parsed_args.project, parsed_args.project,
parsed_args.project_domain, parsed_args.project_domain,
).id ).id
compute_client.flavor_add_tenant_access( compute_client.flavor_add_tenant_access(flavor.id, project_id)
flavor.id, project_id)
except Exception as e: except Exception as e:
msg = _("Failed to add project %(project)s access to " msg = _(
"flavor: %(e)s") "Failed to add project %(project)s access to "
"flavor: %(e)s"
)
LOG.error(msg, {'project': parsed_args.project, 'e': e}) LOG.error(msg, {'project': parsed_args.project, 'e': e})
if parsed_args.properties: if parsed_args.properties:
try: try:
flavor = compute_client.create_flavor_extra_specs( flavor = compute_client.create_flavor_extra_specs(
flavor, parsed_args.properties) flavor, parsed_args.properties
)
except Exception as e: except Exception as e:
LOG.error(_("Failed to set flavor properties: %s"), e) LOG.error(_("Failed to set flavor properties: %s"), e)
display_columns, columns = _get_flavor_columns(flavor) display_columns, columns = _get_flavor_columns(flavor)
data = utils.get_dict_properties(flavor, columns, data = utils.get_dict_properties(
formatters=_formatters) flavor, columns, formatters=_formatters
)
return (display_columns, data) return (display_columns, data)
@@ -215,7 +218,7 @@ class DeleteFlavor(command.Command):
"flavor", "flavor",
metavar="<flavor>", metavar="<flavor>",
nargs='+', nargs='+',
help=_("Flavor(s) to delete (name or ID)") help=_("Flavor(s) to delete (name or ID)"),
) )
return parser return parser
@@ -228,13 +231,20 @@ class DeleteFlavor(command.Command):
compute_client.delete_flavor(flavor.id) compute_client.delete_flavor(flavor.id)
except Exception as e: except Exception as e:
result += 1 result += 1
LOG.error(_("Failed to delete flavor with name or " LOG.error(
"ID '%(flavor)s': %(e)s"), {'flavor': f, 'e': e}) _(
"Failed to delete flavor with name or "
"ID '%(flavor)s': %(e)s"
),
{'flavor': f, 'e': e},
)
if result > 0: if result > 0:
total = len(parsed_args.flavor) total = len(parsed_args.flavor)
msg = (_("%(result)s of %(total)s flavors failed " msg = _("%(result)s of %(total)s flavors failed " "to delete.") % {
"to delete.") % {'result': result, 'total': total}) 'result': result,
'total': total,
}
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
@@ -249,20 +259,20 @@ class ListFlavor(command.Lister):
dest="public", dest="public",
action="store_true", action="store_true",
default=True, default=True,
help=_("List only public flavors (default)") help=_("List only public flavors (default)"),
) )
public_group.add_argument( public_group.add_argument(
"--private", "--private",
dest="public", dest="public",
action="store_false", action="store_false",
help=_("List only private flavors") help=_("List only private flavors"),
) )
public_group.add_argument( public_group.add_argument(
"--all", "--all",
dest="all", dest="all",
action="store_true", action="store_true",
default=False, default=False,
help=_("List all flavors, whether public or private") help=_("List all flavors, whether public or private"),
) )
parser.add_argument( parser.add_argument(
'--min-disk', '--min-disk',
@@ -280,12 +290,12 @@ class ListFlavor(command.Lister):
'--long', '--long',
action='store_true', action='store_true',
default=False, default=False,
help=_("List additional fields in output") help=_("List additional fields in output"),
) )
parser.add_argument( parser.add_argument(
'--marker', '--marker',
metavar="<flavor-id>", metavar="<flavor-id>",
help=_("The last flavor ID of the previous page") help=_("The last flavor ID of the previous page"),
) )
parser.add_argument( parser.add_argument(
'--limit', '--limit',
@@ -308,9 +318,7 @@ class ListFlavor(command.Lister):
# and flavors from their own projects only. # and flavors from their own projects only.
is_public = None if parsed_args.all else parsed_args.public is_public = None if parsed_args.all else parsed_args.public
query_attrs = { query_attrs = {'is_public': is_public}
'is_public': is_public
}
if parsed_args.marker: if parsed_args.marker:
query_attrs['marker'] = parsed_args.marker query_attrs['marker'] = parsed_args.marker
@@ -343,7 +351,7 @@ class ListFlavor(command.Lister):
"disk", "disk",
"ephemeral", "ephemeral",
"vcpus", "vcpus",
"is_public" "is_public",
) )
if parsed_args.long: if parsed_args.long:
columns += ( columns += (
@@ -359,7 +367,7 @@ class ListFlavor(command.Lister):
"Disk", "Disk",
"Ephemeral", "Ephemeral",
"VCPUs", "VCPUs",
"Is Public" "Is Public",
) )
if parsed_args.long: if parsed_args.long:
column_headers += ( column_headers += (
@@ -385,36 +393,43 @@ class SetFlavor(command.Command):
parser.add_argument( parser.add_argument(
"flavor", "flavor",
metavar="<flavor>", metavar="<flavor>",
help=_("Flavor to modify (name or ID)") help=_("Flavor to modify (name or ID)"),
) )
parser.add_argument( parser.add_argument(
"--no-property", "--no-property",
action="store_true", action="store_true",
help=_("Remove all properties from this flavor " help=_(
"(specify both --no-property and --property" "Remove all properties from this flavor "
" to remove the current properties before setting" "(specify both --no-property and --property"
" new properties.)"), " to remove the current properties before setting"
" new properties.)"
),
) )
parser.add_argument( parser.add_argument(
"--property", "--property",
metavar="<key=value>", metavar="<key=value>",
action=parseractions.KeyValueAction, action=parseractions.KeyValueAction,
dest="properties", dest="properties",
help=_("Property to add or modify for this flavor " help=_(
"(repeat option to set multiple properties)") "Property to add or modify for this flavor "
"(repeat option to set multiple properties)"
),
) )
parser.add_argument( parser.add_argument(
'--project', '--project',
metavar='<project>', metavar='<project>',
help=_('Set flavor access to project (name or ID) ' help=_(
'(admin only)'), 'Set flavor access to project (name or ID) ' '(admin only)'
),
) )
identity_common.add_project_domain_option_to_parser(parser) identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument( parser.add_argument(
'--description', '--description',
metavar='<description>', metavar='<description>',
help=_("Set description for the flavor.(Supported by API " help=_(
"versions '2.55' - '2.latest'") "Set description for the flavor.(Supported by API "
"versions '2.55' - '2.latest'"
),
) )
return parser return parser
@@ -425,9 +440,8 @@ class SetFlavor(command.Command):
try: try:
flavor = compute_client.find_flavor( flavor = compute_client.find_flavor(
parsed_args.flavor, parsed_args.flavor, get_extra_specs=True, ignore_missing=False
get_extra_specs=True, )
ignore_missing=False)
except sdk_exceptions.ResourceNotFound as e: except sdk_exceptions.ResourceNotFound as e:
raise exceptions.CommandError(e.message) raise exceptions.CommandError(e.message)
@@ -440,14 +454,16 @@ class SetFlavor(command.Command):
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
compute_client.update_flavor( compute_client.update_flavor(
flavor=flavor.id, description=parsed_args.description) flavor=flavor.id, description=parsed_args.description
)
result = 0 result = 0
if parsed_args.no_property: if parsed_args.no_property:
try: try:
for key in flavor.extra_specs.keys(): for key in flavor.extra_specs.keys():
compute_client.delete_flavor_extra_specs_property( compute_client.delete_flavor_extra_specs_property(
flavor.id, key) flavor.id, key
)
except Exception as e: except Exception as e:
LOG.error(_("Failed to clear flavor properties: %s"), e) LOG.error(_("Failed to clear flavor properties: %s"), e)
result += 1 result += 1
@@ -455,7 +471,8 @@ class SetFlavor(command.Command):
if parsed_args.properties: if parsed_args.properties:
try: try:
compute_client.create_flavor_extra_specs( compute_client.create_flavor_extra_specs(
flavor.id, parsed_args.properties) flavor.id, parsed_args.properties
)
except Exception as e: except Exception as e:
LOG.error(_("Failed to set flavor properties: %s"), e) LOG.error(_("Failed to set flavor properties: %s"), e)
result += 1 result += 1
@@ -472,14 +489,16 @@ class SetFlavor(command.Command):
parsed_args.project_domain, parsed_args.project_domain,
).id ).id
compute_client.flavor_add_tenant_access( compute_client.flavor_add_tenant_access(
flavor.id, project_id) flavor.id, project_id
)
except Exception as e: except Exception as e:
LOG.error(_("Failed to set flavor access to project: %s"), e) LOG.error(_("Failed to set flavor access to project: %s"), e)
result += 1 result += 1
if result > 0: if result > 0:
raise exceptions.CommandError(_("Command Failed: One or more of" raise exceptions.CommandError(
" the operations failed")) _("Command Failed: One or more of" " the operations failed")
)
class ShowFlavor(command.ShowOne): class ShowFlavor(command.ShowOne):
@@ -490,27 +509,32 @@ class ShowFlavor(command.ShowOne):
parser.add_argument( parser.add_argument(
"flavor", "flavor",
metavar="<flavor>", metavar="<flavor>",
help=_("Flavor to display (name or ID)") help=_("Flavor to display (name or ID)"),
) )
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
flavor = compute_client.find_flavor( flavor = compute_client.find_flavor(
parsed_args.flavor, get_extra_specs=True, ignore_missing=False) parsed_args.flavor, get_extra_specs=True, ignore_missing=False
)
access_projects = None access_projects = None
# get access projects list of this flavor # get access projects list of this flavor
if not flavor.is_public: if not flavor.is_public:
try: try:
flavor_access = compute_client.get_flavor_access( flavor_access = compute_client.get_flavor_access(
flavor=flavor.id) flavor=flavor.id
)
access_projects = [ access_projects = [
utils.get_field(access, 'tenant_id') utils.get_field(access, 'tenant_id')
for access in flavor_access] for access in flavor_access
]
except Exception as e: except Exception as e:
msg = _("Failed to get access projects list " msg = _(
"for flavor '%(flavor)s': %(e)s") "Failed to get access projects list "
"for flavor '%(flavor)s': %(e)s"
)
LOG.error(msg, {'flavor': parsed_args.flavor, 'e': e}) LOG.error(msg, {'flavor': parsed_args.flavor, 'e': e})
# Since we need to inject "access_project_id" into resource - convert # Since we need to inject "access_project_id" into resource - convert
@@ -520,7 +544,8 @@ class ShowFlavor(command.ShowOne):
display_columns, columns = _get_flavor_columns(flavor) display_columns, columns = _get_flavor_columns(flavor)
data = utils.get_dict_properties( data = utils.get_dict_properties(
flavor, columns, formatters=_formatters) flavor, columns, formatters=_formatters
)
return (display_columns, data) return (display_columns, data)
@@ -533,21 +558,25 @@ class UnsetFlavor(command.Command):
parser.add_argument( parser.add_argument(
"flavor", "flavor",
metavar="<flavor>", metavar="<flavor>",
help=_("Flavor to modify (name or ID)") help=_("Flavor to modify (name or ID)"),
) )
parser.add_argument( parser.add_argument(
"--property", "--property",
metavar="<key>", metavar="<key>",
action='append', action='append',
dest="properties", dest="properties",
help=_("Property to remove from flavor " help=_(
"(repeat option to unset multiple properties)") "Property to remove from flavor "
"(repeat option to unset multiple properties)"
),
) )
parser.add_argument( parser.add_argument(
'--project', '--project',
metavar='<project>', metavar='<project>',
help=_('Remove flavor access from project (name or ID) ' help=_(
'(admin only)'), 'Remove flavor access from project (name or ID) '
'(admin only)'
),
) )
identity_common.add_project_domain_option_to_parser(parser) identity_common.add_project_domain_option_to_parser(parser)
@@ -559,9 +588,8 @@ class UnsetFlavor(command.Command):
try: try:
flavor = compute_client.find_flavor( flavor = compute_client.find_flavor(
parsed_args.flavor, parsed_args.flavor, get_extra_specs=True, ignore_missing=False
get_extra_specs=True, )
ignore_missing=False)
except sdk_exceptions.ResourceNotFound as e: except sdk_exceptions.ResourceNotFound as e:
raise exceptions.CommandError(_(e.message)) raise exceptions.CommandError(_(e.message))
@@ -570,7 +598,8 @@ class UnsetFlavor(command.Command):
for key in parsed_args.properties: for key in parsed_args.properties:
try: try:
compute_client.delete_flavor_extra_specs_property( compute_client.delete_flavor_extra_specs_property(
flavor.id, key) flavor.id, key
)
except sdk_exceptions.SDKException as e: except sdk_exceptions.SDKException as e:
LOG.error(_("Failed to unset flavor property: %s"), e) LOG.error(_("Failed to unset flavor property: %s"), e)
result += 1 result += 1
@@ -587,12 +616,15 @@ class UnsetFlavor(command.Command):
parsed_args.project_domain, parsed_args.project_domain,
).id ).id
compute_client.flavor_remove_tenant_access( compute_client.flavor_remove_tenant_access(
flavor.id, project_id) flavor.id, project_id
)
except Exception as e: except Exception as e:
LOG.error(_("Failed to remove flavor access from project: %s"), LOG.error(
e) _("Failed to remove flavor access from project: %s"), e
)
result += 1 result += 1
if result > 0: if result > 0:
raise exceptions.CommandError(_("Command Failed: One or more of" raise exceptions.CommandError(
" the operations failed")) _("Command Failed: One or more of" " the operations failed")
)

View File

@@ -29,17 +29,13 @@ class ListHost(command.Lister):
parser.add_argument( parser.add_argument(
"--zone", "--zone",
metavar="<zone>", metavar="<zone>",
help=_("Only return hosts in the availability zone") help=_("Only return hosts in the availability zone"),
) )
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
columns = ( columns = ("Host Name", "Service", "Zone")
"Host Name",
"Service",
"Zone"
)
self.log.warning( self.log.warning(
"API has been deprecated. " "API has been deprecated. "
@@ -48,9 +44,11 @@ class ListHost(command.Lister):
# doing this since openstacksdk has decided not to support this # doing this since openstacksdk has decided not to support this
# deprecated command # deprecated command
hosts = compute_client.get( hosts = (
'/os-hosts', microversion='2.1' compute_client.get('/os-hosts', microversion='2.1')
).json().get('hosts') .json()
.get('hosts')
)
if parsed_args.zone is not None: if parsed_args.zone is not None:
filtered_hosts = [] filtered_hosts = []
@@ -69,31 +67,25 @@ class SetHost(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(SetHost, self).get_parser(prog_name) parser = super(SetHost, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
"host", "host", metavar="<host>", help=_("Host to modify (name only)")
metavar="<host>",
help=_("Host to modify (name only)")
) )
status = parser.add_mutually_exclusive_group() status = parser.add_mutually_exclusive_group()
status.add_argument( status.add_argument(
'--enable', '--enable', action='store_true', help=_("Enable the host")
action='store_true',
help=_("Enable the host")
) )
status.add_argument( status.add_argument(
'--disable', '--disable', action='store_true', help=_("Disable the host")
action='store_true',
help=_("Disable the host")
) )
maintenance = parser.add_mutually_exclusive_group() maintenance = parser.add_mutually_exclusive_group()
maintenance.add_argument( maintenance.add_argument(
'--enable-maintenance', '--enable-maintenance',
action='store_true', action='store_true',
help=_("Enable maintenance mode for the host") help=_("Enable maintenance mode for the host"),
) )
maintenance.add_argument( maintenance.add_argument(
'--disable-maintenance', '--disable-maintenance',
action='store_true', action='store_true',
help=_("Disable maintenance mode for the host") help=_("Disable maintenance mode for the host"),
) )
return parser return parser
@@ -111,10 +103,7 @@ class SetHost(command.Command):
compute_client = self.app.client_manager.compute compute_client = self.app.client_manager.compute
compute_client.api.host_set( compute_client.api.host_set(parsed_args.host, **kwargs)
parsed_args.host,
**kwargs
)
class ShowHost(command.Lister): class ShowHost(command.Lister):
@@ -122,22 +111,12 @@ class ShowHost(command.Lister):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super().get_parser(prog_name) parser = super().get_parser(prog_name)
parser.add_argument( parser.add_argument("host", metavar="<host>", help=_("Name of host"))
"host",
metavar="<host>",
help=_("Name of host")
)
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
columns = ( columns = ("Host", "Project", "CPU", "Memory MB", "Disk GB")
"Host",
"Project",
"CPU",
"Memory MB",
"Disk GB"
)
self.log.warning( self.log.warning(
"API has been deprecated. " "API has been deprecated. "
@@ -146,10 +125,13 @@ class ShowHost(command.Lister):
# doing this since openstacksdk has decided not to support this # doing this since openstacksdk has decided not to support this
# deprecated command # deprecated command
resources = compute_client.get( resources = (
'/os-hosts/' + parsed_args.host, compute_client.get(
microversion='2.1' '/os-hosts/' + parsed_args.host, microversion='2.1'
).json().get('host') )
.json()
.get('host')
)
data = [] data = []
if resources is not None: if resources is not None:

View File

@@ -33,32 +33,37 @@ def _get_hypervisor_columns(item, client):
hidden_columns = ['location', 'servers'] hidden_columns = ['location', 'servers']
if sdk_utils.supports_microversion(client, '2.88'): if sdk_utils.supports_microversion(client, '2.88'):
hidden_columns.extend([ hidden_columns.extend(
'current_workload', [
'disk_available', 'current_workload',
'local_disk_free', 'disk_available',
'local_disk_size', 'local_disk_free',
'local_disk_used', 'local_disk_size',
'memory_free', 'local_disk_used',
'memory_size', 'memory_free',
'memory_used', 'memory_size',
'running_vms', 'memory_used',
'vcpus_used', 'running_vms',
'vcpus', 'vcpus_used',
]) 'vcpus',
]
)
else: else:
column_map.update({ column_map.update(
'disk_available': 'disk_available_least', {
'local_disk_free': 'free_disk_gb', 'disk_available': 'disk_available_least',
'local_disk_size': 'local_gb', 'local_disk_free': 'free_disk_gb',
'local_disk_used': 'local_gb_used', 'local_disk_size': 'local_gb',
'memory_free': 'free_ram_mb', 'local_disk_used': 'local_gb_used',
'memory_used': 'memory_mb_used', 'memory_free': 'free_ram_mb',
'memory_size': 'memory_mb', 'memory_used': 'memory_mb_used',
}) 'memory_size': 'memory_mb',
}
)
return utils.get_osc_show_columns_for_sdk_resource( return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns) item, column_map, hidden_columns
)
class ListHypervisor(command.Lister): class ListHypervisor(command.Lister):
@@ -73,7 +78,7 @@ class ListHypervisor(command.Lister):
"Filter hypervisors using <hostname> substring" "Filter hypervisors using <hostname> substring"
"Hypervisor Type and Host IP are not returned " "Hypervisor Type and Host IP are not returned "
"when using microversion 2.52 or lower" "when using microversion 2.52 or lower"
) ),
) )
parser.add_argument( parser.add_argument(
'--marker', '--marker',
@@ -99,7 +104,7 @@ class ListHypervisor(command.Lister):
parser.add_argument( parser.add_argument(
'--long', '--long',
action='store_true', action='store_true',
help=_("List additional fields in output") help=_("List additional fields in output"),
) )
return parser return parser
@@ -109,9 +114,7 @@ class ListHypervisor(command.Lister):
list_opts = {} list_opts = {}
if parsed_args.matching and (parsed_args.marker or parsed_args.limit): if parsed_args.matching and (parsed_args.marker or parsed_args.limit):
msg = _( msg = _('--matching is not compatible with --marker or --limit')
'--matching is not compatible with --marker or --limit'
)
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
if parsed_args.marker: if parsed_args.marker:
@@ -140,15 +143,9 @@ class ListHypervisor(command.Lister):
"Hypervisor Hostname", "Hypervisor Hostname",
"Hypervisor Type", "Hypervisor Type",
"Host IP", "Host IP",
"State" "State",
)
columns = (
'id',
'name',
'hypervisor_type',
'host_ip',
'state'
) )
columns = ('id', 'name', 'hypervisor_type', 'host_ip', 'state')
if parsed_args.long: if parsed_args.long:
if not sdk_utils.supports_microversion(compute_client, '2.88'): if not sdk_utils.supports_microversion(compute_client, '2.88'):
@@ -156,13 +153,13 @@ class ListHypervisor(command.Lister):
'vCPUs Used', 'vCPUs Used',
'vCPUs', 'vCPUs',
'Memory MB Used', 'Memory MB Used',
'Memory MB' 'Memory MB',
) )
columns += ( columns += (
'vcpus_used', 'vcpus_used',
'vcpus', 'vcpus',
'memory_used', 'memory_used',
'memory_size' 'memory_size',
) )
data = compute_client.hypervisors(**list_opts, details=True) data = compute_client.hypervisors(**list_opts, details=True)
@@ -181,14 +178,15 @@ class ShowHypervisor(command.ShowOne):
parser.add_argument( parser.add_argument(
"hypervisor", "hypervisor",
metavar="<hypervisor>", metavar="<hypervisor>",
help=_("Hypervisor to display (name or ID)") help=_("Hypervisor to display (name or ID)"),
) )
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
hypervisor = compute_client.find_hypervisor( hypervisor = compute_client.find_hypervisor(
parsed_args.hypervisor, ignore_missing=False).copy() parsed_args.hypervisor, ignore_missing=False
).copy()
# Some of the properties in the hypervisor object need to be processed # Some of the properties in the hypervisor object need to be processed
# before they get reported to the user. We spend this section # before they get reported to the user. We spend this section
@@ -208,14 +206,18 @@ class ShowHypervisor(command.ShowOne):
if cell: if cell:
# The host aggregates are also prefixed by "<cell>@" # The host aggregates are also prefixed by "<cell>@"
member_of = [aggregate.name member_of = [
for aggregate in aggregates aggregate.name
if cell in aggregate.name and for aggregate in aggregates
service_host in aggregate.hosts] if cell in aggregate.name
and service_host in aggregate.hosts
]
else: else:
member_of = [aggregate.name member_of = [
for aggregate in aggregates aggregate.name
if service_host in aggregate.hosts] for aggregate in aggregates
if service_host in aggregate.hosts
]
hypervisor['aggregates'] = member_of hypervisor['aggregates'] = member_of
try: try:
@@ -225,14 +227,16 @@ class ShowHypervisor(command.ShowOne):
else: else:
del hypervisor['uptime'] del hypervisor['uptime']
uptime = compute_client.get_hypervisor_uptime( uptime = compute_client.get_hypervisor_uptime(
hypervisor['id'])['uptime'] hypervisor['id']
)['uptime']
# Extract data from uptime value # Extract data from uptime value
# format: 0 up 0, 0 users, load average: 0, 0, 0 # format: 0 up 0, 0 users, load average: 0, 0, 0
# example: 17:37:14 up 2:33, 3 users, # example: 17:37:14 up 2:33, 3 users,
# load average: 0.33, 0.36, 0.34 # load average: 0.33, 0.36, 0.34
m = re.match( m = re.match(
r"\s*(.+)\sup\s+(.+),\s+(.+)\susers?,\s+load average:\s(.+)", r"\s*(.+)\sup\s+(.+),\s+(.+)\susers?,\s+load average:\s(.+)",
uptime) uptime,
)
if m: if m:
hypervisor['host_time'] = m.group(1) hypervisor['host_time'] = m.group(1)
hypervisor['uptime'] = m.group(2) hypervisor['uptime'] = m.group(2)
@@ -250,11 +254,14 @@ class ShowHypervisor(command.ShowOne):
# string; on earlier fields, do this manually # string; on earlier fields, do this manually
hypervisor['cpu_info'] = json.loads(hypervisor['cpu_info'] or '{}') hypervisor['cpu_info'] = json.loads(hypervisor['cpu_info'] or '{}')
display_columns, columns = _get_hypervisor_columns( display_columns, columns = _get_hypervisor_columns(
hypervisor, compute_client) hypervisor, compute_client
)
data = utils.get_dict_properties( data = utils.get_dict_properties(
hypervisor, columns, hypervisor,
columns,
formatters={ formatters={
'cpu_info': format_columns.DictColumn, 'cpu_info': format_columns.DictColumn,
}) },
)
return display_columns, data return display_columns, data

View File

@@ -29,11 +29,11 @@ def _get_hypervisor_stat_columns(item):
'memory_free': 'free_ram_mb', 'memory_free': 'free_ram_mb',
'memory_size': 'memory_mb', 'memory_size': 'memory_mb',
'memory_used': 'memory_mb_used', 'memory_used': 'memory_mb_used',
} }
hidden_columns = ['id', 'links', 'location', 'name'] hidden_columns = ['id', 'links', 'location', 'name']
return utils.get_osc_show_columns_for_sdk_resource( return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns) item, column_map, hidden_columns
)
class ShowHypervisorStats(command.ShowOne): class ShowHypervisorStats(command.ShowOne):
@@ -41,19 +41,17 @@ class ShowHypervisorStats(command.ShowOne):
def take_action(self, parsed_args): def take_action(self, parsed_args):
# The command is deprecated since it is being dropped in Nova. # The command is deprecated since it is being dropped in Nova.
self.log.warning( self.log.warning(_("This command is deprecated."))
_("This command is deprecated.")
)
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
# We do API request directly cause this deprecated method is not and # We do API request directly cause this deprecated method is not and
# will not be supported by OpenStackSDK. # will not be supported by OpenStackSDK.
response = compute_client.get( response = compute_client.get(
'/os-hypervisors/statistics', '/os-hypervisors/statistics', microversion='2.1'
microversion='2.1') )
hypervisor_stats = response.json().get('hypervisor_statistics') hypervisor_stats = response.json().get('hypervisor_statistics')
display_columns, columns = _get_hypervisor_stat_columns( display_columns, columns = _get_hypervisor_stat_columns(
hypervisor_stats) hypervisor_stats
data = utils.get_dict_properties( )
hypervisor_stats, columns) data = utils.get_dict_properties(hypervisor_stats, columns)
return (display_columns, data) return (display_columns, data)

View File

@@ -45,12 +45,15 @@ def _generate_keypair():
private_key = key.private_bytes( private_key = key.private_bytes(
serialization.Encoding.PEM, serialization.Encoding.PEM,
serialization.PrivateFormat.OpenSSH, serialization.PrivateFormat.OpenSSH,
serialization.NoEncryption() serialization.NoEncryption(),
).decode()
public_key = key.public_key().public_bytes(
serialization.Encoding.OpenSSH,
serialization.PublicFormat.OpenSSH
).decode() ).decode()
public_key = (
key.public_key()
.public_bytes(
serialization.Encoding.OpenSSH, serialization.PublicFormat.OpenSSH
)
.decode()
)
return Keypair(private_key, public_key) return Keypair(private_key, public_key)
@@ -65,7 +68,8 @@ def _get_keypair_columns(item, hide_pub_key=False, hide_priv_key=False):
if hide_priv_key: if hide_priv_key:
hidden_columns.append('private_key') hidden_columns.append('private_key')
return utils.get_osc_show_columns_for_sdk_resource( return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns) item, column_map, hidden_columns
)
class CreateKeypair(command.ShowOne): class CreateKeypair(command.ShowOne):
@@ -74,9 +78,7 @@ class CreateKeypair(command.ShowOne):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(CreateKeypair, self).get_parser(prog_name) parser = super(CreateKeypair, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
'name', 'name', metavar='<name>', help=_("New public or private key name")
metavar='<name>',
help=_("New public or private key name")
) )
key_group = parser.add_mutually_exclusive_group() key_group = parser.add_mutually_exclusive_group()
key_group.add_argument( key_group.add_argument(
@@ -96,7 +98,7 @@ class CreateKeypair(command.ShowOne):
help=_( help=_(
"Filename for private key to save. " "Filename for private key to save. "
"If not used, print private key in console." "If not used, print private key in console."
) ),
) )
parser.add_argument( parser.add_argument(
'--type', '--type',
@@ -122,9 +124,7 @@ class CreateKeypair(command.ShowOne):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
identity_client = self.app.client_manager.identity identity_client = self.app.client_manager.identity
kwargs = { kwargs = {'name': parsed_args.name}
'name': parsed_args.name
}
if parsed_args.public_key: if parsed_args.public_key:
generated_keypair = None generated_keypair = None
@@ -134,7 +134,8 @@ class CreateKeypair(command.ShowOne):
except IOError as e: except IOError as e:
msg = _("Key file %(public_key)s not found: %(exception)s") msg = _("Key file %(public_key)s not found: %(exception)s")
raise exceptions.CommandError( raise exceptions.CommandError(
msg % { msg
% {
"public_key": parsed_args.public_key, "public_key": parsed_args.public_key,
"exception": e, "exception": e,
} }
@@ -158,7 +159,8 @@ class CreateKeypair(command.ShowOne):
"%(exception)s" "%(exception)s"
) )
raise exceptions.CommandError( raise exceptions.CommandError(
msg % { msg
% {
"private_key": parsed_args.private_key, "private_key": parsed_args.private_key,
"exception": e, "exception": e,
} }
@@ -195,7 +197,8 @@ class CreateKeypair(command.ShowOne):
# For now, duplicate nova keypair-add command output # For now, duplicate nova keypair-add command output
if parsed_args.public_key or parsed_args.private_key: if parsed_args.public_key or parsed_args.private_key:
display_columns, columns = _get_keypair_columns( display_columns, columns = _get_keypair_columns(
keypair, hide_pub_key=True, hide_priv_key=True) keypair, hide_pub_key=True, hide_priv_key=True
)
data = utils.get_item_properties(keypair, columns) data = utils.get_item_properties(keypair, columns)
return (display_columns, data) return (display_columns, data)
@@ -213,7 +216,7 @@ class DeleteKeypair(command.Command):
'name', 'name',
metavar='<key>', metavar='<key>',
nargs='+', nargs='+',
help=_("Name of key(s) to delete (name only)") help=_("Name of key(s) to delete (name only)"),
) )
parser.add_argument( parser.add_argument(
'--user', '--user',
@@ -250,16 +253,21 @@ class DeleteKeypair(command.Command):
for n in parsed_args.name: for n in parsed_args.name:
try: try:
compute_client.delete_keypair( compute_client.delete_keypair(
n, **kwargs, ignore_missing=False) n, **kwargs, ignore_missing=False
)
except Exception as e: except Exception as e:
result += 1 result += 1
LOG.error(_("Failed to delete key with name " LOG.error(
"'%(name)s': %(e)s"), {'name': n, 'e': e}) _("Failed to delete key with name " "'%(name)s': %(e)s"),
{'name': n, 'e': e},
)
if result > 0: if result > 0:
total = len(parsed_args.name) total = len(parsed_args.name)
msg = (_("%(result)s of %(total)s keys failed " msg = _("%(result)s of %(total)s keys failed " "to delete.") % {
"to delete.") % {'result': result, 'total': total}) 'result': result,
'total': total,
}
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
@@ -337,9 +345,7 @@ class ListKeypair(command.Lister):
# NOTE(stephenfin): Because we're doing this client-side, we # NOTE(stephenfin): Because we're doing this client-side, we
# can't really rely on the marker, because we don't know what # can't really rely on the marker, because we don't know what
# user the marker is associated with # user the marker is associated with
msg = _( msg = _('--project is not compatible with --marker')
'--project is not compatible with --marker'
)
# NOTE(stephenfin): This is done client side because nova doesn't # NOTE(stephenfin): This is done client side because nova doesn't
# currently support doing so server-side. If this is slow, we can # currently support doing so server-side. If this is slow, we can
@@ -374,13 +380,10 @@ class ListKeypair(command.Lister):
else: else:
data = compute_client.keypairs(**kwargs) data = compute_client.keypairs(**kwargs)
columns = ( columns = ("Name", "Fingerprint")
"Name",
"Fingerprint"
)
if sdk_utils.supports_microversion(compute_client, '2.2'): if sdk_utils.supports_microversion(compute_client, '2.2'):
columns += ("Type", ) columns += ("Type",)
return ( return (
columns, columns,
@@ -396,13 +399,13 @@ class ShowKeypair(command.ShowOne):
parser.add_argument( parser.add_argument(
'name', 'name',
metavar='<key>', metavar='<key>',
help=_("Public or private key to display (name only)") help=_("Public or private key to display (name only)"),
) )
parser.add_argument( parser.add_argument(
'--public-key', '--public-key',
action='store_true', action='store_true',
default=False, default=False,
help=_("Show only bare public key paired with the generated key") help=_("Show only bare public key paired with the generated key"),
) )
parser.add_argument( parser.add_argument(
'--user', '--user',
@@ -436,11 +439,13 @@ class ShowKeypair(command.ShowOne):
).id ).id
keypair = compute_client.find_keypair( keypair = compute_client.find_keypair(
parsed_args.name, **kwargs, ignore_missing=False) parsed_args.name, **kwargs, ignore_missing=False
)
if not parsed_args.public_key: if not parsed_args.public_key:
display_columns, columns = _get_keypair_columns( display_columns, columns = _get_keypair_columns(
keypair, hide_pub_key=True) keypair, hide_pub_key=True
)
data = utils.get_item_properties(keypair, columns) data = utils.get_item_properties(keypair, columns)
return (display_columns, data) return (display_columns, data)
else: else:

File diff suppressed because it is too large Load Diff

View File

@@ -66,7 +66,6 @@ class CreateServerBackup(command.ShowOne):
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
def _show_progress(progress): def _show_progress(progress):
if progress: if progress:
self.app.stderr.write('\rProgress: %s' % progress) self.app.stderr.write('\rProgress: %s' % progress)

View File

@@ -95,7 +95,7 @@ class ListServerEvent(command.Lister):
'--long', '--long',
action='store_true', action='store_true',
default=False, default=False,
help=_("List additional fields in output") help=_("List additional fields in output"),
) )
parser.add_argument( parser.add_argument(
'--changes-since', '--changes-since',
@@ -196,8 +196,7 @@ class ListServerEvent(command.Lister):
try: try:
server_id = compute_client.find_server( server_id = compute_client.find_server(
parsed_args.server, parsed_args.server, ignore_missing=False
ignore_missing=False
).id ).id
except sdk_exceptions.ResourceNotFound: except sdk_exceptions.ResourceNotFound:
# If we fail to find the resource, it is possible the server is # If we fail to find the resource, it is possible the server is
@@ -282,11 +281,13 @@ class ShowServerEvent(command.ShowOne):
raise raise
server_action = compute_client.get_server_action( server_action = compute_client.get_server_action(
parsed_args.request_id, server_id, parsed_args.request_id,
server_id,
) )
column_headers, columns = _get_server_event_columns( column_headers, columns = _get_server_event_columns(
server_action, compute_client, server_action,
compute_client,
) )
return ( return (

View File

@@ -48,7 +48,8 @@ def _get_server_group_columns(item, client):
hidden_columns.append('rules') hidden_columns.append('rules')
return utils.get_osc_show_columns_for_sdk_resource( return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns) item, column_map, hidden_columns
)
class CreateServerGroup(command.ShowOne): class CreateServerGroup(command.ShowOne):
@@ -167,8 +168,7 @@ class DeleteServerGroup(command.Command):
total = len(parsed_args.server_group) total = len(parsed_args.server_group)
msg = _("%(result)s of %(total)s server groups failed to delete.") msg = _("%(result)s of %(total)s server groups failed to delete.")
raise exceptions.CommandError( raise exceptions.CommandError(
msg % {"result": result, msg % {"result": result, "total": total}
"total": total}
) )
@@ -261,8 +261,11 @@ class ListServerGroup(command.Lister):
column_headers, column_headers,
( (
utils.get_item_properties( utils.get_item_properties(
s, columns, formatters=_formatters, s,
) for s in data columns,
formatters=_formatters,
)
for s in data
), ),
) )

View File

@@ -67,7 +67,6 @@ class CreateServerImage(command.ShowOne):
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
def _show_progress(progress): def _show_progress(progress):
if progress: if progress:
self.app.stdout.write('\rProgress: %s' % progress) self.app.stdout.write('\rProgress: %s' % progress)
@@ -77,7 +76,8 @@ class CreateServerImage(command.ShowOne):
image_client = self.app.client_manager.image image_client = self.app.client_manager.image
server = compute_client.find_server( server = compute_client.find_server(
parsed_args.server, ignore_missing=False, parsed_args.server,
ignore_missing=False,
) )
if parsed_args.name: if parsed_args.name:
@@ -100,7 +100,8 @@ class CreateServerImage(command.ShowOne):
self.app.stdout.write('\n') self.app.stdout.write('\n')
else: else:
LOG.error( LOG.error(
_('Error creating server image: %s'), parsed_args.server) _('Error creating server image: %s'), parsed_args.server
)
raise exceptions.CommandError raise exceptions.CommandError
image = image_client.find_image(image_id, ignore_missing=False) image = image_client.find_image(image_id, ignore_missing=False)

View File

@@ -31,27 +31,26 @@ class ListMigration(command.Lister):
parser.add_argument( parser.add_argument(
'--server', '--server',
metavar='<server>', metavar='<server>',
help=_( help=_('Filter migrations by server (name or ID)'),
'Filter migrations by server (name or ID)'
)
) )
parser.add_argument( parser.add_argument(
'--host', '--host',
metavar='<host>', metavar='<host>',
help=_( help=_('Filter migrations by source or destination host'),
'Filter migrations by source or destination host'
),
) )
parser.add_argument( parser.add_argument(
'--status', '--status',
metavar='<status>', metavar='<status>',
help=_('Filter migrations by status') help=_('Filter migrations by status'),
) )
parser.add_argument( parser.add_argument(
'--type', '--type',
metavar='<type>', metavar='<type>',
choices=[ choices=[
'evacuation', 'live-migration', 'cold-migration', 'resize', 'evacuation',
'live-migration',
'cold-migration',
'resize',
], ],
help=_('Filter migrations by type'), help=_('Filter migrations by type'),
) )
@@ -121,17 +120,33 @@ class ListMigration(command.Lister):
def print_migrations(self, parsed_args, compute_client, migrations): def print_migrations(self, parsed_args, compute_client, migrations):
column_headers = [ column_headers = [
'Source Node', 'Dest Node', 'Source Compute', 'Dest Compute', 'Source Node',
'Dest Host', 'Status', 'Server UUID', 'Old Flavor', 'New Flavor', 'Dest Node',
'Created At', 'Updated At', 'Source Compute',
'Dest Compute',
'Dest Host',
'Status',
'Server UUID',
'Old Flavor',
'New Flavor',
'Created At',
'Updated At',
] ]
# Response fields coming back from the REST API are not always exactly # Response fields coming back from the REST API are not always exactly
# the same as the column header names. # the same as the column header names.
columns = [ columns = [
'source_node', 'dest_node', 'source_compute', 'dest_compute', 'source_node',
'dest_host', 'status', 'server_id', 'old_flavor_id', 'dest_node',
'new_flavor_id', 'created_at', 'updated_at', 'source_compute',
'dest_compute',
'dest_host',
'status',
'server_id',
'old_flavor_id',
'new_flavor_id',
'created_at',
'updated_at',
] ]
# Insert migrations UUID after ID # Insert migrations UUID after ID
@@ -260,9 +275,7 @@ def _get_migration_by_uuid(compute_client, server_id, migration_uuid):
return migration return migration
break break
else: else:
msg = _( msg = _('In-progress live migration %s is not found for server %s.')
'In-progress live migration %s is not found for server %s.'
)
raise exceptions.CommandError(msg % (migration_uuid, server_id)) raise exceptions.CommandError(msg % (migration_uuid, server_id))
@@ -302,9 +315,7 @@ class ShowMigration(command.ShowOne):
try: try:
uuid.UUID(parsed_args.migration) uuid.UUID(parsed_args.migration)
except ValueError: except ValueError:
msg = _( msg = _('The <migration> argument must be an ID or UUID')
'The <migration> argument must be an ID or UUID'
)
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
if not sdk_utils.supports_microversion(compute_client, '2.59'): if not sdk_utils.supports_microversion(compute_client, '2.59'):
@@ -324,7 +335,9 @@ class ShowMigration(command.ShowOne):
# migrations - the responses are identical # migrations - the responses are identical
if not parsed_args.migration.isdigit(): if not parsed_args.migration.isdigit():
server_migration = _get_migration_by_uuid( server_migration = _get_migration_by_uuid(
compute_client, server.id, parsed_args.migration, compute_client,
server.id,
parsed_args.migration,
) )
else: else:
server_migration = compute_client.get_server_migration( server_migration = compute_client.get_server_migration(
@@ -417,9 +430,7 @@ class AbortMigration(command.Command):
try: try:
uuid.UUID(parsed_args.migration) uuid.UUID(parsed_args.migration)
except ValueError: except ValueError:
msg = _( msg = _('The <migration> argument must be an ID or UUID')
'The <migration> argument must be an ID or UUID'
)
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
if not sdk_utils.supports_microversion(compute_client, '2.59'): if not sdk_utils.supports_microversion(compute_client, '2.59'):
@@ -440,7 +451,9 @@ class AbortMigration(command.Command):
migration_id = parsed_args.migration migration_id = parsed_args.migration
if not parsed_args.migration.isdigit(): if not parsed_args.migration.isdigit():
migration_id = _get_migration_by_uuid( migration_id = _get_migration_by_uuid(
compute_client, server.id, parsed_args.migration, compute_client,
server.id,
parsed_args.migration,
).id ).id
compute_client.abort_server_migration( compute_client.abort_server_migration(
@@ -464,9 +477,7 @@ class ForceCompleteMigration(command.Command):
help=_('Server (name or ID)'), help=_('Server (name or ID)'),
) )
parser.add_argument( parser.add_argument(
'migration', 'migration', metavar='<migration>', help=_('Migration (ID)')
metavar='<migration>',
help=_('Migration (ID)')
) )
return parser return parser
@@ -484,9 +495,7 @@ class ForceCompleteMigration(command.Command):
try: try:
uuid.UUID(parsed_args.migration) uuid.UUID(parsed_args.migration)
except ValueError: except ValueError:
msg = _( msg = _('The <migration> argument must be an ID or UUID')
'The <migration> argument must be an ID or UUID'
)
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
if not sdk_utils.supports_microversion(compute_client, '2.59'): if not sdk_utils.supports_microversion(compute_client, '2.59'):
@@ -507,9 +516,9 @@ class ForceCompleteMigration(command.Command):
migration_id = parsed_args.migration migration_id = parsed_args.migration
if not parsed_args.migration.isdigit(): if not parsed_args.migration.isdigit():
migration_id = _get_migration_by_uuid( migration_id = _get_migration_by_uuid(
compute_client, server.id, parsed_args.migration, compute_client,
server.id,
parsed_args.migration,
).id ).id
compute_client.force_complete_server_migration( compute_client.force_complete_server_migration(migration_id, server.id)
migration_id, server.id
)

View File

@@ -37,15 +37,17 @@ class DeleteService(command.Command):
"service", "service",
metavar="<service>", metavar="<service>",
nargs='+', nargs='+',
help=_("Compute service(s) to delete (ID only). If using " help=_(
"``--os-compute-api-version`` 2.53 or greater, the ID is " "Compute service(s) to delete (ID only). If using "
"a UUID which can be retrieved by listing compute services " "``--os-compute-api-version`` 2.53 or greater, the ID is "
"using the same 2.53+ microversion. " "a UUID which can be retrieved by listing compute services "
"If deleting a compute service, be sure to stop the actual " "using the same 2.53+ microversion. "
"compute process on the physical host before deleting the " "If deleting a compute service, be sure to stop the actual "
"service with this command. Failing to do so can lead to " "compute process on the physical host before deleting the "
"the running service re-creating orphaned compute_nodes " "service with this command. Failing to do so can lead to "
"table records in the database.") "the running service re-creating orphaned compute_nodes "
"table records in the database."
),
) )
return parser return parser
@@ -54,47 +56,54 @@ class DeleteService(command.Command):
result = 0 result = 0
for s in parsed_args.service: for s in parsed_args.service:
try: try:
compute_client.delete_service( compute_client.delete_service(s, ignore_missing=False)
s,
ignore_missing=False
)
except Exception as e: except Exception as e:
result += 1 result += 1
LOG.error(_("Failed to delete compute service with " LOG.error(
"ID '%(service)s': %(e)s"), {'service': s, 'e': e}) _(
"Failed to delete compute service with "
"ID '%(service)s': %(e)s"
),
{'service': s, 'e': e},
)
if result > 0: if result > 0:
total = len(parsed_args.service) total = len(parsed_args.service)
msg = (_("%(result)s of %(total)s compute services failed " msg = _(
"to delete.") % {'result': result, 'total': total}) "%(result)s of %(total)s compute services failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
class ListService(command.Lister): class ListService(command.Lister):
_description = _("""List compute services. _description = _(
"""List compute services.
Using ``--os-compute-api-version`` 2.53 or greater will return the ID as a UUID Using ``--os-compute-api-version`` 2.53 or greater will return the ID as a UUID
value which can be used to uniquely identify the service in a multi-cell value which can be used to uniquely identify the service in a multi-cell
deployment.""") deployment."""
)
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(ListService, self).get_parser(prog_name) parser = super(ListService, self).get_parser(prog_name)
parser.add_argument( parser.add_argument(
"--host", "--host",
metavar="<host>", metavar="<host>",
help=_("List services on specified host (name only)") help=_("List services on specified host (name only)"),
) )
parser.add_argument( parser.add_argument(
"--service", "--service",
metavar="<service>", metavar="<service>",
help=_("List only specified service binaries (name only). For " help=_(
"example, ``nova-compute``, ``nova-conductor``, etc.") "List only specified service binaries (name only). For "
"example, ``nova-compute``, ``nova-conductor``, etc."
),
) )
parser.add_argument( parser.add_argument(
"--long", "--long",
action="store_true", action="store_true",
default=False, default=False,
help=_("List additional fields in output") help=_("List additional fields in output"),
) )
return parser return parser
@@ -126,12 +135,11 @@ deployment.""")
column_headers += ("Forced Down",) column_headers += ("Forced Down",)
data = compute_client.services( data = compute_client.services(
host=parsed_args.host, host=parsed_args.host, binary=parsed_args.service
binary=parsed_args.service
) )
return ( return (
column_headers, column_headers,
(utils.get_item_properties(s, columns) for s in data) (utils.get_item_properties(s, columns) for s in data),
) )
@@ -140,47 +148,47 @@ class SetService(command.Command):
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(SetService, self).get_parser(prog_name) parser = super(SetService, self).get_parser(prog_name)
parser.add_argument( parser.add_argument("host", metavar="<host>", help=_("Name of host"))
"host",
metavar="<host>",
help=_("Name of host")
)
parser.add_argument( parser.add_argument(
"service", "service",
metavar="<service>", metavar="<service>",
help=_("Name of service (Binary name), for example " help=_(
"``nova-compute``") "Name of service (Binary name), for example "
"``nova-compute``"
),
) )
enabled_group = parser.add_mutually_exclusive_group() enabled_group = parser.add_mutually_exclusive_group()
enabled_group.add_argument( enabled_group.add_argument(
"--enable", "--enable", action="store_true", help=_("Enable service")
action="store_true",
help=_("Enable service")
) )
enabled_group.add_argument( enabled_group.add_argument(
"--disable", "--disable", action="store_true", help=_("Disable service")
action="store_true",
help=_("Disable service")
) )
parser.add_argument( parser.add_argument(
"--disable-reason", "--disable-reason",
default=None, default=None,
metavar="<reason>", metavar="<reason>",
help=_("Reason for disabling the service (in quotes). " help=_(
"Should be used with --disable option.") "Reason for disabling the service (in quotes). "
"Should be used with --disable option."
),
) )
up_down_group = parser.add_mutually_exclusive_group() up_down_group = parser.add_mutually_exclusive_group()
up_down_group.add_argument( up_down_group.add_argument(
'--up', '--up',
action='store_true', action='store_true',
help=_('Force up service. Requires ``--os-compute-api-version`` ' help=_(
'2.11 or greater.'), 'Force up service. Requires ``--os-compute-api-version`` '
'2.11 or greater.'
),
) )
up_down_group.add_argument( up_down_group.add_argument(
'--down', '--down',
action='store_true', action='store_true',
help=_('Force down service. Requires ``--os-compute-api-version`` ' help=_(
'2.11 or greater.'), 'Force down service. Requires ``--os-compute-api-version`` '
'2.11 or greater.'
),
) )
return parser return parser
@@ -196,45 +204,49 @@ class SetService(command.Command):
services = list(compute_client.services(host=host, binary=binary)) services = list(compute_client.services(host=host, binary=binary))
# Did we find anything? # Did we find anything?
if not len(services): if not len(services):
msg = _('Compute service for host "%(host)s" and binary ' msg = _(
'"%(binary)s" not found.') % { 'Compute service for host "%(host)s" and binary '
'host': host, 'binary': binary} '"%(binary)s" not found.'
) % {'host': host, 'binary': binary}
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
# Did we find more than one result? This should not happen but let's # Did we find more than one result? This should not happen but let's
# be safe. # be safe.
if len(services) > 1: if len(services) > 1:
# TODO(mriedem): If we have an --id option for 2.53+ then we can # TODO(mriedem): If we have an --id option for 2.53+ then we can
# say to use that option to uniquely identify the service. # say to use that option to uniquely identify the service.
msg = _('Multiple compute services found for host "%(host)s" and ' msg = _(
'binary "%(binary)s". Unable to proceed.') % { 'Multiple compute services found for host "%(host)s" and '
'host': host, 'binary': binary} 'binary "%(binary)s". Unable to proceed.'
) % {'host': host, 'binary': binary}
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
return services[0] return services[0]
def take_action(self, parsed_args): def take_action(self, parsed_args):
compute_client = self.app.client_manager.sdk_connection.compute compute_client = self.app.client_manager.sdk_connection.compute
if (parsed_args.enable or not parsed_args.disable) and \ if (
parsed_args.disable_reason: parsed_args.enable or not parsed_args.disable
msg = _("Cannot specify option --disable-reason without " ) and parsed_args.disable_reason:
"--disable specified.") msg = _(
"Cannot specify option --disable-reason without "
"--disable specified."
)
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
# Starting with microversion 2.53, there is a single # Starting with microversion 2.53, there is a single
# PUT /os-services/{service_id} API for updating nova-compute # PUT /os-services/{service_id} API for updating nova-compute
# services. If 2.53+ is used we need to find the nova-compute # services. If 2.53+ is used we need to find the nova-compute
# service using the --host and --service (binary) values. # service using the --host and --service (binary) values.
requires_service_id = ( requires_service_id = sdk_utils.supports_microversion(
sdk_utils.supports_microversion(compute_client, '2.53')) compute_client, '2.53'
)
service_id = None service_id = None
if requires_service_id: if requires_service_id:
# TODO(mriedem): Add an --id option so users can pass the service # TODO(mriedem): Add an --id option so users can pass the service
# id (as a uuid) directly rather than make us look it up using # id (as a uuid) directly rather than make us look it up using
# host/binary. # host/binary.
service_id = SetService._find_service_by_host_and_binary( service_id = SetService._find_service_by_host_and_binary(
compute_client, compute_client, parsed_args.host, parsed_args.service
parsed_args.host,
parsed_args.service
).id ).id
result = 0 result = 0
@@ -248,16 +260,14 @@ class SetService(command.Command):
if enabled is not None: if enabled is not None:
if enabled: if enabled:
compute_client.enable_service( compute_client.enable_service(
service_id, service_id, parsed_args.host, parsed_args.service
parsed_args.host,
parsed_args.service
) )
else: else:
compute_client.disable_service( compute_client.disable_service(
service_id, service_id,
parsed_args.host, parsed_args.host,
parsed_args.service, parsed_args.service,
parsed_args.disable_reason parsed_args.disable_reason,
) )
except Exception: except Exception:
status = "enabled" if enabled else "disabled" status = "enabled" if enabled else "disabled"
@@ -271,15 +281,16 @@ class SetService(command.Command):
force_down = False force_down = False
if force_down is not None: if force_down is not None:
if not sdk_utils.supports_microversion(compute_client, '2.11'): if not sdk_utils.supports_microversion(compute_client, '2.11'):
msg = _('--os-compute-api-version 2.11 or later is ' msg = _(
'required') '--os-compute-api-version 2.11 or later is ' 'required'
)
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)
try: try:
compute_client.update_service_forced_down( compute_client.update_service_forced_down(
service_id, service_id,
parsed_args.host, parsed_args.host,
parsed_args.service, parsed_args.service,
force_down force_down,
) )
except Exception: except Exception:
state = "down" if force_down else "up" state = "down" if force_down else "up"
@@ -287,7 +298,8 @@ class SetService(command.Command):
result += 1 result += 1
if result > 0: if result > 0:
msg = _("Compute service %(service)s of host %(host)s failed to " msg = _(
"set.") % {"service": parsed_args.service, "Compute service %(service)s of host %(host)s failed to "
"host": parsed_args.host} "set."
) % {"service": parsed_args.service, "host": parsed_args.host}
raise exceptions.CommandError(msg) raise exceptions.CommandError(msg)

View File

@@ -54,13 +54,11 @@ class ProjectColumn(cliff_columns.FormattableColumn):
class CountColumn(cliff_columns.FormattableColumn): class CountColumn(cliff_columns.FormattableColumn):
def human_readable(self): def human_readable(self):
return len(self._value) if self._value is not None else None return len(self._value) if self._value is not None else None
class FloatColumn(cliff_columns.FormattableColumn): class FloatColumn(cliff_columns.FormattableColumn):
def human_readable(self): def human_readable(self):
return float("%.2f" % self._value) return float("%.2f" % self._value)
@@ -68,7 +66,8 @@ class FloatColumn(cliff_columns.FormattableColumn):
def _formatters(project_cache): def _formatters(project_cache):
return { return {
'project_id': functools.partial( 'project_id': functools.partial(
ProjectColumn, project_cache=project_cache), ProjectColumn, project_cache=project_cache
),
'server_usages': CountColumn, 'server_usages': CountColumn,
'total_memory_mb_usage': FloatColumn, 'total_memory_mb_usage': FloatColumn,
'total_vcpus_usage': FloatColumn, 'total_vcpus_usage': FloatColumn,
@@ -115,19 +114,20 @@ class ListUsage(command.Lister):
"--start", "--start",
metavar="<start>", metavar="<start>",
default=None, default=None,
help=_("Usage range start date, ex 2012-01-20" help=_(
" (default: 4 weeks ago)") "Usage range start date, ex 2012-01-20"
" (default: 4 weeks ago)"
),
) )
parser.add_argument( parser.add_argument(
"--end", "--end",
metavar="<end>", metavar="<end>",
default=None, default=None,
help=_("Usage range end date, ex 2012-01-20 (default: tomorrow)") help=_("Usage range end date, ex 2012-01-20 (default: tomorrow)"),
) )
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
def _format_project(project): def _format_project(project):
if not project: if not project:
return "" return ""
@@ -142,14 +142,14 @@ class ListUsage(command.Lister):
"server_usages", "server_usages",
"total_memory_mb_usage", "total_memory_mb_usage",
"total_vcpus_usage", "total_vcpus_usage",
"total_local_gb_usage" "total_local_gb_usage",
) )
column_headers = ( column_headers = (
"Project", "Project",
"Servers", "Servers",
"RAM MB-Hours", "RAM MB-Hours",
"CPU Hours", "CPU Hours",
"Disk GB-Hours" "Disk GB-Hours",
) )
date_cli_format = "%Y-%m-%d" date_cli_format = "%Y-%m-%d"
@@ -158,7 +158,8 @@ class ListUsage(command.Lister):
if parsed_args.start: if parsed_args.start:
start = datetime.datetime.strptime( start = datetime.datetime.strptime(
parsed_args.start, date_cli_format) parsed_args.start, date_cli_format
)
else: else:
start = now - datetime.timedelta(weeks=4) start = now - datetime.timedelta(weeks=4)
@@ -167,10 +168,13 @@ class ListUsage(command.Lister):
else: else:
end = now + datetime.timedelta(days=1) end = now + datetime.timedelta(days=1)
usage_list = list(compute_client.usages( usage_list = list(
start=start.strftime(date_api_format), compute_client.usages(
end=end.strftime(date_api_format), start=start.strftime(date_api_format),
detailed=True)) end=end.strftime(date_api_format),
detailed=True,
)
)
# Cache the project list # Cache the project list
project_cache = {} project_cache = {}
@@ -182,18 +186,23 @@ class ListUsage(command.Lister):
pass pass
if parsed_args.formatter == 'table' and len(usage_list) > 0: if parsed_args.formatter == 'table' and len(usage_list) > 0:
self.app.stdout.write(_("Usage from %(start)s to %(end)s: \n") % { self.app.stdout.write(
"start": start.strftime(date_cli_format), _("Usage from %(start)s to %(end)s: \n")
"end": end.strftime(date_cli_format), % {
}) "start": start.strftime(date_cli_format),
"end": end.strftime(date_cli_format),
}
)
return ( return (
column_headers, column_headers,
( (
utils.get_item_properties( utils.get_item_properties(
s, columns, s,
columns,
formatters=_formatters(project_cache), formatters=_formatters(project_cache),
) for s in usage_list )
for s in usage_list
), ),
) )
@@ -207,20 +216,22 @@ class ShowUsage(command.ShowOne):
"--project", "--project",
metavar="<project>", metavar="<project>",
default=None, default=None,
help=_("Name or ID of project to show usage for") help=_("Name or ID of project to show usage for"),
) )
parser.add_argument( parser.add_argument(
"--start", "--start",
metavar="<start>", metavar="<start>",
default=None, default=None,
help=_("Usage range start date, ex 2012-01-20" help=_(
" (default: 4 weeks ago)") "Usage range start date, ex 2012-01-20"
" (default: 4 weeks ago)"
),
) )
parser.add_argument( parser.add_argument(
"--end", "--end",
metavar="<end>", metavar="<end>",
default=None, default=None,
help=_("Usage range end date, ex 2012-01-20 (default: tomorrow)") help=_("Usage range end date, ex 2012-01-20 (default: tomorrow)"),
) )
return parser return parser
@@ -233,7 +244,8 @@ class ShowUsage(command.ShowOne):
if parsed_args.start: if parsed_args.start:
start = datetime.datetime.strptime( start = datetime.datetime.strptime(
parsed_args.start, date_cli_format) parsed_args.start, date_cli_format
)
else: else:
start = now - datetime.timedelta(weeks=4) start = now - datetime.timedelta(weeks=4)
@@ -252,33 +264,37 @@ class ShowUsage(command.ShowOne):
project = self.app.client_manager.auth_ref.project_id project = self.app.client_manager.auth_ref.project_id
usage = compute_client.get_usage( usage = compute_client.get_usage(
project=project, start=start.strftime(date_api_format), project=project,
end=end.strftime(date_api_format)) start=start.strftime(date_api_format),
end=end.strftime(date_api_format),
)
if parsed_args.formatter == 'table': if parsed_args.formatter == 'table':
self.app.stdout.write(_( self.app.stdout.write(
"Usage from %(start)s to %(end)s on project %(project)s: \n" _("Usage from %(start)s to %(end)s on project %(project)s: \n")
) % { % {
"start": start.strftime(date_cli_format), "start": start.strftime(date_cli_format),
"end": end.strftime(date_cli_format), "end": end.strftime(date_cli_format),
"project": project, "project": project,
}) }
)
columns = ( columns = (
"project_id", "project_id",
"server_usages", "server_usages",
"total_memory_mb_usage", "total_memory_mb_usage",
"total_vcpus_usage", "total_vcpus_usage",
"total_local_gb_usage" "total_local_gb_usage",
) )
column_headers = ( column_headers = (
"Project", "Project",
"Servers", "Servers",
"RAM MB-Hours", "RAM MB-Hours",
"CPU Hours", "CPU Hours",
"Disk GB-Hours" "Disk GB-Hours",
) )
data = utils.get_item_properties( data = utils.get_item_properties(
usage, columns, formatters=_formatters(None)) usage, columns, formatters=_formatters(None)
)
return column_headers, data return column_headers, data

View File

@@ -53,9 +53,10 @@ class ComputeTestCase(base.TestCase):
images = cls.openstack("image list", parse_output=True) images = cls.openstack("image list", parse_output=True)
server_image = None server_image = None
for image in images: for image in images:
if (image['Name'].startswith('cirros-') and if image['Name'].startswith('cirros-') and (
(image['Name'].endswith('-uec') or image['Name'].endswith('-uec')
image['Name'].endswith('-disk'))): or image['Name'].endswith('-disk')
):
server_image = image['Name'] server_image = image['Name']
break break
return server_image return server_image
@@ -83,12 +84,17 @@ class ComputeTestCase(base.TestCase):
self.network_arg = self.get_network() self.network_arg = self.get_network()
name = name or uuid.uuid4().hex name = name or uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'server create ' + 'server create '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
self.network_arg + ' ' + + ' '
'--wait ' + + '--image '
name, + self.image_name
+ ' '
+ self.network_arg
+ ' '
+ '--wait '
+ name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(cmd_output["id"]) self.assertIsNotNone(cmd_output["id"])
@@ -106,11 +112,11 @@ class ComputeTestCase(base.TestCase):
self.assertOutput('', raw_output) self.assertOutput('', raw_output)
def wait_for_status( def wait_for_status(
self, self,
name, name,
expected_status='ACTIVE', expected_status='ACTIVE',
wait=900, wait=900,
interval=10, interval=10,
): ):
"""Wait until server reaches expected status""" """Wait until server reaches expected status"""
# TODO(thowe): Add a server wait command to osc # TODO(thowe): Add a server wait command to osc
@@ -118,24 +124,24 @@ class ComputeTestCase(base.TestCase):
total_sleep = 0 total_sleep = 0
while total_sleep < wait: while total_sleep < wait:
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + name,
name,
parse_output=True, parse_output=True,
) )
status = cmd_output['status'] status = cmd_output['status']
if status == expected_status: if status == expected_status:
print('Server {} now has status {}'.format( print('Server {} now has status {}'.format(name, status))
name, status))
break break
print('Server {}: Waiting for {}, current status: {}'.format( print(
name, expected_status, status)) 'Server {}: Waiting for {}, current status: {}'.format(
name, expected_status, status
)
)
self.assertNotIn(status, failures) self.assertNotIn(status, failures)
time.sleep(interval) time.sleep(interval)
total_sleep += interval total_sleep += interval
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + name,
name,
parse_output=True, parse_output=True,
) )
status = cmd_output['status'] status = cmd_output['status']

View File

@@ -27,24 +27,12 @@ class AggregateTests(base.TestCase):
fail_ok=True, fail_ok=True,
) )
cmd_output = self.openstack( cmd_output = self.openstack(
'aggregate create ' + 'aggregate create ' + '--zone nova ' + '--property a=b ' + name1,
'--zone nova ' +
'--property a=b ' +
name1,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(name1, cmd_output['name'])
name1, self.assertEqual('nova', cmd_output['availability_zone'])
cmd_output['name'] self.assertIn('a', cmd_output['properties'])
)
self.assertEqual(
'nova',
cmd_output['availability_zone']
)
self.assertIn(
'a',
cmd_output['properties']
)
cmd_output = self.openstack( cmd_output = self.openstack(
'aggregate show ' + name1, 'aggregate show ' + name1,
parse_output=True, parse_output=True,
@@ -58,19 +46,11 @@ class AggregateTests(base.TestCase):
fail_ok=True, fail_ok=True,
) )
cmd_output = self.openstack( cmd_output = self.openstack(
'aggregate create ' + 'aggregate create ' + '--zone external ' + name2,
'--zone external ' +
name2,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(name2, cmd_output['name'])
name2, self.assertEqual('external', cmd_output['availability_zone'])
cmd_output['name']
)
self.assertEqual(
'external',
cmd_output['availability_zone']
)
cmd_output = self.openstack( cmd_output = self.openstack(
'aggregate show ' + name2, 'aggregate show ' + name2,
parse_output=True, parse_output=True,
@@ -85,36 +65,25 @@ class AggregateTests(base.TestCase):
fail_ok=True, fail_ok=True,
) )
raw_output = self.openstack( raw_output = self.openstack(
'aggregate set ' + 'aggregate set '
'--name ' + name3 + ' ' + + '--name '
'--zone internal ' + + name3
'--no-property ' + + ' '
'--property c=d ' + + '--zone internal '
name1 + '--no-property '
+ '--property c=d '
+ name1
) )
self.assertOutput('', raw_output) self.assertOutput('', raw_output)
cmd_output = self.openstack( cmd_output = self.openstack(
'aggregate show ' + 'aggregate show ' + name3,
name3,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(name3, cmd_output['name'])
name3, self.assertEqual('internal', cmd_output['availability_zone'])
cmd_output['name'] self.assertIn('c', cmd_output['properties'])
) self.assertNotIn('a', cmd_output['properties'])
self.assertEqual(
'internal',
cmd_output['availability_zone']
)
self.assertIn(
'c',
cmd_output['properties']
)
self.assertNotIn(
'a',
cmd_output['properties']
)
# Test aggregate list # Test aggregate list
cmd_output = self.openstack( cmd_output = self.openstack(
@@ -145,28 +114,18 @@ class AggregateTests(base.TestCase):
# Test unset # Test unset
raw_output = self.openstack( raw_output = self.openstack(
'aggregate unset ' + 'aggregate unset ' + '--property c ' + name3
'--property c ' +
name3
) )
self.assertOutput('', raw_output) self.assertOutput('', raw_output)
cmd_output = self.openstack( cmd_output = self.openstack(
'aggregate show ' + 'aggregate show ' + name3,
name3,
parse_output=True, parse_output=True,
) )
self.assertNotIn( self.assertNotIn("c='d'", cmd_output['properties'])
"c='d'",
cmd_output['properties']
)
# test aggregate delete # test aggregate delete
del_output = self.openstack( del_output = self.openstack('aggregate delete ' + name3 + ' ' + name2)
'aggregate delete ' +
name3 + ' ' +
name2
)
self.assertOutput('', del_output) self.assertOutput('', del_output)
def test_aggregate_add_and_remove_host(self): def test_aggregate_add_and_remove_host(self):
@@ -185,31 +144,18 @@ class AggregateTests(base.TestCase):
name = uuid.uuid4().hex name = uuid.uuid4().hex
self.addCleanup(self.openstack, 'aggregate delete ' + name) self.addCleanup(self.openstack, 'aggregate delete ' + name)
self.openstack( self.openstack('aggregate create ' + name)
'aggregate create ' +
name
)
# Test add host # Test add host
cmd_output = self.openstack( cmd_output = self.openstack(
'aggregate add host ' + 'aggregate add host ' + name + ' ' + host_name,
name + ' ' +
host_name,
parse_output=True, parse_output=True,
) )
self.assertIn( self.assertIn(host_name, cmd_output['hosts'])
host_name,
cmd_output['hosts']
)
# Test remove host # Test remove host
cmd_output = self.openstack( cmd_output = self.openstack(
'aggregate remove host ' + 'aggregate remove host ' + name + ' ' + host_name,
name + ' ' +
host_name,
parse_output=True, parse_output=True,
) )
self.assertNotIn( self.assertNotIn(host_name, cmd_output['hosts'])
host_name,
cmd_output['hosts']
)

View File

@@ -42,21 +42,25 @@ class FlavorTests(base.TestCase):
"""Test create w/project, delete multiple""" """Test create w/project, delete multiple"""
name1 = uuid.uuid4().hex name1 = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor create " + "flavor create "
"--project " + self.PROJECT_NAME + " " + + "--project "
"--private " + + self.PROJECT_NAME
name1, + " "
+ "--private "
+ name1,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(cmd_output["id"]) self.assertIsNotNone(cmd_output["id"])
name2 = uuid.uuid4().hex name2 = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor create " + "flavor create "
"--id qaz " + + "--id qaz "
"--project " + self.PROJECT_NAME + " " + + "--project "
"--private " + + self.PROJECT_NAME
name2, + " "
+ "--private "
+ name2,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(cmd_output["id"]) self.assertIsNotNone(cmd_output["id"])
@@ -74,10 +78,7 @@ class FlavorTests(base.TestCase):
"""Test create defaults, list filters, delete""" """Test create defaults, list filters, delete"""
name1 = uuid.uuid4().hex name1 = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor create " + "flavor create " + "--property a=b " + "--property c=d " + name1,
"--property a=b " +
"--property c=d " +
name1,
parse_output=True, parse_output=True,
) )
self.addCleanup(self.openstack, "flavor delete " + name1) self.addCleanup(self.openstack, "flavor delete " + name1)
@@ -89,13 +90,13 @@ class FlavorTests(base.TestCase):
name2 = uuid.uuid4().hex name2 = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor create " + "flavor create "
"--id qaz " + + "--id qaz "
"--ram 123 " + + "--ram 123 "
"--private " + + "--private "
"--property a=b2 " + + "--property a=b2 "
"--property b=d2 " + + "--property b=d2 "
name2, + name2,
parse_output=True, parse_output=True,
) )
self.addCleanup(self.openstack, "flavor delete " + name2) self.addCleanup(self.openstack, "flavor delete " + name2)
@@ -135,8 +136,7 @@ class FlavorTests(base.TestCase):
# Test list --long # Test list --long
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor list " + "flavor list " + "--long",
"--long",
parse_output=True, parse_output=True,
) )
# We have list of complex json objects # We have list of complex json objects
@@ -154,8 +154,7 @@ class FlavorTests(base.TestCase):
# Test list --public # Test list --public
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor list " + "flavor list " + "--public",
"--public",
parse_output=True, parse_output=True,
) )
col_name = [x["Name"] for x in cmd_output] col_name = [x["Name"] for x in cmd_output]
@@ -164,8 +163,7 @@ class FlavorTests(base.TestCase):
# Test list --private # Test list --private
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor list " + "flavor list " + "--private",
"--private",
parse_output=True, parse_output=True,
) )
col_name = [x["Name"] for x in cmd_output] col_name = [x["Name"] for x in cmd_output]
@@ -174,8 +172,7 @@ class FlavorTests(base.TestCase):
# Test list --all # Test list --all
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor list " + "flavor list " + "--all",
"--all",
parse_output=True, parse_output=True,
) )
col_name = [x["Name"] for x in cmd_output] col_name = [x["Name"] for x in cmd_output]
@@ -186,14 +183,14 @@ class FlavorTests(base.TestCase):
"""Test create defaults, list filters, delete""" """Test create defaults, list filters, delete"""
name1 = uuid.uuid4().hex name1 = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor create " + "flavor create "
"--id qaz " + + "--id qaz "
"--ram 123 " + + "--ram 123 "
"--disk 20 " + + "--disk 20 "
"--private " + + "--private "
"--property a=first " + + "--property a=first "
"--property b=second " + + "--property b=second "
name1, + name1,
parse_output=True, parse_output=True,
) )
self.addCleanup(self.openstack, "flavor delete " + name1) self.addCleanup(self.openstack, "flavor delete " + name1)
@@ -223,42 +220,30 @@ class FlavorTests(base.TestCase):
) )
raw_output = self.openstack( raw_output = self.openstack(
"flavor set " + "flavor set "
"--property a='third and 10' " + + "--property a='third and 10' "
"--property g=fourth " + + "--property g=fourth "
name1 + name1
) )
self.assertEqual('', raw_output) self.assertEqual('', raw_output)
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor show " + "flavor show " + name1,
name1,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(
"qaz", "qaz",
cmd_output["id"], cmd_output["id"],
) )
self.assertEqual( self.assertEqual('third and 10', cmd_output['properties']['a'])
'third and 10', self.assertEqual('second', cmd_output['properties']['b'])
cmd_output['properties']['a']) self.assertEqual('fourth', cmd_output['properties']['g'])
self.assertEqual(
'second',
cmd_output['properties']['b'])
self.assertEqual(
'fourth',
cmd_output['properties']['g'])
raw_output = self.openstack( raw_output = self.openstack("flavor unset " + "--property b " + name1)
"flavor unset " +
"--property b " +
name1
)
self.assertEqual('', raw_output) self.assertEqual('', raw_output)
cmd_output = self.openstack( cmd_output = self.openstack(
"flavor show " + "flavor show " + name1,
name1,
parse_output=True, parse_output=True,
) )

View File

@@ -21,32 +21,32 @@ class HypervisorTests(base.TestCase):
def test_hypervisor_list(self): def test_hypervisor_list(self):
"""Test create defaults, list filters, delete""" """Test create defaults, list filters, delete"""
# Test list # Test list
cmd_output = json.loads(self.openstack( cmd_output = json.loads(
"hypervisor list -f json --os-compute-api-version 2.1" self.openstack(
)) "hypervisor list -f json --os-compute-api-version 2.1"
)
)
ids1 = [x["ID"] for x in cmd_output] ids1 = [x["ID"] for x in cmd_output]
self.assertIsNotNone(cmd_output) self.assertIsNotNone(cmd_output)
cmd_output = json.loads(self.openstack( cmd_output = json.loads(self.openstack("hypervisor list -f json"))
"hypervisor list -f json"
))
ids2 = [x["ID"] for x in cmd_output] ids2 = [x["ID"] for x in cmd_output]
self.assertIsNotNone(cmd_output) self.assertIsNotNone(cmd_output)
# Show test - old microversion # Show test - old microversion
for i in ids1: for i in ids1:
cmd_output = json.loads(self.openstack( cmd_output = json.loads(
"hypervisor show %s -f json " self.openstack(
" --os-compute-api-version 2.1" "hypervisor show %s -f json "
% (i) " --os-compute-api-version 2.1" % (i)
)) )
)
self.assertIsNotNone(cmd_output) self.assertIsNotNone(cmd_output)
# When we list hypervisors with older MV we get ids as integers. We # When we list hypervisors with older MV we get ids as integers. We
# need to verify that show finds resources independently # need to verify that show finds resources independently
# Show test - latest microversion # Show test - latest microversion
for i in ids2: for i in ids2:
cmd_output = json.loads(self.openstack( cmd_output = json.loads(
"hypervisor show %s -f json" self.openstack("hypervisor show %s -f json" % (i))
% (i) )
))
self.assertIsNotNone(cmd_output) self.assertIsNotNone(cmd_output)

View File

@@ -68,8 +68,11 @@ class KeypairTests(KeypairBase):
1) Create keypair in setUp 1) Create keypair in setUp
2) Try to create duplicate keypair with the same name 2) Try to create duplicate keypair with the same name
""" """
self.assertRaises(exceptions.CommandFailed, self.assertRaises(
self.openstack, 'keypair create ' + self.KPName) exceptions.CommandFailed,
self.openstack,
'keypair create ' + self.KPName,
)
def test_keypair_create_noname(self): def test_keypair_create_noname(self):
"""Try to create keypair without name. """Try to create keypair without name.
@@ -77,8 +80,9 @@ class KeypairTests(KeypairBase):
Test steps: Test steps:
1) Try to create keypair without a name 1) Try to create keypair without a name
""" """
self.assertRaises(exceptions.CommandFailed, self.assertRaises(
self.openstack, 'keypair create') exceptions.CommandFailed, self.openstack, 'keypair create'
)
def test_keypair_create_public_key(self): def test_keypair_create_public_key(self):
"""Test for create keypair with --public-key option. """Test for create keypair with --public-key option.
@@ -118,11 +122,13 @@ class KeypairTests(KeypairBase):
self.assertIsNotNone(cmd_output.get('fingerprint')) self.assertIsNotNone(cmd_output.get('fingerprint'))
pk_content = f.read() pk_content = f.read()
self.assertInOutput( self.assertInOutput(
'-----BEGIN OPENSSH PRIVATE KEY-----', pk_content, '-----BEGIN OPENSSH PRIVATE KEY-----',
pk_content,
) )
self.assertRegex(pk_content, "[0-9A-Za-z+/]+[=]{0,3}\n") self.assertRegex(pk_content, "[0-9A-Za-z+/]+[=]{0,3}\n")
self.assertInOutput( self.assertInOutput(
'-----END OPENSSH PRIVATE KEY-----', pk_content, '-----END OPENSSH PRIVATE KEY-----',
pk_content,
) )
def test_keypair_create(self): def test_keypair_create(self):
@@ -148,8 +154,11 @@ class KeypairTests(KeypairBase):
1) Create keypair in setUp 1) Create keypair in setUp
2) Try to delete not existing keypair 2) Try to delete not existing keypair
""" """
self.assertRaises(exceptions.CommandFailed, self.assertRaises(
self.openstack, 'keypair delete not_existing') exceptions.CommandFailed,
self.openstack,
'keypair delete not_existing',
)
def test_keypair_delete(self): def test_keypair_delete(self):
"""Test keypair delete command. """Test keypair delete command.

View File

@@ -52,16 +52,14 @@ class ServerTests(common.ComputeTestCase):
self.assertEqual("", raw_output) self.assertEqual("", raw_output)
self.wait_for_status(name2, "PAUSED") self.wait_for_status(name2, "PAUSED")
cmd_output = self.openstack( cmd_output = self.openstack(
'server list ' + 'server list ' + '--status ACTIVE',
'--status ACTIVE',
parse_output=True, parse_output=True,
) )
col_name = [x["Name"] for x in cmd_output] col_name = [x["Name"] for x in cmd_output]
self.assertIn(name1, col_name) self.assertIn(name1, col_name)
self.assertNotIn(name2, col_name) self.assertNotIn(name2, col_name)
cmd_output = self.openstack( cmd_output = self.openstack(
'server list ' + 'server list ' + '--status PAUSED',
'--status PAUSED',
parse_output=True, parse_output=True,
) )
col_name = [x["Name"] for x in cmd_output] col_name = [x["Name"] for x in cmd_output]
@@ -112,8 +110,9 @@ class ServerTests(common.ComputeTestCase):
parse_output=True, parse_output=True,
) )
except exceptions.CommandFailed as e: except exceptions.CommandFailed as e:
self.assertIn('marker [%s] not found' % (name2), self.assertIn(
e.stderr.decode('utf-8')) 'marker [%s] not found' % (name2), e.stderr.decode('utf-8')
)
def test_server_list_with_changes_before(self): def test_server_list_with_changes_before(self):
"""Test server list. """Test server list.
@@ -132,8 +131,7 @@ class ServerTests(common.ComputeTestCase):
server_name3 = cmd_output['name'] server_name3 = cmd_output['name']
cmd_output = self.openstack( cmd_output = self.openstack(
'--os-compute-api-version 2.66 ' + '--os-compute-api-version 2.66 ' + 'server list '
'server list '
'--changes-before ' + updated_at2, '--changes-before ' + updated_at2,
parse_output=True, parse_output=True,
) )
@@ -158,8 +156,7 @@ class ServerTests(common.ComputeTestCase):
server_name3 = cmd_output['name'] server_name3 = cmd_output['name']
cmd_output = self.openstack( cmd_output = self.openstack(
'server list ' 'server list ' '--changes-since ' + updated_at2,
'--changes-since ' + updated_at2,
parse_output=True, parse_output=True,
) )
@@ -184,10 +181,12 @@ class ServerTests(common.ComputeTestCase):
updated_at3 = cmd_output['updated'] updated_at3 = cmd_output['updated']
cmd_output = self.openstack( cmd_output = self.openstack(
'--os-compute-api-version 2.66 ' + '--os-compute-api-version 2.66 '
'server list ' + + 'server list '
'--changes-since ' + updated_at2 + + '--changes-since '
' --changes-before ' + updated_at3, + updated_at2
+ ' --changes-before '
+ updated_at3,
parse_output=True, parse_output=True,
) )
@@ -204,8 +203,7 @@ class ServerTests(common.ComputeTestCase):
# Have a look at some other fields # Have a look at some other fields
flavor = self.openstack( flavor = self.openstack(
'flavor show ' + 'flavor show ' + self.flavor_name,
self.flavor_name,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(
@@ -217,8 +215,7 @@ class ServerTests(common.ComputeTestCase):
cmd_output["flavor"], cmd_output["flavor"],
) )
image = self.openstack( image = self.openstack(
'image show ' + 'image show ' + self.image_name,
self.image_name,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(
@@ -232,15 +229,12 @@ class ServerTests(common.ComputeTestCase):
# Test properties set # Test properties set
raw_output = self.openstack( raw_output = self.openstack(
'server set ' + 'server set ' + '--property a=b --property c=d ' + name
'--property a=b --property c=d ' +
name
) )
self.assertOutput('', raw_output) self.assertOutput('', raw_output)
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + name,
name,
parse_output=True, parse_output=True,
) )
# Really, shouldn't this be a list? # Really, shouldn't this be a list?
@@ -249,14 +243,9 @@ class ServerTests(common.ComputeTestCase):
cmd_output['properties'], cmd_output['properties'],
) )
raw_output = self.openstack( raw_output = self.openstack('server unset ' + '--property a ' + name)
'server unset ' +
'--property a ' +
name
)
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + name,
name,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(
@@ -267,14 +256,11 @@ class ServerTests(common.ComputeTestCase):
# Test set --name # Test set --name
new_name = uuid.uuid4().hex new_name = uuid.uuid4().hex
raw_output = self.openstack( raw_output = self.openstack(
'server set ' + 'server set ' + '--name ' + new_name + ' ' + name
'--name ' + new_name + ' ' +
name
) )
self.assertOutput("", raw_output) self.assertOutput("", raw_output)
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + new_name,
new_name,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(
@@ -283,9 +269,7 @@ class ServerTests(common.ComputeTestCase):
) )
# Put it back so we clean up properly # Put it back so we clean up properly
raw_output = self.openstack( raw_output = self.openstack(
'server set ' + 'server set ' + '--name ' + name + ' ' + new_name
'--name ' + name + ' ' +
new_name
) )
self.assertOutput("", raw_output) self.assertOutput("", raw_output)
@@ -295,25 +279,25 @@ class ServerTests(common.ComputeTestCase):
name = cmd_output['name'] name = cmd_output['name']
# Simple show # Simple show
cmd_output = json.loads(self.openstack( cmd_output = json.loads(self.openstack(f'server show -f json {name}'))
f'server show -f json {name}'
))
self.assertEqual( self.assertEqual(
name, name,
cmd_output["name"], cmd_output["name"],
) )
# Show diagnostics # Show diagnostics
cmd_output = json.loads(self.openstack( cmd_output = json.loads(
f'server show -f json {name} --diagnostics' self.openstack(f'server show -f json {name} --diagnostics')
)) )
self.assertIn('driver', cmd_output) self.assertIn('driver', cmd_output)
# Show topology # Show topology
cmd_output = json.loads(self.openstack( cmd_output = json.loads(
f'server show -f json {name} --topology ' self.openstack(
f'--os-compute-api-version 2.78' f'server show -f json {name} --topology '
)) f'--os-compute-api-version 2.78'
)
)
self.assertIn('topology', cmd_output) self.assertIn('topology', cmd_output)
def test_server_actions(self): def test_server_actions(self):
@@ -358,8 +342,9 @@ class ServerTests(common.ComputeTestCase):
self.wait_for_status(name, "ACTIVE") self.wait_for_status(name, "ACTIVE")
# rescue with image # rescue with image
raw_output = self.openstack('server rescue --image ' + raw_output = self.openstack(
self.image_name + ' ' + name) 'server rescue --image ' + self.image_name + ' ' + name
)
self.assertEqual("", raw_output) self.assertEqual("", raw_output)
self.wait_for_status(name, "RESCUE") self.wait_for_status(name, "RESCUE")
@@ -403,8 +388,7 @@ class ServerTests(common.ComputeTestCase):
# attach ip # attach ip
cmd_output = self.openstack( cmd_output = self.openstack(
'floating ip create ' + 'floating ip create ' + 'public',
'public',
parse_output=True, parse_output=True,
) )
@@ -419,14 +403,11 @@ class ServerTests(common.ComputeTestCase):
self.assertNotEqual('', cmd_output['id']) self.assertNotEqual('', cmd_output['id'])
self.assertNotEqual('', floating_ip) self.assertNotEqual('', floating_ip)
self.addCleanup( self.addCleanup(
self.openstack, self.openstack, 'floating ip delete ' + str(cmd_output['id'])
'floating ip delete ' + str(cmd_output['id'])
) )
raw_output = self.openstack( raw_output = self.openstack(
'server add floating ip ' + 'server add floating ip ' + name + ' ' + floating_ip
name + ' ' +
floating_ip
) )
self.assertEqual("", raw_output) self.assertEqual("", raw_output)
@@ -436,8 +417,7 @@ class ServerTests(common.ComputeTestCase):
wait_time = 0 wait_time = 0
while wait_time < 60: while wait_time < 60:
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + name,
name,
parse_output=True, parse_output=True,
) )
if floating_ip not in _chain_addresses(cmd_output['addresses']): if floating_ip not in _chain_addresses(cmd_output['addresses']):
@@ -455,9 +435,7 @@ class ServerTests(common.ComputeTestCase):
# detach ip # detach ip
raw_output = self.openstack( raw_output = self.openstack(
'server remove floating ip ' + 'server remove floating ip ' + name + ' ' + floating_ip
name + ' ' +
floating_ip
) )
self.assertEqual("", raw_output) self.assertEqual("", raw_output)
@@ -467,8 +445,7 @@ class ServerTests(common.ComputeTestCase):
wait_time = 0 wait_time = 0
while wait_time < 60: while wait_time < 60:
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + name,
name,
parse_output=True, parse_output=True,
) )
if floating_ip in _chain_addresses(cmd_output['addresses']): if floating_ip in _chain_addresses(cmd_output['addresses']):
@@ -480,8 +457,7 @@ class ServerTests(common.ComputeTestCase):
break break
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + name,
name,
parse_output=True, parse_output=True,
) )
self.assertNotIn( self.assertNotIn(
@@ -506,8 +482,7 @@ class ServerTests(common.ComputeTestCase):
# get image size # get image size
cmd_output = self.openstack( cmd_output = self.openstack(
'image show ' + 'image show ' + self.image_name,
self.image_name,
parse_output=True, parse_output=True,
) )
try: try:
@@ -520,10 +495,14 @@ class ServerTests(common.ComputeTestCase):
# create volume from image # create volume from image
volume_name = uuid.uuid4().hex volume_name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'volume create ' + 'volume create '
'--image ' + self.image_name + ' ' + + '--image '
'--size ' + str(image_size) + ' ' + + self.image_name
volume_name, + ' '
+ '--size '
+ str(image_size)
+ ' '
+ volume_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(cmd_output["id"]) self.assertIsNotNone(cmd_output["id"])
@@ -537,9 +516,11 @@ class ServerTests(common.ComputeTestCase):
# create empty volume # create empty volume
empty_volume_name = uuid.uuid4().hex empty_volume_name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'volume create ' + 'volume create '
'--size ' + str(image_size) + ' ' + + '--size '
empty_volume_name, + str(image_size)
+ ' '
+ empty_volume_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(cmd_output["id"]) self.assertIsNotNone(cmd_output["id"])
@@ -553,13 +534,20 @@ class ServerTests(common.ComputeTestCase):
# create server # create server
server_name = uuid.uuid4().hex server_name = uuid.uuid4().hex
server = self.openstack( server = self.openstack(
'server create ' + 'server create '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--volume ' + volume_name + ' ' + + self.flavor_name
'--block-device-mapping vdb=' + empty_volume_name + ' ' + + ' '
self.network_arg + ' ' + + '--volume '
'--wait ' + + volume_name
server_name, + ' '
+ '--block-device-mapping vdb='
+ empty_volume_name
+ ' '
+ self.network_arg
+ ' '
+ '--wait '
+ server_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(server["id"]) self.assertIsNotNone(server["id"])
@@ -579,15 +567,11 @@ class ServerTests(common.ComputeTestCase):
'server list', 'server list',
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(v2_server.IMAGE_STRING_FOR_BFV, servers[0]['Image'])
v2_server.IMAGE_STRING_FOR_BFV,
servers[0]['Image']
)
# check volumes # check volumes
cmd_output = self.openstack( cmd_output = self.openstack(
'volume show ' + 'volume show ' + volume_name,
volume_name,
parse_output=True, parse_output=True,
) )
attachments = cmd_output['attachments'] attachments = cmd_output['attachments']
@@ -609,8 +593,7 @@ class ServerTests(common.ComputeTestCase):
# present on the command line. Now we should see the # present on the command line. Now we should see the
# attachment. # attachment.
cmd_output = self.openstack( cmd_output = self.openstack(
'volume show ' + 'volume show ' + empty_volume_name,
empty_volume_name,
parse_output=True, parse_output=True,
) )
attachments = cmd_output['attachments'] attachments = cmd_output['attachments']
@@ -635,9 +618,7 @@ class ServerTests(common.ComputeTestCase):
# create source empty volume # create source empty volume
volume_name = uuid.uuid4().hex volume_name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'volume create ' + 'volume create ' + '--size 1 ' + volume_name,
'--size 1 ' +
volume_name,
parse_output=True, parse_output=True,
) )
volume_id = cmd_output["id"] volume_id = cmd_output["id"]
@@ -658,13 +639,19 @@ class ServerTests(common.ComputeTestCase):
# create server # create server
server_name = uuid.uuid4().hex server_name = uuid.uuid4().hex
server = self.openstack( server = self.openstack(
'server create ' + 'server create '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
bdm_arg + ' ' + + ' '
self.network_arg + ' ' + + '--image '
'--wait ' + + self.image_name
server_name, + ' '
+ bdm_arg
+ ' '
+ self.network_arg
+ ' '
+ '--wait '
+ server_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(server["id"]) self.assertIsNotNone(server["id"])
@@ -677,8 +664,7 @@ class ServerTests(common.ComputeTestCase):
# check server volumes_attached, format is # check server volumes_attached, format is
# {"volumes_attached": "id='2518bc76-bf0b-476e-ad6b-571973745bb5'",} # {"volumes_attached": "id='2518bc76-bf0b-476e-ad6b-571973745bb5'",}
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + server_name,
server_name,
parse_output=True, parse_output=True,
) )
volumes_attached = cmd_output['volumes_attached'] volumes_attached = cmd_output['volumes_attached']
@@ -686,8 +672,7 @@ class ServerTests(common.ComputeTestCase):
# check volumes # check volumes
cmd_output = self.openstack( cmd_output = self.openstack(
'volume show ' + 'volume show ' + volume_name,
volume_name,
parse_output=True, parse_output=True,
) )
attachments = cmd_output['attachments'] attachments = cmd_output['attachments']
@@ -723,9 +708,7 @@ class ServerTests(common.ComputeTestCase):
# create source empty volume # create source empty volume
empty_volume_name = uuid.uuid4().hex empty_volume_name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'volume create ' + 'volume create ' + '--size 1 ' + empty_volume_name,
'--size 1 ' +
empty_volume_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(cmd_output["id"]) self.assertIsNotNone(cmd_output["id"])
@@ -736,9 +719,11 @@ class ServerTests(common.ComputeTestCase):
# create snapshot of source empty volume # create snapshot of source empty volume
empty_snapshot_name = uuid.uuid4().hex empty_snapshot_name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'volume snapshot create ' + 'volume snapshot create '
'--volume ' + empty_volume_name + ' ' + + '--volume '
empty_snapshot_name, + empty_volume_name
+ ' '
+ empty_snapshot_name,
parse_output=True, parse_output=True,
) )
empty_snapshot_id = cmd_output["id"] empty_snapshot_id = cmd_output["id"]
@@ -746,10 +731,12 @@ class ServerTests(common.ComputeTestCase):
# Deleting volume snapshot take time, so we need to wait until the # Deleting volume snapshot take time, so we need to wait until the
# snapshot goes. Entries registered by self.addCleanup will be called # snapshot goes. Entries registered by self.addCleanup will be called
# in the reverse order, so we need to register wait_for_delete first. # in the reverse order, so we need to register wait_for_delete first.
self.addCleanup(volume_wait_for_delete, self.addCleanup(
'volume snapshot', empty_snapshot_name) volume_wait_for_delete, 'volume snapshot', empty_snapshot_name
self.addCleanup(self.openstack, )
'volume snapshot delete ' + empty_snapshot_name) self.addCleanup(
self.openstack, 'volume snapshot delete ' + empty_snapshot_name
)
self.assertEqual( self.assertEqual(
empty_snapshot_name, empty_snapshot_name,
cmd_output['name'], cmd_output['name'],
@@ -772,13 +759,19 @@ class ServerTests(common.ComputeTestCase):
# create server with bdm snapshot # create server with bdm snapshot
server_name = uuid.uuid4().hex server_name = uuid.uuid4().hex
server = self.openstack( server = self.openstack(
'server create ' + 'server create '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
bdm_arg + ' ' + + ' '
self.network_arg + ' ' + + '--image '
'--wait ' + + self.image_name
server_name, + ' '
+ bdm_arg
+ ' '
+ self.network_arg
+ ' '
+ '--wait '
+ server_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(server["id"]) self.assertIsNotNone(server["id"])
@@ -791,8 +784,7 @@ class ServerTests(common.ComputeTestCase):
# check server volumes_attached, format is # check server volumes_attached, format is
# {"volumes_attached": "id='2518bc76-bf0b-476e-ad6b-571973745bb5'",} # {"volumes_attached": "id='2518bc76-bf0b-476e-ad6b-571973745bb5'",}
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + server_name,
server_name,
parse_output=True, parse_output=True,
) )
volumes_attached = cmd_output['volumes_attached'] volumes_attached = cmd_output['volumes_attached']
@@ -801,8 +793,7 @@ class ServerTests(common.ComputeTestCase):
# check the volume that attached on server # check the volume that attached on server
cmd_output = self.openstack( cmd_output = self.openstack(
'volume show ' + 'volume show ' + attached_volume_id,
attached_volume_id,
parse_output=True, parse_output=True,
) )
attachments = cmd_output['attachments'] attachments = cmd_output['attachments']
@@ -826,9 +817,11 @@ class ServerTests(common.ComputeTestCase):
'volume list', 'volume list',
parse_output=True, parse_output=True,
) )
target_volume = [each_volume target_volume = [
for each_volume in cmd_output each_volume
if each_volume['ID'] == attached_volume_id] for each_volume in cmd_output
if each_volume['ID'] == attached_volume_id
]
if target_volume: if target_volume:
# check the attached volume is 'deleting' status # check the attached volume is 'deleting' status
self.assertEqual('deleting', target_volume[0]['Status']) self.assertEqual('deleting', target_volume[0]['Status'])
@@ -865,8 +858,7 @@ class ServerTests(common.ComputeTestCase):
else: else:
# get image ID # get image ID
cmd_output = self.openstack( cmd_output = self.openstack(
'image show ' + 'image show ' + self.image_name,
self.image_name,
parse_output=True, parse_output=True,
) )
image_id = cmd_output['id'] image_id = cmd_output['id']
@@ -889,13 +881,19 @@ class ServerTests(common.ComputeTestCase):
# that volume to the server. # that volume to the server.
server_name = uuid.uuid4().hex server_name = uuid.uuid4().hex
server = self.openstack( server = self.openstack(
'server create ' + 'server create '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
bdm_arg + ' ' + + ' '
self.network_arg + ' ' + + '--image '
'--wait ' + + self.image_name
server_name, + ' '
+ bdm_arg
+ ' '
+ self.network_arg
+ ' '
+ '--wait '
+ server_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(server["id"]) self.assertIsNotNone(server["id"])
@@ -908,8 +906,7 @@ class ServerTests(common.ComputeTestCase):
# check server volumes_attached, format is # check server volumes_attached, format is
# {"volumes_attached": "id='2518bc76-bf0b-476e-ad6b-571973745bb5'",} # {"volumes_attached": "id='2518bc76-bf0b-476e-ad6b-571973745bb5'",}
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + server_name,
server_name,
parse_output=True, parse_output=True,
) )
volumes_attached = cmd_output['volumes_attached'] volumes_attached = cmd_output['volumes_attached']
@@ -918,8 +915,7 @@ class ServerTests(common.ComputeTestCase):
# check the volume that attached on server # check the volume that attached on server
cmd_output = self.openstack( cmd_output = self.openstack(
'volume show ' + 'volume show ' + attached_volume_id,
attached_volume_id,
parse_output=True, parse_output=True,
) )
attachments = cmd_output['attachments'] attachments = cmd_output['attachments']
@@ -950,9 +946,11 @@ class ServerTests(common.ComputeTestCase):
'volume list', 'volume list',
parse_output=True, parse_output=True,
) )
target_volume = [each_volume target_volume = [
for each_volume in cmd_output each_volume
if each_volume['ID'] == attached_volume_id] for each_volume in cmd_output
if each_volume['ID'] == attached_volume_id
]
if target_volume: if target_volume:
# check the attached volume is 'deleting' status # check the attached volume is 'deleting' status
self.assertEqual('deleting', target_volume[0]['Status']) self.assertEqual('deleting', target_volume[0]['Status'])
@@ -975,13 +973,18 @@ class ServerTests(common.ComputeTestCase):
# and not delete the volume when the server is deleted. # and not delete the volume when the server is deleted.
server_name = uuid.uuid4().hex server_name = uuid.uuid4().hex
server = self.openstack( server = self.openstack(
'server create ' + 'server create '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
'--boot-from-volume 1 ' + # create a 1GB volume from the image + ' '
self.network_arg + ' ' + + '--image '
'--wait ' + + self.image_name
server_name, + ' '
+ '--boot-from-volume 1 '
+ self.network_arg # create a 1GB volume from the image
+ ' '
+ '--wait '
+ server_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(server["id"]) self.assertIsNotNone(server["id"])
@@ -994,8 +997,7 @@ class ServerTests(common.ComputeTestCase):
# check server volumes_attached, format is # check server volumes_attached, format is
# {"volumes_attached": "id='2518bc76-bf0b-476e-ad6b-571973745bb5'",} # {"volumes_attached": "id='2518bc76-bf0b-476e-ad6b-571973745bb5'",}
cmd_output = self.openstack( cmd_output = self.openstack(
'server show ' + 'server show ' + server_name,
server_name,
parse_output=True, parse_output=True,
) )
volumes_attached = cmd_output['volumes_attached'] volumes_attached = cmd_output['volumes_attached']
@@ -1012,8 +1014,7 @@ class ServerTests(common.ComputeTestCase):
# check the volume that attached on server # check the volume that attached on server
cmd_output = self.openstack( cmd_output = self.openstack(
'volume show ' + 'volume show ' + volumes_attached[0]["id"],
volumes_attached[0]["id"],
parse_output=True, parse_output=True,
) )
# The volume size should be what we specified on the command line. # The volume size should be what we specified on the command line.
@@ -1043,8 +1044,7 @@ class ServerTests(common.ComputeTestCase):
# delete server, then check the attached volume was not deleted # delete server, then check the attached volume was not deleted
self.openstack('server delete --wait ' + server_name) self.openstack('server delete --wait ' + server_name)
cmd_output = self.openstack( cmd_output = self.openstack(
'volume show ' + 'volume show ' + attached_volume_id,
attached_volume_id,
parse_output=True, parse_output=True,
) )
# check the volume is in 'available' status # check the volume is in 'available' status
@@ -1055,12 +1055,16 @@ class ServerTests(common.ComputeTestCase):
server_name = uuid.uuid4().hex server_name = uuid.uuid4().hex
server = self.openstack( server = self.openstack(
# auto/none enable in nova micro version (v2.37+) # auto/none enable in nova micro version (v2.37+)
'--os-compute-api-version 2.37 ' + '--os-compute-api-version 2.37 '
'server create ' + + 'server create '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
'--nic none ' + + ' '
server_name, + '--image '
+ self.image_name
+ ' '
+ '--nic none '
+ server_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(server["id"]) self.assertIsNotNone(server["id"])
@@ -1099,14 +1103,24 @@ class ServerTests(common.ComputeTestCase):
server_name = uuid.uuid4().hex server_name = uuid.uuid4().hex
server = self.openstack( server = self.openstack(
'server create ' + 'server create '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
+ ' '
+ '--image '
+ self.image_name
+ ' '
+
# Security group id is integer in nova-network, convert to string # Security group id is integer in nova-network, convert to string
'--security-group ' + str(security_group1['id']) + ' ' + '--security-group '
'--security-group ' + security_group2['name'] + ' ' + + str(security_group1['id'])
self.network_arg + ' ' + + ' '
server_name, + '--security-group '
+ security_group2['name']
+ ' '
+ self.network_arg
+ ' '
+ server_name,
parse_output=True, parse_output=True,
) )
self.addCleanup(self.openstack, 'server delete --wait ' + server_name) self.addCleanup(self.openstack, 'server delete --wait ' + server_name)
@@ -1136,29 +1150,38 @@ class ServerTests(common.ComputeTestCase):
try: try:
self.openstack( self.openstack(
# auto/none enable in nova micro version (v2.37+) # auto/none enable in nova micro version (v2.37+)
'--os-compute-api-version 2.37 ' + '--os-compute-api-version 2.37 '
'server create ' + + 'server create '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
server_name + ' '
+ '--image '
+ self.image_name
+ ' '
+ server_name
) )
except exceptions.CommandFailed as e: except exceptions.CommandFailed as e:
# If we got here, it shouldn't be because a nics value wasn't # If we got here, it shouldn't be because a nics value wasn't
# provided to the server; it is likely due to something else in # provided to the server; it is likely due to something else in
# the functional tests like there being multiple available # the functional tests like there being multiple available
# networks and the test didn't specify a specific network. # networks and the test didn't specify a specific network.
self.assertNotIn('nics are required after microversion 2.36', self.assertNotIn(
e.stderr) 'nics are required after microversion 2.36', e.stderr
)
def test_server_add_remove_network(self): def test_server_add_remove_network(self):
name = uuid.uuid4().hex name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'server create ' + 'server create '
'--network private ' + + '--network private '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
'--wait ' + + ' '
name, + '--image '
+ self.image_name
+ ' '
+ '--wait '
+ name,
parse_output=True, parse_output=True,
) )
@@ -1167,8 +1190,7 @@ class ServerTests(common.ComputeTestCase):
self.addCleanup(self.openstack, 'server delete --wait ' + name) self.addCleanup(self.openstack, 'server delete --wait ' + name)
# add network and check 'public' is in server show # add network and check 'public' is in server show
self.openstack( self.openstack('server add network ' + name + ' public')
'server add network ' + name + ' public')
wait_time = 0 wait_time = 0
while wait_time < 60: while wait_time < 60:
@@ -1209,12 +1231,16 @@ class ServerTests(common.ComputeTestCase):
def test_server_add_remove_port(self): def test_server_add_remove_port(self):
name = uuid.uuid4().hex name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'server create ' + 'server create '
'--network private ' + + '--network private '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
'--wait ' + + ' '
name, + '--image '
+ self.image_name
+ ' '
+ '--wait '
+ name,
parse_output=True, parse_output=True,
) )
@@ -1232,8 +1258,7 @@ class ServerTests(common.ComputeTestCase):
self.assertNotIn(port_name, cmd_output) self.assertNotIn(port_name, cmd_output)
cmd_output = self.openstack( cmd_output = self.openstack(
'port create ' + 'port create ' + '--network private ' + port_name,
'--network private ' + port_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(cmd_output['id']) self.assertIsNotNone(cmd_output['id'])
@@ -1281,12 +1306,16 @@ class ServerTests(common.ComputeTestCase):
def test_server_add_fixed_ip(self): def test_server_add_fixed_ip(self):
name = uuid.uuid4().hex name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'server create ' + 'server create '
'--network private ' + + '--network private '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
'--wait ' + + ' '
name, + '--image '
+ self.image_name
+ ' '
+ '--wait '
+ name,
parse_output=True, parse_output=True,
) )
@@ -1306,8 +1335,7 @@ class ServerTests(common.ComputeTestCase):
self.assertNotIn(port_name, cmd_output) self.assertNotIn(port_name, cmd_output)
cmd_output = self.openstack( cmd_output = self.openstack(
'port create ' + 'port create ' + '--network private ' + port_name,
'--network private ' + port_name,
parse_output=True, parse_output=True,
) )
self.assertIsNotNone(cmd_output['id']) self.assertIsNotNone(cmd_output['id'])
@@ -1315,8 +1343,13 @@ class ServerTests(common.ComputeTestCase):
self.openstack('port delete ' + port_name) self.openstack('port delete ' + port_name)
# add fixed ip to server, assert the ip address appears # add fixed ip to server, assert the ip address appears
self.openstack('server add fixed ip --fixed-ip-address ' + ip_address + self.openstack(
' ' + name + ' private') 'server add fixed ip --fixed-ip-address '
+ ip_address
+ ' '
+ name
+ ' private'
)
wait_time = 0 wait_time = 0
while wait_time < 60: while wait_time < 60:
@@ -1339,12 +1372,16 @@ class ServerTests(common.ComputeTestCase):
server_name = uuid.uuid4().hex server_name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'server create ' + 'server create '
'--network private ' + + '--network private '
'--flavor ' + self.flavor_name + ' ' + + '--flavor '
'--image ' + self.image_name + ' ' + + self.flavor_name
'--wait ' + + ' '
server_name, + '--image '
+ self.image_name
+ ' '
+ '--wait '
+ server_name,
parse_output=True, parse_output=True,
) )
@@ -1355,9 +1392,7 @@ class ServerTests(common.ComputeTestCase):
volume_name = uuid.uuid4().hex volume_name = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'volume create ' + 'volume create ' + '--size 1 ' + volume_name,
'--size 1 ' +
volume_name,
parse_output=True, parse_output=True,
) )
@@ -1368,10 +1403,12 @@ class ServerTests(common.ComputeTestCase):
volume_id = cmd_output['id'] volume_id = cmd_output['id']
cmd_output = self.openstack( cmd_output = self.openstack(
'server add volume ' + 'server add volume '
server_name + ' ' + + server_name
volume_name + ' ' + + ' '
'--tag bar', + volume_name
+ ' '
+ '--tag bar',
parse_output=True, parse_output=True,
) )
@@ -1379,8 +1416,7 @@ class ServerTests(common.ComputeTestCase):
self.assertEqual(volume_id, cmd_output['Volume ID']) self.assertEqual(volume_id, cmd_output['Volume ID'])
cmd_output = self.openstack( cmd_output = self.openstack(
'server volume list ' + 'server volume list ' + server_name,
server_name,
parse_output=True, parse_output=True,
) )
@@ -1390,8 +1426,7 @@ class ServerTests(common.ComputeTestCase):
volume_wait_for('volume', volume_name, 'in-use') volume_wait_for('volume', volume_name, 'in-use')
cmd_output = self.openstack( cmd_output = self.openstack(
'server event list ' + 'server event list ' + server_name,
server_name,
parse_output=True, parse_output=True,
) )
self.assertEqual(2, len(cmd_output)) self.assertEqual(2, len(cmd_output))
@@ -1403,8 +1438,7 @@ class ServerTests(common.ComputeTestCase):
volume_wait_for('volume', volume_name, 'available') volume_wait_for('volume', volume_name, 'available')
cmd_output = self.openstack( cmd_output = self.openstack(
'server event list ' + 'server event list ' + server_name,
server_name,
parse_output=True, parse_output=True,
) )
self.assertEqual(3, len(cmd_output)) self.assertEqual(3, len(cmd_output))

View File

@@ -93,8 +93,7 @@ class ServerEventTests(common.ComputeTestCase):
# And verify we can get the event list after it's deleted # And verify we can get the event list after it's deleted
# Test 'server event list' for deleting # Test 'server event list' for deleting
cmd_output = self.openstack( cmd_output = self.openstack(
'--os-compute-api-version 2.21 ' '--os-compute-api-version 2.21 ' 'server event list ' + server_id,
'server event list ' + server_id,
parse_output=True, parse_output=True,
) )
request_id = None request_id = None

View File

@@ -23,37 +23,22 @@ class ServerGroupTests(base.TestCase):
name1 = uuid.uuid4().hex name1 = uuid.uuid4().hex
name2 = uuid.uuid4().hex name2 = uuid.uuid4().hex
cmd_output = self.openstack( cmd_output = self.openstack(
'server group create ' + 'server group create ' + '--policy affinity ' + name1,
'--policy affinity ' +
name1,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(name1, cmd_output['name'])
name1, self.assertEqual('affinity', cmd_output['policy'])
cmd_output['name']
)
self.assertEqual(
'affinity',
cmd_output['policy']
)
cmd_output = self.openstack( cmd_output = self.openstack(
'server group create ' + 'server group create ' + '--policy anti-affinity ' + name2,
'--policy anti-affinity ' +
name2,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(name2, cmd_output['name'])
name2, self.assertEqual('anti-affinity', cmd_output['policy'])
cmd_output['name']
)
self.assertEqual(
'anti-affinity',
cmd_output['policy']
)
del_output = self.openstack( del_output = self.openstack(
'server group delete ' + name1 + ' ' + name2) 'server group delete ' + name1 + ' ' + name2
)
self.assertOutput('', del_output) self.assertOutput('', del_output)
def test_server_group_show_and_list(self): def test_server_group_show_and_list(self):
@@ -63,9 +48,7 @@ class ServerGroupTests(base.TestCase):
# test server group show # test server group show
cmd_output = self.openstack( cmd_output = self.openstack(
'server group create ' + 'server group create ' + '--policy affinity ' + name1,
'--policy affinity ' +
name1,
parse_output=True, parse_output=True,
) )
self.addCleanup(self.openstack, 'server group delete ' + name1) self.addCleanup(self.openstack, 'server group delete ' + name1)
@@ -73,19 +56,11 @@ class ServerGroupTests(base.TestCase):
'server group show ' + name1, 'server group show ' + name1,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(name1, cmd_output['name'])
name1, self.assertEqual('affinity', cmd_output['policy'])
cmd_output['name']
)
self.assertEqual(
'affinity',
cmd_output['policy']
)
cmd_output = self.openstack( cmd_output = self.openstack(
'server group create ' + 'server group create ' + '--policy anti-affinity ' + name2,
'--policy anti-affinity ' +
name2,
parse_output=True, parse_output=True,
) )
self.addCleanup(self.openstack, 'server group delete ' + name2) self.addCleanup(self.openstack, 'server group delete ' + name2)
@@ -93,14 +68,8 @@ class ServerGroupTests(base.TestCase):
'server group show ' + name2, 'server group show ' + name2,
parse_output=True, parse_output=True,
) )
self.assertEqual( self.assertEqual(name2, cmd_output['name'])
name2, self.assertEqual('anti-affinity', cmd_output['policy'])
cmd_output['name']
)
self.assertEqual(
'anti-affinity',
cmd_output['policy']
)
# test server group list # test server group list
cmd_output = self.openstack( cmd_output = self.openstack(

View File

@@ -68,7 +68,7 @@ QUOTA = {
'secgroup_rules': secgroup_rule_num, 'secgroup_rules': secgroup_rule_num,
'secgroups': secgroup_num, 'secgroups': secgroup_num,
'server-groups': servgroup_num, 'server-groups': servgroup_num,
'server-group-members': servgroup_members_num 'server-group-members': servgroup_members_num,
} }
QUOTA_columns = tuple(sorted(QUOTA)) QUOTA_columns = tuple(sorted(QUOTA))
@@ -98,15 +98,15 @@ class FakeAggregate(object):
"metadata": { "metadata": {
"availability_zone": "ag_zone", "availability_zone": "ag_zone",
"key1": "value1", "key1": "value1",
} },
} }
# Overwrite default attributes. # Overwrite default attributes.
aggregate_info.update(attrs) aggregate_info.update(attrs)
aggregate = fakes.FakeResource( aggregate = fakes.FakeResource(
info=copy.deepcopy(aggregate_info), info=copy.deepcopy(aggregate_info), loaded=True
loaded=True) )
return aggregate return aggregate
@staticmethod @staticmethod
@@ -147,7 +147,6 @@ class FakeAggregate(object):
class FakeComputev2Client(object): class FakeComputev2Client(object):
def __init__(self, **kwargs): def __init__(self, **kwargs):
self.agents = mock.Mock() self.agents = mock.Mock()
self.agents.resource_class = fakes.FakeResource(None, {}) self.agents.resource_class = fakes.FakeResource(None, {})
@@ -222,7 +221,6 @@ class FakeComputev2Client(object):
class TestComputev2(utils.TestCommand): class TestComputev2(utils.TestCommand):
def setUp(self): def setUp(self):
super(TestComputev2, self).setUp() super(TestComputev2, self).setUp()
@@ -286,8 +284,7 @@ class FakeAgent(object):
# Overwrite default attributes. # Overwrite default attributes.
agent_info.update(attrs) agent_info.update(attrs)
agent = fakes.FakeResource(info=copy.deepcopy(agent_info), agent = fakes.FakeResource(info=copy.deepcopy(agent_info), loaded=True)
loaded=True)
return agent return agent
@staticmethod @staticmethod
@@ -326,21 +323,24 @@ class FakeExtension(object):
extension_info = { extension_info = {
'name': 'name-' + uuid.uuid4().hex, 'name': 'name-' + uuid.uuid4().hex,
'namespace': ( 'namespace': (
'http://docs.openstack.org/compute/ext/multinic/api/v1.1'), 'http://docs.openstack.org/compute/ext/multinic/api/v1.1'
),
'description': 'description-' + uuid.uuid4().hex, 'description': 'description-' + uuid.uuid4().hex,
'updated': '2014-01-07T12:00:0-00:00', 'updated': '2014-01-07T12:00:0-00:00',
'alias': 'NMN', 'alias': 'NMN',
'links': ('[{"href":' 'links': (
'"https://github.com/openstack/compute-api", "type":' '[{"href":'
' "text/html", "rel": "describedby"}]') '"https://github.com/openstack/compute-api", "type":'
' "text/html", "rel": "describedby"}]'
),
} }
# Overwrite default attributes. # Overwrite default attributes.
extension_info.update(attrs) extension_info.update(attrs)
extension = fakes.FakeResource( extension = fakes.FakeResource(
info=copy.deepcopy(extension_info), info=copy.deepcopy(extension_info), loaded=True
loaded=True) )
return extension return extension
@@ -385,7 +385,8 @@ class FakeSecurityGroup(object):
security_groups = [] security_groups = []
for i in range(0, count): for i in range(0, count):
security_groups.append( security_groups.append(
FakeSecurityGroup.create_one_security_group(attrs)) FakeSecurityGroup.create_one_security_group(attrs)
)
return security_groups return security_groups
@@ -453,7 +454,8 @@ class FakeSecurityGroupRule(object):
security_group_rules = [] security_group_rules = []
for i in range(0, count): for i in range(0, count):
security_group_rules.append( security_group_rules.append(
FakeSecurityGroupRule.create_one_security_group_rule(attrs)) FakeSecurityGroupRule.create_one_security_group_rule(attrs)
)
return security_group_rules return security_group_rules
@@ -492,9 +494,9 @@ class FakeServer(object):
# Overwrite default attributes. # Overwrite default attributes.
server_info.update(attrs) server_info.update(attrs)
server = fakes.FakeResource(info=copy.deepcopy(server_info), server = fakes.FakeResource(
methods=methods, info=copy.deepcopy(server_info), methods=methods, loaded=True
loaded=True) )
return server return server
@staticmethod @staticmethod
@@ -611,13 +613,15 @@ def create_one_server_action(attrs=None):
"action": "create", "action": "create",
"message": None, "message": None,
"project_id": "project-id-" + uuid.uuid4().hex, "project_id": "project-id-" + uuid.uuid4().hex,
"events": [{ "events": [
"finish_time": "2017-02-27T07:47:25.000000", {
"start_time": "2017-02-27T07:47:15.000000", "finish_time": "2017-02-27T07:47:25.000000",
"traceback": None, "start_time": "2017-02-27T07:47:15.000000",
"event": "compute__do_build_and_run_instance", "traceback": None,
"result": "Success" "event": "compute__do_build_and_run_instance",
}] "result": "Success",
}
],
} }
# Overwrite default attributes # Overwrite default attributes
server_action_info.update(attrs) server_action_info.update(attrs)
@@ -784,7 +788,8 @@ class FakeFlavorAccess(object):
flavor_access_info.update(attrs) flavor_access_info.update(attrs)
flavor_access = fakes.FakeResource( flavor_access = fakes.FakeResource(
info=copy.deepcopy(flavor_access_info), loaded=True) info=copy.deepcopy(flavor_access_info), loaded=True
)
return flavor_access return flavor_access
@@ -809,14 +814,15 @@ class FakeKeypair(object):
'type': 'ssh', 'type': 'ssh',
'fingerprint': 'dummy', 'fingerprint': 'dummy',
'public_key': 'dummy', 'public_key': 'dummy',
'user_id': 'user' 'user_id': 'user',
} }
# Overwrite default attributes. # Overwrite default attributes.
keypair_info.update(attrs) keypair_info.update(attrs)
keypair = fakes.FakeResource(info=copy.deepcopy(keypair_info), keypair = fakes.FakeResource(
loaded=True) info=copy.deepcopy(keypair_info), loaded=True
)
return keypair return keypair
@@ -879,19 +885,23 @@ class FakeAvailabilityZone(object):
availability_zone = { availability_zone = {
'zoneName': uuid.uuid4().hex, 'zoneName': uuid.uuid4().hex,
'zoneState': {'available': True}, 'zoneState': {'available': True},
'hosts': {host_name: {service_name: { 'hosts': {
'available': True, host_name: {
'active': True, service_name: {
'updated_at': service_updated_at, 'available': True,
}}}, 'active': True,
'updated_at': service_updated_at,
}
}
},
} }
# Overwrite default attributes. # Overwrite default attributes.
availability_zone.update(attrs) availability_zone.update(attrs)
availability_zone = fakes.FakeResource( availability_zone = fakes.FakeResource(
info=copy.deepcopy(availability_zone), info=copy.deepcopy(availability_zone), loaded=True
loaded=True) )
return availability_zone return availability_zone
@staticmethod @staticmethod
@@ -907,8 +917,9 @@ class FakeAvailabilityZone(object):
""" """
availability_zones = [] availability_zones = []
for i in range(0, count): for i in range(0, count):
availability_zone = \ availability_zone = (
FakeAvailabilityZone.create_one_availability_zone(attrs) FakeAvailabilityZone.create_one_availability_zone(attrs)
)
availability_zones.append(availability_zone) availability_zones.append(availability_zone)
return availability_zones return availability_zones
@@ -1200,16 +1211,15 @@ class FakeUsage(object):
'instance_id': uuid.uuid4().hex, 'instance_id': uuid.uuid4().hex,
'state': 'active', 'state': 'active',
'uptime': 3600, 'uptime': 3600,
'vcpus': 1 'vcpus': 1,
} }
] ],
} }
# Overwrite default attributes. # Overwrite default attributes.
usage_info.update(attrs) usage_info.update(attrs)
usage = fakes.FakeResource(info=copy.deepcopy(usage_info), usage = fakes.FakeResource(info=copy.deepcopy(usage_info), loaded=True)
loaded=True)
return usage return usage
@@ -1252,13 +1262,13 @@ class FakeQuota(object):
'metadata_items': 10, 'metadata_items': 10,
'ram': 51200, 'ram': 51200,
'server_groups': 10, 'server_groups': 10,
'server_group_members': 10 'server_group_members': 10,
} }
quota_attrs.update(attrs) quota_attrs.update(attrs)
quota = fakes.FakeResource( quota = fakes.FakeResource(
info=copy.deepcopy(quota_attrs), info=copy.deepcopy(quota_attrs), loaded=True
loaded=True) )
quota.project_id = quota_attrs['id'] quota.project_id = quota_attrs['id']
@@ -1282,13 +1292,13 @@ class FakeQuota(object):
'metadata_items': 10, 'metadata_items': 10,
'ram': 51200, 'ram': 51200,
'server_groups': 10, 'server_groups': 10,
'server_group_members': 10 'server_group_members': 10,
} }
quota_attrs.update(attrs) quota_attrs.update(attrs)
quota = fakes.FakeResource( quota = fakes.FakeResource(
info=copy.deepcopy(quota_attrs), info=copy.deepcopy(quota_attrs), loaded=True
loaded=True) )
quota.project_id = quota_attrs['id'] quota.project_id = quota_attrs['id']
@@ -1306,21 +1316,27 @@ class FakeQuota(object):
'fixed_ips': {'reserved': 0, 'in_use': 0, 'limit': 30}, 'fixed_ips': {'reserved': 0, 'in_use': 0, 'limit': 30},
'injected_files': {'reserved': 0, 'in_use': 0, 'limit': 100}, 'injected_files': {'reserved': 0, 'in_use': 0, 'limit': 100},
'injected_file_content_bytes': { 'injected_file_content_bytes': {
'reserved': 0, 'in_use': 0, 'limit': 10240}, 'reserved': 0,
'in_use': 0,
'limit': 10240,
},
'injected_file_path_bytes': { 'injected_file_path_bytes': {
'reserved': 0, 'in_use': 0, 'limit': 255}, 'reserved': 0,
'in_use': 0,
'limit': 255,
},
'instances': {'reserved': 0, 'in_use': 0, 'limit': 50}, 'instances': {'reserved': 0, 'in_use': 0, 'limit': 50},
'key_pairs': {'reserved': 0, 'in_use': 0, 'limit': 20}, 'key_pairs': {'reserved': 0, 'in_use': 0, 'limit': 20},
'metadata_items': {'reserved': 0, 'in_use': 0, 'limit': 10}, 'metadata_items': {'reserved': 0, 'in_use': 0, 'limit': 10},
'ram': {'reserved': 0, 'in_use': 0, 'limit': 51200}, 'ram': {'reserved': 0, 'in_use': 0, 'limit': 51200},
'server_groups': {'reserved': 0, 'in_use': 0, 'limit': 10}, 'server_groups': {'reserved': 0, 'in_use': 0, 'limit': 10},
'server_group_members': {'reserved': 0, 'in_use': 0, 'limit': 10} 'server_group_members': {'reserved': 0, 'in_use': 0, 'limit': 10},
} }
quota_attrs.update(attrs) quota_attrs.update(attrs)
quota = fakes.FakeResource( quota = fakes.FakeResource(
info=copy.deepcopy(quota_attrs), info=copy.deepcopy(quota_attrs), loaded=True
loaded=True) )
quota.project_id = quota_attrs['id'] quota.project_id = quota_attrs['id']
@@ -1355,41 +1371,43 @@ class FakeLimits(object):
absolute_attrs = absolute_attrs or {} absolute_attrs = absolute_attrs or {}
self.absolute_limits_attrs.update(absolute_attrs) self.absolute_limits_attrs.update(absolute_attrs)
self.rate_limits_attrs = [{ self.rate_limits_attrs = [
"uri": "*", {
"limit": [ "uri": "*",
{ "limit": [
"value": 10, {
"verb": "POST", "value": 10,
"remaining": 2, "verb": "POST",
"unit": "MINUTE", "remaining": 2,
"next-available": "2011-12-15T22:42:45Z" "unit": "MINUTE",
}, "next-available": "2011-12-15T22:42:45Z",
{ },
"value": 10, {
"verb": "PUT", "value": 10,
"remaining": 2, "verb": "PUT",
"unit": "MINUTE", "remaining": 2,
"next-available": "2011-12-15T22:42:45Z" "unit": "MINUTE",
}, "next-available": "2011-12-15T22:42:45Z",
{ },
"value": 100, {
"verb": "DELETE", "value": 100,
"remaining": 100, "verb": "DELETE",
"unit": "MINUTE", "remaining": 100,
"next-available": "2011-12-15T22:42:45Z" "unit": "MINUTE",
} "next-available": "2011-12-15T22:42:45Z",
] },
}] ],
}
]
@property @property
def absolute(self): def absolute(self):
for (name, value) in self.absolute_limits_attrs.items(): for name, value in self.absolute_limits_attrs.items():
yield FakeAbsoluteLimit(name, value) yield FakeAbsoluteLimit(name, value)
def absolute_limits(self): def absolute_limits(self):
reference_data = [] reference_data = []
for (name, value) in self.absolute_limits_attrs.items(): for name, value in self.absolute_limits_attrs.items():
reference_data.append((name, value)) reference_data.append((name, value))
return reference_data return reference_data
@@ -1398,18 +1416,30 @@ class FakeLimits(object):
for group in self.rate_limits_attrs: for group in self.rate_limits_attrs:
uri = group['uri'] uri = group['uri']
for rate in group['limit']: for rate in group['limit']:
yield FakeRateLimit(rate['verb'], uri, rate['value'], yield FakeRateLimit(
rate['remaining'], rate['unit'], rate['verb'],
rate['next-available']) uri,
rate['value'],
rate['remaining'],
rate['unit'],
rate['next-available'],
)
def rate_limits(self): def rate_limits(self):
reference_data = [] reference_data = []
for group in self.rate_limits_attrs: for group in self.rate_limits_attrs:
uri = group['uri'] uri = group['uri']
for rate in group['limit']: for rate in group['limit']:
reference_data.append((rate['verb'], uri, rate['value'], reference_data.append(
rate['remaining'], rate['unit'], (
rate['next-available'])) rate['verb'],
uri,
rate['value'],
rate['remaining'],
rate['unit'],
rate['next-available'],
)
)
return reference_data return reference_data
@@ -1424,8 +1454,7 @@ class FakeAbsoluteLimit(object):
class FakeRateLimit(object): class FakeRateLimit(object):
"""Data model that represents a flattened view of a single rate limit""" """Data model that represents a flattened view of a single rate limit"""
def __init__(self, verb, uri, value, remain, def __init__(self, verb, uri, value, remain, unit, next_available):
unit, next_available):
self.verb = verb self.verb = verb
self.uri = uri self.uri = uri
self.value = value self.value = value
@@ -1534,8 +1563,7 @@ def create_server_migrations(attrs=None, methods=None, count=2):
""" """
migrations = [] migrations = []
for i in range(0, count): for i in range(0, count):
migrations.append( migrations.append(create_one_server_migration(attrs, methods))
create_one_server_migration(attrs, methods))
return migrations return migrations

View File

@@ -24,7 +24,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestAgent(compute_fakes.TestComputev2): class TestAgent(compute_fakes.TestComputev2):
attr = {} attr = {}
attr['agent_id'] = 1 attr['agent_id'] = 1
fake_agent = compute_fakes.FakeAgent.create_one_agent(attr) fake_agent = compute_fakes.FakeAgent.create_one_agent(attr)
@@ -57,7 +56,6 @@ class TestAgent(compute_fakes.TestComputev2):
class TestAgentCreate(TestAgent): class TestAgentCreate(TestAgent):
def setUp(self): def setUp(self):
super(TestAgentCreate, self).setUp() super(TestAgentCreate, self).setUp()
@@ -84,19 +82,20 @@ class TestAgentCreate(TestAgent):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.agents_mock.create.assert_called_with(parsed_args.os, self.agents_mock.create.assert_called_with(
parsed_args.architecture, parsed_args.os,
parsed_args.version, parsed_args.architecture,
parsed_args.url, parsed_args.version,
parsed_args.md5hash, parsed_args.url,
parsed_args.hypervisor) parsed_args.md5hash,
parsed_args.hypervisor,
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
class TestAgentDelete(TestAgent): class TestAgentDelete(TestAgent):
fake_agents = compute_fakes.FakeAgent.create_agents(count=2) fake_agents = compute_fakes.FakeAgent.create_agents(count=2)
def setUp(self): def setUp(self):
@@ -106,9 +105,7 @@ class TestAgentDelete(TestAgent):
self.cmd = agent.DeleteAgent(self.app, None) self.cmd = agent.DeleteAgent(self.app, None)
def test_delete_one_agent(self): def test_delete_one_agent(self):
arglist = [ arglist = [self.fake_agents[0].agent_id]
self.fake_agents[0].agent_id
]
verifylist = [ verifylist = [
('id', [self.fake_agents[0].agent_id]), ('id', [self.fake_agents[0].agent_id]),
@@ -117,7 +114,8 @@ class TestAgentDelete(TestAgent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.agents_mock.delete.assert_called_with( self.agents_mock.delete.assert_called_with(
self.fake_agents[0].agent_id) self.fake_agents[0].agent_id
)
self.assertIsNone(result) self.assertIsNone(result)
def test_delete_multiple_agents(self): def test_delete_multiple_agents(self):
@@ -149,15 +147,12 @@ class TestAgentDelete(TestAgent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ret_delete = [ ret_delete = [None, None, exceptions.NotFound('404')]
None,
None,
exceptions.NotFound('404')
]
self.agents_mock.delete = mock.Mock(side_effect=ret_delete) self.agents_mock.delete = mock.Mock(side_effect=ret_delete)
self.assertRaises(exceptions.CommandError, self.cmd.take_action, self.assertRaises(
parsed_args) exceptions.CommandError, self.cmd.take_action, parsed_args
)
calls = [ calls = [
call(self.fake_agents[0].agent_id), call(self.fake_agents[0].agent_id),
call(self.fake_agents[1].agent_id), call(self.fake_agents[1].agent_id),
@@ -167,15 +162,16 @@ class TestAgentDelete(TestAgent):
def test_agent_delete_no_input(self): def test_agent_delete_no_input(self):
arglist = [] arglist = []
verifylist = None verifylist = None
self.assertRaises(tests_utils.ParserException, self.assertRaises(
self.check_parser, tests_utils.ParserException,
self.cmd, self.check_parser,
arglist, self.cmd,
verifylist) arglist,
verifylist,
)
class TestAgentList(TestAgent): class TestAgentList(TestAgent):
agents = compute_fakes.FakeAgent.create_agents(count=3) agents = compute_fakes.FakeAgent.create_agents(count=3)
list_columns = ( list_columns = (
"Agent ID", "Agent ID",
@@ -189,25 +185,25 @@ class TestAgentList(TestAgent):
list_data = [] list_data = []
for _agent in agents: for _agent in agents:
list_data.append(( list_data.append(
_agent.agent_id, (
_agent.hypervisor, _agent.agent_id,
_agent.os, _agent.hypervisor,
_agent.architecture, _agent.os,
_agent.version, _agent.architecture,
_agent.md5hash, _agent.version,
_agent.url, _agent.md5hash,
)) _agent.url,
)
)
def setUp(self): def setUp(self):
super(TestAgentList, self).setUp() super(TestAgentList, self).setUp()
self.agents_mock.list.return_value = self.agents self.agents_mock.list.return_value = self.agents
self.cmd = agent.ListAgent(self.app, None) self.cmd = agent.ListAgent(self.app, None)
def test_agent_list(self): def test_agent_list(self):
arglist = [] arglist = []
verifylist = [] verifylist = []
@@ -218,7 +214,6 @@ class TestAgentList(TestAgent):
self.assertEqual(self.list_data, list(data)) self.assertEqual(self.list_data, list(data))
def test_agent_list_with_hypervisor(self): def test_agent_list_with_hypervisor(self):
arglist = [ arglist = [
'--hypervisor', '--hypervisor',
'hypervisor', 'hypervisor',
@@ -235,7 +230,6 @@ class TestAgentList(TestAgent):
class TestAgentSet(TestAgent): class TestAgentSet(TestAgent):
def setUp(self): def setUp(self):
super(TestAgentSet, self).setUp() super(TestAgentSet, self).setUp()
@@ -253,16 +247,19 @@ class TestAgentSet(TestAgent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.agents_mock.update.assert_called_with(parsed_args.id, self.agents_mock.update.assert_called_with(
self.fake_agent.version, parsed_args.id,
self.fake_agent.url, self.fake_agent.version,
self.fake_agent.md5hash) self.fake_agent.url,
self.fake_agent.md5hash,
)
self.assertIsNone(result) self.assertIsNone(result)
def test_agent_set_version(self): def test_agent_set_version(self):
arglist = [ arglist = [
'1', '1',
'--agent-version', 'new-version', '--agent-version',
'new-version',
] ]
verifylist = [ verifylist = [
@@ -273,16 +270,19 @@ class TestAgentSet(TestAgent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.agents_mock.update.assert_called_with(parsed_args.id, self.agents_mock.update.assert_called_with(
parsed_args.version, parsed_args.id,
self.fake_agent.url, parsed_args.version,
self.fake_agent.md5hash) self.fake_agent.url,
self.fake_agent.md5hash,
)
self.assertIsNone(result) self.assertIsNone(result)
def test_agent_set_url(self): def test_agent_set_url(self):
arglist = [ arglist = [
'1', '1',
'--url', 'new-url', '--url',
'new-url',
] ]
verifylist = [ verifylist = [
@@ -293,16 +293,19 @@ class TestAgentSet(TestAgent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.agents_mock.update.assert_called_with(parsed_args.id, self.agents_mock.update.assert_called_with(
self.fake_agent.version, parsed_args.id,
parsed_args.url, self.fake_agent.version,
self.fake_agent.md5hash) parsed_args.url,
self.fake_agent.md5hash,
)
self.assertIsNone(result) self.assertIsNone(result)
def test_agent_set_md5hash(self): def test_agent_set_md5hash(self):
arglist = [ arglist = [
'1', '1',
'--md5hash', 'new-md5hash', '--md5hash',
'new-md5hash',
] ]
verifylist = [ verifylist = [
@@ -313,8 +316,10 @@ class TestAgentSet(TestAgent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.agents_mock.update.assert_called_with(parsed_args.id, self.agents_mock.update.assert_called_with(
self.fake_agent.version, parsed_args.id,
self.fake_agent.url, self.fake_agent.version,
parsed_args.md5hash) self.fake_agent.url,
parsed_args.md5hash,
)
self.assertIsNone(result) self.assertIsNone(result)

View File

@@ -27,7 +27,6 @@ from openstackclient.tests.unit.image.v2 import fakes as image_fakes
class TestAggregate(compute_fakes.TestComputev2): class TestAggregate(compute_fakes.TestComputev2):
fake_ag = compute_fakes.FakeAggregate.create_one_aggregate() fake_ag = compute_fakes.FakeAggregate.create_one_aggregate()
columns = ( columns = (
@@ -64,7 +63,6 @@ class TestAggregate(compute_fakes.TestComputev2):
class TestAggregateAddHost(TestAggregate): class TestAggregateAddHost(TestAggregate):
def setUp(self): def setUp(self):
super(TestAggregateAddHost, self).setUp() super(TestAggregateAddHost, self).setUp()
@@ -84,15 +82,16 @@ class TestAggregateAddHost(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.sdk_client.add_host_to_aggregate.assert_called_once_with( self.sdk_client.add_host_to_aggregate.assert_called_once_with(
self.fake_ag.id, parsed_args.host) self.fake_ag.id, parsed_args.host
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data) self.assertCountEqual(self.data, data)
class TestAggregateCreate(TestAggregate): class TestAggregateCreate(TestAggregate):
def setUp(self): def setUp(self):
super(TestAggregateCreate, self).setUp() super(TestAggregateCreate, self).setUp()
@@ -110,13 +109,15 @@ class TestAggregateCreate(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_aggregate.assert_called_once_with( self.sdk_client.create_aggregate.assert_called_once_with(
name=parsed_args.name) name=parsed_args.name
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data) self.assertCountEqual(self.data, data)
def test_aggregate_create_with_zone(self): def test_aggregate_create_with_zone(self):
arglist = [ arglist = [
'--zone', 'zone1', '--zone',
'zone1',
'ag1', 'ag1',
] ]
verifylist = [ verifylist = [
@@ -127,14 +128,17 @@ class TestAggregateCreate(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_aggregate.assert_called_once_with( self.sdk_client.create_aggregate.assert_called_once_with(
name=parsed_args.name, availability_zone=parsed_args.zone) name=parsed_args.name, availability_zone=parsed_args.zone
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data) self.assertCountEqual(self.data, data)
def test_aggregate_create_with_property(self): def test_aggregate_create_with_property(self):
arglist = [ arglist = [
'--property', 'key1=value1', '--property',
'--property', 'key2=value2', 'key1=value1',
'--property',
'key2=value2',
'ag1', 'ag1',
] ]
verifylist = [ verifylist = [
@@ -144,37 +148,39 @@ class TestAggregateCreate(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_aggregate.assert_called_once_with( self.sdk_client.create_aggregate.assert_called_once_with(
name=parsed_args.name) name=parsed_args.name
)
self.sdk_client.set_aggregate_metadata.assert_called_once_with( self.sdk_client.set_aggregate_metadata.assert_called_once_with(
self.fake_ag.id, parsed_args.properties) self.fake_ag.id, parsed_args.properties
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data) self.assertCountEqual(self.data, data)
class TestAggregateDelete(TestAggregate): class TestAggregateDelete(TestAggregate):
fake_ags = compute_fakes.FakeAggregate.create_aggregates(count=2) fake_ags = compute_fakes.FakeAggregate.create_aggregates(count=2)
def setUp(self): def setUp(self):
super(TestAggregateDelete, self).setUp() super(TestAggregateDelete, self).setUp()
self.sdk_client.find_aggregate = ( self.sdk_client.find_aggregate = (
compute_fakes.FakeAggregate.get_aggregates(self.fake_ags)) compute_fakes.FakeAggregate.get_aggregates(self.fake_ags)
)
self.cmd = aggregate.DeleteAggregate(self.app, None) self.cmd = aggregate.DeleteAggregate(self.app, None)
def test_aggregate_delete(self): def test_aggregate_delete(self):
arglist = [ arglist = [self.fake_ags[0].id]
self.fake_ags[0].id
]
verifylist = [ verifylist = [
('aggregate', [self.fake_ags[0].id]), ('aggregate', [self.fake_ags[0].id]),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
self.fake_ags[0].id, ignore_missing=False) self.fake_ags[0].id, ignore_missing=False
)
self.sdk_client.delete_aggregate.assert_called_once_with( self.sdk_client.delete_aggregate.assert_called_once_with(
self.fake_ags[0].id, ignore_missing=False) self.fake_ags[0].id, ignore_missing=False
)
def test_delete_multiple_aggregates(self): def test_delete_multiple_aggregates(self):
arglist = [] arglist = []
@@ -205,24 +211,25 @@ class TestAggregateDelete(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.sdk_client.find_aggregate.side_effect = [ self.sdk_client.find_aggregate.side_effect = [
self.fake_ags[0], sdk_exceptions.NotFoundException] self.fake_ags[0],
sdk_exceptions.NotFoundException,
]
try: try:
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.fail('CommandError should be raised.') self.fail('CommandError should be raised.')
except exceptions.CommandError as e: except exceptions.CommandError as e:
self.assertEqual('1 of 2 aggregates failed to delete.', self.assertEqual('1 of 2 aggregates failed to delete.', str(e))
str(e))
calls = [] calls = []
for a in arglist: for a in arglist:
calls.append(call(a, ignore_missing=False)) calls.append(call(a, ignore_missing=False))
self.sdk_client.find_aggregate.assert_has_calls(calls) self.sdk_client.find_aggregate.assert_has_calls(calls)
self.sdk_client.delete_aggregate.assert_called_with( self.sdk_client.delete_aggregate.assert_called_with(
self.fake_ags[0].id, ignore_missing=False) self.fake_ags[0].id, ignore_missing=False
)
class TestAggregateList(TestAggregate): class TestAggregateList(TestAggregate):
list_columns = ( list_columns = (
"ID", "ID",
"Name", "Name",
@@ -237,23 +244,29 @@ class TestAggregateList(TestAggregate):
"Hosts", "Hosts",
) )
list_data = (( list_data = (
TestAggregate.fake_ag.id, (
TestAggregate.fake_ag.name, TestAggregate.fake_ag.id,
TestAggregate.fake_ag.availability_zone, TestAggregate.fake_ag.name,
), ) TestAggregate.fake_ag.availability_zone,
),
)
list_data_long = (( list_data_long = (
TestAggregate.fake_ag.id, (
TestAggregate.fake_ag.name, TestAggregate.fake_ag.id,
TestAggregate.fake_ag.availability_zone, TestAggregate.fake_ag.name,
format_columns.DictColumn({ TestAggregate.fake_ag.availability_zone,
key: value format_columns.DictColumn(
for key, value in TestAggregate.fake_ag.metadata.items() {
if key != 'availability_zone' key: value
}), for key, value in TestAggregate.fake_ag.metadata.items()
format_columns.ListColumn(TestAggregate.fake_ag.hosts), if key != 'availability_zone'
), ) }
),
format_columns.ListColumn(TestAggregate.fake_ag.hosts),
),
)
def setUp(self): def setUp(self):
super(TestAggregateList, self).setUp() super(TestAggregateList, self).setUp()
@@ -262,7 +275,6 @@ class TestAggregateList(TestAggregate):
self.cmd = aggregate.ListAggregate(self.app, None) self.cmd = aggregate.ListAggregate(self.app, None)
def test_aggregate_list(self): def test_aggregate_list(self):
parsed_args = self.check_parser(self.cmd, [], []) parsed_args = self.check_parser(self.cmd, [], [])
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
@@ -284,7 +296,6 @@ class TestAggregateList(TestAggregate):
class TestAggregateRemoveHost(TestAggregate): class TestAggregateRemoveHost(TestAggregate):
def setUp(self): def setUp(self):
super(TestAggregateRemoveHost, self).setUp() super(TestAggregateRemoveHost, self).setUp()
@@ -304,15 +315,16 @@ class TestAggregateRemoveHost(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.sdk_client.remove_host_from_aggregate.assert_called_once_with( self.sdk_client.remove_host_from_aggregate.assert_called_once_with(
self.fake_ag.id, parsed_args.host) self.fake_ag.id, parsed_args.host
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data) self.assertCountEqual(self.data, data)
class TestAggregateSet(TestAggregate): class TestAggregateSet(TestAggregate):
def setUp(self): def setUp(self):
super(TestAggregateSet, self).setUp() super(TestAggregateSet, self).setUp()
@@ -330,14 +342,16 @@ class TestAggregateSet(TestAggregate):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.assertNotCalled(self.sdk_client.update_aggregate) self.assertNotCalled(self.sdk_client.update_aggregate)
self.assertNotCalled(self.sdk_client.set_aggregate_metadata) self.assertNotCalled(self.sdk_client.set_aggregate_metadata)
self.assertIsNone(result) self.assertIsNone(result)
def test_aggregate_set_with_name(self): def test_aggregate_set_with_name(self):
arglist = [ arglist = [
'--name', 'new_name', '--name',
'new_name',
'ag1', 'ag1',
] ]
verifylist = [ verifylist = [
@@ -348,15 +362,18 @@ class TestAggregateSet(TestAggregate):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.sdk_client.update_aggregate.assert_called_once_with( self.sdk_client.update_aggregate.assert_called_once_with(
self.fake_ag.id, name=parsed_args.name) self.fake_ag.id, name=parsed_args.name
)
self.assertNotCalled(self.sdk_client.set_aggregate_metadata) self.assertNotCalled(self.sdk_client.set_aggregate_metadata)
self.assertIsNone(result) self.assertIsNone(result)
def test_aggregate_set_with_zone(self): def test_aggregate_set_with_zone(self):
arglist = [ arglist = [
'--zone', 'new_zone', '--zone',
'new_zone',
'ag1', 'ag1',
] ]
verifylist = [ verifylist = [
@@ -367,16 +384,20 @@ class TestAggregateSet(TestAggregate):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.sdk_client.update_aggregate.assert_called_once_with( self.sdk_client.update_aggregate.assert_called_once_with(
self.fake_ag.id, availability_zone=parsed_args.zone) self.fake_ag.id, availability_zone=parsed_args.zone
)
self.assertNotCalled(self.sdk_client.set_aggregate_metadata) self.assertNotCalled(self.sdk_client.set_aggregate_metadata)
self.assertIsNone(result) self.assertIsNone(result)
def test_aggregate_set_with_property(self): def test_aggregate_set_with_property(self):
arglist = [ arglist = [
'--property', 'key1=value1', '--property',
'--property', 'key2=value2', 'key1=value1',
'--property',
'key2=value2',
'ag1', 'ag1',
] ]
verifylist = [ verifylist = [
@@ -387,16 +408,19 @@ class TestAggregateSet(TestAggregate):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.assertNotCalled(self.sdk_client.update_aggregate) self.assertNotCalled(self.sdk_client.update_aggregate)
self.sdk_client.set_aggregate_metadata.assert_called_once_with( self.sdk_client.set_aggregate_metadata.assert_called_once_with(
self.fake_ag.id, parsed_args.properties) self.fake_ag.id, parsed_args.properties
)
self.assertIsNone(result) self.assertIsNone(result)
def test_aggregate_set_with_no_property_and_property(self): def test_aggregate_set_with_no_property_and_property(self):
arglist = [ arglist = [
'--no-property', '--no-property',
'--property', 'key2=value2', '--property',
'key2=value2',
'ag1', 'ag1',
] ]
verifylist = [ verifylist = [
@@ -407,10 +431,12 @@ class TestAggregateSet(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.assertNotCalled(self.sdk_client.update_aggregate) self.assertNotCalled(self.sdk_client.update_aggregate)
self.sdk_client.set_aggregate_metadata.assert_called_once_with( self.sdk_client.set_aggregate_metadata.assert_called_once_with(
self.fake_ag.id, {'key1': None, 'key2': 'value2'}) self.fake_ag.id, {'key1': None, 'key2': 'value2'}
)
self.assertIsNone(result) self.assertIsNone(result)
def test_aggregate_set_with_no_property(self): def test_aggregate_set_with_no_property(self):
@@ -425,15 +451,18 @@ class TestAggregateSet(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.assertNotCalled(self.sdk_client.update_aggregate) self.assertNotCalled(self.sdk_client.update_aggregate)
self.sdk_client.set_aggregate_metadata.assert_called_once_with( self.sdk_client.set_aggregate_metadata.assert_called_once_with(
self.fake_ag.id, {'key1': None}) self.fake_ag.id, {'key1': None}
)
self.assertIsNone(result) self.assertIsNone(result)
def test_aggregate_set_with_zone_and_no_property(self): def test_aggregate_set_with_zone_and_no_property(self):
arglist = [ arglist = [
'--zone', 'new_zone', '--zone',
'new_zone',
'--no-property', '--no-property',
'ag1', 'ag1',
] ]
@@ -445,16 +474,18 @@ class TestAggregateSet(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.sdk_client.update_aggregate.assert_called_once_with( self.sdk_client.update_aggregate.assert_called_once_with(
self.fake_ag.id, availability_zone=parsed_args.zone) self.fake_ag.id, availability_zone=parsed_args.zone
)
self.sdk_client.set_aggregate_metadata.assert_called_once_with( self.sdk_client.set_aggregate_metadata.assert_called_once_with(
self.fake_ag.id, {'key1': None}) self.fake_ag.id, {'key1': None}
)
self.assertIsNone(result) self.assertIsNone(result)
class TestAggregateShow(TestAggregate): class TestAggregateShow(TestAggregate):
columns = ( columns = (
'availability_zone', 'availability_zone',
'hosts', 'hosts',
@@ -468,11 +499,13 @@ class TestAggregateShow(TestAggregate):
format_columns.ListColumn(TestAggregate.fake_ag.hosts), format_columns.ListColumn(TestAggregate.fake_ag.hosts),
TestAggregate.fake_ag.id, TestAggregate.fake_ag.id,
TestAggregate.fake_ag.name, TestAggregate.fake_ag.name,
format_columns.DictColumn({ format_columns.DictColumn(
key: value {
for key, value in TestAggregate.fake_ag.metadata.items() key: value
if key != 'availability_zone' for key, value in TestAggregate.fake_ag.metadata.items()
}), if key != 'availability_zone'
}
),
) )
def setUp(self): def setUp(self):
@@ -491,14 +524,14 @@ class TestAggregateShow(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, tuple(data)) self.assertCountEqual(self.data, tuple(data))
class TestAggregateUnset(TestAggregate): class TestAggregateUnset(TestAggregate):
def setUp(self): def setUp(self):
super(TestAggregateUnset, self).setUp() super(TestAggregateUnset, self).setUp()
@@ -507,7 +540,8 @@ class TestAggregateUnset(TestAggregate):
def test_aggregate_unset(self): def test_aggregate_unset(self):
arglist = [ arglist = [
'--property', 'unset_key', '--property',
'unset_key',
'ag1', 'ag1',
] ]
verifylist = [ verifylist = [
@@ -518,13 +552,16 @@ class TestAggregateUnset(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.set_aggregate_metadata.assert_called_once_with( self.sdk_client.set_aggregate_metadata.assert_called_once_with(
self.fake_ag.id, {'unset_key': None}) self.fake_ag.id, {'unset_key': None}
)
self.assertIsNone(result) self.assertIsNone(result)
def test_aggregate_unset_multiple_properties(self): def test_aggregate_unset_multiple_properties(self):
arglist = [ arglist = [
'--property', 'unset_key1', '--property',
'--property', 'unset_key2', 'unset_key1',
'--property',
'unset_key2',
'ag1', 'ag1',
] ]
verifylist = [ verifylist = [
@@ -535,7 +572,8 @@ class TestAggregateUnset(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.set_aggregate_metadata.assert_called_once_with( self.sdk_client.set_aggregate_metadata.assert_called_once_with(
self.fake_ag.id, {'unset_key1': None, 'unset_key2': None}) self.fake_ag.id, {'unset_key1': None, 'unset_key2': None}
)
self.assertIsNone(result) self.assertIsNone(result)
def test_aggregate_unset_no_option(self): def test_aggregate_unset_no_option(self):
@@ -553,7 +591,6 @@ class TestAggregateUnset(TestAggregate):
class TestAggregateCacheImage(TestAggregate): class TestAggregateCacheImage(TestAggregate):
images = image_fakes.create_images(count=2) images = image_fakes.create_images(count=2)
def setUp(self): def setUp(self):
@@ -561,34 +598,27 @@ class TestAggregateCacheImage(TestAggregate):
self.sdk_client.find_aggregate.return_value = self.fake_ag self.sdk_client.find_aggregate.return_value = self.fake_ag
self.find_image_mock = mock.Mock(side_effect=self.images) self.find_image_mock = mock.Mock(side_effect=self.images)
self.app.client_manager.sdk_connection.image.find_image = \ self.app.client_manager.sdk_connection.image.find_image = (
self.find_image_mock self.find_image_mock
)
self.cmd = aggregate.CacheImageForAggregate(self.app, None) self.cmd = aggregate.CacheImageForAggregate(self.app, None)
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_aggregate_not_supported(self, sm_mock): def test_aggregate_not_supported(self, sm_mock):
arglist = [ arglist = ['ag1', 'im1']
'ag1',
'im1'
]
verifylist = [ verifylist = [
('aggregate', 'ag1'), ('aggregate', 'ag1'),
('image', ['im1']), ('image', ['im1']),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises( self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action,
parsed_args
) )
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_aggregate_add_single_image(self, sm_mock): def test_aggregate_add_single_image(self, sm_mock):
arglist = [ arglist = ['ag1', 'im1']
'ag1',
'im1'
]
verifylist = [ verifylist = [
('aggregate', 'ag1'), ('aggregate', 'ag1'),
('image', ['im1']), ('image', ['im1']),
@@ -596,9 +626,11 @@ class TestAggregateCacheImage(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.sdk_client.aggregate_precache_images.assert_called_once_with( self.sdk_client.aggregate_precache_images.assert_called_once_with(
self.fake_ag.id, [self.images[0].id]) self.fake_ag.id, [self.images[0].id]
)
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_aggregate_add_multiple_images(self, sm_mock): def test_aggregate_add_multiple_images(self, sm_mock):
@@ -614,6 +646,8 @@ class TestAggregateCacheImage(TestAggregate):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.sdk_client.find_aggregate.assert_called_once_with( self.sdk_client.find_aggregate.assert_called_once_with(
parsed_args.aggregate, ignore_missing=False) parsed_args.aggregate, ignore_missing=False
)
self.sdk_client.aggregate_precache_images.assert_called_once_with( self.sdk_client.aggregate_precache_images.assert_called_once_with(
self.fake_ag.id, [self.images[0].id, self.images[1].id]) self.fake_ag.id, [self.images[0].id, self.images[1].id]
)

View File

@@ -21,7 +21,6 @@ from openstackclient.tests.unit import utils
class TestConsole(compute_fakes.TestComputev2): class TestConsole(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super(TestConsole, self).setUp() super(TestConsole, self).setUp()
@@ -44,62 +43,48 @@ class TestConsoleLog(TestConsole):
self.cmd = console.ShowConsoleLog(self.app, None) self.cmd = console.ShowConsoleLog(self.app, None)
def test_show_no_args(self): def test_show_no_args(self):
arglist = [ arglist = []
] verifylist = []
verifylist = [ self.assertRaises(
] utils.ParserException,
self.assertRaises(utils.ParserException, self.check_parser,
self.check_parser, self.cmd,
self.cmd, arglist,
arglist, verifylist,
verifylist) )
def test_show(self): def test_show(self):
arglist = [ arglist = ['fake_server']
'fake_server' verifylist = [('server', 'fake_server')]
]
verifylist = [
('server', 'fake_server')
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
output = { output = {'output': '1st line\n2nd line\n'}
'output': '1st line\n2nd line\n'
}
self.sdk_client.get_server_console_output.return_value = output self.sdk_client.get_server_console_output.return_value = output
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.sdk_client.find_server.assert_called_with( self.sdk_client.find_server.assert_called_with(
name_or_id='fake_server', ignore_missing=False) name_or_id='fake_server', ignore_missing=False
)
self.sdk_client.get_server_console_output.assert_called_with( self.sdk_client.get_server_console_output.assert_called_with(
self._server.id, self._server.id, length=None
length=None
) )
stdout = self.app.stdout.content stdout = self.app.stdout.content
self.assertEqual(stdout[0], output['output']) self.assertEqual(stdout[0], output['output'])
def test_show_lines(self): def test_show_lines(self):
arglist = [ arglist = ['fake_server', '--lines', '15']
'fake_server', verifylist = [('server', 'fake_server'), ('lines', 15)]
'--lines', '15'
]
verifylist = [
('server', 'fake_server'),
('lines', 15)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
output = { output = {'output': '1st line\n2nd line'}
'output': '1st line\n2nd line'
}
self.sdk_client.get_server_console_output.return_value = output self.sdk_client.get_server_console_output.return_value = output
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.sdk_client.find_server.assert_called_with( self.sdk_client.find_server.assert_called_with(
name_or_id='fake_server', ignore_missing=False) name_or_id='fake_server', ignore_missing=False
)
self.sdk_client.get_server_console_output.assert_called_with( self.sdk_client.get_server_console_output.assert_called_with(
self._server.id, self._server.id, length=15
length=15
) )
@@ -109,11 +94,14 @@ class TestConsoleUrlShow(TestConsole):
def setUp(self): def setUp(self):
super(TestConsoleUrlShow, self).setUp() super(TestConsoleUrlShow, self).setUp()
self.sdk_client.find_server.return_value = self._server self.sdk_client.find_server.return_value = self._server
fake_console_data = {'url': 'http://localhost', fake_console_data = {
'protocol': 'fake_protocol', 'url': 'http://localhost',
'type': 'fake_type'} 'protocol': 'fake_protocol',
'type': 'fake_type',
}
self.sdk_client.create_console = mock.Mock( self.sdk_client.create_console = mock.Mock(
return_value=fake_console_data) return_value=fake_console_data
)
self.columns = ( self.columns = (
'protocol', 'protocol',
@@ -123,7 +111,7 @@ class TestConsoleUrlShow(TestConsole):
self.data = ( self.data = (
fake_console_data['protocol'], fake_console_data['protocol'],
fake_console_data['type'], fake_console_data['type'],
fake_console_data['url'] fake_console_data['url'],
) )
self.cmd = console.ShowConsoleURL(self.app, None) self.cmd = console.ShowConsoleURL(self.app, None)
@@ -139,8 +127,8 @@ class TestConsoleUrlShow(TestConsole):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_console.assert_called_once_with( self.sdk_client.create_console.assert_called_once_with(
self._server.id, self._server.id, console_type='novnc'
console_type='novnc') )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
@@ -156,8 +144,8 @@ class TestConsoleUrlShow(TestConsole):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_console.assert_called_once_with( self.sdk_client.create_console.assert_called_once_with(
self._server.id, self._server.id, console_type='novnc'
console_type='novnc') )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
@@ -173,8 +161,8 @@ class TestConsoleUrlShow(TestConsole):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_console.assert_called_once_with( self.sdk_client.create_console.assert_called_once_with(
self._server.id, self._server.id, console_type='xvpvnc'
console_type='xvpvnc') )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
@@ -190,8 +178,8 @@ class TestConsoleUrlShow(TestConsole):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_console.assert_called_once_with( self.sdk_client.create_console.assert_called_once_with(
self._server.id, self._server.id, console_type='spice-html5'
console_type='spice-html5') )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
@@ -207,8 +195,8 @@ class TestConsoleUrlShow(TestConsole):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_console.assert_called_once_with( self.sdk_client.create_console.assert_called_once_with(
self._server.id, self._server.id, console_type='rdp-html5'
console_type='rdp-html5') )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
@@ -224,8 +212,8 @@ class TestConsoleUrlShow(TestConsole):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_console.assert_called_once_with( self.sdk_client.create_console.assert_called_once_with(
self._server.id, self._server.id, console_type='serial'
console_type='serial') )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
@@ -241,7 +229,7 @@ class TestConsoleUrlShow(TestConsole):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_console.assert_called_once_with( self.sdk_client.create_console.assert_called_once_with(
self._server.id, self._server.id, console_type='webmks'
console_type='webmks') )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)

View File

@@ -27,7 +27,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestFlavor(compute_fakes.TestComputev2): class TestFlavor(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super(TestFlavor, self).setUp() super(TestFlavor, self).setUp()
@@ -50,9 +49,9 @@ class TestFlavor(compute_fakes.TestComputev2):
class TestFlavorCreate(TestFlavor): class TestFlavorCreate(TestFlavor):
flavor = compute_fakes.FakeFlavor.create_one_flavor( flavor = compute_fakes.FakeFlavor.create_one_flavor(
attrs={'links': 'flavor-links'}) attrs={'links': 'flavor-links'}
)
project = identity_fakes.FakeProject.create_one_project() project = identity_fakes.FakeProject.create_one_project()
columns = ( columns = (
@@ -67,7 +66,7 @@ class TestFlavorCreate(TestFlavor):
'ram', 'ram',
'rxtx_factor', 'rxtx_factor',
'swap', 'swap',
'vcpus' 'vcpus',
) )
data = ( data = (
@@ -108,10 +107,7 @@ class TestFlavorCreate(TestFlavor):
self.cmd = flavor.CreateFlavor(self.app, None) self.cmd = flavor.CreateFlavor(self.app, None)
def test_flavor_create_default_options(self): def test_flavor_create_default_options(self):
arglist = [self.flavor.name]
arglist = [
self.flavor.name
]
verifylist = [ verifylist = [
('name', self.flavor.name), ('name', self.flavor.name),
] ]
@@ -136,18 +132,26 @@ class TestFlavorCreate(TestFlavor):
self.assertCountEqual(self.data, data) self.assertCountEqual(self.data, data)
def test_flavor_create_all_options(self): def test_flavor_create_all_options(self):
arglist = [ arglist = [
'--id', self.flavor.id, '--id',
'--ram', str(self.flavor.ram), self.flavor.id,
'--disk', str(self.flavor.disk), '--ram',
'--ephemeral', str(self.flavor.ephemeral), str(self.flavor.ram),
'--swap', str(self.flavor.swap), '--disk',
'--vcpus', str(self.flavor.vcpus), str(self.flavor.disk),
'--rxtx-factor', str(self.flavor.rxtx_factor), '--ephemeral',
str(self.flavor.ephemeral),
'--swap',
str(self.flavor.swap),
'--vcpus',
str(self.flavor.vcpus),
'--rxtx-factor',
str(self.flavor.rxtx_factor),
'--public', '--public',
'--description', str(self.flavor.description), '--description',
'--property', 'property=value', str(self.flavor.description),
'--property',
'property=value',
self.flavor.name, self.flavor.name,
] ]
verifylist = [ verifylist = [
@@ -175,7 +179,7 @@ class TestFlavorCreate(TestFlavor):
'swap': self.flavor.swap, 'swap': self.flavor.swap,
'rxtx_factor': self.flavor.rxtx_factor, 'rxtx_factor': self.flavor.rxtx_factor,
'is_public': self.flavor.is_public, 'is_public': self.flavor.is_public,
'description': self.flavor.description 'description': self.flavor.description,
} }
props = {'property': 'value'} props = {'property': 'value'}
@@ -190,36 +194,49 @@ class TestFlavorCreate(TestFlavor):
cmp_data = list(self.data) cmp_data = list(self.data)
cmp_data[7] = format_columns.DictColumn(props) cmp_data[7] = format_columns.DictColumn(props)
self.sdk_client.create_flavor.return_value = create_flavor self.sdk_client.create_flavor.return_value = create_flavor
self.sdk_client.create_flavor_extra_specs.return_value = \ self.sdk_client.create_flavor_extra_specs.return_value = (
expected_flavor expected_flavor
)
with mock.patch.object(sdk_utils, 'supports_microversion', with mock.patch.object(
return_value=True): sdk_utils, 'supports_microversion', return_value=True
):
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_flavor.assert_called_once_with(**args) self.sdk_client.create_flavor.assert_called_once_with(**args)
self.sdk_client.create_flavor_extra_specs.assert_called_once_with( self.sdk_client.create_flavor_extra_specs.assert_called_once_with(
create_flavor, props) create_flavor, props
)
self.sdk_client.get_flavor_access.assert_not_called() self.sdk_client.get_flavor_access.assert_not_called()
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(tuple(cmp_data), data) self.assertCountEqual(tuple(cmp_data), data)
def test_flavor_create_other_options(self): def test_flavor_create_other_options(self):
self.flavor.is_public = False self.flavor.is_public = False
arglist = [ arglist = [
'--id', 'auto', '--id',
'--ram', str(self.flavor.ram), 'auto',
'--disk', str(self.flavor.disk), '--ram',
'--ephemeral', str(self.flavor.ephemeral), str(self.flavor.ram),
'--swap', str(self.flavor.swap), '--disk',
'--vcpus', str(self.flavor.vcpus), str(self.flavor.disk),
'--rxtx-factor', str(self.flavor.rxtx_factor), '--ephemeral',
str(self.flavor.ephemeral),
'--swap',
str(self.flavor.swap),
'--vcpus',
str(self.flavor.vcpus),
'--rxtx-factor',
str(self.flavor.rxtx_factor),
'--private', '--private',
'--description', str(self.flavor.description), '--description',
'--project', self.project.id, str(self.flavor.description),
'--property', 'key1=value1', '--project',
'--property', 'key2=value2', self.project.id,
'--property',
'key1=value1',
'--property',
'key2=value2',
self.flavor.name, self.flavor.name,
] ]
verifylist = [ verifylist = [
@@ -247,7 +264,7 @@ class TestFlavorCreate(TestFlavor):
'swap': self.flavor.swap, 'swap': self.flavor.swap,
'rxtx_factor': self.flavor.rxtx_factor, 'rxtx_factor': self.flavor.rxtx_factor,
'is_public': False, 'is_public': False,
'description': self.flavor.description 'description': self.flavor.description,
} }
props = {'key1': 'value1', 'key2': 'value2'} props = {'key1': 'value1', 'key2': 'value2'}
@@ -263,11 +280,13 @@ class TestFlavorCreate(TestFlavor):
cmp_data = list(self.data_private) cmp_data = list(self.data_private)
cmp_data[7] = format_columns.DictColumn(props) cmp_data[7] = format_columns.DictColumn(props)
self.sdk_client.create_flavor.return_value = create_flavor self.sdk_client.create_flavor.return_value = create_flavor
self.sdk_client.create_flavor_extra_specs.return_value = \ self.sdk_client.create_flavor_extra_specs.return_value = (
expected_flavor expected_flavor
)
with mock.patch.object(sdk_utils, 'supports_microversion', with mock.patch.object(
return_value=True): sdk_utils, 'supports_microversion', return_value=True
):
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.create_flavor.assert_called_once_with(**args) self.sdk_client.create_flavor.assert_called_once_with(**args)
self.sdk_client.flavor_add_tenant_access.assert_called_with( self.sdk_client.flavor_add_tenant_access.assert_called_with(
@@ -275,13 +294,15 @@ class TestFlavorCreate(TestFlavor):
self.project.id, self.project.id,
) )
self.sdk_client.create_flavor_extra_specs.assert_called_with( self.sdk_client.create_flavor_extra_specs.assert_called_with(
create_flavor, props) create_flavor, props
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(cmp_data, data) self.assertCountEqual(cmp_data, data)
def test_public_flavor_create_with_project(self): def test_public_flavor_create_with_project(self):
arglist = [ arglist = [
'--project', self.project.id, '--project',
self.project.id,
self.flavor.name, self.flavor.name,
] ]
verifylist = [ verifylist = [
@@ -290,30 +311,40 @@ class TestFlavorCreate(TestFlavor):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.assertRaises(
self.cmd.take_action, exceptions.CommandError, self.cmd.take_action, parsed_args
parsed_args) )
def test_flavor_create_no_options(self): def test_flavor_create_no_options(self):
arglist = [] arglist = []
verifylist = None verifylist = None
self.assertRaises(tests_utils.ParserException, self.assertRaises(
self.check_parser, tests_utils.ParserException,
self.cmd, self.check_parser,
arglist, self.cmd,
verifylist) arglist,
verifylist,
)
def test_flavor_create_with_description_api_newer(self): def test_flavor_create_with_description_api_newer(self):
arglist = [ arglist = [
'--id', self.flavor.id, '--id',
'--ram', str(self.flavor.ram), self.flavor.id,
'--disk', str(self.flavor.disk), '--ram',
'--ephemeral', str(self.flavor.ephemeral), str(self.flavor.ram),
'--swap', str(self.flavor.swap), '--disk',
'--vcpus', str(self.flavor.vcpus), str(self.flavor.disk),
'--rxtx-factor', str(self.flavor.rxtx_factor), '--ephemeral',
str(self.flavor.ephemeral),
'--swap',
str(self.flavor.swap),
'--vcpus',
str(self.flavor.vcpus),
'--rxtx-factor',
str(self.flavor.rxtx_factor),
'--private', '--private',
'--description', 'fake description', '--description',
'fake description',
self.flavor.name, self.flavor.name,
] ]
verifylist = [ verifylist = [
@@ -329,9 +360,9 @@ class TestFlavorCreate(TestFlavor):
('name', self.flavor.name), ('name', self.flavor.name),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
with mock.patch.object(sdk_utils, 'supports_microversion', with mock.patch.object(
return_value=True): sdk_utils, 'supports_microversion', return_value=True
):
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
args = { args = {
@@ -344,7 +375,7 @@ class TestFlavorCreate(TestFlavor):
'swap': self.flavor.swap, 'swap': self.flavor.swap,
'rxtx_factor': self.flavor.rxtx_factor, 'rxtx_factor': self.flavor.rxtx_factor,
'is_public': self.flavor.is_public, 'is_public': self.flavor.is_public,
'description': 'fake description' 'description': 'fake description',
} }
self.sdk_client.create_flavor.assert_called_once_with(**args) self.sdk_client.create_flavor.assert_called_once_with(**args)
@@ -354,10 +385,14 @@ class TestFlavorCreate(TestFlavor):
def test_flavor_create_with_description_api_older(self): def test_flavor_create_with_description_api_older(self):
arglist = [ arglist = [
'--id', self.flavor.id, '--id',
'--ram', str(self.flavor.ram), self.flavor.id,
'--vcpus', str(self.flavor.vcpus), '--ram',
'--description', 'description', str(self.flavor.ram),
'--vcpus',
str(self.flavor.vcpus),
'--description',
'description',
self.flavor.name, self.flavor.name,
] ]
verifylist = [ verifylist = [
@@ -368,14 +403,15 @@ class TestFlavorCreate(TestFlavor):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
with mock.patch.object(sdk_utils, 'supports_microversion', with mock.patch.object(
return_value=False): sdk_utils, 'supports_microversion', return_value=False
self.assertRaises(exceptions.CommandError, self.cmd.take_action, ):
parsed_args) self.assertRaises(
exceptions.CommandError, self.cmd.take_action, parsed_args
)
class TestFlavorDelete(TestFlavor): class TestFlavorDelete(TestFlavor):
flavors = compute_fakes.FakeFlavor.create_flavors(count=2) flavors = compute_fakes.FakeFlavor.create_flavors(count=2)
def setUp(self): def setUp(self):
@@ -386,9 +422,7 @@ class TestFlavorDelete(TestFlavor):
self.cmd = flavor.DeleteFlavor(self.app, None) self.cmd = flavor.DeleteFlavor(self.app, None)
def test_flavor_delete(self): def test_flavor_delete(self):
arglist = [ arglist = [self.flavors[0].id]
self.flavors[0].id
]
verifylist = [ verifylist = [
('flavor', [self.flavors[0].id]), ('flavor', [self.flavors[0].id]),
] ]
@@ -398,8 +432,9 @@ class TestFlavorDelete(TestFlavor):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_flavor.assert_called_with(self.flavors[0].id, self.sdk_client.find_flavor.assert_called_with(
ignore_missing=False) self.flavors[0].id, ignore_missing=False
)
self.sdk_client.delete_flavor.assert_called_with(self.flavors[0].id) self.sdk_client.delete_flavor.assert_called_with(self.flavors[0].id)
self.assertIsNone(result) self.assertIsNone(result)
@@ -430,14 +465,12 @@ class TestFlavorDelete(TestFlavor):
self.flavors[0].id, self.flavors[0].id,
'unexist_flavor', 'unexist_flavor',
] ]
verifylist = [ verifylist = [('flavor', [self.flavors[0].id, 'unexist_flavor'])]
('flavor', [self.flavors[0].id, 'unexist_flavor'])
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.sdk_client.find_flavor.side_effect = [ self.sdk_client.find_flavor.side_effect = [
self.flavors[0], self.flavors[0],
sdk_exceptions.ResourceNotFound sdk_exceptions.ResourceNotFound,
] ]
try: try:
@@ -456,7 +489,6 @@ class TestFlavorDelete(TestFlavor):
class TestFlavorList(TestFlavor): class TestFlavorList(TestFlavor):
_flavor = compute_fakes.FakeFlavor.create_one_flavor() _flavor = compute_fakes.FakeFlavor.create_one_flavor()
columns = ( columns = (
@@ -468,32 +500,36 @@ class TestFlavorList(TestFlavor):
'VCPUs', 'VCPUs',
'Is Public', 'Is Public',
) )
columns_long = columns + ( columns_long = columns + ('Swap', 'RXTX Factor', 'Properties')
'Swap',
'RXTX Factor',
'Properties'
)
data = (( data = (
_flavor.id, (
_flavor.name, _flavor.id,
_flavor.ram, _flavor.name,
_flavor.disk, _flavor.ram,
_flavor.ephemeral, _flavor.disk,
_flavor.vcpus, _flavor.ephemeral,
_flavor.is_public, _flavor.vcpus,
),) _flavor.is_public,
data_long = (data[0] + ( ),
_flavor.swap, )
_flavor.rxtx_factor, data_long = (
format_columns.DictColumn(_flavor.extra_specs) data[0]
), ) + (
_flavor.swap,
_flavor.rxtx_factor,
format_columns.DictColumn(_flavor.extra_specs),
),
)
def setUp(self): def setUp(self):
super(TestFlavorList, self).setUp() super(TestFlavorList, self).setUp()
self.api_mock = mock.Mock() self.api_mock = mock.Mock()
self.api_mock.side_effect = [[self._flavor], [], ] self.api_mock.side_effect = [
[self._flavor],
[],
]
self.sdk_client.flavors = self.api_mock self.sdk_client.flavors = self.api_mock
@@ -520,9 +556,7 @@ class TestFlavorList(TestFlavor):
'is_public': True, 'is_public': True,
} }
self.sdk_client.flavors.assert_called_with( self.sdk_client.flavors.assert_called_with(**kwargs)
**kwargs
)
self.sdk_client.fetch_flavor_extra_specs.assert_not_called() self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
@@ -548,9 +582,7 @@ class TestFlavorList(TestFlavor):
'is_public': None, 'is_public': None,
} }
self.sdk_client.flavors.assert_called_with( self.sdk_client.flavors.assert_called_with(**kwargs)
**kwargs
)
self.sdk_client.fetch_flavor_extra_specs.assert_not_called() self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
@@ -576,9 +608,7 @@ class TestFlavorList(TestFlavor):
'is_public': False, 'is_public': False,
} }
self.sdk_client.flavors.assert_called_with( self.sdk_client.flavors.assert_called_with(**kwargs)
**kwargs
)
self.sdk_client.fetch_flavor_extra_specs.assert_not_called() self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
@@ -604,9 +634,7 @@ class TestFlavorList(TestFlavor):
'is_public': True, 'is_public': True,
} }
self.sdk_client.flavors.assert_called_with( self.sdk_client.flavors.assert_called_with(**kwargs)
**kwargs
)
self.sdk_client.fetch_flavor_extra_specs.assert_not_called() self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
@@ -632,9 +660,7 @@ class TestFlavorList(TestFlavor):
'is_public': True, 'is_public': True,
} }
self.sdk_client.flavors.assert_called_with( self.sdk_client.flavors.assert_called_with(**kwargs)
**kwargs
)
self.sdk_client.fetch_flavor_extra_specs.assert_not_called() self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
self.assertEqual(self.columns_long, columns) self.assertEqual(self.columns_long, columns)
@@ -643,22 +669,31 @@ class TestFlavorList(TestFlavor):
def test_flavor_list_long_no_extra_specs(self): def test_flavor_list_long_no_extra_specs(self):
# use flavor with no extra specs for this test # use flavor with no extra specs for this test
flavor = compute_fakes.FakeFlavor.create_one_flavor( flavor = compute_fakes.FakeFlavor.create_one_flavor(
attrs={"extra_specs": {}}) attrs={"extra_specs": {}}
self.data = (( )
flavor.id, self.data = (
flavor.name, (
flavor.ram, flavor.id,
flavor.disk, flavor.name,
flavor.ephemeral, flavor.ram,
flavor.vcpus, flavor.disk,
flavor.is_public, flavor.ephemeral,
),) flavor.vcpus,
self.data_long = (self.data[0] + ( flavor.is_public,
flavor.swap, ),
flavor.rxtx_factor, )
format_columns.DictColumn(flavor.extra_specs) self.data_long = (
),) self.data[0]
self.api_mock.side_effect = [[flavor], [], ] + (
flavor.swap,
flavor.rxtx_factor,
format_columns.DictColumn(flavor.extra_specs),
),
)
self.api_mock.side_effect = [
[flavor],
[],
]
self.sdk_client.flavors = self.api_mock self.sdk_client.flavors = self.api_mock
self.sdk_client.fetch_flavor_extra_specs = mock.Mock(return_value=None) self.sdk_client.fetch_flavor_extra_specs = mock.Mock(return_value=None)
@@ -682,19 +717,20 @@ class TestFlavorList(TestFlavor):
'is_public': True, 'is_public': True,
} }
self.sdk_client.flavors.assert_called_with( self.sdk_client.flavors.assert_called_with(**kwargs)
**kwargs
)
self.sdk_client.fetch_flavor_extra_specs.assert_called_once_with( self.sdk_client.fetch_flavor_extra_specs.assert_called_once_with(
flavor) flavor
)
self.assertEqual(self.columns_long, columns) self.assertEqual(self.columns_long, columns)
self.assertCountEqual(self.data_long, tuple(data)) self.assertCountEqual(self.data_long, tuple(data))
def test_flavor_list_min_disk_min_ram(self): def test_flavor_list_min_disk_min_ram(self):
arglist = [ arglist = [
'--min-disk', '10', '--min-disk',
'--min-ram', '2048', '10',
'--min-ram',
'2048',
] ]
verifylist = [ verifylist = [
('min_disk', 10), ('min_disk', 10),
@@ -715,9 +751,7 @@ class TestFlavorList(TestFlavor):
'min_ram': 2048, 'min_ram': 2048,
} }
self.sdk_client.flavors.assert_called_with( self.sdk_client.flavors.assert_called_with(**kwargs)
**kwargs
)
self.sdk_client.fetch_flavor_extra_specs.assert_not_called() self.sdk_client.fetch_flavor_extra_specs.assert_not_called()
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
@@ -725,10 +759,10 @@ class TestFlavorList(TestFlavor):
class TestFlavorSet(TestFlavor): class TestFlavorSet(TestFlavor):
# Return value of self.sdk_client.find_flavor(). # Return value of self.sdk_client.find_flavor().
flavor = compute_fakes.FakeFlavor.create_one_flavor( flavor = compute_fakes.FakeFlavor.create_one_flavor(
attrs={'os-flavor-access:is_public': False}) attrs={'os-flavor-access:is_public': False}
)
project = identity_fakes.FakeProject.create_one_project() project = identity_fakes.FakeProject.create_one_project()
def setUp(self): def setUp(self):
@@ -740,51 +774,40 @@ class TestFlavorSet(TestFlavor):
self.cmd = flavor.SetFlavor(self.app, None) self.cmd = flavor.SetFlavor(self.app, None)
def test_flavor_set_property(self): def test_flavor_set_property(self):
arglist = [ arglist = ['--property', 'FOO="B A R"', 'baremetal']
'--property', 'FOO="B A R"',
'baremetal'
]
verifylist = [ verifylist = [
('properties', {'FOO': '"B A R"'}), ('properties', {'FOO': '"B A R"'}),
('flavor', 'baremetal') ('flavor', 'baremetal'),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_flavor.assert_called_with( self.sdk_client.find_flavor.assert_called_with(
parsed_args.flavor, parsed_args.flavor, get_extra_specs=True, ignore_missing=False
get_extra_specs=True,
ignore_missing=False
) )
self.sdk_client.create_flavor_extra_specs.assert_called_with( self.sdk_client.create_flavor_extra_specs.assert_called_with(
self.flavor.id, self.flavor.id, {'FOO': '"B A R"'}
{'FOO': '"B A R"'}) )
self.assertIsNone(result) self.assertIsNone(result)
def test_flavor_set_no_property(self): def test_flavor_set_no_property(self):
arglist = [ arglist = ['--no-property', 'baremetal']
'--no-property', verifylist = [('no_property', True), ('flavor', 'baremetal')]
'baremetal'
]
verifylist = [
('no_property', True),
('flavor', 'baremetal')
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_flavor.assert_called_with( self.sdk_client.find_flavor.assert_called_with(
parsed_args.flavor, parsed_args.flavor, get_extra_specs=True, ignore_missing=False
get_extra_specs=True,
ignore_missing=False
) )
self.sdk_client.delete_flavor_extra_specs_property.assert_called_with( self.sdk_client.delete_flavor_extra_specs_property.assert_called_with(
self.flavor.id, 'property') self.flavor.id, 'property'
)
self.assertIsNone(result) self.assertIsNone(result)
def test_flavor_set_project(self): def test_flavor_set_project(self):
arglist = [ arglist = [
'--project', self.project.id, '--project',
self.project.id,
self.flavor.id, self.flavor.id,
] ]
verifylist = [ verifylist = [
@@ -796,9 +819,7 @@ class TestFlavorSet(TestFlavor):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_flavor.assert_called_with( self.sdk_client.find_flavor.assert_called_with(
parsed_args.flavor, parsed_args.flavor, get_extra_specs=True, ignore_missing=False
get_extra_specs=True,
ignore_missing=False
) )
self.sdk_client.flavor_add_tenant_access.assert_called_with( self.sdk_client.flavor_add_tenant_access.assert_called_with(
self.flavor.id, self.flavor.id,
@@ -816,18 +837,29 @@ class TestFlavorSet(TestFlavor):
('project', None), ('project', None),
('flavor', self.flavor.id), ('flavor', self.flavor.id),
] ]
self.assertRaises(tests_utils.ParserException, self.check_parser, self.assertRaises(
self.cmd, arglist, verifylist) tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_flavor_set_no_flavor(self): def test_flavor_set_no_flavor(self):
arglist = [ arglist = [
'--project', self.project.id, '--project',
self.project.id,
] ]
verifylist = [ verifylist = [
('project', self.project.id), ('project', self.project.id),
] ]
self.assertRaises(tests_utils.ParserException, self.check_parser, self.assertRaises(
self.cmd, arglist, verifylist) tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_flavor_set_with_unexist_flavor(self): def test_flavor_set_with_unexist_flavor(self):
self.sdk_client.find_flavor.side_effect = [ self.sdk_client.find_flavor.side_effect = [
@@ -835,7 +867,8 @@ class TestFlavorSet(TestFlavor):
] ]
arglist = [ arglist = [
'--project', self.project.id, '--project',
self.project.id,
'unexist_flavor', 'unexist_flavor',
] ]
verifylist = [ verifylist = [
@@ -844,9 +877,9 @@ class TestFlavorSet(TestFlavor):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.assertRaises(
self.cmd.take_action, exceptions.CommandError, self.cmd.take_action, parsed_args
parsed_args) )
def test_flavor_set_nothing(self): def test_flavor_set_nothing(self):
arglist = [ arglist = [
@@ -859,16 +892,15 @@ class TestFlavorSet(TestFlavor):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_flavor.assert_called_with( self.sdk_client.find_flavor.assert_called_with(
parsed_args.flavor, parsed_args.flavor, get_extra_specs=True, ignore_missing=False
get_extra_specs=True,
ignore_missing=False
) )
self.sdk_client.flavor_add_tenant_access.assert_not_called() self.sdk_client.flavor_add_tenant_access.assert_not_called()
self.assertIsNone(result) self.assertIsNone(result)
def test_flavor_set_description_api_newer(self): def test_flavor_set_description_api_newer(self):
arglist = [ arglist = [
'--description', 'description', '--description',
'description',
self.flavor.id, self.flavor.id,
] ]
verifylist = [ verifylist = [
@@ -877,17 +909,19 @@ class TestFlavorSet(TestFlavor):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.app.client_manager.compute.api_version = 2.55 self.app.client_manager.compute.api_version = 2.55
with mock.patch.object(sdk_utils, with mock.patch.object(
'supports_microversion', sdk_utils, 'supports_microversion', return_value=True
return_value=True): ):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.update_flavor.assert_called_with( self.sdk_client.update_flavor.assert_called_with(
flavor=self.flavor.id, description='description') flavor=self.flavor.id, description='description'
)
self.assertIsNone(result) self.assertIsNone(result)
def test_flavor_set_description_api_older(self): def test_flavor_set_description_api_older(self):
arglist = [ arglist = [
'--description', 'description', '--description',
'description',
self.flavor.id, self.flavor.id,
] ]
verifylist = [ verifylist = [
@@ -896,15 +930,17 @@ class TestFlavorSet(TestFlavor):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.app.client_manager.compute.api_version = 2.54 self.app.client_manager.compute.api_version = 2.54
with mock.patch.object(sdk_utils, with mock.patch.object(
'supports_microversion', sdk_utils, 'supports_microversion', return_value=False
return_value=False): ):
self.assertRaises(exceptions.CommandError, self.cmd.take_action, self.assertRaises(
parsed_args) exceptions.CommandError, self.cmd.take_action, parsed_args
)
def test_flavor_set_description_using_name_api_newer(self): def test_flavor_set_description_using_name_api_newer(self):
arglist = [ arglist = [
'--description', 'description', '--description',
'description',
self.flavor.name, self.flavor.name,
] ]
verifylist = [ verifylist = [
@@ -914,17 +950,19 @@ class TestFlavorSet(TestFlavor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.app.client_manager.compute.api_version = 2.55 self.app.client_manager.compute.api_version = 2.55
with mock.patch.object(sdk_utils, with mock.patch.object(
'supports_microversion', sdk_utils, 'supports_microversion', return_value=True
return_value=True): ):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.update_flavor.assert_called_with( self.sdk_client.update_flavor.assert_called_with(
flavor=self.flavor.id, description='description') flavor=self.flavor.id, description='description'
)
self.assertIsNone(result) self.assertIsNone(result)
def test_flavor_set_description_using_name_api_older(self): def test_flavor_set_description_using_name_api_older(self):
arglist = [ arglist = [
'--description', 'description', '--description',
'description',
self.flavor.name, self.flavor.name,
] ]
verifylist = [ verifylist = [
@@ -934,15 +972,15 @@ class TestFlavorSet(TestFlavor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.app.client_manager.compute.api_version = 2.54 self.app.client_manager.compute.api_version = 2.54
with mock.patch.object(sdk_utils, with mock.patch.object(
'supports_microversion', sdk_utils, 'supports_microversion', return_value=False
return_value=False): ):
self.assertRaises(exceptions.CommandError, self.cmd.take_action, self.assertRaises(
parsed_args) exceptions.CommandError, self.cmd.take_action, parsed_args
)
class TestFlavorShow(TestFlavor): class TestFlavorShow(TestFlavor):
# Return value of self.sdk_client.find_flavor(). # Return value of self.sdk_client.find_flavor().
flavor_access = compute_fakes.FakeFlavorAccess.create_one_flavor_access() flavor_access = compute_fakes.FakeFlavorAccess.create_one_flavor_access()
flavor = compute_fakes.FakeFlavor.create_one_flavor() flavor = compute_fakes.FakeFlavor.create_one_flavor()
@@ -960,7 +998,7 @@ class TestFlavorShow(TestFlavor):
'ram', 'ram',
'rxtx_factor', 'rxtx_factor',
'swap', 'swap',
'vcpus' 'vcpus',
) )
data = ( data = (
@@ -992,8 +1030,13 @@ class TestFlavorShow(TestFlavor):
verifylist = [] verifylist = []
# Missing required args should boil here # Missing required args should boil here
self.assertRaises(tests_utils.ParserException, self.check_parser, self.assertRaises(
self.cmd, arglist, verifylist) tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_public_flavor_show(self): def test_public_flavor_show(self):
arglist = [ arglist = [
@@ -1046,16 +1089,17 @@ class TestFlavorShow(TestFlavor):
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.get_flavor_access.assert_called_with( self.sdk_client.get_flavor_access.assert_called_with(
flavor=private_flavor.id) flavor=private_flavor.id
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(data_with_project, data) self.assertCountEqual(data_with_project, data)
class TestFlavorUnset(TestFlavor): class TestFlavorUnset(TestFlavor):
# Return value of self.sdk_client.find_flavor(). # Return value of self.sdk_client.find_flavor().
flavor = compute_fakes.FakeFlavor.create_one_flavor( flavor = compute_fakes.FakeFlavor.create_one_flavor(
attrs={'os-flavor-access:is_public': False}) attrs={'os-flavor-access:is_public': False}
)
project = identity_fakes.FakeProject.create_one_project() project = identity_fakes.FakeProject.create_one_project()
def setUp(self): def setUp(self):
@@ -1069,10 +1113,7 @@ class TestFlavorUnset(TestFlavor):
self.mock_shortcut = self.sdk_client.delete_flavor_extra_specs_property self.mock_shortcut = self.sdk_client.delete_flavor_extra_specs_property
def test_flavor_unset_property(self): def test_flavor_unset_property(self):
arglist = [ arglist = ['--property', 'property', 'baremetal']
'--property', 'property',
'baremetal'
]
verifylist = [ verifylist = [
('properties', ['property']), ('properties', ['property']),
('flavor', 'baremetal'), ('flavor', 'baremetal'),
@@ -1081,19 +1122,19 @@ class TestFlavorUnset(TestFlavor):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_flavor.assert_called_with( self.sdk_client.find_flavor.assert_called_with(
parsed_args.flavor, parsed_args.flavor, get_extra_specs=True, ignore_missing=False
get_extra_specs=True, )
ignore_missing=False) self.mock_shortcut.assert_called_with(self.flavor.id, 'property')
self.mock_shortcut.assert_called_with(
self.flavor.id, 'property')
self.sdk_client.flavor_remove_tenant_access.assert_not_called() self.sdk_client.flavor_remove_tenant_access.assert_not_called()
self.assertIsNone(result) self.assertIsNone(result)
def test_flavor_unset_properties(self): def test_flavor_unset_properties(self):
arglist = [ arglist = [
'--property', 'property1', '--property',
'--property', 'property2', 'property1',
'baremetal' '--property',
'property2',
'baremetal',
] ]
verifylist = [ verifylist = [
('properties', ['property1', 'property2']), ('properties', ['property1', 'property2']),
@@ -1103,29 +1144,26 @@ class TestFlavorUnset(TestFlavor):
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.sdk_client.find_flavor.assert_called_with( self.sdk_client.find_flavor.assert_called_with(
parsed_args.flavor, parsed_args.flavor, get_extra_specs=True, ignore_missing=False
get_extra_specs=True, )
ignore_missing=False)
calls = [ calls = [
mock.call(self.flavor.id, 'property1'), mock.call(self.flavor.id, 'property1'),
mock.call(self.flavor.id, 'property2') mock.call(self.flavor.id, 'property2'),
] ]
self.mock_shortcut.assert_has_calls( self.mock_shortcut.assert_has_calls(calls)
calls)
# A bit tricky way to ensure we do not unset other properties # A bit tricky way to ensure we do not unset other properties
calls.append(mock.call(self.flavor.id, 'property')) calls.append(mock.call(self.flavor.id, 'property'))
self.assertRaises( self.assertRaises(
AssertionError, AssertionError, self.mock_shortcut.assert_has_calls, calls
self.mock_shortcut.assert_has_calls,
calls
) )
self.sdk_client.flavor_remove_tenant_access.assert_not_called() self.sdk_client.flavor_remove_tenant_access.assert_not_called()
def test_flavor_unset_project(self): def test_flavor_unset_project(self):
arglist = [ arglist = [
'--project', self.project.id, '--project',
self.project.id,
self.flavor.id, self.flavor.id,
] ]
verifylist = [ verifylist = [
@@ -1138,8 +1176,8 @@ class TestFlavorUnset(TestFlavor):
self.assertIsNone(result) self.assertIsNone(result)
self.sdk_client.find_flavor.assert_called_with( self.sdk_client.find_flavor.assert_called_with(
parsed_args.flavor, get_extra_specs=True, parsed_args.flavor, get_extra_specs=True, ignore_missing=False
ignore_missing=False) )
self.sdk_client.flavor_remove_tenant_access.assert_called_with( self.sdk_client.flavor_remove_tenant_access.assert_called_with(
self.flavor.id, self.flavor.id,
self.project.id, self.project.id,
@@ -1156,18 +1194,29 @@ class TestFlavorUnset(TestFlavor):
('project', None), ('project', None),
('flavor', self.flavor.id), ('flavor', self.flavor.id),
] ]
self.assertRaises(tests_utils.ParserException, self.check_parser, self.assertRaises(
self.cmd, arglist, verifylist) tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_flavor_unset_no_flavor(self): def test_flavor_unset_no_flavor(self):
arglist = [ arglist = [
'--project', self.project.id, '--project',
self.project.id,
] ]
verifylist = [ verifylist = [
('project', self.project.id), ('project', self.project.id),
] ]
self.assertRaises(tests_utils.ParserException, self.check_parser, self.assertRaises(
self.cmd, arglist, verifylist) tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_flavor_unset_with_unexist_flavor(self): def test_flavor_unset_with_unexist_flavor(self):
self.sdk_client.find_flavor.side_effect = [ self.sdk_client.find_flavor.side_effect = [
@@ -1175,7 +1224,8 @@ class TestFlavorUnset(TestFlavor):
] ]
arglist = [ arglist = [
'--project', self.project.id, '--project',
self.project.id,
'unexist_flavor', 'unexist_flavor',
] ]
verifylist = [ verifylist = [
@@ -1183,8 +1233,9 @@ class TestFlavorUnset(TestFlavor):
('flavor', 'unexist_flavor'), ('flavor', 'unexist_flavor'),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.cmd.take_action, self.assertRaises(
parsed_args) exceptions.CommandError, self.cmd.take_action, parsed_args
)
def test_flavor_unset_nothing(self): def test_flavor_unset_nothing(self):
arglist = [ arglist = [

View File

@@ -22,7 +22,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestHost(compute_fakes.TestComputev2): class TestHost(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super(TestHost, self).setUp() super(TestHost, self).setUp()
@@ -33,11 +32,8 @@ class TestHost(compute_fakes.TestComputev2):
self.sdk_client.get = mock.Mock() self.sdk_client.get = mock.Mock()
@mock.patch( @mock.patch('openstackclient.api.compute_v2.APIv2.host_list')
'openstackclient.api.compute_v2.APIv2.host_list'
)
class TestHostList(TestHost): class TestHostList(TestHost):
_host = compute_fakes.FakeHost.create_one_host() _host = compute_fakes.FakeHost.create_one_host()
def setUp(self): def setUp(self):
@@ -47,15 +43,15 @@ class TestHostList(TestHost):
data={'hosts': [self._host]} data={'hosts': [self._host]}
) )
self.columns = ( self.columns = ('Host Name', 'Service', 'Zone')
'Host Name', 'Service', 'Zone'
)
self.data = [( self.data = [
self._host['host_name'], (
self._host['service'], self._host['host_name'],
self._host['zone'], self._host['service'],
)] self._host['zone'],
)
]
self.cmd = host.ListHost(self.app, None) self.cmd = host.ListHost(self.app, None)
@@ -75,7 +71,8 @@ class TestHostList(TestHost):
def test_host_list_with_option(self, h_mock): def test_host_list_with_option(self, h_mock):
h_mock.return_value = [self._host] h_mock.return_value = [self._host]
arglist = [ arglist = [
'--zone', self._host['zone'], '--zone',
self._host['zone'],
] ]
verifylist = [ verifylist = [
('zone', self._host['zone']), ('zone', self._host['zone']),
@@ -90,11 +87,8 @@ class TestHostList(TestHost):
self.assertEqual(self.data, list(data)) self.assertEqual(self.data, list(data))
@mock.patch( @mock.patch('openstackclient.api.compute_v2.APIv2.host_set')
'openstackclient.api.compute_v2.APIv2.host_set'
)
class TestHostSet(TestHost): class TestHostSet(TestHost):
def setUp(self): def setUp(self):
super(TestHostSet, self).setUp() super(TestHostSet, self).setUp()
@@ -138,27 +132,27 @@ class TestHostSet(TestHost):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.assertIsNone(result) self.assertIsNone(result)
h_mock.assert_called_with(self.host['host'], status='enable', h_mock.assert_called_with(
maintenance_mode='disable') self.host['host'], status='enable', maintenance_mode='disable'
)
@mock.patch( @mock.patch('openstackclient.api.compute_v2.APIv2.host_show')
'openstackclient.api.compute_v2.APIv2.host_show'
)
class TestHostShow(TestHost): class TestHostShow(TestHost):
_host = compute_fakes.FakeHost.create_one_host() _host = compute_fakes.FakeHost.create_one_host()
def setUp(self): def setUp(self):
super(TestHostShow, self).setUp() super(TestHostShow, self).setUp()
output_data = {"resource": { output_data = {
"host": self._host['host'], "resource": {
"project": self._host['project'], "host": self._host['host'],
"cpu": self._host['cpu'], "project": self._host['project'],
"memory_mb": self._host['memory_mb'], "cpu": self._host['cpu'],
"disk_gb": self._host['disk_gb'] "memory_mb": self._host['memory_mb'],
}} "disk_gb": self._host['disk_gb'],
}
}
self.sdk_client.get.return_value = fakes.FakeResponse( self.sdk_client.get.return_value = fakes.FakeResponse(
data={'host': [output_data]} data={'host': [output_data]}
@@ -172,13 +166,15 @@ class TestHostShow(TestHost):
'Disk GB', 'Disk GB',
) )
self.data = [( self.data = [
self._host['host'], (
self._host['project'], self._host['host'],
self._host['cpu'], self._host['project'],
self._host['memory_mb'], self._host['cpu'],
self._host['disk_gb'], self._host['memory_mb'],
)] self._host['disk_gb'],
)
]
self.cmd = host.ShowHost(self.app, None) self.cmd = host.ShowHost(self.app, None)
@@ -188,8 +184,13 @@ class TestHostShow(TestHost):
verifylist = [] verifylist = []
# Missing required args should bail here # Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser, self.assertRaises(
self.cmd, arglist, verifylist) tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_host_show_with_option(self, h_mock): def test_host_show_with_option(self, h_mock):
h_mock.return_value = [self._host] h_mock.return_value = [self._host]
@@ -205,8 +206,7 @@ class TestHostShow(TestHost):
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.get.assert_called_with( self.sdk_client.get.assert_called_with(
'/os-hosts/' + self._host['host_name'], '/os-hosts/' + self._host['host_name'], microversion='2.1'
microversion='2.1'
) )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data)) self.assertEqual(self.data, list(data))

View File

@@ -26,7 +26,6 @@ from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
class TestHypervisor(compute_fakes.TestComputev2): class TestHypervisor(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -37,7 +36,6 @@ class TestHypervisor(compute_fakes.TestComputev2):
class TestHypervisorList(TestHypervisor): class TestHypervisorList(TestHypervisor):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -50,7 +48,7 @@ class TestHypervisorList(TestHypervisor):
"Hypervisor Hostname", "Hypervisor Hostname",
"Hypervisor Type", "Hypervisor Type",
"Host IP", "Host IP",
"State" "State",
) )
self.columns_long = ( self.columns_long = (
"ID", "ID",
@@ -61,7 +59,7 @@ class TestHypervisorList(TestHypervisor):
"vCPUs Used", "vCPUs Used",
"vCPUs", "vCPUs",
"Memory MB Used", "Memory MB Used",
"Memory MB" "Memory MB",
) )
self.data = ( self.data = (
( (
@@ -69,14 +67,14 @@ class TestHypervisorList(TestHypervisor):
self.hypervisors[0].name, self.hypervisors[0].name,
self.hypervisors[0].hypervisor_type, self.hypervisors[0].hypervisor_type,
self.hypervisors[0].host_ip, self.hypervisors[0].host_ip,
self.hypervisors[0].state self.hypervisors[0].state,
), ),
( (
self.hypervisors[1].id, self.hypervisors[1].id,
self.hypervisors[1].name, self.hypervisors[1].name,
self.hypervisors[1].hypervisor_type, self.hypervisors[1].hypervisor_type,
self.hypervisors[1].host_ip, self.hypervisors[1].host_ip,
self.hypervisors[1].state self.hypervisors[1].state,
), ),
) )
@@ -90,7 +88,7 @@ class TestHypervisorList(TestHypervisor):
self.hypervisors[0].vcpus_used, self.hypervisors[0].vcpus_used,
self.hypervisors[0].vcpus, self.hypervisors[0].vcpus,
self.hypervisors[0].memory_used, self.hypervisors[0].memory_used,
self.hypervisors[0].memory_size self.hypervisors[0].memory_size,
), ),
( (
self.hypervisors[1].id, self.hypervisors[1].id,
@@ -101,7 +99,7 @@ class TestHypervisorList(TestHypervisor):
self.hypervisors[1].vcpus_used, self.hypervisors[1].vcpus_used,
self.hypervisors[1].vcpus, self.hypervisors[1].vcpus,
self.hypervisors[1].memory_used, self.hypervisors[1].memory_used,
self.hypervisors[1].memory_size self.hypervisors[1].memory_size,
), ),
) )
# Get the command object to test # Get the command object to test
@@ -123,7 +121,8 @@ class TestHypervisorList(TestHypervisor):
def test_hypervisor_list_matching_option_found(self): def test_hypervisor_list_matching_option_found(self):
arglist = [ arglist = [
'--matching', self.hypervisors[0].name, '--matching',
self.hypervisors[0].name,
] ]
verifylist = [ verifylist = [
('matching', self.hypervisors[0].name), ('matching', self.hypervisors[0].name),
@@ -149,14 +148,15 @@ class TestHypervisorList(TestHypervisor):
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.hypervisors.assert_called_with( self.sdk_client.hypervisors.assert_called_with(
hypervisor_hostname_pattern=self.hypervisors[0].name, hypervisor_hostname_pattern=self.hypervisors[0].name, details=True
details=True) )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, tuple(data)) self.assertEqual(self.data, tuple(data))
def test_hypervisor_list_matching_option_not_found(self): def test_hypervisor_list_matching_option_not_found(self):
arglist = [ arglist = [
'--matching', 'xxx', '--matching',
'xxx',
] ]
verifylist = [ verifylist = [
('matching', 'xxx'), ('matching', 'xxx'),
@@ -164,20 +164,23 @@ class TestHypervisorList(TestHypervisor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# Fake exception raised from search() # Fake exception raised from search()
self.sdk_client.hypervisors.side_effect = \ self.sdk_client.hypervisors.side_effect = exceptions.NotFound(None)
exceptions.NotFound(None)
self.assertRaises(exceptions.NotFound, self.assertRaises(
self.cmd.take_action, exceptions.NotFound, self.cmd.take_action, parsed_args
parsed_args) )
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_hypervisor_list_with_matching_and_pagination_options( def test_hypervisor_list_with_matching_and_pagination_options(
self, sm_mock): self, sm_mock
):
arglist = [ arglist = [
'--matching', self.hypervisors[0].name, '--matching',
'--limit', '1', self.hypervisors[0].name,
'--marker', self.hypervisors[0].name, '--limit',
'1',
'--marker',
self.hypervisors[0].name,
] ]
verifylist = [ verifylist = [
('matching', self.hypervisors[0].name), ('matching', self.hypervisors[0].name),
@@ -187,12 +190,12 @@ class TestHypervisorList(TestHypervisor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--matching is not compatible with --marker or --limit', str(ex)) '--matching is not compatible with --marker or --limit', str(ex)
)
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_hypervisor_list_long_option(self, sm_mock): def test_hypervisor_list_long_option(self, sm_mock):
@@ -216,7 +219,8 @@ class TestHypervisorList(TestHypervisor):
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_hypervisor_list_with_limit(self, sm_mock): def test_hypervisor_list_with_limit(self, sm_mock):
arglist = [ arglist = [
'--limit', '1', '--limit',
'1',
] ]
verifylist = [ verifylist = [
('limit', 1), ('limit', 1),
@@ -230,7 +234,8 @@ class TestHypervisorList(TestHypervisor):
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_hypervisor_list_with_limit_pre_v233(self, sm_mock): def test_hypervisor_list_with_limit_pre_v233(self, sm_mock):
arglist = [ arglist = [
'--limit', '1', '--limit',
'1',
] ]
verifylist = [ verifylist = [
('limit', 1), ('limit', 1),
@@ -238,17 +243,18 @@ class TestHypervisorList(TestHypervisor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.33 or greater is required', str(ex)) '--os-compute-api-version 2.33 or greater is required', str(ex)
)
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_hypervisor_list_with_marker(self, sm_mock): def test_hypervisor_list_with_marker(self, sm_mock):
arglist = [ arglist = [
'--marker', 'test_hyp', '--marker',
'test_hyp',
] ]
verifylist = [ verifylist = [
('marker', 'test_hyp'), ('marker', 'test_hyp'),
@@ -258,12 +264,14 @@ class TestHypervisorList(TestHypervisor):
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.sdk_client.hypervisors.assert_called_with( self.sdk_client.hypervisors.assert_called_with(
marker='test_hyp', details=True) marker='test_hyp', details=True
)
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_hypervisor_list_with_marker_pre_v233(self, sm_mock): def test_hypervisor_list_with_marker_pre_v233(self, sm_mock):
arglist = [ arglist = [
'--marker', 'test_hyp', '--marker',
'test_hyp',
] ]
verifylist = [ verifylist = [
('marker', 'test_hyp'), ('marker', 'test_hyp'),
@@ -271,26 +279,29 @@ class TestHypervisorList(TestHypervisor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.33 or greater is required', str(ex)) '--os-compute-api-version 2.33 or greater is required', str(ex)
)
class TestHypervisorShow(TestHypervisor): class TestHypervisorShow(TestHypervisor):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
uptime_string = (' 01:28:24 up 3 days, 11:15, 1 user, ' uptime_string = (
' load average: 0.94, 0.62, 0.50\n') ' 01:28:24 up 3 days, 11:15, 1 user, '
' load average: 0.94, 0.62, 0.50\n'
)
# Fake hypervisors to be listed up # Fake hypervisors to be listed up
self.hypervisor = compute_fakes.create_one_hypervisor(attrs={ self.hypervisor = compute_fakes.create_one_hypervisor(
'uptime': uptime_string, attrs={
}) 'uptime': uptime_string,
}
)
# Return value of compute_client.find_hypervisor # Return value of compute_client.find_hypervisor
self.sdk_client.find_hypervisor.return_value = self.hypervisor self.sdk_client.find_hypervisor.return_value = self.hypervisor
@@ -422,8 +433,9 @@ class TestHypervisorShow(TestHypervisor):
self.assertEqual(self.columns_v288, columns) self.assertEqual(self.columns_v288, columns)
self.assertCountEqual(self.data_v288, data) self.assertCountEqual(self.data_v288, data)
@mock.patch.object(sdk_utils, 'supports_microversion', @mock.patch.object(
side_effect=[False, True, False]) sdk_utils, 'supports_microversion', side_effect=[False, True, False]
)
def test_hypervisor_show_pre_v288(self, sm_mock): def test_hypervisor_show_pre_v288(self, sm_mock):
arglist = [ arglist = [
self.hypervisor.name, self.hypervisor.name,
@@ -445,8 +457,7 @@ class TestHypervisorShow(TestHypervisor):
def test_hypervisor_show_pre_v228(self, sm_mock): def test_hypervisor_show_pre_v228(self, sm_mock):
# before microversion 2.28, nova returned a stringified version of this # before microversion 2.28, nova returned a stringified version of this
# field # field
self.hypervisor.cpu_info = json.dumps( self.hypervisor.cpu_info = json.dumps(self.hypervisor.cpu_info)
self.hypervisor.cpu_info)
self.sdk_client.find_hypervisor.return_value = self.hypervisor self.sdk_client.find_hypervisor.return_value = self.hypervisor
arglist = [ arglist = [
@@ -465,8 +476,9 @@ class TestHypervisorShow(TestHypervisor):
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data) self.assertCountEqual(self.data, data)
@mock.patch.object(sdk_utils, 'supports_microversion', @mock.patch.object(
side_effect=[False, True, False]) sdk_utils, 'supports_microversion', side_effect=[False, True, False]
)
def test_hypervisor_show_uptime_not_implemented(self, sm_mock): def test_hypervisor_show_uptime_not_implemented(self, sm_mock):
arglist = [ arglist = [
self.hypervisor.name, self.hypervisor.name,
@@ -477,7 +489,8 @@ class TestHypervisorShow(TestHypervisor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.sdk_client.get_hypervisor_uptime.side_effect = ( self.sdk_client.get_hypervisor_uptime.side_effect = (
nova_exceptions.HTTPNotImplemented(501)) nova_exceptions.HTTPNotImplemented(501)
)
# In base command class ShowOne in cliff, abstract method take_action() # In base command class ShowOne in cliff, abstract method take_action()
# returns a two-part tuple with a tuple of column names and a tuple of # returns a two-part tuple with a tuple of column names and a tuple of

View File

@@ -20,7 +20,6 @@ from openstackclient.tests.unit import fakes
class TestHypervisorStats(compute_fakes.TestComputev2): class TestHypervisorStats(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super(TestHypervisorStats, self).setUp() super(TestHypervisorStats, self).setUp()
@@ -33,6 +32,7 @@ class TestHypervisorStats(compute_fakes.TestComputev2):
# Not in fakes.py because hypervisor stats has been deprecated # Not in fakes.py because hypervisor stats has been deprecated
def create_one_hypervisor_stats(attrs=None): def create_one_hypervisor_stats(attrs=None):
"""Create a fake hypervisor stats. """Create a fake hypervisor stats.
@@ -66,14 +66,14 @@ def create_one_hypervisor_stats(attrs=None):
class TestHypervisorStatsShow(TestHypervisorStats): class TestHypervisorStatsShow(TestHypervisorStats):
_stats = create_one_hypervisor_stats() _stats = create_one_hypervisor_stats()
def setUp(self): def setUp(self):
super(TestHypervisorStatsShow, self).setUp() super(TestHypervisorStatsShow, self).setUp()
self.sdk_client.get.return_value = fakes.FakeResponse( self.sdk_client.get.return_value = fakes.FakeResponse(
data={'hypervisor_statistics': self._stats}) data={'hypervisor_statistics': self._stats}
)
self.cmd = hypervisor_stats.ShowHypervisorStats(self.app, None) self.cmd = hypervisor_stats.ShowHypervisorStats(self.app, None)

View File

@@ -30,7 +30,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestKeypair(compute_fakes.TestComputev2): class TestKeypair(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super(TestKeypair, self).setUp() super(TestKeypair, self).setUp()
@@ -53,23 +52,17 @@ class TestKeypair(compute_fakes.TestComputev2):
class TestKeypairCreate(TestKeypair): class TestKeypairCreate(TestKeypair):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
self.keypair = compute_fakes.FakeKeypair.create_one_keypair() self.keypair = compute_fakes.FakeKeypair.create_one_keypair()
self.columns = ( self.columns = ('fingerprint', 'name', 'type', 'user_id')
'fingerprint',
'name',
'type',
'user_id'
)
self.data = ( self.data = (
self.keypair.fingerprint, self.keypair.fingerprint,
self.keypair.name, self.keypair.name,
self.keypair.type, self.keypair.type,
self.keypair.user_id self.keypair.user_id,
) )
# Get the command object to test # Get the command object to test
@@ -78,7 +71,8 @@ class TestKeypairCreate(TestKeypair):
self.sdk_client.create_keypair.return_value = self.keypair self.sdk_client.create_keypair.return_value = self.keypair
@mock.patch.object( @mock.patch.object(
keypair, '_generate_keypair', keypair,
'_generate_keypair',
return_value=keypair.Keypair('private', 'public'), return_value=keypair.Keypair('private', 'public'),
) )
def test_key_pair_create_no_options(self, mock_generate): def test_key_pair_create_no_options(self, mock_generate):
@@ -105,11 +99,12 @@ class TestKeypairCreate(TestKeypair):
self.keypair.fingerprint, self.keypair.fingerprint,
self.keypair.name, self.keypair.name,
self.keypair.type, self.keypair.type,
self.keypair.user_id self.keypair.user_id,
) )
arglist = [ arglist = [
'--public-key', self.keypair.public_key, '--public-key',
self.keypair.public_key,
self.keypair.name, self.keypair.name,
] ]
verifylist = [ verifylist = [
@@ -135,13 +130,15 @@ class TestKeypairCreate(TestKeypair):
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
@mock.patch.object( @mock.patch.object(
keypair, '_generate_keypair', keypair,
'_generate_keypair',
return_value=keypair.Keypair('private', 'public'), return_value=keypair.Keypair('private', 'public'),
) )
def test_keypair_create_private_key(self, mock_generate): def test_keypair_create_private_key(self, mock_generate):
tmp_pk_file = '/tmp/kp-file-' + uuid.uuid4().hex tmp_pk_file = '/tmp/kp-file-' + uuid.uuid4().hex
arglist = [ arglist = [
'--private-key', tmp_pk_file, '--private-key',
tmp_pk_file,
self.keypair.name, self.keypair.name,
] ]
verifylist = [ verifylist = [
@@ -182,9 +179,11 @@ class TestKeypairCreate(TestKeypair):
self.keypair.user_id, self.keypair.user_id,
) )
arglist = [ arglist = [
'--public-key', self.keypair.public_key, '--public-key',
self.keypair.public_key,
self.keypair.name, self.keypair.name,
'--type', key_type, '--type',
key_type,
] ]
verifylist = [ verifylist = [
('public_key', self.keypair.public_key), ('public_key', self.keypair.public_key),
@@ -212,9 +211,11 @@ class TestKeypairCreate(TestKeypair):
def test_keypair_create_with_key_type_pre_v22(self, sm_mock): def test_keypair_create_with_key_type_pre_v22(self, sm_mock):
for key_type in ['x509', 'ssh']: for key_type in ['x509', 'ssh']:
arglist = [ arglist = [
'--public-key', self.keypair.public_key, '--public-key',
self.keypair.public_key,
self.keypair.name, self.keypair.name,
'--type', 'ssh', '--type',
'ssh',
] ]
verifylist = [ verifylist = [
('public_key', self.keypair.public_key), ('public_key', self.keypair.public_key),
@@ -229,22 +230,23 @@ class TestKeypairCreate(TestKeypair):
m_file.read.return_value = 'dummy' m_file.read.return_value = 'dummy'
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.2 or greater is required', '--os-compute-api-version 2.2 or greater is required', str(ex)
str(ex)) )
@mock.patch.object( @mock.patch.object(
keypair, '_generate_keypair', keypair,
'_generate_keypair',
return_value=keypair.Keypair('private', 'public'), return_value=keypair.Keypair('private', 'public'),
) )
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_key_pair_create_with_user(self, sm_mock, mock_generate): def test_key_pair_create_with_user(self, sm_mock, mock_generate):
arglist = [ arglist = [
'--user', identity_fakes.user_name, '--user',
identity_fakes.user_name,
self.keypair.name, self.keypair.name,
] ]
verifylist = [ verifylist = [
@@ -267,7 +269,8 @@ class TestKeypairCreate(TestKeypair):
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_key_pair_create_with_user_pre_v210(self, sm_mock): def test_key_pair_create_with_user_pre_v210(self, sm_mock):
arglist = [ arglist = [
'--user', identity_fakes.user_name, '--user',
identity_fakes.user_name,
self.keypair.name, self.keypair.name,
] ]
verifylist = [ verifylist = [
@@ -277,15 +280,14 @@ class TestKeypairCreate(TestKeypair):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.10 or greater is required', str(ex)) '--os-compute-api-version 2.10 or greater is required', str(ex)
)
class TestKeypairDelete(TestKeypair): class TestKeypairDelete(TestKeypair):
keypairs = compute_fakes.FakeKeypair.create_keypairs(count=2) keypairs = compute_fakes.FakeKeypair.create_keypairs(count=2)
def setUp(self): def setUp(self):
@@ -294,9 +296,7 @@ class TestKeypairDelete(TestKeypair):
self.cmd = keypair.DeleteKeypair(self.app, None) self.cmd = keypair.DeleteKeypair(self.app, None)
def test_keypair_delete(self): def test_keypair_delete(self):
arglist = [ arglist = [self.keypairs[0].name]
self.keypairs[0].name
]
verifylist = [ verifylist = [
('name', [self.keypairs[0].name]), ('name', [self.keypairs[0].name]),
] ]
@@ -307,7 +307,8 @@ class TestKeypairDelete(TestKeypair):
self.assertIsNone(ret) self.assertIsNone(ret)
self.sdk_client.delete_keypair.assert_called_with( self.sdk_client.delete_keypair.assert_called_with(
self.keypairs[0].name, ignore_missing=False) self.keypairs[0].name, ignore_missing=False
)
def test_delete_multiple_keypairs(self): def test_delete_multiple_keypairs(self):
arglist = [] arglist = []
@@ -338,7 +339,9 @@ class TestKeypairDelete(TestKeypair):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.sdk_client.delete_keypair.side_effect = [ self.sdk_client.delete_keypair.side_effect = [
None, exceptions.CommandError] None,
exceptions.CommandError,
]
try: try:
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.fail('CommandError should be raised.') self.fail('CommandError should be raised.')
@@ -352,10 +355,7 @@ class TestKeypairDelete(TestKeypair):
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_keypair_delete_with_user(self, sm_mock): def test_keypair_delete_with_user(self, sm_mock):
arglist = [ arglist = ['--user', identity_fakes.user_name, self.keypairs[0].name]
'--user', identity_fakes.user_name,
self.keypairs[0].name
]
verifylist = [ verifylist = [
('user', identity_fakes.user_name), ('user', identity_fakes.user_name),
('name', [self.keypairs[0].name]), ('name', [self.keypairs[0].name]),
@@ -368,19 +368,16 @@ class TestKeypairDelete(TestKeypair):
self.sdk_client.delete_keypair.assert_called_with( self.sdk_client.delete_keypair.assert_called_with(
self.keypairs[0].name, self.keypairs[0].name,
user_id=identity_fakes.user_id, user_id=identity_fakes.user_id,
ignore_missing=False ignore_missing=False,
) )
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_keypair_delete_with_user_pre_v210(self, sm_mock): def test_keypair_delete_with_user_pre_v210(self, sm_mock):
self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.9'
)
self.app.client_manager.compute.api_version = \ arglist = ['--user', identity_fakes.user_name, self.keypairs[0].name]
api_versions.APIVersion('2.9')
arglist = [
'--user', identity_fakes.user_name,
self.keypairs[0].name
]
verifylist = [ verifylist = [
('user', identity_fakes.user_name), ('user', identity_fakes.user_name),
('name', [self.keypairs[0].name]), ('name', [self.keypairs[0].name]),
@@ -388,15 +385,14 @@ class TestKeypairDelete(TestKeypair):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.10 or greater is required', str(ex)) '--os-compute-api-version 2.10 or greater is required', str(ex)
)
class TestKeypairList(TestKeypair): class TestKeypairList(TestKeypair):
# Return value of self.sdk_client.keypairs(). # Return value of self.sdk_client.keypairs().
keypairs = compute_fakes.FakeKeypair.create_keypairs(count=1) keypairs = compute_fakes.FakeKeypair.create_keypairs(count=1)
@@ -426,8 +422,8 @@ class TestKeypairList(TestKeypair):
self.assertEqual(('Name', 'Fingerprint'), columns) self.assertEqual(('Name', 'Fingerprint'), columns)
self.assertEqual( self.assertEqual(
((self.keypairs[0].name, self.keypairs[0].fingerprint), ), ((self.keypairs[0].name, self.keypairs[0].fingerprint),),
tuple(data) tuple(data),
) )
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
@@ -448,17 +444,18 @@ class TestKeypairList(TestKeypair):
self.assertEqual(('Name', 'Fingerprint', 'Type'), columns) self.assertEqual(('Name', 'Fingerprint', 'Type'), columns)
self.assertEqual( self.assertEqual(
(( (
self.keypairs[0].name, (
self.keypairs[0].fingerprint, self.keypairs[0].name,
self.keypairs[0].type, self.keypairs[0].fingerprint,
), ), self.keypairs[0].type,
tuple(data) ),
),
tuple(data),
) )
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_keypair_list_with_user(self, sm_mock): def test_keypair_list_with_user(self, sm_mock):
users_mock = self.app.client_manager.identity.users users_mock = self.app.client_manager.identity.users
users_mock.reset_mock() users_mock.reset_mock()
users_mock.get.return_value = fakes.FakeResource( users_mock.get.return_value = fakes.FakeResource(
@@ -468,7 +465,8 @@ class TestKeypairList(TestKeypair):
) )
arglist = [ arglist = [
'--user', identity_fakes.user_name, '--user',
identity_fakes.user_name,
] ]
verifylist = [ verifylist = [
('user', identity_fakes.user_name), ('user', identity_fakes.user_name),
@@ -484,19 +482,21 @@ class TestKeypairList(TestKeypair):
self.assertEqual(('Name', 'Fingerprint', 'Type'), columns) self.assertEqual(('Name', 'Fingerprint', 'Type'), columns)
self.assertEqual( self.assertEqual(
(( (
self.keypairs[0].name, (
self.keypairs[0].fingerprint, self.keypairs[0].name,
self.keypairs[0].type, self.keypairs[0].fingerprint,
), ), self.keypairs[0].type,
tuple(data) ),
),
tuple(data),
) )
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_keypair_list_with_user_pre_v210(self, sm_mock): def test_keypair_list_with_user_pre_v210(self, sm_mock):
arglist = [ arglist = [
'--user', identity_fakes.user_name, '--user',
identity_fakes.user_name,
] ]
verifylist = [ verifylist = [
('user', identity_fakes.user_name), ('user', identity_fakes.user_name),
@@ -504,15 +504,14 @@ class TestKeypairList(TestKeypair):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.10 or greater is required', str(ex)) '--os-compute-api-version 2.10 or greater is required', str(ex)
)
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_keypair_list_with_project(self, sm_mock): def test_keypair_list_with_project(self, sm_mock):
projects_mock = self.app.client_manager.identity.tenants projects_mock = self.app.client_manager.identity.tenants
projects_mock.reset_mock() projects_mock.reset_mock()
projects_mock.get.return_value = fakes.FakeResource( projects_mock.get.return_value = fakes.FakeResource(
@@ -545,44 +544,52 @@ class TestKeypairList(TestKeypair):
self.assertEqual(('Name', 'Fingerprint', 'Type'), columns) self.assertEqual(('Name', 'Fingerprint', 'Type'), columns)
self.assertEqual( self.assertEqual(
(( (
self.keypairs[0].name, (
self.keypairs[0].fingerprint, self.keypairs[0].name,
self.keypairs[0].type, self.keypairs[0].fingerprint,
), ), self.keypairs[0].type,
tuple(data) ),
),
tuple(data),
) )
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_keypair_list_with_project_pre_v210(self, sm_mock): def test_keypair_list_with_project_pre_v210(self, sm_mock):
arglist = ['--project', identity_fakes.project_name] arglist = ['--project', identity_fakes.project_name]
verifylist = [('project', identity_fakes.project_name)] verifylist = [('project', identity_fakes.project_name)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.10 or greater is required', str(ex)) '--os-compute-api-version 2.10 or greater is required', str(ex)
)
def test_keypair_list_conflicting_user_options(self): def test_keypair_list_conflicting_user_options(self):
arglist = [ arglist = [
'--user', identity_fakes.user_name, '--user',
'--project', identity_fakes.project_name, identity_fakes.user_name,
'--project',
identity_fakes.project_name,
] ]
self.assertRaises( self.assertRaises(
tests_utils.ParserException, tests_utils.ParserException,
self.check_parser, self.cmd, arglist, None) self.check_parser,
self.cmd,
arglist,
None,
)
@mock.patch.object( @mock.patch.object(
sdk_utils, 'supports_microversion', new=mock.Mock(return_value=True)) sdk_utils, 'supports_microversion', new=mock.Mock(return_value=True)
)
def test_keypair_list_with_limit(self): def test_keypair_list_with_limit(self):
arglist = [ arglist = [
'--limit', '1', '--limit',
'1',
] ]
verifylist = [ verifylist = [
('limit', 1), ('limit', 1),
@@ -594,10 +601,12 @@ class TestKeypairList(TestKeypair):
self.sdk_client.keypairs.assert_called_with(limit=1) self.sdk_client.keypairs.assert_called_with(limit=1)
@mock.patch.object( @mock.patch.object(
sdk_utils, 'supports_microversion', new=mock.Mock(return_value=False)) sdk_utils, 'supports_microversion', new=mock.Mock(return_value=False)
)
def test_keypair_list_with_limit_pre_v235(self): def test_keypair_list_with_limit_pre_v235(self):
arglist = [ arglist = [
'--limit', '1', '--limit',
'1',
] ]
verifylist = [ verifylist = [
('limit', 1), ('limit', 1),
@@ -605,18 +614,20 @@ class TestKeypairList(TestKeypair):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.35 or greater is required', str(ex)) '--os-compute-api-version 2.35 or greater is required', str(ex)
)
@mock.patch.object( @mock.patch.object(
sdk_utils, 'supports_microversion', new=mock.Mock(return_value=True)) sdk_utils, 'supports_microversion', new=mock.Mock(return_value=True)
)
def test_keypair_list_with_marker(self): def test_keypair_list_with_marker(self):
arglist = [ arglist = [
'--marker', 'test_kp', '--marker',
'test_kp',
] ]
verifylist = [ verifylist = [
('marker', 'test_kp'), ('marker', 'test_kp'),
@@ -628,10 +639,12 @@ class TestKeypairList(TestKeypair):
self.sdk_client.keypairs.assert_called_with(marker='test_kp') self.sdk_client.keypairs.assert_called_with(marker='test_kp')
@mock.patch.object( @mock.patch.object(
sdk_utils, 'supports_microversion', new=mock.Mock(return_value=False)) sdk_utils, 'supports_microversion', new=mock.Mock(return_value=False)
)
def test_keypair_list_with_marker_pre_v235(self): def test_keypair_list_with_marker_pre_v235(self):
arglist = [ arglist = [
'--marker', 'test_kp', '--marker',
'test_kp',
] ]
verifylist = [ verifylist = [
('marker', 'test_kp'), ('marker', 'test_kp'),
@@ -639,16 +652,15 @@ class TestKeypairList(TestKeypair):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.35 or greater is required', str(ex)) '--os-compute-api-version 2.35 or greater is required', str(ex)
)
class TestKeypairShow(TestKeypair): class TestKeypairShow(TestKeypair):
keypair = compute_fakes.FakeKeypair.create_one_keypair() keypair = compute_fakes.FakeKeypair.create_one_keypair()
def setUp(self): def setUp(self):
@@ -658,28 +670,27 @@ class TestKeypairShow(TestKeypair):
self.cmd = keypair.ShowKeypair(self.app, None) self.cmd = keypair.ShowKeypair(self.app, None)
self.columns = ( self.columns = ("fingerprint", "name", "type", "user_id")
"fingerprint",
"name",
"type",
"user_id"
)
self.data = ( self.data = (
self.keypair.fingerprint, self.keypair.fingerprint,
self.keypair.name, self.keypair.name,
self.keypair.type, self.keypair.type,
self.keypair.user_id self.keypair.user_id,
) )
def test_keypair_show_no_options(self): def test_keypair_show_no_options(self):
arglist = [] arglist = []
verifylist = [] verifylist = []
# Missing required args should boil here # Missing required args should boil here
self.assertRaises(tests_utils.ParserException, self.check_parser, self.assertRaises(
self.cmd, arglist, verifylist) tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_keypair_show(self): def test_keypair_show(self):
self.sdk_client.find_keypair.return_value = self.keypair self.sdk_client.find_keypair.return_value = self.keypair
@@ -688,36 +699,25 @@ class TestKeypairShow(TestKeypair):
self.keypair.fingerprint, self.keypair.fingerprint,
self.keypair.name, self.keypair.name,
self.keypair.type, self.keypair.type,
self.keypair.user_id self.keypair.user_id,
) )
arglist = [ arglist = [self.keypair.name]
self.keypair.name verifylist = [('name', self.keypair.name)]
]
verifylist = [
('name', self.keypair.name)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.find_keypair.assert_called_with( self.sdk_client.find_keypair.assert_called_with(
self.keypair.name, self.keypair.name, ignore_missing=False
ignore_missing=False
) )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
def test_keypair_show_public(self): def test_keypair_show_public(self):
arglist = [ arglist = ['--public-key', self.keypair.name]
'--public-key', verifylist = [('public_key', True), ('name', self.keypair.name)]
self.keypair.name
]
verifylist = [
('public_key', True),
('name', self.keypair.name)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -734,16 +734,17 @@ class TestKeypairShow(TestKeypair):
self.keypair.fingerprint, self.keypair.fingerprint,
self.keypair.name, self.keypair.name,
self.keypair.type, self.keypair.type,
self.keypair.user_id self.keypair.user_id,
) )
arglist = [ arglist = [
'--user', identity_fakes.user_name, '--user',
identity_fakes.user_name,
self.keypair.name, self.keypair.name,
] ]
verifylist = [ verifylist = [
('user', identity_fakes.user_name), ('user', identity_fakes.user_name),
('name', self.keypair.name) ('name', self.keypair.name),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -753,7 +754,7 @@ class TestKeypairShow(TestKeypair):
self.sdk_client.find_keypair.assert_called_with( self.sdk_client.find_keypair.assert_called_with(
self.keypair.name, self.keypair.name,
ignore_missing=False, ignore_missing=False,
user_id=identity_fakes.user_id user_id=identity_fakes.user_id,
) )
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
@@ -761,20 +762,20 @@ class TestKeypairShow(TestKeypair):
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_keypair_show_with_user_pre_v210(self, sm_mock): def test_keypair_show_with_user_pre_v210(self, sm_mock):
arglist = [ arglist = [
'--user', identity_fakes.user_name, '--user',
identity_fakes.user_name,
self.keypair.name, self.keypair.name,
] ]
verifylist = [ verifylist = [
('user', identity_fakes.user_name), ('user', identity_fakes.user_name),
('name', self.keypair.name) ('name', self.keypair.name),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.10 or greater is required', str(ex)) '--os-compute-api-version 2.10 or greater is required', str(ex)
)

File diff suppressed because it is too large Load Diff

View File

@@ -23,7 +23,6 @@ from openstackclient.tests.unit.image.v2 import fakes as image_fakes
class TestServerBackup(compute_fakes.TestComputev2): class TestServerBackup(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super(TestServerBackup, self).setUp() super(TestServerBackup, self).setUp()
@@ -58,12 +57,17 @@ class TestServerBackup(compute_fakes.TestComputev2):
class TestServerBackupCreate(TestServerBackup): class TestServerBackupCreate(TestServerBackup):
# Just return whatever Image is testing with these days # Just return whatever Image is testing with these days
def image_columns(self, image): def image_columns(self, image):
# columnlist = tuple(sorted(image.keys())) # columnlist = tuple(sorted(image.keys()))
columnlist = ( columnlist = (
'id', 'name', 'owner', 'protected', 'status', 'tags', 'visibility' 'id',
'name',
'owner',
'protected',
'status',
'tags',
'visibility',
) )
return columnlist return columnlist
@@ -146,9 +150,12 @@ class TestServerBackupCreate(TestServerBackup):
images = self.setup_images_mock(count=1, servers=servers) images = self.setup_images_mock(count=1, servers=servers)
arglist = [ arglist = [
'--name', 'image', '--name',
'--type', 'daily', 'image',
'--rotate', '2', '--type',
'daily',
'--rotate',
'2',
servers[0].id, servers[0].id,
] ]
verifylist = [ verifylist = [
@@ -183,8 +190,10 @@ class TestServerBackupCreate(TestServerBackup):
) )
arglist = [ arglist = [
'--name', 'image', '--name',
'--type', 'daily', 'image',
'--type',
'daily',
'--wait', '--wait',
servers[0].id, servers[0].id,
] ]
@@ -210,9 +219,7 @@ class TestServerBackupCreate(TestServerBackup):
) )
mock_wait_for_status.assert_called_once_with( mock_wait_for_status.assert_called_once_with(
self.images_mock.get_image, self.images_mock.get_image, images[0].id, callback=mock.ANY
images[0].id,
callback=mock.ANY
) )
@mock.patch.object(common_utils, 'wait_for_status', return_value=True) @mock.patch.object(common_utils, 'wait_for_status', return_value=True)
@@ -225,8 +232,10 @@ class TestServerBackupCreate(TestServerBackup):
) )
arglist = [ arglist = [
'--name', 'image', '--name',
'--type', 'daily', 'image',
'--type',
'daily',
'--wait', '--wait',
servers[0].id, servers[0].id,
] ]
@@ -251,9 +260,7 @@ class TestServerBackupCreate(TestServerBackup):
) )
mock_wait_for_status.assert_called_once_with( mock_wait_for_status.assert_called_once_with(
self.images_mock.get_image, self.images_mock.get_image, images[0].id, callback=mock.ANY
images[0].id,
callback=mock.ANY
) )
self.assertEqual(self.image_columns(images[0]), columns) self.assertEqual(self.image_columns(images[0]), columns)

View File

@@ -24,7 +24,6 @@ from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
class TestServerEvent(compute_fakes.TestComputev2): class TestServerEvent(compute_fakes.TestComputev2):
fake_server = compute_fakes.FakeServer.create_one_server() fake_server = compute_fakes.FakeServer.create_one_server()
def setUp(self): def setUp(self):
@@ -39,24 +38,25 @@ class TestServerEvent(compute_fakes.TestComputev2):
self.sdk_client.reset_mock() self.sdk_client.reset_mock()
patcher = mock.patch.object( patcher = mock.patch.object(
sdk_utils, 'supports_microversion', return_value=True) sdk_utils, 'supports_microversion', return_value=True
)
self.addCleanup(patcher.stop) self.addCleanup(patcher.stop)
self.supports_microversion_mock = patcher.start() self.supports_microversion_mock = patcher.start()
self._set_mock_microversion( self._set_mock_microversion(
self.app.client_manager.compute.api_version.get_string()) self.app.client_manager.compute.api_version.get_string()
)
def _set_mock_microversion(self, mock_v): def _set_mock_microversion(self, mock_v):
"""Set a specific microversion for the mock supports_microversion().""" """Set a specific microversion for the mock supports_microversion()."""
self.supports_microversion_mock.reset_mock(return_value=True) self.supports_microversion_mock.reset_mock(return_value=True)
self.supports_microversion_mock.side_effect = ( self.supports_microversion_mock.side_effect = (
lambda _, v: lambda _, v: api_versions.APIVersion(v)
api_versions.APIVersion(v) <= api_versions.APIVersion(mock_v) <= api_versions.APIVersion(mock_v)
) )
class TestListServerEvent(TestServerEvent): class TestListServerEvent(TestServerEvent):
fake_event = compute_fakes.create_one_server_action() fake_event = compute_fakes.create_one_server_action()
columns = ( columns = (
@@ -65,12 +65,14 @@ class TestListServerEvent(TestServerEvent):
'Action', 'Action',
'Start Time', 'Start Time',
) )
data = (( data = (
fake_event.request_id, (
fake_event.server_id, fake_event.request_id,
fake_event.action, fake_event.server_id,
fake_event.start_time, fake_event.action,
), ) fake_event.start_time,
),
)
long_columns = ( long_columns = (
'Request ID', 'Request ID',
@@ -81,21 +83,25 @@ class TestListServerEvent(TestServerEvent):
'Project ID', 'Project ID',
'User ID', 'User ID',
) )
long_data = (( long_data = (
fake_event.request_id, (
fake_event.server_id, fake_event.request_id,
fake_event.action, fake_event.server_id,
fake_event.start_time, fake_event.action,
fake_event.message, fake_event.start_time,
fake_event.project_id, fake_event.message,
fake_event.user_id, fake_event.project_id,
), ) fake_event.user_id,
),
)
def setUp(self): def setUp(self):
super().setUp() super().setUp()
self.sdk_client.find_server.return_value = self.fake_server self.sdk_client.find_server.return_value = self.fake_server
self.sdk_client.server_actions.return_value = [self.fake_event, ] self.sdk_client.server_actions.return_value = [
self.fake_event,
]
self.cmd = server_event.ListServerEvent(self.app, None) self.cmd = server_event.ListServerEvent(self.app, None)
@@ -146,7 +152,8 @@ class TestListServerEvent(TestServerEvent):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
arglist = [ arglist = [
'--changes-since', '2016-03-04T06:27:59Z', '--changes-since',
'2016-03-04T06:27:59Z',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -171,12 +178,14 @@ class TestListServerEvent(TestServerEvent):
@mock.patch.object(iso8601, 'parse_date', side_effect=iso8601.ParseError) @mock.patch.object(iso8601, 'parse_date', side_effect=iso8601.ParseError)
def test_server_event_list_with_changes_since_invalid( def test_server_event_list_with_changes_since_invalid(
self, mock_parse_isotime, self,
mock_parse_isotime,
): ):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
arglist = [ arglist = [
'--changes-since', 'Invalid time value', '--changes-since',
'Invalid time value',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -192,15 +201,14 @@ class TestListServerEvent(TestServerEvent):
) )
self.assertIn('Invalid changes-since value:', str(ex)) self.assertIn('Invalid changes-since value:', str(ex))
mock_parse_isotime.assert_called_once_with( mock_parse_isotime.assert_called_once_with('Invalid time value')
'Invalid time value'
)
def test_server_event_list_with_changes_since_pre_v258(self): def test_server_event_list_with_changes_since_pre_v258(self):
self._set_mock_microversion('2.57') self._set_mock_microversion('2.57')
arglist = [ arglist = [
'--changes-since', '2016-03-04T06:27:59Z', '--changes-since',
'2016-03-04T06:27:59Z',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -216,14 +224,16 @@ class TestListServerEvent(TestServerEvent):
) )
self.assertIn( self.assertIn(
'--os-compute-api-version 2.58 or greater is required', str(ex), '--os-compute-api-version 2.58 or greater is required',
str(ex),
) )
def test_server_event_list_with_changes_before(self): def test_server_event_list_with_changes_before(self):
self._set_mock_microversion('2.66') self._set_mock_microversion('2.66')
arglist = [ arglist = [
'--changes-before', '2016-03-04T06:27:59Z', '--changes-before',
'2016-03-04T06:27:59Z',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -248,12 +258,14 @@ class TestListServerEvent(TestServerEvent):
@mock.patch.object(iso8601, 'parse_date', side_effect=iso8601.ParseError) @mock.patch.object(iso8601, 'parse_date', side_effect=iso8601.ParseError)
def test_server_event_list_with_changes_before_invalid( def test_server_event_list_with_changes_before_invalid(
self, mock_parse_isotime, self,
mock_parse_isotime,
): ):
self._set_mock_microversion('2.66') self._set_mock_microversion('2.66')
arglist = [ arglist = [
'--changes-before', 'Invalid time value', '--changes-before',
'Invalid time value',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -263,20 +275,18 @@ class TestListServerEvent(TestServerEvent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn('Invalid changes-before value:', str(ex)) self.assertIn('Invalid changes-before value:', str(ex))
mock_parse_isotime.assert_called_once_with( mock_parse_isotime.assert_called_once_with('Invalid time value')
'Invalid time value'
)
def test_server_event_list_with_changes_before_pre_v266(self): def test_server_event_list_with_changes_before_pre_v266(self):
self._set_mock_microversion('2.65') self._set_mock_microversion('2.65')
arglist = [ arglist = [
'--changes-before', '2016-03-04T06:27:59Z', '--changes-before',
'2016-03-04T06:27:59Z',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -286,9 +296,8 @@ class TestListServerEvent(TestServerEvent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.66 or greater is required', '--os-compute-api-version 2.66 or greater is required',
@@ -299,7 +308,8 @@ class TestListServerEvent(TestServerEvent):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
arglist = [ arglist = [
'--limit', '1', '--limit',
'1',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -320,7 +330,8 @@ class TestListServerEvent(TestServerEvent):
self._set_mock_microversion('2.57') self._set_mock_microversion('2.57')
arglist = [ arglist = [
'--limit', '1', '--limit',
'1',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -344,7 +355,8 @@ class TestListServerEvent(TestServerEvent):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
arglist = [ arglist = [
'--marker', 'test_event', '--marker',
'test_event',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -364,7 +376,8 @@ class TestListServerEvent(TestServerEvent):
self._set_mock_microversion('2.57') self._set_mock_microversion('2.57')
arglist = [ arglist = [
'--marker', 'test_event', '--marker',
'test_event',
self.fake_server.name, self.fake_server.name,
] ]
verifylist = [ verifylist = [
@@ -374,16 +387,15 @@ class TestListServerEvent(TestServerEvent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.58 or greater is required', str(ex)) '--os-compute-api-version 2.58 or greater is required', str(ex)
)
class TestShowServerEvent(TestServerEvent): class TestShowServerEvent(TestServerEvent):
fake_event = compute_fakes.create_one_server_action() fake_event = compute_fakes.create_one_server_action()
columns = ( columns = (
'action', 'action',

View File

@@ -25,7 +25,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestServerGroup(compute_fakes.TestComputev2): class TestServerGroup(compute_fakes.TestComputev2):
fake_server_group = compute_fakes.create_one_server_group() fake_server_group = compute_fakes.create_one_server_group()
columns = ( columns = (
@@ -58,18 +57,19 @@ class TestServerGroup(compute_fakes.TestComputev2):
class TestServerGroupCreate(TestServerGroup): class TestServerGroupCreate(TestServerGroup):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
self.sdk_client.create_server_group.return_value = \ self.sdk_client.create_server_group.return_value = (
self.fake_server_group self.fake_server_group
)
self.cmd = server_group.CreateServerGroup(self.app, None) self.cmd = server_group.CreateServerGroup(self.app, None)
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_server_group_create(self, sm_mock): def test_server_group_create(self, sm_mock):
arglist = [ arglist = [
'--policy', 'anti-affinity', '--policy',
'anti-affinity',
'affinity_group', 'affinity_group',
] ]
verifylist = [ verifylist = [
@@ -89,7 +89,8 @@ class TestServerGroupCreate(TestServerGroup):
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_server_group_create_with_soft_policies(self, sm_mock): def test_server_group_create_with_soft_policies(self, sm_mock):
arglist = [ arglist = [
'--policy', 'soft-anti-affinity', '--policy',
'soft-anti-affinity',
'affinity_group', 'affinity_group',
] ]
verifylist = [ verifylist = [
@@ -109,7 +110,8 @@ class TestServerGroupCreate(TestServerGroup):
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=False) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=False)
def test_server_group_create_with_soft_policies_pre_v215(self, sm_mock): def test_server_group_create_with_soft_policies_pre_v215(self, sm_mock):
arglist = [ arglist = [
'--policy', 'soft-anti-affinity', '--policy',
'soft-anti-affinity',
'affinity_group', 'affinity_group',
] ]
verifylist = [ verifylist = [
@@ -118,18 +120,19 @@ class TestServerGroupCreate(TestServerGroup):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.15 or greater is required', '--os-compute-api-version 2.15 or greater is required', str(ex)
str(ex)) )
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_server_group_create_with_rules(self, sm_mock): def test_server_group_create_with_rules(self, sm_mock):
arglist = [ arglist = [
'--policy', 'soft-anti-affinity', '--policy',
'--rule', 'max_server_per_host=2', 'soft-anti-affinity',
'--rule',
'max_server_per_host=2',
'affinity_group', 'affinity_group',
] ]
verifylist = [ verifylist = [
@@ -149,11 +152,14 @@ class TestServerGroupCreate(TestServerGroup):
self.assertCountEqual(self.data, data) self.assertCountEqual(self.data, data)
@mock.patch.object( @mock.patch.object(
sdk_utils, 'supports_microversion', side_effect=[True, False]) sdk_utils, 'supports_microversion', side_effect=[True, False]
)
def test_server_group_create_with_rules_pre_v264(self, sm_mock): def test_server_group_create_with_rules_pre_v264(self, sm_mock):
arglist = [ arglist = [
'--policy', 'soft-anti-affinity', '--policy',
'--rule', 'max_server_per_host=2', 'soft-anti-affinity',
'--rule',
'max_server_per_host=2',
'affinity_group', 'affinity_group',
] ]
verifylist = [ verifylist = [
@@ -164,16 +170,14 @@ class TestServerGroupCreate(TestServerGroup):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.64 or greater is required', '--os-compute-api-version 2.64 or greater is required', str(ex)
str(ex)) )
class TestServerGroupDelete(TestServerGroup): class TestServerGroupDelete(TestServerGroup):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -198,10 +202,7 @@ class TestServerGroupDelete(TestServerGroup):
self.assertIsNone(result) self.assertIsNone(result)
def test_server_group_multiple_delete(self): def test_server_group_multiple_delete(self):
arglist = [ arglist = ['affinity_group', 'anti_affinity_group']
'affinity_group',
'anti_affinity_group'
]
verifylist = [ verifylist = [
('server_group', ['affinity_group', 'anti_affinity_group']), ('server_group', ['affinity_group', 'anti_affinity_group']),
] ]
@@ -221,24 +222,25 @@ class TestServerGroupDelete(TestServerGroup):
def test_server_group_delete_no_input(self): def test_server_group_delete_no_input(self):
arglist = [] arglist = []
verifylist = None verifylist = None
self.assertRaises(tests_utils.ParserException, self.assertRaises(
self.check_parser, tests_utils.ParserException,
self.cmd, self.check_parser,
arglist, self.cmd,
verifylist) arglist,
verifylist,
)
def test_server_group_multiple_delete_with_exception(self): def test_server_group_multiple_delete_with_exception(self):
arglist = [ arglist = ['affinity_group', 'anti_affinity_group']
'affinity_group',
'anti_affinity_group'
]
verifylist = [ verifylist = [
('server_group', ['affinity_group', 'anti_affinity_group']), ('server_group', ['affinity_group', 'anti_affinity_group']),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.sdk_client.find_server_group.side_effect = [ self.sdk_client.find_server_group.side_effect = [
self.fake_server_group, exceptions.CommandError] self.fake_server_group,
exceptions.CommandError,
]
try: try:
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.fail('CommandError should be raised.') self.fail('CommandError should be raised.')
@@ -256,7 +258,6 @@ class TestServerGroupDelete(TestServerGroup):
class TestServerGroupList(TestServerGroup): class TestServerGroupList(TestServerGroup):
list_columns = ( list_columns = (
'ID', 'ID',
'Name', 'Name',
@@ -287,43 +288,51 @@ class TestServerGroupList(TestServerGroup):
'User Id', 'User Id',
) )
list_data = (( list_data = (
TestServerGroup.fake_server_group.id, (
TestServerGroup.fake_server_group.name, TestServerGroup.fake_server_group.id,
format_columns.ListColumn( TestServerGroup.fake_server_group.name,
TestServerGroup.fake_server_group.policies format_columns.ListColumn(
TestServerGroup.fake_server_group.policies
),
), ),
),) )
list_data_long = (( list_data_long = (
TestServerGroup.fake_server_group.id, (
TestServerGroup.fake_server_group.name, TestServerGroup.fake_server_group.id,
format_columns.ListColumn( TestServerGroup.fake_server_group.name,
TestServerGroup.fake_server_group.policies format_columns.ListColumn(
TestServerGroup.fake_server_group.policies
),
format_columns.ListColumn(
TestServerGroup.fake_server_group.member_ids
),
TestServerGroup.fake_server_group.project_id,
TestServerGroup.fake_server_group.user_id,
), ),
format_columns.ListColumn( )
TestServerGroup.fake_server_group.member_ids
),
TestServerGroup.fake_server_group.project_id,
TestServerGroup.fake_server_group.user_id,
),)
list_data_v264 = (( list_data_v264 = (
TestServerGroup.fake_server_group.id, (
TestServerGroup.fake_server_group.name, TestServerGroup.fake_server_group.id,
TestServerGroup.fake_server_group.policy, TestServerGroup.fake_server_group.name,
),) TestServerGroup.fake_server_group.policy,
list_data_v264_long = ((
TestServerGroup.fake_server_group.id,
TestServerGroup.fake_server_group.name,
TestServerGroup.fake_server_group.policy,
format_columns.ListColumn(
TestServerGroup.fake_server_group.member_ids
), ),
TestServerGroup.fake_server_group.project_id, )
TestServerGroup.fake_server_group.user_id,
),) list_data_v264_long = (
(
TestServerGroup.fake_server_group.id,
TestServerGroup.fake_server_group.name,
TestServerGroup.fake_server_group.policy,
format_columns.ListColumn(
TestServerGroup.fake_server_group.member_ids
),
TestServerGroup.fake_server_group.project_id,
TestServerGroup.fake_server_group.user_id,
),
)
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -363,7 +372,8 @@ class TestServerGroupList(TestServerGroup):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.server_groups.assert_called_once_with( self.sdk_client.server_groups.assert_called_once_with(
all_projects=True) all_projects=True
)
self.assertCountEqual(self.list_columns_long, columns) self.assertCountEqual(self.list_columns_long, columns)
self.assertCountEqual(self.list_data_long, tuple(data)) self.assertCountEqual(self.list_data_long, tuple(data))
@@ -371,7 +381,8 @@ class TestServerGroupList(TestServerGroup):
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_server_group_list_with_limit(self, sm_mock): def test_server_group_list_with_limit(self, sm_mock):
arglist = [ arglist = [
'--limit', '1', '--limit',
'1',
] ]
verifylist = [ verifylist = [
('all_projects', False), ('all_projects', False),
@@ -388,7 +399,8 @@ class TestServerGroupList(TestServerGroup):
@mock.patch.object(sdk_utils, 'supports_microversion', return_value=True) @mock.patch.object(sdk_utils, 'supports_microversion', return_value=True)
def test_server_group_list_with_offset(self, sm_mock): def test_server_group_list_with_offset(self, sm_mock):
arglist = [ arglist = [
'--offset', '5', '--offset',
'5',
] ]
verifylist = [ verifylist = [
('all_projects', False), ('all_projects', False),
@@ -429,14 +441,14 @@ class TestServerGroupList(TestServerGroup):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.sdk_client.server_groups.assert_called_once_with( self.sdk_client.server_groups.assert_called_once_with(
all_projects=True) all_projects=True
)
self.assertCountEqual(self.list_columns_v264_long, columns) self.assertCountEqual(self.list_columns_v264_long, columns)
self.assertCountEqual(self.list_data_v264_long, tuple(data)) self.assertCountEqual(self.list_data_v264_long, tuple(data))
class TestServerGroupShow(TestServerGroup): class TestServerGroupShow(TestServerGroup):
def setUp(self): def setUp(self):
super().setUp() super().setUp()

View File

@@ -22,7 +22,6 @@ from openstackclient.tests.unit.image.v2 import fakes as image_fakes
class TestServerImage(compute_fakes.TestComputev2): class TestServerImage(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super(TestServerImage, self).setUp() super(TestServerImage, self).setUp()
@@ -57,11 +56,16 @@ class TestServerImage(compute_fakes.TestComputev2):
class TestServerImageCreate(TestServerImage): class TestServerImageCreate(TestServerImage):
def image_columns(self, image): def image_columns(self, image):
# columnlist = tuple(sorted(image.keys())) # columnlist = tuple(sorted(image.keys()))
columnlist = ( columnlist = (
'id', 'name', 'owner', 'protected', 'status', 'tags', 'visibility' 'id',
'name',
'owner',
'protected',
'status',
'tags',
'visibility',
) )
return columnlist return columnlist
@@ -141,8 +145,10 @@ class TestServerImageCreate(TestServerImage):
images = self.setup_images_mock(count=1, servers=servers) images = self.setup_images_mock(count=1, servers=servers)
arglist = [ arglist = [
'--name', 'img-nam', '--name',
'--property', 'key=value', 'img-nam',
'--property',
'key=value',
servers[0].id, servers[0].id,
] ]
verifylist = [ verifylist = [
@@ -194,9 +200,7 @@ class TestServerImageCreate(TestServerImage):
) )
mock_wait_for_status.assert_called_once_with( mock_wait_for_status.assert_called_once_with(
self.images_mock.get_image, self.images_mock.get_image, images[0].id, callback=mock.ANY
images[0].id,
callback=mock.ANY
) )
@mock.patch.object(common_utils, 'wait_for_status', return_value=True) @mock.patch.object(common_utils, 'wait_for_status', return_value=True)
@@ -226,9 +230,7 @@ class TestServerImageCreate(TestServerImage):
) )
mock_wait_for_status.assert_called_once_with( mock_wait_for_status.assert_called_once_with(
self.images_mock.get_image, self.images_mock.get_image, images[0].id, callback=mock.ANY
images[0].id,
callback=mock.ANY
) )
self.assertEqual(self.image_columns(images[0]), columns) self.assertEqual(self.image_columns(images[0]), columns)

View File

@@ -23,7 +23,6 @@ from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
class TestServerMigration(compute_fakes.TestComputev2): class TestServerMigration(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -32,8 +31,9 @@ class TestServerMigration(compute_fakes.TestComputev2):
self.servers_mock.reset_mock() self.servers_mock.reset_mock()
# Get a shortcut to the compute client ServerMigrationsManager Mock # Get a shortcut to the compute client ServerMigrationsManager Mock
self.server_migrations_mock = \ self.server_migrations_mock = (
self.app.client_manager.compute.server_migrations self.app.client_manager.compute.server_migrations
)
self.server_migrations_mock.reset_mock() self.server_migrations_mock.reset_mock()
self.app.client_manager.sdk_connection = mock.Mock() self.app.client_manager.sdk_connection = mock.Mock()
@@ -41,7 +41,8 @@ class TestServerMigration(compute_fakes.TestComputev2):
self.sdk_client = self.app.client_manager.sdk_connection.compute self.sdk_client = self.app.client_manager.sdk_connection.compute
patcher = mock.patch.object( patcher = mock.patch.object(
sdk_utils, 'supports_microversion', return_value=True) sdk_utils, 'supports_microversion', return_value=True
)
self.addCleanup(patcher.stop) self.addCleanup(patcher.stop)
self.supports_microversion_mock = patcher.start() self.supports_microversion_mock = patcher.start()
@@ -49,23 +50,40 @@ class TestServerMigration(compute_fakes.TestComputev2):
"""Set a specific microversion for the mock supports_microversion().""" """Set a specific microversion for the mock supports_microversion()."""
self.supports_microversion_mock.reset_mock(return_value=True) self.supports_microversion_mock.reset_mock(return_value=True)
self.supports_microversion_mock.side_effect = ( self.supports_microversion_mock.side_effect = (
lambda _, v: lambda _, v: api_versions.APIVersion(v)
api_versions.APIVersion(v) <= api_versions.APIVersion(mock_v)) <= api_versions.APIVersion(mock_v)
)
class TestListMigration(TestServerMigration): class TestListMigration(TestServerMigration):
"""Test fetch all migrations.""" """Test fetch all migrations."""
MIGRATION_COLUMNS = [ MIGRATION_COLUMNS = [
'Source Node', 'Dest Node', 'Source Compute', 'Source Node',
'Dest Compute', 'Dest Host', 'Status', 'Server UUID', 'Dest Node',
'Old Flavor', 'New Flavor', 'Created At', 'Updated At' 'Source Compute',
'Dest Compute',
'Dest Host',
'Status',
'Server UUID',
'Old Flavor',
'New Flavor',
'Created At',
'Updated At',
] ]
MIGRATION_FIELDS = [ MIGRATION_FIELDS = [
'source_node', 'dest_node', 'source_compute', 'source_node',
'dest_compute', 'dest_host', 'status', 'server_id', 'old_flavor_id', 'dest_node',
'new_flavor_id', 'created_at', 'updated_at' 'source_compute',
'dest_compute',
'dest_host',
'status',
'server_id',
'old_flavor_id',
'new_flavor_id',
'created_at',
'updated_at',
] ]
def setUp(self): def setUp(self):
@@ -79,8 +97,10 @@ class TestListMigration(TestServerMigration):
self.migrations = compute_fakes.create_migrations(count=3) self.migrations = compute_fakes.create_migrations(count=3)
self.sdk_client.migrations.return_value = self.migrations self.sdk_client.migrations.return_value = self.migrations
self.data = (common_utils.get_item_properties( self.data = (
s, self.MIGRATION_FIELDS) for s in self.migrations) common_utils.get_item_properties(s, self.MIGRATION_FIELDS)
for s in self.migrations
)
# Get the command object to test # Get the command object to test
self.cmd = server_migration.ListMigration(self.app, None) self.cmd = server_migration.ListMigration(self.app, None)
@@ -102,10 +122,14 @@ class TestListMigration(TestServerMigration):
def test_server_migration_list(self): def test_server_migration_list(self):
arglist = [ arglist = [
'--server', 'server1', '--server',
'--host', 'host1', 'server1',
'--status', 'migrating', '--host',
'--type', 'cold-migration', 'host1',
'--status',
'migrating',
'--type',
'cold-migration',
] ]
verifylist = [ verifylist = [
('server', 'server1'), ('server', 'server1'),
@@ -131,19 +155,39 @@ class TestListMigration(TestServerMigration):
class TestListMigrationV223(TestListMigration): class TestListMigrationV223(TestListMigration):
"""Test fetch all migrations. """ """Test fetch all migrations."""
MIGRATION_COLUMNS = [ MIGRATION_COLUMNS = [
'Id', 'Source Node', 'Dest Node', 'Source Compute', 'Dest Compute', 'Id',
'Dest Host', 'Status', 'Server UUID', 'Old Flavor', 'New Flavor', 'Source Node',
'Type', 'Created At', 'Updated At' 'Dest Node',
'Source Compute',
'Dest Compute',
'Dest Host',
'Status',
'Server UUID',
'Old Flavor',
'New Flavor',
'Type',
'Created At',
'Updated At',
] ]
# These are the Migration object fields. # These are the Migration object fields.
MIGRATION_FIELDS = [ MIGRATION_FIELDS = [
'id', 'source_node', 'dest_node', 'source_compute', 'dest_compute', 'id',
'dest_host', 'status', 'server_id', 'old_flavor_id', 'source_node',
'new_flavor_id', 'migration_type', 'created_at', 'updated_at' 'dest_node',
'source_compute',
'dest_compute',
'dest_host',
'status',
'server_id',
'old_flavor_id',
'new_flavor_id',
'migration_type',
'created_at',
'updated_at',
] ]
def setUp(self): def setUp(self):
@@ -152,12 +196,8 @@ class TestListMigrationV223(TestListMigration):
self._set_mock_microversion('2.23') self._set_mock_microversion('2.23')
def test_server_migration_list(self): def test_server_migration_list(self):
arglist = [ arglist = ['--status', 'migrating']
'--status', 'migrating' verifylist = [('status', 'migrating')]
]
verifylist = [
('status', 'migrating')
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
@@ -173,20 +213,41 @@ class TestListMigrationV223(TestListMigration):
class TestListMigrationV259(TestListMigration): class TestListMigrationV259(TestListMigration):
"""Test fetch all migrations. """ """Test fetch all migrations."""
MIGRATION_COLUMNS = [ MIGRATION_COLUMNS = [
'Id', 'UUID', 'Source Node', 'Dest Node', 'Source Compute', 'Id',
'Dest Compute', 'Dest Host', 'Status', 'Server UUID', 'UUID',
'Old Flavor', 'New Flavor', 'Type', 'Created At', 'Updated At' 'Source Node',
'Dest Node',
'Source Compute',
'Dest Compute',
'Dest Host',
'Status',
'Server UUID',
'Old Flavor',
'New Flavor',
'Type',
'Created At',
'Updated At',
] ]
# These are the Migration object fields. # These are the Migration object fields.
MIGRATION_FIELDS = [ MIGRATION_FIELDS = [
'id', 'uuid', 'source_node', 'dest_node', 'source_compute', 'id',
'dest_compute', 'dest_host', 'status', 'server_id', 'uuid',
'old_flavor_id', 'new_flavor_id', 'migration_type', 'source_node',
'created_at', 'updated_at' 'dest_node',
'source_compute',
'dest_compute',
'dest_host',
'status',
'server_id',
'old_flavor_id',
'new_flavor_id',
'migration_type',
'created_at',
'updated_at',
] ]
def setUp(self): def setUp(self):
@@ -196,16 +257,20 @@ class TestListMigrationV259(TestListMigration):
def test_server_migration_list(self): def test_server_migration_list(self):
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--limit', '1', 'migrating',
'--marker', 'test_kp', '--limit',
'--changes-since', '2019-08-09T08:03:25Z' '1',
'--marker',
'test_kp',
'--changes-since',
'2019-08-09T08:03:25Z',
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
('limit', 1), ('limit', 1),
('marker', 'test_kp'), ('marker', 'test_kp'),
('changes_since', '2019-08-09T08:03:25Z') ('changes_since', '2019-08-09T08:03:25Z'),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
@@ -226,77 +291,85 @@ class TestListMigrationV259(TestListMigration):
def test_server_migration_list_with_limit_pre_v259(self): def test_server_migration_list_with_limit_pre_v259(self):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
arglist = [ arglist = ['--status', 'migrating', '--limit', '1']
'--status', 'migrating', verifylist = [('status', 'migrating'), ('limit', 1)]
'--limit', '1'
]
verifylist = [
('status', 'migrating'),
('limit', 1)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.59 or greater is required', '--os-compute-api-version 2.59 or greater is required', str(ex)
str(ex)) )
def test_server_migration_list_with_marker_pre_v259(self): def test_server_migration_list_with_marker_pre_v259(self):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
arglist = [ arglist = ['--status', 'migrating', '--marker', 'test_kp']
'--status', 'migrating', verifylist = [('status', 'migrating'), ('marker', 'test_kp')]
'--marker', 'test_kp'
]
verifylist = [
('status', 'migrating'),
('marker', 'test_kp')
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.59 or greater is required', '--os-compute-api-version 2.59 or greater is required', str(ex)
str(ex)) )
def test_server_migration_list_with_changes_since_pre_v259(self): def test_server_migration_list_with_changes_since_pre_v259(self):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--changes-since', '2019-08-09T08:03:25Z' 'migrating',
'--changes-since',
'2019-08-09T08:03:25Z',
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
('changes_since', '2019-08-09T08:03:25Z') ('changes_since', '2019-08-09T08:03:25Z'),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.59 or greater is required', '--os-compute-api-version 2.59 or greater is required', str(ex)
str(ex)) )
class TestListMigrationV266(TestListMigration): class TestListMigrationV266(TestListMigration):
"""Test fetch all migrations by changes-before. """ """Test fetch all migrations by changes-before."""
MIGRATION_COLUMNS = [ MIGRATION_COLUMNS = [
'Id', 'UUID', 'Source Node', 'Dest Node', 'Source Compute', 'Id',
'Dest Compute', 'Dest Host', 'Status', 'Server UUID', 'UUID',
'Old Flavor', 'New Flavor', 'Type', 'Created At', 'Updated At' 'Source Node',
'Dest Node',
'Source Compute',
'Dest Compute',
'Dest Host',
'Status',
'Server UUID',
'Old Flavor',
'New Flavor',
'Type',
'Created At',
'Updated At',
] ]
# These are the Migration object fields. # These are the Migration object fields.
MIGRATION_FIELDS = [ MIGRATION_FIELDS = [
'id', 'uuid', 'source_node', 'dest_node', 'source_compute', 'id',
'dest_compute', 'dest_host', 'status', 'server_id', 'uuid',
'old_flavor_id', 'new_flavor_id', 'migration_type', 'source_node',
'created_at', 'updated_at' 'dest_node',
'source_compute',
'dest_compute',
'dest_host',
'status',
'server_id',
'old_flavor_id',
'new_flavor_id',
'migration_type',
'created_at',
'updated_at',
] ]
def setUp(self): def setUp(self):
@@ -306,18 +379,23 @@ class TestListMigrationV266(TestListMigration):
def test_server_migration_list_with_changes_before(self): def test_server_migration_list_with_changes_before(self):
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--limit', '1', 'migrating',
'--marker', 'test_kp', '--limit',
'--changes-since', '2019-08-07T08:03:25Z', '1',
'--changes-before', '2019-08-09T08:03:25Z' '--marker',
'test_kp',
'--changes-since',
'2019-08-07T08:03:25Z',
'--changes-before',
'2019-08-09T08:03:25Z',
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
('limit', 1), ('limit', 1),
('marker', 'test_kp'), ('marker', 'test_kp'),
('changes_since', '2019-08-07T08:03:25Z'), ('changes_since', '2019-08-07T08:03:25Z'),
('changes_before', '2019-08-09T08:03:25Z') ('changes_before', '2019-08-09T08:03:25Z'),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
@@ -340,38 +418,60 @@ class TestListMigrationV266(TestListMigration):
def test_server_migration_list_with_changes_before_pre_v266(self): def test_server_migration_list_with_changes_before_pre_v266(self):
self._set_mock_microversion('2.65') self._set_mock_microversion('2.65')
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--changes-before', '2019-08-09T08:03:25Z' 'migrating',
'--changes-before',
'2019-08-09T08:03:25Z',
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
('changes_before', '2019-08-09T08:03:25Z') ('changes_before', '2019-08-09T08:03:25Z'),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.66 or greater is required', '--os-compute-api-version 2.66 or greater is required', str(ex)
str(ex)) )
class TestListMigrationV280(TestListMigration): class TestListMigrationV280(TestListMigration):
"""Test fetch all migrations by user-id and/or project-id. """ """Test fetch all migrations by user-id and/or project-id."""
MIGRATION_COLUMNS = [ MIGRATION_COLUMNS = [
'Id', 'UUID', 'Source Node', 'Dest Node', 'Source Compute', 'Id',
'Dest Compute', 'Dest Host', 'Status', 'Server UUID', 'UUID',
'Old Flavor', 'New Flavor', 'Type', 'Created At', 'Updated At' 'Source Node',
'Dest Node',
'Source Compute',
'Dest Compute',
'Dest Host',
'Status',
'Server UUID',
'Old Flavor',
'New Flavor',
'Type',
'Created At',
'Updated At',
] ]
# These are the Migration object fields. # These are the Migration object fields.
MIGRATION_FIELDS = [ MIGRATION_FIELDS = [
'id', 'uuid', 'source_node', 'dest_node', 'source_compute', 'id',
'dest_compute', 'dest_host', 'status', 'server_id', 'uuid',
'old_flavor_id', 'new_flavor_id', 'migration_type', 'source_node',
'created_at', 'updated_at' 'dest_node',
'source_compute',
'dest_compute',
'dest_host',
'status',
'server_id',
'old_flavor_id',
'new_flavor_id',
'migration_type',
'created_at',
'updated_at',
] ]
project = identity_fakes.FakeProject.create_one_project() project = identity_fakes.FakeProject.create_one_project()
@@ -393,12 +493,18 @@ class TestListMigrationV280(TestListMigration):
def test_server_migration_list_with_project(self): def test_server_migration_list_with_project(self):
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--limit', '1', 'migrating',
'--marker', 'test_kp', '--limit',
'--changes-since', '2019-08-07T08:03:25Z', '1',
'--changes-before', '2019-08-09T08:03:25Z', '--marker',
'--project', self.project.id 'test_kp',
'--changes-since',
'2019-08-07T08:03:25Z',
'--changes-before',
'2019-08-09T08:03:25Z',
'--project',
self.project.id,
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
@@ -406,7 +512,7 @@ class TestListMigrationV280(TestListMigration):
('marker', 'test_kp'), ('marker', 'test_kp'),
('changes_since', '2019-08-07T08:03:25Z'), ('changes_since', '2019-08-07T08:03:25Z'),
('changes_before', '2019-08-09T08:03:25Z'), ('changes_before', '2019-08-09T08:03:25Z'),
('project', self.project.id) ('project', self.project.id),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
@@ -425,9 +531,11 @@ class TestListMigrationV280(TestListMigration):
self.sdk_client.migrations.assert_called_with(**kwargs) self.sdk_client.migrations.assert_called_with(**kwargs)
self.MIGRATION_COLUMNS.insert( self.MIGRATION_COLUMNS.insert(
len(self.MIGRATION_COLUMNS) - 2, "Project") len(self.MIGRATION_COLUMNS) - 2, "Project"
)
self.MIGRATION_FIELDS.insert( self.MIGRATION_FIELDS.insert(
len(self.MIGRATION_FIELDS) - 2, "project_id") len(self.MIGRATION_FIELDS) - 2, "project_id"
)
self.assertEqual(self.MIGRATION_COLUMNS, columns) self.assertEqual(self.MIGRATION_COLUMNS, columns)
self.assertEqual(tuple(self.data), tuple(data)) self.assertEqual(tuple(self.data), tuple(data))
# Clean up global variables MIGRATION_COLUMNS # Clean up global variables MIGRATION_COLUMNS
@@ -438,32 +546,40 @@ class TestListMigrationV280(TestListMigration):
def test_get_migrations_with_project_pre_v280(self): def test_get_migrations_with_project_pre_v280(self):
self._set_mock_microversion('2.79') self._set_mock_microversion('2.79')
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--changes-before', '2019-08-09T08:03:25Z', 'migrating',
'--project', '0c2accde-644a-45fa-8c10-e76debc7fbc3' '--changes-before',
'2019-08-09T08:03:25Z',
'--project',
'0c2accde-644a-45fa-8c10-e76debc7fbc3',
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
('changes_before', '2019-08-09T08:03:25Z'), ('changes_before', '2019-08-09T08:03:25Z'),
('project', '0c2accde-644a-45fa-8c10-e76debc7fbc3') ('project', '0c2accde-644a-45fa-8c10-e76debc7fbc3'),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.80 or greater is required', '--os-compute-api-version 2.80 or greater is required', str(ex)
str(ex)) )
def test_server_migration_list_with_user(self): def test_server_migration_list_with_user(self):
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--limit', '1', 'migrating',
'--marker', 'test_kp', '--limit',
'--changes-since', '2019-08-07T08:03:25Z', '1',
'--changes-before', '2019-08-09T08:03:25Z', '--marker',
'--user', self.user.id, 'test_kp',
'--changes-since',
'2019-08-07T08:03:25Z',
'--changes-before',
'2019-08-09T08:03:25Z',
'--user',
self.user.id,
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
@@ -490,10 +606,8 @@ class TestListMigrationV280(TestListMigration):
self.sdk_client.migrations.assert_called_with(**kwargs) self.sdk_client.migrations.assert_called_with(**kwargs)
self.MIGRATION_COLUMNS.insert( self.MIGRATION_COLUMNS.insert(len(self.MIGRATION_COLUMNS) - 2, "User")
len(self.MIGRATION_COLUMNS) - 2, "User") self.MIGRATION_FIELDS.insert(len(self.MIGRATION_FIELDS) - 2, "user_id")
self.MIGRATION_FIELDS.insert(
len(self.MIGRATION_FIELDS) - 2, "user_id")
self.assertEqual(self.MIGRATION_COLUMNS, columns) self.assertEqual(self.MIGRATION_COLUMNS, columns)
self.assertEqual(tuple(self.data), tuple(data)) self.assertEqual(tuple(self.data), tuple(data))
# Clean up global variables MIGRATION_COLUMNS # Clean up global variables MIGRATION_COLUMNS
@@ -504,9 +618,12 @@ class TestListMigrationV280(TestListMigration):
def test_get_migrations_with_user_pre_v280(self): def test_get_migrations_with_user_pre_v280(self):
self._set_mock_microversion('2.79') self._set_mock_microversion('2.79')
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--changes-before', '2019-08-09T08:03:25Z', 'migrating',
'--user', self.user.id, '--changes-before',
'2019-08-09T08:03:25Z',
'--user',
self.user.id,
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
@@ -515,21 +632,26 @@ class TestListMigrationV280(TestListMigration):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.80 or greater is required', '--os-compute-api-version 2.80 or greater is required', str(ex)
str(ex)) )
def test_server_migration_list_with_project_and_user(self): def test_server_migration_list_with_project_and_user(self):
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--limit', '1', 'migrating',
'--changes-since', '2019-08-07T08:03:25Z', '--limit',
'--changes-before', '2019-08-09T08:03:25Z', '1',
'--project', self.project.id, '--changes-since',
'--user', self.user.id, '2019-08-07T08:03:25Z',
'--changes-before',
'2019-08-09T08:03:25Z',
'--project',
self.project.id,
'--user',
self.user.id,
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
@@ -556,13 +678,13 @@ class TestListMigrationV280(TestListMigration):
self.sdk_client.migrations.assert_called_with(**kwargs) self.sdk_client.migrations.assert_called_with(**kwargs)
self.MIGRATION_COLUMNS.insert( self.MIGRATION_COLUMNS.insert(
len(self.MIGRATION_COLUMNS) - 2, "Project") len(self.MIGRATION_COLUMNS) - 2, "Project"
)
self.MIGRATION_FIELDS.insert( self.MIGRATION_FIELDS.insert(
len(self.MIGRATION_FIELDS) - 2, "project_id") len(self.MIGRATION_FIELDS) - 2, "project_id"
self.MIGRATION_COLUMNS.insert( )
len(self.MIGRATION_COLUMNS) - 2, "User") self.MIGRATION_COLUMNS.insert(len(self.MIGRATION_COLUMNS) - 2, "User")
self.MIGRATION_FIELDS.insert( self.MIGRATION_FIELDS.insert(len(self.MIGRATION_FIELDS) - 2, "user_id")
len(self.MIGRATION_FIELDS) - 2, "user_id")
self.assertEqual(self.MIGRATION_COLUMNS, columns) self.assertEqual(self.MIGRATION_COLUMNS, columns)
self.assertEqual(tuple(self.data), tuple(data)) self.assertEqual(tuple(self.data), tuple(data))
# Clean up global variables MIGRATION_COLUMNS # Clean up global variables MIGRATION_COLUMNS
@@ -574,29 +696,31 @@ class TestListMigrationV280(TestListMigration):
def test_get_migrations_with_project_and_user_pre_v280(self): def test_get_migrations_with_project_and_user_pre_v280(self):
self._set_mock_microversion('2.79') self._set_mock_microversion('2.79')
arglist = [ arglist = [
'--status', 'migrating', '--status',
'--changes-before', '2019-08-09T08:03:25Z', 'migrating',
'--project', self.project.id, '--changes-before',
'--user', self.user.id, '2019-08-09T08:03:25Z',
'--project',
self.project.id,
'--user',
self.user.id,
] ]
verifylist = [ verifylist = [
('status', 'migrating'), ('status', 'migrating'),
('changes_before', '2019-08-09T08:03:25Z'), ('changes_before', '2019-08-09T08:03:25Z'),
('project', self.project.id), ('project', self.project.id),
('user', self.user.id) ('user', self.user.id),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.80 or greater is required', '--os-compute-api-version 2.80 or greater is required', str(ex)
str(ex)) )
class TestServerMigrationShow(TestServerMigration): class TestServerMigrationShow(TestServerMigration):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -604,8 +728,9 @@ class TestServerMigrationShow(TestServerMigration):
self.sdk_client.find_server.return_value = self.server self.sdk_client.find_server.return_value = self.server
self.server_migration = compute_fakes.create_one_server_migration() self.server_migration = compute_fakes.create_one_server_migration()
self.sdk_client.get_server_migration.return_value =\ self.sdk_client.get_server_migration.return_value = (
self.server_migration self.server_migration
)
self.sdk_client.server_migrations.return_value = iter( self.sdk_client.server_migrations.return_value = iter(
[self.server_migration] [self.server_migration]
) )
@@ -665,9 +790,11 @@ class TestServerMigrationShow(TestServerMigration):
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
self.sdk_client.find_server.assert_called_with( self.sdk_client.find_server.assert_called_with(
self.server.id, ignore_missing=False) self.server.id, ignore_missing=False
)
self.sdk_client.get_server_migration.assert_called_with( self.sdk_client.get_server_migration.assert_called_with(
self.server.id, '2', ignore_missing=False) self.server.id, '2', ignore_missing=False
)
def test_server_migration_show(self): def test_server_migration_show(self):
self._set_mock_microversion('2.24') self._set_mock_microversion('2.24')
@@ -705,12 +832,11 @@ class TestServerMigrationShow(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.24 or greater is required', '--os-compute-api-version 2.24 or greater is required', str(ex)
str(ex)) )
def test_server_migration_show_by_uuid(self): def test_server_migration_show_by_uuid(self):
self._set_mock_microversion('2.59') self._set_mock_microversion('2.59')
@@ -735,7 +861,8 @@ class TestServerMigrationShow(TestServerMigration):
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
self.sdk_client.find_server.assert_called_with( self.sdk_client.find_server.assert_called_with(
self.server.id, ignore_missing=False) self.server.id, ignore_missing=False
)
self.sdk_client.server_migrations.assert_called_with(self.server.id) self.sdk_client.server_migrations.assert_called_with(self.server.id)
self.sdk_client.get_server_migration.assert_not_called() self.sdk_client.get_server_migration.assert_not_called()
@@ -751,12 +878,12 @@ class TestServerMigrationShow(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'In-progress live migration 69f95745-bfe3-4302-90f7-5b0022cba1ce', 'In-progress live migration 69f95745-bfe3-4302-90f7-5b0022cba1ce',
str(ex)) str(ex),
)
def test_server_migration_show_by_uuid_pre_v259(self): def test_server_migration_show_by_uuid_pre_v259(self):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
@@ -769,12 +896,11 @@ class TestServerMigrationShow(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.59 or greater is required', '--os-compute-api-version 2.59 or greater is required', str(ex)
str(ex)) )
def test_server_migration_show_invalid_id(self): def test_server_migration_show_invalid_id(self):
self._set_mock_microversion('2.24') self._set_mock_microversion('2.24')
@@ -787,16 +913,14 @@ class TestServerMigrationShow(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'The <migration> argument must be an ID or UUID', 'The <migration> argument must be an ID or UUID', str(ex)
str(ex)) )
class TestServerMigrationAbort(TestServerMigration): class TestServerMigrationAbort(TestServerMigration):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -821,9 +945,11 @@ class TestServerMigrationAbort(TestServerMigration):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_server.assert_called_with( self.sdk_client.find_server.assert_called_with(
self.server.id, ignore_missing=False) self.server.id, ignore_missing=False
)
self.sdk_client.abort_server_migration.assert_called_with( self.sdk_client.abort_server_migration.assert_called_with(
'2', self.server.id, ignore_missing=False) '2', self.server.id, ignore_missing=False
)
self.assertIsNone(result) self.assertIsNone(result)
def test_migration_abort_pre_v224(self): def test_migration_abort_pre_v224(self):
@@ -837,12 +963,11 @@ class TestServerMigrationAbort(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.24 or greater is required', '--os-compute-api-version 2.24 or greater is required', str(ex)
str(ex)) )
def test_server_migration_abort_by_uuid(self): def test_server_migration_abort_by_uuid(self):
self._set_mock_microversion('2.59') self._set_mock_microversion('2.59')
@@ -862,18 +987,18 @@ class TestServerMigrationAbort(TestServerMigration):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_server.assert_called_with( self.sdk_client.find_server.assert_called_with(
self.server.id, ignore_missing=False) self.server.id, ignore_missing=False
)
self.sdk_client.server_migrations.assert_called_with(self.server.id) self.sdk_client.server_migrations.assert_called_with(self.server.id)
self.sdk_client.abort_server_migration.assert_called_with( self.sdk_client.abort_server_migration.assert_called_with(
self.server_migration.id, self.server.id, ignore_missing=False) self.server_migration.id, self.server.id, ignore_missing=False
)
self.assertIsNone(result) self.assertIsNone(result)
def test_server_migration_abort_by_uuid_no_matches(self): def test_server_migration_abort_by_uuid_no_matches(self):
self._set_mock_microversion('2.59') self._set_mock_microversion('2.59')
self.sdk_client.server_migrations.return_value = iter( self.sdk_client.server_migrations.return_value = iter([])
[]
)
arglist = [ arglist = [
self.server.id, self.server.id,
@@ -883,12 +1008,12 @@ class TestServerMigrationAbort(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'In-progress live migration 69f95745-bfe3-4302-90f7-5b0022cba1ce', 'In-progress live migration 69f95745-bfe3-4302-90f7-5b0022cba1ce',
str(ex)) str(ex),
)
def test_server_migration_abort_by_uuid_pre_v259(self): def test_server_migration_abort_by_uuid_pre_v259(self):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
@@ -901,16 +1026,14 @@ class TestServerMigrationAbort(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.59 or greater is required', '--os-compute-api-version 2.59 or greater is required', str(ex)
str(ex)) )
class TestServerMigrationForceComplete(TestServerMigration): class TestServerMigrationForceComplete(TestServerMigration):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -935,9 +1058,11 @@ class TestServerMigrationForceComplete(TestServerMigration):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_server.assert_called_with( self.sdk_client.find_server.assert_called_with(
self.server.id, ignore_missing=False) self.server.id, ignore_missing=False
self.sdk_client.force_complete_server_migration\ )
.assert_called_with('2', self.server.id) self.sdk_client.force_complete_server_migration.assert_called_with(
'2', self.server.id
)
self.assertIsNone(result) self.assertIsNone(result)
def test_migration_force_complete_pre_v222(self): def test_migration_force_complete_pre_v222(self):
@@ -951,12 +1076,11 @@ class TestServerMigrationForceComplete(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.22 or greater is required', '--os-compute-api-version 2.22 or greater is required', str(ex)
str(ex)) )
def test_server_migration_force_complete_by_uuid(self): def test_server_migration_force_complete_by_uuid(self):
self._set_mock_microversion('2.59') self._set_mock_microversion('2.59')
@@ -976,10 +1100,12 @@ class TestServerMigrationForceComplete(TestServerMigration):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.find_server.assert_called_with( self.sdk_client.find_server.assert_called_with(
self.server.id, ignore_missing=False) self.server.id, ignore_missing=False
)
self.sdk_client.server_migrations.assert_called_with(self.server.id) self.sdk_client.server_migrations.assert_called_with(self.server.id)
self.sdk_client.force_complete_server_migration.\ self.sdk_client.force_complete_server_migration.assert_called_with(
assert_called_with(self.server_migration.id, self.server.id) self.server_migration.id, self.server.id
)
self.assertIsNone(result) self.assertIsNone(result)
def test_server_migration_force_complete_by_uuid_no_matches(self): def test_server_migration_force_complete_by_uuid_no_matches(self):
@@ -995,12 +1121,12 @@ class TestServerMigrationForceComplete(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'In-progress live migration 69f95745-bfe3-4302-90f7-5b0022cba1ce', 'In-progress live migration 69f95745-bfe3-4302-90f7-5b0022cba1ce',
str(ex)) str(ex),
)
def test_server_migration_force_complete_by_uuid_pre_v259(self): def test_server_migration_force_complete_by_uuid_pre_v259(self):
self._set_mock_microversion('2.58') self._set_mock_microversion('2.58')
@@ -1013,9 +1139,8 @@ class TestServerMigrationForceComplete(TestServerMigration):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
ex = self.assertRaises( ex = self.assertRaises(
exceptions.CommandError, exceptions.CommandError, self.cmd.take_action, parsed_args
self.cmd.take_action, )
parsed_args)
self.assertIn( self.assertIn(
'--os-compute-api-version 2.59 or greater is required', '--os-compute-api-version 2.59 or greater is required', str(ex)
str(ex)) )

View File

@@ -23,7 +23,6 @@ from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes
class TestServerVolume(compute_fakes.TestComputev2): class TestServerVolume(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -35,7 +34,6 @@ class TestServerVolume(compute_fakes.TestComputev2):
class TestServerVolumeList(TestServerVolume): class TestServerVolumeList(TestServerVolume):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -44,15 +42,17 @@ class TestServerVolumeList(TestServerVolume):
self.compute_client.find_server.return_value = self.server self.compute_client.find_server.return_value = self.server
self.compute_client.volume_attachments.return_value = ( self.compute_client.volume_attachments.return_value = (
self.volume_attachments) self.volume_attachments
)
# Get the command object to test # Get the command object to test
self.cmd = server_volume.ListServerVolume(self.app, None) self.cmd = server_volume.ListServerVolume(self.app, None)
@mock.patch.object(sdk_utils, 'supports_microversion') @mock.patch.object(sdk_utils, 'supports_microversion')
def test_server_volume_list(self, sm_mock): def test_server_volume_list(self, sm_mock):
self.app.client_manager.compute.api_version = \ self.app.client_manager.compute.api_version = api_versions.APIVersion(
api_versions.APIVersion('2.1') '2.1'
)
sm_mock.side_effect = [False, False, False, False] sm_mock.side_effect = [False, False, False, False]
arglist = [ arglist = [
@@ -102,7 +102,14 @@ class TestServerVolumeList(TestServerVolume):
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.assertEqual( self.assertEqual(
('ID', 'Device', 'Server ID', 'Volume ID', 'Tag',), columns, (
'ID',
'Device',
'Server ID',
'Volume ID',
'Tag',
),
columns,
) )
self.assertEqual( self.assertEqual(
( (
@@ -142,7 +149,11 @@ class TestServerVolumeList(TestServerVolume):
self.assertEqual( self.assertEqual(
( (
'ID', 'Device', 'Server ID', 'Volume ID', 'Tag', 'ID',
'Device',
'Server ID',
'Volume ID',
'Tag',
'Delete On Termination?', 'Delete On Termination?',
), ),
columns, columns,
@@ -174,7 +185,6 @@ class TestServerVolumeList(TestServerVolume):
@mock.patch.object(sdk_utils, 'supports_microversion') @mock.patch.object(sdk_utils, 'supports_microversion')
def test_server_volume_list_with_attachment_ids(self, sm_mock): def test_server_volume_list_with_attachment_ids(self, sm_mock):
sm_mock.side_effect = [True, True, True, True] sm_mock.side_effect = [True, True, True, True]
arglist = [ arglist = [
self.server.id, self.server.id,
@@ -188,8 +198,12 @@ class TestServerVolumeList(TestServerVolume):
self.assertEqual( self.assertEqual(
( (
'Device', 'Server ID', 'Volume ID', 'Tag', 'Device',
'Delete On Termination?', 'Attachment ID', 'Server ID',
'Volume ID',
'Tag',
'Delete On Termination?',
'Attachment ID',
'BlockDeviceMapping UUID', 'BlockDeviceMapping UUID',
), ),
columns, columns,
@@ -203,8 +217,7 @@ class TestServerVolumeList(TestServerVolume):
self.volume_attachments[0].tag, self.volume_attachments[0].tag,
self.volume_attachments[0].delete_on_termination, self.volume_attachments[0].delete_on_termination,
self.volume_attachments[0].attachment_id, self.volume_attachments[0].attachment_id,
self.volume_attachments[0].bdm_id self.volume_attachments[0].bdm_id,
), ),
( (
self.volume_attachments[1].device, self.volume_attachments[1].device,
@@ -213,7 +226,7 @@ class TestServerVolumeList(TestServerVolume):
self.volume_attachments[1].tag, self.volume_attachments[1].tag,
self.volume_attachments[1].delete_on_termination, self.volume_attachments[1].delete_on_termination,
self.volume_attachments[1].attachment_id, self.volume_attachments[1].attachment_id,
self.volume_attachments[1].bdm_id self.volume_attachments[1].bdm_id,
), ),
), ),
tuple(data), tuple(data),
@@ -224,7 +237,6 @@ class TestServerVolumeList(TestServerVolume):
class TestServerVolumeUpdate(TestServerVolume): class TestServerVolumeUpdate(TestServerVolume):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -299,15 +311,14 @@ class TestServerVolumeUpdate(TestServerVolume):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.compute_client.update_volume_attachment.assert_called_once_with( self.compute_client.update_volume_attachment.assert_called_once_with(
self.server, self.server, self.volume, delete_on_termination=False
self.volume,
delete_on_termination=False
) )
self.assertIsNone(result) self.assertIsNone(result)
@mock.patch.object(sdk_utils, 'supports_microversion') @mock.patch.object(sdk_utils, 'supports_microversion')
def test_server_volume_update_with_delete_on_termination_pre_v285( def test_server_volume_update_with_delete_on_termination_pre_v285(
self, sm_mock, self,
sm_mock,
): ):
sm_mock.return_value = False sm_mock.return_value = False
@@ -332,7 +343,8 @@ class TestServerVolumeUpdate(TestServerVolume):
@mock.patch.object(sdk_utils, 'supports_microversion') @mock.patch.object(sdk_utils, 'supports_microversion')
def test_server_volume_update_with_preserve_on_termination_pre_v285( def test_server_volume_update_with_preserve_on_termination_pre_v285(
self, sm_mock, self,
sm_mock,
): ):
sm_mock.return_value = False sm_mock.return_value = False

View File

@@ -25,7 +25,6 @@ from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
class TestService(compute_fakes.TestComputev2): class TestService(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super(TestService, self).setUp() super(TestService, self).setUp()
@@ -35,7 +34,6 @@ class TestService(compute_fakes.TestComputev2):
class TestServiceDelete(TestService): class TestServiceDelete(TestService):
services = compute_fakes.FakeService.create_services(count=2) services = compute_fakes.FakeService.create_services(count=2)
def setUp(self): def setUp(self):
@@ -58,8 +56,7 @@ class TestServiceDelete(TestService):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.delete_service.assert_called_with( self.sdk_client.delete_service.assert_called_with(
self.services[0].binary, self.services[0].binary, ignore_missing=False
ignore_missing=False
) )
self.assertIsNone(result) self.assertIsNone(result)
@@ -85,14 +82,12 @@ class TestServiceDelete(TestService):
self.services[0].binary, self.services[0].binary,
'unexist_service', 'unexist_service',
] ]
verifylist = [ verifylist = [('service', arglist)]
('service', arglist)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
delete_mock_result = [None, exceptions.CommandError] delete_mock_result = [None, exceptions.CommandError]
self.sdk_client.delete_service = ( self.sdk_client.delete_service = mock.Mock(
mock.Mock(side_effect=delete_mock_result) side_effect=delete_mock_result
) )
try: try:
@@ -100,20 +95,18 @@ class TestServiceDelete(TestService):
self.fail('CommandError should be raised.') self.fail('CommandError should be raised.')
except exceptions.CommandError as e: except exceptions.CommandError as e:
self.assertEqual( self.assertEqual(
'1 of 2 compute services failed to delete.', str(e)) '1 of 2 compute services failed to delete.', str(e)
)
self.sdk_client.delete_service.assert_any_call( self.sdk_client.delete_service.assert_any_call(
self.services[0].binary, self.services[0].binary, ignore_missing=False
ignore_missing=False
) )
self.sdk_client.delete_service.assert_any_call( self.sdk_client.delete_service.assert_any_call(
'unexist_service', 'unexist_service', ignore_missing=False
ignore_missing=False
) )
class TestServiceList(TestService): class TestServiceList(TestService):
service = compute_fakes.FakeService.create_one_service() service = compute_fakes.FakeService.create_one_service()
columns = ( columns = (
@@ -125,20 +118,20 @@ class TestServiceList(TestService):
'State', 'State',
'Updated At', 'Updated At',
) )
columns_long = columns + ( columns_long = columns + ('Disabled Reason',)
'Disabled Reason',
)
data = [( data = [
service.id, (
service.binary, service.id,
service.host, service.binary,
service.availability_zone, service.host,
service.status, service.availability_zone,
service.state, service.status,
service.updated_at, service.state,
)] service.updated_at,
data_long = [data[0] + (service.disabled_reason, )] )
]
data_long = [data[0] + (service.disabled_reason,)]
def setUp(self): def setUp(self):
super(TestServiceList, self).setUp() super(TestServiceList, self).setUp()
@@ -150,8 +143,10 @@ class TestServiceList(TestService):
def test_service_list(self): def test_service_list(self):
arglist = [ arglist = [
'--host', self.service.host, '--host',
'--service', self.service.binary, self.service.host,
'--service',
self.service.binary,
] ]
verifylist = [ verifylist = [
('host', self.service.host), ('host', self.service.host),
@@ -177,14 +172,16 @@ class TestServiceList(TestService):
sm_mock.return_value = False sm_mock.return_value = False
arglist = [ arglist = [
'--host', self.service.host, '--host',
'--service', self.service.binary, self.service.host,
'--long' '--service',
self.service.binary,
'--long',
] ]
verifylist = [ verifylist = [
('host', self.service.host), ('host', self.service.host),
('service', self.service.binary), ('service', self.service.binary),
('long', True) ('long', True),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -206,18 +203,21 @@ class TestServiceList(TestService):
sm_mock.return_value = True sm_mock.return_value = True
arglist = [ arglist = [
'--host', self.service.host, '--host',
'--service', self.service.binary, self.service.host,
'--long' '--service',
self.service.binary,
'--long',
] ]
verifylist = [ verifylist = [
('host', self.service.host), ('host', self.service.host),
('service', self.service.binary), ('service', self.service.binary),
('long', True) ('long', True),
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.app.client_manager.compute.api_version = api_versions.APIVersion( self.app.client_manager.compute.api_version = api_versions.APIVersion(
'2.11') '2.11'
)
# In base command class Lister in cliff, abstract method take_action() # In base command class Lister in cliff, abstract method take_action()
# returns a tuple containing the column names and an iterable # returns a tuple containing the column names and an iterable
@@ -238,7 +238,6 @@ class TestServiceList(TestService):
class TestServiceSet(TestService): class TestServiceSet(TestService):
def setUp(self): def setUp(self):
super(TestServiceSet, self).setUp() super(TestServiceSet, self).setUp()
@@ -285,9 +284,7 @@ class TestServiceSet(TestService):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.enable_service.assert_called_with( self.sdk_client.enable_service.assert_called_with(
None, None, self.service.host, self.service.binary
self.service.host,
self.service.binary
) )
self.assertIsNone(result) self.assertIsNone(result)
@@ -309,10 +306,7 @@ class TestServiceSet(TestService):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.disable_service.assert_called_with( self.sdk_client.disable_service.assert_called_with(
None, None, self.service.host, self.service.binary, None
self.service.host,
self.service.binary,
None
) )
self.assertIsNone(result) self.assertIsNone(result)
@@ -322,7 +316,8 @@ class TestServiceSet(TestService):
reason = 'earthquake' reason = 'earthquake'
arglist = [ arglist = [
'--disable', '--disable',
'--disable-reason', reason, '--disable-reason',
reason,
self.service.host, self.service.host,
self.service.binary, self.service.binary,
] ]
@@ -337,10 +332,7 @@ class TestServiceSet(TestService):
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.disable_service.assert_called_with( self.sdk_client.disable_service.assert_called_with(
None, None, self.service.host, self.service.binary, reason
self.service.host,
self.service.binary,
reason
) )
self.assertIsNone(result) self.assertIsNone(result)
@@ -349,7 +341,8 @@ class TestServiceSet(TestService):
sm_mock.return_value = False sm_mock.return_value = False
reason = 'earthquake' reason = 'earthquake'
arglist = [ arglist = [
'--disable-reason', reason, '--disable-reason',
reason,
self.service.host, self.service.host,
self.service.binary, self.service.binary,
] ]
@@ -363,8 +356,11 @@ class TestServiceSet(TestService):
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.fail("CommandError should be raised.") self.fail("CommandError should be raised.")
except exceptions.CommandError as e: except exceptions.CommandError as e:
self.assertEqual("Cannot specify option --disable-reason without " self.assertEqual(
"--disable specified.", str(e)) "Cannot specify option --disable-reason without "
"--disable specified.",
str(e),
)
@mock.patch.object(sdk_utils, 'supports_microversion') @mock.patch.object(sdk_utils, 'supports_microversion')
def test_service_set_enable_with_disable_reason(self, sm_mock): def test_service_set_enable_with_disable_reason(self, sm_mock):
@@ -372,7 +368,8 @@ class TestServiceSet(TestService):
reason = 'earthquake' reason = 'earthquake'
arglist = [ arglist = [
'--enable', '--enable',
'--disable-reason', reason, '--disable-reason',
reason,
self.service.host, self.service.host,
self.service.binary, self.service.binary,
] ]
@@ -387,8 +384,11 @@ class TestServiceSet(TestService):
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.fail("CommandError should be raised.") self.fail("CommandError should be raised.")
except exceptions.CommandError as e: except exceptions.CommandError as e:
self.assertEqual("Cannot specify option --disable-reason without " self.assertEqual(
"--disable specified.", str(e)) "Cannot specify option --disable-reason without "
"--disable specified.",
str(e),
)
@mock.patch.object(sdk_utils, 'supports_microversion') @mock.patch.object(sdk_utils, 'supports_microversion')
def test_service_set_state_up(self, sm_mock): def test_service_set_state_up(self, sm_mock):
@@ -406,10 +406,7 @@ class TestServiceSet(TestService):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.update_service_forced_down.assert_called_once_with( self.sdk_client.update_service_forced_down.assert_called_once_with(
None, None, self.service.host, self.service.binary, False
self.service.host,
self.service.binary,
False
) )
self.assertNotCalled(self.sdk_client.enable_service) self.assertNotCalled(self.sdk_client.enable_service)
self.assertNotCalled(self.sdk_client.disable_service) self.assertNotCalled(self.sdk_client.disable_service)
@@ -431,10 +428,7 @@ class TestServiceSet(TestService):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.update_service_forced_down.assert_called_once_with( self.sdk_client.update_service_forced_down.assert_called_once_with(
None, None, self.service.host, self.service.binary, True
self.service.host,
self.service.binary,
True
) )
self.assertNotCalled(self.sdk_client.enable_service) self.assertNotCalled(self.sdk_client.enable_service)
self.assertNotCalled(self.sdk_client.disable_service) self.assertNotCalled(self.sdk_client.disable_service)
@@ -458,15 +452,10 @@ class TestServiceSet(TestService):
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.enable_service.assert_called_once_with( self.sdk_client.enable_service.assert_called_once_with(
None, None, self.service.host, self.service.binary
self.service.host,
self.service.binary
) )
self.sdk_client.update_service_forced_down.assert_called_once_with( self.sdk_client.update_service_forced_down.assert_called_once_with(
None, None, self.service.host, self.service.binary, True
self.service.host,
self.service.binary,
True
) )
self.assertIsNone(result) self.assertIsNone(result)
@@ -487,15 +476,14 @@ class TestServiceSet(TestService):
] ]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
with mock.patch.object(self.sdk_client, 'enable_service', with mock.patch.object(
side_effect=Exception()): self.sdk_client, 'enable_service', side_effect=Exception()
self.assertRaises(exceptions.CommandError, ):
self.cmd.take_action, parsed_args) self.assertRaises(
exceptions.CommandError, self.cmd.take_action, parsed_args
)
self.sdk_client.update_service_forced_down.assert_called_once_with( self.sdk_client.update_service_forced_down.assert_called_once_with(
None, None, self.service.host, self.service.binary, True
self.service.host,
self.service.binary,
True
) )
@mock.patch.object(sdk_utils, 'supports_microversion') @mock.patch.object(sdk_utils, 'supports_microversion')
@@ -520,16 +508,11 @@ class TestServiceSet(TestService):
self.sdk_client.services.return_value = [mock.Mock(id=service_id)] self.sdk_client.services.return_value = [mock.Mock(id=service_id)]
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.disable_service.assert_called_once_with( self.sdk_client.disable_service.assert_called_once_with(
service_id, service_id, self.service.host, self.service.binary, None
self.service.host,
self.service.binary,
None
) )
self.sdk_client.update_service_forced_down.assert_called_once_with( self.sdk_client.update_service_forced_down.assert_called_once_with(
service_id, service_id, self.service.host, self.service.binary, True
self.service.host, )
self.service.binary,
True)
self.assertIsNone(result) self.assertIsNone(result)
@mock.patch.object(sdk_utils, 'supports_microversion') @mock.patch.object(sdk_utils, 'supports_microversion')
@@ -540,7 +523,8 @@ class TestServiceSet(TestService):
reason = 'earthquake' reason = 'earthquake'
arglist = [ arglist = [
'--disable', '--disable',
'--disable-reason', reason, '--disable-reason',
reason,
self.service.host, self.service.host,
self.service.binary, self.service.binary,
] ]
@@ -555,10 +539,7 @@ class TestServiceSet(TestService):
self.sdk_client.services.return_value = [mock.Mock(id=service_id)] self.sdk_client.services.return_value = [mock.Mock(id=service_id)]
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.disable_service.assert_called_once_with( self.sdk_client.disable_service.assert_called_once_with(
service_id, service_id, self.service.host, self.service.binary, reason
self.service.host,
self.service.binary,
reason
) )
self.assertIsNone(result) self.assertIsNone(result)
@@ -584,33 +565,41 @@ class TestServiceSet(TestService):
self.sdk_client.services.return_value = [mock.Mock(id=service_id)] self.sdk_client.services.return_value = [mock.Mock(id=service_id)]
result = self.cmd.take_action(parsed_args) result = self.cmd.take_action(parsed_args)
self.sdk_client.enable_service.assert_called_once_with( self.sdk_client.enable_service.assert_called_once_with(
service_id, service_id, self.service.host, self.service.binary
self.service.host,
self.service.binary
) )
self.sdk_client.update_service_forced_down.assert_called_once_with( self.sdk_client.update_service_forced_down.assert_called_once_with(
service_id, service_id, self.service.host, self.service.binary, False
self.service.host,
self.service.binary,
False
) )
self.assertIsNone(result) self.assertIsNone(result)
def test_service_set_find_service_by_host_and_binary_no_results(self): def test_service_set_find_service_by_host_and_binary_no_results(self):
# Tests that no compute services are found by host and binary. # Tests that no compute services are found by host and binary.
self.sdk_client.services.return_value = [] self.sdk_client.services.return_value = []
ex = self.assertRaises(exceptions.CommandError, ex = self.assertRaises(
self.cmd._find_service_by_host_and_binary, exceptions.CommandError,
self.sdk_client, 'fake-host', 'nova-compute') self.cmd._find_service_by_host_and_binary,
self.assertIn('Compute service for host "fake-host" and binary ' self.sdk_client,
'"nova-compute" not found.', str(ex)) 'fake-host',
'nova-compute',
)
self.assertIn(
'Compute service for host "fake-host" and binary '
'"nova-compute" not found.',
str(ex),
)
def test_service_set_find_service_by_host_and_binary_many_results(self): def test_service_set_find_service_by_host_and_binary_many_results(self):
# Tests that more than one compute service is found by host and binary. # Tests that more than one compute service is found by host and binary.
self.sdk_client.services.return_value = [mock.Mock(), mock.Mock()] self.sdk_client.services.return_value = [mock.Mock(), mock.Mock()]
ex = self.assertRaises(exceptions.CommandError, ex = self.assertRaises(
self.cmd._find_service_by_host_and_binary, exceptions.CommandError,
self.sdk_client, 'fake-host', 'nova-compute') self.cmd._find_service_by_host_and_binary,
self.assertIn('Multiple compute services found for host "fake-host" ' self.sdk_client,
'and binary "nova-compute". Unable to proceed.', 'fake-host',
str(ex)) 'nova-compute',
)
self.assertIn(
'Multiple compute services found for host "fake-host" '
'and binary "nova-compute". Unable to proceed.',
str(ex),
)

View File

@@ -19,7 +19,6 @@ from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
class TestUsage(compute_fakes.TestComputev2): class TestUsage(compute_fakes.TestComputev2):
def setUp(self): def setUp(self):
super(TestUsage, self).setUp() super(TestUsage, self).setUp()
@@ -32,27 +31,29 @@ class TestUsage(compute_fakes.TestComputev2):
class TestUsageList(TestUsage): class TestUsageList(TestUsage):
project = identity_fakes.FakeProject.create_one_project() project = identity_fakes.FakeProject.create_one_project()
# Return value of self.usage_mock.list(). # Return value of self.usage_mock.list().
usages = compute_fakes.FakeUsage.create_usages( usages = compute_fakes.FakeUsage.create_usages(
attrs={'project_id': project.name}, count=1) attrs={'project_id': project.name}, count=1
)
columns = ( columns = (
"Project", "Project",
"Servers", "Servers",
"RAM MB-Hours", "RAM MB-Hours",
"CPU Hours", "CPU Hours",
"Disk GB-Hours" "Disk GB-Hours",
) )
data = [( data = [
usage_cmds.ProjectColumn(usages[0].project_id), (
usage_cmds.CountColumn(usages[0].server_usages), usage_cmds.ProjectColumn(usages[0].project_id),
usage_cmds.FloatColumn(usages[0].total_memory_mb_usage), usage_cmds.CountColumn(usages[0].server_usages),
usage_cmds.FloatColumn(usages[0].total_vcpus_usage), usage_cmds.FloatColumn(usages[0].total_memory_mb_usage),
usage_cmds.FloatColumn(usages[0].total_local_gb_usage), usage_cmds.FloatColumn(usages[0].total_vcpus_usage),
)] usage_cmds.FloatColumn(usages[0].total_local_gb_usage),
)
]
def setUp(self): def setUp(self):
super(TestUsageList, self).setUp() super(TestUsageList, self).setUp()
@@ -64,7 +65,6 @@ class TestUsageList(TestUsage):
self.cmd = usage_cmds.ListUsage(self.app, None) self.cmd = usage_cmds.ListUsage(self.app, None)
def test_usage_list_no_options(self): def test_usage_list_no_options(self):
arglist = [] arglist = []
verifylist = [ verifylist = [
('start', None), ('start', None),
@@ -82,8 +82,10 @@ class TestUsageList(TestUsage):
def test_usage_list_with_options(self): def test_usage_list_with_options(self):
arglist = [ arglist = [
'--start', '2016-11-11', '--start',
'--end', '2016-12-20', '2016-11-11',
'--end',
'2016-12-20',
] ]
verifylist = [ verifylist = [
('start', '2016-11-11'), ('start', '2016-11-11'),
@@ -98,7 +100,8 @@ class TestUsageList(TestUsage):
self.sdk_client.usages.assert_called_with( self.sdk_client.usages.assert_called_with(
start='2016-11-11T00:00:00', start='2016-11-11T00:00:00',
end='2016-12-20T00:00:00', end='2016-12-20T00:00:00',
detailed=True) detailed=True,
)
self.assertCountEqual(self.columns, columns) self.assertCountEqual(self.columns, columns)
self.assertCountEqual(tuple(self.data), tuple(data)) self.assertCountEqual(tuple(self.data), tuple(data))
@@ -115,19 +118,19 @@ class TestUsageList(TestUsage):
columns, data = self.cmd.take_action(parsed_args) columns, data = self.cmd.take_action(parsed_args)
self.projects_mock.list.assert_called_with() self.projects_mock.list.assert_called_with()
self.sdk_client.usages.assert_has_calls([ self.sdk_client.usages.assert_has_calls(
mock.call(start=mock.ANY, end=mock.ANY, detailed=True) [mock.call(start=mock.ANY, end=mock.ANY, detailed=True)]
]) )
self.assertCountEqual(self.columns, columns) self.assertCountEqual(self.columns, columns)
self.assertCountEqual(tuple(self.data), tuple(data)) self.assertCountEqual(tuple(self.data), tuple(data))
class TestUsageShow(TestUsage): class TestUsageShow(TestUsage):
project = identity_fakes.FakeProject.create_one_project() project = identity_fakes.FakeProject.create_one_project()
# Return value of self.usage_mock.list(). # Return value of self.usage_mock.list().
usage = compute_fakes.FakeUsage.create_one_usage( usage = compute_fakes.FakeUsage.create_one_usage(
attrs={'project_id': project.name}) attrs={'project_id': project.name}
)
columns = ( columns = (
'Project', 'Project',
@@ -155,7 +158,6 @@ class TestUsageShow(TestUsage):
self.cmd = usage_cmds.ShowUsage(self.app, None) self.cmd = usage_cmds.ShowUsage(self.app, None)
def test_usage_show_no_options(self): def test_usage_show_no_options(self):
self.app.client_manager.auth_ref = mock.Mock() self.app.client_manager.auth_ref = mock.Mock()
self.app.client_manager.auth_ref.project_id = self.project.id self.app.client_manager.auth_ref.project_id = self.project.id
@@ -174,11 +176,13 @@ class TestUsageShow(TestUsage):
self.assertEqual(self.data, data) self.assertEqual(self.data, data)
def test_usage_show_with_options(self): def test_usage_show_with_options(self):
arglist = [ arglist = [
'--project', self.project.id, '--project',
'--start', '2016-11-11', self.project.id,
'--end', '2016-12-20', '--start',
'2016-11-11',
'--end',
'2016-12-20',
] ]
verifylist = [ verifylist = [
('project', self.project.id), ('project', self.project.id),
@@ -193,7 +197,8 @@ class TestUsageShow(TestUsage):
self.sdk_client.get_usage.assert_called_with( self.sdk_client.get_usage.assert_called_with(
project=self.project.id, project=self.project.id,
start='2016-11-11T00:00:00', start='2016-11-11T00:00:00',
end='2016-12-20T00:00:00') end='2016-12-20T00:00:00',
)
self.assertEqual(self.columns, columns) self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data) self.assertEqual(self.data, data)