Skip to content

Commit 5918b6b

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "[Neutron] Add "qos-policy" parameter to router creation command"
2 parents 107c6b1 + 07515cd commit 5918b6b

4 files changed

Lines changed: 120 additions & 0 deletions

File tree

openstackclient/network/v2/router.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,11 @@ def get_parser(self, prog_name):
581581
help=argparse.SUPPRESS,
582582
)
583583
_parser_add_bfd_ecmp_arguments(parser)
584+
parser.add_argument(
585+
'--qos-policy',
586+
metavar='<qos-policy>',
587+
help=_('Attach QoS policy to router gateway IPs'),
588+
)
584589

585590
return parser
586591

@@ -603,6 +608,13 @@ def take_action(self, parsed_args):
603608
)
604609
raise exceptions.CommandError(msg)
605610

611+
if parsed_args.qos_policy and not parsed_args.external_gateways:
612+
msg = _(
613+
"You must specify '--external-gateway' in order "
614+
"to define a QoS policy"
615+
)
616+
raise exceptions.CommandError(msg)
617+
606618
if parsed_args.enable_ndp_proxy is not None:
607619
attrs['enable_ndp_proxy'] = parsed_args.enable_ndp_proxy
608620

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,44 @@ def test_router_create_and_delete(self):
4444
del_output = self.openstack('router delete ' + name1 + ' ' + name2)
4545
self.assertOutput('', del_output)
4646

47+
def test_router_create_with_external_gateway(self):
48+
network_name = uuid.uuid4().hex
49+
subnet_name = uuid.uuid4().hex
50+
qos_policy = uuid.uuid4().hex
51+
router_name = uuid.uuid4().hex
52+
53+
cmd_net = self.openstack(
54+
f'network create --external {network_name}', parse_output=True
55+
)
56+
self.addCleanup(self.openstack, f'network delete {network_name}')
57+
network_id = cmd_net['id']
58+
59+
self.openstack(
60+
f'subnet create {subnet_name} '
61+
f'--network {network_name} --subnet-range 10.0.0.0/24'
62+
)
63+
64+
cmd_qos = self.openstack(
65+
f'network qos policy create {qos_policy}', parse_output=True
66+
)
67+
self.addCleanup(
68+
self.openstack, f'network qos policy delete {qos_policy}'
69+
)
70+
qos_id = cmd_qos['id']
71+
72+
self.openstack(
73+
f'router create --external-gateway {network_name} '
74+
f'--qos-policy {qos_policy} {router_name}'
75+
)
76+
self.addCleanup(self.openstack, f'router delete {router_name}')
77+
78+
cmd_output = self.openstack(
79+
f'router show {router_name}', parse_output=True
80+
)
81+
gw_info = cmd_output['external_gateway_info']
82+
self.assertEqual(network_id, gw_info['network_id'])
83+
self.assertEqual(qos_id, gw_info['qos_policy_id'])
84+
4785
def test_router_list(self):
4886
"""Test create, list filter"""
4987
# Get project IDs

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,69 @@ def test_create_with_enable_default_route_ecmp_no_extension(self):
552552
parsed_args,
553553
)
554554

555+
def test_create_with_qos_policy(self):
556+
_network = network_fakes.create_one_network()
557+
self.network_client.find_network = mock.Mock(return_value=_network)
558+
_qos_policy = (
559+
network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
560+
)
561+
self.network_client.find_qos_policy = mock.Mock(
562+
return_value=_qos_policy
563+
)
564+
arglist = [
565+
self.new_router.name,
566+
'--external-gateway',
567+
_network.id,
568+
'--qos-policy',
569+
_qos_policy.id,
570+
]
571+
verifylist = [
572+
('name', self.new_router.name),
573+
('enable', True),
574+
('distributed', False),
575+
('ha', False),
576+
('qos_policy', _qos_policy.id),
577+
('external_gateways', [_network.id]),
578+
]
579+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
580+
columns, data = self.cmd.take_action(parsed_args)
581+
gw_info = {'network_id': _network.id, 'qos_policy_id': _qos_policy.id}
582+
self.network_client.create_router.assert_called_once_with(
583+
**{
584+
'admin_state_up': True,
585+
'name': self.new_router.name,
586+
**{'external_gateway_info': gw_info},
587+
}
588+
)
589+
self.assertEqual(self.columns, columns)
590+
self.assertCountEqual(self.data, data)
591+
592+
def test_create_with_qos_policy_no_external_gateway(self):
593+
_qos_policy = (
594+
network_fakes.FakeNetworkQosPolicy.create_one_qos_policy()
595+
)
596+
self.network_client.find_qos_policy = mock.Mock(
597+
return_value=_qos_policy
598+
)
599+
arglist = [
600+
self.new_router.name,
601+
'--qos-policy',
602+
_qos_policy.id,
603+
]
604+
verifylist = [
605+
('name', self.new_router.name),
606+
('enable', True),
607+
('distributed', False),
608+
('ha', False),
609+
('qos_policy', _qos_policy.id),
610+
]
611+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
612+
self.assertRaises(
613+
exceptions.CommandError,
614+
self.cmd.take_action,
615+
parsed_args,
616+
)
617+
555618

556619
class TestDeleteRouter(TestRouter):
557620
# The routers to delete.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
features:
3+
- |
4+
The router creation command now has the parameter ``--qos-policy``, that
5+
allows to set a QoS policy for the provided external gateways (one or
6+
many). It is mandatory to define an external gateway if the QoS policy is
7+
set.

0 commit comments

Comments
 (0)