每个插件的默认模板¶
蓝图:https://blueprints.launchpad.net/sahara/+spec/default-templates
目前,为了为任何插件创建一个基本的集群,用户需要经过几个步骤来创建合适的节点组和集群模板。我们认为这些操作应该被捕获在每个插件的默认模板集中,并在提前加载到数据库中,以便用户无需重复一些最基本的步骤来配置一个简单的集群。
问题描述¶
即使创建一个基本的集群,在用户能够启动集群之前也需要几个步骤。为了减少启动简单集群所需的工作量和时间,我们建议为每个插件提供一组默认模板,这些模板将被预加载并可供使用。
其他潜在问题/答案:1) 如何使模板集对所有用户/租户可用?目前,任何给定的模板只能被一个租户读取/写入。
A) 实现模板的 ACL 支持(SLukjanov 计划编写此规范)。在适当的 ACL 支持到位后,我们将能够管理跨所有租户的读取/写入访问权限。
ACL 支持尚未可用。目前,模板将按租户添加。
2) 我们是否允许编辑默认模板?我认为我们不应该允许编辑默认模板,因为它们在所有租户之间共享。编辑的流程应该是复制模板并从副本开始工作。我建议每个模板都将存储一个标志在数据库中,用于标识每个默认模板是否为默认模板,以便我们可以强制用户无法更改默认模板。
3) 如何避免每次启动时都上传相同的默认模板,同时仍然允许根据需要更新它们?我们可以使用模板文件名称中的编号系统来指示版本号,并将该版本号存储在数据库中(也许不用布尔标志来指示模板是否为默认模板,而是存储一个版本号)。在启动时,我们将遍历每个插件的所有模板文件,并将版本号与数据库中存储的版本号进行比较。
Sqlalchemy 会检测字段何时发生更改,并相应地设置“updated at”字段。因此,我们只需在每次运行脚本时尝试更新现有模板。如果模板与数据库中的内容匹配,则不会进行更新。
4) 如何使 json 默认集群模板引用 json 默认节点组模板,因为我们不知道节点组模板 ID?
A) CLI 工具将逐一操作,首先处理节点组模板,然后处理集群模板。此外,我们可以创建一些示例作业,这些作业可用于健康检查。
提议的变更¶
为每个插件创建一组默认模板 json 文件。
一组默认模板将由节点组模板和/或集群模板组成。模板文件定义节点组模板还是集群模板将根据 Sahara JSON 验证代码中指定的必需字段的存在来确定。节点组模板需要 flavor_id 和 node_processes,因此这些字段的存在隐式地将模板标识为节点组模板。如果它不是节点组模板,则它就是集群模板。这种识别方式避免了命名方案或其他类型的额外标签来标识模板类型。
与 Sahara 捆绑在一起的默认模板将位于 sahara/plugins/default_templates/。处理默认模板的代码应将此路径用作默认起点,但应允许指定不同的起点。它不应对目录结构做出任何假设,除了以下几点
特定目录中的所有模板文件都应被视为一个集合,并且集群模板可以通过名称引用同一集合中的节点组模板。
目录可以嵌套以进行逻辑组织,以便插件可以为每个版本定义默认模板集。因此,代码应默认递归遍历子目录,但应能够指定不进行递归。
这种设计将允许代码处理默认模板,而无需明确了解 Sahara 插件、插件版本或插件目录的结构。指定不同的起点将允许用户处理特定的模板集(例如,仅启用某些插件),或者如果需要位于不同位置的替代集合。
在实践中,sahara/plugins/default_templates 下的目录将以插件命名,并根据需要为不同版本创建子目录。
添加一个 CLI 工具,该工具可以由具有管理员凭据的 cron 定期执行,以创建/更新现有的默认模板。此工具需要能够接受一些占位符,例如“flavor”或“network”,并在运行时进行适当的替换(从配置或命令行参数)。如果我们要强制任何更新都显式触发,则 cron 作业可以可选。
CLI 将提供一个选项来指定起始目录(默认值为 sahara/plugins/default_templates)。
CLI 将提供一个选项来禁用子目录的递归(默认情况下将递归)。
至少,CLI 将提供一个命令来创建或更新默认模板,处理从指定起始目录开始。
CLI 应该使用来自 [database] 部分的“plugins”配置参数来过滤要处理的模板。如果模板的“plugin-name”字段与“plugins”列表中的插件名称匹配,则将对其进行处理。如果“plugins”列表为空,则将处理所有模板。应该能够使用“–plugin-name”选项从命令行覆盖“plugins”配置。
如果在特定集合中更新或创建模板时发生错误,CLI 应该尝试撤消该集合中进行的任何修改或创建。
CLI 还应提供一种删除默认模板的机制,因为 is_default 字段将阻止删除,如果管理员出于某种原因希望删除默认模板。
替代方案¶
1) 如果我们希望拥有某种外部过程来管理默认模板,则可以通过 REST API 进行加载过程。这可能需要更改 API 以添加用于管理默认模板的端点,并且似乎有很多不必要的开销,因为默认模板的管理应该只在 Sahara 内部完成。
2) 添加一个钩子,可能在 plugins/base:PluginManager 中,用于“load_default_templates”。此方法将负责在启动时触发默认模板的加载。
数据模型影响¶
N/A
REST API 影响¶
N/A
其他最终用户影响¶
最终用户将看到默认模板显示,就像他们可能创建的任何其他模板一样。
部署者影响¶
N/A
开发者影响¶
N/A
Sahara-image-elements impact¶
N/A
Sahara-dashboard / Horizon 影响¶
N/A 默认模板将在 UI 中显示,并看起来像常规模板。
实现¶
负责人¶
- 主要负责人
croberts
- 二级分配人
tmckay
工作项¶
1) 为每个插件创建一个默认模板集。这些可能将是 json 格式的文件。
2) 提出一种机制来加载模板或确保它们在 Sahara 启动时已加载。
更新 Sahara 文档。
依赖项¶
1) 实现模板的 ACL(规范仍在 TBD 中)。这将使我们能够让所有用户读取默认模板,同时仍然允许管理员编辑模板。
测试¶
理想情况下,将添加测试以确保基于每个默认模板集可以启动一个正常运行的集群。如果确定每次运行都过于耗时,那么测试每个模板集的有效性可能就足够了。
文档影响¶
应更新 Sahara 文档,以说明默认模板可供使用。此外,未来的插件预计将提供自己的一组默认模板。
参考资料¶
N/A