diff --git a/identity/README.md b/identity/README.md index 15fc111..8df7a03 100644 --- a/identity/README.md +++ b/identity/README.md @@ -263,6 +263,13 @@ message Capability { // plugin can invoke RPCs that require access to the storage system, // similar to the CSI Controller (provisioner). VOLUME_REPLICATION = 1; + + // GET_REPLICATION_DESTINATION_INFO indicates that the CSI-driver + // supports getting the destination volume or volume group details + // for a replication relationship. This capability is relevant for + // storage providers where source and destination volume or volume + // group identifiers differ. + GET_REPLICATION_DESTINATION_INFO = 2; } // type contains the Type of CSI Service that the CSI-driver supports. Type type = 1; diff --git a/identity/identity.proto b/identity/identity.proto index 8fd5f38..6b4fe4d 100644 --- a/identity/identity.proto +++ b/identity/identity.proto @@ -163,6 +163,13 @@ message Capability { // plugin can invoke RPCs that require access to the storage system, // similar to the CSI Controller (provisioner). VOLUME_REPLICATION = 1; + + // GET_REPLICATION_DESTINATION_INFO indicates that the CSI-driver + // supports getting the destination volume or volume group details + // for a replication relationship. This capability is relevant for + // storage providers where source and destination volume or volume + // group identifiers differ. + GET_REPLICATION_DESTINATION_INFO = 2; } // type contains the Type of CSI Service that the CSI-driver supports. Type type = 1; diff --git a/lib/go/identity/identity.pb.go b/lib/go/identity/identity.pb.go index fac79ee..8aa21f9 100644 --- a/lib/go/identity/identity.pb.go +++ b/lib/go/identity/identity.pb.go @@ -229,6 +229,12 @@ const ( // plugin can invoke RPCs that require access to the storage system, // similar to the CSI Controller (provisioner). Capability_VolumeReplication_VOLUME_REPLICATION Capability_VolumeReplication_Type = 1 + // GET_REPLICATION_DESTINATION_INFO indicates that the CSI-driver + // supports getting the destination volume or volume group details + // for a replication relationship. This capability is relevant for + // storage providers where source and destination volume or volume + // group identifiers differ. + Capability_VolumeReplication_GET_REPLICATION_DESTINATION_INFO Capability_VolumeReplication_Type = 2 ) // Enum value maps for Capability_VolumeReplication_Type. @@ -236,10 +242,12 @@ var ( Capability_VolumeReplication_Type_name = map[int32]string{ 0: "UNKNOWN", 1: "VOLUME_REPLICATION", + 2: "GET_REPLICATION_DESTINATION_INFO", } Capability_VolumeReplication_Type_value = map[string]int32{ - "UNKNOWN": 0, - "VOLUME_REPLICATION": 1, + "UNKNOWN": 0, + "VOLUME_REPLICATION": 1, + "GET_REPLICATION_DESTINATION_INFO": 2, } ) @@ -1191,7 +1199,7 @@ var file_identity_identity_proto_rawDesc = []byte{ 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x22, 0x8c, 0x0b, 0x0a, 0x0a, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x73, 0x22, 0xb2, 0x0b, 0x0a, 0x0a, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x38, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, @@ -1245,63 +1253,65 @@ var file_identity_identity_proto_rawDesc = []byte{ 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x47, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x49, 0x45, - 0x4e, 0x54, 0x53, 0x5f, 0x54, 0x4f, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x02, 0x1a, 0x81, + 0x4e, 0x54, 0x53, 0x5f, 0x54, 0x4f, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x02, 0x1a, 0xa7, 0x01, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x51, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x01, 0x1a, 0x84, 0x02, 0x0a, 0x0b, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x39, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x25, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xb9, 0x01, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, - 0x4f, 0x55, 0x50, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x56, - 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x4e, 0x45, 0x5f, 0x56, 0x4f, 0x4c, - 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x44, - 0x4f, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x5f, 0x56, 0x47, 0x5f, 0x54, - 0x4f, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x53, - 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x59, 0x5f, 0x56, 0x4f, 0x4c, - 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x47, - 0x45, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, - 0x05, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, - 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x53, 0x10, 0x06, 0x1a, 0x8c, 0x01, 0x0a, 0x15, 0x45, 0x6e, + 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x47, 0x45, 0x54, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x1a, 0x84, 0x02, 0x0a, 0x0b, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x39, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x4f, 0x4c, + 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4c, + 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, + 0x4e, 0x45, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, + 0x02, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x4f, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, + 0x57, 0x5f, 0x56, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x56, + 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x53, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x4f, 0x44, 0x49, + 0x46, 0x59, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, + 0x04, 0x12, 0x14, 0x0a, 0x10, 0x47, 0x45, 0x54, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, + 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x49, 0x53, 0x54, 0x5f, + 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x53, 0x10, 0x06, 0x1a, + 0x8c, 0x01, 0x0a, 0x15, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, + 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x2f, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x19, 0x0a, - 0x15, 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x4b, 0x45, 0x59, 0x52, 0x4f, - 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x0e, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x41, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x32, 0xee, 0x01, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x12, 0x4c, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, - 0x1c, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x12, 0x20, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, 0x65, 0x74, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x62, - 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x50, 0x72, 0x6f, - 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x3b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2e, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x45, 0x4e, 0x43, 0x52, 0x59, 0x50, 0x54, 0x49, 0x4f, + 0x4e, 0x4b, 0x45, 0x59, 0x52, 0x4f, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x42, 0x06, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x0e, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x32, 0xee, 0x01, 0x0a, 0x08, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, + 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x20, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, + 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x12, 0x16, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0c, 0x5a, 0x0a, 0x2e, 0x3b, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/lib/go/replication/replication.pb.go b/lib/go/replication/replication.pb.go index c9748e4..f2ece54 100644 --- a/lib/go/replication/replication.pb.go +++ b/lib/go/replication/replication.pb.go @@ -1029,6 +1029,203 @@ func (x *GetVolumeReplicationInfoResponse) GetStatusMessage() string { return "" } +// GetReplicationDestinationInfoRequest holds the required information to +// get the destination volume or volume group details for an existing +// replication. +type GetReplicationDestinationInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Secrets required by the plugin to complete the request. + Secrets map[string]string `protobuf:"bytes,1,rep,name=secrets,proto3" json:"secrets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // The source volume or volume group for which destination + // details are requested. + // This field is REQUIRED. + ReplicationSource *ReplicationSource `protobuf:"bytes,2,opt,name=replication_source,json=replicationSource,proto3" json:"replication_source,omitempty"` +} + +func (x *GetReplicationDestinationInfoRequest) Reset() { + *x = GetReplicationDestinationInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetReplicationDestinationInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetReplicationDestinationInfoRequest) ProtoMessage() {} + +func (x *GetReplicationDestinationInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetReplicationDestinationInfoRequest.ProtoReflect.Descriptor instead. +func (*GetReplicationDestinationInfoRequest) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{12} +} + +func (x *GetReplicationDestinationInfoRequest) GetSecrets() map[string]string { + if x != nil { + return x.Secrets + } + return nil +} + +func (x *GetReplicationDestinationInfoRequest) GetReplicationSource() *ReplicationSource { + if x != nil { + return x.ReplicationSource + } + return nil +} + +// GetReplicationDestinationInfoResponse holds the destination volume +// or volume group details for an existing replication. +type GetReplicationDestinationInfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The destination details for the replication. + // This field is REQUIRED. + ReplicationDestination *ReplicationDestination `protobuf:"bytes,1,opt,name=replication_destination,json=replicationDestination,proto3" json:"replication_destination,omitempty"` +} + +func (x *GetReplicationDestinationInfoResponse) Reset() { + *x = GetReplicationDestinationInfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetReplicationDestinationInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetReplicationDestinationInfoResponse) ProtoMessage() {} + +func (x *GetReplicationDestinationInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetReplicationDestinationInfoResponse.ProtoReflect.Descriptor instead. +func (*GetReplicationDestinationInfoResponse) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{13} +} + +func (x *GetReplicationDestinationInfoResponse) GetReplicationDestination() *ReplicationDestination { + if x != nil { + return x.ReplicationDestination + } + return nil +} + +// Specifies the destination details for a replication. One of the +// type fields MUST be specified. +type ReplicationDestination struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Type: + // *ReplicationDestination_Volume + // *ReplicationDestination_Volumegroup + Type isReplicationDestination_Type `protobuf_oneof:"type"` +} + +func (x *ReplicationDestination) Reset() { + *x = ReplicationDestination{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReplicationDestination) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReplicationDestination) ProtoMessage() {} + +func (x *ReplicationDestination) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReplicationDestination.ProtoReflect.Descriptor instead. +func (*ReplicationDestination) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{14} +} + +func (m *ReplicationDestination) GetType() isReplicationDestination_Type { + if m != nil { + return m.Type + } + return nil +} + +func (x *ReplicationDestination) GetVolume() *ReplicationDestination_VolumeDestination { + if x, ok := x.GetType().(*ReplicationDestination_Volume); ok { + return x.Volume + } + return nil +} + +func (x *ReplicationDestination) GetVolumegroup() *ReplicationDestination_VolumeGroupDestination { + if x, ok := x.GetType().(*ReplicationDestination_Volumegroup); ok { + return x.Volumegroup + } + return nil +} + +type isReplicationDestination_Type interface { + isReplicationDestination_Type() +} + +type ReplicationDestination_Volume struct { + // Volume destination type + Volume *ReplicationDestination_VolumeDestination `protobuf:"bytes,1,opt,name=volume,proto3,oneof"` +} + +type ReplicationDestination_Volumegroup struct { + // Volume group destination type + Volumegroup *ReplicationDestination_VolumeGroupDestination `protobuf:"bytes,2,opt,name=volumegroup,proto3,oneof"` +} + +func (*ReplicationDestination_Volume) isReplicationDestination_Type() {} + +func (*ReplicationDestination_Volumegroup) isReplicationDestination_Type() {} + // Specifies what source the replication will be created from. One of the // type fields MUST be specified. type ReplicationSource struct { @@ -1045,7 +1242,7 @@ type ReplicationSource struct { func (x *ReplicationSource) Reset() { *x = ReplicationSource{} if protoimpl.UnsafeEnabled { - mi := &file_replication_replication_proto_msgTypes[12] + mi := &file_replication_replication_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1058,7 +1255,7 @@ func (x *ReplicationSource) String() string { func (*ReplicationSource) ProtoMessage() {} func (x *ReplicationSource) ProtoReflect() protoreflect.Message { - mi := &file_replication_replication_proto_msgTypes[12] + mi := &file_replication_replication_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1071,7 +1268,7 @@ func (x *ReplicationSource) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationSource.ProtoReflect.Descriptor instead. func (*ReplicationSource) Descriptor() ([]byte, []int) { - return file_replication_replication_proto_rawDescGZIP(), []int{12} + return file_replication_replication_proto_rawDescGZIP(), []int{15} } func (m *ReplicationSource) GetType() isReplicationSource_Type { @@ -1113,6 +1310,128 @@ func (*ReplicationSource_Volume) isReplicationSource_Type() {} func (*ReplicationSource_Volumegroup) isReplicationSource_Type() {} +// VolumeDestination contains the destination details for a +// replicated volume. +type ReplicationDestination_VolumeDestination struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The destination volume ID on the remote/target cluster. + // This field is REQUIRED. + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` +} + +func (x *ReplicationDestination_VolumeDestination) Reset() { + *x = ReplicationDestination_VolumeDestination{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReplicationDestination_VolumeDestination) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReplicationDestination_VolumeDestination) ProtoMessage() {} + +func (x *ReplicationDestination_VolumeDestination) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReplicationDestination_VolumeDestination.ProtoReflect.Descriptor instead. +func (*ReplicationDestination_VolumeDestination) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{14, 0} +} + +func (x *ReplicationDestination_VolumeDestination) GetVolumeId() string { + if x != nil { + return x.VolumeId + } + return "" +} + +// VolumeGroupDestination contains the destination details for a +// replicated volume group. +type ReplicationDestination_VolumeGroupDestination struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The destination volume group ID on the remote/target cluster. + // This field is REQUIRED. + VolumeGroupId string `protobuf:"bytes,1,opt,name=volume_group_id,json=volumeGroupId,proto3" json:"volume_group_id,omitempty"` + // Mapping of source volume IDs to their corresponding + // destination volume IDs. Key is source volume_id, + // value is destination volume_id. + // This field is OPTIONAL. + // This map reflects the current group membership at the + // time of the call, accounting for dynamic group changes. + // When provided, this map MUST be complete — it MUST + // contain an entry for every volume currently in the group. + // If the SP cannot determine the destination ID for all + // volumes (e.g., newly added volumes have not finished + // initial sync), the SP MUST return an error instead of + // a partial map. + VolumeIds map[string]string `protobuf:"bytes,2,rep,name=volume_ids,json=volumeIds,proto3" json:"volume_ids,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ReplicationDestination_VolumeGroupDestination) Reset() { + *x = ReplicationDestination_VolumeGroupDestination{} + if protoimpl.UnsafeEnabled { + mi := &file_replication_replication_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReplicationDestination_VolumeGroupDestination) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReplicationDestination_VolumeGroupDestination) ProtoMessage() {} + +func (x *ReplicationDestination_VolumeGroupDestination) ProtoReflect() protoreflect.Message { + mi := &file_replication_replication_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReplicationDestination_VolumeGroupDestination.ProtoReflect.Descriptor instead. +func (*ReplicationDestination_VolumeGroupDestination) Descriptor() ([]byte, []int) { + return file_replication_replication_proto_rawDescGZIP(), []int{14, 1} +} + +func (x *ReplicationDestination_VolumeGroupDestination) GetVolumeGroupId() string { + if x != nil { + return x.VolumeGroupId + } + return "" +} + +func (x *ReplicationDestination_VolumeGroupDestination) GetVolumeIds() map[string]string { + if x != nil { + return x.VolumeIds + } + return nil +} + // VolumeSource contains the details about the volume to be replication type ReplicationSource_VolumeSource struct { state protoimpl.MessageState @@ -1127,7 +1446,7 @@ type ReplicationSource_VolumeSource struct { func (x *ReplicationSource_VolumeSource) Reset() { *x = ReplicationSource_VolumeSource{} if protoimpl.UnsafeEnabled { - mi := &file_replication_replication_proto_msgTypes[24] + mi := &file_replication_replication_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1140,7 +1459,7 @@ func (x *ReplicationSource_VolumeSource) String() string { func (*ReplicationSource_VolumeSource) ProtoMessage() {} func (x *ReplicationSource_VolumeSource) ProtoReflect() protoreflect.Message { - mi := &file_replication_replication_proto_msgTypes[24] + mi := &file_replication_replication_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1153,7 +1472,7 @@ func (x *ReplicationSource_VolumeSource) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplicationSource_VolumeSource.ProtoReflect.Descriptor instead. func (*ReplicationSource_VolumeSource) Descriptor() ([]byte, []int) { - return file_replication_replication_proto_rawDescGZIP(), []int{12, 0} + return file_replication_replication_proto_rawDescGZIP(), []int{15, 0} } func (x *ReplicationSource_VolumeSource) GetVolumeId() string { @@ -1178,7 +1497,7 @@ type ReplicationSource_VolumeGroupSource struct { func (x *ReplicationSource_VolumeGroupSource) Reset() { *x = ReplicationSource_VolumeGroupSource{} if protoimpl.UnsafeEnabled { - mi := &file_replication_replication_proto_msgTypes[25] + mi := &file_replication_replication_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1191,7 +1510,7 @@ func (x *ReplicationSource_VolumeGroupSource) String() string { func (*ReplicationSource_VolumeGroupSource) ProtoMessage() {} func (x *ReplicationSource_VolumeGroupSource) ProtoReflect() protoreflect.Message { - mi := &file_replication_replication_proto_msgTypes[25] + mi := &file_replication_replication_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1204,7 +1523,7 @@ func (x *ReplicationSource_VolumeGroupSource) ProtoReflect() protoreflect.Messag // Deprecated: Use ReplicationSource_VolumeGroupSource.ProtoReflect.Descriptor instead. func (*ReplicationSource_VolumeGroupSource) Descriptor() ([]byte, []int) { - return file_replication_replication_proto_rawDescGZIP(), []int{12, 1} + return file_replication_replication_proto_rawDescGZIP(), []int{15, 1} } func (x *ReplicationSource_VolumeGroupSource) GetVolumeGroupId() string { @@ -1460,71 +1779,137 @@ var file_replication_replication_proto_rawDesc = []byte{ 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x47, 0x52, 0x41, 0x44, 0x45, 0x44, 0x10, - 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0xa2, 0x02, 0x0a, - 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, - 0x00, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0x90, 0x02, 0x0a, + 0x24, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x03, 0x98, 0x42, 0x01, 0x52, 0x07, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x12, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x85, 0x01, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x17, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x16, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xee, 0x03, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x06, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x1a, 0x30, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x49, 0x64, 0x1a, 0xe8, 0x01, 0x0a, 0x16, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x26, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x68, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x65, 0x73, + 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, + 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, + 0x64, 0x73, 0x1a, 0x3c, 0x0a, 0x0e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa2, 0x02, 0x0a, 0x11, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x45, + 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x48, 0x00, 0x52, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x1a, - 0x2b, 0x0a, 0x0c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x1a, 0x3b, 0x0a, 0x11, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x32, 0x82, 0x05, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, - 0x12, 0x76, 0x0a, 0x17, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x18, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x21, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, - 0x0c, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x18, 0x47, - 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x3a, 0x3f, 0x0a, 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xcc, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x0f, 0x5a, 0x0d, 0x2e, 0x3b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x06, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0b, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x2b, 0x0a, 0x0c, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x1a, 0x3b, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x26, 0x0a, + 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x49, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x32, 0x8d, 0x06, + 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x76, 0x0a, 0x17, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x18, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x58, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x21, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, + 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x44, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x72, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x55, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, + 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x47, 0x65, 0x74, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x31, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x3a, 0x3f, 0x0a, + 0x0b, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xcc, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x0f, + 0x5a, 0x0d, 0x2e, 0x3b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1540,80 +1925,95 @@ func file_replication_replication_proto_rawDescGZIP() []byte { } var file_replication_replication_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_replication_replication_proto_msgTypes = make([]protoimpl.MessageInfo, 26) +var file_replication_replication_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_replication_replication_proto_goTypes = []interface{}{ - (GetVolumeReplicationInfoResponse_Status)(0), // 0: replication.GetVolumeReplicationInfoResponse.Status - (*EnableVolumeReplicationRequest)(nil), // 1: replication.EnableVolumeReplicationRequest - (*EnableVolumeReplicationResponse)(nil), // 2: replication.EnableVolumeReplicationResponse - (*DisableVolumeReplicationRequest)(nil), // 3: replication.DisableVolumeReplicationRequest - (*DisableVolumeReplicationResponse)(nil), // 4: replication.DisableVolumeReplicationResponse - (*PromoteVolumeRequest)(nil), // 5: replication.PromoteVolumeRequest - (*PromoteVolumeResponse)(nil), // 6: replication.PromoteVolumeResponse - (*DemoteVolumeRequest)(nil), // 7: replication.DemoteVolumeRequest - (*DemoteVolumeResponse)(nil), // 8: replication.DemoteVolumeResponse - (*ResyncVolumeRequest)(nil), // 9: replication.ResyncVolumeRequest - (*ResyncVolumeResponse)(nil), // 10: replication.ResyncVolumeResponse - (*GetVolumeReplicationInfoRequest)(nil), // 11: replication.GetVolumeReplicationInfoRequest - (*GetVolumeReplicationInfoResponse)(nil), // 12: replication.GetVolumeReplicationInfoResponse - (*ReplicationSource)(nil), // 13: replication.ReplicationSource - nil, // 14: replication.EnableVolumeReplicationRequest.ParametersEntry - nil, // 15: replication.EnableVolumeReplicationRequest.SecretsEntry - nil, // 16: replication.DisableVolumeReplicationRequest.ParametersEntry - nil, // 17: replication.DisableVolumeReplicationRequest.SecretsEntry - nil, // 18: replication.PromoteVolumeRequest.ParametersEntry - nil, // 19: replication.PromoteVolumeRequest.SecretsEntry - nil, // 20: replication.DemoteVolumeRequest.ParametersEntry - nil, // 21: replication.DemoteVolumeRequest.SecretsEntry - nil, // 22: replication.ResyncVolumeRequest.ParametersEntry - nil, // 23: replication.ResyncVolumeRequest.SecretsEntry - nil, // 24: replication.GetVolumeReplicationInfoRequest.SecretsEntry - (*ReplicationSource_VolumeSource)(nil), // 25: replication.ReplicationSource.VolumeSource - (*ReplicationSource_VolumeGroupSource)(nil), // 26: replication.ReplicationSource.VolumeGroupSource - (*timestamppb.Timestamp)(nil), // 27: google.protobuf.Timestamp - (*durationpb.Duration)(nil), // 28: google.protobuf.Duration - (*descriptorpb.FieldOptions)(nil), // 29: google.protobuf.FieldOptions + (GetVolumeReplicationInfoResponse_Status)(0), // 0: replication.GetVolumeReplicationInfoResponse.Status + (*EnableVolumeReplicationRequest)(nil), // 1: replication.EnableVolumeReplicationRequest + (*EnableVolumeReplicationResponse)(nil), // 2: replication.EnableVolumeReplicationResponse + (*DisableVolumeReplicationRequest)(nil), // 3: replication.DisableVolumeReplicationRequest + (*DisableVolumeReplicationResponse)(nil), // 4: replication.DisableVolumeReplicationResponse + (*PromoteVolumeRequest)(nil), // 5: replication.PromoteVolumeRequest + (*PromoteVolumeResponse)(nil), // 6: replication.PromoteVolumeResponse + (*DemoteVolumeRequest)(nil), // 7: replication.DemoteVolumeRequest + (*DemoteVolumeResponse)(nil), // 8: replication.DemoteVolumeResponse + (*ResyncVolumeRequest)(nil), // 9: replication.ResyncVolumeRequest + (*ResyncVolumeResponse)(nil), // 10: replication.ResyncVolumeResponse + (*GetVolumeReplicationInfoRequest)(nil), // 11: replication.GetVolumeReplicationInfoRequest + (*GetVolumeReplicationInfoResponse)(nil), // 12: replication.GetVolumeReplicationInfoResponse + (*GetReplicationDestinationInfoRequest)(nil), // 13: replication.GetReplicationDestinationInfoRequest + (*GetReplicationDestinationInfoResponse)(nil), // 14: replication.GetReplicationDestinationInfoResponse + (*ReplicationDestination)(nil), // 15: replication.ReplicationDestination + (*ReplicationSource)(nil), // 16: replication.ReplicationSource + nil, // 17: replication.EnableVolumeReplicationRequest.ParametersEntry + nil, // 18: replication.EnableVolumeReplicationRequest.SecretsEntry + nil, // 19: replication.DisableVolumeReplicationRequest.ParametersEntry + nil, // 20: replication.DisableVolumeReplicationRequest.SecretsEntry + nil, // 21: replication.PromoteVolumeRequest.ParametersEntry + nil, // 22: replication.PromoteVolumeRequest.SecretsEntry + nil, // 23: replication.DemoteVolumeRequest.ParametersEntry + nil, // 24: replication.DemoteVolumeRequest.SecretsEntry + nil, // 25: replication.ResyncVolumeRequest.ParametersEntry + nil, // 26: replication.ResyncVolumeRequest.SecretsEntry + nil, // 27: replication.GetVolumeReplicationInfoRequest.SecretsEntry + nil, // 28: replication.GetReplicationDestinationInfoRequest.SecretsEntry + (*ReplicationDestination_VolumeDestination)(nil), // 29: replication.ReplicationDestination.VolumeDestination + (*ReplicationDestination_VolumeGroupDestination)(nil), // 30: replication.ReplicationDestination.VolumeGroupDestination + nil, // 31: replication.ReplicationDestination.VolumeGroupDestination.VolumeIdsEntry + (*ReplicationSource_VolumeSource)(nil), // 32: replication.ReplicationSource.VolumeSource + (*ReplicationSource_VolumeGroupSource)(nil), // 33: replication.ReplicationSource.VolumeGroupSource + (*timestamppb.Timestamp)(nil), // 34: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 35: google.protobuf.Duration + (*descriptorpb.FieldOptions)(nil), // 36: google.protobuf.FieldOptions } var file_replication_replication_proto_depIdxs = []int32{ - 14, // 0: replication.EnableVolumeReplicationRequest.parameters:type_name -> replication.EnableVolumeReplicationRequest.ParametersEntry - 15, // 1: replication.EnableVolumeReplicationRequest.secrets:type_name -> replication.EnableVolumeReplicationRequest.SecretsEntry - 13, // 2: replication.EnableVolumeReplicationRequest.replication_source:type_name -> replication.ReplicationSource - 16, // 3: replication.DisableVolumeReplicationRequest.parameters:type_name -> replication.DisableVolumeReplicationRequest.ParametersEntry - 17, // 4: replication.DisableVolumeReplicationRequest.secrets:type_name -> replication.DisableVolumeReplicationRequest.SecretsEntry - 13, // 5: replication.DisableVolumeReplicationRequest.replication_source:type_name -> replication.ReplicationSource - 18, // 6: replication.PromoteVolumeRequest.parameters:type_name -> replication.PromoteVolumeRequest.ParametersEntry - 19, // 7: replication.PromoteVolumeRequest.secrets:type_name -> replication.PromoteVolumeRequest.SecretsEntry - 13, // 8: replication.PromoteVolumeRequest.replication_source:type_name -> replication.ReplicationSource - 20, // 9: replication.DemoteVolumeRequest.parameters:type_name -> replication.DemoteVolumeRequest.ParametersEntry - 21, // 10: replication.DemoteVolumeRequest.secrets:type_name -> replication.DemoteVolumeRequest.SecretsEntry - 13, // 11: replication.DemoteVolumeRequest.replication_source:type_name -> replication.ReplicationSource - 22, // 12: replication.ResyncVolumeRequest.parameters:type_name -> replication.ResyncVolumeRequest.ParametersEntry - 23, // 13: replication.ResyncVolumeRequest.secrets:type_name -> replication.ResyncVolumeRequest.SecretsEntry - 13, // 14: replication.ResyncVolumeRequest.replication_source:type_name -> replication.ReplicationSource - 24, // 15: replication.GetVolumeReplicationInfoRequest.secrets:type_name -> replication.GetVolumeReplicationInfoRequest.SecretsEntry - 13, // 16: replication.GetVolumeReplicationInfoRequest.replication_source:type_name -> replication.ReplicationSource - 27, // 17: replication.GetVolumeReplicationInfoResponse.last_sync_time:type_name -> google.protobuf.Timestamp - 28, // 18: replication.GetVolumeReplicationInfoResponse.last_sync_duration:type_name -> google.protobuf.Duration + 17, // 0: replication.EnableVolumeReplicationRequest.parameters:type_name -> replication.EnableVolumeReplicationRequest.ParametersEntry + 18, // 1: replication.EnableVolumeReplicationRequest.secrets:type_name -> replication.EnableVolumeReplicationRequest.SecretsEntry + 16, // 2: replication.EnableVolumeReplicationRequest.replication_source:type_name -> replication.ReplicationSource + 19, // 3: replication.DisableVolumeReplicationRequest.parameters:type_name -> replication.DisableVolumeReplicationRequest.ParametersEntry + 20, // 4: replication.DisableVolumeReplicationRequest.secrets:type_name -> replication.DisableVolumeReplicationRequest.SecretsEntry + 16, // 5: replication.DisableVolumeReplicationRequest.replication_source:type_name -> replication.ReplicationSource + 21, // 6: replication.PromoteVolumeRequest.parameters:type_name -> replication.PromoteVolumeRequest.ParametersEntry + 22, // 7: replication.PromoteVolumeRequest.secrets:type_name -> replication.PromoteVolumeRequest.SecretsEntry + 16, // 8: replication.PromoteVolumeRequest.replication_source:type_name -> replication.ReplicationSource + 23, // 9: replication.DemoteVolumeRequest.parameters:type_name -> replication.DemoteVolumeRequest.ParametersEntry + 24, // 10: replication.DemoteVolumeRequest.secrets:type_name -> replication.DemoteVolumeRequest.SecretsEntry + 16, // 11: replication.DemoteVolumeRequest.replication_source:type_name -> replication.ReplicationSource + 25, // 12: replication.ResyncVolumeRequest.parameters:type_name -> replication.ResyncVolumeRequest.ParametersEntry + 26, // 13: replication.ResyncVolumeRequest.secrets:type_name -> replication.ResyncVolumeRequest.SecretsEntry + 16, // 14: replication.ResyncVolumeRequest.replication_source:type_name -> replication.ReplicationSource + 27, // 15: replication.GetVolumeReplicationInfoRequest.secrets:type_name -> replication.GetVolumeReplicationInfoRequest.SecretsEntry + 16, // 16: replication.GetVolumeReplicationInfoRequest.replication_source:type_name -> replication.ReplicationSource + 34, // 17: replication.GetVolumeReplicationInfoResponse.last_sync_time:type_name -> google.protobuf.Timestamp + 35, // 18: replication.GetVolumeReplicationInfoResponse.last_sync_duration:type_name -> google.protobuf.Duration 0, // 19: replication.GetVolumeReplicationInfoResponse.status:type_name -> replication.GetVolumeReplicationInfoResponse.Status - 25, // 20: replication.ReplicationSource.volume:type_name -> replication.ReplicationSource.VolumeSource - 26, // 21: replication.ReplicationSource.volumegroup:type_name -> replication.ReplicationSource.VolumeGroupSource - 29, // 22: replication.alpha_field:extendee -> google.protobuf.FieldOptions - 1, // 23: replication.Controller.EnableVolumeReplication:input_type -> replication.EnableVolumeReplicationRequest - 3, // 24: replication.Controller.DisableVolumeReplication:input_type -> replication.DisableVolumeReplicationRequest - 5, // 25: replication.Controller.PromoteVolume:input_type -> replication.PromoteVolumeRequest - 7, // 26: replication.Controller.DemoteVolume:input_type -> replication.DemoteVolumeRequest - 9, // 27: replication.Controller.ResyncVolume:input_type -> replication.ResyncVolumeRequest - 11, // 28: replication.Controller.GetVolumeReplicationInfo:input_type -> replication.GetVolumeReplicationInfoRequest - 2, // 29: replication.Controller.EnableVolumeReplication:output_type -> replication.EnableVolumeReplicationResponse - 4, // 30: replication.Controller.DisableVolumeReplication:output_type -> replication.DisableVolumeReplicationResponse - 6, // 31: replication.Controller.PromoteVolume:output_type -> replication.PromoteVolumeResponse - 8, // 32: replication.Controller.DemoteVolume:output_type -> replication.DemoteVolumeResponse - 10, // 33: replication.Controller.ResyncVolume:output_type -> replication.ResyncVolumeResponse - 12, // 34: replication.Controller.GetVolumeReplicationInfo:output_type -> replication.GetVolumeReplicationInfoResponse - 29, // [29:35] is the sub-list for method output_type - 23, // [23:29] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 22, // [22:23] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 28, // 20: replication.GetReplicationDestinationInfoRequest.secrets:type_name -> replication.GetReplicationDestinationInfoRequest.SecretsEntry + 16, // 21: replication.GetReplicationDestinationInfoRequest.replication_source:type_name -> replication.ReplicationSource + 15, // 22: replication.GetReplicationDestinationInfoResponse.replication_destination:type_name -> replication.ReplicationDestination + 29, // 23: replication.ReplicationDestination.volume:type_name -> replication.ReplicationDestination.VolumeDestination + 30, // 24: replication.ReplicationDestination.volumegroup:type_name -> replication.ReplicationDestination.VolumeGroupDestination + 32, // 25: replication.ReplicationSource.volume:type_name -> replication.ReplicationSource.VolumeSource + 33, // 26: replication.ReplicationSource.volumegroup:type_name -> replication.ReplicationSource.VolumeGroupSource + 31, // 27: replication.ReplicationDestination.VolumeGroupDestination.volume_ids:type_name -> replication.ReplicationDestination.VolumeGroupDestination.VolumeIdsEntry + 36, // 28: replication.alpha_field:extendee -> google.protobuf.FieldOptions + 1, // 29: replication.Controller.EnableVolumeReplication:input_type -> replication.EnableVolumeReplicationRequest + 3, // 30: replication.Controller.DisableVolumeReplication:input_type -> replication.DisableVolumeReplicationRequest + 5, // 31: replication.Controller.PromoteVolume:input_type -> replication.PromoteVolumeRequest + 7, // 32: replication.Controller.DemoteVolume:input_type -> replication.DemoteVolumeRequest + 9, // 33: replication.Controller.ResyncVolume:input_type -> replication.ResyncVolumeRequest + 11, // 34: replication.Controller.GetVolumeReplicationInfo:input_type -> replication.GetVolumeReplicationInfoRequest + 13, // 35: replication.Controller.GetReplicationDestinationInfo:input_type -> replication.GetReplicationDestinationInfoRequest + 2, // 36: replication.Controller.EnableVolumeReplication:output_type -> replication.EnableVolumeReplicationResponse + 4, // 37: replication.Controller.DisableVolumeReplication:output_type -> replication.DisableVolumeReplicationResponse + 6, // 38: replication.Controller.PromoteVolume:output_type -> replication.PromoteVolumeResponse + 8, // 39: replication.Controller.DemoteVolume:output_type -> replication.DemoteVolumeResponse + 10, // 40: replication.Controller.ResyncVolume:output_type -> replication.ResyncVolumeResponse + 12, // 41: replication.Controller.GetVolumeReplicationInfo:output_type -> replication.GetVolumeReplicationInfoResponse + 14, // 42: replication.Controller.GetReplicationDestinationInfo:output_type -> replication.GetReplicationDestinationInfoResponse + 36, // [36:43] is the sub-list for method output_type + 29, // [29:36] is the sub-list for method input_type + 29, // [29:29] is the sub-list for extension type_name + 28, // [28:29] is the sub-list for extension extendee + 0, // [0:28] is the sub-list for field type_name } func init() { file_replication_replication_proto_init() } @@ -1767,6 +2167,42 @@ func file_replication_replication_proto_init() { } } file_replication_replication_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetReplicationDestinationInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetReplicationDestinationInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReplicationDestination); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationSource); i { case 0: return &v.state @@ -1778,7 +2214,31 @@ func file_replication_replication_proto_init() { return nil } } - file_replication_replication_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_replication_replication_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReplicationDestination_VolumeDestination); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReplicationDestination_VolumeGroupDestination); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_replication_replication_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationSource_VolumeSource); i { case 0: return &v.state @@ -1790,7 +2250,7 @@ func file_replication_replication_proto_init() { return nil } } - file_replication_replication_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_replication_replication_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReplicationSource_VolumeGroupSource); i { case 0: return &v.state @@ -1803,7 +2263,11 @@ func file_replication_replication_proto_init() { } } } - file_replication_replication_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_replication_replication_proto_msgTypes[14].OneofWrappers = []interface{}{ + (*ReplicationDestination_Volume)(nil), + (*ReplicationDestination_Volumegroup)(nil), + } + file_replication_replication_proto_msgTypes[15].OneofWrappers = []interface{}{ (*ReplicationSource_Volume)(nil), (*ReplicationSource_Volumegroup)(nil), } @@ -1813,7 +2277,7 @@ func file_replication_replication_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_replication_replication_proto_rawDesc, NumEnums: 1, - NumMessages: 26, + NumMessages: 33, NumExtensions: 1, NumServices: 1, }, diff --git a/lib/go/replication/replication_grpc.pb.go b/lib/go/replication/replication_grpc.pb.go index 655511d..9afb534 100644 --- a/lib/go/replication/replication_grpc.pb.go +++ b/lib/go/replication/replication_grpc.pb.go @@ -21,12 +21,13 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - Controller_EnableVolumeReplication_FullMethodName = "/replication.Controller/EnableVolumeReplication" - Controller_DisableVolumeReplication_FullMethodName = "/replication.Controller/DisableVolumeReplication" - Controller_PromoteVolume_FullMethodName = "/replication.Controller/PromoteVolume" - Controller_DemoteVolume_FullMethodName = "/replication.Controller/DemoteVolume" - Controller_ResyncVolume_FullMethodName = "/replication.Controller/ResyncVolume" - Controller_GetVolumeReplicationInfo_FullMethodName = "/replication.Controller/GetVolumeReplicationInfo" + Controller_EnableVolumeReplication_FullMethodName = "/replication.Controller/EnableVolumeReplication" + Controller_DisableVolumeReplication_FullMethodName = "/replication.Controller/DisableVolumeReplication" + Controller_PromoteVolume_FullMethodName = "/replication.Controller/PromoteVolume" + Controller_DemoteVolume_FullMethodName = "/replication.Controller/DemoteVolume" + Controller_ResyncVolume_FullMethodName = "/replication.Controller/ResyncVolume" + Controller_GetVolumeReplicationInfo_FullMethodName = "/replication.Controller/GetVolumeReplicationInfo" + Controller_GetReplicationDestinationInfo_FullMethodName = "/replication.Controller/GetReplicationDestinationInfo" ) // ControllerClient is the client API for Controller service. @@ -46,6 +47,9 @@ type ControllerClient interface { // GetVolumeReplicationInfo RPC call to get the volume replication // information. GetVolumeReplicationInfo(ctx context.Context, in *GetVolumeReplicationInfoRequest, opts ...grpc.CallOption) (*GetVolumeReplicationInfoResponse, error) + // GetReplicationDestinationInfo RPC call to get the destination + // volume or volume group details for an existing replication. + GetReplicationDestinationInfo(ctx context.Context, in *GetReplicationDestinationInfoRequest, opts ...grpc.CallOption) (*GetReplicationDestinationInfoResponse, error) } type controllerClient struct { @@ -110,6 +114,15 @@ func (c *controllerClient) GetVolumeReplicationInfo(ctx context.Context, in *Get return out, nil } +func (c *controllerClient) GetReplicationDestinationInfo(ctx context.Context, in *GetReplicationDestinationInfoRequest, opts ...grpc.CallOption) (*GetReplicationDestinationInfoResponse, error) { + out := new(GetReplicationDestinationInfoResponse) + err := c.cc.Invoke(ctx, Controller_GetReplicationDestinationInfo_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ControllerServer is the server API for Controller service. // All implementations must embed UnimplementedControllerServer // for forward compatibility @@ -127,6 +140,9 @@ type ControllerServer interface { // GetVolumeReplicationInfo RPC call to get the volume replication // information. GetVolumeReplicationInfo(context.Context, *GetVolumeReplicationInfoRequest) (*GetVolumeReplicationInfoResponse, error) + // GetReplicationDestinationInfo RPC call to get the destination + // volume or volume group details for an existing replication. + GetReplicationDestinationInfo(context.Context, *GetReplicationDestinationInfoRequest) (*GetReplicationDestinationInfoResponse, error) mustEmbedUnimplementedControllerServer() } @@ -152,6 +168,9 @@ func (UnimplementedControllerServer) ResyncVolume(context.Context, *ResyncVolume func (UnimplementedControllerServer) GetVolumeReplicationInfo(context.Context, *GetVolumeReplicationInfoRequest) (*GetVolumeReplicationInfoResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetVolumeReplicationInfo not implemented") } +func (UnimplementedControllerServer) GetReplicationDestinationInfo(context.Context, *GetReplicationDestinationInfoRequest) (*GetReplicationDestinationInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetReplicationDestinationInfo not implemented") +} func (UnimplementedControllerServer) mustEmbedUnimplementedControllerServer() {} // UnsafeControllerServer may be embedded to opt out of forward compatibility for this service. @@ -273,6 +292,24 @@ func _Controller_GetVolumeReplicationInfo_Handler(srv interface{}, ctx context.C return interceptor(ctx, in, info, handler) } +func _Controller_GetReplicationDestinationInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetReplicationDestinationInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).GetReplicationDestinationInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Controller_GetReplicationDestinationInfo_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).GetReplicationDestinationInfo(ctx, req.(*GetReplicationDestinationInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Controller_ServiceDesc is the grpc.ServiceDesc for Controller service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -304,6 +341,10 @@ var Controller_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetVolumeReplicationInfo", Handler: _Controller_GetVolumeReplicationInfo_Handler, }, + { + MethodName: "GetReplicationDestinationInfo", + Handler: _Controller_GetReplicationDestinationInfo_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "replication/replication.proto", diff --git a/replication/README.md b/replication/README.md index 1b2f0a8..aaabc1f 100644 --- a/replication/README.md +++ b/replication/README.md @@ -88,6 +88,10 @@ service Controller { // information. rpc GetVolumeReplicationInfo (GetVolumeReplicationInfoRequest) returns (GetVolumeReplicationInfoResponse) {} + // GetReplicationDestinationInfo RPC call to get the destination + // volume or volume group details for an existing replication. + rpc GetReplicationDestinationInfo (GetReplicationDestinationInfoRequest) + returns (GetReplicationDestinationInfoResponse) {} } ``` @@ -405,7 +409,7 @@ message GetVolumeReplicationInfoResponse { // and it may require user intervention. ERROR = 3; } - // Represents the current replication status as reported by + // Represents the current replication status as reported by // the backend storage system. // This field is REQUIRED. Status status = 4; @@ -428,6 +432,82 @@ message GetVolumeReplicationInfoResponse { | Not authenticated | 16 UNAUTHENTICATED | The invoked RPC does not carry secrets that are valid for authentication. | Caller SHALL either fix the secrets provided in the RPC, or otherwise regalvanize said secrets such that they will pass authentication by the Plugin for the attempted RPC, after which point the caller MAY retry the attempted RPC. | | Error is Unknown | 2 UNKNOWN | Indicates that a unknown error is generated | Caller MUST study the logs before retrying | +### GetReplicationDestinationInfo + +```protobuf +// GetReplicationDestinationInfoRequest holds the required information to +// get the destination volume or volume group details for an existing +// replication. +message GetReplicationDestinationInfoRequest { + // Secrets required by the plugin to complete the request. + map secrets = 1 [(csi.v1.csi_secret) = true]; + // The source volume or volume group for which destination + // details are requested. + // This field is REQUIRED. + ReplicationSource replication_source = 2; +} + +// GetReplicationDestinationInfoResponse holds the destination volume +// or volume group details for an existing replication. +message GetReplicationDestinationInfoResponse { + // The destination details for the replication. + // This field is REQUIRED. + ReplicationDestination replication_destination = 1; +} + +// Specifies the destination details for a replication. One of the +// type fields MUST be specified. +message ReplicationDestination { + // VolumeDestination contains the destination details for a + // replicated volume. + message VolumeDestination { + // The destination volume ID on the remote/target cluster. + // This field is REQUIRED. + string volume_id = 1; + } + // VolumeGroupDestination contains the destination details for a + // replicated volume group. + message VolumeGroupDestination { + // The destination volume group ID on the remote/target cluster. + // This field is REQUIRED. + string volume_group_id = 1; + // Mapping of source volume IDs to their corresponding + // destination volume IDs. Key is source volume_id, + // value is destination volume_id. + // This field is OPTIONAL. + // This map reflects the current group membership at the + // time of the call, accounting for dynamic group changes. + // When provided, this map MUST be complete — it MUST + // contain an entry for every volume currently in the group. + // If the SP cannot determine the destination ID for all + // volumes (e.g., newly added volumes have not finished + // initial sync), the SP MUST return an error instead of + // a partial map. + map volume_ids = 2; + } + + oneof type { + // Volume destination type + VolumeDestination volume = 1; + // Volume group destination type + VolumeGroupDestination volumegroup = 2; + } +} +``` + +#### Error Scheme + +| Condition | gRPC Code | Description | Recovery Behavior | +| ---------------------------------------- | --------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| Missing required field | 3 INVALID_ARGUMENT | A required field is missing from the request. | Caller MUST fix the request by adding the missing required field before retrying. | +| Replication Source does not exist | 5 NOT_FOUND | The specified source does not exist. | Caller MUST verify that the `replication_source` is correct and accessible before retrying with exponential back off. | +| Replication Source is not replicated | 9 FAILED_PRECONDITION | Destination information could not be retrieved because replication is not enabled. | Caller SHOULD ensure that replication is enabled on the `replication_source`. | +| Destination info not yet available | 14 UNAVAILABLE | Destination details are not yet available. The SP needs time after replication. | Caller SHOULD retry with exponential back off. This is transient and resolves once replication is fully established. | +| Operation pending for Replication Source | 10 ABORTED | There is already an operation pending for the specified `replication_source`. | Caller SHOULD ensure no other calls are pending for the `replication_source`, then retry with exponential back off. | +| Call not implemented | 12 UNIMPLEMENTED | The invoked RPC is not implemented by the Plugin. | Caller MUST NOT retry. | +| Not authenticated | 16 UNAUTHENTICATED | The invoked RPC does not carry valid secrets for authentication. | Caller SHALL fix or regenerate the secrets, then retry. | +| Error is Unknown | 2 UNKNOWN | An unknown error occurred. | Caller MUST study the logs before retrying. | + ### ReplicationSource ```protobuf diff --git a/replication/replication.proto b/replication/replication.proto index 0449865..1849e9f 100644 --- a/replication/replication.proto +++ b/replication/replication.proto @@ -38,6 +38,10 @@ service Controller { // information. rpc GetVolumeReplicationInfo (GetVolumeReplicationInfoRequest) returns (GetVolumeReplicationInfoResponse) {} + // GetReplicationDestinationInfo RPC call to get the destination + // volume or volume group details for an existing replication. + rpc GetReplicationDestinationInfo (GetReplicationDestinationInfoRequest) + returns (GetReplicationDestinationInfoResponse) {} } // EnableVolumeReplicationRequest holds the required information to enable // replication on a volume. @@ -269,7 +273,7 @@ message GetVolumeReplicationInfoResponse { // and it may require user intervention. ERROR = 3; } - // Represents the current replication status as reported by + // Represents the current replication status as reported by // the backend storage system. // This field is REQUIRED. Status status = 4; @@ -278,6 +282,64 @@ message GetVolumeReplicationInfoResponse { // This field is OPTIONAL. string status_message = 5; } +// GetReplicationDestinationInfoRequest holds the required information to +// get the destination volume or volume group details for an existing +// replication. +message GetReplicationDestinationInfoRequest { + // Secrets required by the plugin to complete the request. + map secrets = 1 [(csi.v1.csi_secret) = true]; + // The source volume or volume group for which destination + // details are requested. + // This field is REQUIRED. + ReplicationSource replication_source = 2; +} + +// GetReplicationDestinationInfoResponse holds the destination volume +// or volume group details for an existing replication. +message GetReplicationDestinationInfoResponse { + // The destination details for the replication. + // This field is REQUIRED. + ReplicationDestination replication_destination = 1; +} + +// Specifies the destination details for a replication. One of the +// type fields MUST be specified. +message ReplicationDestination { + // VolumeDestination contains the destination details for a + // replicated volume. + message VolumeDestination { + // The destination volume ID on the remote/target cluster. + // This field is REQUIRED. + string volume_id = 1; + } + // VolumeGroupDestination contains the destination details for a + // replicated volume group. + message VolumeGroupDestination { + // The destination volume group ID on the remote/target cluster. + // This field is REQUIRED. + string volume_group_id = 1; + // Mapping of source volume IDs to their corresponding + // destination volume IDs. Key is source volume_id, + // value is destination volume_id. + // This field is OPTIONAL. + // This map reflects the current group membership at the + // time of the call, accounting for dynamic group changes. + // When provided, this map MUST be complete — it MUST + // contain an entry for every volume currently in the group. + // If the SP cannot determine the destination ID for all + // volumes (e.g., newly added volumes have not finished + // initial sync), the SP MUST return an error instead of + // a partial map. + map volume_ids = 2; + } + + oneof type { + // Volume destination type + VolumeDestination volume = 1; + // Volume group destination type + VolumeGroupDestination volumegroup = 2; + } +} // Specifies what source the replication will be created from. One of the // type fields MUST be specified. message ReplicationSource {