summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/server.py8
-rw-r--r--openstackclient/network/v2/floating_ip.py74
-rw-r--r--openstackclient/network/v2/port.py32
-rw-r--r--openstackclient/network/v2/router.py12
-rw-r--r--openstackclient/tests/functional/network/v2/test_floating_ip.py76
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py20
-rw-r--r--openstackclient/tests/unit/network/v2/fakes.py2
-rw-r--r--openstackclient/tests/unit/network/v2/test_floating_ip.py186
-rw-r--r--openstackclient/tests/unit/network/v2/test_port.py60
-rw-r--r--openstackclient/tests/unit/network/v2/test_router.py15
10 files changed, 444 insertions, 41 deletions
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index edb06603..ae839677 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -206,6 +206,11 @@ class AddFixedIP(command.Command):
"Network to allocate the fixed IP address from (name or ID)"
),
)
+ parser.add_argument(
+ "--fixed-ip-address",
+ metavar="<ip-address>",
+ help=_("Requested fixed IP address"),
+ )
return parser
def take_action(self, parsed_args):
@@ -217,7 +222,8 @@ class AddFixedIP(command.Command):
network = utils.find_resource(
compute_client.networks, parsed_args.network)
- server.add_fixed_ip(network.id)
+ server.interface_attach(port_id=None, net_id=network.id,
+ fixed_ip=parsed_args.fixed_ip_address)
class AddFloatingIP(command.Command):
diff --git a/openstackclient/network/v2/floating_ip.py b/openstackclient/network/v2/floating_ip.py
index bc347b72..eaf27420 100644
--- a/openstackclient/network/v2/floating_ip.py
+++ b/openstackclient/network/v2/floating_ip.py
@@ -17,6 +17,7 @@ import logging
from openstack import exceptions as sdk_exceptions
from openstack.network.v2 import floating_ip as _floating_ip
+from osc_lib.command import command
from osc_lib import utils
from openstackclient.i18n import _
@@ -446,6 +447,47 @@ class ListIPFloating(ListFloatingIP):
client, parsed_args)
+class SetFloatingIP(command.Command):
+ _description = _("Set floating IP Properties")
+
+ def get_parser(self, prog_name):
+ parser = super(SetFloatingIP, self).get_parser(prog_name)
+ parser.add_argument(
+ 'floating_ip',
+ metavar='<floating-ip>',
+ help=_("Floating IP to associate (IP address or ID)"))
+ parser.add_argument(
+ '--port',
+ metavar='<port>',
+ required=True,
+ help=_("Assocaite 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)")
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ attrs = {}
+ # TODO(sindhu) Use client.find_ip() once SDK 0.9.15 is released
+ obj = _find_floating_ip(
+ self.app.client_manager.sdk_connection.session,
+ parsed_args.floating_ip,
+ ignore_missing=False,
+ )
+ port = client.find_port(parsed_args.port,
+ ignore_missing=False)
+ attrs['port_id'] = port.id
+ if parsed_args.fixed_ip_address:
+ attrs['fixed_ip_address'] = parsed_args.fixed_ip_address
+
+ client.update_ip(obj, **attrs)
+
+
class ShowFloatingIP(common.NetworkAndComputeShowOne):
_description = _("Display floating IP details")
@@ -499,3 +541,35 @@ class ShowIPFloating(ShowFloatingIP):
'Please use "floating ip show" instead.'))
return super(ShowIPFloating, self).take_action_compute(
client, parsed_args)
+
+
+class UnsetFloatingIP(command.Command):
+ _description = _("Unset floating IP Properties")
+
+ def get_parser(self, prog_name):
+ parser = super(UnsetFloatingIP, self).get_parser(prog_name)
+ parser.add_argument(
+ 'floating_ip',
+ metavar='<floating-ip>',
+ 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")
+ )
+ return parser
+
+ def take_action(self, parsed_args):
+ client = self.app.client_manager.network
+ # TODO(sindhu) Use client.find_ip() once SDK 0.9.15 is released
+ obj = _find_floating_ip(
+ self.app.client_manager.sdk_connection.session,
+ parsed_args.floating_ip,
+ ignore_missing=False,
+ )
+ if parsed_args.port:
+ attrs = {
+ 'port_id': None,
+ }
+ client.update_ip(obj, **attrs)
diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py
index 9d598fab..3a32916b 100644
--- a/openstackclient/network/v2/port.py
+++ b/openstackclient/network/v2/port.py
@@ -155,6 +155,13 @@ def _get_attrs(client_manager, parsed_args):
if parsed_args.enable_port_security:
attrs['port_security_enabled'] = True
+ if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy:
+ attrs['qos_policy_id'] = None
+
+ if parsed_args.qos_policy:
+ attrs['qos_policy_id'] = client_manager.network.find_qos_policy(
+ parsed_args.qos_policy, ignore_missing=False).id
+
return attrs
@@ -337,7 +344,7 @@ class CreatePort(command.ShowOne):
help=_("Name of this port")
)
# TODO(singhj): Add support for extended options:
- # qos,dhcp
+ # dhcp
secgroups = parser.add_mutually_exclusive_group()
secgroups.add_argument(
'--security-group',
@@ -353,6 +360,11 @@ class CreatePort(command.ShowOne):
action='store_true',
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)")
+ )
port_security = parser.add_mutually_exclusive_group()
port_security.add_argument(
'--enable-port-security',
@@ -403,6 +415,9 @@ class CreatePort(command.ShowOne):
attrs['allowed_address_pairs'] = (
_convert_address_pairs(parsed_args))
+ if parsed_args.qos_policy:
+ attrs['qos_policy_id'] = client.find_qos_policy(
+ parsed_args.qos_policy, ignore_missing=False).id
obj = client.create_port(**attrs)
display_columns, columns = _get_columns(obj)
data = utils.get_item_properties(obj, columns, formatters=_formatters)
@@ -620,6 +635,11 @@ class SetPort(command.Command):
"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)")
+ )
+ parser.add_argument(
'port',
metavar="<port>",
help=_("Port to modify (name or ID)")
@@ -675,8 +695,8 @@ class SetPort(command.Command):
client = self.app.client_manager.network
_prepare_fixed_ips(self.app.client_manager, parsed_args)
- attrs = _get_attrs(self.app.client_manager, parsed_args)
obj = client.find_port(parsed_args.port, ignore_missing=False)
+ attrs = _get_attrs(self.app.client_manager, parsed_args)
if parsed_args.no_binding_profile:
attrs['binding:profile'] = {}
@@ -794,6 +814,12 @@ class UnsetPort(command.Command):
"[,mac-address=<mac-address>] (repeat option to set "
"multiple allowed-address pairs)")
)
+ parser.add_argument(
+ '--qos-policy',
+ action='store_true',
+ default=False,
+ help=_("Remove the QoS policy attached to the port")
+ )
return parser
@@ -843,6 +869,8 @@ class UnsetPort(command.Command):
msg = _("Port does not contain allowed-address-pair %s") % addr
raise exceptions.CommandError(msg)
attrs['allowed_address_pairs'] = tmp_addr_pairs
+ if parsed_args.qos_policy:
+ attrs['qos_policy_id'] = None
if attrs:
client.update_port(obj, **attrs)
diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py
index f46c8696..f322d5d1 100644
--- a/openstackclient/network/v2/router.py
+++ b/openstackclient/network/v2/router.py
@@ -183,11 +183,17 @@ class CreateRouter(command.ShowOne):
default=False,
help=_("Create a distributed router")
)
- parser.add_argument(
+ ha_group = parser.add_mutually_exclusive_group()
+ ha_group.add_argument(
'--ha',
action='store_true',
help=_("Create a highly available router")
)
+ ha_group.add_argument(
+ '--no-ha',
+ action='store_true',
+ help=_("Create a legacy router")
+ )
parser.add_argument(
'--description',
metavar='<description>',
@@ -216,7 +222,9 @@ class CreateRouter(command.ShowOne):
attrs = _get_attrs(self.app.client_manager, parsed_args)
if parsed_args.ha:
- attrs['ha'] = parsed_args.ha
+ attrs['ha'] = True
+ if parsed_args.no_ha:
+ attrs['ha'] = False
obj = client.create_router(**attrs)
display_columns, columns = _get_columns(obj)
diff --git a/openstackclient/tests/functional/network/v2/test_floating_ip.py b/openstackclient/tests/functional/network/v2/test_floating_ip.py
index 8fbec3d5..5da0e474 100644
--- a/openstackclient/tests/functional/network/v2/test_floating_ip.py
+++ b/openstackclient/tests/functional/network/v2/test_floating_ip.py
@@ -21,6 +21,10 @@ class FloatingIpTests(base.TestCase):
"""Functional tests for floating ip"""
SUBNET_NAME = uuid.uuid4().hex
NETWORK_NAME = uuid.uuid4().hex
+ PRIVATE_NETWORK_NAME = uuid.uuid4().hex
+ PRIVATE_SUBNET_NAME = uuid.uuid4().hex
+ ROUTER = uuid.uuid4().hex
+ PORT_NAME = uuid.uuid4().hex
@classmethod
def setUpClass(cls):
@@ -30,6 +34,8 @@ class FloatingIpTests(base.TestCase):
cls.re_fixed_ip = re.compile("fixed_ip_address\s+\|\s+(\S+)")
cls.re_description = re.compile("description\s+\|\s+([^|]+?)\s+\|")
cls.re_network_id = re.compile("floating_network_id\s+\|\s+(\S+)")
+ cls.re_port_id = re.compile("\s+id\s+\|\s+(\S+)")
+ cls.re_fp_port_id = re.compile("\s+port_id\s+\|\s+(\S+)")
# Create a network for the floating ip
raw_output = cls.openstack(
@@ -37,6 +43,12 @@ class FloatingIpTests(base.TestCase):
)
cls.network_id = re.search(cls.re_id, raw_output).group(1)
+ # Create a private network for the port
+ raw_output = cls.openstack(
+ 'network create ' + cls.PRIVATE_NETWORK_NAME
+ )
+ cls.private_network_id = re.search(cls.re_id, raw_output).group(1)
+
# Try random subnet range for subnet creating
# Because we can not determine ahead of time what subnets are already
# in use, possibly by another test running in parallel, try 4 times
@@ -46,6 +58,10 @@ class FloatingIpTests(base.TestCase):
str,
(random.randint(0, 223) for _ in range(3))
)) + ".0/26"
+ cls.private_subnet = ".".join(map(
+ str,
+ (random.randint(0, 223) for _ in range(3))
+ )) + ".0/26"
try:
# Create a subnet for the network
raw_output = cls.openstack(
@@ -54,6 +70,13 @@ class FloatingIpTests(base.TestCase):
'--subnet-range ' + cls.subnet + ' ' +
cls.SUBNET_NAME
)
+ # Create a subnet for the private network
+ priv_raw_output = cls.openstack(
+ 'subnet create ' +
+ '--network ' + cls.PRIVATE_NETWORK_NAME + ' ' +
+ '--subnet-range ' + cls.private_subnet + ' ' +
+ cls.PRIVATE_SUBNET_NAME
+ )
except Exception:
if (i == 3):
# raise the exception at the last time
@@ -64,13 +87,19 @@ class FloatingIpTests(base.TestCase):
break
cls.subnet_id = re.search(cls.re_id, raw_output).group(1)
+ cls.private_subnet_id = re.search(cls.re_id, priv_raw_output).group(1)
@classmethod
def tearDownClass(cls):
raw_output = cls.openstack('subnet delete ' + cls.SUBNET_NAME)
cls.assertOutput('', raw_output)
+ raw_output = cls.openstack('subnet delete ' + cls.PRIVATE_SUBNET_NAME)
+ cls.assertOutput('', raw_output)
raw_output = cls.openstack('network delete ' + cls.NETWORK_NAME)
cls.assertOutput('', raw_output)
+ raw_output = cls.openstack(
+ 'network delete ' + cls.PRIVATE_NETWORK_NAME)
+ cls.assertOutput('', raw_output)
def test_floating_ip_delete(self):
"""Test create, delete multiple"""
@@ -168,3 +197,50 @@ class FloatingIpTests(base.TestCase):
# re.search(self.re_floating_ip, raw_output).group(1),
# )
self.assertIsNotNone(re.search(self.re_network_id, raw_output))
+
+ def test_floating_ip_set_and_unset_port(self):
+ """Test Floating IP Set and Unset port"""
+ raw_output = self.openstack(
+ 'floating ip create ' +
+ '--description shosho ' +
+ self.NETWORK_NAME
+ )
+ re_ip = re.search(self.re_floating_ip, raw_output)
+ fp_ip = re_ip.group(1)
+ self.addCleanup(self.openstack, 'floating ip delete ' + fp_ip)
+ self.assertIsNotNone(fp_ip)
+
+ raw_output1 = self.openstack(
+ 'port create --network ' + self.PRIVATE_NETWORK_NAME
+ + ' --fixed-ip subnet=' + self.PRIVATE_SUBNET_NAME +
+ ' ' + self.PORT_NAME
+ )
+ re_port_id = re.search(self.re_port_id, raw_output1)
+ self.assertIsNotNone(re_port_id)
+ port_id = re_port_id.group(1)
+
+ router = self.openstack('router create ' + self.ROUTER)
+ self.assertIsNotNone(router)
+ self.addCleanup(self.openstack, 'router delete ' + self.ROUTER)
+
+ self.openstack('router add port ' + self.ROUTER +
+ ' ' + port_id)
+ self.openstack('router set --external-gateway ' + self.NETWORK_NAME +
+ ' ' + self.ROUTER)
+
+ self.addCleanup(self.openstack, 'router unset --external-gateway '
+ + self.ROUTER)
+ self.addCleanup(self.openstack, 'router remove port ' + self.ROUTER
+ + ' ' + port_id)
+
+ raw_output = self.openstack(
+ 'floating ip set ' +
+ fp_ip + ' --port ' + port_id)
+ self.addCleanup(self.openstack, 'floating ip unset --port ' + fp_ip)
+
+ show_output = self.openstack(
+ 'floating ip show ' + fp_ip)
+
+ self.assertEqual(
+ port_id,
+ re.search(self.re_fp_port_id, show_output).group(1))
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index 0e3bb28f..fed847f1 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -104,10 +104,10 @@ class TestServerAddFixedIP(TestServer):
# Set add_fixed_ip method to be tested.
self.methods = {
- 'add_fixed_ip': None,
+ 'interface_attach': None,
}
- def test_server_add_fixed_ip(self):
+ def _test_server_add_fixed_ip(self, extralist, fixed_ip_address):
servers = self.setup_servers_mock(count=1)
network = compute_fakes.FakeNetwork.create_one_network()
self.networks_mock.get.return_value = network
@@ -115,20 +115,28 @@ class TestServerAddFixedIP(TestServer):
arglist = [
servers[0].id,
network.id,
- ]
+ ] + extralist
verifylist = [
('server', servers[0].id),
- ('network', network.id)
+ ('network', network.id),
+ ('fixed_ip_address', fixed_ip_address)
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
- servers[0].add_fixed_ip.assert_called_once_with(
- network.id,
+ servers[0].interface_attach.assert_called_once_with(
+ port_id=None, net_id=network.id, fixed_ip=fixed_ip_address
)
self.assertIsNone(result)
+ def test_server_add_fixed_ip(self):
+ self._test_server_add_fixed_ip([], None)
+
+ def test_server_add_specific_fixed_ip(self):
+ extralist = ['--fixed-ip-address', '5.6.7.8']
+ self._test_server_add_fixed_ip(extralist, '5.6.7.8')
+
class TestServerAddFloatingIP(TestServer):
diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py
index d3685409..9a289941 100644
--- a/openstackclient/tests/unit/network/v2/fakes.py
+++ b/openstackclient/tests/unit/network/v2/fakes.py
@@ -572,6 +572,7 @@ class FakePort(object):
'security_group_ids': [],
'status': 'ACTIVE',
'tenant_id': 'project-id-' + uuid.uuid4().hex,
+ 'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
}
# Overwrite default attributes.
@@ -590,6 +591,7 @@ class FakePort(object):
port.is_port_security_enabled = port_attrs['port_security_enabled']
port.project_id = port_attrs['tenant_id']
port.security_group_ids = port_attrs['security_group_ids']
+ port.qos_policy_id = port_attrs['qos_policy_id']
return port
diff --git a/openstackclient/tests/unit/network/v2/test_floating_ip.py b/openstackclient/tests/unit/network/v2/test_floating_ip.py
index 0b3fd888..69fb1419 100644
--- a/openstackclient/tests/unit/network/v2/test_floating_ip.py
+++ b/openstackclient/tests/unit/network/v2/test_floating_ip.py
@@ -16,7 +16,7 @@ from mock import call
from osc_lib import exceptions
-from openstackclient.network.v2 import floating_ip
+from openstackclient.network.v2 import floating_ip as fip
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes_v3
from openstackclient.tests.unit.network.v2 import fakes as network_fakes
@@ -92,7 +92,7 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
self.network.find_port = mock.Mock(return_value=self.port)
# Get the command object to test
- self.cmd = floating_ip.CreateFloatingIP(self.app, self.namespace)
+ self.cmd = fip.CreateFloatingIP(self.app, self.namespace)
def test_create_no_options(self):
arglist = []
@@ -210,12 +210,9 @@ class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork):
self.network.delete_ip = mock.Mock(return_value=None)
# Get the command object to test
- self.cmd = floating_ip.DeleteFloatingIP(self.app, self.namespace)
+ self.cmd = fip.DeleteFloatingIP(self.app, self.namespace)
- @mock.patch(
- "openstackclient.tests.unit.network.v2.test_floating_ip." +
- "floating_ip._find_floating_ip"
- )
+ @mock.patch.object(fip, '_find_floating_ip')
def test_floating_ip_delete(self, find_floating_ip_mock):
find_floating_ip_mock.side_effect = [
self.floating_ips[0],
@@ -239,10 +236,7 @@ class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork):
self.network.delete_ip.assert_called_once_with(self.floating_ips[0])
self.assertIsNone(result)
- @mock.patch(
- "openstackclient.tests.unit.network.v2.test_floating_ip." +
- "floating_ip._find_floating_ip"
- )
+ @mock.patch.object(fip, '_find_floating_ip')
def test_floating_ip_delete_multi(self, find_floating_ip_mock):
find_floating_ip_mock.side_effect = [
self.floating_ips[0],
@@ -280,10 +274,7 @@ class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork):
self.network.delete_ip.assert_has_calls(calls)
self.assertIsNone(result)
- @mock.patch(
- "openstackclient.tests.unit.network.v2.test_floating_ip." +
- "floating_ip._find_floating_ip"
- )
+ @mock.patch.object(fip, '_find_floating_ip')
def test_floating_ip_delete_multi_exception(self, find_floating_ip_mock):
find_floating_ip_mock.side_effect = [
self.floating_ips[0],
@@ -380,7 +371,7 @@ class TestListFloatingIPNetwork(TestFloatingIPNetwork):
self.network.find_router = mock.Mock(return_value=self.fake_router)
# Get the command object to test
- self.cmd = floating_ip.ListFloatingIP(self.app, self.namespace)
+ self.cmd = fip.ListFloatingIP(self.app, self.namespace)
def test_floating_ip_list(self):
arglist = []
@@ -572,12 +563,9 @@ class TestShowFloatingIPNetwork(TestFloatingIPNetwork):
self.network.find_ip = mock.Mock(return_value=self.floating_ip)
# Get the command object to test
- self.cmd = floating_ip.ShowFloatingIP(self.app, self.namespace)
+ self.cmd = fip.ShowFloatingIP(self.app, self.namespace)
- @mock.patch(
- "openstackclient.tests.unit.network.v2.test_floating_ip." +
- "floating_ip._find_floating_ip"
- )
+ @mock.patch.object(fip, '_find_floating_ip')
def test_floating_ip_show(self, find_floating_ip_mock):
find_floating_ip_mock.return_value = self.floating_ip
arglist = [
@@ -599,6 +587,154 @@ class TestShowFloatingIPNetwork(TestFloatingIPNetwork):
self.assertEqual(self.data, data)
+class TestSetFloatingIP(TestFloatingIPNetwork):
+
+ # Fake data for option tests.
+ floating_network = network_fakes.FakeNetwork.create_one_network()
+ subnet = network_fakes.FakeSubnet.create_one_subnet()
+ port = network_fakes.FakePort.create_one_port()
+
+ # The floating ip to be deleted.
+ floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip(
+ attrs={
+ 'floating_network_id': floating_network.id,
+ 'port_id': port.id,
+ }
+ )
+
+ def setUp(self):
+ super(TestSetFloatingIP, self).setUp()
+ self.network.find_ip = mock.Mock(return_value=self.floating_ip)
+ self.network.find_port = mock.Mock(return_value=self.port)
+ self.network.update_ip = mock.Mock(return_value=None)
+
+ # Get the command object to test
+ self.cmd = fip.SetFloatingIP(self.app, self.namespace)
+
+ @mock.patch(
+ "openstackclient.tests.unit.network.v2.test_floating_ip." +
+ "fip._find_floating_ip"
+ )
+ def test_port_option(self, find_floating_ip_mock):
+ find_floating_ip_mock.side_effect = [
+ self.floating_ip,
+ ]
+ arglist = [
+ self.floating_ip.id,
+ '--port', self.floating_ip.port_id,
+ ]
+ verifylist = [
+ ('floating_ip', self.floating_ip.id),
+ ('port', self.floating_ip.port_id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'port_id': self.floating_ip.port_id,
+ }
+
+ find_floating_ip_mock.assert_called_once_with(
+ mock.ANY,
+ self.floating_ip.id,
+ ignore_missing=False,
+ )
+
+ self.network.update_ip.assert_called_once_with(
+ self.floating_ip, **attrs)
+
+ @mock.patch(
+ "openstackclient.tests.unit.network.v2.test_floating_ip." +
+ "fip._find_floating_ip"
+ )
+ def test_fixed_ip_option(self, find_floating_ip_mock):
+ find_floating_ip_mock.side_effect = [
+ self.floating_ip,
+ ]
+ arglist = [
+ self.floating_ip.id,
+ '--port', self.floating_ip.port_id,
+ "--fixed-ip-address", self.floating_ip.fixed_ip_address,
+ ]
+ verifylist = [
+ ('floating_ip', self.floating_ip.id),
+ ('port', self.floating_ip.port_id),
+ ('fixed_ip_address', self.floating_ip.fixed_ip_address),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'port_id': self.floating_ip.port_id,
+ 'fixed_ip_address': self.floating_ip.fixed_ip_address,
+ }
+ find_floating_ip_mock.assert_called_once_with(
+ mock.ANY,
+ self.floating_ip.id,
+ ignore_missing=False,
+ )
+ self.network.update_ip.assert_called_once_with(
+ self.floating_ip, **attrs)
+
+
+class TestUnsetFloatingIP(TestFloatingIPNetwork):
+
+ floating_network = network_fakes.FakeNetwork.create_one_network()
+ subnet = network_fakes.FakeSubnet.create_one_subnet()
+ port = network_fakes.FakePort.create_one_port()
+
+ # The floating ip to be deleted.
+ floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip(
+ attrs={
+ 'floating_network_id': floating_network.id,
+ 'port_id': port.id,
+ }
+ )
+
+ def setUp(self):
+ super(TestUnsetFloatingIP, self).setUp()
+ self.network.find_ip = mock.Mock(return_value=self.floating_ip)
+ self.network.update_ip = mock.Mock(return_value=None)
+
+ # Get the command object to test
+ self.cmd = fip.UnsetFloatingIP(self.app, self.namespace)
+
+ @mock.patch(
+ "openstackclient.tests.unit.network.v2.test_floating_ip." +
+ "fip._find_floating_ip"
+ )
+ def test_floating_ip_unset_port(self, find_floating_ip_mock):
+ find_floating_ip_mock.side_effect = [
+ self.floating_ip,
+ ]
+ arglist = [
+ self.floating_ip.id,
+ "--port",
+ ]
+ verifylist = [
+ ('floating_ip', self.floating_ip.id),
+ ('port', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'port_id': None,
+ }
+ find_floating_ip_mock.assert_called_once_with(
+ mock.ANY,
+ self.floating_ip.id,
+ ignore_missing=False,
+ )
+ self.network.update_ip.assert_called_once_with(
+ self.floating_ip, **attrs)
+
+ self.assertIsNone(result)
+
+
# Tests for Nova network
#
class TestFloatingIPCompute(compute_fakes.TestComputev2):
@@ -639,7 +775,7 @@ class TestCreateFloatingIPCompute(TestFloatingIPCompute):
self.compute.floating_ips.create.return_value = self.floating_ip
# Get the command object to test
- self.cmd = floating_ip.CreateFloatingIP(self.app, None)
+ self.cmd = fip.CreateFloatingIP(self.app, None)
def test_create_no_options(self):
arglist = []
@@ -682,7 +818,7 @@ class TestDeleteFloatingIPCompute(TestFloatingIPCompute):
compute_fakes.FakeFloatingIP.get_floating_ips(self.floating_ips))
# Get the command object to test
- self.cmd = floating_ip.DeleteFloatingIP(self.app, None)
+ self.cmd = fip.DeleteFloatingIP(self.app, None)
def test_floating_ip_delete(self):
arglist = [
@@ -782,7 +918,7 @@ class TestListFloatingIPCompute(TestFloatingIPCompute):
self.compute.floating_ips.list.return_value = self.floating_ips
# Get the command object to test
- self.cmd = floating_ip.ListFloatingIP(self.app, None)
+ self.cmd = fip.ListFloatingIP(self.app, None)
def test_floating_ip_list(self):
arglist = []
@@ -826,7 +962,7 @@ class TestShowFloatingIPCompute(TestFloatingIPCompute):
self.compute.floating_ips.get.return_value = self.floating_ip
# Get the command object to test
- self.cmd = floating_ip.ShowFloatingIP(self.app, None)
+ self.cmd = fip.ShowFloatingIP(self.app, None)
def test_floating_ip_show(self):
arglist = [
diff --git a/openstackclient/tests/unit/network/v2/test_port.py b/openstackclient/tests/unit/network/v2/test_port.py
index 701af879..851bf25a 100644
--- a/openstackclient/tests/unit/network/v2/test_port.py
+++ b/openstackclient/tests/unit/network/v2/test_port.py
@@ -57,6 +57,7 @@ class TestPort(network_fakes.TestNetworkV2):
'network_id',
'port_security_enabled',
'project_id',
+ 'qos_policy_id',
'security_group_ids',
'status',
)
@@ -82,6 +83,7 @@ class TestPort(network_fakes.TestNetworkV2):
fake_port.network_id,
fake_port.port_security_enabled,
fake_port.project_id,
+ fake_port.qos_policy_id,
utils.format_list(fake_port.security_group_ids),
fake_port.status,
)
@@ -422,6 +424,35 @@ class TestCreatePort(TestPort):
self.assertEqual(ref_columns, columns)
self.assertEqual(ref_data, data)
+ def test_create_port_with_qos(self):
+ qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
+ self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
+ arglist = [
+ '--network', self._port.network_id,
+ '--qos-policy', qos_policy.id,
+ 'test-port',
+ ]
+ verifylist = [
+ ('network', self._port.network_id,),
+ ('enable', True),
+ ('qos_policy', qos_policy.id),
+ ('name', 'test-port'),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ columns, data = (self.cmd.take_action(parsed_args))
+
+ self.network.create_port.assert_called_once_with(**{
+ 'admin_state_up': True,
+ 'network_id': self._port.network_id,
+ 'qos_policy_id': qos_policy.id,
+ 'name': 'test-port',
+ })
+
+ ref_columns, ref_data = self._get_common_cols_data(self._port)
+ self.assertEqual(ref_columns, columns)
+ self.assertEqual(ref_data, data)
+
def test_create_port_security_enabled(self):
arglist = [
'--network', self._port.network_id,
@@ -1316,6 +1347,30 @@ class TestSetPort(TestPort):
'port_security_enabled': False,
})
+ def test_set_port_with_qos(self):
+ qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
+ self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
+ _testport = network_fakes.FakePort.create_one_port(
+ {'qos_policy_id': None})
+ self.network.find_port = mock.Mock(return_value=_testport)
+ arglist = [
+ '--qos-policy', qos_policy.id,
+ _testport.name,
+ ]
+ verifylist = [
+ ('qos_policy', qos_policy.id),
+ ('port', _testport.name),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'qos_policy_id': qos_policy.id,
+ }
+ self.network.update_port.assert_called_once_with(_testport, **attrs)
+ self.assertIsNone(result)
+
class TestShowPort(TestPort):
@@ -1379,6 +1434,7 @@ class TestUnsetPort(TestPort):
'--fixed-ip',
'subnet=042eb10a-3a18-4658-ab-cf47c8d03152,ip-address=1.0.0.0',
'--binding-profile', 'Superman',
+ '--qos-policy',
self._testport.name,
]
verifylist = [
@@ -1386,6 +1442,7 @@ class TestUnsetPort(TestPort):
'subnet': '042eb10a-3a18-4658-ab-cf47c8d03152',
'ip-address': '1.0.0.0'}]),
('binding_profile', ['Superman']),
+ ('qos_policy', True),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -1395,7 +1452,8 @@ class TestUnsetPort(TestPort):
'fixed_ips': [{
'subnet_id': '042eb10a-3a18-4658-ab-cf47c8d03152',
'ip_address': '0.0.0.1'}],
- 'binding:profile': {'batman': 'Joker'}
+ 'binding:profile': {'batman': 'Joker'},
+ 'qos_policy_id': None
}
self.network.update_port.assert_called_once_with(
self._testport, **attrs)
diff --git a/openstackclient/tests/unit/network/v2/test_router.py b/openstackclient/tests/unit/network/v2/test_router.py
index b837afd1..a4f91997 100644
--- a/openstackclient/tests/unit/network/v2/test_router.py
+++ b/openstackclient/tests/unit/network/v2/test_router.py
@@ -181,16 +181,17 @@ class TestCreateRouter(TestRouter):
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
- def test_create_with_ha_option(self):
+ def _test_create_with_ha_options(self, option, ha):
arglist = [
- '--ha',
+ option,
self.new_router.name,
]
verifylist = [
('name', self.new_router.name),
('enable', True),
('distributed', False),
- ('ha', True),
+ ('ha', ha),
+ ('no_ha', not ha),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -199,11 +200,17 @@ class TestCreateRouter(TestRouter):
self.network.create_router.assert_called_once_with(**{
'admin_state_up': True,
'name': self.new_router.name,
- 'ha': True,
+ 'ha': ha,
})
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
+ def test_create_with_ha_option(self):
+ self._test_create_with_ha_options('--ha', True)
+
+ def test_create_with_no_ha_option(self):
+ self._test_create_with_ha_options('--no-ha', False)
+
def test_create_with_AZ_hints(self):
arglist = [
self.new_router.name,