Added support for OSCreds output to SNAPS-OO orchestrator app. 11/58211/1
authorspisarski <s.pisarski@cablelabs.com>
Mon, 4 Jun 2018 15:29:39 +0000 (09:29 -0600)
committerspisarski <s.pisarski@cablelabs.com>
Mon, 4 Jun 2018 15:29:39 +0000 (09:29 -0600)
Change-Id: Ic690ebff47d137fdd172f5dd5f263cd7f4a6ae04
Signed-off-by: spisarski <s.pisarski@cablelabs.com>
snaps/openstack/openstack_creator.py
snaps/openstack/os_credentials.py
snaps/openstack/tests/conf/os_credentials_tests.py
snaps/openstack/utils/keystone_utils.py
snaps/openstack/utils/launch_utils.py

index 9bd099b..6eeac37 100644 (file)
@@ -38,6 +38,9 @@ class OpenStackCloudObject(CloudObject):
         self._keystone = keystone_utils.keystone_client(
             self._os_creds, session=self._os_session)
 
+    def get_os_creds(self):
+        return self._os_creds
+
     def create(self):
         raise NotImplementedError('Do not override abstract method')
 
index 7cb5650..11ef8ff 100644 (file)
@@ -63,7 +63,7 @@ class OSCreds:
         self.project_name = kwargs.get('project_name')
 
         if kwargs.get('identity_api_version') is None:
-            self.identity_api_version = keystone_utils.V2_VERSION_NUM
+            self.identity_api_version = keystone_utils.V3_VERSION_NUM
         else:
             self.identity_api_version = float(kwargs['identity_api_version'])
 
@@ -171,6 +171,45 @@ class OSCreds:
 
         return new_url
 
+    def to_dict(self):
+        """Converts object to a dict that can be used to construct another"""
+        return {'username': self.username,
+                'password': self.password,
+                'auth_url': self.auth_url,
+                'project_name': self.project_name,
+                'identity_api_version': self.identity_api_version,
+                'image_api_version': self.image_api_version,
+                'network_api_version': self.network_api_version,
+                'compute_api_version': self.compute_api_version,
+                'heat_api_version': self.heat_api_version,
+                'user_domain_id': self.user_domain_id,
+                'user_domain_name': self.user_domain_name,
+                'project_domain_id': self.project_domain_id,
+                'project_domain_name': self.project_domain_name,
+                'interface': self.interface,
+                'region_name': self.region_name,
+                'proxy_settings': self.proxy_settings,
+                'cacert': self.cacert}
+
+    def __eq__(self, other):
+        return (self.username == other.username and
+                self.password == other.password and
+                self.auth_url == other.auth_url and
+                self.project_name == other.project_name and
+                float(self.identity_api_version) == float(other.identity_api_version) and
+                float(self.image_api_version) == float(other.image_api_version) and
+                float(self.network_api_version) == float(other.network_api_version) and
+                float(self.compute_api_version) == float(other.compute_api_version) and
+                float(self.heat_api_version) == float(other.heat_api_version) and
+                self.user_domain_id == other.user_domain_id and
+                self.user_domain_name == other.user_domain_name and
+                self.project_domain_id == other.project_domain_id and
+                self.project_domain_name == other.project_domain_name and
+                self.interface == other.interface and
+                self.region_name == other.region_name and
+                self.proxy_settings == other.proxy_settings and
+                self.cacert == other.cacert)
+
     def __str__(self):
         """Converts object to a string"""
         return ('OSCreds - username=' + str(self.username) +
index 192be86..696ca2d 100644 (file)
@@ -142,9 +142,9 @@ class OSCredsUnitTests(unittest.TestCase):
             project_name='hello')
         self.assertEqual('foo', os_creds.username)
         self.assertEqual('bar', os_creds.password)
-        self.assertEqual('http://foo.bar:5000/v2.0', os_creds.auth_url)
+        self.assertEqual('http://foo.bar:5000/v3', os_creds.auth_url)
         self.assertEqual('hello', os_creds.project_name)
-        self.assertEqual(2, os_creds.identity_api_version)
+        self.assertEqual(3, os_creds.identity_api_version)
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
@@ -165,9 +165,9 @@ class OSCredsUnitTests(unittest.TestCase):
                               'project_name': 'hello'})
         self.assertEqual('foo', os_creds.username)
         self.assertEqual('bar', os_creds.password)
-        self.assertEqual('http://foo.bar:5000/v2.0', os_creds.auth_url)
+        self.assertEqual('http://foo.bar:5000/v3', os_creds.auth_url)
         self.assertEqual('hello', os_creds.project_name)
-        self.assertEqual(2, os_creds.identity_api_version)
+        self.assertEqual(3, os_creds.identity_api_version)
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
@@ -243,9 +243,9 @@ class OSCredsUnitTests(unittest.TestCase):
             project_name='hello', proxy_settings=proxy_settings)
         self.assertEqual('foo', os_creds.username)
         self.assertEqual('bar', os_creds.password)
-        self.assertEqual('http://foo.bar:5000/v2.0', os_creds.auth_url)
+        self.assertEqual('http://foo.bar:5000/v3', os_creds.auth_url)
         self.assertEqual('hello', os_creds.project_name)
-        self.assertEqual(2, os_creds.identity_api_version)
+        self.assertEqual(3, os_creds.identity_api_version)
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
@@ -262,6 +262,11 @@ class OSCredsUnitTests(unittest.TestCase):
         self.assertIsNone(os_creds.proxy_settings.ssh_proxy_cmd)
         self.assertIsNone(os_creds.region_name)
 
+        creds_dict = os_creds.to_dict()
+        creds_from_dict = OSCreds(**creds_dict)
+
+        self.assertEqual(os_creds, creds_from_dict)
+
     def test_proxy_settings_obj_kwargs(self):
         proxy_settings = ProxySettings(host='foo', port=1234)
         os_creds = OSCreds(
@@ -273,9 +278,9 @@ class OSCredsUnitTests(unittest.TestCase):
                'project_domain_name': 'domain4'})
         self.assertEqual('foo', os_creds.username)
         self.assertEqual('bar', os_creds.password)
-        self.assertEqual('http://foo.bar:5000/v2.0', os_creds.auth_url)
+        self.assertEqual('http://foo.bar:5000/v3', os_creds.auth_url)
         self.assertEqual('hello', os_creds.project_name)
-        self.assertEqual(2, os_creds.identity_api_version)
+        self.assertEqual(3, os_creds.identity_api_version)
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
@@ -300,9 +305,9 @@ class OSCredsUnitTests(unittest.TestCase):
             project_domain_id='domain3', project_domain_name='domain4')
         self.assertEqual('foo', os_creds.username)
         self.assertEqual('bar', os_creds.password)
-        self.assertEqual('http://foo.bar:5000/v2.0', os_creds.auth_url)
+        self.assertEqual('http://foo.bar:5000/v3', os_creds.auth_url)
         self.assertEqual('hello', os_creds.project_name)
-        self.assertEqual(2, os_creds.identity_api_version)
+        self.assertEqual(3, os_creds.identity_api_version)
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
@@ -326,9 +331,9 @@ class OSCredsUnitTests(unittest.TestCase):
                'region_name': 'test_region'})
         self.assertEqual('foo', os_creds.username)
         self.assertEqual('bar', os_creds.password)
-        self.assertEqual('http://foo.bar:5000/v2.0', os_creds.auth_url)
+        self.assertEqual('http://foo.bar:5000/v3', os_creds.auth_url)
         self.assertEqual('hello', os_creds.project_name)
-        self.assertEqual(2, os_creds.identity_api_version)
+        self.assertEqual(3, os_creds.identity_api_version)
         self.assertEqual(2, os_creds.image_api_version)
         self.assertEqual(2, os_creds.compute_api_version)
         self.assertEqual(1, os_creds.heat_api_version)
index 52c86d8..4d3c0d3 100644 (file)
@@ -28,6 +28,7 @@ from snaps.domain.user import User
 logger = logging.getLogger('keystone_utils')
 
 V2_VERSION_NUM = 2.0
+V3_VERSION_NUM = 3
 V2_VERSION_STR = 'v' + str(V2_VERSION_NUM)
 
 
@@ -210,7 +211,7 @@ def create_project(keystone, project_settings):
 def delete_project(keystone, project):
     """
     Deletes a project
-    :param keystone: the Keystone clien
+    :param keystone: the Keystone client
     :param project: the SNAPS-OO Project domain object
     """
     logger.info('Deleting project with name - %s', project.name)
index 6e8b94e..00ea822 100644 (file)
@@ -530,8 +530,8 @@ def __get_connection_info(ansible_config, vm_dict):
     return None
 
 
-def __get_variables(var_config, os_creds_dict, vm_dict, image_dict, flavor_dict,
-                    networks_dict, routers_dict):
+def __get_variables(var_config, os_creds_dict, vm_dict, image_dict,
+                    flavor_dict, networks_dict, routers_dict):
     """
     Returns a dictionary of substitution variables to be used for Ansible
     templates
@@ -587,18 +587,19 @@ def __get_variable_value(var_config_values, os_creds_dict, vm_dict, image_dict,
                           the name is the key
     :return:
     """
-    admin_creds = os_creds_dict.get('admin-creds')
     if var_config_values['type'] == 'string':
         return __get_string_variable_value(var_config_values)
     if var_config_values['type'] == 'vm-attr':
         return __get_vm_attr_variable_value(var_config_values, vm_dict)
     if var_config_values['type'] == 'os_creds':
-        return __get_os_creds_variable_value(var_config_values, admin_creds)
+        return __get_os_creds_variable_value(var_config_values, os_creds_dict)
+    if var_config_values['type'] == 'os_creds_dict':
+        return str(__get_os_creds_dict(var_config_values, os_creds_dict))
     if var_config_values['type'] == 'network':
         return __get_network_variable_value(var_config_values, networks_dict)
     if var_config_values['type'] == 'router':
         return __get_router_variable_value(var_config_values, routers_dict,
-                                           admin_creds)
+                                           os_creds_dict)
     if var_config_values['type'] == 'port':
         return __get_vm_port_variable_value(var_config_values, vm_dict)
     if var_config_values['type'] == 'floating_ip':
@@ -607,8 +608,8 @@ def __get_variable_value(var_config_values, os_creds_dict, vm_dict, image_dict,
         return __get_image_variable_value(var_config_values, image_dict)
     if var_config_values['type'] == 'flavor':
         return __get_flavor_variable_value(var_config_values, flavor_dict)
-    if var_config_values['type'] == 'snaps-env-yaml':
-        return __create_snaps_env_yaml(var_config_values, vm_dict)
+    if var_config_values['type'] == 'vm-yaml':
+        return __create_yaml(var_config_values, vm_dict)
     return None
 
 
@@ -637,13 +638,19 @@ def __get_vm_attr_variable_value(var_config_values, vm_dict):
             return vm.get_image_user()
 
 
-def __get_os_creds_variable_value(var_config_values, os_creds):
+def __get_os_creds_variable_value(var_config_values, os_creds_dict):
     """
     Returns the associated OS credentials value
     :param var_config_values: the configuration dictionary
-    :param os_creds: the admin OpenStack OSCreds object
+    :param os_creds_dict: dict of OpenStack credentials where the key is the
+                          name
     :return: the value
     """
+    if 'creds_name' in var_config_values:
+        os_creds = os_creds_dict.get[var_config_values['creds_name']]
+    else:
+        os_creds = os_creds_dict.get('admin-creds')
+
     if os_creds:
         if var_config_values['value'] == 'username':
             logger.info("Returning OS username")
@@ -659,6 +666,21 @@ def __get_os_creds_variable_value(var_config_values, os_creds):
             return os_creds.project_name
 
 
+def __get_os_creds_dict(var_config_values, os_creds_dict):
+    """
+    Returns the associated OS credentials as a dict
+    :param var_config_values: the configuration dictionary
+    :param os_creds_dict: dict of creds where the key is the username
+    :return: the value dict
+    """
+    if 'creds_name' in var_config_values:
+        os_creds = os_creds_dict.get[var_config_values['creds_name']]
+    else:
+        os_creds = os_creds_dict.get('admin-creds')
+    if os_creds:
+        return os_creds.to_dict()
+
+
 def __get_network_variable_value(var_config_values, networks_dict):
     """
     Returns the associated network value
@@ -706,15 +728,22 @@ def __get_network_variable_value(var_config_values, networks_dict):
                                 return broadcast_ip
 
 
-def __get_router_variable_value(var_config_values, routers_dict, os_creds):
+def __get_router_variable_value(var_config_values, routers_dict,
+                                os_creds_dict):
     """
     Returns the associated network value
     :param var_config_values: the configuration dictionary
     :param routers_dict: the dictionary containing all networks where the key
                           is the network name
-    :param os_creds: the admin OpenStack credentials
+    :param os_creds_dict: dict of OpenStack credentials where the key is the
+                          name
     :return: the value
     """
+    if 'creds_name' in var_config_values:
+        os_creds = os_creds_dict.get[var_config_values['creds_name']]
+    else:
+        os_creds = os_creds_dict.get('admin-creds')
+
     router_name = var_config_values.get('router_name')
     router_creator = routers_dict[router_name]
 
@@ -818,34 +847,27 @@ def __get_flavor_variable_value(var_config_values, flavor_dict):
                     return flavor_creator.get_flavor().id
 
 
-def __create_snaps_env_yaml(var_config_values, vm_dict):
+def __create_yaml(var_config_values, vm_dict):
     """
     Creates a yaml file containing an OpenStack pod's credentials with a list
     of server IDs that can be used for obtaining SNAPS-OO instances for
     manipulation such as rebooting
     :param var_config_values: the configuration dictionary
-    :param os_creds: the admin credentials for accessing OpenStack
     :param vm_dict: the dictionary containing all vm creators where the
                     key is the name
     :return: the name of the generated file
     """
     out_dict = dict()
     out_dict['vms'] = list()
+    req_vm_names = var_config_values.get('vms')
 
     for name, vm_creator in vm_dict.items():
         vm_inst = vm_creator.get_vm_inst()
-        inst_creds = vm_creator._os_creds
-        if vm_inst:
+        if vm_inst and vm_inst.name in req_vm_names:
             out_dict['vms'].append({
                 'name': str(vm_inst.name),
                 'id': str(vm_inst.id),
-                'os_creds': {
-                    'username': inst_creds.username,
-                    'password': inst_creds.password,
-                    'auth_url': inst_creds.auth_url,
-                    'project_name': inst_creds.project_name,
-                    'identity_api_version': inst_creds.identity_api_version,
-                }
+                'os_creds': vm_creator.get_os_creds().to_dict()
             })
 
     out_file = file_utils.persist_dict_to_yaml(