From 82305fb92b6ee5607a9e3beb58be3c6c56413584 Mon Sep 17 00:00:00 2001 From: spisarski Date: Mon, 4 Jun 2018 09:29:39 -0600 Subject: Added support for OSCreds output to SNAPS-OO orchestrator app. Change-Id: Ic690ebff47d137fdd172f5dd5f263cd7f4a6ae04 Signed-off-by: spisarski --- snaps/openstack/openstack_creator.py | 3 + snaps/openstack/os_credentials.py | 41 +++++++++++++- snaps/openstack/tests/conf/os_credentials_tests.py | 29 ++++++---- snaps/openstack/utils/keystone_utils.py | 3 +- snaps/openstack/utils/launch_utils.py | 66 ++++++++++++++-------- 5 files changed, 106 insertions(+), 36 deletions(-) diff --git a/snaps/openstack/openstack_creator.py b/snaps/openstack/openstack_creator.py index 9bd099b..6eeac37 100644 --- a/snaps/openstack/openstack_creator.py +++ b/snaps/openstack/openstack_creator.py @@ -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') diff --git a/snaps/openstack/os_credentials.py b/snaps/openstack/os_credentials.py index 7cb5650..11ef8ff 100644 --- a/snaps/openstack/os_credentials.py +++ b/snaps/openstack/os_credentials.py @@ -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) + diff --git a/snaps/openstack/tests/conf/os_credentials_tests.py b/snaps/openstack/tests/conf/os_credentials_tests.py index 192be86..696ca2d 100644 --- a/snaps/openstack/tests/conf/os_credentials_tests.py +++ b/snaps/openstack/tests/conf/os_credentials_tests.py @@ -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) diff --git a/snaps/openstack/utils/keystone_utils.py b/snaps/openstack/utils/keystone_utils.py index 52c86d8..4d3c0d3 100644 --- a/snaps/openstack/utils/keystone_utils.py +++ b/snaps/openstack/utils/keystone_utils.py @@ -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) diff --git a/snaps/openstack/utils/launch_utils.py b/snaps/openstack/utils/launch_utils.py index 6e8b94e..00ea822 100644 --- a/snaps/openstack/utils/launch_utils.py +++ b/snaps/openstack/utils/launch_utils.py @@ -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( -- cgit 1.2.3-korg