用于管理插件的 Admin API

https://blueprints.launchpad.net/sahara/+spec/plugin-management-api

这是一个为不同项目实施新的插件管理 Admin API 的提案。 此外,可以通过新的插件管理 API 实现更智能的弃用机制。

问题描述

目前我们存在以下问题

  • 插件状态对用户来说完全不明确。 从用户角度来看,只有默认插件,这些插件已为所有项目启用;

  • 目前特定插件版本的弃用并不完美:在创建期间会引发带有弃用说明的验证错误 - 这对用户来说不是很好;

  • 所有插件和版本都为所有项目启用,这并不完美。 有些人只想使用 Ambari 插件,而另一些人只想使用 CDH 插件(或特定版本)

提议的变更

建议实施几个新的插件管理 API 调用。 实际上,计划在 API v1.1 中正确支持这一点,以便我们可以将其放入 API v2 而无需额外的工作。

首先,我们需要默认启用所有插件。 继续区分默认和非默认插件没有意义。 达成共识认为,拥有默认/非默认插件是多余的,仅仅是因为这种流程不允许至少在几个项目中交付可能不稳定的插件进行测试。

此外,作为此蓝图的一部分,应将 hadoop_version 迁移到 plugin_version,以使此 API 与新的管理 API 保持一致。

应创建新的数据库来存储有关每个插件当前状态的所有必需元数据。 此元数据是插件本身及其每个版本的标签的组合。 插件标签是插件状态(或版本)的指示器,我们将帮助用户了解插件本身(例如稳定性、弃用状态)或某些功能的当前状态。 如果未在 DB 中存储任何元数据,插件 SPI 方法将帮助我们返回插件的默认元数据。 这也将帮助我们避免从旧版本的 sahara 升级时可能出现的问题。

此元数据应描述每个插件及其版本。 此插件 SPI 方法返回值的示例如下

{
   "version_labels": {
       "2.3": {
           "stable": {
               "status": true
           },
           "enabled": {
               "status": true
           }
       },
       "2.2": {
           "deprecated": {
               "status": true
           },
           "enabled": {
               "status": true
           }
       }
   },
   "plugin_labels": {
       "enabled": {
           "status": false,
       }
   }
}

PluginManager 在请求所有插件时,将收集存储在 DB 中有关插件的所有数据,并将这些数据与 DB 中没有条目的插件的默认数据累积。 此外,对于每个标签条目,管理器还将提供标签的描述以及管理员更改标签的可能性。 收集到的数据将暴露给用户。 请在 REST API 部分查看返回值示例。

初始标签集如下

  • enabled 如果插件已启用,则每个用户都可以将其用于集群创建,并能够对该集群执行所有 CRUD 操作。 如果插件没有此标签,则只能删除该集群。

  • hidden 如果插件是隐藏的,它仍然可以使用 saharaclient 执行操作,但它将从 UI 侧和 CLI 隐藏。 这是假插件的特殊标签。

  • stable 插件足够稳定,可以安全使用。 为了证明插件在集群创建和运行 EDP 作业方面的稳定性,应为插件启用 Sahara CI。 此标签无法删除。 将仅由插件 SPI 方法处理,不会存储在 DB 中。

  • deprecated 插件已弃用。 将针对此插件显示弃用警告。 不打算使用。 Sahara CI(夜间)将继续测试此插件,以证明它仍然可以正常工作。 标签无法删除。 应提供有关此集群可执行哪些操作的建议。

如果标签确实可以删除,管理员可以通过 API 使用 PATCH 操作来使用标签。 oslo_policy 将用于处理用户是否具有管理员角色。 只能更改每个标签的状态。 无法更改可变性和描述。

替代方案

数据模型影响

此功能需要新的表来存储有关插件标签的数据。

+----------------+--------------+
| plugins        | column type  |
+----------------+--------------+
| tenant_id      | String       |
+----------------+--------------+
| plugin_labels  | JsonDictType |
+----------------+--------------+
| version_labels | JsonDictType |
+----------------+--------------+
| id (Unique)    | String       |
+----------------+--------------+
| name           | String       |
+----------------+--------------+

一个存储数据的简单示例

{
   'name': "fake",
   "plugin_labels": {
       "enabled": {
           "status": true,
       }
   },
   "tenant_id": "uuid",
   "id": "uuid just to be unique",
   "version_labels": {
       "0.1": {
           "enabled": {
               "status": true
           }
       }
   }
}

REST API 影响

REST API 将进行大量更改。

端点更改

  1. 对于 GET /plugins,在实施后预计将获得以下输出。 所有标签将额外序列化为描述和可变性。

{
   "plugins": [
       {
           "description": "HDP plugin with Ambari",
           "versions": [
               "2.3",
               "2.4",
           ],
           "name": "ambari",
           "plugin_labels": {
               "enabled": {
                   "description": "Indicates that plugin is switched on",
                   "mutable": true,
                   "status": true
               }
           },
           "version_labels": {
               "2.3": {
                   "enabled": {
                       "description": "Indicates that version is switched on",
                       "mutable": true,
                       "status": false,
                   },
                   "deprecated": {
                       "description": "Plugin is deprecated, but can be used"
                       "mutable": false,
                       "status": true
                   },
                   "stable": {
                       "description": "Plugin stability",
                       "mutable": false,
                       "status": false
                   }
               },
               "2.4": {
                   "enabled": {
                       ..
                   },
                   "stable": {
                       ..
                   },
               },
           },
           "title": "HDP Plugin"
       },
   ]
}
  1. 新的 PATCH /plugins/<name>,用于更新插件或其版本的标签。 如果所有修改后的标签都是可变的,则将成功完成更新。 将验证用户是否仅更新每个标签的状态。 要更新标签,需要仅在正文中发送该标签的请求。 可变性和描述是无法更改的字段。

{
   "plugin_labels": {
       "enabled": {
           "status": false,
       }
   }
   "version_labels: {
       "2.3": {
           "enabled": {
               "status": true,
           },
       },
       "2.4": {
           "enabled": {
               "status": false,
           },
       },
   }
}

其他最终用户影响

新的 CLI 将扩展为包含插件更新。 还会添加有关弃用标签的警告。

部署者影响

部署者不需要额外的操作; 无论如何,我们都应该通知 plugins 选项的新默认值。

开发者影响

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

需要做的事情

  1. 应实施一个新的标签,用于管理插件。 所有标签将显示在此标签中。 每个标签将具有复选框,这些复选框将向插件添加该标签。 只有管理员才能进行更改。

  2. 将向模板/集群创建标签添加有关弃用标签的警告。 如果启用的插件只有一个,我们将不会为插件选择提供下拉菜单,并且对于版本也是如此。 如果启用的插件和版本只有一个,则将跳过插件选择操作。

实现

负责人

主要负责人

vgridnev (Vitaly Gridnev)

工作项

应涵盖以下项目

  • 默认启用所有插件;

  • 实施数据库端;

  • 应添加新的 API 方法;

  • 插件 SPI 方法用于默认元数据;

  • 在 API 文档中记录新的 API 功能;

  • python-saharaclient 实现;

  • sahara-dashboard 更改

依赖项

取决于OpenStack要求

测试

功能将由单元测试覆盖。

文档影响

所有插件标签应正确记录。

参考资料