import keystoneclient
from keystoneclient import client
def _get_session(auth_url=None, version=None):
from keystoneauth1 import discover
from keystoneauth1 import session
from keystoneclient.auth import identity
password_args = {
"auth_url": "http://keystone:35357/v3",
"username": "admin",
"password": "foobar",
"tenant_name": "admin"
}
credential = {
"auth_url": "http://keystone:35357/v3",
"username": "admin",
"password": "foobar",
"tenant_name": "admin",
"permission": "user",
"region_name": None, "endpoint_type": None,
"domain_name": "admin", "endpoint": None,
"user_domain_name": None, "admin_domain_name": "Default",
"project_domain_name": None,
"https_insecure": False, "https_cacert": None,
}
version = OSClient.get("keystone")(
credential, {}, {}).choose_version(version)
if version is None:
# NOTE(rvasilets): If version not specified than we discover
# available version with the smallest number. To be able to
# discover versions we need session
temp_session = session.Session(
verify=True, imeout=10.0)
version = str(discover.Discover(
temp_session,
"http://keystone:35357/v3").version_data()[0]["version"][0])
if "v2.0" not in password_args["auth_url"] and (
version != "2"):
password_args.update({
"user_domain_name": None,
"domain_name": "admin",
"project_domain_name": None,
})
identity_plugin = identity.Password(**password_args)
sess = session.Session(
auth=identity_plugin, verify=True, timeout=10.0)
return sess, identity_plugin
def _remove_url_version():
"""Remove any version from the auth_url.
The keystone Client code requires that auth_url be the root url
if a version override is used.
"""
url = parse.urlparse(self.credential.auth_url)
# NOTE(bigjools): This assumes that non-versioned URLs have no
# path component at all.
parts = (url.scheme, url.netloc, "/", url.params, url.query,
url.fragment)
return parse.urlunparse(parts)
version = self.choose_version(version)
auth_url = "http://keystone:35357/v3"
if version is not None:
auth_url = _remove_url_version()
sess, plugin = _get_session(auth_url=auth_url)
# NOTE(bigjools): When using sessions, keystoneclient no longer
# does any pre-auth and calling client.authenticate() with
# sessions is deprecated (it's still possible to call it but if
# endpoint is defined it'll crash). We're forcing that pre-auth
# here because the use of the service_catalog depends on doing
# this. Also note that while the API has got the
# endpoints.list() equivalent, there is no service_type in that
# list which is why we need to ensure service_catalog is still
# present.
auth_ref = plugin.get_access(sess)
print auth_ref
aW1wb3J0IGtleXN0b25lY2xpZW50CmZyb20ga2V5c3RvbmVjbGllbnQgaW1wb3J0IGNsaWVudAoKZGVmIF9nZXRfc2Vzc2lvbihhdXRoX3VybD1Ob25lLCB2ZXJzaW9uPU5vbmUpOgogICAgZnJvbSBrZXlzdG9uZWF1dGgxIGltcG9ydCBkaXNjb3ZlcgogICAgZnJvbSBrZXlzdG9uZWF1dGgxIGltcG9ydCBzZXNzaW9uCiAgICBmcm9tIGtleXN0b25lY2xpZW50LmF1dGggaW1wb3J0IGlkZW50aXR5CgogICAgcGFzc3dvcmRfYXJncyA9IHsKICAgICAgICAiYXV0aF91cmwiOiAiaHR0cDovL2tleXN0b25lOjM1MzU3L3YzIiwKICAgICAgICAidXNlcm5hbWUiOiAiYWRtaW4iLAogICAgICAgICJwYXNzd29yZCI6ICJmb29iYXIiLAogICAgICAgICJ0ZW5hbnRfbmFtZSI6ICJhZG1pbiIKICAgIH0KICAgIAogICAgY3JlZGVudGlhbCA9IHsKICAgIAkiYXV0aF91cmwiOiAiaHR0cDovL2tleXN0b25lOjM1MzU3L3YzIiwKICAgICAgICAidXNlcm5hbWUiOiAiYWRtaW4iLAogICAgICAgICJwYXNzd29yZCI6ICJmb29iYXIiLAogICAgICAgICJ0ZW5hbnRfbmFtZSI6ICJhZG1pbiIsCiAgICAgICAgInBlcm1pc3Npb24iOiAidXNlciIsCiAgICAgICAgInJlZ2lvbl9uYW1lIjogTm9uZSwgImVuZHBvaW50X3R5cGUiOiBOb25lLAoJCSJkb21haW5fbmFtZSI6ICJhZG1pbiIsICJlbmRwb2ludCI6IE5vbmUsCiAgICAgICAgInVzZXJfZG9tYWluX25hbWUiOiBOb25lLCAiYWRtaW5fZG9tYWluX25hbWUiOiAiRGVmYXVsdCIsCiAgICAgICAgInByb2plY3RfZG9tYWluX25hbWUiOiBOb25lLAoJCSJodHRwc19pbnNlY3VyZSI6IEZhbHNlLCAiaHR0cHNfY2FjZXJ0IjogTm9uZSwKCX0KCiAgICB2ZXJzaW9uID0gT1NDbGllbnQuZ2V0KCJrZXlzdG9uZSIpKAogICAgICAgIGNyZWRlbnRpYWwsIHt9LCB7fSkuY2hvb3NlX3ZlcnNpb24odmVyc2lvbikKICAgIGlmIHZlcnNpb24gaXMgTm9uZToKICAgICAgICAjIE5PVEUocnZhc2lsZXRzKTogSWYgdmVyc2lvbiBub3Qgc3BlY2lmaWVkIHRoYW4gd2UgZGlzY292ZXIKICAgICAgICAjIGF2YWlsYWJsZSB2ZXJzaW9uIHdpdGggdGhlIHNtYWxsZXN0IG51bWJlci4gVG8gYmUgYWJsZSB0bwogICAgICAgICMgZGlzY292ZXIgdmVyc2lvbnMgd2UgbmVlZCBzZXNzaW9uCiAgICAgICAgdGVtcF9zZXNzaW9uID0gc2Vzc2lvbi5TZXNzaW9uKAogICAgICAgICAgICB2ZXJpZnk9VHJ1ZSwgaW1lb3V0PTEwLjApCiAgICAgICAgdmVyc2lvbiA9IHN0cihkaXNjb3Zlci5EaXNjb3ZlcigKICAgICAgICAgICAgdGVtcF9zZXNzaW9uLAogICAgICAgICAgICAiaHR0cDovL2tleXN0b25lOjM1MzU3L3YzIikudmVyc2lvbl9kYXRhKClbMF1bInZlcnNpb24iXVswXSkKCiAgICBpZiAidjIuMCIgbm90IGluIHBhc3N3b3JkX2FyZ3NbImF1dGhfdXJsIl0gYW5kICgKICAgICAgICAgICAgdmVyc2lvbiAhPSAiMiIpOgogICAgICAgIHBhc3N3b3JkX2FyZ3MudXBkYXRlKHsKICAgICAgICAgICAgInVzZXJfZG9tYWluX25hbWUiOiBOb25lLAogICAgICAgICAgICAiZG9tYWluX25hbWUiOiAiYWRtaW4iLAogICAgICAgICAgICAicHJvamVjdF9kb21haW5fbmFtZSI6IE5vbmUsCiAgICAgICAgfSkKICAgIGlkZW50aXR5X3BsdWdpbiA9IGlkZW50aXR5LlBhc3N3b3JkKCoqcGFzc3dvcmRfYXJncykKICAgIHNlc3MgPSBzZXNzaW9uLlNlc3Npb24oCiAgICAgICAgYXV0aD1pZGVudGl0eV9wbHVnaW4sIHZlcmlmeT1UcnVlLCB0aW1lb3V0PTEwLjApCnJldHVybiBzZXNzLCBpZGVudGl0eV9wbHVnaW4KCiBkZWYgX3JlbW92ZV91cmxfdmVyc2lvbigpOgogICAgIiIiUmVtb3ZlIGFueSB2ZXJzaW9uIGZyb20gdGhlIGF1dGhfdXJsLgogICAgVGhlIGtleXN0b25lIENsaWVudCBjb2RlIHJlcXVpcmVzIHRoYXQgYXV0aF91cmwgYmUgdGhlIHJvb3QgdXJsCiAgICBpZiBhIHZlcnNpb24gb3ZlcnJpZGUgaXMgdXNlZC4KICAgICIiIgogICAgdXJsID0gcGFyc2UudXJscGFyc2Uoc2VsZi5jcmVkZW50aWFsLmF1dGhfdXJsKQogICAgIyBOT1RFKGJpZ2pvb2xzKTogVGhpcyBhc3N1bWVzIHRoYXQgbm9uLXZlcnNpb25lZCBVUkxzIGhhdmUgbm8KICAgICMgcGF0aCBjb21wb25lbnQgYXQgYWxsLgogICAgcGFydHMgPSAodXJsLnNjaGVtZSwgdXJsLm5ldGxvYywgIi8iLCB1cmwucGFyYW1zLCB1cmwucXVlcnksCiAgICAgICAgICAgICB1cmwuZnJhZ21lbnQpCnJldHVybiBwYXJzZS51cmx1bnBhcnNlKHBhcnRzKQoKdmVyc2lvbiA9IHNlbGYuY2hvb3NlX3ZlcnNpb24odmVyc2lvbikKCmF1dGhfdXJsID0gImh0dHA6Ly9rZXlzdG9uZTozNTM1Ny92MyIKaWYgdmVyc2lvbiBpcyBub3QgTm9uZToKICAgIGF1dGhfdXJsID0gX3JlbW92ZV91cmxfdmVyc2lvbigpCnNlc3MsIHBsdWdpbiA9IF9nZXRfc2Vzc2lvbihhdXRoX3VybD1hdXRoX3VybCkKIyBOT1RFKGJpZ2pvb2xzKTogV2hlbiB1c2luZyBzZXNzaW9ucywga2V5c3RvbmVjbGllbnQgbm8gbG9uZ2VyCiMgZG9lcyBhbnkgcHJlLWF1dGggYW5kIGNhbGxpbmcgY2xpZW50LmF1dGhlbnRpY2F0ZSgpIHdpdGgKIyBzZXNzaW9ucyBpcyBkZXByZWNhdGVkIChpdCdzIHN0aWxsIHBvc3NpYmxlIHRvIGNhbGwgaXQgYnV0IGlmCiMgZW5kcG9pbnQgaXMgZGVmaW5lZCBpdCdsbCBjcmFzaCkuIFdlJ3JlIGZvcmNpbmcgdGhhdCBwcmUtYXV0aAojIGhlcmUgYmVjYXVzZSB0aGUgdXNlIG9mIHRoZSBzZXJ2aWNlX2NhdGFsb2cgZGVwZW5kcyBvbiBkb2luZwojIHRoaXMuIEFsc28gbm90ZSB0aGF0IHdoaWxlIHRoZSBBUEkgaGFzIGdvdCB0aGUKIyBlbmRwb2ludHMubGlzdCgpIGVxdWl2YWxlbnQsIHRoZXJlIGlzIG5vIHNlcnZpY2VfdHlwZSBpbiB0aGF0CiMgbGlzdCB3aGljaCBpcyB3aHkgd2UgbmVlZCB0byBlbnN1cmUgc2VydmljZV9jYXRhbG9nIGlzIHN0aWxsCiMgcHJlc2VudC4KYXV0aF9yZWYgPSBwbHVnaW4uZ2V0X2FjY2VzcyhzZXNzKQpwcmludCBhdXRoX3JlZg==
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python2.7/py_compile.py", line 117, in compile
raise py_exc
py_compile.PyCompileError: Sorry: IndentationError: unexpected indent (prog.py, line 53)