diff --git a/csi.proto b/csi.proto index e449e336..7fd4f1dc 100644 --- a/csi.proto +++ b/csi.proto @@ -38,6 +38,12 @@ service Controller { } service Node { + rpc NodePublishDevice (NodePublishDeviceRequest) + returns (NodePublishDeviceResponse) {} + + rpc NodeUnpublishDevice (NodeUnpublishDeviceRequest) + returns (NodeUnpublishDeviceResponse) {} + rpc NodePublishVolume (NodePublishVolumeRequest) returns (NodePublishVolumeResponse) {} @@ -344,7 +350,8 @@ message ControllerPublishVolumeRequest { message ControllerPublishVolumeResponse { message Result { // The SP specific information that will be passed to the Plugin in - // the subsequent `NodePublishVolume` call for the given volume. + // the subsequent `NodePublishDevice` and `NodePublishVolume` calls + // for the given volume. // This information is opaque to the CO. This field is OPTIONAL. PublishVolumeInfo publish_volume_info = 1; } @@ -561,6 +568,71 @@ message ControllerServiceCapability { } //////// //////// +message NodePublishDeviceRequest { + // 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. + PublishVolumeInfo publish_volume_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 uniqueness of global_target_path per + // volume. + // This is a REQUIRED field. + string global_target_path = 4; + + // The capability of the volume the CO expects the volume to have. + // This is a REQUIRED field. + VolumeCapability volume_capability = 5; +} + +message NodePublishDeviceResponse { + message Result {} + + // One of the following fields MUST be specified. + oneof reply { + Result result = 1; + Error error = 2; + } +} +//////// +//////// +message NodeUnpublishDeviceRequest { + // 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 global_target_path = 3; + + // End user credentials used to authenticate/authorize node unpublish + // request. This field is OPTIONAL. + Credentials user_credentials = 4; +} + +message NodeUnpublishDeviceResponse { + message Result {} + + // One of the following fields MUST be specified. + oneof reply { + Result result = 1; + Error error = 2; + } +} +//////// +//////// message NodePublishVolumeRequest { // The API version assumed by the CO. This is a REQUIRED field. Version version = 1; @@ -575,23 +647,29 @@ message NodePublishVolumeRequest { // this capability. This is an OPTIONAL field. PublishVolumeInfo publish_volume_info = 3; + // The path to which the device was mounted by `NodePublishDevice`. + // It MUST be an absolute path in the root filesystem of the process + // serving this request. + // This is an OPTIONAL field. + string global_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. // 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; // End user credentials used to authenticate/authorize node publish // request. This field is OPTIONAL. - Credentials user_credentials = 7; + Credentials user_credentials = 8; } message NodePublishVolumeResponse { @@ -612,14 +690,20 @@ message NodeUnpublishVolumeRequest { // The handle of the volume. This field is REQUIRED. VolumeHandle volume_handle = 2; + // The path to which the device was mounted by `NodePublishDevice`. + // It MUST be an absolute path in the root filesystem of the process + // serving this request. + // This is an OPTIONAL field. + string global_target_path = 3; + // 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 target_path = 3; + string target_path = 4; // End user credentials used to authenticate/authorize node unpublish // request. This field is OPTIONAL. - Credentials user_credentials = 4; + Credentials user_credentials = 5; } message NodeUnpublishVolumeResponse { @@ -695,6 +779,7 @@ message NodeServiceCapability { message RPC { enum Type { UNKNOWN = 0; + PUBLISH_UNPUBLISH_DEVICE = 1; } Type type = 1; @@ -1141,6 +1226,111 @@ message Error { string error_description = 2; } + // `NodePublishDevice` specific error. + message NodePublishDeviceError { + enum NodePublishDeviceErrorCode { + // Default value for backwards compatibility. SHOULD NOT be + // returned by Plugins. However, if a Plugin returns a + // `NodePublishDeviceErrorCode` code that an older CSI + // client is not aware of, the client will see this code (the + // default fallback). + // + // Recovery behavior: Caller SHOULD consider updating CSI client + // to match Plugin CSI version. + UNKNOWN = 0; + + // 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. + // + // Recovery behavior: Caller SHOULD ensure that there are no other + // calls pending for the specified volume, and then retry with + // exponential back off. + OPERATION_PENDING_FOR_VOLUME = 1; + + // Indicates that a volume corresponding to the specified + // volume ID does not exist. + // + // Recovery behavior: Caller SHOULD 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_DOES_NOT_EXIST = 2; + + UNSUPPORTED_MOUNT_FLAGS = 3; + UNSUPPORTED_VOLUME_TYPE = 4; + UNSUPPORTED_FS_TYPE = 5; + MOUNT_ERROR = 6; + + // Indicates that the specified volume ID is not allowed or + // understood by the Plugin. More human-readable information MAY + // be provided in the `error_description` field. + // + // Recovery behavior: Caller MUST fix the volume ID before + // retrying. + INVALID_VOLUME_ID = 7; + } + + NodePublishDeviceErrorCode error_code = 1; + string error_description = 2; + } + + // `NodeUnpublishDevice` specific error. + message NodeUnpublishDeviceError { + enum NodeUnpublishDeviceErrorCode { + // Default value for backwards compatibility. SHOULD NOT be + // returned by Plugins. However, if a Plugin returns a + // `NodeUnpublishDeviceErrorCode` code that an older CSI + // client is not aware of, the client will see this code (the + // default fallback). + // + // Recovery behavior: Caller SHOULD consider updating CSI client + // to match Plugin CSI version. + UNKNOWN = 0; + + // 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. + // + // Recovery behavior: Caller SHOULD ensure that there are no other + // calls pending for the specified volume, and then retry with + // exponential back off. + OPERATION_PENDING_FOR_VOLUME = 1; + + // Indicates that a volume corresponding to the specified + // volume ID does not exist. + // + // Recovery behavior: Caller SHOULD 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_DOES_NOT_EXIST = 2; + + UNMOUNT_ERROR = 3; + + // Indicates that the specified volume ID is not allowed or + // understood by the Plugin. More human-readable information MAY + // be provided in the `error_description` field. + // + // Recovery behavior: Caller MUST fix the volume ID before + // retrying. + INVALID_VOLUME_ID = 4; + } + + NodeUnpublishDeviceErrorCode error_code = 1; + string error_description = 2; + } + // `NodePublishVolume` specific error. message NodePublishVolumeError { enum NodePublishVolumeErrorCode { diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index d6f99f91..bdd0c230 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -37,6 +37,10 @@ It has these top-level messages: ControllerGetCapabilitiesRequest ControllerGetCapabilitiesResponse ControllerServiceCapability + NodePublishDeviceRequest + NodePublishDeviceResponse + NodeUnpublishDeviceRequest + NodeUnpublishDeviceResponse NodePublishVolumeRequest NodePublishVolumeResponse NodeUnpublishVolumeRequest @@ -149,21 +153,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_PUBLISH_UNPUBLISH_DEVICE NodeServiceCapability_RPC_Type = 1 ) var NodeServiceCapability_RPC_Type_name = map[int32]string{ 0: "UNKNOWN", + 1: "PUBLISH_UNPUBLISH_DEVICE", } var NodeServiceCapability_RPC_Type_value = map[string]int32{ - "UNKNOWN": 0, + "UNKNOWN": 0, + "PUBLISH_UNPUBLISH_DEVICE": 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{39, 0, 0} + return fileDescriptor0, []int{43, 0, 0} } type Error_GeneralError_GeneralErrorCode int32 @@ -221,7 +228,7 @@ func (x Error_GeneralError_GeneralErrorCode) String() string { return proto.EnumName(Error_GeneralError_GeneralErrorCode_name, int32(x)) } func (Error_GeneralError_GeneralErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 0, 0} + return fileDescriptor0, []int{44, 0, 0} } type Error_CreateVolumeError_CreateVolumeErrorCode int32 @@ -319,7 +326,7 @@ func (x Error_CreateVolumeError_CreateVolumeErrorCode) String() string { return proto.EnumName(Error_CreateVolumeError_CreateVolumeErrorCode_name, int32(x)) } func (Error_CreateVolumeError_CreateVolumeErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 1, 0} + return fileDescriptor0, []int{44, 1, 0} } type Error_DeleteVolumeError_DeleteVolumeErrorCode int32 @@ -388,7 +395,7 @@ func (x Error_DeleteVolumeError_DeleteVolumeErrorCode) String() string { return proto.EnumName(Error_DeleteVolumeError_DeleteVolumeErrorCode_name, int32(x)) } func (Error_DeleteVolumeError_DeleteVolumeErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 2, 0} + return fileDescriptor0, []int{44, 2, 0} } type Error_ControllerPublishVolumeError_ControllerPublishVolumeErrorCode int32 @@ -514,7 +521,7 @@ func (x Error_ControllerPublishVolumeError_ControllerPublishVolumeErrorCode) Str return proto.EnumName(Error_ControllerPublishVolumeError_ControllerPublishVolumeErrorCode_name, int32(x)) } func (Error_ControllerPublishVolumeError_ControllerPublishVolumeErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 3, 0} + return fileDescriptor0, []int{44, 3, 0} } type Error_ControllerUnpublishVolumeError_ControllerUnpublishVolumeErrorCode int32 @@ -614,7 +621,7 @@ func (x Error_ControllerUnpublishVolumeError_ControllerUnpublishVolumeErrorCode) return proto.EnumName(Error_ControllerUnpublishVolumeError_ControllerUnpublishVolumeErrorCode_name, int32(x)) } func (Error_ControllerUnpublishVolumeError_ControllerUnpublishVolumeErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 4, 0} + return fileDescriptor0, []int{44, 4, 0} } type Error_ValidateVolumeCapabilitiesError_ValidateVolumeCapabilitiesErrorCode int32 @@ -669,7 +676,146 @@ func (x Error_ValidateVolumeCapabilitiesError_ValidateVolumeCapabilitiesErrorCod return proto.EnumName(Error_ValidateVolumeCapabilitiesError_ValidateVolumeCapabilitiesErrorCode_name, int32(x)) } func (Error_ValidateVolumeCapabilitiesError_ValidateVolumeCapabilitiesErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 5, 0} + return fileDescriptor0, []int{44, 5, 0} +} + +type Error_NodePublishDeviceError_NodePublishDeviceErrorCode int32 + +const ( + // Default value for backwards compatibility. SHOULD NOT be + // returned by Plugins. However, if a Plugin returns a + // `NodePublishDeviceErrorCode` code that an older CSI + // client is not aware of, the client will see this code (the + // default fallback). + // + // Recovery behavior: Caller SHOULD consider updating CSI client + // to match Plugin CSI version. + Error_NodePublishDeviceError_UNKNOWN Error_NodePublishDeviceError_NodePublishDeviceErrorCode = 0 + // 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. + // + // Recovery behavior: Caller SHOULD ensure that there are no other + // calls pending for the specified volume, and then retry with + // exponential back off. + Error_NodePublishDeviceError_OPERATION_PENDING_FOR_VOLUME Error_NodePublishDeviceError_NodePublishDeviceErrorCode = 1 + // Indicates that a volume corresponding to the specified + // volume ID does not exist. + // + // Recovery behavior: Caller SHOULD verify that the volume ID + // is correct and that the volume is accessible and has not been + // deleted before retrying with exponential back off. + Error_NodePublishDeviceError_VOLUME_DOES_NOT_EXIST Error_NodePublishDeviceError_NodePublishDeviceErrorCode = 2 + Error_NodePublishDeviceError_UNSUPPORTED_MOUNT_FLAGS Error_NodePublishDeviceError_NodePublishDeviceErrorCode = 3 + Error_NodePublishDeviceError_UNSUPPORTED_VOLUME_TYPE Error_NodePublishDeviceError_NodePublishDeviceErrorCode = 4 + Error_NodePublishDeviceError_UNSUPPORTED_FS_TYPE Error_NodePublishDeviceError_NodePublishDeviceErrorCode = 5 + Error_NodePublishDeviceError_MOUNT_ERROR Error_NodePublishDeviceError_NodePublishDeviceErrorCode = 6 + // Indicates that the specified volume ID is not allowed or + // understood by the Plugin. More human-readable information MAY + // be provided in the `error_description` field. + // + // Recovery behavior: Caller MUST fix the volume ID before + // retrying. + Error_NodePublishDeviceError_INVALID_VOLUME_ID Error_NodePublishDeviceError_NodePublishDeviceErrorCode = 7 +) + +var Error_NodePublishDeviceError_NodePublishDeviceErrorCode_name = map[int32]string{ + 0: "UNKNOWN", + 1: "OPERATION_PENDING_FOR_VOLUME", + 2: "VOLUME_DOES_NOT_EXIST", + 3: "UNSUPPORTED_MOUNT_FLAGS", + 4: "UNSUPPORTED_VOLUME_TYPE", + 5: "UNSUPPORTED_FS_TYPE", + 6: "MOUNT_ERROR", + 7: "INVALID_VOLUME_ID", +} +var Error_NodePublishDeviceError_NodePublishDeviceErrorCode_value = map[string]int32{ + "UNKNOWN": 0, + "OPERATION_PENDING_FOR_VOLUME": 1, + "VOLUME_DOES_NOT_EXIST": 2, + "UNSUPPORTED_MOUNT_FLAGS": 3, + "UNSUPPORTED_VOLUME_TYPE": 4, + "UNSUPPORTED_FS_TYPE": 5, + "MOUNT_ERROR": 6, + "INVALID_VOLUME_ID": 7, +} + +func (x Error_NodePublishDeviceError_NodePublishDeviceErrorCode) String() string { + return proto.EnumName(Error_NodePublishDeviceError_NodePublishDeviceErrorCode_name, int32(x)) +} +func (Error_NodePublishDeviceError_NodePublishDeviceErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{44, 6, 0} +} + +type Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode int32 + +const ( + // Default value for backwards compatibility. SHOULD NOT be + // returned by Plugins. However, if a Plugin returns a + // `NodeUnpublishDeviceErrorCode` code that an older CSI + // client is not aware of, the client will see this code (the + // default fallback). + // + // Recovery behavior: Caller SHOULD consider updating CSI client + // to match Plugin CSI version. + Error_NodeUnpublishDeviceError_UNKNOWN Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode = 0 + // 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. + // + // Recovery behavior: Caller SHOULD ensure that there are no other + // calls pending for the specified volume, and then retry with + // exponential back off. + Error_NodeUnpublishDeviceError_OPERATION_PENDING_FOR_VOLUME Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode = 1 + // Indicates that a volume corresponding to the specified + // volume ID does not exist. + // + // Recovery behavior: Caller SHOULD verify that the volume ID + // is correct and that the volume is accessible and has not been + // deleted before retrying with exponential back off. + Error_NodeUnpublishDeviceError_VOLUME_DOES_NOT_EXIST Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode = 2 + Error_NodeUnpublishDeviceError_UNMOUNT_ERROR Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode = 3 + // Indicates that the specified volume ID is not allowed or + // understood by the Plugin. More human-readable information MAY + // be provided in the `error_description` field. + // + // Recovery behavior: Caller MUST fix the volume ID before + // retrying. + Error_NodeUnpublishDeviceError_INVALID_VOLUME_ID Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode = 4 +) + +var Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode_name = map[int32]string{ + 0: "UNKNOWN", + 1: "OPERATION_PENDING_FOR_VOLUME", + 2: "VOLUME_DOES_NOT_EXIST", + 3: "UNMOUNT_ERROR", + 4: "INVALID_VOLUME_ID", +} +var Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode_value = map[string]int32{ + "UNKNOWN": 0, + "OPERATION_PENDING_FOR_VOLUME": 1, + "VOLUME_DOES_NOT_EXIST": 2, + "UNMOUNT_ERROR": 3, + "INVALID_VOLUME_ID": 4, +} + +func (x Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode) String() string { + return proto.EnumName(Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode_name, int32(x)) +} +func (Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{44, 7, 0} } type Error_NodePublishVolumeError_NodePublishVolumeErrorCode int32 @@ -743,7 +889,7 @@ func (x Error_NodePublishVolumeError_NodePublishVolumeErrorCode) String() string return proto.EnumName(Error_NodePublishVolumeError_NodePublishVolumeErrorCode_name, int32(x)) } func (Error_NodePublishVolumeError_NodePublishVolumeErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 6, 0} + return fileDescriptor0, []int{44, 8, 0} } type Error_NodeUnpublishVolumeError_NodeUnpublishVolumeErrorCode int32 @@ -808,7 +954,7 @@ func (x Error_NodeUnpublishVolumeError_NodeUnpublishVolumeErrorCode) String() st return proto.EnumName(Error_NodeUnpublishVolumeError_NodeUnpublishVolumeErrorCode_name, int32(x)) } func (Error_NodeUnpublishVolumeError_NodeUnpublishVolumeErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 7, 0} + return fileDescriptor0, []int{44, 9, 0} } type Error_ProbeNodeError_ProbeNodeErrorCode int32 @@ -842,7 +988,7 @@ func (x Error_ProbeNodeError_ProbeNodeErrorCode) String() string { return proto.EnumName(Error_ProbeNodeError_ProbeNodeErrorCode_name, int32(x)) } func (Error_ProbeNodeError_ProbeNodeErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 8, 0} + return fileDescriptor0, []int{44, 10, 0} } type Error_GetNodeIDError_GetNodeIDErrorCode int32 @@ -875,7 +1021,7 @@ func (x Error_GetNodeIDError_GetNodeIDErrorCode) String() string { return proto.EnumName(Error_GetNodeIDError_GetNodeIDErrorCode_name, int32(x)) } func (Error_GetNodeIDError_GetNodeIDErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 9, 0} + return fileDescriptor0, []int{44, 11, 0} } // ////// @@ -2164,7 +2310,8 @@ func _ControllerPublishVolumeResponse_OneofSizer(msg proto.Message) (n int) { type ControllerPublishVolumeResponse_Result struct { // The SP specific information that will be passed to the Plugin in - // the subsequent `NodePublishVolume` call for the given volume. + // the subsequent `NodePublishDevice` and `NodePublishVolume` calls + // for the given volume. // This information is opaque to the CO. This field is OPTIONAL. PublishVolumeInfo *PublishVolumeInfo `protobuf:"bytes,1,opt,name=publish_volume_info,json=publishVolumeInfo" json:"publish_volume_info,omitempty"` } @@ -3300,6 +3447,385 @@ func (m *ControllerServiceCapability_RPC) GetType() ControllerServiceCapability_ return ControllerServiceCapability_RPC_UNKNOWN } +// ////// +// ////// +type NodePublishDeviceRequest 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. + PublishVolumeInfo *PublishVolumeInfo `protobuf:"bytes,3,opt,name=publish_volume_info,json=publishVolumeInfo" json:"publish_volume_info,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 global_target_path per + // volume. + // This is a REQUIRED field. + GlobalTargetPath string `protobuf:"bytes,4,opt,name=global_target_path,json=globalTargetPath" json:"global_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"` +} + +func (m *NodePublishDeviceRequest) Reset() { *m = NodePublishDeviceRequest{} } +func (m *NodePublishDeviceRequest) String() string { return proto.CompactTextString(m) } +func (*NodePublishDeviceRequest) ProtoMessage() {} +func (*NodePublishDeviceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } + +func (m *NodePublishDeviceRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *NodePublishDeviceRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodePublishDeviceRequest) GetPublishVolumeInfo() *PublishVolumeInfo { + if m != nil { + return m.PublishVolumeInfo + } + return nil +} + +func (m *NodePublishDeviceRequest) GetGlobalTargetPath() string { + if m != nil { + return m.GlobalTargetPath + } + return "" +} + +func (m *NodePublishDeviceRequest) GetVolumeCapability() *VolumeCapability { + if m != nil { + return m.VolumeCapability + } + return nil +} + +type NodePublishDeviceResponse struct { + // One of the following fields MUST be specified. + // + // Types that are valid to be assigned to Reply: + // *NodePublishDeviceResponse_Result_ + // *NodePublishDeviceResponse_Error + Reply isNodePublishDeviceResponse_Reply `protobuf_oneof:"reply"` +} + +func (m *NodePublishDeviceResponse) Reset() { *m = NodePublishDeviceResponse{} } +func (m *NodePublishDeviceResponse) String() string { return proto.CompactTextString(m) } +func (*NodePublishDeviceResponse) ProtoMessage() {} +func (*NodePublishDeviceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } + +type isNodePublishDeviceResponse_Reply interface { + isNodePublishDeviceResponse_Reply() +} + +type NodePublishDeviceResponse_Result_ struct { + Result *NodePublishDeviceResponse_Result `protobuf:"bytes,1,opt,name=result,oneof"` +} +type NodePublishDeviceResponse_Error struct { + Error *Error `protobuf:"bytes,2,opt,name=error,oneof"` +} + +func (*NodePublishDeviceResponse_Result_) isNodePublishDeviceResponse_Reply() {} +func (*NodePublishDeviceResponse_Error) isNodePublishDeviceResponse_Reply() {} + +func (m *NodePublishDeviceResponse) GetReply() isNodePublishDeviceResponse_Reply { + if m != nil { + return m.Reply + } + return nil +} + +func (m *NodePublishDeviceResponse) GetResult() *NodePublishDeviceResponse_Result { + if x, ok := m.GetReply().(*NodePublishDeviceResponse_Result_); ok { + return x.Result + } + return nil +} + +func (m *NodePublishDeviceResponse) GetError() *Error { + if x, ok := m.GetReply().(*NodePublishDeviceResponse_Error); ok { + return x.Error + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*NodePublishDeviceResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _NodePublishDeviceResponse_OneofMarshaler, _NodePublishDeviceResponse_OneofUnmarshaler, _NodePublishDeviceResponse_OneofSizer, []interface{}{ + (*NodePublishDeviceResponse_Result_)(nil), + (*NodePublishDeviceResponse_Error)(nil), + } +} + +func _NodePublishDeviceResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*NodePublishDeviceResponse) + // reply + switch x := m.Reply.(type) { + case *NodePublishDeviceResponse_Result_: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Result); err != nil { + return err + } + case *NodePublishDeviceResponse_Error: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Error); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("NodePublishDeviceResponse.Reply has unexpected type %T", x) + } + return nil +} + +func _NodePublishDeviceResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*NodePublishDeviceResponse) + switch tag { + case 1: // reply.result + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(NodePublishDeviceResponse_Result) + err := b.DecodeMessage(msg) + m.Reply = &NodePublishDeviceResponse_Result_{msg} + return true, err + case 2: // reply.error + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Error) + err := b.DecodeMessage(msg) + m.Reply = &NodePublishDeviceResponse_Error{msg} + return true, err + default: + return false, nil + } +} + +func _NodePublishDeviceResponse_OneofSizer(msg proto.Message) (n int) { + m := msg.(*NodePublishDeviceResponse) + // reply + switch x := m.Reply.(type) { + case *NodePublishDeviceResponse_Result_: + s := proto.Size(x.Result) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *NodePublishDeviceResponse_Error: + s := proto.Size(x.Error) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type NodePublishDeviceResponse_Result struct { +} + +func (m *NodePublishDeviceResponse_Result) Reset() { *m = NodePublishDeviceResponse_Result{} } +func (m *NodePublishDeviceResponse_Result) String() string { return proto.CompactTextString(m) } +func (*NodePublishDeviceResponse_Result) ProtoMessage() {} +func (*NodePublishDeviceResponse_Result) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{30, 0} +} + +// ////// +// ////// +type NodeUnpublishDeviceRequest 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. + GlobalTargetPath string `protobuf:"bytes,3,opt,name=global_target_path,json=globalTargetPath" json:"global_target_path,omitempty"` + // End user credentials used to authenticate/authorize node unpublish + // request. This field is OPTIONAL. + UserCredentials *Credentials `protobuf:"bytes,4,opt,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty"` +} + +func (m *NodeUnpublishDeviceRequest) Reset() { *m = NodeUnpublishDeviceRequest{} } +func (m *NodeUnpublishDeviceRequest) String() string { return proto.CompactTextString(m) } +func (*NodeUnpublishDeviceRequest) ProtoMessage() {} +func (*NodeUnpublishDeviceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } + +func (m *NodeUnpublishDeviceRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +func (m *NodeUnpublishDeviceRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodeUnpublishDeviceRequest) GetGlobalTargetPath() string { + if m != nil { + return m.GlobalTargetPath + } + return "" +} + +func (m *NodeUnpublishDeviceRequest) GetUserCredentials() *Credentials { + if m != nil { + return m.UserCredentials + } + return nil +} + +type NodeUnpublishDeviceResponse struct { + // One of the following fields MUST be specified. + // + // Types that are valid to be assigned to Reply: + // *NodeUnpublishDeviceResponse_Result_ + // *NodeUnpublishDeviceResponse_Error + Reply isNodeUnpublishDeviceResponse_Reply `protobuf_oneof:"reply"` +} + +func (m *NodeUnpublishDeviceResponse) Reset() { *m = NodeUnpublishDeviceResponse{} } +func (m *NodeUnpublishDeviceResponse) String() string { return proto.CompactTextString(m) } +func (*NodeUnpublishDeviceResponse) ProtoMessage() {} +func (*NodeUnpublishDeviceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } + +type isNodeUnpublishDeviceResponse_Reply interface { + isNodeUnpublishDeviceResponse_Reply() +} + +type NodeUnpublishDeviceResponse_Result_ struct { + Result *NodeUnpublishDeviceResponse_Result `protobuf:"bytes,1,opt,name=result,oneof"` +} +type NodeUnpublishDeviceResponse_Error struct { + Error *Error `protobuf:"bytes,2,opt,name=error,oneof"` +} + +func (*NodeUnpublishDeviceResponse_Result_) isNodeUnpublishDeviceResponse_Reply() {} +func (*NodeUnpublishDeviceResponse_Error) isNodeUnpublishDeviceResponse_Reply() {} + +func (m *NodeUnpublishDeviceResponse) GetReply() isNodeUnpublishDeviceResponse_Reply { + if m != nil { + return m.Reply + } + return nil +} + +func (m *NodeUnpublishDeviceResponse) GetResult() *NodeUnpublishDeviceResponse_Result { + if x, ok := m.GetReply().(*NodeUnpublishDeviceResponse_Result_); ok { + return x.Result + } + return nil +} + +func (m *NodeUnpublishDeviceResponse) GetError() *Error { + if x, ok := m.GetReply().(*NodeUnpublishDeviceResponse_Error); ok { + return x.Error + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*NodeUnpublishDeviceResponse) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _NodeUnpublishDeviceResponse_OneofMarshaler, _NodeUnpublishDeviceResponse_OneofUnmarshaler, _NodeUnpublishDeviceResponse_OneofSizer, []interface{}{ + (*NodeUnpublishDeviceResponse_Result_)(nil), + (*NodeUnpublishDeviceResponse_Error)(nil), + } +} + +func _NodeUnpublishDeviceResponse_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*NodeUnpublishDeviceResponse) + // reply + switch x := m.Reply.(type) { + case *NodeUnpublishDeviceResponse_Result_: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Result); err != nil { + return err + } + case *NodeUnpublishDeviceResponse_Error: + b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Error); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("NodeUnpublishDeviceResponse.Reply has unexpected type %T", x) + } + return nil +} + +func _NodeUnpublishDeviceResponse_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*NodeUnpublishDeviceResponse) + switch tag { + case 1: // reply.result + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(NodeUnpublishDeviceResponse_Result) + err := b.DecodeMessage(msg) + m.Reply = &NodeUnpublishDeviceResponse_Result_{msg} + return true, err + case 2: // reply.error + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Error) + err := b.DecodeMessage(msg) + m.Reply = &NodeUnpublishDeviceResponse_Error{msg} + return true, err + default: + return false, nil + } +} + +func _NodeUnpublishDeviceResponse_OneofSizer(msg proto.Message) (n int) { + m := msg.(*NodeUnpublishDeviceResponse) + // reply + switch x := m.Reply.(type) { + case *NodeUnpublishDeviceResponse_Result_: + s := proto.Size(x.Result) + n += proto.SizeVarint(1<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case *NodeUnpublishDeviceResponse_Error: + s := proto.Size(x.Error) + n += proto.SizeVarint(2<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +type NodeUnpublishDeviceResponse_Result struct { +} + +func (m *NodeUnpublishDeviceResponse_Result) Reset() { *m = NodeUnpublishDeviceResponse_Result{} } +func (m *NodeUnpublishDeviceResponse_Result) String() string { return proto.CompactTextString(m) } +func (*NodeUnpublishDeviceResponse_Result) ProtoMessage() {} +func (*NodeUnpublishDeviceResponse_Result) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{32, 0} +} + // ////// // ////// type NodePublishVolumeRequest struct { @@ -3313,26 +3839,31 @@ type NodePublishVolumeRequest struct { // left unset if the corresponding Controller Plugin does not have // this capability. This is an OPTIONAL field. PublishVolumeInfo *PublishVolumeInfo `protobuf:"bytes,3,opt,name=publish_volume_info,json=publishVolumeInfo" json:"publish_volume_info,omitempty"` + // The path to which the device was mounted by `NodePublishDevice`. + // It MUST be an absolute path in the root filesystem of the process + // serving this request. + // This is an OPTIONAL field. + GlobalTargetPath string `protobuf:"bytes,4,opt,name=global_target_path,json=globalTargetPath" json:"global_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. // 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"` // End user credentials used to authenticate/authorize node publish // request. This field is OPTIONAL. - UserCredentials *Credentials `protobuf:"bytes,7,opt,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty"` + UserCredentials *Credentials `protobuf:"bytes,8,opt,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty"` } 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{29} } +func (*NodePublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } func (m *NodePublishVolumeRequest) GetVersion() *Version { if m != nil { @@ -3355,6 +3886,13 @@ func (m *NodePublishVolumeRequest) GetPublishVolumeInfo() *PublishVolumeInfo { return nil } +func (m *NodePublishVolumeRequest) GetGlobalTargetPath() string { + if m != nil { + return m.GlobalTargetPath + } + return "" +} + func (m *NodePublishVolumeRequest) GetTargetPath() string { if m != nil { return m.TargetPath @@ -3395,7 +3933,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{30} } +func (*NodePublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } type isNodePublishVolumeResponse_Reply interface { isNodePublishVolumeResponse_Reply() @@ -3513,7 +4051,7 @@ func (m *NodePublishVolumeResponse_Result) Reset() { *m = NodePublishVol func (m *NodePublishVolumeResponse_Result) String() string { return proto.CompactTextString(m) } func (*NodePublishVolumeResponse_Result) ProtoMessage() {} func (*NodePublishVolumeResponse_Result) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{30, 0} + return fileDescriptor0, []int{34, 0} } // ////// @@ -3523,19 +4061,24 @@ type NodeUnpublishVolumeRequest struct { Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` // The handle of the volume. This field is REQUIRED. VolumeHandle *VolumeHandle `protobuf:"bytes,2,opt,name=volume_handle,json=volumeHandle" json:"volume_handle,omitempty"` + // The path to which the device was mounted by `NodePublishDevice`. + // It MUST be an absolute path in the root filesystem of the process + // serving this request. + // This is an OPTIONAL field. + GlobalTargetPath string `protobuf:"bytes,3,opt,name=global_target_path,json=globalTargetPath" json:"global_target_path,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. - TargetPath string `protobuf:"bytes,3,opt,name=target_path,json=targetPath" json:"target_path,omitempty"` + TargetPath string `protobuf:"bytes,4,opt,name=target_path,json=targetPath" json:"target_path,omitempty"` // End user credentials used to authenticate/authorize node unpublish // request. This field is OPTIONAL. - UserCredentials *Credentials `protobuf:"bytes,4,opt,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty"` + UserCredentials *Credentials `protobuf:"bytes,5,opt,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty"` } 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{31} } +func (*NodeUnpublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } func (m *NodeUnpublishVolumeRequest) GetVersion() *Version { if m != nil { @@ -3551,6 +4094,13 @@ func (m *NodeUnpublishVolumeRequest) GetVolumeHandle() *VolumeHandle { return nil } +func (m *NodeUnpublishVolumeRequest) GetGlobalTargetPath() string { + if m != nil { + return m.GlobalTargetPath + } + return "" +} + func (m *NodeUnpublishVolumeRequest) GetTargetPath() string { if m != nil { return m.TargetPath @@ -3577,7 +4127,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{32} } +func (*NodeUnpublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } type isNodeUnpublishVolumeResponse_Reply interface { isNodeUnpublishVolumeResponse_Reply() @@ -3695,7 +4245,7 @@ func (m *NodeUnpublishVolumeResponse_Result) Reset() { *m = NodeUnpublis func (m *NodeUnpublishVolumeResponse_Result) String() string { return proto.CompactTextString(m) } func (*NodeUnpublishVolumeResponse_Result) ProtoMessage() {} func (*NodeUnpublishVolumeResponse_Result) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{32, 0} + return fileDescriptor0, []int{36, 0} } // ////// @@ -3708,7 +4258,7 @@ type GetNodeIDRequest struct { func (m *GetNodeIDRequest) Reset() { *m = GetNodeIDRequest{} } func (m *GetNodeIDRequest) String() string { return proto.CompactTextString(m) } func (*GetNodeIDRequest) ProtoMessage() {} -func (*GetNodeIDRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } +func (*GetNodeIDRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } func (m *GetNodeIDRequest) GetVersion() *Version { if m != nil { @@ -3729,7 +4279,7 @@ type GetNodeIDResponse struct { func (m *GetNodeIDResponse) Reset() { *m = GetNodeIDResponse{} } func (m *GetNodeIDResponse) String() string { return proto.CompactTextString(m) } func (*GetNodeIDResponse) ProtoMessage() {} -func (*GetNodeIDResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } +func (*GetNodeIDResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } type isGetNodeIDResponse_Reply interface { isGetNodeIDResponse_Reply() @@ -3851,7 +4401,7 @@ type GetNodeIDResponse_Result struct { func (m *GetNodeIDResponse_Result) Reset() { *m = GetNodeIDResponse_Result{} } func (m *GetNodeIDResponse_Result) String() string { return proto.CompactTextString(m) } func (*GetNodeIDResponse_Result) ProtoMessage() {} -func (*GetNodeIDResponse_Result) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34, 0} } +func (*GetNodeIDResponse_Result) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38, 0} } func (m *GetNodeIDResponse_Result) GetNodeId() *NodeID { if m != nil { @@ -3870,7 +4420,7 @@ type ProbeNodeRequest struct { func (m *ProbeNodeRequest) Reset() { *m = ProbeNodeRequest{} } func (m *ProbeNodeRequest) String() string { return proto.CompactTextString(m) } func (*ProbeNodeRequest) ProtoMessage() {} -func (*ProbeNodeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } +func (*ProbeNodeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } func (m *ProbeNodeRequest) GetVersion() *Version { if m != nil { @@ -3891,7 +4441,7 @@ type ProbeNodeResponse struct { func (m *ProbeNodeResponse) Reset() { *m = ProbeNodeResponse{} } func (m *ProbeNodeResponse) String() string { return proto.CompactTextString(m) } func (*ProbeNodeResponse) ProtoMessage() {} -func (*ProbeNodeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } +func (*ProbeNodeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } type isProbeNodeResponse_Reply interface { isProbeNodeResponse_Reply() @@ -4008,7 +4558,7 @@ type ProbeNodeResponse_Result struct { func (m *ProbeNodeResponse_Result) Reset() { *m = ProbeNodeResponse_Result{} } func (m *ProbeNodeResponse_Result) String() string { return proto.CompactTextString(m) } func (*ProbeNodeResponse_Result) ProtoMessage() {} -func (*ProbeNodeResponse_Result) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36, 0} } +func (*ProbeNodeResponse_Result) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40, 0} } // ////// // ////// @@ -4020,7 +4570,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{37} } +func (*NodeGetCapabilitiesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } func (m *NodeGetCapabilitiesRequest) GetVersion() *Version { if m != nil { @@ -4041,7 +4591,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{38} } +func (*NodeGetCapabilitiesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } type isNodeGetCapabilitiesResponse_Reply interface { isNodeGetCapabilitiesResponse_Reply() @@ -4162,7 +4712,7 @@ func (m *NodeGetCapabilitiesResponse_Result) Reset() { *m = NodeGetCapab func (m *NodeGetCapabilitiesResponse_Result) String() string { return proto.CompactTextString(m) } func (*NodeGetCapabilitiesResponse_Result) ProtoMessage() {} func (*NodeGetCapabilitiesResponse_Result) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{38, 0} + return fileDescriptor0, []int{42, 0} } func (m *NodeGetCapabilitiesResponse_Result) GetCapabilities() []*NodeServiceCapability { @@ -4182,7 +4732,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{39} } +func (*NodeServiceCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} } type isNodeServiceCapability_Type interface { isNodeServiceCapability_Type() @@ -4270,7 +4820,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{39, 0} } +func (*NodeServiceCapability_RPC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43, 0} } func (m *NodeServiceCapability_RPC) GetType() NodeServiceCapability_RPC_Type { if m != nil { @@ -4301,7 +4851,7 @@ type Error struct { func (m *Error) Reset() { *m = Error{} } func (m *Error) String() string { return proto.CompactTextString(m) } func (*Error) ProtoMessage() {} -func (*Error) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } +func (*Error) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } type isError_Value interface { isError_Value() @@ -4671,7 +5221,7 @@ type Error_GeneralError struct { func (m *Error_GeneralError) Reset() { *m = Error_GeneralError{} } func (m *Error_GeneralError) String() string { return proto.CompactTextString(m) } func (*Error_GeneralError) ProtoMessage() {} -func (*Error_GeneralError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40, 0} } +func (*Error_GeneralError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44, 0} } func (m *Error_GeneralError) GetErrorCode() Error_GeneralError_GeneralErrorCode { if m != nil { @@ -4706,7 +5256,7 @@ type Error_CreateVolumeError struct { func (m *Error_CreateVolumeError) Reset() { *m = Error_CreateVolumeError{} } func (m *Error_CreateVolumeError) String() string { return proto.CompactTextString(m) } func (*Error_CreateVolumeError) ProtoMessage() {} -func (*Error_CreateVolumeError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40, 1} } +func (*Error_CreateVolumeError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44, 1} } func (m *Error_CreateVolumeError) GetErrorCode() Error_CreateVolumeError_CreateVolumeErrorCode { if m != nil { @@ -4734,7 +5284,7 @@ type Error_DeleteVolumeError struct { func (m *Error_DeleteVolumeError) Reset() { *m = Error_DeleteVolumeError{} } func (m *Error_DeleteVolumeError) String() string { return proto.CompactTextString(m) } func (*Error_DeleteVolumeError) ProtoMessage() {} -func (*Error_DeleteVolumeError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40, 2} } +func (*Error_DeleteVolumeError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44, 2} } func (m *Error_DeleteVolumeError) GetErrorCode() Error_DeleteVolumeError_DeleteVolumeErrorCode { if m != nil { @@ -4767,7 +5317,7 @@ func (m *Error_ControllerPublishVolumeError) Reset() { *m = Error_Contro func (m *Error_ControllerPublishVolumeError) String() string { return proto.CompactTextString(m) } func (*Error_ControllerPublishVolumeError) ProtoMessage() {} func (*Error_ControllerPublishVolumeError) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 3} + return fileDescriptor0, []int{44, 3} } func (m *Error_ControllerPublishVolumeError) GetErrorCode() Error_ControllerPublishVolumeError_ControllerPublishVolumeErrorCode { @@ -4801,7 +5351,7 @@ func (m *Error_ControllerUnpublishVolumeError) Reset() { *m = Error_Cont func (m *Error_ControllerUnpublishVolumeError) String() string { return proto.CompactTextString(m) } func (*Error_ControllerUnpublishVolumeError) ProtoMessage() {} func (*Error_ControllerUnpublishVolumeError) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 4} + return fileDescriptor0, []int{44, 4} } func (m *Error_ControllerUnpublishVolumeError) GetErrorCode() Error_ControllerUnpublishVolumeError_ControllerUnpublishVolumeErrorCode { @@ -4828,7 +5378,7 @@ func (m *Error_ValidateVolumeCapabilitiesError) Reset() { *m = Error_Val func (m *Error_ValidateVolumeCapabilitiesError) String() string { return proto.CompactTextString(m) } func (*Error_ValidateVolumeCapabilitiesError) ProtoMessage() {} func (*Error_ValidateVolumeCapabilitiesError) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 5} + return fileDescriptor0, []int{44, 5} } func (m *Error_ValidateVolumeCapabilitiesError) GetErrorCode() Error_ValidateVolumeCapabilitiesError_ValidateVolumeCapabilitiesErrorCode { @@ -4845,6 +5395,60 @@ func (m *Error_ValidateVolumeCapabilitiesError) GetErrorDescription() string { return "" } +// `NodePublishDevice` specific error. +type Error_NodePublishDeviceError struct { + ErrorCode Error_NodePublishDeviceError_NodePublishDeviceErrorCode `protobuf:"varint,1,opt,name=error_code,json=errorCode,enum=csi.Error_NodePublishDeviceError_NodePublishDeviceErrorCode" json:"error_code,omitempty"` + ErrorDescription string `protobuf:"bytes,2,opt,name=error_description,json=errorDescription" json:"error_description,omitempty"` +} + +func (m *Error_NodePublishDeviceError) Reset() { *m = Error_NodePublishDeviceError{} } +func (m *Error_NodePublishDeviceError) String() string { return proto.CompactTextString(m) } +func (*Error_NodePublishDeviceError) ProtoMessage() {} +func (*Error_NodePublishDeviceError) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{44, 6} +} + +func (m *Error_NodePublishDeviceError) GetErrorCode() Error_NodePublishDeviceError_NodePublishDeviceErrorCode { + if m != nil { + return m.ErrorCode + } + return Error_NodePublishDeviceError_UNKNOWN +} + +func (m *Error_NodePublishDeviceError) GetErrorDescription() string { + if m != nil { + return m.ErrorDescription + } + return "" +} + +// `NodeUnpublishDevice` specific error. +type Error_NodeUnpublishDeviceError struct { + ErrorCode Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode `protobuf:"varint,1,opt,name=error_code,json=errorCode,enum=csi.Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode" json:"error_code,omitempty"` + ErrorDescription string `protobuf:"bytes,2,opt,name=error_description,json=errorDescription" json:"error_description,omitempty"` +} + +func (m *Error_NodeUnpublishDeviceError) Reset() { *m = Error_NodeUnpublishDeviceError{} } +func (m *Error_NodeUnpublishDeviceError) String() string { return proto.CompactTextString(m) } +func (*Error_NodeUnpublishDeviceError) ProtoMessage() {} +func (*Error_NodeUnpublishDeviceError) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{44, 7} +} + +func (m *Error_NodeUnpublishDeviceError) GetErrorCode() Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode { + if m != nil { + return m.ErrorCode + } + return Error_NodeUnpublishDeviceError_UNKNOWN +} + +func (m *Error_NodeUnpublishDeviceError) GetErrorDescription() string { + if m != nil { + return m.ErrorDescription + } + return "" +} + // `NodePublishVolume` specific error. type Error_NodePublishVolumeError struct { ErrorCode Error_NodePublishVolumeError_NodePublishVolumeErrorCode `protobuf:"varint,1,opt,name=error_code,json=errorCode,enum=csi.Error_NodePublishVolumeError_NodePublishVolumeErrorCode" json:"error_code,omitempty"` @@ -4855,7 +5459,7 @@ func (m *Error_NodePublishVolumeError) Reset() { *m = Error_NodePublishV func (m *Error_NodePublishVolumeError) String() string { return proto.CompactTextString(m) } func (*Error_NodePublishVolumeError) ProtoMessage() {} func (*Error_NodePublishVolumeError) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 6} + return fileDescriptor0, []int{44, 8} } func (m *Error_NodePublishVolumeError) GetErrorCode() Error_NodePublishVolumeError_NodePublishVolumeErrorCode { @@ -4882,7 +5486,7 @@ func (m *Error_NodeUnpublishVolumeError) Reset() { *m = Error_NodeUnpubl func (m *Error_NodeUnpublishVolumeError) String() string { return proto.CompactTextString(m) } func (*Error_NodeUnpublishVolumeError) ProtoMessage() {} func (*Error_NodeUnpublishVolumeError) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{40, 7} + return fileDescriptor0, []int{44, 9} } func (m *Error_NodeUnpublishVolumeError) GetErrorCode() Error_NodeUnpublishVolumeError_NodeUnpublishVolumeErrorCode { @@ -4908,7 +5512,7 @@ type Error_ProbeNodeError struct { func (m *Error_ProbeNodeError) Reset() { *m = Error_ProbeNodeError{} } func (m *Error_ProbeNodeError) String() string { return proto.CompactTextString(m) } func (*Error_ProbeNodeError) ProtoMessage() {} -func (*Error_ProbeNodeError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40, 8} } +func (*Error_ProbeNodeError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44, 10} } func (m *Error_ProbeNodeError) GetErrorCode() Error_ProbeNodeError_ProbeNodeErrorCode { if m != nil { @@ -4933,7 +5537,7 @@ type Error_GetNodeIDError struct { func (m *Error_GetNodeIDError) Reset() { *m = Error_GetNodeIDError{} } func (m *Error_GetNodeIDError) String() string { return proto.CompactTextString(m) } func (*Error_GetNodeIDError) ProtoMessage() {} -func (*Error_GetNodeIDError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40, 9} } +func (*Error_GetNodeIDError) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44, 11} } func (m *Error_GetNodeIDError) GetErrorCode() Error_GetNodeIDError_GetNodeIDErrorCode { if m != nil { @@ -4994,6 +5598,12 @@ func init() { proto.RegisterType((*ControllerGetCapabilitiesResponse_Result)(nil), "csi.ControllerGetCapabilitiesResponse.Result") proto.RegisterType((*ControllerServiceCapability)(nil), "csi.ControllerServiceCapability") proto.RegisterType((*ControllerServiceCapability_RPC)(nil), "csi.ControllerServiceCapability.RPC") + proto.RegisterType((*NodePublishDeviceRequest)(nil), "csi.NodePublishDeviceRequest") + proto.RegisterType((*NodePublishDeviceResponse)(nil), "csi.NodePublishDeviceResponse") + proto.RegisterType((*NodePublishDeviceResponse_Result)(nil), "csi.NodePublishDeviceResponse.Result") + proto.RegisterType((*NodeUnpublishDeviceRequest)(nil), "csi.NodeUnpublishDeviceRequest") + proto.RegisterType((*NodeUnpublishDeviceResponse)(nil), "csi.NodeUnpublishDeviceResponse") + proto.RegisterType((*NodeUnpublishDeviceResponse_Result)(nil), "csi.NodeUnpublishDeviceResponse.Result") proto.RegisterType((*NodePublishVolumeRequest)(nil), "csi.NodePublishVolumeRequest") proto.RegisterType((*NodePublishVolumeResponse)(nil), "csi.NodePublishVolumeResponse") proto.RegisterType((*NodePublishVolumeResponse_Result)(nil), "csi.NodePublishVolumeResponse.Result") @@ -5018,6 +5628,8 @@ func init() { proto.RegisterType((*Error_ControllerPublishVolumeError)(nil), "csi.Error.ControllerPublishVolumeError") proto.RegisterType((*Error_ControllerUnpublishVolumeError)(nil), "csi.Error.ControllerUnpublishVolumeError") proto.RegisterType((*Error_ValidateVolumeCapabilitiesError)(nil), "csi.Error.ValidateVolumeCapabilitiesError") + proto.RegisterType((*Error_NodePublishDeviceError)(nil), "csi.Error.NodePublishDeviceError") + proto.RegisterType((*Error_NodeUnpublishDeviceError)(nil), "csi.Error.NodeUnpublishDeviceError") proto.RegisterType((*Error_NodePublishVolumeError)(nil), "csi.Error.NodePublishVolumeError") proto.RegisterType((*Error_NodeUnpublishVolumeError)(nil), "csi.Error.NodeUnpublishVolumeError") proto.RegisterType((*Error_ProbeNodeError)(nil), "csi.Error.ProbeNodeError") @@ -5031,6 +5643,8 @@ func init() { proto.RegisterEnum("csi.Error_ControllerPublishVolumeError_ControllerPublishVolumeErrorCode", Error_ControllerPublishVolumeError_ControllerPublishVolumeErrorCode_name, Error_ControllerPublishVolumeError_ControllerPublishVolumeErrorCode_value) proto.RegisterEnum("csi.Error_ControllerUnpublishVolumeError_ControllerUnpublishVolumeErrorCode", Error_ControllerUnpublishVolumeError_ControllerUnpublishVolumeErrorCode_name, Error_ControllerUnpublishVolumeError_ControllerUnpublishVolumeErrorCode_value) proto.RegisterEnum("csi.Error_ValidateVolumeCapabilitiesError_ValidateVolumeCapabilitiesErrorCode", Error_ValidateVolumeCapabilitiesError_ValidateVolumeCapabilitiesErrorCode_name, Error_ValidateVolumeCapabilitiesError_ValidateVolumeCapabilitiesErrorCode_value) + proto.RegisterEnum("csi.Error_NodePublishDeviceError_NodePublishDeviceErrorCode", Error_NodePublishDeviceError_NodePublishDeviceErrorCode_name, Error_NodePublishDeviceError_NodePublishDeviceErrorCode_value) + proto.RegisterEnum("csi.Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode", Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode_name, Error_NodeUnpublishDeviceError_NodeUnpublishDeviceErrorCode_value) proto.RegisterEnum("csi.Error_NodePublishVolumeError_NodePublishVolumeErrorCode", Error_NodePublishVolumeError_NodePublishVolumeErrorCode_name, Error_NodePublishVolumeError_NodePublishVolumeErrorCode_value) proto.RegisterEnum("csi.Error_NodeUnpublishVolumeError_NodeUnpublishVolumeErrorCode", Error_NodeUnpublishVolumeError_NodeUnpublishVolumeErrorCode_name, Error_NodeUnpublishVolumeError_NodeUnpublishVolumeErrorCode_value) proto.RegisterEnum("csi.Error_ProbeNodeError_ProbeNodeErrorCode", Error_ProbeNodeError_ProbeNodeErrorCode_name, Error_ProbeNodeError_ProbeNodeErrorCode_value) @@ -5440,6 +6054,8 @@ var _Controller_serviceDesc = grpc.ServiceDesc{ // Client API for Node service type NodeClient interface { + NodePublishDevice(ctx context.Context, in *NodePublishDeviceRequest, opts ...grpc.CallOption) (*NodePublishDeviceResponse, error) + NodeUnpublishDevice(ctx context.Context, in *NodeUnpublishDeviceRequest, opts ...grpc.CallOption) (*NodeUnpublishDeviceResponse, error) NodePublishVolume(ctx context.Context, in *NodePublishVolumeRequest, opts ...grpc.CallOption) (*NodePublishVolumeResponse, error) NodeUnpublishVolume(ctx context.Context, in *NodeUnpublishVolumeRequest, opts ...grpc.CallOption) (*NodeUnpublishVolumeResponse, error) GetNodeID(ctx context.Context, in *GetNodeIDRequest, opts ...grpc.CallOption) (*GetNodeIDResponse, error) @@ -5455,6 +6071,24 @@ func NewNodeClient(cc *grpc.ClientConn) NodeClient { return &nodeClient{cc} } +func (c *nodeClient) NodePublishDevice(ctx context.Context, in *NodePublishDeviceRequest, opts ...grpc.CallOption) (*NodePublishDeviceResponse, error) { + out := new(NodePublishDeviceResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodePublishDevice", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *nodeClient) NodeUnpublishDevice(ctx context.Context, in *NodeUnpublishDeviceRequest, opts ...grpc.CallOption) (*NodeUnpublishDeviceResponse, error) { + out := new(NodeUnpublishDeviceResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodeUnpublishDevice", 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...) @@ -5503,6 +6137,8 @@ func (c *nodeClient) NodeGetCapabilities(ctx context.Context, in *NodeGetCapabil // Server API for Node service type NodeServer interface { + NodePublishDevice(context.Context, *NodePublishDeviceRequest) (*NodePublishDeviceResponse, error) + NodeUnpublishDevice(context.Context, *NodeUnpublishDeviceRequest) (*NodeUnpublishDeviceResponse, error) NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error) NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error) GetNodeID(context.Context, *GetNodeIDRequest) (*GetNodeIDResponse, error) @@ -5514,6 +6150,42 @@ func RegisterNodeServer(s *grpc.Server, srv NodeServer) { s.RegisterService(&_Node_serviceDesc, srv) } +func _Node_NodePublishDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodePublishDeviceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).NodePublishDevice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Node/NodePublishDevice", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).NodePublishDevice(ctx, req.(*NodePublishDeviceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Node_NodeUnpublishDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodeUnpublishDeviceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).NodeUnpublishDevice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Node/NodeUnpublishDevice", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).NodeUnpublishDevice(ctx, req.(*NodeUnpublishDeviceRequest)) + } + 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 { @@ -5608,6 +6280,14 @@ var _Node_serviceDesc = grpc.ServiceDesc{ ServiceName: "csi.Node", HandlerType: (*NodeServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "NodePublishDevice", + Handler: _Node_NodePublishDevice_Handler, + }, + { + MethodName: "NodeUnpublishDevice", + Handler: _Node_NodeUnpublishDevice_Handler, + }, { MethodName: "NodePublishVolume", Handler: _Node_NodePublishVolume_Handler, @@ -5636,207 +6316,220 @@ var _Node_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("csi.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 3226 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5b, 0x4d, 0x6c, 0x23, 0x49, - 0x15, 0x76, 0xfb, 0x37, 0x7e, 0x8e, 0x67, 0xda, 0x95, 0xc9, 0xc4, 0xe9, 0xc9, 0x4c, 0x32, 0x3d, - 0x3f, 0x3b, 0xc3, 0xb2, 0x5e, 0x08, 0x12, 0xb3, 0x33, 0xb3, 0x7f, 0x8e, 0xdd, 0x71, 0xcc, 0x38, - 0x6d, 0x6f, 0xdb, 0xce, 0xee, 0x80, 0xd8, 0x56, 0xc7, 0xee, 0x64, 0xcc, 0x38, 0xb6, 0xb7, 0xbb, - 0x63, 0x6d, 0x6e, 0x48, 0x20, 0x24, 0x56, 0x1c, 0x10, 0x48, 0x2c, 0xe2, 0x00, 0x87, 0xe5, 0x00, - 0x12, 0x27, 0x10, 0x20, 0x04, 0x17, 0x84, 0x38, 0x22, 0xc4, 0x85, 0x45, 0x48, 0x1c, 0x57, 0x68, - 0x39, 0x71, 0xe5, 0x86, 0xaa, 0xba, 0xba, 0xdd, 0xdd, 0xee, 0xb6, 0x9d, 0x38, 0xcb, 0x70, 0x73, - 0xbf, 0x57, 0xef, 0xbd, 0xaa, 0xef, 0x55, 0xbd, 0xf7, 0xea, 0xc7, 0x90, 0x6c, 0xe9, 0x9d, 0xdc, - 0x40, 0xeb, 0x1b, 0x7d, 0x14, 0x69, 0xe9, 0x1d, 0xfe, 0x2a, 0x5c, 0x29, 0xa9, 0x46, 0xfd, 0x78, - 0x30, 0xe8, 0x6b, 0x86, 0xda, 0xde, 0x53, 0x35, 0xbd, 0xd3, 0xef, 0xe9, 0x92, 0xfa, 0xce, 0xb1, - 0xaa, 0x1b, 0xfc, 0x5f, 0x19, 0x58, 0xf3, 0xe7, 0xeb, 0x83, 0x7e, 0x4f, 0x57, 0xd1, 0x16, 0xc4, - 0x35, 0x55, 0x3f, 0xee, 0x1a, 0x59, 0x66, 0x83, 0xb9, 0x93, 0xda, 0xbc, 0x93, 0xc3, 0x06, 0x26, - 0x89, 0xe4, 0x24, 0xd2, 0x7e, 0x27, 0x24, 0x51, 0x49, 0xc4, 0x43, 0x4c, 0xd5, 0xb4, 0xbe, 0x96, - 0x0d, 0x13, 0x15, 0x40, 0x54, 0x08, 0x98, 0xb2, 0x13, 0x92, 0x4c, 0x16, 0x27, 0x40, 0xdc, 0x94, - 0x43, 0x0f, 0x01, 0xe9, 0x96, 0x6e, 0x79, 0x48, 0x95, 0x67, 0x99, 0x8d, 0xc8, 0x9d, 0xd4, 0xe6, - 0x22, 0x11, 0xa5, 0x16, 0xa5, 0x8c, 0xee, 0xed, 0xc3, 0x56, 0x02, 0x62, 0x9a, 0x3a, 0xe8, 0x9e, - 0xf0, 0x8f, 0x20, 0x41, 0x89, 0xe8, 0x12, 0xc4, 0x8e, 0x94, 0xaf, 0xf4, 0x35, 0x32, 0x82, 0xb4, - 0x64, 0x7e, 0x10, 0x6a, 0xa7, 0x47, 0x3b, 0x85, 0xa9, 0xf8, 0x03, 0x53, 0x07, 0x8a, 0xd1, 0x7a, - 0x92, 0x8d, 0x98, 0x54, 0xf2, 0xc1, 0xbf, 0x0a, 0x97, 0x4a, 0xaa, 0x51, 0xeb, 0x1e, 0x1f, 0x76, - 0x7a, 0xe5, 0xde, 0x41, 0x9f, 0xa2, 0x87, 0x6e, 0x43, 0x82, 0x76, 0x90, 0xa2, 0xe3, 0xee, 0x9f, - 0xc5, 0xe4, 0xff, 0x12, 0x86, 0x65, 0x8f, 0x02, 0x0a, 0xef, 0x43, 0x0f, 0xbc, 0xd7, 0x2d, 0x78, - 0xc7, 0xdb, 0x9e, 0x0d, 0xd7, 0x3f, 0x31, 0x36, 0xb0, 0x08, 0xa2, 0x3d, 0xe5, 0x48, 0x25, 0x96, - 0x92, 0x12, 0xf9, 0x8d, 0x6e, 0xc1, 0x85, 0xa1, 0xda, 0x6b, 0xf7, 0x35, 0x0b, 0x69, 0xa2, 0x2b, - 0x29, 0xa5, 0x4d, 0xaa, 0x05, 0xe1, 0x23, 0x58, 0x38, 0x52, 0x7a, 0x9d, 0x03, 0x55, 0x37, 0xb2, - 0x11, 0xe2, 0x89, 0x17, 0xa7, 0x76, 0x34, 0xb7, 0x4b, 0x25, 0x84, 0x9e, 0xa1, 0x9d, 0x48, 0xb6, - 0x02, 0xee, 0x21, 0xa4, 0x5d, 0x2c, 0xc4, 0x42, 0xe4, 0xa9, 0x7a, 0x42, 0xfb, 0x85, 0x7f, 0x62, - 0x37, 0x0c, 0x95, 0xee, 0xb1, 0x4a, 0x7b, 0x63, 0x7e, 0x3c, 0x08, 0xbf, 0xc4, 0x8c, 0x1c, 0xfc, - 0x83, 0x08, 0x2c, 0x15, 0x34, 0x55, 0x31, 0xd4, 0xbd, 0x7e, 0xf7, 0xf8, 0x48, 0x3d, 0xa5, 0x4f, - 0x6c, 0x34, 0xc2, 0x0e, 0x34, 0xee, 0xc3, 0x85, 0x96, 0x32, 0x50, 0x5a, 0x1d, 0xe3, 0x44, 0xd6, - 0x94, 0xde, 0xa1, 0x4a, 0xa6, 0x41, 0x6a, 0x13, 0x11, 0x15, 0x05, 0xca, 0x92, 0x30, 0x47, 0x4a, - 0xb7, 0x9c, 0x9f, 0x68, 0x1b, 0x96, 0x86, 0xa4, 0x1f, 0x32, 0xa6, 0xef, 0x77, 0xba, 0x1d, 0xa3, - 0xa3, 0xea, 0xd9, 0x28, 0x01, 0x6b, 0xd9, 0xec, 0x02, 0xe1, 0x17, 0x2c, 0xf6, 0x89, 0x84, 0x86, - 0x6e, 0x4a, 0x47, 0xd5, 0xd1, 0x0e, 0xc0, 0x40, 0xd1, 0x94, 0x23, 0xd5, 0x50, 0x35, 0x3d, 0x1b, - 0x23, 0xe2, 0xe6, 0x9a, 0xf3, 0x19, 0x6c, 0xae, 0x66, 0x37, 0x35, 0x41, 0x76, 0xc8, 0xa2, 0x87, - 0xc0, 0x1e, 0xeb, 0xaa, 0x26, 0xb7, 0x34, 0xb5, 0xad, 0xf6, 0x8c, 0x8e, 0xd2, 0xd5, 0xb3, 0x71, - 0x32, 0x1c, 0xd6, 0xd2, 0x67, 0xd1, 0xa5, 0x8b, 0xb8, 0xa5, 0x83, 0xc0, 0xbd, 0x02, 0x17, 0x3d, - 0xba, 0x4f, 0xe3, 0x25, 0xfe, 0xb7, 0x0c, 0x5c, 0x72, 0xf7, 0x97, 0xce, 0xf7, 0x07, 0x9e, 0xf9, - 0xbe, 0xe1, 0x33, 0xb4, 0x79, 0xa6, 0xfb, 0x03, 0x7b, 0xb6, 0x7f, 0x06, 0x52, 0xd4, 0x21, 0x9d, - 0xde, 0x41, 0x9f, 0x9a, 0xbb, 0xe8, 0x70, 0x04, 0x99, 0xb2, 0x30, 0xb4, 0x7f, 0x8f, 0xa6, 0xd6, - 0x0f, 0xa3, 0xc0, 0x7a, 0x9d, 0x85, 0xee, 0x43, 0x6c, 0xbf, 0xdb, 0x6f, 0x3d, 0x75, 0x2d, 0x54, - 0x6f, 0xab, 0xdc, 0x16, 0x6e, 0x62, 0x52, 0x71, 0xa7, 0x88, 0x04, 0x16, 0x3d, 0xea, 0x1f, 0xf7, - 0x0c, 0xda, 0xf1, 0x00, 0xd1, 0x5d, 0xdc, 0x64, 0x24, 0x4a, 0x24, 0x50, 0x1e, 0x52, 0x4a, 0xab, - 0xa5, 0xea, 0xba, 0x7c, 0xd4, 0x6f, 0x5b, 0xd3, 0x71, 0xc3, 0x5f, 0x41, 0x9e, 0x34, 0xdc, 0xed, - 0xb7, 0x55, 0x09, 0x14, 0xfb, 0x37, 0x97, 0x86, 0x94, 0xa3, 0x57, 0x5c, 0x09, 0x52, 0x0e, 0x4b, - 0x68, 0x05, 0x12, 0x07, 0xba, 0x6c, 0x9c, 0x0c, 0xac, 0xb8, 0x10, 0x3f, 0xd0, 0x1b, 0x27, 0x03, - 0x15, 0xad, 0x43, 0x8a, 0x74, 0x41, 0x3e, 0xe8, 0x2a, 0x87, 0x7a, 0x36, 0xbc, 0x11, 0xb9, 0x93, - 0x94, 0x80, 0x90, 0xb6, 0x31, 0x85, 0xfb, 0x98, 0x01, 0x18, 0x99, 0x44, 0xf7, 0x21, 0x4a, 0xba, - 0x88, 0xb5, 0x5c, 0xd8, 0xbc, 0x35, 0xad, 0x8b, 0x39, 0xd2, 0x4f, 0x22, 0xc2, 0xff, 0x88, 0x81, - 0x28, 0xd1, 0x91, 0x82, 0x44, 0x53, 0x7c, 0x24, 0x56, 0xdf, 0x14, 0xd9, 0x10, 0xba, 0x0c, 0xa8, - 0x5e, 0x16, 0x4b, 0x15, 0x41, 0x16, 0xab, 0x45, 0x41, 0x7e, 0x53, 0x2a, 0x37, 0x04, 0x89, 0x65, - 0xd0, 0x15, 0x58, 0x71, 0xd2, 0x25, 0x21, 0x5f, 0x14, 0x24, 0xb9, 0x2a, 0x56, 0x1e, 0xb3, 0x61, - 0xc4, 0xc1, 0xe5, 0xdd, 0x66, 0xa5, 0x51, 0x1e, 0xe7, 0x45, 0xd0, 0x1a, 0x64, 0x1d, 0x3c, 0xaa, - 0x83, 0xaa, 0x8d, 0x62, 0xb5, 0x0e, 0xae, 0xf9, 0x93, 0x32, 0x63, 0x5b, 0x69, 0xdb, 0x0d, 0x18, - 0x29, 0xfe, 0x4d, 0x48, 0xbb, 0x82, 0x01, 0x0e, 0xa3, 0x9a, 0xfa, 0xce, 0x71, 0x47, 0x53, 0xdb, - 0xf2, 0xfe, 0x89, 0xa1, 0xea, 0x04, 0x86, 0xa8, 0x94, 0xb6, 0xa8, 0x5b, 0x98, 0x88, 0x31, 0xed, - 0x76, 0x8e, 0x3a, 0x06, 0x6d, 0x13, 0x26, 0x6d, 0x80, 0x90, 0x48, 0x03, 0xfe, 0x6d, 0x80, 0xd1, - 0xe4, 0xc4, 0x5a, 0xed, 0x70, 0xe4, 0xd2, 0x6a, 0x51, 0x4d, 0xad, 0x77, 0x21, 0xfe, 0x44, 0xe9, - 0xb5, 0xbb, 0x2a, 0x9d, 0x5f, 0x19, 0x07, 0xf6, 0x3b, 0x84, 0x21, 0xd1, 0x06, 0xfc, 0xf7, 0x19, - 0x58, 0x74, 0x32, 0xd0, 0x05, 0x08, 0x77, 0xda, 0xd4, 0xf3, 0xe1, 0x4e, 0x1b, 0x3d, 0x84, 0x85, - 0x23, 0xd5, 0x50, 0xda, 0x8a, 0xa1, 0x10, 0x97, 0xa7, 0x36, 0xd7, 0xc7, 0xb4, 0xe5, 0x76, 0x69, - 0x0b, 0x2b, 0xb0, 0xd3, 0x4f, 0x12, 0xd8, 0x9d, 0xac, 0x53, 0x85, 0x8c, 0x21, 0xa4, 0x1c, 0x01, - 0x08, 0xe5, 0x20, 0x4a, 0x3a, 0x61, 0xe6, 0x7d, 0xce, 0x1b, 0xb1, 0x72, 0x45, 0xdb, 0x3e, 0x69, - 0xc7, 0xdd, 0x83, 0x64, 0xf1, 0x4c, 0x76, 0x7f, 0xce, 0xc0, 0x52, 0x51, 0xed, 0xaa, 0x67, 0xcd, - 0x23, 0x9f, 0x87, 0x34, 0x8d, 0x33, 0xd3, 0x9c, 0xb0, 0x38, 0x74, 0x22, 0xef, 0x17, 0x9e, 0x23, - 0x33, 0x86, 0x67, 0xfe, 0x9b, 0x0c, 0x5c, 0x72, 0x77, 0x7a, 0x62, 0x7c, 0xf5, 0x6b, 0x7a, 0xb6, - 0xf8, 0xba, 0x60, 0xc5, 0xd7, 0x51, 0xb4, 0xfc, 0x43, 0x18, 0xae, 0x15, 0xfa, 0x3d, 0x43, 0xeb, - 0x77, 0xbb, 0xaa, 0x56, 0x3b, 0xde, 0xef, 0x76, 0xf4, 0x27, 0xff, 0x5b, 0x2c, 0x6f, 0x42, 0xa2, - 0xd7, 0x6f, 0xab, 0x72, 0xa7, 0x4d, 0x21, 0x4c, 0x11, 0x09, 0xb1, 0xdf, 0x56, 0xcb, 0x45, 0x29, - 0x8e, 0x79, 0xe5, 0x36, 0xda, 0x82, 0x8c, 0x37, 0x45, 0x9f, 0x64, 0xa3, 0xa4, 0x7d, 0x40, 0x82, - 0x66, 0x87, 0xde, 0x2c, 0xc0, 0xc1, 0x82, 0xa6, 0x2a, 0xed, 0x7e, 0xaf, 0x7b, 0x92, 0x8d, 0x6d, - 0x30, 0x77, 0x16, 0x24, 0xfb, 0x7b, 0xae, 0x84, 0xcb, 0xff, 0x93, 0x81, 0xf5, 0x40, 0x14, 0xa9, - 0x73, 0x05, 0x8f, 0x73, 0x9f, 0x37, 0xd5, 0x4e, 0x96, 0x3a, 0x9b, 0x9f, 0x6b, 0x76, 0x1e, 0xdd, - 0x86, 0xa5, 0x81, 0xa9, 0x57, 0x1e, 0xcf, 0xa7, 0x97, 0x89, 0xac, 0xcb, 0x2e, 0x49, 0xab, 0x99, - 0x81, 0x97, 0x34, 0x9a, 0x2f, 0x06, 0xc4, 0x4d, 0xc7, 0xa0, 0x17, 0x21, 0x4e, 0xd6, 0xa1, 0x55, - 0xdd, 0xaf, 0x38, 0xbc, 0x96, 0xdb, 0x23, 0x1c, 0x73, 0x89, 0xd3, 0x66, 0xdc, 0x7d, 0x48, 0x39, - 0xc8, 0xa7, 0x5a, 0xe6, 0xef, 0x31, 0x90, 0x19, 0xeb, 0x27, 0x5e, 0x2e, 0xae, 0x1e, 0xf0, 0xfe, - 0xe3, 0x39, 0xef, 0xce, 0x7c, 0xc4, 0xc0, 0xc6, 0xc8, 0x6d, 0xcd, 0xde, 0xe0, 0xff, 0x77, 0xd1, - 0xf8, 0x4d, 0xea, 0xe8, 0xac, 0x93, 0xfa, 0x03, 0x06, 0xae, 0x4f, 0x18, 0x27, 0x9d, 0xd6, 0x25, - 0xcf, 0xb4, 0x7e, 0xc1, 0x33, 0xad, 0x03, 0xe4, 0xce, 0x2d, 0x80, 0xfd, 0x91, 0x81, 0xeb, 0x7b, - 0x4a, 0xb7, 0xd3, 0xb6, 0x6b, 0x50, 0x67, 0x45, 0x7e, 0x5a, 0x77, 0x78, 0xea, 0xce, 0xf0, 0xd4, - 0xba, 0x33, 0x68, 0xeb, 0x10, 0x39, 0xe5, 0xd6, 0x81, 0xff, 0x07, 0x03, 0xfc, 0xa4, 0x71, 0x50, - 0xb8, 0x77, 0x3c, 0x70, 0xe7, 0x4c, 0x0b, 0x53, 0x05, 0xcf, 0x86, 0xf7, 0xeb, 0x76, 0x20, 0x59, - 0x83, 0xa4, 0xbd, 0x5f, 0x27, 0xa6, 0x17, 0xa4, 0x11, 0x01, 0x65, 0x21, 0x71, 0xa4, 0xea, 0xba, - 0x72, 0x68, 0x2d, 0x17, 0xeb, 0x73, 0xe4, 0xa7, 0xaf, 0x33, 0x80, 0x2a, 0x1d, 0x9d, 0x56, 0xae, - 0xa7, 0x76, 0x0c, 0x2e, 0x68, 0x95, 0x77, 0x65, 0xb5, 0x67, 0x68, 0x1d, 0x5a, 0x7c, 0xa5, 0x25, - 0x38, 0x52, 0xde, 0x15, 0x4c, 0x0a, 0x2e, 0xb7, 0x74, 0x43, 0xd1, 0x8c, 0x4e, 0xef, 0x50, 0x36, - 0xfa, 0x4f, 0xd5, 0x1e, 0x59, 0x17, 0x49, 0x29, 0x6d, 0x51, 0x1b, 0x98, 0xc8, 0x7f, 0x10, 0x86, - 0x25, 0x57, 0x37, 0x28, 0xae, 0xf7, 0x3d, 0xb8, 0x9a, 0x85, 0x93, 0x4f, 0xcb, 0xb3, 0x01, 0xf9, - 0xc1, 0x68, 0x23, 0xff, 0x1a, 0x24, 0xac, 0x51, 0x98, 0x61, 0xeb, 0xd6, 0x14, 0x53, 0x39, 0x33, - 0x72, 0x59, 0x52, 0xe8, 0x2a, 0x40, 0x4f, 0x7d, 0xd7, 0xa0, 0xa3, 0x34, 0xf1, 0x4e, 0x62, 0x0a, - 0x19, 0x21, 0x77, 0x1f, 0x62, 0x66, 0x4c, 0x9b, 0x63, 0x0f, 0xf5, 0xad, 0x30, 0xa0, 0x92, 0x6a, - 0xd8, 0x65, 0xf2, 0x29, 0x9d, 0x15, 0xb0, 0x26, 0xc2, 0xa7, 0xdd, 0x4e, 0x97, 0x5c, 0xdb, 0x69, - 0x73, 0x49, 0x3d, 0x67, 0x1d, 0x5d, 0x78, 0x3a, 0x37, 0x69, 0x37, 0x3d, 0xef, 0x86, 0xf8, 0x57, - 0x0c, 0x2c, 0xb9, 0x2c, 0x4e, 0x9c, 0x34, 0x3e, 0x2d, 0xcf, 0x36, 0x69, 0xee, 0xd9, 0x73, 0xe6, - 0x05, 0x40, 0xca, 0x50, 0xe9, 0x74, 0x95, 0xfd, 0xae, 0x89, 0x29, 0x56, 0x4e, 0xf7, 0x13, 0x19, - 0x9b, 0x63, 0x59, 0x1d, 0xf9, 0xf1, 0x0b, 0xce, 0x4c, 0x45, 0xfb, 0x75, 0xc6, 0xd0, 0xc8, 0x7f, - 0xec, 0x4a, 0x07, 0x63, 0xca, 0x66, 0x4c, 0x07, 0x01, 0x72, 0x67, 0x03, 0x48, 0xb4, 0x01, 0x2a, - 0xc2, 0xa2, 0xcf, 0x54, 0xdb, 0xf0, 0x18, 0xaf, 0xab, 0xda, 0xb0, 0xd3, 0x72, 0xce, 0x3a, 0x97, - 0xd4, 0x08, 0xb7, 0xf7, 0xc3, 0x70, 0x65, 0x82, 0x18, 0x7a, 0x09, 0x22, 0xda, 0xa0, 0x45, 0x87, - 0x78, 0x73, 0x9a, 0x95, 0x9c, 0x54, 0x2b, 0xec, 0x84, 0x24, 0x2c, 0xc2, 0xfd, 0x92, 0x81, 0x88, - 0x54, 0x2b, 0xa0, 0x57, 0x20, 0x6a, 0x6f, 0xdb, 0x2f, 0x6c, 0xde, 0x9d, 0x45, 0x45, 0x0e, 0xef, - 0xec, 0x25, 0x22, 0xc6, 0xf7, 0x21, 0x4a, 0xf6, 0xf9, 0xae, 0x3d, 0x77, 0x16, 0x2e, 0x15, 0x24, - 0x21, 0xdf, 0x10, 0xe4, 0xa2, 0x50, 0x11, 0x1a, 0x82, 0xbc, 0x57, 0xad, 0x34, 0x77, 0x05, 0x96, - 0xc1, 0x9b, 0xe7, 0x5a, 0x73, 0xab, 0x52, 0xae, 0xef, 0xc8, 0x4d, 0xd1, 0xfa, 0x45, 0xb9, 0x61, - 0xc4, 0xc2, 0x62, 0xa5, 0x5c, 0x6f, 0x50, 0x42, 0x9d, 0x8d, 0x60, 0x4a, 0x49, 0x68, 0xc8, 0x85, - 0x7c, 0x2d, 0x5f, 0x28, 0x37, 0x1e, 0xb3, 0xd1, 0xad, 0xb8, 0xd9, 0x5f, 0xfe, 0xab, 0x11, 0xc8, - 0xe2, 0x22, 0xe3, 0x99, 0xec, 0x14, 0x02, 0xaa, 0xd9, 0xc8, 0x29, 0xab, 0x59, 0x9c, 0x4c, 0x0c, - 0x45, 0x3b, 0x54, 0x0d, 0x79, 0xa0, 0x18, 0x4f, 0x48, 0x45, 0x94, 0x94, 0xc0, 0x24, 0xd5, 0x14, - 0xe3, 0x89, 0xff, 0x66, 0x23, 0x76, 0xf6, 0xcd, 0x46, 0x7c, 0x86, 0xcd, 0x46, 0x62, 0xd6, 0xba, - 0xec, 0xbb, 0x0c, 0xac, 0xfa, 0xb8, 0x80, 0x2e, 0xc0, 0xd7, 0x3c, 0x0b, 0xf0, 0x96, 0x5d, 0x17, - 0xd6, 0x3e, 0xd1, 0x3a, 0xec, 0xef, 0x0c, 0x70, 0xd8, 0xca, 0x33, 0xaa, 0x87, 0x3d, 0x2e, 0x8d, - 0x8c, 0xb9, 0x74, 0xae, 0x52, 0xf8, 0x7d, 0x06, 0xae, 0xf8, 0x0e, 0x8e, 0x82, 0x9e, 0xf7, 0x80, - 0xfe, 0x9c, 0x0d, 0xfa, 0x27, 0x5d, 0xfe, 0x3e, 0x00, 0xb6, 0xa4, 0x1a, 0xb4, 0xec, 0x3f, 0x65, - 0x44, 0xff, 0x29, 0x03, 0x19, 0x87, 0x30, 0x1d, 0xcb, 0x3d, 0xcf, 0x58, 0xae, 0x5a, 0x49, 0xcd, - 0xdd, 0xee, 0x6c, 0x23, 0xc8, 0xd9, 0x11, 0xdb, 0xb1, 0x81, 0x61, 0x02, 0x37, 0x30, 0xae, 0x71, - 0xd6, 0xb4, 0xfe, 0xbe, 0x8a, 0xf9, 0xa7, 0x1d, 0xe7, 0xd7, 0xf0, 0xee, 0x71, 0x24, 0x3c, 0x71, - 0x9c, 0x63, 0xed, 0xce, 0xcd, 0x53, 0x45, 0x73, 0x7d, 0xcc, 0x99, 0x85, 0x3f, 0xa4, 0x33, 0x31, - 0x28, 0xff, 0x06, 0xcf, 0xc4, 0x73, 0xcd, 0xbc, 0x3b, 0xb6, 0x1f, 0x5f, 0xf5, 0xcd, 0xbc, 0x9c, - 0x6d, 0x76, 0xe6, 0x9c, 0xfb, 0x13, 0x06, 0x96, 0x7d, 0x05, 0xd0, 0xa6, 0x33, 0xdb, 0x5e, 0x0b, - 0xd6, 0xec, 0xcc, 0xb3, 0x75, 0x33, 0xcd, 0xde, 0x73, 0xa5, 0xd9, 0x1b, 0x93, 0x65, 0x9d, 0x09, - 0x76, 0xc9, 0x27, 0xc1, 0xda, 0x49, 0xf0, 0x77, 0x37, 0x20, 0x46, 0x00, 0x41, 0xaf, 0x42, 0xfa, - 0x50, 0xed, 0xa9, 0x9a, 0xd2, 0x95, 0x4d, 0xcc, 0xcc, 0x4e, 0xae, 0x8c, 0x30, 0xcb, 0x95, 0x4c, - 0xbe, 0x05, 0xe0, 0xe2, 0xa1, 0xe3, 0x1b, 0x89, 0xb0, 0xd4, 0x22, 0xd7, 0x27, 0x56, 0x42, 0x73, - 0x22, 0xbf, 0xe6, 0xd0, 0xe2, 0xbc, 0x64, 0xb1, 0x54, 0x65, 0x5a, 0x5e, 0x22, 0xd6, 0xd7, 0x26, - 0xc7, 0x85, 0x6e, 0x7d, 0x91, 0x31, 0x7d, 0xce, 0x43, 0x45, 0x5b, 0x5f, 0xdb, 0x4b, 0x44, 0x03, - 0x58, 0x6f, 0xd9, 0x55, 0x89, 0xec, 0x49, 0xbe, 0xa6, 0xee, 0xa8, 0x63, 0x9e, 0xd1, 0xbe, 0xfa, - 0x9f, 0x69, 0x59, 0x66, 0xd6, 0x5a, 0x13, 0xf8, 0x68, 0x08, 0xd7, 0x1d, 0x16, 0x8f, 0x7b, 0xbe, - 0x36, 0xcd, 0x54, 0x7c, 0xd7, 0xd7, 0xa6, 0x27, 0xe2, 0x5a, 0x56, 0xaf, 0xb5, 0x26, 0xb6, 0x40, - 0x27, 0xc0, 0x0f, 0xe9, 0x2e, 0x5a, 0xf6, 0xd9, 0xbc, 0x50, 0xc3, 0xe6, 0x89, 0xe0, 0xa7, 0x1c, - 0x86, 0x83, 0xb7, 0xde, 0x96, 0xe5, 0xf5, 0xe1, 0xe4, 0x26, 0xe8, 0x6d, 0x58, 0x25, 0xa1, 0xd0, - 0x77, 0xa8, 0x09, 0xc7, 0xad, 0x93, 0x69, 0x71, 0x2c, 0x97, 0x5b, 0x86, 0x2e, 0xf7, 0x7c, 0x39, - 0xa8, 0x0d, 0x57, 0x88, 0xfe, 0x00, 0x30, 0x17, 0x88, 0x85, 0x1b, 0x1e, 0x0b, 0x01, 0x30, 0x66, - 0x7b, 0x01, 0x3c, 0x24, 0x00, 0x3b, 0xc0, 0xc1, 0x53, 0x26, 0xb6, 0x4c, 0xd5, 0x49, 0xa2, 0x7a, - 0xd5, 0xa1, 0xda, 0x8e, 0xaf, 0x96, 0xc2, 0x0b, 0x03, 0x17, 0x05, 0x6d, 0x43, 0x06, 0x67, 0x71, - 0x9a, 0x1b, 0xa8, 0x1e, 0x18, 0xd3, 0x63, 0xe7, 0x23, 0x5b, 0xcf, 0x21, 0xa5, 0xb4, 0x09, 0x85, - 0xfb, 0x71, 0x18, 0x16, 0x9d, 0x4b, 0x0f, 0x6f, 0x26, 0x89, 0x32, 0xb9, 0x35, 0xba, 0xe8, 0xba, - 0x13, 0xb0, 0x4e, 0x5d, 0x1f, 0x05, 0x9c, 0x0d, 0x92, 0xaa, 0xf5, 0x13, 0x7d, 0x16, 0x96, 0x5b, - 0x0a, 0x99, 0x9d, 0x47, 0xc7, 0x3a, 0xee, 0xa9, 0x21, 0x6b, 0xaa, 0xa1, 0x9d, 0x90, 0x55, 0xbb, - 0x20, 0x21, 0x93, 0xb9, 0x7b, 0xac, 0x1b, 0x62, 0xdf, 0x90, 0x30, 0x07, 0x3d, 0x0f, 0x19, 0xd3, - 0x76, 0x5b, 0xd5, 0x5b, 0x5a, 0x67, 0x60, 0xe0, 0x38, 0x6f, 0xd6, 0x28, 0x2c, 0x61, 0x14, 0x47, - 0x74, 0xfe, 0x29, 0x4e, 0xe9, 0x6e, 0xf3, 0xee, 0x3a, 0x3f, 0x0d, 0xc9, 0xa6, 0x58, 0x14, 0xb6, - 0xcb, 0xa2, 0x50, 0x64, 0x19, 0xb4, 0x0e, 0x57, 0x9a, 0x62, 0xbd, 0x59, 0xab, 0x55, 0xa5, 0x86, - 0x50, 0x94, 0x25, 0xe1, 0x8d, 0xa6, 0x80, 0xab, 0x79, 0x41, 0xaa, 0x97, 0xab, 0x22, 0xbd, 0x56, - 0x2b, 0xd7, 0xeb, 0x65, 0xb1, 0x44, 0x98, 0x65, 0x49, 0x28, 0xca, 0xdb, 0x65, 0xa1, 0x52, 0x64, - 0x23, 0xdc, 0x37, 0x22, 0x90, 0x19, 0x8b, 0x2d, 0xe8, 0x0d, 0x1f, 0xac, 0x36, 0x27, 0x45, 0xa3, - 0x71, 0x8a, 0x17, 0x35, 0x5f, 0x08, 0xc2, 0x01, 0x10, 0xfc, 0x9b, 0x81, 0x65, 0x5f, 0x8d, 0xe3, - 0x1b, 0x9e, 0x7c, 0xa5, 0x22, 0x8b, 0xd5, 0x86, 0x5c, 0xde, 0xad, 0x55, 0x84, 0x5d, 0x41, 0x6c, - 0x10, 0x4c, 0x36, 0x60, 0xad, 0x5a, 0x13, 0xa4, 0x7c, 0xa3, 0x5c, 0x15, 0xe5, 0x9a, 0x20, 0x16, - 0xf1, 0xe0, 0xb7, 0xab, 0xd2, 0x68, 0xd3, 0xb3, 0x02, 0x4b, 0x65, 0x71, 0x2f, 0x5f, 0x29, 0x17, - 0x29, 0x4d, 0x16, 0xf3, 0xbb, 0x02, 0x1b, 0x41, 0xd7, 0x80, 0x73, 0xc2, 0x69, 0xed, 0x81, 0x64, - 0x29, 0x2f, 0x96, 0x04, 0x36, 0x8a, 0x56, 0x61, 0x99, 0x0a, 0xe4, 0x2b, 0x92, 0x90, 0x2f, 0x3e, - 0x96, 0x85, 0xb7, 0xca, 0xf5, 0x46, 0x9d, 0x8d, 0xa1, 0xab, 0xb0, 0xea, 0x14, 0xad, 0xe5, 0xa5, - 0xfc, 0xae, 0xd0, 0x10, 0x24, 0xf9, 0x91, 0xf0, 0x98, 0x8d, 0xa3, 0x2b, 0xb0, 0x62, 0x99, 0x1c, - 0xb1, 0xf6, 0xf2, 0x95, 0xa6, 0xc0, 0x26, 0xb8, 0x9f, 0x85, 0x21, 0x33, 0x16, 0x94, 0xa7, 0x3a, - 0x62, 0x4c, 0x62, 0x9c, 0x32, 0x97, 0x23, 0xbe, 0xc7, 0xc0, 0xb2, 0xaf, 0xc6, 0xf3, 0x73, 0xc4, - 0x2a, 0x2c, 0x7b, 0x1c, 0xb1, 0x93, 0x17, 0x8b, 0x15, 0xec, 0x8a, 0x11, 0xd4, 0xc5, 0xaa, 0x50, - 0x27, 0xda, 0x09, 0xd6, 0x6c, 0x94, 0xfb, 0x75, 0x14, 0xd6, 0x26, 0xe5, 0x19, 0x74, 0xe8, 0x83, - 0xdc, 0xce, 0x8c, 0x49, 0x6a, 0x22, 0x73, 0x1e, 0x3c, 0xd1, 0x6d, 0x58, 0xa0, 0x91, 0xcd, 0x3a, - 0xcf, 0x72, 0x95, 0xbd, 0x09, 0xb3, 0xec, 0xd5, 0xf9, 0xbf, 0x85, 0x9d, 0x27, 0x37, 0xfe, 0x9d, - 0x78, 0xc6, 0x2e, 0x40, 0x6b, 0x90, 0xf5, 0x2c, 0x04, 0x7a, 0xb2, 0x20, 0x14, 0xd9, 0x18, 0x5e, - 0x5f, 0xe4, 0x2e, 0xde, 0x23, 0x16, 0x47, 0x97, 0x01, 0xed, 0xe6, 0xdf, 0x92, 0xf3, 0x8d, 0x46, - 0xbe, 0xb0, 0x23, 0x14, 0xc9, 0x8d, 0x7d, 0x9d, 0x4d, 0xe0, 0xd5, 0xe1, 0x5c, 0x3c, 0xbb, 0xd5, - 0xa6, 0xd8, 0x90, 0xb7, 0x2b, 0xf9, 0x52, 0x9d, 0x4d, 0x7a, 0x99, 0xd4, 0x6e, 0xe3, 0x71, 0x4d, - 0x60, 0x01, 0x9b, 0x72, 0x32, 0xb7, 0xeb, 0x26, 0x23, 0x85, 0x96, 0xe0, 0xa2, 0x35, 0x2e, 0xd2, - 0x97, 0x72, 0x91, 0x5d, 0xe0, 0xfe, 0x1c, 0x71, 0xde, 0x78, 0xfa, 0xa6, 0xb2, 0xa7, 0x3e, 0x73, - 0xa7, 0x32, 0x73, 0xb1, 0x31, 0x85, 0x3d, 0xd7, 0x7a, 0xfc, 0x4e, 0x18, 0xf8, 0xe9, 0xea, 0x9f, - 0xf5, 0xcc, 0x08, 0xf0, 0x7d, 0xcc, 0xcf, 0x21, 0x71, 0x74, 0x17, 0x6e, 0x59, 0x11, 0xb8, 0xda, - 0x18, 0xcd, 0x8b, 0x46, 0x55, 0xae, 0xd7, 0x84, 0x42, 0x79, 0xbb, 0x4c, 0x27, 0x09, 0x9b, 0x40, - 0x97, 0x80, 0xa5, 0x72, 0x76, 0x26, 0x63, 0x17, 0xb8, 0xff, 0x84, 0x61, 0x7d, 0x4a, 0x19, 0x86, - 0x8e, 0x7c, 0x5c, 0x2a, 0xce, 0x5e, 0xc6, 0x4d, 0xe3, 0xcf, 0xe5, 0xd4, 0xdf, 0x30, 0x70, 0x63, - 0x06, 0xfd, 0x6e, 0xaf, 0x06, 0xc2, 0xcf, 0x4c, 0x5a, 0x49, 0xe1, 0x49, 0x2b, 0x29, 0x12, 0xb4, - 0x92, 0xa2, 0x3e, 0xd9, 0xb2, 0x2c, 0x6e, 0x57, 0xd9, 0x18, 0xf7, 0x5e, 0x04, 0x2e, 0xfb, 0x17, - 0xa4, 0xe8, 0x4b, 0x3e, 0x90, 0xbf, 0x3c, 0xb5, 0x8e, 0x0d, 0x20, 0xcf, 0x05, 0xf0, 0x47, 0xf4, - 0x6c, 0x6a, 0x96, 0x38, 0x3a, 0x6d, 0x4d, 0x30, 0xc1, 0xc8, 0x87, 0x27, 0x21, 0x1f, 0x99, 0x84, - 0x7c, 0x34, 0x08, 0xf9, 0x18, 0xba, 0x08, 0x29, 0x53, 0x8d, 0x20, 0x49, 0x55, 0x89, 0x8d, 0x07, - 0x2f, 0xc9, 0x04, 0xf7, 0xfb, 0xb0, 0x79, 0x38, 0xeb, 0x1b, 0xd4, 0x64, 0x1f, 0x77, 0xbc, 0x3e, - 0x43, 0xd1, 0x1f, 0xc8, 0x98, 0xb7, 0xb0, 0x58, 0x9b, 0xa4, 0xf8, 0x1c, 0x9d, 0x92, 0x81, 0x74, - 0x53, 0x74, 0x62, 0x18, 0x09, 0xc6, 0x30, 0xca, 0xfd, 0x8b, 0x81, 0x0b, 0xee, 0x4d, 0x0a, 0x7a, - 0xe4, 0x83, 0xdc, 0xa7, 0x03, 0xf7, 0x34, 0x9e, 0xcf, 0xb9, 0x50, 0x7a, 0x1b, 0xd0, 0xb8, 0x36, - 0x37, 0x34, 0xcb, 0x90, 0xd9, 0xca, 0x17, 0xe5, 0x5a, 0xa5, 0x59, 0x2a, 0x8b, 0x72, 0xa1, 0x2a, - 0x6e, 0x97, 0x4b, 0x2c, 0x83, 0x6e, 0xc2, 0xc6, 0x58, 0xcd, 0xbf, 0x53, 0xad, 0x37, 0xe4, 0xa2, - 0x80, 0xf1, 0x13, 0xc4, 0xc2, 0x63, 0x36, 0x4c, 0x06, 0xeb, 0xde, 0x49, 0x4d, 0x1d, 0xac, 0xbb, - 0xb9, 0xe7, 0x73, 0xde, 0xc1, 0x8e, 0x6b, 0x3b, 0xbf, 0xc1, 0x6e, 0x25, 0xe8, 0xfd, 0xde, 0xe6, - 0x2f, 0x18, 0x58, 0x28, 0x93, 0xb3, 0x5d, 0xe3, 0x04, 0x7d, 0x99, 0xbc, 0x0e, 0x1f, 0x7b, 0x0f, - 0x8f, 0x36, 0x26, 0x3c, 0x95, 0x27, 0x47, 0x76, 0xdc, 0xf5, 0xa9, 0x8f, 0xe9, 0xf9, 0x10, 0xda, - 0x81, 0xb4, 0xeb, 0x99, 0x35, 0x5a, 0xf5, 0x7b, 0x7a, 0x6d, 0x2a, 0xe4, 0x82, 0x5f, 0x65, 0xf3, - 0xa1, 0xcd, 0x0f, 0x63, 0x00, 0xa3, 0xd4, 0x8f, 0x04, 0x58, 0x74, 0xee, 0x90, 0x50, 0x36, 0xe8, - 0x99, 0x31, 0xb7, 0x1a, 0xf8, 0x4a, 0x97, 0x0f, 0x61, 0x35, 0xce, 0xfa, 0x9e, 0xaa, 0xf1, 0x79, - 0x52, 0x47, 0xd5, 0xf8, 0x3d, 0x46, 0xe3, 0x43, 0xe8, 0x00, 0x56, 0x02, 0xca, 0x55, 0x74, 0x63, - 0xf2, 0x3b, 0x27, 0x53, 0xf9, 0xcd, 0x59, 0x1e, 0x43, 0xf1, 0x21, 0xd4, 0x85, 0xd5, 0xc0, 0xf2, - 0x07, 0xdd, 0x9a, 0xf6, 0xf4, 0xc4, 0xb4, 0x75, 0x7b, 0xb6, 0x17, 0x2a, 0x7c, 0x08, 0xf5, 0x81, - 0x0b, 0xce, 0xcb, 0xe8, 0xf6, 0xd4, 0xa7, 0x17, 0xa6, 0xbd, 0xe7, 0x66, 0x7c, 0xa2, 0xc1, 0x87, - 0xd0, 0x16, 0xa4, 0x1c, 0xef, 0x00, 0xd0, 0xca, 0xf8, 0xcb, 0x00, 0x53, 0x65, 0x36, 0xe8, 0xc9, - 0x80, 0xa9, 0xc3, 0x71, 0x03, 0x4d, 0x75, 0x8c, 0xdf, 0x97, 0x53, 0x1d, 0x3e, 0x97, 0xd5, 0x5e, - 0x98, 0x3d, 0x07, 0xc7, 0x63, 0x30, 0xfb, 0x9f, 0x68, 0x8f, 0xc1, 0x1c, 0x70, 0xfe, 0xcc, 0x87, - 0x36, 0xbf, 0x1d, 0x81, 0x28, 0x5e, 0xf6, 0xa8, 0x01, 0x99, 0xb1, 0x34, 0x8d, 0xae, 0x06, 0x5d, - 0x60, 0x99, 0x66, 0xae, 0x4d, 0xbe, 0xdf, 0xe2, 0x43, 0xe8, 0x8b, 0xb0, 0xe4, 0x93, 0x69, 0xd0, - 0x7a, 0xf0, 0x1d, 0x8d, 0xa9, 0x79, 0x63, 0xda, 0x25, 0x0e, 0x1f, 0x42, 0x2f, 0x43, 0xd2, 0x8e, - 0x59, 0x68, 0xd9, 0x7b, 0x53, 0x62, 0xea, 0xb9, 0xec, 0x7f, 0x81, 0x62, 0x4a, 0xdb, 0xe1, 0x9d, - 0x4a, 0x7b, 0x2f, 0x39, 0xa8, 0xf4, 0xd8, 0xb5, 0xc4, 0x68, 0x5c, 0x5e, 0xf7, 0xac, 0x07, 0x9f, - 0xf8, 0x7b, 0xc7, 0x15, 0xe8, 0x92, 0xfd, 0x38, 0xf9, 0x13, 0xd2, 0xe7, 0xfe, 0x1b, 0x00, 0x00, - 0xff, 0xff, 0x9c, 0x97, 0x7c, 0x25, 0x91, 0x34, 0x00, 0x00, + // 3440 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5b, 0x4b, 0x70, 0x23, 0x57, + 0xd5, 0x76, 0xeb, 0x69, 0x1d, 0x59, 0x33, 0xad, 0xeb, 0xf1, 0x58, 0x6e, 0x7b, 0xc6, 0x9e, 0x9e, + 0x47, 0x66, 0xfe, 0x24, 0xca, 0x1f, 0x53, 0xc5, 0x64, 0x66, 0xf2, 0x92, 0xa5, 0xb6, 0xdc, 0x8c, + 0xdc, 0x52, 0x5a, 0xb2, 0x93, 0x81, 0x22, 0x5d, 0x6d, 0xa9, 0xc7, 0x23, 0x46, 0x96, 0x94, 0xee, + 0xb6, 0x2a, 0x5e, 0xf3, 0x28, 0x48, 0xb1, 0x82, 0xaa, 0x04, 0x58, 0xc0, 0x22, 0x6c, 0xa8, 0xa2, + 0x58, 0x40, 0x01, 0x45, 0x51, 0x2c, 0x80, 0x82, 0x15, 0x14, 0xc5, 0x86, 0xb0, 0x61, 0xc1, 0x22, + 0x45, 0x85, 0x15, 0x5b, 0x76, 0x54, 0xdf, 0xbe, 0xdd, 0xea, 0xa7, 0x1e, 0x96, 0x27, 0xc9, 0x4e, + 0x7d, 0xce, 0x3d, 0xe7, 0xdc, 0xfb, 0x9d, 0xc7, 0x3d, 0xb7, 0xfb, 0x0a, 0x52, 0x4d, 0xad, 0x9d, + 0xef, 0xab, 0x3d, 0xbd, 0x87, 0xa2, 0x4d, 0xad, 0xcd, 0x5e, 0x82, 0xd5, 0xb2, 0xa2, 0xd7, 0x8f, + 0xfb, 0xfd, 0x9e, 0xaa, 0x2b, 0xad, 0x7d, 0x45, 0xd5, 0xda, 0xbd, 0xae, 0x26, 0x2a, 0x6f, 0x1d, + 0x2b, 0x9a, 0xce, 0xfe, 0x8d, 0x82, 0xb5, 0x60, 0xbe, 0xd6, 0xef, 0x75, 0x35, 0x05, 0x6d, 0x41, + 0x42, 0x55, 0xb4, 0xe3, 0x8e, 0x9e, 0xa3, 0x36, 0xa8, 0x9b, 0xe9, 0xcd, 0x9b, 0x79, 0xc3, 0xc0, + 0x28, 0x91, 0xbc, 0x88, 0xc7, 0xef, 0xcc, 0x89, 0x44, 0x12, 0xb1, 0x10, 0x57, 0x54, 0xb5, 0xa7, + 0xe6, 0x22, 0x58, 0x05, 0x60, 0x15, 0x9c, 0x41, 0xd9, 0x99, 0x13, 0x4d, 0x16, 0xc3, 0x41, 0xc2, + 0x94, 0x43, 0xf7, 0x00, 0x69, 0x96, 0x6e, 0x69, 0x40, 0x94, 0xe7, 0xa8, 0x8d, 0xe8, 0xcd, 0xf4, + 0xe6, 0x02, 0x16, 0x25, 0x16, 0xc5, 0xac, 0xe6, 0x9d, 0xc3, 0x56, 0x12, 0xe2, 0xaa, 0xd2, 0xef, + 0x9c, 0xb0, 0xf7, 0x21, 0x49, 0x88, 0xe8, 0x02, 0xc4, 0x8f, 0xe4, 0x2f, 0xf5, 0x54, 0xbc, 0x82, + 0x8c, 0x68, 0x3e, 0x60, 0x6a, 0xbb, 0x4b, 0x26, 0x65, 0x50, 0x8d, 0x07, 0x83, 0xda, 0x97, 0xf5, + 0xe6, 0xa3, 0x5c, 0xd4, 0xa4, 0xe2, 0x07, 0xf6, 0x65, 0xb8, 0x50, 0x56, 0xf4, 0x5a, 0xe7, 0xf8, + 0xb0, 0xdd, 0xe5, 0xbb, 0x0f, 0x7b, 0x04, 0x3d, 0x74, 0x03, 0x92, 0x64, 0x82, 0x04, 0x1d, 0xf7, + 0xfc, 0x2c, 0x26, 0xfb, 0xd7, 0x08, 0x2c, 0x79, 0x14, 0x10, 0x78, 0xef, 0x79, 0xe0, 0xbd, 0x62, + 0xc1, 0xeb, 0x1f, 0x7b, 0x3a, 0x5c, 0xff, 0x4c, 0xd9, 0xc0, 0x22, 0x88, 0x75, 0xe5, 0x23, 0x05, + 0x5b, 0x4a, 0x89, 0xf8, 0x37, 0xba, 0x0e, 0xe7, 0x06, 0x4a, 0xb7, 0xd5, 0x53, 0x2d, 0xa4, 0xb1, + 0xae, 0x94, 0x98, 0x31, 0xa9, 0x16, 0x84, 0xf7, 0x61, 0xfe, 0x48, 0xee, 0xb6, 0x1f, 0x2a, 0x9a, + 0x9e, 0x8b, 0x62, 0x4f, 0x3c, 0x37, 0x76, 0xa2, 0xf9, 0x5d, 0x22, 0xc1, 0x75, 0x75, 0xf5, 0x44, + 0xb4, 0x15, 0x30, 0xf7, 0x20, 0xe3, 0x62, 0x21, 0x1a, 0xa2, 0x8f, 0x95, 0x13, 0x32, 0x2f, 0xe3, + 0xa7, 0xe1, 0x86, 0x81, 0xdc, 0x39, 0x56, 0xc8, 0x6c, 0xcc, 0x87, 0xbb, 0x91, 0x17, 0xa8, 0xa1, + 0x83, 0xbf, 0x17, 0x85, 0xc5, 0xa2, 0xaa, 0xc8, 0xba, 0xb2, 0xdf, 0xeb, 0x1c, 0x1f, 0x29, 0x53, + 0xfa, 0xc4, 0x46, 0x23, 0xe2, 0x40, 0xe3, 0x0e, 0x9c, 0x6b, 0xca, 0x7d, 0xb9, 0xd9, 0xd6, 0x4f, + 0x24, 0x55, 0xee, 0x1e, 0x2a, 0x38, 0x0c, 0xd2, 0x9b, 0x08, 0xab, 0x28, 0x12, 0x96, 0x68, 0x70, + 0xc4, 0x4c, 0xd3, 0xf9, 0x88, 0xb6, 0x61, 0x71, 0x80, 0xe7, 0x21, 0x19, 0xf4, 0x83, 0x76, 0xa7, + 0xad, 0xb7, 0x15, 0x2d, 0x17, 0xc3, 0x60, 0x2d, 0x99, 0x53, 0xc0, 0xfc, 0xa2, 0xc5, 0x3e, 0x11, + 0xd1, 0xc0, 0x4d, 0x69, 0x2b, 0x1a, 0xda, 0x01, 0xe8, 0xcb, 0xaa, 0x7c, 0xa4, 0xe8, 0x8a, 0xaa, + 0xe5, 0xe2, 0x58, 0xdc, 0xcc, 0xb9, 0x80, 0xc5, 0xe6, 0x6b, 0xf6, 0x50, 0x13, 0x64, 0x87, 0x2c, + 0xba, 0x07, 0xf4, 0xb1, 0xa6, 0xa8, 0x52, 0x53, 0x55, 0x5a, 0x4a, 0x57, 0x6f, 0xcb, 0x1d, 0x2d, + 0x97, 0xc0, 0xcb, 0xa1, 0x2d, 0x7d, 0x16, 0x5d, 0x3c, 0x6f, 0x8c, 0x74, 0x10, 0x98, 0x97, 0xe0, + 0xbc, 0x47, 0xf7, 0x34, 0x5e, 0x62, 0x7f, 0x4d, 0xc1, 0x05, 0xf7, 0x7c, 0x49, 0xbc, 0xdf, 0xf5, + 0xc4, 0xfb, 0x46, 0xc0, 0xd2, 0x66, 0x09, 0xf7, 0xbb, 0x76, 0xb4, 0xff, 0x3f, 0xa4, 0x89, 0x43, + 0xda, 0xdd, 0x87, 0x3d, 0x62, 0xee, 0xbc, 0xc3, 0x11, 0x38, 0x64, 0x61, 0x60, 0xff, 0x1e, 0x86, + 0xd6, 0xf7, 0x63, 0x40, 0x7b, 0x9d, 0x85, 0xee, 0x40, 0xfc, 0xa0, 0xd3, 0x6b, 0x3e, 0x76, 0x25, + 0xaa, 0x77, 0x54, 0x7e, 0xcb, 0x18, 0x62, 0x52, 0x8d, 0x49, 0x61, 0x09, 0x43, 0xf4, 0xa8, 0x77, + 0xdc, 0xd5, 0xc9, 0xc4, 0x43, 0x44, 0x77, 0x8d, 0x21, 0x43, 0x51, 0x2c, 0x81, 0x0a, 0x90, 0x96, + 0x9b, 0x4d, 0x45, 0xd3, 0xa4, 0xa3, 0x5e, 0xcb, 0x0a, 0xc7, 0x8d, 0x60, 0x05, 0x05, 0x3c, 0x70, + 0xb7, 0xd7, 0x52, 0x44, 0x90, 0xed, 0xdf, 0x4c, 0x06, 0xd2, 0x8e, 0x59, 0x31, 0x65, 0x48, 0x3b, + 0x2c, 0xa1, 0x65, 0x48, 0x3e, 0xd4, 0x24, 0xfd, 0xa4, 0x6f, 0xd5, 0x85, 0xc4, 0x43, 0xad, 0x71, + 0xd2, 0x57, 0xd0, 0x3a, 0xa4, 0xf1, 0x14, 0xa4, 0x87, 0x1d, 0xf9, 0x50, 0xcb, 0x45, 0x36, 0xa2, + 0x37, 0x53, 0x22, 0x60, 0xd2, 0xb6, 0x41, 0x61, 0x3e, 0xa2, 0x00, 0x86, 0x26, 0xd1, 0x1d, 0x88, + 0xe1, 0x29, 0x1a, 0x5a, 0xce, 0x6d, 0x5e, 0x1f, 0x37, 0xc5, 0x3c, 0x9e, 0x27, 0x16, 0x61, 0x7f, + 0x40, 0x41, 0x0c, 0xeb, 0x48, 0x43, 0x72, 0x4f, 0xb8, 0x2f, 0x54, 0x5f, 0x17, 0xe8, 0x39, 0x74, + 0x11, 0x50, 0x9d, 0x17, 0xca, 0x15, 0x4e, 0x12, 0xaa, 0x25, 0x4e, 0x7a, 0x5d, 0xe4, 0x1b, 0x9c, + 0x48, 0x53, 0x68, 0x15, 0x96, 0x9d, 0x74, 0x91, 0x2b, 0x94, 0x38, 0x51, 0xaa, 0x0a, 0x95, 0x07, + 0x74, 0x04, 0x31, 0x70, 0x71, 0x77, 0xaf, 0xd2, 0xe0, 0xfd, 0xbc, 0x28, 0x5a, 0x83, 0x9c, 0x83, + 0x47, 0x74, 0x10, 0xb5, 0x31, 0x43, 0xad, 0x83, 0x6b, 0xfe, 0x24, 0xcc, 0xf8, 0x56, 0xc6, 0x76, + 0x83, 0x81, 0x14, 0xfb, 0x3a, 0x64, 0x5c, 0xc5, 0xc0, 0x28, 0xa3, 0xaa, 0xf2, 0xd6, 0x71, 0x5b, + 0x55, 0x5a, 0xd2, 0xc1, 0x89, 0xae, 0x68, 0x18, 0x86, 0x98, 0x98, 0xb1, 0xa8, 0x5b, 0x06, 0xd1, + 0xc0, 0xb4, 0xd3, 0x3e, 0x6a, 0xeb, 0x64, 0x4c, 0x04, 0x8f, 0x01, 0x4c, 0xc2, 0x03, 0xd8, 0x37, + 0x01, 0x86, 0xc1, 0x69, 0x68, 0xb5, 0xcb, 0x91, 0x4b, 0xab, 0x45, 0x35, 0xb5, 0xde, 0x82, 0xc4, + 0x23, 0xb9, 0xdb, 0xea, 0x28, 0x24, 0xbe, 0xb2, 0x0e, 0xec, 0x77, 0x30, 0x43, 0x24, 0x03, 0xd8, + 0xef, 0x50, 0xb0, 0xe0, 0x64, 0xa0, 0x73, 0x10, 0x69, 0xb7, 0x88, 0xe7, 0x23, 0xed, 0x16, 0xba, + 0x07, 0xf3, 0x47, 0x8a, 0x2e, 0xb7, 0x64, 0x5d, 0xc6, 0x2e, 0x4f, 0x6f, 0xae, 0xfb, 0xb4, 0xe5, + 0x77, 0xc9, 0x08, 0xab, 0xb0, 0x93, 0x47, 0x5c, 0xd8, 0x9d, 0xac, 0xa9, 0x4a, 0xc6, 0x00, 0xd2, + 0x8e, 0x02, 0x84, 0xf2, 0x10, 0xc3, 0x93, 0x30, 0xf7, 0x7d, 0xc6, 0x5b, 0xb1, 0xf2, 0x25, 0xdb, + 0x3e, 0x1e, 0xc7, 0xdc, 0x86, 0x54, 0xe9, 0x54, 0x76, 0x7f, 0x4a, 0xc1, 0x62, 0x49, 0xe9, 0x28, + 0xa7, 0xdd, 0x47, 0x3e, 0x0b, 0x19, 0x52, 0x67, 0xc6, 0x39, 0x61, 0x61, 0xe0, 0x44, 0x3e, 0xa8, + 0x3c, 0x47, 0x27, 0x2c, 0xcf, 0xec, 0x37, 0x28, 0xb8, 0xe0, 0x9e, 0xf4, 0xc8, 0xfa, 0x1a, 0x34, + 0xf4, 0x74, 0xf5, 0x75, 0xde, 0xaa, 0xaf, 0xc3, 0x6a, 0xf9, 0xfb, 0x08, 0x5c, 0x2e, 0xf6, 0xba, + 0xba, 0xda, 0xeb, 0x74, 0x14, 0xb5, 0x76, 0x7c, 0xd0, 0x69, 0x6b, 0x8f, 0x3e, 0x5e, 0x2c, 0xaf, + 0x41, 0xb2, 0xdb, 0x6b, 0x29, 0x52, 0xbb, 0x45, 0x20, 0x4c, 0x63, 0x09, 0xa1, 0xd7, 0x52, 0xf8, + 0x92, 0x98, 0x30, 0x78, 0x7c, 0x0b, 0x6d, 0x41, 0xd6, 0xbb, 0x45, 0x9f, 0xe4, 0x62, 0x78, 0x7c, + 0xc8, 0x06, 0x4d, 0x0f, 0xbc, 0xbb, 0x00, 0x03, 0xf3, 0xaa, 0x22, 0xb7, 0x7a, 0xdd, 0xce, 0x49, + 0x2e, 0xbe, 0x41, 0xdd, 0x9c, 0x17, 0xed, 0xe7, 0x99, 0x36, 0x5c, 0xf6, 0x5f, 0x14, 0xac, 0x87, + 0xa2, 0x48, 0x9c, 0xcb, 0x79, 0x9c, 0xfb, 0xb4, 0xa9, 0x76, 0xb4, 0xd4, 0xe9, 0xfc, 0x5c, 0xb3, + 0xf7, 0xd1, 0x6d, 0x58, 0xec, 0x9b, 0x7a, 0x25, 0xff, 0x7e, 0x7a, 0x11, 0xcb, 0xba, 0xec, 0xe2, + 0x6d, 0x35, 0xdb, 0xf7, 0x92, 0x86, 0xf1, 0xa2, 0x43, 0xc2, 0x74, 0x0c, 0x7a, 0x0e, 0x12, 0x38, + 0x0f, 0xad, 0xee, 0x7e, 0xd9, 0xe1, 0xb5, 0xfc, 0x3e, 0xe6, 0x98, 0x29, 0x4e, 0x86, 0x31, 0x77, + 0x20, 0xed, 0x20, 0x4f, 0x95, 0xe6, 0xef, 0x50, 0x90, 0xf5, 0xcd, 0xd3, 0x48, 0x17, 0xd7, 0x0c, + 0xd8, 0xe0, 0xf5, 0x9c, 0xf5, 0x64, 0x3e, 0xa4, 0x60, 0x63, 0xe8, 0xb6, 0xbd, 0x6e, 0xff, 0xd3, + 0x9b, 0x34, 0x41, 0x41, 0x1d, 0x9b, 0x34, 0xa8, 0xdf, 0xa7, 0xe0, 0xca, 0x88, 0x75, 0x92, 0xb0, + 0x2e, 0x7b, 0xc2, 0xfa, 0x59, 0x4f, 0x58, 0x87, 0xc8, 0x9d, 0x59, 0x01, 0xfb, 0x03, 0x05, 0x57, + 0xf6, 0xe5, 0x4e, 0xbb, 0x65, 0xf7, 0xa0, 0xce, 0x8e, 0x7c, 0x5a, 0x77, 0x78, 0xfa, 0xce, 0xc8, + 0xd8, 0xbe, 0x33, 0xec, 0xe8, 0x10, 0x9d, 0xf2, 0xe8, 0xc0, 0xfe, 0x83, 0x02, 0x76, 0xd4, 0x3a, + 0x08, 0xdc, 0x3b, 0x1e, 0xb8, 0xf3, 0xa6, 0x85, 0xb1, 0x82, 0xa7, 0xc3, 0xfb, 0x55, 0xbb, 0x90, + 0xac, 0x41, 0xca, 0x3e, 0xaf, 0x63, 0xd3, 0xf3, 0xe2, 0x90, 0x80, 0x72, 0x90, 0x3c, 0x52, 0x34, + 0x4d, 0x3e, 0xb4, 0xd2, 0xc5, 0x7a, 0x1c, 0xfa, 0xe9, 0x2b, 0x14, 0xa0, 0x4a, 0x5b, 0x23, 0x9d, + 0xeb, 0xd4, 0x8e, 0x31, 0x1a, 0x5a, 0xf9, 0x6d, 0x49, 0xe9, 0xea, 0x6a, 0x9b, 0x34, 0x5f, 0x19, + 0x11, 0x8e, 0xe4, 0xb7, 0x39, 0x93, 0x62, 0xb4, 0x5b, 0x9a, 0x2e, 0xab, 0x7a, 0xbb, 0x7b, 0x28, + 0xe9, 0xbd, 0xc7, 0x4a, 0x17, 0xe7, 0x45, 0x4a, 0xcc, 0x58, 0xd4, 0x86, 0x41, 0x64, 0xdf, 0x8f, + 0xc0, 0xa2, 0x6b, 0x1a, 0x04, 0xd7, 0x3b, 0x1e, 0x5c, 0xcd, 0xc6, 0x29, 0x60, 0xe4, 0xe9, 0x80, + 0x7c, 0x7f, 0x78, 0x90, 0x7f, 0x05, 0x92, 0xd6, 0x2a, 0xcc, 0xb2, 0x75, 0x7d, 0x8c, 0xa9, 0xbc, + 0x59, 0xb9, 0x2c, 0x29, 0x74, 0x09, 0xa0, 0xab, 0xbc, 0xad, 0x93, 0x55, 0x9a, 0x78, 0xa7, 0x0c, + 0x0a, 0x5e, 0x21, 0x73, 0x07, 0xe2, 0x66, 0x4d, 0x9b, 0xe1, 0x0c, 0xf5, 0xcd, 0x08, 0xa0, 0xb2, + 0xa2, 0xdb, 0x6d, 0xf2, 0x94, 0xce, 0x0a, 0xc9, 0x89, 0xc8, 0xb4, 0xc7, 0xe9, 0xb2, 0xeb, 0x38, + 0x6d, 0xa6, 0xd4, 0x53, 0xd6, 0xab, 0x0b, 0xcf, 0xe4, 0x46, 0x9d, 0xa6, 0x67, 0x3d, 0x10, 0xff, + 0x82, 0x82, 0x45, 0x97, 0xc5, 0x91, 0x41, 0x13, 0x30, 0xf2, 0x74, 0x41, 0x73, 0xdb, 0x8e, 0x99, + 0x67, 0x01, 0xc9, 0x03, 0xb9, 0xdd, 0x91, 0x0f, 0x3a, 0x26, 0xa6, 0x86, 0x72, 0x72, 0x9e, 0xc8, + 0xda, 0x1c, 0xcb, 0xea, 0xd0, 0x8f, 0x9f, 0x73, 0xee, 0x54, 0x64, 0x5e, 0xa7, 0x2c, 0x8d, 0xec, + 0x47, 0xae, 0xed, 0xc0, 0xa7, 0x6c, 0xc2, 0xed, 0x20, 0x44, 0xee, 0x74, 0x00, 0x09, 0x36, 0x40, + 0x25, 0x58, 0x08, 0x08, 0xb5, 0x0d, 0x8f, 0xf1, 0xba, 0xa2, 0x0e, 0xda, 0x4d, 0x67, 0xd4, 0xb9, + 0xa4, 0x86, 0xb8, 0xbd, 0x17, 0x81, 0xd5, 0x11, 0x62, 0xe8, 0x05, 0x88, 0xaa, 0xfd, 0x26, 0x59, + 0xe2, 0xb5, 0x71, 0x56, 0xf2, 0x62, 0xad, 0xb8, 0x33, 0x27, 0x1a, 0x22, 0xcc, 0xcf, 0x29, 0x88, + 0x8a, 0xb5, 0x22, 0x7a, 0x09, 0x62, 0xf6, 0xb1, 0xfd, 0xdc, 0xe6, 0xad, 0x49, 0x54, 0xe4, 0x8d, + 0x93, 0xbd, 0x88, 0xc5, 0xd8, 0x1e, 0xc4, 0xf0, 0x39, 0xdf, 0x75, 0xe6, 0xce, 0xc1, 0x85, 0xa2, + 0xc8, 0x15, 0x1a, 0x9c, 0x54, 0xe2, 0x2a, 0x5c, 0x83, 0x93, 0xf6, 0xab, 0x95, 0xbd, 0x5d, 0x8e, + 0xa6, 0x8c, 0xc3, 0x73, 0x6d, 0x6f, 0xab, 0xc2, 0xd7, 0x77, 0xa4, 0x3d, 0xc1, 0xfa, 0x45, 0xb8, + 0x11, 0x44, 0xc3, 0x42, 0x85, 0xaf, 0x37, 0x08, 0xa1, 0x4e, 0x47, 0x0d, 0x4a, 0x99, 0x6b, 0x48, + 0xc5, 0x42, 0xad, 0x50, 0xe4, 0x1b, 0x0f, 0xe8, 0xd8, 0x56, 0xc2, 0x9c, 0x2f, 0xfb, 0xdd, 0x08, + 0xe4, 0x8c, 0x26, 0x83, 0x74, 0x59, 0x25, 0xc5, 0x98, 0xe7, 0xb4, 0xf5, 0x61, 0x15, 0x52, 0x56, + 0x65, 0x6a, 0x91, 0x6c, 0x9b, 0x27, 0x65, 0xa8, 0x15, 0xd6, 0xb2, 0x46, 0xa7, 0x6c, 0x59, 0xd1, + 0x33, 0x80, 0x0e, 0x3b, 0xbd, 0x03, 0xb9, 0x23, 0xe9, 0xb2, 0x7a, 0xa8, 0xe8, 0x52, 0x5f, 0xd6, + 0x1f, 0xe1, 0xee, 0x27, 0x25, 0xd2, 0x26, 0xa7, 0x81, 0x19, 0x35, 0x59, 0x7f, 0x14, 0x7c, 0xbc, + 0x88, 0x4f, 0x75, 0xbc, 0x60, 0xbf, 0x4d, 0xc1, 0x4a, 0x00, 0x36, 0x24, 0x33, 0x5e, 0xf1, 0x64, + 0xc6, 0x75, 0xbb, 0x61, 0x0b, 0x1c, 0x7f, 0x66, 0x0d, 0xd2, 0x9f, 0x28, 0x60, 0x0c, 0x2b, 0x76, + 0x23, 0xf6, 0x04, 0x7c, 0x16, 0x8c, 0x75, 0x34, 0x04, 0xeb, 0x99, 0xba, 0xd2, 0xf7, 0x28, 0x58, + 0x0d, 0x5c, 0x0e, 0x81, 0xb9, 0xe0, 0x81, 0xf9, 0x29, 0x1b, 0xe6, 0x10, 0x89, 0x33, 0x03, 0xfa, + 0x27, 0x51, 0x57, 0x6a, 0x7c, 0xbc, 0xe7, 0x81, 0x4f, 0x26, 0x6b, 0xd6, 0x21, 0xed, 0x1c, 0x16, + 0xc7, 0xc3, 0x40, 0x1f, 0x93, 0x56, 0x89, 0xd3, 0x9f, 0xda, 0x93, 0x13, 0x9c, 0xda, 0xe7, 0x27, + 0x0d, 0x25, 0x4f, 0xbe, 0x7a, 0x0e, 0x36, 0x63, 0xf3, 0xf5, 0x09, 0x1d, 0x68, 0xbe, 0x1e, 0xf1, + 0xe4, 0xeb, 0xc7, 0x1b, 0x48, 0xd3, 0xa5, 0xb2, 0x27, 0x00, 0x62, 0xbe, 0x00, 0x08, 0x72, 0x50, + 0xfc, 0xd4, 0xb9, 0xee, 0x71, 0xd1, 0x04, 0xb9, 0xfe, 0x84, 0x9c, 0x74, 0x17, 0xe8, 0xb2, 0xa2, + 0x93, 0xd3, 0xf6, 0x94, 0x8d, 0xd4, 0x8f, 0x28, 0xc8, 0x3a, 0x84, 0xc9, 0x5a, 0x6e, 0x7b, 0xd6, + 0x72, 0xc9, 0xea, 0x25, 0xdd, 0xe3, 0x4e, 0xb7, 0x82, 0xbc, 0xdd, 0x28, 0x39, 0xde, 0x1b, 0x50, + 0xa1, 0xef, 0x0d, 0x5c, 0xeb, 0xac, 0xa9, 0xbd, 0x03, 0xc5, 0xe0, 0x4f, 0xbb, 0xce, 0x2f, 0x53, + 0x90, 0x75, 0x08, 0x8f, 0x5c, 0xa7, 0x6f, 0xdc, 0x99, 0x79, 0xaa, 0x64, 0x66, 0xd3, 0x8c, 0xcd, + 0xef, 0x07, 0x24, 0x12, 0xc3, 0xda, 0xde, 0xf0, 0x48, 0x3c, 0xd3, 0x86, 0x77, 0xc7, 0xf6, 0xe3, + 0xcb, 0x81, 0x0d, 0x2f, 0x63, 0x9b, 0x9d, 0xb8, 0xd5, 0xfd, 0x23, 0x05, 0x4b, 0x81, 0x02, 0x68, + 0xd3, 0xd9, 0xe4, 0x5e, 0x0e, 0xd7, 0xec, 0x6c, 0x6f, 0xdf, 0x32, 0xbb, 0xdb, 0xdb, 0xae, 0xee, + 0xf6, 0xea, 0x68, 0x59, 0x67, 0x5f, 0xfb, 0x7c, 0x50, 0x5f, 0x1b, 0xd8, 0xbd, 0x96, 0xb8, 0x7d, + 0xbe, 0xc8, 0xd1, 0x94, 0xdd, 0x99, 0x7e, 0xf5, 0x16, 0xc4, 0x31, 0x5c, 0xe8, 0x65, 0xc8, 0x1c, + 0x2a, 0x5d, 0x45, 0x95, 0x3b, 0x92, 0x89, 0xa8, 0xb9, 0x84, 0xe5, 0x21, 0xa2, 0xf9, 0xb2, 0xc9, + 0xb7, 0xe0, 0x5d, 0x38, 0x74, 0x3c, 0x23, 0x01, 0x16, 0x9b, 0xf8, 0x9b, 0xa6, 0xb5, 0x95, 0x3a, + 0xfd, 0xb2, 0xe6, 0xd0, 0xe2, 0xfc, 0xf2, 0x69, 0xa9, 0xca, 0x36, 0xbd, 0x44, 0x43, 0x5f, 0x0b, + 0xbf, 0xc3, 0x77, 0xeb, 0x8b, 0xfa, 0xf4, 0x39, 0xdf, 0xf4, 0xdb, 0xfa, 0x5a, 0x5e, 0x22, 0xea, + 0xc3, 0x7a, 0xd3, 0x3e, 0x2a, 0x48, 0x9e, 0x6d, 0xdf, 0xd4, 0x1d, 0x73, 0x44, 0x21, 0x99, 0x6b, + 0xf0, 0x8b, 0x66, 0xcb, 0xcc, 0x5a, 0x73, 0x04, 0x1f, 0x0d, 0xe0, 0x8a, 0xc3, 0xe2, 0x71, 0x37, + 0xd0, 0xa6, 0x59, 0xd6, 0x6f, 0x05, 0xda, 0xf4, 0xd4, 0x63, 0xcb, 0xea, 0xe5, 0xe6, 0xc8, 0x11, + 0xe8, 0x04, 0xd8, 0x01, 0x79, 0xb5, 0x25, 0x05, 0xbc, 0x51, 0x20, 0x86, 0xcd, 0x7e, 0xe2, 0xff, + 0x1c, 0x86, 0xc3, 0xdf, 0x87, 0x59, 0x96, 0xd7, 0x07, 0xa3, 0x87, 0xa0, 0x37, 0x61, 0x05, 0x17, + 0xca, 0xc0, 0xa5, 0x26, 0x1d, 0x9f, 0x82, 0x4d, 0x8b, 0xbe, 0xbe, 0xc0, 0x32, 0x74, 0xb1, 0x1b, + 0xc8, 0x41, 0x2d, 0x58, 0xc5, 0xfa, 0x43, 0xc0, 0x34, 0x9b, 0x98, 0xab, 0x1e, 0x0b, 0x21, 0x30, + 0xe6, 0xba, 0x21, 0x3c, 0xc4, 0x01, 0xdd, 0x37, 0x4a, 0xab, 0x84, 0x6d, 0x99, 0xaa, 0x53, 0x58, + 0xf5, 0x8a, 0x43, 0xb5, 0x5d, 0x7d, 0x2d, 0x85, 0xe7, 0xfa, 0x2e, 0x0a, 0xda, 0x86, 0xac, 0xb1, + 0xc7, 0x93, 0x9d, 0x83, 0xe8, 0x01, 0x9f, 0x1e, 0x7b, 0xb7, 0xb2, 0xf5, 0x1c, 0x12, 0x4a, 0x0b, + 0x53, 0x98, 0x1f, 0x46, 0x60, 0xc1, 0x99, 0x7a, 0xa8, 0x0c, 0x80, 0x95, 0x49, 0xcd, 0xe1, 0xd7, + 0xe7, 0x9b, 0x21, 0x79, 0xea, 0x7a, 0x28, 0x1a, 0x7b, 0x45, 0x4a, 0xb1, 0x7e, 0xa2, 0xe7, 0x61, + 0xa9, 0x29, 0xe3, 0xe8, 0x3c, 0x3a, 0xd6, 0x8c, 0x99, 0xea, 0x92, 0xaa, 0xe8, 0xea, 0x09, 0xce, + 0xda, 0x79, 0x11, 0x99, 0xcc, 0xdd, 0x63, 0x4d, 0x17, 0x7a, 0xba, 0x68, 0x70, 0xd0, 0xd3, 0x90, + 0x35, 0x6d, 0xb7, 0x14, 0xad, 0xa9, 0xb6, 0xfb, 0xba, 0xb1, 0x0b, 0x90, 0x46, 0x07, 0x33, 0x4a, + 0x43, 0x3a, 0xfb, 0xd8, 0xd8, 0xf0, 0xdd, 0xe6, 0xdd, 0x45, 0x2a, 0x03, 0xa9, 0x3d, 0xa1, 0xc4, + 0x6d, 0xf3, 0x02, 0x57, 0xa2, 0x29, 0xb4, 0x0e, 0xab, 0x7b, 0x42, 0x7d, 0xaf, 0x56, 0xab, 0x8a, + 0x0d, 0xae, 0x24, 0x89, 0xdc, 0x6b, 0x7b, 0x9c, 0x71, 0xc4, 0xe6, 0xc4, 0x3a, 0x5f, 0x15, 0xc8, + 0xb7, 0x6e, 0xbe, 0x5e, 0xe7, 0x85, 0x32, 0x66, 0xf2, 0x22, 0x57, 0x92, 0xb6, 0x79, 0xae, 0x52, + 0xa2, 0xa3, 0xcc, 0xd7, 0xa2, 0x90, 0xf5, 0xd5, 0x16, 0xf4, 0x5a, 0x00, 0x56, 0x9b, 0xa3, 0xaa, + 0x91, 0x9f, 0xe2, 0x45, 0x2d, 0x10, 0x82, 0x48, 0x08, 0x04, 0xff, 0xa1, 0x60, 0x29, 0x50, 0xa3, + 0xff, 0x2d, 0x44, 0xa1, 0x52, 0x91, 0x84, 0x6a, 0x43, 0xe2, 0x77, 0x6b, 0x15, 0x6e, 0x97, 0x13, + 0x1a, 0x18, 0x93, 0x0d, 0x58, 0xab, 0xd6, 0x38, 0xb1, 0xd0, 0xe0, 0xab, 0x82, 0x54, 0xe3, 0x84, + 0x92, 0xb1, 0xf8, 0xed, 0xaa, 0x38, 0x7c, 0x13, 0xb1, 0x0c, 0x8b, 0xbc, 0xb0, 0x5f, 0xa8, 0xf0, + 0x25, 0x42, 0x93, 0x84, 0xc2, 0x2e, 0x47, 0x47, 0xd1, 0x65, 0x60, 0x9c, 0x70, 0x5a, 0x2f, 0x26, + 0x24, 0xb1, 0x20, 0x94, 0x39, 0x3a, 0x86, 0x56, 0x60, 0x89, 0x08, 0x14, 0x2a, 0x22, 0x57, 0x28, + 0x3d, 0x90, 0xb8, 0x37, 0xf8, 0x7a, 0xa3, 0x4e, 0xc7, 0xd1, 0x25, 0x58, 0x71, 0x8a, 0xd6, 0x0a, + 0x62, 0x61, 0x97, 0x6b, 0x70, 0xa2, 0x74, 0x9f, 0x7b, 0x40, 0x27, 0xd0, 0x2a, 0x2c, 0x5b, 0x26, + 0x87, 0xac, 0xfd, 0x42, 0x65, 0x8f, 0xa3, 0x93, 0xcc, 0x8f, 0x23, 0x90, 0xf5, 0x15, 0xe5, 0xb1, + 0x8e, 0xf0, 0x49, 0xf8, 0x29, 0x33, 0x39, 0xe2, 0x5d, 0x0a, 0x96, 0x02, 0x35, 0x9e, 0x9d, 0x23, + 0x56, 0x60, 0xc9, 0xe3, 0x88, 0x9d, 0x82, 0x50, 0xaa, 0x18, 0xae, 0x18, 0x42, 0x5d, 0xaa, 0x72, + 0x75, 0xac, 0x1d, 0x63, 0x4d, 0xc7, 0x98, 0x5f, 0xc6, 0x60, 0x6d, 0xd4, 0x3e, 0x83, 0x0e, 0x03, + 0x90, 0xdb, 0x99, 0x70, 0x93, 0x1a, 0xc9, 0x9c, 0x05, 0x4f, 0x74, 0x03, 0xe6, 0x49, 0x65, 0xb3, + 0x5e, 0x32, 0xbb, 0x9a, 0xe2, 0xa4, 0xd9, 0x14, 0x6b, 0xec, 0xdf, 0x23, 0xce, 0xd7, 0xa9, 0xc1, + 0x93, 0xf8, 0x84, 0x5d, 0x60, 0xf4, 0x4a, 0x9e, 0x44, 0x20, 0x0d, 0x13, 0x57, 0xa2, 0xe3, 0x46, + 0x7e, 0xe1, 0x0b, 0x32, 0x1e, 0xb1, 0x04, 0xba, 0x08, 0x68, 0xb7, 0xf0, 0x86, 0x54, 0x68, 0x34, + 0x0a, 0xc5, 0x1d, 0xae, 0x84, 0xaf, 0xd1, 0xd4, 0xe9, 0xa4, 0x91, 0x1d, 0xce, 0xe4, 0xd9, 0xad, + 0xee, 0x09, 0x0d, 0x69, 0xbb, 0x52, 0x28, 0xd7, 0xe9, 0x94, 0x97, 0x49, 0xec, 0x36, 0x1e, 0xd4, + 0x38, 0x1a, 0x0c, 0x53, 0x4e, 0xe6, 0x76, 0xdd, 0x64, 0xa4, 0xd1, 0x22, 0x9c, 0xb7, 0xd6, 0x85, + 0xe7, 0xc2, 0x97, 0xe8, 0x79, 0xe6, 0x2f, 0x51, 0xe7, 0x35, 0x84, 0xc0, 0xad, 0xec, 0x71, 0x40, + 0xec, 0x54, 0x26, 0x6e, 0x36, 0xc6, 0xb0, 0x67, 0xca, 0xc7, 0x6f, 0x45, 0x80, 0x1d, 0xaf, 0xfe, + 0x93, 0x8e, 0x8c, 0x10, 0xdf, 0xc7, 0x83, 0x1c, 0x92, 0x40, 0xb7, 0xe0, 0xba, 0x55, 0x81, 0xab, + 0x8d, 0x61, 0x5c, 0x34, 0xaa, 0x52, 0xbd, 0xc6, 0x15, 0xf9, 0x6d, 0x9e, 0x04, 0x09, 0x9d, 0x44, + 0x17, 0x80, 0x26, 0x72, 0xf6, 0x4e, 0x46, 0xcf, 0x33, 0xff, 0x8d, 0xc0, 0xfa, 0x98, 0x36, 0x0c, + 0x1d, 0x05, 0xb8, 0x54, 0x98, 0xbc, 0x8d, 0x1b, 0xc7, 0x9f, 0xc9, 0xa9, 0xbf, 0xa2, 0xe0, 0xea, + 0x04, 0xfa, 0xdd, 0x5e, 0x0d, 0x85, 0x9f, 0x1a, 0x95, 0x49, 0x91, 0x51, 0x99, 0x14, 0x0d, 0xcb, + 0xa4, 0x58, 0xc0, 0x6e, 0xc9, 0x0b, 0xdb, 0x55, 0x3a, 0x6e, 0xf4, 0x0f, 0x17, 0x7d, 0x2f, 0x96, + 0x4d, 0xc8, 0xbf, 0x10, 0x00, 0xf9, 0x8b, 0xc1, 0x7d, 0xac, 0x43, 0x2c, 0x84, 0x3c, 0x13, 0xc0, + 0xff, 0x24, 0xef, 0xa5, 0x83, 0xd5, 0xba, 0x71, 0x1d, 0x97, 0x13, 0x54, 0x38, 0xf2, 0x91, 0x51, + 0xc8, 0x47, 0x47, 0x21, 0x1f, 0x0b, 0x43, 0x3e, 0x8e, 0xce, 0x43, 0xda, 0x54, 0xc3, 0x89, 0x62, + 0x55, 0xa4, 0x13, 0x68, 0x09, 0xb2, 0x5e, 0x57, 0x94, 0xe8, 0x24, 0xf3, 0x1b, 0xf2, 0xb5, 0xc4, + 0xf3, 0xea, 0xd9, 0x74, 0x85, 0x14, 0xe0, 0x8a, 0x57, 0xc3, 0x1a, 0x7e, 0xaf, 0x33, 0x82, 0x18, + 0xb3, 0x15, 0x31, 0x0a, 0xd6, 0x46, 0x29, 0x3e, 0x43, 0x87, 0x64, 0x21, 0xb3, 0x27, 0x38, 0xf1, + 0x8b, 0x06, 0xe3, 0x17, 0x63, 0xde, 0x71, 0x07, 0xb2, 0x73, 0x3b, 0x98, 0x22, 0x90, 0x9d, 0xdb, + 0x40, 0x30, 0x79, 0x26, 0xe4, 0x3e, 0x74, 0x07, 0xf2, 0xc8, 0xb2, 0xff, 0xa9, 0x0f, 0xe4, 0xd0, + 0xbd, 0x25, 0xc9, 0xfc, 0xd6, 0x1b, 0xcc, 0x4e, 0x77, 0x4c, 0x15, 0xcc, 0x5e, 0x87, 0x9c, 0xf9, + 0x8e, 0xfc, 0xae, 0x37, 0x98, 0x9f, 0x9c, 0x53, 0x02, 0x82, 0x39, 0x14, 0xc3, 0x18, 0xf3, 0x6f, + 0x0a, 0xce, 0xb9, 0x4f, 0xdb, 0xe8, 0x7e, 0x00, 0x72, 0xcf, 0x84, 0x1e, 0xce, 0x3d, 0x8f, 0x33, + 0xa1, 0xf4, 0x26, 0x20, 0xbf, 0x36, 0x37, 0x34, 0x4b, 0x90, 0xdd, 0x2a, 0x94, 0xa4, 0x5a, 0x65, + 0xaf, 0xcc, 0x0b, 0x52, 0xb1, 0x2a, 0x6c, 0xf3, 0x65, 0x9a, 0x42, 0xd7, 0x60, 0xc3, 0x77, 0x78, + 0xdd, 0xa9, 0xd6, 0x1b, 0x52, 0x89, 0x33, 0xf0, 0xe3, 0x84, 0xe2, 0x03, 0x3a, 0x82, 0x17, 0xeb, + 0x7e, 0x25, 0x30, 0x76, 0xb1, 0xee, 0xe1, 0x9e, 0xc7, 0x59, 0x17, 0xeb, 0xd7, 0x76, 0x76, 0x8b, + 0xdd, 0x4a, 0x92, 0xdb, 0x23, 0x9b, 0x3f, 0xa3, 0x60, 0x9e, 0xc7, 0x9f, 0x30, 0xf4, 0x13, 0xf4, + 0x45, 0xfc, 0xdf, 0x23, 0xdf, 0xbf, 0xad, 0xd0, 0xc6, 0x88, 0x3f, 0x62, 0xe1, 0x37, 0xd3, 0xcc, + 0x95, 0xb1, 0x7f, 0xd5, 0x62, 0xe7, 0xd0, 0x0e, 0x64, 0x5c, 0x7f, 0xe2, 0x41, 0x2b, 0x41, 0x7f, + 0xec, 0x31, 0x15, 0x32, 0xe1, 0xff, 0xf9, 0x61, 0xe7, 0x36, 0x3f, 0x88, 0x03, 0x0c, 0x7b, 0x58, + 0xc4, 0xc1, 0x82, 0xf3, 0xa8, 0x8f, 0x72, 0x61, 0x7f, 0x62, 0x61, 0x56, 0x42, 0xff, 0x03, 0xc2, + 0xce, 0x19, 0x6a, 0x9c, 0x07, 0x55, 0xa2, 0x26, 0xe0, 0xc2, 0x36, 0x51, 0x13, 0x74, 0xd5, 0x99, + 0x9d, 0x43, 0x0f, 0x61, 0x39, 0xe4, 0xdc, 0x85, 0xae, 0x8e, 0xbe, 0x45, 0x6b, 0x2a, 0xbf, 0x36, + 0xc9, 0x55, 0x5b, 0x76, 0x0e, 0x75, 0x60, 0x25, 0xb4, 0x8f, 0x47, 0xd7, 0xc7, 0x5d, 0x6c, 0x34, + 0x6d, 0xdd, 0x98, 0xec, 0xfe, 0x23, 0x3b, 0x87, 0x7a, 0xc0, 0x84, 0x37, 0x98, 0xe8, 0xc6, 0xd8, + 0x8b, 0x7d, 0xa6, 0xbd, 0xa7, 0x26, 0xbc, 0x00, 0xc8, 0xce, 0xa1, 0x2d, 0x48, 0x3b, 0x6e, 0x99, + 0xa1, 0x65, 0xff, 0xbd, 0x33, 0x53, 0x65, 0x2e, 0xec, 0x42, 0x9a, 0xa9, 0xc3, 0x71, 0xbf, 0x89, + 0xe8, 0xf0, 0xdf, 0xc6, 0x22, 0x3a, 0x02, 0xae, 0x42, 0x79, 0x61, 0xf6, 0x7c, 0x1f, 0xf1, 0xc1, + 0x1c, 0xfc, 0xe1, 0xc6, 0x07, 0x73, 0xc8, 0x67, 0x16, 0x76, 0x6e, 0xf3, 0x77, 0x31, 0x88, 0x19, + 0x69, 0x8f, 0x1a, 0x90, 0xf5, 0xf5, 0x9b, 0xe8, 0x52, 0xd8, 0x2d, 0x0c, 0xd3, 0xcc, 0xe5, 0xd1, + 0x97, 0x34, 0xd8, 0x39, 0xf4, 0x79, 0x58, 0x0c, 0x68, 0x9b, 0xd0, 0x7a, 0xf8, 0xb5, 0x03, 0x53, + 0xf3, 0xc6, 0xb8, 0x7b, 0x09, 0xec, 0x9c, 0x67, 0xc6, 0x24, 0x0e, 0x2f, 0x85, 0x7d, 0x87, 0x0e, + 0x99, 0xb1, 0x2f, 0xee, 0xbc, 0x33, 0x26, 0x7a, 0xd7, 0xc3, 0x3f, 0x9e, 0x86, 0xce, 0xd8, 0xa7, + 0xfb, 0x45, 0x48, 0xd9, 0x55, 0x16, 0x2d, 0x79, 0x3f, 0x61, 0x9a, 0x7a, 0x2e, 0x06, 0x7f, 0xd9, + 0x34, 0xa5, 0xed, 0x0d, 0x89, 0x48, 0x7b, 0xbf, 0x3e, 0x12, 0x69, 0xdf, 0xf7, 0xc2, 0xe1, 0xba, + 0xbc, 0x01, 0xb5, 0x1e, 0xfe, 0x29, 0xce, 0xbb, 0xae, 0xd0, 0x20, 0x3a, 0x48, 0xe0, 0x3f, 0xe5, + 0x7e, 0xe6, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xc7, 0xc3, 0x67, 0x49, 0xa1, 0x3b, 0x00, 0x00, } diff --git a/spec.md b/spec.md index e830c093..82ac7adc 100644 --- a/spec.md +++ b/spec.md @@ -165,6 +165,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 + Publish | | Unpublish + Device | | Device + +---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 +PUBLISH_UNPUBLISH_DEVICE capability. +``` + ``` Controller Controller Publish Unpublish @@ -182,7 +210,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`). ``` @@ -199,7 +227,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. @@ -270,6 +298,12 @@ service Controller { } service Node { + rpc NodePublishDevice (NodePublishDeviceRequest) + returns (NodePublishDeviceResponse) {} + + rpc NodeUnpublishDevice (NodeUnpublishDeviceRequest) + returns (NodeUnpublishDeviceResponse) {} + rpc NodePublishVolume (NodePublishVolumeRequest) returns (NodePublishVolumeResponse) {} @@ -662,7 +696,8 @@ message ControllerPublishVolumeRequest { message ControllerPublishVolumeResponse { message Result { // The SP specific information that will be passed to the Plugin in - // the subsequent `NodePublishVolume` call for the given volume. + // the subsequent `NodePublishDevice` and `NodePublishVolume` calls + // for the given volume. // This information is opaque to the CO. This field is OPTIONAL. PublishVolumeInfo publish_volume_info = 1; } @@ -696,7 +731,7 @@ message PublishVolumeInfo { 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 `NodeUnpublishDevice` on the volume is called and succeeds. 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. @@ -920,6 +955,98 @@ message ControllerServiceCapability { ### Node Service RPC +#### `NodePublishDevice` + +A Node Plugin MUST implement this RPC call if it has `PUBLISH_UNPUBLISH_DEVICE` node capability. +This RPC is called by the CO when a workload that wants to use the specified volume is placed (scheduled) on a node. +The Plugin SHALL assume that this RPC will be executed on the node where the volume will be used. +This RPC MUST be called by the CO once per node, per volume. +If the corresponding Controller Plugin has `PUBLISH_UNPUBLISH_VOLUME` controller capability and the Node Plugin has `PUBLISH_UNPUBLISH_DEVICE`, 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 `NodePublishVolume` is called for the given volume on the given node. +This operation MUST be idempotent. +If this RPC failed, or the CO does not know if it failed or not, it MAY choose to call `NodePublishDevice` again, or choose to call `NodeUnpublishDevice`. + +```protobuf +message NodePublishDeviceRequest { + // 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. + PublishVolumeInfo publish_volume_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 uniqueness of global_target_path per + // volume. + // This is a REQUIRED field. + string global_target_path = 4; + + // The capability of the volume the CO expects the volume to have. + // This is a REQUIRED field. + VolumeCapability volume_capability = 5; +} + +message NodePublishDeviceResponse { + message Result {} + + // One of the following fields MUST be specified. + oneof reply { + Result result = 1; + Error error = 2; + } +} +``` + +#### `NodeUnpublishDevice` + +A Node Plugin MUST implement this RPC call if it has `PUBLISH_UNPUBLISH_DEVICE` node capability. +This RPC is a reverse operation of `NodePublishDevice`. +This RPC MUST undo the work by the corresponding `NodePublishDevice`. +This RPC SHALL be called by the CO once for each `global_target_path` that was successfully setup via `NodePublishDevice`. +If the corresponding Controller Plugin has `PUBLISH_UNPUBLISH_VOLUME` controller capability, the CO SHOULD issue all `NodeUnpublishDevice` (as specified above) before calling `ControllerUnpublishVolume` for the given node and the given volume. +The Plugin SHALL assume that this RPC will be executed on the node where the volume is being used. + +This RPC is typically called by the CO when the workload using the volume is being moved to a different node, or all the workload using the volume on a node has finished. + +This operation MUST be idempotent. +If this RPC failed, or the CO does not know if it failed or not, it can choose to call `NodeUnpublishDevice` again. + +```protobuf +message NodeUnpublishDeviceRequest { + // 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 global_target_path = 3; + + // End user credentials used to authenticate/authorize node unpublish + // request. This field is OPTIONAL. + Credentials user_credentials = 4; +} + +message NodeUnpublishDeviceResponse { + message Result {} + + // One of the following fields MUST be specified. + oneof reply { + Result result = 1; + Error error = 2; + } +} +``` + #### `NodePublishVolume` This RPC is called by the CO when a workload that wants to use the specified volume is placed (scheduled) on a node. @@ -945,23 +1072,29 @@ message NodePublishVolumeRequest { // this capability. This is an OPTIONAL field. PublishVolumeInfo publish_volume_info = 3; + // The path to which the device was mounted by `NodePublishDevice`. + // It MUST be an absolute path in the root filesystem of the process + // serving this request. + // This is an OPTIONAL field. + string global_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. // 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; // End user credentials used to authenticate/authorize node publish // request. This field is OPTIONAL. - Credentials user_credentials = 7; + Credentials user_credentials = 8; } message NodePublishVolumeResponse { @@ -997,14 +1130,20 @@ message NodeUnpublishVolumeRequest { // The handle of the volume. This field is REQUIRED. VolumeHandle volume_handle = 2; + // The path to which the device was mounted by `NodePublishDevice`. + // It MUST be an absolute path in the root filesystem of the process + // serving this request. + // This is an OPTIONAL field. + string global_target_path = 3; + // 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 target_path = 3; + string target_path = 4; // End user credentials used to authenticate/authorize node unpublish // request. This field is OPTIONAL. - Credentials user_credentials = 4; + Credentials user_credentials = 5; } message NodeUnpublishVolumeResponse { @@ -1104,6 +1243,7 @@ message NodeServiceCapability { message RPC { enum Type { UNKNOWN = 0; + PUBLISH_UNPUBLISH_DEVICE = 1; } Type type = 1; @@ -1556,6 +1696,111 @@ message Error { string error_description = 2; } + // `NodePublishDevice` specific error. + message NodePublishDeviceError { + enum NodePublishDeviceErrorCode { + // Default value for backwards compatibility. SHOULD NOT be + // returned by Plugins. However, if a Plugin returns a + // `NodePublishDeviceErrorCode` code that an older CSI + // client is not aware of, the client will see this code (the + // default fallback). + // + // Recovery behavior: Caller SHOULD consider updating CSI client + // to match Plugin CSI version. + UNKNOWN = 0; + + // 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. + // + // Recovery behavior: Caller SHOULD ensure that there are no other + // calls pending for the specified volume, and then retry with + // exponential back off. + OPERATION_PENDING_FOR_VOLUME = 1; + + // Indicates that a volume corresponding to the specified + // volume ID does not exist. + // + // Recovery behavior: Caller SHOULD 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_DOES_NOT_EXIST = 2; + + UNSUPPORTED_MOUNT_FLAGS = 3; + UNSUPPORTED_VOLUME_TYPE = 4; + UNSUPPORTED_FS_TYPE = 5; + MOUNT_ERROR = 6; + + // Indicates that the specified volume ID is not allowed or + // understood by the Plugin. More human-readable information MAY + // be provided in the `error_description` field. + // + // Recovery behavior: Caller MUST fix the volume ID before + // retrying. + INVALID_VOLUME_ID = 7; + } + + NodePublishDeviceErrorCode error_code = 1; + string error_description = 2; + } + + // `NodeUnpublishDevice` specific error. + message NodeUnpublishDeviceError { + enum NodeUnpublishDeviceErrorCode { + // Default value for backwards compatibility. SHOULD NOT be + // returned by Plugins. However, if a Plugin returns a + // `NodeUnpublishDeviceErrorCode` code that an older CSI + // client is not aware of, the client will see this code (the + // default fallback). + // + // Recovery behavior: Caller SHOULD consider updating CSI client + // to match Plugin CSI version. + UNKNOWN = 0; + + // 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. + // + // Recovery behavior: Caller SHOULD ensure that there are no other + // calls pending for the specified volume, and then retry with + // exponential back off. + OPERATION_PENDING_FOR_VOLUME = 1; + + // Indicates that a volume corresponding to the specified + // volume ID does not exist. + // + // Recovery behavior: Caller SHOULD 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_DOES_NOT_EXIST = 2; + + UNMOUNT_ERROR = 3; + + // Indicates that the specified volume ID is not allowed or + // understood by the Plugin. More human-readable information MAY + // be provided in the `error_description` field. + // + // Recovery behavior: Caller MUST fix the volume ID before + // retrying. + INVALID_VOLUME_ID = 4; + } + + NodeUnpublishDeviceErrorCode error_code = 1; + string error_description = 2; + } + // `NodePublishVolume` specific error. message NodePublishVolumeError { enum NodePublishVolumeErrorCode {