Skip to content

Commit 3a915b5

Browse files
author
judy-yu
committed
Not appropriate name sg rule attribute
For ingress rules set ip-prefix means src-ip- prefix, but for egress rules set ip-prefix means dst-ip-prefix. It is not appropriate to name src-ip directly. So as to src-group. Change-Id: I03fd0e14e470e7272930ac2651e73263b83bd4e1 Closes-bug: #1637365
1 parent 970b0e0 commit 3a915b5

4 files changed

Lines changed: 190 additions & 22 deletions

File tree

doc/source/command-objects/security-group-rule.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@ Create a new security group rule
1616
.. code:: bash
1717
1818
os security group rule create
19-
[--src-ip <ip-address> | --src-group <group>]
19+
[--remote-ip <ip-address> | --remote-group <group>]
2020
[--dst-port <port-range> | [--icmp-type <icmp-type> [--icmp-code <icmp-code>]]]
2121
[--protocol <protocol>]
2222
[--ingress | --egress]
2323
[--ethertype <ethertype>]
2424
[--project <project> [--project-domain <project-domain>]]
2525
<group>
2626
27-
.. option:: --src-ip <ip-address>
27+
.. option:: --remote-ip <ip-address>
2828
29-
Source IP address block
29+
Remote IP address block
3030
(may use CIDR notation; default for IPv4 rule: 0.0.0.0/0)
3131
32-
.. option:: --src-group <group>
32+
.. option:: --remote-group <group>
3333
34-
Source security group (name or ID)
34+
Remote security group (name or ID)
3535
3636
.. option:: --dst-port <port-range>
3737

openstackclient/network/v2/security_group_rule.py

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,31 @@ def update_parser_common(self, parser):
9494
metavar='<group>',
9595
help=_("Create rule in this security group (name or ID)")
9696
)
97-
source_group = parser.add_mutually_exclusive_group()
98-
source_group.add_argument(
97+
# NOTE(yujie): Support either remote-ip option name for now.
98+
# However, consider deprecating and then removing --src-ip in
99+
# a future release.
100+
remote_group = parser.add_mutually_exclusive_group()
101+
remote_group.add_argument(
102+
"--remote-ip",
103+
metavar="<ip-address>",
104+
help=_("Remote IP address block (may use CIDR notation; "
105+
"default for IPv4 rule: 0.0.0.0/0)")
106+
)
107+
remote_group.add_argument(
99108
"--src-ip",
100109
metavar="<ip-address>",
101110
help=_("Source IP address block (may use CIDR notation; "
102111
"default for IPv4 rule: 0.0.0.0/0)")
103112
)
104-
source_group.add_argument(
113+
# NOTE(yujie): Support either remote-group option name for now.
114+
# However, consider deprecating and then removing --src-group in
115+
# a future release.
116+
remote_group.add_argument(
117+
"--remote-group",
118+
metavar="<group>",
119+
help=_("Remote security group (name or ID)")
120+
)
121+
remote_group.add_argument(
105122
"--src-group",
106123
metavar="<group>",
107124
help=_("Source security group (name or ID)")
@@ -277,13 +294,16 @@ def take_action_network(self, client, parsed_args):
277294
if parsed_args.icmp_code:
278295
attrs['port_range_max'] = parsed_args.icmp_code
279296

280-
if parsed_args.src_group is not None:
297+
if not (parsed_args.remote_group is None and
298+
parsed_args.src_group is None):
281299
attrs['remote_group_id'] = client.find_security_group(
282-
parsed_args.src_group,
300+
parsed_args.remote_group or parsed_args.src_group,
283301
ignore_missing=False
284302
).id
285-
elif parsed_args.src_ip is not None:
286-
attrs['remote_ip_prefix'] = parsed_args.src_ip
303+
elif not (parsed_args.remote_ip is None and
304+
parsed_args.src_ip is None):
305+
attrs['remote_ip_prefix'] = (parsed_args.remote_ip or
306+
parsed_args.src_ip)
287307
elif attrs['ethertype'] == 'IPv4':
288308
attrs['remote_ip_prefix'] = '0.0.0.0/0'
289309
attrs['security_group_id'] = security_group_id
@@ -312,23 +332,25 @@ def take_action_compute(self, client, parsed_args):
312332
from_port, to_port = -1, -1
313333
else:
314334
from_port, to_port = parsed_args.dst_port
315-
src_ip = None
316-
if parsed_args.src_group is not None:
317-
parsed_args.src_group = utils.find_resource(
335+
remote_ip = None
336+
if not (parsed_args.remote_group is None and
337+
parsed_args.src_group is None):
338+
parsed_args.remote_group = utils.find_resource(
318339
client.security_groups,
319-
parsed_args.src_group,
340+
parsed_args.remote_group or parsed_args.src_group,
320341
).id
321-
if parsed_args.src_ip is not None:
322-
src_ip = parsed_args.src_ip
342+
if not (parsed_args.remote_ip is None and
343+
parsed_args.src_ip is None):
344+
remote_ip = parsed_args.remote_ip or parsed_args.src_ip
323345
else:
324-
src_ip = '0.0.0.0/0'
346+
remote_ip = '0.0.0.0/0'
325347
obj = client.security_group_rules.create(
326348
group.id,
327349
protocol,
328350
from_port,
329351
to_port,
330-
src_ip,
331-
parsed_args.src_group,
352+
remote_ip,
353+
parsed_args.remote_group,
332354
)
333355
return _format_security_group_rule_show(obj._info)
334356

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

Lines changed: 140 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,15 @@ def test_create_all_source_options(self):
119119
self.assertRaises(tests_utils.ParserException,
120120
self.check_parser, self.cmd, arglist, [])
121121

122+
def test_create_all_remote_options(self):
123+
arglist = [
124+
'--remote-ip', '10.10.0.0/24',
125+
'--remote-group', self._security_group.id,
126+
self._security_group.id,
127+
]
128+
self.assertRaises(tests_utils.ParserException,
129+
self.check_parser, self.cmd, arglist, [])
130+
122131
def test_create_bad_ethertype(self):
123132
arglist = [
124133
'--ethertype', 'foo',
@@ -213,7 +222,7 @@ def test_create_proto_option(self):
213222
self.assertEqual(self.expected_columns, columns)
214223
self.assertEqual(self.expected_data, data)
215224

216-
def test_create_source_group(self):
225+
def test_create_remote_group(self):
217226
self._setup_security_group_rule({
218227
'port_range_max': 22,
219228
'port_range_min': 22,
@@ -248,6 +257,34 @@ def test_create_source_group(self):
248257
self.assertEqual(self.expected_columns, columns)
249258
self.assertEqual(self.expected_data, data)
250259

260+
def test_create_source_group(self):
261+
self._setup_security_group_rule({
262+
'remote_group_id': self._security_group.id,
263+
})
264+
arglist = [
265+
'--ingress',
266+
'--src-group', self._security_group.name,
267+
self._security_group.id,
268+
]
269+
verifylist = [
270+
('ingress', True),
271+
('src_group', self._security_group.name),
272+
('group', self._security_group.id),
273+
]
274+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
275+
276+
columns, data = self.cmd.take_action(parsed_args)
277+
278+
self.network.create_security_group_rule.assert_called_once_with(**{
279+
'direction': self._security_group_rule.direction,
280+
'ethertype': self._security_group_rule.ethertype,
281+
'protocol': self._security_group_rule.protocol,
282+
'remote_group_id': self._security_group_rule.remote_group_id,
283+
'security_group_id': self._security_group.id,
284+
})
285+
self.assertEqual(self.expected_columns, columns)
286+
self.assertEqual(self.expected_data, data)
287+
251288
def test_create_source_ip(self):
252289
self._setup_security_group_rule({
253290
'protocol': 'icmp',
@@ -277,6 +314,35 @@ def test_create_source_ip(self):
277314
self.assertEqual(self.expected_columns, columns)
278315
self.assertEqual(self.expected_data, data)
279316

317+
def test_create_remote_ip(self):
318+
self._setup_security_group_rule({
319+
'protocol': 'icmp',
320+
'remote_ip_prefix': '10.0.2.0/24',
321+
})
322+
arglist = [
323+
'--protocol', self._security_group_rule.protocol,
324+
'--remote-ip', self._security_group_rule.remote_ip_prefix,
325+
self._security_group.id,
326+
]
327+
verifylist = [
328+
('protocol', self._security_group_rule.protocol),
329+
('remote_ip', self._security_group_rule.remote_ip_prefix),
330+
('group', self._security_group.id),
331+
]
332+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
333+
334+
columns, data = self.cmd.take_action(parsed_args)
335+
336+
self.network.create_security_group_rule.assert_called_once_with(**{
337+
'direction': self._security_group_rule.direction,
338+
'ethertype': self._security_group_rule.ethertype,
339+
'protocol': self._security_group_rule.protocol,
340+
'remote_ip_prefix': self._security_group_rule.remote_ip_prefix,
341+
'security_group_id': self._security_group.id,
342+
})
343+
self.assertEqual(self.expected_columns, columns)
344+
self.assertEqual(self.expected_data, data)
345+
280346
def test_create_network_options(self):
281347
self._setup_security_group_rule({
282348
'direction': 'egress',
@@ -498,6 +564,15 @@ def test_create_all_source_options(self):
498564
self.assertRaises(tests_utils.ParserException,
499565
self.check_parser, self.cmd, arglist, [])
500566

567+
def test_create_all_remote_options(self):
568+
arglist = [
569+
'--remote-ip', '10.10.0.0/24',
570+
'--remote-group', self._security_group.id,
571+
self._security_group.id,
572+
]
573+
self.assertRaises(tests_utils.ParserException,
574+
self.check_parser, self.cmd, arglist, [])
575+
501576
def test_create_bad_protocol(self):
502577
arglist = [
503578
'--protocol', 'foo',
@@ -588,6 +663,38 @@ def test_create_source_group(self):
588663
self.assertEqual(expected_columns, columns)
589664
self.assertEqual(expected_data, data)
590665

666+
def test_create_remote_group(self):
667+
expected_columns, expected_data = self._setup_security_group_rule({
668+
'from_port': 22,
669+
'to_port': 22,
670+
'group': {'name': self._security_group.name},
671+
})
672+
arglist = [
673+
'--dst-port', str(self._security_group_rule.from_port),
674+
'--remote-group', self._security_group.name,
675+
self._security_group.id,
676+
]
677+
verifylist = [
678+
('dst_port', (self._security_group_rule.from_port,
679+
self._security_group_rule.to_port)),
680+
('remote_group', self._security_group.name),
681+
('group', self._security_group.id),
682+
]
683+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
684+
685+
columns, data = self.cmd.take_action(parsed_args)
686+
687+
self.compute.security_group_rules.create.assert_called_once_with(
688+
self._security_group.id,
689+
self._security_group_rule.ip_protocol,
690+
self._security_group_rule.from_port,
691+
self._security_group_rule.to_port,
692+
self._security_group_rule.ip_range['cidr'],
693+
self._security_group.id,
694+
)
695+
self.assertEqual(expected_columns, columns)
696+
self.assertEqual(expected_data, data)
697+
591698
def test_create_source_ip(self):
592699
expected_columns, expected_data = self._setup_security_group_rule({
593700
'ip_protocol': 'icmp',
@@ -620,6 +727,38 @@ def test_create_source_ip(self):
620727
self.assertEqual(expected_columns, columns)
621728
self.assertEqual(expected_data, data)
622729

730+
def test_create_remote_ip(self):
731+
expected_columns, expected_data = self._setup_security_group_rule({
732+
'ip_protocol': 'icmp',
733+
'from_port': -1,
734+
'to_port': -1,
735+
'ip_range': {'cidr': '10.0.2.0/24'},
736+
})
737+
arglist = [
738+
'--protocol', self._security_group_rule.ip_protocol,
739+
'--remote-ip', self._security_group_rule.ip_range['cidr'],
740+
self._security_group.id,
741+
]
742+
verifylist = [
743+
('protocol', self._security_group_rule.ip_protocol),
744+
('remote_ip', self._security_group_rule.ip_range['cidr']),
745+
('group', self._security_group.id),
746+
]
747+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
748+
749+
columns, data = self.cmd.take_action(parsed_args)
750+
751+
self.compute.security_group_rules.create.assert_called_once_with(
752+
self._security_group.id,
753+
self._security_group_rule.ip_protocol,
754+
self._security_group_rule.from_port,
755+
self._security_group_rule.to_port,
756+
self._security_group_rule.ip_range['cidr'],
757+
None,
758+
)
759+
self.assertEqual(expected_columns, columns)
760+
self.assertEqual(expected_data, data)
761+
623762
def test_create_proto_option(self):
624763
expected_columns, expected_data = self._setup_security_group_rule({
625764
'ip_protocol': 'icmp',
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
upgrade:
2+
-
3+
Changed the ``security group rule create`` command ``--src-ip``
4+
option to ``--remote-ip``, ``--src-group`` option to ``--remote-group``.
5+
Using the ``--src-ip`` ``--src-group`` option is still supported, but
6+
is no longer documented and may be deprecated in a future release.
7+
[Bug `1637365 <https://bugs.launchpad.net/python-openstackclient/+bug/1637365>`_]

0 commit comments

Comments
 (0)