Skip to content

Commit 47a0fa4

Browse files
authored
Add new GroupControllerService and VolumeGroupSnapshot CSI RPCs (#519)
* Add VolumeGroupSnapshot CSI RPCs
1 parent bd1cb65 commit 47a0fa4

File tree

3 files changed

+1781
-320
lines changed

3 files changed

+1781
-320
lines changed

csi.proto

+214
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,30 @@ service Controller {
102102
}
103103
}
104104

105+
service GroupController {
106+
option (alpha_service) = true;
107+
108+
rpc GroupControllerGetCapabilities (
109+
GroupControllerGetCapabilitiesRequest)
110+
returns (GroupControllerGetCapabilitiesResponse) {}
111+
112+
rpc CreateVolumeGroupSnapshot(CreateVolumeGroupSnapshotRequest)
113+
returns (CreateVolumeGroupSnapshotResponse) {
114+
option (alpha_method) = true;
115+
}
116+
117+
rpc DeleteVolumeGroupSnapshot(DeleteVolumeGroupSnapshotRequest)
118+
returns (DeleteVolumeGroupSnapshotResponse) {
119+
option (alpha_method) = true;
120+
}
121+
122+
rpc GetVolumeGroupSnapshot(
123+
GetVolumeGroupSnapshotRequest)
124+
returns (GetVolumeGroupSnapshotResponse) {
125+
option (alpha_method) = true;
126+
}
127+
}
128+
105129
service Node {
106130
rpc NodeStageVolume (NodeStageVolumeRequest)
107131
returns (NodeStageVolumeResponse) {}
@@ -181,6 +205,15 @@ message PluginCapability {
181205
// returned by NodeGetInfo to ensure that a given volume is
182206
// accessible from a given node when scheduling workloads.
183207
VOLUME_ACCESSIBILITY_CONSTRAINTS = 2;
208+
209+
// GROUP_CONTROLLER_SERVICE indicates that the Plugin provides
210+
// RPCs for operating on groups of volumes. Plugins MAY provide
211+
// this capability.
212+
// The presence of this capability determines whether the CO will
213+
// attempt to invoke the REQUIRED GroupController service RPCs, as
214+
// well as specific RPCs as indicated by
215+
// GroupControllerGetCapabilities.
216+
GROUP_CONTROLLER_SERVICE = 3;
184217
}
185218
Type type = 1;
186219
}
@@ -1163,6 +1196,21 @@ message Snapshot {
11631196
// `volume_content_source` in a `CreateVolumeRequest`. The default
11641197
// value is false. This field is REQUIRED.
11651198
bool ready_to_use = 5;
1199+
1200+
// The ID of the volume group snapshot that this snapshot is part of.
1201+
// It uniquely identifies the group snapshot on the storage system.
1202+
// This field is OPTIONAL.
1203+
// If this snapshot is a member of a volume group snapshot, and it
1204+
// MUST NOT be deleted as a stand alone snapshot, then the SP
1205+
// MUST provide the ID of the volume group snapshot in this field.
1206+
// If provided, CO MUST use this field in subsequent volume group
1207+
// snapshot operations to indicate that this snapshot is part of the
1208+
// specified group snapshot.
1209+
// If not provided, CO SHALL treat the snapshot as independent,
1210+
// and SP SHALL allow it to be deleted separately.
1211+
// If this message is inside a VolumeGroupSnapshot message, the value
1212+
// MUST be the same as the group_snapshot_id in that message.
1213+
string group_snapshot_id = 6 [(alpha_field) = true];
11661214
}
11671215
message DeleteSnapshotRequest {
11681216
// The ID of the snapshot to be deleted.
@@ -1634,3 +1682,169 @@ message NodeExpandVolumeResponse {
16341682
// The capacity of the volume in bytes. This field is OPTIONAL.
16351683
int64 capacity_bytes = 1;
16361684
}
1685+
message GroupControllerGetCapabilitiesRequest {
1686+
// Intentionally empty.
1687+
}
1688+
1689+
message GroupControllerGetCapabilitiesResponse {
1690+
// All the capabilities that the group controller service supports.
1691+
// This field is OPTIONAL.
1692+
repeated GroupControllerServiceCapability capabilities = 1;
1693+
}
1694+
1695+
// Specifies a capability of the group controller service.
1696+
message GroupControllerServiceCapability {
1697+
message RPC {
1698+
enum Type {
1699+
UNKNOWN = 0;
1700+
1701+
// Indicates that the group controller plugin supports
1702+
// creating, deleting, and getting details of a volume
1703+
// group snapshot.
1704+
CREATE_DELETE_GET_VOLUME_GROUP_SNAPSHOT = 1
1705+
[(alpha_enum_value) = true];
1706+
}
1707+
1708+
Type type = 1;
1709+
}
1710+
1711+
oneof type {
1712+
// RPC that the controller supports.
1713+
RPC rpc = 1;
1714+
}
1715+
}
1716+
message CreateVolumeGroupSnapshotRequest {
1717+
option (alpha_message) = true;
1718+
1719+
// The suggested name for the group snapshot. This field is REQUIRED
1720+
// for idempotency.
1721+
// Any Unicode string that conforms to the length limit is allowed
1722+
// except those containing the following banned characters:
1723+
// U+0000-U+0008, U+000B, U+000C, U+000E-U+001F, U+007F-U+009F.
1724+
// (These are control characters other than commonly used whitespace.)
1725+
string name = 1;
1726+
1727+
// volume IDs of the source volumes to be snapshotted together.
1728+
// This field is REQUIRED.
1729+
repeated string source_volume_ids = 2;
1730+
1731+
// Secrets required by plugin to complete
1732+
// ControllerCreateVolumeGroupSnapshot request.
1733+
// This field is OPTIONAL. Refer to the `Secrets Requirements`
1734+
// section on how to use this field.
1735+
// The secrets provided in this field SHOULD be the same for
1736+
// all group snapshot operations on the same group snapshot.
1737+
map<string, string> secrets = 3 [(csi_secret) = true];
1738+
1739+
// Plugin specific parameters passed in as opaque key-value pairs.
1740+
// This field is OPTIONAL. The Plugin is responsible for parsing and
1741+
// validating these parameters. COs will treat these as opaque.
1742+
map<string, string> parameters = 4;
1743+
}
1744+
1745+
message CreateVolumeGroupSnapshotResponse {
1746+
option (alpha_message) = true;
1747+
1748+
// Contains all attributes of the newly created group snapshot.
1749+
// This field is REQUIRED.
1750+
VolumeGroupSnapshot group_snapshot = 1;
1751+
}
1752+
1753+
message VolumeGroupSnapshot {
1754+
option (alpha_message) = true;
1755+
1756+
// The identifier for this group snapshot, generated by the plugin.
1757+
// This field MUST contain enough information to uniquely identify
1758+
// this specific snapshot vs all other group snapshots supported by
1759+
// this plugin.
1760+
// This field SHALL be used by the CO in subsequent calls to refer to
1761+
// this group snapshot.
1762+
// The SP is NOT responsible for global uniqueness of
1763+
// group_snapshot_id across multiple SPs.
1764+
// This field is REQUIRED.
1765+
string group_snapshot_id = 1;
1766+
1767+
// A list of snapshots belonging to this group.
1768+
// This field is REQUIRED.
1769+
repeated Snapshot snapshots = 2;
1770+
1771+
// Timestamp of when the volume group snapshot was taken.
1772+
// This field is REQUIRED.
1773+
.google.protobuf.Timestamp creation_time = 3;
1774+
1775+
// Indicates if all individual snapshots in the group snapshot
1776+
// are ready to use as a `volume_content_source` in a
1777+
// `CreateVolumeRequest`. The default value is false.
1778+
// If any snapshot in the list of snapshots in this message have
1779+
// ready_to_use set to false, the SP MUST set this field to false.
1780+
// If all of the snapshots in the list of snapshots in this message
1781+
// have ready_to_use set to true, the SP SHOULD set this field to
1782+
// true.
1783+
// This field is REQUIRED.
1784+
bool ready_to_use = 4;
1785+
}
1786+
message DeleteVolumeGroupSnapshotRequest {
1787+
option (alpha_message) = true;
1788+
1789+
// The ID of the group snapshot to be deleted.
1790+
// This field is REQUIRED.
1791+
string group_snapshot_id = 1;
1792+
1793+
// A list of snapshot IDs that are part of this group snapshot.
1794+
// If SP does not need to rely on this field to delete the snapshots
1795+
// in the group, it SHOULD check this field and report an error
1796+
// if it has the ability to detect a mismatch.
1797+
// Some SPs require this list to delete the snapshots in the group.
1798+
// If SP needs to use this field to delete the snapshots in the
1799+
// group, it MUST report an error if it has the ability to detect
1800+
// a mismatch.
1801+
// This field is REQUIRED.
1802+
repeated string snapshot_ids = 2;
1803+
1804+
// Secrets required by plugin to complete group snapshot deletion
1805+
// request.
1806+
// This field is OPTIONAL. Refer to the `Secrets Requirements`
1807+
// section on how to use this field.
1808+
// The secrets provided in this field SHOULD be the same for
1809+
// all group snapshot operations on the same group snapshot.
1810+
map<string, string> secrets = 3 [(csi_secret) = true];
1811+
}
1812+
1813+
message DeleteVolumeGroupSnapshotResponse {
1814+
// Intentionally empty.
1815+
option (alpha_message) = true;
1816+
}
1817+
message GetVolumeGroupSnapshotRequest {
1818+
option (alpha_message) = true;
1819+
1820+
// The ID of the group snapshot to fetch current group snapshot
1821+
// information for.
1822+
// This field is REQUIRED.
1823+
string group_snapshot_id = 1;
1824+
1825+
// A list of snapshot IDs that are part of this group snapshot.
1826+
// If SP does not need to rely on this field to get the snapshots
1827+
// in the group, it SHOULD check this field and report an error
1828+
// if it has the ability to detect a mismatch.
1829+
// Some SPs require this list to get the snapshots in the group.
1830+
// If SP needs to use this field to get the snapshots in the
1831+
// group, it MUST report an error if it has the ability to detect
1832+
// a mismatch.
1833+
// This field is REQUIRED.
1834+
repeated string snapshot_ids = 2;
1835+
1836+
// Secrets required by plugin to complete
1837+
// GetVolumeGroupSnapshot request.
1838+
// This field is OPTIONAL. Refer to the `Secrets Requirements`
1839+
// section on how to use this field.
1840+
// The secrets provided in this field SHOULD be the same for
1841+
// all group snapshot operations on the same group snapshot.
1842+
map<string, string> secrets = 3 [(csi_secret) = true];
1843+
}
1844+
1845+
message GetVolumeGroupSnapshotResponse {
1846+
option (alpha_message) = true;
1847+
1848+
// This field is REQUIRED
1849+
VolumeGroupSnapshot group_snapshot = 1;
1850+
}

0 commit comments

Comments
 (0)