Skip to content

Commit 7fae757

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "network: Add --advertise-host argument to "add subnet""
2 parents 7719128 + 9242790 commit 7fae757

2 files changed

Lines changed: 69 additions & 4 deletions

File tree

openstackclient/network/v2/router.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -386,15 +386,36 @@ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
386386
metavar='<subnet>',
387387
help=_("Subnet to be added (name or ID)"),
388388
)
389+
parser.add_argument(
390+
'--advertise-host',
391+
action='store_true',
392+
default=False,
393+
dest='advertise_host',
394+
help=_(
395+
"Mark the subnet's prefixes to be advertised as host "
396+
"routes within the router's EVPN VNI. "
397+
"Only valid for EVPN routers."
398+
),
399+
)
389400
return parser
390401

391402
def take_action(self, parsed_args: argparse.Namespace) -> None:
392403
client = self.app.client_manager.network
393404
subnet = client.find_subnet(parsed_args.subnet, ignore_missing=False)
394-
client.add_interface_to_router(
395-
client.find_router(parsed_args.router, ignore_missing=False),
396-
subnet=subnet.id,
397-
)
405+
if parsed_args.advertise_host:
406+
# TODO(evpn): switch to client.add_interface_to_router() once
407+
# openstacksdk supports the advertise_host parameter.
408+
router = client.find_router(
409+
parsed_args.router, ignore_missing=False
410+
)
411+
router.add_interface(
412+
client, subnet_id=subnet.id, advertise_host=True
413+
)
414+
else:
415+
client.add_interface_to_router(
416+
client.find_router(parsed_args.router, ignore_missing=False),
417+
subnet=subnet.id,
418+
)
398419

399420

400421
class AddExtraRoutesToRouter(command.ShowOne):

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def setUp(self):
8686

8787
self.network_client.find_router.return_value = self._router
8888
self.network_client.find_subnet.return_value = self._subnet
89+
self._router.add_interface = mock.Mock()
8990

9091
self.cmd = router.AddSubnetToRouter(self.app, None)
9192

@@ -119,6 +120,49 @@ def test_add_subnet_required_options(self):
119120

120121
self.assertIsNone(result)
121122

123+
def test_add_subnet_with_advertise_host(self):
124+
arglist = [
125+
self._router.id,
126+
self._router.subnet,
127+
'--advertise-host',
128+
]
129+
verifylist = [
130+
('router', self._router.id),
131+
('subnet', self._router.subnet),
132+
('advertise_host', True),
133+
]
134+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
135+
136+
result = self.cmd.take_action(parsed_args)
137+
self._router.add_interface.assert_called_once_with(
138+
self.network_client,
139+
subnet_id=self._subnet.id,
140+
advertise_host=True,
141+
)
142+
self.network_client.add_interface_to_router.assert_not_called()
143+
144+
self.assertIsNone(result)
145+
146+
def test_add_subnet_without_advertise_host(self):
147+
arglist = [
148+
self._router.id,
149+
self._router.subnet,
150+
]
151+
verifylist = [
152+
('router', self._router.id),
153+
('subnet', self._router.subnet),
154+
('advertise_host', False),
155+
]
156+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
157+
158+
result = self.cmd.take_action(parsed_args)
159+
self.network_client.add_interface_to_router.assert_called_once_with(
160+
self._router, subnet=self._subnet.id
161+
)
162+
self._router.add_interface.assert_not_called()
163+
164+
self.assertIsNone(result)
165+
122166

123167
class TestCreateRouter(TestRouter):
124168
# The new router created.

0 commit comments

Comments
 (0)