Updated vims to support keystone v3 69/26369/6
authorJose Lausuch <jose.lausuch@ericsson.com>
Wed, 21 Dec 2016 10:32:03 +0000 (10:32 +0000)
committerboucherv <valentin.boucher@orange.com>
Wed, 21 Dec 2016 14:12:12 +0000 (15:12 +0100)
Adding the choice, into openstack_utils,
to get openstack client with environment credentials
or with a specific credentials (new user/tenant..)

JIRA: FUNCTEST-529

Change-Id: I295808311de40f37a07b5a831852876a51f276f3
Signed-off-by: boucherv <valentin.boucher@orange.com>
functest/ci/config_functest.yaml
functest/core/feature_base.py
functest/opnfv_tests/openstack/snaps/smoke.py
functest/opnfv_tests/openstack/vping/vping_base.py
functest/opnfv_tests/vnf/ims/vims.py
functest/utils/functest_constants.py
functest/utils/functest_utils.py
functest/utils/openstack_utils.py

index 11ff7fd..b6dde11 100755 (executable)
@@ -1,7 +1,7 @@
 general:
-    directories:
+    dir:
         # Relative to the path where the repo is cloned:
-        dir_vping:         functest/opnfv_tests/openstack/vping
+        vping:         functest/opnfv_tests/openstack/vping
         dir_odl:           functest/opnfv_tests/sdn/odl
         dir_rally:         functest/opnfv_tests/openstack/rally
         dir_tempest_cases: functest/opnfv_tests/openstack/tempest/custom_tests
@@ -12,7 +12,7 @@ general:
         # Absolute path
         dir_home:           /home/opnfv
         dir_repos:          /home/opnfv/repos
-        dir_repo_functest:  /home/opnfv/repos/functest
+        repo_functest:  /home/opnfv/repos/functest
         dir_repo_rally:     /home/opnfv/repos/rally
         dir_repo_tempest:   /home/opnfv/repos/tempest
         dir_repo_releng:    /home/opnfv/repos/releng
@@ -27,11 +27,11 @@ general:
         dir_repo_parser:    /home/opnfv/repos/parser
         dir_repo_domino:    /home/opnfv/repos/domino
         dir_repo_snaps:     /home/opnfv/repos/snaps
-        dir_functest:       /home/opnfv/functest
-        dir_functest_test:  /home/opnfv/repos/functest/functest/opnfv_tests
-        dir_results:        /home/opnfv/functest/results
-        dir_functest_conf:  /home/opnfv/functest/conf
-        dir_functest_data:  /home/opnfv/functest/data
+        functest:       /home/opnfv/functest
+        functest_test:  /home/opnfv/repos/functest/functest/opnfv_tests
+        results:        /home/opnfv/functest/results
+        functest_conf:  /home/opnfv/functest/conf
+        functest_data:  /home/opnfv/functest/data
         dir_vIMS_data:      /home/opnfv/functest/data/vIMS/
         dir_rally_inst:     /home/opnfv/.rally
 
@@ -75,12 +75,12 @@ vping:
     vm_name_1: opnfv-vping-1
     vm_name_2: opnfv-vping-2
     image_name: functest-vping
-    vping_private_net_name: vping-net
-    vping_private_subnet_name: vping-subnet
-    vping_private_subnet_cidr: 192.168.130.0/24
-    vping_router_name: vping-router
-    vping_sg_name: vPing-sg
-    vping_sg_descr: Security group for vPing test case
+    private_net_name: vping-net
+    private_subnet_name: vping-subnet
+    private_subnet_cidr: 192.168.130.0/24
+    router_name: vping-router
+    sg_name: vPing-sg
+    sg_desc: Security group for vPing test case
 
 onos_sfc:
     image_base_url: http://artifacts.opnfv.org/sfc/demo
index 01a27f3..780170d 100644 (file)
@@ -11,7 +11,7 @@ class FeatureBase(base.TestcaseBase):
         self.project_name = project
         self.case_name = case
         self.cmd = cmd
-        self.repo = self.get_conf('general.directories.{}'.format(repo))
+        self.repo = self.get_conf('general.dir.{}'.format(repo))
         self.result_file = self.get_result_file()
         self.logger = ft_logger.Logger(project).getLogger()
 
@@ -44,7 +44,7 @@ class FeatureBase(base.TestcaseBase):
         return exit_code
 
     def get_result_file(self):
-        dir = self.get_conf('general.directories.dir_results')
+        dir = self.get_conf('general.dir.results')
         return "{}/{}.log".format(dir, self.project_name)
 
     def log_results(self):
index f66c17f..691f813 100644 (file)
@@ -33,7 +33,7 @@ class SnapsSmoke(PyTestSuiteRunner):
         # SNAPS repository and are found relative to that path
         if use_fip:
             snaps_dir = ft_utils.get_functest_config(
-                'general.directories.dir_repo_snaps') + '/snaps'
+                'general.dir.dir_repo_snaps') + '/snaps'
             os.chdir(snaps_dir)
 
         test_suite_builder.add_openstack_integration_tests(
index e467dd9..a5309bd 100755 (executable)
@@ -12,43 +12,38 @@ import pprint
 import time
 from datetime import datetime
 
-import functest.utils.functest_utils as ft_utils
-import functest.utils.functest_constants as ft_constants
-import functest.utils.openstack_utils as os_utils
 import functest.core.testcase_base as testcase_base
+import functest.utils.openstack_utils as os_utils
+from functest.utils.constants import CONST
 
 
 class VPingBase(testcase_base.TestcaseBase):
     def __init__(self):
-        def get_conf(parameter):
-            return ft_utils.get_functest_config(parameter)
-
         super(VPingBase, self).__init__()
         self.logger = None
-        self.functest_repo = ft_constants.FUNCTEST_REPO_DIR
-        self.repo = get_conf('general.directories.dir_vping')
-        self.vm1_name = get_conf('vping.vm_name_1')
-        self.vm2_name = get_conf('vping.vm_name_2')
+        self.functest_repo = CONST.dir_repo_functest
+        self.repo = CONST.dir_vping
+        self.vm1_name = CONST.vping_vm_name_1
+        self.vm2_name = CONST.vping_vm_name_2
         self.vm_boot_timeout = 180
         self.vm_delete_timeout = 100
-        self.ping_timeout = get_conf('vping.ping_timeout')
+        self.ping_timeout = CONST.vping_ping_timeout
 
-        self.image_name = get_conf('vping.image_name')
-        self.image_filename = get_conf('general.openstack.image_file_name')
-        self.image_format = get_conf('general.openstack.image_disk_format')
-        self.image_path = ("%s/%s" %
-                           (get_conf('general.directories.dir_functest_data'),
-                            self.image_filename))
+        self.image_name = CONST.vping_image_name
+        self.image_filename = CONST.openstack_image_file_name
+        self.image_format = CONST.openstack_image_disk_format
+        self.image_path = os.path.join(CONST.dir_functest_data,
+                                       self.image_filename)
 
-        self.flavor_name = get_conf('vping.vm_flavor')
+        self.flavor_name = CONST.vping_vm_flavor
 
         # NEUTRON Private Network parameters
-        self.private_net_name = get_conf('vping.vping_private_net_name')
-        self.private_subnet_name = get_conf('vping.vping_private_subnet_name')
-        self.private_subnet_cidr = get_conf('vping.vping_private_subnet_cidr')
-        self.router_name = get_conf('vping.vping_router_name')
-        self.sg_name = get_conf('vping.vping_sg_name')
-        self.sg_desc = get_conf('vping.vping_sg_descr')
+        self.private_net_name = CONST.vping_private_net_name
+        self.private_subnet_name = CONST.vping_private_subnet_name
+        self.private_subnet_cidr = CONST.vping_private_subnet_cidr
+        self.router_name = CONST.vping_router_name
+        self.sg_name = CONST.vping_sg_name
+        self.sg_desc = CONST.vping_sg_desc
         self.neutron_client = os_utils.get_neutron_client()
         self.glance_client = os_utils.get_glance_client()
         self.nova_client = os_utils.get_nova_client()
index fe888b6..15981f5 100755 (executable)
@@ -19,10 +19,7 @@ import subprocess
 import time
 
 import argparse
-import keystoneclient.v2_0.client as ksclient
-import novaclient.client as nvclient
 import requests
-from neutronclient.v2_0 import client as ntclient
 
 import functest.utils.functest_logger as ft_logger
 import functest.utils.functest_utils as ft_utils
@@ -242,17 +239,15 @@ def main():
     if not os.path.exists(VIMS_DATA_DIR):
         os.makedirs(VIMS_DATA_DIR)
 
-    ks_creds = os_utils.get_credentials("keystone")
-    nv_creds = os_utils.get_credentials("nova")
-    nt_creds = os_utils.get_credentials("neutron")
+    creds = os_utils.get_credentials()
 
     logger.info("Prepare OpenStack plateform (create tenant and user)")
-    keystone = ksclient.Client(**ks_creds)
+    keystone = os_utils.get_keystone_client()
 
-    user_id = os_utils.get_user_id(keystone, ks_creds['username'])
+    user_id = os_utils.get_user_id(keystone, creds['username'])
     if user_id == '':
         step_failure("init", "Error : Failed to get id of " +
-                     ks_creds['username'])
+                     creds['username'])
 
     tenant_id = os_utils.create_tenant(
         keystone, VIMS_TENANT_NAME, VIMS_TENANT_DESCRIPTION)
@@ -271,7 +266,7 @@ def main():
 
     if not os_utils.add_role_user(keystone, user_id, role_id, tenant_id):
         logger.error("Error : Failed to add %s on tenant" %
-                     ks_creds['username'])
+                     creds['username'])
 
     user_id = os_utils.create_user(
         keystone, VIMS_TENANT_NAME, VIMS_TENANT_NAME, None, tenant_id)
@@ -279,18 +274,10 @@ def main():
         logger.error("Error : Failed to create %s user" % VIMS_TENANT_NAME)
 
     logger.info("Update OpenStack creds informations")
-    ks_creds.update({
+    creds.update({
         "username": VIMS_TENANT_NAME,
         "password": VIMS_TENANT_NAME,
-        "tenant_name": VIMS_TENANT_NAME,
-    })
-
-    nt_creds.update({
-        "tenant_name": VIMS_TENANT_NAME,
-    })
-
-    nv_creds.update({
-        "project_id": VIMS_TENANT_NAME,
+        "tenant": VIMS_TENANT_NAME,
     })
 
     logger.info("Upload some OS images if it doesn't exist")
@@ -314,10 +301,8 @@ def main():
                 "Error : Failed to find or upload required OS "
                 "image for this deployment")
 
-    nova = nvclient.Client("2", **nv_creds)
-
     logger.info("Update security group quota for this tenant")
-    neutron = ntclient.Client(**nt_creds)
+    neutron = os_utils.get_neutron_client(creds)
     if not os_utils.update_sg_quota(neutron, tenant_id, 50, 100):
         step_failure(
             "init",
@@ -325,17 +310,22 @@ def main():
             VIMS_TENANT_NAME)
 
     # ############### CLOUDIFY INITIALISATION ################
-    public_auth_url = keystone.service_catalog.url_for(
-        service_type='identity', endpoint_type='publicURL')
+    public_auth_url = os_utils.get_endpoint('identity')
 
     cfy = Orchestrator(VIMS_DATA_DIR, CFY_INPUTS)
 
-    cfy.set_credentials(username=ks_creds['username'], password=ks_creds[
-                        'password'], tenant_name=ks_creds['tenant_name'],
+    if 'tenant_name' in creds.keys():
+        tenant_name = creds['tenant_name']
+    elif 'project_name' in creds.keys():
+        tenant_name = creds['project_name']
+
+    cfy.set_credentials(username=creds['username'],
+                        password=creds['password'],
+                        tenant_name=tenant_name,
                         auth_url=public_auth_url)
 
     logger.info("Collect flavor id for cloudify manager server")
-    nova = nvclient.Client("2", **nv_creds)
+    nova = os_utils.get_nova_client(creds)
 
     flavor_name = "m1.large"
     flavor_id = os_utils.get_flavor_id(nova, flavor_name)
@@ -416,7 +406,6 @@ def main():
     cw = Clearwater(CW_INPUTS, cfy, logger)
 
     logger.info("Collect flavor id for all clearwater vm")
-    nova = nvclient.Client("2", **nv_creds)
 
     flavor_name = "m1.small"
     flavor_id = os_utils.get_flavor_id(nova, flavor_name)
@@ -490,10 +479,6 @@ def main():
     if args.noclean:
         exit(0)
 
-    ks_creds = os_utils.get_credentials("keystone")
-
-    keystone = ksclient.Client(**ks_creds)
-
     logger.info("Removing %s tenant .." % CFY_INPUTS['keystone_tenant_name'])
     tenant_id = os_utils.get_tenant_id(
         keystone, CFY_INPUTS['keystone_tenant_name'])
index 2664ace..a39d33a 100644 (file)
@@ -60,25 +60,25 @@ def get_value(functest_config_key, env_variable):
             return constant
 
 
-HOME = get_value('general.directories.dir_home', 'HOME')
-REPOS_DIR = get_value('general.directories.dir_repos', 'REPOS_DIR')
-FUNCTEST_BASE_DIR = get_value('general.directories.dir_functest',
+HOME = get_value('general.dir.dir_home', 'HOME')
+REPOS_DIR = get_value('general.dir.dir_repos', 'REPOS_DIR')
+FUNCTEST_BASE_DIR = get_value('general.dir.functest',
                               'FUNCTEST_BASE_DIR')
-FUNCTEST_REPO_DIR = get_value('general.directories.dir_repo_functest',
+FUNCTEST_REPO_DIR = get_value('general.dir.repo_functest',
                               'FUNCTEST_REPO_DIR')
-FUNCTEST_TEST_DIR = get_value('general.directories.dir_functest_test',
+FUNCTEST_TEST_DIR = get_value('general.dir.functest_test',
                               'FUNCTEST_TEST_DIR')
-FUNCTEST_CONF_DIR = get_value('general.directories.dir_functest_conf',
+FUNCTEST_CONF_DIR = get_value('general.dir.functest_conf',
                               'FUNCTEST_CONF_DIR')
-FUNCTEST_DATA_DIR = get_value('general.directories.dir_functest_data',
+FUNCTEST_DATA_DIR = get_value('general.dir.functest_data',
                               'FUNCTEST_DATA_DIR')
-FUNCTEST_RESULTS_DIR = get_value('general.directories.dir_results',
+FUNCTEST_RESULTS_DIR = get_value('general.dir.results',
                                  'FUNCTEST_RESULTS_DIR')
 FUNCTEST_TESTCASES_YAML = get_value('general.functest.testcases_yaml',
                                     'FUNCTEST_TESTCASES_YAML')
 RALLY_DEPLOYMENT_NAME = get_value('rally.deployment_name',
                                   'RALLY_DEPLOYMENT_NAME')
-TEMPEST_REPO_DIR = get_value('general.directories.dir_repo_tempest',
+TEMPEST_REPO_DIR = get_value('general.dir.dir_repo_tempest',
                              'TEMPEST_REPO_DIR')
 
 ENV_FILE = os.path.join(FUNCTEST_CONF_DIR, "env_active")
@@ -87,22 +87,22 @@ OPENSTACK_CREDS = get_value('general.openstack.creds', 'creds')
 OPENSTACK_SNAPSHOT_FILE = get_value('general.openstack.snapshot_file',
                                     'OPENSTACK_SNAPSHOT_FILE')
 
-DOMINO_REPO_DIR = get_value('general.directories.dir_repo_domino',
+DOMINO_REPO_DIR = get_value('general.dir.dir_repo_domino',
                             'DOMINO_REPO_DIR')
-SDNVPN_REPO_DIR = get_value('general.directories.dir_repo_sdnvpn',
+SDNVPN_REPO_DIR = get_value('general.dir.dir_repo_sdnvpn',
                             'SDNVPN_REPO_DIR')
-SFC_REPO_DIR = get_value('general.directories.dir_repo_sfc',
+SFC_REPO_DIR = get_value('general.dir.dir_repo_sfc',
                          'SFC_REPO_DIR')
 
 ONOS_SFC_IMAGE_NAME = get_value('onos_sfc.image_name',
                                 'ONOS_SFC_IMAGE_NAME')
 ONOS_SFC_IMAGE_FILENAME = get_value('onos_sfc.image_file_name',
                                     'ONOS_SFC_IMAGE_FILENAME')
-ONOS_SFC_RELATIVE_PATH = get_value('general.directories.dir_onos_sfc',
+ONOS_SFC_RELATIVE_PATH = get_value('general.dir.dir_onos_sfc',
                                    'ONOS_SFC_RELATIVE_PATH')
 ONOS_SFC_IMAGE_BASE_URL = get_value('onos_sfc.image_base_url',
                                     'ONOS_SFC_IMAGE_BASE_URL')
-RALLY_RELATIVE_PATH = get_value('general.directories.dir_rally',
+RALLY_RELATIVE_PATH = get_value('general.dir.dir_rally',
                                 'RALLY_RELATIVE_PATH')
 RALLY_PRIVATE_NET_NAME = get_value('rally.network_name',
                                    'RALLY_PRIVATE_NET_NAME')
@@ -111,7 +111,7 @@ RALLY_PRIVATE_SUBNET_NAME = get_value('rally.subnet_name',
 RALLY_PRIVATE_SUBNET_CIDR = get_value('rally.subnet_cidr',
                                       'RALLY_PRIVATE_SUBNET_CIDR')
 RALLY_ROUTER_NAME = get_value('rally.router_name', 'RALLY_ROUTER_NAME')
-RALLY_INSTALLATION_DIR = get_value('general.directories.dir_rally_inst',
+RALLY_INSTALLATION_DIR = get_value('general.dir.dir_rally_inst',
                                    'RALLY_INSTALLATION_DIR')
 GLANCE_IMAGE_NAME = get_value('general.openstack.image_name',
                               'GLANCE_IMAGE_NAME')
@@ -149,24 +149,24 @@ TEMPEST_USE_CUSTOM_IMAGES = get_value('tempest.use_custom_images',
                                       'TEMPEST_USE_CUSTOM_IMAGES')
 TEMPEST_USE_CUSTOM_FLAVORS = get_value('tempest.use_custom_flavors',
                                        'TEMPEST_USE_CUSTOM_FLAVORS')
-TEMPEST_TEST_LIST_DIR = get_value('general.directories.dir_tempest_cases',
+TEMPEST_TEST_LIST_DIR = get_value('general.dir.dir_tempest_cases',
                                   'TEMPEST_TEST_LIST_DIR')
 NAME_VM_1 = get_value('vping.vm_name_1', 'NAME_VM_1')
 NAME_VM_2 = get_value('vping.vm_name_2', 'NAME_VM_2')
 PING_TIMEOUT = get_value('vping.ping_timeout', 'PING_TIMEOUT')
 VPING__IMAGE_NAME = get_value('vping.image_name', 'VPING__IMAGE_NAME')
 VPING_VM_FLAVOR = get_value('vping.vm_flavor', 'VPING_VM_FLAVOR')
-VPING_PRIVATE_NET_NAME = get_value('vping.vping_private_net_name',
+VPING_PRIVATE_NET_NAME = get_value('vping.private_net_name',
                                    'VPING_PRIVATE_NET_NAME')
-VPING_PRIVATE_SUBNET_NAME = get_value('vping.vping_private_subnet_name',
+VPING_PRIVATE_SUBNET_NAME = get_value('vping.private_subnet_name',
                                       'VPING_PRIVATE_SUBNET_NAME')
-VPING_PRIVATE_SUBNET_CIDR = get_value('vping.vping_private_subnet_cidr',
+VPING_PRIVATE_SUBNET_CIDR = get_value('vping.private_subnet_cidr',
                                       'VPING_PRIVATE_SUBNET_CIDR')
-VPING_ROUTER_NAME = get_value('vping.vping_router_name',
+VPING_ROUTER_NAME = get_value('vping.router_name',
                               'VPING_ROUTER_NAME')
-VPING_SECGROUP_NAME = get_value('vping.vping_sg_name',
+VPING_SECGROUP_NAME = get_value('vping.sg_name',
                                 'VPING_SECGROUP_NAME')
-VPING_SECGROUP_DESCR = get_value('vping.vping_sg_descr',
+VPING_SECGROUP_DESCR = get_value('vping.sg_desc',
                                  'VPING_SECGROUP_DESCR')
 ONOSBENCH_USERNAME = get_value('ONOS.general.onosbench_username',
                                'ONOSBENCH_USERNAME')
@@ -192,7 +192,7 @@ ONOS_INSTALLER_MASTER_USERNAME = get_value(
 ONOS_INSTALLER_MASTER_PASSWORD = get_value(
     'ONOS.environment.installer_master_password',
     'ONOS_INSTALLER_MASTER_PASSWORD')
-PROMISE_REPO_DIR = get_value('general.directories.dir_repo_promise',
+PROMISE_REPO_DIR = get_value('general.dir.dir_repo_promise',
                              'PROMISE_REPO_DIR')
 PROMISE_TENANT_NAME = get_value('promise.tenant_name',
                                 'PROMISE_TENANT_NAME')
@@ -217,9 +217,9 @@ PROMISE_SUBNET_CIDR = get_value('promise.subnet_cidr',
                                 'PROMISE_SUBNET_CIDR')
 PROMISE_ROUTER_NAME = get_value('promise.router_name',
                                 'PROMISE_ROUTER_NAME')
-DOCTOR_REPO_DIR = get_value('general.directories.dir_repo_doctor',
+DOCTOR_REPO_DIR = get_value('general.dir.dir_repo_doctor',
                             'DOCTOR_REPO_DIR')
-COPPER_REPO_DIR = get_value('general.directories.dir_repo_copper',
+COPPER_REPO_DIR = get_value('general.dir.dir_repo_copper',
                             'COPPER_REPO_DIR')
 EXAMPLE_INSTANCE_NAME = get_value('example.example_vm_name',
                                   'EXAMPLE_INSTANCE_NAME')
@@ -240,9 +240,9 @@ EXAMPLE_SECGROUP_NAME = get_value('example.example_sg_name',
                                   'EXAMPLE_SECGROUP_NAME')
 EXAMPLE_SECGROUP_DESCR = get_value('example.example_sg_descr',
                                    'EXAMPLE_SECGROUP_DESCR')
-VIMS_DATA_DIR = get_value('general.directories.dir_vIMS_data',
+VIMS_DATA_DIR = get_value('general.dir.dir_vIMS_data',
                           'VIMS_DATA_DIR')
-VIMS_TEST_DIR = get_value('general.directories.dir_repo_vims_test',
+VIMS_TEST_DIR = get_value('general.dir.dir_repo_vims_test',
                           'VIMS_TEST_DIR')
 VIMS_TENANT_NAME = get_value('vIMS.general.tenant_name',
                              'VIMS_TENANT_NAME')
@@ -260,5 +260,5 @@ CW_DEPLOYMENT_NAME = get_value('vIMS.clearwater.deployment-name',
 CW_INPUTS = get_value('vIMS.clearwater.inputs', 'CW_INPUTS')
 CW_REQUIERMENTS = get_value('vIMS.clearwater.requierments',
                             'CW_REQUIERMENTS')
-PARSER_REPO_DIR = get_value('general.directories.dir_repo_parser',
+PARSER_REPO_DIR = get_value('general.dir.dir_repo_parser',
                             'PARSER_REPO_DIR')
index b1e4d3c..e4845c6 100644 (file)
@@ -326,7 +326,7 @@ def get_deployment_dir():
     Returns current Rally deployment directory
     """
     deployment_name = get_functest_config('rally.deployment_name')
-    rally_dir = get_functest_config('general.directories.dir_rally_inst')
+    rally_dir = get_functest_config('general.dir.dir_rally_inst')
     cmd = ("rally deployment list | awk '/" + deployment_name +
            "/ {print $2}'")
     p = subprocess.Popen(cmd, shell=True,
index ec78412..38a30cb 100755 (executable)
@@ -86,7 +86,7 @@ def get_env_cred_dict():
     return env_cred_dict
 
 
-def get_credentials():
+def get_credentials(other_creds={}):
     """Returns a creds dictionary filled with parsed from env
     """
     creds = {}
@@ -99,6 +99,16 @@ def get_credentials():
         else:
             creds_key = env_cred_dict.get(envvar)
             creds.update({creds_key: os.getenv(envvar)})
+
+    if 'tenant' in other_creds.keys():
+        if is_keystone_v3():
+            tenant = 'project_name'
+        else:
+            tenant = 'tenant_name'
+        other_creds[tenant] = other_creds.pop('tenant')
+
+    creds.update(other_creds)
+
     return creds
 
 
@@ -138,9 +148,9 @@ def get_credentials_for_rally():
     return rally_conf
 
 
-def get_session_auth():
+def get_session_auth(other_creds={}):
     loader = loading.get_plugin_loader('password')
-    creds = get_credentials()
+    creds = get_credentials(other_creds)
     auth = loader.load_from_options(**creds)
     return auth
 
@@ -152,8 +162,8 @@ def get_endpoint(service_type, endpoint_type='publicURL'):
                                       endpoint_type=endpoint_type)
 
 
-def get_session():
-    auth = get_session_auth()
+def get_session(other_creds={}):
+    auth = get_session_auth(other_creds)
     return session.Session(auth=auth)
 
 
@@ -169,8 +179,8 @@ def get_keystone_client_version():
     return DEFAULT_API_VERSION
 
 
-def get_keystone_client():
-    sess = get_session()
+def get_keystone_client(other_creds={}):
+    sess = get_session(other_creds)
     return keystoneclient.Client(get_keystone_client_version(), session=sess)
 
 
@@ -183,8 +193,8 @@ def get_nova_client_version():
     return DEFAULT_API_VERSION
 
 
-def get_nova_client():
-    sess = get_session()
+def get_nova_client(other_creds={}):
+    sess = get_session(other_creds)
     return novaclient.Client(get_nova_client_version(), session=sess)
 
 
@@ -197,8 +207,8 @@ def get_cinder_client_version():
     return DEFAULT_API_VERSION
 
 
-def get_cinder_client():
-    sess = get_session()
+def get_cinder_client(other_creds={}):
+    sess = get_session(other_creds)
     return cinderclient.Client(get_cinder_client_version(), session=sess)
 
 
@@ -211,8 +221,8 @@ def get_neutron_client_version():
     return DEFAULT_API_VERSION
 
 
-def get_neutron_client():
-    sess = get_session()
+def get_neutron_client(other_creds={}):
+    sess = get_session(other_creds)
     return neutronclient.Client(get_neutron_client_version(), session=sess)
 
 
@@ -224,8 +234,8 @@ def get_glance_client_version():
     return DEFAULT_API_VERSION
 
 
-def get_glance_client():
-    sess = get_session()
+def get_glance_client(other_creds={}):
+    sess = get_session(other_creds)
     return glanceclient.Client(get_glance_client_version(), session=sess)