支持访问规则的元数据

https://blueprints.launchpad.net/manila/+spec/metadata-for-access-rule

为访问规则资源添加一个新的“metadata”属性。

问题描述

访问规则资源缺乏获取/设置元数据属性的能力。

用例

这里的元数据指的是描述性元数据,用于发现和识别。用户可以为访问规则添加键值对来描述它们。用户也可以在请求访问规则列表时,使用指定的元数据来过滤访问规则。

提议的变更

  • “metadata”属性将被添加到访问规则对象中。

  • 将创建一个新的数据库表“share_access_rules_metadata”。

  • 访问规则创建 API 将被更新以支持“metadata”。

  • 将创建一组 API 用于访问规则元数据的 CRUD 操作。

备选方案

我们只能通过 access_to 获取所需的访问规则值。没有办法通过用户标记访问规则,或者为访问添加一些特殊信息。

数据模型影响

新的“share_access_rules_metadata”表将在数据库中创建,并包含访问规则 ID。主键为“id”。我们可以通过访问规则 ID 获取 access_rules 表的信息。

+-------------------+--------------+-------------+-------------+-----------------+
|     key           | value        | id          | deleted     |    access_id    |
+-------------------+--------------+-------------+-------------+-----------------+
|    varchar(255)   | varchar(255) | varchar(36) | varchar(36) |    varchar(36)  |
+-------------------+--------------+-------------+-------------+-----------------+
|    varchar(255)   | varchar(255) | varchar(36) | varchar(36) |    varchar(36)  |
+-------------------+--------------+-------------+-------------+-----------------+`

REST API 影响

  • 它将遵循微版本规则。

  • 访问规则创建 API 的请求体将被更新以支持“metadata”。

    POST /v2/{project_id}/shares/{share_id}/action
    
    the request body can contain "metadata".
    {
        "allow_access":{
            "metadata":{
                "key1": "value1",
                "key2": "value2"
            }
            ...
        }
    }
    
  • 将创建一组与访问规则元数据相关的新的 API。

    • 显示访问规则的元数据

      GET    /v2/{project_id}/share-access-rules/{access_id}
      
      Response
      {
          "access": {
              "access_level": "rw",
              "state": "error",
              "id": "507bf114-36f2-4f56-8cf4-857985ca87c1",
              "access_type": "cert",
              "access_to": "example.com",
              "access_key": null,
              "metadata": {
                  "key1": "value1",
                  "key2": "value2"
              }
          }
      }
      
    • 列出根据访问规则元数据过滤的访问规则

      GET   /v2/{project_id}/share-access-rules?share_id={share-id}&key1=value1&key2=value2
      
      Response
      {
          "accesses": [
              {
                      "access_level": "rw",
                      "state": "active",
                      "id": "507bf114-36f2-4f56-8cf4-857985ca87c1",
                      "access_type": "cert",
                      "access_to": "example.com",
                      "access_key": null,
                      "metadata": {
                          "key1": "value1",
                          "key2": "value2"
                      }
              },
              {
                      "access_level": "rw",
                      "state": "error",
                      "id": "329bf795-2cd5-69s2-cs8d-857985ca3652",
                      "access_type": "ip",
                      "access_to": "10.0.0.2",
                      "access_key": null,
                      "metadata": {
                          "key1": "value1",
                          "key2": "value2"
                      }
              },
          ]
      }
      
      • “share_id”是一个强制查询键,如果未提供“share_id”,API 将返回 HTTP 400 错误。

      注意

      当前的 访问规则列表 API 接受 HTTP POST 请求。为了确保围绕幂等性和安全信息检索的正确 HTTP 语义,我们将引入一个新的 API,该 API 接受 GET 请求。旧的 API 将被限制在最大微版本中,即它将不可用于引入此新 API 的微版本中。

    • 删除一个指定的元数据

      DELETE   /v2/{project_id}/share-access-rules/{access_id}/metadata/{key}
      
      • 如果我们不输入“key”值,manila 将不会删除任何元数据并返回 HTTP 400 错误。

    • 更新一个指定的元数据

      PUT   /v2/{project_id}/share-access-rules/{access_id}/metadata
      
      Request
      {
          "metadata":{
              "key1": "value1",
              "key2": "value2"
          }
      }
      
      • 如果我们不输入“key”值,它将不会更新任何元数据并返回错误。

安全影响

通知影响

新的 API 也会发送新的通知。

其他最终用户影响

Manila 客户端和 CLI 将被扩展以支持访问元数据。

  • 支持访问元数据的 access-allow 命令将如下所示

    manila access-allow [--metadata <key=value> [<key=value> ...]]
                        [--access-level <access_level>]
                        <share> <access_type> <access_to>
    
  • 新的 access-metadata 命令将如下所示

    manila access-metadata <access_id> <action> <key=value> [<key=value> ...]
    
    Set or delete metadata on a access rule.
    
    Positional arguments:
    <access_id>     ID of the access rule to update metadata on.
    <action>     Actions: "set" or "unset" to set or delete metadata on a access rule.
    <key=value>  Metadata to set or unset, only key is necessary to unset.
    
  • 支持访问元数据的新的 access-show 命令将如下所示

    manila access-show <access_id>
    
    Show information of given access rule.
    
    Positional arguments:
    <access_id>       ID of the access rule to update metadata on.
    
  • access-deny 命令将删除所有访问规则元数据。命令语法不会改变

    manila access-deny <share> <id>
    
  • access-list 命令将添加元数据过滤器。命令将如下所示

    manila access-list [--columns <columns>] <share>
                       [--metadata [<key=value> [<key=value> ...]]]
    Show access list for share.
    
    Positional arguments:
    
    <share> Name or ID of the share.
    
    Optional arguments:
    
    --columns  Comma separated list of columns to be displayed
    example –columns “access_type,access_to”.
    
    --metadata Filters results by a metadata key and value.
    OPTIONAL: Default=None.
    

性能影响

将创建一个新的“share_access_rules_metadata”表。数据库连接操作可能会导致现有访问规则 API 的搜索性能降低。

其他部署者影响

开发人员影响

驱动程序将无法访问元数据,并且 update_access 的驱动程序接口将不会被修改。

实现

负责人

主要负责人

zhongjun

工作项

  • 为访问规则对象添加元数据属性并提升 API 版本。

  • 创建一个新的数据库表“share_access_rules_metadata”并添加数据库升级脚本。

  • 更新访问规则创建/列表 API。

  • 添加访问规则元数据的更新/删除 API。

  • 在 openstack/manila-tempest-plugin 中添加新的测试用例,用于新的 API。

  • 允许在 Manila UI 和 python-manilaclient 中添加/更新/删除访问规则元数据。

依赖项

测试

  • 单元测试

  • Tempest 测试

文档影响

  • Api-ref 需要更新。

  • 更新用户文档和 CLI 文档

参考资料