summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorLIU Yulong <i@liuyulong.me>2017-11-05 12:05:09 +0800
committerDean Troyer <dtroyer@gmail.com>2018-01-11 18:10:11 +0000
commitcf91d7a2f46b4a8546169a4836cc64476fce44d8 (patch)
tree73cf917909abab77be6f594892b94b025637033d /openstackclient
parentb13a323128072f6f56619a816f5be165796171a4 (diff)
downloadpython-openstackclient-cf91d7a2f46b4a8546169a4836cc64476fce44d8.tar.gz
Add floating IP qos_policy actions
Now we can associate a qos policy to the floating IP, and dissociate it. The commands are: $ openstack floating ip create --qos-policy ... $ openstack floating ip set --qos-policy ... $ openstack floating ip set --no-qos-policy ... $ openstack floating ip unset --qos-policy These commands are based on the neutron change: I4efe9e49d268dffeb3df4de4ea1780152218633b Partially-Implements blueprint: floating-ip-rate-limit Change-Id: I932b32f78cc5a2b53926feaec1a0b392cf7e8b57
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/network/v2/floating_ip.py42
-rw-r--r--openstackclient/tests/unit/network/v2/fakes.py1
-rw-r--r--openstackclient/tests/unit/network/v2/test_floating_ip_network.py129
3 files changed, 169 insertions, 3 deletions
diff --git a/openstackclient/network/v2/floating_ip.py b/openstackclient/network/v2/floating_ip.py
index 05b688a6..181f88c0 100644
--- a/openstackclient/network/v2/floating_ip.py
+++ b/openstackclient/network/v2/floating_ip.py
@@ -67,6 +67,10 @@ def _get_attrs(client_manager, parsed_args):
if parsed_args.fixed_ip_address:
attrs['fixed_ip_address'] = parsed_args.fixed_ip_address
+ if parsed_args.qos_policy:
+ attrs['qos_policy_id'] = network_client.find_qos_policy(
+ parsed_args.qos_policy, ignore_missing=False).id
+
if parsed_args.description is not None:
attrs['description'] = parsed_args.description
@@ -170,6 +174,11 @@ class CreateFloatingIP(common.NetworkAndComputeShowOne):
help=_("Fixed IP address mapped to the floating IP")
)
parser.add_argument(
+ '--qos-policy',
+ metavar='<qos-policy>',
+ help=_("Attach QoS policy to the floating IP (name or ID)")
+ )
+ parser.add_argument(
'--description',
metavar='<description>',
help=_('Set floating IP description')
@@ -462,6 +471,17 @@ class SetFloatingIP(command.Command):
help=_("Fixed IP of the port "
"(required only if port has multiple IPs)")
)
+ 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)")
+ )
+ qos_policy_group.add_argument(
+ '--no-qos-policy',
+ action='store_true',
+ help=_("Remove the QoS policy attached to the floating IP")
+ )
return parser
def take_action(self, parsed_args):
@@ -479,6 +499,13 @@ class SetFloatingIP(command.Command):
if parsed_args.fixed_ip_address:
attrs['fixed_ip_address'] = parsed_args.fixed_ip_address
+ if parsed_args.qos_policy:
+ attrs['qos_policy_id'] = client.find_qos_policy(
+ 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
+
client.update_ip(obj, **attrs)
@@ -549,6 +576,12 @@ class UnsetFloatingIP(command.Command):
default=False,
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")
+ )
return parser
def take_action(self, parsed_args):
@@ -559,8 +592,11 @@ class UnsetFloatingIP(command.Command):
parsed_args.floating_ip,
ignore_missing=False,
)
+ attrs = {}
if parsed_args.port:
- attrs = {
- 'port_id': None,
- }
+ attrs['port_id'] = None
+ if parsed_args.qos_policy:
+ attrs['qos_policy_id'] = None
+
+ if attrs:
client.update_ip(obj, **attrs)
diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py
index bdc1c1fb..a77cab8b 100644
--- a/openstackclient/tests/unit/network/v2/fakes.py
+++ b/openstackclient/tests/unit/network/v2/fakes.py
@@ -1378,6 +1378,7 @@ class FakeFloatingIP(object):
'port_id': 'port-id-' + uuid.uuid4().hex,
'tenant_id': 'project-id-' + uuid.uuid4().hex,
'description': 'floating-ip-description-' + uuid.uuid4().hex,
+ 'qos_policy_id': 'qos-policy-id-' + uuid.uuid4().hex,
}
# Overwrite default attributes.
diff --git a/openstackclient/tests/unit/network/v2/test_floating_ip_network.py b/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
index 4fbbc822..86f64ccd 100644
--- a/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
+++ b/openstackclient/tests/unit/network/v2/test_floating_ip_network.py
@@ -62,6 +62,7 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
'id',
'port_id',
'project_id',
+ 'qos_policy_id',
'router_id',
'status',
)
@@ -76,6 +77,7 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
floating_ip.id,
floating_ip.port_id,
floating_ip.project_id,
+ floating_ip.qos_policy_id,
floating_ip.router_id,
floating_ip.status,
)
@@ -197,6 +199,28 @@ class TestCreateFloatingIPNetwork(TestFloatingIPNetwork):
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, data)
+ def test_create_floating_ip_with_qos(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,
+ self.floating_ip.floating_network_id,
+ ]
+ verifylist = [
+ ('network', self.floating_ip.floating_network_id),
+ ('qos_policy', qos_policy.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ 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.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork):
@@ -538,6 +562,7 @@ class TestShowFloatingIPNetwork(TestFloatingIPNetwork):
'id',
'port_id',
'project_id',
+ 'qos_policy_id',
'router_id',
'status',
)
@@ -552,6 +577,7 @@ class TestShowFloatingIPNetwork(TestFloatingIPNetwork):
floating_ip.id,
floating_ip.port_id,
floating_ip.project_id,
+ floating_ip.qos_policy_id,
floating_ip.router_id,
floating_ip.status,
)
@@ -677,6 +703,76 @@ class TestSetFloatingIP(TestFloatingIPNetwork):
self.network.update_ip.assert_called_once_with(
self.floating_ip, **attrs)
+ @mock.patch(
+ "openstackclient.tests.unit.network.v2.test_floating_ip_network." +
+ "fip._find_floating_ip"
+ )
+ def test_port_and_qos_policy_option(self, find_floating_ip_mock):
+ qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
+ self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
+ find_floating_ip_mock.side_effect = [
+ self.floating_ip,
+ ]
+ arglist = [
+ "--qos-policy", qos_policy.id,
+ '--port', self.floating_ip.port_id,
+ self.floating_ip.id,
+ ]
+ verifylist = [
+ ('qos_policy', qos_policy.id),
+ ('port', self.floating_ip.port_id),
+ ('floating_ip', self.floating_ip.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'qos_policy_id': qos_policy.id,
+ '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_network." +
+ "fip._find_floating_ip"
+ )
+ def test_port_and_no_qos_policy_option(self, find_floating_ip_mock):
+ find_floating_ip_mock.side_effect = [
+ self.floating_ip,
+ ]
+ arglist = [
+ "--no-qos-policy",
+ '--port', self.floating_ip.port_id,
+ self.floating_ip.id,
+ ]
+ verifylist = [
+ ('no_qos_policy', True),
+ ('port', self.floating_ip.port_id),
+ ('floating_ip', self.floating_ip.id),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'qos_policy_id': None,
+ '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)
+
class TestUnsetFloatingIP(TestFloatingIPNetwork):
@@ -732,3 +828,36 @@ class TestUnsetFloatingIP(TestFloatingIPNetwork):
self.floating_ip, **attrs)
self.assertIsNone(result)
+
+ @mock.patch(
+ "openstackclient.tests.unit.network.v2.test_floating_ip_network." +
+ "fip._find_floating_ip"
+ )
+ def test_floating_ip_unset_qos_policy(self, find_floating_ip_mock):
+ find_floating_ip_mock.side_effect = [
+ self.floating_ip,
+ ]
+ arglist = [
+ self.floating_ip.id,
+ "--qos-policy",
+ ]
+ verifylist = [
+ ('floating_ip', self.floating_ip.id),
+ ('qos_policy', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ result = self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'qos_policy_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)