支持卷备份配额

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/cinder/+spec/support-volume-backup-quota

提供一种控制卷备份配额的机制。

问题描述

由于配额考虑了卷、快照和千兆字节,因此也需要考虑备份。

  • 目前备份创建 API 不是管理员 API,项目用户可以创建任意数量的备份。

  • 如果某些恶意用户创建过多的、大型备份,耗尽备份存储后端上的可用空间,则会导致 cinder-backup 进入拒绝服务状态。

用例

提议的变更

通过支持卷备份配额,我们需要进行以下更改。

  • 添加备份数量配额项和备份千兆字节配额项的默认配额。

  • Cinder 配额更新 API 支持备份数量配额和备份千兆字节配额的创建和更新操作。

  • Cinder 配额 show/defaults API 支持显示备份配额信息。

  • 配额引擎支持处理备份配额项。

    Class QuotaEngine and Class VolumeTypeQuotaEngine support processing
    with backup quota item.
    Add _sync_backups function to get one project's backup number.
    Add _sync_backup_gigabytes function to get one project's backup
    gigabytes number.
    Add configuration item no_backup_gb_quota, which indicates whether to
    take backup's size into account with backup gigabytes quota.
    Add '_sync_backup': _sync_backups to QUOTA_SYNC_FUNCTIONS.
    Add '_sync_backup_gigabytes': _sync_backup_gigabytes to
    QUOTA_SYNC_FUNCTIONS.
    
  • 备份创建/删除例程支持处理备份数量配额和备份千兆字节配额。

  • Limits API 支持显示一个项目的当前已用数量和最大数量的备份数量和备份千兆字节信息。

备选方案

数据模型影响

REST API 影响

更改以下 API 的返回值。

  • Cinder 配额 show/defaults API

    • 当前返回值

      {
          "quota_set":
          {
              "gigabytes": 1000,
              "snapshots": 10,
              "volumes_rbd": -1,
              "volumes": 10,
              "gigabytes_rbd": -1,
              "snapshots_rbd": -1,
              "id": "bb2ec78e61d3493da61449f3c69db3f3"
          }
      }
      
    • 新返回值

      {
          "quota_set": {
              "gigabytes": 1000,
              "snapshots": 10,
              "volumes_rbd": -1,
              "volumes": 10,
              "snapshots_rbd": -1,
              "gigabytes_rbd": -1,
              "backups": 10,          # new add return item
              "backup_gigabytes": 1000, # new add return item
              "id": "bb2ec78e61d3493da61449f3c69db3f3"
          }
      }
      
  • Limit index API 返回值

    • 当前返回值

      {
          "limits": {
              "rate": [],
              "absolute": {
                  "totalSnapshotsUsed": 0,
                  "maxTotalVolumeGigabytes": 1000,
                  "totalGigabytesUsed": 5,
                  "maxTotalSnapshots": 10,
                  "totalVolumesUsed": 5,    #new add return item
                  "maxTotalVolumes": 10     # new add return item
              }
          }
      }
      
    • 新返回值

      {
          "limits": {
              "rate": [],
              "absolute": {
                  "totalSnapshotsUsed": 0,
                  "maxTotalVolumeGigabytes": 1000,
                  "totalGigabytesUsed": 5,
                  "maxTotalSnapshots": 10,
                  "totalVolumesUsed": 5,
                  "maxTotalVolumes": 10,
                  "totalBackupsUsed": 0,       # new add return item
                  "maxBackupsUsed": 10,        # new add return item
                  "totalBackupGigabytesUsed": 0, # new add return item
                  "maxTotalBackupGigabytes": 1000, # new add return item
              }
          }
      }
      

安全影响

通过耗尽备份资源来实施的拒绝服务攻击被阻止。

通知影响

无。

其他最终用户影响

Cinder 配额 show/defaults API 和 limits API 的返回值已更改。

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

ling-yun<zengyunling@huawei.com>

工作项

  • 实现“Proposed change”中提到的代码。

  • 添加更改 API 文档。

依赖项

测试

需要创建单元测试和 Tempest 测试来覆盖“Proposed change”(提议的更改)中提到的代码更改,并确保在添加对卷备份的支持时,Cinder 配额功能能够正常工作。

文档影响

Cinder API 文档需要更新以反映 REST API 的更改。

参考资料