Modular Grenade Architecture¶
Grenade 最初是为了展示 OpenStack 项目在升级方面的能力而创建的。最初只包含少量服务。
建议的新基本流程
setup_grenade - 所有围绕错误陷阱和文件句柄重定向进行的魔术设置 - 设置 devstack 树
setup_base - 运行 stack.sh 以构建正确的基线环境
verify_base - 对于 projects 中的每个项目;do verify_project; done
resources.sh create
resources.sh verify pre-upgrade
shutdown - 对于 projects 中的每个项目;do shutdown; done
snapshot.sh pre_upgrade (尚未实现)
resources.sh verify_noapi pre-upgrade
upgrade …
resources.sh verify post-upgrade
verify_target
resources.sh destroy
Modular Components¶
假设目标项目中存在以下目录结构
devstack/ - devstack plugin directory
upgrade/ - upgrade scripts
settings - adds settings for the upgrade path
upgrade.sh
snapshot.sh - snapshots the state of the service, typically a
database dump (NOT YET IMPLEMENTED)
from-juno/ - per release
within-juno/
from-kilo/
within-kilo/
resources.sh
- Grenade 目录中也存在相同的模块化结构:
- grenade/
- projects/
- 10_ceilometer/
settings upgrade.sh
resources.sh¶
resources.sh 是一个面向服务的资源创建/验证/销毁接口。服务在其脚本中执行什么由它们自己决定。
您可以假设只有当您的服务在升级环境中运行时,您的资源脚本才会被调用。对于成功操作,脚本应返回零,对于失败操作,应返回非零。
Calling Interface¶
以下是支持的调用接口
resources.sh early_create
创建一个应在升级过程非常早期就能生存下来的一组示例资源。这仅应用于影响其他服务的水平资源,这些资源必须在执行任何设置之前可用。例如,设置 neutron 网络。
除非您真正知道为什么
create对您不起作用,否则不要使用此阶段。resources.sh create
创建一个应在升级后生存下来的一组示例资源。如果任何资源无法创建,脚本应以非零退出码退出。
示例:在 nova 中创建一个实例或在 cinder 中创建一个卷
resources.sh verify (pre-upgrade|post-upgrade)
验证资源是否已创建。此时服务正在运行,并且 API 可能需要工作。第二个参数指示我们是在升级前还是升级后。
示例:使用 nova 命令验证测试实例是否仍处于 ACTIVE 状态,或使用 cinder 命令验证卷是否仍可用。
resources.sh verify_noapi
验证资源是否仍然存在。这将在服务停止、API 预期不可访问的阶段调用。此阶段的资源验证可能需要探测底层组件,以确保在服务关闭期间没有出现任何问题。第二个参数指示我们是在升级前还是升级后。
示例:使用 libvirt 检查以确保实例实际上已创建并正在运行。能够 ping 通实例或以其他方式检查其生命力是加分项。对于 cinder,检查 LVM 卷是否存在且看起来合理。
resources.sh destroy
资源脚本在被要求销毁时应负责清理所有资源。
Calling Sequence¶
Grenade 运行期间的调用顺序如下
# 启动旧版本
create (在正常运行的旧版本期间会调用 create)
verify pre-upgrade
# 关闭所有服务
verify_noapi pre-upgrade
# 升级并启动所有服务
verify post-upgrade
摧毁
重要的是要记住,verify/verify_noapi 将被多次调用,涉及多个不同版本的 OpenStack。脚本的这些阶段不能被多次重运行。
虽然在当前接口中 create / destroy 只会被调用一次,但为了测试的健壮性,如果它们也是幂等的,那就更好了。
每个版本的升级脚本
有时,为了从一个版本迁移到下一个版本,甚至在同一个版本内,必须执行异常的手动升级步骤。Grenade 通过每个项目中的版本脚本支持这一点,例如:
projects/
60_nova/
from-ocata/
upgrade-nova
关于这些版本脚本的调用顺序,任何 within-$base 脚本应在安装新代码之前运行,任何 from-$base 脚本应在安装新代码之后但在此之前运行启动具有新代码的服务。这是因为在启动升级代码之前可能需要配置或数据库更改。
Supporting Methods¶
为了协助列出的检查,存在以下函数
resource_save project key value
resource_get project key
这允许资源脚本拥有内存,并跟踪分配的 IP 地址、ID 和其他从 OpenStack API 调用返回的非确定性数据。
环境¶
资源脚本在已经设置好的特定环境中被调用
TOP_DIR - 将设置为 devstack 目录的根目录,用于 BASE 版本的 devstack,以防需要查找诸如工作中的
openrc之类的文件GRENADE_DIR - grenade 目录的根目录。
以下代码段将为您提供对 grenade 和 TARGET devstack 函数的访问权限
source $GRENADE_DIR/grenaderc
source $GRENADE_DIR/functions
Best Practices¶
尽可能多地以非管理员身份执行操作。在您的资源脚本中尽早分配一个用户/项目来运行脚本是值得的。这确保了与其他脚本的隔离,并确保操作并非仅仅因为管理员可以绕过安全机制而起作用。
测试副作用,而不仅仅是 API 操作。这些资源生存脚本的目的是测试 API/DB 交互之外创建的事物是否仍然有效。仅仅测试数据是否可以从数据库中存储/检索并不是很有趣,应该在其他地方涵盖。资源脚本的价值在于这些副作用。实际运行的虚拟机、实际运行的 iscsi 目标等。并确保在控制平面被移开时这些事物不会受到干扰。
Out of Tree Plugins¶
Grenade 插件可以像外部 devstack 插件一样托管在项目树之外。发生这种情况时,有一些细微的差别。
插件结构将位于 $project/devstack/upgrade/ 目录下。
通过添加以下内容来启用插件
enable_grenade_plugin <$project> <giturl> [branch]
到 GRENADE_DIR 中的 pluginrc。由于插件函数变为可用的顺序,因此需要一个额外的 rc 文件。
注意:当运行基于 grenade-base 作业的作业时,对于使用 devstack_plugins 定义的每个 devstack 插件,相应的 grenade 插件都会自动启用。
Changing Devstack Localrc¶
还有一个机制允许 settings 文件使用 devstack_localrc 函数更改 devstack localrc 文件。
- ::
devstack_localrc <base|target> 要添加的任意内容
这将获取该行上的所有其余内容并将其添加到 base 或 target devstack 的 localrc 文件中。
请注意,devstack_localrc 仅在 grenade 执行 devstack 设置配置并针对 base target 运行时才有效。当 GRENADE_USE_EXTERNAL_DEVSTACK 设置为 True 时,就像在 Zuul grenade 作业中那样,devstack 在 grenade 之前配置和执行,该函数无效。
Example settings¶
以下是外部插件的一个合理的示例 settings 文件
register_project_for_upgrade heat
register_db_to_save heat
devstack_localrc base enable_service h-api h-api-cfn h-api-cw h-eng heat
devstack_localrc target enable_service h-api h-api-cfn h-api-cw h-eng heat
这会注册项目以进行升级,在升级过程中象征性地启用 heat 数据库进行转储,并将 heat 服务添加到 base 和 target 的服务列表中。
预计大多数外部插件的 settings 文件将需要类似的行。