重构项目以更好地适应所有插件类型

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/barbican/+spec/restructure-for-plugins

当前项目结构只在“crypto”包中自然地适应 HSM 风格的插件。本蓝图通过在“plugin”包下重组项目结构来适应 Barbican 所需的所有插件类型。

问题描述

当前项目结构将 Barbican 目前唯一支持的插件(用于与 HSM 接口)放置在“crypto”包中。对新的 Barbican 功能的规划揭示了对新类型插件的需求,这些插件要么难以使用 HSM 契约实现(例如 Dogtag 或 KMIP),要么是完全不同类型的插件。后者包括 SSL 证书工作流处理插件和事件插件。这些新插件不适合当前的“crypto”包,因此 Barbican 已经超出了其范围。

提议的变更

本蓝图将当前的“crypto”包替换为以下包结构:

common/
resources.py - API 和 Worker 进程调用此模块以

生成、存储或获取机密。

plugin_managers.py - 包含基础级别的 stevedore 插件查找逻辑,根据需要。

由 plugin 包中的接口扩展。

plugin/

interface/ - 存储其他 Barbican 包使用的插件契约

(作为 abc 抽象)。还包含 stevedore 查找方法。

secret_store.py - Nate 当前的数据存储插件,用于

安全地存储/检索机密(例如 Dogtag 和 KMIP)。还将包括一个名为 SecretStorePluginManager 的类,它使用 stevedore 来查找 Nate 的机密存储插件实现。

certificates.py - SSL 证书工作流插件。还将包括一个

名为 CertGenerationPluginManager 的类,它使用 stevedore 来查找证书生成工作流插件实现。

crypto/ - 类似于当前的“crypto”包。存储

HSM 和安全模块相关模块。由于这是一个不打算从插件包外部调用的“内部”接口,这些模块与上述“interface”包是隔离的。

crypto.py - 用于 HSM 风格接口的密钥和机密生成插件。

类似于当前的 crypto/plugin.py::CryptoPluginBase 接口。还将包括一个名为 SecretGenerationPluginManager 的类,它使用 stevedore 来查找对称/非对称密钥生成插件(即所谓的“第二级插件查找”)。此逻辑与当前的 crypto/extension_manager.py 非常相似。

p11_crypto.py - Paul 的 HSM 插件实现。

simple_crypto.py - 安全模块插件的简单实现。

store_crypto.py - secret_store.py 的实现,用于在高层 secret_store.py 接口和低层 crypto.py 接口之间进行适配。

将利用 SecretGenerationPluginManager 来定位“第二级”HSM 风格的插件实现。

dogtag.py - secret_store.py 接口的 Dogtag 实现。

kmip.py - secret_store.py 接口的 KMIP 实现。

symantec.py - certificates.py 接口的赛门铁克实现。

接口。

这项工作首先只引入新结构。然后将现有插件转移到新结构中,并验证单元测试仍然通过。

为了为这个新结构提供具体上下文,以下序列提供了一个在这次重构工作后存储机密的示例流程:

  1. 调用 POST /secrets(使用一步法)

  2. barbican.api.controllers.secrets.py 中的 API 代码调用...

  3. barbican.common.resources.py 中的通用代码,其中有一行类似这样的代码

storer = SecretStorePluginManager.getPlugin(
              plugin_managers.STORE_SECRET, meta_data)
storer.store_secret(...)

4. SecretStorePluginManager 将查看配置文件,并查看哪些插件可用。最初它将是 plugin.dogtag、plugin.kmip 或 plugin.store_crypto 中定义的实现之一。

5. 如果插件是 dogtag 或 kmip,则 store_secret() 将直接由插件代码实现。

6. 如果插件是 store_crypto 适配器,则 store_secret() 将反过来调用 common.plugin_manager.py 来查找 crypto/security-module 类型的插件(即二级 stevedore 查找)。最初这将是 plugin/crypto/p11_crypto.py 或 simple_crypto.py,并且将像现在一样调用其 encrypt() 方法。

7. 插件返回,更新 meta_data,创建秘密记录并向用户返回 URL。

备选方案

更详细的讨论在此 etherpad 上进行:https://etherpad.openstack.org/p/extension-manager

最初的讨论方法是将接口提升到顶层 Barbican 包。然而,这将使它们与“common”、“api”和“task”包(例如)处于同一级别,这将使插件源代码位置更难定位。因此,将所有插件集中在一个明确的“plugin”包下似乎可以提供与其余源代码的适当划分。在“plugin”包下,结构旨在组织接口、默认和外部模块。

数据模型影响

无。

REST API 影响

无。

安全影响

无。

通知影响

无。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

这次更改的第一阶段不会产生影响,因为它只设置了新的文件夹结构。一旦现有插件实现被移到新结构中,待处理的 CR 将受到影响,因为文件结构已经改变。但是,我们应该能够与我们的贡献者协调此更改。

实现

负责人

主要负责人

john-wood-w

其他贡献者

alee-3 rellerreller

工作项

CR #1 - 并行添加新结构到当前结构,不应影响

当前代码库。

CR #2 - 将现有插件移到新结构,包括更新

api/ 和 tasks/ 模块以引用新位置,然后验证单元测试仍然通过。

依赖项

无。

测试

当前的单元测试需要更改,以引用修订后的项目结构中项的新位置。

文档影响

更新此 wiki 部分及其后的部分:https://github.com/cloudkeep/barbican/wiki/Developer-Guide-for-Contributors#detailed-explanation

参考资料

更详细的讨论在此 etherpad 上进行:https://etherpad.openstack.org/p/extension-manager