Skip to content

Commit 235999b

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Supports router gateway IP QoS"
2 parents 955f223 + fd23025 commit 235999b

3 files changed

Lines changed: 217 additions & 1 deletion

File tree

openstackclient/network/v2/router.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,17 @@ def get_parser(self, prog_name):
593593
action='store_true',
594594
help=_("Disable Source NAT on external gateway")
595595
)
596+
qos_policy_group = parser.add_mutually_exclusive_group()
597+
qos_policy_group.add_argument(
598+
'--qos-policy',
599+
metavar='<qos-policy>',
600+
help=_("Attach QoS policy to router gateway IPs")
601+
)
602+
qos_policy_group.add_argument(
603+
'--no-qos-policy',
604+
action='store_true',
605+
help=_("Remove QoS policy from router gateway IPs")
606+
)
596607
_tag.add_tag_option_to_parser_for_set(parser, _('router'))
597608
return parser
598609

@@ -652,6 +663,27 @@ def take_action(self, parsed_args):
652663
ips.append(ip_spec)
653664
gateway_info['external_fixed_ips'] = ips
654665
attrs['external_gateway_info'] = gateway_info
666+
667+
if ((parsed_args.qos_policy or parsed_args.no_qos_policy) and
668+
not parsed_args.external_gateway):
669+
try:
670+
original_net_id = obj.external_gateway_info['network_id']
671+
except (KeyError, TypeError):
672+
msg = (_("You must specify '--external-gateway' or the router "
673+
"must already have an external network in order to "
674+
"set router gateway IP QoS"))
675+
raise exceptions.CommandError(msg)
676+
else:
677+
if not attrs.get('external_gateway_info'):
678+
attrs['external_gateway_info'] = {}
679+
attrs['external_gateway_info']['network_id'] = original_net_id
680+
if parsed_args.qos_policy:
681+
check_qos_id = client.find_qos_policy(
682+
parsed_args.qos_policy, ignore_missing=False).id
683+
attrs['external_gateway_info']['qos_policy_id'] = check_qos_id
684+
685+
if 'no_qos_policy' in parsed_args and parsed_args.no_qos_policy:
686+
attrs['external_gateway_info']['qos_policy_id'] = None
655687
if attrs:
656688
client.update_router(obj, **attrs)
657689
# tags is a subresource and it needs to be updated separately.
@@ -715,6 +747,12 @@ def get_parser(self, prog_name):
715747
action='store_true',
716748
default=False,
717749
help=_("Remove external gateway information from the router"))
750+
parser.add_argument(
751+
'--qos-policy',
752+
action='store_true',
753+
default=False,
754+
help=_("Remove QoS policy from router gateway IPs")
755+
)
718756
parser.add_argument(
719757
'router',
720758
metavar="<router>",
@@ -727,6 +765,7 @@ def take_action(self, parsed_args):
727765
client = self.app.client_manager.network
728766
obj = client.find_router(parsed_args.router, ignore_missing=False)
729767
tmp_routes = copy.deepcopy(obj.routes)
768+
tmp_external_gateway_info = copy.deepcopy(obj.external_gateway_info)
730769
attrs = {}
731770
if parsed_args.routes:
732771
try:
@@ -737,6 +776,20 @@ def take_action(self, parsed_args):
737776
msg = (_("Router does not contain route %s") % route)
738777
raise exceptions.CommandError(msg)
739778
attrs['routes'] = tmp_routes
779+
if parsed_args.qos_policy:
780+
try:
781+
if (tmp_external_gateway_info['network_id'] and
782+
tmp_external_gateway_info['qos_policy_id']):
783+
pass
784+
except (KeyError, TypeError):
785+
msg = _("Router does not have external network or qos policy")
786+
raise exceptions.CommandError(msg)
787+
else:
788+
attrs['external_gateway_info'] = {
789+
'network_id': tmp_external_gateway_info['network_id'],
790+
'qos_policy_id': None
791+
}
792+
740793
if parsed_args.external_gateway:
741794
attrs['external_gateway_info'] = {}
742795
if attrs:

openstackclient/tests/unit/network/v2/test_router.py

Lines changed: 155 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1132,6 +1132,102 @@ def test_set_with_tags(self):
11321132
def test_set_with_no_tag(self):
11331133
self._test_set_tags(with_tags=False)
11341134

1135+
def test_set_gateway_ip_qos(self):
1136+
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
1137+
self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
1138+
arglist = [
1139+
"--external-gateway", self._network.id,
1140+
"--qos-policy", qos_policy.id,
1141+
self._router.id,
1142+
]
1143+
verifylist = [
1144+
('router', self._router.id),
1145+
('external_gateway', self._network.id),
1146+
('qos_policy', qos_policy.id),
1147+
]
1148+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1149+
1150+
result = self.cmd.take_action(parsed_args)
1151+
self.network.update_router.assert_called_with(
1152+
self._router, **{'external_gateway_info': {
1153+
'network_id': self._network.id,
1154+
'qos_policy_id': qos_policy.id, }})
1155+
self.assertIsNone(result)
1156+
1157+
def test_unset_gateway_ip_qos(self):
1158+
arglist = [
1159+
"--external-gateway", self._network.id,
1160+
"--no-qos-policy",
1161+
self._router.id,
1162+
]
1163+
verifylist = [
1164+
('router', self._router.id),
1165+
('external_gateway', self._network.id),
1166+
('no_qos_policy', True),
1167+
]
1168+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1169+
1170+
result = self.cmd.take_action(parsed_args)
1171+
self.network.update_router.assert_called_with(
1172+
self._router, **{'external_gateway_info': {
1173+
'network_id': self._network.id,
1174+
'qos_policy_id': None, }})
1175+
self.assertIsNone(result)
1176+
1177+
def test_set_unset_gateway_ip_qos(self):
1178+
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
1179+
self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
1180+
arglist = [
1181+
"--external-gateway", self._network.id,
1182+
"--qos-policy", qos_policy.id,
1183+
"--no-qos-policy",
1184+
self._router.id,
1185+
]
1186+
verifylist = [
1187+
('router', self._router.id),
1188+
('external_gateway', self._network.id),
1189+
('qos_policy', qos_policy.id),
1190+
('no_qos_policy', True),
1191+
]
1192+
1193+
self.assertRaises(tests_utils.ParserException, self.check_parser,
1194+
self.cmd, arglist, verifylist)
1195+
1196+
def test_set_gateway_ip_qos_no_gateway(self):
1197+
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
1198+
self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
1199+
router = network_fakes.FakeRouter.create_one_router()
1200+
self.network.find_router = mock.Mock(return_value=router)
1201+
arglist = [
1202+
"--qos-policy", qos_policy.id,
1203+
router.id,
1204+
]
1205+
verifylist = [
1206+
('router', router.id),
1207+
('qos_policy', qos_policy.id),
1208+
]
1209+
1210+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1211+
self.assertRaises(exceptions.CommandError,
1212+
self.cmd.take_action, parsed_args)
1213+
1214+
def test_unset_gateway_ip_qos_no_gateway(self):
1215+
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
1216+
self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
1217+
router = network_fakes.FakeRouter.create_one_router()
1218+
self.network.find_router = mock.Mock(return_value=router)
1219+
arglist = [
1220+
"--no-qos-policy",
1221+
router.id,
1222+
]
1223+
verifylist = [
1224+
('router', router.id),
1225+
]
1226+
1227+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1228+
self.assertRaises(exceptions.CommandError,
1229+
self.cmd.take_action, parsed_args)
1230+
11351231

11361232
class TestShowRouter(TestRouter):
11371233

@@ -1240,12 +1336,19 @@ class TestUnsetRouter(TestRouter):
12401336

12411337
def setUp(self):
12421338
super(TestUnsetRouter, self).setUp()
1339+
self.fake_network = network_fakes.FakeNetwork.create_one_network()
1340+
self.fake_qos_policy = (
1341+
network_fakes.FakeNetworkQosPolicy.create_one_qos_policy())
12431342
self._testrouter = network_fakes.FakeRouter.create_one_router(
12441343
{'routes': [{"destination": "192.168.101.1/24",
12451344
"nexthop": "172.24.4.3"},
12461345
{"destination": "192.168.101.2/24",
12471346
"nexthop": "172.24.4.3"}],
1248-
'tags': ['green', 'red'], })
1347+
'tags': ['green', 'red'],
1348+
'external_gateway_info': {
1349+
'network_id': self.fake_network.id,
1350+
'qos_policy_id': self.fake_qos_policy.id
1351+
}})
12491352
self.fake_subnet = network_fakes.FakeSubnet.create_one_subnet()
12501353
self.network.find_router = mock.Mock(return_value=self._testrouter)
12511354
self.network.update_router = mock.Mock(return_value=None)
@@ -1328,3 +1431,54 @@ def test_unset_with_tags(self):
13281431

13291432
def test_unset_with_all_tag(self):
13301433
self._test_unset_tags(with_tags=False)
1434+
1435+
def test_unset_router_qos_policy(self):
1436+
arglist = [
1437+
'--qos-policy',
1438+
self._testrouter.name,
1439+
]
1440+
verifylist = [
1441+
('qos_policy', True)
1442+
]
1443+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1444+
result = self.cmd.take_action(parsed_args)
1445+
attrs = {'external_gateway_info': {"network_id": self.fake_network.id,
1446+
"qos_policy_id": None}}
1447+
self.network.update_router.assert_called_once_with(
1448+
self._testrouter, **attrs)
1449+
self.assertIsNone(result)
1450+
1451+
def test_unset_gateway_ip_qos_no_network(self):
1452+
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
1453+
self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
1454+
router = network_fakes.FakeRouter.create_one_router()
1455+
self.network.find_router = mock.Mock(return_value=router)
1456+
arglist = [
1457+
"--qos-policy",
1458+
router.id,
1459+
]
1460+
verifylist = [
1461+
('router', router.id),
1462+
]
1463+
1464+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1465+
self.assertRaises(exceptions.CommandError,
1466+
self.cmd.take_action, parsed_args)
1467+
1468+
def test_unset_gateway_ip_qos_no_qos(self):
1469+
qos_policy = network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
1470+
self.network.find_qos_policy = mock.Mock(return_value=qos_policy)
1471+
router = network_fakes.FakeRouter.create_one_router(
1472+
{"external_gateway_info": {"network_id": "fake-id"}})
1473+
self.network.find_router = mock.Mock(return_value=router)
1474+
arglist = [
1475+
"--qos-policy",
1476+
router.id,
1477+
]
1478+
verifylist = [
1479+
('router', router.id),
1480+
]
1481+
1482+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1483+
self.assertRaises(exceptions.CommandError,
1484+
self.cmd.take_action, parsed_args)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
features:
3+
- |
4+
Add support for attaching and removing qos policy to router gateway IPs.
5+
6+
Add ``--qos-policy`` and ``--no-qos-policy`` options to the
7+
``router set`` command.
8+
9+
Add ``--qos-policy`` option to the ``router unset`` command.

0 commit comments

Comments
 (0)