为 python-barbicanclient 添加容器

Launchpad蓝图

https://blueprints.launchpad.net/python-barbicanclient/+spec/client-add-containers

Barbican 现在提供了密钥容器资源,因此也应该将其添加到客户端。

问题描述

我们需要能够使用 Python 对象来表示容器,在 Python 库中消费和创建容器资源。

提议的变更

在新的 containers 模块中添加新的类来表示 Barbican 中可用的不同类型的容器

barbicanclient.containers.Container
barbicanclient.containers.CertificateContainer
barbicanclient.containers.RSAContainer

这些类应该可以这样使用

from barbicanclient.containers import Container, RSAContainer

# New Generic Container
my_container = Container()
my_container.add("Secret Name in Container", Secret(...))
my_container.save()

# New RSA Container
my_rsa_container = RSAContainer()
my_rsa_container.public_key = Secret(...)
my_rsa_container.private_key = Secret(...)
my_rsa_container.private_key_passphrase = Secret(...) #optional
my_rsa_container.save()

# RSAContainer should be subclassed from Container
my_rsa_container.add("public_key", Secret(...)) # should work
my_rsa_container.add("unsupported_secret_name", Secret(...)) # should raise exception

# New Certificate Container
my_cert_container = CertificateContainer()
my_cert_container.certificate = Secret(...)
my_cert_container.private_key = Secret(...)
my_cert_container.private_key_passphrase = Secret(...)
my_cert_container.intermediates = Secret(...)
my_cert_container.save()

# CertificateContainer should be subclassed from Container
my_cert_container.add('certificate', Secret(...)) # should work
my_cert_container.add('unsupported_secret_name', Secret(...)) # should raise exception

对象应该是懒加载的,因此在调用 save() 方法之前不应该发送请求。 save() 方法还应该递归地存储密钥,如果它们尚未存储到 Barbican 实例中。

一旦为第一次调用了 save() 方法,容器就变为不可变的,后续调用 add()save() 应该引发异常。 基本上,任何会修改容器的操作,除了 delete() 之外,都应该引发异常。

应该通过客户端对象可访问的 ContainerManager 来检索现有的容器

from barbicanclient import client

barbican = client.Client(...)
my_container = barbican.containers.get('https://ref_to_container/UUID')

get() 方法应该返回适当的容器类的实例。 列出现有方法也应该通过 ContainerManager 来完成

my_containers = barbican.containers.list(limit=10, offset=0)
isinstance(my_containers, list) # should return True

容器删除应该在容器对象或使用 ContainerManger 上完成

my_container = barbican.containers.get('https://ref_to_container/UUID')
my_container.delete()
# or
barbican.containers.delete('https://ref_to_container/UUID')

备选方案

上述建议的功能将大部分操作推送到容器对象,同时保持 ContainerManager 功能相对简单。 另外,ContainerManager 可以执行所有功能,而使容器对象简单。

我认为在一个方法中创建容器可能会很快变得混乱,所以我更愿意避免它。

数据模型影响

REST API 影响

安全影响

通知与审计影响

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

其他最终用户影响

无,因为这是新功能。

性能影响

其他部署者影响

开发人员影响

实现

负责人

蓝图草案:dougmendizabal 实现:待定

工作项

  • 实现新的 containers 模块。

依赖项

测试

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

文档影响

所有新的容器功能都需要进行文档记录。

参考资料

客户端中的容器 etherpad:https://etherpad.openstack.org/p/python-barbicanclient-containers