Blacken openstackclient.network

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: I8048746dbc2ef0cb582f68934734db4c1153d779
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
Stephen Finucane 2023-05-08 11:03:05 +01:00
parent 35ba1d8f13
commit 6475dc58e8
100 changed files with 10499 additions and 7628 deletions

View File

@ -50,7 +50,9 @@ def build_option_parser(parser):
'--os-network-api-version',
metavar='<network-api-version>',
default=utils.env('OS_NETWORK_API_VERSION'),
help=_("Network API version, default=%s "
"(Env: OS_NETWORK_API_VERSION)") % DEFAULT_API_VERSION
help=_(
"Network API version, default=%s " "(Env: OS_NETWORK_API_VERSION)"
)
% DEFAULT_API_VERSION,
)
return parser

View File

@ -64,6 +64,7 @@ class NetDetectionMixin(metaclass=abc.ABCMeta):
But the command classes are used for docs builds as well, and docs must
present the options for both network types, often qualified accordingly.
"""
@property
def _network_type(self):
"""Discover whether the running cloud is using neutron or nova-network.
@ -85,7 +86,9 @@ class NetDetectionMixin(metaclass=abc.ABCMeta):
except AttributeError:
LOG.warning(
"%s: Could not detect a network type. Assuming we are "
"building docs.", self.__class__.__name__)
"building docs.",
self.__class__.__name__,
)
net_type = None
self._net_type = net_type
return self._net_type
@ -118,11 +121,14 @@ class NetDetectionMixin(metaclass=abc.ABCMeta):
def split_help(network_help, compute_help):
return (
"*%(network_qualifier)s:*\n %(network_help)s\n\n"
"*%(compute_qualifier)s:*\n %(compute_help)s" % dict(
"*%(compute_qualifier)s:*\n %(compute_help)s"
% dict(
network_qualifier=_("Network version 2"),
network_help=network_help,
compute_qualifier=_("Compute version 2"),
compute_help=compute_help))
compute_help=compute_help,
)
)
def get_parser(self, prog_name):
LOG.debug('get_parser(%s)', prog_name)
@ -150,11 +156,13 @@ class NetDetectionMixin(metaclass=abc.ABCMeta):
def take_action(self, parsed_args):
if self.is_neutron:
return self.take_action_network(self.app.client_manager.network,
parsed_args)
return self.take_action_network(
self.app.client_manager.network, parsed_args
)
elif self.is_nova_network:
return self.take_action_compute(self.app.client_manager.compute,
parsed_args)
return self.take_action_compute(
self.app.client_manager.compute, parsed_args
)
def take_action_network(self, client, parsed_args):
"""Override to do something useful."""
@ -165,8 +173,9 @@ class NetDetectionMixin(metaclass=abc.ABCMeta):
pass
class NetworkAndComputeCommand(NetDetectionMixin, command.Command,
metaclass=abc.ABCMeta):
class NetworkAndComputeCommand(
NetDetectionMixin, command.Command, metaclass=abc.ABCMeta
):
"""Network and Compute Command
Command class for commands that support implementation via
@ -174,11 +183,11 @@ class NetworkAndComputeCommand(NetDetectionMixin, command.Command,
implementations for take_action() and may even have different
arguments.
"""
pass
class NetworkAndComputeDelete(NetworkAndComputeCommand,
metaclass=abc.ABCMeta):
class NetworkAndComputeDelete(NetworkAndComputeCommand, metaclass=abc.ABCMeta):
"""Network and Compute Delete
Delete class for commands that support implementation via
@ -196,17 +205,21 @@ class NetworkAndComputeDelete(NetworkAndComputeCommand,
self.r = r
try:
if self.app.client_manager.is_network_endpoint_enabled():
self.take_action_network(self.app.client_manager.network,
parsed_args)
self.take_action_network(
self.app.client_manager.network, parsed_args
)
else:
self.take_action_compute(self.app.client_manager.compute,
parsed_args)
self.take_action_compute(
self.app.client_manager.compute, parsed_args
)
except Exception as e:
msg = _("Failed to delete %(resource)s with name or ID "
"'%(name_or_id)s': %(e)s") % {
"resource": self.resource,
"name_or_id": r,
"e": e,
msg = _(
"Failed to delete %(resource)s with name or ID "
"'%(name_or_id)s': %(e)s"
) % {
"resource": self.resource,
"name_or_id": r,
"e": e,
}
LOG.error(msg)
ret += 1
@ -221,8 +234,9 @@ class NetworkAndComputeDelete(NetworkAndComputeCommand,
raise exceptions.CommandError(msg)
class NetworkAndComputeLister(NetDetectionMixin, command.Lister,
metaclass=abc.ABCMeta):
class NetworkAndComputeLister(
NetDetectionMixin, command.Lister, metaclass=abc.ABCMeta
):
"""Network and Compute Lister
Lister class for commands that support implementation via
@ -230,11 +244,13 @@ class NetworkAndComputeLister(NetDetectionMixin, command.Lister,
implementations for take_action() and may even have different
arguments.
"""
pass
class NetworkAndComputeShowOne(NetDetectionMixin, command.ShowOne,
metaclass=abc.ABCMeta):
class NetworkAndComputeShowOne(
NetDetectionMixin, command.ShowOne, metaclass=abc.ABCMeta
):
"""Network and Compute ShowOne
ShowOne class for commands that support implementation via
@ -247,10 +263,12 @@ class NetworkAndComputeShowOne(NetDetectionMixin, command.ShowOne,
try:
if self.app.client_manager.is_network_endpoint_enabled():
return self.take_action_network(
self.app.client_manager.network, parsed_args)
self.app.client_manager.network, parsed_args
)
else:
return self.take_action_compute(
self.app.client_manager.compute, parsed_args)
self.app.client_manager.compute, parsed_args
)
except openstack.exceptions.HttpException as exc:
msg = _("Error while executing command: %s") % exc.message
if exc.details:
@ -282,10 +300,13 @@ class NeutronCommandWithExtraArgs(command.Command):
if not converter:
raise exceptions.CommandError(
_("Type {property_type} of property {name} "
"is not supported").format(
property_type=_property['type'],
name=_property['name']))
_(
"Type {property_type} of property {name} "
"is not supported"
).format(
property_type=_property['type'], name=_property['name']
)
)
return converter
def _parse_extra_properties(self, extra_properties):
@ -301,25 +322,26 @@ class NeutronCommandWithExtraArgs(command.Command):
parser.add_argument(
'--extra-property',
metavar='type=<property_type>,name=<property_name>,'
'value=<property_value>',
'value=<property_value>',
dest='extra_properties',
action=parseractions.MultiKeyValueAction,
required_keys=['name', 'value'],
optional_keys=['type'],
help=_("Additional parameters can be passed using this property. "
"Default type of the extra property is string ('str'), but "
"other types can be used as well. Available types are: "
"'dict', 'list', 'str', 'bool', 'int'. "
"In case of 'list' type, 'value' can be "
"semicolon-separated list of values. "
"For 'dict' value is semicolon-separated list of the "
"key:value pairs.")
help=_(
"Additional parameters can be passed using this property. "
"Default type of the extra property is string ('str'), but "
"other types can be used as well. Available types are: "
"'dict', 'list', 'str', 'bool', 'int'. "
"In case of 'list' type, 'value' can be "
"semicolon-separated list of values. "
"For 'dict' value is semicolon-separated list of the "
"key:value pairs."
),
)
return parser
class NeutronUnsetCommandWithExtraArgs(NeutronCommandWithExtraArgs):
def _parse_extra_properties(self, extra_properties):
result = {}
if extra_properties:

View File

@ -31,9 +31,7 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -65,27 +63,27 @@ class CreateAddressGroup(command.ShowOne, common.NeutronCommandWithExtraArgs):
def get_parser(self, prog_name):
parser = super(CreateAddressGroup, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar="<name>",
help=_("New address group name")
'name', metavar="<name>", help=_("New address group name")
)
parser.add_argument(
'--description',
metavar="<description>",
help=_("New address group description")
help=_("New address group description"),
)
parser.add_argument(
"--address",
metavar="<ip-address>",
action='append',
default=[],
help=_("IP address or CIDR "
"(repeat option to set multiple addresses)"),
help=_(
"IP address or CIDR "
"(repeat option to set multiple addresses)"
),
)
parser.add_argument(
'--project',
metavar="<project>",
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -96,7 +94,8 @@ class CreateAddressGroup(command.ShowOne, common.NeutronCommandWithExtraArgs):
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_address_group(**attrs)
display_columns, columns = _get_columns(obj)
@ -114,7 +113,7 @@ class DeleteAddressGroup(command.Command):
'address_group',
metavar="<address-group>",
nargs='+',
help=_("Address group(s) to delete (name or ID)")
help=_("Address group(s) to delete (name or ID)"),
)
return parser
@ -129,14 +128,19 @@ class DeleteAddressGroup(command.Command):
client.delete_address_group(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete address group with "
"name or ID '%(group)s': %(e)s"),
{'group': group, 'e': e})
LOG.error(
_(
"Failed to delete address group with "
"name or ID '%(group)s': %(e)s"
),
{'group': group, 'e': e},
)
if result > 0:
total = len(parsed_args.address_group)
msg = (_("%(result)s of %(total)s address groups failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s address groups failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -149,13 +153,15 @@ class ListAddressGroup(command.Lister):
parser.add_argument(
'--name',
metavar='<name>',
help=_("List only address groups of given name in output")
help=_("List only address groups of given name in output"),
)
parser.add_argument(
'--project',
metavar="<project>",
help=_("List address groups according to their project "
"(name or ID)")
help=_(
"List address groups according to their project "
"(name or ID)"
),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -190,10 +196,17 @@ class ListAddressGroup(command.Lister):
attrs['project_id'] = project_id
data = client.address_groups(**attrs)
return (column_headers,
(utils.get_item_properties(
s, columns, formatters={},
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
)
for s in data
),
)
class SetAddressGroup(common.NeutronCommandWithExtraArgs):
@ -204,46 +217,48 @@ class SetAddressGroup(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'address_group',
metavar="<address-group>",
help=_("Address group to modify (name or ID)")
help=_("Address group to modify (name or ID)"),
)
parser.add_argument(
'--name',
metavar="<name>",
help=_('Set address group name')
'--name', metavar="<name>", help=_('Set address group name')
)
parser.add_argument(
'--description',
metavar="<description>",
help=_('Set address group description')
help=_('Set address group description'),
)
parser.add_argument(
"--address",
metavar="<ip-address>",
action='append',
default=[],
help=_("IP address or CIDR "
"(repeat option to set multiple addresses)"),
help=_(
"IP address or CIDR "
"(repeat option to set multiple addresses)"
),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_address_group(
parsed_args.address_group,
ignore_missing=False)
parsed_args.address_group, ignore_missing=False
)
attrs = {}
if parsed_args.name is not None:
attrs['name'] = parsed_args.name
if parsed_args.description is not None:
attrs['description'] = parsed_args.description
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
client.update_address_group(obj, **attrs)
if parsed_args.address:
client.add_addresses_to_address_group(
obj, _format_addresses(parsed_args.address))
obj, _format_addresses(parsed_args.address)
)
class ShowAddressGroup(command.ShowOne):
@ -254,7 +269,7 @@ class ShowAddressGroup(command.ShowOne):
parser.add_argument(
'address_group',
metavar="<address-group>",
help=_("Address group to display (name or ID)")
help=_("Address group to display (name or ID)"),
)
return parser
@ -262,8 +277,8 @@ class ShowAddressGroup(command.ShowOne):
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_address_group(
parsed_args.address_group,
ignore_missing=False)
parsed_args.address_group, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters={})
@ -278,23 +293,26 @@ class UnsetAddressGroup(command.Command):
parser.add_argument(
'address_group',
metavar="<address-group>",
help=_("Address group to modify (name or ID)")
help=_("Address group to modify (name or ID)"),
)
parser.add_argument(
"--address",
metavar="<ip-address>",
action='append',
default=[],
help=_("IP address or CIDR "
"(repeat option to unset multiple addresses)"),
help=_(
"IP address or CIDR "
"(repeat option to unset multiple addresses)"
),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_address_group(
parsed_args.address_group,
ignore_missing=False)
parsed_args.address_group, ignore_missing=False
)
if parsed_args.address:
client.remove_addresses_from_address_group(
obj, _format_addresses(parsed_args.address))
obj, _format_addresses(parsed_args.address)
)

View File

@ -32,9 +32,7 @@ def _get_columns(item):
}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -66,21 +64,19 @@ class CreateAddressScope(command.ShowOne, common.NeutronCommandWithExtraArgs):
def get_parser(self, prog_name):
parser = super(CreateAddressScope, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar="<name>",
help=_("New address scope name")
'name', metavar="<name>", help=_("New address scope name")
)
parser.add_argument(
'--ip-version',
type=int,
default=4,
choices=[4, 6],
help=_("IP version (default is 4)")
help=_("IP version (default is 4)"),
)
parser.add_argument(
'--project',
metavar="<project>",
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -88,12 +84,14 @@ class CreateAddressScope(command.ShowOne, common.NeutronCommandWithExtraArgs):
share_group.add_argument(
'--share',
action='store_true',
help=_('Share the address scope between projects')
help=_('Share the address scope between projects'),
)
share_group.add_argument(
'--no-share',
action='store_true',
help=_('Do not share the address scope between projects (default)')
help=_(
'Do not share the address scope between projects (default)'
),
)
return parser
@ -102,7 +100,8 @@ class CreateAddressScope(command.ShowOne, common.NeutronCommandWithExtraArgs):
client = self.app.client_manager.network
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_address_scope(**attrs)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters={})
@ -119,7 +118,7 @@ class DeleteAddressScope(command.Command):
'address_scope',
metavar="<address-scope>",
nargs='+',
help=_("Address scope(s) to delete (name or ID)")
help=_("Address scope(s) to delete (name or ID)"),
)
return parser
@ -134,14 +133,19 @@ class DeleteAddressScope(command.Command):
client.delete_address_scope(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete address scope with "
"name or ID '%(scope)s': %(e)s"),
{'scope': scope, 'e': e})
LOG.error(
_(
"Failed to delete address scope with "
"name or ID '%(scope)s': %(e)s"
),
{'scope': scope, 'e': e},
)
if result > 0:
total = len(parsed_args.address_scope)
msg = (_("%(result)s of %(total)s address scopes failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s address scopes failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -156,7 +160,7 @@ class ListAddressScope(command.Lister):
parser.add_argument(
'--name',
metavar='<name>',
help=_("List only address scopes of given name in output")
help=_("List only address scopes of given name in output"),
)
parser.add_argument(
'--ip-version',
@ -164,13 +168,17 @@ class ListAddressScope(command.Lister):
choices=[4, 6],
metavar='<ip-version>',
dest='ip_version',
help=_("List address scopes of given IP version networks (4 or 6)")
help=_(
"List address scopes of given IP version networks (4 or 6)"
),
)
parser.add_argument(
'--project',
metavar="<project>",
help=_("List address scopes according to their project "
"(name or ID)")
help=_(
"List address scopes according to their project "
"(name or ID)"
),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -178,12 +186,12 @@ class ListAddressScope(command.Lister):
shared_group.add_argument(
'--share',
action='store_true',
help=_("List address scopes shared between projects")
help=_("List address scopes shared between projects"),
)
shared_group.add_argument(
'--no-share',
action='store_true',
help=_("List address scopes not shared between projects")
help=_("List address scopes not shared between projects"),
)
return parser
@ -222,10 +230,17 @@ class ListAddressScope(command.Lister):
attrs['project_id'] = project_id
data = client.address_scopes(**attrs)
return (column_headers,
(utils.get_item_properties(
s, columns, formatters={},
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
)
for s in data
),
)
# TODO(rtheis): Use the SDK resource mapped attribute names once the
@ -238,23 +253,21 @@ class SetAddressScope(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'address_scope',
metavar="<address-scope>",
help=_("Address scope to modify (name or ID)")
help=_("Address scope to modify (name or ID)"),
)
parser.add_argument(
'--name',
metavar="<name>",
help=_('Set address scope name')
'--name', metavar="<name>", help=_('Set address scope name')
)
share_group = parser.add_mutually_exclusive_group()
share_group.add_argument(
'--share',
action='store_true',
help=_('Share the address scope between projects')
help=_('Share the address scope between projects'),
)
share_group.add_argument(
'--no-share',
action='store_true',
help=_('Do not share the address scope between projects')
help=_('Do not share the address scope between projects'),
)
return parser
@ -262,8 +275,8 @@ class SetAddressScope(common.NeutronCommandWithExtraArgs):
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_address_scope(
parsed_args.address_scope,
ignore_missing=False)
parsed_args.address_scope, ignore_missing=False
)
attrs = {}
if parsed_args.name is not None:
attrs['name'] = parsed_args.name
@ -272,7 +285,8 @@ class SetAddressScope(common.NeutronCommandWithExtraArgs):
if parsed_args.no_share:
attrs['shared'] = False
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
client.update_address_scope(obj, **attrs)
@ -284,7 +298,7 @@ class ShowAddressScope(command.ShowOne):
parser.add_argument(
'address_scope',
metavar="<address-scope>",
help=_("Address scope to display (name or ID)")
help=_("Address scope to display (name or ID)"),
)
return parser
@ -292,8 +306,8 @@ class ShowAddressScope(command.ShowOne):
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_address_scope(
parsed_args.address_scope,
ignore_missing=False)
parsed_args.address_scope, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters={})

View File

@ -30,9 +30,7 @@ def _get_network_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -47,18 +45,19 @@ def _get_attrs(client_manager, parsed_args):
# Name of a network could be empty string.
if parsed_args.network is not None:
network = network_client.find_network(parsed_args.network,
ignore_missing=False)
network = network_client.find_network(
parsed_args.network, ignore_missing=False
)
attrs['floating_network_id'] = network.id
if parsed_args.subnet:
subnet = network_client.find_subnet(parsed_args.subnet,
ignore_missing=False)
subnet = network_client.find_subnet(
parsed_args.subnet, ignore_missing=False
)
attrs['subnet_id'] = subnet.id
if parsed_args.port:
port = network_client.find_port(parsed_args.port,
ignore_missing=False)
port = network_client.find_port(parsed_args.port, ignore_missing=False)
attrs['port_id'] = port.id
if parsed_args.floating_ip_address:
@ -69,7 +68,8 @@ def _get_attrs(client_manager, parsed_args):
if parsed_args.qos_policy:
attrs['qos_policy_id'] = network_client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False).id
parsed_args.qos_policy, ignore_missing=False
).id
if parsed_args.description is not None:
attrs['description'] = parsed_args.description
@ -92,8 +92,9 @@ def _get_attrs(client_manager, parsed_args):
return attrs
class CreateFloatingIP(common.NetworkAndComputeShowOne,
common.NeutronCommandWithExtraArgs):
class CreateFloatingIP(
common.NetworkAndComputeShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create floating IP")
def update_parser_common(self, parser):
@ -103,7 +104,7 @@ class CreateFloatingIP(common.NetworkAndComputeShowOne,
parser.add_argument(
'network',
metavar='<network>',
help=_("Network to allocate floating IP from (name or ID)")
help=_("Network to allocate floating IP from (name or ID)"),
)
return parser
@ -112,72 +113,83 @@ class CreateFloatingIP(common.NetworkAndComputeShowOne,
'--subnet',
metavar='<subnet>',
help=self.enhance_help_neutron(
_("Subnet on which you want to create the floating IP "
"(name or ID)"))
_(
"Subnet on which you want to create the floating IP "
"(name or ID)"
)
),
)
parser.add_argument(
'--port',
metavar='<port>',
help=self.enhance_help_neutron(
_("Port to be associated with the floating IP "
"(name or ID)"))
_("Port to be associated with the floating IP " "(name or ID)")
),
)
parser.add_argument(
'--floating-ip-address',
metavar='<ip-address>',
dest='floating_ip_address',
help=self.enhance_help_neutron(_("Floating IP address"))
help=self.enhance_help_neutron(_("Floating IP address")),
)
parser.add_argument(
'--fixed-ip-address',
metavar='<ip-address>',
dest='fixed_ip_address',
help=self.enhance_help_neutron(
_("Fixed IP address mapped to the floating IP"))
_("Fixed IP address mapped to the floating IP")
),
)
parser.add_argument(
'--qos-policy',
metavar='<qos-policy>',
help=self.enhance_help_neutron(
_("Attach QoS policy to the floating IP (name or ID)"))
_("Attach QoS policy to the floating IP (name or ID)")
),
)
parser.add_argument(
'--description',
metavar='<description>',
help=self.enhance_help_neutron(_('Set floating IP description'))
help=self.enhance_help_neutron(_('Set floating IP description')),
)
parser.add_argument(
'--project',
metavar='<project>',
help=self.enhance_help_neutron(_("Owner's project (name or ID)"))
help=self.enhance_help_neutron(_("Owner's project (name or ID)")),
)
parser.add_argument(
'--dns-domain',
metavar='<dns-domain>',
dest='dns_domain',
help=self.enhance_help_neutron(
_("Set DNS domain for this floating IP"))
_("Set DNS domain for this floating IP")
),
)
parser.add_argument(
'--dns-name',
metavar='<dns-name>',
dest='dns_name',
help=self.enhance_help_neutron(
_("Set DNS name for this floating IP"))
_("Set DNS name for this floating IP")
),
)
identity_common.add_project_domain_option_to_parser(
parser, enhance_help=self.enhance_help_neutron)
parser, enhance_help=self.enhance_help_neutron
)
_tag.add_tag_option_to_parser_for_create(
parser, _('floating IP'), enhance_help=self.enhance_help_neutron)
parser, _('floating IP'), enhance_help=self.enhance_help_neutron
)
return parser
def take_action_network(self, client, parsed_args):
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
with common.check_missing_extension_if_error(
self.app.client_manager.network, attrs):
self.app.client_manager.network, attrs
):
obj = client.create_ip(**attrs)
# tags cannot be set when created, so tags need to be set later.
@ -206,7 +218,7 @@ class DeleteFloatingIP(common.NetworkAndComputeDelete):
'floating_ip',
metavar="<floating-ip>",
nargs="+",
help=_("Floating IP(s) to delete (IP address or ID)")
help=_("Floating IP(s) to delete (IP address or ID)"),
)
return parser
@ -232,60 +244,79 @@ class ListFloatingIP(common.NetworkAndComputeLister):
'--network',
metavar='<network>',
help=self.enhance_help_neutron(
_("List floating IP(s) according to "
"given network (name or ID)"))
_(
"List floating IP(s) according to "
"given network (name or ID)"
)
),
)
parser.add_argument(
'--port',
metavar='<port>',
help=self.enhance_help_neutron(
_("List floating IP(s) according to given port (name or ID)"))
_("List floating IP(s) according to given port (name or ID)")
),
)
parser.add_argument(
'--fixed-ip-address',
metavar='<ip-address>',
help=self.enhance_help_neutron(
_("List floating IP(s) according to given fixed IP address"))
_("List floating IP(s) according to given fixed IP address")
),
)
parser.add_argument(
'--floating-ip-address',
metavar='<ip-address>',
help=self.enhance_help_neutron(
_("List floating IP(s) according to given floating IP "
"address"))
_(
"List floating IP(s) according to given floating IP "
"address"
)
),
)
parser.add_argument(
'--long',
action='store_true',
default=False,
help=self.enhance_help_neutron(
_("List additional fields in output"))
_("List additional fields in output")
),
)
parser.add_argument(
'--status',
metavar='<status>',
choices=['ACTIVE', 'DOWN'],
help=self.enhance_help_neutron(
_("List floating IP(s) according to given status ('ACTIVE', "
"'DOWN')"))
_(
"List floating IP(s) according to given status ('ACTIVE', "
"'DOWN')"
)
),
)
parser.add_argument(
'--project',
metavar='<project>',
help=self.enhance_help_neutron(
_("List floating IP(s) according to given project (name or "
"ID)"))
_(
"List floating IP(s) according to given project (name or "
"ID)"
)
),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--router',
metavar='<router>',
help=self.enhance_help_neutron(
_("List floating IP(s) according to given router (name or "
"ID)"))
_(
"List floating IP(s) according to given router (name or "
"ID)"
)
),
)
_tag.add_tag_filtering_option_to_parser(
parser, _('floating IP'), enhance_help=self.enhance_help_neutron)
parser, _('floating IP'), enhance_help=self.enhance_help_neutron
)
return parser
@ -330,12 +361,14 @@ class ListFloatingIP(common.NetworkAndComputeLister):
query = {}
if parsed_args.network is not None:
network = network_client.find_network(parsed_args.network,
ignore_missing=False)
network = network_client.find_network(
parsed_args.network, ignore_missing=False
)
query['floating_network_id'] = network.id
if parsed_args.port is not None:
port = network_client.find_port(parsed_args.port,
ignore_missing=False)
port = network_client.find_port(
parsed_args.port, ignore_missing=False
)
query['port_id'] = port.id
if parsed_args.fixed_ip_address is not None:
query['fixed_ip_address'] = parsed_args.fixed_ip_address
@ -351,19 +384,26 @@ class ListFloatingIP(common.NetworkAndComputeLister):
)
query['project_id'] = project.id
if parsed_args.router is not None:
router = network_client.find_router(parsed_args.router,
ignore_missing=False)
router = network_client.find_router(
parsed_args.router, ignore_missing=False
)
query['router_id'] = router.id
_tag.get_tag_filtering_args(parsed_args, query)
data = client.ips(**query)
return (headers,
(utils.get_item_properties(
s, columns,
return (
headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
) for s in data))
)
for s in data
),
)
def take_action_compute(self, client, parsed_args):
columns = (
@ -383,11 +423,17 @@ class ListFloatingIP(common.NetworkAndComputeLister):
data = client.api.floating_ip_list()
return (headers,
(utils.get_dict_properties(
s, columns,
return (
headers,
(
utils.get_dict_properties(
s,
columns,
formatters={},
) for s in data))
)
for s in data
),
)
class SetFloatingIP(common.NeutronCommandWithExtraArgs):
@ -398,33 +444,37 @@ class SetFloatingIP(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'floating_ip',
metavar='<floating-ip>',
help=_("Floating IP to modify (IP address or ID)"))
help=_("Floating IP to modify (IP address or ID)"),
)
parser.add_argument(
'--port',
metavar='<port>',
help=_("Associate the floating IP with port (name or ID)")),
help=_("Associate the floating IP with port (name or ID)"),
),
parser.add_argument(
'--fixed-ip-address',
metavar='<ip-address>',
dest='fixed_ip_address',
help=_("Fixed IP of the port "
"(required only if port has multiple IPs)")
help=_(
"Fixed IP of the port "
"(required only if port has multiple IPs)"
),
)
parser.add_argument(
'--description',
metavar='<description>',
help=_('Set floating IP description')
help=_('Set floating IP description'),
)
qos_policy_group = parser.add_mutually_exclusive_group()
qos_policy_group.add_argument(
'--qos-policy',
metavar='<qos-policy>',
help=_("Attach QoS policy to the floating IP (name or ID)")
help=_("Attach QoS policy to the floating IP (name or ID)"),
)
qos_policy_group.add_argument(
'--no-qos-policy',
action='store_true',
help=_("Remove the QoS policy attached to the floating IP")
help=_("Remove the QoS policy attached to the floating IP"),
)
_tag.add_tag_option_to_parser_for_set(parser, _('floating IP'))
@ -439,8 +489,7 @@ class SetFloatingIP(common.NeutronCommandWithExtraArgs):
ignore_missing=False,
)
if parsed_args.port:
port = client.find_port(parsed_args.port,
ignore_missing=False)
port = client.find_port(parsed_args.port, ignore_missing=False)
attrs['port_id'] = port.id
if parsed_args.fixed_ip_address:
@ -451,13 +500,15 @@ class SetFloatingIP(common.NeutronCommandWithExtraArgs):
if parsed_args.qos_policy:
attrs['qos_policy_id'] = client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False).id
parsed_args.qos_policy, ignore_missing=False
).id
if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy:
attrs['qos_policy_id'] = None
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
client.update_ip(obj, **attrs)
@ -473,7 +524,7 @@ class ShowFloatingIP(common.NetworkAndComputeShowOne):
parser.add_argument(
'floating_ip',
metavar="<floating-ip>",
help=_("Floating IP to display (IP address or ID)")
help=_("Floating IP to display (IP address or ID)"),
)
return parser
@ -501,18 +552,19 @@ class UnsetFloatingIP(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'floating_ip',
metavar='<floating-ip>',
help=_("Floating IP to disassociate (IP address or ID)"))
help=_("Floating IP to disassociate (IP address or ID)"),
)
parser.add_argument(
'--port',
action='store_true',
default=False,
help=_("Disassociate any port associated with the floating IP")
help=_("Disassociate any port associated with the floating IP"),
)
parser.add_argument(
'--qos-policy',
action='store_true',
default=False,
help=_("Remove the QoS policy attached to the floating IP")
help=_("Remove the QoS policy attached to the floating IP"),
)
_tag.add_tag_option_to_parser_for_unset(parser, _('floating IP'))
@ -530,7 +582,8 @@ class UnsetFloatingIP(common.NeutronCommandWithExtraArgs):
if parsed_args.qos_policy:
attrs['qos_policy_id'] = None
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
client.update_ip(obj, **attrs)

View File

@ -25,17 +25,23 @@ class ListFloatingIPPool(common.NetworkAndComputeLister):
_description = _("List pools of floating IP addresses")
def take_action_network(self, client, parsed_args):
msg = _("Floating ip pool operations are only available for "
"Compute v2 network.")
msg = _(
"Floating ip pool operations are only available for "
"Compute v2 network."
)
raise exceptions.CommandError(msg)
def take_action_compute(self, client, parsed_args):
columns = (
'Name',
)
columns = ('Name',)
data = client.api.floating_ip_pool_list()
return (columns,
(utils.get_dict_properties(
s, columns,
) for s in data))
return (
columns,
(
utils.get_dict_properties(
s,
columns,
)
for s in data
),
)

View File

@ -31,8 +31,10 @@ def validate_ports_diff(ports):
ports_diff = ports[-1] - ports[0]
if ports_diff < 0:
msg = _("The last number in port range must be"
" greater or equal to the first")
msg = _(
"The last number in port range must be"
" greater or equal to the first"
)
raise exceptions.CommandError(msg)
return ports_diff
@ -42,8 +44,10 @@ def validate_ports_match(internal_ports, external_ports):
external_ports_diff = validate_ports_diff(external_ports)
if internal_ports_diff != 0 and internal_ports_diff != external_ports_diff:
msg = _("The relation between internal and external ports does not "
"match the pattern 1:N and N:N")
msg = _(
"The relation between internal and external ports does not "
"match the pattern 1:N and N:N"
)
raise exceptions.CommandError(msg)
@ -84,66 +88,80 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
class CreateFloatingIPPortForwarding(command.ShowOne,
common.NeutronCommandWithExtraArgs):
class CreateFloatingIPPortForwarding(
command.ShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create floating IP port forwarding")
def get_parser(self, prog_name):
parser = super(CreateFloatingIPPortForwarding,
self).get_parser(prog_name)
parser = super(CreateFloatingIPPortForwarding, self).get_parser(
prog_name
)
parser.add_argument(
'--internal-ip-address',
required=True,
metavar='<internal-ip-address>',
help=_("The fixed IPv4 address of the network "
"port associated to the floating IP port forwarding")
help=_(
"The fixed IPv4 address of the network "
"port associated to the floating IP port forwarding"
),
)
parser.add_argument(
'--port',
metavar='<port>',
required=True,
help=_("The name or ID of the network port associated "
"to the floating IP port forwarding")
help=_(
"The name or ID of the network port associated "
"to the floating IP port forwarding"
),
)
parser.add_argument(
'--internal-protocol-port',
metavar='<port-number>',
required=True,
help=_("The protocol port number "
"of the network port fixed IPv4 address "
"associated to the floating IP port forwarding")
help=_(
"The protocol port number "
"of the network port fixed IPv4 address "
"associated to the floating IP port forwarding"
),
)
parser.add_argument(
'--external-protocol-port',
metavar='<port-number>',
required=True,
help=_("The protocol port number of "
"the port forwarding's floating IP address")
help=_(
"The protocol port number of "
"the port forwarding's floating IP address"
),
)
parser.add_argument(
'--protocol',
metavar='<protocol>',
required=True,
help=_("The protocol used in the floating IP "
"port forwarding, for instance: TCP, UDP")
help=_(
"The protocol used in the floating IP "
"port forwarding, for instance: TCP, UDP"
),
),
parser.add_argument(
'--description',
metavar='<description>',
help=_("A text to describe/contextualize the use of the "
"port forwarding configuration")
help=_(
"A text to describe/contextualize the use of the "
"port forwarding configuration"
),
)
parser.add_argument(
'floating_ip',
metavar='<floating-ip>',
help=_("Floating IP that the port forwarding belongs to "
"(IP address or ID)")
help=_(
"Floating IP that the port forwarding belongs to "
"(IP address or ID)"
),
)
return parser
@ -159,8 +177,7 @@ class CreateFloatingIPPortForwarding(command.ShowOne,
validate_and_assign_port_ranges(parsed_args, attrs)
if parsed_args.port:
port = client.find_port(parsed_args.port,
ignore_missing=False)
port = client.find_port(parsed_args.port, ignore_missing=False)
attrs['internal_port_id'] = port.id
attrs['internal_ip_address'] = parsed_args.internal_ip_address
attrs['protocol'] = parsed_args.protocol
@ -169,11 +186,11 @@ class CreateFloatingIPPortForwarding(command.ShowOne,
attrs['description'] = parsed_args.description
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_floating_ip_port_forwarding(
floating_ip.id,
**attrs
floating_ip.id, **attrs
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
@ -184,19 +201,22 @@ class DeleteFloatingIPPortForwarding(command.Command):
_description = _("Delete floating IP port forwarding")
def get_parser(self, prog_name):
parser = super(DeleteFloatingIPPortForwarding,
self).get_parser(prog_name)
parser = super(DeleteFloatingIPPortForwarding, self).get_parser(
prog_name
)
parser.add_argument(
'floating_ip',
metavar='<floating-ip>',
help=_("Floating IP that the port forwarding belongs to "
"(IP address or ID)")
help=_(
"Floating IP that the port forwarding belongs to "
"(IP address or ID)"
),
)
parser.add_argument(
'port_forwarding_id',
nargs="+",
metavar="<port-forwarding-id>",
help=_("The ID of the floating IP port forwarding(s) to delete")
help=_("The ID of the floating IP port forwarding(s) to delete"),
)
return parser
@ -217,13 +237,18 @@ class DeleteFloatingIPPortForwarding(command.Command):
)
except Exception as e:
result += 1
LOG.error(_("Failed to delete floating IP port forwarding "
"'%(port_forwarding_id)s': %(e)s"),
{'port_forwarding_id': port_forwarding_id, 'e': e})
LOG.error(
_(
"Failed to delete floating IP port forwarding "
"'%(port_forwarding_id)s': %(e)s"
),
{'port_forwarding_id': port_forwarding_id, 'e': e},
)
if result > 0:
total = len(parsed_args.port_forwarding_id)
msg = (_("%(result)s of %(total)s Port forwarding failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s Port forwarding failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -231,31 +256,38 @@ class ListFloatingIPPortForwarding(command.Lister):
_description = _("List floating IP port forwarding")
def get_parser(self, prog_name):
parser = super(ListFloatingIPPortForwarding,
self).get_parser(prog_name)
parser = super(ListFloatingIPPortForwarding, self).get_parser(
prog_name
)
parser.add_argument(
'floating_ip',
metavar='<floating-ip>',
help=_("Floating IP that the port forwarding belongs to "
"(IP address or ID)")
help=_(
"Floating IP that the port forwarding belongs to "
"(IP address or ID)"
),
)
parser.add_argument(
'--port',
metavar='<port>',
help=_("Filter the list result by the ID or name of "
"the internal network port")
help=_(
"Filter the list result by the ID or name of "
"the internal network port"
),
)
parser.add_argument(
'--external-protocol-port',
metavar='<port-number>',
dest='external_protocol_port',
help=_("Filter the list result by the "
"protocol port number of the floating IP")
help=_(
"Filter the list result by the "
"protocol port number of the floating IP"
),
)
parser.add_argument(
'--protocol',
metavar='protocol',
help=_("Filter the list result by the port protocol")
help=_("Filter the list result by the port protocol"),
)
return parser
@ -289,8 +321,7 @@ class ListFloatingIPPortForwarding(command.Lister):
query = {}
if parsed_args.port:
port = client.find_port(parsed_args.port,
ignore_missing=False)
port = client.find_port(parsed_args.port, ignore_missing=False)
query['internal_port_id'] = port.id
external_port = parsed_args.external_protocol_port
if external_port:
@ -298,7 +329,8 @@ class ListFloatingIPPortForwarding(command.Lister):
query['external_port_range'] = external_port
else:
query['external_port'] = int(
parsed_args.external_protocol_port)
parsed_args.external_protocol_port
)
if parsed_args.protocol is not None:
query['protocol'] = parsed_args.protocol
@ -309,66 +341,83 @@ class ListFloatingIPPortForwarding(command.Lister):
data = client.floating_ip_port_forwardings(obj, **query)
return (headers,
(utils.get_item_properties(
s, columns,
return (
headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
) for s in data))
)
for s in data
),
)
class SetFloatingIPPortForwarding(common.NeutronCommandWithExtraArgs):
_description = _("Set floating IP Port Forwarding Properties")
def get_parser(self, prog_name):
parser = super(SetFloatingIPPortForwarding,
self).get_parser(prog_name)
parser = super(SetFloatingIPPortForwarding, self).get_parser(prog_name)
parser.add_argument(
'floating_ip',
metavar='<floating-ip>',
help=_("Floating IP that the port forwarding belongs to "
"(IP address or ID)")
help=_(
"Floating IP that the port forwarding belongs to "
"(IP address or ID)"
),
)
parser.add_argument(
'port_forwarding_id',
metavar='<port-forwarding-id>',
help=_("The ID of the floating IP port forwarding")
help=_("The ID of the floating IP port forwarding"),
)
parser.add_argument(
'--port',
metavar='<port>',
help=_("The ID of the network port associated to "
"the floating IP port forwarding")
help=_(
"The ID of the network port associated to "
"the floating IP port forwarding"
),
)
parser.add_argument(
'--internal-ip-address',
metavar='<internal-ip-address>',
help=_("The fixed IPv4 address of the network port "
"associated to the floating IP port forwarding")
help=_(
"The fixed IPv4 address of the network port "
"associated to the floating IP port forwarding"
),
)
parser.add_argument(
'--internal-protocol-port',
metavar='<port-number>',
help=_("The TCP/UDP/other protocol port number of the "
"network port fixed IPv4 address associated to "
"the floating IP port forwarding")
help=_(
"The TCP/UDP/other protocol port number of the "
"network port fixed IPv4 address associated to "
"the floating IP port forwarding"
),
)
parser.add_argument(
'--external-protocol-port',
metavar='<port-number>',
help=_("The TCP/UDP/other protocol port number of the "
"port forwarding's floating IP address")
help=_(
"The TCP/UDP/other protocol port number of the "
"port forwarding's floating IP address"
),
)
parser.add_argument(
'--protocol',
metavar='<protocol>',
choices=['tcp', 'udp'],
help=_("The IP protocol used in the floating IP port forwarding")
help=_("The IP protocol used in the floating IP port forwarding"),
),
parser.add_argument(
'--description',
metavar='<description>',
help=_("A text to describe/contextualize the use of "
"the port forwarding configuration")
help=_(
"A text to describe/contextualize the use of "
"the port forwarding configuration"
),
)
return parser
@ -382,8 +431,7 @@ class SetFloatingIPPortForwarding(common.NeutronCommandWithExtraArgs):
attrs = {}
if parsed_args.port:
port = client.find_port(parsed_args.port,
ignore_missing=False)
port = client.find_port(parsed_args.port, ignore_missing=False)
attrs['internal_port_id'] = port.id
if parsed_args.internal_ip_address:
@ -398,28 +446,33 @@ class SetFloatingIPPortForwarding(common.NeutronCommandWithExtraArgs):
attrs['description'] = parsed_args.description
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
client.update_floating_ip_port_forwarding(
floating_ip.id, parsed_args.port_forwarding_id, **attrs)
floating_ip.id, parsed_args.port_forwarding_id, **attrs
)
class ShowFloatingIPPortForwarding(command.ShowOne):
_description = _("Display floating IP Port Forwarding details")
def get_parser(self, prog_name):
parser = super(ShowFloatingIPPortForwarding,
self).get_parser(prog_name)
parser = super(ShowFloatingIPPortForwarding, self).get_parser(
prog_name
)
parser.add_argument(
'floating_ip',
metavar='<floating-ip>',
help=_("Floating IP that the port forwarding belongs to "
"(IP address or ID)")
help=_(
"Floating IP that the port forwarding belongs to "
"(IP address or ID)"
),
)
parser.add_argument(
'port_forwarding_id',
metavar="<port-forwarding-id>",
help=_("The ID of the floating IP port forwarding")
help=_("The ID of the floating IP port forwarding"),
)
return parser

View File

@ -29,9 +29,7 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['id', 'name', 'location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -49,8 +47,10 @@ class ListIPAvailability(command.Lister):
choices=[4, 6],
metavar='<ip-version>',
dest='ip_version',
help=_("List IP availability of given IP version "
"networks (default is 4)"),
help=_(
"List IP availability of given IP version "
"networks (default is 4)"
),
)
parser.add_argument(
'--project',
@ -89,10 +89,16 @@ class ListIPAvailability(command.Lister):
).id
filters['project_id'] = project_id
data = client.network_ip_availabilities(**filters)
return (column_headers,
(utils.get_item_properties(
s, columns,
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
)
for s in data
),
)
class ShowIPAvailability(command.ShowOne):
@ -109,10 +115,12 @@ class ShowIPAvailability(command.ShowOne):
def take_action(self, parsed_args):
client = self.app.client_manager.network
network_id = client.find_network(parsed_args.network,
ignore_missing=False).id
obj = client.find_network_ip_availability(network_id,
ignore_missing=False)
network_id = client.find_network(
parsed_args.network, ignore_missing=False
).id
obj = client.find_network_ip_availability(
network_id, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters=_formatters)
return (display_columns, data)

View File

@ -28,9 +28,7 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -55,27 +53,29 @@ class CreateConntrackHelper(command.ShowOne):
parser.add_argument(
'router',
metavar='<router>',
help=_('Router for which conntrack helper will be created')
help=_('Router for which conntrack helper will be created'),
)
parser.add_argument(
'--helper',
required=True,
metavar='<helper>',
help=_('The netfilter conntrack helper module')
help=_('The netfilter conntrack helper module'),
)
parser.add_argument(
'--protocol',
required=True,
metavar='<protocol>',
help=_('The network protocol for the netfilter conntrack target '
'rule')
help=_(
'The network protocol for the netfilter conntrack target '
'rule'
),
)
parser.add_argument(
'--port',
required=True,
metavar='<port>',
type=int,
help=_('The network port for the netfilter conntrack target rule')
help=_('The network port for the netfilter conntrack target rule'),
)
return parser
@ -99,13 +99,13 @@ class DeleteConntrackHelper(command.Command):
parser.add_argument(
'router',
metavar='<router>',
help=_('Router that the conntrack helper belong to')
help=_('Router that the conntrack helper belong to'),
)
parser.add_argument(
'conntrack_helper_id',
metavar='<conntrack-helper-id>',
nargs='+',
help=_('The ID of the conntrack helper(s) to delete')
help=_('The ID of the conntrack helper(s) to delete'),
)
return parser
@ -118,17 +118,24 @@ class DeleteConntrackHelper(command.Command):
for ct_helper in parsed_args.conntrack_helper_id:
try:
client.delete_conntrack_helper(
ct_helper, router.id, ignore_missing=False)
ct_helper, router.id, ignore_missing=False
)
except Exception as e:
result += 1
LOG.error(_("Failed to delete L3 conntrack helper with "
"ID '%(ct_helper)s': %(e)s"),
{'ct_helper': ct_helper, 'e': e})
LOG.error(
_(
"Failed to delete L3 conntrack helper with "
"ID '%(ct_helper)s': %(e)s"
),
{'ct_helper': ct_helper, 'e': e},
)
if result > 0:
total = len(parsed_args.conntrack_helper_id)
msg = (_("%(result)s of %(total)s L3 conntrack helpers failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s L3 conntrack helpers failed "
"to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -140,23 +147,25 @@ class ListConntrackHelper(command.Lister):
parser.add_argument(
'router',
metavar='<router>',
help=_('Router that the conntrack helper belong to')
help=_('Router that the conntrack helper belong to'),
)
parser.add_argument(
'--helper',
metavar='<helper>',
help=_('The netfilter conntrack helper module')
help=_('The netfilter conntrack helper module'),
)
parser.add_argument(
'--protocol',
metavar='<protocol>',
help=_('The network protocol for the netfilter conntrack target '
'rule')
help=_(
'The network protocol for the netfilter conntrack target '
'rule'
),
)
parser.add_argument(
'--port',
metavar='<port>',
help=_('The network port for the netfilter conntrack target rule')
help=_('The network port for the netfilter conntrack target rule'),
)
return parser
@ -180,10 +189,17 @@ class ListConntrackHelper(command.Lister):
attrs = _get_attrs(client, parsed_args)
data = client.conntrack_helpers(attrs.pop('router_id'), **attrs)
return (column_headers,
(utils.get_item_properties(
s, columns, formatters={},
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
)
for s in data
),
)
class SetConntrackHelper(command.Command):
@ -194,29 +210,31 @@ class SetConntrackHelper(command.Command):
parser.add_argument(
'router',
metavar='<router>',
help=_('Router that the conntrack helper belong to')
help=_('Router that the conntrack helper belong to'),
)
parser.add_argument(
'conntrack_helper_id',
metavar='<conntrack-helper-id>',
help=_('The ID of the conntrack helper(s)')
help=_('The ID of the conntrack helper(s)'),
)
parser.add_argument(
'--helper',
metavar='<helper>',
help=_('The netfilter conntrack helper module')
help=_('The netfilter conntrack helper module'),
)
parser.add_argument(
'--protocol',
metavar='<protocol>',
help=_('The network protocol for the netfilter conntrack target '
'rule')
help=_(
'The network protocol for the netfilter conntrack target '
'rule'
),
)
parser.add_argument(
'--port',
metavar='<port>',
type=int,
help=_('The network port for the netfilter conntrack target rule')
help=_('The network port for the netfilter conntrack target rule'),
)
return parser
@ -225,8 +243,10 @@ class SetConntrackHelper(command.Command):
attrs = _get_attrs(client, parsed_args)
if attrs:
client.update_conntrack_helper(
parsed_args.conntrack_helper_id, attrs.pop('router_id'),
**attrs)
parsed_args.conntrack_helper_id,
attrs.pop('router_id'),
**attrs
)
class ShowConntrackHelper(command.ShowOne):
@ -237,12 +257,12 @@ class ShowConntrackHelper(command.ShowOne):
parser.add_argument(
'router',
metavar='<router>',
help=_('Router that the conntrack helper belong to')
help=_('Router that the conntrack helper belong to'),
)
parser.add_argument(
'conntrack_helper_id',
metavar='<conntrack-helper-id>',
help=_('The ID of the conntrack helper')
help=_('The ID of the conntrack helper'),
)
return parser
@ -251,7 +271,8 @@ class ShowConntrackHelper(command.ShowOne):
client = self.app.client_manager.network
router = client.find_router(parsed_args.router, ignore_missing=False)
obj = client.get_conntrack_helper(
parsed_args.conntrack_helper_id, router.id)
parsed_args.conntrack_helper_id, router.id
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters={})

View File

@ -31,7 +31,8 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns)
item, column_map, hidden_columns
)
def _get_attrs(client_manager, parsed_args):
@ -51,14 +52,16 @@ def _get_attrs(client_manager, parsed_args):
).id
attrs['project_id'] = project_id
if parsed_args.network:
network = network_client.find_network(parsed_args.network,
ignore_missing=False)
network = network_client.find_network(
parsed_args.network, ignore_missing=False
)
attrs['network_id'] = network.id
if parsed_args.local_ip_address:
attrs['local_ip_address'] = parsed_args.local_ip_address
if parsed_args.local_port:
port = network_client.find_port(parsed_args.local_port,
ignore_missing=False)
port = network_client.find_port(
parsed_args.local_port, ignore_missing=False
)
attrs['local_port_id'] = port.id
if parsed_args.ip_mode:
attrs['ip_mode'] = parsed_args.ip_mode
@ -71,24 +74,22 @@ class CreateLocalIP(command.ShowOne):
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
parser.add_argument(
'--name',
metavar="<name>",
help=_("New local IP name")
'--name', metavar="<name>", help=_("New local IP name")
)
parser.add_argument(
'--description',
metavar="<description>",
help=_("New local IP description")
help=_("New local IP description"),
)
parser.add_argument(
'--network',
metavar='<network>',
help=_("Network to allocate Local IP (name or ID)")
help=_("Network to allocate Local IP (name or ID)"),
)
parser.add_argument(
'--local-port',
metavar='<local-port>',
help=_("Port to allocate Local IP (name or ID)")
help=_("Port to allocate Local IP (name or ID)"),
)
parser.add_argument(
"--local-ip-address",
@ -96,9 +97,7 @@ class CreateLocalIP(command.ShowOne):
help=_("IP address or CIDR "),
)
parser.add_argument(
'--ip-mode',
metavar='<ip-mode>',
help=_("local IP ip mode")
'--ip-mode', metavar='<ip-mode>', help=_("local IP ip mode")
)
identity_common.add_project_domain_option_to_parser(parser)
@ -125,7 +124,7 @@ class DeleteLocalIP(command.Command):
'local_ip',
metavar="<local-ip>",
nargs='+',
help=_("Local IP(s) to delete (name or ID)")
help=_("Local IP(s) to delete (name or ID)"),
)
return parser
@ -140,14 +139,19 @@ class DeleteLocalIP(command.Command):
client.delete_local_ip(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete Local IP with "
"name or ID '%(lip)s': %(e)s"),
{'lip': lip, 'e': e})
LOG.error(
_(
"Failed to delete Local IP with "
"name or ID '%(lip)s': %(e)s"
),
{'lip': lip, 'e': e},
)
if result > 0:
total = len(parsed_args.local_ip)
msg = (_("%(result)s of %(total)s local IPs failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s local IPs failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -159,25 +163,21 @@ class SetLocalIP(command.Command):
parser.add_argument(
'local_ip',
metavar="<local-ip>",
help=_("Local IP to modify (name or ID)")
help=_("Local IP to modify (name or ID)"),
)
parser.add_argument(
'--name',
metavar="<name>",
help=_('Set local IP name')
'--name', metavar="<name>", help=_('Set local IP name')
)
parser.add_argument(
'--description',
metavar="<description>",
help=_('Set local IP description')
help=_('Set local IP description'),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_local_ip(
parsed_args.local_ip,
ignore_missing=False)
obj = client.find_local_ip(parsed_args.local_ip, ignore_missing=False)
attrs = {}
if parsed_args.name is not None:
attrs['name'] = parsed_args.name
@ -196,37 +196,36 @@ class ListLocalIP(command.Lister):
parser.add_argument(
'--name',
metavar='<name>',
help=_("List only local IPs of given name in output")
help=_("List only local IPs of given name in output"),
)
parser.add_argument(
'--project',
metavar="<project>",
help=_("List Local IPs according to their project "
"(name or ID)")
help=_(
"List Local IPs according to their project " "(name or ID)"
),
)
parser.add_argument(
'--network',
metavar='<network>',
help=_("List Local IP(s) according to "
"given network (name or ID)")
help=_(
"List Local IP(s) according to " "given network (name or ID)"
),
)
parser.add_argument(
'--local-port',
metavar='<local-port>',
help=_("List Local IP(s) according to "
"given port (name or ID)")
help=_("List Local IP(s) according to " "given port (name or ID)"),
)
parser.add_argument(
'--local-ip-address',
metavar='<local-ip-address>',
help=_("List Local IP(s) according to "
"given Local IP Address")
help=_("List Local IP(s) according to " "given Local IP Address"),
)
parser.add_argument(
'--ip-mode',
metavar='<ip_mode>',
help=_("List Local IP(s) according to "
"given IP mode")
help=_("List Local IP(s) according to " "given IP mode"),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -267,12 +266,14 @@ class ListLocalIP(command.Lister):
).id
attrs['project_id'] = project_id
if parsed_args.network is not None:
network = client.find_network(parsed_args.network,
ignore_missing=False)
network = client.find_network(
parsed_args.network, ignore_missing=False
)
attrs['network_id'] = network.id
if parsed_args.local_port:
port = client.find_port(parsed_args.local_port,
ignore_missing=False)
port = client.find_port(
parsed_args.local_port, ignore_missing=False
)
attrs['local_port_id'] = port.id
if parsed_args.local_ip_address:
attrs['local_ip_address'] = parsed_args.local_ip_address
@ -280,10 +281,17 @@ class ListLocalIP(command.Lister):
attrs['ip_mode'] = parsed_args.ip_mode
data = client.local_ips(**attrs)
return (column_headers,
(utils.get_item_properties(s,
columns,
formatters={},) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
)
for s in data
),
)
class ShowLocalIP(command.ShowOne):
@ -294,16 +302,14 @@ class ShowLocalIP(command.ShowOne):
parser.add_argument(
'local_ip',
metavar="<local-ip>",
help=_("Local IP to display (name or ID)")
help=_("Local IP to display (name or ID)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_local_ip(
parsed_args.local_ip,
ignore_missing=False)
obj = client.find_local_ip(parsed_args.local_ip, ignore_missing=False)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters={})

View File

@ -31,7 +31,8 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'name', 'id', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns)
item, column_map, hidden_columns
)
class CreateLocalIPAssociation(command.ShowOne):
@ -42,18 +43,19 @@ class CreateLocalIPAssociation(command.ShowOne):
parser.add_argument(
'local_ip',
metavar='<local-ip>',
help=_("Local IP that the port association belongs to "
"(Name or ID)")
help=_(
"Local IP that the port association belongs to " "(Name or ID)"
),
)
parser.add_argument(
'fixed_port',
metavar='<fixed-port>',
help=_("The ID or Name of Port to allocate Local IP Association")
help=_("The ID or Name of Port to allocate Local IP Association"),
)
parser.add_argument(
'--fixed-ip',
metavar='<fixed-ip>',
help=_("Fixed IP for Local IP Association")
help=_("Fixed IP for Local IP Association"),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -64,8 +66,7 @@ class CreateLocalIPAssociation(command.ShowOne):
client = self.app.client_manager.network
attrs = {}
port = client.find_port(parsed_args.fixed_port,
ignore_missing=False)
port = client.find_port(parsed_args.fixed_port, ignore_missing=False)
attrs['fixed_port_id'] = port.id
if parsed_args.fixed_ip:
attrs['fixed_ip'] = parsed_args.fixed_ip
@ -88,14 +89,15 @@ class DeleteLocalIPAssociation(command.Command):
parser.add_argument(
'local_ip',
metavar="<local-ip>",
help=_("Local IP that the port association belongs to "
"(Name or ID)")
help=_(
"Local IP that the port association belongs to " "(Name or ID)"
),
)
parser.add_argument(
'fixed_port_id',
nargs="+",
metavar="<fixed-port-id>",
help=_("The fixed port ID of Local IP Association")
help=_("The fixed port ID of Local IP Association"),
)
return parser
@ -116,15 +118,21 @@ class DeleteLocalIPAssociation(command.Command):
)
except Exception as e:
result += 1
LOG.error(_("Failed to delete Local IP Association with "
"fixed port "
"name or ID '%(fixed_port_id)s': %(e)s"),
{'fixed port ID': fixed_port_id, 'e': e})
LOG.error(
_(
"Failed to delete Local IP Association with "
"fixed port "
"name or ID '%(fixed_port_id)s': %(e)s"
),
{'fixed port ID': fixed_port_id, 'e': e},
)
if result > 0:
total = len(parsed_args.fixed_port_id)
msg = (_("%(result)s of %(total)s Local IP Associations failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s Local IP Associations failed "
"to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -137,23 +145,24 @@ class ListLocalIPAssociation(command.Lister):
parser.add_argument(
'local_ip',
metavar='<local-ip>',
help=_("Local IP that port associations belongs to")
help=_("Local IP that port associations belongs to"),
)
parser.add_argument(
'--fixed-port',
metavar='<fixed-port>',
help=_("Filter the list result by the ID or name of "
"the fixed port")
help=_(
"Filter the list result by the ID or name of " "the fixed port"
),
)
parser.add_argument(
'--fixed-ip',
metavar='<fixed-ip>',
help=_("Filter the list result by fixed ip")
help=_("Filter the list result by fixed ip"),
)
parser.add_argument(
'--host',
metavar='<host>',
help=_("Filter the list result by given host")
help=_("Filter the list result by given host"),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -173,7 +182,7 @@ class ListLocalIPAssociation(command.Lister):
'Local IP Address',
'Fixed port ID',
'Fixed IP',
'Host'
'Host',
)
attrs = {}
obj = client.find_local_ip(
@ -181,8 +190,9 @@ class ListLocalIPAssociation(command.Lister):
ignore_missing=False,
)
if parsed_args.fixed_port:
port = client.find_port(parsed_args.fixed_port,
ignore_missing=False)
port = client.find_port(
parsed_args.fixed_port, ignore_missing=False
)
attrs['fixed_port_id'] = port.id
if parsed_args.fixed_ip:
attrs['fixed_ip'] = parsed_args.fixed_ip
@ -191,7 +201,10 @@ class ListLocalIPAssociation(command.Lister):
data = client.local_ip_associations(obj, **attrs)
return (column_headers,
(utils.get_item_properties(s,
columns,
formatters={}) for s in data))
return (
column_headers,
(
utils.get_item_properties(s, columns, formatters={})
for s in data
),
)

View File

@ -31,7 +31,8 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location']
return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns)
item, column_map, hidden_columns
)
class CreateNDPProxy(command.ShowOne):
@ -40,31 +41,36 @@ class CreateNDPProxy(command.ShowOne):
def get_parser(self, prog_name):
parser = super().get_parser(prog_name)
parser.add_argument(
'router',
metavar='<router>',
help=_("The name or ID of a router"))
'router', metavar='<router>', help=_("The name or ID of a router")
)
parser.add_argument(
'--name',
metavar='<name>',
help=_("New NDP proxy name")
'--name', metavar='<name>', help=_("New NDP proxy name")
)
parser.add_argument(
'--port',
metavar='<port>',
required=True,
help=_("The name or ID of the network port associated "
"to the NDP proxy"))
help=_(
"The name or ID of the network port associated "
"to the NDP proxy"
),
)
parser.add_argument(
'--ip-address',
metavar='<ip-address>',
help=_("The IPv6 address that is to be proxied. In case the port "
"has multiple addresses assigned, use this option to "
"select which address is to be used."))
help=_(
"The IPv6 address that is to be proxied. In case the port "
"has multiple addresses assigned, use this option to "
"select which address is to be used."
),
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("A text to describe/contextualize the use of the "
"NDP proxy configuration")
help=_(
"A text to describe/contextualize the use of the "
"NDP proxy configuration"
),
)
return parser
@ -81,8 +87,7 @@ class CreateNDPProxy(command.ShowOne):
if parsed_args.ip_address:
attrs['ip_address'] = parsed_args.ip_address
port = client.find_port(parsed_args.port,
ignore_missing=False)
port = client.find_port(parsed_args.port, ignore_missing=False)
attrs['port_id'] = port.id
if parsed_args.description is not None:
@ -103,7 +108,7 @@ class DeleteNDPProxy(command.Command):
'ndp_proxy',
nargs="+",
metavar="<ndp-proxy>",
help=_("NDP proxy(s) to delete (name or ID)")
help=_("NDP proxy(s) to delete (name or ID)"),
)
return parser
@ -117,13 +122,15 @@ class DeleteNDPProxy(command.Command):
client.delete_ndp_proxy(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete NDP proxy "
"'%(ndp_proxy)s': %(e)s"),
{'ndp_proxy': ndp_proxy, 'e': e})
LOG.error(
_("Failed to delete NDP proxy " "'%(ndp_proxy)s': %(e)s"),
{'ndp_proxy': ndp_proxy, 'e': e},
)
if result > 0:
total = len(parsed_args.ndp_proxy)
msg = (_("%(result)s of %(total)s NDP Proxy failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s NDP Proxy failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -135,27 +142,27 @@ class ListNDPProxy(command.Lister):
parser.add_argument(
'--router',
metavar='<router>',
help=_("List only NDP proxies belong to this router (name or ID)")
help=_("List only NDP proxies belong to this router (name or ID)"),
)
parser.add_argument(
'--port',
metavar='<port>',
help=_("List only NDP proxies assocate to this port (name or ID)")
help=_("List only NDP proxies assocate to this port (name or ID)"),
)
parser.add_argument(
'--ip-address',
metavar='ip-address',
help=_("List only NDP proxies according to their IPv6 address")
help=_("List only NDP proxies according to their IPv6 address"),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("List NDP proxies according to their project (name or ID)")
help=_("List NDP proxies according to their project (name or ID)"),
)
parser.add_argument(
'--name',
metavar='<name>',
help=_("List NDP proxies according to their name")
help=_("List NDP proxies according to their name"),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -184,12 +191,12 @@ class ListNDPProxy(command.Lister):
query = {}
if parsed_args.router:
router = client.find_router(parsed_args.router,
ignore_missing=False)
router = client.find_router(
parsed_args.router, ignore_missing=False
)
query['router_id'] = router.id
if parsed_args.port:
port = client.find_port(parsed_args.port,
ignore_missing=False)
port = client.find_port(parsed_args.port, ignore_missing=False)
query['port_id'] = port.id
if parsed_args.ip_address is not None:
query['ip_address'] = parsed_args.ip_address
@ -205,11 +212,17 @@ class ListNDPProxy(command.Lister):
data = client.ndp_proxies(**query)
return (headers,
(utils.get_item_properties(
s, columns,
return (
headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
) for s in data))
)
for s in data
),
)
class SetNDPProxy(command.Command):
@ -220,18 +233,18 @@ class SetNDPProxy(command.Command):
parser.add_argument(
'ndp_proxy',
metavar='<ndp-proxy>',
help=_("The ID or name of the NDP proxy to update")
help=_("The ID or name of the NDP proxy to update"),
)
parser.add_argument(
'--name',
metavar='<name>',
help=_("Set NDP proxy name")
'--name', metavar='<name>', help=_("Set NDP proxy name")
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("A text to describe/contextualize the use of "
"the NDP proxy configuration")
help=_(
"A text to describe/contextualize the use of "
"the NDP proxy configuration"
),
)
return parser
@ -244,7 +257,8 @@ class SetNDPProxy(command.Command):
attrs['name'] = parsed_args.name
obj = client.find_ndp_proxy(
parsed_args.ndp_proxy, ignore_missing=False)
parsed_args.ndp_proxy, ignore_missing=False
)
client.update_ndp_proxy(obj, **attrs)
@ -256,14 +270,15 @@ class ShowNDPProxy(command.ShowOne):
parser.add_argument(
'ndp_proxy',
metavar="<ndp-proxy>",
help=_("The ID or name of the NDP proxy")
help=_("The ID or name of the NDP proxy"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_ndp_proxy(parsed_args.ndp_proxy,
ignore_missing=False)
obj = client.find_ndp_proxy(
parsed_args.ndp_proxy, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
return (display_columns, data)

View File

@ -63,9 +63,7 @@ def _get_columns_network(item):
hidden_columns = ['location', 'tenant_id']
hidden_columns = ['location']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -102,8 +100,10 @@ def _get_attrs_network(client_manager, parsed_args):
attrs['project_id'] = project_id
# "network set" command doesn't support setting availability zone hints.
if 'availability_zone_hints' in parsed_args and \
parsed_args.availability_zone_hints is not None:
if (
'availability_zone_hints' in parsed_args
and parsed_args.availability_zone_hints is not None
):
attrs['availability_zone_hints'] = parsed_args.availability_zone_hints
# set description
@ -132,8 +132,9 @@ def _get_attrs_network(client_manager, parsed_args):
attrs['provider:segmentation_id'] = parsed_args.segmentation_id
if parsed_args.qos_policy is not None:
network_client = client_manager.network
_qos_policy = network_client.find_qos_policy(parsed_args.qos_policy,
ignore_missing=False)
_qos_policy = network_client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False
)
attrs['qos_policy_id'] = _qos_policy.id
if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy:
attrs['qos_policy_id'] = None
@ -162,53 +163,63 @@ def _add_additional_network_options(parser):
parser.add_argument(
'--provider-network-type',
metavar='<provider-network-type>',
help=_("The physical mechanism by which the virtual network "
"is implemented. For example: "
"flat, geneve, gre, local, vlan, vxlan."))
help=_(
"The physical mechanism by which the virtual network "
"is implemented. For example: "
"flat, geneve, gre, local, vlan, vxlan."
),
)
parser.add_argument(
'--provider-physical-network',
metavar='<provider-physical-network>',
dest='physical_network',
help=_("Name of the physical network over which the virtual "
"network is implemented"))
help=_(
"Name of the physical network over which the virtual "
"network is implemented"
),
)
parser.add_argument(
'--provider-segment',
metavar='<provider-segment>',
dest='segmentation_id',
help=_("VLAN ID for VLAN networks or Tunnel ID for "
"GENEVE/GRE/VXLAN networks"))
help=_(
"VLAN ID for VLAN networks or Tunnel ID for "
"GENEVE/GRE/VXLAN networks"
),
)
parser.add_argument(
'--dns-domain',
metavar='<dns-domain>',
dest='dns_domain',
help=_("Set DNS domain for this network "
"(requires DNS integration extension)")
help=_(
"Set DNS domain for this network "
"(requires DNS integration extension)"
),
)
# TODO(sindhu): Use the SDK resource mapped attribute names once the
# OSC minimum requirements include SDK 1.0.
class CreateNetwork(common.NetworkAndComputeShowOne,
common.NeutronCommandWithExtraArgs):
class CreateNetwork(
common.NetworkAndComputeShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create new network")
def update_parser_common(self, parser):
parser.add_argument(
'name',
metavar='<name>',
help=_("New network name")
'name', metavar='<name>', help=_("New network name")
)
share_group = parser.add_mutually_exclusive_group()
share_group.add_argument(
'--share',
action='store_true',
default=None,
help=_("Share the network between projects")
help=_("Share the network between projects"),
)
share_group.add_argument(
'--no-share',
action='store_true',
help=_("Do not share the network between projects")
help=_("Do not share the network between projects"),
)
return parser
@ -218,27 +229,27 @@ class CreateNetwork(common.NetworkAndComputeShowOne,
'--enable',
action='store_true',
default=True,
help=self.enhance_help_neutron(_("Enable network (default)"))
help=self.enhance_help_neutron(_("Enable network (default)")),
)
admin_group.add_argument(
'--disable',
action='store_true',
help=self.enhance_help_neutron(_("Disable network"))
help=self.enhance_help_neutron(_("Disable network")),
)
parser.add_argument(
'--project',
metavar='<project>',
help=self.enhance_help_neutron(_("Owner's project (name or ID)"))
help=self.enhance_help_neutron(_("Owner's project (name or ID)")),
)
parser.add_argument(
'--description',
metavar='<description>',
help=self.enhance_help_neutron(_("Set network description"))
help=self.enhance_help_neutron(_("Set network description")),
)
parser.add_argument(
'--mtu',
metavar='<mtu>',
help=self.enhance_help_neutron(_("Set network mtu"))
help=self.enhance_help_neutron(_("Set network mtu")),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
@ -247,77 +258,102 @@ class CreateNetwork(common.NetworkAndComputeShowOne,
dest='availability_zone_hints',
metavar='<availability-zone>',
help=self.enhance_help_neutron(
_("Availability Zone in which to create this network "
"(Network Availability Zone extension required, "
"repeat option to set multiple availability zones)"))
_(
"Availability Zone in which to create this network "
"(Network Availability Zone extension required, "
"repeat option to set multiple availability zones)"
)
),
)
port_security_group = parser.add_mutually_exclusive_group()
port_security_group.add_argument(
'--enable-port-security',
action='store_true',
help=self.enhance_help_neutron(
_("Enable port security by default for ports created on "
"this network (default)"))
_(
"Enable port security by default for ports created on "
"this network (default)"
)
),
)
port_security_group.add_argument(
'--disable-port-security',
action='store_true',
help=self.enhance_help_neutron(
_("Disable port security by default for ports created on "
"this network"))
_(
"Disable port security by default for ports created on "
"this network"
)
),
)
external_router_grp = parser.add_mutually_exclusive_group()
external_router_grp.add_argument(
'--external',
action='store_true',
help=self.enhance_help_neutron(
_("The network has an external routing facility that's not "
"managed by Neutron and can be used as in: "
"openstack router set --external-gateway NETWORK "
"(external-net extension required)"))
_(
"The network has an external routing facility that's not "
"managed by Neutron and can be used as in: "
"openstack router set --external-gateway NETWORK "
"(external-net extension required)"
)
),
)
external_router_grp.add_argument(
'--internal',
action='store_true',
help=self.enhance_help_neutron(
_("Opposite of '--external' (default)"))
_("Opposite of '--external' (default)")
),
)
default_router_grp = parser.add_mutually_exclusive_group()
default_router_grp.add_argument(
'--default',
action='store_true',
help=self.enhance_help_neutron(
_("Specify if this network should be used as the default "
"external network"))
_(
"Specify if this network should be used as the default "
"external network"
)
),
)
default_router_grp.add_argument(
'--no-default',
action='store_true',
help=self.enhance_help_neutron(
_("Do not use the network as the default external network "
"(default)"))
_(
"Do not use the network as the default external network "
"(default)"
)
),
)
parser.add_argument(
'--qos-policy',
metavar='<qos-policy>',
help=self.enhance_help_neutron(
_("QoS policy to attach to this network (name or ID)"))
_("QoS policy to attach to this network (name or ID)")
),
)
vlan_transparent_grp = parser.add_mutually_exclusive_group()
vlan_transparent_grp.add_argument(
'--transparent-vlan',
action='store_true',
help=self.enhance_help_neutron(
_("Make the network VLAN transparent")))
_("Make the network VLAN transparent")
),
)
vlan_transparent_grp.add_argument(
'--no-transparent-vlan',
action='store_true',
help=self.enhance_help_neutron(
_("Do not make the network VLAN transparent")))
_("Do not make the network VLAN transparent")
),
)
_add_additional_network_options(parser)
_tag.add_tag_option_to_parser_for_create(
parser, _('network'), enhance_help=self.enhance_help_neutron)
parser, _('network'), enhance_help=self.enhance_help_neutron
)
return parser
def update_parser_compute(self, parser):
@ -326,7 +362,8 @@ class CreateNetwork(common.NetworkAndComputeShowOne,
metavar='<subnet>',
required=True,
help=self.enhance_help_nova_network(
_("IPv4 subnet for fixed IPs (in CIDR notation)"))
_("IPv4 subnet for fixed IPs (in CIDR notation)")
),
)
return parser
@ -337,9 +374,11 @@ class CreateNetwork(common.NetworkAndComputeShowOne,
if parsed_args.no_transparent_vlan:
attrs['vlan_transparent'] = False
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
with common.check_missing_extension_if_error(
self.app.client_manager.network, attrs):
self.app.client_manager.network, attrs
):
obj = client.create_network(**attrs)
# tags cannot be set when created, so tags need to be set later.
@ -368,7 +407,7 @@ class DeleteNetwork(common.NetworkAndComputeDelete):
'network',
metavar="<network>",
nargs="+",
help=_("Network(s) to delete (name or ID)")
help=_("Network(s) to delete (name or ID)"),
)
return parser
@ -391,98 +430,114 @@ class ListNetwork(common.NetworkAndComputeLister):
router_ext_group.add_argument(
'--external',
action='store_true',
help=self.enhance_help_neutron(_("List external networks"))
help=self.enhance_help_neutron(_("List external networks")),
)
router_ext_group.add_argument(
'--internal',
action='store_true',
help=self.enhance_help_neutron(_("List internal networks"))
help=self.enhance_help_neutron(_("List internal networks")),
)
parser.add_argument(
'--long',
action='store_true',
help=self.enhance_help_neutron(
_("List additional fields in output"))
_("List additional fields in output")
),
)
parser.add_argument(
'--name',
metavar='<name>',
help=self.enhance_help_neutron(
_("List networks according to their name"))
_("List networks according to their name")
),
)
admin_state_group = parser.add_mutually_exclusive_group()
admin_state_group.add_argument(
'--enable',
action='store_true',
help=self.enhance_help_neutron(_("List enabled networks"))
help=self.enhance_help_neutron(_("List enabled networks")),
)
admin_state_group.add_argument(
'--disable',
action='store_true',
help=self.enhance_help_neutron(_("List disabled networks"))
help=self.enhance_help_neutron(_("List disabled networks")),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("List networks according to their project (name or ID)")
help=_("List networks according to their project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(
parser, enhance_help=self.enhance_help_neutron)
parser, enhance_help=self.enhance_help_neutron
)
shared_group = parser.add_mutually_exclusive_group()
shared_group.add_argument(
'--share',
action='store_true',
help=self.enhance_help_neutron(
_("List networks shared between projects"))
_("List networks shared between projects")
),
)
shared_group.add_argument(
'--no-share',
action='store_true',
help=self.enhance_help_neutron(
_("List networks not shared between projects"))
_("List networks not shared between projects")
),
)
parser.add_argument(
'--status',
metavar='<status>',
choices=['ACTIVE', 'BUILD', 'DOWN', 'ERROR'],
help=self.enhance_help_neutron(
_("List networks according to their status "
"('ACTIVE', 'BUILD', 'DOWN', 'ERROR')"))
_(
"List networks according to their status "
"('ACTIVE', 'BUILD', 'DOWN', 'ERROR')"
)
),
)
parser.add_argument(
'--provider-network-type',
metavar='<provider-network-type>',
choices=['flat', 'geneve', 'gre', 'local',
'vlan', 'vxlan'],
choices=['flat', 'geneve', 'gre', 'local', 'vlan', 'vxlan'],
help=self.enhance_help_neutron(
_("List networks according to their physical mechanisms. The "
"supported options are: flat, geneve, gre, local, vlan, "
"vxlan."))
_(
"List networks according to their physical mechanisms. "
"The supported options are: flat, geneve, gre, local, "
"vlan, vxlan."
)
),
)
parser.add_argument(
'--provider-physical-network',
metavar='<provider-physical-network>',
dest='physical_network',
help=self.enhance_help_neutron(
_("List networks according to name of the physical network"))
_("List networks according to name of the physical network")
),
)
parser.add_argument(
'--provider-segment',
metavar='<provider-segment>',
dest='segmentation_id',
help=self.enhance_help_neutron(
_("List networks according to VLAN ID for VLAN networks or "
"Tunnel ID for GENEVE/GRE/VXLAN networks"))
_(
"List networks according to VLAN ID for VLAN networks or "
"Tunnel ID for GENEVE/GRE/VXLAN networks"
)
),
)
parser.add_argument(
'--agent',
metavar='<agent-id>',
dest='agent_id',
help=self.enhance_help_neutron(
_('List networks hosted by agent (ID only)'))
_('List networks hosted by agent (ID only)')
),
)
_tag.add_tag_filtering_option_to_parser(
parser, _('networks'), enhance_help=self.enhance_help_neutron)
parser, _('networks'), enhance_help=self.enhance_help_neutron
)
return parser
def take_action_network(self, client, parsed_args):
@ -515,11 +570,7 @@ class ListNetwork(common.NetworkAndComputeLister):
'Tags',
)
elif parsed_args.agent_id:
columns = (
'id',
'name',
'subnet_ids'
)
columns = ('id', 'name', 'subnet_ids')
column_headers = (
'ID',
'Name',
@ -529,17 +580,19 @@ class ListNetwork(common.NetworkAndComputeLister):
dhcp_agent = client.get_agent(parsed_args.agent_id)
data = client.dhcp_agent_hosting_networks(dhcp_agent)
return (column_headers,
(utils.get_item_properties(
s, columns,
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters=_formatters,
) for s in data))
else:
columns = (
'id',
'name',
'subnet_ids'
)
for s in data
),
)
else:
columns = ('id', 'name', 'subnet_ids')
column_headers = (
'ID',
'Name',
@ -597,11 +650,17 @@ class ListNetwork(common.NetworkAndComputeLister):
data = client.networks(**args)
return (column_headers,
(utils.get_item_properties(
s, columns,
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters=_formatters,
) for s in data))
)
for s in data
),
)
def take_action_compute(self, client, parsed_args):
columns = (
@ -617,11 +676,17 @@ class ListNetwork(common.NetworkAndComputeLister):
data = client.api.network_list()
return (column_headers,
(utils.get_dict_properties(
s, columns,
return (
column_headers,
(
utils.get_dict_properties(
s,
columns,
formatters=_formatters,
) for s in data))
)
for s in data
),
)
# TODO(sindhu): Use the SDK resource mapped attribute names once the
@ -634,95 +699,95 @@ class SetNetwork(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'network',
metavar="<network>",
help=_("Network to modify (name or ID)")
help=_("Network to modify (name or ID)"),
)
parser.add_argument(
'--name',
metavar='<name>',
help=_("Set network name")
'--name', metavar='<name>', help=_("Set network name")
)
admin_group = parser.add_mutually_exclusive_group()
admin_group.add_argument(
'--enable',
action='store_true',
default=None,
help=_("Enable network")
help=_("Enable network"),
)
admin_group.add_argument(
'--disable',
action='store_true',
help=_("Disable network")
'--disable', action='store_true', help=_("Disable network")
)
share_group = parser.add_mutually_exclusive_group()
share_group.add_argument(
'--share',
action='store_true',
default=None,
help=_("Share the network between projects")
help=_("Share the network between projects"),
)
share_group.add_argument(
'--no-share',
action='store_true',
help=_("Do not share the network between projects")
help=_("Do not share the network between projects"),
)
parser.add_argument(
'--description',
metavar="<description>",
help=_("Set network description")
help=_("Set network description"),
)
parser.add_argument(
'--mtu',
metavar="<mtu>",
help=_("Set network mtu")
'--mtu', metavar="<mtu>", help=_("Set network mtu")
)
port_security_group = parser.add_mutually_exclusive_group()
port_security_group.add_argument(
'--enable-port-security',
action='store_true',
help=_("Enable port security by default for ports created on "
"this network")
help=_(
"Enable port security by default for ports created on "
"this network"
),
)
port_security_group.add_argument(
'--disable-port-security',
action='store_true',
help=_("Disable port security by default for ports created on "
"this network")
help=_(
"Disable port security by default for ports created on "
"this network"
),
)
external_router_grp = parser.add_mutually_exclusive_group()
external_router_grp.add_argument(
'--external',
action='store_true',
help=_("The network has an external routing facility that's not "
"managed by Neutron and can be used as in: "
"openstack router set --external-gateway NETWORK "
"(external-net extension required)")
help=_(
"The network has an external routing facility that's not "
"managed by Neutron and can be used as in: "
"openstack router set --external-gateway NETWORK "
"(external-net extension required)"
),
)
external_router_grp.add_argument(
'--internal',
action='store_true',
help=_("Opposite of '--external'")
help=_("Opposite of '--external'"),
)
default_router_grp = parser.add_mutually_exclusive_group()
default_router_grp.add_argument(
'--default',
action='store_true',
help=_("Set the network as the default external network")
help=_("Set the network as the default external network"),
)
default_router_grp.add_argument(
'--no-default',
action='store_true',
help=_("Do not use the network as the default external network")
help=_("Do not use the network as the default external network"),
)
qos_group = parser.add_mutually_exclusive_group()
qos_group.add_argument(
'--qos-policy',
metavar='<qos-policy>',
help=_("QoS policy to attach to this network (name or ID)")
help=_("QoS policy to attach to this network (name or ID)"),
)
qos_group.add_argument(
'--no-qos-policy',
action='store_true',
help=_("Remove the QoS policy attached to this network")
help=_("Remove the QoS policy attached to this network"),
)
_tag.add_tag_option_to_parser_for_set(parser, _('network'))
_add_additional_network_options(parser)
@ -734,10 +799,12 @@ class SetNetwork(common.NeutronCommandWithExtraArgs):
attrs = _get_attrs_network(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
with common.check_missing_extension_if_error(
self.app.client_manager.network, attrs):
self.app.client_manager.network, attrs
):
client.update_network(obj, **attrs)
# tags is a subresource and it needs to be updated separately.
@ -751,7 +818,7 @@ class ShowNetwork(common.NetworkAndComputeShowOne):
parser.add_argument(
'network',
metavar="<network>",
help=_("Network to display (name or ID)")
help=_("Network to display (name or ID)"),
)
return parser
@ -776,7 +843,7 @@ class UnsetNetwork(common.NeutronUnsetCommandWithExtraArgs):
parser.add_argument(
'network',
metavar="<network>",
help=_("Network to modify (name or ID)")
help=_("Network to modify (name or ID)"),
)
_tag.add_tag_option_to_parser_for_unset(parser, _('network'))
return parser

View File

@ -52,9 +52,7 @@ def _get_network_columns(item):
}
hidden_columns = ['location', 'name', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -66,15 +64,18 @@ class AddNetworkToAgent(command.Command):
parser.add_argument(
'--dhcp',
action='store_true',
help=_('Add network to a DHCP agent'))
help=_('Add network to a DHCP agent'),
)
parser.add_argument(
'agent_id',
metavar='<agent-id>',
help=_('Agent to which a network is added (ID only)'))
help=_('Agent to which a network is added (ID only)'),
)
parser.add_argument(
'network',
metavar='<network>',
help=_('Network to be added to an agent (name or ID)'))
help=_('Network to be added to an agent (name or ID)'),
)
return parser
@ -82,13 +83,15 @@ class AddNetworkToAgent(command.Command):
client = self.app.client_manager.network
agent = client.get_agent(parsed_args.agent_id)
network = client.find_network(
parsed_args.network, ignore_missing=False)
parsed_args.network, ignore_missing=False
)
if parsed_args.dhcp:
try:
client.add_dhcp_agent_to_network(agent, network)
except Exception:
msg = 'Failed to add {} to {}'.format(
network.name, agent.agent_type)
network.name, agent.agent_type
)
exceptions.CommandError(msg)
@ -98,19 +101,17 @@ class AddRouterToAgent(command.Command):
def get_parser(self, prog_name):
parser = super(AddRouterToAgent, self).get_parser(prog_name)
parser.add_argument(
'--l3',
action='store_true',
help=_('Add router to an L3 agent')
'--l3', action='store_true', help=_('Add router to an L3 agent')
)
parser.add_argument(
'agent_id',
metavar='<agent-id>',
help=_("Agent to which a router is added (ID only)")
help=_("Agent to which a router is added (ID only)"),
)
parser.add_argument(
'router',
metavar='<router>',
help=_("Router to be added to an agent (name or ID)")
help=_("Router to be added to an agent (name or ID)"),
)
return parser
@ -132,7 +133,7 @@ class DeleteNetworkAgent(command.Command):
'network_agent',
metavar="<network-agent>",
nargs='+',
help=(_("Network agent(s) to delete (ID only)"))
help=(_("Network agent(s) to delete (ID only)")),
)
return parser
@ -145,14 +146,19 @@ class DeleteNetworkAgent(command.Command):
client.delete_agent(agent, ignore_missing=False)
except Exception as e:
result += 1
LOG.error(_("Failed to delete network agent with "
"ID '%(agent)s': %(e)s"),
{'agent': agent, 'e': e})
LOG.error(
_(
"Failed to delete network agent with "
"ID '%(agent)s': %(e)s"
),
{'agent': agent, 'e': e},
)
if result > 0:
total = len(parsed_args.network_agent)
msg = (_("%(result)s of %(total)s network agents failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s network agents failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -166,35 +172,48 @@ class ListNetworkAgent(command.Lister):
parser.add_argument(
'--agent-type',
metavar='<agent-type>',
choices=["bgp", "dhcp", "open-vswitch", "linux-bridge", "ofa",
"l3", "loadbalancer", "metering", "metadata", "macvtap",
"nic", "baremetal"],
help=_("List only agents with the specified agent type. "
"The supported agent types are: bgp, dhcp, open-vswitch, "
"linux-bridge, ofa, l3, loadbalancer, metering, "
"metadata, macvtap, nic, baremetal.")
choices=[
"bgp",
"dhcp",
"open-vswitch",
"linux-bridge",
"ofa",
"l3",
"loadbalancer",
"metering",
"metadata",
"macvtap",
"nic",
"baremetal",
],
help=_(
"List only agents with the specified agent type. "
"The supported agent types are: bgp, dhcp, open-vswitch, "
"linux-bridge, ofa, l3, loadbalancer, metering, "
"metadata, macvtap, nic, baremetal."
),
)
parser.add_argument(
'--host',
metavar='<host>',
help=_("List only agents running on the specified host")
help=_("List only agents running on the specified host"),
)
agent_type_group = parser.add_mutually_exclusive_group()
agent_type_group.add_argument(
'--network',
metavar='<network>',
help=_('List agents hosting a network (name or ID)')
help=_('List agents hosting a network (name or ID)'),
)
agent_type_group.add_argument(
'--router',
metavar='<router>',
help=_('List agents hosting this router (name or ID)')
help=_('List agents hosting this router (name or ID)'),
)
parser.add_argument(
'--long',
action='store_true',
default=False,
help=_("List additional fields in output")
help=_("List additional fields in output"),
)
return parser
@ -208,7 +227,7 @@ class ListNetworkAgent(command.Lister):
'availability_zone',
'is_alive',
'is_admin_state_up',
'binary'
'binary',
)
column_headers = (
'ID',
@ -217,7 +236,7 @@ class ListNetworkAgent(command.Lister):
'Availability Zone',
'Alive',
'State',
'Binary'
'Binary',
)
key_value = {
@ -232,21 +251,23 @@ class ListNetworkAgent(command.Lister):
'metadata': 'Metadata agent',
'macvtap': 'Macvtap agent',
'nic': 'NIC Switch agent',
'baremetal': 'Baremetal Node'
'baremetal': 'Baremetal Node',
}
filters = {}
if parsed_args.network is not None:
network = client.find_network(
parsed_args.network, ignore_missing=False)
parsed_args.network, ignore_missing=False
)
data = client.network_hosting_dhcp_agents(network)
elif parsed_args.router is not None:
if parsed_args.long:
columns += ('ha_state',)
column_headers += ('HA State',)
router = client.find_router(parsed_args.router,
ignore_missing=False)
router = client.find_router(
parsed_args.router, ignore_missing=False
)
data = client.routers_hosting_l3_agents(router)
else:
if parsed_args.agent_type is not None:
@ -255,10 +276,17 @@ class ListNetworkAgent(command.Lister):
filters['host'] = parsed_args.host
data = client.agents(**filters)
return (column_headers,
(utils.get_item_properties(
s, columns, formatters=_formatters,
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters=_formatters,
)
for s in data
),
)
class RemoveNetworkFromAgent(command.Command):
@ -269,28 +297,33 @@ class RemoveNetworkFromAgent(command.Command):
parser.add_argument(
'--dhcp',
action='store_true',
help=_('Remove network from DHCP agent'))
help=_('Remove network from DHCP agent'),
)
parser.add_argument(
'agent_id',
metavar='<agent-id>',
help=_('Agent to which a network is removed (ID only)'))
help=_('Agent to which a network is removed (ID only)'),
)
parser.add_argument(
'network',
metavar='<network>',
help=_('Network to be removed from an agent (name or ID)'))
help=_('Network to be removed from an agent (name or ID)'),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
agent = client.get_agent(parsed_args.agent_id)
network = client.find_network(
parsed_args.network, ignore_missing=False)
parsed_args.network, ignore_missing=False
)
if parsed_args.dhcp:
try:
client.remove_dhcp_agent_from_network(agent, network)
except Exception:
msg = 'Failed to remove {} to {}'.format(
network.name, agent.agent_type)
network.name, agent.agent_type
)
exceptions.CommandError(msg)
@ -302,17 +335,17 @@ class RemoveRouterFromAgent(command.Command):
parser.add_argument(
'--l3',
action='store_true',
help=_('Remove router from an L3 agent')
help=_('Remove router from an L3 agent'),
)
parser.add_argument(
'agent_id',
metavar='<agent-id>',
help=_("Agent from which router will be removed (ID only)")
help=_("Agent from which router will be removed (ID only)"),
)
parser.add_argument(
'router',
metavar='<router>',
help=_("Router to be removed from an agent (name or ID)")
help=_("Router to be removed from an agent (name or ID)"),
)
return parser
@ -335,23 +368,19 @@ class SetNetworkAgent(command.Command):
parser.add_argument(
'network_agent',
metavar="<network-agent>",
help=(_("Network agent to modify (ID only)"))
help=(_("Network agent to modify (ID only)")),
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("Set network agent description")
help=_("Set network agent description"),
)
admin_group = parser.add_mutually_exclusive_group()
admin_group.add_argument(
'--enable',
action='store_true',
help=_("Enable network agent")
'--enable', action='store_true', help=_("Enable network agent")
)
admin_group.add_argument(
'--disable',
action='store_true',
help=_("Disable network agent")
'--disable', action='store_true', help=_("Disable network agent")
)
return parser
@ -378,7 +407,7 @@ class ShowNetworkAgent(command.ShowOne):
parser.add_argument(
'network_agent',
metavar="<network-agent>",
help=(_("Network agent to display (ID only)"))
help=(_("Network agent to display (ID only)")),
)
return parser
@ -386,5 +415,9 @@ class ShowNetworkAgent(command.ShowOne):
client = self.app.client_manager.network
obj = client.get_agent(parsed_args.network_agent)
display_columns, columns = _get_network_columns(obj)
data = utils.get_item_properties(obj, columns, formatters=_formatters,)
data = utils.get_item_properties(
obj,
columns,
formatters=_formatters,
)
return display_columns, data

View File

@ -28,9 +28,7 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['name', 'location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -71,22 +69,28 @@ class CreateAutoAllocatedTopology(command.ShowOne):
parser.add_argument(
'--project',
metavar='<project>',
help=_("Return the auto allocated topology for a given project. "
"Default is current project")
help=_(
"Return the auto allocated topology for a given project. "
"Default is current project"
),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--check-resources',
action='store_true',
help=_("Validate the requirements for auto allocated topology. "
"Does not return a topology.")
help=_(
"Validate the requirements for auto allocated topology. "
"Does not return a topology."
),
)
parser.add_argument(
'--or-show',
action='store_true',
default=True,
help=_("If topology exists returns the topology's "
"information (Default)")
help=_(
"If topology exists returns the topology's "
"information (Default)"
),
)
return parser
@ -95,9 +99,9 @@ class CreateAutoAllocatedTopology(command.ShowOne):
obj = client.validate_auto_allocated_topology(parsed_args.project)
columns = _format_check_resource_columns()
data = utils.get_item_properties(_format_check_resource(obj),
columns,
formatters={})
data = utils.get_item_properties(
_format_check_resource(obj), columns, formatters={}
)
return (columns, data)
@ -126,8 +130,10 @@ class DeleteAutoAllocatedTopology(command.Command):
parser.add_argument(
'--project',
metavar='<project>',
help=_('Delete auto allocated topology for a given project. '
'Default is the current project')
help=_(
'Delete auto allocated topology for a given project. '
'Default is the current project'
),
)
identity_common.add_project_domain_option_to_parser(parser)

View File

@ -33,9 +33,7 @@ def _get_columns(item):
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -65,28 +63,28 @@ class AddNetworkFlavorToProfile(command.Command):
_description = _("Add a service profile to a network flavor")
def get_parser(self, prog_name):
parser = super(
AddNetworkFlavorToProfile, self).get_parser(prog_name)
parser = super(AddNetworkFlavorToProfile, self).get_parser(prog_name)
parser.add_argument(
'flavor',
metavar="<flavor>",
help=_("Network flavor (name or ID)")
'flavor', metavar="<flavor>", help=_("Network flavor (name or ID)")
)
parser.add_argument(
'service_profile',
metavar="<service-profile>",
help=_("Service profile (ID only)")
help=_("Service profile (ID only)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj_flavor = client.find_flavor(
parsed_args.flavor, ignore_missing=False)
parsed_args.flavor, ignore_missing=False
)
obj_service_profile = client.find_service_profile(
parsed_args.service_profile, ignore_missing=False)
parsed_args.service_profile, ignore_missing=False
)
client.associate_flavor_with_service_profile(
obj_flavor, obj_service_profile)
obj_flavor, obj_service_profile
)
# TODO(dasanind): Use the SDK resource mapped attribute names once the
@ -97,26 +95,25 @@ class CreateNetworkFlavor(command.ShowOne, common.NeutronCommandWithExtraArgs):
def get_parser(self, prog_name):
parser = super(CreateNetworkFlavor, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar="<name>",
help=_("Name for the flavor")
'name', metavar="<name>", help=_("Name for the flavor")
)
parser.add_argument(
'--service-type',
metavar="<service-type>",
required=True,
help=_('Service type to which the flavor applies to: e.g. VPN '
'(See openstack network service provider list for loaded '
'examples.)')
help=_(
'Service type to which the flavor applies to: e.g. VPN '
'(See openstack network service provider list for loaded '
'examples.)'
),
)
parser.add_argument(
'--description',
help=_('Description for the flavor')
'--description', help=_('Description for the flavor')
)
parser.add_argument(
'--project',
metavar="<project>",
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -124,12 +121,10 @@ class CreateNetworkFlavor(command.ShowOne, common.NeutronCommandWithExtraArgs):
enable_group.add_argument(
'--enable',
action='store_true',
help=_("Enable the flavor (default)")
help=_("Enable the flavor (default)"),
)
enable_group.add_argument(
'--disable',
action='store_true',
help=_("Disable the flavor")
'--disable', action='store_true', help=_("Disable the flavor")
)
return parser
@ -138,7 +133,8 @@ class CreateNetworkFlavor(command.ShowOne, common.NeutronCommandWithExtraArgs):
client = self.app.client_manager.network
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_flavor(**attrs)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters={})
@ -156,7 +152,7 @@ class DeleteNetworkFlavor(command.Command):
'flavor',
metavar='<flavor>',
nargs='+',
help=_('Flavor(s) to delete (name or ID)')
help=_('Flavor(s) to delete (name or ID)'),
)
return parser
@ -170,13 +166,19 @@ class DeleteNetworkFlavor(command.Command):
client.delete_flavor(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete flavor with "
"name or ID '%(flavor)s': %(e)s"),
{"flavor": flavor, "e": e})
LOG.error(
_(
"Failed to delete flavor with "
"name or ID '%(flavor)s': %(e)s"
),
{"flavor": flavor, "e": e},
)
if result > 0:
total = len(parsed_args.flavor)
msg = (_("%(result)s of %(total)s flavors failed "
"to delete.") % {"result": result, "total": total})
msg = _("%(result)s of %(total)s flavors failed " "to delete.") % {
"result": result,
"total": total,
}
raise exceptions.CommandError(msg)
@ -186,55 +188,56 @@ class ListNetworkFlavor(command.Lister):
def take_action(self, parsed_args):
client = self.app.client_manager.network
columns = (
'id',
'name',
'is_enabled',
'service_type',
'description'
)
columns = ('id', 'name', 'is_enabled', 'service_type', 'description')
column_headers = (
'ID',
'Name',
'Enabled',
'Service Type',
'Description'
'Description',
)
data = client.flavors()
return (column_headers,
(utils.get_item_properties(
s, columns,
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
)
for s in data
),
)
class RemoveNetworkFlavorFromProfile(command.Command):
_description = _(
"Remove service profile from network flavor")
_description = _("Remove service profile from network flavor")
def get_parser(self, prog_name):
parser = super(
RemoveNetworkFlavorFromProfile, self).get_parser(prog_name)
parser = super(RemoveNetworkFlavorFromProfile, self).get_parser(
prog_name
)
parser.add_argument(
'flavor',
metavar="<flavor>",
help=_("Network flavor (name or ID)")
'flavor', metavar="<flavor>", help=_("Network flavor (name or ID)")
)
parser.add_argument(
'service_profile',
metavar="<service-profile>",
help=_("Service profile (ID only)")
help=_("Service profile (ID only)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj_flavor = client.find_flavor(
parsed_args.flavor, ignore_missing=False)
parsed_args.flavor, ignore_missing=False
)
obj_service_profile = client.find_service_profile(
parsed_args.service_profile, ignore_missing=False)
parsed_args.service_profile, ignore_missing=False
)
client.disassociate_flavor_from_service_profile(
obj_flavor, obj_service_profile)
obj_flavor, obj_service_profile
)
# TODO(dasanind): Use only the SDK resource mapped attribute names once the
@ -247,36 +250,27 @@ class SetNetworkFlavor(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'flavor',
metavar="<flavor>",
help=_("Flavor to update (name or ID)")
help=_("Flavor to update (name or ID)"),
)
parser.add_argument(
'--description',
help=_('Set network flavor description')
'--description', help=_('Set network flavor description')
)
enable_group = parser.add_mutually_exclusive_group()
enable_group.add_argument(
'--disable',
action='store_true',
help=_("Disable network flavor")
'--disable', action='store_true', help=_("Disable network flavor")
)
enable_group.add_argument(
'--enable',
action='store_true',
help=_("Enable network flavor")
'--enable', action='store_true', help=_("Enable network flavor")
)
parser.add_argument(
'--name',
metavar="<name>",
help=_('Set flavor name')
'--name', metavar="<name>", help=_('Set flavor name')
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_flavor(
parsed_args.flavor,
ignore_missing=False)
obj = client.find_flavor(parsed_args.flavor, ignore_missing=False)
attrs = {}
if parsed_args.name is not None:
attrs['name'] = parsed_args.name
@ -287,7 +281,8 @@ class SetNetworkFlavor(common.NeutronCommandWithExtraArgs):
if parsed_args.disable:
attrs['enabled'] = False
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
client.update_flavor(obj, **attrs)
@ -299,7 +294,7 @@ class ShowNetworkFlavor(command.ShowOne):
parser.add_argument(
'flavor',
metavar='<flavor>',
help=_('Flavor to display (name or ID)')
help=_('Flavor to display (name or ID)'),
)
return parser

View File

@ -31,9 +31,7 @@ def _get_columns(item):
hidden_columns = ['location', 'name', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -63,8 +61,9 @@ def _get_attrs(client_manager, parsed_args):
# TODO(ndahiwade): Use the SDK resource mapped attribute names once the
# OSC minimum requirements include SDK 1.0.
class CreateNetworkFlavorProfile(command.ShowOne,
common.NeutronCommandWithExtraArgs):
class CreateNetworkFlavorProfile(
command.ShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create new network flavor profile")
def get_parser(self, prog_name):
@ -72,34 +71,38 @@ class CreateNetworkFlavorProfile(command.ShowOne,
parser.add_argument(
'--project',
metavar="<project>",
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--description',
metavar="<description>",
help=_("Description for the flavor profile")
help=_("Description for the flavor profile"),
)
enable_group = parser.add_mutually_exclusive_group()
enable_group.add_argument(
'--enable',
action='store_true',
help=_("Enable the flavor profile")
help=_("Enable the flavor profile"),
)
enable_group.add_argument(
'--disable',
action='store_true',
help=_("Disable the flavor profile")
help=_("Disable the flavor profile"),
)
parser.add_argument(
'--driver',
help=_("Python module path to driver. This becomes "
"required if --metainfo is missing and vice versa")
help=_(
"Python module path to driver. This becomes "
"required if --metainfo is missing and vice versa"
),
)
parser.add_argument(
'--metainfo',
help=_("Metainfo for the flavor profile. This becomes "
"required if --driver is missing and vice versa")
help=_(
"Metainfo for the flavor profile. This becomes "
"required if --driver is missing and vice versa"
),
)
return parser
@ -108,7 +111,8 @@ class CreateNetworkFlavorProfile(command.ShowOne,
client = self.app.client_manager.network
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if parsed_args.driver is None and parsed_args.metainfo is None:
msg = _("Either --driver or --metainfo or both are required")
@ -131,7 +135,7 @@ class DeleteNetworkFlavorProfile(command.Command):
'flavor_profile',
metavar='<flavor-profile>',
nargs='+',
help=_("Flavor profile(s) to delete (ID only)")
help=_("Flavor profile(s) to delete (ID only)"),
)
return parser
@ -141,18 +145,24 @@ class DeleteNetworkFlavorProfile(command.Command):
for flavor_profile in parsed_args.flavor_profile:
try:
obj = client.find_service_profile(flavor_profile,
ignore_missing=False)
obj = client.find_service_profile(
flavor_profile, ignore_missing=False
)
client.delete_service_profile(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete flavor profile with "
"ID '%(flavor_profile)s': %(e)s"),
{"flavor_profile": flavor_profile, "e": e})
LOG.error(
_(
"Failed to delete flavor profile with "
"ID '%(flavor_profile)s': %(e)s"
),
{"flavor_profile": flavor_profile, "e": e},
)
if result > 0:
total = len(parsed_args.flavor_profile)
msg = (_("%(result)s of %(total)s flavor_profiles failed "
"to delete.") % {"result": result, "total": total})
msg = _(
"%(result)s of %(total)s flavor_profiles failed " "to delete."
) % {"result": result, "total": total}
raise exceptions.CommandError(msg)
@ -178,10 +188,16 @@ class ListNetworkFlavorProfile(command.Lister):
)
data = client.service_profiles()
return (column_headers,
(utils.get_item_properties(
s, columns,
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
)
for s in data
),
)
# TODO(ndahiwade): Use the SDK resource mapped attribute names once the
@ -194,45 +210,51 @@ class SetNetworkFlavorProfile(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'flavor_profile',
metavar="<flavor-profile>",
help=_("Flavor profile to update (ID only)")
help=_("Flavor profile to update (ID only)"),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--description',
metavar="<description>",
help=_("Description for the flavor profile")
help=_("Description for the flavor profile"),
)
enable_group = parser.add_mutually_exclusive_group()
enable_group.add_argument(
'--enable',
action='store_true',
help=_("Enable the flavor profile")
help=_("Enable the flavor profile"),
)
enable_group.add_argument(
'--disable',
action='store_true',
help=_("Disable the flavor profile")
help=_("Disable the flavor profile"),
)
parser.add_argument(
'--driver',
help=_("Python module path to driver. This becomes "
"required if --metainfo is missing and vice versa")
help=_(
"Python module path to driver. This becomes "
"required if --metainfo is missing and vice versa"
),
)
parser.add_argument(
'--metainfo',
help=_("Metainfo for the flavor profile. This becomes "
"required if --driver is missing and vice versa")
help=_(
"Metainfo for the flavor profile. This becomes "
"required if --driver is missing and vice versa"
),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_service_profile(parsed_args.flavor_profile,
ignore_missing=False)
obj = client.find_service_profile(
parsed_args.flavor_profile, ignore_missing=False
)
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
client.update_service_profile(obj, **attrs)
@ -245,14 +267,15 @@ class ShowNetworkFlavorProfile(command.ShowOne):
parser.add_argument(
'flavor_profile',
metavar='<flavor-profile>',
help=_("Flavor profile to display (ID only)")
help=_("Flavor profile to display (ID only)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_service_profile(parsed_args.flavor_profile,
ignore_missing=False)
obj = client.find_service_profile(
parsed_args.flavor_profile, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
return (display_columns, data)

View File

@ -32,9 +32,7 @@ def _get_columns(item):
}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -72,12 +70,12 @@ class CreateMeter(command.ShowOne, common.NeutronCommandWithExtraArgs):
parser.add_argument(
'--description',
metavar='<description>',
help=_("Create description for meter")
help=_("Create description for meter"),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
@ -86,12 +84,12 @@ class CreateMeter(command.ShowOne, common.NeutronCommandWithExtraArgs):
'--share',
action='store_true',
default=None,
help=_("Share meter between projects")
help=_("Share meter between projects"),
)
share_group.add_argument(
'--no-share',
action='store_true',
help=_("Do not share meter between projects")
help=_("Do not share meter between projects"),
)
parser.add_argument(
'name',
@ -105,7 +103,8 @@ class CreateMeter(command.ShowOne, common.NeutronCommandWithExtraArgs):
client = self.app.client_manager.network
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_metering_label(**attrs)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters={})
@ -125,7 +124,7 @@ class DeleteMeter(command.Command):
'meter',
metavar='<meter>',
nargs='+',
help=_('Meter to delete (name or ID)')
help=_('Meter to delete (name or ID)'),
)
return parser
@ -139,13 +138,16 @@ class DeleteMeter(command.Command):
client.delete_metering_label(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete meter with "
"ID '%(meter)s': %(e)s"),
{"meter": meter, "e": e})
LOG.error(
_("Failed to delete meter with " "ID '%(meter)s': %(e)s"),
{"meter": meter, "e": e},
)
if result > 0:
total = len(parsed_args.meter)
msg = (_("%(result)s of %(total)s meters failed "
"to delete.") % {"result": result, "total": total})
msg = _("%(result)s of %(total)s meters failed " "to delete.") % {
"result": result,
"total": total,
}
raise exceptions.CommandError(msg)
@ -169,10 +171,16 @@ class ListMeter(command.Lister):
)
data = client.metering_labels()
return (column_headers,
(utils.get_item_properties(
s, columns,
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
)
for s in data
),
)
class ShowMeter(command.ShowOne):
@ -181,16 +189,15 @@ class ShowMeter(command.ShowOne):
def get_parser(self, prog_name):
parser = super(ShowMeter, self).get_parser(prog_name)
parser.add_argument(
'meter',
metavar='<meter>',
help=_('Meter to display (name or ID)')
'meter', metavar='<meter>', help=_('Meter to display (name or ID)')
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_metering_label(parsed_args.meter,
ignore_missing=False)
obj = client.find_metering_label(
parsed_args.meter, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
return display_columns, data

View File

@ -30,9 +30,7 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -76,30 +74,30 @@ class CreateMeterRule(command.ShowOne, common.NeutronCommandWithExtraArgs):
parser.add_argument(
'--project',
metavar='<project>',
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
exclude_group = parser.add_mutually_exclusive_group()
exclude_group.add_argument(
'--exclude',
action='store_true',
help=_("Exclude remote IP prefix from traffic count")
help=_("Exclude remote IP prefix from traffic count"),
)
exclude_group.add_argument(
'--include',
action='store_true',
help=_("Include remote IP prefix from traffic count (default)")
help=_("Include remote IP prefix from traffic count (default)"),
)
direction_group = parser.add_mutually_exclusive_group()
direction_group.add_argument(
'--ingress',
action='store_true',
help=_("Apply rule to incoming network traffic (default)")
help=_("Apply rule to incoming network traffic (default)"),
)
direction_group.add_argument(
'--egress',
action='store_true',
help=_('Apply rule to outgoing network traffic')
help=_('Apply rule to outgoing network traffic'),
)
parser.add_argument(
'--remote-ip-prefix',
@ -129,12 +127,14 @@ class CreateMeterRule(command.ShowOne, common.NeutronCommandWithExtraArgs):
def take_action(self, parsed_args):
client = self.app.client_manager.network
_meter = client.find_metering_label(parsed_args.meter,
ignore_missing=False)
_meter = client.find_metering_label(
parsed_args.meter, ignore_missing=False
)
parsed_args.meter = _meter.id
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_metering_label_rule(**attrs)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters={})
@ -152,7 +152,7 @@ class DeleteMeterRule(command.Command):
'meter_rule_id',
metavar='<meter-rule-id>',
nargs='+',
help=_('Meter rule to delete (ID only)')
help=_('Meter rule to delete (ID only)'),
)
return parser
@ -167,14 +167,19 @@ class DeleteMeterRule(command.Command):
client.delete_metering_label_rule(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete meter rule with "
"ID '%(id)s': %(e)s"),
{"id": id, "e": e})
LOG.error(
_(
"Failed to delete meter rule with "
"ID '%(id)s': %(e)s"
),
{"id": id, "e": e},
)
if result > 0:
total = len(parsed_args.meter_rule_id)
msg = (_("%(result)s of %(total)s meter rules failed "
"to delete.") % {"result": result, "total": total})
msg = _(
"%(result)s of %(total)s meter rules failed " "to delete."
) % {"result": result, "total": total}
raise exceptions.CommandError(msg)
@ -201,10 +206,16 @@ class ListMeterRule(command.Lister):
'Destination IP Prefix',
)
data = client.metering_label_rules()
return (column_headers,
(utils.get_item_properties(
s, columns,
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
)
for s in data
),
)
class ShowMeterRule(command.ShowOne):
@ -215,14 +226,15 @@ class ShowMeterRule(command.ShowOne):
parser.add_argument(
'meter_rule_id',
metavar='<meter-rule-id>',
help=_('Meter rule (ID only)')
help=_('Meter rule (ID only)'),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_metering_label_rule(parsed_args.meter_rule_id,
ignore_missing=False)
obj = client.find_metering_label_rule(
parsed_args.meter_rule_id, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
return display_columns, data

View File

@ -43,9 +43,7 @@ def _get_columns(item):
}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -81,39 +79,40 @@ def _get_attrs(client_manager, parsed_args):
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
# OSC minimum requirements include SDK 1.0.
class CreateNetworkQosPolicy(command.ShowOne,
common.NeutronCommandWithExtraArgs):
class CreateNetworkQosPolicy(
command.ShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create a QoS policy")
def get_parser(self, prog_name):
parser = super(CreateNetworkQosPolicy, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar='<name>',
help=_("Name of QoS policy to create")
'name', metavar='<name>', help=_("Name of QoS policy to create")
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("Description of the QoS policy")
help=_("Description of the QoS policy"),
)
share_group = parser.add_mutually_exclusive_group()
share_group.add_argument(
'--share',
action='store_true',
default=None,
help=_("Make the QoS policy accessible by other projects")
help=_("Make the QoS policy accessible by other projects"),
)
share_group.add_argument(
'--no-share',
action='store_true',
help=_("Make the QoS policy not accessible by other projects "
"(default)")
help=_(
"Make the QoS policy not accessible by other projects "
"(default)"
),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
default_group = parser.add_mutually_exclusive_group()
@ -133,7 +132,8 @@ class CreateNetworkQosPolicy(command.ShowOne,
client = self.app.client_manager.network
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_qos_policy(**attrs)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters={})
@ -149,7 +149,7 @@ class DeleteNetworkQosPolicy(command.Command):
'policy',
metavar="<qos-policy>",
nargs="+",
help=_("QoS policy(s) to delete (name or ID)")
help=_("QoS policy(s) to delete (name or ID)"),
)
return parser
@ -163,14 +163,19 @@ class DeleteNetworkQosPolicy(command.Command):
client.delete_qos_policy(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete QoS policy "
"name or ID '%(qos_policy)s': %(e)s"),
{'qos_policy': policy, 'e': e})
LOG.error(
_(
"Failed to delete QoS policy "
"name or ID '%(qos_policy)s': %(e)s"
),
{'qos_policy': policy, 'e': e},
)
if result > 0:
total = len(parsed_args.policy)
msg = (_("%(result)s of %(total)s QoS policies failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s QoS policies failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -184,19 +189,21 @@ class ListNetworkQosPolicy(command.Lister):
parser.add_argument(
'--project',
metavar='<project>',
help=_("List qos policies according to their project (name or ID)")
help=_(
"List qos policies according to their project (name or ID)"
),
)
identity_common.add_project_domain_option_to_parser(parser)
shared_group = parser.add_mutually_exclusive_group()
shared_group.add_argument(
'--share',
action='store_true',
help=_("List qos policies shared between projects")
help=_("List qos policies shared between projects"),
)
shared_group.add_argument(
'--no-share',
action='store_true',
help=_("List qos policies not shared between projects")
help=_("List qos policies not shared between projects"),
)
return parser
@ -218,10 +225,17 @@ class ListNetworkQosPolicy(command.Lister):
)
attrs = _get_attrs(self.app.client_manager, parsed_args)
data = client.qos_policies(**attrs)
return (column_headers,
(utils.get_item_properties(
s, columns, formatters={},
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
)
for s in data
),
)
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
@ -234,17 +248,15 @@ class SetNetworkQosPolicy(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'policy',
metavar="<qos-policy>",
help=_("QoS policy to modify (name or ID)")
help=_("QoS policy to modify (name or ID)"),
)
parser.add_argument(
'--name',
metavar="<name>",
help=_('Set QoS policy name')
'--name', metavar="<name>", help=_('Set QoS policy name')
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("Description of the QoS policy")
help=_("Description of the QoS policy"),
)
enable_group = parser.add_mutually_exclusive_group()
enable_group.add_argument(
@ -272,12 +284,11 @@ class SetNetworkQosPolicy(common.NeutronCommandWithExtraArgs):
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_qos_policy(
parsed_args.policy,
ignore_missing=False)
obj = client.find_qos_policy(parsed_args.policy, ignore_missing=False)
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
client.update_qos_policy(obj, **attrs)
@ -289,14 +300,13 @@ class ShowNetworkQosPolicy(command.ShowOne):
parser.add_argument(
'policy',
metavar="<qos-policy>",
help=_("QoS policy to display (name or ID)")
help=_("QoS policy to display (name or ID)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_qos_policy(parsed_args.policy,
ignore_missing=False)
obj = client.find_qos_policy(parsed_args.policy, ignore_missing=False)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters=_formatters)
return (display_columns, data)

View File

@ -30,17 +30,40 @@ MANDATORY_PARAMETERS = {
RULE_TYPE_MINIMUM_BANDWIDTH: {'min_kbps', 'direction'},
RULE_TYPE_MINIMUM_PACKET_RATE: {'min_kpps', 'direction'},
RULE_TYPE_DSCP_MARKING: {'dscp_mark'},
RULE_TYPE_BANDWIDTH_LIMIT: {'max_kbps'}}
RULE_TYPE_BANDWIDTH_LIMIT: {'max_kbps'},
}
OPTIONAL_PARAMETERS = {
RULE_TYPE_MINIMUM_BANDWIDTH: set(),
RULE_TYPE_MINIMUM_PACKET_RATE: set(),
RULE_TYPE_DSCP_MARKING: set(),
RULE_TYPE_BANDWIDTH_LIMIT: {'direction', 'max_burst_kbps'}}
RULE_TYPE_BANDWIDTH_LIMIT: {'direction', 'max_burst_kbps'},
}
DIRECTION_EGRESS = 'egress'
DIRECTION_INGRESS = 'ingress'
DIRECTION_ANY = 'any'
DSCP_VALID_MARKS = [0, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32,
34, 36, 38, 40, 46, 48, 56]
DSCP_VALID_MARKS = [
0,
8,
10,
12,
14,
16,
18,
20,
22,
24,
26,
28,
30,
32,
34,
36,
38,
40,
46,
48,
56,
]
ACTION_CREATE = 'create'
ACTION_DELETE = 'delete'
@ -53,9 +76,7 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -63,31 +84,38 @@ def _check_type_parameters(attrs, type, is_create):
req_params = MANDATORY_PARAMETERS[type]
opt_params = OPTIONAL_PARAMETERS[type]
type_params = req_params | opt_params
notreq_params = set(itertools.chain(
*[v for k, v in MANDATORY_PARAMETERS.items() if k != type]))
notreq_params = set(
itertools.chain(
*[v for k, v in MANDATORY_PARAMETERS.items() if k != type]
)
)
notreq_params -= type_params
if is_create and None in map(attrs.get, req_params):
msg = (_('"Create" rule command for type "%(rule_type)s" requires '
'arguments: %(args)s') %
{'rule_type': type, 'args': ", ".join(sorted(req_params))})
msg = _(
'"Create" rule command for type "%(rule_type)s" requires '
'arguments: %(args)s'
) % {'rule_type': type, 'args': ", ".join(sorted(req_params))}
raise exceptions.CommandError(msg)
if set(attrs.keys()) & notreq_params:
msg = (_('Rule type "%(rule_type)s" only requires arguments: %(args)s')
% {'rule_type': type, 'args': ", ".join(sorted(type_params))})
msg = _(
'Rule type "%(rule_type)s" only requires arguments: %(args)s'
) % {'rule_type': type, 'args': ", ".join(sorted(type_params))}
raise exceptions.CommandError(msg)
def _get_attrs(network_client, parsed_args, is_create=False):
attrs = {}
qos = network_client.find_qos_policy(parsed_args.qos_policy,
ignore_missing=False)
qos = network_client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False
)
attrs['qos_policy_id'] = qos.id
if not is_create:
attrs['id'] = parsed_args.id
rule_type = _find_rule_type(qos, parsed_args.id)
if not rule_type:
msg = (_('Rule ID %(rule_id)s not found') %
{'rule_id': parsed_args.id})
msg = _('Rule ID %(rule_id)s not found') % {
'rule_id': parsed_args.id
}
raise exceptions.CommandError(msg)
else:
rule_type = parsed_args.type
@ -112,9 +140,10 @@ def _get_attrs(network_client, parsed_args, is_create=False):
if rule_type == RULE_TYPE_MINIMUM_PACKET_RATE:
attrs['direction'] = DIRECTION_ANY
else:
msg = (_('Direction "any" can only be used with '
'%(rule_type_min_pps)s rule type') %
{'rule_type_min_pps': RULE_TYPE_MINIMUM_PACKET_RATE})
msg = _(
'Direction "any" can only be used with '
'%(rule_type_min_pps)s rule type'
) % {'rule_type_min_pps': RULE_TYPE_MINIMUM_PACKET_RATE}
raise exceptions.CommandError(msg)
_check_type_parameters(attrs, rule_type, is_create)
return attrs
@ -130,8 +159,10 @@ def _get_item_properties(item, fields):
def _rule_action_call(client, action, rule_type):
rule_type = rule_type.replace('-', '_')
func_name = '%(action)s_qos_%(rule_type)s_rule' % {'action': action,
'rule_type': rule_type}
func_name = '%(action)s_qos_%(rule_type)s_rule' % {
'action': action,
'rule_type': rule_type,
}
return getattr(client, func_name)
@ -147,81 +178,91 @@ def _add_rule_arguments(parser):
dest='max_kbps',
metavar='<max-kbps>',
type=int,
help=_('Maximum bandwidth in kbps')
help=_('Maximum bandwidth in kbps'),
)
parser.add_argument(
'--max-burst-kbits',
dest='max_burst_kbits',
metavar='<max-burst-kbits>',
type=int,
help=_('Maximum burst in kilobits, 0 or not specified means '
'automatic, which is 80%% of the bandwidth limit, which works '
'for typical TCP traffic. For details check the QoS user '
'workflow.')
help=_(
'Maximum burst in kilobits, 0 or not specified means '
'automatic, which is 80%% of the bandwidth limit, which works '
'for typical TCP traffic. For details check the QoS user '
'workflow.'
),
)
parser.add_argument(
'--dscp-mark',
dest='dscp_mark',
metavar='<dscp-mark>',
type=int,
help=_('DSCP mark: value can be 0, even numbers from 8-56, '
'excluding 42, 44, 50, 52, and 54')
help=_(
'DSCP mark: value can be 0, even numbers from 8-56, '
'excluding 42, 44, 50, 52, and 54'
),
)
parser.add_argument(
'--min-kbps',
dest='min_kbps',
metavar='<min-kbps>',
type=int,
help=_('Minimum guaranteed bandwidth in kbps')
help=_('Minimum guaranteed bandwidth in kbps'),
)
parser.add_argument(
'--min-kpps',
dest='min_kpps',
metavar='<min-kpps>',
type=int,
help=_('Minimum guaranteed packet rate in kpps')
help=_('Minimum guaranteed packet rate in kpps'),
)
direction_group = parser.add_mutually_exclusive_group()
direction_group.add_argument(
'--ingress',
action='store_true',
help=_("Ingress traffic direction from the project point of view")
help=_("Ingress traffic direction from the project point of view"),
)
direction_group.add_argument(
'--egress',
action='store_true',
help=_("Egress traffic direction from the project point of view")
help=_("Egress traffic direction from the project point of view"),
)
direction_group.add_argument(
'--any',
action='store_true',
help=_("Any traffic direction from the project point of view. Can be "
"used only with minimum packet rate rule.")
help=_(
"Any traffic direction from the project point of view. Can be "
"used only with minimum packet rate rule."
),
)
class CreateNetworkQosRule(command.ShowOne,
common.NeutronCommandWithExtraArgs):
class CreateNetworkQosRule(
command.ShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create new Network QoS rule")
def get_parser(self, prog_name):
parser = super(CreateNetworkQosRule, self).get_parser(
prog_name)
parser = super(CreateNetworkQosRule, self).get_parser(prog_name)
parser.add_argument(
'qos_policy',
metavar='<qos-policy>',
help=_('QoS policy that contains the rule (name or ID)')
help=_('QoS policy that contains the rule (name or ID)'),
)
parser.add_argument(
'--type',
metavar='<type>',
required=True,
choices=[RULE_TYPE_MINIMUM_BANDWIDTH,
RULE_TYPE_MINIMUM_PACKET_RATE,
RULE_TYPE_DSCP_MARKING,
RULE_TYPE_BANDWIDTH_LIMIT],
help=(_('QoS rule type (%s)') %
", ".join(MANDATORY_PARAMETERS.keys()))
choices=[
RULE_TYPE_MINIMUM_BANDWIDTH,
RULE_TYPE_MINIMUM_PACKET_RATE,
RULE_TYPE_DSCP_MARKING,
RULE_TYPE_BANDWIDTH_LIMIT,
],
help=(
_('QoS rule type (%s)')
% ", ".join(MANDATORY_PARAMETERS.keys())
),
)
_add_rule_arguments(parser)
return parser
@ -231,12 +272,13 @@ class CreateNetworkQosRule(command.ShowOne,
try:
attrs = _get_attrs(network_client, parsed_args, is_create=True)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = _rule_action_call(
network_client, ACTION_CREATE, parsed_args.type)(
attrs.pop('qos_policy_id'), **attrs)
network_client, ACTION_CREATE, parsed_args.type
)(attrs.pop('qos_policy_id'), **attrs)
except Exception as e:
msg = (_('Failed to create Network QoS rule: %(e)s') % {'e': e})
msg = _('Failed to create Network QoS rule: %(e)s') % {'e': e}
raise exceptions.CommandError(msg)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
@ -251,12 +293,12 @@ class DeleteNetworkQosRule(command.Command):
parser.add_argument(
'qos_policy',
metavar='<qos-policy>',
help=_('QoS policy that contains the rule (name or ID)')
help=_('QoS policy that contains the rule (name or ID)'),
)
parser.add_argument(
'id',
metavar='<rule-id>',
help=_('Network QoS rule to delete (ID)')
help=_('Network QoS rule to delete (ID)'),
)
return parser
@ -264,16 +306,19 @@ class DeleteNetworkQosRule(command.Command):
network_client = self.app.client_manager.network
rule_id = parsed_args.id
try:
qos = network_client.find_qos_policy(parsed_args.qos_policy,
ignore_missing=False)
qos = network_client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False
)
rule_type = _find_rule_type(qos, rule_id)
if not rule_type:
raise Exception('Rule %s not found' % rule_id)
_rule_action_call(network_client, ACTION_DELETE, rule_type)(
rule_id, qos.id)
rule_id, qos.id
)
except Exception as e:
msg = (_('Failed to delete Network QoS rule ID "%(rule)s": %(e)s')
% {'rule': rule_id, 'e': e})
msg = _(
'Failed to delete Network QoS rule ID "%(rule)s": %(e)s'
) % {'rule': rule_id, 'e': e}
raise exceptions.CommandError(msg)
@ -285,7 +330,7 @@ class ListNetworkQosRule(command.Lister):
parser.add_argument(
'qos_policy',
metavar='<qos-policy>',
help=_('QoS policy that contains the rule (name or ID)')
help=_('QoS policy that contains the rule (name or ID)'),
)
return parser
@ -313,11 +358,14 @@ class ListNetworkQosRule(command.Lister):
'DSCP mark',
'Direction',
)
qos = client.find_qos_policy(parsed_args.qos_policy,
ignore_missing=False)
qos = client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False
)
data = qos.rules
return (column_headers,
(_get_item_properties(s, columns) for s in data))
return (
column_headers,
(_get_item_properties(s, columns) for s in data),
)
class SetNetworkQosRule(common.NeutronCommandWithExtraArgs):
@ -328,12 +376,12 @@ class SetNetworkQosRule(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'qos_policy',
metavar='<qos-policy>',
help=_('QoS policy that contains the rule (name or ID)')
help=_('QoS policy that contains the rule (name or ID)'),
)
parser.add_argument(
'id',
metavar='<rule-id>',
help=_('Network QoS rule to delete (ID)')
help=_('Network QoS rule to delete (ID)'),
)
_add_rule_arguments(parser)
return parser
@ -341,22 +389,28 @@ class SetNetworkQosRule(common.NeutronCommandWithExtraArgs):
def take_action(self, parsed_args):
network_client = self.app.client_manager.network
try:
qos = network_client.find_qos_policy(parsed_args.qos_policy,
ignore_missing=False)
qos = network_client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False
)
rule_type = _find_rule_type(qos, parsed_args.id)
if not rule_type:
raise Exception('Rule not found')
attrs = _get_attrs(network_client, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
qos_id = attrs.pop('qos_policy_id')
qos_rule = _rule_action_call(network_client, ACTION_FIND,
rule_type)(attrs.pop('id'), qos_id)
qos_rule = _rule_action_call(
network_client, ACTION_FIND, rule_type
)(attrs.pop('id'), qos_id)
_rule_action_call(network_client, ACTION_SET, rule_type)(
qos_rule, qos_id, **attrs)
qos_rule, qos_id, **attrs
)
except Exception as e:
msg = (_('Failed to set Network QoS rule ID "%(rule)s": %(e)s') %
{'rule': parsed_args.id, 'e': e})
msg = _('Failed to set Network QoS rule ID "%(rule)s": %(e)s') % {
'rule': parsed_args.id,
'e': e,
}
raise exceptions.CommandError(msg)
@ -368,12 +422,12 @@ class ShowNetworkQosRule(command.ShowOne):
parser.add_argument(
'qos_policy',
metavar='<qos-policy>',
help=_('QoS policy that contains the rule (name or ID)')
help=_('QoS policy that contains the rule (name or ID)'),
)
parser.add_argument(
'id',
metavar='<rule-id>',
help=_('Network QoS rule to delete (ID)')
help=_('Network QoS rule to delete (ID)'),
)
return parser
@ -381,16 +435,20 @@ class ShowNetworkQosRule(command.ShowOne):
network_client = self.app.client_manager.network
rule_id = parsed_args.id
try:
qos = network_client.find_qos_policy(parsed_args.qos_policy,
ignore_missing=False)
qos = network_client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False
)
rule_type = _find_rule_type(qos, rule_id)
if not rule_type:
raise Exception('Rule not found')
obj = _rule_action_call(network_client, ACTION_SHOW, rule_type)(
rule_id, qos.id)
rule_id, qos.id
)
except Exception as e:
msg = (_('Failed to set Network QoS rule ID "%(rule)s": %(e)s') %
{'rule': rule_id, 'e': e})
msg = _('Failed to set Network QoS rule ID "%(rule)s": %(e)s') % {
'rule': rule_id,
'e': e,
}
raise exceptions.CommandError(msg)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)

View File

@ -26,7 +26,8 @@ def _get_columns(item):
}
hidden_columns = ["id", "location", "name", 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, hidden_columns)
item, column_map, hidden_columns
)
class ListNetworkQosRuleType(command.Lister):
@ -38,25 +39,25 @@ class ListNetworkQosRuleType(command.Lister):
supported.add_argument(
'--all-supported',
action='store_true',
help=_("List all the QoS rule types supported by any loaded "
"mechanism drivers (the union of all sets of supported "
"rules)")
help=_(
"List all the QoS rule types supported by any loaded "
"mechanism drivers (the union of all sets of supported "
"rules)"
),
)
supported.add_argument(
'--all-rules',
action='store_true',
help=_("List all QoS rule types implemented in Neutron QoS driver")
help=_(
"List all QoS rule types implemented in Neutron QoS driver"
),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
columns = (
'type',
)
column_headers = (
'Type',
)
columns = ('type',)
column_headers = ('Type',)
args = {}
if parsed_args.all_supported:
@ -65,10 +66,17 @@ class ListNetworkQosRuleType(command.Lister):
args['all_rules'] = True
data = client.qos_rule_types(**args)
return (column_headers,
(utils.get_item_properties(
s, columns, formatters={},
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
)
for s in data
),
)
class ShowNetworkQosRuleType(command.ShowOne):
@ -79,7 +87,7 @@ class ShowNetworkQosRuleType(command.ShowOne):
parser.add_argument(
'rule_type',
metavar="<qos-rule-type-name>",
help=_("Name of QoS rule type")
help=_("Name of QoS rule type"),
)
return parser

View File

@ -32,9 +32,7 @@ def _get_columns(item):
}
hidden_columns = ['location', 'name', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -46,27 +44,28 @@ def _get_attrs(client_manager, parsed_args):
network_client = client_manager.network
if parsed_args.type == 'network':
object_id = network_client.find_network(
parsed_args.rbac_object, ignore_missing=False).id
parsed_args.rbac_object, ignore_missing=False
).id
if parsed_args.type == 'qos_policy':
object_id = network_client.find_qos_policy(
parsed_args.rbac_object,
ignore_missing=False).id
parsed_args.rbac_object, ignore_missing=False
).id
if parsed_args.type == 'security_group':
object_id = network_client.find_security_group(
parsed_args.rbac_object,
ignore_missing=False).id
parsed_args.rbac_object, ignore_missing=False
).id
if parsed_args.type == 'address_scope':
object_id = network_client.find_address_scope(
parsed_args.rbac_object,
ignore_missing=False).id
parsed_args.rbac_object, ignore_missing=False
).id
if parsed_args.type == 'subnetpool':
object_id = network_client.find_subnet_pool(
parsed_args.rbac_object,
ignore_missing=False).id
parsed_args.rbac_object, ignore_missing=False
).id
if parsed_args.type == 'address_group':
object_id = network_client.find_address_group(
parsed_args.rbac_object,
ignore_missing=False).id
parsed_args.rbac_object, ignore_missing=False
).id
attrs['object_id'] = object_id
@ -101,51 +100,68 @@ class CreateNetworkRBAC(command.ShowOne, common.NeutronCommandWithExtraArgs):
parser.add_argument(
'rbac_object',
metavar="<rbac-object>",
help=_("The object to which this RBAC policy affects (name or ID)")
help=_(
"The object to which this RBAC policy affects (name or ID)"
),
)
parser.add_argument(
'--type',
metavar="<type>",
required=True,
choices=['address_group', 'address_scope', 'security_group',
'subnetpool', 'qos_policy', 'network'],
help=_('Type of the object that RBAC policy '
'affects ("address_group", "address_scope", '
'"security_group", "subnetpool", "qos_policy" or '
'"network")')
choices=[
'address_group',
'address_scope',
'security_group',
'subnetpool',
'qos_policy',
'network',
],
help=_(
'Type of the object that RBAC policy '
'affects ("address_group", "address_scope", '
'"security_group", "subnetpool", "qos_policy" or '
'"network")'
),
)
parser.add_argument(
'--action',
metavar="<action>",
required=True,
choices=['access_as_external', 'access_as_shared'],
help=_('Action for the RBAC policy '
'("access_as_external" or "access_as_shared")')
help=_(
'Action for the RBAC policy '
'("access_as_external" or "access_as_shared")'
),
)
target_project_group = parser.add_mutually_exclusive_group(
required=True)
required=True
)
target_project_group.add_argument(
'--target-project',
metavar="<target-project>",
help=_('The project to which the RBAC policy '
'will be enforced (name or ID)')
help=_(
'The project to which the RBAC policy '
'will be enforced (name or ID)'
),
)
target_project_group.add_argument(
'--target-all-projects',
action='store_true',
help=_('Allow creating RBAC policy for all projects.')
help=_('Allow creating RBAC policy for all projects.'),
)
parser.add_argument(
'--target-project-domain',
metavar='<target-project-domain>',
help=_('Domain the target project belongs to (name or ID). '
'This can be used in case collisions between project names '
'exist.'),
help=_(
'Domain the target project belongs to (name or ID). '
'This can be used in case collisions between project names '
'exist.'
),
)
parser.add_argument(
'--project',
metavar="<project>",
help=_('The owner project (name or ID)')
help=_('The owner project (name or ID)'),
)
identity_common.add_project_domain_option_to_parser(parser)
return parser
@ -154,7 +170,8 @@ class CreateNetworkRBAC(command.ShowOne, common.NeutronCommandWithExtraArgs):
client = self.app.client_manager.network
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_rbac_policy(**attrs)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
@ -170,7 +187,7 @@ class DeleteNetworkRBAC(command.Command):
'rbac_policy',
metavar="<rbac-policy>",
nargs='+',
help=_("RBAC policy(s) to delete (ID only)")
help=_("RBAC policy(s) to delete (ID only)"),
)
return parser
@ -184,14 +201,19 @@ class DeleteNetworkRBAC(command.Command):
client.delete_rbac_policy(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete RBAC policy with "
"ID '%(rbac)s': %(e)s"),
{'rbac': rbac, 'e': e})
LOG.error(
_(
"Failed to delete RBAC policy with "
"ID '%(rbac)s': %(e)s"
),
{'rbac': rbac, 'e': e},
)
if result > 0:
total = len(parsed_args.rbac_policy)
msg = (_("%(result)s of %(total)s RBAC policies failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s RBAC policies failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -203,30 +225,40 @@ class ListNetworkRBAC(command.Lister):
parser.add_argument(
'--type',
metavar='<type>',
choices=['address_group', 'address_scope', 'security_group',
'subnetpool', 'qos_policy', 'network'],
help=_('List network RBAC policies according to '
'given object type ("address_group", "address_scope", '
'"security_group", "subnetpool", "qos_policy" or '
'"network")')
choices=[
'address_group',
'address_scope',
'security_group',
'subnetpool',
'qos_policy',
'network',
],
help=_(
'List network RBAC policies according to '
'given object type ("address_group", "address_scope", '
'"security_group", "subnetpool", "qos_policy" or '
'"network")'
),
)
parser.add_argument(
'--action',
metavar='<action>',
choices=['access_as_external', 'access_as_shared'],
help=_('List network RBAC policies according to given '
'action ("access_as_external" or "access_as_shared")')
help=_(
'List network RBAC policies according to given '
'action ("access_as_external" or "access_as_shared")'
),
)
parser.add_argument(
'--target-project',
metavar='<target-project>',
help=_('List network RBAC policies for a specific target project')
help=_('List network RBAC policies for a specific target project'),
)
parser.add_argument(
'--long',
action='store_true',
default=False,
help=_("List additional fields in output")
help=_("List additional fields in output"),
)
return parser
@ -265,10 +297,16 @@ class ListNetworkRBAC(command.Lister):
data = client.rbac_policies(**query)
return (column_headers,
(utils.get_item_properties(
s, columns,
) for s in data))
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
)
for s in data
),
)
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
@ -281,27 +319,32 @@ class SetNetworkRBAC(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'rbac_policy',
metavar="<rbac-policy>",
help=_("RBAC policy to be modified (ID only)")
help=_("RBAC policy to be modified (ID only)"),
)
parser.add_argument(
'--target-project',
metavar="<target-project>",
help=_('The project to which the RBAC policy '
'will be enforced (name or ID)')
help=_(
'The project to which the RBAC policy '
'will be enforced (name or ID)'
),
)
parser.add_argument(
'--target-project-domain',
metavar='<target-project-domain>',
help=_('Domain the target project belongs to (name or ID). '
'This can be used in case collisions between project names '
'exist.'),
help=_(
'Domain the target project belongs to (name or ID). '
'This can be used in case collisions between project names '
'exist.'
),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_rbac_policy(parsed_args.rbac_policy,
ignore_missing=False)
obj = client.find_rbac_policy(
parsed_args.rbac_policy, ignore_missing=False
)
attrs = {}
if parsed_args.target_project:
identity_client = self.app.client_manager.identity
@ -312,7 +355,8 @@ class SetNetworkRBAC(common.NeutronCommandWithExtraArgs):
).id
attrs['target_tenant'] = project_id
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
client.update_rbac_policy(obj, **attrs)
@ -324,14 +368,15 @@ class ShowNetworkRBAC(command.ShowOne):
parser.add_argument(
'rbac_policy',
metavar="<rbac-policy>",
help=_("RBAC policy (ID only)")
help=_("RBAC policy (ID only)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_rbac_policy(parsed_args.rbac_policy,
ignore_missing=False)
obj = client.find_rbac_policy(
parsed_args.rbac_policy, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
return display_columns, data

View File

@ -29,22 +29,19 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
class CreateNetworkSegment(command.ShowOne,
common.NeutronCommandWithExtraArgs):
class CreateNetworkSegment(
command.ShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create new network segment")
def get_parser(self, prog_name):
parser = super(CreateNetworkSegment, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar='<name>',
help=_('New network segment name')
'name', metavar='<name>', help=_('New network segment name')
)
parser.add_argument(
'--description',
@ -60,10 +57,12 @@ class CreateNetworkSegment(command.ShowOne,
'--segment',
metavar='<segment>',
type=int,
help=_('Segment identifier for this network segment which is '
'based on the network type, VLAN ID for vlan network '
'type and tunnel ID for geneve, gre and vxlan network '
'types'),
help=_(
'Segment identifier for this network segment which is '
'based on the network type, VLAN ID for vlan network '
'type and tunnel ID for geneve, gre and vxlan network '
'types'
),
)
parser.add_argument(
'--network',
@ -76,8 +75,10 @@ class CreateNetworkSegment(command.ShowOne,
metavar='<network-type>',
choices=['flat', 'geneve', 'gre', 'local', 'vlan', 'vxlan'],
required=True,
help=_('Network type of this network segment '
'(flat, geneve, gre, local, vlan or vxlan)'),
help=_(
'Network type of this network segment '
'(flat, geneve, gre, local, vlan or vxlan)'
),
)
return parser
@ -85,8 +86,9 @@ class CreateNetworkSegment(command.ShowOne,
client = self.app.client_manager.network
attrs = {}
attrs['name'] = parsed_args.name
attrs['network_id'] = client.find_network(parsed_args.network,
ignore_missing=False).id
attrs['network_id'] = client.find_network(
parsed_args.network, ignore_missing=False
).id
attrs['network_type'] = parsed_args.network_type
if parsed_args.description is not None:
attrs['description'] = parsed_args.description
@ -95,7 +97,8 @@ class CreateNetworkSegment(command.ShowOne,
if parsed_args.segment is not None:
attrs['segmentation_id'] = parsed_args.segment
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_segment(**attrs)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)
@ -121,19 +124,25 @@ class DeleteNetworkSegment(command.Command):
result = 0
for network_segment in parsed_args.network_segment:
try:
obj = client.find_segment(network_segment,
ignore_missing=False)
obj = client.find_segment(
network_segment, ignore_missing=False
)
client.delete_segment(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete network segment with "
"ID '%(network_segment)s': %(e)s"),
{'network_segment': network_segment, 'e': e})
LOG.error(
_(
"Failed to delete network segment with "
"ID '%(network_segment)s': %(e)s"
),
{'network_segment': network_segment, 'e': e},
)
if result > 0:
total = len(parsed_args.network_segment)
msg = (_("%(result)s of %(total)s network segments failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s network segments failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -151,8 +160,10 @@ class ListNetworkSegment(command.Lister):
parser.add_argument(
'--network',
metavar='<network>',
help=_('List network segments that belong to this '
'network (name or ID)'),
help=_(
'List network segments that belong to this '
'network (name or ID)'
),
)
return parser
@ -162,8 +173,7 @@ class ListNetworkSegment(command.Lister):
filters = {}
if parsed_args.network:
_network = network_client.find_network(
parsed_args.network,
ignore_missing=False
parsed_args.network, ignore_missing=False
)
filters = {'network_id': _network.id}
data = network_client.segments(**filters)
@ -183,18 +193,20 @@ class ListNetworkSegment(command.Lister):
'segmentation_id',
)
if parsed_args.long:
headers = headers + (
'Physical Network',
)
columns = columns + (
'physical_network',
)
headers = headers + ('Physical Network',)
columns = columns + ('physical_network',)
return (headers,
(utils.get_item_properties(
s, columns,
return (
headers,
(
utils.get_item_properties(
s,
columns,
formatters={},
) for s in data))
)
for s in data
),
)
class SetNetworkSegment(common.NeutronCommandWithExtraArgs):
@ -221,15 +233,17 @@ class SetNetworkSegment(common.NeutronCommandWithExtraArgs):
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_segment(parsed_args.network_segment,
ignore_missing=False)
obj = client.find_segment(
parsed_args.network_segment, ignore_missing=False
)
attrs = {}
if parsed_args.description is not None:
attrs['description'] = parsed_args.description
if parsed_args.name is not None:
attrs['name'] = parsed_args.name
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
client.update_segment(obj, **attrs)
@ -248,8 +262,7 @@ class ShowNetworkSegment(command.ShowOne):
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_segment(
parsed_args.network_segment,
ignore_missing=False
parsed_args.network_segment, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)

View File

@ -35,9 +35,7 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -45,8 +43,9 @@ def _get_ranges(item):
item = sorted([int(i) for i in item])
for a, b in itertools.groupby(enumerate(item), lambda xy: xy[1] - xy[0]):
b = list(b)
yield "%s-%s" % (b[0][1], b[-1][1]) if b[0][1] != b[-1][1] else \
str(b[0][1])
yield "%s-%s" % (b[0][1], b[-1][1]) if b[0][1] != b[-1][1] else str(
b[0][1]
)
def _hack_tuple_value_update_by_index(tup, index, value):
@ -73,7 +72,8 @@ def _exchange_dict_keys_with_values(orig_dict):
def _update_available_from_props(columns, props):
index_available = columns.index('available')
props = _hack_tuple_value_update_by_index(
props, index_available, list(_get_ranges(props[index_available])))
props, index_available, list(_get_ranges(props[index_available]))
)
return props
@ -82,8 +82,7 @@ def _update_used_from_props(columns, props):
updated_used = _exchange_dict_keys_with_values(props[index_used])
for k, v in updated_used.items():
updated_used[k] = list(_get_ranges(v))
props = _hack_tuple_value_update_by_index(
props, index_used, updated_used)
props = _hack_tuple_value_update_by_index(props, index_used, updated_used)
return props
@ -93,8 +92,9 @@ def _update_additional_fields_from_props(columns, props):
return props
class CreateNetworkSegmentRange(command.ShowOne,
common.NeutronCommandWithExtraArgs):
class CreateNetworkSegmentRange(
command.ShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create new network segment range")
def get_parser(self, prog_name):
@ -104,8 +104,10 @@ class CreateNetworkSegmentRange(command.ShowOne,
"--private",
dest="private",
action="store_true",
help=_('Network segment range is assigned specifically to the '
'project'),
help=_(
'Network segment range is assigned specifically to the '
'project'
),
)
shared_group.add_argument(
"--shared",
@ -116,13 +118,15 @@ class CreateNetworkSegmentRange(command.ShowOne,
parser.add_argument(
'name',
metavar='<name>',
help=_('Name of new network segment range')
help=_('Name of new network segment range'),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_('Network segment range owner (name or ID). Optional when '
'the segment range is shared'),
help=_(
'Network segment range owner (name or ID). Optional when '
'the segment range is shared'
),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
@ -130,8 +134,10 @@ class CreateNetworkSegmentRange(command.ShowOne,
metavar='<network-type>',
choices=['geneve', 'gre', 'vlan', 'vxlan'],
required=True,
help=_('Network type of this network segment range '
'(geneve, gre, vlan or vxlan)'),
help=_(
'Network type of this network segment range '
'(geneve, gre, vlan or vxlan)'
),
)
parser.add_argument(
'--physical-network',
@ -143,20 +149,24 @@ class CreateNetworkSegmentRange(command.ShowOne,
metavar='<minimum-segmentation-id>',
type=int,
required=True,
help=_('Minimum segment identifier for this network segment '
'range which is based on the network type, VLAN ID for '
'vlan network type and tunnel ID for geneve, gre and vxlan '
'network types'),
help=_(
'Minimum segment identifier for this network segment '
'range which is based on the network type, VLAN ID for '
'vlan network type and tunnel ID for geneve, gre and vxlan '
'network types'
),
)
parser.add_argument(
'--maximum',
metavar='<maximum-segmentation-id>',
type=int,
required=True,
help=_('Maximum segment identifier for this network segment '
'range which is based on the network type, VLAN ID for '
'vlan network type and tunnel ID for geneve, gre and vxlan '
'network types'),
help=_(
'Maximum segment identifier for this network segment '
'range which is based on the network type, VLAN ID for '
'vlan network type and tunnel ID for geneve, gre and vxlan '
'network types'
),
)
return parser
@ -165,11 +175,14 @@ class CreateNetworkSegmentRange(command.ShowOne,
network_client = self.app.client_manager.network
try:
# Verify that the extension exists.
network_client.find_extension('network-segment-range',
ignore_missing=False)
network_client.find_extension(
'network-segment-range', ignore_missing=False
)
except Exception as e:
msg = (_('Network segment range create not supported by '
'Network API: %(e)s') % {'e': e})
msg = _(
'Network segment range create not supported by '
'Network API: %(e)s'
) % {'e': e}
raise exceptions.CommandError(msg)
identity_client = self.app.client_manager.identity
@ -178,10 +191,14 @@ class CreateNetworkSegmentRange(command.ShowOne,
msg = _("--project is only allowed with --private")
raise exceptions.CommandError(msg)
if (parsed_args.network_type.lower() != 'vlan' and
parsed_args.physical_network):
msg = _("--physical-network is only allowed with --network-type "
"vlan")
if (
parsed_args.network_type.lower() != 'vlan'
and parsed_args.physical_network
):
msg = _(
"--physical-network is only allowed with --network-type "
"vlan"
)
raise exceptions.CommandError(msg)
attrs = {}
@ -205,8 +222,13 @@ class CreateNetworkSegmentRange(command.ShowOne,
if project_id:
attrs['project_id'] = project_id
else:
msg = (_("Failed to create the network segment range for "
"project %(project_id)s") % parsed_args.project_id)
msg = (
_(
"Failed to create the network segment range for "
"project %(project_id)s"
)
% parsed_args.project_id
)
raise exceptions.CommandError(msg)
elif not attrs['shared']:
# default to the current project if no project specified and shared
@ -218,7 +240,8 @@ class CreateNetworkSegmentRange(command.ShowOne,
attrs['physical_network'] = parsed_args.physical_network
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = network_client.create_network_segment_range(**attrs)
display_columns, columns = _get_columns(obj)
@ -244,30 +267,39 @@ class DeleteNetworkSegmentRange(command.Command):
network_client = self.app.client_manager.network
try:
# Verify that the extension exists.
network_client.find_extension('network-segment-range',
ignore_missing=False)
network_client.find_extension(
'network-segment-range', ignore_missing=False
)
except Exception as e:
msg = (_('Network segment range delete not supported by '
'Network API: %(e)s') % {'e': e})
msg = _(
'Network segment range delete not supported by '
'Network API: %(e)s'
) % {'e': e}
raise exceptions.CommandError(msg)
result = 0
for network_segment_range in parsed_args.network_segment_range:
try:
obj = network_client.find_network_segment_range(
network_segment_range, ignore_missing=False)
network_segment_range, ignore_missing=False
)
network_client.delete_network_segment_range(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete network segment range with "
"ID '%(network_segment_range)s': %(e)s"),
{'network_segment_range': network_segment_range,
'e': e})
LOG.error(
_(
"Failed to delete network segment range with "
"ID '%(network_segment_range)s': %(e)s"
),
{'network_segment_range': network_segment_range, 'e': e},
)
if result > 0:
total = len(parsed_args.network_segment_range)
msg = (_("%(result)s of %(total)s network segment ranges failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s network segment ranges failed "
"to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -290,8 +322,9 @@ class ListNetworkSegmentRange(command.Lister):
used_group.add_argument(
'--unused',
action='store_true',
help=_('List network segment ranges that have segments '
'not in use'),
help=_(
'List network segment ranges that have segments ' 'not in use'
),
)
available_group = parser.add_mutually_exclusive_group()
available_group.add_argument(
@ -310,11 +343,14 @@ class ListNetworkSegmentRange(command.Lister):
network_client = self.app.client_manager.network
try:
# Verify that the extension exists.
network_client.find_extension('network-segment-range',
ignore_missing=False)
network_client.find_extension(
'network-segment-range', ignore_missing=False
)
except Exception as e:
msg = (_('Network segment ranges list not supported by '
'Network API: %(e)s') % {'e': e})
msg = _(
'Network segment ranges list not supported by '
'Network API: %(e)s'
) % {'e': e}
raise exceptions.CommandError(msg)
filters = {}
@ -329,7 +365,7 @@ class ListNetworkSegmentRange(command.Lister):
'Network Type',
'Physical Network',
'Minimum ID',
'Maximum ID'
'Maximum ID',
)
columns = (
'id',
@ -342,8 +378,12 @@ class ListNetworkSegmentRange(command.Lister):
'minimum',
'maximum',
)
if parsed_args.available or parsed_args.unavailable or \
parsed_args.used or parsed_args.unused:
if (
parsed_args.available
or parsed_args.unavailable
or parsed_args.used
or parsed_args.unused
):
# If one of `--available`, `--unavailable`, `--used`,
# `--unused` is specified, we assume that additional fields
# should be listed in output.
@ -361,13 +401,16 @@ class ListNetworkSegmentRange(command.Lister):
display_props = tuple()
for s in data:
props = utils.get_item_properties(s, columns)
if parsed_args.available and \
_is_prop_empty(columns, props, 'available') or \
parsed_args.unavailable and \
not _is_prop_empty(columns, props, 'available') or \
parsed_args.used and _is_prop_empty(columns, props, 'used') or \
parsed_args.unused and \
not _is_prop_empty(columns, props, 'used'):
if (
parsed_args.available
and _is_prop_empty(columns, props, 'available')
or parsed_args.unavailable
and not _is_prop_empty(columns, props, 'available')
or parsed_args.used
and _is_prop_empty(columns, props, 'used')
or parsed_args.unused
and not _is_prop_empty(columns, props, 'used')
):
continue
if parsed_args.long:
props = _update_additional_fields_from_props(columns, props)
@ -409,20 +452,25 @@ class SetNetworkSegmentRange(common.NeutronCommandWithExtraArgs):
network_client = self.app.client_manager.network
try:
# Verify that the extension exists.
network_client.find_extension('network-segment-range',
ignore_missing=False)
network_client.find_extension(
'network-segment-range', ignore_missing=False
)
except Exception as e:
msg = (_('Network segment range set not supported by '
'Network API: %(e)s') % {'e': e})
msg = _(
'Network segment range set not supported by '
'Network API: %(e)s'
) % {'e': e}
raise exceptions.CommandError(msg)
if (parsed_args.minimum and not parsed_args.maximum) or \
(parsed_args.maximum and not parsed_args.minimum):
if (parsed_args.minimum and not parsed_args.maximum) or (
parsed_args.maximum and not parsed_args.minimum
):
msg = _("--minimum and --maximum are both required")
raise exceptions.CommandError(msg)
obj = network_client.find_network_segment_range(
parsed_args.network_segment_range, ignore_missing=False)
parsed_args.network_segment_range, ignore_missing=False
)
attrs = {}
if parsed_args.name:
attrs['name'] = parsed_args.name
@ -431,7 +479,8 @@ class SetNetworkSegmentRange(common.NeutronCommandWithExtraArgs):
if parsed_args.maximum:
attrs['maximum'] = parsed_args.maximum
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
network_client.update_network_segment_range(obj, **attrs)
@ -451,16 +500,18 @@ class ShowNetworkSegmentRange(command.ShowOne):
network_client = self.app.client_manager.network
try:
# Verify that the extension exists.
network_client.find_extension('network-segment-range',
ignore_missing=False)
network_client.find_extension(
'network-segment-range', ignore_missing=False
)
except Exception as e:
msg = (_('Network segment range show not supported by '
'Network API: %(e)s') % {'e': e})
msg = _(
'Network segment range show not supported by '
'Network API: %(e)s'
) % {'e': e}
raise exceptions.CommandError(msg)
obj = network_client.find_network_segment_range(
parsed_args.network_segment_range,
ignore_missing=False
parsed_args.network_segment_range, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns)

View File

@ -45,55 +45,54 @@ class CreateNetworkTrunk(command.ShowOne):
def get_parser(self, prog_name):
parser = super(CreateNetworkTrunk, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar='<name>',
help=_("Name of the trunk to create")
'name', metavar='<name>', help=_("Name of the trunk to create")
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("A description of the trunk")
help=_("A description of the trunk"),
)
parser.add_argument(
'--parent-port',
metavar='<parent-port>',
required=True,
help=_("Parent port belonging to this trunk (name or ID)")
help=_("Parent port belonging to this trunk (name or ID)"),
)
parser.add_argument(
'--subport',
metavar='<port=,segmentation-type=,segmentation-id=>',
action=parseractions.MultiKeyValueAction, dest='add_subports',
action=parseractions.MultiKeyValueAction,
dest='add_subports',
optional_keys=['segmentation-id', 'segmentation-type'],
required_keys=['port'],
help=_("Subport to add. Subport is of form "
"\'port=<name or ID>,segmentation-type=<segmentation-type>,"
"segmentation-id=<segmentation-ID>\' (--subport) option "
"can be repeated")
help=_(
"Subport to add. Subport is of form "
"\'port=<name or ID>,segmentation-type=<segmentation-type>,"
"segmentation-id=<segmentation-ID>\' (--subport) option "
"can be repeated"
),
)
admin_group = parser.add_mutually_exclusive_group()
admin_group.add_argument(
'--enable',
action='store_true',
default=True,
help=_("Enable trunk (default)")
help=_("Enable trunk (default)"),
)
admin_group.add_argument(
'--disable',
action='store_true',
help=_("Disable trunk")
'--disable', action='store_true', help=_("Disable trunk")
)
identity_utils.add_project_owner_option_to_parser(parser)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
attrs = _get_attrs_for_trunk(self.app.client_manager,
parsed_args)
attrs = _get_attrs_for_trunk(self.app.client_manager, parsed_args)
obj = client.create_trunk(**attrs)
display_columns, columns = _get_columns(obj)
data = osc_utils.get_dict_properties(obj, columns,
formatters=_formatters)
data = osc_utils.get_dict_properties(
obj, columns, formatters=_formatters
)
return display_columns, data
@ -106,7 +105,7 @@ class DeleteNetworkTrunk(command.Command):
'trunk',
metavar="<trunk>",
nargs="+",
help=_("Trunk(s) to delete (name or ID)")
help=_("Trunk(s) to delete (name or ID)"),
)
return parser
@ -119,13 +118,19 @@ class DeleteNetworkTrunk(command.Command):
client.delete_trunk(trunk_id)
except Exception as e:
result += 1
LOG.error(_("Failed to delete trunk with name "
"or ID '%(trunk)s': %(e)s"),
{'trunk': trunk, 'e': e})
LOG.error(
_(
"Failed to delete trunk with name "
"or ID '%(trunk)s': %(e)s"
),
{'trunk': trunk, 'e': e},
)
if result > 0:
total = len(parsed_args.trunk)
msg = (_("%(result)s of %(total)s trunks failed "
"to delete.") % {'result': result, 'total': total})
msg = _("%(result)s of %(total)s trunks failed " "to delete.") % {
'result': result,
'total': total,
}
raise exceptions.CommandError(msg)
@ -138,25 +143,15 @@ class ListNetworkTrunk(command.Lister):
'--long',
action='store_true',
default=False,
help=_("List additional fields in output")
help=_("List additional fields in output"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
data = client.trunks()
headers = (
'ID',
'Name',
'Parent Port',
'Description'
)
columns = (
'id',
'name',
'port_id',
'description'
)
headers = ('ID', 'Name', 'Parent Port', 'Description')
columns = ('id', 'name', 'port_id', 'description')
if parsed_args.long:
headers += (
'Status',
@ -164,17 +159,18 @@ class ListNetworkTrunk(command.Lister):
'Created At',
'Updated At',
)
columns += (
'status',
'admin_state_up',
'created_at',
'updated_at'
)
return (headers,
(osc_utils.get_item_properties(
s, columns,
columns += ('status', 'admin_state_up', 'created_at', 'updated_at')
return (
headers,
(
osc_utils.get_item_properties(
s,
columns,
formatters=_formatters,
) for s in data))
)
for s in data
),
)
class SetNetworkTrunk(command.Command):
@ -183,41 +179,36 @@ class SetNetworkTrunk(command.Command):
def get_parser(self, prog_name):
parser = super(SetNetworkTrunk, self).get_parser(prog_name)
parser.add_argument(
'trunk',
metavar="<trunk>",
help=_("Trunk to modify (name or ID)")
'trunk', metavar="<trunk>", help=_("Trunk to modify (name or ID)")
)
parser.add_argument(
'--name',
metavar="<name>",
help=_("Set trunk name")
'--name', metavar="<name>", help=_("Set trunk name")
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("A description of the trunk")
help=_("A description of the trunk"),
)
parser.add_argument(
'--subport',
metavar='<port=,segmentation-type=,segmentation-id=>',
action=parseractions.MultiKeyValueAction, dest='set_subports',
action=parseractions.MultiKeyValueAction,
dest='set_subports',
optional_keys=['segmentation-id', 'segmentation-type'],
required_keys=['port'],
help=_("Subport to add. Subport is of form "
"\'port=<name or ID>,segmentation-type=<segmentation-type>"
",segmentation-id=<segmentation-ID>\' (--subport) option "
"can be repeated")
help=_(
"Subport to add. Subport is of form "
"\'port=<name or ID>,segmentation-type=<segmentation-type>"
",segmentation-id=<segmentation-ID>\' (--subport) option "
"can be repeated"
),
)
admin_group = parser.add_mutually_exclusive_group()
admin_group.add_argument(
'--enable',
action='store_true',
help=_("Enable trunk")
'--enable', action='store_true', help=_("Enable trunk")
)
admin_group.add_argument(
'--disable',
action='store_true',
help=_("Disable trunk")
'--disable', action='store_true', help=_("Disable trunk")
)
return parser
@ -228,28 +219,32 @@ class SetNetworkTrunk(command.Command):
try:
client.update_trunk(trunk_id, **attrs)
except Exception as e:
msg = (_("Failed to set trunk '%(t)s': %(e)s")
% {'t': parsed_args.trunk, 'e': e})
msg = _("Failed to set trunk '%(t)s': %(e)s") % {
't': parsed_args.trunk,
'e': e,
}
raise exceptions.CommandError(msg)
if parsed_args.set_subports:
subport_attrs = _get_attrs_for_subports(self.app.client_manager,
parsed_args)
subport_attrs = _get_attrs_for_subports(
self.app.client_manager, parsed_args
)
try:
client.add_trunk_subports(trunk_id, subport_attrs)
except Exception as e:
msg = (_("Failed to add subports to trunk '%(t)s': %(e)s")
% {'t': parsed_args.trunk, 'e': e})
msg = _("Failed to add subports to trunk '%(t)s': %(e)s") % {
't': parsed_args.trunk,
'e': e,
}
raise exceptions.CommandError(msg)
class ShowNetworkTrunk(command.ShowOne):
"""Show information of a given network trunk"""
def get_parser(self, prog_name):
parser = super(ShowNetworkTrunk, self).get_parser(prog_name)
parser.add_argument(
'trunk',
metavar="<trunk>",
help=_("Trunk to display (name or ID)")
'trunk', metavar="<trunk>", help=_("Trunk to display (name or ID)")
)
return parser
@ -258,8 +253,9 @@ class ShowNetworkTrunk(command.ShowOne):
trunk_id = client.find_trunk(parsed_args.trunk).id
obj = client.get_trunk(trunk_id)
display_columns, columns = _get_columns(obj)
data = osc_utils.get_dict_properties(obj, columns,
formatters=_formatters)
data = osc_utils.get_dict_properties(
obj, columns, formatters=_formatters
)
return display_columns, data
@ -272,7 +268,7 @@ class ListNetworkSubport(command.Lister):
'--trunk',
required=True,
metavar="<trunk>",
help=_("List subports belonging to this trunk (name or ID)")
help=_("List subports belonging to this trunk (name or ID)"),
)
return parser
@ -282,10 +278,16 @@ class ListNetworkSubport(command.Lister):
data = client.get_trunk_subports(trunk_id)
headers = ('Port', 'Segmentation Type', 'Segmentation ID')
columns = ('port_id', 'segmentation_type', 'segmentation_id')
return (headers,
(osc_utils.get_dict_properties(
s, columns,
) for s in data[SUB_PORTS]))
return (
headers,
(
osc_utils.get_dict_properties(
s,
columns,
)
for s in data[SUB_PORTS]
),
)
class UnsetNetworkTrunk(command.Command):
@ -296,15 +298,18 @@ class UnsetNetworkTrunk(command.Command):
parser.add_argument(
'trunk',
metavar="<trunk>",
help=_("Unset subports from this trunk (name or ID)")
help=_("Unset subports from this trunk (name or ID)"),
)
parser.add_argument(
'--subport',
metavar="<subport>",
required=True,
action='append', dest='unset_subports',
help=_("Subport to delete (name or ID of the port) "
"(--subport) option can be repeated")
action='append',
dest='unset_subports',
help=_(
"Subport to delete (name or ID of the port) "
"(--subport) option can be repeated"
),
)
return parser
@ -325,9 +330,7 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return osc_utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -342,12 +345,14 @@ def _get_attrs_for_trunk(client_manager, parsed_args):
if parsed_args.disable:
attrs['admin_state_up'] = False
if 'parent_port' in parsed_args and parsed_args.parent_port is not None:
port_id = client_manager.network.find_port(
parsed_args.parent_port)['id']
port_id = client_manager.network.find_port(parsed_args.parent_port)[
'id'
]
attrs['port_id'] = port_id
if 'add_subports' in parsed_args and parsed_args.add_subports is not None:
attrs[SUB_PORTS] = _format_subports(client_manager,
parsed_args.add_subports)
attrs[SUB_PORTS] = _format_subports(
client_manager, parsed_args.add_subports
)
# "trunk set" command doesn't support setting project.
if 'project' in parsed_args and parsed_args.project is not None:
@ -372,10 +377,13 @@ def _format_subports(client_manager, subports):
if subport.get('segmentation-id'):
try:
subport_attrs['segmentation_id'] = int(
subport['segmentation-id'])
subport['segmentation-id']
)
except ValueError:
msg = (_("Segmentation-id '%s' is not an integer") %
subport['segmentation-id'])
msg = (
_("Segmentation-id '%s' is not an integer")
% subport['segmentation-id']
)
raise exceptions.CommandError(msg)
if subport.get('segmentation-type'):
subport_attrs['segmentation_type'] = subport['segmentation-type']
@ -386,10 +394,11 @@ def _format_subports(client_manager, subports):
def _get_attrs_for_subports(client_manager, parsed_args):
attrs = {}
if 'set_subports' in parsed_args and parsed_args.set_subports is not None:
attrs = _format_subports(client_manager,
parsed_args.set_subports)
if ('unset_subports' in parsed_args and
parsed_args.unset_subports is not None):
attrs = _format_subports(client_manager, parsed_args.set_subports)
if (
'unset_subports' in parsed_args
and parsed_args.unset_subports is not None
):
subports_list = []
for subport in parsed_args.unset_subports:
port_id = client_manager.network.find_port(subport)['id']

View File

@ -66,9 +66,7 @@ def _get_columns(item):
}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -79,7 +77,6 @@ class JSONKeyValueAction(argparse.Action):
"""
def __call__(self, parser, namespace, values, option_string=None):
# Make sure we have an empty dict rather than None
if getattr(namespace, self.dest, None) is None:
setattr(namespace, self.dest, {})
@ -92,9 +89,11 @@ class JSONKeyValueAction(argparse.Action):
if '=' in values:
current_dest.update([values.split('=', 1)])
else:
msg = _("Expected '<key>=<value>' or JSON data for option "
"%(option)s, but encountered JSON parsing error: "
"%(error)s") % {"option": option_string, "error": e}
msg = _(
"Expected '<key>=<value>' or JSON data for option "
"%(option)s, but encountered JSON parsing error: "
"%(error)s"
) % {"option": option_string, "error": e}
raise argparse.ArgumentTypeError(msg)
@ -151,23 +150,33 @@ def _get_attrs(client_manager, parsed_args):
if parsed_args.qos_policy:
attrs['qos_policy_id'] = client_manager.network.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False).id
parsed_args.qos_policy, ignore_missing=False
).id
if ('enable_uplink_status_propagation' in parsed_args and
parsed_args.enable_uplink_status_propagation):
if (
'enable_uplink_status_propagation' in parsed_args
and parsed_args.enable_uplink_status_propagation
):
attrs['propagate_uplink_status'] = True
if ('disable_uplink_status_propagation' in parsed_args and
parsed_args.disable_uplink_status_propagation):
if (
'disable_uplink_status_propagation' in parsed_args
and parsed_args.disable_uplink_status_propagation
):
attrs['propagate_uplink_status'] = False
if ('numa_policy_required' in parsed_args and
parsed_args.numa_policy_required):
if (
'numa_policy_required' in parsed_args
and parsed_args.numa_policy_required
):
attrs['numa_affinity_policy'] = 'required'
elif ('numa_policy_preferred' in parsed_args and
parsed_args.numa_policy_preferred):
elif (
'numa_policy_preferred' in parsed_args
and parsed_args.numa_policy_preferred
):
attrs['numa_affinity_policy'] = 'preferred'
elif ('numa_policy_legacy' in parsed_args and
parsed_args.numa_policy_legacy):
elif (
'numa_policy_legacy' in parsed_args and parsed_args.numa_policy_legacy
):
attrs['numa_affinity_policy'] = 'legacy'
if 'device_profile' in parsed_args and parsed_args.device_profile:
@ -191,8 +200,9 @@ def _prepare_fixed_ips(client_manager, parsed_args):
if 'subnet' in ip_spec:
subnet_name_id = ip_spec['subnet']
if subnet_name_id:
_subnet = client.find_subnet(subnet_name_id,
ignore_missing=False)
_subnet = client.find_subnet(
subnet_name_id, ignore_missing=False
)
ip_spec['subnet_id'] = _subnet.id
del ip_spec['subnet']
@ -220,8 +230,9 @@ def _prepare_filter_fixed_ips(client_manager, parsed_args):
if 'subnet' in ip_spec:
subnet_name_id = ip_spec['subnet']
if subnet_name_id:
_subnet = client.find_subnet(subnet_name_id,
ignore_missing=False)
_subnet = client.find_subnet(
subnet_name_id, ignore_missing=False
)
ips.append('subnet_id=%s' % _subnet.id)
if 'ip-address' in ip_spec:
@ -236,30 +247,36 @@ def _add_updatable_args(parser):
parser.add_argument(
'--description',
metavar='<description>',
help=_("Description of this port")
help=_("Description of this port"),
)
parser.add_argument(
'--device',
metavar='<device-id>',
help=_("Port device ID")
'--device', metavar='<device-id>', help=_("Port device ID")
)
parser.add_argument(
'--mac-address',
metavar='<mac-address>',
help=_("MAC address of this port (admin only)")
help=_("MAC address of this port (admin only)"),
)
parser.add_argument(
'--device-owner',
metavar='<device-owner>',
help=_("Device owner of this port. This is the entity that uses "
"the port (for example, network:dhcp).")
help=_(
"Device owner of this port. This is the entity that uses "
"the port (for example, network:dhcp)."
),
)
parser.add_argument(
'--vnic-type',
metavar='<vnic-type>',
choices=(
'direct', 'direct-physical', 'macvtap',
'normal', 'baremetal', 'virtio-forwarder', 'vdpa', 'remote-managed'
'direct',
'direct-physical',
'macvtap',
'normal',
'baremetal',
'virtio-forwarder',
'vdpa',
'remote-managed',
),
help=_(
"VNIC type for this port (direct | direct-physical | "
@ -271,35 +288,39 @@ def _add_updatable_args(parser):
parser.add_argument(
'--host',
metavar='<host-id>',
help=_("Allocate port on host <host-id> (ID only)")
help=_("Allocate port on host <host-id> (ID only)"),
)
parser.add_argument(
'--dns-domain',
metavar='dns-domain',
help=_("Set DNS domain to this port "
"(requires dns_domain extension for ports)")
help=_(
"Set DNS domain to this port "
"(requires dns_domain extension for ports)"
),
)
parser.add_argument(
'--dns-name',
metavar='<dns-name>',
help=_("Set DNS name for this port "
"(requires DNS integration extension)")
help=_(
"Set DNS name for this port "
"(requires DNS integration extension)"
),
)
numa_affinity_policy_group = parser.add_mutually_exclusive_group()
numa_affinity_policy_group.add_argument(
'--numa-policy-required',
action='store_true',
help=_("NUMA affinity policy required to schedule this port")
help=_("NUMA affinity policy required to schedule this port"),
)
numa_affinity_policy_group.add_argument(
'--numa-policy-preferred',
action='store_true',
help=_("NUMA affinity policy preferred to schedule this port")
help=_("NUMA affinity policy preferred to schedule this port"),
)
numa_affinity_policy_group.add_argument(
'--numa-policy-legacy',
action='store_true',
help=_("NUMA affinity policy using legacy mode to schedule this port")
help=_("NUMA affinity policy using legacy mode to schedule this port"),
)
@ -339,7 +360,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
'--network',
metavar='<network>',
required=True,
help=_("Network this port belongs to (name or ID)")
help=_("Network this port belongs to (name or ID)"),
)
_add_updatable_args(parser)
fixed_ip = parser.add_mutually_exclusive_group()
@ -348,56 +369,56 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
metavar='subnet=<subnet>,ip-address=<ip-address>',
action=parseractions.MultiKeyValueAction,
optional_keys=['subnet', 'ip-address'],
help=_("Desired IP and/or subnet for this port (name or ID): "
"subnet=<subnet>,ip-address=<ip-address> "
"(repeat option to set multiple fixed IP addresses)")
help=_(
"Desired IP and/or subnet for this port (name or ID): "
"subnet=<subnet>,ip-address=<ip-address> "
"(repeat option to set multiple fixed IP addresses)"
),
)
fixed_ip.add_argument(
'--no-fixed-ip',
action='store_true',
help=_("No IP or subnet for this port.")
help=_("No IP or subnet for this port."),
)
parser.add_argument(
'--binding-profile',
metavar='<binding-profile>',
action=JSONKeyValueAction,
help=_("Custom data to be passed as binding:profile. Data may "
"be passed as <key>=<value> or JSON. "
"(repeat option to set multiple binding:profile data)")
help=_(
"Custom data to be passed as binding:profile. Data may "
"be passed as <key>=<value> or JSON. "
"(repeat option to set multiple binding:profile data)"
),
)
admin_group = parser.add_mutually_exclusive_group()
admin_group.add_argument(
'--enable',
action='store_true',
default=True,
help=_("Enable port (default)")
help=_("Enable port (default)"),
)
admin_group.add_argument(
'--disable',
action='store_true',
help=_("Disable port")
'--disable', action='store_true', help=_("Disable port")
)
uplink_status_group = parser.add_mutually_exclusive_group()
uplink_status_group.add_argument(
'--enable-uplink-status-propagation',
action='store_true',
help=_("Enable uplink status propagate")
help=_("Enable uplink status propagate"),
)
uplink_status_group.add_argument(
'--disable-uplink-status-propagation',
action='store_true',
help=_("Disable uplink status propagate (default)")
help=_("Disable uplink status propagate (default)"),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'name',
metavar='<name>',
help=_("Name of this port")
'name', metavar='<name>', help=_("Name of this port")
)
parser.add_argument(
'--extra-dhcp-option',
@ -407,9 +428,12 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
dest='extra_dhcp_options',
required_keys=['name'],
optional_keys=['value', "ip-version"],
help=_('Extra DHCP options to be assigned to this port: '
'name=<name>[,value=<value>,ip-version={4,6}] '
'(repeat option to set multiple extra DHCP options)'))
help=_(
'Extra DHCP options to be assigned to this port: '
'name=<name>[,value=<value>,ip-version={4,6}] '
'(repeat option to set multiple extra DHCP options)'
),
)
secgroups = parser.add_mutually_exclusive_group()
secgroups.add_argument(
@ -417,30 +441,32 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
metavar='<security-group>',
action='append',
dest='security_group',
help=_("Security group to associate with this port (name or ID) "
"(repeat option to set multiple security groups)")
help=_(
"Security group to associate with this port (name or ID) "
"(repeat option to set multiple security groups)"
),
)
secgroups.add_argument(
'--no-security-group',
dest='no_security_group',
action='store_true',
help=_("Associate no security groups with this port")
help=_("Associate no security groups with this port"),
)
parser.add_argument(
'--qos-policy',
metavar='<qos-policy>',
help=_("Attach QoS policy to this port (name or ID)")
help=_("Attach QoS policy to this port (name or ID)"),
)
port_security = parser.add_mutually_exclusive_group()
port_security.add_argument(
'--enable-port-security',
action='store_true',
help=_("Enable port security for this port (Default)")
help=_("Enable port security for this port (Default)"),
)
port_security.add_argument(
'--disable-port-security',
action='store_true',
help=_("Disable port security for this port")
help=_("Disable port security for this port"),
)
parser.add_argument(
'--allowed-address',
@ -449,22 +475,25 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
dest='allowed_address_pairs',
required_keys=['ip-address'],
optional_keys=['mac-address'],
help=_("Add allowed-address pair associated with this port: "
"ip-address=<ip-address>[,mac-address=<mac-address>] "
"(repeat option to set multiple allowed-address pairs)")
help=_(
"Add allowed-address pair associated with this port: "
"ip-address=<ip-address>[,mac-address=<mac-address>] "
"(repeat option to set multiple allowed-address pairs)"
),
)
parser.add_argument(
'--device-profile',
metavar='<device-profile>',
help=_('Cyborg port device profile')
help=_('Cyborg port device profile'),
)
_tag.add_tag_option_to_parser_for_create(parser, _('port'))
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
_network = client.find_network(parsed_args.network,
ignore_missing=False)
_network = client.find_network(
parsed_args.network, ignore_missing=False
)
parsed_args.network = _network.id
_prepare_fixed_ips(self.app.client_manager, parsed_args)
attrs = _get_attrs(self.app.client_manager, parsed_args)
@ -478,26 +507,29 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
attrs['fixed_ips'] = []
if parsed_args.security_group:
attrs['security_group_ids'] = [client.find_security_group(
sg, ignore_missing=False).id
for sg in
parsed_args.security_group]
attrs['security_group_ids'] = [
client.find_security_group(sg, ignore_missing=False).id
for sg in parsed_args.security_group
]
elif parsed_args.no_security_group:
attrs['security_group_ids'] = []
if parsed_args.allowed_address_pairs:
attrs['allowed_address_pairs'] = (
_convert_address_pairs(parsed_args))
attrs['allowed_address_pairs'] = _convert_address_pairs(
parsed_args
)
if parsed_args.extra_dhcp_options:
attrs["extra_dhcp_opts"] = _convert_extra_dhcp_options(parsed_args)
if parsed_args.qos_policy:
attrs['qos_policy_id'] = client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False).id
parsed_args.qos_policy, ignore_missing=False
).id
set_tags_in_post = bool(
client.find_extension('tag-ports-during-bulk-creation'))
client.find_extension('tag-ports-during-bulk-creation')
)
if set_tags_in_post:
if parsed_args.no_tag:
attrs['tags'] = []
@ -505,10 +537,12 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
attrs['tags'] = list(set(parsed_args.tags))
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
with common.check_missing_extension_if_error(
self.app.client_manager.network, attrs):
self.app.client_manager.network, attrs
):
obj = client.create_port(**attrs)
if not set_tags_in_post:
@ -530,7 +564,7 @@ class DeletePort(command.Command):
'port',
metavar="<port>",
nargs="+",
help=_("Port(s) to delete (name or ID)")
help=_("Port(s) to delete (name or ID)"),
)
return parser
@ -544,14 +578,20 @@ class DeletePort(command.Command):
client.delete_port(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete port with "
"name or ID '%(port)s': %(e)s"),
{'port': port, 'e': e})
LOG.error(
_(
"Failed to delete port with "
"name or ID '%(port)s': %(e)s"
),
{'port': port, 'e': e},
)
if result > 0:
total = len(parsed_args.port)
msg = (_("%(result)s of %(total)s ports failed "
"to delete.") % {'result': result, 'total': total})
msg = _("%(result)s of %(total)s ports failed " "to delete.") % {
'result': result,
'total': total,
}
raise exceptions.CommandError(msg)
@ -565,24 +605,28 @@ class ListPort(command.Lister):
parser.add_argument(
'--device-owner',
metavar='<device-owner>',
help=_("List only ports with the specified device owner. "
"This is the entity that uses the port (for example, "
"network:dhcp).")
help=_(
"List only ports with the specified device owner. "
"This is the entity that uses the port (for example, "
"network:dhcp)."
),
)
parser.add_argument(
'--host',
metavar='<host-id>',
help=_("List only ports bound to this host ID"))
help=_("List only ports bound to this host ID"),
)
parser.add_argument(
'--network',
metavar='<network>',
help=_("List only ports connected to this network (name or ID)"))
help=_("List only ports connected to this network (name or ID)"),
)
device_group = parser.add_mutually_exclusive_group()
device_group.add_argument(
'--router',
metavar='<router>',
dest='router',
help=_("List only ports attached to this router (name or ID)")
help=_("List only ports attached to this router (name or ID)"),
)
device_group.add_argument(
'--server',
@ -592,47 +636,51 @@ class ListPort(command.Lister):
device_group.add_argument(
'--device-id',
metavar='<device-id>',
help=_("List only ports with the specified device ID")
help=_("List only ports with the specified device ID"),
)
parser.add_argument(
'--mac-address',
metavar='<mac-address>',
help=_("List only ports with this MAC address")
help=_("List only ports with this MAC address"),
)
parser.add_argument(
'--long',
action='store_true',
default=False,
help=_("List additional fields in output")
help=_("List additional fields in output"),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("List ports according to their project (name or ID)")
help=_("List ports according to their project (name or ID)"),
)
parser.add_argument(
'--name',
metavar='<name>',
help=_("List ports according to their name")
help=_("List ports according to their name"),
)
parser.add_argument(
'--security-group',
action='append',
dest='security_groups',
metavar='<security-group>',
help=_("List only ports associated with this security group")
help=_("List only ports associated with this security group"),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--fixed-ip',
metavar=('subnet=<subnet>,ip-address=<ip-address>,'
'ip-substring=<ip-substring>'),
metavar=(
'subnet=<subnet>,ip-address=<ip-address>,'
'ip-substring=<ip-substring>'
),
action=parseractions.MultiKeyValueAction,
optional_keys=['subnet', 'ip-address', 'ip-substring'],
help=_("Desired IP and/or subnet for filtering ports "
"(name or ID): subnet=<subnet>,ip-address=<ip-address>,"
"ip-substring=<ip-substring> "
"(repeat option to set multiple fixed IP addresses)"),
help=_(
"Desired IP and/or subnet for filtering ports "
"(name or ID): subnet=<subnet>,ip-address=<ip-address>,"
"ip-substring=<ip-substring> "
"(repeat option to set multiple fixed IP addresses)"
),
)
_tag.add_tag_filtering_option_to_parser(parser, _('ports'))
return parser
@ -665,19 +713,22 @@ class ListPort(command.Lister):
if parsed_args.device_id is not None:
filters['device_id'] = parsed_args.device_id
if parsed_args.router:
_router = network_client.find_router(parsed_args.router,
ignore_missing=False)
_router = network_client.find_router(
parsed_args.router, ignore_missing=False
)
filters['device_id'] = _router.id
if parsed_args.server:
compute_client = self.app.client_manager.compute
server = utils.find_resource(compute_client.servers,
parsed_args.server)
server = utils.find_resource(
compute_client.servers, parsed_args.server
)
filters['device_id'] = server.id
if parsed_args.host:
filters['binding:host_id'] = parsed_args.host
if parsed_args.network:
network = network_client.find_network(parsed_args.network,
ignore_missing=False)
network = network_client.find_network(
parsed_args.network, ignore_missing=False
)
filters['network_id'] = network.id
if parsed_args.mac_address:
filters['mac_address'] = parsed_args.mac_address
@ -692,7 +743,8 @@ class ListPort(command.Lister):
filters['name'] = parsed_args.name
if parsed_args.fixed_ip:
filters['fixed_ips'] = _prepare_filter_fixed_ips(
self.app.client_manager, parsed_args)
self.app.client_manager, parsed_args
)
if parsed_args.security_groups:
filters['security_groups'] = parsed_args.security_groups
@ -701,12 +753,19 @@ class ListPort(command.Lister):
data = network_client.ports(fields=columns, **filters)
headers, attrs = utils.calculate_header_and_attrs(
column_headers, columns, parsed_args)
return (headers,
(utils.get_item_properties(
s, attrs,
column_headers, columns, parsed_args
)
return (
headers,
(
utils.get_item_properties(
s,
attrs,
formatters=_formatters,
) for s in data))
)
for s in data
),
)
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
@ -722,83 +781,87 @@ class SetPort(common.NeutronCommandWithExtraArgs):
'--enable',
action='store_true',
default=None,
help=_("Enable port")
help=_("Enable port"),
)
admin_group.add_argument(
'--disable',
action='store_true',
help=_("Disable port")
'--disable', action='store_true', help=_("Disable port")
)
parser.add_argument(
'--name',
metavar="<name>",
help=_("Set port name")
'--name', metavar="<name>", help=_("Set port name")
)
parser.add_argument(
'--fixed-ip',
metavar='subnet=<subnet>,ip-address=<ip-address>',
action=parseractions.MultiKeyValueAction,
optional_keys=['subnet', 'ip-address'],
help=_("Desired IP and/or subnet for this port (name or ID): "
"subnet=<subnet>,ip-address=<ip-address> "
"(repeat option to set multiple fixed IP addresses)")
help=_(
"Desired IP and/or subnet for this port (name or ID): "
"subnet=<subnet>,ip-address=<ip-address> "
"(repeat option to set multiple fixed IP addresses)"
),
)
parser.add_argument(
'--no-fixed-ip',
action='store_true',
help=_("Clear existing information of fixed IP addresses."
"Specify both --fixed-ip and --no-fixed-ip "
"to overwrite the current fixed IP addresses.")
help=_(
"Clear existing information of fixed IP addresses."
"Specify both --fixed-ip and --no-fixed-ip "
"to overwrite the current fixed IP addresses."
),
)
parser.add_argument(
'--binding-profile',
metavar='<binding-profile>',
action=JSONKeyValueAction,
help=_("Custom data to be passed as binding:profile. Data may "
"be passed as <key>=<value> or JSON. "
"(repeat option to set multiple binding:profile data)")
help=_(
"Custom data to be passed as binding:profile. Data may "
"be passed as <key>=<value> or JSON. "
"(repeat option to set multiple binding:profile data)"
),
)
parser.add_argument(
'--no-binding-profile',
action='store_true',
help=_("Clear existing information of binding:profile. "
"Specify both --binding-profile and --no-binding-profile "
"to overwrite the current binding:profile information.")
help=_(
"Clear existing information of binding:profile. "
"Specify both --binding-profile and --no-binding-profile "
"to overwrite the current binding:profile information."
),
)
parser.add_argument(
'--qos-policy',
metavar='<qos-policy>',
help=_("Attach QoS policy to this port (name or ID)")
help=_("Attach QoS policy to this port (name or ID)"),
)
parser.add_argument(
'port',
metavar="<port>",
help=_("Port to modify (name or ID)")
'port', metavar="<port>", help=_("Port to modify (name or ID)")
)
parser.add_argument(
'--security-group',
metavar='<security-group>',
action='append',
dest='security_group',
help=_("Security group to associate with this port (name or ID) "
"(repeat option to set multiple security groups)")
help=_(
"Security group to associate with this port (name or ID) "
"(repeat option to set multiple security groups)"
),
)
parser.add_argument(
'--no-security-group',
dest='no_security_group',
action='store_true',
help=_("Clear existing security groups associated with this port")
help=_("Clear existing security groups associated with this port"),
)
port_security = parser.add_mutually_exclusive_group()
port_security.add_argument(
'--enable-port-security',
action='store_true',
help=_("Enable port security for this port")
help=_("Enable port security for this port"),
)
port_security.add_argument(
'--disable-port-security',
action='store_true',
help=_("Disable port security for this port")
help=_("Disable port security for this port"),
)
parser.add_argument(
'--allowed-address',
@ -807,18 +870,22 @@ class SetPort(common.NeutronCommandWithExtraArgs):
dest='allowed_address_pairs',
required_keys=['ip-address'],
optional_keys=['mac-address'],
help=_("Add allowed-address pair associated with this port: "
"ip-address=<ip-address>[,mac-address=<mac-address>] "
"(repeat option to set multiple allowed-address pairs)")
help=_(
"Add allowed-address pair associated with this port: "
"ip-address=<ip-address>[,mac-address=<mac-address>] "
"(repeat option to set multiple allowed-address pairs)"
),
)
parser.add_argument(
'--no-allowed-address',
dest='no_allowed_address_pair',
action='store_true',
help=_("Clear existing allowed-address pairs associated "
"with this port. "
"(Specify both --allowed-address and --no-allowed-address "
"to overwrite the current allowed-address pairs)")
help=_(
"Clear existing allowed-address pairs associated "
"with this port. "
"(Specify both --allowed-address and --no-allowed-address "
"to overwrite the current allowed-address pairs)"
),
)
parser.add_argument(
'--extra-dhcp-option',
@ -828,16 +895,21 @@ class SetPort(common.NeutronCommandWithExtraArgs):
dest='extra_dhcp_options',
required_keys=['name'],
optional_keys=['value', "ip-version"],
help=_('Extra DHCP options to be assigned to this port: '
'name=<name>[,value=<value>,ip-version={4,6}] '
'(repeat option to set multiple extra DHCP options)'))
help=_(
'Extra DHCP options to be assigned to this port: '
'name=<name>[,value=<value>,ip-version={4,6}] '
'(repeat option to set multiple extra DHCP options)'
),
)
parser.add_argument(
'--data-plane-status',
metavar='<status>',
choices=['ACTIVE', 'DOWN'],
help=_("Set data plane status of this port (ACTIVE | DOWN). "
"Unset it to None with the 'port unset' command "
"(requires data plane status extension)")
help=_(
"Set data plane status of this port (ACTIVE | DOWN). "
"Unset it to None with the 'port unset' command "
"(requires data plane status extension)"
),
)
_tag.add_tag_option_to_parser_for_set(parser, _('port'))
@ -887,9 +959,9 @@ class SetPort(common.NeutronCommandWithExtraArgs):
attrs['allowed_address_pairs'] = []
if parsed_args.allowed_address_pairs:
if 'allowed_address_pairs' not in attrs:
attrs['allowed_address_pairs'] = (
[addr for addr in obj.allowed_address_pairs if addr]
)
attrs['allowed_address_pairs'] = [
addr for addr in obj.allowed_address_pairs if addr
]
attrs['allowed_address_pairs'].extend(
_convert_address_pairs(parsed_args)
)
@ -901,11 +973,13 @@ class SetPort(common.NeutronCommandWithExtraArgs):
attrs['data_plane_status'] = parsed_args.data_plane_status
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
with common.check_missing_extension_if_error(
self.app.client_manager.network, attrs):
self.app.client_manager.network, attrs
):
client.update_port(obj, **attrs)
# tags is a subresource and it needs to be updated separately.
@ -918,9 +992,7 @@ class ShowPort(command.ShowOne):
def get_parser(self, prog_name):
parser = super(ShowPort, self).get_parser(prog_name)
parser.add_argument(
'port',
metavar="<port>",
help=_("Port to display (name or ID)")
'port', metavar="<port>", help=_("Port to display (name or ID)")
)
return parser
@ -944,30 +1016,36 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
metavar='subnet=<subnet>,ip-address=<ip-address>',
action=parseractions.MultiKeyValueAction,
optional_keys=['subnet', 'ip-address'],
help=_("Desired IP and/or subnet which should be "
"removed from this port (name or ID): subnet=<subnet>,"
"ip-address=<ip-address> (repeat option to unset multiple "
"fixed IP addresses)"))
help=_(
"Desired IP and/or subnet which should be "
"removed from this port (name or ID): subnet=<subnet>,"
"ip-address=<ip-address> (repeat option to unset multiple "
"fixed IP addresses)"
),
)
parser.add_argument(
'--binding-profile',
metavar='<binding-profile-key>',
action='append',
help=_("Desired key which should be removed from binding:profile "
"(repeat option to unset multiple binding:profile data)"))
help=_(
"Desired key which should be removed from binding:profile "
"(repeat option to unset multiple binding:profile data)"
),
)
parser.add_argument(
'--security-group',
metavar='<security-group>',
action='append',
dest='security_group_ids',
help=_("Security group which should be removed this port (name "
"or ID) (repeat option to unset multiple security groups)")
help=_(
"Security group which should be removed this port (name "
"or ID) (repeat option to unset multiple security groups)"
),
)
parser.add_argument(
'port',
metavar="<port>",
help=_("Port to modify (name or ID)")
'port', metavar="<port>", help=_("Port to modify (name or ID)")
)
parser.add_argument(
'--allowed-address',
@ -976,32 +1054,34 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
dest='allowed_address_pairs',
required_keys=['ip-address'],
optional_keys=['mac-address'],
help=_("Desired allowed-address pair which should be removed "
"from this port: ip-address=<ip-address>"
"[,mac-address=<mac-address>] (repeat option to unset "
"multiple allowed-address pairs)")
help=_(
"Desired allowed-address pair which should be removed "
"from this port: ip-address=<ip-address>"
"[,mac-address=<mac-address>] (repeat option to unset "
"multiple allowed-address pairs)"
),
)
parser.add_argument(
'--qos-policy',
action='store_true',
default=False,
help=_("Remove the QoS policy attached to the port")
help=_("Remove the QoS policy attached to the port"),
)
parser.add_argument(
'--data-plane-status',
action='store_true',
help=_("Clear existing information of data plane status")
help=_("Clear existing information of data plane status"),
)
parser.add_argument(
'--numa-policy',
action='store_true',
help=_("Clear existing NUMA affinity policy")
help=_("Clear existing NUMA affinity policy"),
)
parser.add_argument(
'--host',
action='store_true',
default=False,
help=_("Clear host binding for the port.")
help=_("Clear host binding for the port."),
)
_tag.add_tag_option_to_parser_for_unset(parser, _('port'))
@ -1040,7 +1120,8 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
try:
for sg in parsed_args.security_group_ids:
sg_id = client.find_security_group(
sg, ignore_missing=False).id
sg, ignore_missing=False
).id
tmp_secgroups.remove(sg_id)
except ValueError:
msg = _("Port does not contain security group %s") % sg
@ -1064,7 +1145,8 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
attrs['binding:host_id'] = None
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
client.update_port(obj, **attrs)

View File

@ -81,7 +81,8 @@ def _get_columns(item):
invisible_columns.append('is_distributed')
column_map.pop('is_distributed')
return utils.get_osc_show_columns_for_sdk_resource(
item, column_map, invisible_columns)
item, column_map, invisible_columns
)
def _get_attrs(client_manager, parsed_args):
@ -96,8 +97,10 @@ def _get_attrs(client_manager, parsed_args):
attrs['distributed'] = False
if parsed_args.distributed:
attrs['distributed'] = True
if ('availability_zone_hints' in parsed_args and
parsed_args.availability_zone_hints is not None):
if (
'availability_zone_hints' in parsed_args
and parsed_args.availability_zone_hints is not None
):
attrs['availability_zone_hints'] = parsed_args.availability_zone_hints
if parsed_args.description is not None:
attrs['description'] = parsed_args.description
@ -114,7 +117,8 @@ def _get_attrs(client_manager, parsed_args):
gateway_info = {}
n_client = client_manager.network
network = n_client.find_network(
parsed_args.external_gateway, ignore_missing=False)
parsed_args.external_gateway, ignore_missing=False
)
gateway_info['network_id'] = network.id
if parsed_args.disable_snat:
gateway_info['enable_snat'] = False
@ -126,8 +130,9 @@ def _get_attrs(client_manager, parsed_args):
if ip_spec.get('subnet', False):
subnet_name_id = ip_spec.pop('subnet')
if subnet_name_id:
subnet = n_client.find_subnet(subnet_name_id,
ignore_missing=False)
subnet = n_client.find_subnet(
subnet_name_id, ignore_missing=False
)
ip_spec['subnet_id'] = subnet.id
if ip_spec.get('ip-address', False):
ip_spec['ip_address'] = ip_spec.pop('ip-address')
@ -146,20 +151,20 @@ class AddPortToRouter(command.Command):
parser.add_argument(
'router',
metavar='<router>',
help=_("Router to which port will be added (name or ID)")
help=_("Router to which port will be added (name or ID)"),
)
parser.add_argument(
'port',
metavar='<port>',
help=_("Port to be added (name or ID)")
'port', metavar='<port>', help=_("Port to be added (name or ID)")
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
port = client.find_port(parsed_args.port, ignore_missing=False)
client.add_interface_to_router(client.find_router(
parsed_args.router, ignore_missing=False), port_id=port.id)
client.add_interface_to_router(
client.find_router(parsed_args.router, ignore_missing=False),
port_id=port.id,
)
class AddSubnetToRouter(command.Command):
@ -170,23 +175,22 @@ class AddSubnetToRouter(command.Command):
parser.add_argument(
'router',
metavar='<router>',
help=_("Router to which subnet will be added (name or ID)")
help=_("Router to which subnet will be added (name or ID)"),
)
parser.add_argument(
'subnet',
metavar='<subnet>',
help=_("Subnet to be added (name or ID)")
help=_("Subnet to be added (name or ID)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
subnet = client.find_subnet(parsed_args.subnet,
ignore_missing=False)
subnet = client.find_subnet(parsed_args.subnet, ignore_missing=False)
client.add_interface_to_router(
client.find_router(parsed_args.router,
ignore_missing=False),
subnet_id=subnet.id)
client.find_router(parsed_args.router, ignore_missing=False),
subnet_id=subnet.id,
)
class AddExtraRoutesToRouter(command.ShowOne):
@ -197,8 +201,10 @@ class AddExtraRoutesToRouter(command.ShowOne):
parser.add_argument(
'router',
metavar='<router>',
help=_("Router to which extra static routes "
"will be added (name or ID).")
help=_(
"Router to which extra static routes "
"will be added (name or ID)."
),
)
parser.add_argument(
'--route',
@ -207,14 +213,16 @@ class AddExtraRoutesToRouter(command.ShowOne):
dest='routes',
default=[],
required_keys=['destination', 'gateway'],
help=_("Add extra static route to the router. "
"destination: destination subnet (in CIDR notation), "
"gateway: nexthop IP address. "
"Repeat option to add multiple routes. "
"Trying to add a route that's already present "
"(exactly, including destination and nexthop) "
"in the routing table is allowed and is considered "
"a successful operation.")
help=_(
"Add extra static route to the router. "
"destination: destination subnet (in CIDR notation), "
"gateway: nexthop IP address. "
"Repeat option to add multiple routes. "
"Trying to add a route that's already present "
"(exactly, including destination and nexthop) "
"in the routing table is allowed and is considered "
"a successful operation."
),
)
return parser
@ -225,24 +233,29 @@ class AddExtraRoutesToRouter(command.ShowOne):
client = self.app.client_manager.network
router_obj = client.add_extra_routes_to_router(
client.find_router(parsed_args.router, ignore_missing=False),
body={'router': {'routes': parsed_args.routes}})
body={'router': {'routes': parsed_args.routes}},
)
display_columns, columns = _get_columns(router_obj)
data = utils.get_item_properties(
router_obj, columns, formatters=_formatters)
router_obj, columns, formatters=_formatters
)
return (display_columns, data)
class RemoveExtraRoutesFromRouter(command.ShowOne):
_description = _(
"Remove extra static routes from a router's routing table.")
"Remove extra static routes from a router's routing table."
)
def get_parser(self, prog_name):
parser = super(RemoveExtraRoutesFromRouter, self).get_parser(prog_name)
parser.add_argument(
'router',
metavar='<router>',
help=_("Router from which extra static routes "
"will be removed (name or ID).")
help=_(
"Router from which extra static routes "
"will be removed (name or ID)."
),
)
parser.add_argument(
'--route',
@ -251,14 +264,16 @@ class RemoveExtraRoutesFromRouter(command.ShowOne):
dest='routes',
default=[],
required_keys=['destination', 'gateway'],
help=_("Remove extra static route from the router. "
"destination: destination subnet (in CIDR notation), "
"gateway: nexthop IP address. "
"Repeat option to remove multiple routes. "
"Trying to remove a route that's already missing "
"(fully, including destination and nexthop) "
"from the routing table is allowed and is considered "
"a successful operation.")
help=_(
"Remove extra static route from the router. "
"destination: destination subnet (in CIDR notation), "
"gateway: nexthop IP address. "
"Repeat option to remove multiple routes. "
"Trying to remove a route that's already missing "
"(fully, including destination and nexthop) "
"from the routing table is allowed and is considered "
"a successful operation."
),
)
return parser
@ -269,10 +284,12 @@ class RemoveExtraRoutesFromRouter(command.ShowOne):
client = self.app.client_manager.network
router_obj = client.remove_extra_routes_from_router(
client.find_router(parsed_args.router, ignore_missing=False),
body={'router': {'routes': parsed_args.routes}})
body={'router': {'routes': parsed_args.routes}},
)
display_columns, columns = _get_columns(router_obj)
data = utils.get_item_properties(
router_obj, columns, formatters=_formatters)
router_obj, columns, formatters=_formatters
)
return (display_columns, data)
@ -284,53 +301,47 @@ class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs):
def get_parser(self, prog_name):
parser = super(CreateRouter, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar='<name>',
help=_("New router name")
'name', metavar='<name>', help=_("New router name")
)
admin_group = parser.add_mutually_exclusive_group()
admin_group.add_argument(
'--enable',
action='store_true',
default=True,
help=_("Enable router (default)")
help=_("Enable router (default)"),
)
admin_group.add_argument(
'--disable',
action='store_true',
help=_("Disable router")
'--disable', action='store_true', help=_("Disable router")
)
distribute_group = parser.add_mutually_exclusive_group()
distribute_group.add_argument(
'--distributed',
action='store_true',
help=_("Create a distributed router")
help=_("Create a distributed router"),
)
distribute_group.add_argument(
'--centralized',
action='store_true',
help=_("Create a centralized router")
help=_("Create a centralized router"),
)
ha_group = parser.add_mutually_exclusive_group()
ha_group.add_argument(
'--ha',
action='store_true',
help=_("Create a highly available router")
help=_("Create a highly available router"),
)
ha_group.add_argument(
'--no-ha',
action='store_true',
help=_("Create a legacy router")
'--no-ha', action='store_true', help=_("Create a legacy router")
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("Set router description")
help=_("Set router description"),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
@ -338,36 +349,40 @@ class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs):
metavar='<availability-zone>',
action='append',
dest='availability_zone_hints',
help=_("Availability Zone in which to create this router "
"(Router Availability Zone extension required, "
"repeat option to set multiple availability zones)")
help=_(
"Availability Zone in which to create this router "
"(Router Availability Zone extension required, "
"repeat option to set multiple availability zones)"
),
)
_tag.add_tag_option_to_parser_for_create(parser, _('router'))
parser.add_argument(
'--external-gateway',
metavar="<network>",
help=_("External Network used as router's gateway (name or ID)")
help=_("External Network used as router's gateway (name or ID)"),
)
parser.add_argument(
'--fixed-ip',
metavar='subnet=<subnet>,ip-address=<ip-address>',
action=parseractions.MultiKeyValueAction,
optional_keys=['subnet', 'ip-address'],
help=_("Desired IP and/or subnet (name or ID) "
"on external gateway: "
"subnet=<subnet>,ip-address=<ip-address> "
"(repeat option to set multiple fixed IP addresses)")
help=_(
"Desired IP and/or subnet (name or ID) "
"on external gateway: "
"subnet=<subnet>,ip-address=<ip-address> "
"(repeat option to set multiple fixed IP addresses)"
),
)
snat_group = parser.add_mutually_exclusive_group()
snat_group.add_argument(
'--enable-snat',
action='store_true',
help=_("Enable Source NAT on external gateway")
help=_("Enable Source NAT on external gateway"),
)
snat_group.add_argument(
'--disable-snat',
action='store_true',
help=_("Disable Source NAT on external gateway")
help=_("Disable Source NAT on external gateway"),
)
ndp_proxy_group = parser.add_mutually_exclusive_group()
ndp_proxy_group.add_argument(
@ -375,14 +390,14 @@ class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs):
dest='enable_ndp_proxy',
default=None,
action='store_true',
help=_("Enable IPv6 NDP proxy on external gateway")
help=_("Enable IPv6 NDP proxy on external gateway"),
)
ndp_proxy_group.add_argument(
'--disable-ndp-proxy',
dest='enable_ndp_proxy',
default=None,
action='store_false',
help=_("Disable IPv6 NDP proxy on external gateway")
help=_("Disable IPv6 NDP proxy on external gateway"),
)
return parser
@ -396,11 +411,14 @@ class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs):
if parsed_args.no_ha:
attrs['ha'] = False
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if parsed_args.enable_ndp_proxy and not parsed_args.external_gateway:
msg = (_("You must specify '--external-gateway' in order "
"to enable router's NDP proxy"))
msg = _(
"You must specify '--external-gateway' in order "
"to enable router's NDP proxy"
)
raise exceptions.CommandError(msg)
if parsed_args.enable_ndp_proxy is not None:
@ -410,10 +428,15 @@ class CreateRouter(command.ShowOne, common.NeutronCommandWithExtraArgs):
# tags cannot be set when created, so tags need to be set later.
_tag.update_tags_for_set(client, obj, parsed_args)
if (parsed_args.disable_snat or parsed_args.enable_snat or
parsed_args.fixed_ip) and not parsed_args.external_gateway:
msg = (_("You must specify '--external-gateway' in order "
"to specify SNAT or fixed-ip values"))
if (
parsed_args.disable_snat
or parsed_args.enable_snat
or parsed_args.fixed_ip
) and not parsed_args.external_gateway:
msg = _(
"You must specify '--external-gateway' in order "
"to specify SNAT or fixed-ip values"
)
raise exceptions.CommandError(msg)
display_columns, columns = _get_columns(obj)
@ -431,7 +454,7 @@ class DeleteRouter(command.Command):
'router',
metavar="<router>",
nargs="+",
help=_("Router(s) to delete (name or ID)")
help=_("Router(s) to delete (name or ID)"),
)
return parser
@ -445,14 +468,20 @@ class DeleteRouter(command.Command):
client.delete_router(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete router with "
"name or ID '%(router)s': %(e)s"),
{'router': router, 'e': e})
LOG.error(
_(
"Failed to delete router with "
"name or ID '%(router)s': %(e)s"
),
{'router': router, 'e': e},
)
if result > 0:
total = len(parsed_args.router)
msg = (_("%(result)s of %(total)s routers failed "
"to delete.") % {'result': result, 'total': total})
msg = _("%(result)s of %(total)s routers failed " "to delete.") % {
'result': result,
'total': total,
}
raise exceptions.CommandError(msg)
@ -466,35 +495,31 @@ class ListRouter(command.Lister):
parser.add_argument(
'--name',
metavar='<name>',
help=_("List routers according to their name")
help=_("List routers according to their name"),
)
admin_state_group = parser.add_mutually_exclusive_group()
admin_state_group.add_argument(
'--enable',
action='store_true',
help=_("List enabled routers")
'--enable', action='store_true', help=_("List enabled routers")
)
admin_state_group.add_argument(
'--disable',
action='store_true',
help=_("List disabled routers")
'--disable', action='store_true', help=_("List disabled routers")
)
parser.add_argument(
'--long',
action='store_true',
default=False,
help=_("List additional fields in output")
help=_("List additional fields in output"),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("List routers according to their project (name or ID)")
help=_("List routers according to their project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--agent',
metavar='<agent-id>',
help=_("List routers hosted by an agent (ID only)")
help=_("List routers hosted by an agent (ID only)"),
)
_tag.add_tag_filtering_option_to_parser(parser, _('routers'))
@ -553,8 +578,10 @@ class ListRouter(command.Lister):
# check if "HA" and "Distributed" columns should be displayed also
data = list(data)
for d in data:
if (d.is_distributed is not None and
'is_distributed' not in columns):
if (
d.is_distributed is not None
and 'is_distributed' not in columns
):
columns = columns + ('is_distributed',)
column_headers = column_headers + ('Distributed',)
if d.is_ha is not None and 'is_ha' not in columns:
@ -572,20 +599,22 @@ class ListRouter(command.Lister):
# availability zone will be available only when
# router_availability_zone extension is enabled
if client.find_extension("router_availability_zone"):
columns = columns + (
'availability_zones',
)
column_headers = column_headers + (
'Availability zones',
)
columns = columns + ('availability_zones',)
column_headers = column_headers + ('Availability zones',)
columns = columns + ('tags',)
column_headers = column_headers + ('Tags',)
return (column_headers,
(utils.get_item_properties(
s, columns,
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
formatters=_formatters,
) for s in data))
)
for s in data
),
)
@staticmethod
def _filter_match(data, conditions):
@ -610,20 +639,22 @@ class RemovePortFromRouter(command.Command):
parser.add_argument(
'router',
metavar='<router>',
help=_("Router from which port will be removed (name or ID)")
help=_("Router from which port will be removed (name or ID)"),
)
parser.add_argument(
'port',
metavar='<port>',
help=_("Port to be removed and deleted (name or ID)")
help=_("Port to be removed and deleted (name or ID)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
port = client.find_port(parsed_args.port, ignore_missing=False)
client.remove_interface_from_router(client.find_router(
parsed_args.router, ignore_missing=False), port_id=port.id)
client.remove_interface_from_router(
client.find_router(parsed_args.router, ignore_missing=False),
port_id=port.id,
)
class RemoveSubnetFromRouter(command.Command):
@ -634,23 +665,24 @@ class RemoveSubnetFromRouter(command.Command):
parser.add_argument(
'router',
metavar='<router>',
help=_("Router from which the subnet will be removed (name or ID)")
help=_(
"Router from which the subnet will be removed (name or ID)"
),
)
parser.add_argument(
'subnet',
metavar='<subnet>',
help=_("Subnet to be removed (name or ID)")
help=_("Subnet to be removed (name or ID)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
subnet = client.find_subnet(parsed_args.subnet,
ignore_missing=False)
subnet = client.find_subnet(parsed_args.subnet, ignore_missing=False)
client.remove_interface_from_router(
client.find_router(parsed_args.router,
ignore_missing=False),
subnet_id=subnet.id)
client.find_router(parsed_args.router, ignore_missing=False),
subnet_id=subnet.id,
)
# TODO(yanxing'an): Use the SDK resource mapped attribute names once the
@ -663,40 +695,36 @@ class SetRouter(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'router',
metavar="<router>",
help=_("Router to modify (name or ID)")
help=_("Router to modify (name or ID)"),
)
parser.add_argument(
'--name',
metavar='<name>',
help=_("Set router name")
'--name', metavar='<name>', help=_("Set router name")
)
parser.add_argument(
'--description',
metavar='<description>',
help=_('Set router description')
help=_('Set router description'),
)
admin_group = parser.add_mutually_exclusive_group()
admin_group.add_argument(
'--enable',
action='store_true',
default=None,
help=_("Enable router")
help=_("Enable router"),
)
admin_group.add_argument(
'--disable',
action='store_true',
help=_("Disable router")
'--disable', action='store_true', help=_("Disable router")
)
distribute_group = parser.add_mutually_exclusive_group()
distribute_group.add_argument(
'--distributed',
action='store_true',
help=_("Set router to distributed mode (disabled router only)")
help=_("Set router to distributed mode (disabled router only)"),
)
distribute_group.add_argument(
'--centralized',
action='store_true',
help=_("Set router to centralized mode (disabled router only)")
help=_("Set router to centralized mode (disabled router only)"),
)
parser.add_argument(
'--route',
@ -705,60 +733,69 @@ class SetRouter(common.NeutronCommandWithExtraArgs):
dest='routes',
default=None,
required_keys=['destination', 'gateway'],
help=_("Add routes to the router "
"destination: destination subnet (in CIDR notation) "
"gateway: nexthop IP address "
"(repeat option to add multiple routes). "
"This is deprecated in favor of 'router add/remove route' "
"since it is prone to race conditions between concurrent "
"clients when not used together with --no-route to "
"overwrite the current value of 'routes'.")
help=_(
"Add routes to the router "
"destination: destination subnet (in CIDR notation) "
"gateway: nexthop IP address "
"(repeat option to add multiple routes). "
"This is deprecated in favor of 'router add/remove route' "
"since it is prone to race conditions between concurrent "
"clients when not used together with --no-route to "
"overwrite the current value of 'routes'."
),
)
parser.add_argument(
'--no-route',
action='store_true',
help=_("Clear routes associated with the router. "
"Specify both --route and --no-route to overwrite "
"current value of routes.")
help=_(
"Clear routes associated with the router. "
"Specify both --route and --no-route to overwrite "
"current value of routes."
),
)
routes_ha = parser.add_mutually_exclusive_group()
routes_ha.add_argument(
'--ha',
action='store_true',
help=_("Set the router as highly available "
"(disabled router only)")
help=_(
"Set the router as highly available " "(disabled router only)"
),
)
routes_ha.add_argument(
'--no-ha',
action='store_true',
help=_("Clear high availability attribute of the router "
"(disabled router only)")
help=_(
"Clear high availability attribute of the router "
"(disabled router only)"
),
)
parser.add_argument(
'--external-gateway',
metavar="<network>",
help=_("External Network used as router's gateway (name or ID)")
help=_("External Network used as router's gateway (name or ID)"),
)
parser.add_argument(
'--fixed-ip',
metavar='subnet=<subnet>,ip-address=<ip-address>',
action=parseractions.MultiKeyValueAction,
optional_keys=['subnet', 'ip-address'],
help=_("Desired IP and/or subnet (name or ID) "
"on external gateway: "
"subnet=<subnet>,ip-address=<ip-address> "
"(repeat option to set multiple fixed IP addresses)")
help=_(
"Desired IP and/or subnet (name or ID) "
"on external gateway: "
"subnet=<subnet>,ip-address=<ip-address> "
"(repeat option to set multiple fixed IP addresses)"
),
)
snat_group = parser.add_mutually_exclusive_group()
snat_group.add_argument(
'--enable-snat',
action='store_true',
help=_("Enable Source NAT on external gateway")
help=_("Enable Source NAT on external gateway"),
)
snat_group.add_argument(
'--disable-snat',
action='store_true',
help=_("Disable Source NAT on external gateway")
help=_("Disable Source NAT on external gateway"),
)
ndp_proxy_group = parser.add_mutually_exclusive_group()
ndp_proxy_group.add_argument(
@ -766,25 +803,25 @@ class SetRouter(common.NeutronCommandWithExtraArgs):
dest='enable_ndp_proxy',
default=None,
action='store_true',
help=_("Enable IPv6 NDP proxy on external gateway")
help=_("Enable IPv6 NDP proxy on external gateway"),
)
ndp_proxy_group.add_argument(
'--disable-ndp-proxy',
dest='enable_ndp_proxy',
default=None,
action='store_false',
help=_("Disable IPv6 NDP proxy on external gateway")
help=_("Disable IPv6 NDP proxy on external gateway"),
)
qos_policy_group = parser.add_mutually_exclusive_group()
qos_policy_group.add_argument(
'--qos-policy',
metavar='<qos-policy>',
help=_("Attach QoS policy to router gateway IPs")
help=_("Attach QoS policy to router gateway IPs"),
)
qos_policy_group.add_argument(
'--no-qos-policy',
action='store_true',
help=_("Remove QoS policy from router gateway IPs")
help=_("Remove QoS policy from router gateway IPs"),
)
_tag.add_tag_option_to_parser_for_set(parser, _('router'))
return parser
@ -812,20 +849,28 @@ class SetRouter(common.NeutronCommandWithExtraArgs):
attrs['routes'] += obj.routes
elif parsed_args.no_route:
attrs['routes'] = []
if (parsed_args.disable_snat or parsed_args.enable_snat or
parsed_args.fixed_ip) and not parsed_args.external_gateway:
msg = (_("You must specify '--external-gateway' in order "
"to update the SNAT or fixed-ip values"))
if (
parsed_args.disable_snat
or parsed_args.enable_snat
or parsed_args.fixed_ip
) and not parsed_args.external_gateway:
msg = _(
"You must specify '--external-gateway' in order "
"to update the SNAT or fixed-ip values"
)
raise exceptions.CommandError(msg)
if ((parsed_args.qos_policy or parsed_args.no_qos_policy) and
not parsed_args.external_gateway):
if (
parsed_args.qos_policy or parsed_args.no_qos_policy
) and not parsed_args.external_gateway:
try:
original_net_id = obj.external_gateway_info['network_id']
except (KeyError, TypeError):
msg = (_("You must specify '--external-gateway' or the router "
"must already have an external network in order to "
"set router gateway IP QoS"))
msg = _(
"You must specify '--external-gateway' or the router "
"must already have an external network in order to "
"set router gateway IP QoS"
)
raise exceptions.CommandError(msg)
else:
if not attrs.get('external_gateway_info'):
@ -833,14 +878,16 @@ class SetRouter(common.NeutronCommandWithExtraArgs):
attrs['external_gateway_info']['network_id'] = original_net_id
if parsed_args.qos_policy:
check_qos_id = client.find_qos_policy(
parsed_args.qos_policy, ignore_missing=False).id
parsed_args.qos_policy, ignore_missing=False
).id
attrs['external_gateway_info']['qos_policy_id'] = check_qos_id
if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy:
attrs['external_gateway_info']['qos_policy_id'] = None
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if parsed_args.enable_ndp_proxy is not None:
attrs['enable_ndp_proxy'] = parsed_args.enable_ndp_proxy
@ -859,7 +906,7 @@ class ShowRouter(command.ShowOne):
parser.add_argument(
'router',
metavar="<router>",
help=_("Router to display (name or ID)")
help=_("Router to display (name or ID)"),
)
return parser
@ -875,7 +922,7 @@ class ShowRouter(command.ShowOne):
int_info = {
'port_id': port.id,
'ip_address': ip_spec.get('ip_address'),
'subnet_id': ip_spec.get('subnet_id')
'subnet_id': ip_spec.get('subnet_id'),
}
interfaces_info.append(int_info)
@ -899,25 +946,29 @@ class UnsetRouter(common.NeutronUnsetCommandWithExtraArgs):
dest='routes',
default=None,
required_keys=['destination', 'gateway'],
help=_("Routes to be removed from the router "
"destination: destination subnet (in CIDR notation) "
"gateway: nexthop IP address "
"(repeat option to unset multiple routes)"))
help=_(
"Routes to be removed from the router "
"destination: destination subnet (in CIDR notation) "
"gateway: nexthop IP address "
"(repeat option to unset multiple routes)"
),
)
parser.add_argument(
'--external-gateway',
action='store_true',
default=False,
help=_("Remove external gateway information from the router"))
help=_("Remove external gateway information from the router"),
)
parser.add_argument(
'--qos-policy',
action='store_true',
default=False,
help=_("Remove QoS policy from router gateway IPs")
help=_("Remove QoS policy from router gateway IPs"),
)
parser.add_argument(
'router',
metavar="<router>",
help=_("Router to modify (name or ID)")
help=_("Router to modify (name or ID)"),
)
_tag.add_tag_option_to_parser_for_unset(parser, _('router'))
return parser
@ -934,13 +985,15 @@ class UnsetRouter(common.NeutronUnsetCommandWithExtraArgs):
route['nexthop'] = route.pop('gateway')
tmp_routes.remove(route)
except ValueError:
msg = (_("Router does not contain route %s") % route)
msg = _("Router does not contain route %s") % route
raise exceptions.CommandError(msg)
attrs['routes'] = tmp_routes
if parsed_args.qos_policy:
try:
if (tmp_external_gateway_info['network_id'] and
tmp_external_gateway_info['qos_policy_id']):
if (
tmp_external_gateway_info['network_id']
and tmp_external_gateway_info['qos_policy_id']
):
pass
except (KeyError, TypeError):
msg = _("Router does not have external network or qos policy")
@ -948,14 +1001,15 @@ class UnsetRouter(common.NeutronUnsetCommandWithExtraArgs):
else:
attrs['external_gateway_info'] = {
'network_id': tmp_external_gateway_info['network_id'],
'qos_policy_id': None
'qos_policy_id': None,
}
if parsed_args.external_gateway:
attrs['external_gateway_info'] = {}
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
client.update_router(obj, **attrs)

View File

@ -92,28 +92,25 @@ def _get_columns(item):
}
hidden_columns = ['location']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
# OSC minimum requirements include SDK 1.0.
class CreateSecurityGroup(common.NetworkAndComputeShowOne,
common.NeutronCommandWithExtraArgs):
class CreateSecurityGroup(
common.NetworkAndComputeShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create a new security group")
def update_parser_common(self, parser):
parser.add_argument(
"name",
metavar="<name>",
help=_("New security group name")
"name", metavar="<name>", help=_("New security group name")
)
parser.add_argument(
"--description",
metavar="<description>",
help=_("Security group description")
help=_("Security group description"),
)
return parser
@ -121,26 +118,27 @@ class CreateSecurityGroup(common.NetworkAndComputeShowOne,
parser.add_argument(
'--project',
metavar='<project>',
help=self.enhance_help_neutron(_("Owner's project (name or ID)"))
help=self.enhance_help_neutron(_("Owner's project (name or ID)")),
)
stateful_group = parser.add_mutually_exclusive_group()
stateful_group.add_argument(
"--stateful",
action='store_true',
default=None,
help=_("Security group is stateful (Default)")
help=_("Security group is stateful (Default)"),
)
stateful_group.add_argument(
"--stateless",
action='store_true',
default=None,
help=_("Security group is stateless")
help=_("Security group is stateless"),
)
identity_common.add_project_domain_option_to_parser(
parser, enhance_help=self.enhance_help_neutron)
parser, enhance_help=self.enhance_help_neutron
)
_tag.add_tag_option_to_parser_for_create(
parser, _('security group'),
enhance_help=self.enhance_help_neutron)
parser, _('security group'), enhance_help=self.enhance_help_neutron
)
return parser
def _get_description(self, parsed_args):
@ -167,7 +165,8 @@ class CreateSecurityGroup(common.NetworkAndComputeShowOne,
).id
attrs['project_id'] = project_id
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
# Create the security group and display the results.
obj = client.create_security_group(**attrs)
@ -175,9 +174,7 @@ class CreateSecurityGroup(common.NetworkAndComputeShowOne,
_tag.update_tags_for_set(client, obj, parsed_args)
display_columns, property_columns = _get_columns(obj)
data = utils.get_item_properties(
obj,
property_columns,
formatters=_formatters_network
obj, property_columns, formatters=_formatters_network
)
return (display_columns, data)
@ -189,9 +186,7 @@ class CreateSecurityGroup(common.NetworkAndComputeShowOne,
)
display_columns, property_columns = _get_columns(obj)
data = utils.get_dict_properties(
obj,
property_columns,
formatters=_formatters_compute
obj, property_columns, formatters=_formatters_compute
)
return (display_columns, data)
@ -241,14 +236,18 @@ class ListSecurityGroup(common.NetworkAndComputeLister):
'--project',
metavar='<project>',
help=self.enhance_help_neutron(
_("List security groups according to the project (name or "
"ID)"))
_(
"List security groups according to the project (name or "
"ID)"
)
),
)
identity_common.add_project_domain_option_to_parser(
parser, enhance_help=self.enhance_help_neutron)
parser, enhance_help=self.enhance_help_neutron
)
_tag.add_tag_filtering_option_to_parser(
parser, _('security group'),
enhance_help=self.enhance_help_neutron)
parser, _('security group'), enhance_help=self.enhance_help_neutron
)
return parser
def update_parser_compute(self, parser):
@ -257,7 +256,8 @@ class ListSecurityGroup(common.NetworkAndComputeLister):
action='store_true',
default=False,
help=self.enhance_help_nova_network(
_("Display information from all projects (admin only)"))
_("Display information from all projects (admin only)")
),
)
return parser
@ -273,27 +273,22 @@ class ListSecurityGroup(common.NetworkAndComputeLister):
filters['project_id'] = project_id
_tag.get_tag_filtering_args(parsed_args, filters)
data = client.security_groups(fields=self.FIELDS_TO_RETRIEVE,
**filters)
data = client.security_groups(
fields=self.FIELDS_TO_RETRIEVE, **filters
)
columns = (
"ID",
"Name",
"Description",
"Project ID",
"tags"
columns = ("ID", "Name", "Description", "Project ID", "tags")
column_headers = ("ID", "Name", "Description", "Project", "Tags")
return (
column_headers,
(
utils.get_item_properties(
s,
columns,
)
for s in data
),
)
column_headers = (
"ID",
"Name",
"Description",
"Project",
"Tags"
)
return (column_headers,
(utils.get_item_properties(
s, columns,
) for s in data))
def take_action_compute(self, client, parsed_args):
search = {'all_tenants': parsed_args.all_projects}
@ -311,56 +306,62 @@ class ListSecurityGroup(common.NetworkAndComputeLister):
if parsed_args.all_projects:
columns = columns + ('Tenant ID',)
column_headers = column_headers + ('Project',)
return (column_headers,
(utils.get_dict_properties(
s, columns,
) for s in data))
return (
column_headers,
(
utils.get_dict_properties(
s,
columns,
)
for s in data
),
)
class SetSecurityGroup(common.NetworkAndComputeCommand,
common.NeutronCommandWithExtraArgs):
class SetSecurityGroup(
common.NetworkAndComputeCommand, common.NeutronCommandWithExtraArgs
):
_description = _("Set security group properties")
def update_parser_common(self, parser):
parser.add_argument(
'group',
metavar='<group>',
help=_("Security group to modify (name or ID)")
help=_("Security group to modify (name or ID)"),
)
parser.add_argument(
'--name',
metavar='<new-name>',
help=_("New security group name")
'--name', metavar='<new-name>', help=_("New security group name")
)
parser.add_argument(
"--description",
metavar="<description>",
help=_("New security group description")
help=_("New security group description"),
)
stateful_group = parser.add_mutually_exclusive_group()
stateful_group.add_argument(
"--stateful",
action='store_true',
default=None,
help=_("Security group is stateful (Default)")
help=_("Security group is stateful (Default)"),
)
stateful_group.add_argument(
"--stateless",
action='store_true',
default=None,
help=_("Security group is stateless")
help=_("Security group is stateless"),
)
return parser
def update_parser_network(self, parser):
_tag.add_tag_option_to_parser_for_set(
parser, _('security group'),
enhance_help=self.enhance_help_neutron)
parser, _('security group'), enhance_help=self.enhance_help_neutron
)
return parser
def take_action_network(self, client, parsed_args):
obj = client.find_security_group(parsed_args.group,
ignore_missing=False)
obj = client.find_security_group(
parsed_args.group, ignore_missing=False
)
attrs = {}
if parsed_args.name is not None:
attrs['name'] = parsed_args.name
@ -371,7 +372,8 @@ class SetSecurityGroup(common.NetworkAndComputeCommand,
if parsed_args.stateless:
attrs['stateful'] = False
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
# NOTE(rtheis): Previous behavior did not raise a CommandError
# if there were no updates. Maintain this behavior and issue
# the update.
@ -405,18 +407,17 @@ class ShowSecurityGroup(common.NetworkAndComputeShowOne):
parser.add_argument(
'group',
metavar='<group>',
help=_("Security group to display (name or ID)")
help=_("Security group to display (name or ID)"),
)
return parser
def take_action_network(self, client, parsed_args):
obj = client.find_security_group(parsed_args.group,
ignore_missing=False)
obj = client.find_security_group(
parsed_args.group, ignore_missing=False
)
display_columns, property_columns = _get_columns(obj)
data = utils.get_item_properties(
obj,
property_columns,
formatters=_formatters_network
obj, property_columns, formatters=_formatters_network
)
return (display_columns, data)
@ -424,9 +425,7 @@ class ShowSecurityGroup(common.NetworkAndComputeShowOne):
obj = client.api.security_group_find(parsed_args.group)
display_columns, property_columns = _get_columns(obj)
data = utils.get_dict_properties(
obj,
property_columns,
formatters=_formatters_compute
obj, property_columns, formatters=_formatters_compute
)
return (display_columns, data)
@ -439,15 +438,16 @@ class UnsetSecurityGroup(command.Command):
parser.add_argument(
'group',
metavar="<group>",
help=_("Security group to modify (name or ID)")
help=_("Security group to modify (name or ID)"),
)
_tag.add_tag_option_to_parser_for_unset(parser, _('security group'))
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_security_group(parsed_args.group,
ignore_missing=False)
obj = client.find_security_group(
parsed_args.group, ignore_missing=False
)
# tags is a subresource and it needs to be updated separately.
_tag.update_tags_for_unset(client, obj, parsed_args)

View File

@ -74,9 +74,7 @@ def _get_columns(item):
column_map = {}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -105,23 +103,26 @@ def _is_icmp_protocol(protocol):
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
# OSC minimum requirements include SDK 1.0.
class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
common.NeutronCommandWithExtraArgs):
class CreateSecurityGroupRule(
common.NetworkAndComputeShowOne, common.NeutronCommandWithExtraArgs
):
_description = _("Create a new security group rule")
def update_parser_common(self, parser):
parser.add_argument(
'group',
metavar='<group>',
help=_("Create rule in this security group (name or ID)")
help=_("Create rule in this security group (name or ID)"),
)
remote_group = parser.add_mutually_exclusive_group()
remote_group.add_argument(
"--remote-ip",
metavar="<ip-address>",
help=_("Remote IP address block (may use CIDR notation; "
"default for IPv4 rule: 0.0.0.0/0, "
"default for IPv6 rule: ::/0)"),
help=_(
"Remote IP address block (may use CIDR notation; "
"default for IPv4 rule: 0.0.0.0/0, "
"default for IPv6 rule: ::/0)"
),
)
remote_group.add_argument(
"--remote-group",
@ -150,9 +151,11 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
'--dst-port',
metavar='<port-range>',
action=parseractions.RangeAction,
help=_("Destination port, may be a single port or a starting and "
"ending port range: 137:139. Required for IP protocols TCP "
"and UDP. Ignored for ICMP IP protocols."),
help=_(
"Destination port, may be a single port or a starting and "
"ending port range: 137:139. Required for IP protocols TCP "
"and UDP. Ignored for ICMP IP protocols."
),
**dst_port_default
)
@ -170,7 +173,8 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
"IP protocol (ah, dccp, egp, esp, gre, icmp, igmp, ipv6-encap, "
"ipv6-frag, ipv6-icmp, ipv6-nonxt, ipv6-opts, ipv6-route, ospf, "
"pgm, rsvp, sctp, tcp, udp, udplite, vrrp and integer "
"representations [0-255] or any; default: any (all protocols))")
"representations [0-255] or any; default: any (all protocols))"
)
if self.is_nova_network:
protocol_help = protocol_help_compute
elif self.is_neutron:
@ -178,7 +182,8 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
else:
# Docs build: compose help for both nova-network and neutron
protocol_help = self.split_help(
protocol_help_network, protocol_help_compute)
protocol_help_network, protocol_help_compute
)
protocol_group.add_argument(
'--protocol',
@ -203,34 +208,39 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
'--description',
metavar='<description>',
help=self.enhance_help_neutron(
_("Set security group rule description"))
_("Set security group rule description")
),
)
parser.add_argument(
'--icmp-type',
metavar='<icmp-type>',
type=int,
help=self.enhance_help_neutron(
_("ICMP type for ICMP IP protocols"))
_("ICMP type for ICMP IP protocols")
),
)
parser.add_argument(
'--icmp-code',
metavar='<icmp-code>',
type=int,
help=self.enhance_help_neutron(
_("ICMP code for ICMP IP protocols"))
_("ICMP code for ICMP IP protocols")
),
)
direction_group = parser.add_mutually_exclusive_group()
direction_group.add_argument(
'--ingress',
action='store_true',
help=self.enhance_help_neutron(
_("Rule applies to incoming network traffic (default)"))
_("Rule applies to incoming network traffic (default)")
),
)
direction_group.add_argument(
'--egress',
action='store_true',
help=self.enhance_help_neutron(
_("Rule applies to outgoing network traffic"))
_("Rule applies to outgoing network traffic")
),
)
parser.add_argument(
'--ethertype',
@ -238,16 +248,20 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
choices=['IPv4', 'IPv6'],
type=_convert_ipvx_case,
help=self.enhance_help_neutron(
_("Ethertype of network traffic "
"(IPv4, IPv6; default: based on IP protocol)"))
_(
"Ethertype of network traffic "
"(IPv4, IPv6; default: based on IP protocol)"
)
),
)
parser.add_argument(
'--project',
metavar='<project>',
help=self.enhance_help_neutron(_("Owner's project (name or ID)"))
help=self.enhance_help_neutron(_("Owner's project (name or ID)")),
)
identity_common.add_project_domain_option_to_parser(
parser, enhance_help=self.enhance_help_neutron)
parser, enhance_help=self.enhance_help_neutron
)
return parser
def _get_protocol(self, parsed_args, default_protocol='any'):
@ -273,8 +287,11 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
# However, while the OSC CLI doesn't document the protocol,
# the code must still handle it. In addition, handle both
# protocol names and numbers.
if (protocol is not None and protocol.startswith('ipv6-') or
protocol in ['icmpv6', '41', '43', '44', '58', '59', '60']):
if (
protocol is not None
and protocol.startswith('ipv6-')
or protocol in ['icmpv6', '41', '43', '44', '58', '59', '60']
):
return True
else:
return False
@ -282,8 +299,7 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
def take_action_network(self, client, parsed_args):
# Get the security group ID to hold the rule.
security_group_id = client.find_security_group(
parsed_args.group,
ignore_missing=False
parsed_args.group, ignore_missing=False
).id
# Build the create attributes.
@ -302,24 +318,31 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
# NOTE(rtheis): Use ethertype specified else default based
# on IP protocol.
attrs['ethertype'] = self._get_ethertype(parsed_args,
attrs['protocol'])
attrs['ethertype'] = self._get_ethertype(
parsed_args, attrs['protocol']
)
# NOTE(rtheis): Validate the port range and ICMP type and code.
# It would be ideal if argparse could do this.
if parsed_args.dst_port and (parsed_args.icmp_type or
parsed_args.icmp_code):
msg = _('Argument --dst-port not allowed with arguments '
'--icmp-type and --icmp-code')
if parsed_args.dst_port and (
parsed_args.icmp_type or parsed_args.icmp_code
):
msg = _(
'Argument --dst-port not allowed with arguments '
'--icmp-type and --icmp-code'
)
raise exceptions.CommandError(msg)
if parsed_args.icmp_type is None and parsed_args.icmp_code is not None:
msg = _('Argument --icmp-type required with argument --icmp-code')
raise exceptions.CommandError(msg)
is_icmp_protocol = _is_icmp_protocol(attrs['protocol'])
if not is_icmp_protocol and (parsed_args.icmp_type or
parsed_args.icmp_code):
msg = _('ICMP IP protocol required with arguments '
'--icmp-type and --icmp-code')
if not is_icmp_protocol and (
parsed_args.icmp_type or parsed_args.icmp_code
):
msg = _(
'ICMP IP protocol required with arguments '
'--icmp-type and --icmp-code'
)
raise exceptions.CommandError(msg)
# NOTE(rtheis): For backwards compatibility, continue ignoring
# the destination port range when an ICMP IP protocol is specified.
@ -333,13 +356,11 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
if parsed_args.remote_group is not None:
attrs['remote_group_id'] = client.find_security_group(
parsed_args.remote_group,
ignore_missing=False
parsed_args.remote_group, ignore_missing=False
).id
elif parsed_args.remote_address_group is not None:
attrs['remote_address_group_id'] = client.find_address_group(
parsed_args.remote_address_group,
ignore_missing=False
parsed_args.remote_address_group, ignore_missing=False
).id
elif parsed_args.remote_ip is not None:
attrs['remote_ip_prefix'] = parsed_args.remote_ip
@ -358,7 +379,8 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne,
attrs['project_id'] = project_id
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
# Create and show the security group rule.
obj = client.create_security_group_rule(**attrs)
@ -407,13 +429,12 @@ class DeleteSecurityGroupRule(common.NetworkAndComputeDelete):
'rule',
metavar='<rule>',
nargs="+",
help=_("Security group rule(s) to delete (ID only)")
help=_("Security group rule(s) to delete (ID only)"),
)
return parser
def take_action_network(self, client, parsed_args):
obj = client.find_security_group_rule(
self.r, ignore_missing=False)
obj = client.find_security_group_rule(self.r, ignore_missing=False)
client.delete_security_group_rule(obj)
def take_action_compute(self, client, parsed_args):
@ -439,7 +460,7 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
'group',
metavar='<group>',
nargs='?',
help=_("List all rules in this security group (name or ID)")
help=_("List all rules in this security group (name or ID)"),
)
return parser
@ -451,7 +472,7 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
'--all-projects',
action='store_true',
default=False,
help=argparse.SUPPRESS
help=argparse.SUPPRESS,
)
parser.add_argument(
@ -459,38 +480,46 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
metavar='<protocol>',
type=_convert_to_lowercase,
help=self.enhance_help_neutron(
_("List rules by the IP protocol (ah, dhcp, egp, esp, gre, "
"icmp, igmp, ipv6-encap, ipv6-frag, ipv6-icmp, ipv6-nonxt, "
"ipv6-opts, ipv6-route, ospf, pgm, rsvp, sctp, tcp, udp, "
"udplite, vrrp and integer representations [0-255] or any; "
"default: any (all protocols))"))
_(
"List rules by the IP protocol (ah, dhcp, egp, esp, gre, "
"icmp, igmp, ipv6-encap, ipv6-frag, ipv6-icmp, "
"ipv6-nonxt, ipv6-opts, ipv6-route, ospf, pgm, rsvp, "
"sctp, tcp, udp, udplite, vrrp and integer "
"representations [0-255] or any; "
"default: any (all protocols))"
)
),
)
parser.add_argument(
'--ethertype',
metavar='<ethertype>',
type=_convert_to_lowercase,
help=self.enhance_help_neutron(
_("List rules by the Ethertype (IPv4 or IPv6)"))
_("List rules by the Ethertype (IPv4 or IPv6)")
),
)
direction_group = parser.add_mutually_exclusive_group()
direction_group.add_argument(
'--ingress',
action='store_true',
help=self.enhance_help_neutron(
_("List rules applied to incoming network traffic"))
_("List rules applied to incoming network traffic")
),
)
direction_group.add_argument(
'--egress',
action='store_true',
help=self.enhance_help_neutron(
_("List rules applied to outgoing network traffic"))
_("List rules applied to outgoing network traffic")
),
)
parser.add_argument(
'--long',
action='store_true',
default=False,
help=self.enhance_help_neutron(
_("**Deprecated** This argument is no longer needed"))
_("**Deprecated** This argument is no longer needed")
),
)
return parser
@ -500,7 +529,8 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
action='store_true',
default=False,
help=self.enhance_help_nova_network(
_("Display information from all projects (admin only)"))
_("Display information from all projects (admin only)")
),
)
if not self.is_docs_build:
# Accept but hide the argument for consistency with network.
@ -509,7 +539,7 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
'--long',
action='store_false',
default=False,
help=argparse.SUPPRESS
help=argparse.SUPPRESS,
)
return parser
@ -531,9 +561,10 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
def take_action_network(self, client, parsed_args):
if parsed_args.long:
self.log.warning(_(
msg = _(
"The --long option has been deprecated and is no longer needed"
))
)
self.log.warning(msg)
column_headers = self._get_column_headers(parsed_args)
columns = (
@ -554,8 +585,7 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
# does not contain security group rules resources. So use
# the security group ID in a query to get the resources.
security_group_id = client.find_security_group(
parsed_args.group,
ignore_missing=False
parsed_args.group, ignore_missing=False
).id
query = {'security_group_id': security_group_id}
else:
@ -573,10 +603,16 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
for r in client.security_group_rules(**query)
]
return (column_headers,
(utils.get_dict_properties(
s, columns,
) for s in rules))
return (
column_headers,
(
utils.get_dict_properties(
s,
columns,
)
for s in rules
),
)
def take_action_compute(self, client, parsed_args):
column_headers = self._get_column_headers(parsed_args)
@ -612,10 +648,16 @@ class ListSecurityGroupRule(common.NetworkAndComputeLister):
# network_utils.transform_compute_security_group_rule(rule),
# ))
return (column_headers,
(utils.get_dict_properties(
s, columns,
) for s in rules))
return (
column_headers,
(
utils.get_dict_properties(
s,
columns,
)
for s in rules
),
)
class ShowSecurityGroupRule(common.NetworkAndComputeShowOne):
@ -625,13 +667,14 @@ class ShowSecurityGroupRule(common.NetworkAndComputeShowOne):
parser.add_argument(
'rule',
metavar="<rule>",
help=_("Security group rule to display (ID only)")
help=_("Security group rule to display (ID only)"),
)
return parser
def take_action_network(self, client, parsed_args):
obj = client.find_security_group_rule(parsed_args.rule,
ignore_missing=False)
obj = client.find_security_group_rule(
parsed_args.rule, ignore_missing=False
)
# necessary for old rules that have None in this field
if not obj['remote_ip_prefix']:
obj['remote_ip_prefix'] = _format_remote_ip_prefix(obj)
@ -654,8 +697,10 @@ class ShowSecurityGroupRule(common.NetworkAndComputeShowOne):
break
if obj is None:
msg = _("Could not find security group rule "
"with ID '%s'") % parsed_args.rule
msg = (
_("Could not find security group rule " "with ID '%s'")
% parsed_args.rule
)
raise exceptions.CommandError(msg)
# NOTE(rtheis): Format security group rule

View File

@ -36,16 +36,19 @@ def _update_arguments(obj_list, parsed_args_list, option):
try:
obj_list.remove(item)
except ValueError:
msg = (_("Subnet does not contain %(option)s %(value)s") %
{'option': option, 'value': item})
msg = _("Subnet does not contain %(option)s %(value)s") % {
'option': option,
'value': item,
}
raise exceptions.CommandError(msg)
class AllocationPoolsColumn(cliff_columns.FormattableColumn):
def human_readable(self):
pool_formatted = ['%s-%s' % (pool.get('start', ''),
pool.get('end', ''))
for pool in self._value]
pool_formatted = [
'%s-%s' % (pool.get('start', ''), pool.get('end', ''))
for pool in self._value
]
return ','.join(pool_formatted)
@ -53,7 +56,8 @@ class HostRoutesColumn(cliff_columns.FormattableColumn):
def human_readable(self):
# Map the host route keys to match --host-route option.
return utils.format_list_of_dicts(
convert_entries_to_gateway(self._value))
convert_entries_to_gateway(self._value)
)
_formatters = {
@ -72,34 +76,42 @@ def _get_common_parse_arguments(parser, is_create=True):
dest='allocation_pools',
action=parseractions.MultiKeyValueAction,
required_keys=['start', 'end'],
help=_("Allocation pool IP addresses for this subnet "
"e.g.: start=192.168.199.2,end=192.168.199.254 "
"(repeat option to add multiple IP addresses)")
help=_(
"Allocation pool IP addresses for this subnet "
"e.g.: start=192.168.199.2,end=192.168.199.254 "
"(repeat option to add multiple IP addresses)"
),
)
if not is_create:
parser.add_argument(
'--no-allocation-pool',
action='store_true',
help=_("Clear associated allocation-pools from the subnet. "
"Specify both --allocation-pool and --no-allocation-pool "
"to overwrite the current allocation pool information.")
help=_(
"Clear associated allocation-pools from the subnet. "
"Specify both --allocation-pool and --no-allocation-pool "
"to overwrite the current allocation pool information."
),
)
parser.add_argument(
'--dns-nameserver',
metavar='<dns-nameserver>',
action='append',
dest='dns_nameservers',
help=_("DNS server for this subnet "
"(repeat option to set multiple DNS servers)")
help=_(
"DNS server for this subnet "
"(repeat option to set multiple DNS servers)"
),
)
if not is_create:
parser.add_argument(
'--no-dns-nameservers',
action='store_true',
help=_("Clear existing information of DNS Nameservers. "
"Specify both --dns-nameserver and --no-dns-nameserver "
"to overwrite the current DNS Nameserver information.")
help=_(
"Clear existing information of DNS Nameservers. "
"Specify both --dns-nameserver and --no-dns-nameserver "
"to overwrite the current DNS Nameserver information."
),
)
parser.add_argument(
'--host-route',
@ -107,29 +119,35 @@ def _get_common_parse_arguments(parser, is_create=True):
dest='host_routes',
action=parseractions.MultiKeyValueAction,
required_keys=['destination', 'gateway'],
help=_("Additional route for this subnet "
"e.g.: destination=10.10.0.0/16,gateway=192.168.71.254 "
"destination: destination subnet (in CIDR notation) "
"gateway: nexthop IP address "
"(repeat option to add multiple routes)")
help=_(
"Additional route for this subnet "
"e.g.: destination=10.10.0.0/16,gateway=192.168.71.254 "
"destination: destination subnet (in CIDR notation) "
"gateway: nexthop IP address "
"(repeat option to add multiple routes)"
),
)
if not is_create:
parser.add_argument(
'--no-host-route',
action='store_true',
help=_("Clear associated host-routes from the subnet. "
"Specify both --host-route and --no-host-route "
"to overwrite the current host route information.")
help=_(
"Clear associated host-routes from the subnet. "
"Specify both --host-route and --no-host-route "
"to overwrite the current host route information."
),
)
parser.add_argument(
'--service-type',
metavar='<service-type>',
action='append',
dest='service_types',
help=_("Service type for this subnet "
"e.g.: network:floatingip_agent_gateway. "
"Must be a valid device owner value for a network port "
"(repeat option to set multiple service types)")
help=_(
"Service type for this subnet "
"e.g.: network:floatingip_agent_gateway. "
"Must be a valid device owner value for a network port "
"(repeat option to set multiple service types)"
),
)
@ -146,9 +164,7 @@ def _get_columns(item):
'tenant_id',
]
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -189,11 +205,13 @@ def _get_attrs(client_manager, parsed_args, is_create=True):
parsed_args.project_domain,
).id
attrs['project_id'] = project_id
attrs['network_id'] = client.find_network(parsed_args.network,
ignore_missing=False).id
attrs['network_id'] = client.find_network(
parsed_args.network, ignore_missing=False
).id
if parsed_args.subnet_pool is not None:
subnet_pool = client.find_subnet_pool(parsed_args.subnet_pool,
ignore_missing=False)
subnet_pool = client.find_subnet_pool(
parsed_args.subnet_pool, ignore_missing=False
)
attrs['subnetpool_id'] = subnet_pool.id
if parsed_args.use_prefix_delegation:
attrs['subnetpool_id'] = "prefix_delegation"
@ -212,21 +230,26 @@ def _get_attrs(client_manager, parsed_args, is_create=True):
if parsed_args.network_segment is not None:
attrs['segment_id'] = client.find_segment(
parsed_args.network_segment, ignore_missing=False).id
parsed_args.network_segment, ignore_missing=False
).id
if 'gateway' in parsed_args and parsed_args.gateway is not None:
gateway = parsed_args.gateway.lower()
if not is_create and gateway == 'auto':
msg = _("Auto option is not available for Subnet Set. "
"Valid options are <ip-address> or none")
msg = _(
"Auto option is not available for Subnet Set. "
"Valid options are <ip-address> or none"
)
raise exceptions.CommandError(msg)
elif gateway != 'auto':
if gateway == 'none':
attrs['gateway_ip'] = None
else:
attrs['gateway_ip'] = gateway
if ('allocation_pools' in parsed_args and
parsed_args.allocation_pools is not None):
if (
'allocation_pools' in parsed_args
and parsed_args.allocation_pools is not None
):
attrs['allocation_pools'] = parsed_args.allocation_pools
if parsed_args.dhcp:
attrs['enable_dhcp'] = True
@ -236,15 +259,20 @@ def _get_attrs(client_manager, parsed_args, is_create=True):
attrs['dns_publish_fixed_ip'] = True
if parsed_args.no_dns_publish_fixed_ip:
attrs['dns_publish_fixed_ip'] = False
if ('dns_nameservers' in parsed_args and
parsed_args.dns_nameservers is not None):
if (
'dns_nameservers' in parsed_args
and parsed_args.dns_nameservers is not None
):
attrs['dns_nameservers'] = parsed_args.dns_nameservers
if 'host_routes' in parsed_args and parsed_args.host_routes is not None:
# Change 'gateway' entry to 'nexthop' to match the API
attrs['host_routes'] = convert_entries_to_nexthop(
parsed_args.host_routes)
if ('service_types' in parsed_args and
parsed_args.service_types is not None):
parsed_args.host_routes
)
if (
'service_types' in parsed_args
and parsed_args.service_types is not None
):
attrs['service_types'] = parsed_args.service_types
if parsed_args.description is not None:
attrs['description'] = parsed_args.description
@ -259,115 +287,124 @@ class CreateSubnet(command.ShowOne, common.NeutronCommandWithExtraArgs):
def get_parser(self, prog_name):
parser = super(CreateSubnet, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar='<name>',
help=_("New subnet name")
'name', metavar='<name>', help=_("New subnet name")
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
subnet_pool_group = parser.add_mutually_exclusive_group()
subnet_pool_group.add_argument(
'--subnet-pool',
metavar='<subnet-pool>',
help=_("Subnet pool from which this subnet will obtain a CIDR "
"(Name or ID)")
help=_(
"Subnet pool from which this subnet will obtain a CIDR "
"(Name or ID)"
),
)
subnet_pool_group.add_argument(
'--use-prefix-delegation',
help=_("Use 'prefix-delegation' if IP is IPv6 format "
"and IP would be delegated externally")
help=_(
"Use 'prefix-delegation' if IP is IPv6 format "
"and IP would be delegated externally"
),
)
subnet_pool_group.add_argument(
'--use-default-subnet-pool',
action='store_true',
help=_("Use default subnet pool for --ip-version")
help=_("Use default subnet pool for --ip-version"),
)
parser.add_argument(
'--prefix-length',
metavar='<prefix-length>',
help=_("Prefix length for subnet allocation from subnet pool")
help=_("Prefix length for subnet allocation from subnet pool"),
)
parser.add_argument(
'--subnet-range',
metavar='<subnet-range>',
help=_("Subnet range in CIDR notation "
"(required if --subnet-pool is not specified, "
"optional otherwise)")
help=_(
"Subnet range in CIDR notation "
"(required if --subnet-pool is not specified, "
"optional otherwise)"
),
)
dhcp_enable_group = parser.add_mutually_exclusive_group()
dhcp_enable_group.add_argument(
'--dhcp',
action='store_true',
help=_("Enable DHCP (default)")
'--dhcp', action='store_true', help=_("Enable DHCP (default)")
)
dhcp_enable_group.add_argument(
'--no-dhcp',
action='store_true',
help=_("Disable DHCP")
'--no-dhcp', action='store_true', help=_("Disable DHCP")
)
dns_publish_fixed_ip_group = parser.add_mutually_exclusive_group()
dns_publish_fixed_ip_group.add_argument(
'--dns-publish-fixed-ip',
action='store_true',
help=_("Enable publishing fixed IPs in DNS")
help=_("Enable publishing fixed IPs in DNS"),
)
dns_publish_fixed_ip_group.add_argument(
'--no-dns-publish-fixed-ip',
action='store_true',
help=_("Disable publishing fixed IPs in DNS (default)")
help=_("Disable publishing fixed IPs in DNS (default)"),
)
parser.add_argument(
'--gateway',
metavar='<gateway>',
default='auto',
help=_("Specify a gateway for the subnet. The three options are: "
"<ip-address>: Specific IP address to use as the gateway, "
"'auto': Gateway address should automatically be chosen "
"from within the subnet itself, 'none': This subnet will "
"not use a gateway, e.g.: --gateway 192.168.9.1, "
"--gateway auto, --gateway none (default is 'auto').")
help=_(
"Specify a gateway for the subnet. The three options are: "
"<ip-address>: Specific IP address to use as the gateway, "
"'auto': Gateway address should automatically be chosen "
"from within the subnet itself, 'none': This subnet will "
"not use a gateway, e.g.: --gateway 192.168.9.1, "
"--gateway auto, --gateway none (default is 'auto')."
),
)
parser.add_argument(
'--ip-version',
type=int,
default=4,
choices=[4, 6],
help=_("IP version (default is 4). Note that when subnet pool is "
"specified, IP version is determined from the subnet pool "
"and this option is ignored.")
help=_(
"IP version (default is 4). Note that when subnet pool is "
"specified, IP version is determined from the subnet pool "
"and this option is ignored."
),
)
parser.add_argument(
'--ipv6-ra-mode',
choices=['dhcpv6-stateful', 'dhcpv6-stateless', 'slaac'],
help=_("IPv6 RA (Router Advertisement) mode, "
"valid modes: [dhcpv6-stateful, dhcpv6-stateless, slaac]")
help=_(
"IPv6 RA (Router Advertisement) mode, "
"valid modes: [dhcpv6-stateful, dhcpv6-stateless, slaac]"
),
)
parser.add_argument(
'--ipv6-address-mode',
choices=['dhcpv6-stateful', 'dhcpv6-stateless', 'slaac'],
help=_("IPv6 address mode, "
"valid modes: [dhcpv6-stateful, dhcpv6-stateless, slaac]")
help=_(
"IPv6 address mode, "
"valid modes: [dhcpv6-stateful, dhcpv6-stateless, slaac]"
),
)
parser.add_argument(
'--network-segment',
metavar='<network-segment>',
help=_("Network segment to associate with this subnet "
"(name or ID)")
help=_(
"Network segment to associate with this subnet " "(name or ID)"
),
)
parser.add_argument(
'--network',
required=True,
metavar='<network>',
help=_("Network this subnet belongs to (name or ID)")
help=_("Network this subnet belongs to (name or ID)"),
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("Set subnet description")
help=_("Set subnet description"),
)
_get_common_parse_arguments(parser)
_tag.add_tag_option_to_parser_for_create(parser, _('subnet'))
@ -377,7 +414,8 @@ class CreateSubnet(command.ShowOne, common.NeutronCommandWithExtraArgs):
client = self.app.client_manager.network
attrs = _get_attrs(self.app.client_manager, parsed_args)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_subnet(**attrs)
# tags cannot be set when created, so tags need to be set later.
_tag.update_tags_for_set(client, obj, parsed_args)
@ -395,7 +433,7 @@ class DeleteSubnet(command.Command):
'subnet',
metavar="<subnet>",
nargs='+',
help=_("Subnet(s) to delete (name or ID)")
help=_("Subnet(s) to delete (name or ID)"),
)
return parser
@ -409,14 +447,20 @@ class DeleteSubnet(command.Command):
client.delete_subnet(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete subnet with "
"name or ID '%(subnet)s': %(e)s"),
{'subnet': subnet, 'e': e})
LOG.error(
_(
"Failed to delete subnet with "
"name or ID '%(subnet)s': %(e)s"
),
{'subnet': subnet, 'e': e},
)
if result > 0:
total = len(parsed_args.subnet)
msg = (_("%(result)s of %(total)s subnets failed "
"to delete.") % {'result': result, 'total': total})
msg = _("%(result)s of %(total)s subnets failed " "to delete.") % {
'result': result,
'total': total,
}
raise exceptions.CommandError(msg)
@ -431,7 +475,7 @@ class ListSubnet(command.Lister):
'--long',
action='store_true',
default=False,
help=_("List additional fields in output")
help=_("List additional fields in output"),
)
parser.add_argument(
'--ip-version',
@ -439,65 +483,77 @@ class ListSubnet(command.Lister):
choices=[4, 6],
metavar='<ip-version>',
dest='ip_version',
help=_("List only subnets of given IP version in output. "
"Allowed values for IP version are 4 and 6."),
help=_(
"List only subnets of given IP version in output. "
"Allowed values for IP version are 4 and 6."
),
)
dhcp_enable_group = parser.add_mutually_exclusive_group()
dhcp_enable_group.add_argument(
'--dhcp',
action='store_true',
help=_("List subnets which have DHCP enabled")
help=_("List subnets which have DHCP enabled"),
)
dhcp_enable_group.add_argument(
'--no-dhcp',
action='store_true',
help=_("List subnets which have DHCP disabled")
help=_("List subnets which have DHCP disabled"),
)
parser.add_argument(
'--service-type',
metavar='<service-type>',
action='append',
dest='service_types',
help=_("List only subnets of a given service type in output "
"e.g.: network:floatingip_agent_gateway. "
"Must be a valid device owner value for a network port "
"(repeat option to list multiple service types)")
help=_(
"List only subnets of a given service type in output "
"e.g.: network:floatingip_agent_gateway. "
"Must be a valid device owner value for a network port "
"(repeat option to list multiple service types)"
),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("List only subnets which belong to a given project "
"in output (name or ID)")
help=_(
"List only subnets which belong to a given project "
"in output (name or ID)"
),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--network',
metavar='<network>',
help=_("List only subnets which belong to a given network "
"in output (name or ID)")
help=_(
"List only subnets which belong to a given network "
"in output (name or ID)"
),
)
parser.add_argument(
'--gateway',
metavar='<gateway>',
help=_("List only subnets of given gateway IP in output")
help=_("List only subnets of given gateway IP in output"),
)
parser.add_argument(
'--name',
metavar='<name>',
help=_("List only subnets of given name in output")
help=_("List only subnets of given name in output"),
)
parser.add_argument(
'--subnet-range',
metavar='<subnet-range>',
help=_("List only subnets of given subnet range "
"(in CIDR notation) in output "
"e.g.: --subnet-range 10.10.0.0/16")
help=_(
"List only subnets of given subnet range "
"(in CIDR notation) in output "
"e.g.: --subnet-range 10.10.0.0/16"
),
)
parser.add_argument(
'--subnet-pool',
metavar='<subnet-pool>',
help=_("List only subnets which belong to a given subnet pool "
"in output (Name or ID)")
help=_(
"List only subnets which belong to a given subnet pool "
"in output (Name or ID)"
),
)
_tag.add_tag_filtering_option_to_parser(parser, _('subnets'))
return parser
@ -524,8 +580,9 @@ class ListSubnet(command.Lister):
).id
filters['project_id'] = project_id
if parsed_args.network:
network_id = network_client.find_network(parsed_args.network,
ignore_missing=False).id
network_id = network_client.find_network(
parsed_args.network, ignore_missing=False
).id
filters['network_id'] = network_id
if parsed_args.gateway:
filters['gateway_ip'] = parsed_args.gateway
@ -535,7 +592,8 @@ class ListSubnet(command.Lister):
filters['cidr'] = parsed_args.subnet_range
if parsed_args.subnet_pool:
subnetpool_id = network_client.find_subnet_pool(
parsed_args.subnet_pool, ignore_missing=False).id
parsed_args.subnet_pool, ignore_missing=False
).id
filters['subnetpool_id'] = subnetpool_id
_tag.get_tag_filtering_args(parsed_args, filters)
data = network_client.subnets(**filters)
@ -543,18 +601,40 @@ class ListSubnet(command.Lister):
headers = ('ID', 'Name', 'Network', 'Subnet')
columns = ('id', 'name', 'network_id', 'cidr')
if parsed_args.long:
headers += ('Project', 'DHCP', 'Name Servers',
'Allocation Pools', 'Host Routes', 'IP Version',
'Gateway', 'Service Types', 'Tags')
columns += ('project_id', 'is_dhcp_enabled', 'dns_nameservers',
'allocation_pools', 'host_routes', 'ip_version',
'gateway_ip', 'service_types', 'tags')
headers += (
'Project',
'DHCP',
'Name Servers',
'Allocation Pools',
'Host Routes',
'IP Version',
'Gateway',
'Service Types',
'Tags',
)
columns += (
'project_id',
'is_dhcp_enabled',
'dns_nameservers',
'allocation_pools',
'host_routes',
'ip_version',
'gateway_ip',
'service_types',
'tags',
)
return (headers,
(utils.get_item_properties(
s, columns,
return (
headers,
(
utils.get_item_properties(
s,
columns,
formatters=_formatters,
) for s in data))
)
for s in data
),
)
# TODO(abhiraut): Use the SDK resource mapped attribute names once the
@ -567,56 +647,53 @@ class SetSubnet(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'subnet',
metavar="<subnet>",
help=_("Subnet to modify (name or ID)")
help=_("Subnet to modify (name or ID)"),
)
parser.add_argument(
'--name',
metavar='<name>',
help=_("Updated name of the subnet")
'--name', metavar='<name>', help=_("Updated name of the subnet")
)
dhcp_enable_group = parser.add_mutually_exclusive_group()
dhcp_enable_group.add_argument(
'--dhcp',
action='store_true',
default=None,
help=_("Enable DHCP")
'--dhcp', action='store_true', default=None, help=_("Enable DHCP")
)
dhcp_enable_group.add_argument(
'--no-dhcp',
action='store_true',
help=_("Disable DHCP")
'--no-dhcp', action='store_true', help=_("Disable DHCP")
)
dns_publish_fixed_ip_group = parser.add_mutually_exclusive_group()
dns_publish_fixed_ip_group.add_argument(
'--dns-publish-fixed-ip',
action='store_true',
help=_("Enable publishing fixed IPs in DNS")
help=_("Enable publishing fixed IPs in DNS"),
)
dns_publish_fixed_ip_group.add_argument(
'--no-dns-publish-fixed-ip',
action='store_true',
help=_("Disable publishing fixed IPs in DNS")
help=_("Disable publishing fixed IPs in DNS"),
)
parser.add_argument(
'--gateway',
metavar='<gateway>',
help=_("Specify a gateway for the subnet. The options are: "
"<ip-address>: Specific IP address to use as the gateway, "
"'none': This subnet will not use a gateway, "
"e.g.: --gateway 192.168.9.1, --gateway none.")
help=_(
"Specify a gateway for the subnet. The options are: "
"<ip-address>: Specific IP address to use as the gateway, "
"'none': This subnet will not use a gateway, "
"e.g.: --gateway 192.168.9.1, --gateway none."
),
)
parser.add_argument(
'--network-segment',
metavar='<network-segment>',
help=_("Network segment to associate with this subnet (name or "
"ID). It is only allowed to set the segment if the current "
"value is `None`, the network must also have only one "
"segment and only one subnet can exist on the network.")
help=_(
"Network segment to associate with this subnet (name or "
"ID). It is only allowed to set the segment if the current "
"value is `None`, the network must also have only one "
"segment and only one subnet can exist on the network."
),
)
parser.add_argument(
'--description',
metavar='<description>',
help=_("Set subnet description")
help=_("Set subnet description"),
)
_tag.add_tag_option_to_parser_for_set(parser, _('subnet'))
_get_common_parse_arguments(parser, is_create=False)
@ -625,8 +702,9 @@ class SetSubnet(common.NeutronCommandWithExtraArgs):
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_subnet(parsed_args.subnet, ignore_missing=False)
attrs = _get_attrs(self.app.client_manager, parsed_args,
is_create=False)
attrs = _get_attrs(
self.app.client_manager, parsed_args, is_create=False
)
if 'dns_nameservers' in attrs:
if not parsed_args.no_dns_nameservers:
attrs['dns_nameservers'] += obj.dns_nameservers
@ -645,7 +723,8 @@ class SetSubnet(common.NeutronCommandWithExtraArgs):
if 'service_types' in attrs:
attrs['service_types'] += obj.service_types
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
client.update_subnet(obj, **attrs)
# tags is a subresource and it needs to be updated separately.
@ -661,13 +740,14 @@ class ShowSubnet(command.ShowOne):
parser.add_argument(
'subnet',
metavar="<subnet>",
help=_("Subnet to display (name or ID)")
help=_("Subnet to display (name or ID)"),
)
return parser
def take_action(self, parsed_args):
obj = self.app.client_manager.network.find_subnet(parsed_args.subnet,
ignore_missing=False)
obj = self.app.client_manager.network.find_subnet(
parsed_args.subnet, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters=_formatters)
return (display_columns, data)
@ -684,22 +764,26 @@ class UnsetSubnet(common.NeutronUnsetCommandWithExtraArgs):
dest='allocation_pools',
action=parseractions.MultiKeyValueAction,
required_keys=['start', 'end'],
help=_('Allocation pool IP addresses to be removed from this '
'subnet e.g.: start=192.168.199.2,end=192.168.199.254 '
'(repeat option to unset multiple allocation pools)')
help=_(
'Allocation pool IP addresses to be removed from this '
'subnet e.g.: start=192.168.199.2,end=192.168.199.254 '
'(repeat option to unset multiple allocation pools)'
),
)
parser.add_argument(
'--gateway',
action='store_true',
help=_("Remove gateway IP from this subnet")
help=_("Remove gateway IP from this subnet"),
)
parser.add_argument(
'--dns-nameserver',
metavar='<dns-nameserver>',
action='append',
dest='dns_nameservers',
help=_('DNS server to be removed from this subnet '
'(repeat option to unset multiple DNS servers)')
help=_(
'DNS server to be removed from this subnet '
'(repeat option to unset multiple DNS servers)'
),
)
parser.add_argument(
'--host-route',
@ -707,27 +791,31 @@ class UnsetSubnet(common.NeutronUnsetCommandWithExtraArgs):
dest='host_routes',
action=parseractions.MultiKeyValueAction,
required_keys=['destination', 'gateway'],
help=_('Route to be removed from this subnet '
'e.g.: destination=10.10.0.0/16,gateway=192.168.71.254 '
'destination: destination subnet (in CIDR notation) '
'gateway: nexthop IP address '
'(repeat option to unset multiple host routes)')
help=_(
'Route to be removed from this subnet '
'e.g.: destination=10.10.0.0/16,gateway=192.168.71.254 '
'destination: destination subnet (in CIDR notation) '
'gateway: nexthop IP address '
'(repeat option to unset multiple host routes)'
),
)
parser.add_argument(
'--service-type',
metavar='<service-type>',
action='append',
dest='service_types',
help=_('Service type to be removed from this subnet '
'e.g.: network:floatingip_agent_gateway. '
'Must be a valid device owner value for a network port '
'(repeat option to unset multiple service types)')
help=_(
'Service type to be removed from this subnet '
'e.g.: network:floatingip_agent_gateway. '
'Must be a valid device owner value for a network port '
'(repeat option to unset multiple service types)'
),
)
_tag.add_tag_option_to_parser_for_unset(parser, _('subnet'))
parser.add_argument(
'subnet',
metavar="<subnet>",
help=_("Subnet to modify (name or ID)")
help=_("Subnet to modify (name or ID)"),
)
return parser
@ -740,28 +828,36 @@ class UnsetSubnet(common.NeutronUnsetCommandWithExtraArgs):
attrs['gateway_ip'] = None
if parsed_args.dns_nameservers:
attrs['dns_nameservers'] = copy.deepcopy(obj.dns_nameservers)
_update_arguments(attrs['dns_nameservers'],
parsed_args.dns_nameservers,
'dns-nameserver')
_update_arguments(
attrs['dns_nameservers'],
parsed_args.dns_nameservers,
'dns-nameserver',
)
if parsed_args.host_routes:
attrs['host_routes'] = copy.deepcopy(obj.host_routes)
_update_arguments(
attrs['host_routes'],
convert_entries_to_nexthop(parsed_args.host_routes),
'host-route')
'host-route',
)
if parsed_args.allocation_pools:
attrs['allocation_pools'] = copy.deepcopy(obj.allocation_pools)
_update_arguments(attrs['allocation_pools'],
parsed_args.allocation_pools,
'allocation-pool')
_update_arguments(
attrs['allocation_pools'],
parsed_args.allocation_pools,
'allocation-pool',
)
if parsed_args.service_types:
attrs['service_types'] = copy.deepcopy(obj.service_types)
_update_arguments(attrs['service_types'],
parsed_args.service_types,
'service-type')
_update_arguments(
attrs['service_types'],
parsed_args.service_types,
'service-type',
)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
client.update_subnet(obj, **attrs)

View File

@ -39,9 +39,7 @@ def _get_columns(item):
}
hidden_columns = ['location', 'tenant_id']
return utils.get_osc_show_columns_for_sdk_resource(
item,
column_map,
hidden_columns
item, column_map, hidden_columns
)
@ -68,7 +66,8 @@ def _get_attrs(client_manager, parsed_args):
if parsed_args.address_scope is not None:
attrs['address_scope_id'] = network_client.find_address_scope(
parsed_args.address_scope, ignore_missing=False).id
parsed_args.address_scope, ignore_missing=False
).id
if 'no_address_scope' in parsed_args and parsed_args.no_address_scope:
attrs['address_scope_id'] = None
@ -108,29 +107,31 @@ def _add_prefix_options(parser, for_create=False):
dest='prefixes',
action='append',
required=for_create,
help=_("Set subnet pool prefixes (in CIDR notation) "
"(repeat option to set multiple prefixes)")
help=_(
"Set subnet pool prefixes (in CIDR notation) "
"(repeat option to set multiple prefixes)"
),
)
parser.add_argument(
'--default-prefix-length',
metavar='<default-prefix-length>',
type=int,
action=parseractions.NonNegativeAction,
help=_("Set subnet pool default prefix length")
help=_("Set subnet pool default prefix length"),
)
parser.add_argument(
'--min-prefix-length',
metavar='<min-prefix-length>',
action=parseractions.NonNegativeAction,
type=int,
help=_("Set subnet pool minimum prefix length")
help=_("Set subnet pool minimum prefix length"),
)
parser.add_argument(
'--max-prefix-length',
metavar='<max-prefix-length>',
type=int,
action=parseractions.NonNegativeAction,
help=_("Set subnet pool maximum prefix length")
help=_("Set subnet pool maximum prefix length"),
)
@ -156,23 +157,23 @@ class CreateSubnetPool(command.ShowOne, common.NeutronCommandWithExtraArgs):
def get_parser(self, prog_name):
parser = super(CreateSubnetPool, self).get_parser(prog_name)
parser.add_argument(
'name',
metavar='<name>',
help=_("Name of the new subnet pool")
'name', metavar='<name>', help=_("Name of the new subnet pool")
)
_add_prefix_options(parser, for_create=True)
parser.add_argument(
'--project',
metavar='<project>',
help=_("Owner's project (name or ID)")
help=_("Owner's project (name or ID)"),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--address-scope',
metavar='<address-scope>',
help=_("Set address scope associated with the subnet pool "
"(name or ID), prefixes must be unique across address "
"scopes")
help=_(
"Set address scope associated with the subnet pool "
"(name or ID), prefixes must be unique across address "
"scopes"
),
)
_add_default_options(parser)
shared_group = parser.add_mutually_exclusive_group()
@ -189,15 +190,18 @@ class CreateSubnetPool(command.ShowOne, common.NeutronCommandWithExtraArgs):
parser.add_argument(
'--description',
metavar='<description>',
help=_("Set subnet pool description")
help=_("Set subnet pool description"),
)
parser.add_argument(
'--default-quota',
type=int,
metavar='<num-ip-addresses>',
help=_("Set default per-project quota for this subnet pool "
"as the number of IP addresses that can be allocated "
"from the subnet pool")),
help=_(
"Set default per-project quota for this subnet pool "
"as the number of IP addresses that can be allocated "
"from the subnet pool"
),
),
_tag.add_tag_option_to_parser_for_create(parser, _('subnet pool'))
return parser
@ -208,7 +212,8 @@ class CreateSubnetPool(command.ShowOne, common.NeutronCommandWithExtraArgs):
if "prefixes" not in attrs:
attrs['prefixes'] = []
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
obj = client.create_subnet_pool(**attrs)
# tags cannot be set when created, so tags need to be set later.
_tag.update_tags_for_set(client, obj, parsed_args)
@ -226,7 +231,7 @@ class DeleteSubnetPool(command.Command):
'subnet_pool',
metavar='<subnet-pool>',
nargs='+',
help=_("Subnet pool(s) to delete (name or ID)")
help=_("Subnet pool(s) to delete (name or ID)"),
)
return parser
@ -240,14 +245,19 @@ class DeleteSubnetPool(command.Command):
client.delete_subnet_pool(obj)
except Exception as e:
result += 1
LOG.error(_("Failed to delete subnet pool with "
"name or ID '%(pool)s': %(e)s"),
{'pool': pool, 'e': e})
LOG.error(
_(
"Failed to delete subnet pool with "
"name or ID '%(pool)s': %(e)s"
),
{'pool': pool, 'e': e},
)
if result > 0:
total = len(parsed_args.subnet_pool)
msg = (_("%(result)s of %(total)s subnet pools failed "
"to delete.") % {'result': result, 'total': total})
msg = _(
"%(result)s of %(total)s subnet pools failed " "to delete."
) % {'result': result, 'total': total}
raise exceptions.CommandError(msg)
@ -262,7 +272,7 @@ class ListSubnetPool(command.Lister):
'--long',
action='store_true',
default=False,
help=_("List additional fields in output")
help=_("List additional fields in output"),
)
shared_group = parser.add_mutually_exclusive_group()
shared_group.add_argument(
@ -279,31 +289,38 @@ class ListSubnetPool(command.Lister):
default_group.add_argument(
'--default',
action='store_true',
help=_("List subnet pools used as the default external "
"subnet pool"),
help=_(
"List subnet pools used as the default external " "subnet pool"
),
)
default_group.add_argument(
'--no-default',
action='store_true',
help=_("List subnet pools not used as the default external "
"subnet pool")
help=_(
"List subnet pools not used as the default external "
"subnet pool"
),
)
parser.add_argument(
'--project',
metavar='<project>',
help=_("List subnet pools according to their project (name or ID)")
help=_(
"List subnet pools according to their project (name or ID)"
),
)
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--name',
metavar='<name>',
help=_("List only subnet pools of given name in output")
help=_("List only subnet pools of given name in output"),
)
parser.add_argument(
'--address-scope',
metavar='<address-scope>',
help=_("List only subnet pools of given address scope "
"in output (name or ID)")
help=_(
"List only subnet pools of given address scope "
"in output (name or ID)"
),
)
_tag.add_tag_filtering_option_to_parser(parser, _('subnet pools'))
return parser
@ -333,8 +350,8 @@ class ListSubnetPool(command.Lister):
filters['name'] = parsed_args.name
if parsed_args.address_scope:
address_scope = network_client.find_address_scope(
parsed_args.address_scope,
ignore_missing=False)
parsed_args.address_scope, ignore_missing=False
)
filters['address_scope_id'] = address_scope.id
_tag.get_tag_filtering_args(parsed_args, filters)
data = network_client.subnet_pools(**filters)
@ -342,16 +359,32 @@ class ListSubnetPool(command.Lister):
headers = ('ID', 'Name', 'Prefixes')
columns = ('id', 'name', 'prefixes')
if parsed_args.long:
headers += ('Default Prefix Length', 'Address Scope',
'Default Subnet Pool', 'Shared', 'Tags')
columns += ('default_prefix_length', 'address_scope_id',
'is_default', 'is_shared', 'tags')
headers += (
'Default Prefix Length',
'Address Scope',
'Default Subnet Pool',
'Shared',
'Tags',
)
columns += (
'default_prefix_length',
'address_scope_id',
'is_default',
'is_shared',
'tags',
)
return (headers,
(utils.get_item_properties(
s, columns,
return (
headers,
(
utils.get_item_properties(
s,
columns,
formatters=_formatters,
) for s in data))
)
for s in data
),
)
# TODO(rtheis): Use the SDK resource mapped attribute names once the
@ -364,48 +397,52 @@ class SetSubnetPool(common.NeutronCommandWithExtraArgs):
parser.add_argument(
'subnet_pool',
metavar='<subnet-pool>',
help=_("Subnet pool to modify (name or ID)")
help=_("Subnet pool to modify (name or ID)"),
)
parser.add_argument(
'--name',
metavar='<name>',
help=_("Set subnet pool name")
'--name', metavar='<name>', help=_("Set subnet pool name")
)
_add_prefix_options(parser)
address_scope_group = parser.add_mutually_exclusive_group()
address_scope_group.add_argument(
'--address-scope',
metavar='<address-scope>',
help=_("Set address scope associated with the subnet pool "
"(name or ID), prefixes must be unique across address "
"scopes")
help=_(
"Set address scope associated with the subnet pool "
"(name or ID), prefixes must be unique across address "
"scopes"
),
)
address_scope_group.add_argument(
'--no-address-scope',
action='store_true',
help=_("Remove address scope associated with the subnet pool")
help=_("Remove address scope associated with the subnet pool"),
)
_add_default_options(parser)
parser.add_argument(
'--description',
metavar='<description>',
help=_("Set subnet pool description")
help=_("Set subnet pool description"),
)
parser.add_argument(
'--default-quota',
type=int,
metavar='<num-ip-addresses>',
help=_("Set default per-project quota for this subnet pool "
"as the number of IP addresses that can be allocated "
"from the subnet pool")),
help=_(
"Set default per-project quota for this subnet pool "
"as the number of IP addresses that can be allocated "
"from the subnet pool"
),
),
_tag.add_tag_option_to_parser_for_set(parser, _('subnet pool'))
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_subnet_pool(parsed_args.subnet_pool,
ignore_missing=False)
obj = client.find_subnet_pool(
parsed_args.subnet_pool, ignore_missing=False
)
attrs = _get_attrs(self.app.client_manager, parsed_args)
@ -414,7 +451,8 @@ class SetSubnetPool(common.NeutronCommandWithExtraArgs):
attrs['prefixes'].extend(obj.prefixes)
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
if attrs:
client.update_subnet_pool(obj, **attrs)
@ -430,15 +468,14 @@ class ShowSubnetPool(command.ShowOne):
parser.add_argument(
'subnet_pool',
metavar='<subnet-pool>',
help=_("Subnet pool to display (name or ID)")
help=_("Subnet pool to display (name or ID)"),
)
return parser
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_subnet_pool(
parsed_args.subnet_pool,
ignore_missing=False
parsed_args.subnet_pool, ignore_missing=False
)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters=_formatters)
@ -453,7 +490,7 @@ class UnsetSubnetPool(command.Command):
parser.add_argument(
'subnet_pool',
metavar="<subnet-pool>",
help=_("Subnet pool to modify (name or ID)")
help=_("Subnet pool to modify (name or ID)"),
)
_tag.add_tag_option_to_parser_for_unset(parser, _('subnet pool'))
return parser
@ -461,6 +498,7 @@ class UnsetSubnetPool(command.Command):
def take_action(self, parsed_args):
client = self.app.client_manager.network
obj = client.find_subnet_pool(
parsed_args.subnet_pool, ignore_missing=False)
parsed_args.subnet_pool, ignore_missing=False
)
# tags is a subresource and it needs to be updated separately.
_tag.update_tags_for_unset(client, obj, parsed_args)

View File

@ -40,34 +40,43 @@ class NetworkTagTests(NetworkTests):
# Network create with no options
name1 = self._create_resource_and_tag_check('', [])
# Network create with tags
name2 = self._create_resource_and_tag_check('--tag red --tag blue',
['red', 'blue'])
name2 = self._create_resource_and_tag_check(
'--tag red --tag blue', ['red', 'blue']
)
# Network create with no tag explicitly
name3 = self._create_resource_and_tag_check('--no-tag', [])
self._set_resource_and_tag_check('set', name1, '--tag red --tag green',
['red', 'green'])
self._set_resource_and_tag_check(
'set', name1, '--tag red --tag green', ['red', 'green']
)
list_expected = ((name1, ['red', 'green']),
(name2, ['red', 'blue']),
(name3, []))
list_expected = (
(name1, ['red', 'green']),
(name2, ['red', 'blue']),
(name3, []),
)
self._list_tag_check(auth_project_id, list_expected)
self._set_resource_and_tag_check('set', name1, '--tag blue',
['red', 'green', 'blue'])
self._set_resource_and_tag_check(
'set', name1,
'set', name1, '--tag blue', ['red', 'green', 'blue']
)
self._set_resource_and_tag_check(
'set',
name1,
'--no-tag --tag yellow --tag orange --tag purple',
['yellow', 'orange', 'purple'])
self._set_resource_and_tag_check('unset', name1, '--tag yellow',
['orange', 'purple'])
['yellow', 'orange', 'purple'],
)
self._set_resource_and_tag_check(
'unset', name1, '--tag yellow', ['orange', 'purple']
)
self._set_resource_and_tag_check('unset', name1, '--all-tag', [])
self._set_resource_and_tag_check('set', name2, '--no-tag', [])
def _list_tag_check(self, project_id, expected):
cmd_output = self.openstack(
'{} list --long --project {}'.format(self.base_command,
project_id),
'{} list --long --project {}'.format(
self.base_command, project_id
),
parse_output=True,
)
for name, tags in expected:
@ -84,7 +93,8 @@ class NetworkTagTests(NetworkTests):
name = uuid.uuid4().hex
cmd_output = self._create_resource_for_tag_test(name, args)
self.addCleanup(
self.openstack, '{} delete {}'.format(self.base_command, name))
self.openstack, '{} delete {}'.format(self.base_command, name)
)
self.assertIsNotNone(cmd_output["id"])
self.assertEqual(set(expected), set(cmd_output['tags']))
return name

View File

@ -30,8 +30,7 @@ class AddressGroupTests(common.NetworkTests):
"""Test create, delete multiple"""
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'address group create ' +
name1,
'address group create ' + name1,
parse_output=True,
)
self.assertEqual(
@ -41,8 +40,7 @@ class AddressGroupTests(common.NetworkTests):
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'address group create ' +
name2,
'address group create ' + name2,
parse_output=True,
)
self.assertEqual(
@ -81,8 +79,7 @@ class AddressGroupTests(common.NetworkTests):
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'address group create ' +
name1,
'address group create ' + name1,
parse_output=True,
)
self.addCleanup(self.openstack, 'address group delete ' + name1)
@ -93,9 +90,11 @@ class AddressGroupTests(common.NetworkTests):
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'address group create ' +
'--project ' + demo_project_id +
' ' + name2,
'address group create '
+ '--project '
+ demo_project_id
+ ' '
+ name2,
parse_output=True,
)
self.addCleanup(self.openstack, 'address group delete ' + name2)
@ -115,8 +114,7 @@ class AddressGroupTests(common.NetworkTests):
# Test list --project
cmd_output = self.openstack(
'address group list ' +
'--project ' + demo_project_id,
'address group list ' + '--project ' + demo_project_id,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -125,8 +123,7 @@ class AddressGroupTests(common.NetworkTests):
# Test list --name
cmd_output = self.openstack(
'address group list ' +
'--name ' + name1,
'address group list ' + '--name ' + name1,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -138,10 +135,10 @@ class AddressGroupTests(common.NetworkTests):
name = uuid.uuid4().hex
newname = name + "_"
cmd_output = self.openstack(
'address group create ' +
'--description aaaa ' +
'--address 10.0.0.1 --address 2001::/16 ' +
name,
'address group create '
+ '--description aaaa '
+ '--address 10.0.0.1 --address 2001::/16 '
+ name,
parse_output=True,
)
self.addCleanup(self.openstack, 'address group delete ' + newname)
@ -151,18 +148,19 @@ class AddressGroupTests(common.NetworkTests):
# Test set name, description and address
raw_output = self.openstack(
'address group set ' +
'--name ' + newname + ' ' +
'--description bbbb ' +
'--address 10.0.0.2 --address 192.0.0.0/8 ' +
name,
'address group set '
+ '--name '
+ newname
+ ' '
+ '--description bbbb '
+ '--address 10.0.0.2 --address 192.0.0.0/8 '
+ name,
)
self.assertOutput('', raw_output)
# Show the updated address group
cmd_output = self.openstack(
'address group show ' +
newname,
'address group show ' + newname,
parse_output=True,
)
self.assertEqual(newname, cmd_output['name'])
@ -171,16 +169,15 @@ class AddressGroupTests(common.NetworkTests):
# Test unset address
raw_output = self.openstack(
'address group unset ' +
'--address 10.0.0.1 --address 2001::/16 ' +
'--address 10.0.0.2 --address 192.0.0.0/8 ' +
newname,
'address group unset '
+ '--address 10.0.0.1 --address 2001::/16 '
+ '--address 10.0.0.2 --address 192.0.0.0/8 '
+ newname,
)
self.assertEqual('', raw_output)
cmd_output = self.openstack(
'address group show ' +
newname,
'address group show ' + newname,
parse_output=True,
)
self.assertEqual(0, len(cmd_output['addresses']))

View File

@ -33,8 +33,7 @@ class AddressScopeTests(common.NetworkTests):
"""Test create, delete multiple"""
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'address scope create ' +
name1,
'address scope create ' + name1,
parse_output=True,
)
self.assertEqual(
@ -46,8 +45,7 @@ class AddressScopeTests(common.NetworkTests):
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'address scope create ' +
name2,
'address scope create ' + name2,
parse_output=True,
)
self.assertEqual(
@ -64,10 +62,7 @@ class AddressScopeTests(common.NetworkTests):
"""Test create defaults, list filters, delete"""
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'address scope create ' +
'--ip-version 4 ' +
'--share ' +
name1,
'address scope create ' + '--ip-version 4 ' + '--share ' + name1,
parse_output=True,
)
self.addCleanup(self.openstack, 'address scope delete ' + name1)
@ -83,10 +78,10 @@ class AddressScopeTests(common.NetworkTests):
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'address scope create ' +
'--ip-version 6 ' +
'--no-share ' +
name2,
'address scope create '
+ '--ip-version 6 '
+ '--no-share '
+ name2,
parse_output=True,
)
self.addCleanup(self.openstack, 'address scope delete ' + name2)
@ -132,10 +127,7 @@ class AddressScopeTests(common.NetworkTests):
name = uuid.uuid4().hex
newname = name + "_"
cmd_output = self.openstack(
'address scope create ' +
'--ip-version 4 ' +
'--no-share ' +
name,
'address scope create ' + '--ip-version 4 ' + '--no-share ' + name,
parse_output=True,
)
self.addCleanup(self.openstack, 'address scope delete ' + newname)
@ -150,16 +142,12 @@ class AddressScopeTests(common.NetworkTests):
self.assertFalse(cmd_output['shared'])
raw_output = self.openstack(
'address scope set ' +
'--name ' + newname +
' --share ' +
name,
'address scope set ' + '--name ' + newname + ' --share ' + name,
)
self.assertOutput('', raw_output)
cmd_output = self.openstack(
'address scope show ' +
newname,
'address scope show ' + newname,
parse_output=True,
)
self.assertEqual(

View File

@ -29,17 +29,14 @@ class FloatingIpTests(common.NetworkTests):
# Create a network for the floating ip
json_output = cls.openstack(
'network create ' +
'--external ' +
cls.EXTERNAL_NETWORK_NAME,
'network create ' + '--external ' + cls.EXTERNAL_NETWORK_NAME,
parse_output=True,
)
cls.external_network_id = json_output["id"]
# Create a private network for the port
json_output = cls.openstack(
'network create ' +
cls.PRIVATE_NETWORK_NAME,
'network create ' + cls.PRIVATE_NETWORK_NAME,
parse_output=True,
)
cls.private_network_id = json_output["id"]
@ -49,9 +46,10 @@ class FloatingIpTests(common.NetworkTests):
try:
if cls.haz_network:
del_output = cls.openstack(
'network delete ' +
cls.EXTERNAL_NETWORK_NAME + ' ' +
cls.PRIVATE_NETWORK_NAME
'network delete '
+ cls.EXTERNAL_NETWORK_NAME
+ ' '
+ cls.PRIVATE_NETWORK_NAME
)
cls.assertOutput('', del_output)
finally:
@ -76,23 +74,27 @@ class FloatingIpTests(common.NetworkTests):
# try 4 times
for i in range(4):
# Make a random subnet
subnet = ".".join(map(
str,
(random.randint(0, 223) for _ in range(3))
)) + ".0/26"
subnet = (
".".join(map(str, (random.randint(0, 223) for _ in range(3))))
+ ".0/26"
)
try:
# Create a subnet for the network
json_output = self.openstack(
'subnet create ' +
'--network ' + network_name + ' ' +
'--subnet-range ' + subnet + ' ' +
subnet_name,
'subnet create '
+ '--network '
+ network_name
+ ' '
+ '--subnet-range '
+ subnet
+ ' '
+ subnet_name,
parse_output=True,
)
self.assertIsNotNone(json_output["id"])
subnet_id = json_output["id"]
except Exception:
if (i == 3):
if i == 3:
# raise the exception at the last time
raise
pass
@ -106,15 +108,14 @@ class FloatingIpTests(common.NetworkTests):
# Subnets must exist even if not directly referenced here
ext_subnet_id = self._create_subnet(
self.EXTERNAL_NETWORK_NAME,
"ext-test-delete"
self.EXTERNAL_NETWORK_NAME, "ext-test-delete"
)
self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id)
json_output = self.openstack(
'floating ip create ' +
'--description aaaa ' +
self.EXTERNAL_NETWORK_NAME,
'floating ip create '
+ '--description aaaa '
+ self.EXTERNAL_NETWORK_NAME,
parse_output=True,
)
self.assertIsNotNone(json_output["id"])
@ -125,9 +126,9 @@ class FloatingIpTests(common.NetworkTests):
)
json_output = self.openstack(
'floating ip create ' +
'--description bbbb ' +
self.EXTERNAL_NETWORK_NAME,
'floating ip create '
+ '--description bbbb '
+ self.EXTERNAL_NETWORK_NAME,
parse_output=True,
)
self.assertIsNotNone(json_output["id"])
@ -148,15 +149,14 @@ class FloatingIpTests(common.NetworkTests):
# Subnets must exist even if not directly referenced here
ext_subnet_id = self._create_subnet(
self.EXTERNAL_NETWORK_NAME,
"ext-test-delete"
self.EXTERNAL_NETWORK_NAME, "ext-test-delete"
)
self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id)
json_output = self.openstack(
'floating ip create ' +
'--description aaaa ' +
self.EXTERNAL_NETWORK_NAME,
'floating ip create '
+ '--description aaaa '
+ self.EXTERNAL_NETWORK_NAME,
parse_output=True,
)
self.assertIsNotNone(json_output["id"])
@ -170,9 +170,9 @@ class FloatingIpTests(common.NetworkTests):
fip1 = json_output["floating_ip_address"]
json_output = self.openstack(
'floating ip create ' +
'--description bbbb ' +
self.EXTERNAL_NETWORK_NAME,
'floating ip create '
+ '--description bbbb '
+ self.EXTERNAL_NETWORK_NAME,
parse_output=True,
)
self.assertIsNotNone(json_output["id"])
@ -191,8 +191,8 @@ class FloatingIpTests(common.NetworkTests):
parse_output=True,
)
fip_map = {
item.get('ID'):
item.get('Floating IP Address') for item in json_output
item.get('ID'): item.get('Floating IP Address')
for item in json_output
}
# self.assertEqual(item_map, json_output)
self.assertIn(ip1, fip_map.keys())
@ -202,13 +202,12 @@ class FloatingIpTests(common.NetworkTests):
# Test list --long
json_output = self.openstack(
'floating ip list ' +
'--long',
'floating ip list ' + '--long',
parse_output=True,
)
fip_map = {
item.get('ID'):
item.get('Floating IP Address') for item in json_output
item.get('ID'): item.get('Floating IP Address')
for item in json_output
}
self.assertIn(ip1, fip_map.keys())
self.assertIn(ip2, fip_map.keys())
@ -223,8 +222,7 @@ class FloatingIpTests(common.NetworkTests):
# TODO(dtroyer): add more filter tests
json_output = self.openstack(
'floating ip show ' +
ip1,
'floating ip show ' + ip1,
parse_output=True,
)
self.assertIsNotNone(json_output["id"])
@ -247,13 +245,11 @@ class FloatingIpTests(common.NetworkTests):
# Subnets must exist even if not directly referenced here
ext_subnet_id = self._create_subnet(
self.EXTERNAL_NETWORK_NAME,
"ext-test-delete"
self.EXTERNAL_NETWORK_NAME, "ext-test-delete"
)
self.addCleanup(self.openstack, 'subnet delete ' + ext_subnet_id)
priv_subnet_id = self._create_subnet(
self.PRIVATE_NETWORK_NAME,
"priv-test-delete"
self.PRIVATE_NETWORK_NAME, "priv-test-delete"
)
self.addCleanup(self.openstack, 'subnet delete ' + priv_subnet_id)
@ -261,9 +257,9 @@ class FloatingIpTests(common.NetworkTests):
self.PORT_NAME = uuid.uuid4().hex
json_output = self.openstack(
'floating ip create ' +
'--description aaaa ' +
self.EXTERNAL_NETWORK_NAME,
'floating ip create '
+ '--description aaaa '
+ self.EXTERNAL_NETWORK_NAME,
parse_output=True,
)
self.assertIsNotNone(json_output["id"])
@ -275,33 +271,34 @@ class FloatingIpTests(common.NetworkTests):
)
json_output = self.openstack(
'port create ' +
'--network ' + self.PRIVATE_NETWORK_NAME + ' ' +
'--fixed-ip subnet=' + priv_subnet_id + ' ' +
self.PORT_NAME,
'port create '
+ '--network '
+ self.PRIVATE_NETWORK_NAME
+ ' '
+ '--fixed-ip subnet='
+ priv_subnet_id
+ ' '
+ self.PORT_NAME,
parse_output=True,
)
self.assertIsNotNone(json_output["id"])
port_id = json_output["id"]
json_output = self.openstack(
'router create ' +
self.ROUTER,
'router create ' + self.ROUTER,
parse_output=True,
)
self.assertIsNotNone(json_output["id"])
self.addCleanup(self.openstack, 'router delete ' + self.ROUTER)
self.openstack(
'router add port ' +
self.ROUTER + ' ' +
port_id
)
self.openstack('router add port ' + self.ROUTER + ' ' + port_id)
self.openstack(
'router set ' +
'--external-gateway ' + self.EXTERNAL_NETWORK_NAME + ' ' +
self.ROUTER
'router set '
+ '--external-gateway '
+ self.EXTERNAL_NETWORK_NAME
+ ' '
+ self.ROUTER
)
self.addCleanup(
self.openstack,
@ -312,19 +309,14 @@ class FloatingIpTests(common.NetworkTests):
'router remove port ' + self.ROUTER + ' ' + port_id,
)
self.openstack(
'floating ip set ' +
'--port ' + port_id + ' ' +
ip1
)
self.openstack('floating ip set ' + '--port ' + port_id + ' ' + ip1)
self.addCleanup(
self.openstack,
'floating ip unset --port ' + ip1,
)
json_output = self.openstack(
'floating ip show ' +
ip1,
'floating ip show ' + ip1,
parse_output=True,
)

View File

@ -26,15 +26,14 @@ class IPAvailabilityTests(common.NetworkTests):
cls.NETWORK_NAME = uuid.uuid4().hex
# Create a network for the subnet
cls.openstack(
'network create ' +
cls.NETWORK_NAME
)
cls.openstack('network create ' + cls.NETWORK_NAME)
cmd_output = cls.openstack(
'subnet create ' +
'--network ' + cls.NETWORK_NAME + ' ' +
'--subnet-range 10.10.10.0/24 ' +
cls.NAME,
'subnet create '
+ '--network '
+ cls.NETWORK_NAME
+ ' '
+ '--subnet-range 10.10.10.0/24 '
+ cls.NAME,
parse_output=True,
)
cls.assertOutput(cls.NAME, cmd_output['name'])
@ -43,13 +42,9 @@ class IPAvailabilityTests(common.NetworkTests):
def tearDownClass(cls):
try:
if cls.haz_network:
raw_subnet = cls.openstack(
'subnet delete ' +
cls.NAME
)
raw_subnet = cls.openstack('subnet delete ' + cls.NAME)
raw_network = cls.openstack(
'network delete ' +
cls.NETWORK_NAME
'network delete ' + cls.NETWORK_NAME
)
cls.assertOutput('', raw_subnet)
cls.assertOutput('', raw_network)
@ -66,7 +61,8 @@ class IPAvailabilityTests(common.NetworkTests):
"""Test ip availability list"""
cmd_output = self.openstack(
'ip availability list',
parse_output=True,)
parse_output=True,
)
names = [x['Network Name'] for x in cmd_output]
self.assertIn(self.NETWORK_NAME, names)
@ -74,7 +70,8 @@ class IPAvailabilityTests(common.NetworkTests):
"""Test ip availability show"""
cmd_output = self.openstack(
'ip availability show ' + self.NETWORK_NAME,
parse_output=True,)
parse_output=True,
)
self.assertEqual(
self.NETWORK_NAME,
cmd_output['network_name'],

View File

@ -17,7 +17,6 @@ from openstackclient.tests.functional.network.v2 import common
class L3ConntrackHelperTests(common.NetworkTests):
def setUp(self):
super(L3ConntrackHelperTests, self).setUp()
# Nothing in this class works with Nova Network
@ -45,7 +44,8 @@ class L3ConntrackHelperTests(common.NetworkTests):
output = self.openstack(
'network l3 conntrack helper create %(router)s '
'--helper %(helper)s --protocol %(protocol)s '
'--port %(port)s ' % {
'--port %(port)s '
% {
'router': router_id,
'helper': helper['helper'],
'protocol': helper['protocol'],
@ -63,15 +63,8 @@ class L3ConntrackHelperTests(common.NetworkTests):
"""Test create, delete multiple"""
helpers = [
{
'helper': 'tftp',
'protocol': 'udp',
'port': 69
}, {
'helper': 'ftp',
'protocol': 'tcp',
'port': 21
}
{'helper': 'tftp', 'protocol': 'udp', 'port': 69},
{'helper': 'ftp', 'protocol': 'tcp', 'port': 21},
]
router_id = self._create_router()
created_helpers = self._create_helpers(router_id, helpers)
@ -79,32 +72,18 @@ class L3ConntrackHelperTests(common.NetworkTests):
raw_output = self.openstack(
'--debug network l3 conntrack helper delete %(router)s '
'%(ct_ids)s' % {
'router': router_id, 'ct_ids': ct_ids})
'%(ct_ids)s' % {'router': router_id, 'ct_ids': ct_ids}
)
self.assertOutput('', raw_output)
def test_l3_conntrack_helper_list(self):
helpers = [
{
'helper': 'tftp',
'protocol': 'udp',
'port': 69
}, {
'helper': 'ftp',
'protocol': 'tcp',
'port': 21
}
{'helper': 'tftp', 'protocol': 'udp', 'port': 69},
{'helper': 'ftp', 'protocol': 'tcp', 'port': 21},
]
expected_helpers = [
{
'Helper': 'tftp',
'Protocol': 'udp',
'Port': 69
}, {
'Helper': 'ftp',
'Protocol': 'tcp',
'Port': 21
}
{'Helper': 'tftp', 'Protocol': 'udp', 'Port': 69},
{'Helper': 'ftp', 'Protocol': 'tcp', 'Port': 21},
]
router_id = self._create_router()
self._create_helpers(router_id, helpers)
@ -118,15 +97,13 @@ class L3ConntrackHelperTests(common.NetworkTests):
self.assertIn(ct, expected_helpers)
def test_l3_conntrack_helper_set_and_show(self):
helper = {
'helper': 'tftp',
'protocol': 'udp',
'port': 69}
helper = {'helper': 'tftp', 'protocol': 'udp', 'port': 69}
router_id = self._create_router()
created_helper = self._create_helpers(router_id, [helper])[0]
output = self.openstack(
'network l3 conntrack helper show %(router_id)s %(ct_id)s '
'-f json' % {
'-f json'
% {
'router_id': router_id,
'ct_id': created_helper['id'],
},
@ -138,15 +115,19 @@ class L3ConntrackHelperTests(common.NetworkTests):
raw_output = self.openstack(
'network l3 conntrack helper set %(router_id)s %(ct_id)s '
'--port %(port)s ' % {
'--port %(port)s '
% {
'router_id': router_id,
'ct_id': created_helper['id'],
'port': helper['port'] + 1})
'port': helper['port'] + 1,
}
)
self.assertOutput('', raw_output)
output = self.openstack(
'network l3 conntrack helper show %(router_id)s %(ct_id)s '
'-f json' % {
'-f json'
% {
'router_id': router_id,
'ct_id': created_helper['id'],
},

View File

@ -32,8 +32,7 @@ class LocalIPTests(common.NetworkTests):
"""Test create, delete multiple"""
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'local ip create ' +
name1,
'local ip create ' + name1,
parse_output=True,
)
self.assertEqual(
@ -43,8 +42,7 @@ class LocalIPTests(common.NetworkTests):
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'local ip create ' +
name2,
'local ip create ' + name2,
parse_output=True,
)
self.assertEqual(
@ -83,8 +81,7 @@ class LocalIPTests(common.NetworkTests):
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'local ip create ' +
name1,
'local ip create ' + name1,
parse_output=True,
)
self.addCleanup(self.openstack, 'local ip delete ' + name1)
@ -95,9 +92,7 @@ class LocalIPTests(common.NetworkTests):
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'local ip create ' +
'--project ' + demo_project_id +
' ' + name2,
'local ip create ' + '--project ' + demo_project_id + ' ' + name2,
parse_output=True,
)
self.addCleanup(self.openstack, 'local ip delete ' + name2)
@ -117,8 +112,7 @@ class LocalIPTests(common.NetworkTests):
# Test list --project
cmd_output = self.openstack(
'local ip list ' +
'--project ' + demo_project_id,
'local ip list ' + '--project ' + demo_project_id,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -127,8 +121,7 @@ class LocalIPTests(common.NetworkTests):
# Test list --name
cmd_output = self.openstack(
'local ip list ' +
'--name ' + name1,
'local ip list ' + '--name ' + name1,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -140,9 +133,7 @@ class LocalIPTests(common.NetworkTests):
name = uuid.uuid4().hex
newname = name + "_"
cmd_output = self.openstack(
'local ip create ' +
'--description aaaa ' +
name,
'local ip create ' + '--description aaaa ' + name,
parse_output=True,
)
self.addCleanup(self.openstack, 'local ip delete ' + newname)
@ -151,17 +142,18 @@ class LocalIPTests(common.NetworkTests):
# Test set name and description
raw_output = self.openstack(
'local ip set ' +
'--name ' + newname + ' ' +
'--description bbbb ' +
name,
'local ip set '
+ '--name '
+ newname
+ ' '
+ '--description bbbb '
+ name,
)
self.assertOutput('', raw_output)
# Show the updated local ip
cmd_output = self.openstack(
'local ip show ' +
newname,
'local ip show ' + newname,
parse_output=True,
)
self.assertEqual(newname, cmd_output['name'])

View File

@ -34,9 +34,7 @@ class NetworkTests(common.NetworkTagTests):
# Network create with minimum options
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'network create ' +
'--subnet 1.2.3.4/28 ' +
name1,
'network create ' + '--subnet 1.2.3.4/28 ' + name1,
parse_output=True,
)
self.addCleanup(self.openstack, 'network delete ' + name1)
@ -54,10 +52,7 @@ class NetworkTests(common.NetworkTagTests):
# Network create with more options
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'network create ' +
'--subnet 1.2.4.4/28 ' +
'--share ' +
name2,
'network create ' + '--subnet 1.2.4.4/28 ' + '--share ' + name2,
parse_output=True,
)
self.addCleanup(self.openstack, 'network delete ' + name2)
@ -105,8 +100,7 @@ class NetworkTests(common.NetworkTagTests):
# Network create with no options
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'network create ' +
name1,
'network create ' + name1,
parse_output=True,
)
self.addCleanup(self.openstack, 'network delete ' + name1)
@ -136,9 +130,7 @@ class NetworkTests(common.NetworkTagTests):
# Network create with options
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'network create ' +
'--project demo ' +
name2,
'network create ' + '--project demo ' + name2,
parse_output=True,
)
self.addCleanup(self.openstack, 'network delete ' + name2)
@ -159,9 +151,7 @@ class NetworkTests(common.NetworkTagTests):
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'network create ' +
'--subnet 9.8.7.6/28 ' +
name1,
'network create ' + '--subnet 9.8.7.6/28 ' + name1,
parse_output=True,
)
self.assertIsNotNone(cmd_output["id"])
@ -172,9 +162,7 @@ class NetworkTests(common.NetworkTagTests):
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'network create ' +
'--subnet 8.7.6.5/28 ' +
name2,
'network create ' + '--subnet 8.7.6.5/28 ' + name2,
parse_output=True,
)
self.assertIsNotNone(cmd_output["id"])
@ -190,9 +178,7 @@ class NetworkTests(common.NetworkTagTests):
name1 = uuid.uuid4().hex
cmd_output = self.openstack(
'network create ' +
'--description aaaa ' +
name1,
'network create ' + '--description aaaa ' + name1,
parse_output=True,
)
self.assertIsNotNone(cmd_output["id"])
@ -203,9 +189,7 @@ class NetworkTests(common.NetworkTagTests):
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'network create ' +
'--description bbbb ' +
name2,
'network create ' + '--description bbbb ' + name2,
parse_output=True,
)
self.assertIsNotNone(cmd_output["id"])
@ -225,9 +209,7 @@ class NetworkTests(common.NetworkTagTests):
else:
network_options = '--subnet 3.4.5.6/28 '
cmd_output = self.openstack(
'network create ' +
network_options +
name1,
'network create ' + network_options + name1,
parse_output=True,
)
self.addCleanup(self.openstack, 'network delete %s' % name1)
@ -248,9 +230,7 @@ class NetworkTests(common.NetworkTagTests):
cmd_output["router:external"],
)
self.assertFalse(cmd_output["is_default"])
self.assertTrue(
cmd_output["port_security_enabled"]
)
self.assertTrue(cmd_output["port_security_enabled"])
else:
self.assertEqual(
'3.4.5.0/28',
@ -263,8 +243,7 @@ class NetworkTests(common.NetworkTagTests):
else:
network_options = '--subnet 4.5.6.7/28 '
cmd_output = self.openstack(
'network create --share %s%s' %
(network_options, name2),
'network create --share %s%s' % (network_options, name2),
parse_output=True,
)
self.addCleanup(self.openstack, 'network delete ' + name2)
@ -385,15 +364,13 @@ class NetworkTests(common.NetworkTagTests):
# Cleanup
# Remove Agent from Network
self.openstack(
'network agent remove network --dhcp %s %s' %
(agent_id, network_id)
'network agent remove network --dhcp %s %s'
% (agent_id, network_id)
)
# Assert
col_name = [x["ID"] for x in cmd_output3]
self.assertIn(
network_id, col_name
)
self.assertIn(network_id, col_name)
def test_network_set(self):
"""Tests create options, set, show, delete"""
@ -408,8 +385,7 @@ class NetworkTests(common.NetworkTagTests):
'--no-share '
'--internal '
'--no-default '
'--enable-port-security %s' %
name,
'--enable-port-security %s' % name,
parse_output=True,
)
self.addCleanup(self.openstack, 'network delete %s' % name)
@ -429,9 +405,7 @@ class NetworkTests(common.NetworkTagTests):
)
self.assertFalse(cmd_output["is_default"])
self.assertTrue(
cmd_output["port_security_enabled"]
)
self.assertTrue(cmd_output["port_security_enabled"])
raw_output = self.openstack(
'network set '
@ -439,8 +413,7 @@ class NetworkTests(common.NetworkTagTests):
'--disable '
'--share '
'--external '
'--disable-port-security %s' %
name
'--disable-port-security %s' % name
)
self.assertOutput('', raw_output)
@ -463,6 +436,4 @@ class NetworkTests(common.NetworkTagTests):
cmd_output["router:external"],
)
self.assertFalse(cmd_output["is_default"])
self.assertFalse(
cmd_output["port_security_enabled"]
)
self.assertFalse(cmd_output["port_security_enabled"])

View File

@ -120,8 +120,7 @@ class NetworkAgentListTests(common.NetworkTests):
# Add Agent to Network
self.openstack(
'network agent add network --dhcp %s %s' %
(agent_id, network_id)
'network agent add network --dhcp %s %s' % (agent_id, network_id)
)
# Test network agent list --network
@ -133,15 +132,13 @@ class NetworkAgentListTests(common.NetworkTests):
# Cleanup
# Remove Agent from Network
self.openstack(
'network agent remove network --dhcp %s %s' %
(agent_id, network_id)
'network agent remove network --dhcp %s %s'
% (agent_id, network_id)
)
# Assert
col_name = [x["ID"] for x in cmd_output3]
self.assertIn(
agent_id, col_name
)
self.assertIn(agent_id, col_name)
def test_network_agent_list_routers(self):
"""Add agent to router, list agents on router, delete."""
@ -152,7 +149,8 @@ class NetworkAgentListTests(common.NetworkTests):
name = uuid.uuid4().hex
cmd_output = self.openstack(
'router create %s' % name,
parse_output=True,)
parse_output=True,
)
self.addCleanup(self.openstack, 'router delete %s' % name)
# Get router ID
@ -160,7 +158,8 @@ class NetworkAgentListTests(common.NetworkTests):
# Get l3 agent id
cmd_output = self.openstack(
'network agent list --agent-type l3',
parse_output=True,)
parse_output=True,
)
# Check at least one L3 agent is included in the response.
self.assertTrue(cmd_output)
@ -168,21 +167,25 @@ class NetworkAgentListTests(common.NetworkTests):
# Add router to agent
self.openstack(
'network agent add router --l3 %s %s' % (agent_id, router_id))
'network agent add router --l3 %s %s' % (agent_id, router_id)
)
# Test router list --agent
cmd_output = self.openstack(
'network agent list --router %s' % router_id,
parse_output=True,)
parse_output=True,
)
agent_ids = [x['ID'] for x in cmd_output]
self.assertIn(agent_id, agent_ids)
# Remove router from agent
self.openstack(
'network agent remove router --l3 %s %s' % (agent_id, router_id))
'network agent remove router --l3 %s %s' % (agent_id, router_id)
)
cmd_output = self.openstack(
'network agent list --router %s' % router_id,
parse_output=True,)
parse_output=True,
)
agent_ids = [x['ID'] for x in cmd_output]
self.assertNotIn(agent_id, agent_ids)

View File

@ -43,14 +43,17 @@ class NetworkFlavorTests(common.NetworkTests):
)
service_profile_id = cmd_output2.get('id')
self.addCleanup(self.openstack, 'network flavor delete %s' %
flavor_id)
self.addCleanup(self.openstack, 'network flavor profile delete %s' %
service_profile_id)
self.addCleanup(self.openstack, 'network flavor delete %s' % flavor_id)
self.addCleanup(
self.openstack,
'network flavor profile delete %s' % service_profile_id,
)
# Add flavor to service profile
self.openstack(
'network flavor add profile ' +
flavor_id + ' ' + service_profile_id
'network flavor add profile '
+ flavor_id
+ ' '
+ service_profile_id
)
cmd_output4 = self.openstack(
@ -65,8 +68,10 @@ class NetworkFlavorTests(common.NetworkTests):
# Cleanup
# Remove flavor from service profile
self.openstack(
'network flavor remove profile ' +
flavor_id + ' ' + service_profile_id
'network flavor remove profile '
+ flavor_id
+ ' '
+ service_profile_id
)
cmd_output6 = self.openstack(
@ -112,7 +117,8 @@ class NetworkFlavorTests(common.NetworkTests):
cmd_output['description'],
)
raw_output = self.openstack(
'network flavor delete ' + name1 + " " + name2)
'network flavor delete ' + name1 + " " + name2
)
self.assertOutput('', raw_output)
def test_network_flavor_list(self):
@ -160,7 +166,8 @@ class NetworkFlavorTests(common.NetworkTests):
# Test list
cmd_output = self.openstack(
'network flavor list ',
parse_output=True,)
parse_output=True,
)
self.assertIsNotNone(cmd_output)
name_list = [item.get('Name') for item in cmd_output]
@ -197,7 +204,8 @@ class NetworkFlavorTests(common.NetworkTests):
cmd_output = self.openstack(
'network flavor show ' + newname,
parse_output=True,)
parse_output=True,
)
self.assertEqual(
newname,
cmd_output['name'],
@ -222,7 +230,8 @@ class NetworkFlavorTests(common.NetworkTests):
self.addCleanup(self.openstack, "network flavor delete " + name)
cmd_output = self.openstack(
'network flavor show ' + name,
parse_output=True,)
parse_output=True,
)
self.assertEqual(
name,
cmd_output['name'],

View File

@ -27,9 +27,12 @@ class NetworkFlavorProfileTests(common.NetworkTests):
def test_network_flavor_profile_create(self):
json_output = self.openstack(
'network flavor profile create ' +
'--description ' + self.DESCRIPTION + ' ' +
'--enable --metainfo ' + self.METAINFO,
'network flavor profile create '
+ '--description '
+ self.DESCRIPTION
+ ' '
+ '--enable --metainfo '
+ self.METAINFO,
parse_output=True,
)
ID = json_output.get('id')
@ -50,10 +53,13 @@ class NetworkFlavorProfileTests(common.NetworkTests):
def test_network_flavor_profile_list(self):
json_output = self.openstack(
'network flavor profile create ' +
'--description ' + self.DESCRIPTION + ' ' +
'--enable ' +
'--metainfo ' + self.METAINFO,
'network flavor profile create '
+ '--description '
+ self.DESCRIPTION
+ ' '
+ '--enable '
+ '--metainfo '
+ self.METAINFO,
parse_output=True,
)
ID1 = json_output.get('id')
@ -69,10 +75,13 @@ class NetworkFlavorProfileTests(common.NetworkTests):
)
json_output = self.openstack(
'network flavor profile create ' +
'--description ' + self.DESCRIPTION + ' ' +
'--disable ' +
'--metainfo ' + self.METAINFO,
'network flavor profile create '
+ '--description '
+ self.DESCRIPTION
+ ' '
+ '--disable '
+ '--metainfo '
+ self.METAINFO,
parse_output=True,
)
ID2 = json_output.get('id')
@ -106,10 +115,13 @@ class NetworkFlavorProfileTests(common.NetworkTests):
def test_network_flavor_profile_set(self):
json_output_1 = self.openstack(
'network flavor profile create ' +
'--description ' + self.DESCRIPTION + ' ' +
'--enable ' +
'--metainfo ' + self.METAINFO,
'network flavor profile create '
+ '--description '
+ self.DESCRIPTION
+ ' '
+ '--enable '
+ '--metainfo '
+ self.METAINFO,
parse_output=True,
)
ID = json_output_1.get('id')
@ -146,10 +158,13 @@ class NetworkFlavorProfileTests(common.NetworkTests):
def test_network_flavor_profile_show(self):
json_output_1 = self.openstack(
'network flavor profile create ' +
'--description ' + self.DESCRIPTION + ' ' +
'--enable ' +
'--metainfo ' + self.METAINFO,
'network flavor profile create '
+ '--description '
+ self.DESCRIPTION
+ ' '
+ '--enable '
+ '--metainfo '
+ self.METAINFO,
parse_output=True,
)
ID = json_output_1.get('id')

View File

@ -38,9 +38,11 @@ class TestMeter(common.NetworkTests):
name2 = uuid.uuid4().hex
description = 'fakedescription'
json_output = self.openstack(
'network meter create ' +
' --description ' + description + ' ' +
name1,
'network meter create '
+ ' --description '
+ description
+ ' '
+ name1,
parse_output=True,
)
self.assertEqual(
@ -55,9 +57,11 @@ class TestMeter(common.NetworkTests):
)
json_output_2 = self.openstack(
'network meter create ' +
'--description ' + description + ' ' +
name2,
'network meter create '
+ '--description '
+ description
+ ' '
+ name2,
parse_output=True,
)
self.assertEqual(
@ -80,16 +84,13 @@ class TestMeter(common.NetworkTests):
"""Test create, list filters, delete"""
name1 = uuid.uuid4().hex
json_output = self.openstack(
'network meter create ' +
'--description Test1 ' +
'--share ' +
name1,
'network meter create '
+ '--description Test1 '
+ '--share '
+ name1,
parse_output=True,
)
self.addCleanup(
self.openstack,
'network meter delete ' + name1
)
self.addCleanup(self.openstack, 'network meter delete ' + name1)
self.assertEqual(
'Test1',
@ -99,10 +100,10 @@ class TestMeter(common.NetworkTests):
name2 = uuid.uuid4().hex
json_output_2 = self.openstack(
'network meter create ' +
'--description Test2 ' +
'--no-share ' +
name2,
'network meter create '
+ '--description Test2 '
+ '--no-share '
+ name2,
parse_output=True,
)
self.addCleanup(self.openstack, 'network meter delete ' + name2)
@ -125,9 +126,11 @@ class TestMeter(common.NetworkTests):
name1 = uuid.uuid4().hex
description = 'fakedescription'
json_output = self.openstack(
'network meter create ' +
' --description ' + description + ' ' +
name1,
'network meter create '
+ ' --description '
+ description
+ ' '
+ name1,
parse_output=True,
)
meter_id = json_output.get('id')

View File

@ -31,8 +31,7 @@ class TestMeterRule(common.NetworkTests):
cls.METER_NAME = uuid.uuid4().hex
json_output = cls.openstack(
'network meter create ' +
cls.METER_NAME,
'network meter create ' + cls.METER_NAME,
parse_output=True,
)
cls.METER_ID = json_output.get('id')
@ -42,8 +41,7 @@ class TestMeterRule(common.NetworkTests):
try:
if cls.haz_network:
raw_output = cls.openstack(
'network meter delete ' +
cls.METER_ID
'network meter delete ' + cls.METER_ID
)
cls.assertOutput('', raw_output)
finally:
@ -58,57 +56,44 @@ class TestMeterRule(common.NetworkTests):
def test_meter_rule_delete(self):
"""test create, delete"""
json_output = self.openstack(
'network meter rule create ' +
'--remote-ip-prefix 10.0.0.0/8 ' +
self.METER_ID,
'network meter rule create '
+ '--remote-ip-prefix 10.0.0.0/8 '
+ self.METER_ID,
parse_output=True,
)
rule_id = json_output.get('id')
re_ip = json_output.get('remote_ip_prefix')
self.addCleanup(
self.openstack,
'network meter rule delete ' + rule_id
)
self.addCleanup(self.openstack, 'network meter rule delete ' + rule_id)
self.assertIsNotNone(re_ip)
self.assertIsNotNone(rule_id)
self.assertEqual(
'10.0.0.0/8', re_ip
)
self.assertEqual('10.0.0.0/8', re_ip)
def test_meter_rule_list(self):
"""Test create, list, delete"""
json_output = self.openstack(
'network meter rule create ' +
'--remote-ip-prefix 10.0.0.0/8 ' +
self.METER_ID,
'network meter rule create '
+ '--remote-ip-prefix 10.0.0.0/8 '
+ self.METER_ID,
parse_output=True,
)
rule_id_1 = json_output.get('id')
self.addCleanup(
self.openstack,
'network meter rule delete ' + rule_id_1
)
self.assertEqual(
'10.0.0.0/8',
json_output.get('remote_ip_prefix')
self.openstack, 'network meter rule delete ' + rule_id_1
)
self.assertEqual('10.0.0.0/8', json_output.get('remote_ip_prefix'))
json_output_1 = self.openstack(
'network meter rule create ' +
'--remote-ip-prefix 11.0.0.0/8 ' +
self.METER_ID,
'network meter rule create '
+ '--remote-ip-prefix 11.0.0.0/8 '
+ self.METER_ID,
parse_output=True,
)
rule_id_2 = json_output_1.get('id')
self.addCleanup(
self.openstack,
'network meter rule delete ' + rule_id_2
)
self.assertEqual(
'11.0.0.0/8',
json_output_1.get('remote_ip_prefix')
self.openstack, 'network meter rule delete ' + rule_id_2
)
self.assertEqual('11.0.0.0/8', json_output_1.get('remote_ip_prefix'))
json_output = self.openstack(
'network meter rule list',
@ -124,30 +109,21 @@ class TestMeterRule(common.NetworkTests):
def test_meter_rule_show(self):
"""Test create, show, delete"""
json_output = self.openstack(
'network meter rule create ' +
'--remote-ip-prefix 10.0.0.0/8 ' +
'--egress ' +
self.METER_ID,
'network meter rule create '
+ '--remote-ip-prefix 10.0.0.0/8 '
+ '--egress '
+ self.METER_ID,
parse_output=True,
)
rule_id = json_output.get('id')
self.assertEqual(
'egress',
json_output.get('direction')
)
self.assertEqual('egress', json_output.get('direction'))
json_output = self.openstack(
'network meter rule show ' + rule_id,
parse_output=True,
)
self.assertEqual(
'10.0.0.0/8',
json_output.get('remote_ip_prefix')
)
self.assertEqual('10.0.0.0/8', json_output.get('remote_ip_prefix'))
self.assertIsNotNone(rule_id)
self.addCleanup(
self.openstack,
'network meter rule delete ' + rule_id
)
self.addCleanup(self.openstack, 'network meter rule delete ' + rule_id)

View File

@ -14,7 +14,6 @@ from openstackclient.tests.functional.network.v2 import common
class L3NDPProxyTests(common.NetworkTests):
def setUp(self):
super().setUp()
# Nothing in this class works with Nova Network
@ -43,7 +42,8 @@ class L3NDPProxyTests(common.NetworkTests):
json_output = self.openstack(
'subnet pool create %(subnet_p_name)s '
'--address-scope %(address_scope)s '
'--pool-prefix 2001:db8::/96 --default-prefix-length 112' % {
'--pool-prefix 2001:db8::/96 --default-prefix-length 112'
% {
'subnet_p_name': self.SUBNET_P_NAME,
'address_scope': self.ADDRESS_SCOPE_ID,
},
@ -59,7 +59,8 @@ class L3NDPProxyTests(common.NetworkTests):
self.EXT_NET_ID = json_output['id']
json_output = self.openstack(
'subnet create --ip-version 6 --subnet-pool '
'%(subnet_pool)s --network %(net_id)s %(sub_name)s' % {
'%(subnet_pool)s --network %(net_id)s %(sub_name)s'
% {
'subnet_pool': self.SUBNET_POOL_ID,
'net_id': self.EXT_NET_ID,
'sub_name': self.EXT_SUB_NAME,
@ -75,9 +76,9 @@ class L3NDPProxyTests(common.NetworkTests):
self.assertIsNotNone(json_output['id'])
self.ROT_ID = json_output['id']
output = self.openstack(
'router set %(router_id)s --external-gateway %(net_id)s' % {
'router_id': self.ROT_ID,
'net_id': self.EXT_NET_ID})
'router set %(router_id)s --external-gateway %(net_id)s'
% {'router_id': self.ROT_ID, 'net_id': self.EXT_NET_ID}
)
self.assertEqual('', output)
output = self.openstack('router set --enable-ndp-proxy ' + self.ROT_ID)
self.assertEqual('', output)
@ -94,7 +95,8 @@ class L3NDPProxyTests(common.NetworkTests):
self.INT_NET_ID = json_output['id']
json_output = self.openstack(
'subnet create --ip-version 6 --subnet-pool '
'%(subnet_pool)s --network %(net_id)s %(sub_name)s' % {
'%(subnet_pool)s --network %(net_id)s %(sub_name)s'
% {
'subnet_pool': self.SUBNET_POOL_ID,
'net_id': self.INT_NET_ID,
'sub_name': self.INT_SUB_NAME,
@ -105,7 +107,8 @@ class L3NDPProxyTests(common.NetworkTests):
self.INT_SUB_ID = json_output['id']
json_output = self.openstack(
'port create --network %(net_id)s '
'%(port_name)s' % {
'%(port_name)s'
% {
'net_id': self.INT_NET_ID,
'port_name': self.INT_PORT_NAME,
},
@ -115,28 +118,33 @@ class L3NDPProxyTests(common.NetworkTests):
self.INT_PORT_ID = json_output['id']
self.INT_PORT_ADDRESS = json_output['fixed_ips'][0]['ip_address']
output = self.openstack(
'router add subnet ' + self.ROT_ID + ' ' + self.INT_SUB_ID)
'router add subnet ' + self.ROT_ID + ' ' + self.INT_SUB_ID
)
self.assertEqual('', output)
def tearDown(self):
for ndp_proxy in self.created_ndp_proxies:
output = self.openstack(
'router ndp proxy delete ' + ndp_proxy['id'])
'router ndp proxy delete ' + ndp_proxy['id']
)
self.assertEqual('', output)
output = self.openstack('port delete ' + self.INT_PORT_ID)
self.assertEqual('', output)
output = self.openstack(
'router set --disable-ndp-proxy ' + self.ROT_ID)
'router set --disable-ndp-proxy ' + self.ROT_ID
)
self.assertEqual('', output)
output = self.openstack(
'router remove subnet ' + self.ROT_ID + ' ' + self.INT_SUB_ID)
'router remove subnet ' + self.ROT_ID + ' ' + self.INT_SUB_ID
)
self.assertEqual('', output)
output = self.openstack('subnet delete ' + self.INT_SUB_ID)
self.assertEqual('', output)
output = self.openstack('network delete ' + self.INT_NET_ID)
self.assertEqual('', output)
output = self.openstack(
'router unset ' + self.ROT_ID + ' ' + '--external-gateway')
'router unset ' + self.ROT_ID + ' ' + '--external-gateway'
)
self.assertEqual('', output)
output = self.openstack('router delete ' + self.ROT_ID)
self.assertEqual('', output)
@ -146,8 +154,9 @@ class L3NDPProxyTests(common.NetworkTests):
self.assertEqual('', output)
output = self.openstack('subnet pool delete ' + self.SUBNET_POOL_ID)
self.assertEqual('', output)
output = self.openstack('address scope delete ' +
self.ADDRESS_SCOPE_ID)
output = self.openstack(
'address scope delete ' + self.ADDRESS_SCOPE_ID
)
self.assertEqual('', output)
super().tearDown()
@ -155,7 +164,8 @@ class L3NDPProxyTests(common.NetworkTests):
for ndp_proxy in ndp_proxies:
output = self.openstack(
'router ndp proxy create %(router)s --name %(name)s '
'--port %(port)s --ip-address %(address)s' % {
'--port %(port)s --ip-address %(address)s'
% {
'router': ndp_proxy['router_id'],
'name': ndp_proxy['name'],
'port': ndp_proxy['port_id'],
@ -174,7 +184,7 @@ class L3NDPProxyTests(common.NetworkTests):
'name': self.getUniqueString(),
'router_id': self.ROT_ID,
'port_id': self.INT_PORT_ID,
'address': self.INT_PORT_ADDRESS
'address': self.INT_PORT_ADDRESS,
}
]
self._create_ndp_proxies(ndp_proxies)
@ -184,11 +194,13 @@ class L3NDPProxyTests(common.NetworkTests):
'name': self.getUniqueString(),
'router_id': self.ROT_ID,
'port_id': self.INT_PORT_ID,
'address': self.INT_PORT_ADDRESS}
'address': self.INT_PORT_ADDRESS,
}
self._create_ndp_proxies([ndp_proxies])
ndp_proxy = self.openstack(
'router ndp proxy list',
parse_output=True,)[0]
parse_output=True,
)[0]
self.assertEqual(ndp_proxies['name'], ndp_proxy['Name'])
self.assertEqual(ndp_proxies['router_id'], ndp_proxy['Router ID'])
self.assertEqual(ndp_proxies['address'], ndp_proxy['IP Address'])
@ -198,13 +210,15 @@ class L3NDPProxyTests(common.NetworkTests):
'name': self.getUniqueString(),
'router_id': self.ROT_ID,
'port_id': self.INT_PORT_ID,
'address': self.INT_PORT_ADDRESS}
'address': self.INT_PORT_ADDRESS,
}
description = 'balala'
self._create_ndp_proxies([ndp_proxies])
ndp_proxy_id = self.created_ndp_proxies[0]['id']
output = self.openstack(
'router ndp proxy set --description %s %s' % (
description, ndp_proxy_id))
'router ndp proxy set --description %s %s'
% (description, ndp_proxy_id)
)
self.assertEqual('', output)
json_output = self.openstack(
'router ndp proxy show ' + ndp_proxy_id,

View File

@ -31,21 +31,18 @@ class NetworkQosPolicyTests(common.NetworkTests):
# This is to check the output of qos policy delete
policy_name = uuid.uuid4().hex
self.openstack('network qos policy create ' + policy_name)
raw_output = self.openstack(
'network qos policy delete ' +
policy_name
)
raw_output = self.openstack('network qos policy delete ' + policy_name)
self.assertEqual('', raw_output)
def test_qos_policy_list(self):
policy_name = uuid.uuid4().hex
json_output = self.openstack(
'network qos policy create ' +
policy_name,
'network qos policy create ' + policy_name,
parse_output=True,
)
self.addCleanup(self.openstack,
'network qos policy delete ' + policy_name)
self.addCleanup(
self.openstack, 'network qos policy delete ' + policy_name
)
self.assertEqual(policy_name, json_output['name'])
json_output = self.openstack(
@ -57,36 +54,30 @@ class NetworkQosPolicyTests(common.NetworkTests):
def test_qos_policy_set(self):
policy_name = uuid.uuid4().hex
json_output = self.openstack(
'network qos policy create ' +
policy_name,
'network qos policy create ' + policy_name,
parse_output=True,
)
self.addCleanup(self.openstack,
'network qos policy delete ' + policy_name)
self.addCleanup(
self.openstack, 'network qos policy delete ' + policy_name
)
self.assertEqual(policy_name, json_output['name'])
self.openstack(
'network qos policy set ' +
'--share ' +
policy_name
)
self.openstack('network qos policy set ' + '--share ' + policy_name)
json_output = self.openstack(
'network qos policy show ' +
policy_name,
'network qos policy show ' + policy_name,
parse_output=True,
)
self.assertTrue(json_output['shared'])
self.openstack(
'network qos policy set ' +
'--no-share ' +
'--no-default ' +
policy_name
'network qos policy set '
+ '--no-share '
+ '--no-default '
+ policy_name
)
json_output = self.openstack(
'network qos policy show ' +
policy_name,
'network qos policy show ' + policy_name,
parse_output=True,
)
self.assertFalse(json_output['shared'])

View File

@ -29,31 +29,33 @@ class NetworkQosRuleTestsMinimumBandwidth(common.NetworkTests):
self.QOS_POLICY_NAME = 'qos_policy_%s' % uuid.uuid4().hex
self.openstack(
'network qos policy create %s' % self.QOS_POLICY_NAME
self.openstack('network qos policy create %s' % self.QOS_POLICY_NAME)
self.addCleanup(
self.openstack,
'network qos policy delete %s' % self.QOS_POLICY_NAME,
)
self.addCleanup(self.openstack,
'network qos policy delete %s' % self.QOS_POLICY_NAME)
cmd_output = self.openstack(
'network qos rule create '
'--type minimum-bandwidth '
'--min-kbps 2800 '
'--egress %s' %
self.QOS_POLICY_NAME,
'--egress %s' % self.QOS_POLICY_NAME,
parse_output=True,
)
self.RULE_ID = cmd_output['id']
self.addCleanup(self.openstack,
'network qos rule delete %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID))
self.addCleanup(
self.openstack,
'network qos rule delete %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
)
self.assertTrue(self.RULE_ID)
def test_qos_rule_create_delete(self):
# This is to check the output of qos rule delete
policy_name = uuid.uuid4().hex
self.openstack('network qos policy create %s' % policy_name)
self.addCleanup(self.openstack,
'network qos policy delete %s' % policy_name)
self.addCleanup(
self.openstack, 'network qos policy delete %s' % policy_name
)
rule = self.openstack(
'network qos rule create '
'--type minimum-bandwidth '
@ -62,30 +64,33 @@ class NetworkQosRuleTestsMinimumBandwidth(common.NetworkTests):
parse_output=True,
)
raw_output = self.openstack(
'network qos rule delete %s %s' %
(policy_name, rule['id']))
'network qos rule delete %s %s' % (policy_name, rule['id'])
)
self.assertEqual('', raw_output)
def test_qos_rule_list(self):
cmd_output = self.openstack(
'network qos rule list %s' % self.QOS_POLICY_NAME,
parse_output=True,)
parse_output=True,
)
self.assertIn(self.RULE_ID, [rule['ID'] for rule in cmd_output])
def test_qos_rule_show(self):
cmd_output = self.openstack(
'network qos rule show %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID),
'network qos rule show %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
parse_output=True,
)
self.assertEqual(self.RULE_ID, cmd_output['id'])
def test_qos_rule_set(self):
self.openstack('network qos rule set --min-kbps 7500 %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID))
self.openstack(
'network qos rule set --min-kbps 7500 %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID)
)
cmd_output = self.openstack(
'network qos rule show %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID),
'network qos rule show %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
parse_output=True,
)
self.assertEqual(7500, cmd_output['min_kbps'])
@ -102,31 +107,33 @@ class NetworkQosRuleTestsMinimumPacketRate(common.NetworkTests):
self.QOS_POLICY_NAME = 'qos_policy_%s' % uuid.uuid4().hex
self.openstack(
'network qos policy create %s' % self.QOS_POLICY_NAME
self.openstack('network qos policy create %s' % self.QOS_POLICY_NAME)
self.addCleanup(
self.openstack,
'network qos policy delete %s' % self.QOS_POLICY_NAME,
)
self.addCleanup(self.openstack,
'network qos policy delete %s' % self.QOS_POLICY_NAME)
cmd_output = self.openstack(
'network qos rule create '
'--type minimum-packet-rate '
'--min-kpps 2800 '
'--egress %s' %
self.QOS_POLICY_NAME,
'--egress %s' % self.QOS_POLICY_NAME,
parse_output=True,
)
self.RULE_ID = cmd_output['id']
self.addCleanup(self.openstack,
'network qos rule delete %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID))
self.addCleanup(
self.openstack,
'network qos rule delete %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
)
self.assertTrue(self.RULE_ID)
def test_qos_rule_create_delete(self):
# This is to check the output of qos rule delete
policy_name = uuid.uuid4().hex
self.openstack('network qos policy create %s' % policy_name)
self.addCleanup(self.openstack,
'network qos policy delete %s' % policy_name)
self.addCleanup(
self.openstack, 'network qos policy delete %s' % policy_name
)
rule = self.openstack(
'network qos rule create '
'--type minimum-packet-rate '
@ -135,30 +142,33 @@ class NetworkQosRuleTestsMinimumPacketRate(common.NetworkTests):
parse_output=True,
)
raw_output = self.openstack(
'network qos rule delete %s %s' %
(policy_name, rule['id']))
'network qos rule delete %s %s' % (policy_name, rule['id'])
)
self.assertEqual('', raw_output)
def test_qos_rule_list(self):
cmd_output = self.openstack(
'network qos rule list %s' % self.QOS_POLICY_NAME,
parse_output=True,)
parse_output=True,
)
self.assertIn(self.RULE_ID, [rule['ID'] for rule in cmd_output])
def test_qos_rule_show(self):
cmd_output = self.openstack(
'network qos rule show %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID),
'network qos rule show %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
parse_output=True,
)
self.assertEqual(self.RULE_ID, cmd_output['id'])
def test_qos_rule_set(self):
self.openstack('network qos rule set --min-kpps 7500 --any %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID))
self.openstack(
'network qos rule set --min-kpps 7500 --any %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID)
)
cmd_output = self.openstack(
'network qos rule show %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID),
'network qos rule show %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
parse_output=True,
)
self.assertEqual(7500, cmd_output['min_kpps'])
@ -175,30 +185,32 @@ class NetworkQosRuleTestsDSCPMarking(common.NetworkTests):
self.skipTest("No Network service present")
self.QOS_POLICY_NAME = 'qos_policy_%s' % uuid.uuid4().hex
self.openstack(
'network qos policy create %s' % self.QOS_POLICY_NAME
self.openstack('network qos policy create %s' % self.QOS_POLICY_NAME)
self.addCleanup(
self.openstack,
'network qos policy delete %s' % self.QOS_POLICY_NAME,
)
self.addCleanup(self.openstack,
'network qos policy delete %s' % self.QOS_POLICY_NAME)
cmd_output = self.openstack(
'network qos rule create '
'--type dscp-marking '
'--dscp-mark 8 %s' %
self.QOS_POLICY_NAME,
'--dscp-mark 8 %s' % self.QOS_POLICY_NAME,
parse_output=True,
)
self.RULE_ID = cmd_output['id']
self.addCleanup(self.openstack,
'network qos rule delete %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID))
self.addCleanup(
self.openstack,
'network qos rule delete %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
)
self.assertTrue(self.RULE_ID)
def test_qos_rule_create_delete(self):
# This is to check the output of qos rule delete
policy_name = uuid.uuid4().hex
self.openstack('network qos policy create %s' % policy_name)
self.addCleanup(self.openstack,
'network qos policy delete %s' % policy_name)
self.addCleanup(
self.openstack, 'network qos policy delete %s' % policy_name
)
rule = self.openstack(
'network qos rule create '
'--type dscp-marking '
@ -206,30 +218,33 @@ class NetworkQosRuleTestsDSCPMarking(common.NetworkTests):
parse_output=True,
)
raw_output = self.openstack(
'network qos rule delete %s %s' %
(policy_name, rule['id']))
'network qos rule delete %s %s' % (policy_name, rule['id'])
)
self.assertEqual('', raw_output)
def test_qos_rule_list(self):
cmd_output = self.openstack(
'network qos rule list %s' % self.QOS_POLICY_NAME,
parse_output=True,)
parse_output=True,
)
self.assertIn(self.RULE_ID, [rule['ID'] for rule in cmd_output])
def test_qos_rule_show(self):
cmd_output = self.openstack(
'network qos rule show %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID),
'network qos rule show %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
parse_output=True,
)
self.assertEqual(self.RULE_ID, cmd_output['id'])
def test_qos_rule_set(self):
self.openstack('network qos rule set --dscp-mark 32 %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID))
self.openstack(
'network qos rule set --dscp-mark 32 %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID)
)
cmd_output = self.openstack(
'network qos rule show %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID),
'network qos rule show %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
parse_output=True,
)
self.assertEqual(32, cmd_output['dscp_mark'])
@ -245,31 +260,33 @@ class NetworkQosRuleTestsBandwidthLimit(common.NetworkTests):
self.skipTest("No Network service present")
self.QOS_POLICY_NAME = 'qos_policy_%s' % uuid.uuid4().hex
self.openstack(
'network qos policy create %s' % self.QOS_POLICY_NAME
self.openstack('network qos policy create %s' % self.QOS_POLICY_NAME)
self.addCleanup(
self.openstack,
'network qos policy delete %s' % self.QOS_POLICY_NAME,
)
self.addCleanup(self.openstack,
'network qos policy delete %s' % self.QOS_POLICY_NAME)
cmd_output = self.openstack(
'network qos rule create '
'--type bandwidth-limit '
'--max-kbps 10000 '
'--egress %s' %
self.QOS_POLICY_NAME,
'--egress %s' % self.QOS_POLICY_NAME,
parse_output=True,
)
self.RULE_ID = cmd_output['id']
self.addCleanup(self.openstack,
'network qos rule delete %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID))
self.addCleanup(
self.openstack,
'network qos rule delete %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
)
self.assertTrue(self.RULE_ID)
def test_qos_rule_create_delete(self):
# This is to check the output of qos rule delete
policy_name = uuid.uuid4().hex
self.openstack('network qos policy create %s' % policy_name)
self.addCleanup(self.openstack,
'network qos policy delete %s' % policy_name)
self.addCleanup(
self.openstack, 'network qos policy delete %s' % policy_name
)
rule = self.openstack(
'network qos rule create '
'--type bandwidth-limit '
@ -279,33 +296,34 @@ class NetworkQosRuleTestsBandwidthLimit(common.NetworkTests):
parse_output=True,
)
raw_output = self.openstack(
'network qos rule delete %s %s' %
(policy_name, rule['id']))
'network qos rule delete %s %s' % (policy_name, rule['id'])
)
self.assertEqual('', raw_output)
def test_qos_rule_list(self):
cmd_output = self.openstack(
'network qos rule list %s' %
self.QOS_POLICY_NAME,
parse_output=True,)
'network qos rule list %s' % self.QOS_POLICY_NAME,
parse_output=True,
)
self.assertIn(self.RULE_ID, [rule['ID'] for rule in cmd_output])
def test_qos_rule_show(self):
cmd_output = self.openstack(
'network qos rule show %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID),
'network qos rule show %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
parse_output=True,
)
self.assertEqual(self.RULE_ID, cmd_output['id'])
def test_qos_rule_set(self):
self.openstack('network qos rule set --max-kbps 15000 '
'--max-burst-kbits 1800 '
'--ingress %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID))
self.openstack(
'network qos rule set --max-kbps 15000 '
'--max-burst-kbits 1800 '
'--ingress %s %s' % (self.QOS_POLICY_NAME, self.RULE_ID)
)
cmd_output = self.openstack(
'network qos rule show %s %s' %
(self.QOS_POLICY_NAME, self.RULE_ID),
'network qos rule show %s %s'
% (self.QOS_POLICY_NAME, self.RULE_ID),
parse_output=True,
)
self.assertEqual(15000, cmd_output['max_kbps'])

View File

@ -17,17 +17,17 @@ from openstackclient.tests.functional.network.v2 import common
class NetworkQosRuleTypeTests(common.NetworkTests):
"""Functional tests for Network QoS rule type. """
"""Functional tests for Network QoS rule type."""
AVAILABLE_RULE_TYPES = ['dscp_marking',
'bandwidth_limit']
AVAILABLE_RULE_TYPES = ['dscp_marking', 'bandwidth_limit']
# NOTE(ralonsoh): this list was updated in Yoga (February 2022)
ALL_AVAILABLE_RULE_TYPES = ['dscp_marking',
'bandwidth_limit',
'minimum_bandwidth',
'packet_rate_limit',
'minimum_packet_rate',
]
ALL_AVAILABLE_RULE_TYPES = [
'dscp_marking',
'bandwidth_limit',
'minimum_bandwidth',
'packet_rate_limit',
'minimum_packet_rate',
]
def setUp(self):
super(NetworkQosRuleTypeTests, self).setUp()
@ -49,7 +49,7 @@ class NetworkQosRuleTypeTests(common.NetworkTests):
cmd_output = self.openstack(
'network qos rule type list --all-supported -f json',
parse_output=True
parse_output=True,
)
for rule_type in self.AVAILABLE_RULE_TYPES:
self.assertIn(rule_type, [x['Type'] for x in cmd_output])
@ -59,8 +59,7 @@ class NetworkQosRuleTypeTests(common.NetworkTests):
self.skipTest('No "qos-rule-type-filter" extension present')
cmd_output = self.openstack(
'network qos rule type list --all-rules -f json',
parse_output=True
'network qos rule type list --all-rules -f json', parse_output=True
)
for rule_type in self.ALL_AVAILABLE_RULE_TYPES:
self.assertIn(rule_type, [x['Type'] for x in cmd_output])

View File

@ -17,6 +17,7 @@ from openstackclient.tests.functional.network.v2 import common
class NetworkRBACTests(common.NetworkTests):
"""Functional tests for network rbac"""
OBJECT_ID = None
ID = None
HEADERS = ['ID']
@ -35,20 +36,20 @@ class NetworkRBACTests(common.NetworkTests):
'network create ' + self.NET_NAME,
parse_output=True,
)
self.addCleanup(self.openstack,
'network delete ' + cmd_output['id'])
self.addCleanup(self.openstack, 'network delete ' + cmd_output['id'])
self.OBJECT_ID = cmd_output['id']
cmd_output = self.openstack(
'network rbac create ' +
self.OBJECT_ID +
' --action access_as_shared' +
' --target-project admin' +
' --type network',
'network rbac create '
+ self.OBJECT_ID
+ ' --action access_as_shared'
+ ' --target-project admin'
+ ' --type network',
parse_output=True,
)
self.addCleanup(self.openstack,
'network rbac delete ' + cmd_output['id'])
self.addCleanup(
self.openstack, 'network rbac delete ' + cmd_output['id']
)
self.ID = cmd_output['id']
self.assertEqual(self.OBJECT_ID, cmd_output['object_id'])
@ -59,20 +60,27 @@ class NetworkRBACTests(common.NetworkTests):
def test_network_rbac_show(self):
cmd_output = self.openstack(
'network rbac show ' + self.ID,
parse_output=True,)
parse_output=True,
)
self.assertEqual(self.ID, cmd_output['id'])
def test_network_rbac_set(self):
project_id = self.openstack(
'project create ' + self.PROJECT_NAME,
parse_output=True,)['id']
self.openstack('network rbac set ' + self.ID +
' --target-project ' + self.PROJECT_NAME)
parse_output=True,
)['id']
self.openstack(
'network rbac set '
+ self.ID
+ ' --target-project '
+ self.PROJECT_NAME
)
cmd_output_rbac = self.openstack(
'network rbac show ' + self.ID,
parse_output=True,
)
self.assertEqual(project_id, cmd_output_rbac['target_project_id'])
raw_output_project = self.openstack(
'project delete ' + self.PROJECT_NAME)
'project delete ' + self.PROJECT_NAME
)
self.assertEqual('', raw_output_project)

View File

@ -27,7 +27,8 @@ class NetworkSegmentTests(common.NetworkTests):
# Create a network for the all subnet tests
cmd_output = cls.openstack(
'network create ' + cls.NETWORK_NAME, parse_output=True,
'network create ' + cls.NETWORK_NAME,
parse_output=True,
)
# Get network_id for assertEqual
cls.NETWORK_ID = cmd_output["id"]
@ -37,8 +38,7 @@ class NetworkSegmentTests(common.NetworkTests):
try:
if cls.haz_network:
raw_output = cls.openstack(
'network delete ' +
cls.NETWORK_NAME
'network delete ' + cls.NETWORK_NAME
)
cls.assertOutput('', raw_output)
finally:
@ -53,11 +53,13 @@ class NetworkSegmentTests(common.NetworkTests):
def test_network_segment_create_delete(self):
name = uuid.uuid4().hex
json_output = self.openstack(
' network segment create ' +
'--network ' + self.NETWORK_ID + ' ' +
'--network-type geneve ' +
'--segment 2055 ' +
name,
' network segment create '
+ '--network '
+ self.NETWORK_ID
+ ' '
+ '--network-type geneve '
+ '--segment 2055 '
+ name,
parse_output=True,
)
self.assertEqual(
@ -73,18 +75,19 @@ class NetworkSegmentTests(common.NetworkTests):
def test_network_segment_list(self):
name = uuid.uuid4().hex
json_output = self.openstack(
' network segment create ' +
'--network ' + self.NETWORK_ID + ' ' +
'--network-type geneve ' +
'--segment 2055 ' +
name,
' network segment create '
+ '--network '
+ self.NETWORK_ID
+ ' '
+ '--network-type geneve '
+ '--segment 2055 '
+ name,
parse_output=True,
)
network_segment_id = json_output.get('id')
network_segment_name = json_output.get('name')
self.addCleanup(
self.openstack,
'network segment delete ' + network_segment_id
self.openstack, 'network segment delete ' + network_segment_id
)
self.assertEqual(
name,
@ -95,26 +98,23 @@ class NetworkSegmentTests(common.NetworkTests):
'network segment list',
parse_output=True,
)
item_map = {
item.get('ID'): item.get('Name') for item in json_output
}
item_map = {item.get('ID'): item.get('Name') for item in json_output}
self.assertIn(network_segment_id, item_map.keys())
self.assertIn(network_segment_name, item_map.values())
def test_network_segment_set_show(self):
name = uuid.uuid4().hex
json_output = self.openstack(
' network segment create ' +
'--network ' + self.NETWORK_ID + ' ' +
'--network-type geneve ' +
'--segment 2055 ' +
name,
' network segment create '
+ '--network '
+ self.NETWORK_ID
+ ' '
+ '--network-type geneve '
+ '--segment 2055 '
+ name,
parse_output=True,
)
self.addCleanup(
self.openstack,
'network segment delete ' + name
)
self.addCleanup(self.openstack, 'network segment delete ' + name)
extension_output = self.openstack(
"extension list ",
@ -133,15 +133,16 @@ class NetworkSegmentTests(common.NetworkTests):
new_description = 'new_description'
cmd_output = self.openstack(
'network segment set ' +
'--description ' + new_description + ' ' +
name
'network segment set '
+ '--description '
+ new_description
+ ' '
+ name
)
self.assertOutput('', cmd_output)
json_output = self.openstack(
'network segment show ' +
name,
'network segment show ' + name,
parse_output=True,
)
self.assertEqual(

View File

@ -35,16 +35,19 @@ class NetworkSegmentRangeTests(common.NetworkTests):
# Make a project
project_id = self.openstack(
'project create ' + self.PROJECT_NAME,
parse_output=True,)['id']
parse_output=True,
)['id']
name = uuid.uuid4().hex
json_output = self.openstack(
' network segment range create ' +
'--private ' +
"--project " + self.PROJECT_NAME + " " +
'--network-type vxlan ' +
'--minimum 2005 ' +
'--maximum 2009 ' +
name,
' network segment range create '
+ '--private '
+ "--project "
+ self.PROJECT_NAME
+ " "
+ '--network-type vxlan '
+ '--minimum 2005 '
+ '--maximum 2009 '
+ name,
parse_output=True,
)
self.assertEqual(
@ -61,25 +64,26 @@ class NetworkSegmentRangeTests(common.NetworkTests):
)
self.assertOutput('', raw_output)
raw_output_project = self.openstack(
'project delete ' + self.PROJECT_NAME)
'project delete ' + self.PROJECT_NAME
)
self.assertEqual('', raw_output_project)
def test_network_segment_range_list(self):
name = uuid.uuid4().hex
json_output = self.openstack(
' network segment range create ' +
'--shared ' +
'--network-type geneve ' +
'--minimum 2013 ' +
'--maximum 2017 ' +
name,
' network segment range create '
+ '--shared '
+ '--network-type geneve '
+ '--minimum 2013 '
+ '--maximum 2017 '
+ name,
parse_output=True,
)
network_segment_range_id = json_output.get('id')
network_segment_range_name = json_output.get('name')
self.addCleanup(
self.openstack,
'network segment range delete ' + network_segment_range_id
'network segment range delete ' + network_segment_range_id,
)
self.assertEqual(
name,
@ -90,31 +94,29 @@ class NetworkSegmentRangeTests(common.NetworkTests):
'network segment range list',
parse_output=True,
)
item_map = {
item.get('ID'): item.get('Name') for item in json_output
}
item_map = {item.get('ID'): item.get('Name') for item in json_output}
self.assertIn(network_segment_range_id, item_map.keys())
self.assertIn(network_segment_range_name, item_map.values())
def test_network_segment_range_set_show(self):
project_id = self.openstack(
'project create ' + self.PROJECT_NAME,
parse_output=True,)['id']
parse_output=True,
)['id']
name = uuid.uuid4().hex
json_output = self.openstack(
' network segment range create ' +
'--private ' +
"--project " + self.PROJECT_NAME + " " +
'--network-type geneve ' +
'--minimum 2021 ' +
'--maximum 2025 ' +
name,
' network segment range create '
+ '--private '
+ "--project "
+ self.PROJECT_NAME
+ " "
+ '--network-type geneve '
+ '--minimum 2021 '
+ '--maximum 2025 '
+ name,
parse_output=True,
)
self.addCleanup(
self.openstack,
'network segment range delete ' + name
)
self.addCleanup(self.openstack, 'network segment range delete ' + name)
self.assertEqual(
name,
json_output["name"],
@ -127,14 +129,13 @@ class NetworkSegmentRangeTests(common.NetworkTests):
new_minimum = 2020
new_maximum = 2029
cmd_output = self.openstack(
'network segment range set --minimum {min} --maximum {max} {name}'
.format(min=new_minimum, max=new_maximum, name=name)
'network segment range set --minimum {min} --maximum {max} '
'{name}'.format(min=new_minimum, max=new_maximum, name=name)
)
self.assertOutput('', cmd_output)
json_output = self.openstack(
'network segment range show ' +
name,
'network segment range show ' + name,
parse_output=True,
)
self.assertEqual(
@ -147,5 +148,6 @@ class NetworkSegmentRangeTests(common.NetworkTests):
)
raw_output_project = self.openstack(
'project delete ' + self.PROJECT_NAME)
'project delete ' + self.PROJECT_NAME
)
self.assertEqual('', raw_output_project)

View File

@ -37,5 +37,6 @@ class TestNetworkServiceProvider(common.NetworkTests):
def test_network_service_provider_list(self):
cmd_output = self.openstack(
'network service provider list',
parse_output=True,)
parse_output=True,
)
self.assertIn('L3_ROUTER_NAT', [x['Service Type'] for x in cmd_output])

View File

@ -37,113 +37,122 @@ class NetworkTrunkTests(common.NetworkTests):
self.openstack(
'subnet create %s '
'--network %s --subnet-range 10.0.0.0/24' % (
subnet_name, network_name))
self.openstack('port create %s --network %s' %
(self.parent_port_name, network_name))
self.addCleanup(self.openstack, 'port delete %s' %
self.parent_port_name)
json_out = self.openstack('port create %s --network %s -f json' %
(self.sub_port_name, network_name))
'--network %s --subnet-range 10.0.0.0/24'
% (subnet_name, network_name)
)
self.openstack(
'port create %s --network %s'
% (self.parent_port_name, network_name)
)
self.addCleanup(
self.openstack, 'port delete %s' % self.parent_port_name
)
json_out = self.openstack(
'port create %s --network %s -f json'
% (self.sub_port_name, network_name)
)
self.sub_port_id = json.loads(json_out)['id']
self.addCleanup(self.openstack, 'port delete %s' % self.sub_port_name)
def test_network_trunk_create_delete(self):
trunk_name = uuid.uuid4().hex
self.openstack('network trunk create %s --parent-port %s -f json ' %
(trunk_name, self.parent_port_name))
raw_output = self.openstack(
'network trunk delete ' +
trunk_name
self.openstack(
'network trunk create %s --parent-port %s -f json '
% (trunk_name, self.parent_port_name)
)
raw_output = self.openstack('network trunk delete ' + trunk_name)
self.assertEqual('', raw_output)
def test_network_trunk_list(self):
trunk_name = uuid.uuid4().hex
json_output = json.loads(self.openstack(
'network trunk create %s --parent-port %s -f json ' %
(trunk_name, self.parent_port_name)))
self.addCleanup(self.openstack,
'network trunk delete ' + trunk_name)
json_output = json.loads(
self.openstack(
'network trunk create %s --parent-port %s -f json '
% (trunk_name, self.parent_port_name)
)
)
self.addCleanup(self.openstack, 'network trunk delete ' + trunk_name)
self.assertEqual(trunk_name, json_output['name'])
json_output = json.loads(self.openstack(
'network trunk list -f json'
))
json_output = json.loads(self.openstack('network trunk list -f json'))
self.assertIn(trunk_name, [tr['Name'] for tr in json_output])
def test_network_trunk_set_unset(self):
trunk_name = uuid.uuid4().hex
json_output = json.loads(self.openstack(
'network trunk create %s --parent-port %s -f json ' %
(trunk_name, self.parent_port_name)))
self.addCleanup(self.openstack,
'network trunk delete ' + trunk_name)
json_output = json.loads(
self.openstack(
'network trunk create %s --parent-port %s -f json '
% (trunk_name, self.parent_port_name)
)
)
self.addCleanup(self.openstack, 'network trunk delete ' + trunk_name)
self.assertEqual(trunk_name, json_output['name'])
self.openstack(
'network trunk set '
'--enable ' +
trunk_name
)
self.openstack('network trunk set ' '--enable ' + trunk_name)
json_output = json.loads(self.openstack(
'network trunk show -f json ' +
trunk_name
))
json_output = json.loads(
self.openstack('network trunk show -f json ' + trunk_name)
)
self.assertTrue(json_output['is_admin_state_up'])
# Add subport to trunk
self.openstack(
'network trunk set ' +
'--subport port=%s,segmentation-type=vlan,segmentation-id=42 ' %
(self.sub_port_name) +
trunk_name
'network trunk set '
+ '--subport port=%s,segmentation-type=vlan,segmentation-id=42 '
% (self.sub_port_name)
+ trunk_name
)
json_output = json.loads(
self.openstack('network trunk show -f json ' + trunk_name)
)
json_output = json.loads(self.openstack(
'network trunk show -f json ' +
trunk_name
))
self.assertEqual(
[{
'port_id': self.sub_port_id,
'segmentation_id': 42,
'segmentation_type': 'vlan'
}],
json_output['sub_ports'])
[
{
'port_id': self.sub_port_id,
'segmentation_id': 42,
'segmentation_type': 'vlan',
}
],
json_output['sub_ports'],
)
# Remove subport from trunk
self.openstack(
'network trunk unset ' +
trunk_name +
' --subport ' +
self.sub_port_name
'network trunk unset '
+ trunk_name
+ ' --subport '
+ self.sub_port_name
)
json_output = json.loads(self.openstack(
'network trunk show -f json ' +
trunk_name
))
self.assertEqual(
[],
json_output['sub_ports'])
json_output = json.loads(
self.openstack('network trunk show -f json ' + trunk_name)
)
self.assertEqual([], json_output['sub_ports'])
def test_network_trunk_list_subports(self):
trunk_name = uuid.uuid4().hex
json_output = json.loads(self.openstack(
'network trunk create %s --parent-port %s '
'--subport port=%s,segmentation-type=vlan,segmentation-id=42 '
'-f json ' %
(trunk_name, self.parent_port_name, self.sub_port_name)))
self.addCleanup(self.openstack,
'network trunk delete ' + trunk_name)
json_output = json.loads(
self.openstack(
'network trunk create %s --parent-port %s '
'--subport port=%s,segmentation-type=vlan,segmentation-id=42 '
'-f json '
% (trunk_name, self.parent_port_name, self.sub_port_name)
)
)
self.addCleanup(self.openstack, 'network trunk delete ' + trunk_name)
self.assertEqual(trunk_name, json_output['name'])
json_output = json.loads(self.openstack(
'network subport list --trunk %s -f json' % trunk_name))
json_output = json.loads(
self.openstack(
'network subport list --trunk %s -f json' % trunk_name
)
)
self.assertEqual(
[{
'Port': self.sub_port_id,
'Segmentation ID': 42,
'Segmentation Type': 'vlan'
}],
json_output)
[
{
'Port': self.sub_port_id,
'Segmentation ID': 42,
'Segmentation Type': 'vlan',
}
],
json_output,
)

View File

@ -31,9 +31,7 @@ class PortTests(common.NetworkTagTests):
cls.NETWORK_NAME = uuid.uuid4().hex
# Create a network for the port tests
cls.openstack(
'network create %s' % cls.NETWORK_NAME
)
cls.openstack('network create %s' % cls.NETWORK_NAME)
@classmethod
def tearDownClass(cls):
@ -55,8 +53,7 @@ class PortTests(common.NetworkTagTests):
def test_port_delete(self):
"""Test create, delete multiple"""
json_output = self.openstack(
'port create --network %s %s' %
(self.NETWORK_NAME, self.NAME),
'port create --network %s %s' % (self.NETWORK_NAME, self.NAME),
parse_output=True,
)
id1 = json_output.get('id')
@ -65,8 +62,7 @@ class PortTests(common.NetworkTagTests):
self.assertEqual(self.NAME, json_output.get('name'))
json_output = self.openstack(
'port create --network %s %sx' %
(self.NETWORK_NAME, self.NAME),
'port create --network %s %sx' % (self.NETWORK_NAME, self.NAME),
parse_output=True,
)
id2 = json_output.get('id')
@ -81,8 +77,7 @@ class PortTests(common.NetworkTagTests):
def test_port_list(self):
"""Test create defaults, list, delete"""
json_output = self.openstack(
'port create --network %s %s' %
(self.NETWORK_NAME, self.NAME),
'port create --network %s %s' % (self.NETWORK_NAME, self.NAME),
parse_output=True,
)
id1 = json_output.get('id')
@ -93,8 +88,7 @@ class PortTests(common.NetworkTagTests):
self.assertEqual(self.NAME, json_output.get('name'))
json_output = self.openstack(
'port create --network %s %sx' %
(self.NETWORK_NAME, self.NAME),
'port create --network %s %sx' % (self.NETWORK_NAME, self.NAME),
parse_output=True,
)
id2 = json_output.get('id')
@ -109,8 +103,9 @@ class PortTests(common.NetworkTagTests):
'port list',
parse_output=True,
)
item_map = {item.get('ID'): item.get('MAC Address') for item in
json_output}
item_map = {
item.get('ID'): item.get('MAC Address') for item in json_output
}
self.assertIn(id1, item_map.keys())
self.assertIn(id2, item_map.keys())
self.assertIn(mac1, item_map.values())
@ -130,8 +125,9 @@ class PortTests(common.NetworkTagTests):
'port list --mac-address %s' % mac2,
parse_output=True,
)
item_map = {item.get('ID'): item.get('MAC Address') for item in
json_output}
item_map = {
item.get('ID'): item.get('MAC Address') for item in json_output
}
self.assertNotIn(id1, item_map.keys())
self.assertIn(id2, item_map.keys())
self.assertNotIn(mac1, item_map.values())
@ -155,8 +151,7 @@ class PortTests(common.NetworkTagTests):
'port create '
'--network %s '
'--description xyzpdq '
'--disable %s' %
(self.NETWORK_NAME, name),
'--disable %s' % (self.NETWORK_NAME, name),
parse_output=True,
)
id1 = json_output.get('id')
@ -165,10 +160,7 @@ class PortTests(common.NetworkTagTests):
self.assertEqual('xyzpdq', json_output.get('description'))
self.assertEqual(False, json_output.get('admin_state_up'))
raw_output = self.openstack(
'port set --enable %s' %
name
)
raw_output = self.openstack('port set --enable %s' % name)
self.assertOutput('', raw_output)
json_output = self.openstack(
@ -183,7 +175,8 @@ class PortTests(common.NetworkTagTests):
self.assertIsNotNone(json_output.get('mac_address'))
raw_output = self.openstack(
'port unset --security-group %s %s' % (sg_id, id1))
'port unset --security-group %s %s' % (sg_id, id1)
)
self.assertOutput('', raw_output)
json_output = self.openstack(
@ -195,8 +188,7 @@ class PortTests(common.NetworkTagTests):
def test_port_admin_set(self):
"""Test create, set (as admin), show, delete"""
json_output = self.openstack(
'port create '
'--network %s %s' % (self.NETWORK_NAME, self.NAME),
'port create ' '--network %s %s' % (self.NETWORK_NAME, self.NAME),
parse_output=True,
)
id_ = json_output.get('id')
@ -204,8 +196,8 @@ class PortTests(common.NetworkTagTests):
raw_output = self.openstack(
'--os-username admin '
'port set --mac-address 11:22:33:44:55:66 %s' %
self.NAME)
'port set --mac-address 11:22:33:44:55:66 %s' % self.NAME
)
self.assertOutput('', raw_output)
json_output = self.openstack(
'port show %s' % self.NAME,
@ -217,8 +209,7 @@ class PortTests(common.NetworkTagTests):
"""Test create, set, show, delete"""
sg_name1 = uuid.uuid4().hex
json_output = self.openstack(
'security group create %s' %
sg_name1,
'security group create %s' % sg_name1,
parse_output=True,
)
sg_id1 = json_output.get('id')
@ -226,8 +217,7 @@ class PortTests(common.NetworkTagTests):
sg_name2 = uuid.uuid4().hex
json_output = self.openstack(
'security group create %s' %
sg_name2,
'security group create %s' % sg_name2,
parse_output=True,
)
sg_id2 = json_output.get('id')
@ -237,8 +227,7 @@ class PortTests(common.NetworkTagTests):
json_output = self.openstack(
'port create '
'--network %s '
'--security-group %s %s' %
(self.NETWORK_NAME, sg_name1, name),
'--security-group %s %s' % (self.NETWORK_NAME, sg_name1, name),
parse_output=True,
)
id1 = json_output.get('id')
@ -247,9 +236,7 @@ class PortTests(common.NetworkTagTests):
self.assertEqual([sg_id1], json_output.get('security_group_ids'))
raw_output = self.openstack(
'port set '
'--security-group %s %s' %
(sg_name2, name)
'port set ' '--security-group %s %s' % (sg_name2, name)
)
self.assertOutput('', raw_output)
@ -260,25 +247,26 @@ class PortTests(common.NetworkTagTests):
self.assertEqual(name, json_output.get('name'))
# NOTE(amotoki): The order of the field is not predictable,
self.assertIsInstance(json_output.get('security_group_ids'), list)
self.assertEqual(sorted([sg_id1, sg_id2]),
sorted(json_output.get('security_group_ids')))
self.assertEqual(
sorted([sg_id1, sg_id2]),
sorted(json_output.get('security_group_ids')),
)
raw_output = self.openstack(
'port unset --security-group %s %s' % (sg_id1, id1))
'port unset --security-group %s %s' % (sg_id1, id1)
)
self.assertOutput('', raw_output)
json_output = self.openstack(
'port show %s' % name,
parse_output=True,
)
self.assertEqual(
[sg_id2],
json_output.get('security_group_ids')
)
self.assertEqual([sg_id2], json_output.get('security_group_ids'))
def _create_resource_for_tag_test(self, name, args):
return self.openstack(
'{} create --network {} {} {}'
.format(self.base_command, self.NETWORK_NAME, args, name),
'{} create --network {} {} {}'.format(
self.base_command, self.NETWORK_NAME, args, name
),
parse_output=True,
)

View File

@ -31,8 +31,7 @@ class RouterTests(common.NetworkTagTests):
name1 = uuid.uuid4().hex
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'router create ' +
name1,
'router create ' + name1,
parse_output=True,
)
self.assertEqual(
@ -40,8 +39,7 @@ class RouterTests(common.NetworkTagTests):
cmd_output["name"],
)
cmd_output = self.openstack(
'router create ' +
name2,
'router create ' + name2,
parse_output=True,
)
self.assertEqual(
@ -49,8 +47,7 @@ class RouterTests(common.NetworkTagTests):
cmd_output["name"],
)
del_output = self.openstack(
'router delete ' + name1 + ' ' + name2)
del_output = self.openstack('router delete ' + name1 + ' ' + name2)
self.assertOutput('', del_output)
def test_router_list(self):
@ -80,9 +77,7 @@ class RouterTests(common.NetworkTagTests):
name1 = uuid.uuid4().hex
name2 = uuid.uuid4().hex
cmd_output = self.openstack(
'router create ' +
'--disable ' +
name1,
'router create ' + '--disable ' + name1,
parse_output=True,
)
@ -100,9 +95,7 @@ class RouterTests(common.NetworkTagTests):
cmd_output["project_id"],
)
cmd_output = self.openstack(
'router create ' +
'--project ' + demo_project_id +
' ' + name2,
'router create ' + '--project ' + demo_project_id + ' ' + name2,
parse_output=True,
)
@ -122,8 +115,7 @@ class RouterTests(common.NetworkTagTests):
# Test list --project
cmd_output = self.openstack(
'router list ' +
'--project ' + demo_project_id,
'router list ' + '--project ' + demo_project_id,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -132,8 +124,7 @@ class RouterTests(common.NetworkTagTests):
# Test list --disable
cmd_output = self.openstack(
'router list ' +
'--disable ',
'router list ' + '--disable ',
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -142,8 +133,7 @@ class RouterTests(common.NetworkTagTests):
# Test list --name
cmd_output = self.openstack(
'router list ' +
'--name ' + name1,
'router list ' + '--name ' + name1,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -152,8 +142,7 @@ class RouterTests(common.NetworkTagTests):
# Test list --long
cmd_output = self.openstack(
'router list ' +
'--long ',
'router list ' + '--long ',
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -169,7 +158,8 @@ class RouterTests(common.NetworkTagTests):
name = uuid.uuid4().hex
cmd_output = self.openstack(
'router create ' + name,
parse_output=True,)
parse_output=True,
)
self.addCleanup(self.openstack, 'router delete ' + name)
# Get router ID
@ -177,7 +167,8 @@ class RouterTests(common.NetworkTagTests):
# Get l3 agent id
cmd_output = self.openstack(
'network agent list --agent-type l3',
parse_output=True,)
parse_output=True,
)
# Check at least one L3 agent is included in the response.
self.assertTrue(cmd_output)
@ -185,20 +176,24 @@ class RouterTests(common.NetworkTagTests):
# Add router to agent
self.openstack(
'network agent add router --l3 ' + agent_id + ' ' + router_id)
'network agent add router --l3 ' + agent_id + ' ' + router_id
)
cmd_output = self.openstack(
'router list --agent ' + agent_id,
parse_output=True,)
parse_output=True,
)
router_ids = [x['ID'] for x in cmd_output]
self.assertIn(router_id, router_ids)
# Remove router from agent
self.openstack(
'network agent remove router --l3 ' + agent_id + ' ' + router_id)
'network agent remove router --l3 ' + agent_id + ' ' + router_id
)
cmd_output = self.openstack(
'router list --agent ' + agent_id,
parse_output=True,)
parse_output=True,
)
router_ids = [x['ID'] for x in cmd_output]
self.assertNotIn(router_id, router_ids)
@ -208,9 +203,7 @@ class RouterTests(common.NetworkTagTests):
name = uuid.uuid4().hex
new_name = name + "_"
cmd_output = self.openstack(
'router create ' +
'--description aaaa ' +
name,
'router create ' + '--description aaaa ' + name,
parse_output=True,
)
self.addCleanup(self.openstack, 'router delete ' + new_name)
@ -225,17 +218,17 @@ class RouterTests(common.NetworkTagTests):
# Test set --disable
cmd_output = self.openstack(
'router set ' +
'--name ' + new_name +
' --description bbbb ' +
'--disable ' +
name
'router set '
+ '--name '
+ new_name
+ ' --description bbbb '
+ '--disable '
+ name
)
self.assertOutput('', cmd_output)
cmd_output = self.openstack(
'router show ' +
new_name,
'router show ' + new_name,
parse_output=True,
)
self.assertEqual(
@ -256,13 +249,10 @@ class RouterTests(common.NetworkTagTests):
# Test unset
cmd_output = self.openstack(
'router unset ' +
'--external-gateway ' +
new_name
'router unset ' + '--external-gateway ' + new_name
)
cmd_output = self.openstack(
'router show ' +
new_name,
'router show ' + new_name,
parse_output=True,
)
self.assertIsNone(cmd_output["external_gateway_info"])
@ -272,16 +262,15 @@ class RouterTests(common.NetworkTagTests):
return
cmd_output = self.openstack(
'router set ' +
'--distributed ' +
'--external-gateway public ' +
router_name
'router set '
+ '--distributed '
+ '--external-gateway public '
+ router_name
)
self.assertOutput('', cmd_output)
cmd_output = self.openstack(
'router show ' +
router_name,
'router show ' + router_name,
parse_output=True,
)
self.assertTrue(cmd_output["distributed"])
@ -297,38 +286,51 @@ class RouterTests(common.NetworkTagTests):
self.openstack(
'subnet create %s '
'--network %s --subnet-range 10.0.0.0/24' % (
subnet_name, network_name))
'--network %s --subnet-range 10.0.0.0/24'
% (subnet_name, network_name)
)
self.openstack('router create %s' % router_name)
self.addCleanup(self.openstack, 'router delete %s' % router_name)
self.openstack('router add subnet %s %s' % (router_name, subnet_name))
self.addCleanup(self.openstack, 'router remove subnet %s %s' % (
router_name, subnet_name))
self.addCleanup(
self.openstack,
'router remove subnet %s %s' % (router_name, subnet_name),
)
out1 = self.openstack(
'router add route %s '
'--route destination=10.0.10.0/24,gateway=10.0.0.10' %
router_name,
parse_output=True,),
out1 = (
self.openstack(
'router add route %s '
'--route destination=10.0.10.0/24,gateway=10.0.0.10'
% router_name,
parse_output=True,
),
)
self.assertEqual(1, len(out1[0]['routes']))
self.addCleanup(
self.openstack, 'router set %s --no-route' % router_name)
self.openstack, 'router set %s --no-route' % router_name
)
out2 = self.openstack(
'router add route %s '
'--route destination=10.0.10.0/24,gateway=10.0.0.10 '
'--route destination=10.0.11.0/24,gateway=10.0.0.11' %
router_name,
parse_output=True,),
out2 = (
self.openstack(
'router add route %s '
'--route destination=10.0.10.0/24,gateway=10.0.0.10 '
'--route destination=10.0.11.0/24,gateway=10.0.0.11'
% router_name,
parse_output=True,
),
)
self.assertEqual(2, len(out2[0]['routes']))
out3 = self.openstack(
'router remove route %s '
'--route destination=10.0.11.0/24,gateway=10.0.0.11 '
'--route destination=10.0.12.0/24,gateway=10.0.0.12' %
router_name,
parse_output=True,),
out3 = (
self.openstack(
'router remove route %s '
'--route destination=10.0.11.0/24,gateway=10.0.0.11 '
'--route destination=10.0.12.0/24,gateway=10.0.0.12'
% router_name,
parse_output=True,
),
)
self.assertEqual(1, len(out3[0]['routes']))

View File

@ -27,12 +27,12 @@ class SecurityGroupTests(common.NetworkTests):
self.NAME = uuid.uuid4().hex
self.OTHER_NAME = uuid.uuid4().hex
cmd_output = self.openstack(
'security group create ' +
self.NAME,
'security group create ' + self.NAME,
parse_output=True,
)
self.addCleanup(self.openstack,
'security group delete ' + cmd_output['id'])
self.addCleanup(
self.openstack, 'security group delete ' + cmd_output['id']
)
self.assertEqual(self.NAME, cmd_output['name'])
def test_security_group_list(self):
@ -42,8 +42,10 @@ class SecurityGroupTests(common.NetworkTests):
def test_security_group_set(self):
other_name = uuid.uuid4().hex
raw_output = self.openstack(
'security group set --description NSA --stateless --name ' +
other_name + ' ' + self.NAME
'security group set --description NSA --stateless --name '
+ other_name
+ ' '
+ self.NAME
)
self.assertEqual('', raw_output)

View File

@ -28,24 +28,26 @@ class SecurityGroupRuleTests(common.NetworkTests):
# Create the security group to hold the rule
cmd_output = self.openstack(
'security group create ' +
self.SECURITY_GROUP_NAME,
'security group create ' + self.SECURITY_GROUP_NAME,
parse_output=True,
)
self.addCleanup(self.openstack,
'security group delete ' + self.SECURITY_GROUP_NAME)
self.addCleanup(
self.openstack, 'security group delete ' + self.SECURITY_GROUP_NAME
)
self.assertEqual(self.SECURITY_GROUP_NAME, cmd_output['name'])
# Create the security group rule.
cmd_output = self.openstack(
'security group rule create ' +
self.SECURITY_GROUP_NAME + ' ' +
'--protocol tcp --dst-port 80:80 ' +
'--ingress --ethertype IPv4 ',
'security group rule create '
+ self.SECURITY_GROUP_NAME
+ ' '
+ '--protocol tcp --dst-port 80:80 '
+ '--ingress --ethertype IPv4 ',
parse_output=True,
)
self.addCleanup(self.openstack,
'security group rule delete ' + cmd_output['id'])
self.addCleanup(
self.openstack, 'security group rule delete ' + cmd_output['id']
)
self.SECURITY_GROUP_RULE_ID = cmd_output['id']
def test_security_group_rule_list(self):
@ -53,8 +55,9 @@ class SecurityGroupRuleTests(common.NetworkTests):
'security group rule list ' + self.SECURITY_GROUP_NAME,
parse_output=True,
)
self.assertIn(self.SECURITY_GROUP_RULE_ID,
[rule['ID'] for rule in cmd_output])
self.assertIn(
self.SECURITY_GROUP_RULE_ID, [rule['ID'] for rule in cmd_output]
)
def test_security_group_rule_show(self):
cmd_output = self.openstack(

View File

@ -29,8 +29,7 @@ class SubnetTests(common.NetworkTagTests):
# Create a network for the all subnet tests
cmd_output = cls.openstack(
'network create ' +
cls.NETWORK_NAME,
'network create ' + cls.NETWORK_NAME,
parse_output=True,
)
# Get network_id for assertEqual
@ -41,8 +40,7 @@ class SubnetTests(common.NetworkTagTests):
try:
if cls.haz_network:
raw_output = cls.openstack(
'network delete ' +
cls.NETWORK_NAME
'network delete ' + cls.NETWORK_NAME
)
cls.assertOutput('', raw_output)
finally:
@ -57,9 +55,9 @@ class SubnetTests(common.NetworkTagTests):
def test_subnet_create_and_delete(self):
"""Test create, delete multiple"""
name1 = uuid.uuid4().hex
cmd = ('subnet create --network ' +
self.NETWORK_NAME +
' --subnet-range')
cmd = (
'subnet create --network ' + self.NETWORK_NAME + ' --subnet-range'
)
cmd_output = self._subnet_create(cmd, name1)
self.assertEqual(
name1,
@ -70,9 +68,9 @@ class SubnetTests(common.NetworkTagTests):
cmd_output["network_id"],
)
name2 = uuid.uuid4().hex
cmd = ('subnet create --network ' +
self.NETWORK_NAME +
' --subnet-range')
cmd = (
'subnet create --network ' + self.NETWORK_NAME + ' --subnet-range'
)
cmd_output = self._subnet_create(cmd, name2)
self.assertEqual(
name2,
@ -83,17 +81,19 @@ class SubnetTests(common.NetworkTagTests):
cmd_output["network_id"],
)
del_output = self.openstack(
'subnet delete ' + name1 + ' ' + name2)
del_output = self.openstack('subnet delete ' + name1 + ' ' + name2)
self.assertOutput('', del_output)
def test_subnet_list(self):
"""Test create, list filter"""
name1 = uuid.uuid4().hex
name2 = uuid.uuid4().hex
cmd = ('subnet create ' +
'--network ' + self.NETWORK_NAME +
' --dhcp --subnet-range')
cmd = (
'subnet create '
+ '--network '
+ self.NETWORK_NAME
+ ' --dhcp --subnet-range'
)
cmd_output = self._subnet_create(cmd, name1)
self.addCleanup(self.openstack, 'subnet delete ' + name1)
@ -114,10 +114,13 @@ class SubnetTests(common.NetworkTagTests):
cmd_output["ip_version"],
)
cmd = ('subnet create ' +
'--network ' + self.NETWORK_NAME +
' --ip-version 6 --no-dhcp ' +
'--subnet-range')
cmd = (
'subnet create '
+ '--network '
+ self.NETWORK_NAME
+ ' --ip-version 6 --no-dhcp '
+ '--subnet-range'
)
cmd_output = self._subnet_create(cmd, name2, is_type_ipv4=False)
self.addCleanup(self.openstack, 'subnet delete ' + name2)
@ -140,8 +143,7 @@ class SubnetTests(common.NetworkTagTests):
# Test list --long
cmd_output = self.openstack(
'subnet list ' +
'--long ',
'subnet list ' + '--long ',
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -150,8 +152,7 @@ class SubnetTests(common.NetworkTagTests):
# Test list --name
cmd_output = self.openstack(
'subnet list ' +
'--name ' + name1,
'subnet list ' + '--name ' + name1,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -160,8 +161,7 @@ class SubnetTests(common.NetworkTagTests):
# Test list --ip-version
cmd_output = self.openstack(
'subnet list ' +
'--ip-version 6',
'subnet list ' + '--ip-version 6',
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -170,8 +170,7 @@ class SubnetTests(common.NetworkTagTests):
# Test list --network
cmd_output = self.openstack(
'subnet list ' +
'--network ' + self.NETWORK_ID,
'subnet list ' + '--network ' + self.NETWORK_ID,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -180,8 +179,7 @@ class SubnetTests(common.NetworkTagTests):
# Test list --no-dhcp
cmd_output = self.openstack(
'subnet list ' +
'--no-dhcp ',
'subnet list ' + '--no-dhcp ',
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -193,9 +191,12 @@ class SubnetTests(common.NetworkTagTests):
name = uuid.uuid4().hex
new_name = name + "_"
cmd = ('subnet create ' +
'--network ' + self.NETWORK_NAME +
' --description aaaa --subnet-range')
cmd = (
'subnet create '
+ '--network '
+ self.NETWORK_NAME
+ ' --description aaaa --subnet-range'
)
cmd_output = self._subnet_create(cmd, name)
self.addCleanup(self.openstack, 'subnet delete ' + new_name)
@ -210,19 +211,19 @@ class SubnetTests(common.NetworkTagTests):
# Test set --no-dhcp --name --gateway --description
cmd_output = self.openstack(
'subnet set ' +
'--name ' + new_name +
' --description bbbb ' +
'--no-dhcp ' +
'--gateway 10.10.11.1 ' +
'--service-type network:floatingip_agent_gateway ' +
name
'subnet set '
+ '--name '
+ new_name
+ ' --description bbbb '
+ '--no-dhcp '
+ '--gateway 10.10.11.1 '
+ '--service-type network:floatingip_agent_gateway '
+ name
)
self.assertOutput('', cmd_output)
cmd_output = self.openstack(
'subnet show ' +
new_name,
'subnet show ' + new_name,
parse_output=True,
)
self.assertEqual(
@ -248,15 +249,14 @@ class SubnetTests(common.NetworkTagTests):
# Test unset
cmd_output = self.openstack(
'subnet unset ' +
'--service-type network:floatingip_agent_gateway ' +
new_name
'subnet unset '
+ '--service-type network:floatingip_agent_gateway '
+ new_name
)
self.assertOutput('', cmd_output)
cmd_output = self.openstack(
'subnet show ' +
new_name,
'subnet show ' + new_name,
parse_output=True,
)
self.assertEqual(
@ -271,23 +271,32 @@ class SubnetTests(common.NetworkTagTests):
for i in range(4):
# Make a random subnet
if is_type_ipv4:
subnet = ".".join(map(
str,
(random.randint(0, 223) for _ in range(3))
)) + ".0/26"
subnet = (
".".join(
map(str, (random.randint(0, 223) for _ in range(3)))
)
+ ".0/26"
)
else:
subnet = ":".join(map(
str,
(hex(random.randint(0, 65535))[2:] for _ in range(7))
)) + ":0/112"
subnet = (
":".join(
map(
str,
(
hex(random.randint(0, 65535))[2:]
for _ in range(7)
),
)
)
+ ":0/112"
)
try:
cmd_output = self.openstack(
cmd + ' ' + subnet + ' ' +
name,
cmd + ' ' + subnet + ' ' + name,
parse_output=True,
)
except Exception:
if (i == 3):
if i == 3:
# raise the exception at the last time
raise
pass
@ -297,7 +306,11 @@ class SubnetTests(common.NetworkTagTests):
return cmd_output
def _create_resource_for_tag_test(self, name, args):
cmd = ('subnet create --network ' +
self.NETWORK_NAME + ' ' + args +
' --subnet-range')
cmd = (
'subnet create --network '
+ self.NETWORK_NAME
+ ' '
+ args
+ ' --subnet-range'
)
return self._subnet_create(cmd, name)

View File

@ -32,26 +32,14 @@ class SubnetPoolTests(common.NetworkTagTests):
name1 = uuid.uuid4().hex
cmd_output, pool_prefix = self._subnet_pool_create("", name1)
self.assertEqual(
name1,
cmd_output["name"]
)
self.assertEqual(
[pool_prefix],
cmd_output["prefixes"]
)
self.assertEqual(name1, cmd_output["name"])
self.assertEqual([pool_prefix], cmd_output["prefixes"])
name2 = uuid.uuid4().hex
cmd_output, pool_prefix = self._subnet_pool_create("", name2)
self.assertEqual(
name2,
cmd_output["name"]
)
self.assertEqual(
[pool_prefix],
cmd_output["prefixes"]
)
self.assertEqual(name2, cmd_output["name"])
self.assertEqual([pool_prefix], cmd_output["prefixes"])
del_output = self.openstack(
'subnet pool delete ' + name1 + ' ' + name2,
@ -85,8 +73,7 @@ class SubnetPoolTests(common.NetworkTagTests):
name2 = uuid.uuid4().hex
cmd_output, pool_prefix = self._subnet_pool_create(
'--project ' + demo_project_id +
' --no-share ',
'--project ' + demo_project_id + ' --no-share ',
name1,
)
self.addCleanup(self.openstack, 'subnet pool delete ' + name1)
@ -131,8 +118,7 @@ class SubnetPoolTests(common.NetworkTagTests):
# Test list --project
cmd_output = self.openstack(
'subnet pool list ' +
'--project ' + demo_project_id,
'subnet pool list ' + '--project ' + demo_project_id,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -141,8 +127,7 @@ class SubnetPoolTests(common.NetworkTagTests):
# Test list --share
cmd_output = self.openstack(
'subnet pool list ' +
'--share',
'subnet pool list ' + '--share',
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -151,8 +136,7 @@ class SubnetPoolTests(common.NetworkTagTests):
# Test list --name
cmd_output = self.openstack(
'subnet pool list ' +
'--name ' + name1,
'subnet pool list ' + '--name ' + name1,
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -161,8 +145,7 @@ class SubnetPoolTests(common.NetworkTagTests):
# Test list --long
cmd_output = self.openstack(
'subnet pool list ' +
'--long ',
'subnet pool list ' + '--long ',
parse_output=True,
)
names = [x["Name"] for x in cmd_output]
@ -175,11 +158,11 @@ class SubnetPoolTests(common.NetworkTagTests):
name = uuid.uuid4().hex
new_name = name + "_"
cmd_output, pool_prefix = self._subnet_pool_create(
'--default-prefix-length 16 ' +
'--min-prefix-length 16 ' +
'--max-prefix-length 32 ' +
'--description aaaa ' +
'--default-quota 10 ',
'--default-prefix-length 16 '
+ '--min-prefix-length 16 '
+ '--max-prefix-length 32 '
+ '--description aaaa '
+ '--default-quota 10 ',
name,
)
@ -218,21 +201,21 @@ class SubnetPoolTests(common.NetworkTagTests):
# Test set
cmd_output = self.openstack(
'subnet pool set ' +
'--name ' + new_name +
' --description bbbb ' +
' --pool-prefix 10.110.0.0/16 ' +
'--default-prefix-length 8 ' +
'--min-prefix-length 8 ' +
'--max-prefix-length 16 ' +
'--default-quota 20 ' +
name,
'subnet pool set '
+ '--name '
+ new_name
+ ' --description bbbb '
+ ' --pool-prefix 10.110.0.0/16 '
+ '--default-prefix-length 8 '
+ '--min-prefix-length 8 '
+ '--max-prefix-length 16 '
+ '--default-quota 20 '
+ name,
)
self.assertOutput('', cmd_output)
cmd_output = self.openstack(
'subnet pool show ' +
new_name,
'subnet pool show ' + new_name,
parse_output=True,
)
self.assertEqual(
@ -300,26 +283,42 @@ class SubnetPoolTests(common.NetworkTagTests):
for i in range(4):
# Create a random prefix
if is_type_ipv4:
pool_prefix = ".".join(map(
str,
(random.randint(0, 223) for _ in range(2)),
)) + ".0.0/16"
pool_prefix = (
".".join(
map(
str,
(random.randint(0, 223) for _ in range(2)),
)
)
+ ".0.0/16"
)
else:
pool_prefix = ":".join(map(
str,
(hex(random.randint(0, 65535))[2:] for _ in range(6)),
)) + ":0:0/96"
pool_prefix = (
":".join(
map(
str,
(
hex(random.randint(0, 65535))[2:]
for _ in range(6)
),
)
)
+ ":0:0/96"
)
try:
cmd_output = self.openstack(
'subnet pool create ' +
cmd + ' ' +
'--pool-prefix ' + pool_prefix + ' ' +
name,
'subnet pool create '
+ cmd
+ ' '
+ '--pool-prefix '
+ pool_prefix
+ ' '
+ name,
parse_output=True,
)
except Exception:
if (i == 3):
if i == 3:
# Raise the exception the last time
raise
pass

View File

@ -49,7 +49,6 @@ def _add_compute_argument(parser):
class FakeNetworkAndComputeCommand(common.NetworkAndComputeCommand):
def update_parser_common(self, parser):
return _add_common_argument(parser)
@ -67,7 +66,6 @@ class FakeNetworkAndComputeCommand(common.NetworkAndComputeCommand):
class FakeNetworkAndComputeLister(common.NetworkAndComputeLister):
def update_parser_common(self, parser):
return _add_common_argument(parser)
@ -85,7 +83,6 @@ class FakeNetworkAndComputeLister(common.NetworkAndComputeLister):
class FakeNetworkAndComputeShowOne(common.NetworkAndComputeShowOne):
def update_parser_common(self, parser):
return _add_common_argument(parser)
@ -103,11 +100,12 @@ class FakeNetworkAndComputeShowOne(common.NetworkAndComputeShowOne):
class FakeCreateNeutronCommandWithExtraArgs(
common.NeutronCommandWithExtraArgs):
common.NeutronCommandWithExtraArgs
):
def get_parser(self, prog_name):
parser = super(FakeCreateNeutronCommandWithExtraArgs,
self).get_parser(prog_name)
parser = super(FakeCreateNeutronCommandWithExtraArgs, self).get_parser(
prog_name
)
parser.add_argument(
'--known-attribute',
)
@ -119,12 +117,12 @@ class FakeCreateNeutronCommandWithExtraArgs(
if 'known_attribute' in parsed_args:
attrs['known_attribute'] = parsed_args.known_attribute
attrs.update(
self._parse_extra_properties(parsed_args.extra_properties))
self._parse_extra_properties(parsed_args.extra_properties)
)
client.test_create_action(**attrs)
class TestNetworkAndCompute(utils.TestCommand):
def setUp(self):
super(TestNetworkAndCompute, self).setUp()
@ -134,26 +132,22 @@ class TestNetworkAndCompute(utils.TestCommand):
self.app.client_manager.network = mock.Mock()
self.network = self.app.client_manager.network
self.network.network_action = mock.Mock(
return_value='take_action_network')
return_value='take_action_network'
)
# Create compute client mocks.
self.app.client_manager.compute = mock.Mock()
self.compute = self.app.client_manager.compute
self.compute.compute_action = mock.Mock(
return_value='take_action_compute')
return_value='take_action_compute'
)
# Subclasses can override the command object to test.
self.cmd = FakeNetworkAndComputeCommand(self.app, self.namespace)
def test_take_action_network(self):
arglist = [
'common',
'network'
]
verifylist = [
('common', 'common'),
('network', 'network')
]
arglist = ['common', 'network']
verifylist = [('common', 'common'), ('network', 'network')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
@ -161,14 +155,8 @@ class TestNetworkAndCompute(utils.TestCommand):
self.assertEqual('take_action_network', result)
def test_take_action_compute(self):
arglist = [
'common',
'compute'
]
verifylist = [
('common', 'common'),
('compute', 'compute')
]
arglist = ['common', 'compute']
verifylist = [('common', 'common'), ('compute', 'compute')]
self.app.client_manager.network_endpoint_enabled = False
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -178,21 +166,18 @@ class TestNetworkAndCompute(utils.TestCommand):
class TestNetworkAndComputeCommand(TestNetworkAndCompute):
def setUp(self):
super(TestNetworkAndComputeCommand, self).setUp()
self.cmd = FakeNetworkAndComputeCommand(self.app, self.namespace)
class TestNetworkAndComputeLister(TestNetworkAndCompute):
def setUp(self):
super(TestNetworkAndComputeLister, self).setUp()
self.cmd = FakeNetworkAndComputeLister(self.app, self.namespace)
class TestNetworkAndComputeShowOne(TestNetworkAndCompute):
def setUp(self):
super(TestNetworkAndComputeShowOne, self).setUp()
self.cmd = FakeNetworkAndComputeShowOne(self.app, self.namespace)
@ -200,18 +185,25 @@ class TestNetworkAndComputeShowOne(TestNetworkAndCompute):
def test_take_action_with_http_exception(self):
with mock.patch.object(self.cmd, 'take_action_network') as m_action:
m_action.side_effect = openstack.exceptions.HttpException("bar")
self.assertRaisesRegex(exceptions.CommandError, "bar",
self.cmd.take_action, mock.Mock())
self.assertRaisesRegex(
exceptions.CommandError,
"bar",
self.cmd.take_action,
mock.Mock(),
)
self.app.client_manager.network_endpoint_enabled = False
with mock.patch.object(self.cmd, 'take_action_compute') as m_action:
m_action.side_effect = openstack.exceptions.HttpException("bar")
self.assertRaisesRegex(exceptions.CommandError, "bar",
self.cmd.take_action, mock.Mock())
self.assertRaisesRegex(
exceptions.CommandError,
"bar",
self.cmd.take_action,
mock.Mock(),
)
class TestNeutronCommandWithExtraArgs(utils.TestCommand):
def setUp(self):
super(TestNeutronCommandWithExtraArgs, self).setUp()
@ -223,106 +215,143 @@ class TestNeutronCommandWithExtraArgs(utils.TestCommand):
# Subclasses can override the command object to test.
self.cmd = FakeCreateNeutronCommandWithExtraArgs(
self.app, self.namespace)
self.app, self.namespace
)
def test_create_extra_attributes_default_type(self):
arglist = [
'--known-attribute', 'known-value',
'--extra-property', 'name=extra_name,value=extra_value'
'--known-attribute',
'known-value',
'--extra-property',
'name=extra_name,value=extra_value',
]
verifylist = [
('known_attribute', 'known-value'),
('extra_properties', [{'name': 'extra_name',
'value': 'extra_value'}])
(
'extra_properties',
[{'name': 'extra_name', 'value': 'extra_value'}],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.network.test_create_action.assert_called_with(
known_attribute='known-value', extra_name='extra_value')
known_attribute='known-value', extra_name='extra_value'
)
def test_create_extra_attributes_string(self):
arglist = [
'--known-attribute', 'known-value',
'--extra-property', 'type=str,name=extra_name,value=extra_value'
'--known-attribute',
'known-value',
'--extra-property',
'type=str,name=extra_name,value=extra_value',
]
verifylist = [
('known_attribute', 'known-value'),
('extra_properties', [{'name': 'extra_name',
'type': 'str',
'value': 'extra_value'}])
(
'extra_properties',
[
{
'name': 'extra_name',
'type': 'str',
'value': 'extra_value',
}
],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.network.test_create_action.assert_called_with(
known_attribute='known-value', extra_name='extra_value')
known_attribute='known-value', extra_name='extra_value'
)
def test_create_extra_attributes_bool(self):
arglist = [
'--known-attribute', 'known-value',
'--extra-property', 'type=bool,name=extra_name,value=TrUe'
'--known-attribute',
'known-value',
'--extra-property',
'type=bool,name=extra_name,value=TrUe',
]
verifylist = [
('known_attribute', 'known-value'),
('extra_properties', [{'name': 'extra_name',
'type': 'bool',
'value': 'TrUe'}])
(
'extra_properties',
[{'name': 'extra_name', 'type': 'bool', 'value': 'TrUe'}],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.network.test_create_action.assert_called_with(
known_attribute='known-value', extra_name=True)
known_attribute='known-value', extra_name=True
)
def test_create_extra_attributes_int(self):
arglist = [
'--known-attribute', 'known-value',
'--extra-property', 'type=int,name=extra_name,value=8'
'--known-attribute',
'known-value',
'--extra-property',
'type=int,name=extra_name,value=8',
]
verifylist = [
('known_attribute', 'known-value'),
('extra_properties', [{'name': 'extra_name',
'type': 'int',
'value': '8'}])
(
'extra_properties',
[{'name': 'extra_name', 'type': 'int', 'value': '8'}],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.network.test_create_action.assert_called_with(
known_attribute='known-value', extra_name=8)
known_attribute='known-value', extra_name=8
)
def test_create_extra_attributes_list(self):
arglist = [
'--known-attribute', 'known-value',
'--extra-property', 'type=list,name=extra_name,value=v_1;v_2'
'--known-attribute',
'known-value',
'--extra-property',
'type=list,name=extra_name,value=v_1;v_2',
]
verifylist = [
('known_attribute', 'known-value'),
('extra_properties', [{'name': 'extra_name',
'type': 'list',
'value': 'v_1;v_2'}])
(
'extra_properties',
[{'name': 'extra_name', 'type': 'list', 'value': 'v_1;v_2'}],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.network.test_create_action.assert_called_with(
known_attribute='known-value', extra_name=['v_1', 'v_2'])
known_attribute='known-value', extra_name=['v_1', 'v_2']
)
def test_create_extra_attributes_dict(self):
arglist = [
'--known-attribute', 'known-value',
'--extra-property', 'type=dict,name=extra_name,value=n1:v1;n2:v2'
'--known-attribute',
'known-value',
'--extra-property',
'type=dict,name=extra_name,value=n1:v1;n2:v2',
]
verifylist = [
('known_attribute', 'known-value'),
('extra_properties', [{'name': 'extra_name',
'type': 'dict',
'value': 'n1:v1;n2:v2'}])
(
'extra_properties',
[
{
'name': 'extra_name',
'type': 'dict',
'value': 'n1:v1;n2:v2',
}
],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.network.test_create_action.assert_called_with(
known_attribute='known-value',
extra_name={'n1': 'v1', 'n2': 'v2'})
known_attribute='known-value', extra_name={'n1': 'v1', 'n2': 'v2'}
)

View File

@ -18,7 +18,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestUtils(tests_utils.TestCase):
def test_str2bool(self):
self.assertTrue(utils.str2bool("true"))
self.assertTrue(utils.str2bool("True"))
@ -35,25 +34,19 @@ class TestUtils(tests_utils.TestCase):
self.assertIsNone(utils.str2bool(None))
def test_str2list(self):
self.assertEqual(
['a', 'b', 'c'], utils.str2list("a;b;c"))
self.assertEqual(
['abc'], utils.str2list("abc"))
self.assertEqual(['a', 'b', 'c'], utils.str2list("a;b;c"))
self.assertEqual(['abc'], utils.str2list("abc"))
self.assertEqual([], utils.str2list(""))
self.assertEqual([], utils.str2list(None))
def test_str2dict(self):
self.assertEqual({'a': 'aaa', 'b': '2'}, utils.str2dict('a:aaa;b:2'))
self.assertEqual(
{'a': 'aaa', 'b': '2'},
utils.str2dict('a:aaa;b:2'))
self.assertEqual(
{'a': 'aaa;b;c', 'd': 'ddd'},
utils.str2dict('a:aaa;b;c;d:ddd'))
{'a': 'aaa;b;c', 'd': 'ddd'}, utils.str2dict('a:aaa;b;c;d:ddd')
)
self.assertEqual({}, utils.str2dict(""))
self.assertEqual({}, utils.str2dict(None))
self.assertRaises(
exceptions.CommandError,
utils.str2dict, "aaa;b:2")
self.assertRaises(exceptions.CommandError, utils.str2dict, "aaa;b:2")

View File

@ -61,16 +61,38 @@ RULE_TYPE_BANDWIDTH_LIMIT = 'bandwidth-limit'
RULE_TYPE_DSCP_MARKING = 'dscp-marking'
RULE_TYPE_MINIMUM_BANDWIDTH = 'minimum-bandwidth'
RULE_TYPE_MINIMUM_PACKET_RATE = 'minimum-packet-rate'
VALID_QOS_RULES = [RULE_TYPE_BANDWIDTH_LIMIT,
RULE_TYPE_DSCP_MARKING,
RULE_TYPE_MINIMUM_BANDWIDTH,
RULE_TYPE_MINIMUM_PACKET_RATE]
VALID_DSCP_MARKS = [0, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32,
34, 36, 38, 40, 46, 48, 56]
VALID_QOS_RULES = [
RULE_TYPE_BANDWIDTH_LIMIT,
RULE_TYPE_DSCP_MARKING,
RULE_TYPE_MINIMUM_BANDWIDTH,
RULE_TYPE_MINIMUM_PACKET_RATE,
]
VALID_DSCP_MARKS = [
0,
8,
10,
12,
14,
16,
18,
20,
22,
24,
26,
28,
30,
32,
34,
36,
38,
40,
46,
48,
56,
]
class FakeNetworkV2Client(object):
def __init__(self, **kwargs):
self.session = mock.Mock()
self.extensions = mock.Mock()
@ -78,7 +100,6 @@ class FakeNetworkV2Client(object):
class TestNetworkV2(utils.TestCommand):
def setUp(self):
super(TestNetworkV2, self).setUp()
@ -92,8 +113,9 @@ class TestNetworkV2(utils.TestCommand):
)
self.app.client_manager.sdk_connection = mock.Mock()
self.app.client_manager.sdk_connection.network = \
self.app.client_manager.sdk_connection.network = (
self.app.client_manager.network
)
self.app.client_manager.identity = (
identity_fakes_v3.FakeIdentityv3Client(
@ -124,15 +146,15 @@ class FakeExtension(object):
'description': 'description-' + uuid.uuid4().hex,
'updated': '2013-07-09T12:00:0-00:00',
'alias': 'Dystopian',
'links': '[{"href":''"https://github.com/os/network", "type"}]',
'links': '[{"href":' '"https://github.com/os/network", "type"}]',
}
# Overwrite default attributes.
extension_info.update(attrs)
extension = fakes.FakeResource(
info=copy.deepcopy(extension_info),
loaded=True)
info=copy.deepcopy(extension_info), loaded=True
)
return extension
@ -169,8 +191,8 @@ class FakeNetworkQosPolicy(object):
qos_policy_attrs.update(attrs)
qos_policy = fakes.FakeResource(
info=copy.deepcopy(qos_policy_attrs),
loaded=True)
info=copy.deepcopy(qos_policy_attrs), loaded=True
)
# Set attributes with special mapping in OpenStack SDK.
qos_policy.is_shared = qos_policy_attrs['shared']
@ -191,7 +213,8 @@ class FakeNetworkQosPolicy(object):
qos_policies = []
for i in range(0, count):
qos_policies.append(
FakeNetworkQosPolicy.create_one_qos_policy(attrs))
FakeNetworkQosPolicy.create_one_qos_policy(attrs)
)
return qos_policies
@ -240,8 +263,8 @@ class FakeNetworkSecGroup(object):
}
security_group = fakes.FakeResource(
info=copy.deepcopy(security_group_attrs),
loaded=True)
info=copy.deepcopy(security_group_attrs), loaded=True
)
return security_group
@ -285,8 +308,9 @@ class FakeNetworkQosRule(object):
# Overwrite default attributes.
qos_rule_attrs.update(attrs)
qos_rule = fakes.FakeResource(info=copy.deepcopy(qos_rule_attrs),
loaded=True)
qos_rule = fakes.FakeResource(
info=copy.deepcopy(qos_rule_attrs), loaded=True
)
return qos_rule
@ -322,7 +346,7 @@ class FakeNetworkQosRule(object):
qos minimum bandwidth rules
"""
if qos_rules is None:
qos_rules = (FakeNetworkQosRule.create_qos_rules(count))
qos_rules = FakeNetworkQosRule.create_qos_rules(count)
return mock.Mock(side_effect=qos_rules)
@ -350,8 +374,8 @@ class FakeNetworkQosRuleType(object):
qos_rule_type_attrs.update(attrs)
return fakes.FakeResource(
info=copy.deepcopy(qos_rule_type_attrs),
loaded=True)
info=copy.deepcopy(qos_rule_type_attrs), loaded=True
)
@staticmethod
def create_qos_rule_types(attrs=None, count=2):
@ -367,7 +391,8 @@ class FakeNetworkQosRuleType(object):
qos_rule_types = []
for i in range(0, count):
qos_rule_types.append(
FakeNetworkQosRuleType.create_one_qos_rule_type(attrs))
FakeNetworkQosRuleType.create_one_qos_rule_type(attrs)
)
return qos_rule_types
@ -408,8 +433,9 @@ class FakeRouter(object):
# Overwrite default attributes.
router_attrs.update(attrs)
router = fakes.FakeResource(info=copy.deepcopy(router_attrs),
loaded=True)
router = fakes.FakeResource(
info=copy.deepcopy(router_attrs), loaded=True
)
# Set attributes with special mapping in OpenStack SDK.
router.is_admin_state_up = router_attrs['admin_state_up']
@ -485,8 +511,8 @@ class FakeSecurityGroup(object):
security_group_attrs.update(attrs)
security_group = fakes.FakeResource(
info=copy.deepcopy(security_group_attrs),
loaded=True)
info=copy.deepcopy(security_group_attrs), loaded=True
)
return security_group
@ -504,7 +530,8 @@ class FakeSecurityGroup(object):
security_groups = []
for i in range(0, count):
security_groups.append(
FakeSecurityGroup.create_one_security_group(attrs))
FakeSecurityGroup.create_one_security_group(attrs)
)
return security_groups
@ -544,8 +571,8 @@ class FakeSecurityGroupRule(object):
# Set default attributes.
security_group_rule_attrs = {
'description': 'security-group-rule-description-' +
uuid.uuid4().hex,
'description': 'security-group-rule-description-'
+ uuid.uuid4().hex,
'direction': 'ingress',
'ether_type': 'IPv4',
'id': 'security-group-rule-id-' + uuid.uuid4().hex,
@ -564,8 +591,8 @@ class FakeSecurityGroupRule(object):
security_group_rule_attrs.update(attrs)
security_group_rule = fakes.FakeResource(
info=copy.deepcopy(security_group_rule_attrs),
loaded=True)
info=copy.deepcopy(security_group_rule_attrs), loaded=True
)
return security_group_rule
@ -583,7 +610,8 @@ class FakeSecurityGroupRule(object):
security_group_rules = []
for i in range(0, count):
security_group_rules.append(
FakeSecurityGroupRule.create_one_security_group_rule(attrs))
FakeSecurityGroupRule.create_one_security_group_rule(attrs)
)
return security_group_rules
@ -604,7 +632,8 @@ class FakeSecurityGroupRule(object):
"""
if security_group_rules is None:
security_group_rules = (
FakeSecurityGroupRule.create_security_group_rules(count))
FakeSecurityGroupRule.create_security_group_rules(count)
)
return mock.Mock(side_effect=security_group_rules)
@ -649,8 +678,9 @@ class FakeSubnet(object):
# Overwrite default attributes.
subnet_attrs.update(attrs)
subnet = fakes.FakeResource(info=copy.deepcopy(subnet_attrs),
loaded=True)
subnet = fakes.FakeResource(
info=copy.deepcopy(subnet_attrs), loaded=True
)
# Set attributes with special mappings in OpenStack SDK.
subnet.is_dhcp_enabled = subnet_attrs['enable_dhcp']
@ -731,8 +761,7 @@ class FakeFloatingIP(object):
floating_ip_attrs.update(attrs)
floating_ip = fakes.FakeResource(
info=copy.deepcopy(floating_ip_attrs),
loaded=True
info=copy.deepcopy(floating_ip_attrs), loaded=True
)
return floating_ip
@ -793,8 +822,8 @@ class FakeNetworkMeter(object):
meter_attrs.update(attrs)
meter = fakes.FakeResource(
info=copy.deepcopy(meter_attrs),
loaded=True)
info=copy.deepcopy(meter_attrs), loaded=True
)
return meter
@ -804,16 +833,14 @@ class FakeNetworkMeter(object):
meters = []
for i in range(0, count):
meters.append(FakeNetworkMeter.
create_one_meter(attrs))
meters.append(FakeNetworkMeter.create_one_meter(attrs))
return meters
@staticmethod
def get_meter(meter=None, count=2):
"""Get a list of meters"""
if meter is None:
meter = (FakeNetworkMeter.
create_meter(count))
meter = FakeNetworkMeter.create_meter(count)
return mock.Mock(side_effect=meter)
@ -840,8 +867,8 @@ class FakeNetworkMeterRule(object):
meter_rule_attrs.update(attrs)
meter_rule = fakes.FakeResource(
info=copy.deepcopy(meter_rule_attrs),
loaded=True)
info=copy.deepcopy(meter_rule_attrs), loaded=True
)
return meter_rule
@ -851,16 +878,14 @@ class FakeNetworkMeterRule(object):
meter_rules = []
for i in range(0, count):
meter_rules.append(FakeNetworkMeterRule.
create_one_rule(attrs))
meter_rules.append(FakeNetworkMeterRule.create_one_rule(attrs))
return meter_rules
@staticmethod
def get_meter_rule(meter_rule=None, count=2):
"""Get a list of meter rules"""
if meter_rule is None:
meter_rule = (FakeNetworkMeterRule.
create_meter_rule(count))
meter_rule = FakeNetworkMeterRule.create_meter_rule(count)
return mock.Mock(side_effect=meter_rule)
@ -901,13 +926,13 @@ class FakeSubnetPool(object):
subnet_pool_attrs.update(attrs)
subnet_pool = fakes.FakeResource(
info=copy.deepcopy(subnet_pool_attrs),
loaded=True
info=copy.deepcopy(subnet_pool_attrs), loaded=True
)
# Set attributes with special mapping in OpenStack SDK.
subnet_pool.default_prefix_length = \
subnet_pool_attrs['default_prefixlen']
subnet_pool.default_prefix_length = subnet_pool_attrs[
'default_prefixlen'
]
subnet_pool.is_shared = subnet_pool_attrs['shared']
subnet_pool.maximum_prefix_length = subnet_pool_attrs['max_prefixlen']
subnet_pool.minimum_prefix_length = subnet_pool_attrs['min_prefixlen']
@ -927,9 +952,7 @@ class FakeSubnetPool(object):
"""
subnet_pools = []
for i in range(0, count):
subnet_pools.append(
FakeSubnetPool.create_one_subnet_pool(attrs)
)
subnet_pools.append(FakeSubnetPool.create_one_subnet_pool(attrs))
return subnet_pools
@ -971,8 +994,8 @@ class FakeNetworkServiceProvider(object):
service_provider.update(attrs)
provider = fakes.FakeResource(
info=copy.deepcopy(service_provider),
loaded=True)
info=copy.deepcopy(service_provider), loaded=True
)
provider.is_default = service_provider['default']
return provider
@ -983,9 +1006,11 @@ class FakeNetworkServiceProvider(object):
service_providers = []
for i in range(0, count):
service_providers.append(FakeNetworkServiceProvider.
create_one_network_service_provider(
attrs))
service_providers.append(
FakeNetworkServiceProvider.create_one_network_service_provider(
attrs
)
)
return service_providers
@ -1006,13 +1031,14 @@ class FakeQuota(object):
'security_groups': 10,
'security_group_rules': 100,
'subnets': 20,
'subnet_pools': 30}
'subnet_pools': 30,
}
quota_attrs.update(attrs)
quota = fakes.FakeResource(
info=copy.deepcopy(quota_attrs),
loaded=True)
info=copy.deepcopy(quota_attrs), loaded=True
)
return quota
@staticmethod
@ -1029,13 +1055,14 @@ class FakeQuota(object):
'security_group': 30,
'security_group_rule': 200,
'subnet': 10,
'subnetpool': 20}
'subnetpool': 20,
}
quota_attrs.update(attrs)
quota = fakes.FakeResource(
info=copy.deepcopy(quota_attrs),
loaded=True)
info=copy.deepcopy(quota_attrs), loaded=True
)
return quota
@staticmethod
@ -1052,18 +1079,19 @@ class FakeQuota(object):
'security_groups': {'used': 0, 'reserved': 0, 'limit': 10},
'security_group_rules': {'used': 0, 'reserved': 0, 'limit': 100},
'subnets': {'used': 0, 'reserved': 0, 'limit': 20},
'subnet_pools': {'used': 0, 'reserved': 0, 'limit': 30}}
'subnet_pools': {'used': 0, 'reserved': 0, 'limit': 30},
}
quota_attrs.update(attrs)
quota = fakes.FakeResource(
info=copy.deepcopy(quota_attrs),
loaded=True)
info=copy.deepcopy(quota_attrs), loaded=True
)
return quota
class FakeFloatingIPPortForwarding(object):
""""Fake one or more Port forwarding"""
"""Fake one or more Port forwarding"""
@staticmethod
def create_one_port_forwarding(attrs=None, use_range=False):
@ -1113,8 +1141,7 @@ class FakeFloatingIPPortForwarding(object):
port_forwarding_attrs.update(attrs)
port_forwarding = fakes.FakeResource(
info=copy.deepcopy(port_forwarding_attrs),
loaded=True
info=copy.deepcopy(port_forwarding_attrs), loaded=True
)
return port_forwarding
@ -1122,20 +1149,21 @@ class FakeFloatingIPPortForwarding(object):
def create_port_forwardings(attrs=None, count=2, use_range=False):
"""Create multiple fake Port Forwarding.
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of Port Forwarding rule to fake
:param Boolean use_range:
A boolean which defines if we will use ranges or not
:return:
A list of FakeResource objects faking the Port Forwardings
"""
:param Dictionary attrs:
A dictionary with all attributes
:param int count:
The number of Port Forwarding rule to fake
:param Boolean use_range:
A boolean which defines if we will use ranges or not
:return:
A list of FakeResource objects faking the Port Forwardings
"""
port_forwardings = []
for i in range(0, count):
port_forwardings.append(
FakeFloatingIPPortForwarding.create_one_port_forwarding(
attrs, use_range=use_range)
attrs, use_range=use_range
)
)
return port_forwardings
@ -1159,14 +1187,15 @@ class FakeFloatingIPPortForwarding(object):
if port_forwardings is None:
port_forwardings = (
FakeFloatingIPPortForwarding.create_port_forwardings(
count, use_range=use_range)
count, use_range=use_range
)
)
return mock.Mock(side_effect=port_forwardings)
class FakeL3ConntrackHelper(object):
""""Fake one or more L3 conntrack helper"""
"""Fake one or more L3 conntrack helper"""
@staticmethod
def create_one_l3_conntrack_helper(attrs=None):
@ -1178,9 +1207,7 @@ class FakeL3ConntrackHelper(object):
A FakeResource object with protocol, port, etc.
"""
attrs = attrs or {}
router_id = (
attrs.get('router_id') or 'router-id-' + uuid.uuid4().hex
)
router_id = attrs.get('router_id') or 'router-id-' + uuid.uuid4().hex
# Set default attributes.
ct_attrs = {
'id': uuid.uuid4().hex,
@ -1194,10 +1221,7 @@ class FakeL3ConntrackHelper(object):
# Overwrite default attributes.
ct_attrs.update(attrs)
ct = fakes.FakeResource(
info=copy.deepcopy(ct_attrs),
loaded=True
)
ct = fakes.FakeResource(info=copy.deepcopy(ct_attrs), loaded=True)
return ct
@staticmethod
@ -1234,8 +1258,8 @@ class FakeL3ConntrackHelper(object):
L3 conntrack helpers
"""
if ct_helpers is None:
ct_helpers = (
FakeL3ConntrackHelper.create_l3_conntrack_helpers(count)
ct_helpers = FakeL3ConntrackHelper.create_l3_conntrack_helpers(
count
)
return mock.Mock(side_effect=ct_helpers)
@ -1456,7 +1480,8 @@ def create_one_ip_availability(attrs=None):
network_ip_attrs.update(attrs)
network_ip_availability = _ip_availability.NetworkIPAvailability(
**network_ip_attrs)
**network_ip_attrs
)
return network_ip_availability
@ -1684,8 +1709,10 @@ def create_one_network_segment_range(attrs=None):
'physical_network': 'physical-network-name-' + fake_uuid,
'minimum': 100,
'maximum': 106,
'used': {104: '3312e4ba67864b2eb53f3f41432f8efc',
106: '3312e4ba67864b2eb53f3f41432f8efc'},
'used': {
104: '3312e4ba67864b2eb53f3f41432f8efc',
106: '3312e4ba67864b2eb53f3f41432f8efc',
},
'available': [100, 101, 102, 103, 105],
'location': 'MUNCHMUNCHMUNCH',
}
@ -1693,8 +1720,9 @@ def create_one_network_segment_range(attrs=None):
# Overwrite default attributes.
network_segment_range_attrs.update(attrs)
network_segment_range = (
_segment_range.NetworkSegmentRange(**network_segment_range_attrs))
network_segment_range = _segment_range.NetworkSegmentRange(
**network_segment_range_attrs
)
return network_segment_range
@ -1744,8 +1772,12 @@ def create_one_port(attrs=None):
'dns_domain': 'dns-domain-' + uuid.uuid4().hex,
'dns_name': 'dns-name-' + uuid.uuid4().hex,
'extra_dhcp_opts': [{}],
'fixed_ips': [{'ip_address': '10.0.0.3',
'subnet_id': 'subnet-id-' + uuid.uuid4().hex}],
'fixed_ips': [
{
'ip_address': '10.0.0.3',
'subnet_id': 'subnet-id-' + uuid.uuid4().hex,
}
],
'id': 'port-id-' + uuid.uuid4().hex,
'mac_address': 'fa:16:3e:a9:4e:72',
'name': 'port-name-' + uuid.uuid4().hex,
@ -2063,9 +2095,9 @@ def create_one_local_ip_association(attrs=None):
# Overwrite default attributes.
local_ip_association_attrs.update(attrs)
local_ip_association = (
_local_ip_association.LocalIPAssociation(
**local_ip_association_attrs))
local_ip_association = _local_ip_association.LocalIPAssociation(
**local_ip_association_attrs
)
return local_ip_association
@ -2116,12 +2148,8 @@ def create_one_ndp_proxy(attrs=None):
A FakeResource object with router_id, port_id, etc.
"""
attrs = attrs or {}
router_id = (
attrs.get('router_id') or 'router-id-' + uuid.uuid4().hex
)
port_id = (
attrs.get('port_id') or 'port-id-' + uuid.uuid4().hex
)
router_id = attrs.get('router_id') or 'router-id-' + uuid.uuid4().hex
port_id = attrs.get('port_id') or 'port-id-' + uuid.uuid4().hex
# Set default attributes.
np_attrs = {
'id': uuid.uuid4().hex,
@ -2152,9 +2180,7 @@ def create_ndp_proxies(attrs=None, count=2):
"""
ndp_proxies = []
for i in range(0, count):
ndp_proxies.append(
create_one_ndp_proxy(attrs)
)
ndp_proxies.append(create_one_ndp_proxy(attrs))
return ndp_proxies
@ -2173,9 +2199,7 @@ def get_ndp_proxies(ndp_proxies=None, count=2):
ndp proxy
"""
if ndp_proxies is None:
ndp_proxies = (
create_ndp_proxies(count)
)
ndp_proxies = create_ndp_proxies(count)
return mock.Mock(side_effect=ndp_proxies)
@ -2198,10 +2222,13 @@ def create_one_trunk(attrs=None):
'admin_state_up': True,
'project_id': 'project-id-' + uuid.uuid4().hex,
'status': 'ACTIVE',
'sub_ports': [{'port_id': 'subport-' +
uuid.uuid4().hex,
'segmentation_type': 'vlan',
'segmentation_id': 100}],
'sub_ports': [
{
'port_id': 'subport-' + uuid.uuid4().hex,
'segmentation_type': 'vlan',
'segmentation_id': 100,
}
],
}
# Overwrite default attributes.
trunk_attrs.update(attrs)

View File

@ -23,7 +23,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestAddressGroup(network_fakes.TestNetworkV2):
def setUp(self):
super(TestAddressGroup, self).setUp()
@ -36,16 +35,14 @@ class TestAddressGroup(network_fakes.TestNetworkV2):
class TestCreateAddressGroup(TestAddressGroup):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
# The new address group created.
new_address_group = (
network_fakes.create_one_address_group(
attrs={
'project_id': project.id,
}
))
new_address_group = network_fakes.create_one_address_group(
attrs={
'project_id': project.id,
}
)
columns = (
'addresses',
'description',
@ -64,7 +61,8 @@ class TestCreateAddressGroup(TestAddressGroup):
def setUp(self):
super(TestCreateAddressGroup, self).setUp()
self.network.create_address_group = mock.Mock(
return_value=self.new_address_group)
return_value=self.new_address_group
)
# Get the command object to test
self.cmd = address_group.CreateAddressGroup(self.app, self.namespace)
@ -77,8 +75,13 @@ class TestCreateAddressGroup(TestAddressGroup):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
@ -92,21 +95,27 @@ class TestCreateAddressGroup(TestAddressGroup):
]
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.network.create_address_group.assert_called_once_with(**{
'name': self.new_address_group.name,
'addresses': [],
})
self.network.create_address_group.assert_called_once_with(
**{
'name': self.new_address_group.name,
'addresses': [],
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
def test_create_all_options(self):
arglist = [
'--project', self.project.name,
'--project-domain', self.domain.name,
'--address', '10.0.0.1',
'--description', self.new_address_group.description,
'--project',
self.project.name,
'--project-domain',
self.domain.name,
'--address',
'10.0.0.1',
'--description',
self.new_address_group.description,
self.new_address_group.name,
]
verifylist = [
@ -118,20 +127,21 @@ class TestCreateAddressGroup(TestAddressGroup):
]
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.network.create_address_group.assert_called_once_with(**{
'addresses': ['10.0.0.1/32'],
'project_id': self.project.id,
'name': self.new_address_group.name,
'description': self.new_address_group.description,
})
self.network.create_address_group.assert_called_once_with(
**{
'addresses': ['10.0.0.1/32'],
'project_id': self.project.id,
'name': self.new_address_group.name,
'description': self.new_address_group.description,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
class TestDeleteAddressGroup(TestAddressGroup):
# The address group to delete.
_address_groups = network_fakes.create_address_groups(count=2)
@ -139,7 +149,8 @@ class TestDeleteAddressGroup(TestAddressGroup):
super(TestDeleteAddressGroup, self).setUp()
self.network.delete_address_group = mock.Mock(return_value=None)
self.network.find_address_group = network_fakes.get_address_groups(
address_groups=self._address_groups)
address_groups=self._address_groups
)
# Get the command object to test
self.cmd = address_group.DeleteAddressGroup(self.app, self.namespace)
@ -156,9 +167,11 @@ class TestDeleteAddressGroup(TestAddressGroup):
result = self.cmd.take_action(parsed_args)
self.network.find_address_group.assert_called_once_with(
self._address_groups[0].name, ignore_missing=False)
self._address_groups[0].name, ignore_missing=False
)
self.network.delete_address_group.assert_called_once_with(
self._address_groups[0])
self._address_groups[0]
)
self.assertIsNone(result)
def test_multi_address_groups_delete(self):
@ -185,14 +198,16 @@ class TestDeleteAddressGroup(TestAddressGroup):
'unexist_address_group',
]
verifylist = [
('address_group',
[self._address_groups[0].name, 'unexist_address_group']),
(
'address_group',
[self._address_groups[0].name, 'unexist_address_group'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._address_groups[0], exceptions.CommandError]
self.network.find_address_group = (
mock.Mock(side_effect=find_mock_result)
self.network.find_address_group = mock.Mock(
side_effect=find_mock_result
)
try:
@ -202,16 +217,17 @@ class TestDeleteAddressGroup(TestAddressGroup):
self.assertEqual('1 of 2 address groups failed to delete.', str(e))
self.network.find_address_group.assert_any_call(
self._address_groups[0].name, ignore_missing=False)
self._address_groups[0].name, ignore_missing=False
)
self.network.find_address_group.assert_any_call(
'unexist_address_group', ignore_missing=False)
'unexist_address_group', ignore_missing=False
)
self.network.delete_address_group.assert_called_once_with(
self._address_groups[0]
)
class TestListAddressGroup(TestAddressGroup):
# The address groups to list up.
address_groups = network_fakes.create_address_groups(count=3)
columns = (
@ -223,18 +239,21 @@ class TestListAddressGroup(TestAddressGroup):
)
data = []
for group in address_groups:
data.append((
group.id,
group.name,
group.description,
group.project_id,
group.addresses,
))
data.append(
(
group.id,
group.name,
group.description,
group.project_id,
group.addresses,
)
)
def setUp(self):
super(TestListAddressGroup, self).setUp()
self.network.address_groups = mock.Mock(
return_value=self.address_groups)
return_value=self.address_groups
)
# Get the command object to test
self.cmd = address_group.ListAddressGroup(self.app, self.namespace)
@ -252,7 +271,8 @@ class TestListAddressGroup(TestAddressGroup):
def test_address_group_list_name(self):
arglist = [
'--name', self.address_groups[0].name,
'--name',
self.address_groups[0].name,
]
verifylist = [
('name', self.address_groups[0].name),
@ -261,7 +281,8 @@ class TestListAddressGroup(TestAddressGroup):
columns, data = self.cmd.take_action(parsed_args)
self.network.address_groups.assert_called_once_with(
**{'name': self.address_groups[0].name})
**{'name': self.address_groups[0].name}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -269,7 +290,8 @@ class TestListAddressGroup(TestAddressGroup):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project',
project.id,
]
verifylist = [
('project', project.id),
@ -278,7 +300,8 @@ class TestListAddressGroup(TestAddressGroup):
columns, data = self.cmd.take_action(parsed_args)
self.network.address_groups.assert_called_once_with(
project_id=project.id)
project_id=project.id
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -286,8 +309,10 @@ class TestListAddressGroup(TestAddressGroup):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project-domain', project.domain_id,
'--project',
project.id,
'--project-domain',
project.domain_id,
]
verifylist = [
('project', project.id),
@ -296,13 +321,13 @@ class TestListAddressGroup(TestAddressGroup):
columns, data = self.cmd.take_action(parsed_args)
self.network.address_groups.assert_called_once_with(
project_id=project.id)
project_id=project.id
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
class TestSetAddressGroup(TestAddressGroup):
# The address group to set.
_address_group = network_fakes.create_one_address_group()
@ -310,14 +335,18 @@ class TestSetAddressGroup(TestAddressGroup):
super(TestSetAddressGroup, self).setUp()
self.network.update_address_group = mock.Mock(return_value=None)
self.network.find_address_group = mock.Mock(
return_value=self._address_group)
return_value=self._address_group
)
self.network.add_addresses_to_address_group = mock.Mock(
return_value=self._address_group)
return_value=self._address_group
)
# Get the command object to test
self.cmd = address_group.SetAddressGroup(self.app, self.namespace)
def test_set_nothing(self):
arglist = [self._address_group.name, ]
arglist = [
self._address_group.name,
]
verifylist = [
('address_group', self._address_group.name),
]
@ -331,8 +360,10 @@ class TestSetAddressGroup(TestAddressGroup):
def test_set_name_and_description(self):
arglist = [
'--name', 'new_address_group_name',
'--description', 'new_address_group_description',
'--name',
'new_address_group_name',
'--description',
'new_address_group_description',
self._address_group.name,
]
verifylist = [
@ -348,13 +379,15 @@ class TestSetAddressGroup(TestAddressGroup):
'description': 'new_address_group_description',
}
self.network.update_address_group.assert_called_with(
self._address_group, **attrs)
self._address_group, **attrs
)
self.assertIsNone(result)
def test_set_one_address(self):
arglist = [
self._address_group.name,
'--address', '10.0.0.2',
'--address',
'10.0.0.2',
]
verifylist = [
('address_group', self._address_group.name),
@ -364,14 +397,17 @@ class TestSetAddressGroup(TestAddressGroup):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.network.add_addresses_to_address_group.assert_called_once_with(
self._address_group, ['10.0.0.2/32'])
self._address_group, ['10.0.0.2/32']
)
self.assertIsNone(result)
def test_set_multiple_addresses(self):
arglist = [
self._address_group.name,
'--address', '10.0.0.2',
'--address', '2001::/16',
'--address',
'10.0.0.2',
'--address',
'2001::/16',
]
verifylist = [
('address_group', self._address_group.name),
@ -381,12 +417,12 @@ class TestSetAddressGroup(TestAddressGroup):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.network.add_addresses_to_address_group.assert_called_once_with(
self._address_group, ['10.0.0.2/32', '2001::/16'])
self._address_group, ['10.0.0.2/32', '2001::/16']
)
self.assertIsNone(result)
class TestShowAddressGroup(TestAddressGroup):
# The address group to show.
_address_group = network_fakes.create_one_address_group()
columns = (
@ -407,7 +443,8 @@ class TestShowAddressGroup(TestAddressGroup):
def setUp(self):
super(TestShowAddressGroup, self).setUp()
self.network.find_address_group = mock.Mock(
return_value=self._address_group)
return_value=self._address_group
)
# Get the command object to test
self.cmd = address_group.ShowAddressGroup(self.app, self.namespace)
@ -417,8 +454,13 @@ class TestShowAddressGroup(TestAddressGroup):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -432,27 +474,31 @@ class TestShowAddressGroup(TestAddressGroup):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_address_group.assert_called_once_with(
self._address_group.name, ignore_missing=False)
self._address_group.name, ignore_missing=False
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
class TestUnsetAddressGroup(TestAddressGroup):
# The address group to unset.
_address_group = network_fakes.create_one_address_group()
def setUp(self):
super(TestUnsetAddressGroup, self).setUp()
self.network.find_address_group = mock.Mock(
return_value=self._address_group)
return_value=self._address_group
)
self.network.remove_addresses_from_address_group = mock.Mock(
return_value=self._address_group)
return_value=self._address_group
)
# Get the command object to test
self.cmd = address_group.UnsetAddressGroup(self.app, self.namespace)
def test_unset_nothing(self):
arglist = [self._address_group.name, ]
arglist = [
self._address_group.name,
]
verifylist = [
('address_group', self._address_group.name),
]
@ -466,7 +512,8 @@ class TestUnsetAddressGroup(TestAddressGroup):
def test_unset_one_address(self):
arglist = [
self._address_group.name,
'--address', '10.0.0.2',
'--address',
'10.0.0.2',
]
verifylist = [
('address_group', self._address_group.name),
@ -475,15 +522,18 @@ class TestUnsetAddressGroup(TestAddressGroup):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.network.remove_addresses_from_address_group.\
assert_called_once_with(self._address_group, ['10.0.0.2/32'])
self.network.remove_addresses_from_address_group.assert_called_once_with( # noqa: E501
self._address_group, ['10.0.0.2/32']
)
self.assertIsNone(result)
def test_unset_multiple_addresses(self):
arglist = [
self._address_group.name,
'--address', '10.0.0.2',
'--address', '2001::/16',
'--address',
'10.0.0.2',
'--address',
'2001::/16',
]
verifylist = [
('address_group', self._address_group.name),
@ -492,7 +542,7 @@ class TestUnsetAddressGroup(TestAddressGroup):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.network.remove_addresses_from_address_group.\
assert_called_once_with(self._address_group,
['10.0.0.2/32', '2001::/16'])
self.network.remove_addresses_from_address_group.assert_called_once_with( # noqa: E501
self._address_group, ['10.0.0.2/32', '2001::/16']
)
self.assertIsNone(result)

View File

@ -23,7 +23,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestAddressScope(network_fakes.TestNetworkV2):
def setUp(self):
super(TestAddressScope, self).setUp()
@ -36,21 +35,15 @@ class TestAddressScope(network_fakes.TestNetworkV2):
class TestCreateAddressScope(TestAddressScope):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
# The new address scope created.
new_address_scope = network_fakes.create_one_address_scope(
attrs={
'project_id': project.id,
})
columns = (
'id',
'ip_version',
'name',
'project_id',
'shared'
}
)
columns = ('id', 'ip_version', 'name', 'project_id', 'shared')
data = (
new_address_scope.id,
new_address_scope.ip_version,
@ -62,7 +55,8 @@ class TestCreateAddressScope(TestAddressScope):
def setUp(self):
super(TestCreateAddressScope, self).setUp()
self.network.create_address_scope = mock.Mock(
return_value=self.new_address_scope)
return_value=self.new_address_scope
)
# Get the command object to test
self.cmd = address_scope.CreateAddressScope(self.app, self.namespace)
@ -75,8 +69,13 @@ class TestCreateAddressScope(TestAddressScope):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
@ -89,21 +88,26 @@ class TestCreateAddressScope(TestAddressScope):
]
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.network.create_address_scope.assert_called_once_with(**{
'ip_version': self.new_address_scope.ip_version,
'name': self.new_address_scope.name,
})
self.network.create_address_scope.assert_called_once_with(
**{
'ip_version': self.new_address_scope.ip_version,
'name': self.new_address_scope.name,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_all_options(self):
arglist = [
'--ip-version', str(self.new_address_scope.ip_version),
'--ip-version',
str(self.new_address_scope.ip_version),
'--share',
'--project', self.project.name,
'--project-domain', self.domain.name,
'--project',
self.project.name,
'--project-domain',
self.domain.name,
self.new_address_scope.name,
]
verifylist = [
@ -115,14 +119,16 @@ class TestCreateAddressScope(TestAddressScope):
]
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.network.create_address_scope.assert_called_once_with(**{
'ip_version': self.new_address_scope.ip_version,
'shared': True,
'project_id': self.project.id,
'name': self.new_address_scope.name,
})
self.network.create_address_scope.assert_called_once_with(
**{
'ip_version': self.new_address_scope.ip_version,
'shared': True,
'project_id': self.project.id,
'name': self.new_address_scope.name,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -139,17 +145,18 @@ class TestCreateAddressScope(TestAddressScope):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_address_scope.assert_called_once_with(**{
'ip_version': self.new_address_scope.ip_version,
'shared': False,
'name': self.new_address_scope.name,
})
self.network.create_address_scope.assert_called_once_with(
**{
'ip_version': self.new_address_scope.ip_version,
'shared': False,
'name': self.new_address_scope.name,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestDeleteAddressScope(TestAddressScope):
# The address scope to delete.
_address_scopes = network_fakes.create_address_scopes(count=2)
@ -157,7 +164,8 @@ class TestDeleteAddressScope(TestAddressScope):
super(TestDeleteAddressScope, self).setUp()
self.network.delete_address_scope = mock.Mock(return_value=None)
self.network.find_address_scope = network_fakes.get_address_scopes(
address_scopes=self._address_scopes)
address_scopes=self._address_scopes
)
# Get the command object to test
self.cmd = address_scope.DeleteAddressScope(self.app, self.namespace)
@ -174,9 +182,11 @@ class TestDeleteAddressScope(TestAddressScope):
result = self.cmd.take_action(parsed_args)
self.network.find_address_scope.assert_called_once_with(
self._address_scopes[0].name, ignore_missing=False)
self._address_scopes[0].name, ignore_missing=False
)
self.network.delete_address_scope.assert_called_once_with(
self._address_scopes[0])
self._address_scopes[0]
)
self.assertIsNone(result)
def test_multi_address_scopes_delete(self):
@ -204,14 +214,16 @@ class TestDeleteAddressScope(TestAddressScope):
'unexist_address_scope',
]
verifylist = [
('address_scope',
[self._address_scopes[0].name, 'unexist_address_scope']),
(
'address_scope',
[self._address_scopes[0].name, 'unexist_address_scope'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._address_scopes[0], exceptions.CommandError]
self.network.find_address_scope = (
mock.Mock(side_effect=find_mock_result)
self.network.find_address_scope = mock.Mock(
side_effect=find_mock_result
)
try:
@ -221,16 +233,17 @@ class TestDeleteAddressScope(TestAddressScope):
self.assertEqual('1 of 2 address scopes failed to delete.', str(e))
self.network.find_address_scope.assert_any_call(
self._address_scopes[0].name, ignore_missing=False)
self._address_scopes[0].name, ignore_missing=False
)
self.network.find_address_scope.assert_any_call(
'unexist_address_scope', ignore_missing=False)
'unexist_address_scope', ignore_missing=False
)
self.network.delete_address_scope.assert_called_once_with(
self._address_scopes[0]
)
class TestListAddressScope(TestAddressScope):
# The address scopes to list up.
address_scopes = network_fakes.create_address_scopes(count=3)
columns = (
@ -242,18 +255,21 @@ class TestListAddressScope(TestAddressScope):
)
data = []
for scope in address_scopes:
data.append((
scope.id,
scope.name,
scope.ip_version,
scope.is_shared,
scope.project_id,
))
data.append(
(
scope.id,
scope.name,
scope.ip_version,
scope.is_shared,
scope.project_id,
)
)
def setUp(self):
super(TestListAddressScope, self).setUp()
self.network.address_scopes = mock.Mock(
return_value=self.address_scopes)
return_value=self.address_scopes
)
# Get the command object to test
self.cmd = address_scope.ListAddressScope(self.app, self.namespace)
@ -271,7 +287,8 @@ class TestListAddressScope(TestAddressScope):
def test_address_scope_list_name(self):
arglist = [
'--name', self.address_scopes[0].name,
'--name',
self.address_scopes[0].name,
]
verifylist = [
('name', self.address_scopes[0].name),
@ -280,13 +297,15 @@ class TestListAddressScope(TestAddressScope):
columns, data = self.cmd.take_action(parsed_args)
self.network.address_scopes.assert_called_once_with(
**{'name': self.address_scopes[0].name})
**{'name': self.address_scopes[0].name}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_address_scope_list_ip_version(self):
arglist = [
'--ip-version', str(4),
'--ip-version',
str(4),
]
verifylist = [
('ip_version', 4),
@ -295,7 +314,8 @@ class TestListAddressScope(TestAddressScope):
columns, data = self.cmd.take_action(parsed_args)
self.network.address_scopes.assert_called_once_with(
**{'ip_version': 4})
**{'ip_version': 4}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
@ -303,7 +323,8 @@ class TestListAddressScope(TestAddressScope):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project',
project.id,
]
verifylist = [
('project', project.id),
@ -312,7 +333,8 @@ class TestListAddressScope(TestAddressScope):
columns, data = self.cmd.take_action(parsed_args)
self.network.address_scopes.assert_called_once_with(
**{'project_id': project.id})
**{'project_id': project.id}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
@ -320,8 +342,10 @@ class TestListAddressScope(TestAddressScope):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project-domain', project.domain_id,
'--project',
project.id,
'--project-domain',
project.domain_id,
]
verifylist = [
('project', project.id),
@ -369,7 +393,6 @@ class TestListAddressScope(TestAddressScope):
class TestSetAddressScope(TestAddressScope):
# The address scope to set.
_address_scope = network_fakes.create_one_address_scope()
@ -377,13 +400,16 @@ class TestSetAddressScope(TestAddressScope):
super(TestSetAddressScope, self).setUp()
self.network.update_address_scope = mock.Mock(return_value=None)
self.network.find_address_scope = mock.Mock(
return_value=self._address_scope)
return_value=self._address_scope
)
# Get the command object to test
self.cmd = address_scope.SetAddressScope(self.app, self.namespace)
def test_set_nothing(self):
arglist = [self._address_scope.name, ]
arglist = [
self._address_scope.name,
]
verifylist = [
('address_scope', self._address_scope.name),
]
@ -393,12 +419,14 @@ class TestSetAddressScope(TestAddressScope):
attrs = {}
self.network.update_address_scope.assert_called_with(
self._address_scope, **attrs)
self._address_scope, **attrs
)
self.assertIsNone(result)
def test_set_name_and_share(self):
arglist = [
'--name', 'new_address_scope',
'--name',
'new_address_scope',
'--share',
self._address_scope.name,
]
@ -415,7 +443,8 @@ class TestSetAddressScope(TestAddressScope):
'shared': True,
}
self.network.update_address_scope.assert_called_with(
self._address_scope, **attrs)
self._address_scope, **attrs
)
self.assertIsNone(result)
def test_set_no_share(self):
@ -434,15 +463,14 @@ class TestSetAddressScope(TestAddressScope):
'shared': False,
}
self.network.update_address_scope.assert_called_with(
self._address_scope, **attrs)
self._address_scope, **attrs
)
self.assertIsNone(result)
class TestShowAddressScope(TestAddressScope):
# The address scope to show.
_address_scope = (
network_fakes.create_one_address_scope())
_address_scope = network_fakes.create_one_address_scope()
columns = (
'id',
'ip_version',
@ -461,7 +489,8 @@ class TestShowAddressScope(TestAddressScope):
def setUp(self):
super(TestShowAddressScope, self).setUp()
self.network.find_address_scope = mock.Mock(
return_value=self._address_scope)
return_value=self._address_scope
)
# Get the command object to test
self.cmd = address_scope.ShowAddressScope(self.app, self.namespace)
@ -471,8 +500,13 @@ class TestShowAddressScope(TestAddressScope):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -486,6 +520,7 @@ class TestShowAddressScope(TestAddressScope):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_address_scope.assert_called_once_with(
self._address_scope.name, ignore_missing=False)
self._address_scope.name, ignore_missing=False
)
self.assertEqual(self.columns, columns)
self.assertEqual(list(self.data), list(data))

View File

@ -23,8 +23,8 @@ from openstackclient.tests.unit import utils as tests_utils
# Tests for Nova network
class TestFloatingIPCompute(compute_fakes.TestComputev2):
class TestFloatingIPCompute(compute_fakes.TestComputev2):
def setUp(self):
super(TestFloatingIPCompute, self).setUp()
@ -32,11 +32,8 @@ class TestFloatingIPCompute(compute_fakes.TestComputev2):
self.compute = self.app.client_manager.compute
@mock.patch(
'openstackclient.api.compute_v2.APIv2.floating_ip_create'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.floating_ip_create')
class TestCreateFloatingIPCompute(TestFloatingIPCompute):
# The floating ip to be deleted.
_floating_ip = compute_fakes.FakeFloatingIP.create_one_floating_ip()
@ -70,8 +67,13 @@ class TestCreateFloatingIPCompute(TestFloatingIPCompute):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_floating_ip_create_default(self, fip_mock):
fip_mock.return_value = self._floating_ip
@ -90,11 +92,8 @@ class TestCreateFloatingIPCompute(TestFloatingIPCompute):
self.assertEqual(self.data, data)
@mock.patch(
'openstackclient.api.compute_v2.APIv2.floating_ip_delete'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.floating_ip_delete')
class TestDeleteFloatingIPCompute(TestFloatingIPCompute):
# The floating ips to be deleted.
_floating_ips = compute_fakes.FakeFloatingIP.create_floating_ips(count=2)
@ -118,9 +117,7 @@ class TestDeleteFloatingIPCompute(TestFloatingIPCompute):
result = self.cmd.take_action(parsed_args)
fip_mock.assert_called_once_with(
self._floating_ips[0]['id']
)
fip_mock.assert_called_once_with(self._floating_ips[0]['id'])
self.assertIsNone(result)
def test_floating_ip_delete_multi(self, fip_mock):
@ -145,18 +142,20 @@ class TestDeleteFloatingIPCompute(TestFloatingIPCompute):
def test_floating_ip_delete_multi_exception(self, fip_mock):
fip_mock.return_value = mock.Mock(return_value=None)
fip_mock.side_effect = ([
fip_mock.side_effect = [
mock.Mock(return_value=None),
exceptions.CommandError,
])
]
arglist = [
self._floating_ips[0]['id'],
'unexist_floating_ip',
]
verifylist = [(
'floating_ip',
[self._floating_ips[0]['id'], 'unexist_floating_ip'],
)]
verifylist = [
(
'floating_ip',
[self._floating_ips[0]['id'], 'unexist_floating_ip'],
)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
try:
@ -169,11 +168,8 @@ class TestDeleteFloatingIPCompute(TestFloatingIPCompute):
fip_mock.assert_any_call('unexist_floating_ip')
@mock.patch(
'openstackclient.api.compute_v2.APIv2.floating_ip_list'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.floating_ip_list')
class TestListFloatingIPCompute(TestFloatingIPCompute):
# The floating ips to be list up
_floating_ips = compute_fakes.FakeFloatingIP.create_floating_ips(count=3)
@ -187,13 +183,15 @@ class TestListFloatingIPCompute(TestFloatingIPCompute):
data = []
for ip in _floating_ips:
data.append((
ip['id'],
ip['ip'],
ip['fixed_ip'],
ip['instance_id'],
ip['pool'],
))
data.append(
(
ip['id'],
ip['ip'],
ip['fixed_ip'],
ip['instance_id'],
ip['pool'],
)
)
def setUp(self):
super(TestListFloatingIPCompute, self).setUp()
@ -216,11 +214,8 @@ class TestListFloatingIPCompute(TestFloatingIPCompute):
self.assertEqual(self.data, list(data))
@mock.patch(
'openstackclient.api.compute_v2.APIv2.floating_ip_find'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.floating_ip_find')
class TestShowFloatingIPCompute(TestFloatingIPCompute):
# The floating ip to display.
_floating_ip = compute_fakes.FakeFloatingIP.create_one_floating_ip()

View File

@ -24,8 +24,8 @@ from openstackclient.tests.unit import utils as tests_utils
# Tests for Neutron network
class TestFloatingIPNetwork(network_fakes.TestNetworkV2):
class TestFloatingIPNetwork(network_fakes.TestNetworkV2):
def setUp(self):
super(TestFloatingIPNetwork, self).setUp()
@ -38,7 +38,6 @@ class TestFloatingIPNetwork(network_fakes.TestNetworkV2):
class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
# Fake data for option tests.
floating_network = network_fakes.create_one_network()
subnet = network_fakes.FakeSubnet.create_one_subnet()
@ -93,7 +92,8 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
self.network.set_tags = mock.Mock(return_value=None)
self.network.find_network = mock.Mock(
return_value=self.floating_network)
return_value=self.floating_network
)
self.network.find_subnet = mock.Mock(return_value=self.subnet)
self.network.find_port = mock.Mock(return_value=self.port)
@ -104,8 +104,13 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
@ -118,21 +123,30 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.create_ip.assert_called_once_with(**{
'floating_network_id': self.floating_ip.floating_network_id,
})
self.network.create_ip.assert_called_once_with(
**{
'floating_network_id': self.floating_ip.floating_network_id,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_all_options(self):
arglist = [
'--subnet', self.subnet.id,
'--port', self.floating_ip.port_id,
'--floating-ip-address', self.floating_ip.floating_ip_address,
'--fixed-ip-address', self.floating_ip.fixed_ip_address,
'--description', self.floating_ip.description,
'--dns-domain', self.floating_ip.dns_domain,
'--dns-name', self.floating_ip.dns_name,
'--subnet',
self.subnet.id,
'--port',
self.floating_ip.port_id,
'--floating-ip-address',
self.floating_ip.floating_ip_address,
'--fixed-ip-address',
self.floating_ip.fixed_ip_address,
'--description',
self.floating_ip.description,
'--dns-domain',
self.floating_ip.dns_domain,
'--dns-name',
self.floating_ip.dns_name,
self.floating_ip.floating_network_id,
]
verifylist = [
@ -149,16 +163,18 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.create_ip.assert_called_once_with(**{
'subnet_id': self.subnet.id,
'port_id': self.floating_ip.port_id,
'floating_ip_address': self.floating_ip.floating_ip_address,
'fixed_ip_address': self.floating_ip.fixed_ip_address,
'floating_network_id': self.floating_ip.floating_network_id,
'description': self.floating_ip.description,
'dns_domain': self.floating_ip.dns_domain,
'dns_name': self.floating_ip.dns_name,
})
self.network.create_ip.assert_called_once_with(
**{
'subnet_id': self.subnet.id,
'port_id': self.floating_ip.port_id,
'floating_ip_address': self.floating_ip.floating_ip_address,
'fixed_ip_address': self.floating_ip.fixed_ip_address,
'floating_network_id': self.floating_ip.floating_network_id,
'description': self.floating_ip.description,
'dns_domain': self.floating_ip.dns_domain,
'dns_name': self.floating_ip.dns_name,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -166,7 +182,8 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project',
project.id,
self.floating_ip.floating_network_id,
]
verifylist = [
@ -177,10 +194,12 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.create_ip.assert_called_once_with(**{
'floating_network_id': self.floating_ip.floating_network_id,
'project_id': project.id,
})
self.network.create_ip.assert_called_once_with(
**{
'floating_network_id': self.floating_ip.floating_network_id,
'project_id': project.id,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -189,8 +208,10 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
domain = identity_fakes_v3.FakeDomain.create_one_domain()
self.projects_mock.get.return_value = project
arglist = [
"--project", project.name,
"--project-domain", domain.name,
"--project",
project.name,
"--project-domain",
domain.name,
self.floating_ip.floating_network_id,
]
verifylist = [
@ -203,10 +224,12 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.create_ip.assert_called_once_with(**{
'floating_network_id': self.floating_ip.floating_network_id,
'project_id': project.id,
})
self.network.create_ip.assert_called_once_with(
**{
'floating_network_id': self.floating_ip.floating_network_id,
'project_id': project.id,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -214,7 +237,8 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
arglist = [
'--qos-policy', qos_policy.id,
'--qos-policy',
qos_policy.id,
self.floating_ip.floating_network_id,
]
verifylist = [
@ -225,10 +249,12 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.create_ip.assert_called_once_with(**{
'floating_network_id': self.floating_ip.floating_network_id,
'qos_policy_id': qos_policy.id,
})
self.network.create_ip.assert_called_once_with(
**{
'floating_network_id': self.floating_ip.floating_network_id,
'qos_policy_id': qos_policy.id,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -248,15 +274,17 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
verifylist.append(('no_tag', True))
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.network.create_ip.assert_called_once_with(**{
'floating_network_id': self.floating_ip.floating_network_id,
})
self.network.create_ip.assert_called_once_with(
**{
'floating_network_id': self.floating_ip.floating_network_id,
}
)
if add_tags:
self.network.set_tags.assert_called_once_with(
self.floating_ip,
tests_utils.CompareBySet(['red', 'blue']))
self.floating_ip, tests_utils.CompareBySet(['red', 'blue'])
)
else:
self.assertFalse(self.network.set_tags.called)
self.assertEqual(self.columns, columns)
@ -270,7 +298,6 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork):
# The floating ips to be deleted.
floating_ips = network_fakes.FakeFloatingIP.create_floating_ips(count=2)
@ -350,8 +377,7 @@ class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork):
'unexist_floating_ip',
]
verifylist = [
('floating_ip',
[self.floating_ips[0].id, 'unexist_floating_ip']),
('floating_ip', [self.floating_ips[0].id, 'unexist_floating_ip']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -369,24 +395,27 @@ class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork):
'unexist_floating_ip',
ignore_missing=False,
)
self.network.delete_ip.assert_called_once_with(
self.floating_ips[0]
)
self.network.delete_ip.assert_called_once_with(self.floating_ips[0])
class TestListFloatingIPNetwork(TestFloatingIPNetwork):
# The floating ips to list up
floating_ips = network_fakes.FakeFloatingIP.create_floating_ips(count=3)
fake_network = network_fakes.create_one_network({
'id': 'fake_network_id',
})
fake_port = network_fakes.create_one_port({
'id': 'fake_port_id',
})
fake_router = network_fakes.FakeRouter.create_one_router({
'id': 'fake_router_id',
})
fake_network = network_fakes.create_one_network(
{
'id': 'fake_network_id',
}
)
fake_port = network_fakes.create_one_port(
{
'id': 'fake_port_id',
}
)
fake_router = network_fakes.FakeRouter.create_one_router(
{
'id': 'fake_router_id',
}
)
columns = (
'ID',
@ -408,28 +437,32 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
data = []
data_long = []
for ip in floating_ips:
data.append((
ip.id,
ip.floating_ip_address,
ip.fixed_ip_address,
ip.port_id,
ip.floating_network_id,
ip.project_id,
))
data_long.append((
ip.id,
ip.floating_ip_address,
ip.fixed_ip_address,
ip.port_id,
ip.floating_network_id,
ip.project_id,
ip.router_id,
ip.status,
ip.description,
ip.tags,
ip.dns_domain,
ip.dns_name,
))
data.append(
(
ip.id,
ip.floating_ip_address,
ip.fixed_ip_address,
ip.port_id,
ip.floating_network_id,
ip.project_id,
)
)
data_long.append(
(
ip.id,
ip.floating_ip_address,
ip.fixed_ip_address,
ip.port_id,
ip.floating_network_id,
ip.project_id,
ip.router_id,
ip.status,
ip.description,
ip.tags,
ip.dns_domain,
ip.dns_name,
)
)
def setUp(self):
super(TestListFloatingIPNetwork, self).setUp()
@ -455,7 +488,8 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
def test_floating_ip_list_network(self):
arglist = [
'--network', 'fake_network_id',
'--network',
'fake_network_id',
]
verifylist = [
('network', 'fake_network_id'),
@ -464,15 +498,18 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.ips.assert_called_once_with(**{
'floating_network_id': 'fake_network_id',
})
self.network.ips.assert_called_once_with(
**{
'floating_network_id': 'fake_network_id',
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_floating_ip_list_port(self):
arglist = [
'--port', 'fake_port_id',
'--port',
'fake_port_id',
]
verifylist = [
('port', 'fake_port_id'),
@ -481,15 +518,18 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.ips.assert_called_once_with(**{
'port_id': 'fake_port_id',
})
self.network.ips.assert_called_once_with(
**{
'port_id': 'fake_port_id',
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_floating_ip_list_fixed_ip_address(self):
arglist = [
'--fixed-ip-address', self.floating_ips[0].fixed_ip_address,
'--fixed-ip-address',
self.floating_ips[0].fixed_ip_address,
]
verifylist = [
('fixed_ip_address', self.floating_ips[0].fixed_ip_address),
@ -498,15 +538,18 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.ips.assert_called_once_with(**{
'fixed_ip_address': self.floating_ips[0].fixed_ip_address,
})
self.network.ips.assert_called_once_with(
**{
'fixed_ip_address': self.floating_ips[0].fixed_ip_address,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_floating_ip_list_floating_ip_address(self):
arglist = [
'--floating-ip-address', self.floating_ips[0].floating_ip_address,
'--floating-ip-address',
self.floating_ips[0].floating_ip_address,
]
verifylist = [
('floating_ip_address', self.floating_ips[0].floating_ip_address),
@ -515,15 +558,23 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.ips.assert_called_once_with(**{
'floating_ip_address': self.floating_ips[0].floating_ip_address,
})
self.network.ips.assert_called_once_with(
**{
'floating_ip_address': self.floating_ips[
0
].floating_ip_address,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_floating_ip_list_long(self):
arglist = ['--long', ]
verifylist = [('long', True), ]
arglist = [
'--long',
]
verifylist = [
('long', True),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -535,7 +586,8 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
def test_floating_ip_list_status(self):
arglist = [
'--status', 'ACTIVE',
'--status',
'ACTIVE',
'--long',
]
verifylist = [
@ -545,9 +597,11 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.ips.assert_called_once_with(**{
'status': 'ACTIVE',
})
self.network.ips.assert_called_once_with(
**{
'status': 'ACTIVE',
}
)
self.assertEqual(self.columns_long, columns)
self.assertEqual(self.data_long, list(data))
@ -555,7 +609,8 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project',
project.id,
]
verifylist = [
('project', project.id),
@ -574,8 +629,10 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project-domain', project.domain_id,
'--project',
project.id,
'--project-domain',
project.domain_id,
]
verifylist = [
('project', project.id),
@ -591,7 +648,8 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
def test_floating_ip_list_router(self):
arglist = [
'--router', 'fake_router_id',
'--router',
'fake_router_id',
'--long',
]
verifylist = [
@ -601,18 +659,24 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.ips.assert_called_once_with(**{
'router_id': 'fake_router_id',
})
self.network.ips.assert_called_once_with(
**{
'router_id': 'fake_router_id',
}
)
self.assertEqual(self.columns_long, columns)
self.assertEqual(self.data_long, list(data))
def test_list_with_tag_options(self):
arglist = [
'--tags', 'red,blue',
'--any-tags', 'red,green',
'--not-tags', 'orange,yellow',
'--not-any-tags', 'black,white',
'--tags',
'red,blue',
'--any-tags',
'red,green',
'--not-tags',
'orange,yellow',
'--not-any-tags',
'black,white',
]
verifylist = [
('tags', ['red', 'blue']),
@ -624,17 +688,18 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.ips.assert_called_once_with(
**{'tags': 'red,blue',
'any_tags': 'red,green',
'not_tags': 'orange,yellow',
'not_any_tags': 'black,white'}
**{
'tags': 'red,blue',
'any_tags': 'red,green',
'not_tags': 'orange,yellow',
'not_any_tags': 'black,white',
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
class TestShowFloatingIPNetwork(TestFloatingIPNetwork):
# The floating ip to display.
floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
@ -698,7 +763,6 @@ class TestShowFloatingIPNetwork(TestFloatingIPNetwork):
class TestSetFloatingIP(TestFloatingIPNetwork):
# Fake data for option tests.
floating_network = network_fakes.create_one_network()
subnet = network_fakes.FakeSubnet.create_one_subnet()
@ -726,7 +790,8 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
def test_port_option(self):
arglist = [
self.floating_ip.id,
'--port', self.floating_ip.port_id,
'--port',
self.floating_ip.port_id,
]
verifylist = [
('floating_ip', self.floating_ip.id),
@ -746,13 +811,16 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
)
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
self.floating_ip, **attrs
)
def test_fixed_ip_option(self):
arglist = [
self.floating_ip.id,
'--port', self.floating_ip.port_id,
"--fixed-ip-address", self.floating_ip.fixed_ip_address,
'--port',
self.floating_ip.port_id,
"--fixed-ip-address",
self.floating_ip.fixed_ip_address,
]
verifylist = [
('floating_ip', self.floating_ip.id),
@ -772,13 +840,16 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
ignore_missing=False,
)
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
self.floating_ip, **attrs
)
def test_description_option(self):
arglist = [
self.floating_ip.id,
'--port', self.floating_ip.port_id,
'--description', self.floating_ip.description,
'--port',
self.floating_ip.port_id,
'--description',
self.floating_ip.description,
]
verifylist = [
('floating_ip', self.floating_ip.id),
@ -798,13 +869,15 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
ignore_missing=False,
)
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
self.floating_ip, **attrs
)
def test_qos_policy_option(self):
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
arglist = [
"--qos-policy", qos_policy.id,
"--qos-policy",
qos_policy.id,
self.floating_ip.id,
]
verifylist = [
@ -823,14 +896,17 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
ignore_missing=False,
)
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
self.floating_ip, **attrs
)
def test_port_and_qos_policy_option(self):
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
arglist = [
"--qos-policy", qos_policy.id,
'--port', self.floating_ip.port_id,
"--qos-policy",
qos_policy.id,
'--port',
self.floating_ip.port_id,
self.floating_ip.id,
]
verifylist = [
@ -851,7 +927,8 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
ignore_missing=False,
)
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
self.floating_ip, **attrs
)
def test_no_qos_policy_option(self):
arglist = [
@ -874,12 +951,14 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
ignore_missing=False,
)
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
self.floating_ip, **attrs
)
def test_port_and_no_qos_policy_option(self):
arglist = [
"--no-qos-policy",
'--port', self.floating_ip.port_id,
'--port',
self.floating_ip.port_id,
self.floating_ip.id,
]
verifylist = [
@ -900,7 +979,8 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
ignore_missing=False,
)
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
self.floating_ip, **attrs
)
def _test_set_tags(self, with_tags=True):
if with_tags:
@ -919,8 +999,8 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
self.assertFalse(self.network.update_ip.called)
self.network.set_tags.assert_called_once_with(
self.floating_ip,
tests_utils.CompareBySet(expected_args))
self.floating_ip, tests_utils.CompareBySet(expected_args)
)
self.assertIsNone(result)
def test_set_with_tags(self):
@ -931,7 +1011,6 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
class TestUnsetFloatingIP(TestFloatingIPNetwork):
floating_network = network_fakes.create_one_network()
subnet = network_fakes.FakeSubnet.create_one_subnet()
port = network_fakes.create_one_port()
@ -975,7 +1054,8 @@ class TestUnsetFloatingIP(TestFloatingIPNetwork):
ignore_missing=False,
)
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
self.floating_ip, **attrs
)
self.assertIsNone(result)
@ -1000,7 +1080,8 @@ class TestUnsetFloatingIP(TestFloatingIPNetwork):
ignore_missing=False,
)
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
self.floating_ip, **attrs
)
self.assertIsNone(result)
@ -1014,16 +1095,15 @@ class TestUnsetFloatingIP(TestFloatingIPNetwork):
verifylist = [('all_tag', True)]
expected_args = []
arglist.append(self.floating_ip.id)
verifylist.append(
('floating_ip', self.floating_ip.id))
verifylist.append(('floating_ip', self.floating_ip.id))
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.assertFalse(self.network.update_ip.called)
self.network.set_tags.assert_called_once_with(
self.floating_ip,
tests_utils.CompareBySet(expected_args))
self.floating_ip, tests_utils.CompareBySet(expected_args)
)
self.assertIsNone(result)
def test_unset_with_tags(self):

View File

@ -19,8 +19,8 @@ from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
# Tests for Compute network
class TestFloatingIPPoolCompute(compute_fakes.TestComputev2):
class TestFloatingIPPoolCompute(compute_fakes.TestComputev2):
def setUp(self):
super(TestFloatingIPPoolCompute, self).setUp()
@ -28,24 +28,18 @@ class TestFloatingIPPoolCompute(compute_fakes.TestComputev2):
self.compute = self.app.client_manager.compute
@mock.patch(
'openstackclient.api.compute_v2.APIv2.floating_ip_pool_list'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.floating_ip_pool_list')
class TestListFloatingIPPoolCompute(TestFloatingIPPoolCompute):
# The floating ip pools to list up
_floating_ip_pools = \
_floating_ip_pools = (
compute_fakes.FakeFloatingIPPool.create_floating_ip_pools(count=3)
columns = (
'Name',
)
columns = ('Name',)
data = []
for pool in _floating_ip_pools:
data.append((
pool['name'],
))
data.append((pool['name'],))
def setUp(self):
super(TestListFloatingIPPoolCompute, self).setUp()

View File

@ -19,8 +19,8 @@ from openstackclient.tests.unit.network.v2 import fakes as network_fakes
# Tests for Network API v2
class TestFloatingIPPoolNetwork(network_fakes.TestNetworkV2):
class TestFloatingIPPoolNetwork(network_fakes.TestNetworkV2):
def setUp(self):
super(TestFloatingIPPoolNetwork, self).setUp()
@ -29,18 +29,19 @@ class TestFloatingIPPoolNetwork(network_fakes.TestNetworkV2):
class TestListFloatingIPPoolNetwork(TestFloatingIPPoolNetwork):
def setUp(self):
super(TestListFloatingIPPoolNetwork, self).setUp()
# Get the command object to test
self.cmd = floating_ip_pool.ListFloatingIPPool(self.app,
self.namespace)
self.cmd = floating_ip_pool.ListFloatingIPPool(
self.app, self.namespace
)
def test_floating_ip_list(self):
arglist = []
verifylist = []
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
parsed_args)
self.assertRaises(
exceptions.CommandError, self.cmd.take_action, parsed_args
)

View File

@ -25,52 +25,45 @@ from openstackclient.tests.unit import utils as tests_utils
class TestFloatingIPPortForwarding(network_fakes.TestNetworkV2):
def setUp(self):
super(TestFloatingIPPortForwarding, self).setUp()
self.network = self.app.client_manager.network
self.floating_ip = (network_fakes.FakeFloatingIP.
create_one_floating_ip())
self.floating_ip = (
network_fakes.FakeFloatingIP.create_one_floating_ip()
)
self.port = network_fakes.create_one_port()
self.project = identity_fakes_v2.FakeProject.create_one_project()
self.network.find_port = mock.Mock(return_value=self.port)
class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
def setUp(self):
super(TestCreateFloatingIPPortForwarding, self).setUp()
self.new_port_forwarding = (
network_fakes.FakeFloatingIPPortForwarding.
create_one_port_forwarding(
attrs={
'internal_port_id': self.port.id,
'floatingip_id': self.floating_ip.id,
}
)
self.new_port_forwarding = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( # noqa: E501
attrs={
'internal_port_id': self.port.id,
'floatingip_id': self.floating_ip.id,
}
)
self.new_port_forwarding_with_ranges = (
network_fakes.FakeFloatingIPPortForwarding.
create_one_port_forwarding(
use_range=True,
attrs={
'internal_port_id': self.port.id,
'floatingip_id': self.floating_ip.id,
}
)
self.new_port_forwarding_with_ranges = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( # noqa: E501
use_range=True,
attrs={
'internal_port_id': self.port.id,
'floatingip_id': self.floating_ip.id,
},
)
self.network.create_floating_ip_port_forwarding = mock.Mock(
return_value=self.new_port_forwarding)
self.network.find_ip = mock.Mock(
return_value=self.floating_ip
return_value=self.new_port_forwarding
)
self.network.find_ip = mock.Mock(return_value=self.floating_ip)
# Get the command object to test
self.cmd = floating_ip_port_forwarding.CreateFloatingIPPortForwarding(
self.app, self.namespace)
self.app, self.namespace
)
self.columns = (
'description',
@ -82,7 +75,7 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
'internal_port',
'internal_port_id',
'internal_port_range',
'protocol'
'protocol',
)
self.data = (
@ -103,17 +96,24 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_all_options_with_range(self):
arglist = [
'--port', self.new_port_forwarding_with_ranges.internal_port_id,
'--port',
self.new_port_forwarding_with_ranges.internal_port_id,
'--internal-protocol-port',
self.new_port_forwarding_with_ranges.internal_port_range,
'--external-protocol-port',
self.new_port_forwarding_with_ranges.external_port_range,
'--protocol', self.new_port_forwarding_with_ranges.protocol,
'--protocol',
self.new_port_forwarding_with_ranges.protocol,
self.new_port_forwarding_with_ranges.floatingip_id,
'--internal-ip-address',
self.new_port_forwarding_with_ranges.internal_ip_address,
@ -122,49 +122,53 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
]
verifylist = [
('port', self.new_port_forwarding_with_ranges.internal_port_id),
('internal_protocol_port',
self.new_port_forwarding_with_ranges.internal_port_range),
('external_protocol_port',
self.new_port_forwarding_with_ranges.external_port_range),
(
'internal_protocol_port',
self.new_port_forwarding_with_ranges.internal_port_range,
),
(
'external_protocol_port',
self.new_port_forwarding_with_ranges.external_port_range,
),
('protocol', self.new_port_forwarding_with_ranges.protocol),
('floating_ip',
self.new_port_forwarding_with_ranges.floatingip_id),
('internal_ip_address', self.new_port_forwarding_with_ranges.
internal_ip_address),
(
'floating_ip',
self.new_port_forwarding_with_ranges.floatingip_id,
),
(
'internal_ip_address',
self.new_port_forwarding_with_ranges.internal_ip_address,
),
('description', self.new_port_forwarding_with_ranges.description),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_floating_ip_port_forwarding.\
assert_called_once_with(
self.new_port_forwarding.floatingip_id,
**{
'external_port_range':
self.new_port_forwarding_with_ranges.
external_port_range,
'internal_ip_address':
self.new_port_forwarding_with_ranges.
internal_ip_address,
'internal_port_range':
self.new_port_forwarding_with_ranges.
internal_port_range,
'internal_port_id':
self.new_port_forwarding_with_ranges.internal_port_id,
'protocol': self.new_port_forwarding_with_ranges.protocol,
'description':
self.new_port_forwarding_with_ranges.description,
})
self.network.create_floating_ip_port_forwarding.assert_called_once_with( # noqa: E501
self.new_port_forwarding.floatingip_id,
**{
'external_port_range': self.new_port_forwarding_with_ranges.external_port_range, # noqa: E501
'internal_ip_address': self.new_port_forwarding_with_ranges.internal_ip_address, # noqa: E501
'internal_port_range': self.new_port_forwarding_with_ranges.internal_port_range, # noqa: E501
'internal_port_id': self.new_port_forwarding_with_ranges.internal_port_id, # noqa: E501
'protocol': self.new_port_forwarding_with_ranges.protocol,
'description': self.new_port_forwarding_with_ranges.description, # noqa: E501
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_all_options_with_range_invalid_port_exception(self):
invalid_port_range = '999999:999999'
arglist = [
'--port', self.new_port_forwarding_with_ranges.internal_port_id,
'--internal-protocol-port', invalid_port_range,
'--external-protocol-port', invalid_port_range,
'--protocol', self.new_port_forwarding_with_ranges.protocol,
'--port',
self.new_port_forwarding_with_ranges.internal_port_id,
'--internal-protocol-port',
invalid_port_range,
'--external-protocol-port',
invalid_port_range,
'--protocol',
self.new_port_forwarding_with_ranges.protocol,
self.new_port_forwarding_with_ranges.floatingip_id,
'--internal-ip-address',
self.new_port_forwarding_with_ranges.internal_ip_address,
@ -176,10 +180,14 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
('internal_protocol_port', invalid_port_range),
('external_protocol_port', invalid_port_range),
('protocol', self.new_port_forwarding_with_ranges.protocol),
('floating_ip',
self.new_port_forwarding_with_ranges.floatingip_id),
('internal_ip_address', self.new_port_forwarding_with_ranges.
internal_ip_address),
(
'floating_ip',
self.new_port_forwarding_with_ranges.floatingip_id,
),
(
'internal_ip_address',
self.new_port_forwarding_with_ranges.internal_ip_address,
),
('description', self.new_port_forwarding_with_ranges.description),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -194,10 +202,14 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
def test_create_all_options_with_invalid_range_exception(self):
invalid_port_range = '80:70'
arglist = [
'--port', self.new_port_forwarding_with_ranges.internal_port_id,
'--internal-protocol-port', invalid_port_range,
'--external-protocol-port', invalid_port_range,
'--protocol', self.new_port_forwarding_with_ranges.protocol,
'--port',
self.new_port_forwarding_with_ranges.internal_port_id,
'--internal-protocol-port',
invalid_port_range,
'--external-protocol-port',
invalid_port_range,
'--protocol',
self.new_port_forwarding_with_ranges.protocol,
self.new_port_forwarding_with_ranges.floatingip_id,
'--internal-ip-address',
self.new_port_forwarding_with_ranges.internal_ip_address,
@ -209,15 +221,21 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
('internal_protocol_port', invalid_port_range),
('external_protocol_port', invalid_port_range),
('protocol', self.new_port_forwarding_with_ranges.protocol),
('floating_ip',
self.new_port_forwarding_with_ranges.floatingip_id),
('internal_ip_address', self.new_port_forwarding_with_ranges.
internal_ip_address),
(
'floating_ip',
self.new_port_forwarding_with_ranges.floatingip_id,
),
(
'internal_ip_address',
self.new_port_forwarding_with_ranges.internal_ip_address,
),
('description', self.new_port_forwarding_with_ranges.description),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
msg = 'The last number in port range must be greater or equal to ' \
'the first'
msg = (
'The last number in port range must be greater or equal to '
'the first'
)
try:
self.cmd.take_action(parsed_args)
self.fail('CommandError should be raised.')
@ -229,10 +247,14 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
internal_range = '80:90'
external_range = '8080:8100'
arglist = [
'--port', self.new_port_forwarding_with_ranges.internal_port_id,
'--internal-protocol-port', internal_range,
'--external-protocol-port', external_range,
'--protocol', self.new_port_forwarding_with_ranges.protocol,
'--port',
self.new_port_forwarding_with_ranges.internal_port_id,
'--internal-protocol-port',
internal_range,
'--external-protocol-port',
external_range,
'--protocol',
self.new_port_forwarding_with_ranges.protocol,
self.new_port_forwarding_with_ranges.floatingip_id,
'--internal-ip-address',
self.new_port_forwarding_with_ranges.internal_ip_address,
@ -244,15 +266,21 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
('internal_protocol_port', internal_range),
('external_protocol_port', external_range),
('protocol', self.new_port_forwarding_with_ranges.protocol),
('floating_ip',
self.new_port_forwarding_with_ranges.floatingip_id),
('internal_ip_address', self.new_port_forwarding_with_ranges.
internal_ip_address),
(
'floating_ip',
self.new_port_forwarding_with_ranges.floatingip_id,
),
(
'internal_ip_address',
self.new_port_forwarding_with_ranges.internal_ip_address,
),
('description', self.new_port_forwarding_with_ranges.description),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
msg = "The relation between internal and external ports does not " \
"match the pattern 1:N and N:N"
msg = (
"The relation between internal and external ports does not "
"match the pattern 1:N and N:N"
)
try:
self.cmd.take_action(parsed_args)
self.fail('CommandError should be raised.')
@ -262,12 +290,14 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
def test_create_all_options(self):
arglist = [
'--port', self.new_port_forwarding.internal_port_id,
'--port',
self.new_port_forwarding.internal_port_id,
'--internal-protocol-port',
str(self.new_port_forwarding.internal_port),
'--external-protocol-port',
str(self.new_port_forwarding.external_port),
'--protocol', self.new_port_forwarding.protocol,
'--protocol',
self.new_port_forwarding.protocol,
self.new_port_forwarding.floatingip_id,
'--internal-ip-address',
self.new_port_forwarding.internal_ip_address,
@ -276,57 +306,60 @@ class TestCreateFloatingIPPortForwarding(TestFloatingIPPortForwarding):
]
verifylist = [
('port', self.new_port_forwarding.internal_port_id),
('internal_protocol_port',
str(self.new_port_forwarding.internal_port)),
('external_protocol_port',
str(self.new_port_forwarding.external_port)),
(
'internal_protocol_port',
str(self.new_port_forwarding.internal_port),
),
(
'external_protocol_port',
str(self.new_port_forwarding.external_port),
),
('protocol', self.new_port_forwarding.protocol),
('floating_ip', self.new_port_forwarding.floatingip_id),
('internal_ip_address', self.new_port_forwarding.
internal_ip_address),
(
'internal_ip_address',
self.new_port_forwarding.internal_ip_address,
),
('description', self.new_port_forwarding.description),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_floating_ip_port_forwarding.\
assert_called_once_with(
self.new_port_forwarding.floatingip_id,
**{
'external_port': self.new_port_forwarding.external_port,
'internal_ip_address': self.new_port_forwarding.
internal_ip_address,
'internal_port': self.new_port_forwarding.internal_port,
'internal_port_id': self.new_port_forwarding.
internal_port_id,
'protocol': self.new_port_forwarding.protocol,
'description': self.new_port_forwarding.description,
})
self.network.create_floating_ip_port_forwarding.assert_called_once_with( # noqa: E501
self.new_port_forwarding.floatingip_id,
**{
'external_port': self.new_port_forwarding.external_port,
'internal_ip_address': self.new_port_forwarding.internal_ip_address, # noqa: E501
'internal_port': self.new_port_forwarding.internal_port,
'internal_port_id': self.new_port_forwarding.internal_port_id,
'protocol': self.new_port_forwarding.protocol,
'description': self.new_port_forwarding.description,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestDeleteFloatingIPPortForwarding(TestFloatingIPPortForwarding):
def setUp(self):
super(TestDeleteFloatingIPPortForwarding, self).setUp()
self._port_forwarding = (
network_fakes.FakeFloatingIPPortForwarding.create_port_forwardings(
count=2, attrs={
count=2,
attrs={
'floatingip_id': self.floating_ip.id,
}
},
)
)
self.network.delete_floating_ip_port_forwarding = mock.Mock(
return_value=None
)
self.network.find_ip = mock.Mock(
return_value=self.floating_ip
)
self.network.find_ip = mock.Mock(return_value=self.floating_ip)
# Get the command object to test
self.cmd = floating_ip_port_forwarding.DeleteFloatingIPPortForwarding(
self.app, self.namespace)
self.app, self.namespace
)
def test_port_forwarding_delete(self):
arglist = [
@ -342,12 +375,11 @@ class TestDeleteFloatingIPPortForwarding(TestFloatingIPPortForwarding):
result = self.cmd.take_action(parsed_args)
self.network.delete_floating_ip_port_forwarding.\
assert_called_once_with(
self.floating_ip.id,
self._port_forwarding[0].id,
ignore_missing=False
)
self.network.delete_floating_ip_port_forwarding.assert_called_once_with( # noqa: E501
self.floating_ip.id,
self._port_forwarding[0].id,
ignore_missing=False,
)
self.assertIsNone(result)
@ -384,15 +416,17 @@ class TestDeleteFloatingIPPortForwarding(TestFloatingIPPortForwarding):
]
verifylist = [
('floating_ip', self.floating_ip.id),
('port_forwarding_id',
[self._port_forwarding[0].id, 'unexist_port_forwarding_id']),
(
'port_forwarding_id',
[self._port_forwarding[0].id, 'unexist_port_forwarding_id'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
delete_mock_result = [None, exceptions.CommandError]
self.network.delete_floating_ip_port_forwarding = (
mock.MagicMock(side_effect=delete_mock_result)
self.network.delete_floating_ip_port_forwarding = mock.MagicMock(
side_effect=delete_mock_result
)
try:
@ -400,26 +434,22 @@ class TestDeleteFloatingIPPortForwarding(TestFloatingIPPortForwarding):
self.fail('CommandError should be raised.')
except exceptions.CommandError as e:
self.assertEqual(
'1 of 2 Port forwarding failed to delete.',
str(e)
'1 of 2 Port forwarding failed to delete.', str(e)
)
self.network.delete_floating_ip_port_forwarding.\
assert_any_call(
self.floating_ip.id,
'unexist_port_forwarding_id',
ignore_missing=False
)
self.network.delete_floating_ip_port_forwarding.\
assert_any_call(
self.floating_ip.id,
self._port_forwarding[0].id,
ignore_missing=False
)
self.network.delete_floating_ip_port_forwarding.assert_any_call(
self.floating_ip.id,
'unexist_port_forwarding_id',
ignore_missing=False,
)
self.network.delete_floating_ip_port_forwarding.assert_any_call(
self.floating_ip.id,
self._port_forwarding[0].id,
ignore_missing=False,
)
class TestListFloatingIPPortForwarding(TestFloatingIPPortForwarding):
columns = (
'ID',
'Internal Port ID',
@ -436,68 +466,67 @@ class TestListFloatingIPPortForwarding(TestFloatingIPPortForwarding):
super(TestListFloatingIPPortForwarding, self).setUp()
self.port_forwardings = (
network_fakes.FakeFloatingIPPortForwarding.create_port_forwardings(
count=3, attrs={
count=3,
attrs={
'internal_port_id': self.port.id,
'floatingip_id': self.floating_ip.id,
}
},
)
)
self.data = []
for port_forwarding in self.port_forwardings:
self.data.append((
port_forwarding.id,
port_forwarding.internal_port_id,
port_forwarding.internal_ip_address,
port_forwarding.internal_port,
port_forwarding.internal_port_range,
port_forwarding.external_port,
port_forwarding.external_port_range,
port_forwarding.protocol,
port_forwarding.description,
))
self.data.append(
(
port_forwarding.id,
port_forwarding.internal_port_id,
port_forwarding.internal_ip_address,
port_forwarding.internal_port,
port_forwarding.internal_port_range,
port_forwarding.external_port,
port_forwarding.external_port_range,
port_forwarding.protocol,
port_forwarding.description,
)
)
self.network.floating_ip_port_forwardings = mock.Mock(
return_value=self.port_forwardings
)
self.network.find_ip = mock.Mock(
return_value=self.floating_ip
)
self.network.find_ip = mock.Mock(return_value=self.floating_ip)
# Get the command object to test
self.cmd = floating_ip_port_forwarding.ListFloatingIPPortForwarding(
self.app,
self.namespace
self.app, self.namespace
)
def test_port_forwarding_list(self):
arglist = [
self.floating_ip.id
]
verifylist = [
('floating_ip', self.floating_ip.id)
]
arglist = [self.floating_ip.id]
verifylist = [('floating_ip', self.floating_ip.id)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.floating_ip_port_forwardings.assert_called_once_with(
self.floating_ip,
**{}
self.floating_ip, **{}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_port_forwarding_list_all_options(self):
arglist = [
'--port', self.port_forwardings[0].internal_port_id,
'--port',
self.port_forwardings[0].internal_port_id,
'--external-protocol-port',
str(self.port_forwardings[0].external_port),
'--protocol', self.port_forwardings[0].protocol,
'--protocol',
self.port_forwardings[0].protocol,
self.port_forwardings[0].floatingip_id,
]
verifylist = [
('port', self.port_forwardings[0].internal_port_id),
('external_protocol_port',
str(self.port_forwardings[0].external_port)),
(
'external_protocol_port',
str(self.port_forwardings[0].external_port),
),
('protocol', self.port_forwardings[0].protocol),
('floating_ip', self.port_forwardings[0].floatingip_id),
]
@ -511,39 +540,32 @@ class TestListFloatingIPPortForwarding(TestFloatingIPPortForwarding):
}
self.network.floating_ip_port_forwardings.assert_called_once_with(
self.floating_ip,
**query
self.floating_ip, **query
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
class TestSetFloatingIPPortForwarding(TestFloatingIPPortForwarding):
# The Port Forwarding to set.
def setUp(self):
super(TestSetFloatingIPPortForwarding, self).setUp()
self._port_forwarding = (
network_fakes.FakeFloatingIPPortForwarding.
create_one_port_forwarding(
attrs={
'floatingip_id': self.floating_ip.id,
}
)
self._port_forwarding = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( # noqa: E501
attrs={
'floatingip_id': self.floating_ip.id,
}
)
self.network.update_floating_ip_port_forwarding = mock.Mock(
return_value=None
)
self.network.find_floating_ip_port_forwarding = mock.Mock(
return_value=self._port_forwarding)
self.network.find_ip = mock.Mock(
return_value=self.floating_ip
return_value=self._port_forwarding
)
self.network.find_ip = mock.Mock(return_value=self.floating_ip)
# Get the command object to test
self.cmd = floating_ip_port_forwarding.SetFloatingIPPortForwarding(
self.app,
self.namespace
self.app, self.namespace
)
def test_set_nothing(self):
@ -569,12 +591,18 @@ class TestSetFloatingIPPortForwarding(TestFloatingIPPortForwarding):
def test_set_all_thing(self):
arglist_single = [
'--port', self.port.id,
'--internal-ip-address', 'new_internal_ip_address',
'--internal-protocol-port', '100',
'--external-protocol-port', '200',
'--protocol', 'tcp',
'--description', 'some description',
'--port',
self.port.id,
'--internal-ip-address',
'new_internal_ip_address',
'--internal-protocol-port',
'100',
'--external-protocol-port',
'200',
'--protocol',
'tcp',
'--description',
'some description',
self._port_forwarding.floatingip_id,
self._port_forwarding.id,
]
@ -602,8 +630,11 @@ class TestSetFloatingIPPortForwarding(TestFloatingIPPortForwarding):
'protocol': 'tcp',
'description': 'some description',
}
attrs_range = dict(attrs_single, internal_port_range='100:110',
external_port_range='200:210')
attrs_range = dict(
attrs_single,
internal_port_range='100:110',
external_port_range='200:210',
)
attrs_range.pop('internal_port')
attrs_range.pop('external_port')
@ -624,7 +655,6 @@ class TestSetFloatingIPPortForwarding(TestFloatingIPPortForwarding):
class TestShowFloatingIPPortForwarding(TestFloatingIPPortForwarding):
# The port forwarding to show.
columns = (
'description',
@ -641,13 +671,10 @@ class TestShowFloatingIPPortForwarding(TestFloatingIPPortForwarding):
def setUp(self):
super(TestShowFloatingIPPortForwarding, self).setUp()
self._port_forwarding = (
network_fakes.FakeFloatingIPPortForwarding.
create_one_port_forwarding(
attrs={
'floatingip_id': self.floating_ip.id,
}
)
self._port_forwarding = network_fakes.FakeFloatingIPPortForwarding.create_one_port_forwarding( # noqa: E501
attrs={
'floatingip_id': self.floating_ip.id,
}
)
self.data = (
self._port_forwarding.description,
@ -664,13 +691,10 @@ class TestShowFloatingIPPortForwarding(TestFloatingIPPortForwarding):
self.network.find_floating_ip_port_forwarding = mock.Mock(
return_value=self._port_forwarding
)
self.network.find_ip = mock.Mock(
return_value=self.floating_ip
)
self.network.find_ip = mock.Mock(return_value=self.floating_ip)
# Get the command object to test
self.cmd = floating_ip_port_forwarding.ShowFloatingIPPortForwarding(
self.app,
self.namespace
self.app, self.namespace
)
def test_show_no_options(self):
@ -678,8 +702,13 @@ class TestShowFloatingIPPortForwarding(TestFloatingIPPortForwarding):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_default_options(self):
arglist = [
@ -695,9 +724,7 @@ class TestShowFloatingIPPortForwarding(TestFloatingIPPortForwarding):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_floating_ip_port_forwarding.assert_called_once_with(
self.floating_ip,
self._port_forwarding.id,
ignore_missing=False
self.floating_ip, self._port_forwarding.id, ignore_missing=False
)
self.assertEqual(self.columns, columns)

View File

@ -22,7 +22,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestIPAvailability(network_fakes.TestNetworkV2):
def setUp(self):
super(TestIPAvailability, self).setUp()
@ -37,7 +36,6 @@ class TestIPAvailability(network_fakes.TestNetworkV2):
class TestListIPAvailability(TestIPAvailability):
_ip_availability = network_fakes.create_ip_availability(count=3)
columns = (
'Network ID',
@ -47,20 +45,22 @@ class TestListIPAvailability(TestIPAvailability):
)
data = []
for net in _ip_availability:
data.append((
net.network_id,
net.network_name,
net.total_ips,
net.used_ips,
))
data.append(
(
net.network_id,
net.network_name,
net.total_ips,
net.used_ips,
)
)
def setUp(self):
super(TestListIPAvailability, self).setUp()
self.cmd = ip_availability.ListIPAvailability(
self.app, self.namespace)
self.cmd = ip_availability.ListIPAvailability(self.app, self.namespace)
self.network.network_ip_availabilities = mock.Mock(
return_value=self._ip_availability)
return_value=self._ip_availability
)
def test_list_no_options(self):
arglist = []
@ -72,17 +72,17 @@ class TestListIPAvailability(TestIPAvailability):
filters = {'ip_version': 4}
self.network.network_ip_availabilities.assert_called_once_with(
**filters)
**filters
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_list_ip_version(self):
arglist = [
'--ip-version', str(4),
]
verifylist = [
('ip_version', 4)
'--ip-version',
str(4),
]
verifylist = [('ip_version', 4)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -90,35 +90,32 @@ class TestListIPAvailability(TestIPAvailability):
filters = {'ip_version': 4}
self.network.network_ip_availabilities.assert_called_once_with(
**filters)
**filters
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_list_project(self):
arglist = [
'--project', self.project.name
]
verifylist = [
('project', self.project.name)
]
arglist = ['--project', self.project.name]
verifylist = [('project', self.project.name)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
filters = {'project_id': self.project.id,
'ip_version': 4}
filters = {'project_id': self.project.id, 'ip_version': 4}
self.network.network_ip_availabilities.assert_called_once_with(
**filters)
**filters
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
class TestShowIPAvailability(TestIPAvailability):
_network = network_fakes.create_one_network()
_ip_availability = network_fakes.create_one_ip_availability(
attrs={'network_id': _network.id})
attrs={'network_id': _network.id}
)
columns = (
'network_id',
@ -132,8 +129,7 @@ class TestShowIPAvailability(TestIPAvailability):
_ip_availability.network_id,
_ip_availability.network_name,
_ip_availability.project_id,
format_columns.ListDictColumn(
_ip_availability.subnet_ip_availability),
format_columns.ListDictColumn(_ip_availability.subnet_ip_availability),
_ip_availability.total_ips,
_ip_availability.used_ips,
)
@ -142,35 +138,37 @@ class TestShowIPAvailability(TestIPAvailability):
super(TestShowIPAvailability, self).setUp()
self.network.find_network_ip_availability = mock.Mock(
return_value=self._ip_availability)
self.network.find_network = mock.Mock(
return_value=self._network)
return_value=self._ip_availability
)
self.network.find_network = mock.Mock(return_value=self._network)
# Get the command object to test
self.cmd = ip_availability.ShowIPAvailability(
self.app, self.namespace)
self.cmd = ip_availability.ShowIPAvailability(self.app, self.namespace)
def test_show_no_option(self):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
self._ip_availability.network_name,
]
verifylist = [
('network', self._ip_availability.network_name)
]
verifylist = [('network', self._ip_availability.network_name)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.find_network_ip_availability.assert_called_once_with(
self._ip_availability.network_id,
ignore_missing=False)
self._ip_availability.network_id, ignore_missing=False
)
self.network.find_network.assert_called_once_with(
self._ip_availability.network_name,
ignore_missing=False)
self._ip_availability.network_name, ignore_missing=False
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)

View File

@ -21,7 +21,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestConntrackHelper(network_fakes.TestNetworkV2):
def setUp(self):
super(TestConntrackHelper, self).setUp()
# Get a shortcut to the network client
@ -31,48 +30,53 @@ class TestConntrackHelper(network_fakes.TestNetworkV2):
class TestCreateL3ConntrackHelper(TestConntrackHelper):
def setUp(self):
super(TestCreateL3ConntrackHelper, self).setUp()
attrs = {'router_id': self.router.id}
self.ct_helper = (
network_fakes.FakeL3ConntrackHelper.create_one_l3_conntrack_helper(
attrs))
self.columns = (
'helper',
'id',
'port',
'protocol',
'router_id'
attrs
)
)
self.columns = ('helper', 'id', 'port', 'protocol', 'router_id')
self.data = (
self.ct_helper.helper,
self.ct_helper.id,
self.ct_helper.port,
self.ct_helper.protocol,
self.ct_helper.router_id
self.ct_helper.router_id,
)
self.network.create_conntrack_helper = mock.Mock(
return_value=self.ct_helper)
return_value=self.ct_helper
)
# Get the command object to test
self.cmd = l3_conntrack_helper.CreateConntrackHelper(self.app,
self.namespace)
self.cmd = l3_conntrack_helper.CreateConntrackHelper(
self.app, self.namespace
)
def test_create_no_options(self):
arglist = []
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
'--helper', 'tftp',
'--protocol', 'udp',
'--port', '69',
'--helper',
'tftp',
'--protocol',
'udp',
'--port',
'69',
self.router.id,
]
@ -83,49 +87,50 @@ class TestCreateL3ConntrackHelper(TestConntrackHelper):
]
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.network.create_conntrack_helper.assert_called_once_with(
self.router.id,
**{'helper': 'tftp', 'protocol': 'udp',
'port': 69}
self.router.id, **{'helper': 'tftp', 'protocol': 'udp', 'port': 69}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_wrong_options(self):
arglist = [
'--protocol', 'udp',
'--port', '69',
'--protocol',
'udp',
'--port',
'69',
self.router.id,
]
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd, arglist, None)
self.cmd,
arglist,
None,
)
class TestDeleteL3ConntrackHelper(TestConntrackHelper):
def setUp(self):
super(TestDeleteL3ConntrackHelper, self).setUp()
attrs = {'router_id': self.router.id}
self.ct_helper = (
network_fakes.FakeL3ConntrackHelper.create_one_l3_conntrack_helper(
attrs))
self.network.delete_conntrack_helper = mock.Mock(
return_value=None)
attrs
)
)
self.network.delete_conntrack_helper = mock.Mock(return_value=None)
# Get the command object to test
self.cmd = l3_conntrack_helper.DeleteConntrackHelper(self.app,
self.namespace)
self.cmd = l3_conntrack_helper.DeleteConntrackHelper(
self.app, self.namespace
)
def test_delete(self):
arglist = [
self.ct_helper.router_id,
self.ct_helper.id
]
arglist = [self.ct_helper.router_id, self.ct_helper.id]
verifylist = [
('conntrack_helper_id', [self.ct_helper.id]),
('router', self.ct_helper.router_id),
@ -133,35 +138,34 @@ class TestDeleteL3ConntrackHelper(TestConntrackHelper):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.network.delete_conntrack_helper.assert_called_once_with(
self.ct_helper.id, self.router.id,
ignore_missing=False)
self.ct_helper.id, self.router.id, ignore_missing=False
)
self.assertIsNone(result)
def test_delete_error(self):
arglist = [
self.router.id,
self.ct_helper.id
]
arglist = [self.router.id, self.ct_helper.id]
verifylist = [
('conntrack_helper_id', [self.ct_helper.id]),
('router', self.router.id),
]
self.network.delete_conntrack_helper.side_effect = Exception(
'Error message')
'Error message'
)
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(
exceptions.CommandError,
self.cmd.take_action, parsed_args)
exceptions.CommandError, self.cmd.take_action, parsed_args
)
class TestListL3ConntrackHelper(TestConntrackHelper):
def setUp(self):
super(TestListL3ConntrackHelper, self).setUp()
attrs = {'router_id': self.router.id}
ct_helpers = (
network_fakes.FakeL3ConntrackHelper.create_l3_conntrack_helpers(
attrs, count=3))
attrs, count=3
)
)
self.columns = (
'ID',
'Router ID',
@ -171,24 +175,24 @@ class TestListL3ConntrackHelper(TestConntrackHelper):
)
self.data = []
for ct_helper in ct_helpers:
self.data.append((
ct_helper.id,
ct_helper.router_id,
ct_helper.helper,
ct_helper.protocol,
ct_helper.port,
))
self.network.conntrack_helpers = mock.Mock(
return_value=ct_helpers)
self.data.append(
(
ct_helper.id,
ct_helper.router_id,
ct_helper.helper,
ct_helper.protocol,
ct_helper.port,
)
)
self.network.conntrack_helpers = mock.Mock(return_value=ct_helpers)
# Get the command object to test
self.cmd = l3_conntrack_helper.ListConntrackHelper(self.app,
self.namespace)
self.cmd = l3_conntrack_helper.ListConntrackHelper(
self.app, self.namespace
)
def test_conntrack_helpers_list(self):
arglist = [
self.router.id
]
arglist = [self.router.id]
verifylist = [
('router', self.router.id),
]
@ -196,8 +200,7 @@ class TestListL3ConntrackHelper(TestConntrackHelper):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.conntrack_helpers.assert_called_once_with(
self.router.id)
self.network.conntrack_helpers.assert_called_once_with(self.router.id)
self.assertEqual(self.columns, columns)
list_data = list(data)
self.assertEqual(len(self.data), len(list_data))
@ -206,18 +209,20 @@ class TestListL3ConntrackHelper(TestConntrackHelper):
class TestSetL3ConntrackHelper(TestConntrackHelper):
def setUp(self):
super(TestSetL3ConntrackHelper, self).setUp()
attrs = {'router_id': self.router.id}
self.ct_helper = (
network_fakes.FakeL3ConntrackHelper.create_one_l3_conntrack_helper(
attrs))
attrs
)
)
self.network.update_conntrack_helper = mock.Mock(return_value=None)
# Get the command object to test
self.cmd = l3_conntrack_helper.SetConntrackHelper(self.app,
self.namespace)
self.cmd = l3_conntrack_helper.SetConntrackHelper(
self.app, self.namespace
)
def test_set_nothing(self):
arglist = [
@ -230,7 +235,7 @@ class TestSetL3ConntrackHelper(TestConntrackHelper):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = (self.cmd.take_action(parsed_args))
result = self.cmd.take_action(parsed_args)
self.network.update_conntrack_helper.assert_called_once_with(
self.ct_helper.id, self.router.id
@ -241,7 +246,8 @@ class TestSetL3ConntrackHelper(TestConntrackHelper):
arglist = [
self.router.id,
self.ct_helper.id,
'--port', '124',
'--port',
'124',
]
verifylist = [
('router', self.router.id),
@ -250,7 +256,7 @@ class TestSetL3ConntrackHelper(TestConntrackHelper):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = (self.cmd.take_action(parsed_args))
result = self.cmd.take_action(parsed_args)
self.network.update_conntrack_helper.assert_called_once_with(
self.ct_helper.id, self.router.id, port=124
@ -259,42 +265,44 @@ class TestSetL3ConntrackHelper(TestConntrackHelper):
class TestShowL3ConntrackHelper(TestConntrackHelper):
def setUp(self):
super(TestShowL3ConntrackHelper, self).setUp()
attrs = {'router_id': self.router.id}
self.ct_helper = (
network_fakes.FakeL3ConntrackHelper.create_one_l3_conntrack_helper(
attrs))
self.columns = (
'helper',
'id',
'port',
'protocol',
'router_id'
attrs
)
)
self.columns = ('helper', 'id', 'port', 'protocol', 'router_id')
self.data = (
self.ct_helper.helper,
self.ct_helper.id,
self.ct_helper.port,
self.ct_helper.protocol,
self.ct_helper.router_id
self.ct_helper.router_id,
)
self.network.get_conntrack_helper = mock.Mock(
return_value=self.ct_helper)
return_value=self.ct_helper
)
# Get the command object to test
self.cmd = l3_conntrack_helper.ShowConntrackHelper(self.app,
self.namespace)
self.cmd = l3_conntrack_helper.ShowConntrackHelper(
self.app, self.namespace
)
def test_show_no_options(self):
arglist = []
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_default_options(self):
arglist = [
@ -307,7 +315,7 @@ class TestShowL3ConntrackHelper(TestConntrackHelper):
]
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.network.get_conntrack_helper.assert_called_once_with(
self.ct_helper.id, self.router.id

View File

@ -25,7 +25,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestLocalIP(network_fakes.TestNetworkV2):
def setUp(self):
super().setUp()
@ -44,9 +43,12 @@ class TestCreateLocalIP(TestLocalIP):
port = network_fakes.create_one_port()
# The new local ip created.
new_local_ip = network_fakes.create_one_local_ip(
attrs={'project_id': project.id,
'network_id': local_ip_network.id,
'local_port_id': port.id})
attrs={
'project_id': project.id,
'network_id': local_ip_network.id,
'local_port_id': port.id,
}
)
columns = (
'created_at',
@ -78,11 +80,12 @@ class TestCreateLocalIP(TestLocalIP):
def setUp(self):
super().setUp()
self.network.create_local_ip = mock.Mock(
return_value=self.new_local_ip)
return_value=self.new_local_ip
)
self.network.find_network = mock.Mock(
return_value=self.local_ip_network)
self.network.find_port = mock.Mock(
return_value=self.port)
return_value=self.local_ip_network
)
self.network.find_port = mock.Mock(return_value=self.port)
# Get the command object to test
self.cmd = local_ip.CreateLocalIP(self.app, self.namespace)
@ -92,7 +95,7 @@ class TestCreateLocalIP(TestLocalIP):
def test_create_no_options(self):
parsed_args = self.check_parser(self.cmd, [], [])
columns, data = (self.cmd.take_action(parsed_args))
columns, data = self.cmd.take_action(parsed_args)
self.network.create_local_ip.assert_called_once_with(**{})
self.assertEqual(set(self.columns), set(columns))
@ -100,13 +103,20 @@ class TestCreateLocalIP(TestLocalIP):
def test_create_all_options(self):
arglist = [
'--project-domain', self.domain.name,
'--description', self.new_local_ip.description,
'--name', self.new_local_ip.name,
'--network', self.new_local_ip.network_id,
'--local-port', self.new_local_ip.local_port_id,
'--local-ip-address', '10.0.0.1',
'--ip-mode', self.new_local_ip.ip_mode,
'--project-domain',
self.domain.name,
'--description',
self.new_local_ip.description,
'--name',
self.new_local_ip.name,
'--network',
self.new_local_ip.network_id,
'--local-port',
self.new_local_ip.local_port_id,
'--local-ip-address',
'10.0.0.1',
'--ip-mode',
self.new_local_ip.ip_mode,
]
verifylist = [
('project_domain', self.domain.name),
@ -119,16 +129,18 @@ class TestCreateLocalIP(TestLocalIP):
]
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.network.create_local_ip.assert_called_once_with(**{
'name': self.new_local_ip.name,
'description': self.new_local_ip.description,
'network_id': self.new_local_ip.network_id,
'local_port_id': self.new_local_ip.local_port_id,
'local_ip_address': '10.0.0.1',
'ip_mode': self.new_local_ip.ip_mode,
})
self.network.create_local_ip.assert_called_once_with(
**{
'name': self.new_local_ip.name,
'description': self.new_local_ip.description,
'network_id': self.new_local_ip.network_id,
'local_port_id': self.new_local_ip.local_port_id,
'local_ip_address': '10.0.0.1',
'ip_mode': self.new_local_ip.ip_mode,
}
)
self.assertEqual(set(self.columns), set(columns))
self.assertCountEqual(self.data, data)
@ -141,7 +153,8 @@ class TestDeleteLocalIP(TestLocalIP):
super().setUp()
self.network.delete_local_ip = mock.Mock(return_value=None)
self.network.find_local_ip = network_fakes.get_local_ips(
local_ips=self._local_ips)
local_ips=self._local_ips
)
# Get the command object to test
self.cmd = local_ip.DeleteLocalIP(self.app, self.namespace)
@ -158,9 +171,11 @@ class TestDeleteLocalIP(TestLocalIP):
result = self.cmd.take_action(parsed_args)
self.network.find_local_ip.assert_called_once_with(
self._local_ips[0].name, ignore_missing=False)
self._local_ips[0].name, ignore_missing=False
)
self.network.delete_local_ip.assert_called_once_with(
self._local_ips[0])
self._local_ips[0]
)
self.assertIsNone(result)
def test_multi_local_ips_delete(self):
@ -187,15 +202,12 @@ class TestDeleteLocalIP(TestLocalIP):
'unexist_local_ip',
]
verifylist = [
('local_ip',
[self._local_ips[0].name, 'unexist_local_ip']),
('local_ip', [self._local_ips[0].name, 'unexist_local_ip']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._local_ips[0], exceptions.CommandError]
self.network.find_local_ip = (
mock.Mock(side_effect=find_mock_result)
)
self.network.find_local_ip = mock.Mock(side_effect=find_mock_result)
try:
self.cmd.take_action(parsed_args)
@ -204,9 +216,11 @@ class TestDeleteLocalIP(TestLocalIP):
self.assertEqual('1 of 2 local IPs failed to delete.', str(e))
self.network.find_local_ip.assert_any_call(
self._local_ips[0].name, ignore_missing=False)
self._local_ips[0].name, ignore_missing=False
)
self.network.find_local_ip.assert_any_call(
'unexist_local_ip', ignore_missing=False)
'unexist_local_ip', ignore_missing=False
)
self.network.delete_local_ip.assert_called_once_with(
self._local_ips[0]
)
@ -214,11 +228,8 @@ class TestDeleteLocalIP(TestLocalIP):
class TestListLocalIP(TestLocalIP):
# The local ip to list up.
local_ips = (
network_fakes.create_local_ips(count=3))
fake_network = network_fakes.create_one_network(
{'id': 'fake_network_id'}
)
local_ips = network_fakes.create_local_ips(count=3)
fake_network = network_fakes.create_one_network({'id': 'fake_network_id'})
columns = (
'ID',
@ -232,24 +243,23 @@ class TestListLocalIP(TestLocalIP):
)
data = []
for lip in local_ips:
data.append((
lip.id,
lip.name,
lip.description,
lip.project_id,
lip.local_port_id,
lip.network_id,
lip.local_ip_address,
lip.ip_mode,
))
data.append(
(
lip.id,
lip.name,
lip.description,
lip.project_id,
lip.local_port_id,
lip.network_id,
lip.local_ip_address,
lip.ip_mode,
)
)
def setUp(self):
super().setUp()
self.network.local_ips = mock.Mock(
return_value=self.local_ips)
self.network.find_network = mock.Mock(
return_value=self.fake_network
)
self.network.local_ips = mock.Mock(return_value=self.local_ips)
self.network.find_network = mock.Mock(return_value=self.fake_network)
# Get the command object to test
self.cmd = local_ip.ListLocalIP(self.app, self.namespace)
@ -267,7 +277,8 @@ class TestListLocalIP(TestLocalIP):
def test_local_ip_list_name(self):
arglist = [
'--name', self.local_ips[0].name,
'--name',
self.local_ips[0].name,
]
verifylist = [
('name', self.local_ips[0].name),
@ -276,7 +287,8 @@ class TestListLocalIP(TestLocalIP):
columns, data = self.cmd.take_action(parsed_args)
self.network.local_ips.assert_called_once_with(
**{'name': self.local_ips[0].name})
**{'name': self.local_ips[0].name}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -284,7 +296,8 @@ class TestListLocalIP(TestLocalIP):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project',
project.id,
]
verifylist = [
('project', project.id),
@ -293,7 +306,8 @@ class TestListLocalIP(TestLocalIP):
columns, data = self.cmd.take_action(parsed_args)
self.network.local_ips.assert_called_once_with(
**{'project_id': project.id})
**{'project_id': project.id}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -301,8 +315,10 @@ class TestListLocalIP(TestLocalIP):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project-domain', project.domain_id,
'--project',
project.id,
'--project-domain',
project.domain_id,
]
verifylist = [
('project', project.id),
@ -318,7 +334,8 @@ class TestListLocalIP(TestLocalIP):
def test_local_ip_list_network(self):
arglist = [
'--network', 'fake_network_id',
'--network',
'fake_network_id',
]
verifylist = [
('network', 'fake_network_id'),
@ -327,16 +344,19 @@ class TestListLocalIP(TestLocalIP):
columns, data = self.cmd.take_action(parsed_args)
self.network.local_ips.assert_called_once_with(**{
'network_id': 'fake_network_id',
})
self.network.local_ips.assert_called_once_with(
**{
'network_id': 'fake_network_id',
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_local_ip_list_local_ip_address(self):
arglist = [
'--local-ip-address', self.local_ips[0].local_ip_address,
'--local-ip-address',
self.local_ips[0].local_ip_address,
]
verifylist = [
('local_ip_address', self.local_ips[0].local_ip_address),
@ -345,15 +365,18 @@ class TestListLocalIP(TestLocalIP):
columns, data = self.cmd.take_action(parsed_args)
self.network.local_ips.assert_called_once_with(**{
'local_ip_address': self.local_ips[0].local_ip_address,
})
self.network.local_ips.assert_called_once_with(
**{
'local_ip_address': self.local_ips[0].local_ip_address,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_local_ip_list_ip_mode(self):
arglist = [
'--ip-mode', self.local_ips[0].ip_mode,
'--ip-mode',
self.local_ips[0].ip_mode,
]
verifylist = [
('ip_mode', self.local_ips[0].ip_mode),
@ -362,9 +385,11 @@ class TestListLocalIP(TestLocalIP):
columns, data = self.cmd.take_action(parsed_args)
self.network.local_ips.assert_called_once_with(**{
'ip_mode': self.local_ips[0].ip_mode,
})
self.network.local_ips.assert_called_once_with(
**{
'ip_mode': self.local_ips[0].ip_mode,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
@ -376,14 +401,15 @@ class TestSetLocalIP(TestLocalIP):
def setUp(self):
super().setUp()
self.network.update_local_ip = mock.Mock(return_value=None)
self.network.find_local_ip = mock.Mock(
return_value=self._local_ip)
self.network.find_local_ip = mock.Mock(return_value=self._local_ip)
# Get the command object to test
self.cmd = local_ip.SetLocalIP(self.app, self.namespace)
def test_set_nothing(self):
arglist = [self._local_ip.name, ]
arglist = [
self._local_ip.name,
]
verifylist = [
('local_ip', self._local_ip.name),
]
@ -396,8 +422,10 @@ class TestSetLocalIP(TestLocalIP):
def test_set_name_and_description(self):
arglist = [
'--name', 'new_local_ip_name',
'--description', 'new_local_ip_description',
'--name',
'new_local_ip_name',
'--description',
'new_local_ip_description',
self._local_ip.name,
]
verifylist = [
@ -413,7 +441,8 @@ class TestSetLocalIP(TestLocalIP):
'description': 'new_local_ip_description',
}
self.network.update_local_ip.assert_called_with(
self._local_ip, **attrs)
self._local_ip, **attrs
)
self.assertIsNone(result)
@ -449,8 +478,7 @@ class TestShowLocalIP(TestLocalIP):
def setUp(self):
super().setUp()
self.network.find_local_ip = mock.Mock(
return_value=self._local_ip)
self.network.find_local_ip = mock.Mock(return_value=self._local_ip)
# Get the command object to test
self.cmd = local_ip.ShowLocalIP(self.app, self.namespace)
@ -460,8 +488,13 @@ class TestShowLocalIP(TestLocalIP):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -475,6 +508,7 @@ class TestShowLocalIP(TestLocalIP):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_local_ip.assert_called_once_with(
self._local_ip.name, ignore_missing=False)
self._local_ip.name, ignore_missing=False
)
self.assertEqual(set(self.columns), set(columns))
self.assertCountEqual(self.data, list(data))

View File

@ -24,7 +24,6 @@ from openstackclient.tests.unit.network.v2 import fakes as network_fakes
class TestLocalIPAssociation(network_fakes.TestNetworkV2):
def setUp(self):
super().setUp()
self.network = self.app.client_manager.network
@ -35,7 +34,6 @@ class TestLocalIPAssociation(network_fakes.TestNetworkV2):
class TestCreateLocalIPAssociation(TestLocalIPAssociation):
def setUp(self):
super().setUp()
self.new_local_ip_association = (
@ -47,15 +45,15 @@ class TestCreateLocalIPAssociation(TestLocalIPAssociation):
)
)
self.network.create_local_ip_association = mock.Mock(
return_value=self.new_local_ip_association)
self.network.find_local_ip = mock.Mock(
return_value=self.local_ip
return_value=self.new_local_ip_association
)
self.network.find_local_ip = mock.Mock(return_value=self.local_ip)
# Get the command object to test
self.cmd = local_ip_association.CreateLocalIPAssociation(
self.app, self.namespace)
self.app, self.namespace
)
self.columns = (
'local_ip_address',
@ -83,13 +81,12 @@ class TestCreateLocalIPAssociation(TestLocalIPAssociation):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_local_ip_association.\
assert_called_once_with(
self.new_local_ip_association.local_ip_id,
**{
'fixed_port_id':
self.new_local_ip_association.fixed_port_id,
})
self.network.create_local_ip_association.assert_called_once_with(
self.new_local_ip_association.local_ip_id,
**{
'fixed_port_id': self.new_local_ip_association.fixed_port_id,
}
)
self.assertEqual(set(self.columns), set(columns))
self.assertEqual(set(self.data), set(data))
@ -97,7 +94,8 @@ class TestCreateLocalIPAssociation(TestLocalIPAssociation):
arglist = [
self.new_local_ip_association.local_ip_id,
self.new_local_ip_association.fixed_port_id,
'--fixed-ip', self.new_local_ip_association.fixed_ip,
'--fixed-ip',
self.new_local_ip_association.fixed_ip,
]
verifylist = [
('local_ip', self.new_local_ip_association.local_ip_id),
@ -107,40 +105,35 @@ class TestCreateLocalIPAssociation(TestLocalIPAssociation):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_local_ip_association.\
assert_called_once_with(
self.new_local_ip_association.local_ip_id,
**{
'fixed_port_id':
self.new_local_ip_association.fixed_port_id,
'fixed_ip':
self.new_local_ip_association.fixed_ip,
})
self.network.create_local_ip_association.assert_called_once_with(
self.new_local_ip_association.local_ip_id,
**{
'fixed_port_id': self.new_local_ip_association.fixed_port_id,
'fixed_ip': self.new_local_ip_association.fixed_ip,
}
)
self.assertEqual(set(self.columns), set(columns))
self.assertEqual(set(self.data), set(data))
class TestDeleteLocalIPAssociation(TestLocalIPAssociation):
def setUp(self):
super().setUp()
self._local_ip_association = (
network_fakes.create_local_ip_associations(
count=2, attrs={
count=2,
attrs={
'local_ip_id': self.local_ip.id,
}
},
)
)
self.network.delete_local_ip_association = mock.Mock(
return_value=None
)
self.network.delete_local_ip_association = mock.Mock(return_value=None)
self.network.find_local_ip = mock.Mock(
return_value=self.local_ip
)
self.network.find_local_ip = mock.Mock(return_value=self.local_ip)
# Get the command object to test
self.cmd = local_ip_association.DeleteLocalIPAssociation(
self.app, self.namespace)
self.app, self.namespace
)
def test_local_ip_association_delete(self):
arglist = [
@ -156,12 +149,11 @@ class TestDeleteLocalIPAssociation(TestLocalIPAssociation):
result = self.cmd.take_action(parsed_args)
self.network.delete_local_ip_association.\
assert_called_once_with(
self.local_ip.id,
self._local_ip_association[0].fixed_port_id,
ignore_missing=False
)
self.network.delete_local_ip_association.assert_called_once_with(
self.local_ip.id,
self._local_ip_association[0].fixed_port_id,
ignore_missing=False,
)
self.assertIsNone(result)
@ -185,8 +177,9 @@ class TestDeleteLocalIPAssociation(TestLocalIPAssociation):
calls = []
for a in self._local_ip_association:
calls.append(call(a.local_ip_id, a.fixed_port_id,
ignore_missing=False))
calls.append(
call(a.local_ip_id, a.fixed_port_id, ignore_missing=False)
)
self.network.delete_local_ip_association.assert_has_calls(calls)
self.assertIsNone(result)
@ -199,16 +192,20 @@ class TestDeleteLocalIPAssociation(TestLocalIPAssociation):
]
verifylist = [
('local_ip', self.local_ip.id),
('fixed_port_id',
[self._local_ip_association[0].fixed_port_id,
'unexist_fixed_port_id']),
(
'fixed_port_id',
[
self._local_ip_association[0].fixed_port_id,
'unexist_fixed_port_id',
],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
delete_mock_result = [None, exceptions.CommandError]
self.network.delete_local_ip_association = (
mock.MagicMock(side_effect=delete_mock_result)
self.network.delete_local_ip_association = mock.MagicMock(
side_effect=delete_mock_result
)
try:
@ -216,92 +213,82 @@ class TestDeleteLocalIPAssociation(TestLocalIPAssociation):
self.fail('CommandError should be raised.')
except exceptions.CommandError as e:
self.assertEqual(
'1 of 2 Local IP Associations failed to delete.',
str(e)
'1 of 2 Local IP Associations failed to delete.', str(e)
)
self.network.delete_local_ip_association.\
assert_any_call(
self.local_ip.id,
'unexist_fixed_port_id',
ignore_missing=False
)
self.network.delete_local_ip_association.\
assert_any_call(
self.local_ip.id,
self._local_ip_association[0].fixed_port_id,
ignore_missing=False
)
self.network.delete_local_ip_association.assert_any_call(
self.local_ip.id, 'unexist_fixed_port_id', ignore_missing=False
)
self.network.delete_local_ip_association.assert_any_call(
self.local_ip.id,
self._local_ip_association[0].fixed_port_id,
ignore_missing=False,
)
class TestListLocalIPAssociation(TestLocalIPAssociation):
columns = (
'Local IP ID',
'Local IP Address',
'Fixed port ID',
'Fixed IP',
'Host'
'Host',
)
def setUp(self):
super().setUp()
self.local_ip_associations = (
network_fakes.create_local_ip_associations(
count=3, attrs={
count=3,
attrs={
'local_ip_id': self.local_ip.id,
'fixed_port_id': self.fixed_port.id,
}
},
)
)
self.data = []
for lip_assoc in self.local_ip_associations:
self.data.append((
lip_assoc.local_ip_id,
lip_assoc.local_ip_address,
lip_assoc.fixed_port_id,
lip_assoc.fixed_ip,
lip_assoc.host,
))
self.data.append(
(
lip_assoc.local_ip_id,
lip_assoc.local_ip_address,
lip_assoc.fixed_port_id,
lip_assoc.fixed_ip,
lip_assoc.host,
)
)
self.network.local_ip_associations = mock.Mock(
return_value=self.local_ip_associations
)
self.network.find_local_ip = mock.Mock(
return_value=self.local_ip
)
self.network.find_port = mock.Mock(
return_value=self.fixed_port
)
self.network.find_local_ip = mock.Mock(return_value=self.local_ip)
self.network.find_port = mock.Mock(return_value=self.fixed_port)
# Get the command object to test
self.cmd = local_ip_association.ListLocalIPAssociation(
self.app,
self.namespace
self.app, self.namespace
)
def test_local_ip_association_list(self):
arglist = [
self.local_ip.id
]
verifylist = [
('local_ip', self.local_ip.id)
]
arglist = [self.local_ip.id]
verifylist = [('local_ip', self.local_ip.id)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.local_ip_associations.assert_called_once_with(
self.local_ip,
**{}
self.local_ip, **{}
)
self.assertEqual(set(self.columns), set(columns))
self.assertEqual(set(self.data), set(list(data)))
def test_local_ip_association_list_all_options(self):
arglist = [
'--fixed-port', self.local_ip_associations[0].fixed_port_id,
'--fixed-ip', self.local_ip_associations[0].fixed_ip,
'--host', self.local_ip_associations[0].host,
self.local_ip_associations[0].local_ip_id
'--fixed-port',
self.local_ip_associations[0].fixed_port_id,
'--fixed-ip',
self.local_ip_associations[0].fixed_ip,
'--host',
self.local_ip_associations[0].host,
self.local_ip_associations[0].local_ip_id,
]
verifylist = [
@ -321,8 +308,7 @@ class TestListLocalIPAssociation(TestLocalIPAssociation):
}
self.network.local_ip_associations.assert_called_once_with(
self.local_ip,
**attrs
self.local_ip, **attrs
)
self.assertEqual(set(self.columns), set(columns))
self.assertEqual(set(self.data), set(list(data)))

View File

@ -23,7 +23,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestNDPProxy(network_fakes.TestNetworkV2):
def setUp(self):
super(TestNDPProxy, self).setUp()
# Get a shortcut to the ProjectManager Mock
@ -33,7 +32,8 @@ class TestNDPProxy(network_fakes.TestNetworkV2):
# Get a shortcut to the network client
self.network = self.app.client_manager.network
self.router = network_fakes.FakeRouter.create_one_router(
{'id': 'fake-router-id'})
{'id': 'fake-router-id'}
)
self.network.find_router = mock.Mock(return_value=self.router)
self.port = network_fakes.create_one_port()
self.network.find_port = mock.Mock(return_value=self.port)
@ -43,9 +43,7 @@ class TestCreateNDPProxy(TestNDPProxy):
def setUp(self):
super(TestCreateNDPProxy, self).setUp()
attrs = {'router_id': self.router.id, 'port_id': self.port.id}
self.ndp_proxy = (
network_fakes.create_one_ndp_proxy(
attrs))
self.ndp_proxy = network_fakes.create_one_ndp_proxy(attrs)
self.columns = (
'created_at',
'description',
@ -56,7 +54,8 @@ class TestCreateNDPProxy(TestNDPProxy):
'project_id',
'revision_number',
'router_id',
'updated_at')
'updated_at',
)
self.data = (
self.ndp_proxy.created_at,
@ -68,10 +67,9 @@ class TestCreateNDPProxy(TestNDPProxy):
self.ndp_proxy.project_id,
self.ndp_proxy.revision_number,
self.ndp_proxy.router_id,
self.ndp_proxy.updated_at
self.ndp_proxy.updated_at,
)
self.network.create_ndp_proxy = mock.Mock(
return_value=self.ndp_proxy)
self.network.create_ndp_proxy = mock.Mock(return_value=self.ndp_proxy)
# Get the command object to test
self.cmd = ndp_proxy.CreateNDPProxy(self.app, self.namespace)
@ -81,16 +79,25 @@ class TestCreateNDPProxy(TestNDPProxy):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_all_options(self):
arglist = [
self.ndp_proxy.router_id,
'--name', self.ndp_proxy.name,
'--port', self.ndp_proxy.port_id,
'--ip-address', self.ndp_proxy.ip_address,
'--description', self.ndp_proxy.description,
'--name',
self.ndp_proxy.name,
'--port',
self.ndp_proxy.port_id,
'--ip-address',
self.ndp_proxy.ip_address,
'--description',
self.ndp_proxy.description,
]
verifylist = [
('name', self.ndp_proxy.name),
@ -103,38 +110,33 @@ class TestCreateNDPProxy(TestNDPProxy):
columns, data = self.cmd.take_action(parsed_args)
self.network.create_ndp_proxy.assert_called_once_with(
**{'name': self.ndp_proxy.name,
'router_id': self.ndp_proxy.router_id,
'ip_address': self.ndp_proxy.ip_address,
'port_id': self.ndp_proxy.port_id,
'description': self.ndp_proxy.description})
**{
'name': self.ndp_proxy.name,
'router_id': self.ndp_proxy.router_id,
'ip_address': self.ndp_proxy.ip_address,
'port_id': self.ndp_proxy.port_id,
'description': self.ndp_proxy.description,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestDeleteNDPProxy(TestNDPProxy):
def setUp(self):
super(TestDeleteNDPProxy, self).setUp()
attrs = {'router_id': self.router.id, 'port_id': self.port.id}
self.ndp_proxies = (
network_fakes.create_ndp_proxies(attrs))
self.ndp_proxies = network_fakes.create_ndp_proxies(attrs)
self.ndp_proxy = self.ndp_proxies[0]
self.network.delete_ndp_proxy = mock.Mock(
return_value=None)
self.network.find_ndp_proxy = mock.Mock(
return_value=self.ndp_proxy)
self.network.delete_ndp_proxy = mock.Mock(return_value=None)
self.network.find_ndp_proxy = mock.Mock(return_value=self.ndp_proxy)
# Get the command object to test
self.cmd = ndp_proxy.DeleteNDPProxy(self.app, self.namespace)
def test_delete(self):
arglist = [
self.ndp_proxy.id
]
verifylist = [
('ndp_proxy', [self.ndp_proxy.id])
]
arglist = [self.ndp_proxy.id]
verifylist = [('ndp_proxy', [self.ndp_proxy.id])]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.network.delete_ndp_proxy.assert_called_once_with(self.ndp_proxy)
@ -144,15 +146,12 @@ class TestDeleteNDPProxy(TestNDPProxy):
arglist = [
self.ndp_proxy.id,
]
verifylist = [
('ndp_proxy', [self.ndp_proxy.id])
]
self.network.delete_ndp_proxy.side_effect = Exception(
'Error message')
verifylist = [('ndp_proxy', [self.ndp_proxy.id])]
self.network.delete_ndp_proxy.side_effect = Exception('Error message')
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(
exceptions.CommandError,
self.cmd.take_action, parsed_args)
exceptions.CommandError, self.cmd.take_action, parsed_args
)
def test_multi_ndp_proxies_delete(self):
arglist = []
@ -170,17 +169,16 @@ class TestDeleteNDPProxy(TestNDPProxy):
result = self.cmd.take_action(parsed_args)
self.network.delete_ndp_proxy.assert_has_calls(
[call(self.ndp_proxy), call(self.ndp_proxy)])
[call(self.ndp_proxy), call(self.ndp_proxy)]
)
self.assertIsNone(result)
class TestListNDPProxy(TestNDPProxy):
def setUp(self):
super(TestListNDPProxy, self).setUp()
attrs = {'router_id': self.router.id, 'port_id': self.port.id}
ndp_proxies = (
network_fakes.create_ndp_proxies(attrs, count=3))
ndp_proxies = network_fakes.create_ndp_proxies(attrs, count=3)
self.columns = (
'ID',
'Name',
@ -190,16 +188,17 @@ class TestListNDPProxy(TestNDPProxy):
)
self.data = []
for np in ndp_proxies:
self.data.append((
np.id,
np.name,
np.router_id,
np.ip_address,
np.project_id,
))
self.data.append(
(
np.id,
np.name,
np.router_id,
np.ip_address,
np.project_id,
)
)
self.network.ndp_proxies = mock.Mock(
return_value=ndp_proxies)
self.network.ndp_proxies = mock.Mock(return_value=ndp_proxies)
# Get the command object to test
self.cmd = ndp_proxy.ListNDPProxy(self.app, self.namespace)
@ -220,73 +219,73 @@ class TestListNDPProxy(TestNDPProxy):
def test_ndp_proxy_list_router(self):
arglist = [
'--router', 'fake-router-name',
'--router',
'fake-router-name',
]
verifylist = [
('router', 'fake-router-name')
]
verifylist = [('router', 'fake-router-name')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.ndp_proxies.assert_called_once_with(**{
'router_id': 'fake-router-id'})
self.network.ndp_proxies.assert_called_once_with(
**{'router_id': 'fake-router-id'}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_ndp_proxy_list_port(self):
arglist = [
'--port', self.port.id,
'--port',
self.port.id,
]
verifylist = [
('port', self.port.id)
]
verifylist = [('port', self.port.id)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.ndp_proxies.assert_called_once_with(**{
'port_id': self.port.id})
self.network.ndp_proxies.assert_called_once_with(
**{'port_id': self.port.id}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_ndp_proxy_list_name(self):
arglist = [
'--name', 'fake-ndp-proxy-name',
'--name',
'fake-ndp-proxy-name',
]
verifylist = [
('name', 'fake-ndp-proxy-name')
]
verifylist = [('name', 'fake-ndp-proxy-name')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.ndp_proxies.assert_called_once_with(**{
'name': 'fake-ndp-proxy-name'})
self.network.ndp_proxies.assert_called_once_with(
**{'name': 'fake-ndp-proxy-name'}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_ndp_proxy_list_ip_address(self):
arglist = [
'--ip-address', '2001::1:2',
'--ip-address',
'2001::1:2',
]
verifylist = [
('ip_address', '2001::1:2')
]
verifylist = [('ip_address', '2001::1:2')]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.ndp_proxies.assert_called_once_with(**{
'ip_address': '2001::1:2'})
self.network.ndp_proxies.assert_called_once_with(
**{'ip_address': '2001::1:2'}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -294,7 +293,8 @@ class TestListNDPProxy(TestNDPProxy):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project',
project.id,
]
verifylist = [
('project', project.id),
@ -303,7 +303,8 @@ class TestListNDPProxy(TestNDPProxy):
columns, data = self.cmd.take_action(parsed_args)
self.network.ndp_proxies.assert_called_once_with(
**{'project_id': project.id})
**{'project_id': project.id}
)
self.assertEqual(self.columns, columns)
self.assertItemsEqual(self.data, list(data))
@ -311,8 +312,10 @@ class TestListNDPProxy(TestNDPProxy):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project-domain', project.domain_id,
'--project',
project.id,
'--project-domain',
project.domain_id,
]
verifylist = [
('project', project.id),
@ -328,15 +331,12 @@ class TestListNDPProxy(TestNDPProxy):
class TestSetNDPProxy(TestNDPProxy):
def setUp(self):
super(TestSetNDPProxy, self).setUp()
attrs = {'router_id': self.router.id, 'port_id': self.port.id}
self.ndp_proxy = (
network_fakes.create_one_ndp_proxy(attrs))
self.ndp_proxy = network_fakes.create_one_ndp_proxy(attrs)
self.network.update_ndp_proxy = mock.Mock(return_value=None)
self.network.find_ndp_proxy = mock.Mock(
return_value=self.ndp_proxy)
self.network.find_ndp_proxy = mock.Mock(return_value=self.ndp_proxy)
# Get the command object to test
self.cmd = ndp_proxy.SetNDPProxy(self.app, self.namespace)
@ -350,16 +350,16 @@ class TestSetNDPProxy(TestNDPProxy):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = (self.cmd.take_action(parsed_args))
result = self.cmd.take_action(parsed_args)
self.network.update_ndp_proxy.assert_called_once_with(
self.ndp_proxy)
self.network.update_ndp_proxy.assert_called_once_with(self.ndp_proxy)
self.assertIsNone(result)
def test_set_name(self):
arglist = [
self.ndp_proxy.id,
'--name', 'fake-name',
'--name',
'fake-name',
]
verifylist = [
('ndp_proxy', self.ndp_proxy.id),
@ -367,16 +367,18 @@ class TestSetNDPProxy(TestNDPProxy):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = (self.cmd.take_action(parsed_args))
result = self.cmd.take_action(parsed_args)
self.network.update_ndp_proxy.assert_called_once_with(
self.ndp_proxy, name='fake-name')
self.ndp_proxy, name='fake-name'
)
self.assertIsNone(result)
def test_set_description(self):
arglist = [
self.ndp_proxy.id,
'--description', 'balala',
'--description',
'balala',
]
verifylist = [
('ndp_proxy', self.ndp_proxy.id),
@ -384,20 +386,19 @@ class TestSetNDPProxy(TestNDPProxy):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = (self.cmd.take_action(parsed_args))
result = self.cmd.take_action(parsed_args)
self.network.update_ndp_proxy.assert_called_once_with(
self.ndp_proxy, description='balala')
self.ndp_proxy, description='balala'
)
self.assertIsNone(result)
class TestShowNDPProxy(TestNDPProxy):
def setUp(self):
super(TestShowNDPProxy, self).setUp()
attrs = {'router_id': self.router.id, 'port_id': self.port.id}
self.ndp_proxy = (
network_fakes.create_one_ndp_proxy(attrs))
self.ndp_proxy = network_fakes.create_one_ndp_proxy(attrs)
self.columns = (
'created_at',
@ -409,7 +410,8 @@ class TestShowNDPProxy(TestNDPProxy):
'project_id',
'revision_number',
'router_id',
'updated_at')
'updated_at',
)
self.data = (
self.ndp_proxy.created_at,
@ -421,7 +423,7 @@ class TestShowNDPProxy(TestNDPProxy):
self.ndp_proxy.project_id,
self.ndp_proxy.revision_number,
self.ndp_proxy.router_id,
self.ndp_proxy.updated_at
self.ndp_proxy.updated_at,
)
self.network.get_ndp_proxy = mock.Mock(return_value=self.ndp_proxy)
self.network.find_ndp_proxy = mock.Mock(return_value=self.ndp_proxy)
@ -434,8 +436,13 @@ class TestShowNDPProxy(TestNDPProxy):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_default_options(self):
arglist = [
@ -446,9 +453,10 @@ class TestShowNDPProxy(TestNDPProxy):
]
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.network.find_ndp_proxy.assert_called_once_with(
self.ndp_proxy.id, ignore_missing=False)
self.ndp_proxy.id, ignore_missing=False
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)

View File

@ -29,7 +29,6 @@ from openstackclient.tests.unit import utils as tests_utils
# Tests for Neutron network
#
class TestNetwork(network_fakes.TestNetworkV2):
def setUp(self):
super(TestNetwork, self).setUp()
@ -42,7 +41,6 @@ class TestNetwork(network_fakes.TestNetworkV2):
class TestCreateNetworkIdentityV3(TestNetwork):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
# The new network created.
@ -52,8 +50,9 @@ class TestCreateNetworkIdentityV3(TestNetwork):
'availability_zone_hints': ["nova"],
}
)
qos_policy = (network_fakes.FakeNetworkQosPolicy.
create_one_qos_policy(attrs={'id': _network.qos_policy_id}))
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy(
attrs={'id': _network.qos_policy_id}
)
columns = (
'admin_state_up',
@ -132,8 +131,13 @@ class TestCreateNetworkIdentityV3(TestNetwork):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
@ -150,10 +154,12 @@ class TestCreateNetworkIdentityV3(TestNetwork):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_network.assert_called_once_with(**{
'admin_state_up': True,
'name': self._network.name,
})
self.network.create_network.assert_called_once_with(
**{
'admin_state_up': True,
'name': self._network.name,
}
)
self.assertFalse(self.network.set_tags.called)
self.assertEqual(set(self.columns), set(columns))
self.assertCountEqual(self.data, data)
@ -162,19 +168,30 @@ class TestCreateNetworkIdentityV3(TestNetwork):
arglist = [
"--disable",
"--share",
"--description", self._network.description,
"--mtu", str(self._network.mtu),
"--project", self.project.name,
"--project-domain", self.domain.name,
"--availability-zone-hint", "nova",
"--external", "--default",
"--provider-network-type", "vlan",
"--provider-physical-network", "physnet1",
"--provider-segment", "400",
"--qos-policy", self.qos_policy.id,
"--description",
self._network.description,
"--mtu",
str(self._network.mtu),
"--project",
self.project.name,
"--project-domain",
self.domain.name,
"--availability-zone-hint",
"nova",
"--external",
"--default",
"--provider-network-type",
"vlan",
"--provider-physical-network",
"physnet1",
"--provider-segment",
"400",
"--qos-policy",
self.qos_policy.id,
"--transparent-vlan",
"--enable-port-security",
"--dns-domain", "example.org.",
"--dns-domain",
"example.org.",
self._network.name,
]
verifylist = [
@ -198,26 +215,28 @@ class TestCreateNetworkIdentityV3(TestNetwork):
]
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.network.create_network.assert_called_once_with(**{
'admin_state_up': False,
'availability_zone_hints': ["nova"],
'name': self._network.name,
'shared': True,
'description': self._network.description,
'mtu': str(self._network.mtu),
'project_id': self.project.id,
'is_default': True,
'router:external': True,
'provider:network_type': 'vlan',
'provider:physical_network': 'physnet1',
'provider:segmentation_id': '400',
'qos_policy_id': self.qos_policy.id,
'vlan_transparent': True,
'port_security_enabled': True,
'dns_domain': 'example.org.',
})
self.network.create_network.assert_called_once_with(
**{
'admin_state_up': False,
'availability_zone_hints': ["nova"],
'name': self._network.name,
'shared': True,
'description': self._network.description,
'mtu': str(self._network.mtu),
'project_id': self.project.id,
'is_default': True,
'router:external': True,
'provider:network_type': 'vlan',
'provider:physical_network': 'physnet1',
'provider:segmentation_id': '400',
'qos_policy_id': self.qos_policy.id,
'vlan_transparent': True,
'port_security_enabled': True,
'dns_domain': 'example.org.',
}
)
self.assertEqual(set(self.columns), set(columns))
self.assertCountEqual(self.data, data)
@ -239,12 +258,14 @@ class TestCreateNetworkIdentityV3(TestNetwork):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_network.assert_called_once_with(**{
'admin_state_up': True,
'name': self._network.name,
'shared': False,
'port_security_enabled': False,
})
self.network.create_network.assert_called_once_with(
**{
'admin_state_up': True,
'name': self._network.name,
'shared': False,
'port_security_enabled': False,
}
)
self.assertEqual(set(self.columns), set(columns))
self.assertCountEqual(self.data, data)
@ -267,14 +288,15 @@ class TestCreateNetworkIdentityV3(TestNetwork):
verifylist.append(('no_tag', True))
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.network.create_network.assert_called_once_with(
name=self._network.name, admin_state_up=True)
name=self._network.name, admin_state_up=True
)
if add_tags:
self.network.set_tags.assert_called_once_with(
self._network,
tests_utils.CompareBySet(['red', 'blue']))
self._network, tests_utils.CompareBySet(['red', 'blue'])
)
else:
self.assertFalse(self.network.set_tags.called)
self.assertEqual(set(self.columns), set(columns))
@ -288,7 +310,6 @@ class TestCreateNetworkIdentityV3(TestNetwork):
class TestCreateNetworkIdentityV2(TestNetwork):
project = identity_fakes_v2.FakeProject.create_one_project()
# The new network created.
_network = network_fakes.create_one_network(
@ -379,7 +400,8 @@ class TestCreateNetworkIdentityV2(TestNetwork):
def test_create_with_project_identityv2(self):
arglist = [
"--project", self.project.name,
"--project",
self.project.name,
self._network.name,
]
verifylist = [
@ -393,19 +415,23 @@ class TestCreateNetworkIdentityV2(TestNetwork):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_network.assert_called_once_with(**{
'admin_state_up': True,
'name': self._network.name,
'project_id': self.project.id,
})
self.network.create_network.assert_called_once_with(
**{
'admin_state_up': True,
'name': self._network.name,
'project_id': self.project.id,
}
)
self.assertFalse(self.network.set_tags.called)
self.assertEqual(set(self.columns), set(columns))
self.assertCountEqual(self.data, data)
def test_create_with_domain_identityv2(self):
arglist = [
"--project", self.project.name,
"--project-domain", "domain-name",
"--project",
self.project.name,
"--project-domain",
"domain-name",
self._network.name,
]
verifylist = [
@ -427,7 +453,6 @@ class TestCreateNetworkIdentityV2(TestNetwork):
class TestDeleteNetwork(TestNetwork):
def setUp(self):
super(TestDeleteNetwork, self).setUp()
@ -437,7 +462,8 @@ class TestDeleteNetwork(TestNetwork):
self.network.delete_network = mock.Mock(return_value=None)
self.network.find_network = network_fakes.get_networks(
networks=self._networks)
networks=self._networks
)
# Get the command object to test
self.cmd = network.DeleteNetwork(self.app, self.namespace)
@ -499,8 +525,9 @@ class TestDeleteNetwork(TestNetwork):
]
self.network.delete_network = mock.Mock(side_effect=ret_delete)
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
parsed_args)
self.assertRaises(
exceptions.CommandError, self.cmd.take_action, parsed_args
)
# The second call of find_network() should fail. So delete_network()
# was only called twice.
@ -512,7 +539,6 @@ class TestDeleteNetwork(TestNetwork):
class TestListNetwork(TestNetwork):
# The networks going to be listed up.
_network = network_fakes.create_networks(count=3)
@ -537,27 +563,31 @@ class TestListNetwork(TestNetwork):
data = []
for net in _network:
data.append((
net.id,
net.name,
format_columns.ListColumn(net.subnet_ids),
))
data.append(
(
net.id,
net.name,
format_columns.ListColumn(net.subnet_ids),
)
)
data_long = []
for net in _network:
data_long.append((
net.id,
net.name,
net.status,
net.project_id,
network.AdminStateColumn(net.is_admin_state_up),
net.is_shared,
format_columns.ListColumn(net.subnet_ids),
net.provider_network_type,
network.RouterExternalColumn(net.is_router_external),
format_columns.ListColumn(net.availability_zones),
format_columns.ListColumn(net.tags),
))
data_long.append(
(
net.id,
net.name,
net.status,
net.project_id,
network.AdminStateColumn(net.is_admin_state_up),
net.is_shared,
format_columns.ListColumn(net.subnet_ids),
net.provider_network_type,
network.RouterExternalColumn(net.is_router_external),
format_columns.ListColumn(net.availability_zones),
format_columns.ListColumn(net.tags),
)
)
def setUp(self):
super(TestListNetwork, self).setUp()
@ -567,12 +597,12 @@ class TestListNetwork(TestNetwork):
self.network.networks = mock.Mock(return_value=self._network)
self._agent = \
network_fakes.create_one_network_agent()
self._agent = network_fakes.create_one_network_agent()
self.network.get_agent = mock.Mock(return_value=self._agent)
self.network.dhcp_agent_hosting_networks = mock.Mock(
return_value=self._network)
return_value=self._network
)
# TestListTagMixin
self._tag_list_resource_mock = self.network.networks
@ -654,7 +684,8 @@ class TestListNetwork(TestNetwork):
def test_list_name(self):
test_name = "fakename"
arglist = [
'--name', test_name,
'--name',
test_name,
]
verifylist = [
('external', False),
@ -664,9 +695,7 @@ class TestListNetwork(TestNetwork):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.networks.assert_called_once_with(
**{'name': test_name}
)
self.network.networks.assert_called_once_with(**{'name': test_name})
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -692,11 +721,7 @@ class TestListNetwork(TestNetwork):
arglist = [
'--disable',
]
verifylist = [
('long', False),
('external', False),
('disable', True)
]
verifylist = [('long', False), ('external', False), ('disable', True)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
@ -710,7 +735,8 @@ class TestListNetwork(TestNetwork):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project',
project.id,
]
verifylist = [
('project', project.id),
@ -729,8 +755,10 @@ class TestListNetwork(TestNetwork):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project-domain', project.domain_id,
'--project',
project.id,
'--project-domain',
project.domain_id,
]
verifylist = [
('project', project.id),
@ -782,7 +810,8 @@ class TestListNetwork(TestNetwork):
choices = ['ACTIVE', 'BUILD', 'DOWN', 'ERROR']
test_status = random.choice(choices)
arglist = [
'--status', test_status,
'--status',
test_status,
]
verifylist = [
('long', False),
@ -800,7 +829,8 @@ class TestListNetwork(TestNetwork):
def test_network_list_provider_network_type(self):
network_type = self._network[0].provider_network_type
arglist = [
'--provider-network-type', network_type,
'--provider-network-type',
network_type,
]
verifylist = [
('provider_network_type', network_type),
@ -809,8 +839,10 @@ class TestListNetwork(TestNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.networks.assert_called_once_with(
**{'provider:network_type': network_type,
'provider_network_type': network_type}
**{
'provider:network_type': network_type,
'provider_network_type': network_type,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -818,7 +850,8 @@ class TestListNetwork(TestNetwork):
def test_network_list_provider_physical_network(self):
physical_network = self._network[0].provider_physical_network
arglist = [
'--provider-physical-network', physical_network,
'--provider-physical-network',
physical_network,
]
verifylist = [
('physical_network', physical_network),
@ -827,8 +860,10 @@ class TestListNetwork(TestNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.networks.assert_called_once_with(
**{'provider:physical_network': physical_network,
'provider_physical_network': physical_network}
**{
'provider:physical_network': physical_network,
'provider_physical_network': physical_network,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -836,7 +871,8 @@ class TestListNetwork(TestNetwork):
def test_network_list_provider_segment(self):
segmentation_id = self._network[0].provider_segmentation_id
arglist = [
'--provider-segment', segmentation_id,
'--provider-segment',
segmentation_id,
]
verifylist = [
('segmentation_id', segmentation_id),
@ -845,16 +881,16 @@ class TestListNetwork(TestNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.networks.assert_called_once_with(
**{'provider:segmentation_id': segmentation_id,
'provider_segmentation_id': segmentation_id}
**{
'provider:segmentation_id': segmentation_id,
'provider_segmentation_id': segmentation_id,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_network_list_dhcp_agent(self):
arglist = [
'--agent', self._agent.id
]
arglist = ['--agent', self._agent.id]
verifylist = [
('agent_id', self._agent.id),
]
@ -864,17 +900,22 @@ class TestListNetwork(TestNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.dhcp_agent_hosting_networks.assert_called_once_with(
self._agent)
self._agent
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(list(data), list(self.data))
def test_list_with_tag_options(self):
arglist = [
'--tags', 'red,blue',
'--any-tags', 'red,green',
'--not-tags', 'orange,yellow',
'--not-any-tags', 'black,white',
'--tags',
'red,blue',
'--any-tags',
'red,green',
'--not-tags',
'orange,yellow',
'--not-any-tags',
'black,white',
]
verifylist = [
('tags', ['red', 'blue']),
@ -886,22 +927,23 @@ class TestListNetwork(TestNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.networks.assert_called_once_with(
**{'tags': 'red,blue',
'any_tags': 'red,green',
'not_tags': 'orange,yellow',
'not_any_tags': 'black,white'}
**{
'tags': 'red,blue',
'any_tags': 'red,green',
'not_tags': 'orange,yellow',
'not_any_tags': 'black,white',
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
class TestSetNetwork(TestNetwork):
# The network to set.
_network = network_fakes.create_one_network(
{'tags': ['green', 'red']})
qos_policy = (network_fakes.FakeNetworkQosPolicy.
create_one_qos_policy(attrs={'id': _network.qos_policy_id}))
_network = network_fakes.create_one_network({'tags': ['green', 'red']})
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy(
attrs={'id': _network.qos_policy_id}
)
def setUp(self):
super(TestSetNetwork, self).setUp()
@ -919,17 +961,24 @@ class TestSetNetwork(TestNetwork):
arglist = [
self._network.name,
'--enable',
'--name', 'noob',
'--name',
'noob',
'--share',
'--description', self._network.description,
'--dns-domain', 'example.org.',
'--description',
self._network.description,
'--dns-domain',
'example.org.',
'--external',
'--default',
'--provider-network-type', 'vlan',
'--provider-physical-network', 'physnet1',
'--provider-segment', '400',
'--provider-network-type',
'vlan',
'--provider-physical-network',
'physnet1',
'--provider-segment',
'400',
'--enable-port-security',
'--qos-policy', self.qos_policy.name,
'--qos-policy',
self.qos_policy.name,
]
verifylist = [
('network', self._network.name),
@ -965,7 +1014,8 @@ class TestSetNetwork(TestNetwork):
'dns_domain': 'example.org.',
}
self.network.update_network.assert_called_once_with(
self._network, **attrs)
self._network, **attrs
)
self.assertIsNone(result)
def test_set_that(self):
@ -997,12 +1047,17 @@ class TestSetNetwork(TestNetwork):
'qos_policy_id': None,
}
self.network.update_network.assert_called_once_with(
self._network, **attrs)
self._network, **attrs
)
self.assertIsNone(result)
def test_set_nothing(self):
arglist = [self._network.name, ]
verifylist = [('network', self._network.name), ]
arglist = [
self._network.name,
]
verifylist = [
('network', self._network.name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
@ -1021,16 +1076,15 @@ class TestSetNetwork(TestNetwork):
verifylist = [('no_tag', True)]
expected_args = []
arglist.append(self._network.name)
verifylist.append(
('network', self._network.name))
verifylist.append(('network', self._network.name))
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.assertFalse(self.network.update_network.called)
self.network.set_tags.assert_called_once_with(
self._network,
tests_utils.CompareBySet(expected_args))
self._network, tests_utils.CompareBySet(expected_args)
)
self.assertIsNone(result)
def test_set_with_tags(self):
@ -1041,7 +1095,6 @@ class TestSetNetwork(TestNetwork):
class TestShowNetwork(TestNetwork):
# The network to show.
_network = network_fakes.create_one_network()
columns = (
@ -1116,8 +1169,13 @@ class TestShowNetwork(TestNetwork):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -1131,19 +1189,19 @@ class TestShowNetwork(TestNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_network.assert_called_once_with(
self._network.name, ignore_missing=False)
self._network.name, ignore_missing=False
)
self.assertEqual(set(self.columns), set(columns))
self.assertCountEqual(self.data, data)
class TestUnsetNetwork(TestNetwork):
# The network to set.
_network = network_fakes.create_one_network(
{'tags': ['green', 'red']})
qos_policy = (network_fakes.FakeNetworkQosPolicy.
create_one_qos_policy(attrs={'id': _network.qos_policy_id}))
_network = network_fakes.create_one_network({'tags': ['green', 'red']})
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy(
attrs={'id': _network.qos_policy_id}
)
def setUp(self):
super(TestUnsetNetwork, self).setUp()
@ -1158,8 +1216,12 @@ class TestUnsetNetwork(TestNetwork):
self.cmd = network.UnsetNetwork(self.app, self.namespace)
def test_unset_nothing(self):
arglist = [self._network.name, ]
verifylist = [('network', self._network.name), ]
arglist = [
self._network.name,
]
verifylist = [
('network', self._network.name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
@ -1178,16 +1240,15 @@ class TestUnsetNetwork(TestNetwork):
verifylist = [('all_tag', True)]
expected_args = []
arglist.append(self._network.name)
verifylist.append(
('network', self._network.name))
verifylist.append(('network', self._network.name))
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.assertFalse(self.network.update_network.called)
self.network.set_tags.assert_called_once_with(
self._network,
tests_utils.CompareBySet(expected_args))
self._network, tests_utils.CompareBySet(expected_args)
)
self.assertIsNone(result)
def test_unset_with_tags(self):

View File

@ -23,7 +23,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestNetworkAgent(network_fakes.TestNetworkV2):
def setUp(self):
super(TestNetworkAgent, self).setUp()
@ -32,7 +31,6 @@ class TestNetworkAgent(network_fakes.TestNetworkV2):
class TestAddNetworkToAgent(TestNetworkAgent):
net = network_fakes.create_one_network()
agent = network_fakes.create_one_network_agent()
@ -43,23 +41,23 @@ class TestAddNetworkToAgent(TestNetworkAgent):
self.network.find_network = mock.Mock(return_value=self.net)
self.network.name = self.network.find_network.name
self.network.add_dhcp_agent_to_network = mock.Mock()
self.cmd = network_agent.AddNetworkToAgent(
self.app, self.namespace)
self.cmd = network_agent.AddNetworkToAgent(self.app, self.namespace)
def test_show_no_options(self):
arglist = []
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_add_network_to_dhcp_agent(self):
arglist = [
'--dhcp',
self.agent.id,
self.net.id
]
arglist = ['--dhcp', self.agent.id, self.net.id]
verifylist = [
('dhcp', True),
('agent_id', self.agent.id),
@ -70,11 +68,11 @@ class TestAddNetworkToAgent(TestNetworkAgent):
self.cmd.take_action(parsed_args)
self.network.add_dhcp_agent_to_network.assert_called_once_with(
self.agent, self.net)
self.agent, self.net
)
class TestAddRouterAgent(TestNetworkAgent):
_router = network_fakes.FakeRouter.create_one_router()
_agent = network_fakes.create_one_network_agent()
@ -90,8 +88,13 @@ class TestAddRouterAgent(TestNetworkAgent):
verifylist = []
# Missing agent ID will cause command to bail
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_add_router_required_options(self):
arglist = [
@ -109,12 +112,12 @@ class TestAddRouterAgent(TestNetworkAgent):
result = self.cmd.take_action(parsed_args)
self.network.add_router_to_agent.assert_called_with(
self._agent, self._router)
self._agent, self._router
)
self.assertIsNone(result)
class TestDeleteNetworkAgent(TestNetworkAgent):
network_agents = network_fakes.create_network_agents(count=2)
def setUp(self):
@ -136,7 +139,8 @@ class TestDeleteNetworkAgent(TestNetworkAgent):
result = self.cmd.take_action(parsed_args)
self.network.delete_agent.assert_called_once_with(
self.network_agents[0].id, ignore_missing=False)
self.network_agents[0].id, ignore_missing=False
)
self.assertIsNone(result)
def test_multi_network_agents_delete(self):
@ -163,15 +167,15 @@ class TestDeleteNetworkAgent(TestNetworkAgent):
'unexist_network_agent',
]
verifylist = [
('network_agent',
[self.network_agents[0].id, 'unexist_network_agent']),
(
'network_agent',
[self.network_agents[0].id, 'unexist_network_agent'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
delete_mock_result = [True, exceptions.CommandError]
self.network.delete_agent = (
mock.Mock(side_effect=delete_mock_result)
)
self.network.delete_agent = mock.Mock(side_effect=delete_mock_result)
try:
self.cmd.take_action(parsed_args)
@ -180,13 +184,14 @@ class TestDeleteNetworkAgent(TestNetworkAgent):
self.assertEqual('1 of 2 network agents failed to delete.', str(e))
self.network.delete_agent.assert_any_call(
self.network_agents[0].id, ignore_missing=False)
self.network_agents[0].id, ignore_missing=False
)
self.network.delete_agent.assert_any_call(
'unexist_network_agent', ignore_missing=False)
'unexist_network_agent', ignore_missing=False
)
class TestListNetworkAgent(TestNetworkAgent):
network_agents = network_fakes.create_network_agents(count=3)
columns = (
@ -196,24 +201,25 @@ class TestListNetworkAgent(TestNetworkAgent):
'Availability Zone',
'Alive',
'State',
'Binary'
'Binary',
)
data = []
for agent in network_agents:
data.append((
agent.id,
agent.agent_type,
agent.host,
agent.availability_zone,
network_agent.AliveColumn(agent.is_alive),
network_agent.AdminStateColumn(agent.is_admin_state_up),
agent.binary,
))
data.append(
(
agent.id,
agent.agent_type,
agent.host,
agent.availability_zone,
network_agent.AliveColumn(agent.is_alive),
network_agent.AdminStateColumn(agent.is_admin_state_up),
agent.binary,
)
)
def setUp(self):
super(TestListNetworkAgent, self).setUp()
self.network.agents = mock.Mock(
return_value=self.network_agents)
self.network.agents = mock.Mock(return_value=self.network_agents)
_testagent = network_fakes.create_one_network_agent()
self.network.get_agent = mock.Mock(return_value=_testagent)
@ -221,15 +227,16 @@ class TestListNetworkAgent(TestNetworkAgent):
self._testnetwork = network_fakes.create_one_network()
self.network.find_network = mock.Mock(return_value=self._testnetwork)
self.network.network_hosting_dhcp_agents = mock.Mock(
return_value=self.network_agents)
return_value=self.network_agents
)
self.network.get_agent = mock.Mock(return_value=_testagent)
self._testrouter = \
network_fakes.FakeRouter.create_one_router()
self._testrouter = network_fakes.FakeRouter.create_one_router()
self.network.find_router = mock.Mock(return_value=self._testrouter)
self.network.routers_hosting_l3_agents = mock.Mock(
return_value=self.network_agents)
return_value=self.network_agents
)
# Get the command object to test
self.cmd = network_agent.ListNetworkAgent(self.app, self.namespace)
@ -247,7 +254,8 @@ class TestListNetworkAgent(TestNetworkAgent):
def test_network_agents_list_agent_type(self):
arglist = [
'--agent-type', 'dhcp',
'--agent-type',
'dhcp',
]
verifylist = [
('agent_type', 'dhcp'),
@ -256,15 +264,18 @@ class TestListNetworkAgent(TestNetworkAgent):
columns, data = self.cmd.take_action(parsed_args)
self.network.agents.assert_called_once_with(**{
'agent_type': 'DHCP agent',
})
self.network.agents.assert_called_once_with(
**{
'agent_type': 'DHCP agent',
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_network_agents_list_host(self):
arglist = [
'--host', self.network_agents[0].host,
'--host',
self.network_agents[0].host,
]
verifylist = [
('host', self.network_agents[0].host),
@ -273,15 +284,18 @@ class TestListNetworkAgent(TestNetworkAgent):
columns, data = self.cmd.take_action(parsed_args)
self.network.agents.assert_called_once_with(**{
'host': self.network_agents[0].host,
})
self.network.agents.assert_called_once_with(
**{
'host': self.network_agents[0].host,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_network_agents_list_networks(self):
arglist = [
'--network', self._testnetwork.id,
'--network',
self._testnetwork.id,
]
verifylist = [
('network', self._testnetwork.id),
@ -291,47 +305,46 @@ class TestListNetworkAgent(TestNetworkAgent):
columns, data = self.cmd.take_action(parsed_args)
self.network.network_hosting_dhcp_agents.assert_called_once_with(
self._testnetwork)
self._testnetwork
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_network_agents_list_routers(self):
arglist = [
'--router', self._testrouter.id,
]
verifylist = [
('router', self._testrouter.id),
('long', False)
'--router',
self._testrouter.id,
]
verifylist = [('router', self._testrouter.id), ('long', False)]
attrs = {self._testrouter, }
attrs = {
self._testrouter,
}
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.routers_hosting_l3_agents.assert_called_once_with(
*attrs)
self.network.routers_hosting_l3_agents.assert_called_once_with(*attrs)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
def test_network_agents_list_routers_with_long_option(self):
arglist = [
'--router', self._testrouter.id,
'--router',
self._testrouter.id,
'--long',
]
verifylist = [
('router', self._testrouter.id),
('long', True)
]
verifylist = [('router', self._testrouter.id), ('long', True)]
attrs = {self._testrouter, }
attrs = {
self._testrouter,
}
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.routers_hosting_l3_agents.assert_called_once_with(
*attrs)
self.network.routers_hosting_l3_agents.assert_called_once_with(*attrs)
# Add a column 'HA State' and corresponding data.
router_agent_columns = self.columns + ('HA State',)
@ -342,7 +355,6 @@ class TestListNetworkAgent(TestNetworkAgent):
class TestRemoveNetworkFromAgent(TestNetworkAgent):
net = network_fakes.create_one_network()
agent = network_fakes.create_one_network_agent()
@ -354,15 +366,21 @@ class TestRemoveNetworkFromAgent(TestNetworkAgent):
self.network.name = self.network.find_network.name
self.network.remove_dhcp_agent_from_network = mock.Mock()
self.cmd = network_agent.RemoveNetworkFromAgent(
self.app, self.namespace)
self.app, self.namespace
)
def test_show_no_options(self):
arglist = []
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_network_agents_list_routers_no_arg(self):
arglist = [
@ -371,15 +389,16 @@ class TestRemoveNetworkFromAgent(TestNetworkAgent):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_network_from_dhcp_agent(self):
arglist = [
'--dhcp',
self.agent.id,
self.net.id
]
arglist = ['--dhcp', self.agent.id, self.net.id]
verifylist = [
('dhcp', True),
('agent_id', self.agent.id),
@ -390,7 +409,8 @@ class TestRemoveNetworkFromAgent(TestNetworkAgent):
self.cmd.take_action(parsed_args)
self.network.remove_dhcp_agent_from_network.assert_called_once_with(
self.agent, self.net)
self.agent, self.net
)
class TestRemoveRouterAgent(TestNetworkAgent):
@ -400,8 +420,9 @@ class TestRemoveRouterAgent(TestNetworkAgent):
def setUp(self):
super(TestRemoveRouterAgent, self).setUp()
self.network.remove_router_from_agent = mock.Mock()
self.cmd = network_agent.RemoveRouterFromAgent(self.app,
self.namespace)
self.cmd = network_agent.RemoveRouterFromAgent(
self.app, self.namespace
)
self.network.get_agent = mock.Mock(return_value=self._agent)
self.network.find_router = mock.Mock(return_value=self._router)
@ -410,8 +431,13 @@ class TestRemoveRouterAgent(TestNetworkAgent):
verifylist = []
# Missing agent ID will cause command to bail
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_remove_router_required_options(self):
arglist = [
@ -429,12 +455,12 @@ class TestRemoveRouterAgent(TestNetworkAgent):
result = self.cmd.take_action(parsed_args)
self.network.remove_router_from_agent.assert_called_with(
self._agent, self._router)
self._agent, self._router
)
self.assertIsNone(result)
class TestSetNetworkAgent(TestNetworkAgent):
_network_agent = network_fakes.create_one_network_agent()
def setUp(self):
@ -458,12 +484,14 @@ class TestSetNetworkAgent(TestNetworkAgent):
attrs = {}
self.network.update_agent.assert_called_once_with(
self._network_agent, **attrs)
self._network_agent, **attrs
)
self.assertIsNone(result)
def test_set_all(self):
arglist = [
'--description', 'new_description',
'--description',
'new_description',
'--enable',
self._network_agent.id,
]
@ -483,7 +511,8 @@ class TestSetNetworkAgent(TestNetworkAgent):
'is_admin_state_up': True,
}
self.network.update_agent.assert_called_once_with(
self._network_agent, **attrs)
self._network_agent, **attrs
)
self.assertIsNone(result)
def test_set_with_disable(self):
@ -505,12 +534,12 @@ class TestSetNetworkAgent(TestNetworkAgent):
'is_admin_state_up': False,
}
self.network.update_agent.assert_called_once_with(
self._network_agent, **attrs)
self._network_agent, **attrs
)
self.assertIsNone(result)
class TestShowNetworkAgent(TestNetworkAgent):
_network_agent = network_fakes.create_one_network_agent()
columns = (
@ -550,8 +579,7 @@ class TestShowNetworkAgent(TestNetworkAgent):
def setUp(self):
super(TestShowNetworkAgent, self).setUp()
self.network.get_agent = mock.Mock(
return_value=self._network_agent)
self.network.get_agent = mock.Mock(return_value=self._network_agent)
# Get the command object to test
self.cmd = network_agent.ShowNetworkAgent(self.app, self.namespace)
@ -561,8 +589,13 @@ class TestShowNetworkAgent(TestNetworkAgent):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -575,7 +608,6 @@ class TestShowNetworkAgent(TestNetworkAgent):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.get_agent.assert_called_once_with(
self._network_agent.id)
self.network.get_agent.assert_called_once_with(self._network_agent.id)
self.assertEqual(set(self.columns), set(columns))
self.assertEqual(len(list(self.data)), len(list(data)))

View File

@ -32,8 +32,7 @@ class TestCreateAutoAllocatedTopology(TestAutoAllocatedTopology):
network_object = network_fakes.create_one_network()
topology = network_fakes.create_one_topology(
attrs={'id': network_object.id,
'project_id': project.id}
attrs={'id': network_object.id, 'project_id': project.id}
)
columns = (
@ -50,10 +49,11 @@ class TestCreateAutoAllocatedTopology(TestAutoAllocatedTopology):
super(TestCreateAutoAllocatedTopology, self).setUp()
self.cmd = network_auto_allocated_topology.CreateAutoAllocatedTopology(
self.app,
self.namespace)
self.app, self.namespace
)
self.network.get_auto_allocated_topology = mock.Mock(
return_value=self.topology)
return_value=self.topology
)
def test_create_no_options(self):
arglist = []
@ -69,7 +69,8 @@ class TestCreateAutoAllocatedTopology(TestAutoAllocatedTopology):
def test_create_project_option(self):
arglist = [
'--project', self.project.id,
'--project',
self.project.id,
]
verifylist = [
@ -88,8 +89,10 @@ class TestCreateAutoAllocatedTopology(TestAutoAllocatedTopology):
def test_create_project_domain_option(self):
arglist = [
'--project', self.project.id,
'--project-domain', self.project.domain_id,
'--project',
self.project.id,
'--project-domain',
self.project.domain_id,
]
verifylist = [
@ -130,8 +133,7 @@ class TestValidateAutoAllocatedTopology(TestAutoAllocatedTopology):
network_object = network_fakes.create_one_network()
topology = network_fakes.create_one_topology(
attrs={'id': network_object.id,
'project_id': project.id}
attrs={'id': network_object.id, 'project_id': project.id}
)
columns = (
@ -148,10 +150,11 @@ class TestValidateAutoAllocatedTopology(TestAutoAllocatedTopology):
super(TestValidateAutoAllocatedTopology, self).setUp()
self.cmd = network_auto_allocated_topology.CreateAutoAllocatedTopology(
self.app,
self.namespace)
self.app, self.namespace
)
self.network.validate_auto_allocated_topology = mock.Mock(
return_value=self.topology)
return_value=self.topology
)
def test_show_dry_run_no_project(self):
arglist = [
@ -164,13 +167,13 @@ class TestValidateAutoAllocatedTopology(TestAutoAllocatedTopology):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.validate_auto_allocated_topology.assert_called_with(
None)
self.network.validate_auto_allocated_topology.assert_called_with(None)
def test_show_dry_run_project_option(self):
arglist = [
'--check-resources',
'--project', self.project.id,
'--project',
self.project.id,
]
verifylist = [
('check_resources', True),
@ -181,13 +184,16 @@ class TestValidateAutoAllocatedTopology(TestAutoAllocatedTopology):
columns, data = self.cmd.take_action(parsed_args)
self.network.validate_auto_allocated_topology.assert_called_with(
self.project.id)
self.project.id
)
def test_show_dry_run_project_domain_option(self):
arglist = [
'--check-resources',
'--project', self.project.id,
'--project-domain', self.project.domain_id,
'--project',
self.project.id,
'--project-domain',
self.project.domain_id,
]
verifylist = [
('check_resources', True),
@ -199,7 +205,8 @@ class TestValidateAutoAllocatedTopology(TestAutoAllocatedTopology):
columns, data = self.cmd.take_action(parsed_args)
self.network.validate_auto_allocated_topology.assert_called_with(
self.project.id)
self.project.id
)
class TestDeleteAutoAllocatedTopology(TestAutoAllocatedTopology):
@ -207,18 +214,18 @@ class TestDeleteAutoAllocatedTopology(TestAutoAllocatedTopology):
network_object = network_fakes.create_one_network()
topology = network_fakes.create_one_topology(
attrs={'id': network_object.id,
'project_id': project.id}
attrs={'id': network_object.id, 'project_id': project.id}
)
def setUp(self):
super(TestDeleteAutoAllocatedTopology, self).setUp()
self.cmd = network_auto_allocated_topology.DeleteAutoAllocatedTopology(
self.app,
self.namespace)
self.app, self.namespace
)
self.network.delete_auto_allocated_topology = mock.Mock(
return_value=None)
return_value=None
)
def test_delete_no_project(self):
arglist = []
@ -228,13 +235,15 @@ class TestDeleteAutoAllocatedTopology(TestAutoAllocatedTopology):
result = self.cmd.take_action(parsed_args)
self.network.delete_auto_allocated_topology.assert_called_once_with(
None)
None
)
self.assertIsNone(result)
def test_delete_project_arg(self):
arglist = [
'--project', self.project.id,
'--project',
self.project.id,
]
verifylist = [
('project', self.project.id),
@ -244,14 +253,17 @@ class TestDeleteAutoAllocatedTopology(TestAutoAllocatedTopology):
result = self.cmd.take_action(parsed_args)
self.network.delete_auto_allocated_topology.assert_called_once_with(
self.project.id)
self.project.id
)
self.assertIsNone(result)
def test_delete_project_domain_arg(self):
arglist = [
'--project', self.project.id,
'--project-domain', self.project.domain_id,
'--project',
self.project.id,
'--project-domain',
self.project.domain_id,
]
verifylist = [
('project', self.project.id),
@ -262,6 +274,7 @@ class TestDeleteAutoAllocatedTopology(TestAutoAllocatedTopology):
result = self.cmd.take_action(parsed_args)
self.network.delete_auto_allocated_topology.assert_called_once_with(
self.project.id)
self.project.id
)
self.assertIsNone(result)

View File

@ -24,7 +24,6 @@ from openstackclient.tests.unit import utils as tests_utils
# Tests for Nova network
#
class TestNetworkCompute(compute_fakes.TestComputev2):
def setUp(self):
super(TestNetworkCompute, self).setUp()
@ -32,11 +31,8 @@ class TestNetworkCompute(compute_fakes.TestComputev2):
self.compute = self.app.client_manager.compute
@mock.patch(
'openstackclient.api.compute_v2.APIv2.network_create'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.network_create')
class TestCreateNetworkCompute(TestNetworkCompute):
# The network to create.
_network = compute_fakes.FakeNetwork.create_one_network()
@ -153,7 +149,8 @@ class TestCreateNetworkCompute(TestNetworkCompute):
def test_network_create_default_options(self, net_mock):
net_mock.return_value = self._network
arglist = [
"--subnet", self._network['cidr'],
"--subnet",
self._network['cidr'],
self._network['label'],
]
verifylist = [
@ -164,19 +161,18 @@ class TestCreateNetworkCompute(TestNetworkCompute):
columns, data = self.cmd.take_action(parsed_args)
net_mock.assert_called_once_with(**{
'subnet': self._network['cidr'],
'name': self._network['label'],
})
net_mock.assert_called_once_with(
**{
'subnet': self._network['cidr'],
'name': self._network['label'],
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@mock.patch(
'openstackclient.api.compute_v2.APIv2.network_delete'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.network_delete')
class TestDeleteNetworkCompute(TestNetworkCompute):
def setUp(self):
super(TestDeleteNetworkCompute, self).setUp()
@ -186,8 +182,9 @@ class TestDeleteNetworkCompute(TestNetworkCompute):
self._networks = compute_fakes.FakeNetwork.create_networks(count=3)
# Return value of utils.find_resource()
self.compute.api.network_find = \
compute_fakes.FakeNetwork.get_networks(networks=self._networks)
self.compute.api.network_find = compute_fakes.FakeNetwork.get_networks(
networks=self._networks
)
# Get the command object to test
self.cmd = network.DeleteNetwork(self.app, None)
@ -229,10 +226,10 @@ class TestDeleteNetworkCompute(TestNetworkCompute):
def test_network_delete_multi_with_exception(self, net_mock):
net_mock.return_value = mock.Mock(return_value=None)
net_mock.side_effect = ([
net_mock.side_effect = [
mock.Mock(return_value=None),
exceptions.CommandError,
])
]
arglist = [
self._networks[0]['id'],
'xxxx-yyyy-zzzz',
@ -254,11 +251,8 @@ class TestDeleteNetworkCompute(TestNetworkCompute):
net_mock.assert_any_call('xxxx-yyyy-zzzz')
@mock.patch(
'openstackclient.api.compute_v2.APIv2.network_list'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.network_list')
class TestListNetworkCompute(TestNetworkCompute):
# The networks going to be listed up.
_networks = compute_fakes.FakeNetwork.create_networks(count=3)
@ -270,11 +264,13 @@ class TestListNetworkCompute(TestNetworkCompute):
data = []
for net in _networks:
data.append((
net['id'],
net['label'],
net['cidr'],
))
data.append(
(
net['id'],
net['label'],
net['cidr'],
)
)
def setUp(self):
super(TestListNetworkCompute, self).setUp()
@ -300,11 +296,8 @@ class TestListNetworkCompute(TestNetworkCompute):
self.assertEqual(self.data, list(data))
@mock.patch(
'openstackclient.api.compute_v2.APIv2.network_find'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.network_find')
class TestShowNetworkCompute(TestNetworkCompute):
# The network to show.
_network = compute_fakes.FakeNetwork.create_one_network()

View File

@ -25,7 +25,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestNetworkFlavor(network_fakes.TestNetworkV2):
def setUp(self):
super(TestNetworkFlavor, self).setUp()
@ -38,7 +37,6 @@ class TestNetworkFlavor(network_fakes.TestNetworkV2):
class TestAddNetworkFlavorToProfile(TestNetworkFlavor):
network_flavor = network_fakes.create_one_network_flavor()
service_profile = network_fakes.create_one_service_profile()
@ -46,25 +44,29 @@ class TestAddNetworkFlavorToProfile(TestNetworkFlavor):
super(TestAddNetworkFlavorToProfile, self).setUp()
self.network.find_flavor = mock.Mock(return_value=self.network_flavor)
self.network.find_service_profile = mock.Mock(
return_value=self.service_profile)
return_value=self.service_profile
)
self.network.associate_flavor_with_service_profile = mock.Mock()
self.cmd = network_flavor.AddNetworkFlavorToProfile(
self.app, self.namespace)
self.app, self.namespace
)
def test_show_no_options(self):
arglist = []
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_add_flavor_to_service_profile(self):
arglist = [
self.network_flavor.id,
self.service_profile.id
]
arglist = [self.network_flavor.id, self.service_profile.id]
verifylist = [
('flavor', self.network_flavor.id),
('service_profile', self.service_profile.id),
@ -73,12 +75,12 @@ class TestAddNetworkFlavorToProfile(TestNetworkFlavor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.network.associate_flavor_with_service_profile.\
assert_called_once_with(self.network_flavor, self.service_profile)
self.network.associate_flavor_with_service_profile.assert_called_once_with( # noqa: E501
self.network_flavor, self.service_profile
)
class TestCreateNetworkFlavor(TestNetworkFlavor):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
# The new network flavor created.
@ -103,7 +105,8 @@ class TestCreateNetworkFlavor(TestNetworkFlavor):
def setUp(self):
super(TestCreateNetworkFlavor, self).setUp()
self.network.create_flavor = mock.Mock(
return_value=self.new_network_flavor)
return_value=self.new_network_flavor
)
# Get the command object to test
self.cmd = network_flavor.CreateNetworkFlavor(self.app, self.namespace)
@ -116,12 +119,18 @@ class TestCreateNetworkFlavor(TestNetworkFlavor):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
'--service-type', self.new_network_flavor.service_type,
'--service-type',
self.new_network_flavor.service_type,
self.new_network_flavor.name,
]
verifylist = [
@ -130,22 +139,28 @@ class TestCreateNetworkFlavor(TestNetworkFlavor):
]
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.network.create_flavor.assert_called_once_with(**{
'service_type': self.new_network_flavor.service_type,
'name': self.new_network_flavor.name,
})
self.network.create_flavor.assert_called_once_with(
**{
'service_type': self.new_network_flavor.service_type,
'name': self.new_network_flavor.name,
}
)
self.assertEqual(set(self.columns), set(columns))
self.assertEqual(set(self.data), set(data))
def test_create_all_options(self):
arglist = [
'--description', self.new_network_flavor.description,
'--description',
self.new_network_flavor.description,
'--enable',
'--project', self.project.id,
'--project-domain', self.domain.name,
'--service-type', self.new_network_flavor.service_type,
'--project',
self.project.id,
'--project-domain',
self.domain.name,
'--service-type',
self.new_network_flavor.service_type,
self.new_network_flavor.name,
]
verifylist = [
@ -158,22 +173,25 @@ class TestCreateNetworkFlavor(TestNetworkFlavor):
]
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.network.create_flavor.assert_called_once_with(**{
'description': self.new_network_flavor.description,
'enabled': True,
'project_id': self.project.id,
'service_type': self.new_network_flavor.service_type,
'name': self.new_network_flavor.name,
})
self.network.create_flavor.assert_called_once_with(
**{
'description': self.new_network_flavor.description,
'enabled': True,
'project_id': self.project.id,
'service_type': self.new_network_flavor.service_type,
'name': self.new_network_flavor.name,
}
)
self.assertEqual(set(self.columns), set(columns))
self.assertEqual(set(self.data), set(data))
def test_create_disable(self):
arglist = [
'--disable',
'--service-type', self.new_network_flavor.service_type,
'--service-type',
self.new_network_flavor.service_type,
self.new_network_flavor.name,
]
verifylist = [
@ -185,17 +203,18 @@ class TestCreateNetworkFlavor(TestNetworkFlavor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_flavor.assert_called_once_with(**{
'enabled': False,
'service_type': self.new_network_flavor.service_type,
'name': self.new_network_flavor.name,
})
self.network.create_flavor.assert_called_once_with(
**{
'enabled': False,
'service_type': self.new_network_flavor.service_type,
'name': self.new_network_flavor.name,
}
)
self.assertEqual(set(self.columns), set(columns))
self.assertEqual(set(self.data), set(data))
class TestDeleteNetworkFlavor(TestNetworkFlavor):
# The network flavor to delete.
_network_flavors = network_fakes.create_flavor(count=2)
@ -203,7 +222,8 @@ class TestDeleteNetworkFlavor(TestNetworkFlavor):
super(TestDeleteNetworkFlavor, self).setUp()
self.network.delete_flavor = mock.Mock(return_value=None)
self.network.find_flavor = network_fakes.get_flavor(
network_flavors=self._network_flavors)
network_flavors=self._network_flavors
)
# Get the command object to test
self.cmd = network_flavor.DeleteNetworkFlavor(self.app, self.namespace)
@ -220,9 +240,11 @@ class TestDeleteNetworkFlavor(TestNetworkFlavor):
result = self.cmd.take_action(parsed_args)
self.network.find_flavor.assert_called_once_with(
self._network_flavors[0].name, ignore_missing=False)
self._network_flavors[0].name, ignore_missing=False
)
self.network.delete_flavor.assert_called_once_with(
self._network_flavors[0])
self._network_flavors[0]
)
self.assertIsNone(result)
def test_multi_network_flavors_delete(self):
@ -250,15 +272,15 @@ class TestDeleteNetworkFlavor(TestNetworkFlavor):
'unexist_network_flavor',
]
verifylist = [
('flavor',
[self._network_flavors[0].name, 'unexist_network_flavor']),
(
'flavor',
[self._network_flavors[0].name, 'unexist_network_flavor'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._network_flavors[0], exceptions.CommandError]
self.network.find_flavor = (
mock.Mock(side_effect=find_mock_result)
)
self.network.find_flavor = mock.Mock(side_effect=find_mock_result)
try:
self.cmd.take_action(parsed_args)
@ -267,16 +289,17 @@ class TestDeleteNetworkFlavor(TestNetworkFlavor):
self.assertEqual('1 of 2 flavors failed to delete.', str(e))
self.network.find_flavor.assert_any_call(
self._network_flavors[0].name, ignore_missing=False)
self._network_flavors[0].name, ignore_missing=False
)
self.network.find_flavor.assert_any_call(
'unexist_network_flavor', ignore_missing=False)
'unexist_network_flavor', ignore_missing=False
)
self.network.delete_flavor.assert_called_once_with(
self._network_flavors[0]
)
class TestListNetworkFlavor(TestNetworkFlavor):
# The network flavors to list up.
_network_flavors = network_fakes.create_flavor(count=2)
columns = (
@ -288,18 +311,19 @@ class TestListNetworkFlavor(TestNetworkFlavor):
)
data = []
for flavor in _network_flavors:
data.append((
flavor.id,
flavor.name,
flavor.is_enabled,
flavor.service_type,
flavor.description,
))
data.append(
(
flavor.id,
flavor.name,
flavor.is_enabled,
flavor.service_type,
flavor.description,
)
)
def setUp(self):
super(TestListNetworkFlavor, self).setUp()
self.network.flavors = mock.Mock(
return_value=self._network_flavors)
self.network.flavors = mock.Mock(return_value=self._network_flavors)
# Get the command object to test
self.cmd = network_flavor.ListNetworkFlavor(self.app, self.namespace)
@ -317,7 +341,6 @@ class TestListNetworkFlavor(TestNetworkFlavor):
class TestRemoveNetworkFlavorFromProfile(TestNetworkFlavor):
network_flavor = network_fakes.create_one_network_flavor()
service_profile = network_fakes.create_one_service_profile()
@ -325,25 +348,29 @@ class TestRemoveNetworkFlavorFromProfile(TestNetworkFlavor):
super(TestRemoveNetworkFlavorFromProfile, self).setUp()
self.network.find_flavor = mock.Mock(return_value=self.network_flavor)
self.network.find_service_profile = mock.Mock(
return_value=self.service_profile)
return_value=self.service_profile
)
self.network.disassociate_flavor_from_service_profile = mock.Mock()
self.cmd = network_flavor.RemoveNetworkFlavorFromProfile(
self.app, self.namespace)
self.app, self.namespace
)
def test_show_no_options(self):
arglist = []
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_remove_flavor_from_service_profile(self):
arglist = [
self.network_flavor.id,
self.service_profile.id
]
arglist = [self.network_flavor.id, self.service_profile.id]
verifylist = [
('flavor', self.network_flavor.id),
('service_profile', self.service_profile.id),
@ -352,12 +379,12 @@ class TestRemoveNetworkFlavorFromProfile(TestNetworkFlavor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.network.disassociate_flavor_from_service_profile.\
assert_called_once_with(self.network_flavor, self.service_profile)
self.network.disassociate_flavor_from_service_profile.assert_called_once_with( # noqa: E501
self.network_flavor, self.service_profile
)
class TestShowNetworkFlavor(TestNetworkFlavor):
# The network flavor to show.
new_network_flavor = network_fakes.create_one_network_flavor()
columns = (
@ -380,7 +407,8 @@ class TestShowNetworkFlavor(TestNetworkFlavor):
def setUp(self):
super(TestShowNetworkFlavor, self).setUp()
self.network.find_flavor = mock.Mock(
return_value=self.new_network_flavor)
return_value=self.new_network_flavor
)
# Get the command object to test
self.cmd = network_flavor.ShowNetworkFlavor(self.app, self.namespace)
@ -390,8 +418,13 @@ class TestShowNetworkFlavor(TestNetworkFlavor):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -405,28 +438,30 @@ class TestShowNetworkFlavor(TestNetworkFlavor):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_flavor.assert_called_once_with(
self.new_network_flavor.name, ignore_missing=False)
self.new_network_flavor.name, ignore_missing=False
)
self.assertEqual(set(self.columns), set(columns))
self.assertEqual(set(self.data), set(data))
class TestSetNetworkFlavor(TestNetworkFlavor):
# The network flavor to set.
new_network_flavor = (
network_fakes.create_one_network_flavor())
new_network_flavor = network_fakes.create_one_network_flavor()
def setUp(self):
super(TestSetNetworkFlavor, self).setUp()
self.network.update_flavor = mock.Mock(return_value=None)
self.network.find_flavor = mock.Mock(
return_value=self.new_network_flavor)
return_value=self.new_network_flavor
)
# Get the command object to test
self.cmd = network_flavor.SetNetworkFlavor(self.app, self.namespace)
def test_set_nothing(self):
arglist = [self.new_network_flavor.name, ]
arglist = [
self.new_network_flavor.name,
]
verifylist = [
('flavor', self.new_network_flavor.name),
]
@ -436,12 +471,14 @@ class TestSetNetworkFlavor(TestNetworkFlavor):
attrs = {}
self.network.update_flavor.assert_called_with(
self.new_network_flavor, **attrs)
self.new_network_flavor, **attrs
)
self.assertIsNone(result)
def test_set_name_and_enable(self):
arglist = [
'--name', 'new_network_flavor',
'--name',
'new_network_flavor',
'--enable',
self.new_network_flavor.name,
]
@ -458,7 +495,8 @@ class TestSetNetworkFlavor(TestNetworkFlavor):
'enabled': True,
}
self.network.update_flavor.assert_called_with(
self.new_network_flavor, **attrs)
self.new_network_flavor, **attrs
)
self.assertIsNone(result)
def test_set_disable(self):
@ -477,5 +515,6 @@ class TestSetNetworkFlavor(TestNetworkFlavor):
'enabled': False,
}
self.network.update_flavor.assert_called_with(
self.new_network_flavor, **attrs)
self.new_network_flavor, **attrs
)
self.assertIsNone(result)

View File

@ -20,7 +20,6 @@ from openstackclient.tests.unit.network.v2 import fakes as network_fakes
class TestFlavorProfile(network_fakes.TestNetworkV2):
def setUp(self):
super(TestFlavorProfile, self).setUp()
# Get the network client
@ -57,20 +56,27 @@ class TestCreateFlavorProfile(TestFlavorProfile):
def setUp(self):
super(TestCreateFlavorProfile, self).setUp()
self.network.create_service_profile = mock.Mock(
return_value=self.new_flavor_profile)
return_value=self.new_flavor_profile
)
self.projects_mock.get.return_value = self.project
# Get the command object to test
self.cmd = (network_flavor_profile.CreateNetworkFlavorProfile(
self.app, self.namespace))
self.cmd = network_flavor_profile.CreateNetworkFlavorProfile(
self.app, self.namespace
)
def test_create_all_options(self):
arglist = [
"--description", self.new_flavor_profile.description,
"--project", self.new_flavor_profile.project_id,
'--project-domain', self.domain.name,
"--description",
self.new_flavor_profile.description,
"--project",
self.new_flavor_profile.project_id,
'--project-domain',
self.domain.name,
"--enable",
"--driver", self.new_flavor_profile.driver,
"--metainfo", self.new_flavor_profile.meta_info,
"--driver",
self.new_flavor_profile.driver,
"--metainfo",
self.new_flavor_profile.meta_info,
]
verifylist = [
@ -79,29 +85,35 @@ class TestCreateFlavorProfile(TestFlavorProfile):
('project_domain', self.domain.name),
('enable', True),
('driver', self.new_flavor_profile.driver),
('metainfo', self.new_flavor_profile.meta_info)
('metainfo', self.new_flavor_profile.meta_info),
]
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.network.create_service_profile.assert_called_once_with(
**{'description': self.new_flavor_profile.description,
'project_id': self.project.id,
'enabled': self.new_flavor_profile.is_enabled,
'driver': self.new_flavor_profile.driver,
'metainfo': self.new_flavor_profile.meta_info}
**{
'description': self.new_flavor_profile.description,
'project_id': self.project.id,
'enabled': self.new_flavor_profile.is_enabled,
'driver': self.new_flavor_profile.driver,
'metainfo': self.new_flavor_profile.meta_info,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_with_metainfo(self):
arglist = [
"--description", self.new_flavor_profile.description,
"--project", self.new_flavor_profile.project_id,
'--project-domain', self.domain.name,
"--description",
self.new_flavor_profile.description,
"--project",
self.new_flavor_profile.project_id,
'--project-domain',
self.domain.name,
"--enable",
"--metainfo", self.new_flavor_profile.meta_info,
"--metainfo",
self.new_flavor_profile.meta_info,
]
verifylist = [
@ -109,28 +121,34 @@ class TestCreateFlavorProfile(TestFlavorProfile):
('project', self.new_flavor_profile.project_id),
('project_domain', self.domain.name),
('enable', True),
('metainfo', self.new_flavor_profile.meta_info)
('metainfo', self.new_flavor_profile.meta_info),
]
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.network.create_service_profile.assert_called_once_with(
**{'description': self.new_flavor_profile.description,
'project_id': self.project.id,
'enabled': self.new_flavor_profile.is_enabled,
'metainfo': self.new_flavor_profile.meta_info}
**{
'description': self.new_flavor_profile.description,
'project_id': self.project.id,
'enabled': self.new_flavor_profile.is_enabled,
'metainfo': self.new_flavor_profile.meta_info,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_with_driver(self):
arglist = [
"--description", self.new_flavor_profile.description,
"--project", self.new_flavor_profile.project_id,
'--project-domain', self.domain.name,
"--description",
self.new_flavor_profile.description,
"--project",
self.new_flavor_profile.project_id,
'--project-domain',
self.domain.name,
"--enable",
"--driver", self.new_flavor_profile.driver,
"--driver",
self.new_flavor_profile.driver,
]
verifylist = [
@ -142,23 +160,27 @@ class TestCreateFlavorProfile(TestFlavorProfile):
]
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.network.create_service_profile.assert_called_once_with(
**{'description': self.new_flavor_profile.description,
'project_id': self.project.id,
'enabled': self.new_flavor_profile.is_enabled,
'driver': self.new_flavor_profile.driver,
}
**{
'description': self.new_flavor_profile.description,
'project_id': self.project.id,
'enabled': self.new_flavor_profile.is_enabled,
'driver': self.new_flavor_profile.driver,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_without_driver_and_metainfo(self):
arglist = [
"--description", self.new_flavor_profile.description,
"--project", self.new_flavor_profile.project_id,
'--project-domain', self.domain.name,
"--description",
self.new_flavor_profile.description,
"--project",
self.new_flavor_profile.project_id,
'--project-domain',
self.domain.name,
"--enable",
]
@ -180,40 +202,42 @@ class TestCreateFlavorProfile(TestFlavorProfile):
def test_create_disable(self):
arglist = [
'--disable',
'--driver', self.new_flavor_profile.driver,
'--driver',
self.new_flavor_profile.driver,
]
verifylist = [
('disable', True),
('driver', self.new_flavor_profile.driver)
('driver', self.new_flavor_profile.driver),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_service_profile.assert_called_once_with(**{
'enabled': False,
'driver': self.new_flavor_profile.driver,
})
self.network.create_service_profile.assert_called_once_with(
**{
'enabled': False,
'driver': self.new_flavor_profile.driver,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestDeleteFlavorProfile(TestFlavorProfile):
# The network flavor_profiles to delete.
_network_flavor_profiles = network_fakes.create_service_profile(count=2)
def setUp(self):
super(TestDeleteFlavorProfile, self).setUp()
self.network.delete_service_profile = mock.Mock(return_value=None)
self.network.find_service_profile = (
network_fakes.get_service_profile(
flavor_profile=self._network_flavor_profiles)
self.network.find_service_profile = network_fakes.get_service_profile(
flavor_profile=self._network_flavor_profiles
)
# Get the command object to test
self.cmd = network_flavor_profile.DeleteNetworkFlavorProfile(
self.app, self.namespace)
self.app, self.namespace
)
def test_network_flavor_profile_delete(self):
arglist = [
@ -227,9 +251,11 @@ class TestDeleteFlavorProfile(TestFlavorProfile):
result = self.cmd.take_action(parsed_args)
self.network.find_service_profile.assert_called_once_with(
self._network_flavor_profiles[0].id, ignore_missing=False)
self._network_flavor_profiles[0].id, ignore_missing=False
)
self.network.delete_service_profile.assert_called_once_with(
self._network_flavor_profiles[0])
self._network_flavor_profiles[0]
)
self.assertIsNone(result)
def test_multi_network_flavor_profiles_delete(self):
@ -256,36 +282,44 @@ class TestDeleteFlavorProfile(TestFlavorProfile):
'unexist_network_flavor_profile',
]
verifylist = [
('flavor_profile',
[self._network_flavor_profiles[0].id,
'unexist_network_flavor_profile']),
(
'flavor_profile',
[
self._network_flavor_profiles[0].id,
'unexist_network_flavor_profile',
],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._network_flavor_profiles[0],
exceptions.CommandError]
self.network.find_service_profile = (
mock.Mock(side_effect=find_mock_result)
find_mock_result = [
self._network_flavor_profiles[0],
exceptions.CommandError,
]
self.network.find_service_profile = mock.Mock(
side_effect=find_mock_result
)
try:
self.cmd.take_action(parsed_args)
self.fail('CommandError should be raised.')
except exceptions.CommandError as e:
self.assertEqual('1 of 2 flavor_profiles failed to delete.',
str(e))
self.assertEqual(
'1 of 2 flavor_profiles failed to delete.', str(e)
)
self.network.find_service_profile.assert_any_call(
self._network_flavor_profiles[0].id, ignore_missing=False)
self._network_flavor_profiles[0].id, ignore_missing=False
)
self.network.find_service_profile.assert_any_call(
'unexist_network_flavor_profile', ignore_missing=False)
'unexist_network_flavor_profile', ignore_missing=False
)
self.network.delete_service_profile.assert_called_once_with(
self._network_flavor_profiles[0]
)
class TestListFlavorProfile(TestFlavorProfile):
# The network flavor profiles list
_network_flavor_profiles = network_fakes.create_service_profile(count=2)
@ -298,22 +332,26 @@ class TestListFlavorProfile(TestFlavorProfile):
)
data = []
for flavor_profile in _network_flavor_profiles:
data.append((
flavor_profile.id,
flavor_profile.driver,
flavor_profile.is_enabled,
flavor_profile.meta_info,
flavor_profile.description,
))
data.append(
(
flavor_profile.id,
flavor_profile.driver,
flavor_profile.is_enabled,
flavor_profile.meta_info,
flavor_profile.description,
)
)
def setUp(self):
super(TestListFlavorProfile, self).setUp()
self.network.service_profiles = mock.Mock(
return_value=self._network_flavor_profiles)
return_value=self._network_flavor_profiles
)
# Get the command object to test
self.cmd = network_flavor_profile.ListNetworkFlavorProfile(
self.app, self.namespace)
self.app, self.namespace
)
def test_network_flavor_profile_list(self):
arglist = []
@ -328,7 +366,6 @@ class TestListFlavorProfile(TestFlavorProfile):
class TestShowFlavorProfile(TestFlavorProfile):
# The network flavor profile to show.
network_flavor_profile = network_fakes.create_one_service_profile()
columns = (
@ -351,11 +388,13 @@ class TestShowFlavorProfile(TestFlavorProfile):
def setUp(self):
super(TestShowFlavorProfile, self).setUp()
self.network.find_service_profile = mock.Mock(
return_value=self.network_flavor_profile)
return_value=self.network_flavor_profile
)
# Get the command object to test
self.cmd = network_flavor_profile.ShowNetworkFlavorProfile(
self.app, self.namespace)
self.app, self.namespace
)
def test_show_all_options(self):
arglist = [
@ -369,13 +408,13 @@ class TestShowFlavorProfile(TestFlavorProfile):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_service_profile.assert_called_once_with(
self.network_flavor_profile.id, ignore_missing=False)
self.network_flavor_profile.id, ignore_missing=False
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestSetFlavorProfile(TestFlavorProfile):
# The network flavor profile to set.
network_flavor_profile = network_fakes.create_one_service_profile()
@ -383,11 +422,13 @@ class TestSetFlavorProfile(TestFlavorProfile):
super(TestSetFlavorProfile, self).setUp()
self.network.update_service_profile = mock.Mock(return_value=None)
self.network.find_service_profile = mock.Mock(
return_value=self.network_flavor_profile)
return_value=self.network_flavor_profile
)
# Get the command object to test
self.cmd = network_flavor_profile.SetNetworkFlavorProfile(
self.app, self.namespace)
self.app, self.namespace
)
def test_set_nothing(self):
arglist = [self.network_flavor_profile.id]
@ -400,7 +441,8 @@ class TestSetFlavorProfile(TestFlavorProfile):
attrs = {}
self.network.update_service_profile.assert_called_with(
self.network_flavor_profile, **attrs)
self.network_flavor_profile, **attrs
)
self.assertIsNone(result)
def test_set_enable(self):
@ -419,7 +461,8 @@ class TestSetFlavorProfile(TestFlavorProfile):
'enabled': True,
}
self.network.update_service_profile.assert_called_with(
self.network_flavor_profile, **attrs)
self.network_flavor_profile, **attrs
)
self.assertIsNone(result)
def test_set_disable(self):
@ -438,5 +481,6 @@ class TestSetFlavorProfile(TestFlavorProfile):
'enabled': False,
}
self.network.update_service_profile.assert_called_with(
self.network_flavor_profile, **attrs)
self.network_flavor_profile, **attrs
)
self.assertIsNone(result)

View File

@ -25,7 +25,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestMeter(network_fakes.TestNetworkV2):
def setUp(self):
super(TestMeter, self).setUp()
self.network = self.app.client_manager.network
@ -37,10 +36,7 @@ class TestCreateMeter(TestMeter):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
new_meter = (
network_fakes.FakeNetworkMeter.
create_one_meter()
)
new_meter = network_fakes.FakeNetworkMeter.create_one_meter()
columns = (
'description',
'id',
@ -60,7 +56,8 @@ class TestCreateMeter(TestMeter):
def setUp(self):
super(TestCreateMeter, self).setUp()
self.network.create_metering_label = mock.Mock(
return_value=self.new_meter)
return_value=self.new_meter
)
self.projects_mock.get.return_value = self.project
self.cmd = network_meter.CreateMeter(self.app, self.namespace)
@ -68,8 +65,13 @@ class TestCreateMeter(TestMeter):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
@ -81,7 +83,7 @@ class TestCreateMeter(TestMeter):
]
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.network.create_metering_label.assert_called_once_with(
**{'name': self.new_meter.name}
@ -91,9 +93,12 @@ class TestCreateMeter(TestMeter):
def test_create_all_options(self):
arglist = [
"--description", self.new_meter.description,
"--project", self.new_meter.project_id,
"--project-domain", self.domain.name,
"--description",
self.new_meter.description,
"--project",
self.new_meter.project_id,
"--project-domain",
self.domain.name,
"--share",
self.new_meter.name,
]
@ -107,32 +112,31 @@ class TestCreateMeter(TestMeter):
]
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.network.create_metering_label.assert_called_once_with(
**{'description': self.new_meter.description,
'name': self.new_meter.name,
'project_id': self.project.id,
'shared': True, }
**{
'description': self.new_meter.description,
'name': self.new_meter.name,
'project_id': self.project.id,
'shared': True,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestDeleteMeter(TestMeter):
def setUp(self):
super(TestDeleteMeter, self).setUp()
self.meter_list = \
network_fakes.FakeNetworkMeter.create_meter(count=2)
self.meter_list = network_fakes.FakeNetworkMeter.create_meter(count=2)
self.network.delete_metering_label = mock.Mock(return_value=None)
self.network.find_metering_label = network_fakes \
.FakeNetworkMeter.get_meter(
meter=self.meter_list
)
self.network.find_metering_label = (
network_fakes.FakeNetworkMeter.get_meter(meter=self.meter_list)
)
self.cmd = network_meter.DeleteMeter(self.app, self.namespace)
@ -196,8 +200,9 @@ class TestDeleteMeter(TestMeter):
]
self.network.delete_metering_label = mock.Mock(side_effect=ret_delete)
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
parsed_args)
self.assertRaises(
exceptions.CommandError, self.cmd.take_action, parsed_args
)
calls = [
call(self.meter_list[0]),
@ -207,9 +212,7 @@ class TestDeleteMeter(TestMeter):
class TestListMeter(TestMeter):
meter_list = \
network_fakes.FakeNetworkMeter.create_meter(count=2)
meter_list = network_fakes.FakeNetworkMeter.create_meter(count=2)
columns = (
'ID',
@ -221,19 +224,19 @@ class TestListMeter(TestMeter):
data = []
for meters in meter_list:
data.append((
meters.id,
meters.name,
meters.description,
meters.shared,
))
data.append(
(
meters.id,
meters.name,
meters.description,
meters.shared,
)
)
def setUp(self):
super(TestListMeter, self).setUp()
self.network.metering_labels = mock.Mock(
return_value=self.meter_list
)
self.network.metering_labels = mock.Mock(return_value=self.meter_list)
self.cmd = network_meter.ListMeter(self.app, self.namespace)
@ -251,10 +254,7 @@ class TestListMeter(TestMeter):
class TestShowMeter(TestMeter):
new_meter = (
network_fakes.FakeNetworkMeter.
create_one_meter()
)
new_meter = network_fakes.FakeNetworkMeter.create_one_meter()
columns = (
'description',
'id',
@ -276,15 +276,21 @@ class TestShowMeter(TestMeter):
self.cmd = network_meter.ShowMeter(self.app, self.namespace)
self.network.find_metering_label = \
mock.Mock(return_value=self.new_meter)
self.network.find_metering_label = mock.Mock(
return_value=self.new_meter
)
def test_show_no_options(self):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_meter_show_option(self):
arglist = [

View File

@ -36,10 +36,7 @@ class TestCreateMeterRule(TestMeterRule):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
new_rule = (
network_fakes.FakeNetworkMeterRule.
create_one_rule()
)
new_rule = network_fakes.FakeNetworkMeterRule.create_one_rule()
columns = (
'destination_ip_prefix',
@ -64,28 +61,34 @@ class TestCreateMeterRule(TestMeterRule):
def setUp(self):
super(TestCreateMeterRule, self).setUp()
fake_meter = network_fakes.FakeNetworkMeter.create_one_meter({
'id': self.new_rule.metering_label_id})
fake_meter = network_fakes.FakeNetworkMeter.create_one_meter(
{'id': self.new_rule.metering_label_id}
)
self.network.create_metering_label_rule = mock.Mock(
return_value=self.new_rule)
return_value=self.new_rule
)
self.projects_mock.get.return_value = self.project
self.cmd = network_meter_rule.CreateMeterRule(self.app,
self.namespace)
self.network.find_metering_label = mock.Mock(
return_value=fake_meter)
self.cmd = network_meter_rule.CreateMeterRule(self.app, self.namespace)
self.network.find_metering_label = mock.Mock(return_value=fake_meter)
def test_create_no_options(self):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
self.new_rule.metering_label_id,
"--remote-ip-prefix", self.new_rule.remote_ip_prefix,
"--remote-ip-prefix",
self.new_rule.remote_ip_prefix,
]
verifylist = [
('meter', self.new_rule.metering_label_id),
@ -93,12 +96,14 @@ class TestCreateMeterRule(TestMeterRule):
]
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.network.create_metering_label_rule.assert_called_once_with(
**{'direction': 'ingress',
'metering_label_id': self.new_rule.metering_label_id,
'remote_ip_prefix': self.new_rule.remote_ip_prefix, }
**{
'direction': 'ingress',
'metering_label_id': self.new_rule.metering_label_id,
'remote_ip_prefix': self.new_rule.remote_ip_prefix,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -108,7 +113,8 @@ class TestCreateMeterRule(TestMeterRule):
"--ingress",
"--include",
self.new_rule.metering_label_id,
"--remote-ip-prefix", self.new_rule.remote_ip_prefix,
"--remote-ip-prefix",
self.new_rule.remote_ip_prefix,
]
verifylist = [
('ingress', True),
@ -118,13 +124,15 @@ class TestCreateMeterRule(TestMeterRule):
]
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.network.create_metering_label_rule.assert_called_once_with(
**{'direction': self.new_rule.direction,
'excluded': self.new_rule.excluded,
'metering_label_id': self.new_rule.metering_label_id,
'remote_ip_prefix': self.new_rule.remote_ip_prefix, }
**{
'direction': self.new_rule.direction,
'excluded': self.new_rule.excluded,
'metering_label_id': self.new_rule.metering_label_id,
'remote_ip_prefix': self.new_rule.remote_ip_prefix,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -133,19 +141,18 @@ class TestCreateMeterRule(TestMeterRule):
class TestDeleteMeterRule(TestMeterRule):
def setUp(self):
super(TestDeleteMeterRule, self).setUp()
self.rule_list = \
network_fakes.FakeNetworkMeterRule.create_meter_rule(
count=2
)
self.rule_list = network_fakes.FakeNetworkMeterRule.create_meter_rule(
count=2
)
self.network.delete_metering_label_rule = mock.Mock(return_value=None)
self.network.find_metering_label_rule = network_fakes \
.FakeNetworkMeterRule.get_meter_rule(
self.network.find_metering_label_rule = (
network_fakes.FakeNetworkMeterRule.get_meter_rule(
meter_rule=self.rule_list
)
)
self.cmd = network_meter_rule.DeleteMeterRule(self.app,
self.namespace)
self.cmd = network_meter_rule.DeleteMeterRule(self.app, self.namespace)
def test_delete_one_rule(self):
arglist = [
@ -211,8 +218,9 @@ class TestDeleteMeterRule(TestMeterRule):
side_effect=ret_delete
)
self.assertRaises(exceptions.CommandError, self.cmd.take_action,
parsed_args)
self.assertRaises(
exceptions.CommandError, self.cmd.take_action, parsed_args
)
calls = [
call(self.rule_list[0]),
@ -222,10 +230,7 @@ class TestDeleteMeterRule(TestMeterRule):
class TestListMeterRule(TestMeterRule):
rule_list = \
network_fakes.FakeNetworkMeterRule.create_meter_rule(
count=2
)
rule_list = network_fakes.FakeNetworkMeterRule.create_meter_rule(count=2)
columns = (
'ID',
@ -233,20 +238,22 @@ class TestListMeterRule(TestMeterRule):
'Direction',
'Remote IP Prefix',
'Source IP Prefix',
'Destination IP Prefix'
'Destination IP Prefix',
)
data = []
for rule in rule_list:
data.append((
rule.id,
rule.excluded,
rule.direction,
rule.remote_ip_prefix,
rule.source_ip_prefix,
rule.destination_ip_prefix
))
data.append(
(
rule.id,
rule.excluded,
rule.direction,
rule.remote_ip_prefix,
rule.source_ip_prefix,
rule.destination_ip_prefix,
)
)
def setUp(self):
super(TestListMeterRule, self).setUp()
@ -255,8 +262,7 @@ class TestListMeterRule(TestMeterRule):
return_value=self.rule_list
)
self.cmd = network_meter_rule.ListMeterRule(self.app,
self.namespace)
self.cmd = network_meter_rule.ListMeterRule(self.app, self.namespace)
def test_rule_list(self):
arglist = []
@ -272,10 +278,7 @@ class TestListMeterRule(TestMeterRule):
class TestShowMeterRule(TestMeterRule):
new_rule = (
network_fakes.FakeNetworkMeterRule.
create_one_rule()
)
new_rule = network_fakes.FakeNetworkMeterRule.create_one_rule()
columns = (
'destination_ip_prefix',
@ -302,18 +305,23 @@ class TestShowMeterRule(TestMeterRule):
def setUp(self):
super(TestShowMeterRule, self).setUp()
self.cmd = network_meter_rule.ShowMeterRule(self.app,
self.namespace)
self.cmd = network_meter_rule.ShowMeterRule(self.app, self.namespace)
self.network.find_metering_label_rule = \
mock.Mock(return_value=self.new_rule)
self.network.find_metering_label_rule = mock.Mock(
return_value=self.new_rule
)
def test_show_no_options(self):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_label_rule_show_option(self):
arglist = [

View File

@ -25,7 +25,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestQosPolicy(network_fakes.TestNetworkV2):
def setUp(self):
super(TestQosPolicy, self).setUp()
# Get a shortcut to the network client
@ -35,16 +34,14 @@ class TestQosPolicy(network_fakes.TestNetworkV2):
class TestCreateNetworkQosPolicy(TestQosPolicy):
project = identity_fakes_v3.FakeProject.create_one_project()
# The new qos policy created.
new_qos_policy = (
network_fakes.FakeNetworkQosPolicy.create_one_qos_policy(
attrs={
'project_id': project.id,
}
))
new_qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy(
attrs={
'project_id': project.id,
}
)
columns = (
'description',
'id',
@ -68,11 +65,13 @@ class TestCreateNetworkQosPolicy(TestQosPolicy):
def setUp(self):
super(TestCreateNetworkQosPolicy, self).setUp()
self.network.create_qos_policy = mock.Mock(
return_value=self.new_qos_policy)
return_value=self.new_qos_policy
)
# Get the command object to test
self.cmd = network_qos_policy.CreateNetworkQosPolicy(
self.app, self.namespace)
self.app, self.namespace
)
self.projects_mock.get.return_value = self.project
@ -81,8 +80,13 @@ class TestCreateNetworkQosPolicy(TestQosPolicy):
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
@ -94,20 +98,22 @@ class TestCreateNetworkQosPolicy(TestQosPolicy):
]
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.network.create_qos_policy.assert_called_once_with(**{
'name': self.new_qos_policy.name
})
self.network.create_qos_policy.assert_called_once_with(
**{'name': self.new_qos_policy.name}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_all_options(self):
arglist = [
'--share',
'--project', self.project.name,
'--project',
self.project.name,
self.new_qos_policy.name,
'--description', 'QoS policy description',
'--description',
'QoS policy description',
'--default',
]
verifylist = [
@ -121,21 +127,20 @@ class TestCreateNetworkQosPolicy(TestQosPolicy):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_qos_policy.assert_called_once_with(**{
'shared': True,
'project_id': self.project.id,
'name': self.new_qos_policy.name,
'description': 'QoS policy description',
'is_default': True,
})
self.network.create_qos_policy.assert_called_once_with(
**{
'shared': True,
'project_id': self.project.id,
'name': self.new_qos_policy.name,
'description': 'QoS policy description',
'is_default': True,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_no_default(self):
arglist = [
self.new_qos_policy.name,
'--no-default'
]
arglist = [self.new_qos_policy.name, '--no-default']
verifylist = [
('project', None),
('name', self.new_qos_policy.name),
@ -143,33 +148,37 @@ class TestCreateNetworkQosPolicy(TestQosPolicy):
]
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.network.create_qos_policy.assert_called_once_with(**{
'name': self.new_qos_policy.name,
'is_default': False,
})
self.network.create_qos_policy.assert_called_once_with(
**{
'name': self.new_qos_policy.name,
'is_default': False,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestDeleteNetworkQosPolicy(TestQosPolicy):
# The address scope to delete.
_qos_policies = (
network_fakes.FakeNetworkQosPolicy.create_qos_policies(count=2))
_qos_policies = network_fakes.FakeNetworkQosPolicy.create_qos_policies(
count=2
)
def setUp(self):
super(TestDeleteNetworkQosPolicy, self).setUp()
self.network.delete_qos_policy = mock.Mock(return_value=None)
self.network.find_qos_policy = (
network_fakes.FakeNetworkQosPolicy.get_qos_policies(
qos_policies=self._qos_policies)
qos_policies=self._qos_policies
)
)
# Get the command object to test
self.cmd = network_qos_policy.DeleteNetworkQosPolicy(
self.app, self.namespace)
self.app, self.namespace
)
def test_qos_policy_delete(self):
arglist = [
@ -183,9 +192,11 @@ class TestDeleteNetworkQosPolicy(TestQosPolicy):
result = self.cmd.take_action(parsed_args)
self.network.find_qos_policy.assert_called_once_with(
self._qos_policies[0].name, ignore_missing=False)
self._qos_policies[0].name, ignore_missing=False
)
self.network.delete_qos_policy.assert_called_once_with(
self._qos_policies[0])
self._qos_policies[0]
)
self.assertIsNone(result)
def test_multi_qos_policies_delete(self):
@ -212,14 +223,13 @@ class TestDeleteNetworkQosPolicy(TestQosPolicy):
'unexist_qos_policy',
]
verifylist = [
('policy',
[self._qos_policies[0].name, 'unexist_qos_policy']),
('policy', [self._qos_policies[0].name, 'unexist_qos_policy']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._qos_policies[0], exceptions.CommandError]
self.network.find_qos_policy = (
mock.MagicMock(side_effect=find_mock_result)
self.network.find_qos_policy = mock.MagicMock(
side_effect=find_mock_result
)
try:
@ -229,19 +239,21 @@ class TestDeleteNetworkQosPolicy(TestQosPolicy):
self.assertEqual('1 of 2 QoS policies failed to delete.', str(e))
self.network.find_qos_policy.assert_any_call(
self._qos_policies[0].name, ignore_missing=False)
self._qos_policies[0].name, ignore_missing=False
)
self.network.find_qos_policy.assert_any_call(
'unexist_qos_policy', ignore_missing=False)
'unexist_qos_policy', ignore_missing=False
)
self.network.delete_qos_policy.assert_called_once_with(
self._qos_policies[0]
)
class TestListNetworkQosPolicy(TestQosPolicy):
# The QoS policies to list up.
qos_policies = (
network_fakes.FakeNetworkQosPolicy.create_qos_policies(count=3))
qos_policies = network_fakes.FakeNetworkQosPolicy.create_qos_policies(
count=3
)
columns = (
'ID',
'Name',
@ -251,21 +263,24 @@ class TestListNetworkQosPolicy(TestQosPolicy):
)
data = []
for qos_policy in qos_policies:
data.append((
qos_policy.id,
qos_policy.name,
qos_policy.shared,
qos_policy.is_default,
qos_policy.project_id,
))
data.append(
(
qos_policy.id,
qos_policy.name,
qos_policy.shared,
qos_policy.is_default,
qos_policy.project_id,
)
)
def setUp(self):
super(TestListNetworkQosPolicy, self).setUp()
self.network.qos_policies = mock.Mock(return_value=self.qos_policies)
# Get the command object to test
self.cmd = network_qos_policy.ListNetworkQosPolicy(self.app,
self.namespace)
self.cmd = network_qos_policy.ListNetworkQosPolicy(
self.app, self.namespace
)
def test_qos_policy_list(self):
arglist = []
@ -289,9 +304,7 @@ class TestListNetworkQosPolicy(TestQosPolicy):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.qos_policies.assert_called_once_with(
**{'shared': True}
)
self.network.qos_policies.assert_called_once_with(**{'shared': True})
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
@ -305,9 +318,7 @@ class TestListNetworkQosPolicy(TestQosPolicy):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.qos_policies.assert_called_once_with(
**{'shared': False}
)
self.network.qos_policies.assert_called_once_with(**{'shared': False})
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
@ -315,8 +326,10 @@ class TestListNetworkQosPolicy(TestQosPolicy):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project-domain', project.domain_id,
'--project',
project.id,
'--project-domain',
project.domain_id,
]
verifylist = [
('project', project.id),
@ -333,22 +346,23 @@ class TestListNetworkQosPolicy(TestQosPolicy):
class TestSetNetworkQosPolicy(TestQosPolicy):
# The QoS policy to set.
_qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
def setUp(self):
super(TestSetNetworkQosPolicy, self).setUp()
self.network.update_qos_policy = mock.Mock(return_value=None)
self.network.find_qos_policy = mock.Mock(
return_value=self._qos_policy)
self.network.find_qos_policy = mock.Mock(return_value=self._qos_policy)
# Get the command object to test
self.cmd = network_qos_policy.SetNetworkQosPolicy(self.app,
self.namespace)
self.cmd = network_qos_policy.SetNetworkQosPolicy(
self.app, self.namespace
)
def test_set_nothing(self):
arglist = [self._qos_policy.name, ]
arglist = [
self._qos_policy.name,
]
verifylist = [
('policy', self._qos_policy.name),
]
@ -358,14 +372,17 @@ class TestSetNetworkQosPolicy(TestQosPolicy):
attrs = {}
self.network.update_qos_policy.assert_called_with(
self._qos_policy, **attrs)
self._qos_policy, **attrs
)
self.assertIsNone(result)
def test_set_name_share_description_default(self):
arglist = [
'--name', 'new_qos_policy',
'--name',
'new_qos_policy',
'--share',
'--description', 'QoS policy description',
'--description',
'QoS policy description',
'--default',
self._qos_policy.name,
]
@ -386,7 +403,8 @@ class TestSetNetworkQosPolicy(TestQosPolicy):
'is_default': True,
}
self.network.update_qos_policy.assert_called_with(
self._qos_policy, **attrs)
self._qos_policy, **attrs
)
self.assertIsNone(result)
def test_set_no_share_no_default(self):
@ -403,20 +421,16 @@ class TestSetNetworkQosPolicy(TestQosPolicy):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
attrs = {
'shared': False,
'is_default': False
}
attrs = {'shared': False, 'is_default': False}
self.network.update_qos_policy.assert_called_with(
self._qos_policy, **attrs)
self._qos_policy, **attrs
)
self.assertIsNone(result)
class TestShowNetworkQosPolicy(TestQosPolicy):
# The QoS policy to show.
_qos_policy = (
network_fakes.FakeNetworkQosPolicy.create_one_qos_policy())
_qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
columns = (
'description',
'id',
@ -441,16 +455,22 @@ class TestShowNetworkQosPolicy(TestQosPolicy):
self.network.find_qos_policy = mock.Mock(return_value=self._qos_policy)
# Get the command object to test
self.cmd = network_qos_policy.ShowNetworkQosPolicy(self.app,
self.namespace)
self.cmd = network_qos_policy.ShowNetworkQosPolicy(
self.app, self.namespace
)
def test_show_no_options(self):
arglist = []
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -464,6 +484,7 @@ class TestShowNetworkQosPolicy(TestQosPolicy):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_qos_policy.assert_called_once_with(
self._qos_policy.name, ignore_missing=False)
self._qos_policy.name, ignore_missing=False
)
self.assertEqual(self.columns, columns)
self.assertEqual(list(self.data), list(data))

View File

@ -21,7 +21,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestNetworkQosRuleType(network_fakes.TestNetworkV2):
def setUp(self):
super(TestNetworkQosRuleType, self).setUp()
# Get a shortcut to the network client
@ -29,41 +28,37 @@ class TestNetworkQosRuleType(network_fakes.TestNetworkV2):
class TestShowNetworkQosRuleType(TestNetworkQosRuleType):
attrs = {
'drivers': [{
'name': 'driver 1',
'supported_parameters': []
}]
}
attrs = {'drivers': [{'name': 'driver 1', 'supported_parameters': []}]}
# The QoS policies to show.
qos_rule_type = (
network_fakes.FakeNetworkQosRuleType.create_one_qos_rule_type(attrs))
columns = (
'drivers',
'rule_type_name'
network_fakes.FakeNetworkQosRuleType.create_one_qos_rule_type(attrs)
)
data = [
qos_rule_type.drivers,
qos_rule_type.type
]
columns = ('drivers', 'rule_type_name')
data = [qos_rule_type.drivers, qos_rule_type.type]
def setUp(self):
super(TestShowNetworkQosRuleType, self).setUp()
self.network.get_qos_rule_type = mock.Mock(
return_value=self.qos_rule_type)
return_value=self.qos_rule_type
)
# Get the command object to test
self.cmd = _qos_rule_type.ShowNetworkQosRuleType(self.app,
self.namespace)
self.cmd = _qos_rule_type.ShowNetworkQosRuleType(
self.app, self.namespace
)
def test_show_no_options(self):
arglist = []
verifylist = []
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -77,33 +72,32 @@ class TestShowNetworkQosRuleType(TestNetworkQosRuleType):
columns, data = self.cmd.take_action(parsed_args)
self.network.get_qos_rule_type.assert_called_once_with(
self.qos_rule_type.type)
self.qos_rule_type.type
)
self.assertEqual(self.columns, columns)
self.assertEqual(list(self.data), list(data))
class TestListNetworkQosRuleType(TestNetworkQosRuleType):
# The QoS policies to list up.
qos_rule_types = (
network_fakes.FakeNetworkQosRuleType.create_qos_rule_types(count=3))
columns = (
'Type',
network_fakes.FakeNetworkQosRuleType.create_qos_rule_types(count=3)
)
columns = ('Type',)
data = []
for qos_rule_type in qos_rule_types:
data.append((
qos_rule_type.type,
))
data.append((qos_rule_type.type,))
def setUp(self):
super(TestListNetworkQosRuleType, self).setUp()
self.network.qos_rule_types = mock.Mock(
return_value=self.qos_rule_types)
return_value=self.qos_rule_types
)
# Get the command object to test
self.cmd = _qos_rule_type.ListNetworkQosRuleType(self.app,
self.namespace)
self.cmd = _qos_rule_type.ListNetworkQosRuleType(
self.app, self.namespace
)
def test_qos_rule_type_list(self):
arglist = []
@ -117,9 +111,7 @@ class TestListNetworkQosRuleType(TestNetworkQosRuleType):
self.assertEqual(self.data, list(data))
def test_qos_rule_type_list_all_supported(self):
arglist = [
'--all-supported'
]
arglist = ['--all-supported']
verifylist = [
('all_supported', True),
]
@ -134,9 +126,7 @@ class TestListNetworkQosRuleType(TestNetworkQosRuleType):
self.assertEqual(self.data, list(data))
def test_qos_rule_type_list_all_rules(self):
arglist = [
'--all-rules'
]
arglist = ['--all-rules']
verifylist = [
('all_rules', True),
]

View File

@ -24,7 +24,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestNetworkRBAC(network_fakes.TestNetworkV2):
def setUp(self):
super(TestNetworkRBAC, self).setUp()
@ -36,7 +35,6 @@ class TestNetworkRBAC(network_fakes.TestNetworkV2):
@ddt.ddt
class TestCreateNetworkRBAC(TestNetworkRBAC):
network_object = network_fakes.create_one_network()
qos_object = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
sg_object = network_fakes.FakeNetworkSecGroup.create_one_security_group()
@ -45,9 +43,11 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
ag_object = network_fakes.create_one_address_group()
project = identity_fakes_v3.FakeProject.create_one_project()
rbac_policy = network_fakes.create_one_network_rbac(
attrs={'project_id': project.id,
'target_tenant': project.id,
'object_id': network_object.id}
attrs={
'project_id': project.id,
'target_tenant': project.id,
'object_id': network_object.id,
}
)
columns = (
@ -75,24 +75,26 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
self.cmd = network_rbac.CreateNetworkRBAC(self.app, self.namespace)
self.network.create_rbac_policy = mock.Mock(
return_value=self.rbac_policy)
self.network.find_network = mock.Mock(
return_value=self.network_object)
self.network.find_qos_policy = mock.Mock(
return_value=self.qos_object)
return_value=self.rbac_policy
)
self.network.find_network = mock.Mock(return_value=self.network_object)
self.network.find_qos_policy = mock.Mock(return_value=self.qos_object)
self.network.find_security_group = mock.Mock(
return_value=self.sg_object)
return_value=self.sg_object
)
self.network.find_address_scope = mock.Mock(
return_value=self.as_object)
self.network.find_subnet_pool = mock.Mock(
return_value=self.snp_object)
return_value=self.as_object
)
self.network.find_subnet_pool = mock.Mock(return_value=self.snp_object)
self.network.find_address_group = mock.Mock(
return_value=self.ag_object)
return_value=self.ag_object
)
self.projects_mock.get.return_value = self.project
def test_network_rbac_create_no_type(self):
arglist = [
'--action', self.rbac_policy.action,
'--action',
self.rbac_policy.action,
self.rbac_policy.object_id,
]
verifylist = [
@ -100,12 +102,18 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
('rbac_policy', self.rbac_policy.id),
]
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_network_rbac_create_no_action(self):
arglist = [
'--type', self.rbac_policy.object_type,
'--type',
self.rbac_policy.object_type,
self.rbac_policy.object_id,
]
verifylist = [
@ -113,14 +121,22 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
('rbac_policy', self.rbac_policy.id),
]
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_network_rbac_create_invalid_type(self):
arglist = [
'--action', self.rbac_policy.action,
'--type', 'invalid_type',
'--target-project', self.rbac_policy.target_project_id,
'--action',
self.rbac_policy.action,
'--type',
'invalid_type',
'--target-project',
self.rbac_policy.target_project_id,
self.rbac_policy.object_id,
]
verifylist = [
@ -130,14 +146,22 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
('rbac_policy', self.rbac_policy.id),
]
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_network_rbac_create_invalid_action(self):
arglist = [
'--type', self.rbac_policy.object_type,
'--action', 'invalid_action',
'--target-project', self.rbac_policy.target_project_id,
'--type',
self.rbac_policy.object_type,
'--action',
'invalid_action',
'--target-project',
self.rbac_policy.target_project_id,
self.rbac_policy.object_id,
]
verifylist = [
@ -147,14 +171,22 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
('rbac_policy', self.rbac_policy.id),
]
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_network_rbac_create(self):
arglist = [
'--type', self.rbac_policy.object_type,
'--action', self.rbac_policy.action,
'--target-project', self.rbac_policy.target_project_id,
'--type',
self.rbac_policy.object_type,
'--action',
self.rbac_policy.action,
'--target-project',
self.rbac_policy.target_project_id,
self.rbac_policy.object_id,
]
verifylist = [
@ -168,19 +200,23 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
# DisplayCommandBase.take_action() returns two tuples
columns, data = self.cmd.take_action(parsed_args)
self.network.create_rbac_policy.assert_called_with(**{
'object_id': self.rbac_policy.object_id,
'object_type': self.rbac_policy.object_type,
'action': self.rbac_policy.action,
'target_tenant': self.rbac_policy.target_project_id,
})
self.network.create_rbac_policy.assert_called_with(
**{
'object_id': self.rbac_policy.object_id,
'object_type': self.rbac_policy.object_type,
'action': self.rbac_policy.action,
'target_tenant': self.rbac_policy.target_project_id,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_network_rbac_create_with_target_all_projects(self):
arglist = [
'--type', self.rbac_policy.object_type,
'--action', self.rbac_policy.action,
'--type',
self.rbac_policy.object_type,
'--action',
self.rbac_policy.action,
'--target-all-projects',
self.rbac_policy.object_id,
]
@ -194,21 +230,29 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
columns, data = self.cmd.take_action(parsed_args)
self.network.create_rbac_policy.assert_called_with(**{
'object_id': self.rbac_policy.object_id,
'object_type': self.rbac_policy.object_type,
'action': self.rbac_policy.action,
'target_tenant': '*',
})
self.network.create_rbac_policy.assert_called_with(
**{
'object_id': self.rbac_policy.object_id,
'object_type': self.rbac_policy.object_type,
'action': self.rbac_policy.action,
'target_tenant': '*',
}
)
def test_network_rbac_create_all_options(self):
arglist = [
'--type', self.rbac_policy.object_type,
'--action', self.rbac_policy.action,
'--target-project', self.rbac_policy.target_project_id,
'--project', self.rbac_policy.project_id,
'--project-domain', self.project.domain_id,
'--target-project-domain', self.project.domain_id,
'--type',
self.rbac_policy.object_type,
'--action',
self.rbac_policy.action,
'--target-project',
self.rbac_policy.target_project_id,
'--project',
self.rbac_policy.project_id,
'--project-domain',
self.project.domain_id,
'--target-project-domain',
self.project.domain_id,
self.rbac_policy.object_id,
]
verifylist = [
@ -225,13 +269,15 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
# DisplayCommandBase.take_action() returns two tuples
columns, data = self.cmd.take_action(parsed_args)
self.network.create_rbac_policy.assert_called_with(**{
'object_id': self.rbac_policy.object_id,
'object_type': self.rbac_policy.object_type,
'action': self.rbac_policy.action,
'target_tenant': self.rbac_policy.target_project_id,
'project_id': self.rbac_policy.project_id,
})
self.network.create_rbac_policy.assert_called_with(
**{
'object_id': self.rbac_policy.object_id,
'object_type': self.rbac_policy.object_type,
'action': self.rbac_policy.action,
'target_tenant': self.rbac_policy.target_project_id,
'project_id': self.rbac_policy.project_id,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
@ -240,7 +286,7 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
('security_group', "sg_object"),
('subnetpool', "snp_object"),
('address_scope', "as_object"),
('address_group', "ag_object")
('address_group', "ag_object"),
)
@ddt.unpack
def test_network_rbac_create_object(self, obj_type, obj_fake_attr):
@ -249,9 +295,12 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
self.rbac_policy.object_type = obj_type
self.rbac_policy.object_id = obj_fake.id
arglist = [
'--type', obj_type,
'--action', self.rbac_policy.action,
'--target-project', self.rbac_policy.target_project_id,
'--type',
obj_type,
'--action',
self.rbac_policy.action,
'--target-project',
self.rbac_policy.target_project_id,
obj_fake.name,
]
verifylist = [
@ -265,12 +314,14 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
# DisplayCommandBase.take_action() returns two tuples
columns, data = self.cmd.take_action(parsed_args)
self.network.create_rbac_policy.assert_called_with(**{
'object_id': obj_fake.id,
'object_type': obj_type,
'action': self.rbac_policy.action,
'target_tenant': self.rbac_policy.target_project_id,
})
self.network.create_rbac_policy.assert_called_with(
**{
'object_id': obj_fake.id,
'object_type': obj_type,
'action': self.rbac_policy.action,
'target_tenant': self.rbac_policy.target_project_id,
}
)
self.data = [
self.rbac_policy.action,
self.rbac_policy.id,
@ -284,15 +335,13 @@ class TestCreateNetworkRBAC(TestNetworkRBAC):
class TestDeleteNetworkRBAC(TestNetworkRBAC):
rbac_policies = network_fakes.create_network_rbacs(count=2)
def setUp(self):
super(TestDeleteNetworkRBAC, self).setUp()
self.network.delete_rbac_policy = mock.Mock(return_value=None)
self.network.find_rbac_policy = (
network_fakes.get_network_rbacs(
rbac_policies=self.rbac_policies)
self.network.find_rbac_policy = network_fakes.get_network_rbacs(
rbac_policies=self.rbac_policies
)
# Get the command object to test
@ -310,9 +359,11 @@ class TestDeleteNetworkRBAC(TestNetworkRBAC):
result = self.cmd.take_action(parsed_args)
self.network.find_rbac_policy.assert_called_once_with(
self.rbac_policies[0].id, ignore_missing=False)
self.rbac_policies[0].id, ignore_missing=False
)
self.network.delete_rbac_policy.assert_called_once_with(
self.rbac_policies[0])
self.rbac_policies[0]
)
self.assertIsNone(result)
def test_multi_network_rbacs_delete(self):
@ -340,15 +391,12 @@ class TestDeleteNetworkRBAC(TestNetworkRBAC):
'unexist_rbac_policy',
]
verifylist = [
('rbac_policy',
[self.rbac_policies[0].id, 'unexist_rbac_policy']),
('rbac_policy', [self.rbac_policies[0].id, 'unexist_rbac_policy']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self.rbac_policies[0], exceptions.CommandError]
self.network.find_rbac_policy = (
mock.Mock(side_effect=find_mock_result)
)
self.network.find_rbac_policy = mock.Mock(side_effect=find_mock_result)
try:
self.cmd.take_action(parsed_args)
@ -357,16 +405,17 @@ class TestDeleteNetworkRBAC(TestNetworkRBAC):
self.assertEqual('1 of 2 RBAC policies failed to delete.', str(e))
self.network.find_rbac_policy.assert_any_call(
self.rbac_policies[0].id, ignore_missing=False)
self.rbac_policies[0].id, ignore_missing=False
)
self.network.find_rbac_policy.assert_any_call(
'unexist_rbac_policy', ignore_missing=False)
'unexist_rbac_policy', ignore_missing=False
)
self.network.delete_rbac_policy.assert_called_once_with(
self.rbac_policies[0]
)
class TestListNetworkRABC(TestNetworkRBAC):
# The network rbac policies going to be listed up.
rbac_policies = network_fakes.create_network_rbacs(count=3)
@ -383,19 +432,23 @@ class TestListNetworkRABC(TestNetworkRBAC):
)
data = []
for r in rbac_policies:
data.append((
r.id,
r.object_type,
r.object_id,
))
data.append(
(
r.id,
r.object_type,
r.object_id,
)
)
data_long = []
for r in rbac_policies:
data_long.append((
r.id,
r.object_type,
r.object_id,
r.action,
))
data_long.append(
(
r.id,
r.object_type,
r.object_id,
r.action,
)
)
def setUp(self):
super(TestListNetworkRABC, self).setUp()
@ -422,33 +475,35 @@ class TestListNetworkRABC(TestNetworkRBAC):
def test_network_rbac_list_type_opt(self):
arglist = [
'--type', self.rbac_policies[0].object_type, ]
verifylist = [
('type', self.rbac_policies[0].object_type)]
'--type',
self.rbac_policies[0].object_type,
]
verifylist = [('type', self.rbac_policies[0].object_type)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# DisplayCommandBase.take_action() returns two tuples
columns, data = self.cmd.take_action(parsed_args)
self.network.rbac_policies.assert_called_with(**{
'object_type': self.rbac_policies[0].object_type
})
self.network.rbac_policies.assert_called_with(
**{'object_type': self.rbac_policies[0].object_type}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_network_rbac_list_action_opt(self):
arglist = [
'--action', self.rbac_policies[0].action, ]
verifylist = [
('action', self.rbac_policies[0].action)]
'--action',
self.rbac_policies[0].action,
]
verifylist = [('action', self.rbac_policies[0].action)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# DisplayCommandBase.take_action() returns two tuples
columns, data = self.cmd.take_action(parsed_args)
self.network.rbac_policies.assert_called_with(**{
'action': self.rbac_policies[0].action
})
self.network.rbac_policies.assert_called_with(
**{'action': self.rbac_policies[0].action}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
@ -471,26 +526,29 @@ class TestListNetworkRABC(TestNetworkRBAC):
def test_network_rbac_list_target_project_opt(self):
arglist = [
'--target-project', self.rbac_policies[0].target_project_id, ]
'--target-project',
self.rbac_policies[0].target_project_id,
]
verifylist = [
('target_project', self.rbac_policies[0].target_project_id)]
('target_project', self.rbac_policies[0].target_project_id)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
# DisplayCommandBase.take_action() returns two tuples
columns, data = self.cmd.take_action(parsed_args)
self.network.rbac_policies.assert_called_with(**{
'target_project_id': self.project.id
})
self.network.rbac_policies.assert_called_with(
**{'target_project_id': self.project.id}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
class TestSetNetworkRBAC(TestNetworkRBAC):
project = identity_fakes_v3.FakeProject.create_one_project()
rbac_policy = network_fakes.create_one_network_rbac(
attrs={'target_tenant': project.id})
attrs={'target_tenant': project.id}
)
def setUp(self):
super(TestSetNetworkRBAC, self).setUp()
@ -499,7 +557,8 @@ class TestSetNetworkRBAC(TestNetworkRBAC):
self.cmd = network_rbac.SetNetworkRBAC(self.app, self.namespace)
self.network.find_rbac_policy = mock.Mock(
return_value=self.rbac_policy)
return_value=self.rbac_policy
)
self.network.update_rbac_policy = mock.Mock(return_value=None)
self.projects_mock.get.return_value = self.project
@ -518,12 +577,14 @@ class TestSetNetworkRBAC(TestNetworkRBAC):
)
attrs = {}
self.network.update_rbac_policy.assert_called_once_with(
self.rbac_policy, **attrs)
self.rbac_policy, **attrs
)
self.assertIsNone(result)
def test_network_rbac_set(self):
arglist = [
'--target-project', self.project.id,
'--target-project',
self.project.id,
self.rbac_policy.id,
]
verifylist = [
@ -538,12 +599,12 @@ class TestSetNetworkRBAC(TestNetworkRBAC):
)
attrs = {'target_tenant': self.project.id}
self.network.update_rbac_policy.assert_called_once_with(
self.rbac_policy, **attrs)
self.rbac_policy, **attrs
)
self.assertIsNone(result)
class TestShowNetworkRBAC(TestNetworkRBAC):
rbac_policy = network_fakes.create_one_network_rbac()
columns = (
@ -571,14 +632,20 @@ class TestShowNetworkRBAC(TestNetworkRBAC):
self.cmd = network_rbac.ShowNetworkRBAC(self.app, self.namespace)
self.network.find_rbac_policy = mock.Mock(
return_value=self.rbac_policy)
return_value=self.rbac_policy
)
def test_show_no_options(self):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_network_rbac_show_all_options(self):
arglist = [

View File

@ -22,7 +22,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestNetworkSegment(network_fakes.TestNetworkV2):
def setUp(self):
super(TestNetworkSegment, self).setUp()
@ -31,12 +30,13 @@ class TestNetworkSegment(network_fakes.TestNetworkV2):
class TestCreateNetworkSegment(TestNetworkSegment):
# The network segment to create along with associated network.
_network_segment = network_fakes.create_one_network_segment()
_network = network_fakes.create_one_network({
'id': _network_segment.network_id,
})
_network = network_fakes.create_one_network(
{
'id': _network_segment.network_id,
}
)
columns = (
'description',
@ -68,28 +68,37 @@ class TestCreateNetworkSegment(TestNetworkSegment):
# Get the command object to test
self.cmd = network_segment.CreateNetworkSegment(
self.app,
self.namespace
self.app, self.namespace
)
def test_create_no_options(self):
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_create_invalid_network_type(self):
arglist = [
'--network', self._network_segment.network_id,
'--network-type', 'foo',
'--network',
self._network_segment.network_id,
'--network-type',
'foo',
self._network_segment.name,
]
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, [])
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
[],
)
def test_create_minimum_options(self):
arglist = [
'--network', self._network_segment.network_id,
'--network-type', self._network_segment.network_type,
'--network',
self._network_segment.network_id,
'--network-type',
self._network_segment.network_type,
self._network_segment.name,
]
verifylist = [
@ -102,25 +111,31 @@ class TestCreateNetworkSegment(TestNetworkSegment):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_network.assert_called_once_with(
self._network_segment.network_id,
ignore_missing=False
self._network_segment.network_id, ignore_missing=False
)
self.network.create_segment.assert_called_once_with(
**{
'network_id': self._network_segment.network_id,
'network_type': self._network_segment.network_type,
'name': self._network_segment.name,
}
)
self.network.create_segment.assert_called_once_with(**{
'network_id': self._network_segment.network_id,
'network_type': self._network_segment.network_type,
'name': self._network_segment.name,
})
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
def test_create_all_options(self):
arglist = [
'--description', self._network_segment.description,
'--network', self._network_segment.network_id,
'--network-type', self._network_segment.network_type,
'--physical-network', self._network_segment.physical_network,
'--segment', str(self._network_segment.segmentation_id),
'--description',
self._network_segment.description,
'--network',
self._network_segment.network_id,
'--network-type',
self._network_segment.network_type,
'--physical-network',
self._network_segment.physical_network,
'--segment',
str(self._network_segment.segmentation_id),
self._network_segment.name,
]
verifylist = [
@ -136,24 +151,24 @@ class TestCreateNetworkSegment(TestNetworkSegment):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_network.assert_called_once_with(
self._network_segment.network_id,
ignore_missing=False
self._network_segment.network_id, ignore_missing=False
)
self.network.create_segment.assert_called_once_with(
**{
'description': self._network_segment.description,
'network_id': self._network_segment.network_id,
'network_type': self._network_segment.network_type,
'physical_network': self._network_segment.physical_network,
'segmentation_id': self._network_segment.segmentation_id,
'name': self._network_segment.name,
}
)
self.network.create_segment.assert_called_once_with(**{
'description': self._network_segment.description,
'network_id': self._network_segment.network_id,
'network_type': self._network_segment.network_type,
'physical_network': self._network_segment.physical_network,
'segmentation_id': self._network_segment.segmentation_id,
'name': self._network_segment.name,
})
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestDeleteNetworkSegment(TestNetworkSegment):
# The network segments to delete.
_network_segments = network_fakes.create_network_segments()
@ -167,8 +182,7 @@ class TestDeleteNetworkSegment(TestNetworkSegment):
# Get the command object to test
self.cmd = network_segment.DeleteNetworkSegment(
self.app,
self.namespace
self.app, self.namespace
)
def test_delete(self):
@ -205,33 +219,32 @@ class TestDeleteNetworkSegment(TestNetworkSegment):
self.assertIsNone(result)
def test_delete_multiple_with_exception(self):
arglist = [
self._network_segments[0].id,
'doesnotexist'
]
arglist = [self._network_segments[0].id, 'doesnotexist']
verifylist = [
('network_segment', [self._network_segments[0].id,
'doesnotexist']),
(
'network_segment',
[self._network_segments[0].id, 'doesnotexist'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._network_segments[0],
exceptions.CommandError]
self.network.find_segment = (
mock.Mock(side_effect=find_mock_result)
)
find_mock_result = [self._network_segments[0], exceptions.CommandError]
self.network.find_segment = mock.Mock(side_effect=find_mock_result)
try:
self.cmd.take_action(parsed_args)
self.fail('CommandError should be raised.')
except exceptions.CommandError as e:
self.assertEqual('1 of 2 network segments failed to delete.',
str(e))
self.assertEqual(
'1 of 2 network segments failed to delete.', str(e)
)
self.network.find_segment.assert_any_call(
self._network_segments[0].id, ignore_missing=False)
self._network_segments[0].id, ignore_missing=False
)
self.network.find_segment.assert_any_call(
'doesnotexist', ignore_missing=False)
'doesnotexist', ignore_missing=False
)
self.network.delete_segment.assert_called_once_with(
self._network_segments[0]
)
@ -248,30 +261,32 @@ class TestListNetworkSegment(TestNetworkSegment):
'Network Type',
'Segment',
)
columns_long = columns + (
'Physical Network',
)
columns_long = columns + ('Physical Network',)
data = []
for _network_segment in _network_segments:
data.append((
_network_segment.id,
_network_segment.name,
_network_segment.network_id,
_network_segment.network_type,
_network_segment.segmentation_id,
))
data.append(
(
_network_segment.id,
_network_segment.name,
_network_segment.network_id,
_network_segment.network_type,
_network_segment.segmentation_id,
)
)
data_long = []
for _network_segment in _network_segments:
data_long.append((
_network_segment.id,
_network_segment.name,
_network_segment.network_id,
_network_segment.network_type,
_network_segment.segmentation_id,
_network_segment.physical_network,
))
data_long.append(
(
_network_segment.id,
_network_segment.name,
_network_segment.network_id,
_network_segment.network_type,
_network_segment.segmentation_id,
_network_segment.physical_network,
)
)
def setUp(self):
super(TestListNetworkSegment, self).setUp()
@ -317,10 +332,7 @@ class TestListNetworkSegment(TestNetworkSegment):
'--network',
self._network.id,
]
verifylist = [
('long', False),
('network', self._network.id)
]
verifylist = [('long', False), ('network', self._network.id)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
@ -333,7 +345,6 @@ class TestListNetworkSegment(TestNetworkSegment):
class TestSetNetworkSegment(TestNetworkSegment):
# The network segment to show.
_network_segment = network_fakes.create_one_network_segment()
@ -368,8 +379,10 @@ class TestSetNetworkSegment(TestNetworkSegment):
def test_set_all_options(self):
arglist = [
'--description', 'new description',
'--name', 'new name',
'--description',
'new description',
'--name',
'new name',
self._network_segment.id,
]
verifylist = [
@ -392,7 +405,6 @@ class TestSetNetworkSegment(TestNetworkSegment):
class TestShowNetworkSegment(TestNetworkSegment):
# The network segment to show.
_network_segment = network_fakes.create_one_network_segment()
@ -428,8 +440,9 @@ class TestShowNetworkSegment(TestNetworkSegment):
def test_show_no_options(self):
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_show_all_options(self):
arglist = [
@ -443,8 +456,7 @@ class TestShowNetworkSegment(TestNetworkSegment):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_segment.assert_called_once_with(
self._network_segment.id,
ignore_missing=False
self._network_segment.id, ignore_missing=False
)
self.assertEqual(self.columns, columns)

View File

@ -25,21 +25,20 @@ from openstackclient.tests.unit import utils as tests_utils
class TestAuxiliaryFunctions(tests_utils.TestCase):
def test__get_ranges(self):
input_reference = [
([1, 2, 3, 4, 5, 6, 7], ['1-7']),
([1, 2, 5, 4, 3, 6, 7], ['1-7']),
([1, 2, 4, 3, 7, 6], ['1-4', '6-7']),
([1, 2, 4, 3, '13', 12, '7', '6'], ['1-4', '6-7', '12-13'])
([1, 2, 4, 3, '13', 12, '7', '6'], ['1-4', '6-7', '12-13']),
]
for input, reference in input_reference:
self.assertEqual(reference,
list(network_segment_range._get_ranges(input)))
self.assertEqual(
reference, list(network_segment_range._get_ranges(input))
)
class TestNetworkSegmentRange(network_fakes.TestNetworkV2):
def setUp(self):
super(TestNetworkSegmentRange, self).setUp()
@ -48,7 +47,6 @@ class TestNetworkSegmentRange(network_fakes.TestNetworkV2):
class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
# The network segment range to create.
_network_segment_range = network_fakes.create_one_network_segment_range()
@ -90,33 +88,46 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
# Get the command object to test
self.cmd = network_segment_range.CreateNetworkSegmentRange(
self.app,
self.namespace
self.app, self.namespace
)
def test_create_no_options(self):
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_create_invalid_network_type(self):
arglist = [
'--private',
'--project', self._network_segment_range.project_id,
'--network-type', 'foo',
'--minimum', str(self._network_segment_range.minimum),
'--maximum', str(self._network_segment_range.maximum),
'--project',
self._network_segment_range.project_id,
'--network-type',
'foo',
'--minimum',
str(self._network_segment_range.minimum),
'--maximum',
str(self._network_segment_range.maximum),
self._network_segment_range.name,
]
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, [])
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
[],
)
def test_create_default_with_project_id(self):
arglist = [
'--project', self._network_segment_range.project_id,
'--network-type', 'vxlan',
'--minimum', str(self._network_segment_range.minimum),
'--maximum', str(self._network_segment_range.maximum),
'--project',
self._network_segment_range.project_id,
'--network-type',
'vxlan',
'--minimum',
str(self._network_segment_range.minimum),
'--maximum',
str(self._network_segment_range.maximum),
self._network_segment_range.name,
]
verifylist = [
@ -128,17 +139,21 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertRaises(
exceptions.CommandError, self.cmd.take_action, parsed_args
)
def test_create_shared_with_project_id(self):
arglist = [
'--shared',
'--project', self._network_segment_range.project_id,
'--network-type', 'vxlan',
'--minimum', str(self._network_segment_range.minimum),
'--maximum', str(self._network_segment_range.maximum),
'--project',
self._network_segment_range.project_id,
'--network-type',
'vxlan',
'--minimum',
str(self._network_segment_range.minimum),
'--maximum',
str(self._network_segment_range.maximum),
self._network_segment_range.name,
]
verifylist = [
@ -151,17 +166,21 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertRaises(
exceptions.CommandError, self.cmd.take_action, parsed_args
)
def test_create_tunnel_with_physical_network(self):
arglist = [
'--shared',
'--network-type', 'vxlan',
'--physical-network', self._network_segment_range.physical_network,
'--minimum', str(self._network_segment_range.minimum),
'--maximum', str(self._network_segment_range.maximum),
'--network-type',
'vxlan',
'--physical-network',
self._network_segment_range.physical_network,
'--minimum',
str(self._network_segment_range.minimum),
'--maximum',
str(self._network_segment_range.maximum),
self._network_segment_range.name,
]
verifylist = [
@ -174,15 +193,18 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.assertRaises(exceptions.CommandError,
self.cmd.take_action,
parsed_args)
self.assertRaises(
exceptions.CommandError, self.cmd.take_action, parsed_args
)
def test_create_minimum_options(self):
arglist = [
'--network-type', 'vxlan',
'--minimum', str(self._network_segment_range.minimum),
'--maximum', str(self._network_segment_range.maximum),
'--network-type',
'vxlan',
'--minimum',
str(self._network_segment_range.minimum),
'--maximum',
str(self._network_segment_range.maximum),
self._network_segment_range.name,
]
verifylist = [
@ -195,13 +217,15 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_network_segment_range.assert_called_once_with(**{
'shared': True,
'network_type': 'vxlan',
'minimum': self._network_segment_range.minimum,
'maximum': self._network_segment_range.maximum,
'name': self._network_segment_range.name,
})
self.network.create_network_segment_range.assert_called_once_with(
**{
'shared': True,
'network_type': 'vxlan',
'minimum': self._network_segment_range.minimum,
'maximum': self._network_segment_range.maximum,
'name': self._network_segment_range.name,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -209,10 +233,14 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
def test_create_private_minimum_options(self):
arglist = [
'--private',
'--project', self._network_segment_range.project_id,
'--network-type', 'vxlan',
'--minimum', str(self._network_segment_range.minimum),
'--maximum', str(self._network_segment_range.maximum),
'--project',
self._network_segment_range.project_id,
'--network-type',
'vxlan',
'--minimum',
str(self._network_segment_range.minimum),
'--maximum',
str(self._network_segment_range.maximum),
self._network_segment_range.name,
]
verifylist = [
@ -227,14 +255,16 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_network_segment_range.assert_called_once_with(**{
'shared': False,
'project_id': mock.ANY,
'network_type': 'vxlan',
'minimum': self._network_segment_range.minimum,
'maximum': self._network_segment_range.maximum,
'name': self._network_segment_range.name,
})
self.network.create_network_segment_range.assert_called_once_with(
**{
'shared': False,
'project_id': mock.ANY,
'network_type': 'vxlan',
'minimum': self._network_segment_range.minimum,
'maximum': self._network_segment_range.maximum,
'name': self._network_segment_range.name,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -242,9 +272,12 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
def test_create_shared_minimum_options(self):
arglist = [
'--shared',
'--network-type', 'vxlan',
'--minimum', str(self._network_segment_range.minimum),
'--maximum', str(self._network_segment_range.maximum),
'--network-type',
'vxlan',
'--minimum',
str(self._network_segment_range.minimum),
'--maximum',
str(self._network_segment_range.maximum),
self._network_segment_range.name,
]
verifylist = [
@ -258,13 +291,15 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_network_segment_range.assert_called_once_with(**{
'shared': True,
'network_type': 'vxlan',
'minimum': self._network_segment_range.minimum,
'maximum': self._network_segment_range.maximum,
'name': self._network_segment_range.name,
})
self.network.create_network_segment_range.assert_called_once_with(
**{
'shared': True,
'network_type': 'vxlan',
'minimum': self._network_segment_range.minimum,
'maximum': self._network_segment_range.maximum,
'name': self._network_segment_range.name,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -272,11 +307,16 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
def test_create_all_options(self):
arglist = [
'--private',
'--project', self._network_segment_range.project_id,
'--network-type', self._network_segment_range.network_type,
'--physical-network', self._network_segment_range.physical_network,
'--minimum', str(self._network_segment_range.minimum),
'--maximum', str(self._network_segment_range.maximum),
'--project',
self._network_segment_range.project_id,
'--network-type',
self._network_segment_range.network_type,
'--physical-network',
self._network_segment_range.physical_network,
'--minimum',
str(self._network_segment_range.minimum),
'--maximum',
str(self._network_segment_range.maximum),
self._network_segment_range.name,
]
verifylist = [
@ -292,22 +332,23 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
self.network.create_network_segment_range.assert_called_once_with(**{
'shared': self._network_segment_range.shared,
'project_id': mock.ANY,
'network_type': self._network_segment_range.network_type,
'physical_network': self._network_segment_range.physical_network,
'minimum': self._network_segment_range.minimum,
'maximum': self._network_segment_range.maximum,
'name': self._network_segment_range.name,
})
self.network.create_network_segment_range.assert_called_once_with(
**{
'shared': self._network_segment_range.shared,
'project_id': mock.ANY,
'network_type': self._network_segment_range.network_type,
'physical_network': self._network_segment_range.physical_network, # noqa: E501
'minimum': self._network_segment_range.minimum,
'maximum': self._network_segment_range.maximum,
'name': self._network_segment_range.name,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
class TestDeleteNetworkSegmentRange(TestNetworkSegmentRange):
# The network segment ranges to delete.
_network_segment_ranges = network_fakes.create_network_segment_ranges()
@ -316,15 +357,15 @@ class TestDeleteNetworkSegmentRange(TestNetworkSegmentRange):
self.network.find_extension = mock.Mock()
self.network.delete_network_segment_range = mock.Mock(
return_value=None)
return_value=None
)
self.network.find_network_segment_range = mock.Mock(
side_effect=self._network_segment_ranges
)
# Get the command object to test
self.cmd = network_segment_range.DeleteNetworkSegmentRange(
self.app,
self.namespace
self.app, self.namespace
)
def test_delete(self):
@ -361,41 +402,46 @@ class TestDeleteNetworkSegmentRange(TestNetworkSegmentRange):
self.assertIsNone(result)
def test_delete_multiple_with_exception(self):
arglist = [
self._network_segment_ranges[0].id,
'doesnotexist'
]
arglist = [self._network_segment_ranges[0].id, 'doesnotexist']
verifylist = [
('network_segment_range',
[self._network_segment_ranges[0].id, 'doesnotexist']),
(
'network_segment_range',
[self._network_segment_ranges[0].id, 'doesnotexist'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._network_segment_ranges[0],
exceptions.CommandError]
self.network.find_network_segment_range = (
mock.Mock(side_effect=find_mock_result)
find_mock_result = [
self._network_segment_ranges[0],
exceptions.CommandError,
]
self.network.find_network_segment_range = mock.Mock(
side_effect=find_mock_result
)
try:
self.cmd.take_action(parsed_args)
self.fail('CommandError should be raised.')
except exceptions.CommandError as e:
self.assertEqual('1 of 2 network segment ranges failed to delete.',
str(e))
self.assertEqual(
'1 of 2 network segment ranges failed to delete.', str(e)
)
self.network.find_network_segment_range.assert_any_call(
self._network_segment_ranges[0].id, ignore_missing=False)
self._network_segment_ranges[0].id, ignore_missing=False
)
self.network.find_network_segment_range.assert_any_call(
'doesnotexist', ignore_missing=False)
'doesnotexist', ignore_missing=False
)
self.network.delete_network_segment_range.assert_called_once_with(
self._network_segment_ranges[0]
)
class TestListNetworkSegmentRange(TestNetworkSegmentRange):
_network_segment_ranges = (
network_fakes.create_network_segment_ranges(count=3))
_network_segment_ranges = network_fakes.create_network_segment_ranges(
count=3
)
columns = (
'ID',
@ -406,7 +452,7 @@ class TestListNetworkSegmentRange(TestNetworkSegmentRange):
'Network Type',
'Physical Network',
'Minimum ID',
'Maximum ID'
'Maximum ID',
)
columns_long = columns + (
'Used',
@ -415,44 +461,50 @@ class TestListNetworkSegmentRange(TestNetworkSegmentRange):
data = []
for _network_segment_range in _network_segment_ranges:
data.append((
_network_segment_range.id,
_network_segment_range.name,
_network_segment_range.default,
_network_segment_range.shared,
_network_segment_range.project_id,
_network_segment_range.network_type,
_network_segment_range.physical_network,
_network_segment_range.minimum,
_network_segment_range.maximum,
))
data.append(
(
_network_segment_range.id,
_network_segment_range.name,
_network_segment_range.default,
_network_segment_range.shared,
_network_segment_range.project_id,
_network_segment_range.network_type,
_network_segment_range.physical_network,
_network_segment_range.minimum,
_network_segment_range.maximum,
)
)
data_long = []
for _network_segment_range in _network_segment_ranges:
data_long.append((
_network_segment_range.id,
_network_segment_range.name,
_network_segment_range.default,
_network_segment_range.shared,
_network_segment_range.project_id,
_network_segment_range.network_type,
_network_segment_range.physical_network,
_network_segment_range.minimum,
_network_segment_range.maximum,
{'3312e4ba67864b2eb53f3f41432f8efc': ['104', '106']},
['100-103', '105'],
))
data_long.append(
(
_network_segment_range.id,
_network_segment_range.name,
_network_segment_range.default,
_network_segment_range.shared,
_network_segment_range.project_id,
_network_segment_range.network_type,
_network_segment_range.physical_network,
_network_segment_range.minimum,
_network_segment_range.maximum,
{'3312e4ba67864b2eb53f3f41432f8efc': ['104', '106']},
['100-103', '105'],
)
)
def setUp(self):
super(TestListNetworkSegmentRange, self).setUp()
# Get the command object to test
self.cmd = network_segment_range.ListNetworkSegmentRange(
self.app, self.namespace)
self.app, self.namespace
)
self.network.find_extension = mock.Mock()
self.network.network_segment_ranges = mock.Mock(
return_value=self._network_segment_ranges)
return_value=self._network_segment_ranges
)
def test_list_no_option(self):
arglist = []
@ -492,22 +544,29 @@ class TestListNetworkSegmentRange(TestNetworkSegmentRange):
class TestSetNetworkSegmentRange(TestNetworkSegmentRange):
# The network segment range to set.
_network_segment_range = network_fakes.create_one_network_segment_range()
# The network segment range updated.
minimum_updated = _network_segment_range.minimum - 5
maximum_updated = _network_segment_range.maximum + 5
available_updated = (list(range(minimum_updated, 104)) + [105] +
list(range(107, maximum_updated + 1)))
_network_segment_range_updated = network_fakes.\
create_one_network_segment_range(
attrs={'minimum': minimum_updated,
'maximum': maximum_updated,
'used': {104: '3312e4ba67864b2eb53f3f41432f8efc',
106: '3312e4ba67864b2eb53f3f41432f8efc'},
'available': available_updated}
available_updated = (
list(range(minimum_updated, 104))
+ [105]
+ list(range(107, maximum_updated + 1))
)
_network_segment_range_updated = (
network_fakes.create_one_network_segment_range(
attrs={
'minimum': minimum_updated,
'maximum': maximum_updated,
'used': {
104: '3312e4ba67864b2eb53f3f41432f8efc',
106: '3312e4ba67864b2eb53f3f41432f8efc',
},
'available': available_updated,
}
)
)
def setUp(self):
super(TestSetNetworkSegmentRange, self).setUp()
@ -518,8 +577,9 @@ class TestSetNetworkSegmentRange(TestNetworkSegmentRange):
)
# Get the command object to test
self.cmd = network_segment_range.SetNetworkSegmentRange(self.app,
self.namespace)
self.cmd = network_segment_range.SetNetworkSegmentRange(
self.app, self.namespace
)
def test_set_no_options(self):
arglist = [
@ -542,9 +602,12 @@ class TestSetNetworkSegmentRange(TestNetworkSegmentRange):
def test_set_all_options(self):
arglist = [
'--name', 'new name',
'--minimum', str(self.minimum_updated),
'--maximum', str(self.maximum_updated),
'--name',
'new name',
'--minimum',
str(self.minimum_updated),
'--maximum',
str(self.maximum_updated),
self._network_segment_range.id,
]
verifylist = [
@ -572,7 +635,6 @@ class TestSetNetworkSegmentRange(TestNetworkSegmentRange):
class TestShowNetworkSegmentRange(TestNetworkSegmentRange):
# The network segment range to show.
_network_segment_range = network_fakes.create_one_network_segment_range()
@ -614,12 +676,14 @@ class TestShowNetworkSegmentRange(TestNetworkSegmentRange):
# Get the command object to test
self.cmd = network_segment_range.ShowNetworkSegmentRange(
self.app, self.namespace)
self.app, self.namespace
)
def test_show_no_options(self):
# Missing required args should bail here
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_show_all_options(self):
arglist = [
@ -633,8 +697,7 @@ class TestShowNetworkSegmentRange(TestNetworkSegmentRange):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_network_segment_range.assert_called_once_with(
self._network_segment_range.id,
ignore_missing=False
self._network_segment_range.id, ignore_missing=False
)
self.assertEqual(self.columns, columns)

View File

@ -15,23 +15,24 @@
from unittest import mock
from openstackclient.network.v2 import network_service_provider \
as service_provider
from openstackclient.network.v2 import (
network_service_provider as service_provider,
)
from openstackclient.tests.unit.network.v2 import fakes
class TestNetworkServiceProvider(fakes.TestNetworkV2):
def setUp(self):
super(TestNetworkServiceProvider, self).setUp()
self.network = self.app.client_manager.network
class TestListNetworkServiceProvider(TestNetworkServiceProvider):
provider_list = \
provider_list = (
fakes.FakeNetworkServiceProvider.create_network_service_providers(
count=2
)
)
columns = (
'Service Type',
@ -42,11 +43,13 @@ class TestListNetworkServiceProvider(TestNetworkServiceProvider):
data = []
for provider in provider_list:
data.append((
provider.service_type,
provider.name,
provider.is_default,
))
data.append(
(
provider.service_type,
provider.name,
provider.is_default,
)
)
def setUp(self):
super(TestListNetworkServiceProvider, self).setUp()
@ -54,9 +57,9 @@ class TestListNetworkServiceProvider(TestNetworkServiceProvider):
return_value=self.provider_list
)
self.cmd = \
service_provider.ListNetworkServiceProvider(self.app,
self.namespace)
self.cmd = service_provider.ListNetworkServiceProvider(
self.app, self.namespace
)
def test_network_service_provider_list(self):
arglist = []

View File

@ -29,7 +29,6 @@ from openstackclient.tests.unit import utils as tests_utils
# Tests for Neutron trunks
#
class TestNetworkTrunk(network_fakes.TestNetworkV2):
def setUp(self):
super().setUp()
@ -46,20 +45,23 @@ class TestCreateNetworkTrunk(TestNetworkTrunk):
domain = identity_fakes_v3.FakeDomain.create_one_domain()
trunk_networks = network_fakes.create_networks(count=2)
parent_port = network_fakes.create_one_port(
attrs={'project_id': project.id,
'network_id': trunk_networks[0]['id']})
attrs={'project_id': project.id, 'network_id': trunk_networks[0]['id']}
)
sub_port = network_fakes.create_one_port(
attrs={'project_id': project.id,
'network_id': trunk_networks[1]['id']})
attrs={'project_id': project.id, 'network_id': trunk_networks[1]['id']}
)
new_trunk = network_fakes.create_one_trunk(
attrs={'project_id': project.id,
'port_id': parent_port['id'],
'sub_ports': {
'port_id': sub_port['id'],
'segmentation_id': 42,
'segmentation_type': 'vlan'}
})
attrs={
'project_id': project.id,
'port_id': parent_port['id'],
'sub_ports': {
'port_id': sub_port['id'],
'segmentation_id': 42,
'segmentation_type': 'vlan',
},
}
)
columns = (
'description',
@ -70,7 +72,7 @@ class TestCreateNetworkTrunk(TestNetworkTrunk):
'project_id',
'status',
'sub_ports',
'tags'
'tags',
)
data = (
new_trunk.description,
@ -88,7 +90,8 @@ class TestCreateNetworkTrunk(TestNetworkTrunk):
super().setUp()
self.network.create_trunk = mock.Mock(return_value=self.new_trunk)
self.network.find_port = mock.Mock(
side_effect=[self.parent_port, self.sub_port])
side_effect=[self.parent_port, self.sub_port]
)
# Get the command object to test
self.cmd = network_trunk.CreateNetworkTrunk(self.app, self.namespace)
@ -100,12 +103,18 @@ class TestCreateNetworkTrunk(TestNetworkTrunk):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
"--parent-port", self.new_trunk['port_id'],
"--parent-port",
self.new_trunk['port_id'],
self.new_trunk['name'],
]
verifylist = [
@ -114,13 +123,15 @@ class TestCreateNetworkTrunk(TestNetworkTrunk):
]
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.network.create_trunk.assert_called_once_with(**{
'name': self.new_trunk['name'],
'admin_state_up': self.new_trunk['admin_state_up'],
'port_id': self.new_trunk['port_id'],
})
self.network.create_trunk.assert_called_once_with(
**{
'name': self.new_trunk['name'],
'admin_state_up': self.new_trunk['admin_state_up'],
'port_id': self.new_trunk['port_id'],
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
@ -129,37 +140,50 @@ class TestCreateNetworkTrunk(TestNetworkTrunk):
subport = self.new_trunk.sub_ports[0]
arglist = [
"--disable",
"--description", self.new_trunk.description,
"--parent-port", self.new_trunk.port_id,
"--subport", 'port=%(port)s,segmentation-type=%(seg_type)s,'
'segmentation-id=%(seg_id)s' % {
"--description",
self.new_trunk.description,
"--parent-port",
self.new_trunk.port_id,
"--subport",
'port=%(port)s,segmentation-type=%(seg_type)s,'
'segmentation-id=%(seg_id)s'
% {
'seg_id': subport['segmentation_id'],
'seg_type': subport['segmentation_type'],
'port': subport['port_id']},
'port': subport['port_id'],
},
self.new_trunk.name,
]
verifylist = [
('name', self.new_trunk.name),
('description', self.new_trunk.description),
('parent_port', self.new_trunk.port_id),
('add_subports', [{
'port': subport['port_id'],
'segmentation-id': str(subport['segmentation_id']),
'segmentation-type': subport['segmentation_type']}]),
(
'add_subports',
[
{
'port': subport['port_id'],
'segmentation-id': str(subport['segmentation_id']),
'segmentation-type': subport['segmentation_type'],
}
],
),
('disable', True),
]
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.network.create_trunk.assert_called_once_with(**{
'name': self.new_trunk.name,
'description': self.new_trunk.description,
'admin_state_up': False,
'port_id': self.new_trunk.port_id,
'sub_ports': [subport],
})
self.network.create_trunk.assert_called_once_with(
**{
'name': self.new_trunk.name,
'description': self.new_trunk.description,
'admin_state_up': False,
'port_id': self.new_trunk.port_id,
'sub_ports': [subport],
}
)
self.assertEqual(self.columns, columns)
data_with_desc = list(self.data)
data_with_desc[0] = self.new_trunk['description']
@ -169,27 +193,38 @@ class TestCreateNetworkTrunk(TestNetworkTrunk):
def test_create_trunk_with_subport_invalid_segmentation_id_fail(self):
subport = self.new_trunk.sub_ports[0]
arglist = [
"--parent-port", self.new_trunk.port_id,
"--subport", "port=%(port)s,segmentation-type=%(seg_type)s,"
"segmentation-id=boom" % {
"--parent-port",
self.new_trunk.port_id,
"--subport",
"port=%(port)s,segmentation-type=%(seg_type)s,"
"segmentation-id=boom"
% {
'seg_type': subport['segmentation_type'],
'port': subport['port_id']},
'port': subport['port_id'],
},
self.new_trunk.name,
]
verifylist = [
('name', self.new_trunk.name),
('parent_port', self.new_trunk.port_id),
('add_subports', [{
'port': subport['port_id'],
'segmentation-id': 'boom',
'segmentation-type': subport['segmentation_type']}]),
(
'add_subports',
[
{
'port': subport['port_id'],
'segmentation-id': 'boom',
'segmentation-type': subport['segmentation_type'],
}
],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
with testtools.ExpectedException(exceptions.CommandError) as e:
self.cmd.take_action(parsed_args)
self.assertEqual("Segmentation-id 'boom' is not an integer",
str(e))
self.assertEqual(
"Segmentation-id 'boom' is not an integer", str(e)
)
def test_create_network_trunk_subports_without_optional_keys(self):
subport = copy.copy(self.new_trunk.sub_ports[0])
@ -197,26 +232,29 @@ class TestCreateNetworkTrunk(TestNetworkTrunk):
subport.pop('segmentation_type')
subport.pop('segmentation_id')
arglist = [
'--parent-port', self.new_trunk.port_id,
'--subport', 'port=%(port)s' % {'port': subport['port_id']},
'--parent-port',
self.new_trunk.port_id,
'--subport',
'port=%(port)s' % {'port': subport['port_id']},
self.new_trunk.name,
]
verifylist = [
('name', self.new_trunk.name),
('parent_port', self.new_trunk.port_id),
('add_subports', [{
'port': subport['port_id']}]),
('add_subports', [{'port': subport['port_id']}]),
]
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.network.create_trunk.assert_called_once_with(**{
'name': self.new_trunk.name,
'admin_state_up': True,
'port_id': self.new_trunk.port_id,
'sub_ports': [subport],
})
self.network.create_trunk.assert_called_once_with(
**{
'name': self.new_trunk.name,
'admin_state_up': True,
'port_id': self.new_trunk.port_id,
'sub_ports': [subport],
}
)
self.assertEqual(self.columns, columns)
data_with_desc = list(self.data)
data_with_desc[0] = self.new_trunk['description']
@ -226,19 +264,29 @@ class TestCreateNetworkTrunk(TestNetworkTrunk):
def test_create_network_trunk_subports_without_required_key_fail(self):
subport = self.new_trunk.sub_ports[0]
arglist = [
'--parent-port', self.new_trunk.port_id,
'--subport', 'segmentation-type=%(seg_type)s,'
'segmentation-id=%(seg_id)s' % {
'--parent-port',
self.new_trunk.port_id,
'--subport',
'segmentation-type=%(seg_type)s,'
'segmentation-id=%(seg_id)s'
% {
'seg_id': subport['segmentation_id'],
'seg_type': subport['segmentation_type']},
'seg_type': subport['segmentation_type'],
},
self.new_trunk.name,
]
verifylist = [
('name', self.new_trunk.name),
('parent_port', self.new_trunk.port_id),
('add_subports', [{
'segmentation_id': str(subport['segmentation_id']),
'segmentation_type': subport['segmentation_type']}]),
(
'add_subports',
[
{
'segmentation_id': str(subport['segmentation_id']),
'segmentation_type': subport['segmentation_type'],
}
],
),
]
with testtools.ExpectedException(argparse.ArgumentTypeError):
@ -251,28 +299,33 @@ class TestDeleteNetworkTrunk(TestNetworkTrunk):
domain = identity_fakes_v3.FakeDomain.create_one_domain()
trunk_networks = network_fakes.create_networks(count=2)
parent_port = network_fakes.create_one_port(
attrs={'project_id': project.id,
'network_id': trunk_networks[0]['id']})
attrs={'project_id': project.id, 'network_id': trunk_networks[0]['id']}
)
sub_port = network_fakes.create_one_port(
attrs={'project_id': project.id,
'network_id': trunk_networks[1]['id']})
attrs={'project_id': project.id, 'network_id': trunk_networks[1]['id']}
)
new_trunks = network_fakes.create_trunks(
attrs={'project_id': project.id,
'port_id': parent_port['id'],
'sub_ports': {
'port_id': sub_port['id'],
'segmentation_id': 42,
'segmentation_type': 'vlan'}
})
attrs={
'project_id': project.id,
'port_id': parent_port['id'],
'sub_ports': {
'port_id': sub_port['id'],
'segmentation_id': 42,
'segmentation_type': 'vlan',
},
}
)
def setUp(self):
super().setUp()
self.network.find_trunk = mock.Mock(
side_effect=[self.new_trunks[0], self.new_trunks[1]])
side_effect=[self.new_trunks[0], self.new_trunks[1]]
)
self.network.delete_trunk = mock.Mock(return_value=None)
self.network.find_port = mock.Mock(
side_effect=[self.parent_port, self.sub_port])
side_effect=[self.parent_port, self.sub_port]
)
self.projects_mock.get.return_value = self.project
self.domains_mock.get.return_value = self.domain
@ -291,7 +344,8 @@ class TestDeleteNetworkTrunk(TestNetworkTrunk):
result = self.cmd.take_action(parsed_args)
self.network.delete_trunk.assert_called_once_with(
self.new_trunks[0].id)
self.new_trunks[0].id
)
self.assertIsNone(result)
def test_delete_trunk_multiple(self):
@ -319,13 +373,13 @@ class TestDeleteNetworkTrunk(TestNetworkTrunk):
'unexist_trunk',
]
verifylist = [
('trunk',
[self.new_trunks[0].name, 'unexist_trunk']),
('trunk', [self.new_trunks[0].name, 'unexist_trunk']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.network.find_trunk = mock.Mock(
side_effect=[self.new_trunks[0], exceptions.CommandError])
side_effect=[self.new_trunks[0], exceptions.CommandError]
)
with testtools.ExpectedException(exceptions.CommandError) as e:
self.cmd.take_action(parsed_args)
self.assertEqual('1 of 2 trunks failed to delete.', str(e))
@ -335,7 +389,6 @@ class TestDeleteNetworkTrunk(TestNetworkTrunk):
class TestShowNetworkTrunk(TestNetworkTrunk):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
# The trunk to set.
@ -349,7 +402,7 @@ class TestShowNetworkTrunk(TestNetworkTrunk):
'project_id',
'status',
'sub_ports',
'tags'
'tags',
)
data = (
new_trunk.description,
@ -378,8 +431,13 @@ class TestShowNetworkTrunk(TestNetworkTrunk):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -402,41 +460,32 @@ class TestListNetworkTrunk(TestNetworkTrunk):
domain = identity_fakes_v3.FakeDomain.create_one_domain()
# Create trunks to be listed.
new_trunks = network_fakes.create_trunks(
{'created_at': '2001-01-01 00:00:00',
'updated_at': '2001-01-01 00:00:00'}, count=3)
{
'created_at': '2001-01-01 00:00:00',
'updated_at': '2001-01-01 00:00:00',
},
count=3,
)
columns = (
'ID',
'Name',
'Parent Port',
'Description'
)
columns_long = columns + (
'Status',
'State',
'Created At',
'Updated At'
)
columns = ('ID', 'Name', 'Parent Port', 'Description')
columns_long = columns + ('Status', 'State', 'Created At', 'Updated At')
data = []
for t in new_trunks:
data.append((
t['id'],
t['name'],
t['port_id'],
t['description']
))
data.append((t['id'], t['name'], t['port_id'], t['description']))
data_long = []
for t in new_trunks:
data_long.append((
t['id'],
t['name'],
t['port_id'],
t['description'],
t['status'],
network_trunk.AdminStateColumn(''),
'2001-01-01 00:00:00',
'2001-01-01 00:00:00',
))
data_long.append(
(
t['id'],
t['name'],
t['port_id'],
t['description'],
t['status'],
network_trunk.AdminStateColumn(''),
'2001-01-01 00:00:00',
'2001-01-01 00:00:00',
)
)
def setUp(self):
super().setUp()
@ -476,25 +525,27 @@ class TestListNetworkTrunk(TestNetworkTrunk):
class TestSetNetworkTrunk(TestNetworkTrunk):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
trunk_networks = network_fakes.create_networks(count=2)
parent_port = network_fakes.create_one_port(
attrs={'project_id': project.id,
'network_id': trunk_networks[0]['id']})
attrs={'project_id': project.id, 'network_id': trunk_networks[0]['id']}
)
sub_port = network_fakes.create_one_port(
attrs={'project_id': project.id,
'network_id': trunk_networks[1]['id']})
attrs={'project_id': project.id, 'network_id': trunk_networks[1]['id']}
)
# Create trunks to be listed.
_trunk = network_fakes.create_one_trunk(
attrs={'project_id': project.id,
'port_id': parent_port['id'],
'sub_ports': {
'port_id': sub_port['id'],
'segmentation_id': 42,
'segmentation_type': 'vlan'}
})
attrs={
'project_id': project.id,
'port_id': parent_port['id'],
'sub_ports': {
'port_id': sub_port['id'],
'segmentation_id': 42,
'segmentation_type': 'vlan',
},
}
)
columns = (
'admin_state_up',
'id',
@ -521,7 +572,8 @@ class TestSetNetworkTrunk(TestNetworkTrunk):
self.network.add_trunk_subports = mock.Mock(return_value=self._trunk)
self.network.find_trunk = mock.Mock(return_value=self._trunk)
self.network.find_port = mock.Mock(
side_effect=[self.sub_port, self.sub_port])
side_effect=[self.sub_port, self.sub_port]
)
self.projects_mock.get.return_value = self.project
self.domains_mock.get.return_value = self.domain
@ -531,7 +583,8 @@ class TestSetNetworkTrunk(TestNetworkTrunk):
def _test_set_network_trunk_attr(self, attr, value):
arglist = [
'--%s' % attr, value,
'--%s' % attr,
value,
self._trunk[attr],
]
verifylist = [
@ -545,8 +598,7 @@ class TestSetNetworkTrunk(TestNetworkTrunk):
attrs = {
attr: value,
}
self.network.update_trunk.assert_called_once_with(
self._trunk, **attrs)
self.network.update_trunk.assert_called_once_with(self._trunk, **attrs)
self.assertIsNone(result)
def test_set_network_trunk_name(self):
@ -571,8 +623,7 @@ class TestSetNetworkTrunk(TestNetworkTrunk):
attrs = {
'admin_state_up': False,
}
self.network.update_trunk.assert_called_once_with(
self._trunk, **attrs)
self.network.update_trunk.assert_called_once_with(self._trunk, **attrs)
self.assertIsNone(result)
def test_set_network_trunk_admin_state_up_enable(self):
@ -591,45 +642,57 @@ class TestSetNetworkTrunk(TestNetworkTrunk):
attrs = {
'admin_state_up': True,
}
self.network.update_trunk.assert_called_once_with(
self._trunk, **attrs)
self.network.update_trunk.assert_called_once_with(self._trunk, **attrs)
self.assertIsNone(result)
def test_set_network_trunk_nothing(self):
arglist = [self._trunk['name'], ]
verifylist = [('trunk', self._trunk['name']), ]
arglist = [
self._trunk['name'],
]
verifylist = [
('trunk', self._trunk['name']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
attrs = {}
self.network.update_trunk.assert_called_once_with(
self._trunk, **attrs)
self.network.update_trunk.assert_called_once_with(self._trunk, **attrs)
self.assertIsNone(result)
def test_set_network_trunk_subports(self):
subport = self._trunk['sub_ports'][0]
arglist = [
'--subport', 'port=%(port)s,segmentation-type=%(seg_type)s,'
'segmentation-id=%(seg_id)s' % {
'--subport',
'port=%(port)s,segmentation-type=%(seg_type)s,'
'segmentation-id=%(seg_id)s'
% {
'seg_id': subport['segmentation_id'],
'seg_type': subport['segmentation_type'],
'port': subport['port_id']},
'port': subport['port_id'],
},
self._trunk['name'],
]
verifylist = [
('trunk', self._trunk['name']),
('set_subports', [{
'port': subport['port_id'],
'segmentation-id': str(subport['segmentation_id']),
'segmentation-type': subport['segmentation_type']}]),
(
'set_subports',
[
{
'port': subport['port_id'],
'segmentation-id': str(subport['segmentation_id']),
'segmentation-type': subport['segmentation_type'],
}
],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.network.add_trunk_subports.assert_called_once_with(
self._trunk, [subport])
self._trunk, [subport]
)
self.assertIsNone(result)
def test_set_network_trunk_subports_without_optional_keys(self):
@ -638,36 +701,46 @@ class TestSetNetworkTrunk(TestNetworkTrunk):
subport.pop('segmentation_type')
subport.pop('segmentation_id')
arglist = [
'--subport', 'port=%(port)s' % {'port': subport['port_id']},
'--subport',
'port=%(port)s' % {'port': subport['port_id']},
self._trunk['name'],
]
verifylist = [
('trunk', self._trunk['name']),
('set_subports', [{
'port': subport['port_id']}]),
('set_subports', [{'port': subport['port_id']}]),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.network.add_trunk_subports.assert_called_once_with(
self._trunk, [subport])
self._trunk, [subport]
)
self.assertIsNone(result)
def test_set_network_trunk_subports_without_required_key_fail(self):
subport = self._trunk['sub_ports'][0]
arglist = [
'--subport', 'segmentation-type=%(seg_type)s,'
'segmentation-id=%(seg_id)s' % {
'--subport',
'segmentation-type=%(seg_type)s,'
'segmentation-id=%(seg_id)s'
% {
'seg_id': subport['segmentation_id'],
'seg_type': subport['segmentation_type']},
'seg_type': subport['segmentation_type'],
},
self._trunk['name'],
]
verifylist = [
('trunk', self._trunk['name']),
('set_subports', [{
'segmentation-id': str(subport['segmentation_id']),
'segmentation-type': subport['segmentation_type']}]),
(
'set_subports',
[
{
'segmentation-id': str(subport['segmentation_id']),
'segmentation-type': subport['segmentation_type'],
}
],
),
]
with testtools.ExpectedException(argparse.ArgumentTypeError):
@ -677,7 +750,8 @@ class TestSetNetworkTrunk(TestNetworkTrunk):
def test_set_trunk_attrs_with_exception(self):
arglist = [
'--name', 'reallylongname',
'--name',
'reallylongname',
self._trunk['name'],
]
verifylist = [
@ -686,22 +760,22 @@ class TestSetNetworkTrunk(TestNetworkTrunk):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.network.update_trunk = (
mock.Mock(side_effect=exceptions.CommandError)
self.network.update_trunk = mock.Mock(
side_effect=exceptions.CommandError
)
with testtools.ExpectedException(exceptions.CommandError) as e:
self.cmd.take_action(parsed_args)
self.assertEqual(
"Failed to set trunk '%s': " % self._trunk['name'],
str(e))
"Failed to set trunk '%s': " % self._trunk['name'], str(e)
)
attrs = {'name': 'reallylongname'}
self.network.update_trunk.assert_called_once_with(
self._trunk, **attrs)
self.network.update_trunk.assert_called_once_with(self._trunk, **attrs)
self.network.add_trunk_subports.assert_not_called()
def test_set_trunk_add_subport_with_exception(self):
arglist = [
'--subport', 'port=invalid_subport',
'--subport',
'port=invalid_subport',
self._trunk['name'],
]
verifylist = [
@ -710,24 +784,25 @@ class TestSetNetworkTrunk(TestNetworkTrunk):
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.network.add_trunk_subports = (
mock.Mock(side_effect=exceptions.CommandError)
self.network.add_trunk_subports = mock.Mock(
side_effect=exceptions.CommandError
)
self.network.find_port = mock.Mock(
return_value={'id': 'invalid_subport'}
)
self.network.find_port = (mock.Mock(
return_value={'id': 'invalid_subport'}))
with testtools.ExpectedException(exceptions.CommandError) as e:
self.cmd.take_action(parsed_args)
self.assertEqual(
"Failed to add subports to trunk '%s': " % self._trunk['name'],
str(e))
self.network.update_trunk.assert_called_once_with(
self._trunk)
str(e),
)
self.network.update_trunk.assert_called_once_with(self._trunk)
self.network.add_trunk_subports.assert_called_once_with(
self._trunk, [{'port_id': 'invalid_subport'}])
self._trunk, [{'port_id': 'invalid_subport'}]
)
class TestListNetworkSubport(TestNetworkTrunk):
_trunk = network_fakes.create_one_trunk()
_subports = _trunk['sub_ports']
@ -738,25 +813,29 @@ class TestListNetworkSubport(TestNetworkTrunk):
)
data = []
for s in _subports:
data.append((
s['port_id'],
s['segmentation_type'],
s['segmentation_id'],
))
data.append(
(
s['port_id'],
s['segmentation_type'],
s['segmentation_id'],
)
)
def setUp(self):
super().setUp()
self.network.find_trunk = mock.Mock(return_value=self._trunk)
self.network.get_trunk_subports = mock.Mock(
return_value={network_trunk.SUB_PORTS: self._subports})
return_value={network_trunk.SUB_PORTS: self._subports}
)
# Get the command object to test
self.cmd = network_trunk.ListNetworkSubport(self.app, self.namespace)
def test_subport_list(self):
arglist = [
'--trunk', self._trunk['name'],
'--trunk',
self._trunk['name'],
]
verifylist = [
('trunk', self._trunk['name']),
@ -774,19 +853,22 @@ class TestUnsetNetworkTrunk(TestNetworkTrunk):
domain = identity_fakes_v3.FakeDomain.create_one_domain()
trunk_networks = network_fakes.create_networks(count=2)
parent_port = network_fakes.create_one_port(
attrs={'project_id': project.id,
'network_id': trunk_networks[0]['id']})
attrs={'project_id': project.id, 'network_id': trunk_networks[0]['id']}
)
sub_port = network_fakes.create_one_port(
attrs={'project_id': project.id,
'network_id': trunk_networks[1]['id']})
attrs={'project_id': project.id, 'network_id': trunk_networks[1]['id']}
)
_trunk = network_fakes.create_one_trunk(
attrs={'project_id': project.id,
'port_id': parent_port['id'],
'sub_ports': {
'port_id': sub_port['id'],
'segmentation_id': 42,
'segmentation_type': 'vlan'}
})
attrs={
'project_id': project.id,
'port_id': parent_port['id'],
'sub_ports': {
'port_id': sub_port['id'],
'segmentation_id': 42,
'segmentation_type': 'vlan',
},
}
)
columns = (
'admin_state_up',
@ -812,7 +894,8 @@ class TestUnsetNetworkTrunk(TestNetworkTrunk):
self.network.find_trunk = mock.Mock(return_value=self._trunk)
self.network.find_port = mock.Mock(
side_effect=[self.sub_port, self.sub_port])
side_effect=[self.sub_port, self.sub_port]
)
self.network.delete_trunk_subports = mock.Mock(return_value=None)
# Get the command object to test
@ -821,7 +904,8 @@ class TestUnsetNetworkTrunk(TestNetworkTrunk):
def test_unset_network_trunk_subport(self):
subport = self._trunk['sub_ports'][0]
arglist = [
"--subport", subport['port_id'],
"--subport",
subport['port_id'],
self._trunk['name'],
]
@ -835,8 +919,7 @@ class TestUnsetNetworkTrunk(TestNetworkTrunk):
result = self.cmd.take_action(parsed_args)
self.network.delete_trunk_subports.assert_called_once_with(
self._trunk,
[{'port_id': subport['port_id']}]
self._trunk, [{'port_id': subport['port_id']}]
)
self.assertIsNone(result)
@ -847,5 +930,10 @@ class TestUnsetNetworkTrunk(TestNetworkTrunk):
verifylist = [
('trunk', self._trunk['name']),
]
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -23,7 +23,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestSecurityGroupCompute(compute_fakes.TestComputev2):
def setUp(self):
super(TestSecurityGroupCompute, self).setUp()
@ -31,17 +30,15 @@ class TestSecurityGroupCompute(compute_fakes.TestComputev2):
self.compute = self.app.client_manager.compute
@mock.patch(
'openstackclient.api.compute_v2.APIv2.security_group_create'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.security_group_create')
class TestCreateSecurityGroupCompute(TestSecurityGroupCompute):
project = identity_fakes.FakeProject.create_one_project()
domain = identity_fakes.FakeDomain.create_one_domain()
# The security group to be shown.
_security_group = \
_security_group = (
compute_fakes.FakeSecurityGroup.create_one_security_group()
)
columns = (
'description',
@ -68,8 +65,9 @@ class TestCreateSecurityGroupCompute(TestSecurityGroupCompute):
self.cmd = security_group.CreateSecurityGroup(self.app, None)
def test_security_group_create_no_options(self, sg_mock):
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_security_group_create_min_options(self, sg_mock):
sg_mock.return_value = self._security_group
@ -93,7 +91,8 @@ class TestCreateSecurityGroupCompute(TestSecurityGroupCompute):
def test_security_group_create_all_options(self, sg_mock):
sg_mock.return_value = self._security_group
arglist = [
'--description', self._security_group['description'],
'--description',
self._security_group['description'],
self._security_group['name'],
]
verifylist = [
@ -112,14 +111,10 @@ class TestCreateSecurityGroupCompute(TestSecurityGroupCompute):
self.assertCountEqual(self.data, data)
@mock.patch(
'openstackclient.api.compute_v2.APIv2.security_group_delete'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.security_group_delete')
class TestDeleteSecurityGroupCompute(TestSecurityGroupCompute):
# The security groups to be deleted.
_security_groups = \
compute_fakes.FakeSecurityGroup.create_security_groups()
_security_groups = compute_fakes.FakeSecurityGroup.create_security_groups()
def setUp(self):
super(TestDeleteSecurityGroupCompute, self).setUp()
@ -128,7 +123,8 @@ class TestDeleteSecurityGroupCompute(TestSecurityGroupCompute):
self.compute.api.security_group_find = (
compute_fakes.FakeSecurityGroup.get_security_groups(
self._security_groups)
self._security_groups
)
)
# Get the command object to test
@ -173,17 +169,19 @@ class TestDeleteSecurityGroupCompute(TestSecurityGroupCompute):
def test_security_group_multi_delete_with_exception(self, sg_mock):
sg_mock.return_value = mock.Mock(return_value=None)
sg_mock.side_effect = ([
sg_mock.side_effect = [
mock.Mock(return_value=None),
exceptions.CommandError,
])
]
arglist = [
self._security_groups[0]['id'],
'unexist_security_group',
]
verifylist = [
('group',
[self._security_groups[0]['id'], 'unexist_security_group']),
(
'group',
[self._security_groups[0]['id'], 'unexist_security_group'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -197,14 +195,12 @@ class TestDeleteSecurityGroupCompute(TestSecurityGroupCompute):
sg_mock.assert_any_call('unexist_security_group')
@mock.patch(
'openstackclient.api.compute_v2.APIv2.security_group_list'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.security_group_list')
class TestListSecurityGroupCompute(TestSecurityGroupCompute):
# The security group to be listed.
_security_groups = \
compute_fakes.FakeSecurityGroup.create_security_groups(count=3)
_security_groups = compute_fakes.FakeSecurityGroup.create_security_groups(
count=3
)
columns = (
'ID',
@ -220,19 +216,23 @@ class TestListSecurityGroupCompute(TestSecurityGroupCompute):
data = []
for grp in _security_groups:
data.append((
grp['id'],
grp['name'],
grp['description'],
))
data.append(
(
grp['id'],
grp['name'],
grp['description'],
)
)
data_all_projects = []
for grp in _security_groups:
data_all_projects.append((
grp['id'],
grp['name'],
grp['description'],
grp['tenant_id'],
))
data_all_projects.append(
(
grp['id'],
grp['name'],
grp['description'],
grp['tenant_id'],
)
)
def setUp(self):
super(TestListSecurityGroupCompute, self).setUp()
@ -275,14 +275,12 @@ class TestListSecurityGroupCompute(TestSecurityGroupCompute):
self.assertCountEqual(self.data_all_projects, list(data))
@mock.patch(
'openstackclient.api.compute_v2.APIv2.security_group_set'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.security_group_set')
class TestSetSecurityGroupCompute(TestSecurityGroupCompute):
# The security group to be set.
_security_group = \
_security_group = (
compute_fakes.FakeSecurityGroup.create_one_security_group()
)
def setUp(self):
super(TestSetSecurityGroupCompute, self).setUp()
@ -290,14 +288,16 @@ class TestSetSecurityGroupCompute(TestSecurityGroupCompute):
self.app.client_manager.network_endpoint_enabled = False
self.compute.api.security_group_find = mock.Mock(
return_value=self._security_group)
return_value=self._security_group
)
# Get the command object to test
self.cmd = security_group.SetSecurityGroup(self.app, None)
def test_security_group_set_no_options(self, sg_mock):
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_security_group_set_no_updates(self, sg_mock):
sg_mock.return_value = mock.Mock(return_value=None)
@ -323,8 +323,10 @@ class TestSetSecurityGroupCompute(TestSecurityGroupCompute):
new_name = 'new-' + self._security_group['name']
new_description = 'new-' + self._security_group['description']
arglist = [
'--name', new_name,
'--description', new_description,
'--name',
new_name,
'--description',
new_description,
self._security_group['name'],
]
verifylist = [
@ -337,27 +339,24 @@ class TestSetSecurityGroupCompute(TestSecurityGroupCompute):
result = self.cmd.take_action(parsed_args)
sg_mock.assert_called_once_with(
self._security_group,
new_name,
new_description
self._security_group, new_name, new_description
)
self.assertIsNone(result)
@mock.patch(
'openstackclient.api.compute_v2.APIv2.security_group_find'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.security_group_find')
class TestShowSecurityGroupCompute(TestSecurityGroupCompute):
# The security group rule to be shown with the group.
_security_group_rule = \
_security_group_rule = (
compute_fakes.FakeSecurityGroupRule.create_one_security_group_rule()
)
# The security group to be shown.
_security_group = \
_security_group = (
compute_fakes.FakeSecurityGroup.create_one_security_group(
attrs={'rules': [_security_group_rule]}
)
)
columns = (
'description',
@ -384,8 +383,9 @@ class TestShowSecurityGroupCompute(TestSecurityGroupCompute):
self.cmd = security_group.ShowSecurityGroup(self.app, None)
def test_security_group_show_no_options(self, sg_mock):
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_security_group_show_all_options(self, sg_mock):
sg_mock.return_value = self._security_group

View File

@ -23,7 +23,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestSecurityGroupNetwork(network_fakes.TestNetworkV2):
def setUp(self):
super(TestSecurityGroupNetwork, self).setUp()
@ -36,12 +35,12 @@ class TestSecurityGroupNetwork(network_fakes.TestNetworkV2):
class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork):
project = identity_fakes.FakeProject.create_one_project()
domain = identity_fakes.FakeDomain.create_one_domain()
# The security group to be created.
_security_group = (
network_fakes.FakeSecurityGroup.create_one_security_group())
network_fakes.FakeSecurityGroup.create_one_security_group()
)
columns = (
'description',
@ -67,7 +66,8 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork):
super(TestCreateSecurityGroupNetwork, self).setUp()
self.network.create_security_group = mock.Mock(
return_value=self._security_group)
return_value=self._security_group
)
self.projects_mock.get.return_value = self.project
self.domains_mock.get.return_value = self.domain
@ -77,8 +77,9 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork):
self.cmd = security_group.CreateSecurityGroup(self.app, self.namespace)
def test_create_no_options(self):
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_create_min_options(self):
arglist = [
@ -91,18 +92,23 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.create_security_group.assert_called_once_with(**{
'description': self._security_group.name,
'name': self._security_group.name,
})
self.network.create_security_group.assert_called_once_with(
**{
'description': self._security_group.name,
'name': self._security_group.name,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
def test_create_all_options(self):
arglist = [
'--description', self._security_group.description,
'--project', self.project.name,
'--project-domain', self.domain.name,
'--description',
self._security_group.description,
'--project',
self.project.name,
'--project-domain',
self.domain.name,
'--stateful',
self._security_group.name,
]
@ -117,12 +123,14 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.create_security_group.assert_called_once_with(**{
'description': self._security_group.description,
'stateful': self._security_group.stateful,
'name': self._security_group.name,
'project_id': self.project.id,
})
self.network.create_security_group.assert_called_once_with(
**{
'description': self._security_group.description,
'stateful': self._security_group.stateful,
'name': self._security_group.name,
'project_id': self.project.id,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
@ -142,16 +150,18 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork):
verifylist.append(('no_tag', True))
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.network.create_security_group.assert_called_once_with(**{
'description': self._security_group.name,
'name': self._security_group.name,
})
self.network.create_security_group.assert_called_once_with(
**{
'description': self._security_group.name,
'name': self._security_group.name,
}
)
if add_tags:
self.network.set_tags.assert_called_once_with(
self._security_group,
tests_utils.CompareBySet(['red', 'blue']))
self._security_group, tests_utils.CompareBySet(['red', 'blue'])
)
else:
self.assertFalse(self.network.set_tags.called)
self.assertEqual(self.columns, columns)
@ -165,10 +175,8 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork):
class TestDeleteSecurityGroupNetwork(TestSecurityGroupNetwork):
# The security groups to be deleted.
_security_groups = \
network_fakes.FakeSecurityGroup.create_security_groups()
_security_groups = network_fakes.FakeSecurityGroup.create_security_groups()
def setUp(self):
super(TestDeleteSecurityGroupNetwork, self).setUp()
@ -177,7 +185,8 @@ class TestDeleteSecurityGroupNetwork(TestSecurityGroupNetwork):
self.network.find_security_group = (
network_fakes.FakeSecurityGroup.get_security_groups(
self._security_groups)
self._security_groups
)
)
# Get the command object to test
@ -195,7 +204,8 @@ class TestDeleteSecurityGroupNetwork(TestSecurityGroupNetwork):
result = self.cmd.take_action(parsed_args)
self.network.delete_security_group.assert_called_once_with(
self._security_groups[0])
self._security_groups[0]
)
self.assertIsNone(result)
def test_multi_security_groups_delete(self):
@ -223,14 +233,16 @@ class TestDeleteSecurityGroupNetwork(TestSecurityGroupNetwork):
'unexist_security_group',
]
verifylist = [
('group',
[self._security_groups[0].name, 'unexist_security_group']),
(
'group',
[self._security_groups[0].name, 'unexist_security_group'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._security_groups[0], exceptions.CommandError]
self.network.find_security_group = (
mock.Mock(side_effect=find_mock_result)
self.network.find_security_group = mock.Mock(
side_effect=find_mock_result
)
try:
@ -240,19 +252,21 @@ class TestDeleteSecurityGroupNetwork(TestSecurityGroupNetwork):
self.assertEqual('1 of 2 groups failed to delete.', str(e))
self.network.find_security_group.assert_any_call(
self._security_groups[0].name, ignore_missing=False)
self._security_groups[0].name, ignore_missing=False
)
self.network.find_security_group.assert_any_call(
'unexist_security_group', ignore_missing=False)
'unexist_security_group', ignore_missing=False
)
self.network.delete_security_group.assert_called_once_with(
self._security_groups[0]
)
class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
# The security group to be listed.
_security_groups = \
network_fakes.FakeSecurityGroup.create_security_groups(count=3)
_security_groups = network_fakes.FakeSecurityGroup.create_security_groups(
count=3
)
columns = (
'ID',
@ -264,19 +278,22 @@ class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
data = []
for grp in _security_groups:
data.append((
grp.id,
grp.name,
grp.description,
grp.project_id,
grp.tags,
))
data.append(
(
grp.id,
grp.name,
grp.description,
grp.project_id,
grp.tags,
)
)
def setUp(self):
super(TestListSecurityGroupNetwork, self).setUp()
self.network.security_groups = mock.Mock(
return_value=self._security_groups)
return_value=self._security_groups
)
# Get the command object to test
self.cmd = security_group.ListSecurityGroup(self.app, self.namespace)
@ -291,7 +308,8 @@ class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.security_groups.assert_called_once_with(
fields=security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE)
fields=security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -307,7 +325,8 @@ class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.security_groups.assert_called_once_with(
fields=security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE)
fields=security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
@ -315,7 +334,8 @@ class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
project = identity_fakes.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project',
project.id,
]
verifylist = [
('project', project.id),
@ -325,7 +345,8 @@ class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
columns, data = self.cmd.take_action(parsed_args)
filters = {
'project_id': project.id,
'fields': security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE}
'fields': security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE,
}
self.network.security_groups.assert_called_once_with(**filters)
self.assertEqual(self.columns, columns)
@ -335,8 +356,10 @@ class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
project = identity_fakes.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project-domain', project.domain_id,
'--project',
project.id,
'--project-domain',
project.domain_id,
]
verifylist = [
('project', project.id),
@ -347,7 +370,8 @@ class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
columns, data = self.cmd.take_action(parsed_args)
filters = {
'project_id': project.id,
'fields': security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE}
'fields': security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE,
}
self.network.security_groups.assert_called_once_with(**filters)
self.assertEqual(self.columns, columns)
@ -355,10 +379,14 @@ class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
def test_list_with_tag_options(self):
arglist = [
'--tags', 'red,blue',
'--any-tags', 'red,green',
'--not-tags', 'orange,yellow',
'--not-any-tags', 'black,white',
'--tags',
'red,blue',
'--any-tags',
'red,green',
'--not-tags',
'orange,yellow',
'--not-any-tags',
'black,white',
]
verifylist = [
('tags', ['red', 'blue']),
@ -370,22 +398,25 @@ class TestListSecurityGroupNetwork(TestSecurityGroupNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.security_groups.assert_called_once_with(
**{'tags': 'red,blue',
'any_tags': 'red,green',
'not_tags': 'orange,yellow',
'not_any_tags': 'black,white',
'fields': security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE}
**{
'tags': 'red,blue',
'any_tags': 'red,green',
'not_tags': 'orange,yellow',
'not_any_tags': 'black,white',
'fields': security_group.ListSecurityGroup.FIELDS_TO_RETRIEVE,
}
)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
class TestSetSecurityGroupNetwork(TestSecurityGroupNetwork):
# The security group to be set.
_security_group = (
network_fakes.FakeSecurityGroup.create_one_security_group(
attrs={'tags': ['green', 'red']}))
attrs={'tags': ['green', 'red']}
)
)
def setUp(self):
super(TestSetSecurityGroupNetwork, self).setUp()
@ -393,15 +424,17 @@ class TestSetSecurityGroupNetwork(TestSecurityGroupNetwork):
self.network.update_security_group = mock.Mock(return_value=None)
self.network.find_security_group = mock.Mock(
return_value=self._security_group)
return_value=self._security_group
)
self.network.set_tags = mock.Mock(return_value=None)
# Get the command object to test
self.cmd = security_group.SetSecurityGroup(self.app, self.namespace)
def test_set_no_options(self):
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_set_no_updates(self):
arglist = [
@ -415,8 +448,7 @@ class TestSetSecurityGroupNetwork(TestSecurityGroupNetwork):
result = self.cmd.take_action(parsed_args)
self.network.update_security_group.assert_called_once_with(
self._security_group,
**{}
self._security_group, **{}
)
self.assertIsNone(result)
@ -424,8 +456,10 @@ class TestSetSecurityGroupNetwork(TestSecurityGroupNetwork):
new_name = 'new-' + self._security_group.name
new_description = 'new-' + self._security_group.description
arglist = [
'--name', new_name,
'--description', new_description,
'--name',
new_name,
'--description',
new_description,
'--stateful',
self._security_group.name,
]
@ -445,8 +479,7 @@ class TestSetSecurityGroupNetwork(TestSecurityGroupNetwork):
'stateful': True,
}
self.network.update_security_group.assert_called_once_with(
self._security_group,
**attrs
self._security_group, **attrs
)
self.assertIsNone(result)
@ -460,16 +493,15 @@ class TestSetSecurityGroupNetwork(TestSecurityGroupNetwork):
verifylist = [('no_tag', True)]
expected_args = []
arglist.append(self._security_group.name)
verifylist.append(
('group', self._security_group.name))
verifylist.append(('group', self._security_group.name))
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.assertTrue(self.network.update_security_group.called)
self.network.set_tags.assert_called_once_with(
self._security_group,
tests_utils.CompareBySet(expected_args))
self._security_group, tests_utils.CompareBySet(expected_args)
)
self.assertIsNone(result)
def test_set_with_tags(self):
@ -480,16 +512,17 @@ class TestSetSecurityGroupNetwork(TestSecurityGroupNetwork):
class TestShowSecurityGroupNetwork(TestSecurityGroupNetwork):
# The security group rule to be shown with the group.
_security_group_rule = \
_security_group_rule = (
network_fakes.FakeSecurityGroupRule.create_one_security_group_rule()
)
# The security group to be shown.
_security_group = \
_security_group = (
network_fakes.FakeSecurityGroup.create_one_security_group(
attrs={'security_group_rules': [_security_group_rule._info]}
)
)
columns = (
'description',
@ -507,7 +540,8 @@ class TestShowSecurityGroupNetwork(TestSecurityGroupNetwork):
_security_group.name,
_security_group.project_id,
security_group.NetworkSecurityGroupRulesColumn(
[_security_group_rule._info]),
[_security_group_rule._info]
),
_security_group.stateful,
_security_group.tags,
)
@ -516,14 +550,16 @@ class TestShowSecurityGroupNetwork(TestSecurityGroupNetwork):
super(TestShowSecurityGroupNetwork, self).setUp()
self.network.find_security_group = mock.Mock(
return_value=self._security_group)
return_value=self._security_group
)
# Get the command object to test
self.cmd = security_group.ShowSecurityGroup(self.app, self.namespace)
def test_show_no_options(self):
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_show_all_options(self):
arglist = [
@ -537,17 +573,19 @@ class TestShowSecurityGroupNetwork(TestSecurityGroupNetwork):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_security_group.assert_called_once_with(
self._security_group.id, ignore_missing=False)
self._security_group.id, ignore_missing=False
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
class TestUnsetSecurityGroupNetwork(TestSecurityGroupNetwork):
# The security group to be unset.
_security_group = (
network_fakes.FakeSecurityGroup.create_one_security_group(
attrs={'tags': ['green', 'red']}))
attrs={'tags': ['green', 'red']}
)
)
def setUp(self):
super(TestUnsetSecurityGroupNetwork, self).setUp()
@ -555,15 +593,17 @@ class TestUnsetSecurityGroupNetwork(TestSecurityGroupNetwork):
self.network.update_security_group = mock.Mock(return_value=None)
self.network.find_security_group = mock.Mock(
return_value=self._security_group)
return_value=self._security_group
)
self.network.set_tags = mock.Mock(return_value=None)
# Get the command object to test
self.cmd = security_group.UnsetSecurityGroup(self.app, self.namespace)
def test_set_no_options(self):
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_set_no_updates(self):
arglist = [
@ -590,16 +630,15 @@ class TestUnsetSecurityGroupNetwork(TestSecurityGroupNetwork):
verifylist = [('all_tag', True)]
expected_args = []
arglist.append(self._security_group.name)
verifylist.append(
('group', self._security_group.name))
verifylist.append(('group', self._security_group.name))
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.assertFalse(self.network.update_security_group.called)
self.network.set_tags.assert_called_once_with(
self._security_group,
tests_utils.CompareBySet(expected_args))
self._security_group, tests_utils.CompareBySet(expected_args)
)
self.assertIsNone(result)
def test_unset_with_tags(self):

View File

@ -24,7 +24,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestSecurityGroupRuleCompute(compute_fakes.TestComputev2):
def setUp(self):
super(TestSecurityGroupRuleCompute, self).setUp()
@ -32,11 +31,8 @@ class TestSecurityGroupRuleCompute(compute_fakes.TestComputev2):
self.compute = self.app.client_manager.compute
@mock.patch(
'openstackclient.api.compute_v2.APIv2.security_group_rule_create'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.security_group_rule_create')
class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
project = identity_fakes.FakeProject.create_one_project()
domain = identity_fakes.FakeDomain.create_one_domain()
@ -44,16 +40,22 @@ class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
_security_group_rule = None
# The security group that will contain the rule created.
_security_group = \
_security_group = (
compute_fakes.FakeSecurityGroup.create_one_security_group()
)
def _setup_security_group_rule(self, attrs=None):
self._security_group_rule = \
self._security_group_rule = (
compute_fakes.FakeSecurityGroupRule.create_one_security_group_rule(
attrs)
expected_columns, expected_data = \
security_group_rule._format_security_group_rule_show(
self._security_group_rule)
attrs
)
)
(
expected_columns,
expected_data,
) = security_group_rule._format_security_group_rule_show(
self._security_group_rule
)
return expected_columns, expected_data
def setUp(self):
@ -69,60 +71,100 @@ class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
self.cmd = security_group_rule.CreateSecurityGroupRule(self.app, None)
def test_security_group_rule_create_no_options(self, sgr_mock):
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_security_group_rule_create_all_remote_options(self, sgr_mock):
arglist = [
'--remote-ip', '10.10.0.0/24',
'--remote-group', self._security_group['id'],
'--remote-ip',
'10.10.0.0/24',
'--remote-group',
self._security_group['id'],
self._security_group['id'],
]
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, arglist, [])
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
[],
)
def test_security_group_rule_create_bad_protocol(self, sgr_mock):
arglist = [
'--protocol', 'foo',
'--protocol',
'foo',
self._security_group['id'],
]
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, arglist, [])
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
[],
)
def test_security_group_rule_create_all_protocol_options(self, sgr_mock):
arglist = [
'--protocol', 'tcp',
'--proto', 'tcp',
'--protocol',
'tcp',
'--proto',
'tcp',
self._security_group['id'],
]
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, arglist, [])
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
[],
)
def test_security_group_rule_create_network_options(self, sgr_mock):
arglist = [
'--ingress',
'--ethertype', 'IPv4',
'--icmp-type', '3',
'--icmp-code', '11',
'--project', self.project.name,
'--project-domain', self.domain.name,
'--ethertype',
'IPv4',
'--icmp-type',
'3',
'--icmp-code',
'11',
'--project',
self.project.name,
'--project-domain',
self.domain.name,
self._security_group['id'],
]
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, arglist, [])
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
[],
)
def test_security_group_rule_create_default_rule(self, sgr_mock):
expected_columns, expected_data = self._setup_security_group_rule()
sgr_mock.return_value = self._security_group_rule
dst_port = str(self._security_group_rule['from_port']) + ':' + \
str(self._security_group_rule['to_port'])
dst_port = (
str(self._security_group_rule['from_port'])
+ ':'
+ str(self._security_group_rule['to_port'])
)
arglist = [
'--dst-port', dst_port,
'--dst-port',
dst_port,
self._security_group['id'],
]
verifylist = [
('dst_port', (self._security_group_rule['from_port'],
self._security_group_rule['to_port'])),
(
'dst_port',
(
self._security_group_rule['from_port'],
self._security_group_rule['to_port'],
),
),
('group', self._security_group['id']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -143,20 +185,29 @@ class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
self.assertEqual(expected_data, data)
def test_security_group_rule_create_remote_group(self, sgr_mock):
expected_columns, expected_data = self._setup_security_group_rule({
'from_port': 22,
'to_port': 22,
'group': {'name': self._security_group['name']},
})
expected_columns, expected_data = self._setup_security_group_rule(
{
'from_port': 22,
'to_port': 22,
'group': {'name': self._security_group['name']},
}
)
sgr_mock.return_value = self._security_group_rule
arglist = [
'--dst-port', str(self._security_group_rule['from_port']),
'--remote-group', self._security_group['name'],
'--dst-port',
str(self._security_group_rule['from_port']),
'--remote-group',
self._security_group['name'],
self._security_group['id'],
]
verifylist = [
('dst_port', (self._security_group_rule['from_port'],
self._security_group_rule['to_port'])),
(
'dst_port',
(
self._security_group_rule['from_port'],
self._security_group_rule['to_port'],
),
),
('remote_group', self._security_group['name']),
('group', self._security_group['id']),
]
@ -178,16 +229,20 @@ class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
self.assertEqual(expected_data, data)
def test_security_group_rule_create_remote_ip(self, sgr_mock):
expected_columns, expected_data = self._setup_security_group_rule({
'ip_protocol': 'icmp',
'from_port': -1,
'to_port': -1,
'ip_range': {'cidr': '10.0.2.0/24'},
})
expected_columns, expected_data = self._setup_security_group_rule(
{
'ip_protocol': 'icmp',
'from_port': -1,
'to_port': -1,
'ip_range': {'cidr': '10.0.2.0/24'},
}
)
sgr_mock.return_value = self._security_group_rule
arglist = [
'--protocol', self._security_group_rule['ip_protocol'],
'--remote-ip', self._security_group_rule['ip_range']['cidr'],
'--protocol',
self._security_group_rule['ip_protocol'],
'--remote-ip',
self._security_group_rule['ip_range']['cidr'],
self._security_group['id'],
]
verifylist = [
@ -213,16 +268,20 @@ class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
self.assertEqual(expected_data, data)
def test_security_group_rule_create_proto_option(self, sgr_mock):
expected_columns, expected_data = self._setup_security_group_rule({
'ip_protocol': 'icmp',
'from_port': -1,
'to_port': -1,
'ip_range': {'cidr': '10.0.2.0/24'},
})
expected_columns, expected_data = self._setup_security_group_rule(
{
'ip_protocol': 'icmp',
'from_port': -1,
'to_port': -1,
'ip_range': {'cidr': '10.0.2.0/24'},
}
)
sgr_mock.return_value = self._security_group_rule
arglist = [
'--proto', self._security_group_rule['ip_protocol'],
'--remote-ip', self._security_group_rule['ip_range']['cidr'],
'--proto',
self._security_group_rule['ip_protocol'],
'--remote-ip',
self._security_group_rule['ip_range']['cidr'],
self._security_group['id'],
]
verifylist = [
@ -249,15 +308,14 @@ class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
self.assertEqual(expected_data, data)
@mock.patch(
'openstackclient.api.compute_v2.APIv2.security_group_rule_delete'
)
@mock.patch('openstackclient.api.compute_v2.APIv2.security_group_rule_delete')
class TestDeleteSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
# The security group rule to be deleted.
_security_group_rules = \
_security_group_rules = (
compute_fakes.FakeSecurityGroupRule.create_security_group_rules(
count=2)
count=2
)
)
def setUp(self):
super(TestDeleteSecurityGroupRuleCompute, self).setUp()
@ -278,8 +336,7 @@ class TestDeleteSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
result = self.cmd.take_action(parsed_args)
sgr_mock.assert_called_once_with(
self._security_group_rules[0]['id'])
sgr_mock.assert_called_once_with(self._security_group_rules[0]['id'])
self.assertIsNone(result)
def test_security_group_rule_delete_multi(self, sgr_mock):
@ -307,8 +364,7 @@ class TestDeleteSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
'unexist_rule',
]
verifylist = [
('rule',
[self._security_group_rules[0]['id'], 'unexist_rule']),
('rule', [self._security_group_rules[0]['id'], 'unexist_rule']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@ -321,36 +377,40 @@ class TestDeleteSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
except exceptions.CommandError as e:
self.assertEqual('1 of 2 rules failed to delete.', str(e))
sgr_mock.assert_any_call(
self._security_group_rules[0]['id'])
sgr_mock.assert_any_call(
'unexist_rule')
sgr_mock.assert_any_call(self._security_group_rules[0]['id'])
sgr_mock.assert_any_call('unexist_rule')
class TestListSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
# The security group to hold the rules.
_security_group = \
_security_group = (
compute_fakes.FakeSecurityGroup.create_one_security_group()
)
# The security group rule to be listed.
_security_group_rule_tcp = \
compute_fakes.FakeSecurityGroupRule.create_one_security_group_rule({
'ip_protocol': 'tcp',
'ethertype': 'IPv4',
'from_port': 80,
'to_port': 80,
'group': {'name': _security_group['name']},
})
_security_group_rule_icmp = \
compute_fakes.FakeSecurityGroupRule.create_one_security_group_rule({
'ip_protocol': 'icmp',
'ethertype': 'IPv4',
'from_port': -1,
'to_port': -1,
'ip_range': {'cidr': '10.0.2.0/24'},
'group': {'name': _security_group['name']},
})
_security_group_rule_tcp = (
compute_fakes.FakeSecurityGroupRule.create_one_security_group_rule(
{
'ip_protocol': 'tcp',
'ethertype': 'IPv4',
'from_port': 80,
'to_port': 80,
'group': {'name': _security_group['name']},
}
)
)
_security_group_rule_icmp = (
compute_fakes.FakeSecurityGroupRule.create_one_security_group_rule(
{
'ip_protocol': 'icmp',
'ethertype': 'IPv4',
'from_port': -1,
'to_port': -1,
'ip_range': {'cidr': '10.0.2.0/24'},
'group': {'name': _security_group['name']},
}
)
)
_security_group['rules'] = [
_security_group_rule_tcp,
_security_group_rule_icmp,
@ -365,8 +425,9 @@ class TestListSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
'Direction',
'Remote Security Group',
)
expected_columns_no_group = \
expected_columns_with_group + ('Security Group',)
expected_columns_no_group = expected_columns_with_group + (
'Security Group',
)
expected_data_with_group = []
expected_data_no_group = []
@ -382,8 +443,9 @@ class TestListSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
rule['port_range'],
rule['remote_security_group'],
)
expected_rule_no_group = expected_rule_with_group + \
(_security_group_rule['parent_group_id'],)
expected_rule_no_group = expected_rule_with_group + (
_security_group_rule['parent_group_id'],
)
expected_data_with_group.append(expected_rule_with_group)
expected_data_no_group.append(expected_rule_no_group)
@ -462,14 +524,14 @@ class TestListSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
class TestShowSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
# The security group rule to be shown.
_security_group_rule = \
_security_group_rule = (
compute_fakes.FakeSecurityGroupRule.create_one_security_group_rule()
)
columns, data = \
security_group_rule._format_security_group_rule_show(
_security_group_rule)
columns, data = security_group_rule._format_security_group_rule_show(
_security_group_rule
)
def setUp(self):
super(TestShowSecurityGroupRuleCompute, self).setUp()
@ -487,8 +549,9 @@ class TestShowSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
self.cmd = security_group_rule.ShowSecurityGroupRule(self.app, None)
def test_security_group_rule_show_no_options(self):
self.assertRaises(tests_utils.ParserException,
self.check_parser, self.cmd, [], [])
self.assertRaises(
tests_utils.ParserException, self.check_parser, self.cmd, [], []
)
def test_security_group_rule_show_all_options(self):
arglist = [

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,6 @@ from openstackclient.tests.unit import utils as tests_utils
class TestSubnetPool(network_fakes.TestNetworkV2):
def setUp(self):
super(TestSubnetPool, self).setUp()
@ -38,7 +37,6 @@ class TestSubnetPool(network_fakes.TestNetworkV2):
class TestCreateSubnetPool(TestSubnetPool):
project = identity_fakes_v3.FakeProject.create_one_project()
domain = identity_fakes_v3.FakeDomain.create_one_domain()
# The new subnet pool to create.
@ -83,14 +81,16 @@ class TestCreateSubnetPool(TestSubnetPool):
super(TestCreateSubnetPool, self).setUp()
self.network.create_subnet_pool = mock.Mock(
return_value=self._subnet_pool)
return_value=self._subnet_pool
)
self.network.set_tags = mock.Mock(return_value=None)
# Get the command object to test
self.cmd = subnet_pool.CreateSubnetPool(self.app, self.namespace)
self.network.find_address_scope = mock.Mock(
return_value=self._address_scope)
return_value=self._address_scope
)
self.projects_mock.get.return_value = self.project
self.domains_mock.get.return_value = self.domain
@ -99,8 +99,13 @@ class TestCreateSubnetPool(TestSubnetPool):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
self.assertFalse(self.network.set_tags.called)
def test_create_no_pool_prefix(self):
@ -111,12 +116,18 @@ class TestCreateSubnetPool(TestSubnetPool):
verifylist = [
('name', self._subnet_pool.name),
]
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_default_options(self):
arglist = [
'--pool-prefix', '10.0.10.0/24',
'--pool-prefix',
'10.0.10.0/24',
self._subnet_pool.name,
]
verifylist = [
@ -125,27 +136,35 @@ class TestCreateSubnetPool(TestSubnetPool):
]
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.network.create_subnet_pool.assert_called_once_with(**{
'prefixes': ['10.0.10.0/24'],
'name': self._subnet_pool.name,
})
self.network.create_subnet_pool.assert_called_once_with(
**{
'prefixes': ['10.0.10.0/24'],
'name': self._subnet_pool.name,
}
)
self.assertFalse(self.network.set_tags.called)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
def test_create_prefixlen_options(self):
arglist = [
'--default-prefix-length', self._subnet_pool.default_prefixlen,
'--max-prefix-length', self._subnet_pool.max_prefixlen,
'--min-prefix-length', self._subnet_pool.min_prefixlen,
'--pool-prefix', '10.0.10.0/24',
'--default-prefix-length',
self._subnet_pool.default_prefixlen,
'--max-prefix-length',
self._subnet_pool.max_prefixlen,
'--min-prefix-length',
self._subnet_pool.min_prefixlen,
'--pool-prefix',
'10.0.10.0/24',
self._subnet_pool.name,
]
verifylist = [
('default_prefix_length',
int(self._subnet_pool.default_prefixlen)),
(
'default_prefix_length',
int(self._subnet_pool.default_prefixlen),
),
('max_prefix_length', int(self._subnet_pool.max_prefixlen)),
('min_prefix_length', int(self._subnet_pool.min_prefixlen)),
('name', self._subnet_pool.name),
@ -153,36 +172,47 @@ class TestCreateSubnetPool(TestSubnetPool):
]
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.network.create_subnet_pool.assert_called_once_with(**{
'default_prefixlen': int(self._subnet_pool.default_prefixlen),
'max_prefixlen': int(self._subnet_pool.max_prefixlen),
'min_prefixlen': int(self._subnet_pool.min_prefixlen),
'prefixes': ['10.0.10.0/24'],
'name': self._subnet_pool.name,
})
self.network.create_subnet_pool.assert_called_once_with(
**{
'default_prefixlen': int(self._subnet_pool.default_prefixlen),
'max_prefixlen': int(self._subnet_pool.max_prefixlen),
'min_prefixlen': int(self._subnet_pool.min_prefixlen),
'prefixes': ['10.0.10.0/24'],
'name': self._subnet_pool.name,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
def test_create_len_negative(self):
arglist = [
self._subnet_pool.name,
'--min-prefix-length', '-16',
'--min-prefix-length',
'-16',
]
verifylist = [
('subnet_pool', self._subnet_pool.name),
('min_prefix_length', '-16'),
]
self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
argparse.ArgumentTypeError,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_create_project_domain(self):
arglist = [
'--pool-prefix', '10.0.10.0/24',
"--project", self.project.name,
"--project-domain", self.domain.name,
'--pool-prefix',
'10.0.10.0/24',
"--project",
self.project.name,
"--project-domain",
self.domain.name,
self._subnet_pool.name,
]
verifylist = [
@ -193,20 +223,24 @@ class TestCreateSubnetPool(TestSubnetPool):
]
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.network.create_subnet_pool.assert_called_once_with(**{
'prefixes': ['10.0.10.0/24'],
'project_id': self.project.id,
'name': self._subnet_pool.name,
})
self.network.create_subnet_pool.assert_called_once_with(
**{
'prefixes': ['10.0.10.0/24'],
'project_id': self.project.id,
'name': self._subnet_pool.name,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
def test_create_address_scope_option(self):
arglist = [
'--pool-prefix', '10.0.10.0/24',
'--address-scope', self._address_scope.id,
'--pool-prefix',
'10.0.10.0/24',
'--address-scope',
self._address_scope.id,
self._subnet_pool.name,
]
verifylist = [
@ -216,19 +250,22 @@ class TestCreateSubnetPool(TestSubnetPool):
]
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.network.create_subnet_pool.assert_called_once_with(**{
'prefixes': ['10.0.10.0/24'],
'address_scope_id': self._address_scope.id,
'name': self._subnet_pool.name,
})
self.network.create_subnet_pool.assert_called_once_with(
**{
'prefixes': ['10.0.10.0/24'],
'address_scope_id': self._address_scope.id,
'name': self._subnet_pool.name,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
def test_create_default_and_shared_options(self):
arglist = [
'--pool-prefix', '10.0.10.0/24',
'--pool-prefix',
'10.0.10.0/24',
'--default',
'--share',
self._subnet_pool.name,
@ -241,21 +278,25 @@ class TestCreateSubnetPool(TestSubnetPool):
]
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.network.create_subnet_pool.assert_called_once_with(**{
'is_default': True,
'name': self._subnet_pool.name,
'prefixes': ['10.0.10.0/24'],
'shared': True,
})
self.network.create_subnet_pool.assert_called_once_with(
**{
'is_default': True,
'name': self._subnet_pool.name,
'prefixes': ['10.0.10.0/24'],
'shared': True,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
def test_create_with_description(self):
arglist = [
'--pool-prefix', '10.0.10.0/24',
'--description', self._subnet_pool.description,
'--pool-prefix',
'10.0.10.0/24',
'--description',
self._subnet_pool.description,
self._subnet_pool.name,
]
verifylist = [
@ -265,20 +306,24 @@ class TestCreateSubnetPool(TestSubnetPool):
]
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.network.create_subnet_pool.assert_called_once_with(**{
'name': self._subnet_pool.name,
'prefixes': ['10.0.10.0/24'],
'description': self._subnet_pool.description,
})
self.network.create_subnet_pool.assert_called_once_with(
**{
'name': self._subnet_pool.name,
'prefixes': ['10.0.10.0/24'],
'description': self._subnet_pool.description,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
def test_create_with_default_quota(self):
arglist = [
'--pool-prefix', '10.0.10.0/24',
'--default-quota', '10',
'--pool-prefix',
'10.0.10.0/24',
'--default-quota',
'10',
self._subnet_pool.name,
]
verifylist = [
@ -287,18 +332,21 @@ class TestCreateSubnetPool(TestSubnetPool):
('name', self._subnet_pool.name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = (self.cmd.take_action(parsed_args))
self.network.create_subnet_pool.assert_called_once_with(**{
'name': self._subnet_pool.name,
'prefixes': ['10.0.10.0/24'],
'default_quota': 10,
})
columns, data = self.cmd.take_action(parsed_args)
self.network.create_subnet_pool.assert_called_once_with(
**{
'name': self._subnet_pool.name,
'prefixes': ['10.0.10.0/24'],
'default_quota': 10,
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
def _test_create_with_tag(self, add_tags=True):
arglist = [
'--pool-prefix', '10.0.10.0/24',
'--pool-prefix',
'10.0.10.0/24',
self._subnet_pool.name,
]
if add_tags:
@ -315,16 +363,15 @@ class TestCreateSubnetPool(TestSubnetPool):
verifylist.append(('no_tag', True))
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.network.create_subnet_pool.assert_called_once_with(
prefixes=['10.0.10.0/24'],
name=self._subnet_pool.name
prefixes=['10.0.10.0/24'], name=self._subnet_pool.name
)
if add_tags:
self.network.set_tags.assert_called_once_with(
self._subnet_pool,
tests_utils.CompareBySet(['red', 'blue']))
self._subnet_pool, tests_utils.CompareBySet(['red', 'blue'])
)
else:
self.assertFalse(self.network.set_tags.called)
self.assertEqual(self.columns, columns)
@ -338,7 +385,6 @@ class TestCreateSubnetPool(TestSubnetPool):
class TestDeleteSubnetPool(TestSubnetPool):
# The subnet pools to delete.
_subnet_pools = network_fakes.FakeSubnetPool.create_subnet_pools(count=2)
@ -366,7 +412,8 @@ class TestDeleteSubnetPool(TestSubnetPool):
result = self.cmd.take_action(parsed_args)
self.network.delete_subnet_pool.assert_called_once_with(
self._subnet_pools[0])
self._subnet_pools[0]
)
self.assertIsNone(result)
def test_multi_subnet_pools_delete(self):
@ -394,15 +441,15 @@ class TestDeleteSubnetPool(TestSubnetPool):
'unexist_subnet_pool',
]
verifylist = [
('subnet_pool',
[self._subnet_pools[0].name, 'unexist_subnet_pool']),
(
'subnet_pool',
[self._subnet_pools[0].name, 'unexist_subnet_pool'],
),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
find_mock_result = [self._subnet_pools[0], exceptions.CommandError]
self.network.find_subnet_pool = (
mock.Mock(side_effect=find_mock_result)
)
self.network.find_subnet_pool = mock.Mock(side_effect=find_mock_result)
try:
self.cmd.take_action(parsed_args)
@ -411,9 +458,11 @@ class TestDeleteSubnetPool(TestSubnetPool):
self.assertEqual('1 of 2 subnet pools failed to delete.', str(e))
self.network.find_subnet_pool.assert_any_call(
self._subnet_pools[0].name, ignore_missing=False)
self._subnet_pools[0].name, ignore_missing=False
)
self.network.find_subnet_pool.assert_any_call(
'unexist_subnet_pool', ignore_missing=False)
'unexist_subnet_pool', ignore_missing=False
)
self.network.delete_subnet_pool.assert_called_once_with(
self._subnet_pools[0]
)
@ -438,24 +487,28 @@ class TestListSubnetPool(TestSubnetPool):
data = []
for pool in _subnet_pools:
data.append((
pool.id,
pool.name,
format_columns.ListColumn(pool.prefixes),
))
data.append(
(
pool.id,
pool.name,
format_columns.ListColumn(pool.prefixes),
)
)
data_long = []
for pool in _subnet_pools:
data_long.append((
pool.id,
pool.name,
format_columns.ListColumn(pool.prefixes),
pool.default_prefixlen,
pool.address_scope_id,
pool.is_default,
pool.shared,
format_columns.ListColumn(pool.tags),
))
data_long.append(
(
pool.id,
pool.name,
format_columns.ListColumn(pool.prefixes),
pool.default_prefixlen,
pool.address_scope_id,
pool.is_default,
pool.shared,
format_columns.ListColumn(pool.tags),
)
)
def setUp(self):
super(TestListSubnetPool, self).setUp()
@ -561,7 +614,8 @@ class TestListSubnetPool(TestSubnetPool):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project',
project.id,
]
verifylist = [
('project', project.id),
@ -579,8 +633,10 @@ class TestListSubnetPool(TestSubnetPool):
project = identity_fakes_v3.FakeProject.create_one_project()
self.projects_mock.get.return_value = project
arglist = [
'--project', project.id,
'--project-domain', project.domain_id,
'--project',
project.id,
'--project-domain',
project.domain_id,
]
verifylist = [
('project', project.id),
@ -599,7 +655,8 @@ class TestListSubnetPool(TestSubnetPool):
subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool()
self.network.find_network = mock.Mock(return_value=subnet_pool)
arglist = [
'--name', subnet_pool.name,
'--name',
subnet_pool.name,
]
verifylist = [
('name', subnet_pool.name),
@ -617,7 +674,8 @@ class TestListSubnetPool(TestSubnetPool):
addr_scope = network_fakes.create_one_address_scope()
self.network.find_address_scope = mock.Mock(return_value=addr_scope)
arglist = [
'--address-scope', addr_scope.id,
'--address-scope',
addr_scope.id,
]
verifylist = [
('address_scope', addr_scope.id),
@ -633,10 +691,14 @@ class TestListSubnetPool(TestSubnetPool):
def test_list_with_tag_options(self):
arglist = [
'--tags', 'red,blue',
'--any-tags', 'red,green',
'--not-tags', 'orange,yellow',
'--not-any-tags', 'black,white',
'--tags',
'red,blue',
'--any-tags',
'red,green',
'--not-tags',
'orange,yellow',
'--not-any-tags',
'black,white',
]
verifylist = [
('tags', ['red', 'blue']),
@ -648,21 +710,21 @@ class TestListSubnetPool(TestSubnetPool):
columns, data = self.cmd.take_action(parsed_args)
self.network.subnet_pools.assert_called_once_with(
**{'tags': 'red,blue',
'any_tags': 'red,green',
'not_tags': 'orange,yellow',
'not_any_tags': 'black,white'}
**{
'tags': 'red,blue',
'any_tags': 'red,green',
'not_tags': 'orange,yellow',
'not_any_tags': 'black,white',
}
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, list(data))
class TestSetSubnetPool(TestSubnetPool):
# The subnet_pool to set.
_subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool(
{'default_quota': 10,
'tags': ['green', 'red']}
{'default_quota': 10, 'tags': ['green', 'red']}
)
_address_scope = network_fakes.create_one_address_scope()
@ -674,19 +736,24 @@ class TestSetSubnetPool(TestSubnetPool):
self.network.set_tags = mock.Mock(return_value=None)
self.network.find_subnet_pool = mock.Mock(
return_value=self._subnet_pool)
return_value=self._subnet_pool
)
self.network.find_address_scope = mock.Mock(
return_value=self._address_scope)
return_value=self._address_scope
)
# Get the command object to test
self.cmd = subnet_pool.SetSubnetPool(self.app, self.namespace)
def test_set_this(self):
arglist = [
'--name', 'noob',
'--default-prefix-length', '8',
'--min-prefix-length', '8',
'--name',
'noob',
'--default-prefix-length',
'8',
'--min-prefix-length',
'8',
self._subnet_pool.name,
]
verifylist = [
@ -705,14 +772,18 @@ class TestSetSubnetPool(TestSubnetPool):
'min_prefixlen': 8,
}
self.network.update_subnet_pool.assert_called_once_with(
self._subnet_pool, **attrs)
self._subnet_pool, **attrs
)
self.assertIsNone(result)
def test_set_that(self):
arglist = [
'--pool-prefix', '10.0.1.0/24',
'--pool-prefix', '10.0.2.0/24',
'--max-prefix-length', '16',
'--pool-prefix',
'10.0.1.0/24',
'--pool-prefix',
'10.0.2.0/24',
'--max-prefix-length',
'16',
self._subnet_pool.name,
]
verifylist = [
@ -731,12 +802,17 @@ class TestSetSubnetPool(TestSubnetPool):
'max_prefixlen': 16,
}
self.network.update_subnet_pool.assert_called_once_with(
self._subnet_pool, **attrs)
self._subnet_pool, **attrs
)
self.assertIsNone(result)
def test_set_nothing(self):
arglist = [self._subnet_pool.name, ]
verifylist = [('subnet_pool', self._subnet_pool.name), ]
arglist = [
self._subnet_pool.name,
]
verifylist = [
('subnet_pool', self._subnet_pool.name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
@ -747,7 +823,8 @@ class TestSetSubnetPool(TestSubnetPool):
def test_set_len_negative(self):
arglist = [
'--max-prefix-length', '-16',
'--max-prefix-length',
'-16',
self._subnet_pool.name,
]
verifylist = [
@ -755,12 +832,18 @@ class TestSetSubnetPool(TestSubnetPool):
('subnet_pool', self._subnet_pool.name),
]
self.assertRaises(argparse.ArgumentTypeError, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
argparse.ArgumentTypeError,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_set_address_scope(self):
arglist = [
'--address-scope', self._address_scope.id,
'--address-scope',
self._address_scope.id,
self._subnet_pool.name,
]
verifylist = [
@ -775,7 +858,8 @@ class TestSetSubnetPool(TestSubnetPool):
'address_scope_id': self._address_scope.id,
}
self.network.update_subnet_pool.assert_called_once_with(
self._subnet_pool, **attrs)
self._subnet_pool, **attrs
)
self.assertIsNone(result)
def test_set_no_address_scope(self):
@ -795,12 +879,14 @@ class TestSetSubnetPool(TestSubnetPool):
'address_scope_id': None,
}
self.network.update_subnet_pool.assert_called_once_with(
self._subnet_pool, **attrs)
self._subnet_pool, **attrs
)
self.assertIsNone(result)
def test_set_no_address_scope_conflict(self):
arglist = [
'--address-scope', self._address_scope.id,
'--address-scope',
self._address_scope.id,
'--no-address-scope',
self._subnet_pool.name,
]
@ -811,8 +897,13 @@ class TestSetSubnetPool(TestSubnetPool):
]
# Exclusive arguments will conflict here.
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_set_default(self):
arglist = [
@ -827,11 +918,10 @@ class TestSetSubnetPool(TestSubnetPool):
result = self.cmd.take_action(parsed_args)
attrs = {
'is_default': True
}
attrs = {'is_default': True}
self.network.update_subnet_pool.assert_called_once_with(
self._subnet_pool, **attrs)
self._subnet_pool, **attrs
)
self.assertIsNone(result)
def test_set_no_default(self):
@ -851,7 +941,8 @@ class TestSetSubnetPool(TestSubnetPool):
'is_default': False,
}
self.network.update_subnet_pool.assert_called_once_with(
self._subnet_pool, **attrs)
self._subnet_pool, **attrs
)
self.assertIsNone(result)
def test_set_no_default_conflict(self):
@ -867,12 +958,18 @@ class TestSetSubnetPool(TestSubnetPool):
]
# Exclusive arguments will conflict here.
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_set_description(self):
arglist = [
'--description', 'new_description',
'--description',
'new_description',
self._subnet_pool.name,
]
verifylist = [
@ -887,12 +984,14 @@ class TestSetSubnetPool(TestSubnetPool):
'description': "new_description",
}
self.network.update_subnet_pool.assert_called_once_with(
self._subnet_pool, **attrs)
self._subnet_pool, **attrs
)
self.assertIsNone(result)
def test_set_with_default_quota(self):
arglist = [
'--default-quota', '20',
'--default-quota',
'20',
self._subnet_pool.name,
]
verifylist = [
@ -903,7 +1002,9 @@ class TestSetSubnetPool(TestSubnetPool):
result = self.cmd.take_action(parsed_args)
self.network.update_subnet_pool.assert_called_once_with(
self._subnet_pool,
**{'default_quota': 20, }
**{
'default_quota': 20,
}
)
self.assertIsNone(result)
@ -917,16 +1018,15 @@ class TestSetSubnetPool(TestSubnetPool):
verifylist = [('no_tag', True)]
expected_args = []
arglist.append(self._subnet_pool.name)
verifylist.append(
('subnet_pool', self._subnet_pool.name))
verifylist.append(('subnet_pool', self._subnet_pool.name))
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.assertFalse(self.network.update_subnet_pool.called)
self.network.set_tags.assert_called_once_with(
self._subnet_pool,
tests_utils.CompareBySet(expected_args))
self._subnet_pool, tests_utils.CompareBySet(expected_args)
)
self.assertIsNone(result)
def test_set_with_tags(self):
@ -937,7 +1037,6 @@ class TestSetSubnetPool(TestSubnetPool):
class TestShowSubnetPool(TestSubnetPool):
# The subnet_pool to set.
_subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool()
@ -989,8 +1088,13 @@ class TestShowSubnetPool(TestSubnetPool):
arglist = []
verifylist = []
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
self.assertRaises(
tests_utils.ParserException,
self.check_parser,
self.cmd,
arglist,
verifylist,
)
def test_show_all_options(self):
arglist = [
@ -1004,21 +1108,21 @@ class TestShowSubnetPool(TestSubnetPool):
columns, data = self.cmd.take_action(parsed_args)
self.network.find_subnet_pool.assert_called_once_with(
self._subnet_pool.name,
ignore_missing=False
self._subnet_pool.name, ignore_missing=False
)
self.assertEqual(self.columns, columns)
self.assertCountEqual(self.data, data)
class TestUnsetSubnetPool(TestSubnetPool):
def setUp(self):
super(TestUnsetSubnetPool, self).setUp()
self._subnetpool = network_fakes.FakeSubnetPool.create_one_subnet_pool(
{'tags': ['green', 'red']})
{'tags': ['green', 'red']}
)
self.network.find_subnet_pool = mock.Mock(
return_value=self._subnetpool)
return_value=self._subnetpool
)
self.network.update_subnet_pool = mock.Mock(return_value=None)
self.network.set_tags = mock.Mock(return_value=None)
# Get the command object to test
@ -1034,16 +1138,15 @@ class TestUnsetSubnetPool(TestSubnetPool):
verifylist = [('all_tag', True)]
expected_args = []
arglist.append(self._subnetpool.name)
verifylist.append(
('subnet_pool', self._subnetpool.name))
verifylist.append(('subnet_pool', self._subnetpool.name))
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
self.assertFalse(self.network.update_subnet_pool.called)
self.network.set_tags.assert_called_once_with(
self._subnetpool,
tests_utils.CompareBySet(expected_args))
self._subnetpool, tests_utils.CompareBySet(expected_args)
)
self.assertIsNone(result)
def test_unset_with_tags(self):

View File

@ -127,10 +127,10 @@ commands =
[flake8]
show-source = True
# H203: Use assertIs(Not)None to check for None
enable-extensions = H203
exclude = .venv,.git,.tox,dist,doc,*lib/python*,*egg,build,tools,releasenotes
# E203 Black will put spaces after colons in list comprehensions
# H301 Black will put commas after imports that can't fit on one line
# W503 and W504 are disabled since they're not very useful
ignore = W503,W504
ignore = E203,H301,W503,W504
import-order-style = pep8
application_import_names = openstackclient