From 90705f191e7f3831ecf9426679d5474ef5e5fecc Mon Sep 17 00:00:00 2001
From: Dean Troyer <dtroyer@gmail.com>
Date: Fri, 1 May 2015 17:37:38 -0500
Subject: [PATCH] Add os-client-config cli tests

Add tests for --os-cloud handling and precedence between CLI,
env vars and clouds.yaml.

Change-Id: I91d96f483d395f19ffcf74ec0187718ba01a1c41
---
 openstackclient/tests/test_shell.py | 256 +++++++++++++++++++++++++++-
 1 file changed, 255 insertions(+), 1 deletion(-)

diff --git a/openstackclient/tests/test_shell.py b/openstackclient/tests/test_shell.py
index a43be95413..492b60de29 100644
--- a/openstackclient/tests/test_shell.py
+++ b/openstackclient/tests/test_shell.py
@@ -13,6 +13,7 @@
 #   under the License.
 #
 
+import copy
 import mock
 import os
 
@@ -36,7 +37,6 @@ DEFAULT_TOKEN = "token"
 DEFAULT_SERVICE_URL = "http://127.0.0.1:8771/v3.0/"
 DEFAULT_AUTH_PLUGIN = "v2password"
 
-
 DEFAULT_COMPUTE_API_VERSION = "2"
 DEFAULT_IDENTITY_API_VERSION = "2"
 DEFAULT_IMAGE_API_VERSION = "2"
@@ -49,6 +49,46 @@ LIB_IMAGE_API_VERSION = "1"
 LIB_VOLUME_API_VERSION = "1"
 LIB_NETWORK_API_VERSION = "2"
 
+CLOUD_1 = {
+    'clouds': {
+        'scc': {
+            'auth': {
+                'auth_url': DEFAULT_AUTH_URL,
+                'project_name': DEFAULT_PROJECT_NAME,
+                'username': 'zaphod',
+            },
+            'region_name': 'occ-cloud',
+            'donut': 'glazed',
+        }
+    }
+}
+
+CLOUD_2 = {
+    'clouds': {
+        'megacloud': {
+            'cloud': 'megadodo',
+            'auth': {
+                'project_name': 'heart-o-gold',
+                'username': 'zaphod',
+            },
+            'region_name': 'occ-cloud',
+        }
+    }
+}
+
+PUBLIC_1 = {
+    'public-clouds': {
+        'megadodo': {
+            'auth': {
+                'auth_url': DEFAULT_AUTH_URL,
+                'project_name': DEFAULT_PROJECT_NAME,
+            },
+            'region_name': 'occ-public',
+            'donut': 'cake',
+        }
+    }
+}
+
 
 def make_shell():
     """Create a new command shell and mock out some bits."""
@@ -516,3 +556,217 @@ class TestShellCli(TestShell):
             "network_api_version": LIB_NETWORK_API_VERSION
         }
         self._assert_cli(flag, kwargs)
+
+    @mock.patch("os_client_config.config.OpenStackConfig._load_config_file")
+    def test_shell_args_cloud_no_vendor(self, config_mock):
+        config_mock.return_value = copy.deepcopy(CLOUD_1)
+        _shell = make_shell()
+
+        fake_execute(
+            _shell,
+            "--os-cloud scc list user",
+        )
+        self.assertEqual(
+            'scc',
+            _shell.cloud.name,
+        )
+
+        # These come from clouds.yaml
+        self.assertEqual(
+            DEFAULT_AUTH_URL,
+            _shell.cloud.config['auth']['auth_url'],
+        )
+        self.assertEqual(
+            DEFAULT_PROJECT_NAME,
+            _shell.cloud.config['auth']['project_name'],
+        )
+        self.assertEqual(
+            'zaphod',
+            _shell.cloud.config['auth']['username'],
+        )
+        self.assertEqual(
+            'occ-cloud',
+            _shell.cloud.config['region_name'],
+        )
+        self.assertEqual(
+            'glazed',
+            _shell.cloud.config['donut'],
+        )
+
+    @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file")
+    @mock.patch("os_client_config.config.OpenStackConfig._load_config_file")
+    def test_shell_args_cloud_public(self, config_mock, public_mock):
+        config_mock.return_value = copy.deepcopy(CLOUD_2)
+        public_mock.return_value = copy.deepcopy(PUBLIC_1)
+        _shell = make_shell()
+
+        fake_execute(
+            _shell,
+            "--os-cloud megacloud list user",
+        )
+        self.assertEqual(
+            'megacloud',
+            _shell.cloud.name,
+        )
+
+        # These come from clouds-public.yaml
+        self.assertEqual(
+            DEFAULT_AUTH_URL,
+            _shell.cloud.config['auth']['auth_url'],
+        )
+        self.assertEqual(
+            'cake',
+            _shell.cloud.config['donut'],
+        )
+
+        # These come from clouds.yaml
+        self.assertEqual(
+            'heart-o-gold',
+            _shell.cloud.config['auth']['project_name'],
+        )
+        self.assertEqual(
+            'zaphod',
+            _shell.cloud.config['auth']['username'],
+        )
+        self.assertEqual(
+            'occ-cloud',
+            _shell.cloud.config['region_name'],
+        )
+
+    @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file")
+    @mock.patch("os_client_config.config.OpenStackConfig._load_config_file")
+    def test_shell_args_precedence(self, config_mock, vendor_mock):
+        config_mock.return_value = copy.deepcopy(CLOUD_2)
+        vendor_mock.return_value = copy.deepcopy(PUBLIC_1)
+        _shell = make_shell()
+
+        # Test command option overriding config file value
+        fake_execute(
+            _shell,
+            "--os-cloud megacloud --os-region-name krikkit list user",
+        )
+        self.assertEqual(
+            'megacloud',
+            _shell.cloud.name,
+        )
+
+        # These come from clouds-public.yaml
+        self.assertEqual(
+            DEFAULT_AUTH_URL,
+            _shell.cloud.config['auth']['auth_url'],
+        )
+        self.assertEqual(
+            'cake',
+            _shell.cloud.config['donut'],
+        )
+
+        # These come from clouds.yaml
+        self.assertEqual(
+            'heart-o-gold',
+            _shell.cloud.config['auth']['project_name'],
+        )
+        self.assertEqual(
+            'zaphod',
+            _shell.cloud.config['auth']['username'],
+        )
+        self.assertEqual(
+            'krikkit',
+            _shell.cloud.config['region_name'],
+        )
+
+
+class TestShellCliEnv(TestShell):
+    def setUp(self):
+        super(TestShellCliEnv, self).setUp()
+        env = {
+            'OS_REGION_NAME': 'occ-env',
+        }
+        self.orig_env, os.environ = os.environ, env.copy()
+
+    def tearDown(self):
+        super(TestShellCliEnv, self).tearDown()
+        os.environ = self.orig_env
+
+    @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file")
+    @mock.patch("os_client_config.config.OpenStackConfig._load_config_file")
+    def test_shell_args_precedence_1(self, config_mock, vendor_mock):
+        config_mock.return_value = copy.deepcopy(CLOUD_2)
+        vendor_mock.return_value = copy.deepcopy(PUBLIC_1)
+        _shell = make_shell()
+
+        # Test env var
+        fake_execute(
+            _shell,
+            "--os-cloud megacloud list user",
+        )
+        self.assertEqual(
+            'megacloud',
+            _shell.cloud.name,
+        )
+
+        # These come from clouds-public.yaml
+        self.assertEqual(
+            DEFAULT_AUTH_URL,
+            _shell.cloud.config['auth']['auth_url'],
+        )
+        self.assertEqual(
+            'cake',
+            _shell.cloud.config['donut'],
+        )
+
+        # These come from clouds.yaml
+        self.assertEqual(
+            'heart-o-gold',
+            _shell.cloud.config['auth']['project_name'],
+        )
+        self.assertEqual(
+            'zaphod',
+            _shell.cloud.config['auth']['username'],
+        )
+        self.assertEqual(
+            'occ-env',
+            _shell.cloud.config['region_name'],
+        )
+
+    @mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file")
+    @mock.patch("os_client_config.config.OpenStackConfig._load_config_file")
+    def test_shell_args_precedence_2(self, config_mock, vendor_mock):
+        config_mock.return_value = copy.deepcopy(CLOUD_2)
+        vendor_mock.return_value = copy.deepcopy(PUBLIC_1)
+        _shell = make_shell()
+
+        # Test command option overriding config file value
+        fake_execute(
+            _shell,
+            "--os-cloud megacloud --os-region-name krikkit list user",
+        )
+        self.assertEqual(
+            'megacloud',
+            _shell.cloud.name,
+        )
+
+        # These come from clouds-public.yaml
+        self.assertEqual(
+            DEFAULT_AUTH_URL,
+            _shell.cloud.config['auth']['auth_url'],
+        )
+        self.assertEqual(
+            'cake',
+            _shell.cloud.config['donut'],
+        )
+
+        # These come from clouds.yaml
+        self.assertEqual(
+            'heart-o-gold',
+            _shell.cloud.config['auth']['project_name'],
+        )
+        self.assertEqual(
+            'zaphod',
+            _shell.cloud.config['auth']['username'],
+        )
+
+        # These come from the command line
+        self.assertEqual(
+            'krikkit',
+            _shell.cloud.config['region_name'],
+        )