AUTH_URL = "" USERNAME = "" PASSWORD = "" TENANT_NAME = "" USER_DOMAIN_NAME = "" DOMAIN_NAME = "" PROJECT_DOMAIN_NAME = "" import os from six.moves.urllib import parse from keystoneauth1 import discover from keystoneauth1 import identity from keystoneauth1 import session from keystoneclient import client def remove_url_version(): url = parse.urlparse(AUTH_URL) path = url.path.rstrip("/") if path.endswith("v2.0") or path.endswith("v3"): path = os.path.join(*os.path.split(path)[:-1]) parts = (url.scheme, url.netloc, path, url.params, url.query, url.fragment) return parse.urlunparse(parts) return auth_url auth_url = remove_url_version() temp_session = session.Session(verify=False) version = str(discover.Discover( temp_session, auth_url).version_data()[0]["version"][0]) identity_plugin = identity.Password(auth_url=auth_url, username=USERNAME, password=PASSWORD, user_domain_name=USER_DOMAIN_NAME, domain_name=DOMAIN_NAME, project_domain_name=PROJECT_DOMAIN_NAME) sess = session.Session(auth=identity_plugin, verify=False) auth_ref = identity_plugin.get_access(sess) service_catalog = auth_ref.service_catalog kc = client.Client(session=sess) print(kc.services.list())