Grenade

Grenade 是一个 OpenStack 测试框架,用于测试不同版本之间的升级过程。它使用 DevStack 执行初始的 OpenStack 安装,并将其作为最终配置的参考。目前,Grenade 可以升级 Keystone、Glance、Nova、Neutron、Cinder、Swift 和 Ceilometer,这些组件都采用默认的 DevStack 配置。

目标

Grenade 的目标如下

  • 阻止可能破坏升级理论的意外项目更改。大多数 Grenade 失败的情况都是这种性质。

  • 确保升级云不会执行一些愚蠢的操作,例如删除并重新创建所有服务器/卷/网络。

  • 能够扩展以支持其他升级场景(例如从一种配置到另一种等效配置的横向迁移)。

升级理论

Grenade 基于以下升级理论运行。

  • 新代码应该能够与旧配置一起工作

    升级过程不应需要更改配置才能运行新版本。所有配置行为都应该在一个发布周期内被弃用,以便在发布时,新代码可以使用上一个版本的配置。这些配置可能会创建弃用警告,需要在下一个版本之前解决,但它们仍然应该可以工作,并且在很大程度上具有相同的行为。

  • 新代码只需要‘数据库迁移’

    显然,新代码的发布可能包括新的数据库模型。标准的升级过程是关闭所有访问数据库的服务,运行数据库迁移脚本,然后启动新代码。

  • 升级前由服务创建的资源,升级后仍然应该存在

    升级 Nova 时,您期望所有虚拟机在整个升级过程中仍然能够正常运行(无论 Nova 服务是否启动)。关闭控制平面不应导致虚拟机停止运行。

  • 升级所需的任何其他更改都是例外,必须在发布说明中明确指出。

    Grenade 支持特定版本升级脚本(from-juno、from-kilo)。这些脚本旨在支持需要特定升级的额外手动步骤的升级(例如从 juno 到 kilo)。这些脚本应谨慎使用。

    Grenade 核心团队在着陆这些更改之前需要以下内容

    • 发布说明中明确指定了需要这些手动升级步骤的版本。

    • 相关项目的 PTL 已经批准了此更改。

    注意

    虽然我们期望 OpenStack 生态系统中的各种部署项目,例如 TripleO、Kolla 等,阅读每个项目的发布说明,但将对 Grenade 进行的任何异常升级更改直接或至少通过 openstack-discuss 邮件列表告知这些团队仍然是一种良好的做法。

状态

Grenade 现在正在运行支持升级的每个补丁的项目中。OpenStack 的 CI 系统中存在以下 Grenade 配置门控(这不是一个详尽的列表)

  • 一个在版本之间升级了 neutron 的云

  • 一个升级了所有服务(nova-compute 除外)的 neutron 云,从而测试滚动升级的 RPC 反向兼容性。

基本流程

grenade.sh 脚本试图做到合理易读,因此值得查看那里以了解实际发生的情况。这是该脚本执行的超级高级版本。

  • 获取 2 个 devstack(基础 & 目标)

  • 安装基础 devstack

  • 执行一些健全性检查(当前是 tempest smoke)以确保正确

  • 允许项目创建应该在升级过程中幸存的资源 - 请参阅 projects/*/resources.sh

  • 关闭所有服务

  • 验证在关闭期间资源是否仍然有效

  • 升级并重新启动所有服务

  • 验证升级后资源是否仍然有效

  • 执行一些健全性检查(当前是 tempest smoke)以确保一切看起来都很好。

当 GRENADE_USE_EXTERNAL_DEVSTACK 的值设置为 True 时,该脚本会跳过前两个步骤(负责设置 2 个 devstack 环境和安装基础环境)。

术语

Grenade 具有两个 DevStack 安装,它们之间被区分开来,分别称为‘base’和‘target’。

  • Base:将被升级的初始安装。

  • Target:目标 OpenStack 的参考安装(可能是 DevStack)。

目录结构

Grenade 为基础和目标 OpenStack 安装源以及 DevStack 创建一组目录

$STACK_ROOT
 |- logs                # Grenade logs
 |- save                # Grenade state logs
 |- <base>
 |   |- data            # base data
 |   |- logs            # base DevStack logs
 |   |- devstack
 |   |- images          # cache of downloaded images
 |   |- cinder
 |   |- ...
 |   |- swift
 |- <target>
 |   |- data            # target data
 |   |- logs            # target DevStack logs
 |   |- devstack
 |   |- cinder
 |   |- ...
 |   |- swift

依赖项

这是一个非详尽的依赖项列表

  • git

  • tox

安装 Grenade

以通常的方式从 GitHub 获取 Grenade

git clone https://opendev.org/openstack/grenade

可选:在远程目标上运行 grenade

有一个可选的 setup-grenade 脚本,如果您正在从本地笔记本电脑在远程 VM 上运行 Grenade,它会很有用。

Grenade 知道如何使用包含的 setup-grenade 脚本安装当前主分支。参数是运行升级测试的目标系统的 hostname 和目标系统的用户

./setup-grenade [testbox [testuser]]

如果您在克隆到的同一台机器上运行 Grenade,则不需要执行此操作。

配置

可以通过将类似以下内容添加到 localrc 来更改使用的 Grenade 仓库和分支

GRENADE_REPO=git@github.com:dtroyer/grenade.git
GRENADE_BRANCH=dt-test

如果您需要为您的特定环境配置本地 devstack,可以通过创建 devstack.localrc 来实现。这将附加到 BASE 和 TARGET 的 stub devstack 配置。

例如,指定 Nova 的接口是 devstack.localrc 的常见用法

FLAT_INTERFACE=eth1
VLAN_INTERFACE=eth1

运行升级测试

./grenade.sh

阅读 grenade.sh 以获取有关从这里开始发生的步骤的更多详细信息。