Skip to content

Commit 51aee43

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Support tagging Neutron ports on creation"
2 parents 99b5adf + 67700e6 commit 51aee43

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
@@ -480,12 +480,23 @@ def take_action(self, parsed_args):
480480
if parsed_args.qos_policy:
481481
attrs['qos_policy_id'] = client.find_qos_policy(
482482
parsed_args.qos_policy, ignore_missing=False).id
483+
484+
set_tags_in_post = bool(
485+
client.find_extension('tag-ports-during-bulk-creation'))
486+
if set_tags_in_post:
487+
if parsed_args.no_tag:
488+
attrs['tags'] = []
489+
if parsed_args.tags:
490+
attrs['tags'] = list(set(parsed_args.tags))
491+
483492
with common.check_missing_extension_if_error(
484493
self.app.client_manager.network, attrs):
485494
obj = client.create_port(**attrs)
486495

487-
# tags cannot be set when created, so tags need to be set later.
488-
_tag.update_tags_for_set(client, obj, parsed_args)
496+
if not set_tags_in_post:
497+
# tags cannot be set when created, so tags need to be set later.
498+
_tag.update_tags_for_set(client, obj, parsed_args)
499+
489500
display_columns, columns = _get_columns(obj)
490501
data = utils.get_item_properties(obj, columns, formatters=_formatters)
491502

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

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

@@ -536,7 +537,7 @@ def test_create_port_security_disabled(self):
536537
'name': 'test-port',
537538
})
538539

539-
def _test_create_with_tag(self, add_tags=True):
540+
def _test_create_with_tag(self, add_tags=True, add_tags_in_post=True):
540541
arglist = [
541542
'--network', self._port.network_id,
542543
'test-port',
@@ -555,28 +556,59 @@ def _test_create_with_tag(self, add_tags=True):
555556
else:
556557
verifylist.append(('no_tag', True))
557558

559+
self.network.find_extension = mock.Mock(return_value=add_tags_in_post)
560+
558561
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
559562
columns, data = (self.cmd.take_action(parsed_args))
560563

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

575601
def test_create_with_tags(self):
576-
self._test_create_with_tag(add_tags=True)
602+
self._test_create_with_tag(add_tags=True, add_tags_in_post=True)
577603

578604
def test_create_with_no_tag(self):
579-
self._test_create_with_tag(add_tags=False)
605+
self._test_create_with_tag(add_tags=False, add_tags_in_post=True)
606+
607+
def test_create_with_tags_using_put(self):
608+
self._test_create_with_tag(add_tags=True, add_tags_in_post=False)
609+
610+
def test_create_with_no_tag_using_put(self):
611+
self._test_create_with_tag(add_tags=False, add_tags_in_post=False)
580612

581613
def _test_create_with_uplink_status_propagation(self, enable=True):
582614
arglist = [

0 commit comments

Comments
 (0)