在 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 类引入两个可选参数 sessionauth 来完成的

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.ClientManagerneutronclient.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 身份验证。

参考资料

无。