添加可挂载快照

https://blueprints.launchpad.net/manila/+spec/manila-mountable-snapshots

目前,manila 仅允许用户从快照创建新的共享。 这种限制在东京和奥斯汀峰会上引发了一些关于添加新的快照语义的讨论。 达成一致的新功能之一是以只读模式挂载快照的能力。

问题描述

一些驱动程序可以将快照暴露为可挂载的,但当前的实现要求用户对快照的唯一操作是从其创建新的共享。 虽然这在几种情况下很有用,但在某些情况下,从快照创建整个新共享是过度了,或者在某些情况下,现有驱动程序无法完成。

用例

在某些情况下,用户只需要恢复单个文件或一组文件。 在这些情况下,只需挂载快照并检索所需的文件,而不是需要创建整个新共享来复制文件然后删除它,这将更简单。 它也可以由管理员或外部系统(如 manila-data)使用。

此功能还可以用于在使用“恢复到快照”功能还原共享到其状态之前检查快照的内容。

提议的变更

该提议是向快照添加导出位置,以便用户允许和拒绝访问快照以只读模式挂载它们。 一些没有访问父共享权限的用户或系统可能需要访问快照,因此快照的访问规则必须与其父共享分离。 这种分离也提供了更高的安全性,因为它避免了对共享的意外访问。 重要的是要注意,为了支持此功能,驱动程序必须能够支持这种访问规则的分离。

驱动程序在创建快照时将提供快照导出位置。 此提议的 API 将遵循当前共享允许和拒绝访问的实现,包括在巴塞罗那峰会上达成一致的新协议特定访问规则限制。 为了支持此功能,将添加一个新的额外规范,称为 mount_snapshot_support

备选方案

主要的替代方案是从快照创建新的共享,以便可以从这个新的共享中检索文件。 虽然这已经实现并可用,但此替代方案会消耗用户的配额,并且在大多数情况下,新的共享将仅用于检索单个文件,这使得它过于复杂。 另一种替代方案是实现一个只读共享,该共享可以在这些情况下使用。 作为只读共享,用户可以对共享执行的一些操作可能没有意义(例如,创建快照、扩展、缩小),因此这种新型共享可能不符合 manila 中共享的当前概念。 还有一种可能性是快照继承来自共享的访问规则,但以只读方式。 虽然这种替代方案更简单,但它也更具限制性,因为它不允许最初没有访问共享权限的系统或用户访问快照。

数据模型影响

需要三个新表

  1. ShareSnapshotInstanceExportLocations

  2. ShareSnapshotAccessMapping

  3. ShareSnapshotInstanceAccessMapping

将向现有的 ShareSnapshotInstance 表添加一个新的 export_locations 属性,并将向现有的 Share 表添加一个新的 mount_snapshot_support 属性。

REST API 影响

将实现以下新的 API 方法

  1. (202, POST) snapshot-access-allow: 允许访问快照

URL: /snapshots/<id>/action Body: {“access-allow”: {“access_type”: <value>, “access_to”: <value>}}

  1. (202, POST) snapshot-access-deny: 拒绝访问快照

URL: /snapshots/<id>/action Body: {“access-deny”: {“access_id”: <value>}}

  1. (200, GET) snapshot-access-list: 列出快照的访问权限

URL: /snapshots/<id>/access-list

  1. (200, GET) snapshot-export-location-list

URL: /snapshots/<id>/export-locations

  1. (200, GET) snapshot-instance-export-location-list

URL: /snapshot-instances/<id>/export-locations

  1. (200, GET) snapshot-export-location-show

URL: /snapshots/<snap-id>/export-locations/<el-id>

  1. (200, GET) snapshot-instance-export-location-show

URL: /snapshot-instances/<si-id>/export-locations/<el-id>

驱动程序影响

添加驱动程序接口

def snapshot_allow_access(self, context, snapshot, access,
                          share_server=None):
"""Allow access to the snapshot."""

def snapshot_deny_access(self, context, snapshot, access,
                         share_server=None):
"""Deny access to the snapshot."""

为了支持此功能,create_snapshot 方法必须更改为返回快照导出位置,并且驱动程序必须报告 mount_snapshot_support 为 True。

安全影响

通知影响

其他最终用户影响

此功能将在 python-manilaclient 和 manila-ui 中实现。 允许和拒绝访问快照的命令将遵循当前允许和拒绝访问共享的实现,并且获取快照导出位置的方式将类似于共享实现。

性能影响

其他部署者影响

开发人员影响

这将需要在驱动程序接口上进行更改。 为了支持此功能,驱动程序需要实现新的方法。

实现

负责人

主要负责人

tiago.pasqualini

工作项

  • 使用功能性 tempest 和场景测试覆盖实现核心功能

  • 在 python-manilaclient 中实现 snapshot-access-allow 和 snapshot-access-deny 命令,以及 python-manilaclient 功能性测试

  • 在其中一个第一方驱动程序中实现可挂载快照

  • 实现 manila-ui 更改(快照允许/拒绝访问并公开快照导出位置)

  • 创建可挂载快照文档

依赖项

此功能依赖于 从快照创建共享的额外规范,因为它将消除当前存在于“snapshot_support”额外规范上的重载。

测试

  • 单元测试

  • 功能性 tempest 测试

  • 场景测试

文档影响

  • 文档字符串

  • Devref

  • API 参考

  • 用户指南

参考资料

Etherpad: https://etherpad.openstack.org/p/mitaka-manila-mountable-snapshots