Skip to content

Commit 67700e6

Browse files
Miguel Lavalleslawqo
authored andcommitted
Support tagging Neutron ports on creation
This change adds support for tagging ports on creation Co-Authored-By: Slawek Kaplonski <skaplons@redhat.com> Change-Id: I3148a568664588eb2f529138f984859570c0fca1 Related-Bug: #1815933
1 parent 95cc05b commit 67700e6

3 files changed

Lines changed: 59 additions & 15 deletions

File tree

.zuul.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
neutron-segments: true
9292
q-metering: true
9393
q-qos: true
94+
neutron-tag-ports-during-bulk-creation: true
9495
tox_envlist: functional
9596

9697
- job:

openstackclient/network/v2/port.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,12 +454,23 @@ def take_action(self, parsed_args):
454454
if parsed_args.qos_policy:
455455
attrs['qos_policy_id'] = client.find_qos_policy(
456456
parsed_args.qos_policy, ignore_missing=False).id
457+
458+
set_tags_in_post = bool(
459+
client.find_extension('tag-ports-during-bulk-creation'))
460+
if set_tags_in_post:
461+
if parsed_args.no_tag:
462+
attrs['tags'] = []
463+
if parsed_args.tags:
464+
attrs['tags'] = list(set(parsed_args.tags))
465+
457466
with common.check_missing_extension_if_error(
458467
self.app.client_manager.network, attrs):
459468
obj = client.create_port(**attrs)
460469

461-
# tags cannot be set when created, so tags need to be set later.
462-
_tag.update_tags_for_set(client, obj, parsed_args)
470+
if not set_tags_in_post:
471+
# tags cannot be set when created, so tags need to be set later.
472+
_tag.update_tags_for_set(client, obj, parsed_args)
473+
463474
display_columns, columns = _get_columns(obj)
464475
data = utils.get_item_properties(obj, columns, formatters=_formatters)
465476

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

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ def setUp(self):
119119
self.network.find_network = mock.Mock(return_value=fake_net)
120120
self.fake_subnet = network_fakes.FakeSubnet.create_one_subnet()
121121
self.network.find_subnet = mock.Mock(return_value=self.fake_subnet)
122+
self.network.find_extension = mock.Mock(return_value=[])
122123
# Get the command object to test
123124
self.cmd = port.CreatePort(self.app, self.namespace)
124125

@@ -534,7 +535,7 @@ def test_create_port_security_disabled(self):
534535
'name': 'test-port',
535536
})
536537

537-
def _test_create_with_tag(self, add_tags=True):
538+
def _test_create_with_tag(self, add_tags=True, add_tags_in_post=True):
538539
arglist = [
539540
'--network', self._port.network_id,
540541
'test-port',
@@ -553,28 +554,59 @@ def _test_create_with_tag(self, add_tags=True):
553554
else:
554555
verifylist.append(('no_tag', True))
555556

557+
self.network.find_extension = mock.Mock(return_value=add_tags_in_post)
558+
556559
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
557560
columns, data = (self.cmd.take_action(parsed_args))
558561

559-
self.network.create_port.assert_called_once_with(
560-
admin_state_up=True,
561-
network_id=self._port.network_id,
562-
name='test-port'
563-
)
564-
if add_tags:
565-
self.network.set_tags.assert_called_once_with(
566-
self._port,
567-
tests_utils.CompareBySet(['red', 'blue']))
562+
args = {
563+
'admin_state_up': True,
564+
'network_id': self._port.network_id,
565+
'name': 'test-port',
566+
}
567+
if add_tags_in_post:
568+
if add_tags:
569+
args['tags'] = sorted(['red', 'blue'])
570+
else:
571+
args['tags'] = []
572+
self.network.create_port.assert_called_once()
573+
# Now we need to verify if arguments to call create_port are as
574+
# expected,
575+
# But we can't simply use assert_called_once_with() method because
576+
# duplicates from 'tags' are removed with
577+
# list(set(parsed_args.tags)) and that don't quarantee order of
578+
# tags list which is used to call create_port().
579+
create_port_call_kwargs = self.network.create_port.call_args[1]
580+
create_port_call_kwargs['tags'] = sorted(
581+
create_port_call_kwargs['tags'])
582+
self.assertDictEqual(args, create_port_call_kwargs)
568583
else:
569-
self.assertFalse(self.network.set_tags.called)
584+
self.network.create_port.assert_called_once_with(
585+
admin_state_up=True,
586+
network_id=self._port.network_id,
587+
name='test-port'
588+
)
589+
if add_tags:
590+
self.network.set_tags.assert_called_once_with(
591+
self._port,
592+
tests_utils.CompareBySet(['red', 'blue']))
593+
else:
594+
self.assertFalse(self.network.set_tags.called)
595+
570596
self.assertEqual(self.columns, columns)
571597
self.assertItemEqual(self.data, data)
572598

573599
def test_create_with_tags(self):
574-
self._test_create_with_tag(add_tags=True)
600+
self._test_create_with_tag(add_tags=True, add_tags_in_post=True)
575601

576602
def test_create_with_no_tag(self):
577-
self._test_create_with_tag(add_tags=False)
603+
self._test_create_with_tag(add_tags=False, add_tags_in_post=True)
604+
605+
def test_create_with_tags_using_put(self):
606+
self._test_create_with_tag(add_tags=True, add_tags_in_post=False)
607+
608+
def test_create_with_no_tag_using_put(self):
609+
self._test_create_with_tag(add_tags=False, add_tags_in_post=False)
578610

579611
def _test_create_with_uplink_status_propagation(self, enable=True):
580612
arglist = [

0 commit comments

Comments
 (0)