从 Profile 过渡¶
注意
本节描述了从 openstacksdk 早期接口迁移代码的过程,对于编写新代码的人员可以忽略。
如果您的代码当前使用 Profile 对象和/或基于 openstack.auth.base.BaseAuthPlugin 的对象实例的 authenticator 实例,则应更新该代码以使用 CloudRegion 对象代替。
重要提示
Profile 即将被移除。使用它的现有代码应尽快迁移。
编写同时兼容旧接口和新接口的代码¶
这些示例都应该与旧接口和新接口兼容,但有一个注意事项。使用旧接口时,CloudConfig 对象来自 os-client-config 库,而在新接口中,它已被移动到 SDK 中。为了编写与旧接口和新接口都兼容的代码,请使用以下代码导入 config 命名空间
try:
from openstack import config as occ
except ImportError:
from os_client_config import config as occ
示例将假定 config 模块已以这种方式导入。
注意
是的,还有一种更简单、更简洁的方法来完成所有这些。这些示例冗长,是为了在同一代码库中处理旧接口和新接口。
替换 authenticator¶
没有 openstack.auth.base.BaseAuthPlugin 的直接替代品。openstacksdk 使用 keystoneauth 库进行身份验证和 HTTP 交互。keystoneauth 具有 身份验证插件,可用于控制身份验证方式。
替换 Profile¶
替换 openstack.profile.Profile 的使用方式取决于您尝试完成的任务。以下列出了常见模式,但通常方法是向 openstack.connection.Connection 构造函数传递云名称,或者构造一个 openstack.config.cloud_region.CloudRegion 对象并将其传递给构造函数。
此页面上的所有示例都假定您希望同时支持旧接口和新接口。如果您只是进行干净的过渡,则可以使用更简单、更简洁的版本。
从 clouds.yaml 获取命名云的连接¶
如果您想根据在 clouds.yaml 文件或环境变量中配置的参数构造一个 openstack.connection.Connection
import openstack.connection
conn = connection.from_config(cloud_name='name-of-cloud-you-want')
从 python 参数获取连接,避免 clouds.yaml¶
另一方面,如果您想构造一个 openstack.connection.Connection,但处于读取 clouds.yaml 文件中的配置不可取的上下文,例如在 Service 内部
创建一个 openstack.config.loader.OpenStackConfig 对象,并告诉它不要加载 yaml 文件。可选地传递一个
app_name和app_version,它们将被添加到 user-agent 字符串中。从中获取一个 openstack.config.cloud_region.CloudRegion 对象
获取一个 openstack.connection.Connection
try:
from openstack import config as occ
except ImportError:
from os_client_config import config as occ
from openstack import connection
loader = occ.OpenStackConfig(
load_yaml_files=False,
app_name='spectacular-app',
app_version='1.0')
cloud_region = loader.get_one_cloud(
region_name='my-awesome-region',
auth_type='password',
auth=dict(
auth_url='https://auth.example.com',
username='amazing-user',
user_domain_name='example-domain',
project_name='astounding-project',
user_project_name='example-domain',
password='super-secret-password',
))
conn = connection.from_config(cloud_config=cloud_region)
注意
app_name 和 app_version 完全是可选的,auth_type 默认为 ‘password’。它们在这里显示是为了清楚地说明如果想要设置它们应该放在哪里。
从 python 参数获取连接并可选地使用 clouds.yaml¶
如果您想从 python 参数建立连接,并希望其中一个参数可选地为 cloud 以允许选择命名云,这与上一个示例基本相同,只是没有 load_yaml_files=False。
try:
from openstack import config as occ
except ImportError:
from os_client_config import config as occ
from openstack import connection
loader = occ.OpenStackConfig(
app_name='spectacular-app',
app_version='1.0')
cloud_region = loader.get_one_cloud(
region_name='my-awesome-region',
auth_type='password',
auth=dict(
auth_url='https://auth.example.com',
username='amazing-user',
user_domain_name='example-domain',
project_name='astounding-project',
user_project_name='example-domain',
password='super-secret-password',
))
conn = connection.from_config(cloud_config=cloud_region)
get_one_cloud 的参数¶
最重要的注意事项是
auth_type指定要使用的身份验证插件类型。它控制身份验证方式以及所需的参数。auth是一个字典,包含身份验证插件所需的参数。它最常见的信息包括用户、项目、域、auth_url 和密码。openstack.config.loader.OpenStackConfig.get_one_cloud的其余关键字参数是 keystoneauth Session 对象所需的参数,这些参数控制如何建立 HTTP 连接,或者是 keystoneauth Adapter 对象所需的参数,这些参数控制如何在 Keystone Catalog 中查找服务。
对于 keystoneauth Adapter 参数,由于有一个 openstack.connection.Connection 对象但有许多服务,因此每个服务的参数是通过使用相关服务的官方 service_type 形成的。例如,要覆盖 compute 服务的端点,将使用参数 compute_endpoint_override。
region_name 在 openstack.profile.Profile 中是一个每服务参数。这不再是一个有效概念。一个 openstack.connection.Connection 是连接到云的一个区域。如果您处于一种极端情况,即一个服务在一个区域,而另一个服务在另一个区域,则必须使用两个不同的 openstack.connection.Connection 对象。
注意
service_type 虽然是 keystoneauth1.adapter.Adapter 的参数,但不是 get_one_cloud 的有效参数。service_type 是引用服务的关键,因此说 ‘compute_service_type=”henry”’ 没有意义。