From 510e9a7b8e567ce644473cad9e10651ff4bf2ca1 Mon Sep 17 00:00:00 2001
From: Kailun Qin <kailun.qin@intel.com>
Date: Wed, 13 Mar 2019 02:43:59 +0800
Subject: [PATCH] Fix: incorrect check when no shared/private input

When neither of "--shared" and "--private" is input, we should not allow
to specify "--project". Defaulting the created network segment range to
shared is expected. Therefore, "project_id" attr should only be
populated on a private range creation.

Change-Id: Iab345e1651dd8b7904ff64a20633f194d719bb84
Story: 2005206
Task: 29980
---
 .../network/v2/network_segment_range.py       |  4 +-
 .../network/v2/test_network_segment_range.py  | 49 +++++++++++++++++++
 2 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/openstackclient/network/v2/network_segment_range.py b/openstackclient/network/v2/network_segment_range.py
index 75820bc5ef..567b5b6eb9 100644
--- a/openstackclient/network/v2/network_segment_range.py
+++ b/openstackclient/network/v2/network_segment_range.py
@@ -168,7 +168,7 @@ class CreateNetworkSegmentRange(command.ShowOne):
 
         identity_client = self.app.client_manager.identity
 
-        if parsed_args.shared and parsed_args.project:
+        if not parsed_args.private and parsed_args.project:
             msg = _("--project is only allowed with --private")
             raise exceptions.CommandError(msg)
 
@@ -202,7 +202,7 @@ class CreateNetworkSegmentRange(command.ShowOne):
                 msg = (_("Failed to create the network segment range for "
                          "project %(project_id)s") % parsed_args.project_id)
                 raise exceptions.CommandError(msg)
-        elif not parsed_args.shared:
+        elif not attrs['shared']:
             # default to the current project if no project specified and shared
             # is not specified.
             # Get the project id from the current auth.
diff --git a/openstackclient/tests/unit/network/v2/test_network_segment_range.py b/openstackclient/tests/unit/network/v2/test_network_segment_range.py
index 63257086cd..22e25df133 100644
--- a/openstackclient/tests/unit/network/v2/test_network_segment_range.py
+++ b/openstackclient/tests/unit/network/v2/test_network_segment_range.py
@@ -98,6 +98,27 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
         self.assertRaises(tests_utils.ParserException, self.check_parser,
                           self.cmd, arglist, [])
 
+    def test_create_default_with_project_id(self):
+        arglist = [
+            '--project', self._network_segment_range.project_id,
+            '--network-type', 'vxlan',
+            '--minimum', str(self._network_segment_range.minimum),
+            '--maximum', str(self._network_segment_range.maximum),
+            self._network_segment_range.name,
+        ]
+        verifylist = [
+            ('project', self._network_segment_range.project_id),
+            ('network_type', 'vxlan'),
+            ('minimum', self._network_segment_range.minimum),
+            ('maximum', self._network_segment_range.maximum),
+            ('name', self._network_segment_range.name),
+        ]
+
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+        self.assertRaises(exceptions.CommandError,
+                          self.cmd.take_action,
+                          parsed_args)
+
     def test_create_shared_with_project_id(self):
         arglist = [
             '--shared',
@@ -144,6 +165,34 @@ class TestCreateNetworkSegmentRange(TestNetworkSegmentRange):
                           self.cmd.take_action,
                           parsed_args)
 
+    def test_create_minimum_options(self):
+        arglist = [
+            '--network-type', 'vxlan',
+            '--minimum', str(self._network_segment_range.minimum),
+            '--maximum', str(self._network_segment_range.maximum),
+            self._network_segment_range.name,
+        ]
+        verifylist = [
+            ('network_type', 'vxlan'),
+            ('minimum', self._network_segment_range.minimum),
+            ('maximum', self._network_segment_range.maximum),
+            ('name', self._network_segment_range.name),
+        ]
+
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+        columns, data = self.cmd.take_action(parsed_args)
+
+        self.network.create_network_segment_range.assert_called_once_with(**{
+            'shared': True,
+            'network_type': 'vxlan',
+            'minimum': self._network_segment_range.minimum,
+            'maximum': self._network_segment_range.maximum,
+            'name': self._network_segment_range.name,
+        })
+
+        self.assertEqual(self.columns, columns)
+        self.assertEqual(self.data, data)
+
     def test_create_private_minimum_options(self):
         arglist = [
             '--private',