diff --git a/csi.proto b/csi.proto index 3c3294da..b720a4aa 100644 --- a/csi.proto +++ b/csi.proto @@ -237,6 +237,16 @@ message PluginCapability { // The presence of this capability determines whether the CO will // attempt to invoke the OPTIONAL SnapshotMetadata service RPCs. SNAPSHOT_METADATA_SERVICE = 4 [(alpha_enum_value) = true]; + + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS indicates that the snapshots + // for this plugin MAY NOT be equally usable from all + // topologies in the cluster. A snapshot is usable from a location + // if volumes created from that snapshot are guaranteed to be + // accessible from that location. The CO MUST use the topology + // information returned in the CreateSnapshotResponse to ensure + // that a desired volume can be provisioned from a given snapshot + // when scheduling workloads. + SNAPSHOT_ACCESSIBILITY_CONSTRAINTS = 5 [(alpha_enum_value) = true]; } Type type = 1; } @@ -1229,6 +1239,21 @@ message CreateSnapshotRequest { // - Specify primary or secondary for replication systems that // support snapshotting only on primary. map parameters = 4; + + // Specifies where (regions, zones, racks, etc.) the provisioned + // snapshot MUST be usable from. A snapshot is usable from a location + // if volumes created from that snapshot are guaranteed to be + // accessible from that location. + // An SP SHALL advertise the requirements for topological + // accessibility information in documentation. COs SHALL only specify + // topological accessibility information supported by the SP. + // This field is OPTIONAL. + // This field SHALL NOT be specified unless the SP has the + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS plugin capability. + // If this field is not specified and the SP has the + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS plugin capability, the SP MAY + // choose where the provisioned snapshot is usable from. + TopologyRequirement accessibility_requirements = 5 [(alpha_field) = true]; } message CreateSnapshotResponse { @@ -1288,6 +1313,22 @@ message Snapshot { // If this message is inside a VolumeGroupSnapshot message, the value // MUST be the same as the group_snapshot_id in that message. string group_snapshot_id = 6; + + // Specifies where (regions, zones, racks, etc.) the provisioned + // snapshot is usable from. A snapshot is usable from a location if + // volumes created from that snapshot are guaranteed to be accessible + // from that location. + // A plugin that returns this field MUST also set the + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS plugin capability. + // An SP MAY specify multiple topologies to indicate the snapshot is + // usable from multiple locations. + // COs MAY use this information to ensure that a desired volume can + // be provisioned from a given snapshot when scheduling workloads. + // This field is OPTIONAL. If it is not specified, the CO MAY assume + // the snapshot is equally usable from all topologies in the + // cluster and MAY provision volumes referencing the snapshot as a + // source without topology constraints. + repeated Topology accessible_topology = 7 [(alpha_field) = true]; } message DeleteSnapshotRequest { // The ID of the snapshot to be deleted. diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index bf35b68e..63858ef8 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -114,6 +114,13 @@ const ( // The presence of this capability determines whether the CO will // attempt to invoke the OPTIONAL SnapshotMetadata service RPCs. PluginCapability_Service_SNAPSHOT_METADATA_SERVICE PluginCapability_Service_Type = 4 + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS indicates that the snapshots + // for this plugin MAY NOT be equally accessible from all + // topologies in the cluster. The CO MUST use the topology + // information returned in the CreateSnapshotResponse to ensure + // that a desired volume can be provisioned from a given snapshot + // when scheduling workloads. + PluginCapability_Service_SNAPSHOT_ACCESSIBILITY_CONSTRAINTS PluginCapability_Service_Type = 5 ) // Enum value maps for PluginCapability_Service_Type. @@ -124,13 +131,15 @@ var ( 2: "VOLUME_ACCESSIBILITY_CONSTRAINTS", 3: "GROUP_CONTROLLER_SERVICE", 4: "SNAPSHOT_METADATA_SERVICE", + 5: "SNAPSHOT_ACCESSIBILITY_CONSTRAINTS", } PluginCapability_Service_Type_value = map[string]int32{ - "UNKNOWN": 0, - "CONTROLLER_SERVICE": 1, - "VOLUME_ACCESSIBILITY_CONSTRAINTS": 2, - "GROUP_CONTROLLER_SERVICE": 3, - "SNAPSHOT_METADATA_SERVICE": 4, + "UNKNOWN": 0, + "CONTROLLER_SERVICE": 1, + "VOLUME_ACCESSIBILITY_CONSTRAINTS": 2, + "GROUP_CONTROLLER_SERVICE": 3, + "SNAPSHOT_METADATA_SERVICE": 4, + "SNAPSHOT_ACCESSIBILITY_CONSTRAINTS": 5, } ) @@ -3085,9 +3094,23 @@ type CreateSnapshotRequest struct { // - Specify if the snapshot should be replicated to some place. // - Specify primary or secondary for replication systems that // support snapshotting only on primary. - Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Specifies where (regions, zones, racks, etc.) the provisioned + // snapshot MUST be usable from. A snapshot is usable from a location + // if volumes created from that snapshot are guaranteed to be + // accessible from that location. + // An SP SHALL advertise the requirements for topological + // accessibility information in documentation. COs SHALL only specify + // topological accessibility information supported by the SP. + // This field is OPTIONAL. + // This field SHALL NOT be specified unless the SP has the + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS plugin capability. + // If this field is not specified and the SP has the + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS plugin capability, the SP MAY + // choose where the provisioned snapshot is usable from. + AccessibilityRequirements *TopologyRequirement `protobuf:"bytes,5,opt,name=accessibility_requirements,json=accessibilityRequirements,proto3" json:"accessibility_requirements,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateSnapshotRequest) Reset() { @@ -3148,6 +3171,13 @@ func (x *CreateSnapshotRequest) GetParameters() map[string]string { return nil } +func (x *CreateSnapshotRequest) GetAccessibilityRequirements() *TopologyRequirement { + if x != nil { + return x.AccessibilityRequirements + } + return nil +} + type CreateSnapshotResponse struct { state protoimpl.MessageState `protogen:"open.v1"` // Contains all attributes of the newly created snapshot that are @@ -3241,8 +3271,23 @@ type Snapshot struct { // If this message is inside a VolumeGroupSnapshot message, the value // MUST be the same as the group_snapshot_id in that message. GroupSnapshotId string `protobuf:"bytes,6,opt,name=group_snapshot_id,json=groupSnapshotId,proto3" json:"group_snapshot_id,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Specifies where (regions, zones, racks, etc.) the provisioned + // snapshot is usable from. A snapshot is usable from a location if + // volumes created from that snapshot are guaranteed to be accessible + // from that location. + // A plugin that returns this field MUST also set the + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS plugin capability. + // An SP MAY specify multiple topologies to indicate the snapshot is + // usable from multiple locations. + // COs MAY use this information to ensure that a desired volume can + // be provisioned from a given snapshot when scheduling workloads. + // This field is OPTIONAL. If it is not specified, the CO MAY assume + // the snapshot is equally usable from all topologies in the + // cluster and MAY provision volumes referencing the snapshot as a + // source without topology constraints. + AccessibleTopology []*Topology `protobuf:"bytes,7,rep,name=accessible_topology,json=accessibleTopology,proto3" json:"accessible_topology,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Snapshot) Reset() { @@ -3317,6 +3362,13 @@ func (x *Snapshot) GetGroupSnapshotId() string { return "" } +func (x *Snapshot) GetAccessibleTopology() []*Topology { + if x != nil { + return x.AccessibleTopology + } + return nil +} + type DeleteSnapshotRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // The ID of the snapshot to be deleted. @@ -7005,18 +7057,19 @@ const file_csi_proto_rawDesc = "" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x1e\n" + "\x1cGetPluginCapabilitiesRequest\"]\n" + "\x1dGetPluginCapabilitiesResponse\x12<\n" + - "\fcapabilities\x18\x01 \x03(\v2\x18.csi.v1.PluginCapabilityR\fcapabilities\"\x91\x04\n" + + "\fcapabilities\x18\x01 \x03(\v2\x18.csi.v1.PluginCapabilityR\fcapabilities\"\xbe\x04\n" + "\x10PluginCapability\x12<\n" + "\aservice\x18\x01 \x01(\v2 .csi.v1.PluginCapability.ServiceH\x00R\aservice\x12U\n" + - "\x10volume_expansion\x18\x02 \x01(\v2(.csi.v1.PluginCapability.VolumeExpansionH\x00R\x0fvolumeExpansion\x1a\xda\x01\n" + + "\x10volume_expansion\x18\x02 \x01(\v2(.csi.v1.PluginCapability.VolumeExpansionH\x00R\x0fvolumeExpansion\x1a\x87\x02\n" + "\aService\x129\n" + - "\x04type\x18\x01 \x01(\x0e2%.csi.v1.PluginCapability.Service.TypeR\x04type\"\x93\x01\n" + + "\x04type\x18\x01 \x01(\x0e2%.csi.v1.PluginCapability.Service.TypeR\x04type\"\xc0\x01\n" + "\x04Type\x12\v\n" + "\aUNKNOWN\x10\x00\x12\x16\n" + "\x12CONTROLLER_SERVICE\x10\x01\x12$\n" + " VOLUME_ACCESSIBILITY_CONSTRAINTS\x10\x02\x12\x1c\n" + "\x18GROUP_CONTROLLER_SERVICE\x10\x03\x12\"\n" + - "\x19SNAPSHOT_METADATA_SERVICE\x10\x04\x1a\x03\xa0B\x01\x1a\x82\x01\n" + + "\x19SNAPSHOT_METADATA_SERVICE\x10\x04\x1a\x03\xa0B\x01\x12+\n" + + "\"SNAPSHOT_ACCESSIBILITY_CONSTRAINTS\x10\x05\x1a\x03\xa0B\x01\x1a\x82\x01\n" + "\x0fVolumeExpansion\x12A\n" + "\x04type\x18\x01 \x01(\x0e2-.csi.v1.PluginCapability.VolumeExpansion.TypeR\x04type\",\n" + "\x04Type\x12\v\n" + @@ -7249,14 +7302,15 @@ const file_csi_proto_rawDesc = "" + "\x18SINGLE_NODE_MULTI_WRITER\x10\r\x1a\x03\xa0B\x01\x12\x11\n" + "\rMODIFY_VOLUME\x10\x0e\x12\x15\n" + "\fGET_SNAPSHOT\x10\x0f\x1a\x03\xa0B\x01B\x06\n" + - "\x04type\"\xea\x02\n" + + "\x04type\"\xcb\x03\n" + "\x15CreateSnapshotRequest\x12(\n" + "\x10source_volume_id\x18\x01 \x01(\tR\x0esourceVolumeId\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x12I\n" + "\asecrets\x18\x03 \x03(\v2*.csi.v1.CreateSnapshotRequest.SecretsEntryB\x03\x98B\x01R\asecrets\x12M\n" + "\n" + "parameters\x18\x04 \x03(\v2-.csi.v1.CreateSnapshotRequest.ParametersEntryR\n" + - "parameters\x1a:\n" + + "parameters\x12_\n" + + "\x1aaccessibility_requirements\x18\x05 \x01(\v2\x1b.csi.v1.TopologyRequirementB\x03\xa0B\x01R\x19accessibilityRequirements\x1a:\n" + "\fSecretsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a=\n" + @@ -7264,7 +7318,7 @@ const file_csi_proto_rawDesc = "" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"F\n" + "\x16CreateSnapshotResponse\x12,\n" + - "\bsnapshot\x18\x01 \x01(\v2\x10.csi.v1.SnapshotR\bsnapshot\"\x83\x02\n" + + "\bsnapshot\x18\x01 \x01(\v2\x10.csi.v1.SnapshotR\bsnapshot\"\xcb\x02\n" + "\bSnapshot\x12\x1d\n" + "\n" + "size_bytes\x18\x01 \x01(\x03R\tsizeBytes\x12\x1f\n" + @@ -7274,7 +7328,8 @@ const file_csi_proto_rawDesc = "" + "\rcreation_time\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\fcreationTime\x12 \n" + "\fready_to_use\x18\x05 \x01(\bR\n" + "readyToUse\x12*\n" + - "\x11group_snapshot_id\x18\x06 \x01(\tR\x0fgroupSnapshotId\"\xbf\x01\n" + + "\x11group_snapshot_id\x18\x06 \x01(\tR\x0fgroupSnapshotId\x12F\n" + + "\x13accessible_topology\x18\a \x03(\v2\x10.csi.v1.TopologyB\x03\xa0B\x01R\x12accessibleTopology\"\xbf\x01\n" + "\x15DeleteSnapshotRequest\x12\x1f\n" + "\vsnapshot_id\x18\x01 \x01(\tR\n" + "snapshotId\x12I\n" + @@ -7774,140 +7829,142 @@ var file_csi_proto_depIdxs = []int32{ 119, // 47: csi.v1.ControllerServiceCapability.rpc:type_name -> csi.v1.ControllerServiceCapability.RPC 120, // 48: csi.v1.CreateSnapshotRequest.secrets:type_name -> csi.v1.CreateSnapshotRequest.SecretsEntry 121, // 49: csi.v1.CreateSnapshotRequest.parameters:type_name -> csi.v1.CreateSnapshotRequest.ParametersEntry - 44, // 50: csi.v1.CreateSnapshotResponse.snapshot:type_name -> csi.v1.Snapshot - 144, // 51: csi.v1.Snapshot.creation_time:type_name -> google.protobuf.Timestamp - 122, // 52: csi.v1.DeleteSnapshotRequest.secrets:type_name -> csi.v1.DeleteSnapshotRequest.SecretsEntry - 123, // 53: csi.v1.ListSnapshotsRequest.secrets:type_name -> csi.v1.ListSnapshotsRequest.SecretsEntry - 124, // 54: csi.v1.ListSnapshotsResponse.entries:type_name -> csi.v1.ListSnapshotsResponse.Entry - 125, // 55: csi.v1.GetSnapshotRequest.secrets:type_name -> csi.v1.GetSnapshotRequest.SecretsEntry - 44, // 56: csi.v1.GetSnapshotResponse.snapshot:type_name -> csi.v1.Snapshot - 19, // 57: csi.v1.ControllerExpandVolumeRequest.capacity_range:type_name -> csi.v1.CapacityRange - 126, // 58: csi.v1.ControllerExpandVolumeRequest.secrets:type_name -> csi.v1.ControllerExpandVolumeRequest.SecretsEntry - 18, // 59: csi.v1.ControllerExpandVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability - 127, // 60: csi.v1.NodeStageVolumeRequest.publish_context:type_name -> csi.v1.NodeStageVolumeRequest.PublishContextEntry - 18, // 61: csi.v1.NodeStageVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability - 128, // 62: csi.v1.NodeStageVolumeRequest.secrets:type_name -> csi.v1.NodeStageVolumeRequest.SecretsEntry - 129, // 63: csi.v1.NodeStageVolumeRequest.volume_context:type_name -> csi.v1.NodeStageVolumeRequest.VolumeContextEntry - 130, // 64: csi.v1.NodePublishVolumeRequest.publish_context:type_name -> csi.v1.NodePublishVolumeRequest.PublishContextEntry - 18, // 65: csi.v1.NodePublishVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability - 131, // 66: csi.v1.NodePublishVolumeRequest.secrets:type_name -> csi.v1.NodePublishVolumeRequest.SecretsEntry - 132, // 67: csi.v1.NodePublishVolumeRequest.volume_context:type_name -> csi.v1.NodePublishVolumeRequest.VolumeContextEntry - 63, // 68: csi.v1.NodeGetVolumeStatsResponse.usage:type_name -> csi.v1.VolumeUsage - 64, // 69: csi.v1.NodeGetVolumeStatsResponse.volume_condition:type_name -> csi.v1.VolumeCondition - 5, // 70: csi.v1.VolumeUsage.unit:type_name -> csi.v1.VolumeUsage.Unit - 67, // 71: csi.v1.NodeGetCapabilitiesResponse.capabilities:type_name -> csi.v1.NodeServiceCapability - 133, // 72: csi.v1.NodeServiceCapability.rpc:type_name -> csi.v1.NodeServiceCapability.RPC - 22, // 73: csi.v1.NodeGetInfoResponse.accessible_topology:type_name -> csi.v1.Topology - 19, // 74: csi.v1.NodeExpandVolumeRequest.capacity_range:type_name -> csi.v1.CapacityRange - 18, // 75: csi.v1.NodeExpandVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability - 134, // 76: csi.v1.NodeExpandVolumeRequest.secrets:type_name -> csi.v1.NodeExpandVolumeRequest.SecretsEntry - 74, // 77: csi.v1.GroupControllerGetCapabilitiesResponse.capabilities:type_name -> csi.v1.GroupControllerServiceCapability - 135, // 78: csi.v1.GroupControllerServiceCapability.rpc:type_name -> csi.v1.GroupControllerServiceCapability.RPC - 136, // 79: csi.v1.CreateVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.CreateVolumeGroupSnapshotRequest.SecretsEntry - 137, // 80: csi.v1.CreateVolumeGroupSnapshotRequest.parameters:type_name -> csi.v1.CreateVolumeGroupSnapshotRequest.ParametersEntry - 77, // 81: csi.v1.CreateVolumeGroupSnapshotResponse.group_snapshot:type_name -> csi.v1.VolumeGroupSnapshot - 44, // 82: csi.v1.VolumeGroupSnapshot.snapshots:type_name -> csi.v1.Snapshot - 144, // 83: csi.v1.VolumeGroupSnapshot.creation_time:type_name -> google.protobuf.Timestamp - 138, // 84: csi.v1.DeleteVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.DeleteVolumeGroupSnapshotRequest.SecretsEntry - 139, // 85: csi.v1.GetVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.GetVolumeGroupSnapshotRequest.SecretsEntry - 77, // 86: csi.v1.GetVolumeGroupSnapshotResponse.group_snapshot:type_name -> csi.v1.VolumeGroupSnapshot - 140, // 87: csi.v1.GetMetadataAllocatedRequest.secrets:type_name -> csi.v1.GetMetadataAllocatedRequest.SecretsEntry - 0, // 88: csi.v1.GetMetadataAllocatedResponse.block_metadata_type:type_name -> csi.v1.BlockMetadataType - 82, // 89: csi.v1.GetMetadataAllocatedResponse.block_metadata:type_name -> csi.v1.BlockMetadata - 141, // 90: csi.v1.GetMetadataDeltaRequest.secrets:type_name -> csi.v1.GetMetadataDeltaRequest.SecretsEntry - 0, // 91: csi.v1.GetMetadataDeltaResponse.block_metadata_type:type_name -> csi.v1.BlockMetadataType - 82, // 92: csi.v1.GetMetadataDeltaResponse.block_metadata:type_name -> csi.v1.BlockMetadata - 1, // 93: csi.v1.PluginCapability.Service.type:type_name -> csi.v1.PluginCapability.Service.Type - 2, // 94: csi.v1.PluginCapability.VolumeExpansion.type:type_name -> csi.v1.PluginCapability.VolumeExpansion.Type - 3, // 95: csi.v1.VolumeCapability.AccessMode.mode:type_name -> csi.v1.VolumeCapability.AccessMode.Mode - 110, // 96: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.volume_context:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.VolumeContextEntry - 18, // 97: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.volume_capabilities:type_name -> csi.v1.VolumeCapability - 111, // 98: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.ParametersEntry - 112, // 99: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.mutable_parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.MutableParametersEntry - 64, // 100: csi.v1.ListVolumesResponse.VolumeStatus.volume_condition:type_name -> csi.v1.VolumeCondition - 20, // 101: csi.v1.ListVolumesResponse.Entry.volume:type_name -> csi.v1.Volume - 113, // 102: csi.v1.ListVolumesResponse.Entry.status:type_name -> csi.v1.ListVolumesResponse.VolumeStatus - 64, // 103: csi.v1.ControllerGetVolumeResponse.VolumeStatus.volume_condition:type_name -> csi.v1.VolumeCondition - 4, // 104: csi.v1.ControllerServiceCapability.RPC.type:type_name -> csi.v1.ControllerServiceCapability.RPC.Type - 44, // 105: csi.v1.ListSnapshotsResponse.Entry.snapshot:type_name -> csi.v1.Snapshot - 6, // 106: csi.v1.NodeServiceCapability.RPC.type:type_name -> csi.v1.NodeServiceCapability.RPC.Type - 7, // 107: csi.v1.GroupControllerServiceCapability.RPC.type:type_name -> csi.v1.GroupControllerServiceCapability.RPC.Type - 145, // 108: csi.v1.alpha_enum:extendee -> google.protobuf.EnumOptions - 146, // 109: csi.v1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions - 147, // 110: csi.v1.csi_secret:extendee -> google.protobuf.FieldOptions - 147, // 111: csi.v1.alpha_field:extendee -> google.protobuf.FieldOptions - 148, // 112: csi.v1.alpha_message:extendee -> google.protobuf.MessageOptions - 149, // 113: csi.v1.alpha_method:extendee -> google.protobuf.MethodOptions - 150, // 114: csi.v1.alpha_service:extendee -> google.protobuf.ServiceOptions - 8, // 115: csi.v1.Identity.GetPluginInfo:input_type -> csi.v1.GetPluginInfoRequest - 10, // 116: csi.v1.Identity.GetPluginCapabilities:input_type -> csi.v1.GetPluginCapabilitiesRequest - 13, // 117: csi.v1.Identity.Probe:input_type -> csi.v1.ProbeRequest - 15, // 118: csi.v1.Controller.CreateVolume:input_type -> csi.v1.CreateVolumeRequest - 23, // 119: csi.v1.Controller.DeleteVolume:input_type -> csi.v1.DeleteVolumeRequest - 25, // 120: csi.v1.Controller.ControllerPublishVolume:input_type -> csi.v1.ControllerPublishVolumeRequest - 27, // 121: csi.v1.Controller.ControllerUnpublishVolume:input_type -> csi.v1.ControllerUnpublishVolumeRequest - 29, // 122: csi.v1.Controller.ValidateVolumeCapabilities:input_type -> csi.v1.ValidateVolumeCapabilitiesRequest - 31, // 123: csi.v1.Controller.ListVolumes:input_type -> csi.v1.ListVolumesRequest - 37, // 124: csi.v1.Controller.GetCapacity:input_type -> csi.v1.GetCapacityRequest - 39, // 125: csi.v1.Controller.ControllerGetCapabilities:input_type -> csi.v1.ControllerGetCapabilitiesRequest - 42, // 126: csi.v1.Controller.CreateSnapshot:input_type -> csi.v1.CreateSnapshotRequest - 45, // 127: csi.v1.Controller.DeleteSnapshot:input_type -> csi.v1.DeleteSnapshotRequest - 47, // 128: csi.v1.Controller.ListSnapshots:input_type -> csi.v1.ListSnapshotsRequest - 49, // 129: csi.v1.Controller.GetSnapshot:input_type -> csi.v1.GetSnapshotRequest - 51, // 130: csi.v1.Controller.ControllerExpandVolume:input_type -> csi.v1.ControllerExpandVolumeRequest - 33, // 131: csi.v1.Controller.ControllerGetVolume:input_type -> csi.v1.ControllerGetVolumeRequest - 35, // 132: csi.v1.Controller.ControllerModifyVolume:input_type -> csi.v1.ControllerModifyVolumeRequest - 72, // 133: csi.v1.GroupController.GroupControllerGetCapabilities:input_type -> csi.v1.GroupControllerGetCapabilitiesRequest - 75, // 134: csi.v1.GroupController.CreateVolumeGroupSnapshot:input_type -> csi.v1.CreateVolumeGroupSnapshotRequest - 78, // 135: csi.v1.GroupController.DeleteVolumeGroupSnapshot:input_type -> csi.v1.DeleteVolumeGroupSnapshotRequest - 80, // 136: csi.v1.GroupController.GetVolumeGroupSnapshot:input_type -> csi.v1.GetVolumeGroupSnapshotRequest - 83, // 137: csi.v1.SnapshotMetadata.GetMetadataAllocated:input_type -> csi.v1.GetMetadataAllocatedRequest - 85, // 138: csi.v1.SnapshotMetadata.GetMetadataDelta:input_type -> csi.v1.GetMetadataDeltaRequest - 53, // 139: csi.v1.Node.NodeStageVolume:input_type -> csi.v1.NodeStageVolumeRequest - 55, // 140: csi.v1.Node.NodeUnstageVolume:input_type -> csi.v1.NodeUnstageVolumeRequest - 57, // 141: csi.v1.Node.NodePublishVolume:input_type -> csi.v1.NodePublishVolumeRequest - 59, // 142: csi.v1.Node.NodeUnpublishVolume:input_type -> csi.v1.NodeUnpublishVolumeRequest - 61, // 143: csi.v1.Node.NodeGetVolumeStats:input_type -> csi.v1.NodeGetVolumeStatsRequest - 70, // 144: csi.v1.Node.NodeExpandVolume:input_type -> csi.v1.NodeExpandVolumeRequest - 65, // 145: csi.v1.Node.NodeGetCapabilities:input_type -> csi.v1.NodeGetCapabilitiesRequest - 68, // 146: csi.v1.Node.NodeGetInfo:input_type -> csi.v1.NodeGetInfoRequest - 9, // 147: csi.v1.Identity.GetPluginInfo:output_type -> csi.v1.GetPluginInfoResponse - 11, // 148: csi.v1.Identity.GetPluginCapabilities:output_type -> csi.v1.GetPluginCapabilitiesResponse - 14, // 149: csi.v1.Identity.Probe:output_type -> csi.v1.ProbeResponse - 17, // 150: csi.v1.Controller.CreateVolume:output_type -> csi.v1.CreateVolumeResponse - 24, // 151: csi.v1.Controller.DeleteVolume:output_type -> csi.v1.DeleteVolumeResponse - 26, // 152: csi.v1.Controller.ControllerPublishVolume:output_type -> csi.v1.ControllerPublishVolumeResponse - 28, // 153: csi.v1.Controller.ControllerUnpublishVolume:output_type -> csi.v1.ControllerUnpublishVolumeResponse - 30, // 154: csi.v1.Controller.ValidateVolumeCapabilities:output_type -> csi.v1.ValidateVolumeCapabilitiesResponse - 32, // 155: csi.v1.Controller.ListVolumes:output_type -> csi.v1.ListVolumesResponse - 38, // 156: csi.v1.Controller.GetCapacity:output_type -> csi.v1.GetCapacityResponse - 40, // 157: csi.v1.Controller.ControllerGetCapabilities:output_type -> csi.v1.ControllerGetCapabilitiesResponse - 43, // 158: csi.v1.Controller.CreateSnapshot:output_type -> csi.v1.CreateSnapshotResponse - 46, // 159: csi.v1.Controller.DeleteSnapshot:output_type -> csi.v1.DeleteSnapshotResponse - 48, // 160: csi.v1.Controller.ListSnapshots:output_type -> csi.v1.ListSnapshotsResponse - 50, // 161: csi.v1.Controller.GetSnapshot:output_type -> csi.v1.GetSnapshotResponse - 52, // 162: csi.v1.Controller.ControllerExpandVolume:output_type -> csi.v1.ControllerExpandVolumeResponse - 34, // 163: csi.v1.Controller.ControllerGetVolume:output_type -> csi.v1.ControllerGetVolumeResponse - 36, // 164: csi.v1.Controller.ControllerModifyVolume:output_type -> csi.v1.ControllerModifyVolumeResponse - 73, // 165: csi.v1.GroupController.GroupControllerGetCapabilities:output_type -> csi.v1.GroupControllerGetCapabilitiesResponse - 76, // 166: csi.v1.GroupController.CreateVolumeGroupSnapshot:output_type -> csi.v1.CreateVolumeGroupSnapshotResponse - 79, // 167: csi.v1.GroupController.DeleteVolumeGroupSnapshot:output_type -> csi.v1.DeleteVolumeGroupSnapshotResponse - 81, // 168: csi.v1.GroupController.GetVolumeGroupSnapshot:output_type -> csi.v1.GetVolumeGroupSnapshotResponse - 84, // 169: csi.v1.SnapshotMetadata.GetMetadataAllocated:output_type -> csi.v1.GetMetadataAllocatedResponse - 86, // 170: csi.v1.SnapshotMetadata.GetMetadataDelta:output_type -> csi.v1.GetMetadataDeltaResponse - 54, // 171: csi.v1.Node.NodeStageVolume:output_type -> csi.v1.NodeStageVolumeResponse - 56, // 172: csi.v1.Node.NodeUnstageVolume:output_type -> csi.v1.NodeUnstageVolumeResponse - 58, // 173: csi.v1.Node.NodePublishVolume:output_type -> csi.v1.NodePublishVolumeResponse - 60, // 174: csi.v1.Node.NodeUnpublishVolume:output_type -> csi.v1.NodeUnpublishVolumeResponse - 62, // 175: csi.v1.Node.NodeGetVolumeStats:output_type -> csi.v1.NodeGetVolumeStatsResponse - 71, // 176: csi.v1.Node.NodeExpandVolume:output_type -> csi.v1.NodeExpandVolumeResponse - 66, // 177: csi.v1.Node.NodeGetCapabilities:output_type -> csi.v1.NodeGetCapabilitiesResponse - 69, // 178: csi.v1.Node.NodeGetInfo:output_type -> csi.v1.NodeGetInfoResponse - 147, // [147:179] is the sub-list for method output_type - 115, // [115:147] is the sub-list for method input_type - 115, // [115:115] is the sub-list for extension type_name - 108, // [108:115] is the sub-list for extension extendee - 0, // [0:108] is the sub-list for field type_name + 21, // 50: csi.v1.CreateSnapshotRequest.accessibility_requirements:type_name -> csi.v1.TopologyRequirement + 44, // 51: csi.v1.CreateSnapshotResponse.snapshot:type_name -> csi.v1.Snapshot + 144, // 52: csi.v1.Snapshot.creation_time:type_name -> google.protobuf.Timestamp + 22, // 53: csi.v1.Snapshot.accessible_topology:type_name -> csi.v1.Topology + 122, // 54: csi.v1.DeleteSnapshotRequest.secrets:type_name -> csi.v1.DeleteSnapshotRequest.SecretsEntry + 123, // 55: csi.v1.ListSnapshotsRequest.secrets:type_name -> csi.v1.ListSnapshotsRequest.SecretsEntry + 124, // 56: csi.v1.ListSnapshotsResponse.entries:type_name -> csi.v1.ListSnapshotsResponse.Entry + 125, // 57: csi.v1.GetSnapshotRequest.secrets:type_name -> csi.v1.GetSnapshotRequest.SecretsEntry + 44, // 58: csi.v1.GetSnapshotResponse.snapshot:type_name -> csi.v1.Snapshot + 19, // 59: csi.v1.ControllerExpandVolumeRequest.capacity_range:type_name -> csi.v1.CapacityRange + 126, // 60: csi.v1.ControllerExpandVolumeRequest.secrets:type_name -> csi.v1.ControllerExpandVolumeRequest.SecretsEntry + 18, // 61: csi.v1.ControllerExpandVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability + 127, // 62: csi.v1.NodeStageVolumeRequest.publish_context:type_name -> csi.v1.NodeStageVolumeRequest.PublishContextEntry + 18, // 63: csi.v1.NodeStageVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability + 128, // 64: csi.v1.NodeStageVolumeRequest.secrets:type_name -> csi.v1.NodeStageVolumeRequest.SecretsEntry + 129, // 65: csi.v1.NodeStageVolumeRequest.volume_context:type_name -> csi.v1.NodeStageVolumeRequest.VolumeContextEntry + 130, // 66: csi.v1.NodePublishVolumeRequest.publish_context:type_name -> csi.v1.NodePublishVolumeRequest.PublishContextEntry + 18, // 67: csi.v1.NodePublishVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability + 131, // 68: csi.v1.NodePublishVolumeRequest.secrets:type_name -> csi.v1.NodePublishVolumeRequest.SecretsEntry + 132, // 69: csi.v1.NodePublishVolumeRequest.volume_context:type_name -> csi.v1.NodePublishVolumeRequest.VolumeContextEntry + 63, // 70: csi.v1.NodeGetVolumeStatsResponse.usage:type_name -> csi.v1.VolumeUsage + 64, // 71: csi.v1.NodeGetVolumeStatsResponse.volume_condition:type_name -> csi.v1.VolumeCondition + 5, // 72: csi.v1.VolumeUsage.unit:type_name -> csi.v1.VolumeUsage.Unit + 67, // 73: csi.v1.NodeGetCapabilitiesResponse.capabilities:type_name -> csi.v1.NodeServiceCapability + 133, // 74: csi.v1.NodeServiceCapability.rpc:type_name -> csi.v1.NodeServiceCapability.RPC + 22, // 75: csi.v1.NodeGetInfoResponse.accessible_topology:type_name -> csi.v1.Topology + 19, // 76: csi.v1.NodeExpandVolumeRequest.capacity_range:type_name -> csi.v1.CapacityRange + 18, // 77: csi.v1.NodeExpandVolumeRequest.volume_capability:type_name -> csi.v1.VolumeCapability + 134, // 78: csi.v1.NodeExpandVolumeRequest.secrets:type_name -> csi.v1.NodeExpandVolumeRequest.SecretsEntry + 74, // 79: csi.v1.GroupControllerGetCapabilitiesResponse.capabilities:type_name -> csi.v1.GroupControllerServiceCapability + 135, // 80: csi.v1.GroupControllerServiceCapability.rpc:type_name -> csi.v1.GroupControllerServiceCapability.RPC + 136, // 81: csi.v1.CreateVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.CreateVolumeGroupSnapshotRequest.SecretsEntry + 137, // 82: csi.v1.CreateVolumeGroupSnapshotRequest.parameters:type_name -> csi.v1.CreateVolumeGroupSnapshotRequest.ParametersEntry + 77, // 83: csi.v1.CreateVolumeGroupSnapshotResponse.group_snapshot:type_name -> csi.v1.VolumeGroupSnapshot + 44, // 84: csi.v1.VolumeGroupSnapshot.snapshots:type_name -> csi.v1.Snapshot + 144, // 85: csi.v1.VolumeGroupSnapshot.creation_time:type_name -> google.protobuf.Timestamp + 138, // 86: csi.v1.DeleteVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.DeleteVolumeGroupSnapshotRequest.SecretsEntry + 139, // 87: csi.v1.GetVolumeGroupSnapshotRequest.secrets:type_name -> csi.v1.GetVolumeGroupSnapshotRequest.SecretsEntry + 77, // 88: csi.v1.GetVolumeGroupSnapshotResponse.group_snapshot:type_name -> csi.v1.VolumeGroupSnapshot + 140, // 89: csi.v1.GetMetadataAllocatedRequest.secrets:type_name -> csi.v1.GetMetadataAllocatedRequest.SecretsEntry + 0, // 90: csi.v1.GetMetadataAllocatedResponse.block_metadata_type:type_name -> csi.v1.BlockMetadataType + 82, // 91: csi.v1.GetMetadataAllocatedResponse.block_metadata:type_name -> csi.v1.BlockMetadata + 141, // 92: csi.v1.GetMetadataDeltaRequest.secrets:type_name -> csi.v1.GetMetadataDeltaRequest.SecretsEntry + 0, // 93: csi.v1.GetMetadataDeltaResponse.block_metadata_type:type_name -> csi.v1.BlockMetadataType + 82, // 94: csi.v1.GetMetadataDeltaResponse.block_metadata:type_name -> csi.v1.BlockMetadata + 1, // 95: csi.v1.PluginCapability.Service.type:type_name -> csi.v1.PluginCapability.Service.Type + 2, // 96: csi.v1.PluginCapability.VolumeExpansion.type:type_name -> csi.v1.PluginCapability.VolumeExpansion.Type + 3, // 97: csi.v1.VolumeCapability.AccessMode.mode:type_name -> csi.v1.VolumeCapability.AccessMode.Mode + 110, // 98: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.volume_context:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.VolumeContextEntry + 18, // 99: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.volume_capabilities:type_name -> csi.v1.VolumeCapability + 111, // 100: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.ParametersEntry + 112, // 101: csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.mutable_parameters:type_name -> csi.v1.ValidateVolumeCapabilitiesResponse.Confirmed.MutableParametersEntry + 64, // 102: csi.v1.ListVolumesResponse.VolumeStatus.volume_condition:type_name -> csi.v1.VolumeCondition + 20, // 103: csi.v1.ListVolumesResponse.Entry.volume:type_name -> csi.v1.Volume + 113, // 104: csi.v1.ListVolumesResponse.Entry.status:type_name -> csi.v1.ListVolumesResponse.VolumeStatus + 64, // 105: csi.v1.ControllerGetVolumeResponse.VolumeStatus.volume_condition:type_name -> csi.v1.VolumeCondition + 4, // 106: csi.v1.ControllerServiceCapability.RPC.type:type_name -> csi.v1.ControllerServiceCapability.RPC.Type + 44, // 107: csi.v1.ListSnapshotsResponse.Entry.snapshot:type_name -> csi.v1.Snapshot + 6, // 108: csi.v1.NodeServiceCapability.RPC.type:type_name -> csi.v1.NodeServiceCapability.RPC.Type + 7, // 109: csi.v1.GroupControllerServiceCapability.RPC.type:type_name -> csi.v1.GroupControllerServiceCapability.RPC.Type + 145, // 110: csi.v1.alpha_enum:extendee -> google.protobuf.EnumOptions + 146, // 111: csi.v1.alpha_enum_value:extendee -> google.protobuf.EnumValueOptions + 147, // 112: csi.v1.csi_secret:extendee -> google.protobuf.FieldOptions + 147, // 113: csi.v1.alpha_field:extendee -> google.protobuf.FieldOptions + 148, // 114: csi.v1.alpha_message:extendee -> google.protobuf.MessageOptions + 149, // 115: csi.v1.alpha_method:extendee -> google.protobuf.MethodOptions + 150, // 116: csi.v1.alpha_service:extendee -> google.protobuf.ServiceOptions + 8, // 117: csi.v1.Identity.GetPluginInfo:input_type -> csi.v1.GetPluginInfoRequest + 10, // 118: csi.v1.Identity.GetPluginCapabilities:input_type -> csi.v1.GetPluginCapabilitiesRequest + 13, // 119: csi.v1.Identity.Probe:input_type -> csi.v1.ProbeRequest + 15, // 120: csi.v1.Controller.CreateVolume:input_type -> csi.v1.CreateVolumeRequest + 23, // 121: csi.v1.Controller.DeleteVolume:input_type -> csi.v1.DeleteVolumeRequest + 25, // 122: csi.v1.Controller.ControllerPublishVolume:input_type -> csi.v1.ControllerPublishVolumeRequest + 27, // 123: csi.v1.Controller.ControllerUnpublishVolume:input_type -> csi.v1.ControllerUnpublishVolumeRequest + 29, // 124: csi.v1.Controller.ValidateVolumeCapabilities:input_type -> csi.v1.ValidateVolumeCapabilitiesRequest + 31, // 125: csi.v1.Controller.ListVolumes:input_type -> csi.v1.ListVolumesRequest + 37, // 126: csi.v1.Controller.GetCapacity:input_type -> csi.v1.GetCapacityRequest + 39, // 127: csi.v1.Controller.ControllerGetCapabilities:input_type -> csi.v1.ControllerGetCapabilitiesRequest + 42, // 128: csi.v1.Controller.CreateSnapshot:input_type -> csi.v1.CreateSnapshotRequest + 45, // 129: csi.v1.Controller.DeleteSnapshot:input_type -> csi.v1.DeleteSnapshotRequest + 47, // 130: csi.v1.Controller.ListSnapshots:input_type -> csi.v1.ListSnapshotsRequest + 49, // 131: csi.v1.Controller.GetSnapshot:input_type -> csi.v1.GetSnapshotRequest + 51, // 132: csi.v1.Controller.ControllerExpandVolume:input_type -> csi.v1.ControllerExpandVolumeRequest + 33, // 133: csi.v1.Controller.ControllerGetVolume:input_type -> csi.v1.ControllerGetVolumeRequest + 35, // 134: csi.v1.Controller.ControllerModifyVolume:input_type -> csi.v1.ControllerModifyVolumeRequest + 72, // 135: csi.v1.GroupController.GroupControllerGetCapabilities:input_type -> csi.v1.GroupControllerGetCapabilitiesRequest + 75, // 136: csi.v1.GroupController.CreateVolumeGroupSnapshot:input_type -> csi.v1.CreateVolumeGroupSnapshotRequest + 78, // 137: csi.v1.GroupController.DeleteVolumeGroupSnapshot:input_type -> csi.v1.DeleteVolumeGroupSnapshotRequest + 80, // 138: csi.v1.GroupController.GetVolumeGroupSnapshot:input_type -> csi.v1.GetVolumeGroupSnapshotRequest + 83, // 139: csi.v1.SnapshotMetadata.GetMetadataAllocated:input_type -> csi.v1.GetMetadataAllocatedRequest + 85, // 140: csi.v1.SnapshotMetadata.GetMetadataDelta:input_type -> csi.v1.GetMetadataDeltaRequest + 53, // 141: csi.v1.Node.NodeStageVolume:input_type -> csi.v1.NodeStageVolumeRequest + 55, // 142: csi.v1.Node.NodeUnstageVolume:input_type -> csi.v1.NodeUnstageVolumeRequest + 57, // 143: csi.v1.Node.NodePublishVolume:input_type -> csi.v1.NodePublishVolumeRequest + 59, // 144: csi.v1.Node.NodeUnpublishVolume:input_type -> csi.v1.NodeUnpublishVolumeRequest + 61, // 145: csi.v1.Node.NodeGetVolumeStats:input_type -> csi.v1.NodeGetVolumeStatsRequest + 70, // 146: csi.v1.Node.NodeExpandVolume:input_type -> csi.v1.NodeExpandVolumeRequest + 65, // 147: csi.v1.Node.NodeGetCapabilities:input_type -> csi.v1.NodeGetCapabilitiesRequest + 68, // 148: csi.v1.Node.NodeGetInfo:input_type -> csi.v1.NodeGetInfoRequest + 9, // 149: csi.v1.Identity.GetPluginInfo:output_type -> csi.v1.GetPluginInfoResponse + 11, // 150: csi.v1.Identity.GetPluginCapabilities:output_type -> csi.v1.GetPluginCapabilitiesResponse + 14, // 151: csi.v1.Identity.Probe:output_type -> csi.v1.ProbeResponse + 17, // 152: csi.v1.Controller.CreateVolume:output_type -> csi.v1.CreateVolumeResponse + 24, // 153: csi.v1.Controller.DeleteVolume:output_type -> csi.v1.DeleteVolumeResponse + 26, // 154: csi.v1.Controller.ControllerPublishVolume:output_type -> csi.v1.ControllerPublishVolumeResponse + 28, // 155: csi.v1.Controller.ControllerUnpublishVolume:output_type -> csi.v1.ControllerUnpublishVolumeResponse + 30, // 156: csi.v1.Controller.ValidateVolumeCapabilities:output_type -> csi.v1.ValidateVolumeCapabilitiesResponse + 32, // 157: csi.v1.Controller.ListVolumes:output_type -> csi.v1.ListVolumesResponse + 38, // 158: csi.v1.Controller.GetCapacity:output_type -> csi.v1.GetCapacityResponse + 40, // 159: csi.v1.Controller.ControllerGetCapabilities:output_type -> csi.v1.ControllerGetCapabilitiesResponse + 43, // 160: csi.v1.Controller.CreateSnapshot:output_type -> csi.v1.CreateSnapshotResponse + 46, // 161: csi.v1.Controller.DeleteSnapshot:output_type -> csi.v1.DeleteSnapshotResponse + 48, // 162: csi.v1.Controller.ListSnapshots:output_type -> csi.v1.ListSnapshotsResponse + 50, // 163: csi.v1.Controller.GetSnapshot:output_type -> csi.v1.GetSnapshotResponse + 52, // 164: csi.v1.Controller.ControllerExpandVolume:output_type -> csi.v1.ControllerExpandVolumeResponse + 34, // 165: csi.v1.Controller.ControllerGetVolume:output_type -> csi.v1.ControllerGetVolumeResponse + 36, // 166: csi.v1.Controller.ControllerModifyVolume:output_type -> csi.v1.ControllerModifyVolumeResponse + 73, // 167: csi.v1.GroupController.GroupControllerGetCapabilities:output_type -> csi.v1.GroupControllerGetCapabilitiesResponse + 76, // 168: csi.v1.GroupController.CreateVolumeGroupSnapshot:output_type -> csi.v1.CreateVolumeGroupSnapshotResponse + 79, // 169: csi.v1.GroupController.DeleteVolumeGroupSnapshot:output_type -> csi.v1.DeleteVolumeGroupSnapshotResponse + 81, // 170: csi.v1.GroupController.GetVolumeGroupSnapshot:output_type -> csi.v1.GetVolumeGroupSnapshotResponse + 84, // 171: csi.v1.SnapshotMetadata.GetMetadataAllocated:output_type -> csi.v1.GetMetadataAllocatedResponse + 86, // 172: csi.v1.SnapshotMetadata.GetMetadataDelta:output_type -> csi.v1.GetMetadataDeltaResponse + 54, // 173: csi.v1.Node.NodeStageVolume:output_type -> csi.v1.NodeStageVolumeResponse + 56, // 174: csi.v1.Node.NodeUnstageVolume:output_type -> csi.v1.NodeUnstageVolumeResponse + 58, // 175: csi.v1.Node.NodePublishVolume:output_type -> csi.v1.NodePublishVolumeResponse + 60, // 176: csi.v1.Node.NodeUnpublishVolume:output_type -> csi.v1.NodeUnpublishVolumeResponse + 62, // 177: csi.v1.Node.NodeGetVolumeStats:output_type -> csi.v1.NodeGetVolumeStatsResponse + 71, // 178: csi.v1.Node.NodeExpandVolume:output_type -> csi.v1.NodeExpandVolumeResponse + 66, // 179: csi.v1.Node.NodeGetCapabilities:output_type -> csi.v1.NodeGetCapabilitiesResponse + 69, // 180: csi.v1.Node.NodeGetInfo:output_type -> csi.v1.NodeGetInfoResponse + 149, // [149:181] is the sub-list for method output_type + 117, // [117:149] is the sub-list for method input_type + 117, // [117:117] is the sub-list for extension type_name + 110, // [110:117] is the sub-list for extension extendee + 0, // [0:110] is the sub-list for field type_name } func init() { file_csi_proto_init() } diff --git a/spec.md b/spec.md index a8cdd08e..8ad4ac75 100644 --- a/spec.md +++ b/spec.md @@ -647,6 +647,16 @@ message PluginCapability { // The presence of this capability determines whether the CO will // attempt to invoke the OPTIONAL SnapshotMetadata service RPCs. SNAPSHOT_METADATA_SERVICE = 4 [(alpha_enum_value) = true]; + + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS indicates that the snapshots + // for this plugin MAY NOT be equally usable from all + // topologies in the cluster. A snapshot is usable from a location + // if volumes created from that snapshot are guaranteed to be + // accessible from that location. The CO MUST use the topology + // information returned in the CreateSnapshotResponse to ensure + // that a desired volume can be provisioned from a given snapshot + // when scheduling workloads. + SNAPSHOT_ACCESSIBILITY_CONSTRAINTS = 5 [(alpha_enum_value) = true]; } Type type = 1; } @@ -1898,7 +1908,7 @@ A Controller Plugin MUST implement this RPC call if it has `CREATE_DELETE_SNAPSH This RPC will be called by the CO to create a new snapshot from a source volume on behalf of a user. This operation MUST be idempotent. -If a snapshot corresponding to the specified snapshot `name` is successfully cut and ready to use (meaning it MAY be specified as a `volume_content_source` in a `CreateVolumeRequest`), the Plugin MUST reply `0 OK` with the corresponding `CreateSnapshotResponse`. +If a snapshot corresponding to the specified snapshot `name` is successfully cut and ready to use (meaning it MAY be specified as a `volume_content_source` in a `CreateVolumeRequest`), and is usable from `accessibility_requirements`, the Plugin MUST reply `0 OK` with the corresponding `CreateSnapshotResponse`. If an error occurs before a snapshot is cut, `CreateSnapshot` SHOULD return a corresponding gRPC error code that reflects the error condition. @@ -1965,6 +1975,21 @@ message CreateSnapshotRequest { // - Specify primary or secondary for replication systems that // support snapshotting only on primary. map parameters = 4; + + // Specifies where (regions, zones, racks, etc.) the provisioned + // snapshot MUST be usable from. A snapshot is usable from a location + // if volumes created from that snapshot are guaranteed to be + // accessible from that location. + // An SP SHALL advertise the requirements for topological + // accessibility information in documentation. COs SHALL only specify + // topological accessibility information supported by the SP. + // This field is OPTIONAL. + // This field SHALL NOT be specified unless the SP has the + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS plugin capability. + // If this field is not specified and the SP has the + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS plugin capability, the SP MAY + // choose where the provisioned snapshot is usable from. + TopologyRequirement accessibility_requirements = 5 [(alpha_field) = true]; } message CreateSnapshotResponse { @@ -2024,6 +2049,22 @@ message Snapshot { // If this message is inside a VolumeGroupSnapshot message, the value // MUST be the same as the group_snapshot_id in that message. string group_snapshot_id = 6; + + // Specifies where (regions, zones, racks, etc.) the provisioned + // snapshot is usable from. A snapshot is usable from a location if + // volumes created from that snapshot are guaranteed to be accessible + // from that location. + // A plugin that returns this field MUST also set the + // SNAPSHOT_ACCESSIBILITY_CONSTRAINTS plugin capability. + // An SP MAY specify multiple topologies to indicate the snapshot is + // usable from multiple locations. + // COs MAY use this information to ensure that a desired volume can + // be provisioned from a given snapshot when scheduling workloads. + // This field is OPTIONAL. If it is not specified, the CO MAY assume + // the snapshot is equally usable from all topologies in the + // cluster and MAY provision volumes referencing the snapshot as a + // source without topology constraints. + repeated Topology accessible_topology = 7 [(alpha_field) = true]; } ``` @@ -2037,7 +2078,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t |-----------|-----------|-------------|-------------------| | Snapshot already exists but is incompatible | 6 ALREADY_EXISTS | Indicates that a snapshot corresponding to the specified snapshot `name` already exists but is incompatible with the specified `volume_id`. | Caller MUST fix the arguments or use a different `name` before retrying. | | Operation pending for snapshot | 10 ABORTED | Indicates that there is already an operation pending for the specified snapshot. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per snapshot at a given time. However, in some circumstances, the CO MAY lose state (for example when the CO crashes and restarts), and MAY issue multiple calls simultaneously for the same snapshot. The Plugin, SHOULD handle this as gracefully as possible, and MAY return this error code to reject secondary calls. | Caller SHOULD ensure that there are no other calls pending for the specified snapshot, and then retry with exponential back off. | -| Not enough space to create snapshot | 8 RESOURCE_EXHAUSTED | There is not enough space on the storage system to handle the create snapshot request. | Caller SHOULD fail this request. Future calls to CreateSnapshot MAY succeed if space is freed up. | +| Not enough resources to create snapshot | 8 RESOURCE_EXHAUSTED | There is not enough space on the storage system to handle the create snapshot request, or the `accessibility_requirements` field is valid but a snapshot cannot be created with the specified topology constraints. More human-readable information MAY be provided in the gRPC `status.message` field. | Caller SHOULD fail this request. Future calls to CreateSnapshot MAY succeed once the limiting condition (e.g. space or topology/quota constraints in the requested location) is addressed. | #### `DeleteSnapshot`