This work is licensed under a Creative Commons Attribution 3.0 Unported License.
http://creativecommons.org/licenses/by/3.0/legalcode
多种访问虚拟机的方式¶
https://blueprints.launchpad.net/tempest/+spec/ssh-auth-strategy
测试中访问虚拟机的不同策略。
问题描述¶
在测试中,通过 SSH 访问创建的服务器在正确验证 API 调用或场景(用例)测试的结果方面至关重要。这对于计算资源是如此,但并不局限于此。网络和卷的验证通常依赖于测试服务器,并且通过 SSH 访问虚拟机可以显著帮助验证。
Tempest 测试中对通过 SSH 访问虚拟机的支持既不统一,也不完整。并非所有测试都遵守相同的配置选项。现有的 run_ssh 选项仅被一些测试(即计算 API 测试)考虑。并非所有测试都使用相同的 SSH 访问策略,并且一些测试根本不执行任何 SSH 验证。原因通常是 SSH 验证是测试中“不稳定性”和超时的一个常见来源,并且分配用于 SSH 验证的资源可能代价高昂。
提议的变更¶
整合可用的配置选项,并确保在所有地方都遵守它们。配置应声明式,即 Tempest 用户应配置他们期望 SSH 的工作方式,如果这与部署的云不兼容,Tempest 应引发 InvalidConfiguration。改进配置帮助文本,以指导实例验证的配置。
当前与实例验证相关的配置选项是
CONF.auth.allow_tenant_isolation:影响固定网络名称CONF.compute.[image|image_alt]_ssh_userCONF.compute.image_ssh_password:不是特定于镜像的,并且仅被两个测试使用,没有检查与 ssh_auth_method 的关系CONF.compute.image_alt_ssh_password:未使用CONF.compute.run_sshCONF.compute.ssh_auth_method:用于 API 计算测试的资源设置,但测试未遵守。当此选项设置为“configured”时,应使用 image[_alt]_ssh_[user|password] 设置。目前未强制执行或记录CONF.compute.ssh_connect_method:用于 API 计算测试的资源设置,测试未遵守。当设置为 floating 时,应验证是否配置了浮动 IP 范围CONF.compute.ssh_user:当前由大多数 API 和场景测试用于 SSH 验证,这是一个问题,因为配置支持不同的镜像,每个镜像都有自己的 SSH 用户CONF.compute.ping_timeout:仅由场景测试使用CONF.compute.ssh_timeout:由 RemoteClient 使用CONF.compute.ssh_channel_timeout:由 RemoteClient 使用CONF.compute.fixed_network_name:由 API 和场景测试使用。它是使用 nova 网络的主 IP 的网络名称;或者在使用 neutron 网络时禁用租户隔离。由 test_list_server_filters 实现的逻辑应移动到辅助函数并在所有地方重用。仅当禁用浮动 IP 时,它才可用于 SSH 验证CONF.compute.network_for_ssh:由 RemoteClient 和一些场景测试用于发现用于 SSH 验证的 IP。如果禁用用于 SSH 的浮动 IP,则可以使用它,在这种情况下也可以使用 fixed_network_name;除了多网卡测试的情况,这需要更多的逻辑来启用第二个网卡CONF.compute.ip_version_for_ssh:由RemoteClient使用。它应该可以通过参数覆盖,而不是为所有测试使用一个配置CONF.compute.use_floatingip_for_ssh:由一些场景测试使用,是 ssh_connect_method 的重复项,目前未使用CONF.compute.path_to_private_key:未使用CONF.network.tenant_network_reachable:由场景测试使用。在某些情况下,它用于想要验证租户和公共网络连接的测试。在其他情况下,它用于确定用于实例验证的 IP,这与 ssh_connect_method 重叠CONF.network.public_network_id:用于启用 neutron 时的浮动 IP 分配。
目标配置应包括一个新的组“validation”,用于所有与 API 调用结果验证相关的选项,以及以下选项
CONF.validation.connect_method:默认 SSH 方法。测试仍然可以使用不同的方法(固定或浮动)CONF.validation.auth_method:默认身份验证方法。测试仍然可以使用不同的方法(目前仅支持 SSH 密钥)。其他方法将在单独的规范中处理CONF.validation.ip_version_for_ssh:默认 SSH IP 版本CONF.validation.*timeout(用于 ping、连接和 ssh)CONF.*.*ssh_user(用于可用的各种镜像)CONF.network.fixed_network_name:默认固定网络名称;此参数仅在 nova 网络(使用扁平网络)的情况下有效,并且目前在预配置帐户的情况下有效。一旦实现了 bp test-accounts-continued,如果 accounts.yaml 中未指定,它仍然可以用作默认固定网络名称。CONF.network.floating_network_name:默认浮动网络名称,用于在启用 neutron 时分配浮动 IP。弃用了CONF.network.public_network_idCONF.network.tenant_network_reachable:当配置的 ssh_connect_method 为“fixed”时使用。如果将其设置为 false,则引发InvalidConfiguration异常
已重命名或计划删除的配置选项应经过弃用过程。
一些选项是特定于镜像的:镜像名称、SSH 用户/密码、典型的启动/SSH 时间。这些选项最好在专用的 images.yaml 文件中处理,而不是在 tempest.conf 中。这将在单独的规范中处理。
定义一个辅助函数,用于读取、验证和处理配置,这将有助于将 create_test_server 从 CONF 中解耦,以便迁移到 tempest-lib。
扩展现有的 RemoteClient 以提供用于
ping:尝试向目标服务器发送单个 ping
connect:尝试在通用端口上向目标服务器发送单个 TCP 连接
ssh:尝试向目标服务器发送单个 SSH 连接
validaton:使用可配置的上述序列验证服务器;关心重试和超时
实现的一些部分已经存在于场景测试中。它们应整合到 RemoteClient 中。
定义一个 validation_resources 函数,类似于现有的 network_resources,用于在类级别 resource_setup 中分配所需的、可重用的资源,例如:一个密钥对、一个具有规则的安全组和一个浮动 IP。它以字典的形式返回所有资源,准备在 create_test_server 中使用。使用多个服务器的测试将按需分配额外的浮动 IP。一旦实现了 bp test-accounts-continued,我们还可以考虑整合 validation_resources 和 network_resources。
集中 create_test_server,并确保所有测试都使用此集中实现。添加以下功能
它在
create_test_server辅助函数中包含一个sshable布尔参数,默认为False。如果设置为True,它将确保服务器使用所有必需的资源创建,例如,注入了公钥,以及公共网络上的 IP 地址,允许 ICMP 和 SSH 通信的安全组。默认为 false 确保仅在需要时使用资源。它接受一个包含可重用项目的资源字典,这些项目可以是:key_name、具有 SSH 和 ICMP 入站规则的安全组、floating_ip。这些作为参数传递,为迁移到 tempest-lib 做准备。
它扩展了
wait_until的有效值,增加了新的等待能力类型:PINGABLE和SSHABLE。例如,如果请求了SSHABLE服务器,则创建方法也会负责执行基本的 SSH 验证。它返回一个元组
(created_server, remote_client),其中远程客户端已经使用访问资源(如公钥、管理员密码、IP 地址、SSH 帐户名)初始化。
def create_test_server(self, client, wait_until=None, sshable=False,
resources=None, **kwargs):
if sshable == True and run_ssh == True:
read config via helpers
process result, extend kwargs, but do not override
public_key: if key_name not defined use from resources or create
sg rules: use from resources, or create sg with rules and append
network name: append to network dict
floating ip: use from resources or allocate one
validation == True
(...)
server = servers_client.create_server(**kwargs)
wait for status
if ip_type == 'floating':
attach an IP
if validation:
build params based on helpers above
remote = RemoteClient(**params)
wait for status (extended: ping / connect / ssh)
return remote
def test_foo(self):
myvm = servers.create_test_server(
sshable=True, wait_until='SSHABLE')
myvm['remote_client'].write_to_console("I could do something more useful")
服务器仍然可以通过“手动”方式使其可 SSH 访问,用于更复杂的场景,例如热插拔测试,在这种情况下,服务器可能仅在稍后阶段连接到公共网络。
如果测试类包含使用可 SSH 访问服务器的测试,则必须为租户准备网络资源(如果尚未可用),以便能够访问 VM 的网络。
替代方案¶
由于 run_ssh 当前已禁用,另一种选择是从 API 测试中完全删除 SSH 验证。但是,在未启用 SSH 验证的情况下,无法真正验证许多情况(例如,重新启动、重建、config drive)。
实现¶
负责人¶
- 主要负责人
Andrea Frittoli <andrea.frittoli@hp.com>
- 其他指派人
Nithya Ganesan <nithya.ganesan@hp.com>, Joseph Lanoux <joseph.lanoux@hp.com>
里程碑¶
- 完成目标里程碑
Kilo-2
工作项¶
引入新的配置选项和读取它们的辅助函数
创建 validation_resources 函数
创建共享 create_test_server 函数
创建共享 SSH 验证函数/扩展 RemoteClient
将测试迁移到新格式(多个补丁)
弃用未使用的/删除的配置选项
设置实验性/定期作业,这些作业在启用验证的情况下运行 - 目标是推广 run_ssh 和 sshable 默认设置为
True,同时保持代码路径健康,直到发生这种情况
依赖项¶
无