共享和保护资源的支持

https://blueprints.launchpad.net/sahara/+spec/shared-protected-resources

此规范建议添加创建和修改跨租户共享以及防止更新的对象的能力。

问题描述

目前,Sahara 创建的所有对象仅在其创建的租户中可见,并且无法保证不会被偶然修改或删除。

提议的变更

此规范建议向所有可以通过 REST API 访问的 Sahara 对象添加 is_publicis_protected 布尔字段。它们将被添加到集群、集群模板、节点组模板、数据源、作业执行、作业、作业二进制文件和作业二进制文件内部。

所有这些对象都可以使用启用的 is_publicis_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_publicis_protected

REST API 影响

将不会添加新的 API 调用,但将更新现有调用以支持新字段。

其他最终用户影响

Saharaclient API 将更新以支持新字段。

部署者影响

开发者影响

Sahara-image-elements impact

Sahara-dashboard / Horizon 影响

将在每个对象的 UpdateCreate 面板中添加 is_publicis_protected 复选框。

实现

负责人

主要负责人

apavlov-n

工作项

  • 添加新的字段 is_publicis_protected 到上述对象;

  • 实现上述描述的验证;

  • 使用相应的更改更新 saharaclient;

  • 将添加关于新功能的文档。

依赖项

测试

将添加单元测试和大量的手动测试。

文档影响

所有更改都将记录在案。

参考资料