From 0cd2a35ab52b9f86d69b385ef183187c5e224cf3 Mon Sep 17 00:00:00 2001 From: Nirav Parikh <52062717+niravparikh05@users.noreply.github.com> Date: Wed, 28 Feb 2024 10:41:10 +0530 Subject: [PATCH] expose cluster status update rpc (#296) * expose cluster status update rpc Signed-off-by: Nirav Parikh * added cluster rpc to relay peering rpc server listener Signed-off-by: Nirav Parikh --------- Signed-off-by: Nirav Parikh --- .../proto/rpc/scheduler/cluster.swagger.json | 264 +++++++- internal/cluster/conditions.go | 4 + internal/cluster/constants/constants.go | 25 +- main.go | 12 +- proto/rpc/scheduler/cluster.pb.go | 577 ++++++++++++++---- proto/rpc/scheduler/cluster.pb.gw.go | 280 +++++++++ proto/rpc/scheduler/cluster.proto | 31 + proto/rpc/scheduler/cluster_grpc.pb.go | 86 ++- proto/rpc/scheduler/internal.go | 30 +- proto/types/commonpb/v3/common.pb.go | 94 +-- proto/types/commonpb/v3/common.proto | 3 + proto/types/infrapb/v3/cluster.pb.go | 90 +-- proto/types/infrapb/v3/cluster.proto | 1 + .../permissions/base/cluster_write.json | 6 + server/cluster.go | 27 +- 15 files changed, 1271 insertions(+), 259 deletions(-) diff --git a/gen/openapi/proto/rpc/scheduler/cluster.swagger.json b/gen/openapi/proto/rpc/scheduler/cluster.swagger.json index bf1fae3..fbf0abd 100644 --- a/gen/openapi/proto/rpc/scheduler/cluster.swagger.json +++ b/gen/openapi/proto/rpc/scheduler/cluster.swagger.json @@ -1718,6 +1718,248 @@ ] } }, + "/infra/v3/project/{metadata.project}/cluster/{metadata.name}/status": { + "get": { + "operationId": "ClusterService_GetClusterStatus", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v3GetClusterStatusResponse" + } + }, + "403": { + "description": "Returned when the user does not have permission to access the resource.", + "schema": {} + }, + "404": { + "description": "Returned when the resource does not exist.", + "schema": { + "type": "string", + "format": "string" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "metadata.project", + "description": "Project of the resource", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "metadata.name", + "description": "name of the resource", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "metadata.displayName", + "description": "Display Name\n\ndisplay name of the resource", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "metadata.description", + "description": "Description\n\ndescription of the resource", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "metadata.labels", + "description": "Labels\n\nThis is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "metadata.annotations", + "description": "Annotations\n\nThis is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "metadata.organization", + "description": "Organization\n\nOrganization to which the resource belongs", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "metadata.partner", + "description": "Partner\n\nPartner to which the resource belongs", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "metadata.id", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "metadata.urlScope", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "metadata.createdAt", + "in": "query", + "required": false, + "type": "string", + "format": "date-time" + }, + { + "name": "metadata.modifiedAt", + "in": "query", + "required": false, + "type": "string", + "format": "date-time" + } + ], + "tags": [ + "ClusterService" + ] + }, + "put": { + "operationId": "ClusterService_UpdateClusterStatus", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v3UpdateClusterStatusResponse" + } + }, + "403": { + "description": "Returned when the user does not have permission to access the resource.", + "schema": {} + }, + "404": { + "description": "Returned when the resource does not exist.", + "schema": { + "type": "string", + "format": "string" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "metadata.project", + "description": "Project of the resource", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "metadata.name", + "description": "name of the resource", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "metadata": { + "type": "object", + "example": { + "name": "some-name", + "project": "defaultproject" + }, + "properties": { + "displayName": { + "type": "string", + "description": "display name of the resource", + "title": "Display Name" + }, + "description": { + "type": "string", + "description": "description of the resource", + "title": "Description" + }, + "labels": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "labels of the resource", + "title": "Labels" + }, + "annotations": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "annotations of the resource", + "title": "Annotations" + }, + "organization": { + "type": "string", + "description": "Organization to which the resource belongs", + "title": "Organization" + }, + "partner": { + "type": "string", + "description": "Partner to which the resource belongs", + "title": "Partner" + }, + "id": { + "type": "string", + "readOnly": true + }, + "urlScope": { + "type": "string", + "readOnly": true + }, + "createdAt": { + "type": "string", + "format": "date-time", + "readOnly": true + }, + "modifiedAt": { + "type": "string", + "format": "date-time", + "readOnly": true + } + }, + "description": "metadata of the resource", + "title": "Metadata" + }, + "clusterStatus": { + "$ref": "#/definitions/v3ClusterStatus" + } + } + } + } + ], + "tags": [ + "ClusterService" + ] + } + }, "/infra/v3/project/{project}/cluster": { "get": { "operationId": "ClusterService_GetClusters", @@ -2214,7 +2456,8 @@ "ClusterReady", "ClusterAuxiliaryTaskSync", "ClusterBootstrapAgent", - "ClusterDelete" + "ClusterDelete", + "ClusterHealth" ], "default": "ClusterBlueprintSync" }, @@ -2520,6 +2763,17 @@ "v3DeleteClusterResponse": { "type": "object" }, + "v3GetClusterStatusResponse": { + "type": "object", + "properties": { + "metadata": { + "$ref": "#/definitions/v3Metadata" + }, + "clusterStatus": { + "$ref": "#/definitions/v3ClusterStatus" + } + } + }, "v3Health": { "type": "string", "enum": [ @@ -2718,7 +2972,10 @@ "Stopped", "Expired", "Stopping", - "Submitted" + "Submitted", + "Healthy", + "Unhealthy", + "Disconnected" ], "default": "NotSet", "title": "ParalusConditionStatus is the status of the status condition" @@ -2837,6 +3094,9 @@ "format": "int64" } } + }, + "v3UpdateClusterStatusResponse": { + "type": "object" } }, "securityDefinitions": { diff --git a/internal/cluster/conditions.go b/internal/cluster/conditions.go index 8b06cc8..5cc2b67 100644 --- a/internal/cluster/conditions.go +++ b/internal/cluster/conditions.go @@ -38,6 +38,7 @@ var ( NewClusterAuxiliaryTaskSync ClusterConditionFunc = newClusterCondition(infrav3.ClusterConditionType_ClusterAuxiliaryTaskSync) NewClusterBootstrapAgent ClusterConditionFunc = newClusterCondition(infrav3.ClusterConditionType_ClusterBootstrapAgent) NewClusterDelete ClusterConditionFunc = newClusterCondition(infrav3.ClusterConditionType_ClusterDelete) + NewClusterHealth ClusterConditionFunc = newClusterCondition(infrav3.ClusterConditionType_ClusterHealth) IsClusterBootstrapAgentPending ClusterConditionReadyFunc = isClusterCondition(constants.Pending, infrav3.ClusterConditionType_ClusterBootstrapAgent) IsClusterBootstrapAgentRetry ClusterConditionReadyFunc = isClusterCondition(constants.Retry, infrav3.ClusterConditionType_ClusterBootstrapAgent) @@ -53,6 +54,9 @@ var ( IsClusterDeleteRetry ClusterConditionReadyFunc = isClusterCondition(constants.Retry, infrav3.ClusterConditionType_ClusterDelete) IsClusterDeleted ClusterConditionReadyFunc = isClusterCondition(constants.Success, infrav3.ClusterConditionType_ClusterDelete) IsClusterDeleteNotSet ClusterConditionReadyFunc = isClusterCondition(constants.NotSet, infrav3.ClusterConditionType_ClusterDelete) + IsClusterHealthy ClusterConditionReadyFunc = isClusterCondition(constants.Healthy, infrav3.ClusterConditionType_ClusterHealth) + IsClusterUnhealthy ClusterConditionReadyFunc = isClusterCondition(constants.Unhealthy, infrav3.ClusterConditionType_ClusterHealth) + IsClusterDisconnected ClusterConditionReadyFunc = isClusterCondition(constants.Disconnected, infrav3.ClusterConditionType_ClusterHealth) NewNamespaceAssigned NamespaceConditionFunc = newNamespaceCondition(scheduler.ClusterNamespaceConditionType_ClusterNamespaceAssigned) NewNamespaceConverged NamespaceConditionFunc = newNamespaceCondition(scheduler.ClusterNamespaceConditionType_ClusterNamespaceConverged) diff --git a/internal/cluster/constants/constants.go b/internal/cluster/constants/constants.go index e55962e..cf69980 100644 --- a/internal/cluster/constants/constants.go +++ b/internal/cluster/constants/constants.go @@ -41,15 +41,18 @@ const ( ) const ( - NotSet = commonv3.ParalusConditionStatus_NotSet - Pending = commonv3.ParalusConditionStatus_Pending - InProgress = commonv3.ParalusConditionStatus_InProgress - Success = commonv3.ParalusConditionStatus_Success - Failed = commonv3.ParalusConditionStatus_Failed - Retry = commonv3.ParalusConditionStatus_Retry - Skipped = commonv3.ParalusConditionStatus_Skipped - Stopped = commonv3.ParalusConditionStatus_Stopped - Expired = commonv3.ParalusConditionStatus_Expired - Stopping = commonv3.ParalusConditionStatus_Stopping - Submitted = commonv3.ParalusConditionStatus_Submitted + NotSet = commonv3.ParalusConditionStatus_NotSet + Pending = commonv3.ParalusConditionStatus_Pending + InProgress = commonv3.ParalusConditionStatus_InProgress + Success = commonv3.ParalusConditionStatus_Success + Failed = commonv3.ParalusConditionStatus_Failed + Retry = commonv3.ParalusConditionStatus_Retry + Skipped = commonv3.ParalusConditionStatus_Skipped + Stopped = commonv3.ParalusConditionStatus_Stopped + Expired = commonv3.ParalusConditionStatus_Expired + Stopping = commonv3.ParalusConditionStatus_Stopping + Submitted = commonv3.ParalusConditionStatus_Submitted + Healthy = commonv3.ParalusConditionStatus_Healthy + Unhealthy = commonv3.ParalusConditionStatus_Unhealthy + Disconnected = commonv3.ParalusConditionStatus_Disconnected ) diff --git a/main.go b/main.go index 27b6cce..4b741c6 100644 --- a/main.go +++ b/main.go @@ -163,9 +163,9 @@ var ( ras service.RelayAuditService rcs service.AuditLogService - schedulerPool schedulerrpc.SchedulerPool - schedulerAddr string - downloadData *common.DownloadData + clusterPool schedulerrpc.ClusterPool + infraAddr string + downloadData *common.DownloadData kekFunc = func() ([]byte, error) { if len(bootstrapKEK) == 0 { @@ -331,7 +331,7 @@ func setup() { } as = service.NewAuthzService(db, enforcer) - schedulerPool = schedulerrpc.NewSchedulerPool(schedulerAddr, 5*goruntime.NumCPU()) + clusterPool = schedulerrpc.NewClusterPool(infraAddr, 5*goruntime.NumCPU()) ps = service.NewPartnerService(db, auditLogger) os = service.NewOrganizationService(db, auditLogger) @@ -556,6 +556,7 @@ func runRelayPeerRPC(wg *sync.WaitGroup, ctx context.Context) { } clusterAuthzServer := server.NewClusterAuthzServer(bs, aps, gps, krs, kcs, kss, ns) auditInfoServer := server.NewAuditInfoServer(bs, aps, pps) + crpc := server.NewClusterServer(cs, downloadData) s, err := grpc.NewSecureServerWithPEM(cert, key, ca) if err != nil { @@ -573,6 +574,7 @@ func runRelayPeerRPC(wg *sync.WaitGroup, ctx context.Context) { sentryrpc.RegisterRelayPeerServiceServer(s, relayPeerService) sentryrpc.RegisterClusterAuthorizationServiceServer(s, clusterAuthzServer) sentryrpc.RegisterAuditInformationServiceServer(s, auditInfoServer) + schedulerrpc.RegisterClusterServiceServer(s, crpc) l, err := net.Listen("tcp", fmt.Sprintf(":%d", rpcRelayPeeringPort)) if err != nil { @@ -591,7 +593,7 @@ func runRelayPeerRPC(wg *sync.WaitGroup, ctx context.Context) { func runRPC(wg *sync.WaitGroup, ctx context.Context) { defer wg.Done() - defer schedulerPool.Close() + defer clusterPool.Close() defer db.Close() partnerServer := server.NewPartnerServer(ps) diff --git a/proto/rpc/scheduler/cluster.pb.go b/proto/rpc/scheduler/cluster.pb.go index a68ccfa..09acfc3 100644 --- a/proto/rpc/scheduler/cluster.pb.go +++ b/proto/rpc/scheduler/cluster.pb.go @@ -8,8 +8,8 @@ package rpcv3 import ( _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" - v31 "github.com/paralus/paralus/proto/types/commonpb/v3" - v3 "github.com/paralus/paralus/proto/types/infrapb/v3" + v3 "github.com/paralus/paralus/proto/types/commonpb/v3" + v31 "github.com/paralus/paralus/proto/types/infrapb/v3" _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -172,6 +172,201 @@ func (*DeleteClusterResponse) Descriptor() ([]byte, []int) { return file_proto_rpc_scheduler_cluster_proto_rawDescGZIP(), []int{2} } +type UpdateClusterStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *v3.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + ClusterStatus *v31.ClusterStatus `protobuf:"bytes,2,opt,name=clusterStatus,proto3" json:"clusterStatus,omitempty"` +} + +func (x *UpdateClusterStatusRequest) Reset() { + *x = UpdateClusterStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_rpc_scheduler_cluster_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateClusterStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateClusterStatusRequest) ProtoMessage() {} + +func (x *UpdateClusterStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_rpc_scheduler_cluster_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 UpdateClusterStatusRequest.ProtoReflect.Descriptor instead. +func (*UpdateClusterStatusRequest) Descriptor() ([]byte, []int) { + return file_proto_rpc_scheduler_cluster_proto_rawDescGZIP(), []int{3} +} + +func (x *UpdateClusterStatusRequest) GetMetadata() *v3.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *UpdateClusterStatusRequest) GetClusterStatus() *v31.ClusterStatus { + if x != nil { + return x.ClusterStatus + } + return nil +} + +type UpdateClusterStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *UpdateClusterStatusResponse) Reset() { + *x = UpdateClusterStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_rpc_scheduler_cluster_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateClusterStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateClusterStatusResponse) ProtoMessage() {} + +func (x *UpdateClusterStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_rpc_scheduler_cluster_proto_msgTypes[4] + 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 UpdateClusterStatusResponse.ProtoReflect.Descriptor instead. +func (*UpdateClusterStatusResponse) Descriptor() ([]byte, []int) { + return file_proto_rpc_scheduler_cluster_proto_rawDescGZIP(), []int{4} +} + +type GetClusterStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *v3.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` +} + +func (x *GetClusterStatusRequest) Reset() { + *x = GetClusterStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_rpc_scheduler_cluster_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterStatusRequest) ProtoMessage() {} + +func (x *GetClusterStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_rpc_scheduler_cluster_proto_msgTypes[5] + 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 GetClusterStatusRequest.ProtoReflect.Descriptor instead. +func (*GetClusterStatusRequest) Descriptor() ([]byte, []int) { + return file_proto_rpc_scheduler_cluster_proto_rawDescGZIP(), []int{5} +} + +func (x *GetClusterStatusRequest) GetMetadata() *v3.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +type GetClusterStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *v3.Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + ClusterStatus *v31.ClusterStatus `protobuf:"bytes,2,opt,name=clusterStatus,proto3" json:"clusterStatus,omitempty"` +} + +func (x *GetClusterStatusResponse) Reset() { + *x = GetClusterStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_rpc_scheduler_cluster_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterStatusResponse) ProtoMessage() {} + +func (x *GetClusterStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_rpc_scheduler_cluster_proto_msgTypes[6] + 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 GetClusterStatusResponse.ProtoReflect.Descriptor instead. +func (*GetClusterStatusResponse) Descriptor() ([]byte, []int) { + return file_proto_rpc_scheduler_cluster_proto_rawDescGZIP(), []int{6} +} + +func (x *GetClusterStatusResponse) GetMetadata() *v3.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *GetClusterStatusResponse) GetClusterStatus() *v31.ClusterStatus { + if x != nil { + return x.ClusterStatus + } + return nil +} + var File_proto_rpc_scheduler_cluster_proto protoreflect.FileDescriptor var file_proto_rpc_scheduler_cluster_proto_rawDesc = []byte{ @@ -201,113 +396,168 @@ var file_proto_rpc_scheduler_cluster_proto_rawDesc = []byte{ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xc7, 0x08, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xcb, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, - 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, - 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, - 0x23, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x22, 0x70, 0x92, 0x41, 0x36, 0x4a, 0x34, 0x0a, 0x03, 0x32, 0x30, 0x31, - 0x12, 0x2d, 0x0a, 0x2b, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, - 0x6e, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x3a, 0x01, 0x2a, 0x22, 0x2c, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, - 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x41, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x27, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x25, 0x12, 0x23, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x9c, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, - 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, - 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0x23, 0x2e, 0x70, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5c, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x41, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, + 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xae, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, + 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, 0xcd, 0x0b, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xcb, 0x01, 0x0a, 0x0d, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, - 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xa2, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, - 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, - 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0x23, 0x2e, - 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x3a, 0x01, 0x2a, 0x1a, 0x3c, 0x2f, - 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x7d, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xe2, 0x01, 0x0a, 0x0d, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, - 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x1a, 0x29, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, - 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x01, - 0x92, 0x41, 0x39, 0x4a, 0x37, 0x0a, 0x03, 0x32, 0x30, 0x34, 0x12, 0x30, 0x0a, 0x2e, 0x52, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x3e, 0x2a, 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, - 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, - 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, - 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0x25, 0x2e, 0x70, 0x61, 0x72, 0x61, - 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, - 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, - 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x42, - 0xd6, 0x04, 0x92, 0x41, 0x8b, 0x03, 0x12, 0x25, 0x0a, 0x0f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x61, 0x72, - 0x61, 0x6c, 0x75, 0x73, 0x20, 0x44, 0x65, 0x76, 0x32, 0x03, 0x33, 0x2e, 0x30, 0x2a, 0x01, 0x02, - 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, - 0x6f, 0x6e, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x79, 0x61, 0x6d, 0x6c, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x79, 0x61, 0x6d, 0x6c, 0x52, 0x50, 0x0a, 0x03, 0x34, 0x30, 0x33, 0x12, - 0x49, 0x0a, 0x47, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x3b, 0x0a, 0x03, 0x34, 0x30, - 0x34, 0x12, 0x34, 0x0a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x68, - 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, - 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x2e, 0x12, - 0x06, 0x0a, 0x04, 0x9a, 0x02, 0x01, 0x07, 0x5a, 0x55, 0x0a, 0x1f, 0x0a, 0x0a, 0x41, 0x70, 0x69, - 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x11, 0x08, 0x02, 0x1a, 0x0b, 0x58, 0x2d, 0x41, - 0x50, 0x49, 0x2d, 0x4b, 0x45, 0x59, 0x49, 0x44, 0x20, 0x02, 0x0a, 0x21, 0x0a, 0x0c, 0x41, 0x70, - 0x69, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x12, 0x11, 0x08, 0x02, 0x1a, 0x0b, - 0x58, 0x2d, 0x41, 0x50, 0x49, 0x2d, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x20, 0x02, 0x0a, 0x0f, 0x0a, - 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x02, 0x08, 0x01, 0x62, 0x31, - 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, - 0x0a, 0x10, 0x0a, 0x0c, 0x41, 0x70, 0x69, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x75, 0x74, 0x68, - 0x12, 0x00, 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, - 0x00, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, - 0x65, 0x76, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x33, 0x42, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x61, - 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x70, 0x63, 0x2f, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x3b, 0x72, 0x70, 0x63, 0x76, 0x33, 0xa2, - 0x02, 0x03, 0x50, 0x44, 0x52, 0xaa, 0x02, 0x12, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, - 0x44, 0x65, 0x76, 0x2e, 0x52, 0x70, 0x63, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x12, 0x50, 0x61, 0x72, - 0x61, 0x6c, 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x52, 0x70, 0x63, 0x5c, 0x56, 0x33, 0xe2, - 0x02, 0x1e, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x52, 0x70, - 0x63, 0x5c, 0x56, 0x33, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xea, 0x02, 0x15, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x3a, 0x3a, 0x44, 0x65, 0x76, 0x3a, - 0x3a, 0x52, 0x70, 0x63, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x1a, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x70, 0x92, 0x41, 0x36, 0x4a, 0x34, 0x0a, 0x03, 0x32, 0x30, + 0x31, 0x12, 0x2d, 0x0a, 0x2b, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x68, + 0x65, 0x6e, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x3a, 0x01, 0x2a, 0x22, 0x2c, 0x2f, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x8e, 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, + 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x27, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x2b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x9c, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, + 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0x23, 0x2e, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xa2, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x61, + 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, + 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0x23, + 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x3a, 0x01, 0x2a, 0x1a, 0x3c, + 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xe2, 0x01, 0x0a, + 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, + 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x1a, 0x29, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, + 0x76, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, + 0x01, 0x92, 0x41, 0x39, 0x4a, 0x37, 0x0a, 0x03, 0x32, 0x30, 0x34, 0x12, 0x30, 0x0a, 0x2e, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x3e, 0x2a, 0x3c, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, + 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, + 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0x25, 0x2e, 0x70, 0x61, 0x72, + 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, + 0x79, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0xc6, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, + 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, + 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x48, 0x3a, 0x01, 0x2a, 0x1a, 0x43, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x76, 0x33, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0xba, 0x01, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, + 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x61, + 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x33, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x45, 0x12, 0x43, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2f, + 0x7b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0xd6, 0x04, 0x92, 0x41, 0x8b, 0x03, 0x12, 0x25, 0x0a, + 0x0f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x20, 0x44, 0x65, 0x76, 0x32, + 0x03, 0x33, 0x2e, 0x30, 0x2a, 0x01, 0x02, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x79, 0x61, 0x6d, 0x6c, 0x3a, 0x10, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x79, 0x61, 0x6d, 0x6c, 0x52, + 0x50, 0x0a, 0x03, 0x34, 0x30, 0x33, 0x12, 0x49, 0x0a, 0x47, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x2e, 0x52, 0x3b, 0x0a, 0x03, 0x34, 0x30, 0x34, 0x12, 0x34, 0x0a, 0x2a, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x2e, 0x12, 0x06, 0x0a, 0x04, 0x9a, 0x02, 0x01, 0x07, 0x5a, 0x55, + 0x0a, 0x1f, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x11, + 0x08, 0x02, 0x1a, 0x0b, 0x58, 0x2d, 0x41, 0x50, 0x49, 0x2d, 0x4b, 0x45, 0x59, 0x49, 0x44, 0x20, + 0x02, 0x0a, 0x21, 0x0a, 0x0c, 0x41, 0x70, 0x69, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x75, 0x74, + 0x68, 0x12, 0x11, 0x08, 0x02, 0x1a, 0x0b, 0x58, 0x2d, 0x41, 0x50, 0x49, 0x2d, 0x54, 0x4f, 0x4b, + 0x45, 0x4e, 0x20, 0x02, 0x0a, 0x0f, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, + 0x68, 0x12, 0x02, 0x08, 0x01, 0x62, 0x31, 0x0a, 0x0e, 0x0a, 0x0a, 0x41, 0x70, 0x69, 0x4b, 0x65, + 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x0a, 0x10, 0x0a, 0x0c, 0x41, 0x70, 0x69, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x61, 0x73, + 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x00, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x61, + 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x76, 0x33, + 0x42, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x61, 0x72, + 0x61, 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x3b, 0x72, 0x70, 0x63, 0x76, 0x33, 0xa2, 0x02, 0x03, 0x50, 0x44, 0x52, 0xaa, 0x02, 0x12, 0x50, + 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x2e, 0x52, 0x70, 0x63, 0x2e, 0x56, + 0x33, 0xca, 0x02, 0x12, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, 0x5c, + 0x52, 0x70, 0x63, 0x5c, 0x56, 0x33, 0xe2, 0x02, 0x1e, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, + 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x52, 0x70, 0x63, 0x5c, 0x56, 0x33, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x15, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, + 0x73, 0x3a, 0x3a, 0x44, 0x65, 0x76, 0x3a, 0x3a, 0x52, 0x70, 0x63, 0x3a, 0x3a, 0x56, 0x33, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -322,34 +572,49 @@ func file_proto_rpc_scheduler_cluster_proto_rawDescGZIP() []byte { return file_proto_rpc_scheduler_cluster_proto_rawDescData } -var file_proto_rpc_scheduler_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_proto_rpc_scheduler_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_proto_rpc_scheduler_cluster_proto_goTypes = []interface{}{ - (*RegisterClusterRequest)(nil), // 0: paralus.dev.rpc.v3.RegisterClusterRequest - (*RegisterClusterResponse)(nil), // 1: paralus.dev.rpc.v3.RegisterClusterResponse - (*DeleteClusterResponse)(nil), // 2: paralus.dev.rpc.v3.DeleteClusterResponse - (*v3.Cluster)(nil), // 3: paralus.dev.types.infra.v3.Cluster - (*v31.QueryOptions)(nil), // 4: paralus.dev.types.common.v3.QueryOptions - (*v3.ClusterList)(nil), // 5: paralus.dev.types.infra.v3.ClusterList - (*v31.HttpBody)(nil), // 6: paralus.dev.types.common.v3.HttpBody + (*RegisterClusterRequest)(nil), // 0: paralus.dev.rpc.v3.RegisterClusterRequest + (*RegisterClusterResponse)(nil), // 1: paralus.dev.rpc.v3.RegisterClusterResponse + (*DeleteClusterResponse)(nil), // 2: paralus.dev.rpc.v3.DeleteClusterResponse + (*UpdateClusterStatusRequest)(nil), // 3: paralus.dev.rpc.v3.UpdateClusterStatusRequest + (*UpdateClusterStatusResponse)(nil), // 4: paralus.dev.rpc.v3.UpdateClusterStatusResponse + (*GetClusterStatusRequest)(nil), // 5: paralus.dev.rpc.v3.GetClusterStatusRequest + (*GetClusterStatusResponse)(nil), // 6: paralus.dev.rpc.v3.GetClusterStatusResponse + (*v3.Metadata)(nil), // 7: paralus.dev.types.common.v3.Metadata + (*v31.ClusterStatus)(nil), // 8: paralus.dev.types.infra.v3.ClusterStatus + (*v31.Cluster)(nil), // 9: paralus.dev.types.infra.v3.Cluster + (*v3.QueryOptions)(nil), // 10: paralus.dev.types.common.v3.QueryOptions + (*v31.ClusterList)(nil), // 11: paralus.dev.types.infra.v3.ClusterList + (*v3.HttpBody)(nil), // 12: paralus.dev.types.common.v3.HttpBody } var file_proto_rpc_scheduler_cluster_proto_depIdxs = []int32{ - 3, // 0: paralus.dev.rpc.v3.ClusterService.CreateCluster:input_type -> paralus.dev.types.infra.v3.Cluster - 4, // 1: paralus.dev.rpc.v3.ClusterService.GetClusters:input_type -> paralus.dev.types.common.v3.QueryOptions - 3, // 2: paralus.dev.rpc.v3.ClusterService.GetCluster:input_type -> paralus.dev.types.infra.v3.Cluster - 3, // 3: paralus.dev.rpc.v3.ClusterService.UpdateCluster:input_type -> paralus.dev.types.infra.v3.Cluster - 3, // 4: paralus.dev.rpc.v3.ClusterService.DeleteCluster:input_type -> paralus.dev.types.infra.v3.Cluster - 3, // 5: paralus.dev.rpc.v3.ClusterService.DownloadCluster:input_type -> paralus.dev.types.infra.v3.Cluster - 3, // 6: paralus.dev.rpc.v3.ClusterService.CreateCluster:output_type -> paralus.dev.types.infra.v3.Cluster - 5, // 7: paralus.dev.rpc.v3.ClusterService.GetClusters:output_type -> paralus.dev.types.infra.v3.ClusterList - 3, // 8: paralus.dev.rpc.v3.ClusterService.GetCluster:output_type -> paralus.dev.types.infra.v3.Cluster - 3, // 9: paralus.dev.rpc.v3.ClusterService.UpdateCluster:output_type -> paralus.dev.types.infra.v3.Cluster - 2, // 10: paralus.dev.rpc.v3.ClusterService.DeleteCluster:output_type -> paralus.dev.rpc.v3.DeleteClusterResponse - 6, // 11: paralus.dev.rpc.v3.ClusterService.DownloadCluster:output_type -> paralus.dev.types.common.v3.HttpBody - 6, // [6:12] is the sub-list for method output_type - 0, // [0:6] 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 + 7, // 0: paralus.dev.rpc.v3.UpdateClusterStatusRequest.metadata:type_name -> paralus.dev.types.common.v3.Metadata + 8, // 1: paralus.dev.rpc.v3.UpdateClusterStatusRequest.clusterStatus:type_name -> paralus.dev.types.infra.v3.ClusterStatus + 7, // 2: paralus.dev.rpc.v3.GetClusterStatusRequest.metadata:type_name -> paralus.dev.types.common.v3.Metadata + 7, // 3: paralus.dev.rpc.v3.GetClusterStatusResponse.metadata:type_name -> paralus.dev.types.common.v3.Metadata + 8, // 4: paralus.dev.rpc.v3.GetClusterStatusResponse.clusterStatus:type_name -> paralus.dev.types.infra.v3.ClusterStatus + 9, // 5: paralus.dev.rpc.v3.ClusterService.CreateCluster:input_type -> paralus.dev.types.infra.v3.Cluster + 10, // 6: paralus.dev.rpc.v3.ClusterService.GetClusters:input_type -> paralus.dev.types.common.v3.QueryOptions + 9, // 7: paralus.dev.rpc.v3.ClusterService.GetCluster:input_type -> paralus.dev.types.infra.v3.Cluster + 9, // 8: paralus.dev.rpc.v3.ClusterService.UpdateCluster:input_type -> paralus.dev.types.infra.v3.Cluster + 9, // 9: paralus.dev.rpc.v3.ClusterService.DeleteCluster:input_type -> paralus.dev.types.infra.v3.Cluster + 9, // 10: paralus.dev.rpc.v3.ClusterService.DownloadCluster:input_type -> paralus.dev.types.infra.v3.Cluster + 3, // 11: paralus.dev.rpc.v3.ClusterService.UpdateClusterStatus:input_type -> paralus.dev.rpc.v3.UpdateClusterStatusRequest + 5, // 12: paralus.dev.rpc.v3.ClusterService.GetClusterStatus:input_type -> paralus.dev.rpc.v3.GetClusterStatusRequest + 9, // 13: paralus.dev.rpc.v3.ClusterService.CreateCluster:output_type -> paralus.dev.types.infra.v3.Cluster + 11, // 14: paralus.dev.rpc.v3.ClusterService.GetClusters:output_type -> paralus.dev.types.infra.v3.ClusterList + 9, // 15: paralus.dev.rpc.v3.ClusterService.GetCluster:output_type -> paralus.dev.types.infra.v3.Cluster + 9, // 16: paralus.dev.rpc.v3.ClusterService.UpdateCluster:output_type -> paralus.dev.types.infra.v3.Cluster + 2, // 17: paralus.dev.rpc.v3.ClusterService.DeleteCluster:output_type -> paralus.dev.rpc.v3.DeleteClusterResponse + 12, // 18: paralus.dev.rpc.v3.ClusterService.DownloadCluster:output_type -> paralus.dev.types.common.v3.HttpBody + 4, // 19: paralus.dev.rpc.v3.ClusterService.UpdateClusterStatus:output_type -> paralus.dev.rpc.v3.UpdateClusterStatusResponse + 6, // 20: paralus.dev.rpc.v3.ClusterService.GetClusterStatus:output_type -> paralus.dev.rpc.v3.GetClusterStatusResponse + 13, // [13:21] is the sub-list for method output_type + 5, // [5:13] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_proto_rpc_scheduler_cluster_proto_init() } @@ -394,6 +659,54 @@ func file_proto_rpc_scheduler_cluster_proto_init() { return nil } } + file_proto_rpc_scheduler_cluster_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_rpc_scheduler_cluster_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateClusterStatusResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_rpc_scheduler_cluster_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_rpc_scheduler_cluster_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetClusterStatusResponse); 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{ @@ -401,7 +714,7 @@ func file_proto_rpc_scheduler_cluster_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_rpc_scheduler_cluster_proto_rawDesc, NumEnums: 0, - NumMessages: 3, + NumMessages: 7, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/rpc/scheduler/cluster.pb.gw.go b/proto/rpc/scheduler/cluster.pb.gw.go index 04917fb..5cf606a 100644 --- a/proto/rpc/scheduler/cluster.pb.gw.go +++ b/proto/rpc/scheduler/cluster.pb.gw.go @@ -529,6 +529,184 @@ func local_request_ClusterService_DownloadCluster_0(ctx context.Context, marshal } +func request_ClusterService_UpdateClusterStatus_0(ctx context.Context, marshaler runtime.Marshaler, client ClusterServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateClusterStatusRequest + 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) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["metadata.project"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metadata.project") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "metadata.project", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metadata.project", err) + } + + val, ok = pathParams["metadata.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metadata.name") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "metadata.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metadata.name", err) + } + + msg, err := client.UpdateClusterStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ClusterService_UpdateClusterStatus_0(ctx context.Context, marshaler runtime.Marshaler, server ClusterServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateClusterStatusRequest + 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) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["metadata.project"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metadata.project") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "metadata.project", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metadata.project", err) + } + + val, ok = pathParams["metadata.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metadata.name") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "metadata.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metadata.name", err) + } + + msg, err := server.UpdateClusterStatus(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_ClusterService_GetClusterStatus_0 = &utilities.DoubleArray{Encoding: map[string]int{"metadata": 0, "project": 1, "name": 2}, Base: []int{1, 4, 5, 6, 2, 0, 4, 0, 0, 0}, Check: []int{0, 1, 1, 1, 2, 5, 2, 7, 3, 4}} +) + +func request_ClusterService_GetClusterStatus_0(ctx context.Context, marshaler runtime.Marshaler, client ClusterServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetClusterStatusRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["metadata.project"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metadata.project") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "metadata.project", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metadata.project", err) + } + + val, ok = pathParams["metadata.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metadata.name") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "metadata.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metadata.name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ClusterService_GetClusterStatus_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetClusterStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_ClusterService_GetClusterStatus_0(ctx context.Context, marshaler runtime.Marshaler, server ClusterServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetClusterStatusRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["metadata.project"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metadata.project") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "metadata.project", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metadata.project", err) + } + + val, ok = pathParams["metadata.name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "metadata.name") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "metadata.name", val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "metadata.name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_ClusterService_GetClusterStatus_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetClusterStatus(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterClusterServiceHandlerServer registers the http handlers for service ClusterService to "mux". // UnaryRPC :call ClusterServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -685,6 +863,56 @@ func RegisterClusterServiceHandlerServer(ctx context.Context, mux *runtime.Serve }) + mux.Handle("PUT", pattern_ClusterService_UpdateClusterStatus_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) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/paralus.dev.rpc.v3.ClusterService/UpdateClusterStatus", runtime.WithHTTPPathPattern("/infra/v3/project/{metadata.project}/cluster/{metadata.name}/status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ClusterService_UpdateClusterStatus_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ClusterService_UpdateClusterStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ClusterService_GetClusterStatus_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) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/paralus.dev.rpc.v3.ClusterService/GetClusterStatus", runtime.WithHTTPPathPattern("/infra/v3/project/{metadata.project}/cluster/{metadata.name}/status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ClusterService_GetClusterStatus_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ClusterService_GetClusterStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -858,6 +1086,50 @@ func RegisterClusterServiceHandlerClient(ctx context.Context, mux *runtime.Serve }) + mux.Handle("PUT", pattern_ClusterService_UpdateClusterStatus_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) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/paralus.dev.rpc.v3.ClusterService/UpdateClusterStatus", runtime.WithHTTPPathPattern("/infra/v3/project/{metadata.project}/cluster/{metadata.name}/status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ClusterService_UpdateClusterStatus_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ClusterService_UpdateClusterStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_ClusterService_GetClusterStatus_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) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/paralus.dev.rpc.v3.ClusterService/GetClusterStatus", runtime.WithHTTPPathPattern("/infra/v3/project/{metadata.project}/cluster/{metadata.name}/status")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ClusterService_GetClusterStatus_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ClusterService_GetClusterStatus_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -873,6 +1145,10 @@ var ( pattern_ClusterService_DeleteCluster_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"infra", "v3", "project", "metadata.project", "cluster", "metadata.name"}, "")) pattern_ClusterService_DownloadCluster_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"infra", "v3", "project", "metadata.project", "cluster", "metadata.name", "download"}, "")) + + pattern_ClusterService_UpdateClusterStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"infra", "v3", "project", "metadata.project", "cluster", "metadata.name", "status"}, "")) + + pattern_ClusterService_GetClusterStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"infra", "v3", "project", "metadata.project", "cluster", "metadata.name", "status"}, "")) ) var ( @@ -887,4 +1163,8 @@ var ( forward_ClusterService_DeleteCluster_0 = runtime.ForwardResponseMessage forward_ClusterService_DownloadCluster_0 = runtime.ForwardResponseMessage + + forward_ClusterService_UpdateClusterStatus_0 = runtime.ForwardResponseMessage + + forward_ClusterService_GetClusterStatus_0 = runtime.ForwardResponseMessage ) diff --git a/proto/rpc/scheduler/cluster.proto b/proto/rpc/scheduler/cluster.proto index 13baee3..d0aa0aa 100644 --- a/proto/rpc/scheduler/cluster.proto +++ b/proto/rpc/scheduler/cluster.proto @@ -18,6 +18,22 @@ message RegisterClusterResponse { message DeleteClusterResponse {} +message UpdateClusterStatusRequest { + paralus.dev.types.common.v3.Metadata metadata = 1; + paralus.dev.types.infra.v3.ClusterStatus clusterStatus = 2; +} + +message UpdateClusterStatusResponse {} + +message GetClusterStatusRequest { + paralus.dev.types.common.v3.Metadata metadata = 1; +} + +message GetClusterStatusResponse { + paralus.dev.types.common.v3.Metadata metadata = 1; + paralus.dev.types.infra.v3.ClusterStatus clusterStatus = 2; +} + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { info : { title : "Cluster Service" @@ -137,5 +153,20 @@ service ClusterService { get : "/infra/v3/project/{metadata.project}/cluster/{metadata.name}/download" }; }; + + rpc UpdateClusterStatus(UpdateClusterStatusRequest) + returns (UpdateClusterStatusResponse) { + option (google.api.http) = { + put : "/infra/v3/project/{metadata.project}/cluster/{metadata.name}/status" + body : "*" + }; + }; + + rpc GetClusterStatus(GetClusterStatusRequest) + returns (GetClusterStatusResponse) { + option (google.api.http) = { + get : "/infra/v3/project/{metadata.project}/cluster/{metadata.name}/status" + }; + }; } \ No newline at end of file diff --git a/proto/rpc/scheduler/cluster_grpc.pb.go b/proto/rpc/scheduler/cluster_grpc.pb.go index dc1916b..ccff1f8 100644 --- a/proto/rpc/scheduler/cluster_grpc.pb.go +++ b/proto/rpc/scheduler/cluster_grpc.pb.go @@ -21,12 +21,14 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - ClusterService_CreateCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/CreateCluster" - ClusterService_GetClusters_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/GetClusters" - ClusterService_GetCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/GetCluster" - ClusterService_UpdateCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/UpdateCluster" - ClusterService_DeleteCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/DeleteCluster" - ClusterService_DownloadCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/DownloadCluster" + ClusterService_CreateCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/CreateCluster" + ClusterService_GetClusters_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/GetClusters" + ClusterService_GetCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/GetCluster" + ClusterService_UpdateCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/UpdateCluster" + ClusterService_DeleteCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/DeleteCluster" + ClusterService_DownloadCluster_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/DownloadCluster" + ClusterService_UpdateClusterStatus_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/UpdateClusterStatus" + ClusterService_GetClusterStatus_FullMethodName = "/paralus.dev.rpc.v3.ClusterService/GetClusterStatus" ) // ClusterServiceClient is the client API for ClusterService service. @@ -39,6 +41,8 @@ type ClusterServiceClient interface { UpdateCluster(ctx context.Context, in *v3.Cluster, opts ...grpc.CallOption) (*v3.Cluster, error) DeleteCluster(ctx context.Context, in *v3.Cluster, opts ...grpc.CallOption) (*DeleteClusterResponse, error) DownloadCluster(ctx context.Context, in *v3.Cluster, opts ...grpc.CallOption) (*v31.HttpBody, error) + UpdateClusterStatus(ctx context.Context, in *UpdateClusterStatusRequest, opts ...grpc.CallOption) (*UpdateClusterStatusResponse, error) + GetClusterStatus(ctx context.Context, in *GetClusterStatusRequest, opts ...grpc.CallOption) (*GetClusterStatusResponse, error) } type clusterServiceClient struct { @@ -103,6 +107,24 @@ func (c *clusterServiceClient) DownloadCluster(ctx context.Context, in *v3.Clust return out, nil } +func (c *clusterServiceClient) UpdateClusterStatus(ctx context.Context, in *UpdateClusterStatusRequest, opts ...grpc.CallOption) (*UpdateClusterStatusResponse, error) { + out := new(UpdateClusterStatusResponse) + err := c.cc.Invoke(ctx, ClusterService_UpdateClusterStatus_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *clusterServiceClient) GetClusterStatus(ctx context.Context, in *GetClusterStatusRequest, opts ...grpc.CallOption) (*GetClusterStatusResponse, error) { + out := new(GetClusterStatusResponse) + err := c.cc.Invoke(ctx, ClusterService_GetClusterStatus_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ClusterServiceServer is the server API for ClusterService service. // All implementations should embed UnimplementedClusterServiceServer // for forward compatibility @@ -113,6 +135,8 @@ type ClusterServiceServer interface { UpdateCluster(context.Context, *v3.Cluster) (*v3.Cluster, error) DeleteCluster(context.Context, *v3.Cluster) (*DeleteClusterResponse, error) DownloadCluster(context.Context, *v3.Cluster) (*v31.HttpBody, error) + UpdateClusterStatus(context.Context, *UpdateClusterStatusRequest) (*UpdateClusterStatusResponse, error) + GetClusterStatus(context.Context, *GetClusterStatusRequest) (*GetClusterStatusResponse, error) } // UnimplementedClusterServiceServer should be embedded to have forward compatible implementations. @@ -137,6 +161,12 @@ func (UnimplementedClusterServiceServer) DeleteCluster(context.Context, *v3.Clus func (UnimplementedClusterServiceServer) DownloadCluster(context.Context, *v3.Cluster) (*v31.HttpBody, error) { return nil, status.Errorf(codes.Unimplemented, "method DownloadCluster not implemented") } +func (UnimplementedClusterServiceServer) UpdateClusterStatus(context.Context, *UpdateClusterStatusRequest) (*UpdateClusterStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateClusterStatus not implemented") +} +func (UnimplementedClusterServiceServer) GetClusterStatus(context.Context, *GetClusterStatusRequest) (*GetClusterStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetClusterStatus not implemented") +} // UnsafeClusterServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ClusterServiceServer will @@ -257,6 +287,42 @@ func _ClusterService_DownloadCluster_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _ClusterService_UpdateClusterStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateClusterStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClusterServiceServer).UpdateClusterStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ClusterService_UpdateClusterStatus_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClusterServiceServer).UpdateClusterStatus(ctx, req.(*UpdateClusterStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ClusterService_GetClusterStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetClusterStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ClusterServiceServer).GetClusterStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ClusterService_GetClusterStatus_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClusterServiceServer).GetClusterStatus(ctx, req.(*GetClusterStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ClusterService_ServiceDesc is the grpc.ServiceDesc for ClusterService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -288,6 +354,14 @@ var ClusterService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DownloadCluster", Handler: _ClusterService_DownloadCluster_Handler, }, + { + MethodName: "UpdateClusterStatus", + Handler: _ClusterService_UpdateClusterStatus_Handler, + }, + { + MethodName: "GetClusterStatus", + Handler: _ClusterService_GetClusterStatus_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "proto/rpc/scheduler/cluster.proto", diff --git a/proto/rpc/scheduler/internal.go b/proto/rpc/scheduler/internal.go index fabe1ce..23bb6df 100644 --- a/proto/rpc/scheduler/internal.go +++ b/proto/rpc/scheduler/internal.go @@ -7,50 +7,50 @@ import ( grpcpool "github.com/processout/grpc-go-pool" ) -// SchedulerClient is the interface for accessing all the RPCs -// exposed by Cluster Scheduler -type SchedulerClient interface { +// ClusterClient is the interface for accessing all the RPCs +// exposed by Cluster service +type ClusterClient interface { Unhealthy() Close() error ClusterServiceClient } -type schedulerClient struct { +type clusterClient struct { *grpcpool.ClientConn *clusterServiceClient } -var _ SchedulerClient = (*schedulerClient)(nil) +var _ ClusterClient = (*clusterClient)(nil) -// SchedulerPool maintains pool of grpc connections to scheduler service -type SchedulerPool interface { +// ClusterPool maintains pool of grpc connections to cluster service +type ClusterPool interface { Close() - NewClient(ctx context.Context) (SchedulerClient, error) + NewClient(ctx context.Context) (ClusterClient, error) } -// NewSchedulerPool new scheduler pool -func NewSchedulerPool(addr string, maxConn int) SchedulerPool { - return &schedulerPool{ +// NewClusterPool new cluster pool +func NewClusterPool(addr string, maxConn int) ClusterPool { + return &clusterPool{ GRPCPool: pool.NewGRPCPool(addr, maxConn, nil), } } -type schedulerPool struct { +type clusterPool struct { *pool.GRPCPool } -func (p *schedulerPool) Close() { +func (p *clusterPool) Close() { if p.GRPCPool != nil { p.GRPCPool.Close() } } -func (p *schedulerPool) NewClient(ctx context.Context) (SchedulerClient, error) { +func (p *clusterPool) NewClient(ctx context.Context) (ClusterClient, error) { cc, err := p.GetConnection(ctx) if err != nil { return nil, err } - return &schedulerClient{ + return &clusterClient{ cc, &clusterServiceClient{cc.ClientConn}, }, nil diff --git a/proto/types/commonpb/v3/common.pb.go b/proto/types/commonpb/v3/common.pb.go index e6bcce8..b6a0467 100644 --- a/proto/types/commonpb/v3/common.pb.go +++ b/proto/types/commonpb/v3/common.pb.go @@ -81,17 +81,20 @@ func (ConditionStatus) EnumDescriptor() ([]byte, []int) { type ParalusConditionStatus int32 const ( - ParalusConditionStatus_NotSet ParalusConditionStatus = 0 - ParalusConditionStatus_Pending ParalusConditionStatus = 1 - ParalusConditionStatus_InProgress ParalusConditionStatus = 2 - ParalusConditionStatus_Success ParalusConditionStatus = 3 - ParalusConditionStatus_Failed ParalusConditionStatus = 4 - ParalusConditionStatus_Retry ParalusConditionStatus = 5 - ParalusConditionStatus_Skipped ParalusConditionStatus = 6 - ParalusConditionStatus_Stopped ParalusConditionStatus = 7 - ParalusConditionStatus_Expired ParalusConditionStatus = 8 - ParalusConditionStatus_Stopping ParalusConditionStatus = 9 - ParalusConditionStatus_Submitted ParalusConditionStatus = 10 + ParalusConditionStatus_NotSet ParalusConditionStatus = 0 + ParalusConditionStatus_Pending ParalusConditionStatus = 1 + ParalusConditionStatus_InProgress ParalusConditionStatus = 2 + ParalusConditionStatus_Success ParalusConditionStatus = 3 + ParalusConditionStatus_Failed ParalusConditionStatus = 4 + ParalusConditionStatus_Retry ParalusConditionStatus = 5 + ParalusConditionStatus_Skipped ParalusConditionStatus = 6 + ParalusConditionStatus_Stopped ParalusConditionStatus = 7 + ParalusConditionStatus_Expired ParalusConditionStatus = 8 + ParalusConditionStatus_Stopping ParalusConditionStatus = 9 + ParalusConditionStatus_Submitted ParalusConditionStatus = 10 + ParalusConditionStatus_Healthy ParalusConditionStatus = 11 + ParalusConditionStatus_Unhealthy ParalusConditionStatus = 12 + ParalusConditionStatus_Disconnected ParalusConditionStatus = 13 ) // Enum value maps for ParalusConditionStatus. @@ -108,19 +111,25 @@ var ( 8: "Expired", 9: "Stopping", 10: "Submitted", + 11: "Healthy", + 12: "Unhealthy", + 13: "Disconnected", } ParalusConditionStatus_value = map[string]int32{ - "NotSet": 0, - "Pending": 1, - "InProgress": 2, - "Success": 3, - "Failed": 4, - "Retry": 5, - "Skipped": 6, - "Stopped": 7, - "Expired": 8, - "Stopping": 9, - "Submitted": 10, + "NotSet": 0, + "Pending": 1, + "InProgress": 2, + "Success": 3, + "Failed": 4, + "Retry": 5, + "Skipped": 6, + "Stopped": 7, + "Expired": 8, + "Stopping": 9, + "Submitted": 10, + "Healthy": 11, + "Unhealthy": 12, + "Disconnected": 13, } ) @@ -1441,7 +1450,7 @@ var file_proto_types_commonpb_v3_common_proto_rawDesc = []byte{ 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x03, - 0x2a, 0xa9, 0x01, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x43, 0x6f, 0x6e, 0x64, + 0x2a, 0xd7, 0x01, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x6f, 0x74, 0x53, 0x65, 0x74, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, @@ -1451,24 +1460,27 @@ var file_proto_types_commonpb_v3_common_proto_rawDesc = []byte{ 0x70, 0x65, 0x64, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x10, 0x08, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x10, 0x09, 0x12, 0x0d, 0x0a, - 0x09, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x10, 0x0a, 0x42, 0xfc, 0x01, 0x0a, - 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x33, - 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x61, 0x72, 0x61, - 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2f, 0x76, 0x33, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x76, 0x33, 0xa2, 0x02, 0x04, 0x50, - 0x44, 0x54, 0x43, 0xaa, 0x02, 0x1b, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x44, 0x65, - 0x76, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, - 0x33, 0xca, 0x02, 0x1b, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, 0x5c, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x33, 0xe2, - 0x02, 0x27, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x33, 0x5c, 0x47, 0x50, - 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1f, 0x50, 0x61, 0x72, 0x61, - 0x6c, 0x75, 0x73, 0x3a, 0x3a, 0x44, 0x65, 0x76, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, - 0x3a, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x09, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x10, 0x0a, 0x12, 0x0b, 0x0a, 0x07, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x10, 0x0b, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x6e, 0x68, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x10, 0x0d, 0x42, 0xfc, 0x01, 0x0a, 0x1f, 0x63, + 0x6f, 0x6d, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x42, 0x0b, + 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, + 0x73, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2f, 0x76, + 0x33, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x76, 0x33, 0xa2, 0x02, 0x04, 0x50, 0x44, 0x54, + 0x43, 0xaa, 0x02, 0x1b, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x2e, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x33, 0xca, + 0x02, 0x1b, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x33, 0xe2, 0x02, 0x27, + 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x33, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1f, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, + 0x73, 0x3a, 0x3a, 0x44, 0x65, 0x76, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x3a, 0x43, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/proto/types/commonpb/v3/common.proto b/proto/types/commonpb/v3/common.proto index 18772d9..7bd0dc5 100644 --- a/proto/types/commonpb/v3/common.proto +++ b/proto/types/commonpb/v3/common.proto @@ -300,6 +300,9 @@ enum ParalusConditionStatus { Expired = 8; Stopping = 9; Submitted = 10; + Healthy = 11; + Unhealthy = 12; + Disconnected = 13; } // HttpBody represents arbitrary HTTP Body. It should only be used for diff --git a/proto/types/infrapb/v3/cluster.pb.go b/proto/types/infrapb/v3/cluster.pb.go index 2322200..e6653f8 100644 --- a/proto/types/infrapb/v3/cluster.pb.go +++ b/proto/types/infrapb/v3/cluster.pb.go @@ -86,21 +86,23 @@ const ( ClusterConditionType_ClusterAuxiliaryTaskSync ClusterConditionType = 7 ClusterConditionType_ClusterBootstrapAgent ClusterConditionType = 8 ClusterConditionType_ClusterDelete ClusterConditionType = 9 + ClusterConditionType_ClusterHealth ClusterConditionType = 10 ) // Enum value maps for ClusterConditionType. var ( ClusterConditionType_name = map[int32]string{ - 0: "ClusterBlueprintSync", - 1: "ClusterApprove", - 2: "ClusterCheckIn", - 3: "ClusterNodeSync", - 4: "ClusterRegister", - 5: "ClusterNamespaceSync", - 6: "ClusterReady", - 7: "ClusterAuxiliaryTaskSync", - 8: "ClusterBootstrapAgent", - 9: "ClusterDelete", + 0: "ClusterBlueprintSync", + 1: "ClusterApprove", + 2: "ClusterCheckIn", + 3: "ClusterNodeSync", + 4: "ClusterRegister", + 5: "ClusterNamespaceSync", + 6: "ClusterReady", + 7: "ClusterAuxiliaryTaskSync", + 8: "ClusterBootstrapAgent", + 9: "ClusterDelete", + 10: "ClusterHealth", } ClusterConditionType_value = map[string]int32{ "ClusterBlueprintSync": 0, @@ -113,6 +115,7 @@ var ( "ClusterAuxiliaryTaskSync": 7, "ClusterBootstrapAgent": 8, "ClusterDelete": 9, + "ClusterHealth": 10, } ) @@ -2519,7 +2522,7 @@ var file_proto_types_infrapb_v3_cluster_proto_rawDesc = []byte{ 0x74, 0x65, 0x64, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x74, 0x52, 0x65, 0x61, 0x64, 0x79, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, - 0x64, 0x79, 0x10, 0x02, 0x2a, 0xfa, 0x01, 0x0a, 0x14, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x64, 0x79, 0x10, 0x02, 0x2a, 0x8d, 0x02, 0x0a, 0x14, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x6c, 0x75, 0x65, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, @@ -2535,39 +2538,40 @@ var file_proto_types_infrapb_v3_cluster_proto_rawDesc = []byte{ 0x63, 0x10, 0x07, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x10, - 0x09, 0x2a, 0x43, 0x0a, 0x10, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x74, 0x53, 0x65, 0x74, 0x10, - 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, - 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x02, 0x2a, 0x56, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x44, 0x47, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, - 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x44, 0x47, 0x45, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, - 0x59, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x44, 0x47, 0x45, 0x5f, 0x55, 0x4e, 0x48, 0x45, - 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x44, 0x47, 0x45, 0x5f, - 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x2d, - 0x0a, 0x10, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x6f, 0x6f, - 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x10, 0x00, 0x2a, 0x34, 0x0a, - 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4e, 0x6f, 0x74, 0x55, 0x73, - 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x73, 0x65, - 0x64, 0x10, 0x01, 0x42, 0xf6, 0x01, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x61, 0x72, 0x61, - 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x6e, - 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x42, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6c, - 0x75, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x69, - 0x6e, 0x66, 0x72, 0x61, 0x70, 0x62, 0x2f, 0x76, 0x33, 0x3b, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x76, - 0x33, 0xa2, 0x02, 0x04, 0x50, 0x44, 0x54, 0x49, 0xaa, 0x02, 0x1a, 0x50, 0x61, 0x72, 0x61, 0x6c, - 0x75, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x66, - 0x72, 0x61, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x5c, + 0x09, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x10, 0x0a, 0x2a, 0x43, 0x0a, 0x10, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, + 0x68, 0x61, 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x74, 0x53, + 0x65, 0x74, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x02, 0x2a, 0x56, 0x0a, 0x06, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x44, 0x47, 0x45, 0x5f, 0x49, 0x47, 0x4e, 0x4f, + 0x52, 0x45, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x44, 0x47, 0x45, 0x5f, 0x48, 0x45, 0x41, + 0x4c, 0x54, 0x48, 0x59, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x44, 0x47, 0x45, 0x5f, 0x55, + 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x44, + 0x47, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, + 0x03, 0x2a, 0x2d, 0x0a, 0x10, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x42, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x10, 0x00, + 0x2a, 0x34, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4e, 0x6f, + 0x74, 0x55, 0x73, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x55, 0x73, 0x65, 0x64, 0x10, 0x01, 0x42, 0xf6, 0x01, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x76, 0x33, 0x42, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x61, + 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x70, 0x62, 0x2f, 0x76, 0x33, 0x3b, 0x69, 0x6e, 0x66, + 0x72, 0x61, 0x76, 0x33, 0xa2, 0x02, 0x04, 0x50, 0x44, 0x54, 0x49, 0xaa, 0x02, 0x1a, 0x50, 0x61, + 0x72, 0x61, 0x6c, 0x75, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x49, 0x6e, 0x66, 0x72, 0x61, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x1a, 0x50, 0x61, 0x72, 0x61, 0x6c, + 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x49, 0x6e, 0x66, + 0x72, 0x61, 0x5c, 0x56, 0x33, 0xe2, 0x02, 0x26, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x5c, - 0x56, 0x33, 0xe2, 0x02, 0x26, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x5c, 0x44, 0x65, 0x76, - 0x5c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x5c, 0x56, 0x33, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1e, 0x50, 0x61, - 0x72, 0x61, 0x6c, 0x75, 0x73, 0x3a, 0x3a, 0x44, 0x65, 0x76, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x3a, 0x3a, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x56, 0x33, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x1e, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x75, 0x73, 0x3a, 0x3a, 0x44, 0x65, 0x76, 0x3a, 0x3a, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x3a, 0x3a, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x3a, 0x3a, 0x56, 0x33, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/types/infrapb/v3/cluster.proto b/proto/types/infrapb/v3/cluster.proto index ac18145..c802aef 100644 --- a/proto/types/infrapb/v3/cluster.proto +++ b/proto/types/infrapb/v3/cluster.proto @@ -302,6 +302,7 @@ enum ClusterConditionType { ClusterAuxiliaryTaskSync = 7; ClusterBootstrapAgent = 8; ClusterDelete = 9; + ClusterHealth = 10; } enum ClusterShareMode { diff --git a/scripts/initialize/permissions/base/cluster_write.json b/scripts/initialize/permissions/base/cluster_write.json index 6459bf4..b25d865 100644 --- a/scripts/initialize/permissions/base/cluster_write.json +++ b/scripts/initialize/permissions/base/cluster_write.json @@ -13,6 +13,12 @@ "PUT", "DELETE" ] + }, + { + "url": "/:metadata.name/status", + "methods": [ + "PUT" + ] } ], "resource_action_urls": [], diff --git a/server/cluster.go b/server/cluster.go index 45fe789..12c53ad 100644 --- a/server/cluster.go +++ b/server/cluster.go @@ -13,6 +13,7 @@ import ( commonv3 "github.com/paralus/paralus/proto/types/commonpb/v3" v3 "github.com/paralus/paralus/proto/types/commonpb/v3" infrapbv3 "github.com/paralus/paralus/proto/types/infrapb/v3" + infrav3 "github.com/paralus/paralus/proto/types/infrapb/v3" "google.golang.org/protobuf/types/known/timestamppb" ) @@ -99,10 +100,28 @@ func (s *clusterServer) DownloadCluster(ctx context.Context, cluster *infrapbv3. }, nil } -func (s *clusterServer) UpdateClusterStatus(ctx context.Context, cluster *infrapbv3.Cluster) (*infrapbv3.Cluster, error) { - err := s.UpdateClusterConditionStatus(ctx, cluster) +func (s *clusterServer) UpdateClusterStatus(ctx context.Context, request *rpcv3.UpdateClusterStatusRequest) (*rpcv3.UpdateClusterStatusResponse, error) { + err := s.UpdateClusterConditionStatus(ctx, &infrav3.Cluster{ + Metadata: request.Metadata, + Spec: &infrav3.ClusterSpec{ + ClusterData: &infrav3.ClusterData{ + ClusterStatus: request.ClusterStatus, + }, + }, + }) if err != nil { - return updateClusterStatus(cluster, cluster, err), err + return nil, err } - return cluster, nil + return &rpcv3.UpdateClusterStatusResponse{}, nil +} + +func (s *clusterServer) GetClusterStatus(ctx context.Context, request *rpcv3.GetClusterStatusRequest) (*rpcv3.GetClusterStatusResponse, error) { + cluster, err := s.Get(ctx, query.WithMeta(request.Metadata)) + if err != nil { + return nil, err + } + return &rpcv3.GetClusterStatusResponse{ + Metadata: cluster.GetMetadata(), + ClusterStatus: cluster.GetSpec().GetClusterData().GetClusterStatus(), + }, nil }