The patch create utils.py for methods which might be used elsewhere in the project, with no matter on context. Move get_base_url method from credentials.py to util.py so that the method is reusable. Change-Id: Ic8cb83bb8859b4fddcd57faa3e23992941d0010b
		
			
				
	
	
		
			140 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Copyright 2016, 2018 Red Hat, Inc.
 | 
						|
# 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 requests
 | 
						|
from tempest.lib import auth
 | 
						|
 | 
						|
from config_tempest import utils
 | 
						|
 | 
						|
 | 
						|
class Credentials(object):
 | 
						|
    """Class contains all needed credentials.
 | 
						|
 | 
						|
    Wrapps credentials obtained from TempestConf object and Tempest
 | 
						|
    credentialsfrom auth library.
 | 
						|
    """
 | 
						|
    def __init__(self, conf, admin):
 | 
						|
        """Init method of Credentials.
 | 
						|
 | 
						|
        :type conf: TempestConf object
 | 
						|
        :param admin: True if the user is admin, False otherwise
 | 
						|
        :type admin: Boolean
 | 
						|
        """
 | 
						|
        self.admin = admin
 | 
						|
        self._conf = conf
 | 
						|
        self.username = self.get_credential('username')
 | 
						|
        self.password = self.get_credential('password')
 | 
						|
        self.project_name = self.get_credential('project_name')
 | 
						|
        self.identity_version = self._get_identity_version()
 | 
						|
        self.api_version = 3 if self.identity_version == "v3" else 2
 | 
						|
        self.identity_region = self._conf.get_defaulted('identity', 'region')
 | 
						|
        self.disable_ssl_certificate_validation = self._conf.get_defaulted(
 | 
						|
            'identity',
 | 
						|
            'disable_ssl_certificate_validation'
 | 
						|
        )
 | 
						|
        self.ca_certs = self._conf.get_defaulted('identity',
 | 
						|
                                                 'ca_certificates_file')
 | 
						|
        self.set_credentials()
 | 
						|
 | 
						|
    def get_credential(self, key):
 | 
						|
        """Helper for getting credential by its name.
 | 
						|
 | 
						|
        :param key: credential name
 | 
						|
        :type key: string
 | 
						|
        :returns: credential
 | 
						|
        :rtype: string
 | 
						|
        """
 | 
						|
        if self.admin:
 | 
						|
            # admin credentials are stored in auth section
 | 
						|
            # and are prefixed by 'admin_'
 | 
						|
            return self._conf.get_defaulted('auth', 'admin_' + key)
 | 
						|
        else:
 | 
						|
            # Tempest doesn't have non admin credentials, but the
 | 
						|
            # tool keeps them in identity section for further usage
 | 
						|
            return self._conf.get_defaulted('identity', key)
 | 
						|
 | 
						|
    def _list_versions(self, base_url):
 | 
						|
        resp = requests.get(base_url)
 | 
						|
        data = resp.json()
 | 
						|
        return data["versions"]["values"]
 | 
						|
 | 
						|
    def _get_identity_version(self):
 | 
						|
        """Looks for identity version in TempestConf object.
 | 
						|
 | 
						|
        :returns: identity version
 | 
						|
        :rtype: string
 | 
						|
        """
 | 
						|
        base_url = utils.get_base_url(self._conf.get("identity", "uri"))
 | 
						|
        versions = self._list_versions(base_url)
 | 
						|
        for version in versions:
 | 
						|
            if version["status"] == "stable" and "v3" in version["id"]:
 | 
						|
                return "v3"
 | 
						|
        return "v2"
 | 
						|
 | 
						|
    def _get_creds_kwargs(self):
 | 
						|
        """Creates kwargs.
 | 
						|
 | 
						|
        Kwargs based on the identity version, for obtaining
 | 
						|
        Tempest credentials.
 | 
						|
 | 
						|
        :returns: kwargs
 | 
						|
        :rtype: dict
 | 
						|
        """
 | 
						|
        creds_kwargs = {'username': self.username,
 | 
						|
                        'password': self.password}
 | 
						|
        if self.identity_version == 'v3':
 | 
						|
            creds_kwargs.update({'project_name': self.project_name,
 | 
						|
                                 'domain_name': 'Default',
 | 
						|
                                 'user_domain_name': 'Default'})
 | 
						|
        else:
 | 
						|
            creds_kwargs.update({'project_name': self.project_name})
 | 
						|
        return creds_kwargs
 | 
						|
 | 
						|
    def set_credentials(self):
 | 
						|
        """Gets and saves Tempest credentials from auth library."""
 | 
						|
        creds_kwargs = self._get_creds_kwargs()
 | 
						|
        disable_ssl = self.disable_ssl_certificate_validation
 | 
						|
        self.tempest_creds = auth.get_credentials(
 | 
						|
            auth_url=None,
 | 
						|
            fill_in=False,
 | 
						|
            identity_version=self.identity_version,
 | 
						|
            disable_ssl_certificate_validation=disable_ssl,
 | 
						|
            ca_certs=self.ca_certs,
 | 
						|
            **creds_kwargs)
 | 
						|
 | 
						|
    def get_auth_provider(self):
 | 
						|
        """Gets auth provider based on the type of Tempest credentials.
 | 
						|
 | 
						|
        :returns: auth provider
 | 
						|
        :rtype: auth.KeystoneV2AuthProvider/auth.KeystoneV3AuthProvider
 | 
						|
        """
 | 
						|
        if isinstance(self.tempest_creds, auth.KeystoneV3Credentials):
 | 
						|
            # We set uri and uri_v3 to /v3 here because if the endpoint on the
 | 
						|
            # rc file don't set the /v3 it will fail with a error 404
 | 
						|
            uri = self._conf.get_defaulted('identity', 'uri_v3')
 | 
						|
            uri = utils.get_base_url(uri) + 'v3'
 | 
						|
            self._conf.set('identity', 'uri_v3', uri)
 | 
						|
            return auth.KeystoneV3AuthProvider(
 | 
						|
                self.tempest_creds,
 | 
						|
                self._conf.get_defaulted('identity', 'uri_v3'),
 | 
						|
                self.disable_ssl_certificate_validation,
 | 
						|
                self.ca_certs)
 | 
						|
        else:
 | 
						|
            return auth.KeystoneV2AuthProvider(
 | 
						|
                self.tempest_creds,
 | 
						|
                self._conf.get_defaulted('identity', 'uri'),
 | 
						|
                self.disable_ssl_certificate_validation,
 | 
						|
                self.ca_certs)
 |