Initial patch to begin adding support for Magnum. 91/46891/3
authorspisarski <s.pisarski@cablelabs.com>
Wed, 8 Nov 2017 19:53:14 +0000 (12:53 -0700)
committerspisarski <s.pisarski@cablelabs.com>
Thu, 9 Nov 2017 16:43:00 +0000 (09:43 -0700)
JIRA: SNAPS-212

Change-Id: I5f72fe9c28fe5cdd61546eee828becd034f8aff9
Signed-off-by: spisarski <s.pisarski@cablelabs.com>
requirements.txt
snaps/openstack/os_credentials.py
snaps/openstack/tests/conf/os_credentials_tests.py
snaps/openstack/utils/magnum_utils.py [new file with mode: 0644]
snaps/openstack/utils/tests/magnum_utils_tests.py [new file with mode: 0644]
snaps/test_suite_builder.py

index c4c6db1..7ab76f3 100644 (file)
@@ -4,6 +4,7 @@ python-keystoneclient>=3.8.0 # Apache-2.0
 python-glanceclient>=2.8.0 # Apache-2.0
 python-heatclient>=1.6.1 # Apache-2.0
 python-cinderclient>=3.1.0 # Apache-2.0
+python-magnumclient
 ansible<2.4,>=2.1.0
 wrapt>=1.7.0 # BSD License
 scp
index 84ed838..2553410 100644 (file)
@@ -44,6 +44,8 @@ class OSCreds:
                                     clients
         :param volume_api_version: The OpenStack's API version to use
                                    for Cinder clients
+        :param magnum_api_version: The OpenStack's API version to use
+                                   for magnum clients
         :param user_domain_id: Used for v3 APIs (default='default')
         :param user_domain_name: Used for v3 APIs (default='Default')
         :param project_domain_id: Used for v3 APIs (default='default')
@@ -88,8 +90,12 @@ class OSCreds:
         if kwargs.get('volume_api_version') is None:
             self.volume_api_version = cinder_utils.VERSION_2
         else:
-            self.volume_api_version = float(
-                kwargs['volume_api_version'])
+            self.volume_api_version = float(kwargs['volume_api_version'])
+
+        if kwargs.get('magnum_api_version') is None:
+            self.magnum_api_version = 1
+        else:
+            self.magnum_api_version = float(kwargs['magnum_api_version'])
 
         self.user_domain_id = kwargs.get('user_domain_id', 'default')
 
index 5efb32c..192be86 100644 (file)
@@ -18,6 +18,7 @@ import unittest
 
 from snaps.openstack.os_credentials import (
     OSCredsError, OSCreds, ProxySettings, ProxySettingsError)
+from snaps.openstack.utils import cinder_utils
 
 __author__ = 'spisarski'
 
@@ -147,6 +148,8 @@ class OSCredsUnitTests(unittest.TestCase):
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
+        self.assertEqual(cinder_utils.VERSION_2, os_creds.volume_api_version)
+        self.assertEqual(1, os_creds.magnum_api_version)
         self.assertEqual('default', os_creds.user_domain_id)
         self.assertEqual('Default', os_creds.user_domain_name)
         self.assertEqual('default', os_creds.project_domain_id)
@@ -168,6 +171,8 @@ class OSCredsUnitTests(unittest.TestCase):
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
+        self.assertEqual(cinder_utils.VERSION_2, os_creds.volume_api_version)
+        self.assertEqual(1, os_creds.magnum_api_version)
         self.assertEqual('default', os_creds.user_domain_id)
         self.assertEqual('Default', os_creds.user_domain_name)
         self.assertEqual('default', os_creds.project_domain_id)
@@ -183,6 +188,7 @@ class OSCredsUnitTests(unittest.TestCase):
                'auth_url': 'http://foo.bar:5000/v2', 'project_name': 'hello',
                'identity_api_version': '5', 'image_api_version': '6',
                'compute_api_version': '7', 'heat_api_version': '8.0',
+               'volume_api_version': '9.5', 'magnum_api_version': '10.6',
                'cacert': 'true', 'region_name': 'test_region'})
         self.assertEqual('foo', os_creds.username)
         self.assertEqual('bar', os_creds.password)
@@ -192,6 +198,8 @@ class OSCredsUnitTests(unittest.TestCase):
         self.assertEqual(6, os_creds.image_api_version)
         self.assertEqual(7, os_creds.compute_api_version)
         self.assertEqual(8.0, os_creds.heat_api_version)
+        self.assertEqual(9.5, os_creds.volume_api_version)
+        self.assertEqual(10.6, os_creds.magnum_api_version)
         self.assertEqual('default', os_creds.user_domain_id)
         self.assertEqual('Default', os_creds.user_domain_name)
         self.assertEqual('default', os_creds.project_domain_id)
@@ -207,6 +215,7 @@ class OSCredsUnitTests(unittest.TestCase):
                'auth_url': 'http://foo.bar:5000/v2', 'project_name': 'hello',
                'identity_api_version': 5, 'image_api_version': 6,
                'compute_api_version': 7, 'heat_api_version': 8.0,
+               'volume_api_version': 9.5, 'magnum_api_version': 10.6,
                'cacert': True, 'region_name': 'test_region'})
         self.assertEqual('foo', os_creds.username)
         self.assertEqual('bar', os_creds.password)
@@ -216,6 +225,8 @@ class OSCredsUnitTests(unittest.TestCase):
         self.assertEqual(6, os_creds.image_api_version)
         self.assertEqual(7, os_creds.compute_api_version)
         self.assertEqual(8.0, os_creds.heat_api_version)
+        self.assertEqual(9.5, os_creds.volume_api_version)
+        self.assertEqual(10.6, os_creds.magnum_api_version)
         self.assertEqual('default', os_creds.user_domain_id)
         self.assertEqual('Default', os_creds.user_domain_name)
         self.assertEqual('default', os_creds.project_domain_id)
@@ -238,6 +249,8 @@ class OSCredsUnitTests(unittest.TestCase):
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
+        self.assertEqual(cinder_utils.VERSION_2, os_creds.volume_api_version)
+        self.assertEqual(1, os_creds.magnum_api_version)
         self.assertEqual('default', os_creds.user_domain_id)
         self.assertEqual('Default', os_creds.user_domain_name)
         self.assertEqual('default', os_creds.project_domain_id)
@@ -266,6 +279,8 @@ class OSCredsUnitTests(unittest.TestCase):
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
+        self.assertEqual(cinder_utils.VERSION_2, os_creds.volume_api_version)
+        self.assertEqual(1, os_creds.magnum_api_version)
         self.assertEqual('domain1', os_creds.user_domain_id)
         self.assertEqual('domain2', os_creds.user_domain_name)
         self.assertEqual('domain3', os_creds.project_domain_id)
@@ -291,6 +306,8 @@ class OSCredsUnitTests(unittest.TestCase):
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
+        self.assertEqual(cinder_utils.VERSION_2, os_creds.volume_api_version)
+        self.assertEqual(1, os_creds.magnum_api_version)
         self.assertEqual('domain1', os_creds.user_domain_id)
         self.assertEqual('domain2', os_creds.user_domain_name)
         self.assertEqual('domain3', os_creds.project_domain_id)
@@ -315,6 +332,8 @@ class OSCredsUnitTests(unittest.TestCase):
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
+        self.assertEqual(cinder_utils.VERSION_2, os_creds.volume_api_version)
+        self.assertEqual(1, os_creds.magnum_api_version)
         self.assertEqual('default', os_creds.user_domain_id)
         self.assertEqual('Default', os_creds.user_domain_name)
         self.assertEqual('default', os_creds.project_domain_id)
diff --git a/snaps/openstack/utils/magnum_utils.py b/snaps/openstack/utils/magnum_utils.py
new file mode 100644 (file)
index 0000000..abc771a
--- /dev/null
@@ -0,0 +1,33 @@
+# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
+#                    and others.  All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import logging
+
+from magnumclient.client import Client
+
+from snaps.openstack.utils import keystone_utils
+
+__author__ = 'spisarski'
+
+logger = logging.getLogger('heat_utils')
+
+
+def magnum_client(os_creds):
+    """
+    Retrieves the Heat client
+    :param os_creds: the OpenStack credentials
+    :return: the client
+    """
+    logger.debug('Retrieving Nova Client')
+    return Client(session=keystone_utils.keystone_session(os_creds))
diff --git a/snaps/openstack/utils/tests/magnum_utils_tests.py b/snaps/openstack/utils/tests/magnum_utils_tests.py
new file mode 100644 (file)
index 0000000..f4abc89
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
+#                    and others.  All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import logging
+
+from snaps.openstack.os_credentials import OSCreds
+from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
+from snaps.openstack.utils import magnum_utils
+
+__author__ = 'spisarski'
+
+logger = logging.getLogger('nova_utils_tests')
+
+
+class MagnumSmokeTests(OSComponentTestCase):
+    """
+    Tests to ensure that the magnum client can communicate with the cloud
+    """
+
+    def test_connect_success(self):
+        """
+        Tests to ensure that the proper credentials can connect.
+        """
+        magnum = magnum_utils.magnum_client(self.os_creds)
+
+        # This should not throw an exception
+        magnum.clusters.list()
+
+    def test_nova_connect_fail(self):
+        """
+        Tests to ensure that the improper credentials cannot connect.
+        """
+
+        with self.assertRaises(RuntimeError):
+            magnum_utils.magnum_client(
+                OSCreds(username='user', password='pass',
+                        auth_url=self.os_creds.auth_url,
+                        project_name=self.os_creds.project_name,
+                        proxy_settings=self.os_creds.proxy_settings))
index 40dfad8..6ee9099 100644 (file)
@@ -103,6 +103,8 @@ from snaps.openstack.utils.tests.nova_utils_tests import (
     NovaUtilsInstanceTests, NovaUtilsInstanceVolumeTests)
 from snaps.openstack.utils.tests.settings_utils_tests import (
     SettingsUtilsUnitTests)
+from snaps.openstack.utils.tests.magnum_utils_tests import (
+    MagnumSmokeTests)
 from snaps.provisioning.tests.ansible_utils_tests import (
     AnsibleProvisioningTests)
 from snaps.tests.file_utils_tests import FileUtilsTests
@@ -660,3 +662,6 @@ def add_openstack_staging_tests(suite, os_creds, ext_net_name,
     suite.addTest(OSComponentTestCase.parameterize(
         HeatUtilsVolumeTests, os_creds=os_creds,
         ext_net_name=ext_net_name, log_level=log_level))
+    suite.addTest(OSComponentTestCase.parameterize(
+        MagnumSmokeTests, os_creds=os_creds,
+        ext_net_name=ext_net_name, log_level=log_level))