使用 V3 客户端 API

介绍

Identity v3 API 中的主要概念是

通过 keystoneclient.v3.client API,您可以查询和修改 managers。 例如,要操作项目(以前称为租户),您将与 keystoneclient.v3.projects.ProjectManager 对象交互。

您可以通过 keystoneclient.v3.client.Client 对象中的属性来访问 managers。 例如,Client 对象中的 projects 属性是一个项目 manager

>>> from keystoneclient.v3 import client
>>> keystone = client.Client(...)
>>> keystone.projects.list() # List projects

虽然可以实例化一个 keystoneclient.v3.client.Client 对象(如上所示,为了清晰起见),但推荐的方法是使用 keystoneclient.client.Client 类提供的发现机制。 将根据可用的 API 版本实例化适当的类

>>> from keystoneclient import client
>>> keystone =
...    client.Client(auth_url='https://:5000', ...)
>>> type(keystone)
<class 'keystoneclient.v3.client.Client'>

可以通过使用 version 关键字参数来强制使用特定版本的 API

>>> from keystoneclient import client
>>> keystone = client.Client(auth_url='https://:5000',
                             version=(2,), ...)
>>> type(keystone)
<class 'keystoneclient.v2_0.client.Client'>
>>> keystone = client.Client(auth_url='https://:5000',
                             version=(3,), ...)
>>> type(keystone)
<class 'keystoneclient.v3.client.Client'>

或者,通过直接将特定的 API 版本认证 URL 作为 auth_url 关键字参数指定

>>> from keystoneclient import client
>>> keystone =
...     client.Client(auth_url='https://:5000/v2.0', ...)
>>> type(keystone)
<class 'keystoneclient.v2_0.client.Client'>
>>> keystone =
...     client.Client(auth_url='https://:5000/v3', ...)
>>> type(keystone)
<class 'keystoneclient.v3.client.Client'>

成功认证后,将返回一个 keystoneclient.v3.client.Client 对象(在使用 Identity v3 API 时)。 以下提供了认证和常见任务的示例。

通常可以预期,当客户端需要传播异常时,它会引发 keystoneclient.exceptions.ClientException 的子类的实例。

使用 Session 进行认证

使用 Session 实例化一个 keystoneclient.v3.client.Client,以提供认证插件、SSL/TLS 证书和其他数据

>>> from keystoneauth1.identity import v3
>>> from keystoneauth1 import session
>>> from keystoneclient.v3 import client
>>> auth = v3.Password(auth_url='https://my.keystone.com:5000/v3',
...                    user_id='myuserid',
...                    password='mypassword',
...                    project_id='myprojectid')
>>> sess = session.Session(auth=auth)
>>> keystone = client.Client(session=sess)

有关 Session 的更多信息,请参阅:使用 Session

获取 Metadata 响应

使用 include_metadata=True 实例化 keystoneclient.v3.client.Client 将导致 manager 响应返回 keystoneclient.base.Response 而不是仅仅返回数据。 元数据属性将直接提供给 keystoneclient.base.Response,响应数据将作为属性 data 提供给它。

>>> from keystoneauth1.identity import v3
>>> from keystoneauth1 import session
>>> from keystoneclient.v3 import client
>>> auth = v3.Password(auth_url='https://my.keystone.com:5000/v3',
...                    user_id='myuserid',
...                    password='mypassword',
...                    project_id='myprojectid')
>>> sess = session.Session(auth=auth)
>>> keystone = client.Client(session=sess, include_metadata=True)
>>> resp = keystone.projects.list()
>>> resp.request_ids[0]
req-1234-5678-...
>>> resp.data
[<Project ...>, <Project ...>, ...]

非 Session 认证(已弃用)

已弃用 的认证方法是传递用户名、用户域名称(如果未指定,将默认为“Default”)和密码

>>> from keystoneclient import client
>>> auth_url = 'https://:5000'
>>> username = 'adminUser'
>>> user_domain_name = 'Default'
>>> password = 'secreetword'
>>> keystone = client.Client(auth_url=auth_url, version=(3,),
...                          username=username, password=password,
...                          user_domain_name=user_domain_name)

应将 Session 传递给 Client。 使用 Session,您不仅限于使用用户名和密码进行认证,还可以利用其他更安全的认证方法。

您可以选择指定域或项目(以及其项目域名称),以获取作用域令牌

>>> from keystoneclient import client
>>> auth_url = 'https://:5000'
>>> username = 'adminUser'
>>> user_domain_name = 'Default'
>>> project_name = 'demo'
>>> project_domain_name = 'Default'
>>> password = 'secreetword'
>>> keystone = client.Client(auth_url=auth_url, version=(3,),
...                          username=username, password=password,
...                          user_domain_name=user_domain_name,
...                          project_name=project_name,
...                          project_domain_name=project_domain_name)