From 8bb9d3638e7bb5ed74038da2fb44acd053a0815b Mon Sep 17 00:00:00 2001 From: Maksym <4347218+oter@users.noreply.github.com> Date: Tue, 4 May 2021 23:22:20 +0300 Subject: [PATCH] PMM-7385: MySQL backup restore API (#717) * PMM-7385: MySQL backup restore API * generate * rename Co-authored-by: Alexander Tymchuk --- api/agentpb/agent.pb.go | 842 ++++++++++++------ api/agentpb/agent.proto | 20 + api/agentpb/agent.validator.pb.go | 37 + api/managementpb/backup/backups.pb.go | 218 ++++- api/managementpb/backup/backups.pb.gw.go | 81 ++ api/managementpb/backup/backups.proto | 27 + .../backup/backups.validator.pb.go | 12 + api/managementpb/backup/json/backup.json | 85 ++ .../json/client/backups/backups_client.go | 35 + .../backups/restore_backup_parameters.go | 131 +++ .../backups/restore_backup_responses.go | 296 ++++++ .../client/backups/start_backup_responses.go | 36 - api/swagger/swagger-dev.json | 85 ++ 13 files changed, 1577 insertions(+), 328 deletions(-) create mode 100644 api/managementpb/backup/json/client/backups/restore_backup_parameters.go create mode 100644 api/managementpb/backup/json/client/backups/restore_backup_responses.go diff --git a/api/agentpb/agent.pb.go b/api/agentpb/agent.pb.go index 834fcf8363..793f00b3f6 100644 --- a/api/agentpb/agent.pb.go +++ b/api/agentpb/agent.pb.go @@ -1762,6 +1762,7 @@ type StartJobRequest struct { // Types that are assignable to Job: // *StartJobRequest_Echo_ // *StartJobRequest_MysqlBackup + // *StartJobRequest_MysqlRestoreBackup Job isStartJobRequest_Job `protobuf_oneof:"job"` } @@ -1832,6 +1833,13 @@ func (x *StartJobRequest) GetMysqlBackup() *StartJobRequest_MySQLBackup { return nil } +func (x *StartJobRequest) GetMysqlRestoreBackup() *StartJobRequest_MySQLRestoreBackup { + if x, ok := x.GetJob().(*StartJobRequest_MysqlRestoreBackup); ok { + return x.MysqlRestoreBackup + } + return nil +} + type isStartJobRequest_Job interface { isStartJobRequest_Job() } @@ -1844,10 +1852,16 @@ type StartJobRequest_MysqlBackup struct { MysqlBackup *StartJobRequest_MySQLBackup `protobuf:"bytes,11,opt,name=mysql_backup,json=mysqlBackup,proto3,oneof"` } +type StartJobRequest_MysqlRestoreBackup struct { + MysqlRestoreBackup *StartJobRequest_MySQLRestoreBackup `protobuf:"bytes,12,opt,name=mysql_restore_backup,json=mysqlRestoreBackup,proto3,oneof"` +} + func (*StartJobRequest_Echo_) isStartJobRequest_Job() {} func (*StartJobRequest_MysqlBackup) isStartJobRequest_Job() {} +func (*StartJobRequest_MysqlRestoreBackup) isStartJobRequest_Job() {} + // StartJobResponse is an AgentMessage for StartJobRequest acceptance. type StartJobResponse struct { state protoimpl.MessageState @@ -1995,6 +2009,7 @@ type JobResult struct { // *JobResult_Error_ // *JobResult_Echo_ // *JobResult_MysqlBackup + // *JobResult_MysqlRestoreBackup Result isJobResult_Result `protobuf_oneof:"result"` } @@ -2072,6 +2087,13 @@ func (x *JobResult) GetMysqlBackup() *JobResult_MySQLBackup { return nil } +func (x *JobResult) GetMysqlRestoreBackup() *JobResult_MySQLRestoreBackup { + if x, ok := x.GetResult().(*JobResult_MysqlRestoreBackup); ok { + return x.MysqlRestoreBackup + } + return nil +} + type isJobResult_Result interface { isJobResult_Result() } @@ -2088,12 +2110,18 @@ type JobResult_MysqlBackup struct { MysqlBackup *JobResult_MySQLBackup `protobuf:"bytes,12,opt,name=mysql_backup,json=mysqlBackup,proto3,oneof"` } +type JobResult_MysqlRestoreBackup struct { + MysqlRestoreBackup *JobResult_MySQLRestoreBackup `protobuf:"bytes,13,opt,name=mysql_restore_backup,json=mysqlRestoreBackup,proto3,oneof"` +} + func (*JobResult_Error_) isJobResult_Result() {} func (*JobResult_Echo_) isJobResult_Result() {} func (*JobResult_MysqlBackup) isJobResult_Result() {} +func (*JobResult_MysqlRestoreBackup) isJobResult_Result() {} + // JobProgress represents job progress messages like percentage of completion, status updates, etc. type JobProgress struct { state protoimpl.MessageState @@ -2105,6 +2133,7 @@ type JobProgress struct { // Types that are assignable to Result: // *JobProgress_Echo_ // *JobProgress_MysqlBackup + // *JobProgress_MysqlRestoreBackup Result isJobProgress_Result `protobuf_oneof:"result"` } @@ -2175,6 +2204,13 @@ func (x *JobProgress) GetMysqlBackup() *JobProgress_MySQLBackup { return nil } +func (x *JobProgress) GetMysqlRestoreBackup() *JobProgress_MySQLRestoreBackup { + if x, ok := x.GetResult().(*JobProgress_MysqlRestoreBackup); ok { + return x.MysqlRestoreBackup + } + return nil +} + type isJobProgress_Result interface { isJobProgress_Result() } @@ -2187,10 +2223,16 @@ type JobProgress_MysqlBackup struct { MysqlBackup *JobProgress_MySQLBackup `protobuf:"bytes,11,opt,name=mysql_backup,json=mysqlBackup,proto3,oneof"` } +type JobProgress_MysqlRestoreBackup struct { + MysqlRestoreBackup *JobProgress_MySQLRestoreBackup `protobuf:"bytes,12,opt,name=mysql_restore_backup,json=mysqlRestoreBackup,proto3,oneof"` +} + func (*JobProgress_Echo_) isJobProgress_Result() {} func (*JobProgress_MysqlBackup) isJobProgress_Result() {} +func (*JobProgress_MysqlRestoreBackup) isJobProgress_Result() {} + type AgentMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4292,6 +4334,94 @@ type StartJobRequest_MySQLBackup_S3Config struct { func (*StartJobRequest_MySQLBackup_S3Config) isStartJobRequest_MySQLBackup_LocationConfig() {} +// MySQLRestoreBackup is job for MySQL restore backup service. +type StartJobRequest_MySQLRestoreBackup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Service identifier where the backup should be restored. + ServiceId string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` + // Backup name. + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // Where backup is stored. + // + // Types that are assignable to LocationConfig: + // *StartJobRequest_MySQLRestoreBackup_S3Config + LocationConfig isStartJobRequest_MySQLRestoreBackup_LocationConfig `protobuf_oneof:"location_config"` +} + +func (x *StartJobRequest_MySQLRestoreBackup) Reset() { + *x = StartJobRequest_MySQLRestoreBackup{} + if protoimpl.UnsafeEnabled { + mi := &file_agentpb_agent_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartJobRequest_MySQLRestoreBackup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartJobRequest_MySQLRestoreBackup) ProtoMessage() {} + +func (x *StartJobRequest_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { + mi := &file_agentpb_agent_proto_msgTypes[60] + 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 StartJobRequest_MySQLRestoreBackup.ProtoReflect.Descriptor instead. +func (*StartJobRequest_MySQLRestoreBackup) Descriptor() ([]byte, []int) { + return file_agentpb_agent_proto_rawDescGZIP(), []int{24, 2} +} + +func (x *StartJobRequest_MySQLRestoreBackup) GetServiceId() string { + if x != nil { + return x.ServiceId + } + return "" +} + +func (x *StartJobRequest_MySQLRestoreBackup) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (m *StartJobRequest_MySQLRestoreBackup) GetLocationConfig() isStartJobRequest_MySQLRestoreBackup_LocationConfig { + if m != nil { + return m.LocationConfig + } + return nil +} + +func (x *StartJobRequest_MySQLRestoreBackup) GetS3Config() *S3LocationConfig { + if x, ok := x.GetLocationConfig().(*StartJobRequest_MySQLRestoreBackup_S3Config); ok { + return x.S3Config + } + return nil +} + +type isStartJobRequest_MySQLRestoreBackup_LocationConfig interface { + isStartJobRequest_MySQLRestoreBackup_LocationConfig() +} + +type StartJobRequest_MySQLRestoreBackup_S3Config struct { + S3Config *S3LocationConfig `protobuf:"bytes,10,opt,name=s3_config,json=s3Config,proto3,oneof"` +} + +func (*StartJobRequest_MySQLRestoreBackup_S3Config) isStartJobRequest_MySQLRestoreBackup_LocationConfig() { +} + // Error contains job error message. type JobResult_Error struct { state protoimpl.MessageState @@ -4304,7 +4434,7 @@ type JobResult_Error struct { func (x *JobResult_Error) Reset() { *x = JobResult_Error{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[60] + mi := &file_agentpb_agent_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4317,7 +4447,7 @@ func (x *JobResult_Error) String() string { func (*JobResult_Error) ProtoMessage() {} func (x *JobResult_Error) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[60] + mi := &file_agentpb_agent_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4352,7 +4482,7 @@ type JobResult_Echo struct { func (x *JobResult_Echo) Reset() { *x = JobResult_Echo{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[61] + mi := &file_agentpb_agent_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4365,7 +4495,7 @@ func (x *JobResult_Echo) String() string { func (*JobResult_Echo) ProtoMessage() {} func (x *JobResult_Echo) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[61] + mi := &file_agentpb_agent_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4398,7 +4528,7 @@ type JobResult_MySQLBackup struct { func (x *JobResult_MySQLBackup) Reset() { *x = JobResult_MySQLBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[62] + mi := &file_agentpb_agent_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4411,7 +4541,7 @@ func (x *JobResult_MySQLBackup) String() string { func (*JobResult_MySQLBackup) ProtoMessage() {} func (x *JobResult_MySQLBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[62] + mi := &file_agentpb_agent_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4427,6 +4557,45 @@ func (*JobResult_MySQLBackup) Descriptor() ([]byte, []int) { return file_agentpb_agent_proto_rawDescGZIP(), []int{28, 2} } +// MySQLRestoreBackup contains result for MySQL restore backup job. +type JobResult_MySQLRestoreBackup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobResult_MySQLRestoreBackup) Reset() { + *x = JobResult_MySQLRestoreBackup{} + if protoimpl.UnsafeEnabled { + mi := &file_agentpb_agent_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JobResult_MySQLRestoreBackup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobResult_MySQLRestoreBackup) ProtoMessage() {} + +func (x *JobResult_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { + mi := &file_agentpb_agent_proto_msgTypes[64] + 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 JobResult_MySQLRestoreBackup.ProtoReflect.Descriptor instead. +func (*JobResult_MySQLRestoreBackup) Descriptor() ([]byte, []int) { + return file_agentpb_agent_proto_rawDescGZIP(), []int{28, 3} +} + // Echo contains echo job status update. type JobProgress_Echo struct { state protoimpl.MessageState @@ -4439,7 +4608,7 @@ type JobProgress_Echo struct { func (x *JobProgress_Echo) Reset() { *x = JobProgress_Echo{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[63] + mi := &file_agentpb_agent_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4452,7 +4621,7 @@ func (x *JobProgress_Echo) String() string { func (*JobProgress_Echo) ProtoMessage() {} func (x *JobProgress_Echo) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[63] + mi := &file_agentpb_agent_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4485,7 +4654,7 @@ type JobProgress_MySQLBackup struct { func (x *JobProgress_MySQLBackup) Reset() { *x = JobProgress_MySQLBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[64] + mi := &file_agentpb_agent_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4498,7 +4667,7 @@ func (x *JobProgress_MySQLBackup) String() string { func (*JobProgress_MySQLBackup) ProtoMessage() {} func (x *JobProgress_MySQLBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[64] + mi := &file_agentpb_agent_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4514,6 +4683,45 @@ func (*JobProgress_MySQLBackup) Descriptor() ([]byte, []int) { return file_agentpb_agent_proto_rawDescGZIP(), []int{29, 1} } +// MySQLRestoreBackup contains restore backup job status update. +type JobProgress_MySQLRestoreBackup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *JobProgress_MySQLRestoreBackup) Reset() { + *x = JobProgress_MySQLRestoreBackup{} + if protoimpl.UnsafeEnabled { + mi := &file_agentpb_agent_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JobProgress_MySQLRestoreBackup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobProgress_MySQLRestoreBackup) ProtoMessage() {} + +func (x *JobProgress_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { + mi := &file_agentpb_agent_proto_msgTypes[67] + 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 JobProgress_MySQLRestoreBackup.ProtoReflect.Descriptor instead. +func (*JobProgress_MySQLRestoreBackup) Descriptor() ([]byte, []int) { + return file_agentpb_agent_proto_rawDescGZIP(), []int{29, 2} +} + var File_agentpb_agent_proto protoreflect.FileDescriptor var file_agentpb_agent_proto_rawDesc = []byte{ @@ -4996,7 +5204,7 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x98, 0x04, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x8c, 0x06, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, @@ -5010,189 +5218,218 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x1a, 0x51, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, - 0x64, 0x65, 0x6c, 0x61, 0x79, 0x1a, 0xe2, 0x01, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, - 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, - 0x62, 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, - 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, - 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, - 0x6f, 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xda, 0x02, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x65, 0x63, 0x68, 0x6f, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x63, 0x68, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x65, - 0x63, 0x68, 0x6f, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x20, 0x0a, 0x04, 0x45, 0x63, 0x68, - 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x22, 0x8b, 0x02, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x65, 0x63, 0x68, 0x6f, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x45, 0x63, 0x68, 0x6f, 0x48, 0x00, 0x52, 0x04, - 0x65, 0x63, 0x68, 0x6f, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, + 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x1a, 0x51, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x1a, 0xe2, 0x01, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x92, 0x01, 0x0a, 0x12, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, + 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x05, + 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x27, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc9, 0x03, 0x0a, 0x09, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, + 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x04, 0x65, 0x63, + 0x68, 0x6f, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x63, 0x68, 0x6f, 0x48, + 0x00, 0x52, 0x04, 0x65, 0x63, 0x68, 0x6f, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, + 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, + 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x20, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xfc, 0x02, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x65, 0x63, 0x68, 0x6f, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, + 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x45, 0x63, 0x68, 0x6f, 0x48, + 0x00, 0x52, 0x04, 0x65, 0x63, 0x68, 0x6f, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, + 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, + 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x1e, 0x0a, 0x04, 0x45, 0x63, 0x68, - 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0xca, 0x06, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, - 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x71, 0x61, 0x6e, - 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, - 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x09, - 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, - 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, - 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x39, 0x0a, - 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, - 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, - 0x6f, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, - 0xdb, 0x05, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, - 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, - 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, - 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x38, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, - 0x0a, 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, - 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, - 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, - 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, - 0x41, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, - 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, - 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, - 0x10, 0x02, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, - 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4a, 0x53, - 0x4f, 0x4e, 0x10, 0x03, 0x32, 0x41, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, - 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x14, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x15, 0x5a, 0x13, 0x61, 0x70, 0x69, 0x2f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x3b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x1e, 0x0a, 0x04, 0x45, 0x63, 0x68, 0x6f, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xca, 0x06, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, 0x0a, + 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, + 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x21, 0x0a, + 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, + 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x74, 0x6f, + 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, + 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, + 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x08, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, + 0x62, 0x12, 0x39, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, + 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, + 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x0a, + 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, + 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, 0x62, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x22, 0xdb, 0x05, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, + 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, + 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x21, + 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, + 0x67, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, + 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, + 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x38, 0x0a, 0x0a, + 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x2a, 0xc4, 0x01, 0x0a, 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, + 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x27, + 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, + 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, + 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, + 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, + 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, + 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, + 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, + 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, + 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, + 0x4c, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x03, 0x32, 0x41, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x38, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x13, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x1a, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x15, 0x5a, 0x13, 0x61, + 0x70, 0x69, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x3b, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5208,7 +5445,7 @@ func file_agentpb_agent_proto_rawDescGZIP() []byte { } var file_agentpb_agent_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_agentpb_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 65) +var file_agentpb_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 68) var file_agentpb_agent_proto_goTypes = []interface{}{ (MysqlExplainOutputFormat)(0), // 0: agent.MysqlExplainOutputFormat (*TextFiles)(nil), // 1: agent.TextFiles @@ -5271,26 +5508,29 @@ var file_agentpb_agent_proto_goTypes = []interface{}{ (*CheckConnectionResponse_Stats)(nil), // 58: agent.CheckConnectionResponse.Stats (*StartJobRequest_Echo)(nil), // 59: agent.StartJobRequest.Echo (*StartJobRequest_MySQLBackup)(nil), // 60: agent.StartJobRequest.MySQLBackup - (*JobResult_Error)(nil), // 61: agent.JobResult.Error - (*JobResult_Echo)(nil), // 62: agent.JobResult.Echo - (*JobResult_MySQLBackup)(nil), // 63: agent.JobResult.MySQLBackup - (*JobProgress_Echo)(nil), // 64: agent.JobProgress.Echo - (*JobProgress_MySQLBackup)(nil), // 65: agent.JobProgress.MySQLBackup - (*timestamp.Timestamp)(nil), // 66: google.protobuf.Timestamp - (*MetricsBucket)(nil), // 67: agent.MetricsBucket - (inventorypb.AgentStatus)(0), // 68: inventory.AgentStatus - (*duration.Duration)(nil), // 69: google.protobuf.Duration - (inventorypb.ServiceType)(0), // 70: inventory.ServiceType - (inventorypb.AgentType)(0), // 71: inventory.AgentType + (*StartJobRequest_MySQLRestoreBackup)(nil), // 61: agent.StartJobRequest.MySQLRestoreBackup + (*JobResult_Error)(nil), // 62: agent.JobResult.Error + (*JobResult_Echo)(nil), // 63: agent.JobResult.Echo + (*JobResult_MySQLBackup)(nil), // 64: agent.JobResult.MySQLBackup + (*JobResult_MySQLRestoreBackup)(nil), // 65: agent.JobResult.MySQLRestoreBackup + (*JobProgress_Echo)(nil), // 66: agent.JobProgress.Echo + (*JobProgress_MySQLBackup)(nil), // 67: agent.JobProgress.MySQLBackup + (*JobProgress_MySQLRestoreBackup)(nil), // 68: agent.JobProgress.MySQLRestoreBackup + (*timestamp.Timestamp)(nil), // 69: google.protobuf.Timestamp + (*MetricsBucket)(nil), // 70: agent.MetricsBucket + (inventorypb.AgentStatus)(0), // 71: inventory.AgentStatus + (*duration.Duration)(nil), // 72: google.protobuf.Duration + (inventorypb.ServiceType)(0), // 73: inventory.ServiceType + (inventorypb.AgentType)(0), // 74: inventory.AgentType } var file_agentpb_agent_proto_depIdxs = []int32{ 33, // 0: agent.TextFiles.files:type_name -> agent.TextFiles.FilesEntry - 66, // 1: agent.Pong.current_time:type_name -> google.protobuf.Timestamp - 67, // 2: agent.QANCollectRequest.metrics_bucket:type_name -> agent.MetricsBucket - 68, // 3: agent.StateChangedRequest.status:type_name -> inventory.AgentStatus + 69, // 1: agent.Pong.current_time:type_name -> google.protobuf.Timestamp + 70, // 2: agent.QANCollectRequest.metrics_bucket:type_name -> agent.MetricsBucket + 71, // 3: agent.StateChangedRequest.status:type_name -> inventory.AgentStatus 35, // 4: agent.SetStateRequest.agent_processes:type_name -> agent.SetStateRequest.AgentProcessesEntry 37, // 5: agent.SetStateRequest.builtin_agents:type_name -> agent.SetStateRequest.BuiltinAgentsEntry - 66, // 6: agent.QueryActionValue.timestamp:type_name -> google.protobuf.Timestamp + 69, // 6: agent.QueryActionValue.timestamp:type_name -> google.protobuf.Timestamp 11, // 7: agent.QueryActionValue.slice:type_name -> agent.QueryActionSlice 12, // 8: agent.QueryActionValue.map:type_name -> agent.QueryActionMap 10, // 9: agent.QueryActionSlice.slice:type_name -> agent.QueryActionValue @@ -5315,74 +5555,78 @@ var file_agentpb_agent_proto_depIdxs = []int32{ 55, // 28: agent.StartActionRequest.mongodb_query_getparameter_params:type_name -> agent.StartActionRequest.MongoDBQueryGetParameterParams 56, // 29: agent.StartActionRequest.mongodb_query_buildinfo_params:type_name -> agent.StartActionRequest.MongoDBQueryBuildInfoParams 57, // 30: agent.StartActionRequest.mongodb_query_getcmdlineopts_params:type_name -> agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams - 69, // 31: agent.StartActionRequest.timeout:type_name -> google.protobuf.Duration - 70, // 32: agent.CheckConnectionRequest.type:type_name -> inventory.ServiceType - 69, // 33: agent.CheckConnectionRequest.timeout:type_name -> google.protobuf.Duration + 72, // 31: agent.StartActionRequest.timeout:type_name -> google.protobuf.Duration + 73, // 32: agent.CheckConnectionRequest.type:type_name -> inventory.ServiceType + 72, // 33: agent.CheckConnectionRequest.timeout:type_name -> google.protobuf.Duration 1, // 34: agent.CheckConnectionRequest.text_files:type_name -> agent.TextFiles 58, // 35: agent.CheckConnectionResponse.stats:type_name -> agent.CheckConnectionResponse.Stats - 69, // 36: agent.StartJobRequest.timeout:type_name -> google.protobuf.Duration + 72, // 36: agent.StartJobRequest.timeout:type_name -> google.protobuf.Duration 59, // 37: agent.StartJobRequest.echo:type_name -> agent.StartJobRequest.Echo 60, // 38: agent.StartJobRequest.mysql_backup:type_name -> agent.StartJobRequest.MySQLBackup - 66, // 39: agent.JobResult.timestamp:type_name -> google.protobuf.Timestamp - 61, // 40: agent.JobResult.error:type_name -> agent.JobResult.Error - 62, // 41: agent.JobResult.echo:type_name -> agent.JobResult.Echo - 63, // 42: agent.JobResult.mysql_backup:type_name -> agent.JobResult.MySQLBackup - 66, // 43: agent.JobProgress.timestamp:type_name -> google.protobuf.Timestamp - 64, // 44: agent.JobProgress.echo:type_name -> agent.JobProgress.Echo - 65, // 45: agent.JobProgress.mysql_backup:type_name -> agent.JobProgress.MySQLBackup - 2, // 46: agent.AgentMessage.ping:type_name -> agent.Ping - 6, // 47: agent.AgentMessage.state_changed:type_name -> agent.StateChangedRequest - 4, // 48: agent.AgentMessage.qan_collect:type_name -> agent.QANCollectRequest - 18, // 49: agent.AgentMessage.action_result:type_name -> agent.ActionResultRequest - 3, // 50: agent.AgentMessage.pong:type_name -> agent.Pong - 9, // 51: agent.AgentMessage.set_state:type_name -> agent.SetStateResponse - 15, // 52: agent.AgentMessage.start_action:type_name -> agent.StartActionResponse - 17, // 53: agent.AgentMessage.stop_action:type_name -> agent.StopActionResponse - 21, // 54: agent.AgentMessage.check_connection:type_name -> agent.CheckConnectionResponse - 26, // 55: agent.AgentMessage.start_job:type_name -> agent.StartJobResponse - 28, // 56: agent.AgentMessage.stop_job:type_name -> agent.StopJobResponse - 23, // 57: agent.AgentMessage.job_status:type_name -> agent.JobStatusResponse - 29, // 58: agent.AgentMessage.job_result:type_name -> agent.JobResult - 30, // 59: agent.AgentMessage.job_progress:type_name -> agent.JobProgress - 3, // 60: agent.ServerMessage.pong:type_name -> agent.Pong - 7, // 61: agent.ServerMessage.state_changed:type_name -> agent.StateChangedResponse - 5, // 62: agent.ServerMessage.qan_collect:type_name -> agent.QANCollectResponse - 19, // 63: agent.ServerMessage.action_result:type_name -> agent.ActionResultResponse - 2, // 64: agent.ServerMessage.ping:type_name -> agent.Ping - 8, // 65: agent.ServerMessage.set_state:type_name -> agent.SetStateRequest - 14, // 66: agent.ServerMessage.start_action:type_name -> agent.StartActionRequest - 16, // 67: agent.ServerMessage.stop_action:type_name -> agent.StopActionRequest - 20, // 68: agent.ServerMessage.check_connection:type_name -> agent.CheckConnectionRequest - 25, // 69: agent.ServerMessage.start_job:type_name -> agent.StartJobRequest - 27, // 70: agent.ServerMessage.stop_job:type_name -> agent.StopJobRequest - 22, // 71: agent.ServerMessage.job_status:type_name -> agent.JobStatusRequest - 71, // 72: agent.SetStateRequest.AgentProcess.type:type_name -> inventory.AgentType - 38, // 73: agent.SetStateRequest.AgentProcess.text_files:type_name -> agent.SetStateRequest.AgentProcess.TextFilesEntry - 34, // 74: agent.SetStateRequest.AgentProcessesEntry.value:type_name -> agent.SetStateRequest.AgentProcess - 71, // 75: agent.SetStateRequest.BuiltinAgent.type:type_name -> inventory.AgentType - 1, // 76: agent.SetStateRequest.BuiltinAgent.text_files:type_name -> agent.TextFiles - 36, // 77: agent.SetStateRequest.BuiltinAgentsEntry.value:type_name -> agent.SetStateRequest.BuiltinAgent - 10, // 78: agent.QueryActionMap.MapEntry.value:type_name -> agent.QueryActionValue - 0, // 79: agent.StartActionRequest.MySQLExplainParams.output_format:type_name -> agent.MysqlExplainOutputFormat - 1, // 80: agent.StartActionRequest.MySQLExplainParams.tls_files:type_name -> agent.TextFiles - 1, // 81: agent.StartActionRequest.MySQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles - 1, // 82: agent.StartActionRequest.MySQLShowTableStatusParams.tls_files:type_name -> agent.TextFiles - 1, // 83: agent.StartActionRequest.MySQLShowIndexParams.tls_files:type_name -> agent.TextFiles - 1, // 84: agent.StartActionRequest.MongoDBExplainParams.text_files:type_name -> agent.TextFiles - 1, // 85: agent.StartActionRequest.MySQLQueryShowParams.tls_files:type_name -> agent.TextFiles - 1, // 86: agent.StartActionRequest.MySQLQuerySelectParams.tls_files:type_name -> agent.TextFiles - 1, // 87: agent.StartActionRequest.MongoDBQueryGetParameterParams.text_files:type_name -> agent.TextFiles - 1, // 88: agent.StartActionRequest.MongoDBQueryBuildInfoParams.text_files:type_name -> agent.TextFiles - 1, // 89: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams.text_files:type_name -> agent.TextFiles - 69, // 90: agent.StartJobRequest.Echo.delay:type_name -> google.protobuf.Duration - 24, // 91: agent.StartJobRequest.MySQLBackup.s3_config:type_name -> agent.S3LocationConfig - 31, // 92: agent.Agent.Connect:input_type -> agent.AgentMessage - 32, // 93: agent.Agent.Connect:output_type -> agent.ServerMessage - 93, // [93:94] is the sub-list for method output_type - 92, // [92:93] is the sub-list for method input_type - 92, // [92:92] is the sub-list for extension type_name - 92, // [92:92] is the sub-list for extension extendee - 0, // [0:92] is the sub-list for field type_name + 61, // 39: agent.StartJobRequest.mysql_restore_backup:type_name -> agent.StartJobRequest.MySQLRestoreBackup + 69, // 40: agent.JobResult.timestamp:type_name -> google.protobuf.Timestamp + 62, // 41: agent.JobResult.error:type_name -> agent.JobResult.Error + 63, // 42: agent.JobResult.echo:type_name -> agent.JobResult.Echo + 64, // 43: agent.JobResult.mysql_backup:type_name -> agent.JobResult.MySQLBackup + 65, // 44: agent.JobResult.mysql_restore_backup:type_name -> agent.JobResult.MySQLRestoreBackup + 69, // 45: agent.JobProgress.timestamp:type_name -> google.protobuf.Timestamp + 66, // 46: agent.JobProgress.echo:type_name -> agent.JobProgress.Echo + 67, // 47: agent.JobProgress.mysql_backup:type_name -> agent.JobProgress.MySQLBackup + 68, // 48: agent.JobProgress.mysql_restore_backup:type_name -> agent.JobProgress.MySQLRestoreBackup + 2, // 49: agent.AgentMessage.ping:type_name -> agent.Ping + 6, // 50: agent.AgentMessage.state_changed:type_name -> agent.StateChangedRequest + 4, // 51: agent.AgentMessage.qan_collect:type_name -> agent.QANCollectRequest + 18, // 52: agent.AgentMessage.action_result:type_name -> agent.ActionResultRequest + 3, // 53: agent.AgentMessage.pong:type_name -> agent.Pong + 9, // 54: agent.AgentMessage.set_state:type_name -> agent.SetStateResponse + 15, // 55: agent.AgentMessage.start_action:type_name -> agent.StartActionResponse + 17, // 56: agent.AgentMessage.stop_action:type_name -> agent.StopActionResponse + 21, // 57: agent.AgentMessage.check_connection:type_name -> agent.CheckConnectionResponse + 26, // 58: agent.AgentMessage.start_job:type_name -> agent.StartJobResponse + 28, // 59: agent.AgentMessage.stop_job:type_name -> agent.StopJobResponse + 23, // 60: agent.AgentMessage.job_status:type_name -> agent.JobStatusResponse + 29, // 61: agent.AgentMessage.job_result:type_name -> agent.JobResult + 30, // 62: agent.AgentMessage.job_progress:type_name -> agent.JobProgress + 3, // 63: agent.ServerMessage.pong:type_name -> agent.Pong + 7, // 64: agent.ServerMessage.state_changed:type_name -> agent.StateChangedResponse + 5, // 65: agent.ServerMessage.qan_collect:type_name -> agent.QANCollectResponse + 19, // 66: agent.ServerMessage.action_result:type_name -> agent.ActionResultResponse + 2, // 67: agent.ServerMessage.ping:type_name -> agent.Ping + 8, // 68: agent.ServerMessage.set_state:type_name -> agent.SetStateRequest + 14, // 69: agent.ServerMessage.start_action:type_name -> agent.StartActionRequest + 16, // 70: agent.ServerMessage.stop_action:type_name -> agent.StopActionRequest + 20, // 71: agent.ServerMessage.check_connection:type_name -> agent.CheckConnectionRequest + 25, // 72: agent.ServerMessage.start_job:type_name -> agent.StartJobRequest + 27, // 73: agent.ServerMessage.stop_job:type_name -> agent.StopJobRequest + 22, // 74: agent.ServerMessage.job_status:type_name -> agent.JobStatusRequest + 74, // 75: agent.SetStateRequest.AgentProcess.type:type_name -> inventory.AgentType + 38, // 76: agent.SetStateRequest.AgentProcess.text_files:type_name -> agent.SetStateRequest.AgentProcess.TextFilesEntry + 34, // 77: agent.SetStateRequest.AgentProcessesEntry.value:type_name -> agent.SetStateRequest.AgentProcess + 74, // 78: agent.SetStateRequest.BuiltinAgent.type:type_name -> inventory.AgentType + 1, // 79: agent.SetStateRequest.BuiltinAgent.text_files:type_name -> agent.TextFiles + 36, // 80: agent.SetStateRequest.BuiltinAgentsEntry.value:type_name -> agent.SetStateRequest.BuiltinAgent + 10, // 81: agent.QueryActionMap.MapEntry.value:type_name -> agent.QueryActionValue + 0, // 82: agent.StartActionRequest.MySQLExplainParams.output_format:type_name -> agent.MysqlExplainOutputFormat + 1, // 83: agent.StartActionRequest.MySQLExplainParams.tls_files:type_name -> agent.TextFiles + 1, // 84: agent.StartActionRequest.MySQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles + 1, // 85: agent.StartActionRequest.MySQLShowTableStatusParams.tls_files:type_name -> agent.TextFiles + 1, // 86: agent.StartActionRequest.MySQLShowIndexParams.tls_files:type_name -> agent.TextFiles + 1, // 87: agent.StartActionRequest.MongoDBExplainParams.text_files:type_name -> agent.TextFiles + 1, // 88: agent.StartActionRequest.MySQLQueryShowParams.tls_files:type_name -> agent.TextFiles + 1, // 89: agent.StartActionRequest.MySQLQuerySelectParams.tls_files:type_name -> agent.TextFiles + 1, // 90: agent.StartActionRequest.MongoDBQueryGetParameterParams.text_files:type_name -> agent.TextFiles + 1, // 91: agent.StartActionRequest.MongoDBQueryBuildInfoParams.text_files:type_name -> agent.TextFiles + 1, // 92: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams.text_files:type_name -> agent.TextFiles + 72, // 93: agent.StartJobRequest.Echo.delay:type_name -> google.protobuf.Duration + 24, // 94: agent.StartJobRequest.MySQLBackup.s3_config:type_name -> agent.S3LocationConfig + 24, // 95: agent.StartJobRequest.MySQLRestoreBackup.s3_config:type_name -> agent.S3LocationConfig + 31, // 96: agent.Agent.Connect:input_type -> agent.AgentMessage + 32, // 97: agent.Agent.Connect:output_type -> agent.ServerMessage + 97, // [97:98] is the sub-list for method output_type + 96, // [96:97] is the sub-list for method input_type + 96, // [96:96] is the sub-list for extension type_name + 96, // [96:96] is the sub-list for extension extendee + 0, // [0:96] is the sub-list for field type_name } func init() { file_agentpb_agent_proto_init() } @@ -6053,7 +6297,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobResult_Error); i { + switch v := v.(*StartJobRequest_MySQLRestoreBackup); i { case 0: return &v.state case 1: @@ -6065,7 +6309,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobResult_Echo); i { + switch v := v.(*JobResult_Error); i { case 0: return &v.state case 1: @@ -6077,7 +6321,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobResult_MySQLBackup); i { + switch v := v.(*JobResult_Echo); i { case 0: return &v.state case 1: @@ -6089,7 +6333,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobProgress_Echo); i { + switch v := v.(*JobResult_MySQLBackup); i { case 0: return &v.state case 1: @@ -6101,6 +6345,30 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JobResult_MySQLRestoreBackup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_agentpb_agent_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JobProgress_Echo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_agentpb_agent_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobProgress_MySQLBackup); i { case 0: return &v.state @@ -6112,6 +6380,18 @@ func file_agentpb_agent_proto_init() { return nil } } + file_agentpb_agent_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JobProgress_MySQLRestoreBackup); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_agentpb_agent_proto_msgTypes[9].OneofWrappers = []interface{}{ (*QueryActionValue_Nil)(nil), @@ -6147,15 +6427,18 @@ func file_agentpb_agent_proto_init() { file_agentpb_agent_proto_msgTypes[24].OneofWrappers = []interface{}{ (*StartJobRequest_Echo_)(nil), (*StartJobRequest_MysqlBackup)(nil), + (*StartJobRequest_MysqlRestoreBackup)(nil), } file_agentpb_agent_proto_msgTypes[28].OneofWrappers = []interface{}{ (*JobResult_Error_)(nil), (*JobResult_Echo_)(nil), (*JobResult_MysqlBackup)(nil), + (*JobResult_MysqlRestoreBackup)(nil), } file_agentpb_agent_proto_msgTypes[29].OneofWrappers = []interface{}{ (*JobProgress_Echo_)(nil), (*JobProgress_MysqlBackup)(nil), + (*JobProgress_MysqlRestoreBackup)(nil), } file_agentpb_agent_proto_msgTypes[30].OneofWrappers = []interface{}{ (*AgentMessage_Ping)(nil), @@ -6190,13 +6473,16 @@ func file_agentpb_agent_proto_init() { file_agentpb_agent_proto_msgTypes[59].OneofWrappers = []interface{}{ (*StartJobRequest_MySQLBackup_S3Config)(nil), } + file_agentpb_agent_proto_msgTypes[60].OneofWrappers = []interface{}{ + (*StartJobRequest_MySQLRestoreBackup_S3Config)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_agentpb_agent_proto_rawDesc, NumEnums: 1, - NumMessages: 65, + NumMessages: 68, NumExtensions: 0, NumServices: 1, }, diff --git a/api/agentpb/agent.proto b/api/agentpb/agent.proto index baf3320eff..aa61c952dc 100644 --- a/api/agentpb/agent.proto +++ b/api/agentpb/agent.proto @@ -404,12 +404,24 @@ message StartJobRequest { S3LocationConfig s3_config = 10; } } + // MySQLRestoreBackup is job for MySQL restore backup service. + message MySQLRestoreBackup { + // Service identifier where the backup should be restored. + string service_id = 1; + // Backup name. + string name = 2; + // Where backup is stored. + oneof location_config { + S3LocationConfig s3_config = 10; + } + } string job_id = 1; // Timeout for the job. google.protobuf.Duration timeout = 2; oneof job { Echo echo = 10; MySQLBackup mysql_backup = 11; + MySQLRestoreBackup mysql_restore_backup = 12; } } @@ -439,12 +451,16 @@ message JobResult { // MySQLBackup contains result for MySQL backup job. message MySQLBackup {} + // MySQLRestoreBackup contains result for MySQL restore backup job. + message MySQLRestoreBackup {} + string job_id = 1; google.protobuf.Timestamp timestamp = 2; oneof result { Error error = 10; Echo echo = 11; MySQLBackup mysql_backup = 12; + MySQLRestoreBackup mysql_restore_backup = 13; } } @@ -457,11 +473,15 @@ message JobProgress { // MySQLBackup contains backup job status update. message MySQLBackup {} + // MySQLRestoreBackup contains restore backup job status update. + message MySQLRestoreBackup {} + string job_id = 1; google.protobuf.Timestamp timestamp = 2; oneof result { Echo echo = 10; MySQLBackup mysql_backup = 11; + MySQLRestoreBackup mysql_restore_backup = 12; } } diff --git a/api/agentpb/agent.validator.pb.go b/api/agentpb/agent.validator.pb.go index 5201f3d9c7..1aa43e1b17 100644 --- a/api/agentpb/agent.validator.pb.go +++ b/api/agentpb/agent.validator.pb.go @@ -433,6 +433,13 @@ func (this *StartJobRequest) Validate() error { } } } + if oneOfNester, ok := this.GetJob().(*StartJobRequest_MysqlRestoreBackup); ok { + if oneOfNester.MysqlRestoreBackup != nil { + if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(oneOfNester.MysqlRestoreBackup); err != nil { + return github_com_mwitkow_go_proto_validators.FieldError("MysqlRestoreBackup", err) + } + } + } return nil } func (this *StartJobRequest_Echo) Validate() error { @@ -453,6 +460,16 @@ func (this *StartJobRequest_MySQLBackup) Validate() error { } return nil } +func (this *StartJobRequest_MySQLRestoreBackup) Validate() error { + if oneOfNester, ok := this.GetLocationConfig().(*StartJobRequest_MySQLRestoreBackup_S3Config); ok { + if oneOfNester.S3Config != nil { + if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(oneOfNester.S3Config); err != nil { + return github_com_mwitkow_go_proto_validators.FieldError("S3Config", err) + } + } + } + return nil +} func (this *StartJobResponse) Validate() error { return nil } @@ -489,6 +506,13 @@ func (this *JobResult) Validate() error { } } } + if oneOfNester, ok := this.GetResult().(*JobResult_MysqlRestoreBackup); ok { + if oneOfNester.MysqlRestoreBackup != nil { + if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(oneOfNester.MysqlRestoreBackup); err != nil { + return github_com_mwitkow_go_proto_validators.FieldError("MysqlRestoreBackup", err) + } + } + } return nil } func (this *JobResult_Error) Validate() error { @@ -500,6 +524,9 @@ func (this *JobResult_Echo) Validate() error { func (this *JobResult_MySQLBackup) Validate() error { return nil } +func (this *JobResult_MySQLRestoreBackup) Validate() error { + return nil +} func (this *JobProgress) Validate() error { if this.Timestamp != nil { if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(this.Timestamp); err != nil { @@ -520,6 +547,13 @@ func (this *JobProgress) Validate() error { } } } + if oneOfNester, ok := this.GetResult().(*JobProgress_MysqlRestoreBackup); ok { + if oneOfNester.MysqlRestoreBackup != nil { + if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(oneOfNester.MysqlRestoreBackup); err != nil { + return github_com_mwitkow_go_proto_validators.FieldError("MysqlRestoreBackup", err) + } + } + } return nil } func (this *JobProgress_Echo) Validate() error { @@ -528,6 +562,9 @@ func (this *JobProgress_Echo) Validate() error { func (this *JobProgress_MySQLBackup) Validate() error { return nil } +func (this *JobProgress_MySQLRestoreBackup) Validate() error { + return nil +} func (this *AgentMessage) Validate() error { if oneOfNester, ok := this.GetPayload().(*AgentMessage_Ping); ok { if oneOfNester.Ping != nil { diff --git a/api/managementpb/backup/backups.pb.go b/api/managementpb/backup/backups.pb.go index 5ceb87cec0..284a4534f5 100644 --- a/api/managementpb/backup/backups.pb.go +++ b/api/managementpb/backup/backups.pb.go @@ -204,6 +204,111 @@ func (x *StartBackupResponse) GetArtifactId() string { return "" } +type RestoreBackupRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Service identifier where backup should be restored. + ServiceId string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` + // Artifact id to restore. + ArtifactId string `protobuf:"bytes,2,opt,name=artifact_id,json=artifactId,proto3" json:"artifact_id,omitempty"` +} + +func (x *RestoreBackupRequest) Reset() { + *x = RestoreBackupRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_managementpb_backup_backups_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RestoreBackupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestoreBackupRequest) ProtoMessage() {} + +func (x *RestoreBackupRequest) ProtoReflect() protoreflect.Message { + mi := &file_managementpb_backup_backups_proto_msgTypes[2] + 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 RestoreBackupRequest.ProtoReflect.Descriptor instead. +func (*RestoreBackupRequest) Descriptor() ([]byte, []int) { + return file_managementpb_backup_backups_proto_rawDescGZIP(), []int{2} +} + +func (x *RestoreBackupRequest) GetServiceId() string { + if x != nil { + return x.ServiceId + } + return "" +} + +func (x *RestoreBackupRequest) GetArtifactId() string { + if x != nil { + return x.ArtifactId + } + return "" +} + +type RestoreBackupResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Unique restore identifier. + RestoreId string `protobuf:"bytes,1,opt,name=restore_id,json=restoreId,proto3" json:"restore_id,omitempty"` +} + +func (x *RestoreBackupResponse) Reset() { + *x = RestoreBackupResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_managementpb_backup_backups_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RestoreBackupResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestoreBackupResponse) ProtoMessage() {} + +func (x *RestoreBackupResponse) ProtoReflect() protoreflect.Message { + mi := &file_managementpb_backup_backups_proto_msgTypes[3] + 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 RestoreBackupResponse.ProtoReflect.Descriptor instead. +func (*RestoreBackupResponse) Descriptor() ([]byte, []int) { + return file_managementpb_backup_backups_proto_rawDescGZIP(), []int{3} +} + +func (x *RestoreBackupResponse) GetRestoreId() string { + if x != nil { + return x.RestoreId + } + return "" +} + var File_managementpb_backup_backups_proto protoreflect.FileDescriptor var file_managementpb_backup_backups_proto_rawDesc = []byte{ @@ -228,11 +333,21 @@ var file_managementpb_backup_backups_proto_rawDesc = []byte{ 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x36, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x64, 0x2a, 0x39, + 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x64, 0x22, 0x66, + 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, + 0x58, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x27, 0x0a, + 0x0b, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x06, 0xe2, 0xdf, 0x1f, 0x02, 0x58, 0x01, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x49, 0x64, 0x22, 0x36, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x64, 0x2a, 0x39, 0x0a, 0x09, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x54, 0x52, 0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x01, 0x12, 0x0a, 0x0a, - 0x06, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x02, 0x32, 0x98, 0x01, 0x0a, 0x07, 0x42, 0x61, + 0x06, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x10, 0x02, 0x32, 0xa9, 0x02, 0x0a, 0x07, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x22, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x61, 0x63, 0x6b, @@ -242,10 +357,19 @@ var file_managementpb_backup_backups_proto_rawDesc = []byte{ 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x22, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x2f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x3a, 0x01, 0x2a, 0x42, 0x27, 0x5a, 0x25, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x3b, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x3a, 0x01, 0x2a, 0x12, 0x8e, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x24, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x31, + 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x2f, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x2f, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x3a, 0x01, 0x2a, 0x42, 0x27, 0x5a, 0x25, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x3b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -261,17 +385,21 @@ func file_managementpb_backup_backups_proto_rawDescGZIP() []byte { } var file_managementpb_backup_backups_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_managementpb_backup_backups_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_managementpb_backup_backups_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_managementpb_backup_backups_proto_goTypes = []interface{}{ - (RetryMode)(0), // 0: backup.v1beta1.RetryMode - (*StartBackupRequest)(nil), // 1: backup.v1beta1.StartBackupRequest - (*StartBackupResponse)(nil), // 2: backup.v1beta1.StartBackupResponse + (RetryMode)(0), // 0: backup.v1beta1.RetryMode + (*StartBackupRequest)(nil), // 1: backup.v1beta1.StartBackupRequest + (*StartBackupResponse)(nil), // 2: backup.v1beta1.StartBackupResponse + (*RestoreBackupRequest)(nil), // 3: backup.v1beta1.RestoreBackupRequest + (*RestoreBackupResponse)(nil), // 4: backup.v1beta1.RestoreBackupResponse } var file_managementpb_backup_backups_proto_depIdxs = []int32{ 1, // 0: backup.v1beta1.Backups.StartBackup:input_type -> backup.v1beta1.StartBackupRequest - 2, // 1: backup.v1beta1.Backups.StartBackup:output_type -> backup.v1beta1.StartBackupResponse - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type + 3, // 1: backup.v1beta1.Backups.RestoreBackup:input_type -> backup.v1beta1.RestoreBackupRequest + 2, // 2: backup.v1beta1.Backups.StartBackup:output_type -> backup.v1beta1.StartBackupResponse + 4, // 3: backup.v1beta1.Backups.RestoreBackup:output_type -> backup.v1beta1.RestoreBackupResponse + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name @@ -307,6 +435,30 @@ func file_managementpb_backup_backups_proto_init() { return nil } } + file_managementpb_backup_backups_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreBackupRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_managementpb_backup_backups_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreBackupResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -314,7 +466,7 @@ func file_managementpb_backup_backups_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_managementpb_backup_backups_proto_rawDesc, NumEnums: 1, - NumMessages: 2, + NumMessages: 4, NumExtensions: 0, NumServices: 1, }, @@ -343,6 +495,8 @@ const _ = grpc.SupportPackageIsVersion6 type BackupsClient interface { // StartBackup request backup specified service to location. StartBackup(ctx context.Context, in *StartBackupRequest, opts ...grpc.CallOption) (*StartBackupResponse, error) + // RestoreBackup requests the backup restore. + RestoreBackup(ctx context.Context, in *RestoreBackupRequest, opts ...grpc.CallOption) (*RestoreBackupResponse, error) } type backupsClient struct { @@ -362,10 +516,21 @@ func (c *backupsClient) StartBackup(ctx context.Context, in *StartBackupRequest, return out, nil } +func (c *backupsClient) RestoreBackup(ctx context.Context, in *RestoreBackupRequest, opts ...grpc.CallOption) (*RestoreBackupResponse, error) { + out := new(RestoreBackupResponse) + err := c.cc.Invoke(ctx, "/backup.v1beta1.Backups/RestoreBackup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // BackupsServer is the server API for Backups service. type BackupsServer interface { // StartBackup request backup specified service to location. StartBackup(context.Context, *StartBackupRequest) (*StartBackupResponse, error) + // RestoreBackup requests the backup restore. + RestoreBackup(context.Context, *RestoreBackupRequest) (*RestoreBackupResponse, error) } // UnimplementedBackupsServer can be embedded to have forward compatible implementations. @@ -375,6 +540,9 @@ type UnimplementedBackupsServer struct { func (*UnimplementedBackupsServer) StartBackup(context.Context, *StartBackupRequest) (*StartBackupResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method StartBackup not implemented") } +func (*UnimplementedBackupsServer) RestoreBackup(context.Context, *RestoreBackupRequest) (*RestoreBackupResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RestoreBackup not implemented") +} func RegisterBackupsServer(s *grpc.Server, srv BackupsServer) { s.RegisterService(&_Backups_serviceDesc, srv) @@ -398,6 +566,24 @@ func _Backups_StartBackup_Handler(srv interface{}, ctx context.Context, dec func return interceptor(ctx, in, info, handler) } +func _Backups_RestoreBackup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RestoreBackupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BackupsServer).RestoreBackup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/backup.v1beta1.Backups/RestoreBackup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BackupsServer).RestoreBackup(ctx, req.(*RestoreBackupRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Backups_serviceDesc = grpc.ServiceDesc{ ServiceName: "backup.v1beta1.Backups", HandlerType: (*BackupsServer)(nil), @@ -406,6 +592,10 @@ var _Backups_serviceDesc = grpc.ServiceDesc{ MethodName: "StartBackup", Handler: _Backups_StartBackup_Handler, }, + { + MethodName: "RestoreBackup", + Handler: _Backups_RestoreBackup_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "managementpb/backup/backups.proto", diff --git a/api/managementpb/backup/backups.pb.gw.go b/api/managementpb/backup/backups.pb.gw.go index 8936e10f86..009d6c04e8 100644 --- a/api/managementpb/backup/backups.pb.gw.go +++ b/api/managementpb/backup/backups.pb.gw.go @@ -67,6 +67,40 @@ func local_request_Backups_StartBackup_0(ctx context.Context, marshaler runtime. } +func request_Backups_RestoreBackup_0(ctx context.Context, marshaler runtime.Marshaler, client BackupsClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RestoreBackupRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.RestoreBackup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Backups_RestoreBackup_0(ctx context.Context, marshaler runtime.Marshaler, server BackupsServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RestoreBackupRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.RestoreBackup(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterBackupsHandlerServer registers the http handlers for service Backups to "mux". // UnaryRPC :call BackupsServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -96,6 +130,29 @@ func RegisterBackupsHandlerServer(ctx context.Context, mux *runtime.ServeMux, se }) + mux.Handle("POST", pattern_Backups_RestoreBackup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Backups_RestoreBackup_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Backups_RestoreBackup_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -157,13 +214,37 @@ func RegisterBackupsHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl }) + mux.Handle("POST", pattern_Backups_RestoreBackup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Backups_RestoreBackup_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Backups_RestoreBackup_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } var ( pattern_Backups_StartBackup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"v1", "management", "backup", "Backups", "StartBackup"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Backups_RestoreBackup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"v1", "management", "backup", "Backups", "Restore"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( forward_Backups_StartBackup_0 = runtime.ForwardResponseMessage + + forward_Backups_RestoreBackup_0 = runtime.ForwardResponseMessage ) diff --git a/api/managementpb/backup/backups.proto b/api/managementpb/backup/backups.proto index 6aed315bbc..196eed19e4 100644 --- a/api/managementpb/backup/backups.proto +++ b/api/managementpb/backup/backups.proto @@ -38,6 +38,26 @@ message StartBackupResponse { string artifact_id = 1; } +message RestoreBackupRequest { + // Service identifier where backup should be restored. + string service_id = 1 [ + (validator.field) = { + string_not_empty: true + } + ]; + // Artifact id to restore. + string artifact_id = 2 [ + (validator.field) = { + string_not_empty: true + } + ]; +} + +message RestoreBackupResponse { + // Unique restore identifier. + string restore_id = 1; +} + // Backups service handles backup operations to DB. service Backups { // StartBackup request backup specified service to location. @@ -47,4 +67,11 @@ service Backups { body: "*" }; } + // RestoreBackup requests the backup restore. + rpc RestoreBackup(RestoreBackupRequest) returns (RestoreBackupResponse) { + option (google.api.http) = { + post: "/v1/management/backup/Backups/Restore" + body: "*" + }; + } } diff --git a/api/managementpb/backup/backups.validator.pb.go b/api/managementpb/backup/backups.validator.pb.go index 3f23b2693d..12ae086d4e 100644 --- a/api/managementpb/backup/backups.validator.pb.go +++ b/api/managementpb/backup/backups.validator.pb.go @@ -29,3 +29,15 @@ func (this *StartBackupRequest) Validate() error { func (this *StartBackupResponse) Validate() error { return nil } +func (this *RestoreBackupRequest) Validate() error { + if this.ServiceId == "" { + return github_com_mwitkow_go_proto_validators.FieldError("ServiceId", fmt.Errorf(`value '%v' must not be an empty string`, this.ServiceId)) + } + if this.ArtifactId == "" { + return github_com_mwitkow_go_proto_validators.FieldError("ArtifactId", fmt.Errorf(`value '%v' must not be an empty string`, this.ArtifactId)) + } + return nil +} +func (this *RestoreBackupResponse) Validate() error { + return nil +} diff --git a/api/managementpb/backup/json/backup.json b/api/managementpb/backup/json/backup.json index de2a857123..60ea293666 100644 --- a/api/managementpb/backup/json/backup.json +++ b/api/managementpb/backup/json/backup.json @@ -159,6 +159,91 @@ } } }, + "/v1/management/backup/Backups/Restore": { + "post": { + "tags": [ + "Backups" + ], + "summary": "RestoreBackup requests the backup restore.", + "operationId": "RestoreBackup", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "artifact_id": { + "description": "Artifact id to restore.", + "type": "string", + "x-order": 1 + }, + "service_id": { + "description": "Service identifier where backup should be restored.", + "type": "string", + "x-order": 0 + } + } + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "restore_id": { + "description": "Unique restore identifier.", + "type": "string", + "x-order": 0 + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32", + "x-order": 1 + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "x-order": 0 + }, + "value": { + "type": "string", + "format": "byte", + "x-order": 1 + } + } + }, + "x-order": 3 + }, + "error": { + "type": "string", + "x-order": 0 + }, + "message": { + "type": "string", + "x-order": 2 + } + } + } + } + } + } + }, "/v1/management/backup/Backups/StartBackup": { "post": { "tags": [ diff --git a/api/managementpb/backup/json/client/backups/backups_client.go b/api/managementpb/backup/json/client/backups/backups_client.go index 745156144b..abe6359a77 100644 --- a/api/managementpb/backup/json/client/backups/backups_client.go +++ b/api/managementpb/backup/json/client/backups/backups_client.go @@ -25,11 +25,46 @@ type Client struct { // ClientService is the interface for Client methods type ClientService interface { + RestoreBackup(params *RestoreBackupParams) (*RestoreBackupOK, error) + StartBackup(params *StartBackupParams) (*StartBackupOK, error) SetTransport(transport runtime.ClientTransport) } +/* + RestoreBackup restores backup requests the backup restore +*/ +func (a *Client) RestoreBackup(params *RestoreBackupParams) (*RestoreBackupOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewRestoreBackupParams() + } + + result, err := a.transport.Submit(&runtime.ClientOperation{ + ID: "RestoreBackup", + Method: "POST", + PathPattern: "/v1/management/backup/Backups/Restore", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http", "https"}, + Params: params, + Reader: &RestoreBackupReader{formats: a.formats}, + Context: params.Context, + Client: params.HTTPClient, + }) + if err != nil { + return nil, err + } + success, ok := result.(*RestoreBackupOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*RestoreBackupDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + /* StartBackup starts backup request backup specified service to location */ diff --git a/api/managementpb/backup/json/client/backups/restore_backup_parameters.go b/api/managementpb/backup/json/client/backups/restore_backup_parameters.go new file mode 100644 index 0000000000..48a32d72dc --- /dev/null +++ b/api/managementpb/backup/json/client/backups/restore_backup_parameters.go @@ -0,0 +1,131 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package backups + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" +) + +// NewRestoreBackupParams creates a new RestoreBackupParams object +// with the default values initialized. +func NewRestoreBackupParams() *RestoreBackupParams { + var () + return &RestoreBackupParams{ + + timeout: cr.DefaultTimeout, + } +} + +// NewRestoreBackupParamsWithTimeout creates a new RestoreBackupParams object +// with the default values initialized, and the ability to set a timeout on a request +func NewRestoreBackupParamsWithTimeout(timeout time.Duration) *RestoreBackupParams { + var () + return &RestoreBackupParams{ + + timeout: timeout, + } +} + +// NewRestoreBackupParamsWithContext creates a new RestoreBackupParams object +// with the default values initialized, and the ability to set a context for a request +func NewRestoreBackupParamsWithContext(ctx context.Context) *RestoreBackupParams { + var () + return &RestoreBackupParams{ + + Context: ctx, + } +} + +// NewRestoreBackupParamsWithHTTPClient creates a new RestoreBackupParams object +// with the default values initialized, and the ability to set a custom HTTPClient for a request +func NewRestoreBackupParamsWithHTTPClient(client *http.Client) *RestoreBackupParams { + var () + return &RestoreBackupParams{ + HTTPClient: client, + } +} + +/*RestoreBackupParams contains all the parameters to send to the API endpoint +for the restore backup operation typically these are written to a http.Request +*/ +type RestoreBackupParams struct { + + /*Body*/ + Body RestoreBackupBody + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithTimeout adds the timeout to the restore backup params +func (o *RestoreBackupParams) WithTimeout(timeout time.Duration) *RestoreBackupParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the restore backup params +func (o *RestoreBackupParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the restore backup params +func (o *RestoreBackupParams) WithContext(ctx context.Context) *RestoreBackupParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the restore backup params +func (o *RestoreBackupParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the restore backup params +func (o *RestoreBackupParams) WithHTTPClient(client *http.Client) *RestoreBackupParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the restore backup params +func (o *RestoreBackupParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithBody adds the body to the restore backup params +func (o *RestoreBackupParams) WithBody(body RestoreBackupBody) *RestoreBackupParams { + o.SetBody(body) + return o +} + +// SetBody adds the body to the restore backup params +func (o *RestoreBackupParams) SetBody(body RestoreBackupBody) { + o.Body = body +} + +// WriteToRequest writes these params to a swagger request +func (o *RestoreBackupParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + + if err := r.SetBodyParam(o.Body); err != nil { + return err + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/api/managementpb/backup/json/client/backups/restore_backup_responses.go b/api/managementpb/backup/json/client/backups/restore_backup_responses.go new file mode 100644 index 0000000000..52977e4d58 --- /dev/null +++ b/api/managementpb/backup/json/client/backups/restore_backup_responses.go @@ -0,0 +1,296 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package backups + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "fmt" + "io" + "strconv" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// RestoreBackupReader is a Reader for the RestoreBackup structure. +type RestoreBackupReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *RestoreBackupReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewRestoreBackupOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewRestoreBackupDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewRestoreBackupOK creates a RestoreBackupOK with default headers values +func NewRestoreBackupOK() *RestoreBackupOK { + return &RestoreBackupOK{} +} + +/*RestoreBackupOK handles this case with default header values. + +A successful response. +*/ +type RestoreBackupOK struct { + Payload *RestoreBackupOKBody +} + +func (o *RestoreBackupOK) Error() string { + return fmt.Sprintf("[POST /v1/management/backup/Backups/Restore][%d] restoreBackupOk %+v", 200, o.Payload) +} + +func (o *RestoreBackupOK) GetPayload() *RestoreBackupOKBody { + return o.Payload +} + +func (o *RestoreBackupOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + o.Payload = new(RestoreBackupOKBody) + + // response payload + if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewRestoreBackupDefault creates a RestoreBackupDefault with default headers values +func NewRestoreBackupDefault(code int) *RestoreBackupDefault { + return &RestoreBackupDefault{ + _statusCode: code, + } +} + +/*RestoreBackupDefault handles this case with default header values. + +An unexpected error response. +*/ +type RestoreBackupDefault struct { + _statusCode int + + Payload *RestoreBackupDefaultBody +} + +// Code gets the status code for the restore backup default response +func (o *RestoreBackupDefault) Code() int { + return o._statusCode +} + +func (o *RestoreBackupDefault) Error() string { + return fmt.Sprintf("[POST /v1/management/backup/Backups/Restore][%d] RestoreBackup default %+v", o._statusCode, o.Payload) +} + +func (o *RestoreBackupDefault) GetPayload() *RestoreBackupDefaultBody { + return o.Payload +} + +func (o *RestoreBackupDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + o.Payload = new(RestoreBackupDefaultBody) + + // response payload + if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +/*DetailsItems0 details items0 +swagger:model DetailsItems0 +*/ +type DetailsItems0 struct { + + // type url + TypeURL string `json:"type_url,omitempty"` + + // value + // Format: byte + Value strfmt.Base64 `json:"value,omitempty"` +} + +// Validate validates this details items0 +func (o *DetailsItems0) Validate(formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *DetailsItems0) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *DetailsItems0) UnmarshalBinary(b []byte) error { + var res DetailsItems0 + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/*RestoreBackupBody restore backup body +swagger:model RestoreBackupBody +*/ +type RestoreBackupBody struct { + + // Service identifier where backup should be restored. + ServiceID string `json:"service_id,omitempty"` + + // Artifact id to restore. + ArtifactID string `json:"artifact_id,omitempty"` +} + +// Validate validates this restore backup body +func (o *RestoreBackupBody) Validate(formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *RestoreBackupBody) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *RestoreBackupBody) UnmarshalBinary(b []byte) error { + var res RestoreBackupBody + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/*RestoreBackupDefaultBody restore backup default body +swagger:model RestoreBackupDefaultBody +*/ +type RestoreBackupDefaultBody struct { + + // error + Error string `json:"error,omitempty"` + + // code + Code int32 `json:"code,omitempty"` + + // message + Message string `json:"message,omitempty"` + + // details + Details []*DetailsItems0 `json:"details"` +} + +// Validate validates this restore backup default body +func (o *RestoreBackupDefaultBody) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateDetails(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *RestoreBackupDefaultBody) validateDetails(formats strfmt.Registry) error { + + if swag.IsZero(o.Details) { // not required + return nil + } + + for i := 0; i < len(o.Details); i++ { + if swag.IsZero(o.Details[i]) { // not required + continue + } + + if o.Details[i] != nil { + if err := o.Details[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("RestoreBackup default" + "." + "details" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// MarshalBinary interface implementation +func (o *RestoreBackupDefaultBody) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *RestoreBackupDefaultBody) UnmarshalBinary(b []byte) error { + var res RestoreBackupDefaultBody + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/*RestoreBackupOKBody restore backup OK body +swagger:model RestoreBackupOKBody +*/ +type RestoreBackupOKBody struct { + + // Unique restore identifier. + RestoreID string `json:"restore_id,omitempty"` +} + +// Validate validates this restore backup OK body +func (o *RestoreBackupOKBody) Validate(formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *RestoreBackupOKBody) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *RestoreBackupOKBody) UnmarshalBinary(b []byte) error { + var res RestoreBackupOKBody + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/managementpb/backup/json/client/backups/start_backup_responses.go b/api/managementpb/backup/json/client/backups/start_backup_responses.go index 3a30b3f904..6129614197 100644 --- a/api/managementpb/backup/json/client/backups/start_backup_responses.go +++ b/api/managementpb/backup/json/client/backups/start_backup_responses.go @@ -117,42 +117,6 @@ func (o *StartBackupDefault) readResponse(response runtime.ClientResponse, consu return nil } -/*DetailsItems0 details items0 -swagger:model DetailsItems0 -*/ -type DetailsItems0 struct { - - // type url - TypeURL string `json:"type_url,omitempty"` - - // value - // Format: byte - Value strfmt.Base64 `json:"value,omitempty"` -} - -// Validate validates this details items0 -func (o *DetailsItems0) Validate(formats strfmt.Registry) error { - return nil -} - -// MarshalBinary interface implementation -func (o *DetailsItems0) MarshalBinary() ([]byte, error) { - if o == nil { - return nil, nil - } - return swag.WriteJSON(o) -} - -// UnmarshalBinary interface implementation -func (o *DetailsItems0) UnmarshalBinary(b []byte) error { - var res DetailsItems0 - if err := swag.ReadJSON(b, &res); err != nil { - return err - } - *o = res - return nil -} - /*StartBackupBody start backup body swagger:model StartBackupBody */ diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 344db6d308..8399a1e6eb 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -24415,6 +24415,91 @@ } } }, + "/v1/management/backup/Backups/Restore": { + "post": { + "tags": [ + "Backups" + ], + "summary": "RestoreBackup requests the backup restore.", + "operationId": "RestoreBackup", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "service_id": { + "description": "Service identifier where backup should be restored.", + "type": "string", + "x-order": 0 + }, + "artifact_id": { + "description": "Artifact id to restore.", + "type": "string", + "x-order": 1 + } + } + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "restore_id": { + "description": "Unique restore identifier.", + "type": "string", + "x-order": 0 + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string", + "x-order": 0 + }, + "code": { + "type": "integer", + "format": "int32", + "x-order": 1 + }, + "message": { + "type": "string", + "x-order": 2 + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type_url": { + "type": "string", + "x-order": 0 + }, + "value": { + "type": "string", + "format": "byte", + "x-order": 1 + } + } + }, + "x-order": 3 + } + } + } + } + } + } + }, "/v1/management/backup/Backups/StartBackup": { "post": { "tags": [