在 python-neutronclient 中添加对 Keystone V3 API 的支持。¶
Launchpad 蓝图的 URL:¶
https://blueprints.launchpad.net/python-neutronclient/+spec/keystone-api-v3-support
此蓝图旨在捕获 python-neutronclient 为了与 python-keystoneclient 集成进行身份验证和会话管理所需的更改。所有客户端都有此要求。
问题描述¶
Python-neutronclient 缺乏 Keystone V3 支持。此外,它通过维护自己版本的 Keystone V2 身份验证 API 和会话管理(即端点查找)来复制 python-keystoneclient 的逻辑。这种方法的重大缺点是,必须根据任何 Keystone API 更改不断更新。由于身份验证和会话管理在所有 OpenStack Python 客户端中不一致,因此维护也是一个负担。
提议的变更¶
利用 python-keystoneclient 进行身份验证和会话管理,以便它们完全从 python-neutronclient 中抽象出来。更改有两个方面:CLI(shell)和 SDK(Client)。
CLI¶
对于 CLI,所有 OpenStack Python 客户端共有的全局身份验证参数应由 python-keystoneclient 提供和促进。Python-neutronclient 不需要了解它们。它只需要一种向最终用户传达它们的方式。因此,以下全局身份验证参数将被隔离,并最终由 python-keystoneclient 促进
–os-auth-url
–insecure
–os-cacert
–os-cert
–os-key
–os-token
–os-username
–os-user_id
–os-password
–os-user-domain-id
–os-user-domain-name
–os-tenant-name
–os-tenant-id
–os-project-name
–os-project-id
–os-project-domain-id
–os-project-domain-name
–os-region-name
–os-service-type (默认值为
network)–os-endpoint-type (默认值为
publicURL)–os-url (已弃用,应使用 –os-endpoint 代替)
–os-endpoint
–os-auth-strategy (已弃用,缺少 –os-auth-url 表示没有身份验证)
Client¶
使用 keystoneclient.session.Session 进行会话管理,并使用 python-keystoneclient 身份验证插件进行身份验证。这是通过向 neutronclient.common.clientmanager.ClientManager 类引入两个可选参数 session 和 auth 来完成的
class ClientManager(object):
"""Manages access to API clients, including authentication.
"""
neutron = ClientCache(neutron_client.make_client)
# Provide support for old quantum commands (for example
# in stable versions)
quantum = neutron
def __init__(self, token=None, url=None,
auth_url=None,
endpoint_type=None,
tenant_name=None,
tenant_id=None,
username=None,
user_id=None,
password=None,
region_name=None,
api_version=None,
auth_strategy=None,
insecure=False,
ca_cert=None,
log_credentials=False,
service_type=None,
session=None,
auth=None
):
调用者可以选择传入 keystoneclient.session.Session 的实例到 session 中,以及传入 keystoneclient.auth.base.BaseAuthPlugin 的实例到 auth 中。
如果提供了 session,我们将使用它进行 HTTP 会话管理,而不是 neutronclient.client.HTTPClient。这是通过为现有的 neutronclient.client.HTTPClient 提供 shim 来保持向后兼容性来实现的。
对 neutronclient.client 的更改
class SessionHTTPClient(HTTPClient):
"""Shims for HTTPClient.
Requests are delegated to keystoneclient Session.
"""
def __init__(self, session, auth,
region_name=None,
service_type='network',
endpoint_type='publicURL'):
def _construct_http_client(*args, **kwargs):
session = kwargs.pop('session', None)
auth = kwargs.pop('auth', None)
if session:
return SessionHTTPClient(session, auth, **kwargs)
else:
return HTTPClient(**kwargs)
对于 neutronclient.common.clientmanager.ClientManager 和 neutronclient.v2_0.client.Client,将不再实例化 neutronclient.client.HTTPClient,而是直接调用 neutronclient.client._construct_http_client 来获取 HTTP 客户端对象。
在未来某个时候,如果我们选择完全删除旧的 HTTPClient,我们还应该删除 ServiceCatalog 类以及所有与其相关的自制解析。让 keystone 客户端完成所有解析会更简洁。bklei 将在代码中添加 fixme 注释以供将来清理。
备选方案¶
无 – 这是一个必需的更改。
数据模型影响¶
无。
REST API 影响¶
无。
安全影响¶
无。
通知影响¶
无。
其他最终用户影响¶
为了使用 keystone 中的 V3 进行身份验证,如果为身份验证提供了用户名,则还必须提供用户的域名或 ID。 同样,如果提供了租户/项目名称,则也必须指定租户的域名或 ID。
性能影响¶
不应该有任何 – 只是通过 keystone 客户端而不是 neutron 特定的 HTTPClient 对 keystone 进行相同的调用。
其他部署者影响¶
无。
开发人员影响¶
与最终用户影响相同。
实现¶
负责人¶
布拉德利·克莱因 (bklei)
工作项¶
需要导入 keystone 客户端会话和身份验证插件,并构造两者以进行身份验证。
依赖项¶
无,keystone 客户端已经提供了此更改所需的一切。
测试¶
单元测试全面测试 keystone 集成,这些测试将被修改/增强以同时测试新的 V3 代码。
文档影响¶
中子命令的新域特定参数应记录在案。 此外,可能也有必要提及 python-keystoneclient 根据 auth-url 的值支持 v2 和 v3 身份验证。
参考资料¶
无。