Skip to content

Commit 264f81f

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Port set/unset SecGroup Bug Fix"
2 parents c6059be + 9d946f0 commit 264f81f

5 files changed

Lines changed: 67 additions & 50 deletions

File tree

openstackclient/network/v2/port.py

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ def _format_dns_assignment(dns_assignment):
5151
'extra_dhcp_opts': utils.format_list_of_dicts,
5252
'fixed_ips': utils.format_list_of_dicts,
5353
'security_group_ids': utils.format_list,
54-
'security_groups': utils.format_list,
5554
}
5655

5756

@@ -64,7 +63,6 @@ def _get_columns(item):
6463
'binding:vnic_type': 'binding_vnic_type',
6564
'is_admin_state_up': 'admin_state_up',
6665
'is_port_security_enabled': 'port_security_enabled',
67-
'security_group_ids': 'security_groups',
6866
'tenant_id': 'project_id',
6967
}
7068
return sdk_utils.get_osc_show_columns_for_sdk_resource(item, column_map)
@@ -349,7 +347,7 @@ def get_parser(self, prog_name):
349347
'--security-group',
350348
metavar='<security-group>',
351349
action='append',
352-
dest='security_groups',
350+
dest='security_group',
353351
help=_("Security group to associate with this port (name or ID) "
354352
"(repeat option to set multiple security groups)")
355353
)
@@ -391,12 +389,13 @@ def take_action(self, parsed_args):
391389
_prepare_fixed_ips(self.app.client_manager, parsed_args)
392390
attrs = _get_attrs(self.app.client_manager, parsed_args)
393391

394-
if parsed_args.security_groups:
395-
attrs['security_groups'] = [client.find_security_group(
396-
sg, ignore_missing=False).id
397-
for sg in parsed_args.security_groups]
398-
if parsed_args.no_security_group:
399-
attrs['security_groups'] = []
392+
if parsed_args.security_group:
393+
attrs['security_group_ids'] = [client.find_security_group(
394+
sg, ignore_missing=False).id
395+
for sg in
396+
parsed_args.security_group]
397+
elif parsed_args.no_security_group:
398+
attrs['security_group_ids'] = []
400399
if parsed_args.allowed_address_pairs:
401400
attrs['allowed_address_pairs'] = (
402401
_convert_address_pairs(parsed_args))
@@ -626,7 +625,7 @@ def get_parser(self, prog_name):
626625
'--security-group',
627626
metavar='<security-group>',
628627
action='append',
629-
dest='security_groups',
628+
dest='security_group',
630629
help=_("Security group to associate with this port (name or ID) "
631630
"(repeat option to set multiple security groups)")
632631
)
@@ -694,17 +693,16 @@ def take_action(self, parsed_args):
694693
attrs['fixed_ips'] += [ip for ip in obj.fixed_ips if ip]
695694
elif parsed_args.no_fixed_ip:
696695
attrs['fixed_ips'] = []
697-
if parsed_args.security_groups and parsed_args.no_security_group:
698-
attrs['security_groups'] = [client.find_security_group(sg,
699-
ignore_missing=False).id
700-
for sg in parsed_args.security_groups]
701-
elif parsed_args.security_groups:
702-
attrs['security_groups'] = obj.security_groups
703-
for sg in parsed_args.security_groups:
704-
sg_id = client.find_security_group(sg, ignore_missing=False).id
705-
attrs['security_groups'].append(sg_id)
696+
697+
if parsed_args.security_group:
698+
attrs['security_group_ids'] = [
699+
client.find_security_group(sg, ignore_missing=False).id for
700+
sg in parsed_args.security_group]
701+
if not parsed_args.no_security_group:
702+
attrs['security_group_ids'] += obj.security_group_ids
703+
706704
elif parsed_args.no_security_group:
707-
attrs['security_groups'] = []
705+
attrs['security_group_ids'] = []
708706

709707
if (parsed_args.allowed_address_pairs and
710708
parsed_args.no_allowed_address_pair):
@@ -769,7 +767,7 @@ def get_parser(self, prog_name):
769767
'--security-group',
770768
metavar='<security-group>',
771769
action='append',
772-
dest='security_groups',
770+
dest='security_group_ids',
773771
help=_("Security group which should be removed this port (name "
774772
"or ID) (repeat option to unset multiple security groups)")
775773
)
@@ -802,7 +800,7 @@ def take_action(self, parsed_args):
802800
# Unset* classes
803801
tmp_fixed_ips = copy.deepcopy(obj.fixed_ips)
804802
tmp_binding_profile = copy.deepcopy(obj.binding_profile)
805-
tmp_secgroups = copy.deepcopy(obj.security_groups)
803+
tmp_secgroups = copy.deepcopy(obj.security_group_ids)
806804
tmp_addr_pairs = copy.deepcopy(obj.allowed_address_pairs)
807805
_prepare_fixed_ips(self.app.client_manager, parsed_args)
808806
attrs = {}
@@ -822,16 +820,16 @@ def take_action(self, parsed_args):
822820
msg = _("Port does not contain binding-profile %s") % key
823821
raise exceptions.CommandError(msg)
824822
attrs['binding:profile'] = tmp_binding_profile
825-
if parsed_args.security_groups:
823+
if parsed_args.security_group_ids:
826824
try:
827-
for sg in parsed_args.security_groups:
825+
for sg in parsed_args.security_group_ids:
828826
sg_id = client.find_security_group(
829827
sg, ignore_missing=False).id
830828
tmp_secgroups.remove(sg_id)
831829
except ValueError:
832830
msg = _("Port does not contain security group %s") % sg
833831
raise exceptions.CommandError(msg)
834-
attrs['security_groups'] = tmp_secgroups
832+
attrs['security_group_ids'] = tmp_secgroups
835833
if parsed_args.allowed_address_pairs:
836834
try:
837835
for addr in _convert_address_pairs(parsed_args):

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class PortTests(base.TestCase):
2020
"""Functional tests for port. """
2121
NAME = uuid.uuid4().hex
2222
NETWORK_NAME = uuid.uuid4().hex
23+
SG_NAME = uuid.uuid4().hex
2324

2425
@classmethod
2526
def setUpClass(cls):
@@ -124,13 +125,25 @@ def test_port_set(self):
124125
self.assertEqual('xyzpdq', json_output.get('description'))
125126
self.assertEqual('DOWN', json_output.get('admin_state_up'))
126127

127-
raw_output = self.openstack('port set ' + '--enable ' + self.NAME)
128+
raw_output = self.openstack(
129+
'port set ' + '--enable ' + self.NAME)
128130
self.assertOutput('', raw_output)
129131

130132
json_output = json.loads(self.openstack(
131133
'port show -f json ' + self.NAME
132134
))
135+
sg_id = json_output.get('security_group_ids')
136+
133137
self.assertEqual(self.NAME, json_output.get('name'))
134138
self.assertEqual('xyzpdq', json_output.get('description'))
135139
self.assertEqual('UP', json_output.get('admin_state_up'))
136140
self.assertIsNotNone(json_output.get('mac_address'))
141+
142+
raw_output = self.openstack(
143+
'port unset --security-group ' + sg_id + ' ' + id1)
144+
self.assertOutput('', raw_output)
145+
146+
json_output = json.loads(self.openstack(
147+
'port show -f json ' + self.NAME
148+
))
149+
self.assertEqual('', json_output.get('security_group_ids'))

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ def create_one_port(attrs=None):
544544
'name': 'port-name-' + uuid.uuid4().hex,
545545
'network_id': 'network-id-' + uuid.uuid4().hex,
546546
'port_security_enabled': True,
547-
'security_groups': [],
547+
'security_group_ids': [],
548548
'status': 'ACTIVE',
549549
'tenant_id': 'project-id-' + uuid.uuid4().hex,
550550
}
@@ -564,7 +564,7 @@ def create_one_port(attrs=None):
564564
port.is_admin_state_up = port_attrs['admin_state_up']
565565
port.is_port_security_enabled = port_attrs['port_security_enabled']
566566
port.project_id = port_attrs['tenant_id']
567-
port.security_group_ids = port_attrs['security_groups']
567+
port.security_group_ids = port_attrs['security_group_ids']
568568

569569
return port
570570

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def _get_common_cols_data(self, fake_port):
5757
'network_id',
5858
'port_security_enabled',
5959
'project_id',
60-
'security_groups',
60+
'security_group_ids',
6161
'status',
6262
)
6363

@@ -82,7 +82,7 @@ def _get_common_cols_data(self, fake_port):
8282
fake_port.network_id,
8383
fake_port.port_security_enabled,
8484
fake_port.project_id,
85-
utils.format_list(fake_port.security_groups),
85+
utils.format_list(fake_port.security_group_ids),
8686
fake_port.status,
8787
)
8888

@@ -251,7 +251,7 @@ def test_create_with_security_group(self):
251251
verifylist = [
252252
('network', self._port.network_id,),
253253
('enable', True),
254-
('security_groups', [secgroup.id]),
254+
('security_group', [secgroup.id]),
255255
('name', 'test-port'),
256256
]
257257
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -261,7 +261,7 @@ def test_create_with_security_group(self):
261261
self.network.create_port.assert_called_once_with(**{
262262
'admin_state_up': True,
263263
'network_id': self._port.network_id,
264-
'security_groups': [secgroup.id],
264+
'security_group_ids': [secgroup.id],
265265
'name': 'test-port',
266266
})
267267

@@ -309,7 +309,7 @@ def test_create_with_security_groups(self):
309309
verifylist = [
310310
('network', self._port.network_id,),
311311
('enable', True),
312-
('security_groups', [sg_1.id, sg_2.id]),
312+
('security_group', [sg_1.id, sg_2.id]),
313313
('name', 'test-port'),
314314
]
315315
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -319,7 +319,7 @@ def test_create_with_security_groups(self):
319319
self.network.create_port.assert_called_once_with(**{
320320
'admin_state_up': True,
321321
'network_id': self._port.network_id,
322-
'security_groups': [sg_1.id, sg_2.id],
322+
'security_group_ids': [sg_1.id, sg_2.id],
323323
'name': 'test-port',
324324
})
325325

@@ -346,7 +346,7 @@ def test_create_with_no_security_groups(self):
346346
self.network.create_port.assert_called_once_with(**{
347347
'admin_state_up': True,
348348
'network_id': self._port.network_id,
349-
'security_groups': [],
349+
'security_group_ids': [],
350350
'name': 'test-port',
351351
})
352352

@@ -590,7 +590,7 @@ class TestListPort(TestPort):
590590
prt.mac_address,
591591
utils.format_list_of_dicts(prt.fixed_ips),
592592
prt.status,
593-
utils.format_list(prt.security_groups),
593+
utils.format_list(prt.security_group_ids),
594594
prt.device_owner,
595595
))
596596

@@ -1111,15 +1111,15 @@ def test_set_security_group(self):
11111111
self._port.name,
11121112
]
11131113
verifylist = [
1114-
('security_groups', [sg.id]),
1114+
('security_group', [sg.id]),
11151115
('port', self._port.name),
11161116
]
11171117

11181118
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
11191119
result = self.cmd.take_action(parsed_args)
11201120

11211121
attrs = {
1122-
'security_groups': [sg.id],
1122+
'security_group_ids': [sg.id],
11231123
}
11241124
self.network.update_port.assert_called_once_with(self._port, **attrs)
11251125
self.assertIsNone(result)
@@ -1130,21 +1130,21 @@ def test_append_security_group(self):
11301130
sg_3 = network_fakes.FakeSecurityGroup.create_one_security_group()
11311131
self.network.find_security_group = mock.Mock(side_effect=[sg_2, sg_3])
11321132
_testport = network_fakes.FakePort.create_one_port(
1133-
{'security_groups': [sg_1.id]})
1133+
{'security_group_ids': [sg_1.id]})
11341134
self.network.find_port = mock.Mock(return_value=_testport)
11351135
arglist = [
11361136
'--security-group', sg_2.id,
11371137
'--security-group', sg_3.id,
11381138
_testport.name,
11391139
]
11401140
verifylist = [
1141-
('security_groups', [sg_2.id, sg_3.id]),
1141+
('security_group', [sg_2.id, sg_3.id]),
11421142
('port', _testport.name),
11431143
]
11441144
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
11451145
result = self.cmd.take_action(parsed_args)
11461146
attrs = {
1147-
'security_groups': [sg_1.id, sg_2.id, sg_3.id],
1147+
'security_group_ids': [sg_2.id, sg_3.id, sg_1.id],
11481148
}
11491149
self.network.update_port.assert_called_once_with(_testport, **attrs)
11501150
self.assertIsNone(result)
@@ -1163,7 +1163,7 @@ def test_set_no_security_groups(self):
11631163
result = self.cmd.take_action(parsed_args)
11641164

11651165
attrs = {
1166-
'security_groups': [],
1166+
'security_group_ids': [],
11671167
}
11681168
self.network.update_port.assert_called_once_with(self._port, **attrs)
11691169
self.assertIsNone(result)
@@ -1172,7 +1172,7 @@ def test_overwrite_security_group(self):
11721172
sg1 = network_fakes.FakeSecurityGroup.create_one_security_group()
11731173
sg2 = network_fakes.FakeSecurityGroup.create_one_security_group()
11741174
_testport = network_fakes.FakePort.create_one_port(
1175-
{'security_groups': [sg1.id]})
1175+
{'security_group_ids': [sg1.id]})
11761176
self.network.find_port = mock.Mock(return_value=_testport)
11771177
self.network.find_security_group = mock.Mock(return_value=sg2)
11781178
arglist = [
@@ -1181,13 +1181,13 @@ def test_overwrite_security_group(self):
11811181
_testport.name,
11821182
]
11831183
verifylist = [
1184-
('security_groups', [sg2.id]),
1184+
('security_group', [sg2.id]),
11851185
('no_security_group', True)
11861186
]
11871187
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
11881188
result = self.cmd.take_action(parsed_args)
11891189
attrs = {
1190-
'security_groups': [sg2.id],
1190+
'security_group_ids': [sg2.id],
11911191
}
11921192
self.network.update_port.assert_called_once_with(_testport, **attrs)
11931193
self.assertIsNone(result)
@@ -1434,22 +1434,22 @@ def test_unset_security_group(self):
14341434
_fake_sg1 = network_fakes.FakeSecurityGroup.create_one_security_group()
14351435
_fake_sg2 = network_fakes.FakeSecurityGroup.create_one_security_group()
14361436
_fake_port = network_fakes.FakePort.create_one_port(
1437-
{'security_groups': [_fake_sg1.id, _fake_sg2.id]})
1437+
{'security_group_ids': [_fake_sg1.id, _fake_sg2.id]})
14381438
self.network.find_port = mock.Mock(return_value=_fake_port)
14391439
self.network.find_security_group = mock.Mock(return_value=_fake_sg2)
14401440
arglist = [
14411441
'--security-group', _fake_sg2.id,
14421442
_fake_port.name,
14431443
]
14441444
verifylist = [
1445-
('security_groups', [_fake_sg2.id]),
1445+
('security_group_ids', [_fake_sg2.id]),
14461446
]
14471447

14481448
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
14491449
result = self.cmd.take_action(parsed_args)
14501450

14511451
attrs = {
1452-
'security_groups': [_fake_sg1.id]
1452+
'security_group_ids': [_fake_sg1.id]
14531453
}
14541454
self.network.update_port.assert_called_once_with(
14551455
_fake_port, **attrs)
@@ -1459,14 +1459,14 @@ def test_unset_port_security_group_not_existent(self):
14591459
_fake_sg1 = network_fakes.FakeSecurityGroup.create_one_security_group()
14601460
_fake_sg2 = network_fakes.FakeSecurityGroup.create_one_security_group()
14611461
_fake_port = network_fakes.FakePort.create_one_port(
1462-
{'security_groups': [_fake_sg1.id]})
1462+
{'security_group_ids': [_fake_sg1.id]})
14631463
self.network.find_security_group = mock.Mock(return_value=_fake_sg2)
14641464
arglist = [
14651465
'--security-group', _fake_sg2.id,
14661466
_fake_port.name,
14671467
]
14681468
verifylist = [
1469-
('security_groups', [_fake_sg2.id]),
1469+
('security_group_ids', [_fake_sg2.id]),
14701470
]
14711471

14721472
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
fixes:
3+
- |
4+
Fixed the ``port set`` and ``port unset`` command failures
5+
(AttributeError) when ``--security-group`` option is included.
6+
[Bug `1656788 <https://bugs.launchpad.net/python-openstackclient/+bug/1656788>`_]

0 commit comments

Comments
 (0)