diff --git a/csi.proto b/csi.proto index 264dd035..d7eb2888 100644 --- a/csi.proto +++ b/csi.proto @@ -44,6 +44,12 @@ service Controller { } service Node { + rpc NodeStageVolume (NodeStageVolumeRequest) + returns (NodeStageVolumeResponse) {} + + rpc NodeUnstageVolume (NodeUnstageVolumeRequest) + returns (NodeUnstageVolumeResponse) {} + rpc NodePublishVolume (NodePublishVolumeRequest) returns (NodePublishVolumeResponse) {} @@ -371,7 +377,8 @@ message ControllerPublishVolumeRequest { message ControllerPublishVolumeResponse { // The SP specific information that will be passed to the Plugin in - // the subsequent `NodePublishVolume` call for the given volume. + // the subsequent `NodeStageVolume` or `NodePublishVolume` calls + // for the given volume. // This information is opaque to the CO. This field is OPTIONAL. map publish_info = 1; } @@ -544,6 +551,82 @@ message ControllerServiceCapability { } //////// //////// +message NodeStageVolumeRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; + + // The ID of the volume to publish. This field is REQUIRED. + string volume_id = 2; + + // The CO SHALL set this field to the value returned by + // `ControllerPublishVolume` if the corresponding Controller Plugin + // has `PUBLISH_UNPUBLISH_VOLUME` controller capability, and SHALL be + // left unset if the corresponding Controller Plugin does not have + // this capability. This is an OPTIONAL field. + map publish_info = 3; + + // The path to which the volume will be published. It MUST be an + // absolute path in the root filesystem of the process serving this + // request. The CO SHALL ensure that there is only one + // staging_target_path per volume. + // This is a REQUIRED field. + string staging_target_path = 4; + + // The capability of the volume the CO expects the volume to have. + // This is a REQUIRED field. + VolumeCapability volume_capability = 5; + + // Credentials used by Node plugin to authenticate/authorize node + // stage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + map node_stage_credentials = 6; + + // Attributes of the volume to publish. This field is OPTIONAL and + // MUST match the attributes of the VolumeInfo identified by + // `volume_id`. + map volume_attributes = 7; +} + +message NodeStageVolumeResponse {} +//////// +//////// +message NodeUnstageVolumeRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; + + // The ID of the volume. This field is REQUIRED. + string volume_id = 2; + + // The path at which the volume was published. It MUST be an absolute + // path in the root filesystem of the process serving this request. + // This is a REQUIRED field. + string staging_target_path = 3; + + // Credentials used by Node plugin to authenticate/authorize node + // unstage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + map node_unstage_credentials = 4; +} + +message NodeUnstageVolumeResponse {} +//////// +//////// message NodePublishVolumeRequest { // The API version assumed by the CO. This is a REQUIRED field. Version version = 1; @@ -558,21 +641,29 @@ message NodePublishVolumeRequest { // this capability. This is an OPTIONAL field. map publish_info = 3; + // The path to which the device was mounted by `NodeStageVolume`. + // It MUST be an absolute path in the root filesystem of the process + // serving this request. + // It MUST be set if the Node Plugin implements the + // `STAGE_UNSTAGE_VOLUME` node capability. + // This is an OPTIONAL field. + string staging_target_path = 4; + // The path to which the volume will be published. It MUST be an // absolute path in the root filesystem of the process serving this // request. The CO SHALL ensure uniqueness of target_path per volume. // The CO SHALL ensure that the path exists, and that the process // serving the request has `read` and `write` permissions to the path. // This is a REQUIRED field. - string target_path = 4; + string target_path = 5; // The capability of the volume the CO expects the volume to have. // This is a REQUIRED field. - VolumeCapability volume_capability = 5; + VolumeCapability volume_capability = 6; // Whether to publish the volume in readonly mode. This field is // REQUIRED. - bool readonly = 6; + bool readonly = 7; // Credentials used by Node plugin to authenticate/authorize node // publish request. @@ -585,12 +676,13 @@ message NodePublishVolumeRequest { // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - map node_publish_credentials = 7; + map node_publish_credentials = 8; + // Attributes of the volume to publish. This field is OPTIONAL and // MUST match the attributes of the Volume identified by // `volume_id`. - map volume_attributes = 8; + map volume_attributes = 9; } message NodePublishVolumeResponse {} @@ -662,6 +754,7 @@ message NodeServiceCapability { message RPC { enum Type { UNKNOWN = 0; + STAGE_UNSTAGE_VOLUME = 1; } Type type = 1; diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index ee8db9e6..289c22c6 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -38,6 +38,10 @@ It has these top-level messages: ControllerGetCapabilitiesRequest ControllerGetCapabilitiesResponse ControllerServiceCapability + NodeStageVolumeRequest + NodeStageVolumeResponse + NodeUnstageVolumeRequest + NodeUnstageVolumeResponse NodePublishVolumeRequest NodePublishVolumeResponse NodeUnpublishVolumeRequest @@ -182,21 +186,24 @@ func (ControllerServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { type NodeServiceCapability_RPC_Type int32 const ( - NodeServiceCapability_RPC_UNKNOWN NodeServiceCapability_RPC_Type = 0 + NodeServiceCapability_RPC_UNKNOWN NodeServiceCapability_RPC_Type = 0 + NodeServiceCapability_RPC_STAGE_UNSTAGE_VOLUME NodeServiceCapability_RPC_Type = 1 ) var NodeServiceCapability_RPC_Type_name = map[int32]string{ 0: "UNKNOWN", + 1: "STAGE_UNSTAGE_VOLUME", } var NodeServiceCapability_RPC_Type_value = map[string]int32{ - "UNKNOWN": 0, + "UNKNOWN": 0, + "STAGE_UNSTAGE_VOLUME": 1, } func (x NodeServiceCapability_RPC_Type) String() string { return proto.EnumName(NodeServiceCapability_RPC_Type_name, int32(x)) } func (NodeServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 0, 0} + return fileDescriptor0, []int{44, 0, 0} } // ////// @@ -1011,7 +1018,8 @@ func (m *ControllerPublishVolumeRequest) GetVolumeAttributes() map[string]string type ControllerPublishVolumeResponse struct { // The SP specific information that will be passed to the Plugin in - // the subsequent `NodePublishVolume` call for the given volume. + // the subsequent `NodeStageVolume` or `NodePublishVolume` calls + // for the given volume. // This information is opaque to the CO. This field is OPTIONAL. PublishInfo map[string]string `protobuf:"bytes,1,rep,name=publish_info,json=publishInfo" json:"publish_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } @@ -1520,6 +1528,174 @@ func (m *ControllerServiceCapability_RPC) GetType() ControllerServiceCapability_ return ControllerServiceCapability_RPC_UNKNOWN } +// ////// +// ////// +type NodeStageVolumeRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // The ID of the volume to publish. This field is REQUIRED. + VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` + // The CO SHALL set this field to the value returned by + // `ControllerPublishVolume` if the corresponding Controller Plugin + // has `PUBLISH_UNPUBLISH_VOLUME` controller capability, and SHALL be + // left unset if the corresponding Controller Plugin does not have + // this capability. This is an OPTIONAL field. + PublishInfo map[string]string `protobuf:"bytes,3,rep,name=publish_info,json=publishInfo" json:"publish_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // The path to which the volume will be published. It MUST be an + // absolute path in the root filesystem of the process serving this + // request. The CO SHALL ensure that there is only one + // staging_target_path per volume. + // This is a REQUIRED field. + StagingTargetPath string `protobuf:"bytes,4,opt,name=staging_target_path,json=stagingTargetPath" json:"staging_target_path,omitempty"` + // The capability of the volume the CO expects the volume to have. + // This is a REQUIRED field. + VolumeCapability *VolumeCapability `protobuf:"bytes,5,opt,name=volume_capability,json=volumeCapability" json:"volume_capability,omitempty"` + // Credentials used by Node plugin to authenticate/authorize node + // stage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + NodeStageCredentials map[string]string `protobuf:"bytes,6,rep,name=node_stage_credentials,json=nodeStageCredentials" json:"node_stage_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Attributes of the volume to publish. This field is OPTIONAL and + // MUST match the attributes of the VolumeInfo identified by + // `volume_id`. + VolumeAttributes map[string]string `protobuf:"bytes,7,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *NodeStageVolumeRequest) Reset() { *m = NodeStageVolumeRequest{} } +func (m *NodeStageVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*NodeStageVolumeRequest) ProtoMessage() {} +func (*NodeStageVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } + +func (m *NodeStageVolumeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *NodeStageVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodeStageVolumeRequest) GetPublishInfo() map[string]string { + if m != nil { + return m.PublishInfo + } + return nil +} + +func (m *NodeStageVolumeRequest) GetStagingTargetPath() string { + if m != nil { + return m.StagingTargetPath + } + return "" +} + +func (m *NodeStageVolumeRequest) GetVolumeCapability() *VolumeCapability { + if m != nil { + return m.VolumeCapability + } + return nil +} + +func (m *NodeStageVolumeRequest) GetNodeStageCredentials() map[string]string { + if m != nil { + return m.NodeStageCredentials + } + return nil +} + +func (m *NodeStageVolumeRequest) GetVolumeAttributes() map[string]string { + if m != nil { + return m.VolumeAttributes + } + return nil +} + +type NodeStageVolumeResponse struct { +} + +func (m *NodeStageVolumeResponse) Reset() { *m = NodeStageVolumeResponse{} } +func (m *NodeStageVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*NodeStageVolumeResponse) ProtoMessage() {} +func (*NodeStageVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } + +// ////// +// ////// +type NodeUnstageVolumeRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` + // The ID of the volume. This field is REQUIRED. + VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` + // The path at which the volume was published. It MUST be an absolute + // path in the root filesystem of the process serving this request. + // This is a REQUIRED field. + StagingTargetPath string `protobuf:"bytes,3,opt,name=staging_target_path,json=stagingTargetPath" json:"staging_target_path,omitempty"` + // Credentials used by Node plugin to authenticate/authorize node + // unstage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + NodeUnstageCredentials map[string]string `protobuf:"bytes,4,rep,name=node_unstage_credentials,json=nodeUnstageCredentials" json:"node_unstage_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} + +func (m *NodeUnstageVolumeRequest) Reset() { *m = NodeUnstageVolumeRequest{} } +func (m *NodeUnstageVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*NodeUnstageVolumeRequest) ProtoMessage() {} +func (*NodeUnstageVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } + +func (m *NodeUnstageVolumeRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *NodeUnstageVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodeUnstageVolumeRequest) GetStagingTargetPath() string { + if m != nil { + return m.StagingTargetPath + } + return "" +} + +func (m *NodeUnstageVolumeRequest) GetNodeUnstageCredentials() map[string]string { + if m != nil { + return m.NodeUnstageCredentials + } + return nil +} + +type NodeUnstageVolumeResponse struct { +} + +func (m *NodeUnstageVolumeResponse) Reset() { *m = NodeUnstageVolumeResponse{} } +func (m *NodeUnstageVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*NodeUnstageVolumeResponse) ProtoMessage() {} +func (*NodeUnstageVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } + // ////// // ////// type NodePublishVolumeRequest struct { @@ -1533,19 +1709,26 @@ type NodePublishVolumeRequest struct { // left unset if the corresponding Controller Plugin does not have // this capability. This is an OPTIONAL field. PublishInfo map[string]string `protobuf:"bytes,3,rep,name=publish_info,json=publishInfo" json:"publish_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // The path to which the device was mounted by `NodeStageVolume`. + // It MUST be an absolute path in the root filesystem of the process + // serving this request. + // It MUST be set if the Node Plugin implements the + // `STAGE_UNSTAGE_VOLUME` node capability. + // This is an OPTIONAL field. + StagingTargetPath string `protobuf:"bytes,4,opt,name=staging_target_path,json=stagingTargetPath" json:"staging_target_path,omitempty"` // The path to which the volume will be published. It MUST be an // absolute path in the root filesystem of the process serving this // request. The CO SHALL ensure uniqueness of target_path per volume. // The CO SHALL ensure that the path exists, and that the process // serving the request has `read` and `write` permissions to the path. // This is a REQUIRED field. - TargetPath string `protobuf:"bytes,4,opt,name=target_path,json=targetPath" json:"target_path,omitempty"` + TargetPath string `protobuf:"bytes,5,opt,name=target_path,json=targetPath" json:"target_path,omitempty"` // The capability of the volume the CO expects the volume to have. // This is a REQUIRED field. - VolumeCapability *VolumeCapability `protobuf:"bytes,5,opt,name=volume_capability,json=volumeCapability" json:"volume_capability,omitempty"` + VolumeCapability *VolumeCapability `protobuf:"bytes,6,opt,name=volume_capability,json=volumeCapability" json:"volume_capability,omitempty"` // Whether to publish the volume in readonly mode. This field is // REQUIRED. - Readonly bool `protobuf:"varint,6,opt,name=readonly" json:"readonly,omitempty"` + Readonly bool `protobuf:"varint,7,opt,name=readonly" json:"readonly,omitempty"` // Credentials used by Node plugin to authenticate/authorize node // publish request. // This field contains credential data, for example username and @@ -1557,17 +1740,17 @@ type NodePublishVolumeRequest struct { // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - NodePublishCredentials map[string]string `protobuf:"bytes,7,rep,name=node_publish_credentials,json=nodePublishCredentials" json:"node_publish_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + NodePublishCredentials map[string]string `protobuf:"bytes,8,rep,name=node_publish_credentials,json=nodePublishCredentials" json:"node_publish_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Attributes of the volume to publish. This field is OPTIONAL and // MUST match the attributes of the Volume identified by // `volume_id`. - VolumeAttributes map[string]string `protobuf:"bytes,8,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + VolumeAttributes map[string]string `protobuf:"bytes,9,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } func (m *NodePublishVolumeRequest) Reset() { *m = NodePublishVolumeRequest{} } func (m *NodePublishVolumeRequest) String() string { return proto.CompactTextString(m) } func (*NodePublishVolumeRequest) ProtoMessage() {} -func (*NodePublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } +func (*NodePublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } func (m *NodePublishVolumeRequest) GetVersion() *Version { if m != nil { @@ -1590,6 +1773,13 @@ func (m *NodePublishVolumeRequest) GetPublishInfo() map[string]string { return nil } +func (m *NodePublishVolumeRequest) GetStagingTargetPath() string { + if m != nil { + return m.StagingTargetPath + } + return "" +} + func (m *NodePublishVolumeRequest) GetTargetPath() string { if m != nil { return m.TargetPath @@ -1631,7 +1821,7 @@ type NodePublishVolumeResponse struct { func (m *NodePublishVolumeResponse) Reset() { *m = NodePublishVolumeResponse{} } func (m *NodePublishVolumeResponse) String() string { return proto.CompactTextString(m) } func (*NodePublishVolumeResponse) ProtoMessage() {} -func (*NodePublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } +func (*NodePublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } // ////// // ////// @@ -1661,7 +1851,7 @@ type NodeUnpublishVolumeRequest struct { func (m *NodeUnpublishVolumeRequest) Reset() { *m = NodeUnpublishVolumeRequest{} } func (m *NodeUnpublishVolumeRequest) String() string { return proto.CompactTextString(m) } func (*NodeUnpublishVolumeRequest) ProtoMessage() {} -func (*NodeUnpublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } +func (*NodeUnpublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } func (m *NodeUnpublishVolumeRequest) GetVersion() *Version { if m != nil { @@ -1697,7 +1887,7 @@ type NodeUnpublishVolumeResponse struct { func (m *NodeUnpublishVolumeResponse) Reset() { *m = NodeUnpublishVolumeResponse{} } func (m *NodeUnpublishVolumeResponse) String() string { return proto.CompactTextString(m) } func (*NodeUnpublishVolumeResponse) ProtoMessage() {} -func (*NodeUnpublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } +func (*NodeUnpublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } // ////// // ////// @@ -1709,7 +1899,7 @@ type NodeGetIdRequest struct { func (m *NodeGetIdRequest) Reset() { *m = NodeGetIdRequest{} } func (m *NodeGetIdRequest) String() string { return proto.CompactTextString(m) } func (*NodeGetIdRequest) ProtoMessage() {} -func (*NodeGetIdRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } +func (*NodeGetIdRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } func (m *NodeGetIdRequest) GetVersion() *Version { if m != nil { @@ -1728,7 +1918,7 @@ type NodeGetIdResponse struct { func (m *NodeGetIdResponse) Reset() { *m = NodeGetIdResponse{} } func (m *NodeGetIdResponse) String() string { return proto.CompactTextString(m) } func (*NodeGetIdResponse) ProtoMessage() {} -func (*NodeGetIdResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } +func (*NodeGetIdResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } func (m *NodeGetIdResponse) GetNodeId() string { if m != nil { @@ -1747,7 +1937,7 @@ type NodeProbeRequest struct { func (m *NodeProbeRequest) Reset() { *m = NodeProbeRequest{} } func (m *NodeProbeRequest) String() string { return proto.CompactTextString(m) } func (*NodeProbeRequest) ProtoMessage() {} -func (*NodeProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } +func (*NodeProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } func (m *NodeProbeRequest) GetVersion() *Version { if m != nil { @@ -1762,7 +1952,7 @@ type NodeProbeResponse struct { func (m *NodeProbeResponse) Reset() { *m = NodeProbeResponse{} } func (m *NodeProbeResponse) String() string { return proto.CompactTextString(m) } func (*NodeProbeResponse) ProtoMessage() {} -func (*NodeProbeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } +func (*NodeProbeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } // ////// // ////// @@ -1774,7 +1964,7 @@ type NodeGetCapabilitiesRequest struct { func (m *NodeGetCapabilitiesRequest) Reset() { *m = NodeGetCapabilitiesRequest{} } func (m *NodeGetCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*NodeGetCapabilitiesRequest) ProtoMessage() {} -func (*NodeGetCapabilitiesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } +func (*NodeGetCapabilitiesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } func (m *NodeGetCapabilitiesRequest) GetVersion() *Version { if m != nil { @@ -1792,7 +1982,7 @@ type NodeGetCapabilitiesResponse struct { func (m *NodeGetCapabilitiesResponse) Reset() { *m = NodeGetCapabilitiesResponse{} } func (m *NodeGetCapabilitiesResponse) String() string { return proto.CompactTextString(m) } func (*NodeGetCapabilitiesResponse) ProtoMessage() {} -func (*NodeGetCapabilitiesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } +func (*NodeGetCapabilitiesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} } func (m *NodeGetCapabilitiesResponse) GetCapabilities() []*NodeServiceCapability { if m != nil { @@ -1811,7 +2001,7 @@ type NodeServiceCapability struct { func (m *NodeServiceCapability) Reset() { *m = NodeServiceCapability{} } func (m *NodeServiceCapability) String() string { return proto.CompactTextString(m) } func (*NodeServiceCapability) ProtoMessage() {} -func (*NodeServiceCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } +func (*NodeServiceCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } type isNodeServiceCapability_Type interface { isNodeServiceCapability_Type() @@ -1899,7 +2089,7 @@ type NodeServiceCapability_RPC struct { func (m *NodeServiceCapability_RPC) Reset() { *m = NodeServiceCapability_RPC{} } func (m *NodeServiceCapability_RPC) String() string { return proto.CompactTextString(m) } func (*NodeServiceCapability_RPC) ProtoMessage() {} -func (*NodeServiceCapability_RPC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40, 0} } +func (*NodeServiceCapability_RPC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44, 0} } func (m *NodeServiceCapability_RPC) GetType() NodeServiceCapability_RPC_Type { if m != nil { @@ -1945,6 +2135,10 @@ func init() { proto.RegisterType((*ControllerGetCapabilitiesResponse)(nil), "csi.ControllerGetCapabilitiesResponse") proto.RegisterType((*ControllerServiceCapability)(nil), "csi.ControllerServiceCapability") proto.RegisterType((*ControllerServiceCapability_RPC)(nil), "csi.ControllerServiceCapability.RPC") + proto.RegisterType((*NodeStageVolumeRequest)(nil), "csi.NodeStageVolumeRequest") + proto.RegisterType((*NodeStageVolumeResponse)(nil), "csi.NodeStageVolumeResponse") + proto.RegisterType((*NodeUnstageVolumeRequest)(nil), "csi.NodeUnstageVolumeRequest") + proto.RegisterType((*NodeUnstageVolumeResponse)(nil), "csi.NodeUnstageVolumeResponse") proto.RegisterType((*NodePublishVolumeRequest)(nil), "csi.NodePublishVolumeRequest") proto.RegisterType((*NodePublishVolumeResponse)(nil), "csi.NodePublishVolumeResponse") proto.RegisterType((*NodeUnpublishVolumeRequest)(nil), "csi.NodeUnpublishVolumeRequest") @@ -2432,6 +2626,8 @@ var _Controller_serviceDesc = grpc.ServiceDesc{ // Client API for Node service type NodeClient interface { + NodeStageVolume(ctx context.Context, in *NodeStageVolumeRequest, opts ...grpc.CallOption) (*NodeStageVolumeResponse, error) + NodeUnstageVolume(ctx context.Context, in *NodeUnstageVolumeRequest, opts ...grpc.CallOption) (*NodeUnstageVolumeResponse, error) NodePublishVolume(ctx context.Context, in *NodePublishVolumeRequest, opts ...grpc.CallOption) (*NodePublishVolumeResponse, error) NodeUnpublishVolume(ctx context.Context, in *NodeUnpublishVolumeRequest, opts ...grpc.CallOption) (*NodeUnpublishVolumeResponse, error) NodeGetId(ctx context.Context, in *NodeGetIdRequest, opts ...grpc.CallOption) (*NodeGetIdResponse, error) @@ -2447,6 +2643,24 @@ func NewNodeClient(cc *grpc.ClientConn) NodeClient { return &nodeClient{cc} } +func (c *nodeClient) NodeStageVolume(ctx context.Context, in *NodeStageVolumeRequest, opts ...grpc.CallOption) (*NodeStageVolumeResponse, error) { + out := new(NodeStageVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodeStageVolume", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeClient) NodeUnstageVolume(ctx context.Context, in *NodeUnstageVolumeRequest, opts ...grpc.CallOption) (*NodeUnstageVolumeResponse, error) { + out := new(NodeUnstageVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodeUnstageVolume", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *nodeClient) NodePublishVolume(ctx context.Context, in *NodePublishVolumeRequest, opts ...grpc.CallOption) (*NodePublishVolumeResponse, error) { out := new(NodePublishVolumeResponse) err := grpc.Invoke(ctx, "/csi.Node/NodePublishVolume", in, out, c.cc, opts...) @@ -2495,6 +2709,8 @@ func (c *nodeClient) NodeGetCapabilities(ctx context.Context, in *NodeGetCapabil // Server API for Node service type NodeServer interface { + NodeStageVolume(context.Context, *NodeStageVolumeRequest) (*NodeStageVolumeResponse, error) + NodeUnstageVolume(context.Context, *NodeUnstageVolumeRequest) (*NodeUnstageVolumeResponse, error) NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error) NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error) NodeGetId(context.Context, *NodeGetIdRequest) (*NodeGetIdResponse, error) @@ -2506,6 +2722,42 @@ func RegisterNodeServer(s *grpc.Server, srv NodeServer) { s.RegisterService(&_Node_serviceDesc, srv) } +func _Node_NodeStageVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodeStageVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).NodeStageVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Node/NodeStageVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).NodeStageVolume(ctx, req.(*NodeStageVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Node_NodeUnstageVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodeUnstageVolumeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).NodeUnstageVolume(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Node/NodeUnstageVolume", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).NodeUnstageVolume(ctx, req.(*NodeUnstageVolumeRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Node_NodePublishVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(NodePublishVolumeRequest) if err := dec(in); err != nil { @@ -2600,6 +2852,14 @@ var _Node_serviceDesc = grpc.ServiceDesc{ ServiceName: "csi.Node", HandlerType: (*NodeServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "NodeStageVolume", + Handler: _Node_NodeStageVolume_Handler, + }, + { + MethodName: "NodeUnstageVolume", + Handler: _Node_NodeUnstageVolume_Handler, + }, { MethodName: "NodePublishVolume", Handler: _Node_NodePublishVolume_Handler, @@ -2628,142 +2888,154 @@ var _Node_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("csi.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 2183 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3a, 0xcd, 0x73, 0xe3, 0x48, - 0xf5, 0x96, 0x3f, 0xe2, 0xf8, 0x39, 0x99, 0xf5, 0x74, 0xbe, 0x1c, 0xe5, 0x63, 0x1c, 0x65, 0x67, - 0x76, 0x7e, 0xf5, 0x5b, 0x7c, 0xc8, 0x16, 0x30, 0xd9, 0xd9, 0x99, 0x22, 0x71, 0x34, 0x89, 0x19, - 0xc7, 0xc9, 0x2a, 0x4e, 0x86, 0x5d, 0xd8, 0xd2, 0x2a, 0x76, 0x27, 0x23, 0xc6, 0x96, 0xbc, 0x92, - 0x9c, 0x1a, 0x17, 0xc5, 0x8d, 0x1b, 0x1c, 0xa8, 0xa2, 0x28, 0x2e, 0x14, 0x1c, 0x81, 0x2a, 0xae, - 0x9c, 0xf6, 0xcc, 0x8d, 0x2b, 0x17, 0x4e, 0x5c, 0x97, 0xbf, 0x82, 0x52, 0x77, 0x4b, 0x6e, 0xc9, - 0x92, 0x62, 0xcf, 0x30, 0x7b, 0x8a, 0xfb, 0x7d, 0xf7, 0x7b, 0xaf, 0xdf, 0x7b, 0xdd, 0x0a, 0x14, - 0xda, 0xb6, 0x5e, 0xed, 0x5b, 0xa6, 0x63, 0xa2, 0x4c, 0xdb, 0xd6, 0xa5, 0x0d, 0x58, 0x3b, 0xc4, - 0xce, 0xd9, 0xa0, 0xdf, 0x37, 0x2d, 0x07, 0x77, 0x2e, 0xb0, 0x65, 0xeb, 0xa6, 0x61, 0x2b, 0xf8, - 0xab, 0x01, 0xb6, 0x1d, 0xe9, 0xc7, 0xb0, 0x1e, 0x8d, 0xb6, 0xfb, 0xa6, 0x61, 0x63, 0xf4, 0x18, - 0x90, 0xed, 0x21, 0xd5, 0x1b, 0x86, 0x2d, 0x0b, 0x95, 0xcc, 0xc3, 0xe2, 0xce, 0x5c, 0xd5, 0xd5, - 0xc5, 0x58, 0x94, 0xbb, 0x76, 0x58, 0x88, 0xf4, 0x1c, 0xf2, 0xec, 0x37, 0x5a, 0x84, 0x5c, 0x4f, - 0xfb, 0xa9, 0x69, 0x95, 0x85, 0x8a, 0xf0, 0x30, 0xa7, 0xd0, 0x05, 0x81, 0xea, 0x86, 0x69, 0x95, - 0xd3, 0x0c, 0xea, 0x2e, 0x5c, 0x68, 0x5f, 0x73, 0xda, 0x2f, 0xcb, 0x19, 0x0a, 0x25, 0x0b, 0xe9, - 0x29, 0x2c, 0x1e, 0x62, 0xe7, 0xb4, 0x3b, 0xb8, 0xd6, 0x8d, 0xba, 0x71, 0x65, 0xb2, 0x1d, 0xa0, - 0x07, 0x90, 0x67, 0x76, 0x11, 0xd9, 0x61, 0xb3, 0x3c, 0xa4, 0xf4, 0x4f, 0x01, 0x96, 0x42, 0x02, - 0xd8, 0x1e, 0x11, 0x64, 0x0d, 0xad, 0x87, 0x09, 0x7b, 0x41, 0x21, 0xbf, 0xd1, 0x7d, 0xb8, 0x73, - 0x83, 0x8d, 0x8e, 0x69, 0x79, 0x9b, 0x26, 0x26, 0x16, 0x94, 0x79, 0x0a, 0xf5, 0xb6, 0x75, 0x00, - 0xb3, 0x3d, 0xcd, 0xd0, 0xaf, 0xb0, 0xed, 0x94, 0x33, 0xc4, 0x29, 0x0f, 0x89, 0xf6, 0x48, 0x45, - 0xd5, 0x63, 0x46, 0x2a, 0x1b, 0x8e, 0x35, 0x54, 0x7c, 0x4e, 0xf1, 0x31, 0xcc, 0x07, 0x50, 0xa8, - 0x04, 0x99, 0x57, 0x78, 0xc8, 0x0c, 0x72, 0x7f, 0xba, 0x3e, 0xb9, 0xd1, 0xba, 0x03, 0xcc, 0xcc, - 0xa0, 0x8b, 0x8f, 0xd3, 0x8f, 0x04, 0xe9, 0x19, 0x89, 0x20, 0xd5, 0x56, 0xd3, 0xfa, 0xda, 0xa5, - 0xde, 0xd5, 0x1d, 0x1d, 0xdb, 0xd3, 0xfa, 0xe7, 0x73, 0xd8, 0x88, 0x91, 0xc3, 0xdc, 0xb4, 0x0b, - 0x73, 0x6d, 0x0e, 0x5e, 0x4e, 0x93, 0xfd, 0x2e, 0x11, 0x69, 0x21, 0xb6, 0xa1, 0x12, 0x20, 0x95, - 0xfe, 0x2e, 0x40, 0x29, 0x4c, 0x82, 0x76, 0x21, 0x6f, 0x63, 0xeb, 0x46, 0x6f, 0x63, 0x66, 0xd8, - 0x46, 0xa4, 0xa8, 0xea, 0x19, 0x25, 0x3a, 0x4a, 0x29, 0x1e, 0xbd, 0x68, 0x40, 0x9e, 0x41, 0xd1, - 0xf7, 0x20, 0xeb, 0x0c, 0xfb, 0x54, 0xc4, 0x9d, 0x1d, 0x29, 0x51, 0x44, 0xb5, 0x35, 0xec, 0x63, - 0x85, 0xd0, 0x4b, 0xff, 0x0f, 0x59, 0x77, 0x85, 0x8a, 0x90, 0x3f, 0x6f, 0x3e, 0x6f, 0x9e, 0xbc, - 0x68, 0x96, 0x52, 0x68, 0x19, 0x50, 0xed, 0xa4, 0xd9, 0x52, 0x4e, 0x1a, 0x0d, 0x59, 0x51, 0xcf, - 0x64, 0xe5, 0xa2, 0x5e, 0x93, 0x4b, 0xc2, 0xfe, 0x0c, 0x55, 0x22, 0xfd, 0x35, 0x0b, 0x0b, 0x35, - 0x0b, 0x6b, 0x0e, 0xbe, 0x30, 0xbb, 0x83, 0x1e, 0x9e, 0xd2, 0xc7, 0x7e, 0xa6, 0xa5, 0xb9, 0x4c, - 0xdb, 0x85, 0x3b, 0xae, 0xaf, 0xda, 0xba, 0x33, 0x54, 0x2d, 0xcd, 0xb8, 0xc6, 0x24, 0xed, 0x8b, - 0x3b, 0x88, 0x88, 0xa8, 0x31, 0x94, 0xe2, 0x62, 0x94, 0xf9, 0x36, 0xbf, 0x44, 0xcf, 0x60, 0xe1, - 0x86, 0xd8, 0xa1, 0x06, 0x02, 0x93, 0xe5, 0x02, 0x43, 0xed, 0xe4, 0x02, 0x83, 0x6e, 0x82, 0x10, - 0x1d, 0xdb, 0xe8, 0x08, 0xa0, 0xaf, 0x59, 0x5a, 0x0f, 0x3b, 0xd8, 0xb2, 0xcb, 0x39, 0x2e, 0x8f, - 0x23, 0x36, 0x5b, 0x3d, 0xf5, 0x49, 0x69, 0x1e, 0x73, 0xbc, 0xe8, 0xe7, 0xb0, 0xd1, 0x36, 0x0d, - 0xc7, 0x32, 0xbb, 0x5d, 0x6c, 0xa9, 0x6d, 0xc2, 0xed, 0xfe, 0xe9, 0x60, 0xc3, 0xd1, 0xb5, 0xae, - 0x5d, 0x9e, 0x21, 0xc2, 0x77, 0x63, 0x85, 0xd7, 0x7c, 0x6e, 0x8a, 0xad, 0x8d, 0x78, 0xa9, 0xb6, - 0xb5, 0x76, 0x3c, 0x85, 0xf8, 0x04, 0xde, 0x0b, 0x59, 0x37, 0xcd, 0x51, 0x12, 0x9b, 0x50, 0xb9, - 0x4d, 0xff, 0x54, 0x47, 0xf3, 0x31, 0x2c, 0x06, 0xf7, 0xc8, 0x4e, 0xd2, 0x36, 0xcc, 0xd0, 0x28, - 0xb0, 0x6c, 0x29, 0x72, 0xa1, 0x52, 0x18, 0x4a, 0xfa, 0x43, 0x16, 0x4a, 0xe1, 0xe8, 0xa1, 0x5d, - 0xc8, 0x5d, 0x76, 0xcd, 0xf6, 0x2b, 0xc6, 0xb8, 0x15, 0x19, 0xe3, 0xea, 0xbe, 0x4b, 0x42, 0xa1, - 0x47, 0x29, 0x85, 0x72, 0xb8, 0xac, 0x3d, 0x73, 0x60, 0x38, 0xc4, 0xcc, 0x58, 0xd6, 0x63, 0x97, - 0x64, 0xc4, 0x4a, 0x38, 0xd0, 0x1e, 0x14, 0xb5, 0x76, 0x1b, 0xdb, 0xb6, 0xda, 0x33, 0x3b, 0x5e, - 0x7e, 0x56, 0xa2, 0x05, 0xec, 0x11, 0xc2, 0x63, 0xb3, 0x83, 0x15, 0xd0, 0xfc, 0xdf, 0xe2, 0x3c, - 0x14, 0x39, 0xab, 0xc4, 0x43, 0x28, 0x72, 0x9a, 0xd0, 0x0a, 0xe4, 0xaf, 0x6c, 0xd5, 0x3f, 0xc7, - 0x05, 0x65, 0xe6, 0xca, 0x26, 0xa7, 0xf3, 0x1e, 0x14, 0x89, 0x09, 0xea, 0x55, 0x57, 0xbb, 0xa6, - 0x25, 0xa7, 0xa0, 0x00, 0x01, 0x3d, 0x73, 0x21, 0xe2, 0x37, 0x02, 0xc0, 0x48, 0x25, 0xda, 0x85, - 0x2c, 0x31, 0x91, 0x56, 0x83, 0xfb, 0xb7, 0x99, 0x58, 0x25, 0x76, 0x12, 0x16, 0xe9, 0x8f, 0x02, - 0x64, 0x89, 0x8c, 0x70, 0x45, 0x38, 0xab, 0x37, 0x0f, 0x1b, 0xb2, 0xda, 0x3c, 0x39, 0x90, 0xd5, - 0x17, 0x4a, 0xbd, 0x25, 0x2b, 0x25, 0x01, 0xad, 0xc1, 0x0a, 0x0f, 0x57, 0xe4, 0xbd, 0x03, 0x59, - 0x51, 0x4f, 0x9a, 0x8d, 0xcf, 0x4a, 0x69, 0x24, 0xc2, 0xf2, 0xf1, 0x79, 0xa3, 0x55, 0x1f, 0xc7, - 0x65, 0xd0, 0x3a, 0x94, 0x39, 0x1c, 0x93, 0xc1, 0xc4, 0x66, 0x5d, 0xb1, 0x1c, 0x96, 0xfe, 0x64, - 0xc8, 0xdc, 0xfe, 0xbc, 0x1f, 0x06, 0x52, 0x8c, 0x5e, 0xc0, 0x7c, 0xa0, 0x3a, 0xb8, 0x3d, 0xcb, - 0xc2, 0x5f, 0x0d, 0x74, 0x0b, 0x77, 0xd4, 0xcb, 0xa1, 0x83, 0x6d, 0xe2, 0x86, 0x8c, 0x32, 0xef, - 0x41, 0xf7, 0x5d, 0xa0, 0xeb, 0xd3, 0xae, 0xde, 0xd3, 0x1d, 0x46, 0x93, 0x26, 0x34, 0x40, 0x40, - 0x84, 0x40, 0xfa, 0x5a, 0x80, 0x19, 0x16, 0x98, 0xfb, 0x5c, 0x71, 0x0a, 0x88, 0xf4, 0xa0, 0x54, - 0xe4, 0x1d, 0x48, 0xeb, 0x1d, 0x96, 0xff, 0x69, 0xbd, 0x83, 0x1e, 0x03, 0x68, 0x8e, 0x63, 0xe9, - 0x97, 0x03, 0x97, 0x85, 0x36, 0xc6, 0x35, 0x2e, 0x18, 0xd5, 0x3d, 0x1f, 0xcb, 0x6a, 0xc8, 0x88, - 0xdc, 0x3d, 0xc4, 0x21, 0xf4, 0x54, 0x87, 0xee, 0x2f, 0x69, 0x58, 0x38, 0xc0, 0x5d, 0xfc, 0xa6, - 0x35, 0x7a, 0x0d, 0x0a, 0xac, 0xa8, 0xfa, 0x5b, 0x9a, 0xa5, 0x80, 0x7a, 0x27, 0x54, 0xdf, 0x3a, - 0x44, 0x4d, 0xa0, 0xbe, 0x65, 0xb8, 0xfa, 0x16, 0x61, 0x05, 0x57, 0xdf, 0x28, 0x36, 0xa9, 0xbe, - 0x8d, 0x51, 0x04, 0x0b, 0x54, 0xb4, 0x80, 0xa9, 0x7c, 0xb5, 0x0c, 0x8b, 0x41, 0x23, 0x69, 0x81, - 0x92, 0xfe, 0x93, 0x85, 0xcd, 0x91, 0xa2, 0xd3, 0xc1, 0x65, 0x57, 0xb7, 0x5f, 0xbe, 0x03, 0x77, - 0xae, 0x40, 0xde, 0x30, 0x3b, 0x04, 0x95, 0xa1, 0xe7, 0xde, 0x5d, 0xd6, 0x3b, 0x68, 0x1f, 0xee, - 0x86, 0x3b, 0xdb, 0xb0, 0x9c, 0x25, 0x7a, 0x62, 0xfa, 0x5a, 0xe9, 0x26, 0x5c, 0x2b, 0x45, 0x98, - 0xb5, 0xb0, 0xd6, 0x31, 0x8d, 0xee, 0xb0, 0x9c, 0xab, 0x08, 0x0f, 0x67, 0x15, 0x7f, 0x8d, 0x7e, - 0x29, 0xc0, 0x26, 0x17, 0xc8, 0x3e, 0xdd, 0x61, 0x44, 0xa7, 0x92, 0x69, 0xa7, 0x4a, 0xf4, 0xc5, - 0x38, 0x7a, 0x2c, 0xaa, 0xeb, 0xed, 0x04, 0x12, 0x74, 0xe5, 0xef, 0x96, 0x3b, 0x35, 0x79, 0xbe, - 0x53, 0x26, 0xeb, 0xa7, 0xab, 0xf0, 0x99, 0x62, 0x1e, 0x19, 0x81, 0xc5, 0x13, 0xd8, 0xba, 0xd5, - 0xd4, 0xa9, 0x1a, 0x66, 0x0d, 0x96, 0x22, 0x75, 0x4f, 0x95, 0x84, 0x5f, 0x0b, 0x70, 0x2f, 0x76, - 0x83, 0xac, 0x63, 0xfe, 0x08, 0xe6, 0xbc, 0x18, 0xe9, 0xc6, 0x95, 0xc9, 0x2e, 0x20, 0xdf, 0x4d, - 0x76, 0x0e, 0x9b, 0xba, 0x19, 0xd4, 0x9d, 0xc4, 0xa9, 0x63, 0x8a, 0xfd, 0x11, 0x44, 0x7c, 0x0a, - 0xa5, 0x30, 0xc1, 0x54, 0xd6, 0x7f, 0x93, 0xe6, 0xcf, 0xe4, 0xb9, 0xd1, 0xff, 0xf6, 0x0f, 0xcb, - 0x6f, 0x04, 0xa8, 0x70, 0xc9, 0x3c, 0x30, 0xa2, 0xd2, 0x99, 0x0e, 0x85, 0xf5, 0x90, 0xc7, 0xa2, - 0xed, 0x8d, 0x22, 0x18, 0x4b, 0x69, 0xee, 0xfc, 0x44, 0x11, 0x89, 0x9f, 0xc2, 0xf6, 0x04, 0x62, - 0xa6, 0xf2, 0xf5, 0x36, 0x9f, 0xbf, 0x63, 0xa6, 0xb3, 0xda, 0xf5, 0xef, 0x34, 0x6c, 0x5d, 0x68, - 0x5d, 0xbd, 0xe3, 0xcf, 0x5d, 0x6f, 0x71, 0x2b, 0x4a, 0x8e, 0x48, 0xcc, 0xfc, 0x9d, 0x99, 0x76, - 0xfe, 0xd6, 0xa3, 0xce, 0x3f, 0x0d, 0xd8, 0x27, 0x54, 0xca, 0x6d, 0xfb, 0x99, 0xb8, 0x04, 0xfc, - 0x4f, 0x4e, 0xec, 0x4f, 0x40, 0x4a, 0xb2, 0x88, 0x9d, 0xd9, 0x75, 0x28, 0xf8, 0x4f, 0x02, 0x44, - 0xee, 0xac, 0x32, 0x02, 0xa0, 0x32, 0xe4, 0x7b, 0xd8, 0xb6, 0xb5, 0x6b, 0x4f, 0xbe, 0xb7, 0x94, - 0x7e, 0x21, 0x00, 0x6a, 0xe8, 0x36, 0x9b, 0x0d, 0xa7, 0x8e, 0x98, 0x3b, 0x32, 0x6a, 0xaf, 0x55, - 0x6c, 0x38, 0x96, 0xce, 0xc6, 0x9b, 0x9c, 0x02, 0x3d, 0xed, 0xb5, 0x4c, 0x21, 0xee, 0x4c, 0x63, - 0x3b, 0x9a, 0xe5, 0xe8, 0xc6, 0xb5, 0xea, 0x98, 0xaf, 0xb0, 0xc1, 0x8e, 0xd3, 0xbc, 0x07, 0x6d, - 0xb9, 0x40, 0xe9, 0xf7, 0x02, 0x2c, 0x04, 0xcc, 0x60, 0xdb, 0x7a, 0x04, 0x79, 0x4f, 0x36, 0xad, - 0x42, 0x9b, 0xc4, 0x8e, 0x08, 0xd2, 0x2a, 0x0d, 0x82, 0x47, 0x8e, 0x36, 0x00, 0x0c, 0xfc, 0xda, - 0x61, 0x4a, 0xe9, 0xae, 0x0b, 0x2e, 0x84, 0x28, 0x14, 0x3f, 0x84, 0x1c, 0x0d, 0xc5, 0x44, 0xd7, - 0x83, 0x5f, 0xa5, 0x01, 0x1d, 0x62, 0xc7, 0x9f, 0x00, 0xa7, 0xf4, 0x52, 0x4c, 0xea, 0xa6, 0xa7, - 0x4d, 0xdd, 0xc3, 0xc0, 0xd5, 0x91, 0x66, 0xfe, 0x07, 0xde, 0x13, 0x48, 0xc8, 0xb8, 0xa4, 0x9b, - 0xe3, 0x5b, 0x5e, 0xdd, 0xa4, 0x03, 0x58, 0x08, 0x28, 0x64, 0xc1, 0xfa, 0x0e, 0x20, 0xed, 0x46, - 0xd3, 0xbb, 0xda, 0x65, 0x97, 0xee, 0xd4, 0xc5, 0xb2, 0x19, 0xf6, 0xae, 0x8f, 0xf1, 0xd8, 0xa4, - 0x1f, 0xc0, 0x32, 0xd7, 0x4d, 0x2c, 0xf3, 0x72, 0xda, 0x0a, 0x2e, 0xad, 0xc2, 0xca, 0x98, 0x04, - 0x56, 0x98, 0x7e, 0xc8, 0x37, 0x0a, 0x66, 0xec, 0x9b, 0x3e, 0xd6, 0xe8, 0x7c, 0x25, 0x1c, 0x93, - 0xc5, 0x36, 0x7f, 0x10, 0xf9, 0x60, 0x53, 0x09, 0xb5, 0x00, 0xf6, 0x36, 0x12, 0xfb, 0x76, 0xf3, - 0xbb, 0x34, 0xac, 0x25, 0x50, 0xa3, 0x47, 0x90, 0xb1, 0xfa, 0x6d, 0x66, 0xee, 0xfb, 0xb7, 0x09, - 0xaf, 0x2a, 0xa7, 0xb5, 0xa3, 0x94, 0xe2, 0xb2, 0x88, 0x7f, 0x13, 0x20, 0xa3, 0x9c, 0xd6, 0xd0, - 0x93, 0xc0, 0x13, 0xce, 0xff, 0x4d, 0x22, 0x82, 0x7f, 0xc9, 0x31, 0xa3, 0x5e, 0x72, 0xca, 0xb0, - 0x58, 0x53, 0xe4, 0xbd, 0x96, 0xac, 0x1e, 0xc8, 0x0d, 0xb9, 0x25, 0xab, 0x17, 0x27, 0x8d, 0xf3, - 0x63, 0xb9, 0x24, 0xb8, 0x17, 0xb0, 0xd3, 0xf3, 0xfd, 0x46, 0xfd, 0xec, 0x48, 0x3d, 0x6f, 0x7a, - 0xbf, 0x18, 0x36, 0x8d, 0x4a, 0x30, 0xd7, 0xa8, 0x9f, 0xb5, 0x18, 0xe0, 0xac, 0x94, 0x71, 0x21, - 0x87, 0x72, 0x4b, 0xad, 0xed, 0x9d, 0xee, 0xd5, 0xea, 0xad, 0xcf, 0x4a, 0x59, 0xff, 0x35, 0xe8, - 0x5f, 0x39, 0x28, 0x37, 0xcd, 0x0e, 0x7e, 0x77, 0xf3, 0xf1, 0xa7, 0xa1, 0xb1, 0x87, 0x9e, 0xaf, - 0x2a, 0x91, 0x14, 0xa7, 0x39, 0x79, 0xde, 0x71, 0xcb, 0xa3, 0xa3, 0x59, 0xd7, 0xd8, 0x51, 0xfb, - 0x9a, 0xf3, 0x92, 0xcc, 0xd4, 0x05, 0x05, 0x28, 0xe8, 0x54, 0x73, 0x5e, 0x46, 0x8f, 0xde, 0xb9, - 0x37, 0x1f, 0xbd, 0x67, 0x42, 0xa3, 0xb7, 0x0d, 0x65, 0x32, 0xc6, 0x44, 0x0d, 0x29, 0xfc, 0xcc, - 0x1b, 0xbb, 0x3f, 0x0e, 0x31, 0x36, 0x94, 0x2c, 0x1b, 0x91, 0x48, 0xf4, 0x65, 0x54, 0x87, 0x9d, - 0x25, 0xda, 0x3e, 0x4a, 0xd6, 0x36, 0x69, 0x63, 0x7d, 0xcb, 0x39, 0x52, 0xac, 0xc3, 0x5a, 0xc2, - 0xc6, 0xbe, 0xfd, 0xa9, 0x7c, 0x0d, 0x56, 0x23, 0x7c, 0xc2, 0x4a, 0xd9, 0x3f, 0xd2, 0x20, 0xba, - 0xd8, 0x77, 0x39, 0xee, 0x86, 0x12, 0x35, 0x33, 0x96, 0xa8, 0x3f, 0x03, 0x91, 0x24, 0x52, 0xd2, - 0xbc, 0xfb, 0xc4, 0x0f, 0x6e, 0xcc, 0xa4, 0x1b, 0x40, 0x8d, 0xa5, 0x13, 0xc9, 0xd4, 0xc8, 0xe9, - 0xf6, 0x39, 0x6c, 0x24, 0xb2, 0x4e, 0xe5, 0xeb, 0x0d, 0x1a, 0xfb, 0xb8, 0x89, 0xf6, 0x63, 0x28, - 0xb9, 0xe8, 0x43, 0xec, 0xd4, 0x3b, 0xd3, 0x36, 0x8a, 0x0f, 0xe1, 0x2e, 0xc7, 0xcb, 0x1a, 0x03, - 0x77, 0x93, 0x10, 0xf8, 0x9b, 0x84, 0xa7, 0xe9, 0x8d, 0x3a, 0xdf, 0x02, 0xd5, 0x14, 0xec, 0x79, - 0x07, 0x34, 0x4f, 0xde, 0xb2, 0xdb, 0x7d, 0x41, 0xfd, 0x13, 0xd7, 0xe7, 0x9e, 0x86, 0xfa, 0x1c, - 0x1d, 0xcb, 0x44, 0x3f, 0xf4, 0xb7, 0x75, 0xb8, 0x3f, 0x0b, 0xb0, 0x14, 0x49, 0x87, 0x76, 0xf8, - 0xde, 0xb6, 0x19, 0x2f, 0x90, 0xef, 0x6a, 0x67, 0xb4, 0xa9, 0x7d, 0x3f, 0xd0, 0xd4, 0xb6, 0x93, - 0x79, 0xf9, 0x76, 0xb6, 0x10, 0xd1, 0xce, 0xbc, 0x96, 0xb3, 0xf3, 0xdb, 0x34, 0xcc, 0xd6, 0x49, - 0xa2, 0x39, 0x43, 0xf4, 0x05, 0xf9, 0x22, 0x36, 0xf6, 0xed, 0x0e, 0x55, 0xbc, 0xf9, 0x2b, 0xee, - 0xab, 0x9f, 0xb8, 0x95, 0x40, 0xc1, 0x22, 0x97, 0x42, 0x47, 0x30, 0x1f, 0xf8, 0x8c, 0x85, 0x56, - 0xa3, 0x3e, 0x6d, 0x51, 0x81, 0x62, 0xfc, 0x57, 0x2f, 0x29, 0x85, 0xbe, 0xe4, 0xbe, 0xbc, 0x05, - 0xa6, 0xc7, 0xad, 0x20, 0x5b, 0x44, 0x8e, 0x88, 0x52, 0x12, 0x89, 0xa7, 0x61, 0xe7, 0x4f, 0x33, - 0x00, 0xa3, 0x91, 0x01, 0xc9, 0x30, 0xc7, 0x3f, 0xbc, 0xa3, 0x72, 0xdc, 0xf7, 0x06, 0x71, 0x35, - 0x02, 0xe3, 0xdb, 0x2d, 0xc3, 0x1c, 0xff, 0x3c, 0xc6, 0xc4, 0x44, 0x3c, 0xeb, 0x31, 0x31, 0x91, - 0x6f, 0x69, 0x29, 0x74, 0x15, 0x98, 0x09, 0xf9, 0x23, 0x8e, 0xb6, 0x27, 0x78, 0xde, 0x11, 0xdf, - 0x9f, 0xe4, 0x99, 0x43, 0x4a, 0xa1, 0x2e, 0xac, 0xc6, 0x5e, 0x8f, 0xd1, 0xfd, 0x89, 0x6e, 0xfe, - 0xe2, 0x83, 0xdb, 0xc8, 0x7c, 0x6d, 0x26, 0x88, 0xf1, 0x97, 0x40, 0xf4, 0x60, 0xb2, 0x7b, 0xab, - 0xf8, 0xc1, 0xad, 0x74, 0xbe, 0xc2, 0x7d, 0x28, 0x72, 0x97, 0x2c, 0xb4, 0x32, 0x7e, 0xed, 0xa2, - 0x22, 0xcb, 0x71, 0xf7, 0x31, 0x2a, 0x83, 0xbb, 0x26, 0x30, 0x19, 0xe3, 0x37, 0x15, 0x26, 0x23, - 0xe2, 0x46, 0x21, 0xa5, 0x50, 0x13, 0xde, 0x0b, 0x8d, 0xf8, 0x68, 0x2d, 0x1c, 0x21, 0xae, 0x80, - 0x8a, 0xeb, 0xd1, 0xc8, 0xe8, 0xb0, 0x85, 0x6a, 0xdc, 0x58, 0xd8, 0xa2, 0x2b, 0xe9, 0x58, 0xd8, - 0x62, 0x4a, 0xa5, 0x94, 0xda, 0xf9, 0x75, 0x06, 0xb2, 0x6e, 0x1d, 0x42, 0x2d, 0x56, 0xaf, 0x03, - 0x59, 0xb2, 0x91, 0x38, 0x0c, 0x89, 0x9b, 0x71, 0x68, 0x7f, 0x33, 0x9f, 0xc3, 0x42, 0x44, 0x2b, - 0x43, 0xf7, 0x6e, 0xe9, 0xc3, 0x62, 0x25, 0x9e, 0xc0, 0x97, 0xfd, 0x09, 0x14, 0xfc, 0x5e, 0x86, - 0x96, 0x7c, 0x06, 0xbe, 0x2f, 0x8a, 0xcb, 0x61, 0x70, 0x98, 0x9b, 0x06, 0x6c, 0xc4, 0x1d, 0x08, - 0xd5, 0x72, 0x18, 0x1c, 0xde, 0x57, 0x38, 0x3c, 0xf7, 0x78, 0x75, 0x51, 0x81, 0xa9, 0xc4, 0x13, - 0x78, 0xb2, 0x2f, 0x67, 0xc8, 0xbf, 0x6b, 0x7c, 0xf4, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9a, - 0x16, 0x02, 0x0b, 0xbb, 0x21, 0x00, 0x00, + // 2374 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3a, 0xcd, 0x6f, 0xdb, 0xc8, + 0xf5, 0xa2, 0x3e, 0x2c, 0xeb, 0xc9, 0xce, 0x2a, 0x63, 0xc7, 0x96, 0xe9, 0x38, 0x71, 0x98, 0x4d, + 0x36, 0x3f, 0xfc, 0xb2, 0x02, 0xea, 0xc5, 0xb6, 0xf1, 0x66, 0x13, 0xd4, 0x96, 0x19, 0x5b, 0x8d, + 0x23, 0x7b, 0x69, 0x39, 0xe9, 0x6e, 0xbb, 0xe5, 0xd2, 0xd2, 0xd8, 0x61, 0x23, 0x91, 0x5a, 0x92, + 0x32, 0x22, 0x14, 0xbd, 0xf5, 0xd4, 0xf6, 0x56, 0x14, 0xbd, 0x14, 0xed, 0xb1, 0x28, 0xd0, 0x6b, + 0x7b, 0x59, 0xf4, 0x52, 0xa0, 0xb7, 0x02, 0x3d, 0xf5, 0xde, 0xeb, 0xf6, 0xaf, 0x28, 0x38, 0x33, + 0xa4, 0x86, 0xd4, 0x90, 0xb2, 0x92, 0x4d, 0xd0, 0x93, 0xc8, 0xf7, 0x3d, 0xf3, 0xde, 0xbc, 0x79, + 0xef, 0x51, 0x50, 0x6a, 0xbb, 0x66, 0xad, 0xef, 0xd8, 0x9e, 0x8d, 0x72, 0x6d, 0xd7, 0x54, 0xd6, + 0x60, 0x75, 0x17, 0x7b, 0x47, 0x83, 0x7e, 0xdf, 0x76, 0x3c, 0xdc, 0x79, 0x8a, 0x1d, 0xd7, 0xb4, + 0x2d, 0x57, 0xc3, 0x5f, 0x0e, 0xb0, 0xeb, 0x29, 0x3f, 0x80, 0xab, 0x62, 0xb4, 0xdb, 0xb7, 0x2d, + 0x17, 0xa3, 0xfb, 0x80, 0xdc, 0x00, 0xa9, 0x9f, 0x33, 0x6c, 0x55, 0x5a, 0xcf, 0xdd, 0x29, 0x6f, + 0xcc, 0xd5, 0x7c, 0x5d, 0x8c, 0x45, 0xbb, 0xec, 0xc6, 0x85, 0x28, 0x8f, 0xa1, 0xc8, 0x9e, 0xd1, + 0x22, 0x14, 0x7a, 0xc6, 0x8f, 0x6d, 0xa7, 0x2a, 0xad, 0x4b, 0x77, 0x0a, 0x1a, 0x7d, 0x21, 0x50, + 0xd3, 0xb2, 0x9d, 0x6a, 0x96, 0x41, 0xfd, 0x17, 0x1f, 0xda, 0x37, 0xbc, 0xf6, 0xf3, 0x6a, 0x8e, + 0x42, 0xc9, 0x8b, 0xf2, 0x10, 0x16, 0x77, 0xb1, 0x77, 0xd8, 0x1d, 0x9c, 0x99, 0x56, 0xc3, 0x3a, + 0xb5, 0xd9, 0x0a, 0xd0, 0x6d, 0x28, 0x32, 0xbb, 0x88, 0xec, 0xb8, 0x59, 0x01, 0x52, 0xf9, 0x97, + 0x04, 0x57, 0x62, 0x02, 0xd8, 0x1a, 0x11, 0xe4, 0x2d, 0xa3, 0x87, 0x09, 0x7b, 0x49, 0x23, 0xcf, + 0xe8, 0x16, 0x5c, 0x3a, 0xc7, 0x56, 0xc7, 0x76, 0x82, 0x45, 0x13, 0x13, 0x4b, 0xda, 0x3c, 0x85, + 0x06, 0xcb, 0xda, 0x81, 0xd9, 0x9e, 0x61, 0x99, 0xa7, 0xd8, 0xf5, 0xaa, 0x39, 0xb2, 0x29, 0x77, + 0x88, 0x76, 0xa1, 0xa2, 0xda, 0x13, 0x46, 0xaa, 0x5a, 0x9e, 0x33, 0xd4, 0x42, 0x4e, 0xf9, 0x3e, + 0xcc, 0x47, 0x50, 0xa8, 0x02, 0xb9, 0x17, 0x78, 0xc8, 0x0c, 0xf2, 0x1f, 0xfd, 0x3d, 0x39, 0x37, + 0xba, 0x03, 0xcc, 0xcc, 0xa0, 0x2f, 0x1f, 0x65, 0xef, 0x49, 0xca, 0x23, 0xe2, 0x41, 0xaa, 0xad, + 0x6e, 0xf4, 0x8d, 0x13, 0xb3, 0x6b, 0x7a, 0x26, 0x76, 0xa7, 0xdd, 0x9f, 0xcf, 0x60, 0x2d, 0x41, + 0x0e, 0xdb, 0xa6, 0x4d, 0x98, 0x6b, 0x73, 0xf0, 0x6a, 0x96, 0xac, 0xf7, 0x0a, 0x91, 0x16, 0x63, + 0x1b, 0x6a, 0x11, 0x52, 0xe5, 0xef, 0x12, 0x54, 0xe2, 0x24, 0x68, 0x13, 0x8a, 0x2e, 0x76, 0xce, + 0xcd, 0x36, 0x66, 0x86, 0xad, 0x09, 0x45, 0xd5, 0x8e, 0x28, 0xd1, 0x5e, 0x46, 0x0b, 0xe8, 0x65, + 0x0b, 0x8a, 0x0c, 0x8a, 0xbe, 0x0d, 0x79, 0x6f, 0xd8, 0xa7, 0x22, 0x2e, 0x6d, 0x28, 0xa9, 0x22, + 0x6a, 0xad, 0x61, 0x1f, 0x6b, 0x84, 0x5e, 0xf9, 0x7f, 0xc8, 0xfb, 0x6f, 0xa8, 0x0c, 0xc5, 0xe3, + 0xe6, 0xe3, 0xe6, 0xc1, 0xb3, 0x66, 0x25, 0x83, 0x96, 0x00, 0xd5, 0x0f, 0x9a, 0x2d, 0xed, 0x60, + 0x7f, 0x5f, 0xd5, 0xf4, 0x23, 0x55, 0x7b, 0xda, 0xa8, 0xab, 0x15, 0x69, 0x7b, 0x86, 0x2a, 0x51, + 0xfe, 0x94, 0x87, 0x85, 0xba, 0x83, 0x0d, 0x0f, 0x3f, 0xb5, 0xbb, 0x83, 0x1e, 0x9e, 0x72, 0x8f, + 0xc3, 0x48, 0xcb, 0x72, 0x91, 0xb6, 0x09, 0x97, 0xfc, 0xbd, 0x6a, 0x9b, 0xde, 0x50, 0x77, 0x0c, + 0xeb, 0x0c, 0x93, 0xb0, 0x2f, 0x6f, 0x20, 0x22, 0xa2, 0xce, 0x50, 0x9a, 0x8f, 0xd1, 0xe6, 0xdb, + 0xfc, 0x2b, 0x7a, 0x04, 0x0b, 0xe7, 0xc4, 0x0e, 0x3d, 0xe2, 0x98, 0x3c, 0xe7, 0x18, 0x6a, 0x27, + 0xe7, 0x18, 0x74, 0x1e, 0x85, 0x98, 0xd8, 0x45, 0x7b, 0x00, 0x7d, 0xc3, 0x31, 0x7a, 0xd8, 0xc3, + 0x8e, 0x5b, 0x2d, 0x70, 0x71, 0x2c, 0x58, 0x6c, 0xed, 0x30, 0x24, 0xa5, 0x71, 0xcc, 0xf1, 0xa2, + 0x9f, 0xc2, 0x5a, 0xdb, 0xb6, 0x3c, 0xc7, 0xee, 0x76, 0xb1, 0xa3, 0xb7, 0x09, 0xb7, 0xff, 0xd3, + 0xc1, 0x96, 0x67, 0x1a, 0x5d, 0xb7, 0x3a, 0x43, 0x84, 0x6f, 0x26, 0x0a, 0xaf, 0x87, 0xdc, 0x14, + 0x5b, 0x1f, 0xf1, 0x52, 0x6d, 0xab, 0xed, 0x64, 0x0a, 0xf9, 0x01, 0xbc, 0x13, 0xb3, 0x6e, 0x9a, + 0xa3, 0x24, 0x37, 0x61, 0x7d, 0x92, 0xfe, 0xa9, 0x8e, 0xe6, 0x7d, 0x58, 0x8c, 0xae, 0x91, 0x9d, + 0xa4, 0x9b, 0x30, 0x43, 0xbd, 0xc0, 0xa2, 0xa5, 0xcc, 0xb9, 0x4a, 0x63, 0x28, 0xe5, 0x77, 0x79, + 0xa8, 0xc4, 0xbd, 0x87, 0x36, 0xa1, 0x70, 0xd2, 0xb5, 0xdb, 0x2f, 0x18, 0xe3, 0x0d, 0xa1, 0x8f, + 0x6b, 0xdb, 0x3e, 0x09, 0x85, 0xee, 0x65, 0x34, 0xca, 0xe1, 0xb3, 0xf6, 0xec, 0x81, 0xe5, 0x11, + 0x33, 0x13, 0x59, 0x9f, 0xf8, 0x24, 0x23, 0x56, 0xc2, 0x81, 0xb6, 0xa0, 0x6c, 0xb4, 0xdb, 0xd8, + 0x75, 0xf5, 0x9e, 0xdd, 0x09, 0xe2, 0x73, 0x5d, 0x2c, 0x60, 0x8b, 0x10, 0x3e, 0xb1, 0x3b, 0x58, + 0x03, 0x23, 0x7c, 0x96, 0xe7, 0xa1, 0xcc, 0x59, 0x25, 0xef, 0x42, 0x99, 0xd3, 0x84, 0x96, 0xa1, + 0x78, 0xea, 0xea, 0xe1, 0x39, 0x2e, 0x69, 0x33, 0xa7, 0x2e, 0x39, 0x9d, 0xd7, 0xa1, 0x4c, 0x4c, + 0xd0, 0x4f, 0xbb, 0xc6, 0x19, 0x4d, 0x39, 0x25, 0x0d, 0x08, 0xe8, 0x91, 0x0f, 0x91, 0xbf, 0x96, + 0x00, 0x46, 0x2a, 0xd1, 0x26, 0xe4, 0x89, 0x89, 0x34, 0x1b, 0xdc, 0x9a, 0x64, 0x62, 0x8d, 0xd8, + 0x49, 0x58, 0x94, 0xdf, 0x4b, 0x90, 0x27, 0x32, 0xe2, 0x19, 0xe1, 0xa8, 0xd1, 0xdc, 0xdd, 0x57, + 0xf5, 0xe6, 0xc1, 0x8e, 0xaa, 0x3f, 0xd3, 0x1a, 0x2d, 0x55, 0xab, 0x48, 0x68, 0x15, 0x96, 0x79, + 0xb8, 0xa6, 0x6e, 0xed, 0xa8, 0x9a, 0x7e, 0xd0, 0xdc, 0xff, 0xb4, 0x92, 0x45, 0x32, 0x2c, 0x3d, + 0x39, 0xde, 0x6f, 0x35, 0xc6, 0x71, 0x39, 0x74, 0x15, 0xaa, 0x1c, 0x8e, 0xc9, 0x60, 0x62, 0xf3, + 0xbe, 0x58, 0x0e, 0x4b, 0x1f, 0x19, 0xb2, 0xb0, 0x3d, 0x1f, 0xba, 0x81, 0x24, 0xa3, 0x67, 0x30, + 0x1f, 0xc9, 0x0e, 0xfe, 0x9d, 0xe5, 0xe0, 0x2f, 0x07, 0xa6, 0x83, 0x3b, 0xfa, 0xc9, 0xd0, 0xc3, + 0x2e, 0xd9, 0x86, 0x9c, 0x36, 0x1f, 0x40, 0xb7, 0x7d, 0xa0, 0xbf, 0xa7, 0x5d, 0xb3, 0x67, 0x7a, + 0x8c, 0x26, 0x4b, 0x68, 0x80, 0x80, 0x08, 0x81, 0xf2, 0x95, 0x04, 0x33, 0xcc, 0x31, 0xb7, 0xb8, + 0xe4, 0x14, 0x11, 0x19, 0x40, 0xa9, 0xc8, 0x4b, 0x90, 0x35, 0x3b, 0x2c, 0xfe, 0xb3, 0x66, 0x07, + 0xdd, 0x07, 0x30, 0x3c, 0xcf, 0x31, 0x4f, 0x06, 0x3e, 0x0b, 0xbd, 0x18, 0x57, 0x39, 0x67, 0xd4, + 0xb6, 0x42, 0x2c, 0xcb, 0x21, 0x23, 0x72, 0xff, 0x10, 0xc7, 0xd0, 0x53, 0x1d, 0xba, 0x3f, 0x66, + 0x61, 0x61, 0x07, 0x77, 0xf1, 0xab, 0xe6, 0xe8, 0x55, 0x28, 0xb1, 0xa4, 0x1a, 0x2e, 0x69, 0x96, + 0x02, 0x1a, 0x9d, 0x58, 0x7e, 0xeb, 0x10, 0x35, 0x91, 0xfc, 0x96, 0xe3, 0xf2, 0x9b, 0xc0, 0x0a, + 0x2e, 0xbf, 0x51, 0x6c, 0x5a, 0x7e, 0x1b, 0xa3, 0x88, 0x26, 0x28, 0xb1, 0x80, 0xa9, 0xf6, 0x6a, + 0x09, 0x16, 0xa3, 0x46, 0xd2, 0x04, 0xa5, 0xfc, 0x27, 0x0f, 0xd7, 0x46, 0x8a, 0x0e, 0x07, 0x27, + 0x5d, 0xd3, 0x7d, 0xfe, 0x06, 0xb6, 0x73, 0x19, 0x8a, 0x96, 0xdd, 0x21, 0xa8, 0x1c, 0x3d, 0xf7, + 0xfe, 0x6b, 0xa3, 0x83, 0xb6, 0xe1, 0x72, 0xfc, 0x66, 0x1b, 0x56, 0xf3, 0x44, 0x4f, 0xc2, 0xbd, + 0x56, 0x39, 0x8f, 0xe7, 0x4a, 0x19, 0x66, 0x1d, 0x6c, 0x74, 0x6c, 0xab, 0x3b, 0xac, 0x16, 0xd6, + 0xa5, 0x3b, 0xb3, 0x5a, 0xf8, 0x8e, 0x7e, 0x21, 0xc1, 0x35, 0xce, 0x91, 0x7d, 0xba, 0x42, 0xc1, + 0x4d, 0xa5, 0xd2, 0x9b, 0x2a, 0x75, 0x2f, 0xc6, 0xd1, 0x63, 0x5e, 0xbd, 0xda, 0x4e, 0x21, 0x41, + 0xa7, 0xe1, 0x6a, 0xb9, 0x53, 0x53, 0xe4, 0x6f, 0xca, 0x74, 0xfd, 0xf4, 0x2d, 0x7e, 0xa6, 0xd8, + 0x8e, 0x8c, 0xc0, 0xf2, 0x01, 0xdc, 0x98, 0x68, 0xea, 0x54, 0x17, 0x66, 0x1d, 0xae, 0x08, 0x75, + 0x4f, 0x15, 0x84, 0x5f, 0x49, 0x70, 0x3d, 0x71, 0x81, 0xec, 0xc6, 0xfc, 0x3e, 0xcc, 0x05, 0x3e, + 0x32, 0xad, 0x53, 0x9b, 0x35, 0x20, 0x1f, 0xa6, 0x6f, 0x0e, 0xab, 0xba, 0x19, 0xd4, 0xaf, 0xc4, + 0xe9, 0xc6, 0x94, 0xfb, 0x23, 0x88, 0xfc, 0x10, 0x2a, 0x71, 0x82, 0xa9, 0xac, 0xff, 0x3a, 0xcb, + 0x9f, 0xc9, 0x63, 0xab, 0xff, 0xf6, 0x0f, 0xcb, 0xaf, 0x24, 0x58, 0xe7, 0x82, 0x79, 0x60, 0x89, + 0xc2, 0x99, 0x16, 0x85, 0x8d, 0xd8, 0x8e, 0x89, 0xed, 0x15, 0x11, 0x8c, 0x85, 0x34, 0x77, 0x7e, + 0x44, 0x44, 0xf2, 0x27, 0x70, 0xf3, 0x02, 0x62, 0xa6, 0xda, 0xeb, 0x9b, 0x7c, 0xfc, 0x8e, 0x99, + 0xce, 0x72, 0xd7, 0xbf, 0xb3, 0x70, 0xe3, 0xa9, 0xd1, 0x35, 0x3b, 0x61, 0xdd, 0xf5, 0x1a, 0x5d, + 0x51, 0xba, 0x47, 0x12, 0xea, 0xef, 0xdc, 0xb4, 0xf5, 0xb7, 0x29, 0x3a, 0xff, 0xd4, 0x61, 0x1f, + 0x53, 0x29, 0x93, 0xd6, 0x73, 0xe1, 0x14, 0xf0, 0x8d, 0x9c, 0xd8, 0x1f, 0x82, 0x92, 0x66, 0x11, + 0x3b, 0xb3, 0x57, 0xa1, 0x14, 0x8e, 0x04, 0x88, 0xdc, 0x59, 0x6d, 0x04, 0x40, 0x55, 0x28, 0xf6, + 0xb0, 0xeb, 0x1a, 0x67, 0x81, 0xfc, 0xe0, 0x55, 0xf9, 0x99, 0x04, 0x68, 0xdf, 0x74, 0x59, 0x6d, + 0x38, 0xb5, 0xc7, 0xfc, 0x92, 0xd1, 0x78, 0xa9, 0x63, 0xcb, 0x73, 0x4c, 0x56, 0xde, 0x14, 0x34, + 0xe8, 0x19, 0x2f, 0x55, 0x0a, 0xf1, 0x6b, 0x1a, 0xd7, 0x33, 0x1c, 0xcf, 0xb4, 0xce, 0x74, 0xcf, + 0x7e, 0x81, 0x2d, 0x76, 0x9c, 0xe6, 0x03, 0x68, 0xcb, 0x07, 0x2a, 0xbf, 0x95, 0x60, 0x21, 0x62, + 0x06, 0x5b, 0xd6, 0x3d, 0x28, 0x06, 0xb2, 0x69, 0x16, 0xba, 0x46, 0xec, 0x10, 0x90, 0xd6, 0xa8, + 0x13, 0x02, 0x72, 0xb4, 0x06, 0x60, 0xe1, 0x97, 0x1e, 0x53, 0x4a, 0x57, 0x5d, 0xf2, 0x21, 0x44, + 0xa1, 0x7c, 0x17, 0x0a, 0xd4, 0x15, 0x17, 0x6a, 0x0f, 0x7e, 0x99, 0x05, 0xb4, 0x8b, 0xbd, 0xb0, + 0x02, 0x9c, 0x72, 0x97, 0x12, 0x42, 0x37, 0x3b, 0x6d, 0xe8, 0xee, 0x46, 0x5a, 0x47, 0x1a, 0xf9, + 0xef, 0x05, 0x23, 0x90, 0x98, 0x71, 0x69, 0x9d, 0xe3, 0x6b, 0xb6, 0x6e, 0xca, 0x0e, 0x2c, 0x44, + 0x14, 0x32, 0x67, 0xbd, 0x0f, 0xc8, 0x38, 0x37, 0xcc, 0xae, 0x71, 0xd2, 0xa5, 0x2b, 0xf5, 0xb1, + 0xac, 0x86, 0xbd, 0x1c, 0x62, 0x02, 0x36, 0xe5, 0xbb, 0xb0, 0xc4, 0xdd, 0x26, 0x8e, 0x7d, 0x32, + 0x6d, 0x06, 0x57, 0x56, 0x60, 0x79, 0x4c, 0x02, 0x4b, 0x4c, 0xdf, 0xe3, 0x2f, 0x0a, 0x66, 0xec, + 0xab, 0x0e, 0x6b, 0x4c, 0x3e, 0x13, 0x8e, 0xc9, 0x62, 0x8b, 0xdf, 0x11, 0x0e, 0x6c, 0xd6, 0x63, + 0x57, 0x00, 0x9b, 0x8d, 0x24, 0xce, 0x6e, 0x7e, 0x93, 0x85, 0xd5, 0x14, 0x6a, 0x74, 0x0f, 0x72, + 0x4e, 0xbf, 0xcd, 0xcc, 0x7d, 0x77, 0x92, 0xf0, 0x9a, 0x76, 0x58, 0xdf, 0xcb, 0x68, 0x3e, 0x8b, + 0xfc, 0x67, 0x09, 0x72, 0xda, 0x61, 0x1d, 0x3d, 0x88, 0x8c, 0x70, 0xfe, 0xef, 0x22, 0x22, 0xf8, + 0x49, 0x8e, 0x2d, 0x9a, 0xe4, 0x54, 0x61, 0xb1, 0xae, 0xa9, 0x5b, 0x2d, 0x55, 0xdf, 0x51, 0xf7, + 0xd5, 0x96, 0xaa, 0x3f, 0x3d, 0xd8, 0x3f, 0x7e, 0xa2, 0x56, 0x24, 0xbf, 0x01, 0x3b, 0x3c, 0xde, + 0xde, 0x6f, 0x1c, 0xed, 0xe9, 0xc7, 0xcd, 0xe0, 0x89, 0x61, 0xb3, 0xa8, 0x02, 0x73, 0xfb, 0x8d, + 0xa3, 0x16, 0x03, 0x1c, 0x55, 0x72, 0x3e, 0x64, 0x57, 0x6d, 0xe9, 0xf5, 0xad, 0xc3, 0xad, 0x7a, + 0xa3, 0xf5, 0x69, 0x25, 0x1f, 0x4e, 0x83, 0xfe, 0x5a, 0x80, 0xa5, 0xa6, 0xdd, 0xc1, 0x47, 0x9e, + 0x71, 0xf6, 0x26, 0x9a, 0x8d, 0x83, 0x58, 0xd1, 0x43, 0x4f, 0xd7, 0x5d, 0x22, 0x49, 0xac, 0x37, + 0xbd, 0xd6, 0x41, 0x35, 0x58, 0x70, 0x3d, 0xe3, 0x8c, 0x24, 0x3e, 0xc3, 0x39, 0xc3, 0x9e, 0xde, + 0x37, 0xbc, 0xe7, 0xa4, 0xae, 0x2e, 0x69, 0x97, 0x19, 0xaa, 0x45, 0x30, 0x87, 0x86, 0xf7, 0x5c, + 0x5c, 0x85, 0x17, 0xa6, 0xab, 0xc2, 0x5f, 0xc0, 0x12, 0xa9, 0x5a, 0x7c, 0xe9, 0xa2, 0x51, 0xd0, + 0x87, 0x69, 0xcb, 0x09, 0xc1, 0x63, 0xd5, 0xc7, 0xa2, 0x25, 0x40, 0xa1, 0x1f, 0x25, 0x17, 0xd2, + 0xdf, 0x4a, 0xd3, 0x73, 0xd1, 0xdb, 0xf3, 0x35, 0x8b, 0x45, 0x79, 0x17, 0x56, 0x12, 0x97, 0xf4, + 0xf6, 0x0b, 0xef, 0x15, 0x58, 0x1e, 0xdb, 0x0f, 0x96, 0xab, 0xfe, 0x99, 0x85, 0xaa, 0x8f, 0x3b, + 0xb6, 0xdc, 0x37, 0x14, 0xdc, 0x09, 0xb1, 0x98, 0x4b, 0x8a, 0x45, 0x17, 0xaa, 0x24, 0x8e, 0x06, + 0xd6, 0x78, 0x24, 0xe5, 0xb9, 0x56, 0x29, 0xc9, 0x6a, 0x1e, 0x31, 0x16, 0x4d, 0x24, 0x44, 0xc7, + 0x91, 0x72, 0x03, 0x56, 0x53, 0xd8, 0xa6, 0xda, 0xec, 0x55, 0xea, 0xfa, 0x98, 0x69, 0x6c, 0xbb, + 0x7f, 0x3e, 0x43, 0xb7, 0xfb, 0xcd, 0x75, 0xda, 0x9f, 0x08, 0x73, 0x49, 0x2d, 0xdc, 0x32, 0x61, + 0x5f, 0xf9, 0xcd, 0x66, 0x93, 0xeb, 0x50, 0xe6, 0xe9, 0x0a, 0x84, 0x0e, 0xbc, 0x09, 0xe9, 0x66, + 0xe6, 0xd5, 0x9b, 0xfe, 0x62, 0xac, 0xe9, 0x0f, 0x42, 0x48, 0xd4, 0x1e, 0xcd, 0xc6, 0x42, 0x48, + 0xb8, 0x1f, 0x1c, 0x42, 0x1c, 0x42, 0x82, 0xde, 0xfe, 0x0b, 0x51, 0x4a, 0x2a, 0x11, 0x6d, 0x1f, + 0xa4, 0x6b, 0x7b, 0x5b, 0x49, 0x89, 0x05, 0xf9, 0xff, 0xcc, 0x3c, 0x80, 0x9d, 0x14, 0x61, 0x33, + 0xaf, 0xfc, 0x23, 0x0b, 0x32, 0x3d, 0x47, 0x6f, 0xae, 0xd1, 0x8e, 0x05, 0x6a, 0x6e, 0x2c, 0x50, + 0x7f, 0x02, 0x32, 0xcb, 0x45, 0xc9, 0x9d, 0xf6, 0x03, 0x2e, 0x1b, 0xf5, 0x93, 0x82, 0x29, 0xb9, + 0xbb, 0xae, 0x5a, 0x09, 0x68, 0xf9, 0x31, 0xac, 0xa5, 0xb2, 0x4e, 0xb5, 0xd7, 0x6b, 0x41, 0x82, + 0x13, 0xf7, 0xd2, 0x1f, 0x41, 0xc5, 0x47, 0xef, 0x62, 0xaf, 0xd1, 0x99, 0xb6, 0x44, 0xbd, 0x0b, + 0x97, 0x39, 0x5e, 0x56, 0x92, 0x72, 0x33, 0x0c, 0x89, 0x9f, 0x61, 0x04, 0x9a, 0x5e, 0xa9, 0xe6, + 0x5e, 0xa0, 0x9a, 0xa2, 0xd5, 0xf6, 0x0e, 0x8d, 0x93, 0xd7, 0xac, 0xb3, 0x3f, 0xa7, 0xfb, 0x93, + 0x54, 0x61, 0x3f, 0x8c, 0x55, 0xd8, 0xb4, 0x21, 0x94, 0x47, 0xa5, 0xc6, 0x84, 0xda, 0xfa, 0x6f, + 0x12, 0x5c, 0x11, 0xd2, 0xa1, 0x0d, 0xbe, 0xaa, 0xbe, 0x96, 0x2c, 0x90, 0xaf, 0xa7, 0x7b, 0xb4, + 0x9c, 0xfe, 0x4e, 0xa4, 0x9c, 0xbe, 0x99, 0xce, 0xcb, 0x17, 0xd2, 0xef, 0x27, 0x14, 0xd2, 0x47, + 0xad, 0xad, 0x5d, 0x55, 0x3f, 0x6e, 0xd2, 0xdf, 0xa0, 0x90, 0x0e, 0xca, 0xe0, 0x8d, 0x5f, 0x67, + 0x61, 0xb6, 0x41, 0x42, 0xd0, 0x1b, 0xa2, 0xcf, 0xc9, 0x57, 0xfa, 0xb1, 0xff, 0x13, 0xa0, 0xf5, + 0xa0, 0x27, 0x4c, 0xfa, 0x27, 0x82, 0x7c, 0x23, 0x85, 0x82, 0xf9, 0x34, 0x83, 0xf6, 0x60, 0x3e, + 0xf2, 0x69, 0x1d, 0xad, 0x88, 0x3e, 0xb7, 0x53, 0x81, 0x72, 0xf2, 0x97, 0x78, 0x25, 0x83, 0xbe, + 0xe0, 0xfe, 0x0d, 0x10, 0xe9, 0x68, 0x6f, 0x44, 0xd9, 0x04, 0xd1, 0x23, 0x2b, 0x69, 0x24, 0x81, + 0x86, 0x8d, 0x3f, 0xcc, 0x00, 0x8c, 0xda, 0x18, 0xa4, 0xc2, 0x1c, 0xff, 0x31, 0x10, 0x55, 0x93, + 0xbe, 0x81, 0xca, 0x2b, 0x02, 0x4c, 0x68, 0xb7, 0x0a, 0x73, 0xfc, 0xc8, 0x9e, 0x89, 0x11, 0x7c, + 0x6a, 0x60, 0x62, 0x84, 0xf3, 0xfd, 0x0c, 0x3a, 0x8d, 0xf4, 0xa9, 0xfc, 0xe1, 0x47, 0x37, 0x2f, + 0x30, 0x72, 0x96, 0xdf, 0xbd, 0xc8, 0xe8, 0x55, 0xc9, 0xa0, 0x2e, 0xac, 0x24, 0x8e, 0xec, 0xd0, + 0xad, 0x0b, 0x4d, 0x23, 0xe5, 0xdb, 0x93, 0xc8, 0x42, 0x6d, 0x36, 0xc8, 0xc9, 0x83, 0x29, 0x74, + 0xfb, 0x62, 0xb3, 0x34, 0xf9, 0xbd, 0x89, 0x74, 0xa1, 0xc2, 0x6d, 0x28, 0x73, 0x83, 0x1f, 0xb4, + 0x3c, 0x3e, 0x0a, 0xa2, 0x22, 0xab, 0x49, 0x33, 0x22, 0x2a, 0x83, 0x1b, 0x5d, 0x30, 0x19, 0xe3, + 0xd3, 0x13, 0x26, 0x43, 0x30, 0xe5, 0x50, 0x32, 0xa8, 0x09, 0xef, 0xc4, 0xc6, 0x0e, 0x68, 0x35, + 0xee, 0x21, 0x2e, 0xb5, 0xca, 0x57, 0xc5, 0x48, 0xb1, 0xdb, 0x62, 0xd9, 0x6f, 0xcc, 0x6d, 0xe2, + 0x1c, 0x3b, 0xe6, 0xb6, 0x84, 0x24, 0xaa, 0x64, 0x36, 0xfe, 0x92, 0x87, 0xbc, 0x9f, 0xa1, 0xfc, + 0x65, 0xc4, 0x3a, 0x12, 0xb6, 0x0c, 0x71, 0xdf, 0xc6, 0x96, 0x91, 0xd4, 0xc4, 0x64, 0x50, 0x8b, + 0xde, 0x0c, 0x91, 0xa2, 0x1b, 0xad, 0xa5, 0xf6, 0x09, 0xf2, 0xb5, 0x24, 0x74, 0x5c, 0x6a, 0xf4, + 0xd4, 0xac, 0xa5, 0x16, 0x73, 0x9c, 0xd4, 0xa4, 0x93, 0xf2, 0x19, 0x2c, 0x08, 0xae, 0x62, 0x74, + 0x7d, 0x42, 0x1d, 0x21, 0xaf, 0x27, 0x13, 0x84, 0xb2, 0x3f, 0x86, 0x52, 0x78, 0x17, 0xa3, 0x2b, + 0x21, 0x03, 0x7f, 0xaf, 0xcb, 0x4b, 0x71, 0x70, 0x9c, 0x9b, 0x86, 0xd5, 0x88, 0x3b, 0x12, 0x50, + 0x4b, 0x71, 0x70, 0x7c, 0x5d, 0xf1, 0x20, 0xba, 0xce, 0xab, 0x13, 0x85, 0xcf, 0x7a, 0x32, 0x41, + 0x20, 0xfb, 0x64, 0x86, 0xfc, 0xd1, 0xed, 0x83, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x53, 0x2b, + 0xe1, 0xef, 0xf5, 0x26, 0x00, 0x00, } diff --git a/spec.md b/spec.md index c739c9b9..b4047773 100644 --- a/spec.md +++ b/spec.md @@ -182,6 +182,34 @@ Figure 4: The lifecycle of a dynamically provisioned volume, from creation to destruction. ``` +``` + CreateVolume +------------+ DeleteVolume + +------------->| CREATED +--------------+ + | +---+----+---+ | + | Controller | | Controller v ++++ Publish | | Unpublish +++ +|X| Volume | | Volume | | ++-+ +---v----+---+ +-+ + | NODE_READY | + +---+----^---+ + Node | | Node + Stage | | Unstage + Volume | | Volume + +---v----+---+ + | VOL_READY | + +------------+ + Node | | Node + Publish | | Unpublish + Volume | | Volume + +---v----+---+ + | PUBLISHED | + +------------+ + +Figure 5: The lifecycle of a dynamically provisioned volume, from +creation to destruction, when the Node Plugin advertises the +STAGE_UNSTAGE_VOLUME capability. +``` + ``` Controller Controller Publish Unpublish @@ -199,7 +227,7 @@ creation to destruction. Volume Capabilities -Figure 5: The lifecycle of a pre-provisioned volume that requires +Figure 6: The lifecycle of a pre-provisioned volume that requires controller to publish to a node (`ControllerPublishVolume`) prior to publishing on the node (`NodePublishVolume`). ``` @@ -216,7 +244,7 @@ Publish | | Unpublish | PUBLISHED | +------------+ -Figure 6: Plugins may forego other lifecycle steps by contraindicating +Figure 7: Plugins may forego other lifecycle steps by contraindicating them via the capabilities API. Interactions with the volumes of such plugins is reduced to `NodePublishVolume` and `NodeUnpublishVolume` calls. @@ -293,6 +321,12 @@ service Controller { } service Node { + rpc NodeStageVolume (NodeStageVolumeRequest) + returns (NodeStageVolumeResponse) {} + + rpc NodeUnstageVolume (NodeUnstageVolumeRequest) + returns (NodeUnstageVolumeResponse) {} + rpc NodePublishVolume (NodePublishVolumeRequest) returns (NodePublishVolumeResponse) {} @@ -806,7 +840,8 @@ message ControllerPublishVolumeRequest { message ControllerPublishVolumeResponse { // The SP specific information that will be passed to the Plugin in - // the subsequent `NodePublishVolume` call for the given volume. + // the subsequent `NodeStageVolume` or `NodePublishVolume` calls + // for the given volume. // This information is opaque to the CO. This field is OPTIONAL. map publish_info = 1; } @@ -832,7 +867,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t Controller Plugin MUST implement this RPC call if it has `PUBLISH_UNPUBLISH_VOLUME` controller capability. This RPC is a reverse operation of `ControllerPublishVolume`. -It MUST be called after `NodeUnpublishVolume` on the volume is called and succeeds. +It MUST be called after all `NodeUnstageVolume` and `NodeUnpublishVolume` on the volume are called and succeed. The Plugin SHOULD perform the work that is necessary for making the volume ready to be consumed by a different node. The Plugin MUST NOT assume that this RPC will be executed on the node where the volume was previously used. @@ -1114,6 +1149,153 @@ It is NOT REQUIRED for a controller plugin to implement the `LIST_VOLUMES` capab ### Node Service RPC +#### `NodeStageVolume` + +A Node Plugin MUST implement this RPC call if it has `STAGE_UNSTAGE_VOLUME` node capability. + +This RPC is called by the CO prior to the volume being consumed by any workloads on the node by `NodePublishVolume`. +The Plugin SHALL assume that this RPC will be executed on the node where the volume will be used. +This RPC SHOULD be called by the CO when a workload that wants to use the specified volume is placed (scheduled) on the specified node for the first time or for the first time since a `NodeUnstageVolume` call for the specified volume was called and returned success on that node. + +If the corresponding Controller Plugin has `PUBLISH_UNPUBLISH_VOLUME` controller capability and the Node Plugin has `STAGE_UNSTAGE_VOLUME` capability, then the CO MUST guarantee that this RPC is called after `ControllerPublishVolume` is called for the given volume on the given node and returns a success. +The CO MUST guarantee that this RPC is called and returns a success before any `NodePublishVolume` is called for the given volume on the given node. + +This operation MUST be idempotent. +If the volume corresponding to the `volume_id` is already staged to the `staging_target_path`, and is identical to the specified `volume_capability` the Plugin MUST reply `0 OK`. + +If this RPC failed, or the CO does not know if it failed or not, it MAY choose to call `NodeStageVolume` again, or choose to call `NodeUnstageVolume`. + +```protobuf +message NodeStageVolumeRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; + + // The ID of the volume to publish. This field is REQUIRED. + string volume_id = 2; + + // The CO SHALL set this field to the value returned by + // `ControllerPublishVolume` if the corresponding Controller Plugin + // has `PUBLISH_UNPUBLISH_VOLUME` controller capability, and SHALL be + // left unset if the corresponding Controller Plugin does not have + // this capability. This is an OPTIONAL field. + map publish_info = 3; + + // The path to which the volume will be published. It MUST be an + // absolute path in the root filesystem of the process serving this + // request. The CO SHALL ensure that there is only one + // staging_target_path per volume. + // This is a REQUIRED field. + string staging_target_path = 4; + + // The capability of the volume the CO expects the volume to have. + // This is a REQUIRED field. + VolumeCapability volume_capability = 5; + + // Credentials used by Node plugin to authenticate/authorize node + // stage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + map node_stage_credentials = 6; + + // Attributes of the volume to publish. This field is OPTIONAL and + // MUST match the attributes of the VolumeInfo identified by + // `volume_id`. + map volume_attributes = 7; +} + +message NodeStageVolumeResponse {} +``` + +#### NodeStageVolume Errors + +If the plugin is unable to complete the NodeStageVolume call successfully, it MUST return a non-ok gRPC code in the gRPC status. +If the conditions defined below are encountered, the plugin MUST return the specified gRPC error code. +The CO MUST implement the specified error recovery behavior when it encounters the gRPC error code. + +| Condition | gRPC Code | Description | Recovery Behavior | +|-----------|-----------|-------------|-------------------| +| Volume does not exist | 5 NOT_FOUND | Indicates that a volume corresponding to the specified `volume_id` does not exist. | Caller MUST verify that the `volume_id` is correct and that the volume is accessible and has not been deleted before retrying with exponential back off. | +| Volume published but is incompatible | 6 ALREADY_EXISTS | Indicates that a volume corresponding to the specified `volume_id` has already been published at the specified `staging_target_path` but is incompatible with the specified `volume_capability` flag. | Caller MUST fix the arguments before retying. | +| Operation pending for volume | 10 ABORTED | Indicates that there is a already an operation pending for the specified volume. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per volume 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 volume. 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 volume, and then retry with exponential back off. | +| Exceeds capabilities | 10 FAILED_PRECONDITION | Indicates that the CO has exceeded the volume's capabilities because the volume does not have MULTI_NODE capability. | Caller MAY choose to call `ValidateVolumeCapabilities` to validate the volume capabilities, or wait for the volume to be unpublished on the node. | + +#### `NodeUnstageVolume` + +A Node Plugin MUST implement this RPC call if it has `STAGE_UNSTAGE_VOLUME` node capability. + +This RPC is a reverse operation of `NodeStageVolume`. +This RPC MUST undo the work by the corresponding `NodeStageVolume`. +This RPC SHALL be called by the CO once for each `staging_target_path` that was successfully setup via `NodeStageVolume`. + +If the corresponding Controller Plugin has `PUBLISH_UNPUBLISH_VOLUME` controller capability and the Node Plugin has `STAGE_UNSTAGE_VOLUME` capability, the CO MUST guarantee that this RPC is called and returns success before calling `ControllerUnpublishVolume` for the given node and the given volume. +The CO MUST guarantee that this RPC is called after all `NodeUnpublishVolume` have been called and returned success for the given volume on the given node. + +The Plugin SHALL assume that this RPC will be executed on the node where the volume is being used. + +This RPC MAY be called by the CO when the workload using the volume is being moved to a different node, or all the workloads using the volume on a node have finished. + +This operation MUST be idempotent. +If the volume corresponding to the `volume_id` is not staged to the `staging_target_path`, the Plugin MUST reply `0 OK`. + +If this RPC failed, or the CO does not know if it failed or not, it MAY choose to call `NodeUnstageVolume` again. + +```protobuf +message NodeUnstageVolumeRequest { + // The API version assumed by the CO. This is a REQUIRED field. + Version version = 1; + + // The ID of the volume. This field is REQUIRED. + string volume_id = 2; + + // The path at which the volume was published. It MUST be an absolute + // path in the root filesystem of the process serving this request. + // This is a REQUIRED field. + string staging_target_path = 3; + + // Credentials used by Node plugin to authenticate/authorize node + // unstage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + map node_unstage_credentials = 4; +} + +message NodeUnstageVolumeResponse {} +``` + +#### NodeUnstageVolume Errors + +If the plugin is unable to complete the NodeUnstageVolume call successfully, it MUST return a non-ok gRPC code in the gRPC status. +If the conditions defined below are encountered, the plugin MUST return the specified gRPC error code. +The CO MUST implement the specified error recovery behavior when it encounters the gRPC error code. + +| Condition | gRPC Code | Description | Recovery Behavior | +|-----------|-----------|-------------|-------------------| +| Volume does not exists | 5 NOT_FOUND | Indicates that a volume corresponding to the specified `volume_id` does not exist. | Caller MUST verify that the `volume_id` is correct and that the volume is accessible and has not been deleted before retrying with exponential back off. | +| Operation pending for volume | 10 ABORTED | Indicates that there is a already an operation pending for the specified volume. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per volume 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 volume. 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 volume, and then retry with exponential back off. | + +#### RPC Interactions and Reference Counting +`NodeStageVolume`, `NodeUnstageVolume`, `NodePublishVolume`, `NodeUnpublishVolume` + +The following interaction semantics ARE REQUIRED if the plugin advertises the `STAGE_UNSTAGE_VOLUME` capability. +`NodeStageVolume` MUST be called and return success once per volume per node before any `NodePublishVolume` MAY be called for the volume. +All `NodeUnpublishVolume` MUST be called and return success for a volume before `NodeUnstageVolume` MAY be called for the volume. + +Note that this requires that all COs MUST support reference counting of volumes so that if `STAGE_UNSTAGE_VOLUME` is advertised by the SP, the CO MUST fufill the above interaction semantics. + #### `NodePublishVolume` This RPC is called by the CO when a workload that wants to use the specified volume is placed (scheduled) on a node. @@ -1151,21 +1333,29 @@ message NodePublishVolumeRequest { // this capability. This is an OPTIONAL field. map publish_info = 3; + // The path to which the device was mounted by `NodeStageVolume`. + // It MUST be an absolute path in the root filesystem of the process + // serving this request. + // It MUST be set if the Node Plugin implements the + // `STAGE_UNSTAGE_VOLUME` node capability. + // This is an OPTIONAL field. + string staging_target_path = 4; + // The path to which the volume will be published. It MUST be an // absolute path in the root filesystem of the process serving this // request. The CO SHALL ensure uniqueness of target_path per volume. // The CO SHALL ensure that the path exists, and that the process // serving the request has `read` and `write` permissions to the path. // This is a REQUIRED field. - string target_path = 4; + string target_path = 5; // The capability of the volume the CO expects the volume to have. // This is a REQUIRED field. - VolumeCapability volume_capability = 5; + VolumeCapability volume_capability = 6; // Whether to publish the volume in readonly mode. This field is // REQUIRED. - bool readonly = 6; + bool readonly = 7; // Credentials used by Node plugin to authenticate/authorize node // publish request. @@ -1178,12 +1368,13 @@ message NodePublishVolumeRequest { // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - map node_publish_credentials = 7; + map node_publish_credentials = 8; + // Attributes of the volume to publish. This field is OPTIONAL and // MUST match the attributes of the Volume identified by // `volume_id`. - map volume_attributes = 8; + map volume_attributes = 9; } message NodePublishVolumeResponse {} @@ -1201,6 +1392,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Volume published but is incompatible | 6 ALREADY_EXISTS | Indicates that a volume corresponding to the specified `volume_id` has already been published at the specified `target_path` but is incompatible with the specified `volume_capability` or `readonly` flag. | Caller MUST fix the arguments before retying. | | Operation pending for volume | 10 ABORTED | Indicates that there is a already an operation pending for the specified volume. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per volume 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 volume. 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 volume, and then retry with exponential back off. | | Exceeds capabilities | 10 FAILED_PRECONDITION | Indicates that the CO has exceeded the volume's capabilities because the volume does not have MULTI_NODE capability. | Caller MAY choose to call `ValidateVolumeCapabilities` to validate the volume capabilities, or wait for the volume to be unpublished on the node. | +| Stanging target path not set | 10 FAILED_PRECONDITION | Indicates that `STAGE_UNSTAGE_VOLUME` capability is set but no `staging_target_path` was set. | Caller MUST make sure call to `NodeStageVolume` is made and returns success before retrying with valid `staging_target_path`. | #### `NodeUnpublishVolume` @@ -1342,6 +1534,7 @@ message NodeServiceCapability { message RPC { enum Type { UNKNOWN = 0; + STAGE_UNSTAGE_VOLUME = 1; } Type type = 1;