重构客户端实体模型

https://blueprints.launchpad.net/python-barbicanclient/+spec/client-refactor-models

当前客户端中的实体模型使用起来有些笨拙。此蓝图建议重构一些功能,以使 API 更加易用和一致。

问题描述

barbicanclient 中的实体模型应该被重构,以提供更符合 Python 风格的 API。此次重构将使现有的实体与最近批准的容器蓝图保持一致。 [1]

提议的变更

重构现有模型,为影响单个实体的操作提供在实体类内部的方法。这将允许仅影响单个实体的流程在无需引用相应的 EntityManager 子类的情况下完成。

应该重构 Secret 实体,以添加一个 store() 方法和一个 payload 属性

from barbicanclient import client

# Set up client connection
connection = client.Client(tenant_id="1", endpoint=ENDPOINT, insecure=True)

# Create a new Secret
my_secret = connection.secrets.Secret(name="My secret name",
                                      payload="the secret sauce")
my_secret.store()

# Alternatively set Secret properties instead of passing args
my_secret = connection.secrets.Secret()
my_secret.name = "My secret name"
my_secret.payload = "the secret sauce"
my_secret.store()

类似地,Orders 应该允许构造函数同时接受所有参数,并可以直接设置属性。我们还应该添加一个 submit() 方法,以将订单提交到 API

from barbicanclient import client

# Set up client connection
connection = client.Client(tenant_id="1", endpoint=ENDPOINT, insecure=True)

# Create and submit a new Order
my_order = connection.orders.Order(
    name="My Order",
    payload_content_type="application/octet-stream"
    algorithm="AES",
    mode="CBC",
    bit_length=256,
    expiration=None
)
my_order.submit()

# Alternatively set the Order properties instead of passing args
my_order = connection.orders.Order()
my_order.name = "My Order"
my_order.payload_content_type = "application/octet-stream"
my_order.algorithm = "AES"
my_order.mode = "CBC"
my_order.bit_length = 256
my_order.expiration = None
my_order.submit()

仍然应该通过相应的 EntityManager 处理实体列表。但是,解密密钥的能力应该移动到 Secret 类,并从 SecretManager 中移除。

应该将从 EntityManager 检索实体(替换 get() 函数)的功能移动到 Entity 构造函数。例如

my_secret = connection.secrets.Secret(secret_ref=SECRET_REF)
my_order = connection.orders.Order(order_ref=ORDER_REF)

删除实体可以通过现有的 EntityManager delete(entity_ref) 或使用新的 Entity 函数 delete() 来完成。使用 Secret 的示例

# New method
my_secret = connection.secrets.Secret(secret_ref=SECRET_REF)
my_secret.delete()

# Old way still works
connection.secrets.delete(secret_ref=SECRET_REF)

备选方案

我们可以继续像当前一样使用这些对象。

另外请注意,一旦 Typed Orders 实现完成,就需要重新审视 Orders 功能。 [2]

数据模型影响

REST API 影响

安全影响

通知与审计影响

日志记录应该以与库的其余部分一致的方式进行。

其他最终用户影响

此更改需要重写 Secret 对象的使用方式,并且需要客户端库的新主要版本。

性能影响

其他部署者影响

开发人员影响

实现

负责人

蓝图草案:Douglas Mendizábal (redrobot) 实现:Adam Harwell (rm_work)

工作项

  • 重构 Secret 实体

  • 重构 Order 实体

依赖项

测试

测试应该与库中现有的测试保持一致。

文档影响

需要更新常见的工作流程,以提供有关如何使用重构类的示例。

参考资料

客户端中的容器 etherpad:https://etherpad.openstack.org/p/python-barbicanclient-containers 容器蓝图:https://specs.openstack.org/openstack/barbican-specs/specs/juno/client-add-containers.html