共享和保护资源的支持¶
https://blueprints.launchpad.net/sahara/+spec/shared-protected-resources
此规范建议添加创建和修改跨租户共享以及防止更新的对象的能力。
问题描述¶
目前,Sahara 创建的所有对象仅在其创建的租户中可见,并且无法保证不会被偶然修改或删除。
提议的变更¶
此规范建议向所有可以通过 REST API 访问的 Sahara 对象添加 is_public 和 is_protected 布尔字段。它们将被添加到集群、集群模板、节点组模板、数据源、作业执行、作业、作业二进制文件和作业二进制文件内部。
所有这些对象都可以使用启用的 is_public 和 is_protected 参数创建,并且可以在创建后使用相应的 API 调用进行更新。默认情况下,它们都将为 False。
如果某个对象将 is_public 字段设置为 True,则意味着它不仅在其创建的租户中可见,而且对任何其他租户也可见。
如果某个对象将 is_protected 字段设置为 True,则意味着除非将此字段设置为 False,否则无法修改它(更新、扩展、取消或删除)。如果将 is_protected 参数设置为 True,则只有在更新请求中提供 is_protected=False 时才能修改对象。
在一个租户中创建的公共对象可以被其他租户使用(例如,可以从在另一个租户中创建的公共集群模板创建集群),但为了防止管理不同租户中的资源,只有在其创建的租户中才能进行更新、删除、取消和扩展等操作。
为了控制这些限制,将在 sahara.service.validation.acl 中实现一对方法
def check_tenant_for_delete(context, object)
def check_tenant_for_update(context, object)
def check_protected_from_delete(object)
def check_protected_from_update(object, data)
check_tenant_for_* 将比较上下文中 tenant_id 与对象 tenant_id,如果不同,则引发错误。但是,对于周期性任务,应跳过此检查,因为在这种情况下上下文中没有 tenant_id。
check_protected_from_delete 将检查 is_protected 字段,如果设置为 True,则引发错误。 check_protected_from_update 还会检查更新数据中是否将 is_protected 字段更改为 False。
这些方法将在 sahara.db.sqlalchemy.api 内部的更新和删除方法中调用,这些方法仅进行数据库更改。但是,对于 cluster_create、cluster_scale、job_execute、job_execution_cancel 和 job_execution_delete 操作,将在 API 调用之前在验证期间调用它们。
替代方案¶
无
数据模型影响¶
将向上述对象添加两个额外的字段 is_public 和 is_protected。
REST API 影响¶
将不会添加新的 API 调用,但将更新现有调用以支持新字段。
其他最终用户影响¶
Saharaclient API 将更新以支持新字段。
部署者影响¶
无
开发者影响¶
无
Sahara-image-elements impact¶
无
Sahara-dashboard / Horizon 影响¶
将在每个对象的 Update 和 Create 面板中添加 is_public 和 is_protected 复选框。
实现¶
负责人¶
- 主要负责人
apavlov-n
工作项¶
添加新的字段
is_public和is_protected到上述对象;实现上述描述的验证;
使用相应的更改更新 saharaclient;
将添加关于新功能的文档。
依赖项¶
无
测试¶
将添加单元测试和大量的手动测试。
文档影响¶
所有更改都将记录在案。
参考资料¶
无