From be69eba436fe888fc32ca496d934e41557e393c0 Mon Sep 17 00:00:00 2001 From: Ivan Kolodyazhny Date: Mon, 18 Feb 2019 16:21:19 +0200 Subject: [PATCH] Do not use OpenStack services clients from Vitrage This patch adds python-*client initialization inside vitrage-tempest-plugin. Also for CLI calls all auth params are taken from config now. Configuration via environment variables is not supported. Story: 2004053 Task: 27631 Task: 28634 Change-Id: If873d36b4785369127cd3b4f8ce8ab64f09dc2b6 --- ...plugin-configuration-944443f3ce01666f.yaml | 9 +++ requirements.txt | 12 +-- vitrage_tempest_plugin/config.py | 9 +++ .../tests/api/resources/test_resources.py | 2 +- .../tests/api/templates/test_template.py | 4 +- .../tests/api/topology/test_topology.py | 3 +- .../tests/common/tempest_clients.py | 80 ++++++++++++++++--- .../tests/notifiers/test_mistral_notifier.py | 3 +- vitrage_tempest_plugin/tests/utils.py | 50 +++--------- 9 files changed, 112 insertions(+), 60 deletions(-) create mode 100644 releasenotes/notes/tempest-plugin-configuration-944443f3ce01666f.yaml diff --git a/releasenotes/notes/tempest-plugin-configuration-944443f3ce01666f.yaml b/releasenotes/notes/tempest-plugin-configuration-944443f3ce01666f.yaml new file mode 100644 index 0000000..9f6e0cd --- /dev/null +++ b/releasenotes/notes/tempest-plugin-configuration-944443f3ce01666f.yaml @@ -0,0 +1,9 @@ +--- +features: + - | + vitrage-tempest-plugin uses tempest.conf for any kind of configuration. +upgrade: + - | + Configuration via environment variables is not supported. If you need + configuration via environment variables, please use previous release of + vitrage-tempest-plugin. diff --git a/requirements.txt b/requirements.txt index 9266781..41c613e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,22 +4,24 @@ # The order of packages isrequirementst, because pip processes them in the order pbr!=2.1.0,>=2.0.0 # Apache-2.0 -aodhclient>=0.9.0 # Apache-2.0 +aodhclient>=1.0.0 # Apache-2.0 +gnocchiclient>=3.3.1 # Apache-2.0 PyYAML>=3.12 # MIT -python-heatclient>=1.10.0 # Apache-2.0 -python-ceilometerclient>=2.5.0 # Apache-2.0 +python-heatclient>=1.14.0 # Apache-2.0 +python-ceilometerclient>=2.9.0 # Apache-2.0 python-cinderclient>=3.3.0 # Apache-2.0 python-dateutil>=2.5.3 # BSD python-keystoneclient>=3.15.0 # Apache-2.0 python-neutronclient>=6.7.0 # Apache-2.0 -python-novaclient>=9.1.0 # Apache-2.0 -python-mistralclient!=3.2.0,>=3.1.0 # Apache-2.0 +python-novaclient>=10.1.0 # Apache-2.0 +python-mistralclient>=3.3.0 # Apache-2.0 python-glanceclient>=2.8.0 # Apache-2.0 python-vitrageclient>=2.0.0 # Apache-2.0 six>=1.10.0 # MIT oslo.config>=5.2.0 # Apache-2.0 oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0 oslo.log>=3.36.0 # Apache-2.0 +oslo.utils>=3.36.0 # Apache-2.0 testtools>=2.2.0 # MIT oslotest>=3.2.0 # Apache-2.0 tempest>=17.1.0 # Apache-2.0 diff --git a/vitrage_tempest_plugin/config.py b/vitrage_tempest_plugin/config.py index 4eb4bc0..9e6823a 100644 --- a/vitrage_tempest_plugin/config.py +++ b/vitrage_tempest_plugin/config.py @@ -35,4 +35,13 @@ RcaServiceGroup = [ default=120, min=10, help='Time to wait between subsequent datasource snapshots'), + cfg.StrOpt('aodh_version', default='2', help='Aodh version'), + cfg.StrOpt('ceilometer_version', default='2', help='Ceilometer version'), + cfg.StrOpt('nova_version', default='2.11', help='Nova version'), + cfg.StrOpt('cinder_version', default='3', help='Cinder version'), + cfg.StrOpt('glance_version', default='2', help='Glance version'), + cfg.StrOpt('heat_version', default='1', help='Heat version'), + cfg.StrOpt('mistral_version', default='2', help='Mistral version'), + cfg.StrOpt('gnocchi_version', default='1', help='Gnocchi version'), + cfg.StrOpt('trove_version', default='1', help='Trove version'), ] diff --git a/vitrage_tempest_plugin/tests/api/resources/test_resources.py b/vitrage_tempest_plugin/tests/api/resources/test_resources.py index a0fb976..2e53b91 100644 --- a/vitrage_tempest_plugin/tests/api/resources/test_resources.py +++ b/vitrage_tempest_plugin/tests/api/resources/test_resources.py @@ -64,7 +64,7 @@ class TestResource(BaseVitrageTempest): LOG.info("api_resources = %s", api_resources) cli_resources = utils.run_vitrage_command( - 'vitrage resource list --all -f json', self.conf) + 'vitrage resource list --all -f json') self._compare_resources(api_resources, cli_resources) except Exception as e: diff --git a/vitrage_tempest_plugin/tests/api/templates/test_template.py b/vitrage_tempest_plugin/tests/api/templates/test_template.py index b660b10..ddccfb2 100644 --- a/vitrage_tempest_plugin/tests/api/templates/test_template.py +++ b/vitrage_tempest_plugin/tests/api/templates/test_template.py @@ -60,7 +60,7 @@ class TestValidate(BaseTemplateTest): """ api_template_list = self.vitrage_client.template.list() cli_template_list = utils.run_vitrage_command( - 'vitrage template list', self.conf) + 'vitrage template list') self._compare_template_lists(api_template_list, cli_template_list) @@ -200,7 +200,7 @@ class TemplatesDBTest(BaseTemplateTest): # Add standard ,equivalence and definition templates templates_names = self._add_templates() cli_templates_list = utils.run_vitrage_command( - "vitrage template list", self.conf) + "vitrage template list") api_templates_list = self.client.template.list() self.assertThat(api_templates_list, IsNotEmpty(), diff --git a/vitrage_tempest_plugin/tests/api/topology/test_topology.py b/vitrage_tempest_plugin/tests/api/topology/test_topology.py index a023349..5bd7d2a 100644 --- a/vitrage_tempest_plugin/tests/api/topology/test_topology.py +++ b/vitrage_tempest_plugin/tests/api/topology/test_topology.py @@ -53,8 +53,7 @@ class TestTopology(BaseTopologyTest): """ api_graph = self.vitrage_client.topology.get(all_tenants=True) cli_graph = utils.run_vitrage_command( - 'vitrage topology show --all-tenants', - self.conf) + 'vitrage topology show --all-tenants') LOG.info('api-graph=%(api)s cli-graph=%(cli)s', {'api': api_graph, 'cli': cli_graph}) diff --git a/vitrage_tempest_plugin/tests/common/tempest_clients.py b/vitrage_tempest_plugin/tests/common/tempest_clients.py index 4632e15..1534739 100644 --- a/vitrage_tempest_plugin/tests/common/tempest_clients.py +++ b/vitrage_tempest_plugin/tests/common/tempest_clients.py @@ -16,13 +16,32 @@ from keystoneauth1 import loading as ka_loading from keystoneauth1 import session as ka_session from keystoneclient.v3 import client as ks_client_v3 from neutronclient.v2_0 import client as neutron_client +from oslo_utils import importutils as utils from tempest.common import credentials_factory as common_creds from tempest import config -from vitrage import os_clients from vitrageclient import client as vc CONF = config.CONF +_client_modules = { + 'aodh': 'aodhclient.client', + 'ceilometer': 'ceilometerclient.client', + 'nova': 'novaclient.client', + 'cinder': 'cinderclient.client', + 'glance': 'glanceclient.client', + 'neutron': 'neutronclient.v2_0.client', + 'heat': 'heatclient.client', + 'mistral': 'mistralclient.api.v2.client', + 'gnocchi': 'gnocchiclient.v1.client', + 'trove': 'troveclient.v1.client' +} + + +def driver_module(driver): + mod_name = _client_modules[driver] + module = utils.import_module(mod_name) + return module + class TempestClients(object): @classmethod @@ -73,7 +92,12 @@ class TempestClients(object): :rtype: ceilometerclient.v2.client.Client """ if not cls._ceilometer: - cls._ceilometer = os_clients.ceilometer_client(cls._conf) + cm_client = driver_module('ceilometer') + client = cm_client.get_client( + version=CONF.root_cause_analysis_service.ceilometer_version, + session=cls._get_session_for_admin(), + ) + cls._ceilometer = client return cls._ceilometer @classmethod @@ -83,7 +107,12 @@ class TempestClients(object): :rtype: novaclient.v2.client.Client """ if not cls._nova: - cls._nova = os_clients.nova_client(cls._conf) + n_client = driver_module('nova') + client = n_client.Client( + version=CONF.root_cause_analysis_service.nova_version, + session=cls._get_session_for_admin(), + ) + cls._nova = client return cls._nova @classmethod @@ -93,7 +122,12 @@ class TempestClients(object): :rtype: cinderclient.v2.client.Client """ if not cls._cinder: - cls._cinder = os_clients.cinder_client(cls._conf) + cin_client = driver_module('cinder') + client = cin_client.Client( + version=CONF.root_cause_analysis_service.cinder_version, + session=cls._get_session_for_admin(), + ) + cls._cinder = client return cls._cinder @classmethod @@ -103,7 +137,13 @@ class TempestClients(object): :rtype: glanceclient.v2.client.Client """ if not cls._glance: - cls._glance = os_clients.glance_client(cls._conf) + + glan_client = driver_module('glance') + client = glan_client.Client( + version=CONF.root_cause_analysis_service.glance_version, + session=cls._get_session_for_admin(), + ) + cls._glance = client return cls._glance @classmethod @@ -113,7 +153,11 @@ class TempestClients(object): :rtype: neutronclient.v2_0.client.Client """ if not cls._neutron: - cls._neutron = os_clients.neutron_client(cls._conf) + ne_client = driver_module('neutron') + client = ne_client.Client( + session=cls._get_session_for_admin() + ) + cls._neutron = client return cls._neutron @classmethod @@ -123,7 +167,12 @@ class TempestClients(object): :rtype: heatclient.v1.client.Client """ if not cls._heat: - cls._heat = os_clients.heat_client(cls._conf) + he_client = driver_module('heat') + client = he_client.Client( + version=CONF.root_cause_analysis_service.heat_version, + session=cls._get_session_for_admin() + ) + cls._heat = client return cls._heat @classmethod @@ -133,7 +182,11 @@ class TempestClients(object): :rtype: mistralclient.v2.client.Client """ if not cls._mistral: - cls._mistral = os_clients.mistral_client(cls._conf) + mi_client = driver_module('mistral') + client = mi_client.Client( + session=cls._get_session_for_admin(), + ) + cls._mistral = client return cls._mistral @classmethod @@ -143,7 +196,11 @@ class TempestClients(object): :rtype: aodhclient.v2.client.Client """ if not cls._aodh: - cls._aodh = os_clients.aodh_client(cls._conf) + ao_client = driver_module('aodh') + client = ao_client.Client( + CONF.root_cause_analysis_service.aodh_version, + session=cls._get_session_for_admin()) + cls._aodh = client return cls._aodh @classmethod @@ -164,7 +221,10 @@ class TempestClients(object): :rtype: gnocchiclient.v1.client.Client """ if not cls._gnocchi: - cls._gnocchi = os_clients.gnocchi_client(cls._conf) + gn_client = driver_module('gnocchi') + client = gn_client.Client( + session=cls._get_session_for_admin()) + cls._gnocchi = client return cls._gnocchi @classmethod diff --git a/vitrage_tempest_plugin/tests/notifiers/test_mistral_notifier.py b/vitrage_tempest_plugin/tests/notifiers/test_mistral_notifier.py index 4878f77..6f72515 100644 --- a/vitrage_tempest_plugin/tests/notifiers/test_mistral_notifier.py +++ b/vitrage_tempest_plugin/tests/notifiers/test_mistral_notifier.py @@ -16,7 +16,6 @@ import json from oslo_log import log as logging from testtools.matchers import HasLength -from vitrage import os_clients from vitrage_tempest_plugin.tests.api.event.base import BaseTestEvents from vitrage_tempest_plugin.tests.common.tempest_clients import TempestClients from vitrage_tempest_plugin.tests.common import vitrage_utils as v_utils @@ -55,7 +54,7 @@ class TestMistralNotifier(BaseTestEvents): @classmethod def setUpClass(cls): super(TestMistralNotifier, cls).setUpClass() - cls.mistral_client = os_clients.mistral_client(cls.conf) + cls.mistral_client = TempestClients.mistral() cls._templates = [] cls._templates.append(v_utils.add_template('v1_execute_mistral.yaml')) cls._templates.append(v_utils.add_template('v2_execute_mistral.yaml')) diff --git a/vitrage_tempest_plugin/tests/utils.py b/vitrage_tempest_plugin/tests/utils.py index 5d7095c..08c21bc 100644 --- a/vitrage_tempest_plugin/tests/utils.py +++ b/vitrage_tempest_plugin/tests/utils.py @@ -14,57 +14,44 @@ from functools import wraps -import socket import time -from oslo_config.cfg import NoSuchOptError from oslo_log import log as logging +from tempest.common import credentials_factory as common_creds +from tempest import config -import os import subprocess +CONF = config.CONF LOG = logging.getLogger(__name__) TIMESTAMP_FORMAT = '%Y-%m-%dT%H:%M:%SZ' -def run_vitrage_command(command, conf): - # AUTH_URL - local_ip = '127.0.0.1' - try: - local_ip = socket.gethostbyname(socket.gethostname()) - except socket.error: - LOG.info("didn't get local ip using default hostname=%s", - socket.gethostname()) - auth_url = get_property_value('OS_AUTH_URL', 'auth_url', - 'http://%s:5000/v2.0' % local_ip, conf) +def run_vitrage_command(command): + admin_creds = common_creds.get_configured_admin_credentials() + + auth_url = CONF.identity.uri_v3 auth_url_param = '--os-auth-url ' + auth_url # USERNAME - user = get_property_value('OS_USERNAME', 'username', - 'admin', conf) + user = admin_creds.username user_param = '--os-user-name ' + user # PASSWORD - password = get_property_value('OS_PASSWORD', 'password', - 'secretadmin', conf) + password = admin_creds.password password_param = '--os-password ' + password # PROJECT_NAME - project_name = get_property_value('OS_TENANT_NAME', 'project_name', - 'admin', conf) + project_name = admin_creds.project_name project_name_param = '--os-project-name ' + project_name # USER_DOMAIN_ID - user_domain_id = get_property_value('OS_USER_DOMAIN_ID', - 'user_domain_id', - 'default', conf) + user_domain_id = admin_creds.user_domain_id user_domain_id_param = '--os-user-domain-id ' + user_domain_id # PROJECT_DOMAIN_ID - project_domain_id = get_property_value('OS_PROJECT_DOMAIN_ID', - 'project_domain_id', - 'default', conf) + project_domain_id = admin_creds.project_domain_id project_domain_id_par = '--os-project-domain-id ' + project_domain_id full_command = '%s %s %s %s %s %s %s' % (command, user_param, @@ -97,19 +84,6 @@ def run_vitrage_command(command, conf): return output -def get_property_value(environment_name, conf_name, default_value, conf): - if os.environ.get(environment_name): - return os.environ[environment_name] - - try: - return conf.service_credentials[conf_name] - except NoSuchOptError: - LOG.debug("Configuration doesn't exist: service_credentials.%s", - conf_name) - - return default_value - - def uni2str(text): return text.encode('ascii', 'ignore')