每个策略都应返回实现的目标¶
https://blueprints.launchpad.net/watcher/+spec/get-goal-from-strategy
问题描述¶
目前,无法知道给定的目标由哪个策略实现。目标与策略之间的映射在 Watcher 配置文件中完成。
除此之外,无法知道多个策略实现相同的优化目标。
应该有一种方法,根据部署在运行Watcher 决策引擎的节点上的策略,返回可用的目标列表。
用例¶
作为管理员,我希望能够获取可用的优化目标列表,以便我可以选择一个目标并在我的审计模板中使用它。
作为管理员,我希望能够安装新的策略并获取更新后的可用目标列表,以便我确信返回的目标列表与已部署的策略一致。
作为管理员,当审计模板的目标不再可用时,我希望收到通知,以便我知道我必须更新或删除此审计模板。
项目优先级¶
不相关,因为 Watcher 目前不在大型帐篷内。
提议的变更¶
所有与相同目标相关的策略都应该从相同的父类派生,并返回相同的目标属性。
以下是一个类图,显示了几个目标的策略层次结构。
将来,这将使 Watcher 策略能够为给定的目标提供其他通用属性和方法(输入参数、功效指标等)。
目标的同步包括通过DefaultLoader类中的list_available函数自动建立目标与策略之间的数据一致性,然后将更改应用于Watcher 数据库。应在启动期间由 decision_engine 自动执行一段时间内的目标协调。我们应该创建一个Synchronizer类,该类比较Watcher 数据库中的记录与DefaultLoader找到的记录,然后替换更改后的目标和策略,以在入口点与Watcher 数据库之间建立标识。同步的结果是,所有可用目标和策略都会更新。同步有两大主要原因。第一是,我们不希望 Watcher API 组件与 Watcher 决策引擎组件之间存在紧密耦合。事实上,我们希望 watcher-api 仅与Watcher 数据库和消息代理交互。同步避免了 watcher cli 调用 watcher-api,而 watcher-api 又必须调用 watcher-decision-api,后者负责列出资源。第二个原因是性能和高可用性。
以下是同步目标的策略类和序列图。
备选方案¶
保留当前系统,该系统从 Watcher 配置文件中读取目标与策略之间的映射。
数据模型影响¶
可用目标列表应存储在Watcher 数据库中。对于每个目标,可用策略列表也应存储在Watcher 数据库中。应在数据库中为此创建一个新表。因此,应在数据库中为此创建一个新表。在Watcher 数据库中提出的修改在下面的图表中说明。
在 audit_template 对象中,'strategy' 属性是可选的。如果管理员想要强制触发一个策略,它可以在审计模板中指定策略 uuid。对于给定的优化目标,可能有多个策略适用。如果管理员没有指定策略,则 watcher 策略选择器负责根据提供的目标选择合适的策略。此蓝图应重用当前负责选择策略的DefaultStrategySelector类。策略的选择很复杂,但可能超出了此蓝图的范围 (watcher-strategy-selector)。但是,我们需要提供一个基本的/最小的策略选择器。因此,策略选择器将选择给定目标的第一个可用策略。将来,我们计划拥有一个更复杂的策略选择器,该选择器能够根据许多参数(例如基础设施的使用情况、工作负载等)选择策略。
软删除是一种常用的模式,并且必须实现级联以维护完整性。如果删除了一个策略,我们需要更新链接到该策略的每个审计模板,并将策略 ID 设置为 None。因此,审计模板仍然可以实现相同的目标,但使用不同的策略。但是,如果我们删除目标,我们不打算维护完整性,因为它超出了此蓝图的范围 (soft-delete-goals)。
注意:id 属性由 oslo.db 用于处理 soft_delete 功能。
REST API 影响¶
所有以 /v1/goals/ 开头并使用类型 Goal 的 REST 资源 URL 都会受到影响。
GET /v1/goals
GET /v1/goals/(goal_uuid)
GET /v1/goals/detail
类型 Goal 将包含两个属性
以下是包含 2 个目标的新的 JSON 有效负载示例,第一个目标只有一个策略,第二个目标有 2 个可用策略
{
"goals": [
{
"goal_id": "REDUCE_ENERGY",
"goal_display_name": "Reduce Energy Consumption",
"strategies": [
{
"strategy_id": "POWERING_DOWN",
"strategy_display_name": "Powering down unused compute
nodes",
}
]
},
{
"goal_id": "SERVERS_CONSOLIDATION",
"goal_display_name": "Reduce the number of compute nodes needed
to support current projects workloads"
"strategies": [
{
"strategy_id": "FFD",
"strategy_display_name": "First-Fit Decreasing",
},
{
"strategy_id": "BFD",
"strategy_display_name": "Best-Fit Decreasing",
}
]
}
]
}
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
python-watcherclient 应该能够在请求目标列表时返回所有目标属性,并在请求给定目标的详细信息时返回可用策略列表。
在管理员创建新的审计模板时,也应该能够在 Horizon 中浏览可用目标列表。当管理员选择给定的目标时,他/她应该能够看到该目标的可用策略列表并选择首选的策略。
性能影响¶
无
其他部署者影响¶
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
vincent-francoise
其他贡献者:jed56
工作项¶
以下是预见的工作项目列表
删除以前从 Watcher 配置文件中读取的目标列表和映射机制。以下 Python 文件应受到影响
/devstack/local.conf.controller/watcher/decision_engine/strategy/selection/default.py/watcher/tests/decision_engine/strategy/selector/test_strategy_selector.py/watcher/tests/api/v1/test_goals.py/watcher/tests/api/v1/test_audit_templates.py/watcher/api/controllers/v1/goal.py/watcher/api/controllers/v1/audit_template.py/watcher/opts.py/etc/watcher/watcher.conf.sample
在
BaseStrategy类中,应添加以下属性对于每个 XYZ 目标,应该有一个基策略类,名为 XYZBaseStrategy,其中包含指示所有子策略实现的目标 ID 和显示名称的目标属性值。
使用这种处理目标的新方法更新所有现有策略。为每个常见的优化目标创建一个基策略类。
在 /watcher/db/sqlalchemy/models.py 中添加一个新的 Goal 对象,用于在Watcher 数据库中存储目标。
在 /watcher/objects/ 包中添加一个新的 goal.py 类,以处理数据库中目标对象的 CRUD 操作。
当Watcher 决策引擎服务启动时,Watcher 应该浏览可用策略列表,获取它们的目标属性,并在Watcher 数据库中为每个新的目标 ID 创建一个新条目。之后,Watcher 决策引擎应该能够检查Watcher 数据库中的所有审计模板是否包含现有的目标。如果不是,则应在日志中跟踪错误。在此阶段,Watcher 决策引擎还应在数据库中为每个新的策略 ID 创建一个记录,并将此记录与它实现的目标对象关联。请注意,相同的模型随后将由其他蓝图(例如 blueprint optimization-threshold)用于公开每个策略的输入参数。
更新 Watcher devstack 插件设置以进行调整(删除自动 [watcher_goals] 配置设置)。
依赖项¶
无
测试¶
更新Watcher 决策引擎中的单元测试。
更新 Tempest 测试以运行一个策略。
添加一些 Tempest 测试以获取可用目标的列表,并为每个目标获取可用策略的列表。
文档影响¶
更新名为“构建新的优化策略”的页面,解释当添加新的目标时,应创建一个新的基策略类。
更新名为“配置 Watcher”的页面,删除“目标映射配置”部分。
更新名为“Watcher 用户指南”的页面,提供 CLI 示例,说明如何获取目标列表以及如何获取给定目标的可用策略列表。
参考资料¶
IRC 讨论
历史¶
无