为 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