From 58316d1402d02f59dfbd879c2f857baa1c690c07 Mon Sep 17 00:00:00 2001 From: David Zhu Date: Wed, 17 Jan 2018 18:19:25 -0800 Subject: [PATCH] Aligned spec.md error messages. Clarified some wording. Renamed to NodeStageVolume/NodeUnstageVolume. Addressed jdef comments. Added RPC interactions and reference counting section NodeStageVolume modifications: added publish_volume_info to response. Changed credential naming. Added credentials to unstage. --- csi.proto | 122 ++-- lib/go/csi/csi.pb.go | 1257 ++++++++++++++++++++++++++++++------------ spec.md | 286 ++++------ 3 files changed, 1099 insertions(+), 566 deletions(-) diff --git a/csi.proto b/csi.proto index 149155e4..c8d06581 100644 --- a/csi.proto +++ b/csi.proto @@ -44,11 +44,11 @@ service Controller { } service Node { - rpc NodePublishDevice (NodePublishDeviceRequest) - returns (NodePublishDeviceResponse) {} + rpc NodeStageVolume (NodeStageVolumeRequest) + returns (NodeStageVolumeResponse) {} - rpc NodeUnpublishDevice (NodeUnpublishDeviceRequest) - returns (NodeUnpublishDeviceResponse) {} + rpc NodeUnstageVolume (NodeUnstageVolumeRequest) + returns (NodeUnstageVolumeResponse) {} rpc NodePublishVolume (NodePublishVolumeRequest) returns (NodePublishVolumeResponse) {} @@ -188,18 +188,18 @@ message CreateVolumeRequest { // validating these parameters. COs will treat these as opaque. map parameters = 5; - // End user credentials used to authenticate/authorize volume creation - // request. + // Credentials used by Controller plugin to authenticate/authorize + // volume creation request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', // '_' or '.'. Each value MUST contain a valid string. An SP MAY // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - map user_credentials = 6; + map controller_create_credentials = 6; } message CreateVolumeResponse { @@ -318,18 +318,18 @@ message DeleteVolumeRequest { // This field is REQUIRED. string volume_id = 2; - // End user credentials used to authenticate/authorize volume deletion - // request. + // Credentials used by Controller plugin to authenticate/authorize + // volume deletion request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', // '_' or '.'. Each value MUST contain a valid string. An SP MAY // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - map user_credentials = 3; + map controller_delete_credentials = 3; } message DeleteVolumeResponse {} @@ -355,18 +355,18 @@ message ControllerPublishVolumeRequest { // REQUIRED. bool readonly = 5; - // End user credentials used to authenticate/authorize controller - // publish request. + // Credentials used by Controller plugin to authenticate/authorize + // controller publish request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', // '_' or '.'. Each value MUST contain a valid string. An SP MAY // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - map user_credentials = 6; + map controller_publish_credentials = 6; // Attributes of the volume to be used on a node. This field is // OPTIONAL and MUST match the attributes of the Volume identified @@ -376,8 +376,8 @@ message ControllerPublishVolumeRequest { message ControllerPublishVolumeResponse { // The SP specific information that will be passed to the Plugin in - // the subsequent `NodePublishDevice` and `NodePublishVolume` calls - // for the given volume. + // the subsequent `NodeStageVolume` or `NodePublishVolume` calls + // for the given volume. // This information is opaque to the CO. This field is OPTIONAL. map publish_info = 1; } @@ -397,18 +397,18 @@ message ControllerUnpublishVolumeRequest { // the volume from all nodes it is published to. string node_id = 3; - // End user credentials used to authenticate/authorize controller - // unpublish request. + // Credentials used by Controller plugin to authenticate/authorize + // controller unpublish request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', // '_' or '.'. Each value MUST contain a valid string. An SP MAY // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - map user_credentials = 4; + map controller_unpublish_credentials = 4; } message ControllerUnpublishVolumeResponse {} @@ -550,7 +550,7 @@ message ControllerServiceCapability { } //////// //////// -message NodePublishDeviceRequest { +message NodeStageVolumeRequest { // The API version assumed by the CO. This is a REQUIRED field. Version version = 1; @@ -562,24 +562,42 @@ message NodePublishDeviceRequest { // has `PUBLISH_UNPUBLISH_VOLUME` controller capability, and SHALL be // left unset if the corresponding Controller Plugin does not have // this capability. This is an OPTIONAL field. - map publish_volume_info = 3; + map publish_info = 3; // The path to which the volume will be published. It MUST be an // absolute path in the root filesystem of the process serving this - // request. The CO SHALL ensure uniqueness of global_target_path per - // volume. + // request. The CO SHALL ensure that there is only one + // staging_target_path per volume. // This is a REQUIRED field. - string global_target_path = 4; + string staging_target_path = 4; // The capability of the volume the CO expects the volume to have. // This is a REQUIRED field. VolumeCapability volume_capability = 5; + + // Credentials used by Node plugin to authenticate/authorize node + // stage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + map node_stage_credentials = 6; + + // Attributes of the volume to publish. This field is OPTIONAL and + // MUST match the attributes of the VolumeInfo identified by + // `volume_id`. + map volume_attributes = 7; } -message NodePublishDeviceResponse {} +message NodeStageVolumeResponse {} //////// //////// -message NodeUnpublishDeviceRequest { +message NodeUnstageVolumeRequest { // The API version assumed by the CO. This is a REQUIRED field. Version version = 1; @@ -589,10 +607,23 @@ message NodeUnpublishDeviceRequest { // 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; + string staging_target_path = 3; + + // Credentials used by Node plugin to authenticate/authorize node + // unstage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + map node_unstage_credentials = 4; } -message NodeUnpublishDeviceResponse {} +message NodeUnstageVolumeResponse {} //////// //////// message NodePublishVolumeRequest { @@ -609,11 +640,13 @@ message NodePublishVolumeRequest { // this capability. This is an OPTIONAL field. map publish_info = 3; - // The path to which the device was mounted by `NodePublishDevice`. + // The path to which the device was mounted by `NodeStageVolume`. // It MUST be an absolute path in the root filesystem of the process // serving this request. + // It MUST be set if the Node Plugin implements the + // `STAGE_UNSTAGE_VOLUME` node capability. // This is an OPTIONAL field. - string global_target_path = 4; + string staging_target_path = 4; // The path to which the volume will be published. It MUST be an // absolute path in the root filesystem of the process serving this @@ -631,7 +664,7 @@ message NodePublishVolumeRequest { // REQUIRED. bool readonly = 7; - // End user credentials used to authenticate/authorize node + // Credentials used by Node plugin to authenticate/authorize node // publish request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', @@ -639,10 +672,11 @@ message NodePublishVolumeRequest { // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - map user_credentials = 8; + map node_publish_credentials = 8; + // Attributes of the volume to publish. This field is OPTIONAL and // MUST match the attributes of the Volume identified by @@ -660,18 +694,12 @@ message NodeUnpublishVolumeRequest { // The ID of the volume. This field is REQUIRED. string volume_id = 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 = 4; + string target_path = 3; - // End user credentials used to authenticate/authorize node + // Credentials used by Node plugin to authenticate/authorize node // unpublish request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', @@ -679,10 +707,10 @@ message NodeUnpublishVolumeRequest { // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - map user_credentials = 5; + map node_unpublish_credentials = 4; } message NodeUnpublishVolumeResponse {} @@ -725,7 +753,7 @@ message NodeServiceCapability { message RPC { enum Type { UNKNOWN = 0; - PUBLISH_UNPUBLISH_DEVICE = 1; + STAGE_UNSTAGE_VOLUME = 1; } Type type = 1; diff --git a/lib/go/csi/csi.pb.go b/lib/go/csi/csi.pb.go index 6174a5f6..ab39ccb9 100644 --- a/lib/go/csi/csi.pb.go +++ b/lib/go/csi/csi.pb.go @@ -1,9 +1,8 @@ -// Code generated by protoc-gen-go. +// Code generated by protoc-gen-go. DO NOT EDIT. // source: csi.proto -// DO NOT EDIT! /* -Package csi is a generated protocol buffer package.s +Package csi is a generated protocol buffer package. It is generated from these files: csi.proto @@ -14,11 +13,14 @@ It has these top-level messages: Version GetPluginInfoRequest GetPluginInfoResponse + GetPluginCapabilitiesRequest + GetPluginCapabilitiesResponse + PluginCapability CreateVolumeRequest CreateVolumeResponse VolumeCapability CapacityRange - VolumeInfo + Volume DeleteVolumeRequest DeleteVolumeResponse ControllerPublishVolumeRequest @@ -36,16 +38,16 @@ It has these top-level messages: ControllerGetCapabilitiesRequest ControllerGetCapabilitiesResponse ControllerServiceCapability - NodePublishDeviceRequest - NodePublishDeviceResponse - NodeUnpublishDeviceRequest - NodeUnpublishDeviceResponse + NodeStageVolumeRequest + NodeStageVolumeResponse + NodeUnstageVolumeRequest + NodeUnstageVolumeResponse NodePublishVolumeRequest NodePublishVolumeResponse NodeUnpublishVolumeRequest NodeUnpublishVolumeResponse - GetNodeIDRequest - GetNodeIDResponse + NodeGetIdRequest + NodeGetIdResponse NodeProbeRequest NodeProbeResponse NodeGetCapabilitiesRequest @@ -74,6 +76,37 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +type PluginCapability_Service_Type int32 + +const ( + PluginCapability_Service_UNKNOWN PluginCapability_Service_Type = 0 + // CONTROLLER_SERVICE indicates that the Plugin provides RPCs for + // the ControllerService. Plugins SHOULD provide this capability. + // In rare cases certain plugins may wish to omit the + // ControllerService entirely from their implementation, but such + // SHOULD NOT be the common case. + // The presence of this capability determines whether the CO will + // attempt to invoke the REQUIRED ControllerService RPCs, as well + // as specific RPCs as indicated by ControllerGetCapabilities. + PluginCapability_Service_CONTROLLER_SERVICE PluginCapability_Service_Type = 1 +) + +var PluginCapability_Service_Type_name = map[int32]string{ + 0: "UNKNOWN", + 1: "CONTROLLER_SERVICE", +} +var PluginCapability_Service_Type_value = map[string]int32{ + "UNKNOWN": 0, + "CONTROLLER_SERVICE": 1, +} + +func (x PluginCapability_Service_Type) String() string { + return proto.EnumName(PluginCapability_Service_Type_name, int32(x)) +} +func (PluginCapability_Service_Type) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{7, 0, 0} +} + type VolumeCapability_AccessMode_Mode int32 const ( @@ -115,7 +148,7 @@ func (x VolumeCapability_AccessMode_Mode) String() string { return proto.EnumName(VolumeCapability_AccessMode_Mode_name, int32(x)) } func (VolumeCapability_AccessMode_Mode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{7, 2, 0} + return fileDescriptor0, []int{10, 2, 0} } type ControllerServiceCapability_RPC_Type int32 @@ -147,30 +180,30 @@ func (x ControllerServiceCapability_RPC_Type) String() string { return proto.EnumName(ControllerServiceCapability_RPC_Type_name, int32(x)) } func (ControllerServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{26, 0, 0} + return fileDescriptor0, []int{29, 0, 0} } type NodeServiceCapability_RPC_Type int32 const ( - NodeServiceCapability_RPC_UNKNOWN NodeServiceCapability_RPC_Type = 0 - NodeServiceCapability_RPC_PUBLISH_UNPUBLISH_DEVICE NodeServiceCapability_RPC_Type = 1 + NodeServiceCapability_RPC_UNKNOWN NodeServiceCapability_RPC_Type = 0 + NodeServiceCapability_RPC_STAGE_UNSTAGE_VOLUME NodeServiceCapability_RPC_Type = 1 ) var NodeServiceCapability_RPC_Type_name = map[int32]string{ 0: "UNKNOWN", - 1: "PUBLISH_UNPUBLISH_DEVICE", + 1: "STAGE_UNSTAGE_VOLUME", } var NodeServiceCapability_RPC_Type_value = map[string]int32{ - "UNKNOWN": 0, - "PUBLISH_UNPUBLISH_DEVICE": 1, + "UNKNOWN": 0, + "STAGE_UNSTAGE_VOLUME": 1, } func (x NodeServiceCapability_RPC_Type) String() string { return proto.EnumName(NodeServiceCapability_RPC_Type_name, int32(x)) } func (NodeServiceCapability_RPC_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor0, []int{41, 0, 0} + return fileDescriptor0, []int{44, 0, 0} } // ////// @@ -204,9 +237,12 @@ func (m *GetSupportedVersionsResponse) GetSupportedVersions() []*Version { // Specifies a version in Semantic Version 2.0 format. // (http://semver.org/spec/v2.0.0.html) type Version struct { - Major uint32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"` - Minor uint32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"` - Patch uint32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"` + // The value of this field MUST NOT be negative. + Major int32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"` + // The value of this field MUST NOT be negative. + Minor int32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"` + // The value of this field MUST NOT be negative. + Patch int32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"` } func (m *Version) Reset() { *m = Version{} } @@ -214,6 +250,27 @@ func (m *Version) String() string { return proto.CompactTextString(m) func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +func (m *Version) GetMajor() int32 { + if m != nil { + return m.Major + } + return 0 +} + +func (m *Version) GetMinor() int32 { + if m != nil { + return m.Minor + } + return 0 +} + +func (m *Version) GetPatch() int32 { + if m != nil { + return m.Patch + } + return 0 +} + // ////// // ////// type GetPluginInfoRequest struct { @@ -253,6 +310,20 @@ func (m *GetPluginInfoResponse) String() string { return proto.Compac func (*GetPluginInfoResponse) ProtoMessage() {} func (*GetPluginInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } +func (m *GetPluginInfoResponse) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *GetPluginInfoResponse) GetVendorVersion() string { + if m != nil { + return m.VendorVersion + } + return "" +} + func (m *GetPluginInfoResponse) GetManifest() map[string]string { if m != nil { return m.Manifest @@ -260,6 +331,142 @@ func (m *GetPluginInfoResponse) GetManifest() map[string]string { return nil } +// ////// +// ////// +type GetPluginCapabilitiesRequest struct { + // The API version assumed by the CO. This is a REQUIRED field. + Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` +} + +func (m *GetPluginCapabilitiesRequest) Reset() { *m = GetPluginCapabilitiesRequest{} } +func (m *GetPluginCapabilitiesRequest) String() string { return proto.CompactTextString(m) } +func (*GetPluginCapabilitiesRequest) ProtoMessage() {} +func (*GetPluginCapabilitiesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } + +func (m *GetPluginCapabilitiesRequest) GetVersion() *Version { + if m != nil { + return m.Version + } + return nil +} + +type GetPluginCapabilitiesResponse struct { + // All the capabilities that the controller service supports. This + // field is OPTIONAL. + Capabilities []*PluginCapability `protobuf:"bytes,2,rep,name=capabilities" json:"capabilities,omitempty"` +} + +func (m *GetPluginCapabilitiesResponse) Reset() { *m = GetPluginCapabilitiesResponse{} } +func (m *GetPluginCapabilitiesResponse) String() string { return proto.CompactTextString(m) } +func (*GetPluginCapabilitiesResponse) ProtoMessage() {} +func (*GetPluginCapabilitiesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *GetPluginCapabilitiesResponse) GetCapabilities() []*PluginCapability { + if m != nil { + return m.Capabilities + } + return nil +} + +// Specifies a capability of the plugin. +type PluginCapability struct { + // Types that are valid to be assigned to Type: + // *PluginCapability_Service_ + Type isPluginCapability_Type `protobuf_oneof:"type"` +} + +func (m *PluginCapability) Reset() { *m = PluginCapability{} } +func (m *PluginCapability) String() string { return proto.CompactTextString(m) } +func (*PluginCapability) ProtoMessage() {} +func (*PluginCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } + +type isPluginCapability_Type interface { + isPluginCapability_Type() +} + +type PluginCapability_Service_ struct { + Service *PluginCapability_Service `protobuf:"bytes,1,opt,name=service,oneof"` +} + +func (*PluginCapability_Service_) isPluginCapability_Type() {} + +func (m *PluginCapability) GetType() isPluginCapability_Type { + if m != nil { + return m.Type + } + return nil +} + +func (m *PluginCapability) GetService() *PluginCapability_Service { + if x, ok := m.GetType().(*PluginCapability_Service_); ok { + return x.Service + } + return nil +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*PluginCapability) 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 _PluginCapability_OneofMarshaler, _PluginCapability_OneofUnmarshaler, _PluginCapability_OneofSizer, []interface{}{ + (*PluginCapability_Service_)(nil), + } +} + +func _PluginCapability_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*PluginCapability) + // type + switch x := m.Type.(type) { + case *PluginCapability_Service_: + b.EncodeVarint(1<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.Service); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("PluginCapability.Type has unexpected type %T", x) + } + return nil +} + +func _PluginCapability_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*PluginCapability) + switch tag { + case 1: // type.service + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(PluginCapability_Service) + err := b.DecodeMessage(msg) + m.Type = &PluginCapability_Service_{msg} + return true, err + default: + return false, nil + } +} + +func _PluginCapability_OneofSizer(msg proto.Message) (n int) { + m := msg.(*PluginCapability) + // type + switch x := m.Type.(type) { + case *PluginCapability_Service_: + s := proto.Size(x.Service) + n += proto.SizeVarint(1<<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 PluginCapability_Service struct { +} + +func (m *PluginCapability_Service) Reset() { *m = PluginCapability_Service{} } +func (m *PluginCapability_Service) String() string { return proto.CompactTextString(m) } +func (*PluginCapability_Service) ProtoMessage() {} +func (*PluginCapability_Service) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} } + // ////// // ////// type CreateVolumeRequest struct { @@ -298,24 +505,24 @@ type CreateVolumeRequest struct { // This field is OPTIONAL. The Plugin is responsible for parsing and // validating these parameters. COs will treat these as opaque. Parameters map[string]string `protobuf:"bytes,5,rep,name=parameters" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - // End user credentials used to authenticate/authorize volume creation - // request. + // Credentials used by Controller plugin to authenticate/authorize + // volume creation request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', // '_' or '.'. Each value MUST contain a valid string. An SP MAY // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - UserCredentials map[string]string `protobuf:"bytes,6,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ControllerCreateCredentials map[string]string `protobuf:"bytes,6,rep,name=controller_create_credentials,json=controllerCreateCredentials" json:"controller_create_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } func (m *CreateVolumeRequest) Reset() { *m = CreateVolumeRequest{} } func (m *CreateVolumeRequest) String() string { return proto.CompactTextString(m) } func (*CreateVolumeRequest) ProtoMessage() {} -func (*CreateVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +func (*CreateVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } func (m *CreateVolumeRequest) GetVersion() *Version { if m != nil { @@ -324,6 +531,13 @@ func (m *CreateVolumeRequest) GetVersion() *Version { return nil } +func (m *CreateVolumeRequest) GetName() string { + if m != nil { + return m.Name + } + return "" +} + func (m *CreateVolumeRequest) GetCapacityRange() *CapacityRange { if m != nil { return m.CapacityRange @@ -345,9 +559,9 @@ func (m *CreateVolumeRequest) GetParameters() map[string]string { return nil } -func (m *CreateVolumeRequest) GetUserCredentials() map[string]string { +func (m *CreateVolumeRequest) GetControllerCreateCredentials() map[string]string { if m != nil { - return m.UserCredentials + return m.ControllerCreateCredentials } return nil } @@ -356,17 +570,17 @@ type CreateVolumeResponse struct { // Contains all attributes of the newly created volume that are // relevant to the CO along with information required by the Plugin // to uniquely identify the volume. This field is REQUIRED. - VolumeInfo *VolumeInfo `protobuf:"bytes,1,opt,name=volume_info,json=volumeInfo" json:"volume_info,omitempty"` + Volume *Volume `protobuf:"bytes,1,opt,name=volume" json:"volume,omitempty"` } func (m *CreateVolumeResponse) Reset() { *m = CreateVolumeResponse{} } func (m *CreateVolumeResponse) String() string { return proto.CompactTextString(m) } func (*CreateVolumeResponse) ProtoMessage() {} -func (*CreateVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } +func (*CreateVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } -func (m *CreateVolumeResponse) GetVolumeInfo() *VolumeInfo { +func (m *CreateVolumeResponse) GetVolume() *Volume { if m != nil { - return m.VolumeInfo + return m.Volume } return nil } @@ -387,7 +601,7 @@ type VolumeCapability struct { func (m *VolumeCapability) Reset() { *m = VolumeCapability{} } func (m *VolumeCapability) String() string { return proto.CompactTextString(m) } func (*VolumeCapability) ProtoMessage() {} -func (*VolumeCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +func (*VolumeCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } type isVolumeCapability_AccessType interface { isVolumeCapability_AccessType() @@ -509,10 +723,12 @@ func _VolumeCapability_OneofSizer(msg proto.Message) (n int) { type VolumeCapability_BlockVolume struct { } -func (m *VolumeCapability_BlockVolume) Reset() { *m = VolumeCapability_BlockVolume{} } -func (m *VolumeCapability_BlockVolume) String() string { return proto.CompactTextString(m) } -func (*VolumeCapability_BlockVolume) ProtoMessage() {} -func (*VolumeCapability_BlockVolume) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} } +func (m *VolumeCapability_BlockVolume) Reset() { *m = VolumeCapability_BlockVolume{} } +func (m *VolumeCapability_BlockVolume) String() string { return proto.CompactTextString(m) } +func (*VolumeCapability_BlockVolume) ProtoMessage() {} +func (*VolumeCapability_BlockVolume) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{10, 0} +} // Indicate that the volume will be accessed via the filesystem API. type VolumeCapability_MountVolume struct { @@ -527,10 +743,26 @@ type VolumeCapability_MountVolume struct { MountFlags []string `protobuf:"bytes,2,rep,name=mount_flags,json=mountFlags" json:"mount_flags,omitempty"` } -func (m *VolumeCapability_MountVolume) Reset() { *m = VolumeCapability_MountVolume{} } -func (m *VolumeCapability_MountVolume) String() string { return proto.CompactTextString(m) } -func (*VolumeCapability_MountVolume) ProtoMessage() {} -func (*VolumeCapability_MountVolume) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 1} } +func (m *VolumeCapability_MountVolume) Reset() { *m = VolumeCapability_MountVolume{} } +func (m *VolumeCapability_MountVolume) String() string { return proto.CompactTextString(m) } +func (*VolumeCapability_MountVolume) ProtoMessage() {} +func (*VolumeCapability_MountVolume) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{10, 1} +} + +func (m *VolumeCapability_MountVolume) GetFsType() string { + if m != nil { + return m.FsType + } + return "" +} + +func (m *VolumeCapability_MountVolume) GetMountFlags() []string { + if m != nil { + return m.MountFlags + } + return nil +} // Specify how a volume can be accessed. type VolumeCapability_AccessMode struct { @@ -541,7 +773,14 @@ type VolumeCapability_AccessMode struct { func (m *VolumeCapability_AccessMode) Reset() { *m = VolumeCapability_AccessMode{} } func (m *VolumeCapability_AccessMode) String() string { return proto.CompactTextString(m) } func (*VolumeCapability_AccessMode) ProtoMessage() {} -func (*VolumeCapability_AccessMode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 2} } +func (*VolumeCapability_AccessMode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10, 2} } + +func (m *VolumeCapability_AccessMode) GetMode() VolumeCapability_AccessMode_Mode { + if m != nil { + return m.Mode + } + return VolumeCapability_AccessMode_UNKNOWN +} // The capacity of the storage space in bytes. To specify an exact size, // `required_bytes` and `limit_bytes` can be set to the same value. At @@ -549,23 +788,40 @@ func (*VolumeCapability_AccessMode) Descriptor() ([]byte, []int) { return fileDe type CapacityRange struct { // Volume must be at least this big. This field is OPTIONAL. // A value of 0 is equal to an unspecified field value. - RequiredBytes uint64 `protobuf:"varint,1,opt,name=required_bytes,json=requiredBytes" json:"required_bytes,omitempty"` + // The value of this field MUST NOT be negative. + RequiredBytes int64 `protobuf:"varint,1,opt,name=required_bytes,json=requiredBytes" json:"required_bytes,omitempty"` // Volume must not be bigger than this. This field is OPTIONAL. // A value of 0 is equal to an unspecified field value. - LimitBytes uint64 `protobuf:"varint,2,opt,name=limit_bytes,json=limitBytes" json:"limit_bytes,omitempty"` + // The value of this field MUST NOT be negative. + LimitBytes int64 `protobuf:"varint,2,opt,name=limit_bytes,json=limitBytes" json:"limit_bytes,omitempty"` } func (m *CapacityRange) Reset() { *m = CapacityRange{} } func (m *CapacityRange) String() string { return proto.CompactTextString(m) } func (*CapacityRange) ProtoMessage() {} -func (*CapacityRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +func (*CapacityRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +func (m *CapacityRange) GetRequiredBytes() int64 { + if m != nil { + return m.RequiredBytes + } + return 0 +} + +func (m *CapacityRange) GetLimitBytes() int64 { + if m != nil { + return m.LimitBytes + } + return 0 +} // The information about a provisioned volume. -type VolumeInfo struct { +type Volume struct { // The capacity of the volume in bytes. This field is OPTIONAL. If not // set (value of 0), it indicates that the capacity of the volume is // unknown (e.g., NFS share). - CapacityBytes uint64 `protobuf:"varint,1,opt,name=capacity_bytes,json=capacityBytes" json:"capacity_bytes,omitempty"` + // The value of this field MUST NOT be negative. + CapacityBytes int64 `protobuf:"varint,1,opt,name=capacity_bytes,json=capacityBytes" json:"capacity_bytes,omitempty"` // Contains identity information for the created volume. This field is // REQUIRED. The identity information will be used by the CO in // subsequent calls to refer to the provisioned volume. @@ -581,12 +837,26 @@ type VolumeInfo struct { Attributes map[string]string `protobuf:"bytes,3,rep,name=attributes" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } -func (m *VolumeInfo) Reset() { *m = VolumeInfo{} } -func (m *VolumeInfo) String() string { return proto.CompactTextString(m) } -func (*VolumeInfo) ProtoMessage() {} -func (*VolumeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } +func (m *Volume) Reset() { *m = Volume{} } +func (m *Volume) String() string { return proto.CompactTextString(m) } +func (*Volume) ProtoMessage() {} +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +func (m *Volume) GetCapacityBytes() int64 { + if m != nil { + return m.CapacityBytes + } + return 0 +} + +func (m *Volume) GetId() string { + if m != nil { + return m.Id + } + return "" +} -func (m *VolumeInfo) GetAttributes() map[string]string { +func (m *Volume) GetAttributes() map[string]string { if m != nil { return m.Attributes } @@ -601,24 +871,24 @@ type DeleteVolumeRequest struct { // The ID of the volume to be deprovisioned. // This field is REQUIRED. VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` - // End user credentials used to authenticate/authorize volume deletion - // request. + // Credentials used by Controller plugin to authenticate/authorize + // volume deletion request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', // '_' or '.'. Each value MUST contain a valid string. An SP MAY // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - UserCredentials map[string]string `protobuf:"bytes,3,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ControllerDeleteCredentials map[string]string `protobuf:"bytes,3,rep,name=controller_delete_credentials,json=controllerDeleteCredentials" json:"controller_delete_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } func (m *DeleteVolumeRequest) Reset() { *m = DeleteVolumeRequest{} } func (m *DeleteVolumeRequest) String() string { return proto.CompactTextString(m) } func (*DeleteVolumeRequest) ProtoMessage() {} -func (*DeleteVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } +func (*DeleteVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } func (m *DeleteVolumeRequest) GetVersion() *Version { if m != nil { @@ -627,9 +897,16 @@ func (m *DeleteVolumeRequest) GetVersion() *Version { return nil } -func (m *DeleteVolumeRequest) GetUserCredentials() map[string]string { +func (m *DeleteVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *DeleteVolumeRequest) GetControllerDeleteCredentials() map[string]string { if m != nil { - return m.UserCredentials + return m.ControllerDeleteCredentials } return nil } @@ -640,7 +917,7 @@ type DeleteVolumeResponse struct { func (m *DeleteVolumeResponse) Reset() { *m = DeleteVolumeResponse{} } func (m *DeleteVolumeResponse) String() string { return proto.CompactTextString(m) } func (*DeleteVolumeResponse) ProtoMessage() {} -func (*DeleteVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } +func (*DeleteVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } // ////// // ////// @@ -651,7 +928,7 @@ type ControllerPublishVolumeRequest struct { // This field is REQUIRED. VolumeId string `protobuf:"bytes,2,opt,name=volume_id,json=volumeId" json:"volume_id,omitempty"` // The ID of the node. This field is REQUIRED. The CO SHALL set this - // field to match the node ID returned by `GetNodeID`. + // field to match the node ID returned by `NodeGetId`. NodeId string `protobuf:"bytes,3,opt,name=node_id,json=nodeId" json:"node_id,omitempty"` // The capability of the volume the CO expects the volume to have. // This is a REQUIRED field. @@ -659,20 +936,20 @@ type ControllerPublishVolumeRequest struct { // Whether to publish the volume in readonly mode. This field is // REQUIRED. Readonly bool `protobuf:"varint,5,opt,name=readonly" json:"readonly,omitempty"` - // End user credentials used to authenticate/authorize controller - // publish request. + // Credentials used by Controller plugin to authenticate/authorize + // controller publish request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', // '_' or '.'. Each value MUST contain a valid string. An SP MAY // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - UserCredentials map[string]string `protobuf:"bytes,6,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ControllerPublishCredentials map[string]string `protobuf:"bytes,6,rep,name=controller_publish_credentials,json=controllerPublishCredentials" json:"controller_publish_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Attributes of the volume to be used on a node. This field is - // OPTIONAL and MUST match the attributes of the VolumeInfo identified + // OPTIONAL and MUST match the attributes of the Volume identified // by `volume_id`. VolumeAttributes map[string]string `protobuf:"bytes,7,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } @@ -680,7 +957,7 @@ type ControllerPublishVolumeRequest struct { func (m *ControllerPublishVolumeRequest) Reset() { *m = ControllerPublishVolumeRequest{} } func (m *ControllerPublishVolumeRequest) String() string { return proto.CompactTextString(m) } func (*ControllerPublishVolumeRequest) ProtoMessage() {} -func (*ControllerPublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } +func (*ControllerPublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } func (m *ControllerPublishVolumeRequest) GetVersion() *Version { if m != nil { @@ -689,6 +966,20 @@ func (m *ControllerPublishVolumeRequest) GetVersion() *Version { return nil } +func (m *ControllerPublishVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *ControllerPublishVolumeRequest) GetNodeId() string { + if m != nil { + return m.NodeId + } + return "" +} + func (m *ControllerPublishVolumeRequest) GetVolumeCapability() *VolumeCapability { if m != nil { return m.VolumeCapability @@ -696,9 +987,16 @@ func (m *ControllerPublishVolumeRequest) GetVolumeCapability() *VolumeCapability return nil } -func (m *ControllerPublishVolumeRequest) GetUserCredentials() map[string]string { +func (m *ControllerPublishVolumeRequest) GetReadonly() bool { + if m != nil { + return m.Readonly + } + return false +} + +func (m *ControllerPublishVolumeRequest) GetControllerPublishCredentials() map[string]string { if m != nil { - return m.UserCredentials + return m.ControllerPublishCredentials } return nil } @@ -712,22 +1010,22 @@ func (m *ControllerPublishVolumeRequest) GetVolumeAttributes() map[string]string type ControllerPublishVolumeResponse struct { // The SP specific information that will be passed to the Plugin in - // the subsequent `NodePublishDevice` and `NodePublishVolume` calls + // the subsequent `NodeStageVolume` or `NodePublishVolume` calls // for the given volume. // This information is opaque to the CO. This field is OPTIONAL. - PublishVolumeInfo map[string]string `protobuf:"bytes,1,rep,name=publish_volume_info,json=publishVolumeInfo" json:"publish_volume_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + PublishInfo map[string]string `protobuf:"bytes,1,rep,name=publish_info,json=publishInfo" json:"publish_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } func (m *ControllerPublishVolumeResponse) Reset() { *m = ControllerPublishVolumeResponse{} } func (m *ControllerPublishVolumeResponse) String() string { return proto.CompactTextString(m) } func (*ControllerPublishVolumeResponse) ProtoMessage() {} func (*ControllerPublishVolumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{13} + return fileDescriptor0, []int{16} } -func (m *ControllerPublishVolumeResponse) GetPublishVolumeInfo() map[string]string { +func (m *ControllerPublishVolumeResponse) GetPublishInfo() map[string]string { if m != nil { - return m.PublishVolumeInfo + return m.PublishInfo } return nil } @@ -740,30 +1038,30 @@ type ControllerUnpublishVolumeRequest struct { // 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 ID of the node. This field is OPTIONAL. The CO SHOULD set this - // field to match the node ID returned by `GetNodeID` or leave it + // field to match the node ID returned by `NodeGetId` or leave it // unset. If the value is set, the SP MUST unpublish the volume from // the specified node. If the value is unset, the SP MUST unpublish // the volume from all nodes it is published to. NodeId string `protobuf:"bytes,3,opt,name=node_id,json=nodeId" json:"node_id,omitempty"` - // End user credentials used to authenticate/authorize controller - // unpublish request. + // Credentials used by Controller plugin to authenticate/authorize + // controller unpublish request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', // '_' or '.'. Each value MUST contain a valid string. An SP MAY // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - UserCredentials map[string]string `protobuf:"bytes,4,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + ControllerUnpublishCredentials map[string]string `protobuf:"bytes,4,rep,name=controller_unpublish_credentials,json=controllerUnpublishCredentials" json:"controller_unpublish_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } func (m *ControllerUnpublishVolumeRequest) Reset() { *m = ControllerUnpublishVolumeRequest{} } func (m *ControllerUnpublishVolumeRequest) String() string { return proto.CompactTextString(m) } func (*ControllerUnpublishVolumeRequest) ProtoMessage() {} func (*ControllerUnpublishVolumeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{14} + return fileDescriptor0, []int{17} } func (m *ControllerUnpublishVolumeRequest) GetVersion() *Version { @@ -773,9 +1071,23 @@ func (m *ControllerUnpublishVolumeRequest) GetVersion() *Version { return nil } -func (m *ControllerUnpublishVolumeRequest) GetUserCredentials() map[string]string { +func (m *ControllerUnpublishVolumeRequest) GetVolumeId() string { if m != nil { - return m.UserCredentials + return m.VolumeId + } + return "" +} + +func (m *ControllerUnpublishVolumeRequest) GetNodeId() string { + if m != nil { + return m.NodeId + } + return "" +} + +func (m *ControllerUnpublishVolumeRequest) GetControllerUnpublishCredentials() map[string]string { + if m != nil { + return m.ControllerUnpublishCredentials } return nil } @@ -787,7 +1099,7 @@ func (m *ControllerUnpublishVolumeResponse) Reset() { *m = ControllerUnp func (m *ControllerUnpublishVolumeResponse) String() string { return proto.CompactTextString(m) } func (*ControllerUnpublishVolumeResponse) ProtoMessage() {} func (*ControllerUnpublishVolumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{15} + return fileDescriptor0, []int{18} } // ////// @@ -802,7 +1114,7 @@ type ValidateVolumeCapabilitiesRequest struct { // specified below are supported. This field is REQUIRED. VolumeCapabilities []*VolumeCapability `protobuf:"bytes,3,rep,name=volume_capabilities,json=volumeCapabilities" json:"volume_capabilities,omitempty"` // Attributes of the volume to check. This field is OPTIONAL and MUST - // match the attributes of the VolumeInfo identified by `volume_id`. + // match the attributes of the Volume identified by `volume_id`. VolumeAttributes map[string]string `protobuf:"bytes,4,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } @@ -810,7 +1122,7 @@ func (m *ValidateVolumeCapabilitiesRequest) Reset() { *m = ValidateVolum func (m *ValidateVolumeCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*ValidateVolumeCapabilitiesRequest) ProtoMessage() {} func (*ValidateVolumeCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{16} + return fileDescriptor0, []int{19} } func (m *ValidateVolumeCapabilitiesRequest) GetVersion() *Version { @@ -820,6 +1132,13 @@ func (m *ValidateVolumeCapabilitiesRequest) GetVersion() *Version { return nil } +func (m *ValidateVolumeCapabilitiesRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + func (m *ValidateVolumeCapabilitiesRequest) GetVolumeCapabilities() []*VolumeCapability { if m != nil { return m.VolumeCapabilities @@ -848,7 +1167,21 @@ func (m *ValidateVolumeCapabilitiesResponse) Reset() { *m = ValidateVolu func (m *ValidateVolumeCapabilitiesResponse) String() string { return proto.CompactTextString(m) } func (*ValidateVolumeCapabilitiesResponse) ProtoMessage() {} func (*ValidateVolumeCapabilitiesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{17} + return fileDescriptor0, []int{20} +} + +func (m *ValidateVolumeCapabilitiesResponse) GetSupported() bool { + if m != nil { + return m.Supported + } + return false +} + +func (m *ValidateVolumeCapabilitiesResponse) GetMessage() string { + if m != nil { + return m.Message + } + return "" } // ////// @@ -863,7 +1196,8 @@ type ListVolumesRequest struct { // in the subsequent `ListVolumes` call. This field is OPTIONAL. If // not specified (zero value), it means there is no restriction on the // number of entries that can be returned. - MaxEntries uint32 `protobuf:"varint,2,opt,name=max_entries,json=maxEntries" json:"max_entries,omitempty"` + // The value of this field MUST NOT be negative. + MaxEntries int32 `protobuf:"varint,2,opt,name=max_entries,json=maxEntries" json:"max_entries,omitempty"` // A token to specify where to start paginating. Set this field to // `next_token` returned by a previous `ListVolumes` call to get the // next page of entries. This field is OPTIONAL. @@ -874,7 +1208,7 @@ type ListVolumesRequest struct { func (m *ListVolumesRequest) Reset() { *m = ListVolumesRequest{} } func (m *ListVolumesRequest) String() string { return proto.CompactTextString(m) } func (*ListVolumesRequest) ProtoMessage() {} -func (*ListVolumesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } +func (*ListVolumesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } func (m *ListVolumesRequest) GetVersion() *Version { if m != nil { @@ -883,6 +1217,20 @@ func (m *ListVolumesRequest) GetVersion() *Version { return nil } +func (m *ListVolumesRequest) GetMaxEntries() int32 { + if m != nil { + return m.MaxEntries + } + return 0 +} + +func (m *ListVolumesRequest) GetStartingToken() string { + if m != nil { + return m.StartingToken + } + return "" +} + type ListVolumesResponse struct { Entries []*ListVolumesResponse_Entry `protobuf:"bytes,1,rep,name=entries" json:"entries,omitempty"` // This token allows you to get the next page of entries for @@ -897,7 +1245,7 @@ type ListVolumesResponse struct { func (m *ListVolumesResponse) Reset() { *m = ListVolumesResponse{} } func (m *ListVolumesResponse) String() string { return proto.CompactTextString(m) } func (*ListVolumesResponse) ProtoMessage() {} -func (*ListVolumesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } +func (*ListVolumesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } func (m *ListVolumesResponse) GetEntries() []*ListVolumesResponse_Entry { if m != nil { @@ -906,18 +1254,25 @@ func (m *ListVolumesResponse) GetEntries() []*ListVolumesResponse_Entry { return nil } +func (m *ListVolumesResponse) GetNextToken() string { + if m != nil { + return m.NextToken + } + return "" +} + type ListVolumesResponse_Entry struct { - VolumeInfo *VolumeInfo `protobuf:"bytes,1,opt,name=volume_info,json=volumeInfo" json:"volume_info,omitempty"` + Volume *Volume `protobuf:"bytes,1,opt,name=volume" json:"volume,omitempty"` } func (m *ListVolumesResponse_Entry) Reset() { *m = ListVolumesResponse_Entry{} } func (m *ListVolumesResponse_Entry) String() string { return proto.CompactTextString(m) } func (*ListVolumesResponse_Entry) ProtoMessage() {} -func (*ListVolumesResponse_Entry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19, 0} } +func (*ListVolumesResponse_Entry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22, 0} } -func (m *ListVolumesResponse_Entry) GetVolumeInfo() *VolumeInfo { +func (m *ListVolumesResponse_Entry) GetVolume() *Volume { if m != nil { - return m.VolumeInfo + return m.Volume } return nil } @@ -943,7 +1298,7 @@ type GetCapacityRequest struct { func (m *GetCapacityRequest) Reset() { *m = GetCapacityRequest{} } func (m *GetCapacityRequest) String() string { return proto.CompactTextString(m) } func (*GetCapacityRequest) ProtoMessage() {} -func (*GetCapacityRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } +func (*GetCapacityRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } func (m *GetCapacityRequest) GetVersion() *Version { if m != nil { @@ -972,13 +1327,21 @@ type GetCapacityResponse struct { // specified in the request, the Plugin SHALL take those into // consideration when calculating the available capacity of the // storage. This field is REQUIRED. - AvailableCapacity uint64 `protobuf:"varint,1,opt,name=available_capacity,json=availableCapacity" json:"available_capacity,omitempty"` + // The value of this field MUST NOT be negative. + AvailableCapacity int64 `protobuf:"varint,1,opt,name=available_capacity,json=availableCapacity" json:"available_capacity,omitempty"` } func (m *GetCapacityResponse) Reset() { *m = GetCapacityResponse{} } func (m *GetCapacityResponse) String() string { return proto.CompactTextString(m) } func (*GetCapacityResponse) ProtoMessage() {} -func (*GetCapacityResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } +func (*GetCapacityResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } + +func (m *GetCapacityResponse) GetAvailableCapacity() int64 { + if m != nil { + return m.AvailableCapacity + } + return 0 +} // ////// // ////// @@ -990,7 +1353,7 @@ type ControllerProbeRequest struct { func (m *ControllerProbeRequest) Reset() { *m = ControllerProbeRequest{} } func (m *ControllerProbeRequest) String() string { return proto.CompactTextString(m) } func (*ControllerProbeRequest) ProtoMessage() {} -func (*ControllerProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } +func (*ControllerProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } func (m *ControllerProbeRequest) GetVersion() *Version { if m != nil { @@ -1005,7 +1368,7 @@ type ControllerProbeResponse struct { func (m *ControllerProbeResponse) Reset() { *m = ControllerProbeResponse{} } func (m *ControllerProbeResponse) String() string { return proto.CompactTextString(m) } func (*ControllerProbeResponse) ProtoMessage() {} -func (*ControllerProbeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } +func (*ControllerProbeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } // ////// // ////// @@ -1018,7 +1381,7 @@ func (m *ControllerGetCapabilitiesRequest) Reset() { *m = ControllerGetC func (m *ControllerGetCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*ControllerGetCapabilitiesRequest) ProtoMessage() {} func (*ControllerGetCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{24} + return fileDescriptor0, []int{27} } func (m *ControllerGetCapabilitiesRequest) GetVersion() *Version { @@ -1038,7 +1401,7 @@ func (m *ControllerGetCapabilitiesResponse) Reset() { *m = ControllerGet func (m *ControllerGetCapabilitiesResponse) String() string { return proto.CompactTextString(m) } func (*ControllerGetCapabilitiesResponse) ProtoMessage() {} func (*ControllerGetCapabilitiesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{25} + return fileDescriptor0, []int{28} } func (m *ControllerGetCapabilitiesResponse) GetCapabilities() []*ControllerServiceCapability { @@ -1058,7 +1421,7 @@ type ControllerServiceCapability struct { func (m *ControllerServiceCapability) Reset() { *m = ControllerServiceCapability{} } func (m *ControllerServiceCapability) String() string { return proto.CompactTextString(m) } func (*ControllerServiceCapability) ProtoMessage() {} -func (*ControllerServiceCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } +func (*ControllerServiceCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } type isControllerServiceCapability_Type interface { isControllerServiceCapability_Type() @@ -1147,12 +1510,19 @@ func (m *ControllerServiceCapability_RPC) Reset() { *m = ControllerServi func (m *ControllerServiceCapability_RPC) String() string { return proto.CompactTextString(m) } func (*ControllerServiceCapability_RPC) ProtoMessage() {} func (*ControllerServiceCapability_RPC) Descriptor() ([]byte, []int) { - return fileDescriptor0, []int{26, 0} + return fileDescriptor0, []int{29, 0} +} + +func (m *ControllerServiceCapability_RPC) GetType() ControllerServiceCapability_RPC_Type { + if m != nil { + return m.Type + } + return ControllerServiceCapability_RPC_UNKNOWN } // ////// // ////// -type NodePublishDeviceRequest struct { +type NodeStageVolumeRequest struct { // The API version assumed by the CO. This is a REQUIRED field. Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` // The ID of the volume to publish. This field is REQUIRED. @@ -1162,55 +1532,99 @@ type NodePublishDeviceRequest struct { // 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 map[string]string `protobuf:"bytes,3,rep,name=publish_volume_info,json=publishVolumeInfo" json:"publish_volume_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + PublishInfo map[string]string `protobuf:"bytes,3,rep,name=publish_info,json=publishInfo" json:"publish_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // The path to which the volume will be published. It MUST be an // absolute path in the root filesystem of the process serving this - // request. The CO SHALL ensure uniqueness of global_target_path per - // volume. + // request. The CO SHALL ensure that there is only one + // staging_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"` + StagingTargetPath string `protobuf:"bytes,4,opt,name=staging_target_path,json=stagingTargetPath" json:"staging_target_path,omitempty"` // The capability of the volume the CO expects the volume to have. // This is a REQUIRED field. VolumeCapability *VolumeCapability `protobuf:"bytes,5,opt,name=volume_capability,json=volumeCapability" json:"volume_capability,omitempty"` + // Credentials used by Node plugin to authenticate/authorize node + // stage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + NodeStageCredentials map[string]string `protobuf:"bytes,6,rep,name=node_stage_credentials,json=nodeStageCredentials" json:"node_stage_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // Attributes of the volume to publish. This field is OPTIONAL and + // MUST match the attributes of the VolumeInfo identified by + // `volume_id`. + VolumeAttributes map[string]string `protobuf:"bytes,7,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } -func (m *NodePublishDeviceRequest) Reset() { *m = NodePublishDeviceRequest{} } -func (m *NodePublishDeviceRequest) String() string { return proto.CompactTextString(m) } -func (*NodePublishDeviceRequest) ProtoMessage() {} -func (*NodePublishDeviceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } +func (m *NodeStageVolumeRequest) Reset() { *m = NodeStageVolumeRequest{} } +func (m *NodeStageVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*NodeStageVolumeRequest) ProtoMessage() {} +func (*NodeStageVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } -func (m *NodePublishDeviceRequest) GetVersion() *Version { +func (m *NodeStageVolumeRequest) GetVersion() *Version { if m != nil { return m.Version } return nil } -func (m *NodePublishDeviceRequest) GetPublishVolumeInfo() map[string]string { +func (m *NodeStageVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodeStageVolumeRequest) GetPublishInfo() map[string]string { if m != nil { - return m.PublishVolumeInfo + return m.PublishInfo } return nil } -func (m *NodePublishDeviceRequest) GetVolumeCapability() *VolumeCapability { +func (m *NodeStageVolumeRequest) GetStagingTargetPath() string { + if m != nil { + return m.StagingTargetPath + } + return "" +} + +func (m *NodeStageVolumeRequest) GetVolumeCapability() *VolumeCapability { if m != nil { return m.VolumeCapability } return nil } -type NodePublishDeviceResponse struct { +func (m *NodeStageVolumeRequest) GetNodeStageCredentials() map[string]string { + if m != nil { + return m.NodeStageCredentials + } + return nil +} + +func (m *NodeStageVolumeRequest) GetVolumeAttributes() map[string]string { + if m != nil { + return m.VolumeAttributes + } + return nil +} + +type NodeStageVolumeResponse struct { } -func (m *NodePublishDeviceResponse) Reset() { *m = NodePublishDeviceResponse{} } -func (m *NodePublishDeviceResponse) String() string { return proto.CompactTextString(m) } -func (*NodePublishDeviceResponse) ProtoMessage() {} -func (*NodePublishDeviceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } +func (m *NodeStageVolumeResponse) Reset() { *m = NodeStageVolumeResponse{} } +func (m *NodeStageVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*NodeStageVolumeResponse) ProtoMessage() {} +func (*NodeStageVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } // ////// // ////// -type NodeUnpublishDeviceRequest struct { +type NodeUnstageVolumeRequest struct { // The API version assumed by the CO. This is a REQUIRED field. Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` // The ID of the volume. This field is REQUIRED. @@ -1218,28 +1632,61 @@ type NodeUnpublishDeviceRequest struct { // 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"` + StagingTargetPath string `protobuf:"bytes,3,opt,name=staging_target_path,json=stagingTargetPath" json:"staging_target_path,omitempty"` + // Credentials used by Node plugin to authenticate/authorize node + // unstage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + NodeUnstageCredentials map[string]string `protobuf:"bytes,4,rep,name=node_unstage_credentials,json=nodeUnstageCredentials" json:"node_unstage_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } -func (m *NodeUnpublishDeviceRequest) Reset() { *m = NodeUnpublishDeviceRequest{} } -func (m *NodeUnpublishDeviceRequest) String() string { return proto.CompactTextString(m) } -func (*NodeUnpublishDeviceRequest) ProtoMessage() {} -func (*NodeUnpublishDeviceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } +func (m *NodeUnstageVolumeRequest) Reset() { *m = NodeUnstageVolumeRequest{} } +func (m *NodeUnstageVolumeRequest) String() string { return proto.CompactTextString(m) } +func (*NodeUnstageVolumeRequest) ProtoMessage() {} +func (*NodeUnstageVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } -func (m *NodeUnpublishDeviceRequest) GetVersion() *Version { +func (m *NodeUnstageVolumeRequest) GetVersion() *Version { if m != nil { return m.Version } return nil } -type NodeUnpublishDeviceResponse struct { +func (m *NodeUnstageVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodeUnstageVolumeRequest) GetStagingTargetPath() string { + if m != nil { + return m.StagingTargetPath + } + return "" } -func (m *NodeUnpublishDeviceResponse) Reset() { *m = NodeUnpublishDeviceResponse{} } -func (m *NodeUnpublishDeviceResponse) String() string { return proto.CompactTextString(m) } -func (*NodeUnpublishDeviceResponse) ProtoMessage() {} -func (*NodeUnpublishDeviceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } +func (m *NodeUnstageVolumeRequest) GetNodeUnstageCredentials() map[string]string { + if m != nil { + return m.NodeUnstageCredentials + } + return nil +} + +type NodeUnstageVolumeResponse struct { +} + +func (m *NodeUnstageVolumeResponse) Reset() { *m = NodeUnstageVolumeResponse{} } +func (m *NodeUnstageVolumeResponse) String() string { return proto.CompactTextString(m) } +func (*NodeUnstageVolumeResponse) ProtoMessage() {} +func (*NodeUnstageVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } // ////// // ////// @@ -1253,12 +1700,14 @@ type NodePublishVolumeRequest struct { // 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 map[string]string `protobuf:"bytes,3,rep,name=publish_volume_info,json=publishVolumeInfo" json:"publish_volume_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - // The path to which the device was mounted by `NodePublishDevice`. + PublishInfo map[string]string `protobuf:"bytes,3,rep,name=publish_info,json=publishInfo" json:"publish_info,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // The path to which the device was mounted by `NodeStageVolume`. // It MUST be an absolute path in the root filesystem of the process // serving this request. + // It MUST be set if the Node Plugin implements the + // `STAGE_UNSTAGE_VOLUME` node capability. // This is an OPTIONAL field. - GlobalTargetPath string `protobuf:"bytes,4,opt,name=global_target_path,json=globalTargetPath" json:"global_target_path,omitempty"` + StagingTargetPath string `protobuf:"bytes,4,opt,name=staging_target_path,json=stagingTargetPath" json:"staging_target_path,omitempty"` // The path to which the volume will be published. It MUST be an // absolute path in the root filesystem of the process serving this // request. The CO SHALL ensure uniqueness of target_path per volume. @@ -1272,7 +1721,7 @@ type NodePublishVolumeRequest struct { // Whether to publish the volume in readonly mode. This field is // REQUIRED. Readonly bool `protobuf:"varint,7,opt,name=readonly" json:"readonly,omitempty"` - // End user credentials used to authenticate/authorize node + // Credentials used by Node plugin to authenticate/authorize node // publish request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', @@ -1280,12 +1729,12 @@ type NodePublishVolumeRequest struct { // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - UserCredentials map[string]string `protobuf:"bytes,8,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + NodePublishCredentials map[string]string `protobuf:"bytes,8,rep,name=node_publish_credentials,json=nodePublishCredentials" json:"node_publish_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // Attributes of the volume to publish. This field is OPTIONAL and - // MUST match the attributes of the VolumeInfo identified by + // MUST match the attributes of the Volume identified by // `volume_id`. VolumeAttributes map[string]string `protobuf:"bytes,9,rep,name=volume_attributes,json=volumeAttributes" json:"volume_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } @@ -1293,7 +1742,7 @@ type NodePublishVolumeRequest struct { 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{31} } +func (*NodePublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } func (m *NodePublishVolumeRequest) GetVersion() *Version { if m != nil { @@ -1302,13 +1751,34 @@ func (m *NodePublishVolumeRequest) GetVersion() *Version { return nil } -func (m *NodePublishVolumeRequest) GetPublishVolumeInfo() map[string]string { +func (m *NodePublishVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodePublishVolumeRequest) GetPublishInfo() map[string]string { if m != nil { - return m.PublishVolumeInfo + return m.PublishInfo } return nil } +func (m *NodePublishVolumeRequest) GetStagingTargetPath() string { + if m != nil { + return m.StagingTargetPath + } + return "" +} + +func (m *NodePublishVolumeRequest) GetTargetPath() string { + if m != nil { + return m.TargetPath + } + return "" +} + func (m *NodePublishVolumeRequest) GetVolumeCapability() *VolumeCapability { if m != nil { return m.VolumeCapability @@ -1316,9 +1786,16 @@ func (m *NodePublishVolumeRequest) GetVolumeCapability() *VolumeCapability { return nil } -func (m *NodePublishVolumeRequest) GetUserCredentials() map[string]string { +func (m *NodePublishVolumeRequest) GetReadonly() bool { if m != nil { - return m.UserCredentials + return m.Readonly + } + return false +} + +func (m *NodePublishVolumeRequest) GetNodePublishCredentials() map[string]string { + if m != nil { + return m.NodePublishCredentials } return nil } @@ -1336,7 +1813,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{32} } +func (*NodePublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } // ////// // ////// @@ -1345,16 +1822,11 @@ type NodeUnpublishVolumeRequest struct { 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 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,4,opt,name=target_path,json=targetPath" json:"target_path,omitempty"` - // End user credentials used to authenticate/authorize node + TargetPath string `protobuf:"bytes,3,opt,name=target_path,json=targetPath" json:"target_path,omitempty"` + // Credentials used by Node plugin to authenticate/authorize node // unpublish request. // This field contains credential data, for example username and // password. Each key must consist of alphanumeric characters, '-', @@ -1362,16 +1834,16 @@ type NodeUnpublishVolumeRequest struct { // choose to accept binary (non-string) data by using a binary-to-text // encoding scheme, like base64. An SP SHALL advertise the // requirements for credentials in documentation. COs SHALL permit - // users to pass through the required credentials. This information is + // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - UserCredentials map[string]string `protobuf:"bytes,5,rep,name=user_credentials,json=userCredentials" json:"user_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + NodeUnpublishCredentials map[string]string `protobuf:"bytes,4,rep,name=node_unpublish_credentials,json=nodeUnpublishCredentials" json:"node_unpublish_credentials,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` } 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{33} } +func (*NodeUnpublishVolumeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } func (m *NodeUnpublishVolumeRequest) GetVersion() *Version { if m != nil { @@ -1380,9 +1852,23 @@ func (m *NodeUnpublishVolumeRequest) GetVersion() *Version { return nil } -func (m *NodeUnpublishVolumeRequest) GetUserCredentials() map[string]string { +func (m *NodeUnpublishVolumeRequest) GetVolumeId() string { + if m != nil { + return m.VolumeId + } + return "" +} + +func (m *NodeUnpublishVolumeRequest) GetTargetPath() string { + if m != nil { + return m.TargetPath + } + return "" +} + +func (m *NodeUnpublishVolumeRequest) GetNodeUnpublishCredentials() map[string]string { if m != nil { - return m.UserCredentials + return m.NodeUnpublishCredentials } return nil } @@ -1393,38 +1879,45 @@ 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{34} } +func (*NodeUnpublishVolumeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } // ////// // ////// -type GetNodeIDRequest struct { +type NodeGetIdRequest struct { // The API version assumed by the CO. This is a REQUIRED field. Version *Version `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` } -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{35} } +func (m *NodeGetIdRequest) Reset() { *m = NodeGetIdRequest{} } +func (m *NodeGetIdRequest) String() string { return proto.CompactTextString(m) } +func (*NodeGetIdRequest) ProtoMessage() {} +func (*NodeGetIdRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } -func (m *GetNodeIDRequest) GetVersion() *Version { +func (m *NodeGetIdRequest) GetVersion() *Version { if m != nil { return m.Version } return nil } -type GetNodeIDResponse struct { +type NodeGetIdResponse struct { // The ID of the node as understood by the SP which SHALL be used by // CO in subsequent `ControllerPublishVolume`. // This is a REQUIRED field. NodeId string `protobuf:"bytes,1,opt,name=node_id,json=nodeId" json:"node_id,omitempty"` } -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{36} } +func (m *NodeGetIdResponse) Reset() { *m = NodeGetIdResponse{} } +func (m *NodeGetIdResponse) String() string { return proto.CompactTextString(m) } +func (*NodeGetIdResponse) ProtoMessage() {} +func (*NodeGetIdResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } + +func (m *NodeGetIdResponse) GetNodeId() string { + if m != nil { + return m.NodeId + } + return "" +} // ////// // ////// @@ -1436,7 +1929,7 @@ type NodeProbeRequest struct { func (m *NodeProbeRequest) Reset() { *m = NodeProbeRequest{} } func (m *NodeProbeRequest) String() string { return proto.CompactTextString(m) } func (*NodeProbeRequest) ProtoMessage() {} -func (*NodeProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } +func (*NodeProbeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } func (m *NodeProbeRequest) GetVersion() *Version { if m != nil { @@ -1451,7 +1944,7 @@ type NodeProbeResponse struct { func (m *NodeProbeResponse) Reset() { *m = NodeProbeResponse{} } func (m *NodeProbeResponse) String() string { return proto.CompactTextString(m) } func (*NodeProbeResponse) ProtoMessage() {} -func (*NodeProbeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } +func (*NodeProbeResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } // ////// // ////// @@ -1463,7 +1956,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{39} } +func (*NodeGetCapabilitiesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } func (m *NodeGetCapabilitiesRequest) GetVersion() *Version { if m != nil { @@ -1481,7 +1974,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{40} } +func (*NodeGetCapabilitiesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} } func (m *NodeGetCapabilitiesResponse) GetCapabilities() []*NodeServiceCapability { if m != nil { @@ -1500,7 +1993,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{41} } +func (*NodeServiceCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } type isNodeServiceCapability_Type interface { isNodeServiceCapability_Type() @@ -1588,7 +2081,14 @@ 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{41, 0} } +func (*NodeServiceCapability_RPC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44, 0} } + +func (m *NodeServiceCapability_RPC) GetType() NodeServiceCapability_RPC_Type { + if m != nil { + return m.Type + } + return NodeServiceCapability_RPC_UNKNOWN +} func init() { proto.RegisterType((*GetSupportedVersionsRequest)(nil), "csi.GetSupportedVersionsRequest") @@ -1596,6 +2096,10 @@ func init() { proto.RegisterType((*Version)(nil), "csi.Version") proto.RegisterType((*GetPluginInfoRequest)(nil), "csi.GetPluginInfoRequest") proto.RegisterType((*GetPluginInfoResponse)(nil), "csi.GetPluginInfoResponse") + proto.RegisterType((*GetPluginCapabilitiesRequest)(nil), "csi.GetPluginCapabilitiesRequest") + proto.RegisterType((*GetPluginCapabilitiesResponse)(nil), "csi.GetPluginCapabilitiesResponse") + proto.RegisterType((*PluginCapability)(nil), "csi.PluginCapability") + proto.RegisterType((*PluginCapability_Service)(nil), "csi.PluginCapability.Service") proto.RegisterType((*CreateVolumeRequest)(nil), "csi.CreateVolumeRequest") proto.RegisterType((*CreateVolumeResponse)(nil), "csi.CreateVolumeResponse") proto.RegisterType((*VolumeCapability)(nil), "csi.VolumeCapability") @@ -1603,7 +2107,7 @@ func init() { proto.RegisterType((*VolumeCapability_MountVolume)(nil), "csi.VolumeCapability.MountVolume") proto.RegisterType((*VolumeCapability_AccessMode)(nil), "csi.VolumeCapability.AccessMode") proto.RegisterType((*CapacityRange)(nil), "csi.CapacityRange") - proto.RegisterType((*VolumeInfo)(nil), "csi.VolumeInfo") + proto.RegisterType((*Volume)(nil), "csi.Volume") proto.RegisterType((*DeleteVolumeRequest)(nil), "csi.DeleteVolumeRequest") proto.RegisterType((*DeleteVolumeResponse)(nil), "csi.DeleteVolumeResponse") proto.RegisterType((*ControllerPublishVolumeRequest)(nil), "csi.ControllerPublishVolumeRequest") @@ -1623,22 +2127,23 @@ func init() { proto.RegisterType((*ControllerGetCapabilitiesResponse)(nil), "csi.ControllerGetCapabilitiesResponse") 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((*NodeUnpublishDeviceRequest)(nil), "csi.NodeUnpublishDeviceRequest") - proto.RegisterType((*NodeUnpublishDeviceResponse)(nil), "csi.NodeUnpublishDeviceResponse") + proto.RegisterType((*NodeStageVolumeRequest)(nil), "csi.NodeStageVolumeRequest") + proto.RegisterType((*NodeStageVolumeResponse)(nil), "csi.NodeStageVolumeResponse") + proto.RegisterType((*NodeUnstageVolumeRequest)(nil), "csi.NodeUnstageVolumeRequest") + proto.RegisterType((*NodeUnstageVolumeResponse)(nil), "csi.NodeUnstageVolumeResponse") proto.RegisterType((*NodePublishVolumeRequest)(nil), "csi.NodePublishVolumeRequest") proto.RegisterType((*NodePublishVolumeResponse)(nil), "csi.NodePublishVolumeResponse") proto.RegisterType((*NodeUnpublishVolumeRequest)(nil), "csi.NodeUnpublishVolumeRequest") proto.RegisterType((*NodeUnpublishVolumeResponse)(nil), "csi.NodeUnpublishVolumeResponse") - proto.RegisterType((*GetNodeIDRequest)(nil), "csi.GetNodeIDRequest") - proto.RegisterType((*GetNodeIDResponse)(nil), "csi.GetNodeIDResponse") + proto.RegisterType((*NodeGetIdRequest)(nil), "csi.NodeGetIdRequest") + proto.RegisterType((*NodeGetIdResponse)(nil), "csi.NodeGetIdResponse") proto.RegisterType((*NodeProbeRequest)(nil), "csi.NodeProbeRequest") proto.RegisterType((*NodeProbeResponse)(nil), "csi.NodeProbeResponse") proto.RegisterType((*NodeGetCapabilitiesRequest)(nil), "csi.NodeGetCapabilitiesRequest") proto.RegisterType((*NodeGetCapabilitiesResponse)(nil), "csi.NodeGetCapabilitiesResponse") proto.RegisterType((*NodeServiceCapability)(nil), "csi.NodeServiceCapability") proto.RegisterType((*NodeServiceCapability_RPC)(nil), "csi.NodeServiceCapability.RPC") + proto.RegisterEnum("csi.PluginCapability_Service_Type", PluginCapability_Service_Type_name, PluginCapability_Service_Type_value) proto.RegisterEnum("csi.VolumeCapability_AccessMode_Mode", VolumeCapability_AccessMode_Mode_name, VolumeCapability_AccessMode_Mode_value) proto.RegisterEnum("csi.ControllerServiceCapability_RPC_Type", ControllerServiceCapability_RPC_Type_name, ControllerServiceCapability_RPC_Type_value) proto.RegisterEnum("csi.NodeServiceCapability_RPC_Type", NodeServiceCapability_RPC_Type_name, NodeServiceCapability_RPC_Type_value) @@ -1657,6 +2162,7 @@ const _ = grpc.SupportPackageIsVersion4 type IdentityClient interface { GetSupportedVersions(ctx context.Context, in *GetSupportedVersionsRequest, opts ...grpc.CallOption) (*GetSupportedVersionsResponse, error) GetPluginInfo(ctx context.Context, in *GetPluginInfoRequest, opts ...grpc.CallOption) (*GetPluginInfoResponse, error) + GetPluginCapabilities(ctx context.Context, in *GetPluginCapabilitiesRequest, opts ...grpc.CallOption) (*GetPluginCapabilitiesResponse, error) } type identityClient struct { @@ -1685,11 +2191,21 @@ func (c *identityClient) GetPluginInfo(ctx context.Context, in *GetPluginInfoReq return out, nil } +func (c *identityClient) GetPluginCapabilities(ctx context.Context, in *GetPluginCapabilitiesRequest, opts ...grpc.CallOption) (*GetPluginCapabilitiesResponse, error) { + out := new(GetPluginCapabilitiesResponse) + err := grpc.Invoke(ctx, "/csi.Identity/GetPluginCapabilities", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // Server API for Identity service type IdentityServer interface { GetSupportedVersions(context.Context, *GetSupportedVersionsRequest) (*GetSupportedVersionsResponse, error) GetPluginInfo(context.Context, *GetPluginInfoRequest) (*GetPluginInfoResponse, error) + GetPluginCapabilities(context.Context, *GetPluginCapabilitiesRequest) (*GetPluginCapabilitiesResponse, error) } func RegisterIdentityServer(s *grpc.Server, srv IdentityServer) { @@ -1732,6 +2248,24 @@ func _Identity_GetPluginInfo_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _Identity_GetPluginCapabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetPluginCapabilitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IdentityServer).GetPluginCapabilities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/csi.Identity/GetPluginCapabilities", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IdentityServer).GetPluginCapabilities(ctx, req.(*GetPluginCapabilitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Identity_serviceDesc = grpc.ServiceDesc{ ServiceName: "csi.Identity", HandlerType: (*IdentityServer)(nil), @@ -1744,6 +2278,10 @@ var _Identity_serviceDesc = grpc.ServiceDesc{ MethodName: "GetPluginInfo", Handler: _Identity_GetPluginInfo_Handler, }, + { + MethodName: "GetPluginCapabilities", + Handler: _Identity_GetPluginCapabilities_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "csi.proto", @@ -2080,11 +2618,11 @@ 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) + NodeStageVolume(ctx context.Context, in *NodeStageVolumeRequest, opts ...grpc.CallOption) (*NodeStageVolumeResponse, error) + NodeUnstageVolume(ctx context.Context, in *NodeUnstageVolumeRequest, opts ...grpc.CallOption) (*NodeUnstageVolumeResponse, error) NodePublishVolume(ctx context.Context, in *NodePublishVolumeRequest, opts ...grpc.CallOption) (*NodePublishVolumeResponse, error) NodeUnpublishVolume(ctx context.Context, in *NodeUnpublishVolumeRequest, opts ...grpc.CallOption) (*NodeUnpublishVolumeResponse, error) - GetNodeID(ctx context.Context, in *GetNodeIDRequest, opts ...grpc.CallOption) (*GetNodeIDResponse, error) + NodeGetId(ctx context.Context, in *NodeGetIdRequest, opts ...grpc.CallOption) (*NodeGetIdResponse, error) NodeProbe(ctx context.Context, in *NodeProbeRequest, opts ...grpc.CallOption) (*NodeProbeResponse, error) NodeGetCapabilities(ctx context.Context, in *NodeGetCapabilitiesRequest, opts ...grpc.CallOption) (*NodeGetCapabilitiesResponse, error) } @@ -2097,18 +2635,18 @@ 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...) +func (c *nodeClient) NodeStageVolume(ctx context.Context, in *NodeStageVolumeRequest, opts ...grpc.CallOption) (*NodeStageVolumeResponse, error) { + out := new(NodeStageVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodeStageVolume", in, out, c.cc, opts...) if err != nil { return nil, err } return out, nil } -func (c *nodeClient) 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...) +func (c *nodeClient) NodeUnstageVolume(ctx context.Context, in *NodeUnstageVolumeRequest, opts ...grpc.CallOption) (*NodeUnstageVolumeResponse, error) { + out := new(NodeUnstageVolumeResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodeUnstageVolume", in, out, c.cc, opts...) if err != nil { return nil, err } @@ -2133,9 +2671,9 @@ func (c *nodeClient) NodeUnpublishVolume(ctx context.Context, in *NodeUnpublishV return out, nil } -func (c *nodeClient) GetNodeID(ctx context.Context, in *GetNodeIDRequest, opts ...grpc.CallOption) (*GetNodeIDResponse, error) { - out := new(GetNodeIDResponse) - err := grpc.Invoke(ctx, "/csi.Node/GetNodeID", in, out, c.cc, opts...) +func (c *nodeClient) NodeGetId(ctx context.Context, in *NodeGetIdRequest, opts ...grpc.CallOption) (*NodeGetIdResponse, error) { + out := new(NodeGetIdResponse) + err := grpc.Invoke(ctx, "/csi.Node/NodeGetId", in, out, c.cc, opts...) if err != nil { return nil, err } @@ -2163,11 +2701,11 @@ 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) + NodeStageVolume(context.Context, *NodeStageVolumeRequest) (*NodeStageVolumeResponse, error) + NodeUnstageVolume(context.Context, *NodeUnstageVolumeRequest) (*NodeUnstageVolumeResponse, error) NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error) NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error) - GetNodeID(context.Context, *GetNodeIDRequest) (*GetNodeIDResponse, error) + NodeGetId(context.Context, *NodeGetIdRequest) (*NodeGetIdResponse, error) NodeProbe(context.Context, *NodeProbeRequest) (*NodeProbeResponse, error) NodeGetCapabilities(context.Context, *NodeGetCapabilitiesRequest) (*NodeGetCapabilitiesResponse, error) } @@ -2176,38 +2714,38 @@ 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) +func _Node_NodeStageVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodeStageVolumeRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(NodeServer).NodePublishDevice(ctx, in) + return srv.(NodeServer).NodeStageVolume(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/csi.Node/NodePublishDevice", + FullMethod: "/csi.Node/NodeStageVolume", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NodeServer).NodePublishDevice(ctx, req.(*NodePublishDeviceRequest)) + return srv.(NodeServer).NodeStageVolume(ctx, req.(*NodeStageVolumeRequest)) } 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) +func _Node_NodeUnstageVolume_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodeUnstageVolumeRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(NodeServer).NodeUnpublishDevice(ctx, in) + return srv.(NodeServer).NodeUnstageVolume(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/csi.Node/NodeUnpublishDevice", + FullMethod: "/csi.Node/NodeUnstageVolume", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NodeServer).NodeUnpublishDevice(ctx, req.(*NodeUnpublishDeviceRequest)) + return srv.(NodeServer).NodeUnstageVolume(ctx, req.(*NodeUnstageVolumeRequest)) } return interceptor(ctx, in, info, handler) } @@ -2248,20 +2786,20 @@ func _Node_NodeUnpublishVolume_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Node_GetNodeID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNodeIDRequest) +func _Node_NodeGetId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NodeGetIdRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(NodeServer).GetNodeID(ctx, in) + return srv.(NodeServer).NodeGetId(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/csi.Node/GetNodeID", + FullMethod: "/csi.Node/NodeGetId", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NodeServer).GetNodeID(ctx, req.(*GetNodeIDRequest)) + return srv.(NodeServer).NodeGetId(ctx, req.(*NodeGetIdRequest)) } return interceptor(ctx, in, info, handler) } @@ -2307,12 +2845,12 @@ var _Node_serviceDesc = grpc.ServiceDesc{ HandlerType: (*NodeServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "NodePublishDevice", - Handler: _Node_NodePublishDevice_Handler, + MethodName: "NodeStageVolume", + Handler: _Node_NodeStageVolume_Handler, }, { - MethodName: "NodeUnpublishDevice", - Handler: _Node_NodeUnpublishDevice_Handler, + MethodName: "NodeUnstageVolume", + Handler: _Node_NodeUnstageVolume_Handler, }, { MethodName: "NodePublishVolume", @@ -2323,8 +2861,8 @@ var _Node_serviceDesc = grpc.ServiceDesc{ Handler: _Node_NodeUnpublishVolume_Handler, }, { - MethodName: "GetNodeID", - Handler: _Node_GetNodeID_Handler, + MethodName: "NodeGetId", + Handler: _Node_NodeGetId_Handler, }, { MethodName: "NodeProbe", @@ -2342,138 +2880,153 @@ var _Node_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("csi.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 2119 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0x4b, 0x6f, 0xdb, 0xd8, - 0xf5, 0x37, 0x25, 0xf9, 0xa1, 0x23, 0xcb, 0x91, 0xaf, 0x5f, 0x32, 0x1d, 0xc7, 0x0a, 0x33, 0xc9, - 0xf8, 0x0f, 0xcc, 0x08, 0xff, 0x7a, 0x0a, 0x34, 0x4e, 0x66, 0xa6, 0xb5, 0x25, 0x8e, 0xad, 0x8e, - 0xed, 0x18, 0xb4, 0xec, 0x74, 0xda, 0x0e, 0x58, 0x5a, 0xba, 0x76, 0xd8, 0x50, 0xa4, 0x42, 0x52, - 0x46, 0xbc, 0x9f, 0x65, 0x81, 0x2e, 0xbb, 0x6b, 0x97, 0x45, 0xd1, 0x65, 0xdb, 0x2f, 0xd0, 0x02, - 0xfd, 0x04, 0x9d, 0x7d, 0xb7, 0xfd, 0x06, 0x05, 0x8a, 0x02, 0xc5, 0x7d, 0x90, 0x22, 0xa9, 0x4b, - 0x59, 0xca, 0xd8, 0xd3, 0xee, 0xc4, 0x73, 0xce, 0x3d, 0xf7, 0xdc, 0xf3, 0xba, 0xbf, 0x43, 0x0a, - 0xf2, 0x2d, 0xcf, 0xac, 0x76, 0x5d, 0xc7, 0x77, 0x50, 0xb6, 0xe5, 0x99, 0xca, 0x3a, 0xac, 0xed, - 0x61, 0xff, 0xa4, 0xd7, 0xed, 0x3a, 0xae, 0x8f, 0xdb, 0x67, 0xd8, 0xf5, 0x4c, 0xc7, 0xf6, 0x34, - 0xfc, 0xa6, 0x87, 0x3d, 0x5f, 0xf9, 0x09, 0xdc, 0x17, 0xb3, 0xbd, 0xae, 0x63, 0x7b, 0x18, 0x3d, - 0x07, 0xe4, 0x05, 0x4c, 0xfd, 0x8a, 0x73, 0xcb, 0x52, 0x25, 0xbb, 0x59, 0xd8, 0x9a, 0xad, 0x92, - 0xbd, 0xf8, 0x12, 0x6d, 0xde, 0x4b, 0x2a, 0x51, 0x3e, 0x87, 0x69, 0xfe, 0x1b, 0x2d, 0xc2, 0x64, - 0xc7, 0xf8, 0xb9, 0xe3, 0x96, 0xa5, 0x8a, 0xb4, 0x59, 0xd4, 0xd8, 0x03, 0xa5, 0x9a, 0xb6, 0xe3, - 0x96, 0x33, 0x9c, 0x4a, 0x1e, 0x08, 0xb5, 0x6b, 0xf8, 0xad, 0x57, 0xe5, 0x2c, 0xa3, 0xd2, 0x07, - 0xe5, 0x53, 0x58, 0xdc, 0xc3, 0xfe, 0xb1, 0xd5, 0xbb, 0x34, 0xed, 0x86, 0x7d, 0xe1, 0xf0, 0x13, - 0xa0, 0x27, 0x30, 0xcd, 0xed, 0xa2, 0xba, 0x93, 0x66, 0x05, 0x4c, 0xe5, 0x6b, 0x09, 0x96, 0x12, - 0x0a, 0xf8, 0x19, 0x11, 0xe4, 0x6c, 0xa3, 0x83, 0xe9, 0xf2, 0xbc, 0x46, 0x7f, 0xa3, 0xc7, 0x30, - 0x77, 0x85, 0xed, 0xb6, 0xe3, 0x06, 0x87, 0xa6, 0x26, 0xe6, 0xb5, 0x22, 0xa3, 0x06, 0xc7, 0xaa, - 0xc3, 0x4c, 0xc7, 0xb0, 0xcd, 0x0b, 0xec, 0xf9, 0xe5, 0x2c, 0x75, 0xca, 0x26, 0xdd, 0x5d, 0xb8, - 0x51, 0xf5, 0x90, 0x8b, 0xaa, 0xb6, 0xef, 0x5e, 0x6b, 0xe1, 0x4a, 0xf9, 0x39, 0x14, 0x63, 0x2c, - 0x54, 0x82, 0xec, 0x6b, 0x7c, 0xcd, 0x0d, 0x22, 0x3f, 0x89, 0x4f, 0xae, 0x0c, 0xab, 0x87, 0xb9, - 0x19, 0xec, 0xe1, 0x59, 0xe6, 0xa9, 0xa4, 0xfc, 0x2b, 0x0b, 0x0b, 0x35, 0x17, 0x1b, 0x3e, 0x3e, - 0x73, 0xac, 0x5e, 0x07, 0x8f, 0xe9, 0x97, 0xf0, 0xf4, 0x99, 0xc8, 0xe9, 0xb7, 0x61, 0xae, 0x65, - 0x74, 0x8d, 0x96, 0xe9, 0x5f, 0xeb, 0xae, 0x61, 0x5f, 0x62, 0x1a, 0x8a, 0xc2, 0x16, 0xa2, 0x2a, - 0x6a, 0x9c, 0xa5, 0x11, 0x8e, 0x56, 0x6c, 0x45, 0x1f, 0xd1, 0x67, 0xb0, 0x70, 0x45, 0xed, 0xd0, - 0x09, 0xfd, 0xdc, 0xb4, 0x4c, 0xdf, 0xc4, 0x5e, 0x39, 0x47, 0x9d, 0xb3, 0xc4, 0x4c, 0xa0, 0xfc, - 0x5a, 0xc0, 0xbe, 0xd6, 0xd0, 0x55, 0x9c, 0x62, 0x62, 0x0f, 0xed, 0x03, 0x74, 0x0d, 0xd7, 0xe8, - 0x60, 0x1f, 0xbb, 0x5e, 0x79, 0x32, 0xe2, 0x5b, 0xc1, 0x61, 0xab, 0xc7, 0xa1, 0x28, 0xf3, 0x6d, - 0x64, 0x2d, 0xfa, 0x11, 0x94, 0x7a, 0x1e, 0x76, 0xf5, 0x96, 0x8b, 0xdb, 0xd8, 0xf6, 0x4d, 0xc3, - 0xf2, 0xca, 0x53, 0x54, 0xdf, 0x87, 0xa9, 0xfa, 0x4e, 0x3d, 0xec, 0xd6, 0xfa, 0xf2, 0x4c, 0xe9, - 0xbd, 0x5e, 0x9c, 0x2a, 0x7f, 0x02, 0xf7, 0x12, 0x1b, 0x8f, 0x13, 0x39, 0x79, 0x17, 0x16, 0x45, - 0xfb, 0x8c, 0x15, 0xfd, 0x7d, 0x58, 0x8c, 0xdb, 0xcf, 0x73, 0xfa, 0xff, 0xa1, 0xc0, 0xc3, 0x60, - 0xda, 0x17, 0x0e, 0xcf, 0x80, 0x7b, 0x11, 0xf7, 0xd3, 0xc4, 0x84, 0xab, 0xf0, 0xb7, 0xf2, 0xeb, - 0x1c, 0x94, 0x92, 0x91, 0x41, 0xdb, 0x30, 0x79, 0x6e, 0x39, 0xad, 0xd7, 0x5c, 0xc1, 0x43, 0x61, - 0xfc, 0xaa, 0xbb, 0x44, 0x84, 0x51, 0xf7, 0x27, 0x34, 0xb6, 0x82, 0x2c, 0xed, 0x38, 0x3d, 0xdb, - 0xa7, 0x36, 0xa7, 0x2e, 0x3d, 0x24, 0x22, 0xfd, 0xa5, 0x74, 0x05, 0xda, 0x81, 0x82, 0xd1, 0x6a, - 0x61, 0xcf, 0xd3, 0x3b, 0x4e, 0x3b, 0xc8, 0xbd, 0x8a, 0x58, 0xc1, 0x0e, 0x15, 0x3c, 0x74, 0xda, - 0x58, 0x03, 0x23, 0xfc, 0x2d, 0x17, 0xa1, 0x10, 0xb1, 0x4a, 0xde, 0x83, 0x42, 0x64, 0x27, 0xb4, - 0x02, 0xd3, 0x17, 0x9e, 0xee, 0x5f, 0x77, 0x83, 0xa2, 0x9f, 0xba, 0xf0, 0x9a, 0xd7, 0x5d, 0x8c, - 0x36, 0xa0, 0x40, 0x4d, 0xd0, 0x2f, 0x2c, 0xe3, 0xd2, 0x2b, 0x67, 0x2a, 0xd9, 0xcd, 0xbc, 0x06, - 0x94, 0xf4, 0x19, 0xa1, 0xc8, 0xff, 0x90, 0x00, 0xfa, 0x5b, 0xa2, 0x6d, 0xc8, 0x51, 0x13, 0x89, - 0x96, 0xb9, 0xad, 0xc7, 0x37, 0x99, 0x58, 0xa5, 0x76, 0xd2, 0x25, 0xca, 0x6f, 0x24, 0xc8, 0x51, - 0x1d, 0x05, 0x98, 0x3e, 0x3d, 0xfa, 0xfc, 0xe8, 0xc5, 0xcb, 0xa3, 0xd2, 0x04, 0x5a, 0x06, 0x74, - 0xd2, 0x38, 0xda, 0x3b, 0x50, 0xf5, 0xa3, 0x17, 0x75, 0x55, 0x7f, 0xa9, 0x35, 0x9a, 0xaa, 0x56, - 0x92, 0xd0, 0x1a, 0xac, 0x44, 0xe9, 0x9a, 0xba, 0x53, 0x57, 0x35, 0xfd, 0xc5, 0xd1, 0xc1, 0x17, - 0xa5, 0x0c, 0x92, 0x61, 0xf9, 0xf0, 0xf4, 0xa0, 0xd9, 0x18, 0xe4, 0x65, 0xd1, 0x7d, 0x28, 0x47, - 0x78, 0x5c, 0x07, 0x57, 0x9b, 0x23, 0x6a, 0x23, 0x5c, 0xf6, 0x93, 0x33, 0x27, 0x77, 0x8b, 0x61, - 0x18, 0x88, 0xa7, 0x94, 0x97, 0x50, 0x8c, 0x55, 0x3e, 0xe9, 0x91, 0x2e, 0x7e, 0xd3, 0x33, 0x5d, - 0xdc, 0xd6, 0xcf, 0xaf, 0x7d, 0xec, 0x51, 0x37, 0xe4, 0xb4, 0x62, 0x40, 0xdd, 0x25, 0x44, 0xe2, - 0x53, 0xcb, 0xec, 0x98, 0x3e, 0x97, 0xc9, 0x50, 0x19, 0xa0, 0x24, 0x2a, 0xa0, 0xfc, 0x45, 0x02, - 0xe8, 0x27, 0x25, 0x51, 0x1b, 0x36, 0x9f, 0x98, 0xda, 0x80, 0xca, 0xd4, 0xce, 0x41, 0xc6, 0x6c, - 0xf3, 0x82, 0xc8, 0x98, 0x6d, 0xf4, 0x7d, 0x00, 0xc3, 0xf7, 0x5d, 0xf3, 0xbc, 0x47, 0x96, 0xb0, - 0x66, 0xbc, 0x91, 0x48, 0xf8, 0xea, 0x4e, 0x28, 0xc1, 0xfb, 0x44, 0x7f, 0x09, 0xa9, 0xe6, 0x04, - 0x7b, 0xac, 0x4a, 0xfc, 0xa7, 0x04, 0x0b, 0x75, 0x6c, 0xe1, 0x77, 0xed, 0xc3, 0x6b, 0x90, 0x0f, - 0x2a, 0x36, 0x38, 0xd6, 0x0c, 0x2f, 0xcf, 0xb6, 0xb0, 0x87, 0x65, 0x23, 0x3d, 0x4c, 0xb0, 0xf1, - 0x88, 0x3d, 0xec, 0x36, 0x9a, 0xd0, 0x32, 0x2c, 0xc6, 0x0d, 0x60, 0x4d, 0x48, 0xf9, 0x63, 0x0e, - 0x1e, 0xd4, 0x1c, 0xdb, 0x77, 0x1d, 0xcb, 0xc2, 0xee, 0x71, 0xef, 0xdc, 0x32, 0xbd, 0x57, 0x77, - 0xe0, 0x9d, 0x15, 0x98, 0xb6, 0x9d, 0x36, 0x65, 0x65, 0x59, 0x39, 0x93, 0xc7, 0x46, 0x1b, 0xed, - 0xc2, 0x7c, 0xf2, 0x32, 0xba, 0x2e, 0xe7, 0xe8, 0x3e, 0x29, 0x57, 0x51, 0xe9, 0x2a, 0xd9, 0x02, - 0x65, 0x98, 0x71, 0xb1, 0xd1, 0x76, 0x6c, 0xeb, 0xba, 0x3c, 0x59, 0x91, 0x36, 0x67, 0xb4, 0xf0, - 0x19, 0xb5, 0x52, 0xaf, 0x96, 0xa7, 0xec, 0x6a, 0x19, 0x7a, 0xf8, 0xd1, 0x22, 0x84, 0x2e, 0xc2, - 0x43, 0x44, 0xf2, 0x7b, 0x9a, 0xee, 0xb2, 0x3d, 0xca, 0x2e, 0xec, 0x29, 0x99, 0xf9, 0xfc, 0xa0, - 0x7d, 0xf2, 0x6d, 0x64, 0x82, 0x5c, 0x83, 0x25, 0xe1, 0x76, 0x63, 0xa5, 0xd3, 0xdf, 0x24, 0xd8, - 0x48, 0x3d, 0x13, 0xbf, 0xdf, 0x5e, 0xc3, 0x42, 0x97, 0x31, 0xf4, 0xf8, 0x3d, 0x47, 0xdc, 0xf2, - 0x7c, 0xb8, 0x5b, 0x38, 0x1a, 0x8b, 0x51, 0x49, 0x77, 0x60, 0x8e, 0x99, 0xef, 0x26, 0xe9, 0x72, - 0x1d, 0x96, 0xc5, 0xc2, 0x63, 0x1d, 0xeb, 0xf7, 0x19, 0xa8, 0xf4, 0x6d, 0x3a, 0xb5, 0xbb, 0xdf, - 0x7e, 0x3d, 0x60, 0x41, 0xbe, 0x32, 0x64, 0xf6, 0x2c, 0xe1, 0x32, 0xb1, 0x79, 0xdf, 0x62, 0x4f, - 0x79, 0x04, 0x0f, 0x87, 0x58, 0xc3, 0x1b, 0xcc, 0xdf, 0x33, 0xf0, 0xf0, 0xcc, 0xb0, 0xcc, 0x76, - 0x08, 0x80, 0xa2, 0x18, 0xf2, 0x56, 0x7d, 0x9a, 0x82, 0x6b, 0xb3, 0xe3, 0xe2, 0x5a, 0x53, 0x54, - 0xcd, 0x2c, 0x06, 0x1f, 0x33, 0x2d, 0x37, 0x9d, 0x67, 0xe4, 0x82, 0xbe, 0x95, 0x62, 0xfc, 0x29, - 0x28, 0xc3, 0x2c, 0xe2, 0xe5, 0x78, 0x1f, 0xf2, 0xe1, 0xf8, 0x47, 0xf5, 0xce, 0x68, 0x7d, 0x02, - 0x2a, 0xc3, 0x74, 0x07, 0x7b, 0x9e, 0x71, 0x19, 0xe8, 0x0f, 0x1e, 0x95, 0xaf, 0x24, 0x40, 0x07, - 0xa6, 0xc7, 0x71, 0xd9, 0xd8, 0x11, 0x23, 0x70, 0xcd, 0x78, 0xab, 0x63, 0xdb, 0x77, 0x4d, 0x0e, - 0x2d, 0x8a, 0x1a, 0x74, 0x8c, 0xb7, 0x2a, 0xa3, 0x10, 0x2c, 0xe1, 0xf9, 0x86, 0xeb, 0x9b, 0xf6, - 0xa5, 0xee, 0x3b, 0xaf, 0xb1, 0xcd, 0x0b, 0xa2, 0x18, 0x50, 0x9b, 0x84, 0xa8, 0xfc, 0x4e, 0x82, - 0x85, 0x98, 0x19, 0xfc, 0x58, 0x4f, 0x61, 0x3a, 0xd0, 0xcd, 0x3a, 0xcb, 0x03, 0x6a, 0x87, 0x40, - 0xb4, 0xca, 0x82, 0x10, 0x88, 0xa3, 0x75, 0x00, 0x1b, 0xbf, 0xf5, 0xf9, 0xa6, 0xec, 0xd4, 0x79, - 0x42, 0xa1, 0x1b, 0xca, 0xdb, 0x30, 0xc9, 0x42, 0x31, 0x3e, 0x4e, 0xff, 0x45, 0x06, 0xd0, 0x1e, - 0xf6, 0x43, 0x28, 0x36, 0xa6, 0xcb, 0x52, 0xf2, 0x38, 0x33, 0x6e, 0x1e, 0xef, 0xc5, 0xe6, 0x33, - 0x56, 0x06, 0xef, 0x07, 0xb3, 0x6f, 0xc2, 0xb8, 0x61, 0xe3, 0xd9, 0x37, 0x1c, 0xa2, 0x94, 0x3a, - 0x2c, 0xc4, 0x36, 0xe4, 0x91, 0xfb, 0x10, 0x90, 0x71, 0x65, 0x98, 0x96, 0x71, 0x6e, 0xb1, 0x93, - 0x12, 0x2e, 0x07, 0x92, 0xf3, 0x21, 0x27, 0x58, 0xa6, 0xfc, 0x00, 0x96, 0x23, 0xd7, 0x85, 0xeb, - 0x9c, 0x8f, 0xdb, 0x90, 0x95, 0x55, 0x58, 0x19, 0xd0, 0xc0, 0xbb, 0xd4, 0x0f, 0xa3, 0x7d, 0x9f, - 0x1b, 0xfb, 0x8e, 0x3d, 0x4a, 0x31, 0xa3, 0x6d, 0x71, 0x40, 0x17, 0x3f, 0x7c, 0x1d, 0x66, 0x05, - 0xc1, 0xad, 0x24, 0x5a, 0xfc, 0x09, 0x76, 0xaf, 0xcc, 0x56, 0x34, 0xce, 0xb1, 0x55, 0xca, 0xaf, - 0x32, 0xb0, 0x36, 0x44, 0x1a, 0x3d, 0x85, 0xac, 0xdb, 0x6d, 0x71, 0x73, 0xdf, 0xbb, 0x49, 0x79, - 0x55, 0x3b, 0xae, 0xed, 0x4f, 0x68, 0x64, 0x89, 0xfc, 0x27, 0x09, 0xb2, 0xda, 0x71, 0x0d, 0x7d, - 0x02, 0xb9, 0x70, 0x06, 0x9b, 0xdb, 0xfa, 0xbf, 0x51, 0x54, 0x54, 0xc9, 0x98, 0xa6, 0xd1, 0x65, - 0x8a, 0x03, 0x39, 0x3a, 0xb4, 0xc5, 0x06, 0xa8, 0x32, 0x2c, 0xd6, 0x34, 0x75, 0xa7, 0xa9, 0xea, - 0x75, 0xf5, 0x40, 0x6d, 0xaa, 0xfa, 0xd9, 0x8b, 0x83, 0xd3, 0x43, 0xb5, 0x24, 0x91, 0x49, 0xe8, - 0xf8, 0x74, 0xf7, 0xa0, 0x71, 0xb2, 0xaf, 0x9f, 0x1e, 0x05, 0xbf, 0x38, 0x37, 0x83, 0x4a, 0x30, - 0x7b, 0xd0, 0x38, 0x69, 0x72, 0xc2, 0x49, 0x29, 0x4b, 0x28, 0x7b, 0x6a, 0x53, 0xaf, 0xed, 0x1c, - 0xef, 0xd4, 0x1a, 0xcd, 0x2f, 0x4a, 0xb9, 0xdd, 0x29, 0x66, 0xaf, 0xf2, 0xef, 0x0c, 0x94, 0x8f, - 0x9c, 0x36, 0xe6, 0xa0, 0xa0, 0x8e, 0x89, 0x9d, 0xb7, 0x7a, 0xdb, 0xb4, 0xc5, 0xf0, 0x86, 0x95, - 0xd9, 0x77, 0xa9, 0xc2, 0x34, 0x03, 0x46, 0xc7, 0x35, 0xe8, 0x03, 0x40, 0x97, 0x96, 0x73, 0x6e, - 0x58, 0xba, 0x6f, 0xb8, 0x97, 0xd8, 0xd7, 0xbb, 0x86, 0xff, 0x8a, 0xe2, 0xe3, 0xbc, 0x56, 0x62, - 0x9c, 0x26, 0x65, 0x1c, 0x1b, 0xfe, 0x2b, 0x31, 0x98, 0x9e, 0x1c, 0x0b, 0x4c, 0xdf, 0x12, 0x92, - 0x5a, 0x83, 0x55, 0xc1, 0xe9, 0x79, 0xb5, 0xfd, 0x52, 0x02, 0x99, 0x70, 0x43, 0xcc, 0x70, 0x07, - 0xe1, 0x11, 0x3b, 0x2e, 0x2b, 0x76, 0x9c, 0xb2, 0x0e, 0x6b, 0x42, 0x83, 0xb8, 0xc1, 0x5f, 0x4d, - 0xc5, 0xb2, 0xe9, 0x0e, 0xf0, 0xe0, 0x78, 0xd9, 0x94, 0x78, 0xb3, 0x76, 0x47, 0xd9, 0xb4, 0x01, - 0x85, 0xa8, 0xd8, 0x24, 0x15, 0x03, 0xff, 0x86, 0x74, 0x9b, 0x7a, 0xf7, 0xd9, 0x6d, 0x3a, 0x31, - 0xbb, 0x7d, 0x29, 0xc0, 0xc2, 0x33, 0xd4, 0x23, 0x5b, 0xc3, 0x3d, 0x32, 0xda, 0xd4, 0xf6, 0x33, - 0x11, 0xce, 0xcb, 0x53, 0xfd, 0x1f, 0x0d, 0xd7, 0x3f, 0x2a, 0xbc, 0xbb, 0x95, 0x5a, 0xfa, 0xdf, - 0x99, 0xfa, 0xe2, 0x45, 0x9d, 0x00, 0xfa, 0x5f, 0x67, 0x12, 0x45, 0x7d, 0x07, 0x55, 0x32, 0x56, - 0x51, 0x27, 0xf3, 0x37, 0x37, 0x90, 0xbf, 0xba, 0x20, 0xbf, 0x26, 0x13, 0x15, 0xf7, 0x5f, 0x9f, - 0xb2, 0x92, 0xad, 0x29, 0xe1, 0xf6, 0x67, 0x50, 0xda, 0xc3, 0x3e, 0x91, 0x68, 0xd4, 0xc7, 0x45, - 0x2a, 0x1f, 0xc0, 0x7c, 0x64, 0x2d, 0x47, 0x26, 0x91, 0xc9, 0x54, 0x8a, 0x4e, 0xa6, 0x64, 0x27, - 0x1a, 0xfd, 0x77, 0x81, 0x5e, 0x0b, 0x30, 0x1f, 0x59, 0xcb, 0x4d, 0xaf, 0xb3, 0x84, 0xf9, 0x86, - 0x70, 0xeb, 0x4b, 0xe6, 0x9f, 0x34, 0xa0, 0xf5, 0x69, 0x02, 0x68, 0xb1, 0x21, 0x41, 0x0e, 0xe3, - 0x7b, 0x13, 0xc4, 0xfa, 0xab, 0x04, 0x4b, 0x42, 0x39, 0xb4, 0x15, 0x05, 0x57, 0x0f, 0xd2, 0x15, - 0x46, 0x61, 0xd5, 0x1b, 0x86, 0xaa, 0xbe, 0x17, 0x43, 0x55, 0x8f, 0x86, 0xaf, 0x8d, 0xe2, 0xa9, - 0xef, 0x88, 0xf0, 0x94, 0x10, 0x35, 0xd5, 0xd5, 0xb3, 0x46, 0x4d, 0x2d, 0x49, 0x01, 0x22, 0xda, - 0xfa, 0x83, 0x04, 0x33, 0x0d, 0x9a, 0x86, 0x3e, 0xe9, 0xac, 0x8b, 0xa2, 0x6f, 0x8a, 0xa8, 0x12, - 0x8c, 0x07, 0x69, 0x5f, 0x23, 0xe5, 0x87, 0x43, 0x24, 0x78, 0x5c, 0x27, 0xd0, 0x3e, 0x14, 0x63, - 0x9f, 0xd7, 0xd0, 0xaa, 0xe8, 0x93, 0x1b, 0x53, 0x28, 0xa7, 0x7f, 0x8d, 0x53, 0x26, 0xb6, 0x7e, - 0x3b, 0x05, 0xd0, 0xc7, 0x9b, 0x48, 0x85, 0xd9, 0xe8, 0xb7, 0x14, 0x54, 0x4e, 0xfb, 0x3c, 0x24, - 0xaf, 0x0a, 0x38, 0xa1, 0x7d, 0x2a, 0xcc, 0x46, 0xdf, 0x86, 0x72, 0x35, 0x82, 0x37, 0xb4, 0x5c, - 0x8d, 0xf0, 0xd5, 0xe9, 0x04, 0xba, 0x88, 0x0d, 0x14, 0xd1, 0xf2, 0x44, 0x8f, 0x46, 0x78, 0xed, - 0x27, 0xbf, 0x37, 0xca, 0x4b, 0x30, 0x65, 0x02, 0x59, 0xb0, 0x9a, 0xfa, 0xa2, 0x05, 0x3d, 0x1e, - 0xe9, 0xb5, 0x90, 0xfc, 0xe4, 0x26, 0xb1, 0x70, 0x37, 0x07, 0xe4, 0xf4, 0xd7, 0x09, 0xe8, 0xc9, - 0x68, 0x6f, 0x40, 0xe4, 0xf7, 0x6f, 0x94, 0x0b, 0x37, 0xdc, 0x85, 0x42, 0x64, 0x5c, 0x47, 0x2b, - 0x83, 0x03, 0x3c, 0x53, 0x59, 0x4e, 0x9b, 0xec, 0x99, 0x8e, 0xc8, 0x8c, 0xc9, 0x75, 0x0c, 0x8e, - 0xb9, 0x5c, 0x87, 0x60, 0x1c, 0x55, 0x26, 0xd0, 0x11, 0xdc, 0x4b, 0xcc, 0x87, 0x68, 0x2d, 0x19, - 0xa1, 0x48, 0xf3, 0x93, 0xef, 0x8b, 0x99, 0xe2, 0xb0, 0x25, 0xfa, 0xd3, 0x40, 0xd8, 0xc4, 0x5d, - 0x70, 0x20, 0x6c, 0x29, 0x6d, 0x4e, 0x99, 0xd8, 0xfa, 0x73, 0x0e, 0x72, 0xa4, 0x87, 0xa0, 0x26, - 0xef, 0xb5, 0x51, 0x24, 0x8b, 0xd6, 0x87, 0x0e, 0x24, 0xf2, 0x83, 0x34, 0x76, 0x78, 0x98, 0x1f, - 0xc3, 0x82, 0x00, 0x21, 0xa3, 0x8d, 0xc1, 0x8b, 0x32, 0xae, 0xb9, 0x92, 0x2e, 0x10, 0xea, 0x8e, - 0x5b, 0xcc, 0xf3, 0x7a, 0x7d, 0x28, 0x04, 0x1b, 0xb4, 0x78, 0x20, 0x8f, 0x93, 0x16, 0x73, 0xbd, - 0x1b, 0x37, 0x5c, 0xed, 0x22, 0x8b, 0x07, 0x74, 0x7f, 0x0c, 0xf9, 0xf0, 0xe6, 0x44, 0x4b, 0x41, - 0x4e, 0xc5, 0x6e, 0x61, 0x79, 0x39, 0x49, 0x8e, 0xae, 0x0e, 0x6f, 0x43, 0xbe, 0x3a, 0x79, 0xb3, - 0xf2, 0xd5, 0x83, 0x97, 0x66, 0x78, 0xae, 0x64, 0x42, 0xf5, 0xcf, 0x95, 0x92, 0x4a, 0x95, 0x74, - 0x81, 0x40, 0xf7, 0xf9, 0x14, 0xfd, 0x5b, 0xca, 0x47, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xd4, - 0xba, 0x91, 0xf2, 0xa3, 0x22, 0x00, 0x00, + // 2367 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3a, 0xcd, 0x6f, 0xdb, 0xc8, + 0xf5, 0xa2, 0x3e, 0x2c, 0xfb, 0xc9, 0xce, 0x2a, 0x63, 0xc7, 0x96, 0xe9, 0x38, 0x71, 0x98, 0x4d, + 0x36, 0x3f, 0xfc, 0xb2, 0x02, 0xea, 0xc5, 0xb6, 0xf1, 0x66, 0x13, 0xd4, 0x96, 0x19, 0x5b, 0x8d, + 0x22, 0x7b, 0x69, 0x39, 0xe9, 0x6e, 0xbb, 0xe5, 0xd2, 0xd2, 0xd8, 0x61, 0x23, 0x91, 0x5a, 0x92, + 0x32, 0x22, 0x14, 0xbd, 0xf5, 0xd4, 0x8f, 0x53, 0x51, 0xf4, 0x52, 0xb4, 0xc7, 0xa2, 0x40, 0xaf, + 0xed, 0x65, 0xd1, 0x4b, 0xcf, 0x05, 0x7a, 0xea, 0xbd, 0xd7, 0xed, 0x5f, 0x51, 0x70, 0x66, 0x48, + 0x0d, 0xa9, 0x21, 0x65, 0x25, 0x9b, 0xa0, 0x27, 0x91, 0xef, 0x7b, 0xde, 0xbc, 0x79, 0xf3, 0xde, + 0xa3, 0x60, 0xae, 0xed, 0x9a, 0xd5, 0xbe, 0x63, 0x7b, 0x36, 0xca, 0xb5, 0x5d, 0x53, 0x59, 0x87, + 0xb5, 0x3d, 0xec, 0x1d, 0x0d, 0xfa, 0x7d, 0xdb, 0xf1, 0x70, 0xe7, 0x29, 0x76, 0x5c, 0xd3, 0xb6, + 0x5c, 0x0d, 0x7f, 0x39, 0xc0, 0xae, 0xa7, 0xfc, 0x00, 0xae, 0x8a, 0xd1, 0x6e, 0xdf, 0xb6, 0x5c, + 0x8c, 0xee, 0x03, 0x72, 0x03, 0xa4, 0x7e, 0xce, 0xb0, 0x15, 0x69, 0x23, 0x77, 0xa7, 0xb4, 0x39, + 0x5f, 0xf5, 0x75, 0x31, 0x16, 0xed, 0xb2, 0x1b, 0x17, 0xa2, 0x3c, 0x86, 0x22, 0x7b, 0x46, 0x4b, + 0x50, 0xe8, 0x19, 0x3f, 0xb6, 0x9d, 0x8a, 0xb4, 0x21, 0xdd, 0x29, 0x68, 0xf4, 0x85, 0x40, 0x4d, + 0xcb, 0x76, 0x2a, 0x59, 0x06, 0xf5, 0x5f, 0x7c, 0x68, 0xdf, 0xf0, 0xda, 0xcf, 0x2b, 0x39, 0x0a, + 0x25, 0x2f, 0xca, 0x43, 0x58, 0xda, 0xc3, 0xde, 0x61, 0x77, 0x70, 0x66, 0x5a, 0x75, 0xeb, 0xd4, + 0x66, 0x2b, 0x40, 0xb7, 0xa1, 0xc8, 0xec, 0x22, 0xb2, 0xe3, 0x66, 0x05, 0x48, 0xe5, 0x5f, 0x12, + 0x5c, 0x89, 0x09, 0x60, 0x6b, 0x44, 0x90, 0xb7, 0x8c, 0x1e, 0x26, 0xec, 0x73, 0x1a, 0x79, 0x46, + 0xb7, 0xe0, 0xd2, 0x39, 0xb6, 0x3a, 0xb6, 0x13, 0x2c, 0x9a, 0x98, 0x38, 0xa7, 0x2d, 0x50, 0x68, + 0xb0, 0xac, 0x5d, 0x98, 0xed, 0x19, 0x96, 0x79, 0x8a, 0x5d, 0xaf, 0x92, 0x23, 0x4e, 0xb9, 0x43, + 0xb4, 0x0b, 0x15, 0x55, 0x9f, 0x30, 0x52, 0xd5, 0xf2, 0x9c, 0xa1, 0x16, 0x72, 0xca, 0xf7, 0x61, + 0x21, 0x82, 0x42, 0x65, 0xc8, 0xbd, 0xc0, 0x43, 0x66, 0x90, 0xff, 0xe8, 0xfb, 0xe4, 0xdc, 0xe8, + 0x0e, 0x30, 0x33, 0x83, 0xbe, 0x7c, 0x94, 0xbd, 0x27, 0x29, 0x8f, 0xc8, 0x0e, 0x52, 0x6d, 0x35, + 0xa3, 0x6f, 0x9c, 0x98, 0x5d, 0xd3, 0x33, 0xb1, 0x3b, 0xad, 0x7f, 0x3e, 0x83, 0xf5, 0x04, 0x39, + 0xcc, 0x4d, 0x5b, 0x30, 0xdf, 0xe6, 0xe0, 0x95, 0x2c, 0x59, 0xef, 0x15, 0x22, 0x2d, 0xc6, 0x36, + 0xd4, 0x22, 0xa4, 0xca, 0xaf, 0x24, 0x28, 0xc7, 0x49, 0xd0, 0x16, 0x14, 0x5d, 0xec, 0x9c, 0x9b, + 0x6d, 0xcc, 0x0c, 0x5b, 0x17, 0x8a, 0xaa, 0x1e, 0x51, 0xa2, 0xfd, 0x8c, 0x16, 0xd0, 0xcb, 0xdf, + 0x86, 0x22, 0x83, 0x2a, 0xff, 0x0f, 0xf9, 0xd6, 0xb0, 0x8f, 0x51, 0x09, 0x8a, 0xc7, 0xcd, 0xc7, + 0xcd, 0x83, 0x67, 0xcd, 0x72, 0x06, 0x2d, 0x03, 0xaa, 0x1d, 0x34, 0x5b, 0xda, 0x41, 0xa3, 0xa1, + 0x6a, 0xfa, 0x91, 0xaa, 0x3d, 0xad, 0xd7, 0xd4, 0xb2, 0xb4, 0x33, 0x03, 0x79, 0x6f, 0xd8, 0xc7, + 0xca, 0x9f, 0xf3, 0xb0, 0x58, 0x73, 0xb0, 0xe1, 0xe1, 0xa7, 0x76, 0x77, 0xd0, 0xc3, 0x53, 0xfa, + 0x2a, 0x8c, 0x98, 0x2c, 0x17, 0x31, 0x5b, 0x70, 0xc9, 0x5f, 0x73, 0xdb, 0xf4, 0x86, 0xba, 0x63, + 0x58, 0x67, 0x98, 0x84, 0x6f, 0x69, 0x13, 0x11, 0x11, 0x35, 0x86, 0xd2, 0x7c, 0x8c, 0xb6, 0xd0, + 0xe6, 0x5f, 0xd1, 0x23, 0x58, 0x3c, 0x27, 0x76, 0xe8, 0x11, 0x07, 0xe7, 0x39, 0x07, 0x53, 0x3b, + 0x39, 0x07, 0xa3, 0xf3, 0x28, 0xc4, 0xc4, 0x2e, 0xda, 0x07, 0xe8, 0x1b, 0x8e, 0xd1, 0xc3, 0x1e, + 0x76, 0xdc, 0x4a, 0x81, 0x8b, 0x47, 0xc1, 0x62, 0xab, 0x87, 0x21, 0x29, 0x8d, 0x47, 0x8e, 0x17, + 0xfd, 0x14, 0xd6, 0xdb, 0xb6, 0xe5, 0x39, 0x76, 0xb7, 0x8b, 0x1d, 0xbd, 0x4d, 0xb8, 0xfd, 0x9f, + 0x0e, 0xb6, 0x3c, 0xd3, 0xe8, 0xba, 0x95, 0x19, 0x22, 0x7c, 0x2b, 0x51, 0x78, 0x2d, 0xe4, 0xa6, + 0xd8, 0xda, 0x88, 0x97, 0x6a, 0x5b, 0x6b, 0x27, 0x53, 0xc8, 0x0f, 0xe0, 0x9d, 0x98, 0x75, 0xd3, + 0x1c, 0x09, 0xb9, 0x09, 0x1b, 0x93, 0xf4, 0x4f, 0x75, 0xc4, 0xee, 0xc3, 0x52, 0x74, 0x8d, 0xec, + 0x44, 0xdc, 0x84, 0x19, 0xba, 0x0b, 0x2c, 0x5a, 0x4a, 0xdc, 0x56, 0x69, 0x0c, 0xa5, 0xfc, 0x3e, + 0x0f, 0xe5, 0xf8, 0xee, 0xa1, 0x2d, 0x28, 0x9c, 0x74, 0xed, 0xf6, 0x0b, 0xc6, 0x78, 0x43, 0xb8, + 0xc7, 0xd5, 0x1d, 0x9f, 0x84, 0x42, 0xf7, 0x33, 0x1a, 0xe5, 0xf0, 0x59, 0x7b, 0xf6, 0xc0, 0xf2, + 0x88, 0x99, 0x89, 0xac, 0x4f, 0x7c, 0x92, 0x11, 0x2b, 0xe1, 0x40, 0xdb, 0x50, 0x32, 0xda, 0x6d, + 0xec, 0xba, 0x7a, 0xcf, 0xee, 0x04, 0xf1, 0xb9, 0x21, 0x16, 0xb0, 0x4d, 0x08, 0x9f, 0xd8, 0x1d, + 0xac, 0x81, 0x11, 0x3e, 0xcb, 0x0b, 0x50, 0xe2, 0xac, 0x92, 0xf7, 0xa0, 0xc4, 0x69, 0x42, 0x2b, + 0x50, 0x3c, 0x75, 0x75, 0xff, 0x88, 0x31, 0xc7, 0xce, 0x9c, 0xba, 0xe4, 0x74, 0x5e, 0x87, 0x12, + 0x31, 0x41, 0x3f, 0xed, 0x1a, 0x67, 0x34, 0x75, 0xcc, 0x69, 0x40, 0x40, 0x8f, 0x7c, 0x88, 0xfc, + 0xb5, 0x04, 0x30, 0x52, 0x89, 0xb6, 0x20, 0x4f, 0x4c, 0xf4, 0xa5, 0x5c, 0xda, 0xbc, 0x35, 0xc9, + 0xc4, 0x2a, 0xb1, 0x93, 0xb0, 0x28, 0x7f, 0x90, 0x20, 0x4f, 0x64, 0xc4, 0x33, 0xc2, 0x51, 0xbd, + 0xb9, 0xd7, 0x50, 0xf5, 0xe6, 0xc1, 0xae, 0xaa, 0x3f, 0xd3, 0xea, 0x2d, 0x55, 0x2b, 0x4b, 0x68, + 0x0d, 0x56, 0x78, 0xb8, 0xa6, 0x6e, 0xef, 0xaa, 0x9a, 0x7e, 0xd0, 0x6c, 0x7c, 0x5a, 0xce, 0x22, + 0x19, 0x96, 0x9f, 0x1c, 0x37, 0x5a, 0xf5, 0x71, 0x5c, 0x0e, 0x5d, 0x85, 0x0a, 0x87, 0x63, 0x32, + 0x98, 0xd8, 0xbc, 0x2f, 0x96, 0xc3, 0xd2, 0x47, 0x86, 0x2c, 0xec, 0x2c, 0x84, 0xdb, 0x40, 0x92, + 0xd1, 0x33, 0x58, 0x88, 0x64, 0x07, 0xff, 0xee, 0x71, 0xf0, 0x97, 0x03, 0xd3, 0xc1, 0x1d, 0xfd, + 0x64, 0xe8, 0x61, 0x97, 0xb8, 0x21, 0xa7, 0x2d, 0x04, 0xd0, 0x1d, 0x1f, 0xe8, 0xfb, 0xb4, 0x6b, + 0xf6, 0x4c, 0x8f, 0xd1, 0x64, 0x09, 0x0d, 0x10, 0x10, 0x21, 0x50, 0xbe, 0x92, 0x60, 0x86, 0x6d, + 0xcc, 0x2d, 0x2e, 0x39, 0x45, 0x44, 0x06, 0x50, 0x2a, 0xf2, 0x12, 0x64, 0xcd, 0x0e, 0x8b, 0xff, + 0xac, 0xd9, 0x41, 0xf7, 0x01, 0x0c, 0xcf, 0x73, 0xcc, 0x93, 0x81, 0xcf, 0x42, 0x2f, 0xb8, 0x35, + 0x6e, 0x33, 0xaa, 0xdb, 0x21, 0x96, 0xe5, 0x90, 0x11, 0xb9, 0x7f, 0x88, 0x63, 0xe8, 0xa9, 0x0e, + 0xdd, 0x9f, 0xb2, 0xb0, 0xb8, 0x8b, 0xbb, 0xf8, 0x55, 0x73, 0xf4, 0x1a, 0xcc, 0xb1, 0xa4, 0x1a, + 0x2e, 0x69, 0x96, 0x02, 0xea, 0x9d, 0x58, 0x7e, 0xeb, 0x10, 0x35, 0x91, 0xfc, 0x96, 0xe3, 0xf2, + 0x9b, 0xc0, 0x0a, 0x2e, 0xbf, 0x51, 0x6c, 0x5a, 0x7e, 0x1b, 0xa3, 0x88, 0x26, 0x28, 0xb1, 0x80, + 0xa9, 0x7c, 0xb5, 0x0c, 0x4b, 0x51, 0x23, 0x69, 0x82, 0x52, 0xfe, 0x93, 0x87, 0x6b, 0x23, 0x45, + 0x87, 0x83, 0x93, 0xae, 0xe9, 0x3e, 0x7f, 0x03, 0xee, 0x5c, 0x81, 0xa2, 0x65, 0x77, 0x08, 0x2a, + 0x47, 0xcf, 0xbd, 0xff, 0x5a, 0xef, 0xa0, 0x1d, 0xb8, 0x1c, 0xbf, 0xd9, 0x86, 0x95, 0x3c, 0xd1, + 0x93, 0x70, 0xaf, 0x95, 0xcf, 0xe3, 0xb9, 0x52, 0x86, 0x59, 0x07, 0x1b, 0x1d, 0xdb, 0xea, 0x0e, + 0x2b, 0x85, 0x0d, 0xe9, 0xce, 0xac, 0x16, 0xbe, 0xa3, 0x5f, 0x48, 0x70, 0x8d, 0xdb, 0xc8, 0x3e, + 0x5d, 0xa1, 0xe0, 0xa6, 0x52, 0xe9, 0x4d, 0x95, 0xea, 0x8b, 0x71, 0xf4, 0xd8, 0xae, 0x5e, 0x6d, + 0xa7, 0x90, 0xa0, 0xd3, 0x70, 0xb5, 0xdc, 0xa9, 0x29, 0xf2, 0x37, 0x65, 0xba, 0x7e, 0xfa, 0x16, + 0x3f, 0x53, 0xcc, 0x23, 0x23, 0xb0, 0x7c, 0x00, 0x37, 0x26, 0x9a, 0x3a, 0xd5, 0x85, 0x59, 0x83, + 0x2b, 0x42, 0xdd, 0x53, 0x05, 0xe1, 0x57, 0x12, 0x5c, 0x4f, 0x5c, 0x20, 0xbb, 0x31, 0xbf, 0x0f, + 0xf3, 0xc1, 0x1e, 0x99, 0xd6, 0xa9, 0xcd, 0x1a, 0x89, 0x0f, 0xd3, 0x9d, 0xc3, 0xaa, 0x67, 0x06, + 0xf5, 0x2b, 0x6a, 0xea, 0x98, 0x52, 0x7f, 0x04, 0x91, 0x1f, 0x42, 0x39, 0x4e, 0x30, 0x95, 0xf5, + 0x5f, 0x67, 0xf9, 0x33, 0x79, 0x6c, 0xf5, 0xdf, 0xfe, 0x61, 0xf9, 0xb5, 0x04, 0x1b, 0x5c, 0x30, + 0x0f, 0x2c, 0x51, 0x38, 0xd3, 0xa2, 0xb0, 0x1e, 0xf3, 0x98, 0xd8, 0x5e, 0x11, 0xc1, 0x58, 0x48, + 0x73, 0xe7, 0x47, 0x44, 0x24, 0x7f, 0x02, 0x37, 0x2f, 0x20, 0x66, 0x2a, 0x5f, 0xdf, 0xe4, 0xe3, + 0x77, 0xcc, 0x74, 0x96, 0xbb, 0xfe, 0x9d, 0x85, 0x1b, 0x4f, 0x8d, 0xae, 0xd9, 0x09, 0xeb, 0xae, + 0xd7, 0xe8, 0x6e, 0xd2, 0x77, 0x24, 0xa1, 0xfe, 0xce, 0x4d, 0x5b, 0x7f, 0x9b, 0xa2, 0xf3, 0x4f, + 0x37, 0xec, 0x63, 0x2a, 0x65, 0xd2, 0x7a, 0x2e, 0x9c, 0x02, 0xbe, 0x91, 0x13, 0xfb, 0x43, 0x50, + 0xd2, 0x2c, 0x62, 0x67, 0xf6, 0x2a, 0xcc, 0x85, 0xad, 0x3d, 0x91, 0x3b, 0xab, 0x8d, 0x00, 0xa8, + 0x02, 0xc5, 0x1e, 0x76, 0x5d, 0xe3, 0x2c, 0x90, 0x1f, 0xbc, 0x2a, 0x3f, 0x93, 0x00, 0x35, 0x4c, + 0x97, 0xd5, 0x86, 0x53, 0xef, 0x98, 0x5f, 0x32, 0x1a, 0x2f, 0x75, 0x6c, 0x79, 0x8e, 0xc9, 0xca, + 0x9b, 0x82, 0x06, 0x3d, 0xe3, 0xa5, 0x4a, 0x21, 0x7e, 0x4d, 0xe3, 0x7a, 0x86, 0xe3, 0x99, 0xd6, + 0x99, 0xee, 0xd9, 0x2f, 0xb0, 0xc5, 0x8e, 0xd3, 0x42, 0x00, 0x6d, 0xf9, 0x40, 0xe5, 0x77, 0x12, + 0x2c, 0x46, 0xcc, 0x60, 0xcb, 0xba, 0x07, 0xc5, 0x40, 0x36, 0xcd, 0x42, 0xd7, 0x88, 0x1d, 0x02, + 0xd2, 0x2a, 0xdd, 0x84, 0x80, 0x1c, 0xad, 0x03, 0x58, 0xf8, 0xa5, 0xc7, 0x94, 0xd2, 0x55, 0xcf, + 0xf9, 0x10, 0xa2, 0x50, 0xbe, 0x0b, 0x05, 0xba, 0x15, 0x17, 0x6a, 0x0f, 0x7e, 0x99, 0x05, 0xb4, + 0x87, 0xbd, 0xb0, 0x02, 0x9c, 0xd2, 0x4b, 0x09, 0xa1, 0x9b, 0x9d, 0x36, 0x74, 0xf7, 0x22, 0xad, + 0x23, 0x8d, 0xfc, 0xf7, 0x82, 0x51, 0x46, 0xcc, 0xb8, 0xb4, 0xce, 0xf1, 0x35, 0x5b, 0x37, 0x65, + 0x17, 0x16, 0x23, 0x0a, 0xd9, 0x66, 0xbd, 0x0f, 0xc8, 0x38, 0x37, 0xcc, 0xae, 0x71, 0xd2, 0xa5, + 0x2b, 0xf5, 0xb1, 0xac, 0x86, 0xbd, 0x1c, 0x62, 0x02, 0x36, 0xe5, 0xbb, 0xb0, 0xcc, 0xdd, 0x26, + 0x8e, 0x7d, 0x32, 0x6d, 0x06, 0x57, 0x56, 0x61, 0x65, 0x4c, 0x02, 0x4b, 0x4c, 0xdf, 0xe3, 0x2f, + 0x0a, 0x66, 0xec, 0xab, 0x0e, 0x5d, 0x4c, 0x3e, 0x13, 0x8e, 0xc9, 0x62, 0x8b, 0xdf, 0x15, 0x0e, + 0x5e, 0x36, 0x62, 0x57, 0x00, 0x1b, 0x88, 0x24, 0xce, 0x60, 0x7e, 0x9b, 0x85, 0xb5, 0x14, 0x6a, + 0x74, 0x0f, 0x72, 0x4e, 0xbf, 0xcd, 0xcc, 0x7d, 0x77, 0x92, 0xf0, 0xaa, 0x76, 0x58, 0xdb, 0xcf, + 0x68, 0x3e, 0x8b, 0xfc, 0x17, 0x09, 0x72, 0xda, 0x61, 0x0d, 0x3d, 0xa0, 0xd3, 0x15, 0xd6, 0xb4, + 0xfd, 0xdf, 0x45, 0x44, 0x54, 0xfd, 0xee, 0x50, 0xa3, 0x43, 0x19, 0x5b, 0x34, 0xc9, 0xa9, 0xc0, + 0x52, 0x4d, 0x53, 0xb7, 0x5b, 0xaa, 0xbe, 0xab, 0x36, 0xd4, 0x96, 0xaa, 0x3f, 0x3d, 0x68, 0x1c, + 0x3f, 0x51, 0xcb, 0x92, 0xdf, 0x80, 0x1d, 0x1e, 0xef, 0x34, 0xea, 0x47, 0xfb, 0xfa, 0x71, 0x33, + 0x78, 0x62, 0xd8, 0x2c, 0x2a, 0xc3, 0x7c, 0xa3, 0x7e, 0xd4, 0x62, 0x80, 0xa3, 0x72, 0xce, 0x87, + 0xec, 0xa9, 0x2d, 0xbd, 0xb6, 0x7d, 0xb8, 0x5d, 0xab, 0xb7, 0x3e, 0x2d, 0xe7, 0xc3, 0x69, 0xd0, + 0xdf, 0x0a, 0xb0, 0xdc, 0xb4, 0x3b, 0xf8, 0xc8, 0x33, 0xce, 0xde, 0x44, 0xb3, 0x71, 0x10, 0x2b, + 0x7a, 0xe8, 0xe9, 0xba, 0x4b, 0x24, 0x89, 0xf5, 0xa6, 0xd7, 0x3a, 0xa8, 0x0a, 0x8b, 0xae, 0x67, + 0x9c, 0x91, 0xc4, 0x67, 0x38, 0x67, 0xd8, 0xd3, 0xfb, 0x86, 0xf7, 0x9c, 0xd4, 0xd5, 0x73, 0xda, + 0x65, 0x86, 0x6a, 0x11, 0xcc, 0xa1, 0xe1, 0x3d, 0x17, 0x57, 0xe1, 0x85, 0xe9, 0xaa, 0xf0, 0x17, + 0xb0, 0x4c, 0xaa, 0x16, 0x5f, 0xba, 0x68, 0x14, 0xf4, 0x61, 0xda, 0x72, 0x42, 0xf0, 0x58, 0xf5, + 0xb1, 0x64, 0x09, 0x50, 0xe8, 0x47, 0xc9, 0x85, 0xf4, 0xb7, 0xd2, 0xf4, 0x5c, 0xf4, 0xf6, 0x7c, + 0xcd, 0x62, 0x51, 0xde, 0x83, 0xd5, 0xc4, 0x25, 0xbd, 0xfd, 0xc2, 0x7b, 0x15, 0x56, 0xc6, 0xfc, + 0xc1, 0x72, 0xd5, 0x3f, 0xb3, 0x50, 0xf1, 0x71, 0xc7, 0x96, 0xfb, 0x86, 0x82, 0x3b, 0x21, 0x16, + 0x73, 0x49, 0xb1, 0xe8, 0x42, 0x85, 0xc4, 0xd1, 0xc0, 0x1a, 0x8f, 0xa4, 0x3c, 0xd7, 0x2a, 0x25, + 0x59, 0xcd, 0x23, 0xc6, 0xa2, 0x89, 0x84, 0xe8, 0x38, 0x52, 0xae, 0xc3, 0x5a, 0x0a, 0xdb, 0x54, + 0xce, 0x5e, 0xa3, 0x5b, 0x1f, 0x33, 0x8d, 0xb9, 0xfb, 0xe7, 0x33, 0xd4, 0xdd, 0x6f, 0xae, 0xd3, + 0xfe, 0x44, 0x98, 0x4b, 0xaa, 0xa1, 0xcb, 0x84, 0x7d, 0xe5, 0x37, 0x9b, 0x4d, 0xae, 0x43, 0x89, + 0xa7, 0x2b, 0x10, 0x3a, 0xf0, 0x26, 0xa4, 0x9b, 0x99, 0x57, 0x6f, 0xfa, 0x8b, 0xb1, 0xa6, 0x3f, + 0x08, 0x21, 0x51, 0x7b, 0x34, 0x1b, 0x0b, 0x21, 0xa1, 0x3f, 0x38, 0x84, 0x38, 0x84, 0x04, 0xbd, + 0xfd, 0x17, 0xa2, 0x94, 0x34, 0x47, 0xb4, 0x7d, 0x90, 0xae, 0xed, 0x6d, 0x25, 0x25, 0x16, 0xe4, + 0xff, 0x33, 0xf3, 0x00, 0x76, 0x52, 0x84, 0xcd, 0xbc, 0xf2, 0x8f, 0x2c, 0xc8, 0xf4, 0x1c, 0xbd, + 0xb9, 0x46, 0x3b, 0x16, 0xa8, 0xb9, 0xb1, 0x40, 0xfd, 0x09, 0xc8, 0x2c, 0x17, 0x25, 0x77, 0xda, + 0x0f, 0xb8, 0x6c, 0xd4, 0x4f, 0x0a, 0xa6, 0xe4, 0xee, 0xba, 0x62, 0x25, 0xa0, 0xe5, 0xc7, 0xb0, + 0x9e, 0xca, 0x3a, 0x95, 0xaf, 0xd7, 0x83, 0x04, 0x27, 0xee, 0xa5, 0x3f, 0x82, 0xb2, 0x8f, 0xde, + 0xc3, 0x5e, 0xbd, 0x33, 0x6d, 0x89, 0x7a, 0x17, 0x2e, 0x73, 0xbc, 0xac, 0x24, 0xe5, 0x66, 0x18, + 0x12, 0x3f, 0xc3, 0x08, 0x34, 0xbd, 0x52, 0xcd, 0xbd, 0x48, 0x35, 0x45, 0xab, 0xed, 0x5d, 0x1a, + 0x27, 0xaf, 0x59, 0x67, 0x7f, 0x4e, 0xfd, 0x93, 0x54, 0x61, 0x3f, 0x8c, 0x55, 0xd8, 0xb4, 0x21, + 0x94, 0x47, 0xa5, 0xc6, 0x84, 0xda, 0xfa, 0xef, 0x12, 0x5c, 0x11, 0xd2, 0xa1, 0x4d, 0xbe, 0xaa, + 0xbe, 0x96, 0x2c, 0x90, 0xaf, 0xa7, 0x7b, 0xb4, 0x9c, 0xfe, 0x4e, 0xa4, 0x9c, 0xbe, 0x99, 0xce, + 0xcb, 0x17, 0xd2, 0xef, 0x27, 0x14, 0xd2, 0x47, 0xad, 0xed, 0x3d, 0x55, 0x3f, 0x6e, 0xd2, 0xdf, + 0xa0, 0x90, 0x0e, 0xca, 0xe0, 0xcd, 0xdf, 0x64, 0x61, 0xb6, 0x4e, 0x42, 0xd0, 0x1b, 0xa2, 0xcf, + 0xc9, 0xd7, 0xf6, 0xb1, 0xff, 0x05, 0xa0, 0x8d, 0xa0, 0x27, 0x4c, 0xfa, 0x47, 0x81, 0x7c, 0x23, + 0x85, 0x82, 0xed, 0x69, 0x06, 0xed, 0xc3, 0x42, 0xe4, 0x13, 0x39, 0x5a, 0x15, 0x7d, 0x36, 0xa7, + 0x02, 0xe5, 0xe4, 0x2f, 0xea, 0x4a, 0x06, 0x7d, 0xc1, 0x7d, 0xd5, 0x8f, 0x74, 0xb4, 0x37, 0xa2, + 0x6c, 0x82, 0xe8, 0x91, 0x95, 0x34, 0x92, 0x40, 0xc3, 0xe6, 0x1f, 0x67, 0x00, 0x46, 0x6d, 0x0c, + 0x52, 0x61, 0x9e, 0xff, 0x18, 0x88, 0x2a, 0x49, 0xdf, 0x40, 0xe5, 0x55, 0x01, 0x26, 0xb4, 0x5b, + 0x85, 0x79, 0x7e, 0x64, 0xcf, 0xc4, 0x08, 0x3e, 0x35, 0x30, 0x31, 0xc2, 0xf9, 0x7e, 0x06, 0x9d, + 0x46, 0xfa, 0x54, 0xfe, 0xf0, 0xa3, 0x9b, 0x17, 0x18, 0x39, 0xcb, 0xef, 0x5e, 0x64, 0xf4, 0xaa, + 0x64, 0x50, 0x17, 0x56, 0x13, 0x47, 0x76, 0xe8, 0xd6, 0x85, 0xa6, 0x91, 0xf2, 0xed, 0x49, 0x64, + 0xa1, 0x36, 0x1b, 0xe4, 0xe4, 0xc1, 0x14, 0xba, 0x7d, 0xb1, 0x59, 0x9a, 0xfc, 0xde, 0x44, 0xba, + 0x50, 0xe1, 0x0e, 0x94, 0xb8, 0xc1, 0x0f, 0x5a, 0x19, 0x1f, 0x05, 0x51, 0x91, 0x95, 0xa4, 0x19, + 0x11, 0x95, 0xc1, 0x8d, 0x2e, 0x98, 0x8c, 0xf1, 0xe9, 0x09, 0x93, 0x21, 0x98, 0x72, 0x28, 0x19, + 0xd4, 0x84, 0x77, 0x62, 0x63, 0x07, 0xb4, 0x16, 0xdf, 0x21, 0x2e, 0xb5, 0xca, 0x57, 0xc5, 0x48, + 0xf1, 0xb6, 0xc5, 0xb2, 0xdf, 0xd8, 0xb6, 0x89, 0x73, 0xec, 0xd8, 0xb6, 0x25, 0x24, 0x51, 0x25, + 0xb3, 0xf9, 0xd7, 0x3c, 0xe4, 0xfd, 0x0c, 0xe5, 0x2f, 0x23, 0xd6, 0x91, 0xb0, 0x65, 0x88, 0xfb, + 0x36, 0xb6, 0x8c, 0xa4, 0x26, 0x26, 0x83, 0x5a, 0xf4, 0x66, 0x88, 0x14, 0xdd, 0x68, 0x3d, 0xb5, + 0x4f, 0x90, 0xaf, 0x25, 0xa1, 0xe3, 0x52, 0xa3, 0xa7, 0x66, 0x3d, 0xb5, 0x98, 0xe3, 0xa4, 0x26, + 0x9d, 0x94, 0xcf, 0x60, 0x51, 0x70, 0x15, 0xa3, 0xeb, 0x13, 0xea, 0x08, 0x79, 0x23, 0x99, 0x20, + 0x94, 0xfd, 0x31, 0xcc, 0x85, 0x77, 0x31, 0xba, 0x12, 0x32, 0xf0, 0xf7, 0xba, 0xbc, 0x1c, 0x07, + 0xc7, 0xb9, 0x69, 0x58, 0x8d, 0xb8, 0x23, 0x01, 0xb5, 0x1c, 0x07, 0xc7, 0xd7, 0x15, 0x0f, 0xa2, + 0xeb, 0xbc, 0x3a, 0x51, 0xf8, 0x6c, 0x24, 0x13, 0x04, 0xb2, 0x4f, 0x66, 0xc8, 0x1f, 0xd6, 0x3e, + 0xf8, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x45, 0xfc, 0x42, 0x5a, 0xbd, 0x26, 0x00, 0x00, } diff --git a/spec.md b/spec.md index 64ac8cab..becc2eed 100644 --- a/spec.md +++ b/spec.md @@ -193,10 +193,10 @@ creation to destruction. | NODE_READY | +---+----^---+ Node | | Node - Publish | | Unpublish - Device | | Device + Stage | | Unstage + Volume | | Volume +---v----+---+ - | VOL_READY | + | VOL_READY | +------------+ Node | | Node Publish | | Unpublish @@ -207,7 +207,7 @@ creation to destruction. Figure 5: The lifecycle of a dynamically provisioned volume, from creation to destruction, when the Node Plugin advertises the -PUBLISH_UNPUBLISH_DEVICE capability. +STAGE_UNSTAGE_VOLUME capability. ``` ``` @@ -321,11 +321,11 @@ service Controller { } service Node { - rpc NodePublishDevice (NodePublishDeviceRequest) - returns (NodePublishDeviceResponse) {} + rpc NodeStageVolume (NodeStageVolumeRequest) + returns (NodeStageVolumeResponse) {} - rpc NodeUnpublishDevice (NodeUnpublishDeviceRequest) - returns (NodeUnpublishDeviceResponse) {} + rpc NodeUnstageVolume (NodeUnstageVolumeRequest) + returns (NodeUnstageVolumeResponse) {} rpc NodePublishVolume (NodePublishVolumeRequest) returns (NodePublishVolumeResponse) {} @@ -839,8 +839,8 @@ message ControllerPublishVolumeRequest { message ControllerPublishVolumeResponse { // The SP specific information that will be passed to the Plugin in - // the subsequent `NodePublishDevice` and `NodePublishVolume` calls - // for the given volume. + // the subsequent `NodeStageVolume` or `NodePublishVolume` calls + // for the given volume. // This information is opaque to the CO. This field is OPTIONAL. map publish_info = 1; } @@ -866,7 +866,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t Controller Plugin MUST implement this RPC call if it has `PUBLISH_UNPUBLISH_VOLUME` controller capability. This RPC is a reverse operation of `ControllerPublishVolume`. -It MUST be called after `NodeUnpublishDevice` on the volume is called and succeeds. +It MUST be called after all `NodeUnstageVolume` and `NodeUnpublishVolume` on the volume are called and succeed. The Plugin SHOULD perform the work that is necessary for making the volume ready to be consumed by a different node. The Plugin MUST NOT assume that this RPC will be executed on the node where the volume was previously used. @@ -1148,19 +1148,24 @@ It is NOT REQUIRED for a controller plugin to implement the `LIST_VOLUMES` capab ### Node Service RPC -#### `NodePublishDevice` +#### `NodeStageVolume` -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. +A Node Plugin MUST implement this RPC call if it has `STAGE_UNSTAGE_VOLUME` node capability. + +This RPC is called by the CO prior to the volume being consumed by any workloads on the node by `NodePublishVolume`. The Plugin SHALL assume that this RPC will be executed on the node where the volume will be used. -This RPC 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 RPC SHOULD be called by the CO when a workload that wants to use the specified volume is placed (scheduled) on the specified node for the first time or for the first time since a `NodeUnstageVolume` call for the specified volume was called and returned success on that node. + +If the corresponding Controller Plugin has `PUBLISH_UNPUBLISH_VOLUME` controller capability and the Node Plugin has `STAGE_UNSTAGE_VOLUME` capability, then the CO MUST guarantee that this RPC is called after `ControllerPublishVolume` is called for the given volume on the given node and returns a success. +The CO MUST guarantee that this RPC is called and returns a success before any `NodePublishVolume` is called for the given volume on the given node. + This operation MUST be idempotent. -If 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`. +If the volume corresponding to the `volume_id` is already staged to the `staging_target_path`, and is identical to the specified `volume_capability` the Plugin MUST reply `0 OK`. + +If this RPC failed, or the CO does not know if it failed or not, it MAY choose to call `NodeStageVolume` again, or choose to call `NodeUnstageVolume`. ```protobuf -message NodePublishDeviceRequest { +message NodeStageVolumeRequest { // The API version assumed by the CO. This is a REQUIRED field. Version version = 1; @@ -1172,47 +1177,76 @@ message NodePublishDeviceRequest { // 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; + map publish_info = 3; // The path to which the volume will be published. It MUST be an // absolute path in the root filesystem of the process serving this - // request. The CO SHALL ensure uniqueness of global_target_path per - // volume. + // request. The CO SHALL ensure that there is only one + // staging_target_path per volume. // This is a REQUIRED field. - string global_target_path = 4; + string staging_target_path = 4; // The capability of the volume the CO expects the volume to have. // This is a REQUIRED field. VolumeCapability volume_capability = 5; -} -message NodePublishDeviceResponse { - message Result {} + // Credentials used by Node plugin to authenticate/authorize node + // stage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + map node_stage_credentials = 6; - // One of the following fields MUST be specified. - oneof reply { - Result result = 1; - Error error = 2; - } + // Attributes of the volume to publish. This field is OPTIONAL and + // MUST match the attributes of the VolumeInfo identified by + // `volume_id`. + map volume_attributes = 7; } + +message NodeStageVolumeResponse {} ``` -#### `NodeUnpublishDevice` +#### NodeStageVolume Errors + +If the plugin is unable to complete the NodeStageVolume call successfully, it MUST return a non-ok gRPC code in the gRPC status. +If the conditions defined below are encountered, the plugin MUST return the specified gRPC error code. +The CO MUST implement the specified error recovery behavior when it encounters the gRPC error code. + +| Condition | gRPC Code | Description | Recovery Behavior | +|-----------|-----------|-------------|-------------------| +| Volume does not exist | 5 NOT_FOUND | Indicates that a volume corresponding to the specified `volume_id` does not exist. | Caller MUST verify that the `volume_id` is correct and that the volume is accessible and has not been deleted before retrying with exponential back off. | +| Volume published but is incompatible | 6 ALREADY_EXISTS | Indicates that a volume corresponding to the specified `volume_id` has already been published at the specified `staging_target_path` but is incompatible with the specified `volume_capability` flag. | Caller MUST fix the arguments before retying. | +| Operation pending for volume | 10 ABORTED | Indicates that there is a already an operation pending for the specified volume. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per volume at a given time. However, in some circumstances, the CO MAY lose state (for example when the CO crashes and restarts), and MAY issue multiple calls simultaneously for the same volume. The Plugin, SHOULD handle this as gracefully as possible, and MAY return this error code to reject secondary calls. | Caller SHOULD ensure that there are no other calls pending for the specified volume, and then retry with exponential back off. | +| Exceeds capabilities | 10 FAILED_PRECONDITION | Indicates that the CO has exceeded the volume's capabilities because the volume does not have MULTI_NODE capability. | Caller MAY choose to call `ValidateVolumeCapabilities` to validate the volume capabilities, or wait for the volume to be unpublished on the node. | + +#### `NodeUnstageVolume` + +A Node Plugin MUST implement this RPC call if it has `STAGE_UNSTAGE_VOLUME` node capability. + +This RPC is a reverse operation of `NodeStageVolume`. +This RPC MUST undo the work by the corresponding `NodeStageVolume`. +This RPC SHALL be called by the CO once for each `staging_target_path` that was successfully setup via `NodeStageVolume`. + +If the corresponding Controller Plugin has `PUBLISH_UNPUBLISH_VOLUME` controller capability and the Node Plugin has `STAGE_UNSTAGE_VOLUME` capability, the CO MUST guarantee that this RPC is called and returns success before calling `ControllerUnpublishVolume` for the given node and the given volume. +The CO MUST guarantee that this RPC is called after all `NodeUnpublishVolume` have been called and returned success for the given volume on the given node. -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 RPC MAY be called by the CO when the workload using the volume is being moved to a different node, or all the workloads using the volume on a node have finished. This operation MUST be idempotent. -If this RPC failed, or the CO does not know if it failed or not, it can choose to call `NodeUnpublishDevice` again. +If the volume corresponding to the `volume_id` is not staged to the `staging_target_path`, the Plugin MUST reply `0 OK`. + +If this RPC failed, or the CO does not know if it failed or not, it MAY choose to call `NodeUnstageVolume` again. ```protobuf -message NodeUnpublishDeviceRequest { +message NodeUnstageVolumeRequest { // The API version assumed by the CO. This is a REQUIRED field. Version version = 1; @@ -1222,20 +1256,45 @@ message NodeUnpublishDeviceRequest { // 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; -} + string staging_target_path = 3; -message NodeUnpublishDeviceResponse { - message Result {} - - // One of the following fields MUST be specified. - oneof reply { - Result result = 1; - Error error = 2; - } + // Credentials used by Node plugin to authenticate/authorize node + // unstage request. + // This field contains credential data, for example username and + // password. Each key must consist of alphanumeric characters, '-', + // '_' or '.'. Each value MUST contain a valid string. An SP MAY + // choose to accept binary (non-string) data by using a binary-to-text + // encoding scheme, like base64. An SP SHALL advertise the + // requirements for credentials in documentation. COs SHALL permit + // passing through the required credentials. This information is + // sensitive and MUST be treated as such (not logged, etc.) by the CO. + // This field is OPTIONAL. + map node_unstage_credentials = 4; } + +message NodeUnstageVolumeResponse {} ``` +#### NodeUnstageVolume Errors + +If the plugin is unable to complete the NodeUnstageVolume call successfully, it MUST return a non-ok gRPC code in the gRPC status. +If the conditions defined below are encountered, the plugin MUST return the specified gRPC error code. +The CO MUST implement the specified error recovery behavior when it encounters the gRPC error code. + +| Condition | gRPC Code | Description | Recovery Behavior | +|-----------|-----------|-------------|-------------------| +| Volume does not exists | 5 NOT_FOUND | Indicates that a volume corresponding to the specified `volume_id` does not exist. | Caller MUST verify that the `volume_id` is correct and that the volume is accessible and has not been deleted before retrying with exponential back off. | +| Operation pending for volume | 10 ABORTED | Indicates that there is a already an operation pending for the specified volume. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per volume at a given time. However, in some circumstances, the CO MAY lose state (for example when the CO crashes and restarts), and MAY issue multiple calls simultaneously for the same volume. The Plugin, SHOULD handle this as gracefully as possible, and MAY return this error code to reject secondary calls. | Caller SHOULD ensure that there are no other calls pending for the specified volume, and then retry with exponential back off. | + +#### RPC Interactions and Reference Counting +`NodeStageVolume`, `NodeUnstageVolume`, `NodePublishVolume`, `NodeUnpublishVolume` + +The following interaction semantics ARE REQUIRED if the plugin advertises the `STAGE_UNSTAGE_VOLUME` capability. +`NodeStageVolume` MUST be called and return success once per volume per node before any `NodePublishVolume` MAY be called for the volume. +All `NodeUnpublishVolume` MUST be called and return success for a volume before `NodeUnstageVolume` MAY be called for the volume. + +Note that this requires that all COs MUST support reference counting of volumes so that if `STAGE_UNSTAGE_VOLUME` is advertised by the SP, the CO MUST fufill the above interaction semantics. + #### `NodePublishVolume` This RPC is called by the CO when a workload that wants to use the specified volume is placed (scheduled) on a node. @@ -1273,11 +1332,13 @@ message NodePublishVolumeRequest { // this capability. This is an OPTIONAL field. map publish_info = 3; - // The path to which the device was mounted by `NodePublishDevice`. + // The path to which the device was mounted by `NodeStageVolume`. // It MUST be an absolute path in the root filesystem of the process // serving this request. + // It MUST be set if the Node Plugin implements the + // `STAGE_UNSTAGE_VOLUME` node capability. // This is an OPTIONAL field. - string global_target_path = 4; + string staging_target_path = 4; // The path to which the volume will be published. It MUST be an // absolute path in the root filesystem of the process serving this @@ -1306,12 +1367,13 @@ message NodePublishVolumeRequest { // passing through the required credentials. This information is // sensitive and MUST be treated as such (not logged, etc.) by the CO. // This field is OPTIONAL. - map node_publish_credentials = 7; + map node_publish_credentials = 8; + // Attributes of the volume to publish. This field is OPTIONAL and // MUST match the attributes of the Volume identified by // `volume_id`. - map volume_attributes = 8; + map volume_attributes = 9; } message NodePublishVolumeResponse {} @@ -1329,6 +1391,7 @@ The CO MUST implement the specified error recovery behavior when it encounters t | Volume published but is incompatible | 6 ALREADY_EXISTS | Indicates that a volume corresponding to the specified `volume_id` has already been published at the specified `target_path` but is incompatible with the specified `volume_capability` or `readonly` flag. | Caller MUST fix the arguments before retying. | | Operation pending for volume | 10 ABORTED | Indicates that there is a already an operation pending for the specified volume. In general the Cluster Orchestrator (CO) is responsible for ensuring that there is no more than one call "in-flight" per volume at a given time. However, in some circumstances, the CO MAY lose state (for example when the CO crashes and restarts), and MAY issue multiple calls simultaneously for the same volume. The Plugin, SHOULD handle this as gracefully as possible, and MAY return this error code to reject secondary calls. | Caller SHOULD ensure that there are no other calls pending for the specified volume, and then retry with exponential back off. | | Exceeds capabilities | 10 FAILED_PRECONDITION | Indicates that the CO has exceeded the volume's capabilities because the volume does not have MULTI_NODE capability. | Caller MAY choose to call `ValidateVolumeCapabilities` to validate the volume capabilities, or wait for the volume to be unpublished on the node. | +| Stanging target path not set | 10 FAILED_PRECONDITION | Indicates that `STAGE_UNSTAGE_VOLUME` capability is set but no `staging_target_path` was set. | Caller MUST make sure call to `NodeStageVolume` is made and returns success before retrying with valid `staging_target_path`. | #### `NodeUnpublishVolume` @@ -1353,16 +1416,10 @@ message NodeUnpublishVolumeRequest { // The ID of the volume. This field is REQUIRED. string volume_id = 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 = 4; + string target_path = 3; // Credentials used by Node plugin to authenticate/authorize node // unpublish request. @@ -1476,7 +1533,7 @@ message NodeServiceCapability { message RPC { enum Type { UNKNOWN = 0; - PUBLISH_UNPUBLISH_DEVICE = 1; + STAGE_UNSTAGE_VOLUME = 1; } Type type = 1; @@ -1492,111 +1549,6 @@ message NodeServiceCapability { ##### NodeGetCapabilities Errors If the plugin is unable to complete the NodeGetCapabilities call successfully, it MUST return a non-ok gRPC code in the gRPC status. - 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; ## Protocol