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:
parent
35ba1d8f13
commit
6475dc58e8
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
)
|
||||
|
@ -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={})
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
),
|
||||
)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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={})
|
||||
|
||||
|
@ -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={})
|
||||
|
||||
|
@ -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
|
||||
),
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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']
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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']))
|
||||
|
@ -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(
|
||||
|
@ -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,
|
||||
)
|
||||
|
||||
|
@ -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'],
|
||||
|
@ -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'],
|
||||
},
|
||||
|
@ -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'])
|
||||
|
@ -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"])
|
||||
|
@ -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)
|
||||
|
@ -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'],
|
||||
|
@ -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')
|
||||
|
@ -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')
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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'])
|
||||
|
@ -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'])
|
||||
|
@ -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])
|
||||
|
@ -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)
|
||||
|
@ -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(
|
||||
|
@ -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)
|
||||
|
@ -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])
|
||||
|
@ -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,
|
||||
)
|
||||
|
@ -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,
|
||||
)
|
||||
|
@ -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']))
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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(
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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'}
|
||||
)
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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):
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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)))
|
||||
|
@ -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)
|
||||
|
@ -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):
|
||||
|
@ -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)))
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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 = [
|
||||
|
@ -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 = [
|
||||
|
@ -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))
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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),
|
||||
]
|
||||
|
@ -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 = [
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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 = []
|
||||
|
@ -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
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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
File diff suppressed because it is too large
Load Diff
@ -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):
|
||||
|
6
tox.ini
6
tox.ini
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user