From 2109bce85a40da3e3cbebed1cac661611564ccb2 Mon Sep 17 00:00:00 2001
From: Richard Theis <rtheis@us.ibm.com>
Date: Thu, 17 Mar 2016 12:58:44 -0500
Subject: [PATCH] Support security group name for --src-group

Support security group name for the "--src-group" option on the
"os security group rule create" command.

Change-Id: Ic23d0671dad77566269c9a588644c8d774368733
Closes-Bug: #1540656
---
 doc/source/command-objects/security-group-rule.rst   |  2 +-
 openstackclient/network/v2/security_group_rule.py    | 12 ++++++++++--
 .../tests/network/v2/test_security_group_rule.py     | 10 +++++-----
 releasenotes/notes/bug-1540656-f7b7b7e3feef2440.yaml |  5 +++++
 4 files changed, 21 insertions(+), 8 deletions(-)
 create mode 100644 releasenotes/notes/bug-1540656-f7b7b7e3feef2440.yaml

diff --git a/doc/source/command-objects/security-group-rule.rst b/doc/source/command-objects/security-group-rule.rst
index ad496e79d1..fa07c3772c 100644
--- a/doc/source/command-objects/security-group-rule.rst
+++ b/doc/source/command-objects/security-group-rule.rst
@@ -28,7 +28,7 @@ Create a new security group rule
 
 .. option:: --src-group <group>
 
-    Source security group (ID only)
+    Source security group (name or ID)
 
 .. option:: --dst-port <port-range>
 
diff --git a/openstackclient/network/v2/security_group_rule.py b/openstackclient/network/v2/security_group_rule.py
index e024465432..f60995ab2f 100644
--- a/openstackclient/network/v2/security_group_rule.py
+++ b/openstackclient/network/v2/security_group_rule.py
@@ -69,7 +69,7 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne):
         source_group.add_argument(
             "--src-group",
             metavar="<group>",
-            help="Source security group (ID only)",
+            help="Source security group (name or ID)",
         )
         parser.add_argument(
             "--dst-port",
@@ -103,7 +103,10 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne):
             attrs['port_range_max'] = parsed_args.dst_port[1]
         attrs['protocol'] = parsed_args.proto
         if parsed_args.src_group is not None:
-            attrs['remote_group_id'] = parsed_args.src_group
+            attrs['remote_group_id'] = client.find_security_group(
+                parsed_args.src_group,
+                ignore_missing=False
+            ).id
         else:
             attrs['remote_ip_prefix'] = parsed_args.src_ip
         attrs['security_group_id'] = security_group_id
@@ -123,6 +126,11 @@ class CreateSecurityGroupRule(common.NetworkAndComputeShowOne):
             from_port, to_port = -1, -1
         else:
             from_port, to_port = parsed_args.dst_port
+        if parsed_args.src_group is not None:
+            parsed_args.src_group = utils.find_resource(
+                client.security_groups,
+                parsed_args.src_group,
+            ).id
         obj = client.security_group_rules.create(
             group.id,
             parsed_args.proto,
diff --git a/openstackclient/tests/network/v2/test_security_group_rule.py b/openstackclient/tests/network/v2/test_security_group_rule.py
index a0d6185c59..81b9e18bdc 100644
--- a/openstackclient/tests/network/v2/test_security_group_rule.py
+++ b/openstackclient/tests/network/v2/test_security_group_rule.py
@@ -149,13 +149,13 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork):
         })
         arglist = [
             '--dst-port', str(self._security_group_rule.port_range_min),
-            '--src-group', self._security_group.id,
+            '--src-group', self._security_group.name,
             self._security_group.id,
         ]
         verifylist = [
             ('dst_port', (self._security_group_rule.port_range_min,
                           self._security_group_rule.port_range_max)),
-            ('src_group', self._security_group.id),
+            ('src_group', self._security_group.name),
             ('group', self._security_group.id),
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -289,17 +289,17 @@ class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute):
         expected_columns, expected_data = self._setup_security_group_rule({
             'from_port': 22,
             'to_port': 22,
-            'group': {'name': self._security_group.id},
+            'group': {'name': self._security_group.name},
         })
         arglist = [
             '--dst-port', str(self._security_group_rule.from_port),
-            '--src-group', self._security_group.id,
+            '--src-group', self._security_group.name,
             self._security_group.id,
         ]
         verifylist = [
             ('dst_port', (self._security_group_rule.from_port,
                           self._security_group_rule.to_port)),
-            ('src_group', self._security_group.id),
+            ('src_group', self._security_group.name),
             ('group', self._security_group.id),
         ]
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
diff --git a/releasenotes/notes/bug-1540656-f7b7b7e3feef2440.yaml b/releasenotes/notes/bug-1540656-f7b7b7e3feef2440.yaml
new file mode 100644
index 0000000000..4abb284425
--- /dev/null
+++ b/releasenotes/notes/bug-1540656-f7b7b7e3feef2440.yaml
@@ -0,0 +1,5 @@
+---
+features:
+  - The ``security group rule create`` command now supports a security
+    group name for the ``--src-group`` option.
+    [Bug `1540656 <https://bugs.launchpad.net/bugs/1540656>`_]