diff --git a/kubelink/bean/Bean.go b/kubelink/bean/Bean.go index b62f49bb4..3819e9b04 100644 --- a/kubelink/bean/Bean.go +++ b/kubelink/bean/Bean.go @@ -17,9 +17,9 @@ package bean import ( + "github.com/devtron-labs/common-lib/utils/k8s/commonBean" remoteConnectionBean "github.com/devtron-labs/common-lib/utils/remoteConnection/bean" client "github.com/devtron-labs/kubelink/grpc" - v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "time" @@ -36,13 +36,13 @@ type HelmAppValues struct { } type AppDetail struct { - ApplicationStatus *HealthStatusCode `json:"applicationStatus"` - ReleaseStatus *ReleaseStatus `json:"releaseStatus"` - LastDeployed time.Time `json:"lastDeployed"` - ChartMetadata *ChartMetadata `json:"chartMetadata"` - ResourceTreeResponse *ResourceTreeResponse `json:"resourceTreeResponse"` - EnvironmentDetails *client.EnvironmentDetails `json:"environmentDetails"` - ReleaseExists bool `json:"releaseExists"` + ApplicationStatus *commonBean.HealthStatusCode `json:"applicationStatus"` + ReleaseStatus *ReleaseStatus `json:"releaseStatus"` + LastDeployed time.Time `json:"lastDeployed"` + ChartMetadata *ChartMetadata `json:"chartMetadata"` + ResourceTreeResponse *ResourceTreeResponse `json:"resourceTreeResponse"` + EnvironmentDetails *client.EnvironmentDetails `json:"environmentDetails"` + ReleaseExists bool `json:"releaseExists"` } type ReleaseStatus struct { @@ -75,16 +75,6 @@ const ( // StatusPendingRollback indicates that an rollback operation is underway. StatusPendingRollback HelmReleaseStatus = "pending-rollback" ) -const ( - ContainersType = "Containers" - ContainersNamesType = "ContainerNames" - InitContainersNamesType = "InitContainerNames" - EphemeralContainersInfoType = "EphemeralContainerInfo" - EphemeralContainersStatusType = "EphemeralContainerStatuses" - StatusReason = "Status Reason" - Node = "Node" - RestartCount = "Restart Count" -) type ChartMetadata struct { // The name of the chart @@ -103,94 +93,12 @@ type ChartMetadata struct { type ResourceTreeResponse struct { *ApplicationTree - PodMetadata []*PodMetadata `json:"podMetadata"` + PodMetadata []*commonBean.PodMetadata `json:"podMetadata"` } // ApplicationTree holds nodes which belongs to the application type ApplicationTree struct { - Nodes []*ResourceNode `json:"nodes,omitempty" protobuf:"bytes,1,rep,name=nodes"` -} - -// ResourceNode contains information about live resource and its children -type ResourceNode struct { - *ResourceRef `json:",inline" protobuf:"bytes,1,opt,name=resourceRef"` - ParentRefs []*ResourceRef `json:"parentRefs,omitempty" protobuf:"bytes,2,opt,name=parentRefs"` - NetworkingInfo *ResourceNetworkingInfo `json:"networkingInfo,omitempty" protobuf:"bytes,4,opt,name=networkingInfo"` - ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,5,opt,name=resourceVersion"` - Health *HealthStatus `json:"health,omitempty" protobuf:"bytes,7,opt,name=health"` - IsHibernated bool `json:"isHibernated"` - CanBeHibernated bool `json:"canBeHibernated"` - Info []InfoItem `json:"info,omitempty"` - Port []int64 `json:"port,omitempty"` - CreatedAt string `json:"createdAt,omitempty"` - IsHook bool `json:"isHook,omitempty"` - HookType string `json:"hookType,omitempty"` - // UpdateRevision is used when a pod's owner is a StatefulSet for identifying if the pod is new or old - UpdateRevision string `json:"updateRevision,omitempty"` - // DeploymentPodHash is the podHash in deployment manifest and is used to compare replicaSet's podHash for identifying new vs old pod - DeploymentPodHash string `json:"deploymentPodHash,omitempty"` - DeploymentCollisionCount *int32 `json:"deploymentCollisionCount,omitempty"` - // RolloutCurrentPodHash is the podHash in rollout manifest and is used to compare replicaSet's podHash for identifying new vs old pod - RolloutCurrentPodHash string `json:"rolloutCurrentPodHash,omitempty"` -} - -// ResourceRef includes fields which unique identify resource -type ResourceRef struct { - Group string `json:"group,omitempty" protobuf:"bytes,1,opt,name=group"` - Version string `json:"version,omitempty" protobuf:"bytes,2,opt,name=version"` - Kind string `json:"kind,omitempty" protobuf:"bytes,3,opt,name=kind"` - Namespace string `json:"namespace,omitempty" protobuf:"bytes,4,opt,name=namespace"` - Name string `json:"name,omitempty" protobuf:"bytes,5,opt,name=name"` - UID string `json:"uid,omitempty" protobuf:"bytes,6,opt,name=uid"` - Manifest unstructured.Unstructured `json:"-"` -} - -func (r *ResourceRef) GetGvk() schema.GroupVersionKind { - if r == nil { - return schema.GroupVersionKind{} - } - return schema.GroupVersionKind{ - Group: r.Group, - Version: r.Version, - Kind: r.Kind, - } -} - -// ResourceNetworkingInfo holds networking resource related information -type ResourceNetworkingInfo struct { - Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,3,opt,name=labels"` -} - -type HealthStatus struct { - Status HealthStatusCode `json:"status,omitempty" protobuf:"bytes,1,opt,name=status"` - Message string `json:"message,omitempty" protobuf:"bytes,2,opt,name=message"` -} - -type HealthStatusCode = string - -const ( - HealthStatusUnknown HealthStatusCode = "Unknown" - HealthStatusProgressing HealthStatusCode = "Progressing" - HealthStatusHealthy HealthStatusCode = "Healthy" - HealthStatusSuspended HealthStatusCode = "Suspended" - HealthStatusDegraded HealthStatusCode = "Degraded" - HealthStatusMissing HealthStatusCode = "Missing" - HealthStatusHibernated HealthStatusCode = "Hibernated" - HealthStatusPartiallyHibernated HealthStatusCode = "Partially Hibernated" -) - -type PodMetadata struct { - Name string `json:"name"` - UID string `json:"uid"` - Containers []string `json:"containers"` - InitContainers []string `json:"initContainers"` - IsNew bool `json:"isNew"` - EphemeralContainers []*EphemeralContainerData `json:"ephemeralContainers"` -} - -type EphemeralContainerData struct { - Name string `json:"name"` - IsExternal bool `json:"isExternal"` + Nodes []*commonBean.ResourceNode `json:"nodes,omitempty" protobuf:"bytes,1,rep,name=nodes"` } type HelmReleaseDetailRequest struct { @@ -231,25 +139,6 @@ type DesiredOrLiveManifest struct { LiveManifestFetchErrorCode int32 `json:"liveManifestFetchErrorCode"` } -// use value field as generic type -// InfoItem contains arbitrary, human readable information about an application -type InfoItem struct { - // Name is a human readable title for this piece of information. - Name string `json:"name,omitempty"` - // Value is human readable content. - Value interface{} `json:"value,omitempty"` -} - -type EphemeralContainerInfo struct { - Name string - Command []string -} - -type EphemeralContainerStatusesInfo struct { - Name string - State v1.ContainerState -} - type ClusterInfo struct { ClusterId int `json:"clusterId"` ClusterName string `json:"clusterName"` diff --git a/kubelink/converter/ClusterBeanConverter.go b/kubelink/converter/ClusterBeanConverter.go index 568f7fef4..cb598495d 100644 --- a/kubelink/converter/ClusterBeanConverter.go +++ b/kubelink/converter/ClusterBeanConverter.go @@ -18,6 +18,7 @@ package converter import ( k8sUtils "github.com/devtron-labs/common-lib/utils/k8s" + "github.com/devtron-labs/common-lib/utils/k8s/commonBean" "github.com/devtron-labs/kubelink/bean" client "github.com/devtron-labs/kubelink/grpc" repository "github.com/devtron-labs/kubelink/pkg/cluster" @@ -84,9 +85,9 @@ func (impl *ClusterBeanConverterImpl) GetClusterInfo(c *repository.Cluster) *bea InsecureSkipTLSVerify: c.InsecureSkipTlsVerify, } if c.InsecureSkipTlsVerify == false { - clusterInfo.KeyData = config[k8sUtils.TlsKey] - clusterInfo.CertData = config[k8sUtils.CertData] - clusterInfo.CAData = config[k8sUtils.CertificateAuthorityData] + clusterInfo.KeyData = config[commonBean.TlsKey] + clusterInfo.CertData = config[commonBean.CertData] + clusterInfo.CAData = config[commonBean.CertificateAuthorityData] } } return clusterInfo diff --git a/kubelink/go.mod b/kubelink/go.mod index 755df9436..48a8d5fd8 100644 --- a/kubelink/go.mod +++ b/kubelink/go.mod @@ -6,8 +6,7 @@ toolchain go1.22.6 require ( github.com/caarlos0/env v3.5.0+incompatible - github.com/davecgh/go-spew v1.1.1 - github.com/devtron-labs/common-lib v0.16.1-0.20240923063129-ff2dc035435e + github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e github.com/evanphx/json-patch v5.7.0+incompatible github.com/go-pg/pg v6.15.1+incompatible github.com/golang/protobuf v1.5.4 @@ -52,6 +51,7 @@ require ( github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v0.2.1 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/cli v27.1.0+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect diff --git a/kubelink/go.sum b/kubelink/go.sum index 0f0f77f80..3c5ba2f3b 100644 --- a/kubelink/go.sum +++ b/kubelink/go.sum @@ -79,8 +79,8 @@ github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxG github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/devtron-labs/common-lib v0.16.1-0.20240923063129-ff2dc035435e h1:siyAoJz9Nq26JrTzmSGd02EOmPV86tUgzgBW1Y5bSVU= -github.com/devtron-labs/common-lib v0.16.1-0.20240923063129-ff2dc035435e/go.mod h1:I+B+0ZeOV1Qv8dE/uNAFXOhw7lxfD6FqK6KzTBLBY7E= +github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e h1:UkRCn1BERRBTILtYOZAFl8vCQW3CifHk0Kfexw6WWmg= +github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e/go.mod h1:KpKnF4OSpQNDJmb4wVZq3Za88ePBw4xec2GOAGRm5UQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/distribution/distribution/v3 v3.0.0-beta.1 h1:X+ELTxPuZ1Xe5MsD3kp2wfGUhc8I+MPfRis8dZ818Ic= diff --git a/kubelink/grpc/applist.pb.go b/kubelink/grpc/applist.pb.go index 452b30148..f5cdfb425 100644 --- a/kubelink/grpc/applist.pb.go +++ b/kubelink/grpc/applist.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.33.0 // protoc v3.9.1 // source: grpc/applist.proto @@ -1943,6 +1943,156 @@ func (x *EphemeralContainerData) GetIsExternal() bool { return false } +type AppConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterConfig *ClusterConfig `protobuf:"bytes,1,opt,name=clusterConfig,proto3" json:"clusterConfig,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + ReleaseName string `protobuf:"bytes,3,opt,name=ReleaseName,proto3" json:"ReleaseName,omitempty"` +} + +func (x *AppConfigRequest) Reset() { + *x = AppConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_grpc_applist_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AppConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AppConfigRequest) ProtoMessage() {} + +func (x *AppConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_grpc_applist_proto_msgTypes[25] + 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 AppConfigRequest.ProtoReflect.Descriptor instead. +func (*AppConfigRequest) Descriptor() ([]byte, []int) { + return file_grpc_applist_proto_rawDescGZIP(), []int{25} +} + +func (x *AppConfigRequest) GetClusterConfig() *ClusterConfig { + if x != nil { + return x.ClusterConfig + } + return nil +} + +func (x *AppConfigRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *AppConfigRequest) GetReleaseName() string { + if x != nil { + return x.ReleaseName + } + return "" +} + +type GetReleaseDetailWithManifestResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ParentObjects []*ObjectIdentifier `protobuf:"bytes,1,rep,name=parentObjects,proto3" json:"parentObjects,omitempty"` + ReleaseStatus *ReleaseStatus `protobuf:"bytes,2,opt,name=releaseStatus,proto3" json:"releaseStatus,omitempty"` + LastDeployed *timestamp.Timestamp `protobuf:"bytes,3,opt,name=lastDeployed,proto3" json:"lastDeployed,omitempty"` + ChartMetadata *ChartMetadata `protobuf:"bytes,4,opt,name=chartMetadata,proto3" json:"chartMetadata,omitempty"` + EnvironmentDetails *EnvironmentDetails `protobuf:"bytes,5,opt,name=environmentDetails,proto3" json:"environmentDetails,omitempty"` + ReleaseExist bool `protobuf:"varint,6,opt,name=ReleaseExist,proto3" json:"ReleaseExist,omitempty"` +} + +func (x *GetReleaseDetailWithManifestResponse) Reset() { + *x = GetReleaseDetailWithManifestResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_grpc_applist_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetReleaseDetailWithManifestResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetReleaseDetailWithManifestResponse) ProtoMessage() {} + +func (x *GetReleaseDetailWithManifestResponse) ProtoReflect() protoreflect.Message { + mi := &file_grpc_applist_proto_msgTypes[26] + 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 GetReleaseDetailWithManifestResponse.ProtoReflect.Descriptor instead. +func (*GetReleaseDetailWithManifestResponse) Descriptor() ([]byte, []int) { + return file_grpc_applist_proto_rawDescGZIP(), []int{26} +} + +func (x *GetReleaseDetailWithManifestResponse) GetParentObjects() []*ObjectIdentifier { + if x != nil { + return x.ParentObjects + } + return nil +} + +func (x *GetReleaseDetailWithManifestResponse) GetReleaseStatus() *ReleaseStatus { + if x != nil { + return x.ReleaseStatus + } + return nil +} + +func (x *GetReleaseDetailWithManifestResponse) GetLastDeployed() *timestamp.Timestamp { + if x != nil { + return x.LastDeployed + } + return nil +} + +func (x *GetReleaseDetailWithManifestResponse) GetChartMetadata() *ChartMetadata { + if x != nil { + return x.ChartMetadata + } + return nil +} + +func (x *GetReleaseDetailWithManifestResponse) GetEnvironmentDetails() *EnvironmentDetails { + if x != nil { + return x.EnvironmentDetails + } + return nil +} + +func (x *GetReleaseDetailWithManifestResponse) GetReleaseExist() bool { + if x != nil { + return x.ReleaseExist + } + return false +} + type HibernateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1955,7 +2105,7 @@ type HibernateRequest struct { func (x *HibernateRequest) Reset() { *x = HibernateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[25] + mi := &file_grpc_applist_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1968,7 +2118,7 @@ func (x *HibernateRequest) String() string { func (*HibernateRequest) ProtoMessage() {} func (x *HibernateRequest) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[25] + mi := &file_grpc_applist_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1981,7 +2131,7 @@ func (x *HibernateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HibernateRequest.ProtoReflect.Descriptor instead. func (*HibernateRequest) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{25} + return file_grpc_applist_proto_rawDescGZIP(), []int{27} } func (x *HibernateRequest) GetClusterConfig() *ClusterConfig { @@ -2013,7 +2163,7 @@ type ObjectIdentifier struct { func (x *ObjectIdentifier) Reset() { *x = ObjectIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[26] + mi := &file_grpc_applist_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2026,7 +2176,7 @@ func (x *ObjectIdentifier) String() string { func (*ObjectIdentifier) ProtoMessage() {} func (x *ObjectIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[26] + mi := &file_grpc_applist_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2039,7 +2189,7 @@ func (x *ObjectIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectIdentifier.ProtoReflect.Descriptor instead. func (*ObjectIdentifier) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{26} + return file_grpc_applist_proto_rawDescGZIP(), []int{28} } func (x *ObjectIdentifier) GetGroup() string { @@ -2090,7 +2240,7 @@ type HibernateStatus struct { func (x *HibernateStatus) Reset() { *x = HibernateStatus{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[27] + mi := &file_grpc_applist_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2103,7 +2253,7 @@ func (x *HibernateStatus) String() string { func (*HibernateStatus) ProtoMessage() {} func (x *HibernateStatus) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[27] + mi := &file_grpc_applist_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2116,7 +2266,7 @@ func (x *HibernateStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use HibernateStatus.ProtoReflect.Descriptor instead. func (*HibernateStatus) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{27} + return file_grpc_applist_proto_rawDescGZIP(), []int{29} } func (x *HibernateStatus) GetTargetObject() *ObjectIdentifier { @@ -2151,7 +2301,7 @@ type HibernateResponse struct { func (x *HibernateResponse) Reset() { *x = HibernateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[28] + mi := &file_grpc_applist_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2164,7 +2314,7 @@ func (x *HibernateResponse) String() string { func (*HibernateResponse) ProtoMessage() {} func (x *HibernateResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[28] + mi := &file_grpc_applist_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2177,7 +2327,7 @@ func (x *HibernateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HibernateResponse.ProtoReflect.Descriptor instead. func (*HibernateResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{28} + return file_grpc_applist_proto_rawDescGZIP(), []int{30} } func (x *HibernateResponse) GetStatus() []*HibernateStatus { @@ -2204,7 +2354,7 @@ type HelmAppDeploymentDetail struct { func (x *HelmAppDeploymentDetail) Reset() { *x = HelmAppDeploymentDetail{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[29] + mi := &file_grpc_applist_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2217,7 +2367,7 @@ func (x *HelmAppDeploymentDetail) String() string { func (*HelmAppDeploymentDetail) ProtoMessage() {} func (x *HelmAppDeploymentDetail) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[29] + mi := &file_grpc_applist_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2230,7 +2380,7 @@ func (x *HelmAppDeploymentDetail) ProtoReflect() protoreflect.Message { // Deprecated: Use HelmAppDeploymentDetail.ProtoReflect.Descriptor instead. func (*HelmAppDeploymentDetail) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{29} + return file_grpc_applist_proto_rawDescGZIP(), []int{31} } func (x *HelmAppDeploymentDetail) GetChartMetadata() *ChartMetadata { @@ -2293,7 +2443,7 @@ type HelmAppDeploymentHistory struct { func (x *HelmAppDeploymentHistory) Reset() { *x = HelmAppDeploymentHistory{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[30] + mi := &file_grpc_applist_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2306,7 +2456,7 @@ func (x *HelmAppDeploymentHistory) String() string { func (*HelmAppDeploymentHistory) ProtoMessage() {} func (x *HelmAppDeploymentHistory) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[30] + mi := &file_grpc_applist_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2319,7 +2469,7 @@ func (x *HelmAppDeploymentHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use HelmAppDeploymentHistory.ProtoReflect.Descriptor instead. func (*HelmAppDeploymentHistory) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{30} + return file_grpc_applist_proto_rawDescGZIP(), []int{32} } func (x *HelmAppDeploymentHistory) GetDeploymentHistory() []*HelmAppDeploymentDetail { @@ -2345,7 +2495,7 @@ type ReleaseInfo struct { func (x *ReleaseInfo) Reset() { *x = ReleaseInfo{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[31] + mi := &file_grpc_applist_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2358,7 +2508,7 @@ func (x *ReleaseInfo) String() string { func (*ReleaseInfo) ProtoMessage() {} func (x *ReleaseInfo) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[31] + mi := &file_grpc_applist_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2371,7 +2521,7 @@ func (x *ReleaseInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ReleaseInfo.ProtoReflect.Descriptor instead. func (*ReleaseInfo) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{31} + return file_grpc_applist_proto_rawDescGZIP(), []int{33} } func (x *ReleaseInfo) GetDeployedAppDetail() *DeployedAppDetail { @@ -2430,7 +2580,7 @@ type ObjectRequest struct { func (x *ObjectRequest) Reset() { *x = ObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[32] + mi := &file_grpc_applist_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2443,7 +2593,7 @@ func (x *ObjectRequest) String() string { func (*ObjectRequest) ProtoMessage() {} func (x *ObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[32] + mi := &file_grpc_applist_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2456,7 +2606,7 @@ func (x *ObjectRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectRequest.ProtoReflect.Descriptor instead. func (*ObjectRequest) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{32} + return file_grpc_applist_proto_rawDescGZIP(), []int{34} } func (x *ObjectRequest) GetClusterConfig() *ClusterConfig { @@ -2498,7 +2648,7 @@ type DesiredManifestResponse struct { func (x *DesiredManifestResponse) Reset() { *x = DesiredManifestResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[33] + mi := &file_grpc_applist_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2511,7 +2661,7 @@ func (x *DesiredManifestResponse) String() string { func (*DesiredManifestResponse) ProtoMessage() {} func (x *DesiredManifestResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[33] + mi := &file_grpc_applist_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2524,7 +2674,7 @@ func (x *DesiredManifestResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DesiredManifestResponse.ProtoReflect.Descriptor instead. func (*DesiredManifestResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{33} + return file_grpc_applist_proto_rawDescGZIP(), []int{35} } func (x *DesiredManifestResponse) GetManifest() string { @@ -2545,7 +2695,7 @@ type UninstallReleaseResponse struct { func (x *UninstallReleaseResponse) Reset() { *x = UninstallReleaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[34] + mi := &file_grpc_applist_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2558,7 +2708,7 @@ func (x *UninstallReleaseResponse) String() string { func (*UninstallReleaseResponse) ProtoMessage() {} func (x *UninstallReleaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[34] + mi := &file_grpc_applist_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2571,7 +2721,7 @@ func (x *UninstallReleaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UninstallReleaseResponse.ProtoReflect.Descriptor instead. func (*UninstallReleaseResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{34} + return file_grpc_applist_proto_rawDescGZIP(), []int{36} } func (x *UninstallReleaseResponse) GetSuccess() bool { @@ -2594,7 +2744,7 @@ type ReleaseIdentifier struct { func (x *ReleaseIdentifier) Reset() { *x = ReleaseIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[35] + mi := &file_grpc_applist_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2607,7 +2757,7 @@ func (x *ReleaseIdentifier) String() string { func (*ReleaseIdentifier) ProtoMessage() {} func (x *ReleaseIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[35] + mi := &file_grpc_applist_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2620,7 +2770,7 @@ func (x *ReleaseIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ReleaseIdentifier.ProtoReflect.Descriptor instead. func (*ReleaseIdentifier) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{35} + return file_grpc_applist_proto_rawDescGZIP(), []int{37} } func (x *ReleaseIdentifier) GetClusterConfig() *ClusterConfig { @@ -2660,7 +2810,7 @@ type UpgradeReleaseRequest struct { func (x *UpgradeReleaseRequest) Reset() { *x = UpgradeReleaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[36] + mi := &file_grpc_applist_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2673,7 +2823,7 @@ func (x *UpgradeReleaseRequest) String() string { func (*UpgradeReleaseRequest) ProtoMessage() {} func (x *UpgradeReleaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[36] + mi := &file_grpc_applist_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2686,7 +2836,7 @@ func (x *UpgradeReleaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpgradeReleaseRequest.ProtoReflect.Descriptor instead. func (*UpgradeReleaseRequest) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{36} + return file_grpc_applist_proto_rawDescGZIP(), []int{38} } func (x *UpgradeReleaseRequest) GetReleaseIdentifier() *ReleaseIdentifier { @@ -2742,7 +2892,7 @@ type UpgradeReleaseResponse struct { func (x *UpgradeReleaseResponse) Reset() { *x = UpgradeReleaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[37] + mi := &file_grpc_applist_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2755,7 +2905,7 @@ func (x *UpgradeReleaseResponse) String() string { func (*UpgradeReleaseResponse) ProtoMessage() {} func (x *UpgradeReleaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[37] + mi := &file_grpc_applist_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2768,7 +2918,7 @@ func (x *UpgradeReleaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpgradeReleaseResponse.ProtoReflect.Descriptor instead. func (*UpgradeReleaseResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{37} + return file_grpc_applist_proto_rawDescGZIP(), []int{39} } func (x *UpgradeReleaseResponse) GetSuccess() bool { @@ -2790,7 +2940,7 @@ type DeploymentDetailRequest struct { func (x *DeploymentDetailRequest) Reset() { *x = DeploymentDetailRequest{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[38] + mi := &file_grpc_applist_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2803,7 +2953,7 @@ func (x *DeploymentDetailRequest) String() string { func (*DeploymentDetailRequest) ProtoMessage() {} func (x *DeploymentDetailRequest) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[38] + mi := &file_grpc_applist_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2816,7 +2966,7 @@ func (x *DeploymentDetailRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeploymentDetailRequest.ProtoReflect.Descriptor instead. func (*DeploymentDetailRequest) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{38} + return file_grpc_applist_proto_rawDescGZIP(), []int{40} } func (x *DeploymentDetailRequest) GetReleaseIdentifier() *ReleaseIdentifier { @@ -2845,7 +2995,7 @@ type DeploymentDetailResponse struct { func (x *DeploymentDetailResponse) Reset() { *x = DeploymentDetailResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[39] + mi := &file_grpc_applist_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2858,7 +3008,7 @@ func (x *DeploymentDetailResponse) String() string { func (*DeploymentDetailResponse) ProtoMessage() {} func (x *DeploymentDetailResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[39] + mi := &file_grpc_applist_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2871,7 +3021,7 @@ func (x *DeploymentDetailResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeploymentDetailResponse.ProtoReflect.Descriptor instead. func (*DeploymentDetailResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{39} + return file_grpc_applist_proto_rawDescGZIP(), []int{41} } func (x *DeploymentDetailResponse) GetManifest() string { @@ -2903,7 +3053,7 @@ type ChartRepository struct { func (x *ChartRepository) Reset() { *x = ChartRepository{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[40] + mi := &file_grpc_applist_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2916,7 +3066,7 @@ func (x *ChartRepository) String() string { func (*ChartRepository) ProtoMessage() {} func (x *ChartRepository) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[40] + mi := &file_grpc_applist_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2929,7 +3079,7 @@ func (x *ChartRepository) ProtoReflect() protoreflect.Message { // Deprecated: Use ChartRepository.ProtoReflect.Descriptor instead. func (*ChartRepository) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{40} + return file_grpc_applist_proto_rawDescGZIP(), []int{42} } func (x *ChartRepository) GetName() string { @@ -2989,7 +3139,7 @@ type InstallReleaseRequest struct { func (x *InstallReleaseRequest) Reset() { *x = InstallReleaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[41] + mi := &file_grpc_applist_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3002,7 +3152,7 @@ func (x *InstallReleaseRequest) String() string { func (*InstallReleaseRequest) ProtoMessage() {} func (x *InstallReleaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[41] + mi := &file_grpc_applist_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3015,7 +3165,7 @@ func (x *InstallReleaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InstallReleaseRequest.ProtoReflect.Descriptor instead. func (*InstallReleaseRequest) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{41} + return file_grpc_applist_proto_rawDescGZIP(), []int{43} } func (x *InstallReleaseRequest) GetReleaseIdentifier() *ReleaseIdentifier { @@ -3113,7 +3263,7 @@ type BulkInstallReleaseRequest struct { func (x *BulkInstallReleaseRequest) Reset() { *x = BulkInstallReleaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[42] + mi := &file_grpc_applist_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3126,7 +3276,7 @@ func (x *BulkInstallReleaseRequest) String() string { func (*BulkInstallReleaseRequest) ProtoMessage() {} func (x *BulkInstallReleaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[42] + mi := &file_grpc_applist_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3139,7 +3289,7 @@ func (x *BulkInstallReleaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkInstallReleaseRequest.ProtoReflect.Descriptor instead. func (*BulkInstallReleaseRequest) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{42} + return file_grpc_applist_proto_rawDescGZIP(), []int{44} } func (x *BulkInstallReleaseRequest) GetBulkInstallReleaseRequest() []*InstallReleaseRequest { @@ -3160,7 +3310,7 @@ type InstallReleaseResponse struct { func (x *InstallReleaseResponse) Reset() { *x = InstallReleaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[43] + mi := &file_grpc_applist_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3173,7 +3323,7 @@ func (x *InstallReleaseResponse) String() string { func (*InstallReleaseResponse) ProtoMessage() {} func (x *InstallReleaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[43] + mi := &file_grpc_applist_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3186,7 +3336,7 @@ func (x *InstallReleaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InstallReleaseResponse.ProtoReflect.Descriptor instead. func (*InstallReleaseResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{43} + return file_grpc_applist_proto_rawDescGZIP(), []int{45} } func (x *InstallReleaseResponse) GetSuccess() bool { @@ -3207,7 +3357,7 @@ type BooleanResponse struct { func (x *BooleanResponse) Reset() { *x = BooleanResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[44] + mi := &file_grpc_applist_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3220,7 +3370,7 @@ func (x *BooleanResponse) String() string { func (*BooleanResponse) ProtoMessage() {} func (x *BooleanResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[44] + mi := &file_grpc_applist_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3233,7 +3383,7 @@ func (x *BooleanResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BooleanResponse.ProtoReflect.Descriptor instead. func (*BooleanResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{44} + return file_grpc_applist_proto_rawDescGZIP(), []int{46} } func (x *BooleanResponse) GetResult() bool { @@ -3255,7 +3405,7 @@ type RollbackReleaseRequest struct { func (x *RollbackReleaseRequest) Reset() { *x = RollbackReleaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[45] + mi := &file_grpc_applist_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3268,7 +3418,7 @@ func (x *RollbackReleaseRequest) String() string { func (*RollbackReleaseRequest) ProtoMessage() {} func (x *RollbackReleaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[45] + mi := &file_grpc_applist_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3281,7 +3431,7 @@ func (x *RollbackReleaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RollbackReleaseRequest.ProtoReflect.Descriptor instead. func (*RollbackReleaseRequest) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{45} + return file_grpc_applist_proto_rawDescGZIP(), []int{47} } func (x *RollbackReleaseRequest) GetReleaseIdentifier() *ReleaseIdentifier { @@ -3310,7 +3460,7 @@ type TemplateChartResponse struct { func (x *TemplateChartResponse) Reset() { *x = TemplateChartResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[46] + mi := &file_grpc_applist_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3323,7 +3473,7 @@ func (x *TemplateChartResponse) String() string { func (*TemplateChartResponse) ProtoMessage() {} func (x *TemplateChartResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[46] + mi := &file_grpc_applist_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3336,7 +3486,7 @@ func (x *TemplateChartResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TemplateChartResponse.ProtoReflect.Descriptor instead. func (*TemplateChartResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{46} + return file_grpc_applist_proto_rawDescGZIP(), []int{48} } func (x *TemplateChartResponse) GetGeneratedManifest() string { @@ -3364,7 +3514,7 @@ type BulkTemplateChartResponse struct { func (x *BulkTemplateChartResponse) Reset() { *x = BulkTemplateChartResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[47] + mi := &file_grpc_applist_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3377,7 +3527,7 @@ func (x *BulkTemplateChartResponse) String() string { func (*BulkTemplateChartResponse) ProtoMessage() {} func (x *BulkTemplateChartResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[47] + mi := &file_grpc_applist_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3390,7 +3540,7 @@ func (x *BulkTemplateChartResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkTemplateChartResponse.ProtoReflect.Descriptor instead. func (*BulkTemplateChartResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{47} + return file_grpc_applist_proto_rawDescGZIP(), []int{49} } func (x *BulkTemplateChartResponse) GetBulkTemplateChartResponse() []*TemplateChartResponse { @@ -3412,7 +3562,7 @@ type TemplateChartResponseWithChart struct { func (x *TemplateChartResponseWithChart) Reset() { *x = TemplateChartResponseWithChart{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[48] + mi := &file_grpc_applist_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3425,7 +3575,7 @@ func (x *TemplateChartResponseWithChart) String() string { func (*TemplateChartResponseWithChart) ProtoMessage() {} func (x *TemplateChartResponseWithChart) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[48] + mi := &file_grpc_applist_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3438,7 +3588,7 @@ func (x *TemplateChartResponseWithChart) ProtoReflect() protoreflect.Message { // Deprecated: Use TemplateChartResponseWithChart.ProtoReflect.Descriptor instead. func (*TemplateChartResponseWithChart) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{48} + return file_grpc_applist_proto_rawDescGZIP(), []int{50} } func (x *TemplateChartResponseWithChart) GetTemplateChartResponse() *TemplateChartResponse { @@ -3470,7 +3620,7 @@ type HelmInstallCustomRequest struct { func (x *HelmInstallCustomRequest) Reset() { *x = HelmInstallCustomRequest{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[49] + mi := &file_grpc_applist_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3483,7 +3633,7 @@ func (x *HelmInstallCustomRequest) String() string { func (*HelmInstallCustomRequest) ProtoMessage() {} func (x *HelmInstallCustomRequest) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[49] + mi := &file_grpc_applist_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3496,7 +3646,7 @@ func (x *HelmInstallCustomRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HelmInstallCustomRequest.ProtoReflect.Descriptor instead. func (*HelmInstallCustomRequest) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{49} + return file_grpc_applist_proto_rawDescGZIP(), []int{51} } func (x *HelmInstallCustomRequest) GetValuesYaml() string { @@ -3545,7 +3695,7 @@ type HelmInstallCustomResponse struct { func (x *HelmInstallCustomResponse) Reset() { *x = HelmInstallCustomResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[50] + mi := &file_grpc_applist_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3558,7 +3708,7 @@ func (x *HelmInstallCustomResponse) String() string { func (*HelmInstallCustomResponse) ProtoMessage() {} func (x *HelmInstallCustomResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[50] + mi := &file_grpc_applist_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3571,7 +3721,7 @@ func (x *HelmInstallCustomResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HelmInstallCustomResponse.ProtoReflect.Descriptor instead. func (*HelmInstallCustomResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{50} + return file_grpc_applist_proto_rawDescGZIP(), []int{52} } func (x *HelmInstallCustomResponse) GetSuccess() bool { @@ -3592,7 +3742,7 @@ type ChartContent struct { func (x *ChartContent) Reset() { *x = ChartContent{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[51] + mi := &file_grpc_applist_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3605,7 +3755,7 @@ func (x *ChartContent) String() string { func (*ChartContent) ProtoMessage() {} func (x *ChartContent) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[51] + mi := &file_grpc_applist_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3618,7 +3768,7 @@ func (x *ChartContent) ProtoReflect() protoreflect.Message { // Deprecated: Use ChartContent.ProtoReflect.Descriptor instead. func (*ChartContent) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{51} + return file_grpc_applist_proto_rawDescGZIP(), []int{53} } func (x *ChartContent) GetContent() []byte { @@ -3641,7 +3791,7 @@ type Gvk struct { func (x *Gvk) Reset() { *x = Gvk{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[52] + mi := &file_grpc_applist_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3654,7 +3804,7 @@ func (x *Gvk) String() string { func (*Gvk) ProtoMessage() {} func (x *Gvk) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[52] + mi := &file_grpc_applist_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3667,7 +3817,7 @@ func (x *Gvk) ProtoReflect() protoreflect.Message { // Deprecated: Use Gvk.ProtoReflect.Descriptor instead. func (*Gvk) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{52} + return file_grpc_applist_proto_rawDescGZIP(), []int{54} } func (x *Gvk) GetGroup() string { @@ -3703,7 +3853,7 @@ type ResourceFilter struct { func (x *ResourceFilter) Reset() { *x = ResourceFilter{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[53] + mi := &file_grpc_applist_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3716,7 +3866,7 @@ func (x *ResourceFilter) String() string { func (*ResourceFilter) ProtoMessage() {} func (x *ResourceFilter) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[53] + mi := &file_grpc_applist_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3729,7 +3879,7 @@ func (x *ResourceFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceFilter.ProtoReflect.Descriptor instead. func (*ResourceFilter) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{53} + return file_grpc_applist_proto_rawDescGZIP(), []int{55} } func (x *ResourceFilter) GetGvk() *Gvk { @@ -3757,7 +3907,7 @@ type ResourceIdentifier struct { func (x *ResourceIdentifier) Reset() { *x = ResourceIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[54] + mi := &file_grpc_applist_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3770,7 +3920,7 @@ func (x *ResourceIdentifier) String() string { func (*ResourceIdentifier) ProtoMessage() {} func (x *ResourceIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[54] + mi := &file_grpc_applist_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3783,7 +3933,7 @@ func (x *ResourceIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceIdentifier.ProtoReflect.Descriptor instead. func (*ResourceIdentifier) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{54} + return file_grpc_applist_proto_rawDescGZIP(), []int{56} } func (x *ResourceIdentifier) GetLabels() map[string]string { @@ -3805,7 +3955,7 @@ type ResourceTreeFilter struct { func (x *ResourceTreeFilter) Reset() { *x = ResourceTreeFilter{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[55] + mi := &file_grpc_applist_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3818,7 +3968,7 @@ func (x *ResourceTreeFilter) String() string { func (*ResourceTreeFilter) ProtoMessage() {} func (x *ResourceTreeFilter) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[55] + mi := &file_grpc_applist_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3831,7 +3981,7 @@ func (x *ResourceTreeFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceTreeFilter.ProtoReflect.Descriptor instead. func (*ResourceTreeFilter) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{55} + return file_grpc_applist_proto_rawDescGZIP(), []int{57} } func (x *ResourceTreeFilter) GetGlobalFilter() *ResourceIdentifier { @@ -3859,7 +4009,7 @@ type ChartNotesResponse struct { func (x *ChartNotesResponse) Reset() { *x = ChartNotesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[56] + mi := &file_grpc_applist_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3872,7 +4022,7 @@ func (x *ChartNotesResponse) String() string { func (*ChartNotesResponse) ProtoMessage() {} func (x *ChartNotesResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[56] + mi := &file_grpc_applist_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3885,7 +4035,7 @@ func (x *ChartNotesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChartNotesResponse.ProtoReflect.Descriptor instead. func (*ChartNotesResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{56} + return file_grpc_applist_proto_rawDescGZIP(), []int{58} } func (x *ChartNotesResponse) GetNotes() string { @@ -3910,7 +4060,7 @@ type OCIRegistryRequest struct { func (x *OCIRegistryRequest) Reset() { *x = OCIRegistryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[57] + mi := &file_grpc_applist_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3923,7 +4073,7 @@ func (x *OCIRegistryRequest) String() string { func (*OCIRegistryRequest) ProtoMessage() {} func (x *OCIRegistryRequest) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[57] + mi := &file_grpc_applist_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3936,7 +4086,7 @@ func (x *OCIRegistryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OCIRegistryRequest.ProtoReflect.Descriptor instead. func (*OCIRegistryRequest) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{57} + return file_grpc_applist_proto_rawDescGZIP(), []int{59} } func (x *OCIRegistryRequest) GetChart() []byte { @@ -3997,7 +4147,7 @@ type RegistryCredential struct { func (x *RegistryCredential) Reset() { *x = RegistryCredential{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[58] + mi := &file_grpc_applist_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4010,7 +4160,7 @@ func (x *RegistryCredential) String() string { func (*RegistryCredential) ProtoMessage() {} func (x *RegistryCredential) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[58] + mi := &file_grpc_applist_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4023,7 +4173,7 @@ func (x *RegistryCredential) ProtoReflect() protoreflect.Message { // Deprecated: Use RegistryCredential.ProtoReflect.Descriptor instead. func (*RegistryCredential) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{58} + return file_grpc_applist_proto_rawDescGZIP(), []int{60} } func (x *RegistryCredential) GetRegistryUrl() string { @@ -4128,7 +4278,7 @@ type ProxyConfig struct { func (x *ProxyConfig) Reset() { *x = ProxyConfig{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[59] + mi := &file_grpc_applist_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4141,7 +4291,7 @@ func (x *ProxyConfig) String() string { func (*ProxyConfig) ProtoMessage() {} func (x *ProxyConfig) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[59] + mi := &file_grpc_applist_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4154,7 +4304,7 @@ func (x *ProxyConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ProxyConfig.ProtoReflect.Descriptor instead. func (*ProxyConfig) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{59} + return file_grpc_applist_proto_rawDescGZIP(), []int{61} } func (x *ProxyConfig) GetProxyUrl() string { @@ -4178,7 +4328,7 @@ type SSHTunnelConfig struct { func (x *SSHTunnelConfig) Reset() { *x = SSHTunnelConfig{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[60] + mi := &file_grpc_applist_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4191,7 +4341,7 @@ func (x *SSHTunnelConfig) String() string { func (*SSHTunnelConfig) ProtoMessage() {} func (x *SSHTunnelConfig) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[60] + mi := &file_grpc_applist_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4204,7 +4354,7 @@ func (x *SSHTunnelConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use SSHTunnelConfig.ProtoReflect.Descriptor instead. func (*SSHTunnelConfig) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{60} + return file_grpc_applist_proto_rawDescGZIP(), []int{62} } func (x *SSHTunnelConfig) GetSSHServerAddress() string { @@ -4248,7 +4398,7 @@ type RemoteConnectionConfig struct { func (x *RemoteConnectionConfig) Reset() { *x = RemoteConnectionConfig{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[61] + mi := &file_grpc_applist_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4261,7 +4411,7 @@ func (x *RemoteConnectionConfig) String() string { func (*RemoteConnectionConfig) ProtoMessage() {} func (x *RemoteConnectionConfig) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[61] + mi := &file_grpc_applist_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4274,7 +4424,7 @@ func (x *RemoteConnectionConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoteConnectionConfig.ProtoReflect.Descriptor instead. func (*RemoteConnectionConfig) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{61} + return file_grpc_applist_proto_rawDescGZIP(), []int{63} } func (x *RemoteConnectionConfig) GetRemoteConnectionMethod() RemoteConnectionMethod { @@ -4310,7 +4460,7 @@ type OCIRegistryResponse struct { func (x *OCIRegistryResponse) Reset() { *x = OCIRegistryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[62] + mi := &file_grpc_applist_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4323,7 +4473,7 @@ func (x *OCIRegistryResponse) String() string { func (*OCIRegistryResponse) ProtoMessage() {} func (x *OCIRegistryResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[62] + mi := &file_grpc_applist_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4336,7 +4486,7 @@ func (x *OCIRegistryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OCIRegistryResponse.ProtoReflect.Descriptor instead. func (*OCIRegistryResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{62} + return file_grpc_applist_proto_rawDescGZIP(), []int{64} } func (x *OCIRegistryResponse) GetIsLoggedIn() bool { @@ -4365,7 +4515,7 @@ type OCIRegistryPushResponse struct { func (x *OCIRegistryPushResponse) Reset() { *x = OCIRegistryPushResponse{} if protoimpl.UnsafeEnabled { - mi := &file_grpc_applist_proto_msgTypes[63] + mi := &file_grpc_applist_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4378,7 +4528,7 @@ func (x *OCIRegistryPushResponse) String() string { func (*OCIRegistryPushResponse) ProtoMessage() {} func (x *OCIRegistryPushResponse) ProtoReflect() protoreflect.Message { - mi := &file_grpc_applist_proto_msgTypes[63] + mi := &file_grpc_applist_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4391,7 +4541,7 @@ func (x *OCIRegistryPushResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OCIRegistryPushResponse.ProtoReflect.Descriptor instead. func (*OCIRegistryPushResponse) Descriptor() ([]byte, []int) { - return file_grpc_applist_proto_rawDescGZIP(), []int{63} + return file_grpc_applist_proto_rawDescGZIP(), []int{65} } func (x *OCIRegistryPushResponse) GetDigest() string { @@ -4707,490 +4857,528 @@ var file_grpc_applist_proto_rawDesc = []byte{ 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x87, 0x01, 0x0a, 0x10, 0x48, 0x69, 0x62, 0x65, - 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x0d, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x88, 0x01, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, - 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x22, 0x88, 0x01, 0x0a, 0x10, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x7e, 0x0a, 0x0f, - 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x35, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x3d, 0x0a, 0x11, - 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x9b, 0x02, 0x0a, 0x17, - 0x48, 0x65, 0x6c, 0x6d, 0x41, 0x70, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x34, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x72, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, - 0x63, 0x68, 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, - 0x0c, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x0a, 0x64, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x65, 0x64, 0x42, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x42, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x62, 0x0a, 0x18, 0x48, 0x65, 0x6c, - 0x6d, 0x41, 0x70, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x48, 0x65, 0x6c, 0x6d, 0x41, 0x70, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x11, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x85, 0x02, - 0x0a, 0x0b, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, - 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x11, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0xd2, 0x01, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, - 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x10, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, - 0x0a, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x35, 0x0a, 0x17, 0x44, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, - 0x74, 0x22, 0x34, 0x0a, 0x18, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x34, 0x0a, - 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x22, 0x88, 0x02, 0x0a, 0x15, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x11, 0x72, + 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0xf4, 0x02, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x4d, 0x61, 0x6e, 0x69, 0x66, + 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0d, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x0d, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x6c, 0x61, + 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, + 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x0d, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x0d, 0x63, 0x68, 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x43, 0x0a, 0x12, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x52, 0x12, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x22, 0x87, 0x01, 0x0a, 0x10, 0x48, 0x69, + 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, + 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x52, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x22, 0x88, 0x01, 0x0a, 0x10, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x7e, + 0x0a, 0x0f, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x35, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x3d, + 0x0a, 0x11, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x9b, 0x02, + 0x0a, 0x17, 0x48, 0x65, 0x6c, 0x6d, 0x41, 0x70, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x34, 0x0a, 0x0d, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x0d, 0x63, 0x68, 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x22, 0x0a, 0x0c, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x42, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x42, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x62, 0x0a, 0x18, 0x48, + 0x65, 0x6c, 0x6d, 0x41, 0x70, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x48, 0x65, 0x6c, 0x6d, 0x41, 0x70, 0x70, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x11, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, + 0x85, 0x02, 0x0a, 0x0b, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x40, 0x0a, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x11, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x6f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0xd2, 0x01, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x0d, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x3d, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x10, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x35, 0x0a, 0x17, + 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, + 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, 0x66, + 0x65, 0x73, 0x74, 0x22, 0x34, 0x0a, 0x18, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x11, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, + 0x34, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x22, 0x88, 0x02, 0x0a, 0x15, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, + 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, + 0x1e, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, + 0x1e, 0x0a, 0x0a, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x12, + 0x31, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x43, 0x74, 0x78, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x43, 0x74, 0x78, 0x12, 0x1e, + 0x0a, 0x0a, 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x32, + 0x0a, 0x16, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, + 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1e, 0x0a, - 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1e, 0x0a, - 0x0a, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x12, 0x31, 0x0a, - 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x43, 0x74, 0x78, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x43, 0x74, 0x78, 0x12, 0x1e, 0x0a, 0x0a, - 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x16, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x22, 0x89, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x11, + 0x12, 0x2c, 0x0a, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x56, + 0x0a, 0x18, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x59, 0x61, 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, + 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xa7, 0x04, 0x0a, 0x15, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x2c, - 0x0a, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x56, 0x0a, 0x18, + 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x63, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, + 0x12, 0x3a, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, + 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x12, 0x43, 0x0a, 0x12, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x12, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x3e, 0x0a, 0x1a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x1a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x41, 0x70, 0x70, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, + 0x31, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x71, 0x0a, 0x19, + 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x19, 0x42, 0x75, 0x6c, + 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x19, 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x32, 0x0a, 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x74, + 0x0a, 0x16, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x15, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, + 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, + 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x71, 0x0a, 0x19, 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x54, 0x0a, 0x19, 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x19, 0x42, + 0x75, 0x6c, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9d, 0x01, 0x0a, 0x1e, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x4c, 0x0a, 0x15, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x15, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x0a, 0x63, 0x68, 0x61, + 0x72, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x43, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x63, 0x68, + 0x61, 0x72, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xeb, 0x01, 0x0a, 0x18, 0x48, 0x65, 0x6c, + 0x6d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, + 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x31, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x75, + 0x6e, 0x49, 0x6e, 0x43, 0x74, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x52, 0x75, + 0x6e, 0x49, 0x6e, 0x43, 0x74, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4b, 0x38, 0x73, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x19, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x28, 0x0a, + 0x0c, 0x43, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x49, 0x0a, 0x03, 0x47, 0x76, 0x6b, 0x12, 0x14, + 0x0a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, + 0x6e, 0x64, 0x22, 0x6d, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x03, 0x67, 0x76, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x04, 0x2e, 0x47, 0x76, 0x6b, 0x52, 0x03, 0x67, 0x76, 0x6b, 0x12, 0x43, 0x0a, 0x12, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x12, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x22, 0x88, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, 0x01, 0x0a, + 0x12, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0c, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0f, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, + 0x74, 0x65, 0x73, 0x22, 0xd1, 0x01, 0x0a, 0x12, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x73, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, 0x73, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x65, 0x12, 0x43, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x52, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x22, 0xeb, 0x03, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x20, + 0x0a, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, + 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x77, 0x73, 0x52, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x77, 0x73, + 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x4f, + 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x22, 0x29, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x72, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x72, 0x6c, + 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x53, 0x53, 0x48, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a, 0x0a, 0x10, 0x53, 0x53, 0x48, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x53, 0x53, 0x48, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x53, 0x48, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x53, 0x48, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x53, 0x48, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x53, 0x48, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x53, 0x48, 0x41, 0x75, 0x74, 0x68, 0x4b, + 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x53, 0x48, 0x41, 0x75, 0x74, + 0x68, 0x4b, 0x65, 0x79, 0x22, 0xd5, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x4f, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x12, 0x2e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x3a, 0x0a, 0x0f, 0x53, 0x53, 0x48, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x53, 0x53, 0x48, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x53, 0x53, 0x48, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x6f, 0x0a, 0x13, + 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x73, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, 0x73, 0x4c, 0x6f, 0x67, 0x67, 0x65, + 0x64, 0x49, 0x6e, 0x12, 0x38, 0x0a, 0x0a, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x79, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x0a, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x4f, 0x0a, + 0x17, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x50, 0x75, 0x73, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x55, 0x52, 0x4c, 0x2a, 0x38, + 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x52, 0x4f, 0x58, + 0x59, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x53, 0x48, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, + 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, 0x02, 0x32, 0xb4, 0x0f, 0x0a, 0x12, 0x41, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x39, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x41, 0x70, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, + 0x70, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x14, 0x4c, 0x69, + 0x73, 0x74, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x41, 0x70, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x65, 0x0a, + 0x27, 0x47, 0x65, 0x74, 0x48, 0x65, 0x6c, 0x6d, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, + 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x11, 0x2e, 0x41, 0x70, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x57, 0x69, + 0x74, 0x68, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x12, 0x11, 0x2e, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x11, 0x2e, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x09, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, + 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0b, + 0x55, 0x6e, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x48, 0x69, + 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, + 0x2e, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x11, 0x2e, 0x41, + 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x48, 0x65, 0x6c, 0x6d, 0x41, 0x70, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x11, 0x2e, + 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0c, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, + 0x12, 0x40, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, + 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x43, 0x0a, 0x10, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x19, 0x2e, 0x55, 0x6e, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0e, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x16, 0x2e, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x12, 0x18, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, - 0x6d, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x38, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, - 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, - 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xa7, 0x04, 0x0a, 0x15, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x11, 0x72, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x68, - 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x3a, - 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x0f, 0x63, 0x68, 0x61, 0x72, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x4b, 0x38, - 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x12, 0x43, 0x0a, 0x12, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x12, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, - 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x3e, 0x0a, - 0x1a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x1a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x41, 0x70, 0x70, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x12, 0x31, 0x0a, - 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x71, 0x0a, 0x19, 0x42, 0x75, - 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x19, 0x42, 0x75, 0x6c, 0x6b, 0x49, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0e, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x16, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x19, 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x32, 0x0a, - 0x16, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x74, 0x0a, 0x16, - 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x15, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, - 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x71, 0x0a, 0x19, 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x54, 0x0a, 0x19, 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, - 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x19, 0x42, 0x75, 0x6c, - 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9d, 0x01, 0x0a, 0x1e, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x50, 0x0a, 0x1b, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x57, 0x69, 0x74, 0x68, 0x43, 0x68, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, + 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3c, 0x0a, 0x12, 0x49, 0x73, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x10, 0x2e, 0x42, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x0f, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x12, 0x17, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x42, 0x6f, + 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x41, 0x0a, 0x0d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, + 0x12, 0x16, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x57, 0x69, 0x74, 0x68, 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x4c, 0x0a, 0x15, 0x74, 0x65, 0x6d, + 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x11, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x12, 0x1a, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x1d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x43, 0x68, 0x61, + 0x72, 0x74, 0x12, 0x16, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x15, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x74, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x43, 0x68, - 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x72, - 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xeb, 0x01, 0x0a, 0x18, 0x48, 0x65, 0x6c, 0x6d, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, 0x61, 0x6d, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x59, - 0x61, 0x6d, 0x6c, 0x12, 0x31, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x43, 0x68, 0x61, 0x72, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x49, - 0x6e, 0x43, 0x74, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x52, 0x75, 0x6e, 0x49, - 0x6e, 0x43, 0x74, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4b, 0x38, 0x73, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x19, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x28, 0x0a, 0x0c, 0x43, - 0x68, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x49, 0x0a, 0x03, 0x47, 0x76, 0x6b, 0x12, 0x14, 0x0a, 0x05, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x4b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4b, 0x69, 0x6e, 0x64, - 0x22, 0x6d, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x12, 0x16, 0x0a, 0x03, 0x67, 0x76, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x04, 0x2e, 0x47, 0x76, 0x6b, 0x52, 0x03, 0x67, 0x76, 0x6b, 0x12, 0x43, 0x0a, 0x12, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x12, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, - 0x88, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, - 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, 0x01, 0x0a, 0x12, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0f, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x6f, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, - 0x6f, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x65, - 0x73, 0x22, 0xd1, 0x01, 0x0a, 0x12, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x68, 0x61, 0x72, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x43, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x43, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x73, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, 0x73, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x12, 0x43, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x52, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x22, 0xeb, 0x03, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0b, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x1a, - 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x77, 0x73, 0x52, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x77, 0x73, 0x52, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, - 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x4f, 0x0a, 0x16, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1e, 0x0a, - 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, - 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x30, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x22, 0x29, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x72, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x72, 0x6c, 0x22, 0xa1, - 0x01, 0x0a, 0x0f, 0x53, 0x53, 0x48, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x2a, 0x0a, 0x10, 0x53, 0x53, 0x48, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x53, 0x53, - 0x48, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, - 0x0a, 0x0b, 0x53, 0x53, 0x48, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x53, 0x48, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x53, 0x48, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x53, 0x53, 0x48, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x53, 0x48, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, 0x53, 0x48, 0x41, 0x75, 0x74, 0x68, 0x4b, - 0x65, 0x79, 0x22, 0xd5, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4f, 0x0a, - 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2e, - 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, - 0x0a, 0x0f, 0x53, 0x53, 0x48, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x53, 0x53, 0x48, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x53, 0x53, 0x48, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x6f, 0x0a, 0x13, 0x4f, 0x43, - 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x73, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, 0x73, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, - 0x6e, 0x12, 0x38, 0x0a, 0x0a, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x0a, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x4f, 0x0a, 0x17, 0x4f, - 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x50, 0x75, 0x73, 0x68, 0x65, 0x64, 0x55, 0x52, 0x4c, 0x2a, 0x38, 0x0a, 0x16, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x10, - 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x53, 0x48, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x49, - 0x52, 0x45, 0x43, 0x54, 0x10, 0x02, 0x32, 0xcd, 0x0e, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x39, 0x0a, - 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x0f, 0x2e, 0x41, 0x70, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x0f, 0x2e, 0x41, 0x70, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2f, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x11, 0x2e, 0x41, 0x70, - 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, - 0x2e, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x11, 0x2e, 0x41, - 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0a, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x34, 0x0a, - 0x09, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x48, 0x69, 0x62, - 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, - 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0b, 0x55, 0x6e, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, - 0x74, 0x65, 0x12, 0x11, 0x2e, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x11, 0x2e, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x48, 0x65, 0x6c, 0x6d, 0x41, 0x70, 0x70, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x11, 0x2e, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0c, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x73, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x2e, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x10, 0x55, 0x6e, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x12, 0x2e, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x1a, 0x19, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, - 0x0a, 0x0e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x12, 0x16, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x2e, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x43, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x12, 0x16, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x1b, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x43, 0x68, 0x61, 0x72, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x12, 0x49, 0x73, 0x52, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x12, - 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x1a, 0x10, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x0f, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, 0x17, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0d, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x11, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x42, 0x75, 0x6c, 0x6b, 0x12, 0x1a, - 0x2e, 0x42, 0x75, 0x6c, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x42, 0x75, 0x6c, - 0x6b, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x1d, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x74, 0x72, - 0x69, 0x65, 0x76, 0x65, 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x43, 0x68, 0x61, - 0x72, 0x74, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x1d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x19, 0x2e, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1a, 0x2e, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x1d, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x79, 0x12, 0x13, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x4f, 0x43, 0x49, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x49, 0x0a, 0x1a, 0x50, 0x75, 0x73, 0x68, 0x48, 0x65, 0x6c, 0x6d, 0x43, 0x68, 0x61, - 0x72, 0x74, 0x54, 0x6f, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, - 0x13, 0x2e, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x23, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x46, - 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x15, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x15, - 0x2e, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x12, 0x2e, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x1a, 0x12, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x22, 0x00, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x76, 0x74, 0x72, 0x6f, 0x6e, 0x2d, 0x6c, 0x61, 0x62, - 0x73, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x6c, 0x69, 0x6e, 0x6b, 0x2f, 0x62, 0x65, 0x61, 0x6e, 0x2f, - 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x43, 0x68, 0x61, 0x72, 0x74, 0x22, 0x00, 0x12, 0x58, 0x0a, + 0x1d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x57, + 0x69, 0x74, 0x68, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x19, + 0x2e, 0x48, 0x65, 0x6c, 0x6d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x48, 0x65, 0x6c, 0x6d, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x74, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x52, 0x0a, 0x1d, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x13, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x1a, 0x50, 0x75, + 0x73, 0x68, 0x48, 0x65, 0x6c, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x74, 0x54, 0x6f, 0x4f, 0x43, 0x49, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x12, 0x13, 0x2e, 0x4f, 0x43, 0x49, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x4f, 0x43, 0x49, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x46, 0x6f, 0x72, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, + 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x15, 0x2e, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, + 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, + 0x2e, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x00, + 0x12, 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x12, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0x12, 0x2e, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x00, 0x42, + 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, + 0x76, 0x74, 0x72, 0x6f, 0x6e, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x6c, + 0x69, 0x6e, 0x6b, 0x2f, 0x62, 0x65, 0x61, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5206,79 +5394,81 @@ func file_grpc_applist_proto_rawDescGZIP() []byte { } var file_grpc_applist_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_grpc_applist_proto_msgTypes = make([]protoimpl.MessageInfo, 66) +var file_grpc_applist_proto_msgTypes = make([]protoimpl.MessageInfo, 68) var file_grpc_applist_proto_goTypes = []interface{}{ - (RemoteConnectionMethod)(0), // 0: RemoteConnectionMethod - (*ClusterConfig)(nil), // 1: ClusterConfig - (*AppListRequest)(nil), // 2: AppListRequest - (*ExternalResourceTreeRequest)(nil), // 3: ExternalResourceTreeRequest - (*ExternalResourceDetail)(nil), // 4: ExternalResourceDetail - (*DeployedAppList)(nil), // 5: DeployedAppList - (*FluxApplicationList)(nil), // 6: FluxApplicationList - (*FluxApplication)(nil), // 7: FluxApplication - (*FluxAppDetailRequest)(nil), // 8: FluxAppDetailRequest - (*FluxAppDetail)(nil), // 9: FluxAppDetail - (*FluxAppStatusDetail)(nil), // 10: FluxAppStatusDetail - (*DeployedAppDetail)(nil), // 11: DeployedAppDetail - (*EnvironmentDetails)(nil), // 12: EnvironmentDetails - (*AppDetailRequest)(nil), // 13: AppDetailRequest - (*AppDetail)(nil), // 14: AppDetail - (*AppStatus)(nil), // 15: AppStatus - (*ReleaseStatus)(nil), // 16: ReleaseStatus - (*ChartMetadata)(nil), // 17: ChartMetadata - (*ResourceTreeResponse)(nil), // 18: ResourceTreeResponse - (*ResourceNode)(nil), // 19: ResourceNode - (*InfoItem)(nil), // 20: InfoItem - (*HealthStatus)(nil), // 21: HealthStatus - (*ResourceNetworkingInfo)(nil), // 22: ResourceNetworkingInfo - (*ResourceRef)(nil), // 23: ResourceRef - (*PodMetadata)(nil), // 24: PodMetadata - (*EphemeralContainerData)(nil), // 25: EphemeralContainerData - (*HibernateRequest)(nil), // 26: HibernateRequest - (*ObjectIdentifier)(nil), // 27: ObjectIdentifier - (*HibernateStatus)(nil), // 28: HibernateStatus - (*HibernateResponse)(nil), // 29: HibernateResponse - (*HelmAppDeploymentDetail)(nil), // 30: HelmAppDeploymentDetail - (*HelmAppDeploymentHistory)(nil), // 31: HelmAppDeploymentHistory - (*ReleaseInfo)(nil), // 32: ReleaseInfo - (*ObjectRequest)(nil), // 33: ObjectRequest - (*DesiredManifestResponse)(nil), // 34: DesiredManifestResponse - (*UninstallReleaseResponse)(nil), // 35: UninstallReleaseResponse - (*ReleaseIdentifier)(nil), // 36: ReleaseIdentifier - (*UpgradeReleaseRequest)(nil), // 37: UpgradeReleaseRequest - (*UpgradeReleaseResponse)(nil), // 38: UpgradeReleaseResponse - (*DeploymentDetailRequest)(nil), // 39: DeploymentDetailRequest - (*DeploymentDetailResponse)(nil), // 40: DeploymentDetailResponse - (*ChartRepository)(nil), // 41: ChartRepository - (*InstallReleaseRequest)(nil), // 42: InstallReleaseRequest - (*BulkInstallReleaseRequest)(nil), // 43: BulkInstallReleaseRequest - (*InstallReleaseResponse)(nil), // 44: InstallReleaseResponse - (*BooleanResponse)(nil), // 45: BooleanResponse - (*RollbackReleaseRequest)(nil), // 46: RollbackReleaseRequest - (*TemplateChartResponse)(nil), // 47: TemplateChartResponse - (*BulkTemplateChartResponse)(nil), // 48: BulkTemplateChartResponse - (*TemplateChartResponseWithChart)(nil), // 49: TemplateChartResponseWithChart - (*HelmInstallCustomRequest)(nil), // 50: HelmInstallCustomRequest - (*HelmInstallCustomResponse)(nil), // 51: HelmInstallCustomResponse - (*ChartContent)(nil), // 52: ChartContent - (*Gvk)(nil), // 53: Gvk - (*ResourceFilter)(nil), // 54: ResourceFilter - (*ResourceIdentifier)(nil), // 55: ResourceIdentifier - (*ResourceTreeFilter)(nil), // 56: ResourceTreeFilter - (*ChartNotesResponse)(nil), // 57: ChartNotesResponse - (*OCIRegistryRequest)(nil), // 58: OCIRegistryRequest - (*RegistryCredential)(nil), // 59: RegistryCredential - (*ProxyConfig)(nil), // 60: ProxyConfig - (*SSHTunnelConfig)(nil), // 61: SSHTunnelConfig - (*RemoteConnectionConfig)(nil), // 62: RemoteConnectionConfig - (*OCIRegistryResponse)(nil), // 63: OCIRegistryResponse - (*OCIRegistryPushResponse)(nil), // 64: OCIRegistryPushResponse - nil, // 65: ResourceNetworkingInfo.LabelsEntry - nil, // 66: ResourceIdentifier.LabelsEntry - (*timestamp.Timestamp)(nil), // 67: google.protobuf.Timestamp + (RemoteConnectionMethod)(0), // 0: RemoteConnectionMethod + (*ClusterConfig)(nil), // 1: ClusterConfig + (*AppListRequest)(nil), // 2: AppListRequest + (*ExternalResourceTreeRequest)(nil), // 3: ExternalResourceTreeRequest + (*ExternalResourceDetail)(nil), // 4: ExternalResourceDetail + (*DeployedAppList)(nil), // 5: DeployedAppList + (*FluxApplicationList)(nil), // 6: FluxApplicationList + (*FluxApplication)(nil), // 7: FluxApplication + (*FluxAppDetailRequest)(nil), // 8: FluxAppDetailRequest + (*FluxAppDetail)(nil), // 9: FluxAppDetail + (*FluxAppStatusDetail)(nil), // 10: FluxAppStatusDetail + (*DeployedAppDetail)(nil), // 11: DeployedAppDetail + (*EnvironmentDetails)(nil), // 12: EnvironmentDetails + (*AppDetailRequest)(nil), // 13: AppDetailRequest + (*AppDetail)(nil), // 14: AppDetail + (*AppStatus)(nil), // 15: AppStatus + (*ReleaseStatus)(nil), // 16: ReleaseStatus + (*ChartMetadata)(nil), // 17: ChartMetadata + (*ResourceTreeResponse)(nil), // 18: ResourceTreeResponse + (*ResourceNode)(nil), // 19: ResourceNode + (*InfoItem)(nil), // 20: InfoItem + (*HealthStatus)(nil), // 21: HealthStatus + (*ResourceNetworkingInfo)(nil), // 22: ResourceNetworkingInfo + (*ResourceRef)(nil), // 23: ResourceRef + (*PodMetadata)(nil), // 24: PodMetadata + (*EphemeralContainerData)(nil), // 25: EphemeralContainerData + (*AppConfigRequest)(nil), // 26: AppConfigRequest + (*GetReleaseDetailWithManifestResponse)(nil), // 27: GetReleaseDetailWithManifestResponse + (*HibernateRequest)(nil), // 28: HibernateRequest + (*ObjectIdentifier)(nil), // 29: ObjectIdentifier + (*HibernateStatus)(nil), // 30: HibernateStatus + (*HibernateResponse)(nil), // 31: HibernateResponse + (*HelmAppDeploymentDetail)(nil), // 32: HelmAppDeploymentDetail + (*HelmAppDeploymentHistory)(nil), // 33: HelmAppDeploymentHistory + (*ReleaseInfo)(nil), // 34: ReleaseInfo + (*ObjectRequest)(nil), // 35: ObjectRequest + (*DesiredManifestResponse)(nil), // 36: DesiredManifestResponse + (*UninstallReleaseResponse)(nil), // 37: UninstallReleaseResponse + (*ReleaseIdentifier)(nil), // 38: ReleaseIdentifier + (*UpgradeReleaseRequest)(nil), // 39: UpgradeReleaseRequest + (*UpgradeReleaseResponse)(nil), // 40: UpgradeReleaseResponse + (*DeploymentDetailRequest)(nil), // 41: DeploymentDetailRequest + (*DeploymentDetailResponse)(nil), // 42: DeploymentDetailResponse + (*ChartRepository)(nil), // 43: ChartRepository + (*InstallReleaseRequest)(nil), // 44: InstallReleaseRequest + (*BulkInstallReleaseRequest)(nil), // 45: BulkInstallReleaseRequest + (*InstallReleaseResponse)(nil), // 46: InstallReleaseResponse + (*BooleanResponse)(nil), // 47: BooleanResponse + (*RollbackReleaseRequest)(nil), // 48: RollbackReleaseRequest + (*TemplateChartResponse)(nil), // 49: TemplateChartResponse + (*BulkTemplateChartResponse)(nil), // 50: BulkTemplateChartResponse + (*TemplateChartResponseWithChart)(nil), // 51: TemplateChartResponseWithChart + (*HelmInstallCustomRequest)(nil), // 52: HelmInstallCustomRequest + (*HelmInstallCustomResponse)(nil), // 53: HelmInstallCustomResponse + (*ChartContent)(nil), // 54: ChartContent + (*Gvk)(nil), // 55: Gvk + (*ResourceFilter)(nil), // 56: ResourceFilter + (*ResourceIdentifier)(nil), // 57: ResourceIdentifier + (*ResourceTreeFilter)(nil), // 58: ResourceTreeFilter + (*ChartNotesResponse)(nil), // 59: ChartNotesResponse + (*OCIRegistryRequest)(nil), // 60: OCIRegistryRequest + (*RegistryCredential)(nil), // 61: RegistryCredential + (*ProxyConfig)(nil), // 62: ProxyConfig + (*SSHTunnelConfig)(nil), // 63: SSHTunnelConfig + (*RemoteConnectionConfig)(nil), // 64: RemoteConnectionConfig + (*OCIRegistryResponse)(nil), // 65: OCIRegistryResponse + (*OCIRegistryPushResponse)(nil), // 66: OCIRegistryPushResponse + nil, // 67: ResourceNetworkingInfo.LabelsEntry + nil, // 68: ResourceIdentifier.LabelsEntry + (*timestamp.Timestamp)(nil), // 69: google.protobuf.Timestamp } var file_grpc_applist_proto_depIdxs = []int32{ - 62, // 0: ClusterConfig.RemoteConnectionConfig:type_name -> RemoteConnectionConfig + 64, // 0: ClusterConfig.RemoteConnectionConfig:type_name -> RemoteConnectionConfig 1, // 1: AppListRequest.clusters:type_name -> ClusterConfig 1, // 2: ExternalResourceTreeRequest.clusterConfig:type_name -> ClusterConfig 4, // 3: ExternalResourceTreeRequest.externalResourceDetail:type_name -> ExternalResourceDetail @@ -5290,118 +5480,126 @@ var file_grpc_applist_proto_depIdxs = []int32{ 10, // 9: FluxAppDetail.FluxAppStatusDetail:type_name -> FluxAppStatusDetail 18, // 10: FluxAppDetail.resourceTreeResponse:type_name -> ResourceTreeResponse 12, // 11: DeployedAppDetail.environmentDetail:type_name -> EnvironmentDetails - 67, // 12: DeployedAppDetail.LastDeployed:type_name -> google.protobuf.Timestamp + 69, // 12: DeployedAppDetail.LastDeployed:type_name -> google.protobuf.Timestamp 1, // 13: AppDetailRequest.clusterConfig:type_name -> ClusterConfig - 56, // 14: AppDetailRequest.resourceTreeFilter:type_name -> ResourceTreeFilter + 58, // 14: AppDetailRequest.resourceTreeFilter:type_name -> ResourceTreeFilter 16, // 15: AppDetail.releaseStatus:type_name -> ReleaseStatus - 67, // 16: AppDetail.lastDeployed:type_name -> google.protobuf.Timestamp + 69, // 16: AppDetail.lastDeployed:type_name -> google.protobuf.Timestamp 17, // 17: AppDetail.chartMetadata:type_name -> ChartMetadata 18, // 18: AppDetail.resourceTreeResponse:type_name -> ResourceTreeResponse 12, // 19: AppDetail.environmentDetails:type_name -> EnvironmentDetails - 67, // 20: AppStatus.LastDeployed:type_name -> google.protobuf.Timestamp + 69, // 20: AppStatus.LastDeployed:type_name -> google.protobuf.Timestamp 19, // 21: ResourceTreeResponse.nodes:type_name -> ResourceNode 24, // 22: ResourceTreeResponse.podMetadata:type_name -> PodMetadata 23, // 23: ResourceNode.parentRefs:type_name -> ResourceRef 22, // 24: ResourceNode.networkingInfo:type_name -> ResourceNetworkingInfo 21, // 25: ResourceNode.health:type_name -> HealthStatus 20, // 26: ResourceNode.info:type_name -> InfoItem - 65, // 27: ResourceNetworkingInfo.labels:type_name -> ResourceNetworkingInfo.LabelsEntry + 67, // 27: ResourceNetworkingInfo.labels:type_name -> ResourceNetworkingInfo.LabelsEntry 25, // 28: PodMetadata.ephemeralContainers:type_name -> EphemeralContainerData - 1, // 29: HibernateRequest.clusterConfig:type_name -> ClusterConfig - 27, // 30: HibernateRequest.objectIdentifier:type_name -> ObjectIdentifier - 27, // 31: HibernateStatus.targetObject:type_name -> ObjectIdentifier - 28, // 32: HibernateResponse.status:type_name -> HibernateStatus - 17, // 33: HelmAppDeploymentDetail.chartMetadata:type_name -> ChartMetadata - 67, // 34: HelmAppDeploymentDetail.deployedAt:type_name -> google.protobuf.Timestamp - 30, // 35: HelmAppDeploymentHistory.deploymentHistory:type_name -> HelmAppDeploymentDetail - 11, // 36: ReleaseInfo.deployedAppDetail:type_name -> DeployedAppDetail - 1, // 37: ObjectRequest.clusterConfig:type_name -> ClusterConfig - 27, // 38: ObjectRequest.objectIdentifier:type_name -> ObjectIdentifier - 1, // 39: ReleaseIdentifier.clusterConfig:type_name -> ClusterConfig - 36, // 40: UpgradeReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 52, // 41: UpgradeReleaseRequest.chartContent:type_name -> ChartContent - 36, // 42: DeploymentDetailRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 36, // 43: InstallReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 41, // 44: InstallReleaseRequest.chartRepository:type_name -> ChartRepository - 59, // 45: InstallReleaseRequest.RegistryCredential:type_name -> RegistryCredential - 52, // 46: InstallReleaseRequest.chartContent:type_name -> ChartContent - 42, // 47: BulkInstallReleaseRequest.BulkInstallReleaseRequest:type_name -> InstallReleaseRequest - 36, // 48: RollbackReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 47, // 49: BulkTemplateChartResponse.BulkTemplateChartResponse:type_name -> TemplateChartResponse - 47, // 50: TemplateChartResponseWithChart.templateChartResponse:type_name -> TemplateChartResponse - 52, // 51: TemplateChartResponseWithChart.chartBytes:type_name -> ChartContent - 52, // 52: HelmInstallCustomRequest.chartContent:type_name -> ChartContent - 36, // 53: HelmInstallCustomRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 53, // 54: ResourceFilter.gvk:type_name -> Gvk - 55, // 55: ResourceFilter.resourceIdentifier:type_name -> ResourceIdentifier - 66, // 56: ResourceIdentifier.labels:type_name -> ResourceIdentifier.LabelsEntry - 55, // 57: ResourceTreeFilter.globalFilter:type_name -> ResourceIdentifier - 54, // 58: ResourceTreeFilter.resourceFilters:type_name -> ResourceFilter - 59, // 59: OCIRegistryRequest.RegistryCredential:type_name -> RegistryCredential - 62, // 60: RegistryCredential.RemoteConnectionConfig:type_name -> RemoteConnectionConfig - 0, // 61: RemoteConnectionConfig.RemoteConnectionMethod:type_name -> RemoteConnectionMethod - 60, // 62: RemoteConnectionConfig.ProxyConfig:type_name -> ProxyConfig - 61, // 63: RemoteConnectionConfig.SSHTunnelConfig:type_name -> SSHTunnelConfig - 64, // 64: OCIRegistryResponse.PushResult:type_name -> OCIRegistryPushResponse - 2, // 65: ApplicationService.ListApplications:input_type -> AppListRequest - 2, // 66: ApplicationService.ListFluxApplications:input_type -> AppListRequest - 13, // 67: ApplicationService.GetAppDetail:input_type -> AppDetailRequest - 13, // 68: ApplicationService.GetAppStatus:input_type -> AppDetailRequest - 26, // 69: ApplicationService.Hibernate:input_type -> HibernateRequest - 26, // 70: ApplicationService.UnHibernate:input_type -> HibernateRequest - 13, // 71: ApplicationService.GetDeploymentHistory:input_type -> AppDetailRequest - 13, // 72: ApplicationService.GetValuesYaml:input_type -> AppDetailRequest - 33, // 73: ApplicationService.GetDesiredManifest:input_type -> ObjectRequest - 36, // 74: ApplicationService.UninstallRelease:input_type -> ReleaseIdentifier - 37, // 75: ApplicationService.UpgradeRelease:input_type -> UpgradeReleaseRequest - 39, // 76: ApplicationService.GetDeploymentDetail:input_type -> DeploymentDetailRequest - 42, // 77: ApplicationService.InstallRelease:input_type -> InstallReleaseRequest - 42, // 78: ApplicationService.UpgradeReleaseWithChartInfo:input_type -> InstallReleaseRequest - 36, // 79: ApplicationService.IsReleaseInstalled:input_type -> ReleaseIdentifier - 46, // 80: ApplicationService.RollbackRelease:input_type -> RollbackReleaseRequest - 42, // 81: ApplicationService.TemplateChart:input_type -> InstallReleaseRequest - 43, // 82: ApplicationService.TemplateChartBulk:input_type -> BulkInstallReleaseRequest - 42, // 83: ApplicationService.TemplateChartAndRetrieveChart:input_type -> InstallReleaseRequest - 50, // 84: ApplicationService.InstallReleaseWithCustomChart:input_type -> HelmInstallCustomRequest - 42, // 85: ApplicationService.GetNotes:input_type -> InstallReleaseRequest - 37, // 86: ApplicationService.UpgradeReleaseWithCustomChart:input_type -> UpgradeReleaseRequest - 59, // 87: ApplicationService.ValidateOCIRegistry:input_type -> RegistryCredential - 58, // 88: ApplicationService.PushHelmChartToOCIRegistry:input_type -> OCIRegistryRequest - 3, // 89: ApplicationService.GetResourceTreeForExternalResources:input_type -> ExternalResourceTreeRequest - 8, // 90: ApplicationService.GetFluxAppDetail:input_type -> FluxAppDetailRequest - 36, // 91: ApplicationService.GetReleaseDetails:input_type -> ReleaseIdentifier - 5, // 92: ApplicationService.ListApplications:output_type -> DeployedAppList - 6, // 93: ApplicationService.ListFluxApplications:output_type -> FluxApplicationList - 14, // 94: ApplicationService.GetAppDetail:output_type -> AppDetail - 15, // 95: ApplicationService.GetAppStatus:output_type -> AppStatus - 29, // 96: ApplicationService.Hibernate:output_type -> HibernateResponse - 29, // 97: ApplicationService.UnHibernate:output_type -> HibernateResponse - 31, // 98: ApplicationService.GetDeploymentHistory:output_type -> HelmAppDeploymentHistory - 32, // 99: ApplicationService.GetValuesYaml:output_type -> ReleaseInfo - 34, // 100: ApplicationService.GetDesiredManifest:output_type -> DesiredManifestResponse - 35, // 101: ApplicationService.UninstallRelease:output_type -> UninstallReleaseResponse - 38, // 102: ApplicationService.UpgradeRelease:output_type -> UpgradeReleaseResponse - 40, // 103: ApplicationService.GetDeploymentDetail:output_type -> DeploymentDetailResponse - 44, // 104: ApplicationService.InstallRelease:output_type -> InstallReleaseResponse - 38, // 105: ApplicationService.UpgradeReleaseWithChartInfo:output_type -> UpgradeReleaseResponse - 45, // 106: ApplicationService.IsReleaseInstalled:output_type -> BooleanResponse - 45, // 107: ApplicationService.RollbackRelease:output_type -> BooleanResponse - 47, // 108: ApplicationService.TemplateChart:output_type -> TemplateChartResponse - 48, // 109: ApplicationService.TemplateChartBulk:output_type -> BulkTemplateChartResponse - 49, // 110: ApplicationService.TemplateChartAndRetrieveChart:output_type -> TemplateChartResponseWithChart - 51, // 111: ApplicationService.InstallReleaseWithCustomChart:output_type -> HelmInstallCustomResponse - 57, // 112: ApplicationService.GetNotes:output_type -> ChartNotesResponse - 38, // 113: ApplicationService.UpgradeReleaseWithCustomChart:output_type -> UpgradeReleaseResponse - 63, // 114: ApplicationService.ValidateOCIRegistry:output_type -> OCIRegistryResponse - 63, // 115: ApplicationService.PushHelmChartToOCIRegistry:output_type -> OCIRegistryResponse - 18, // 116: ApplicationService.GetResourceTreeForExternalResources:output_type -> ResourceTreeResponse - 9, // 117: ApplicationService.GetFluxAppDetail:output_type -> FluxAppDetail - 11, // 118: ApplicationService.GetReleaseDetails:output_type -> DeployedAppDetail - 92, // [92:119] is the sub-list for method output_type - 65, // [65:92] is the sub-list for method input_type - 65, // [65:65] is the sub-list for extension type_name - 65, // [65:65] is the sub-list for extension extendee - 0, // [0:65] is the sub-list for field type_name + 1, // 29: AppConfigRequest.clusterConfig:type_name -> ClusterConfig + 29, // 30: GetReleaseDetailWithManifestResponse.parentObjects:type_name -> ObjectIdentifier + 16, // 31: GetReleaseDetailWithManifestResponse.releaseStatus:type_name -> ReleaseStatus + 69, // 32: GetReleaseDetailWithManifestResponse.lastDeployed:type_name -> google.protobuf.Timestamp + 17, // 33: GetReleaseDetailWithManifestResponse.chartMetadata:type_name -> ChartMetadata + 12, // 34: GetReleaseDetailWithManifestResponse.environmentDetails:type_name -> EnvironmentDetails + 1, // 35: HibernateRequest.clusterConfig:type_name -> ClusterConfig + 29, // 36: HibernateRequest.objectIdentifier:type_name -> ObjectIdentifier + 29, // 37: HibernateStatus.targetObject:type_name -> ObjectIdentifier + 30, // 38: HibernateResponse.status:type_name -> HibernateStatus + 17, // 39: HelmAppDeploymentDetail.chartMetadata:type_name -> ChartMetadata + 69, // 40: HelmAppDeploymentDetail.deployedAt:type_name -> google.protobuf.Timestamp + 32, // 41: HelmAppDeploymentHistory.deploymentHistory:type_name -> HelmAppDeploymentDetail + 11, // 42: ReleaseInfo.deployedAppDetail:type_name -> DeployedAppDetail + 1, // 43: ObjectRequest.clusterConfig:type_name -> ClusterConfig + 29, // 44: ObjectRequest.objectIdentifier:type_name -> ObjectIdentifier + 1, // 45: ReleaseIdentifier.clusterConfig:type_name -> ClusterConfig + 38, // 46: UpgradeReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 54, // 47: UpgradeReleaseRequest.chartContent:type_name -> ChartContent + 38, // 48: DeploymentDetailRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 38, // 49: InstallReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 43, // 50: InstallReleaseRequest.chartRepository:type_name -> ChartRepository + 61, // 51: InstallReleaseRequest.RegistryCredential:type_name -> RegistryCredential + 54, // 52: InstallReleaseRequest.chartContent:type_name -> ChartContent + 44, // 53: BulkInstallReleaseRequest.BulkInstallReleaseRequest:type_name -> InstallReleaseRequest + 38, // 54: RollbackReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 49, // 55: BulkTemplateChartResponse.BulkTemplateChartResponse:type_name -> TemplateChartResponse + 49, // 56: TemplateChartResponseWithChart.templateChartResponse:type_name -> TemplateChartResponse + 54, // 57: TemplateChartResponseWithChart.chartBytes:type_name -> ChartContent + 54, // 58: HelmInstallCustomRequest.chartContent:type_name -> ChartContent + 38, // 59: HelmInstallCustomRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 55, // 60: ResourceFilter.gvk:type_name -> Gvk + 57, // 61: ResourceFilter.resourceIdentifier:type_name -> ResourceIdentifier + 68, // 62: ResourceIdentifier.labels:type_name -> ResourceIdentifier.LabelsEntry + 57, // 63: ResourceTreeFilter.globalFilter:type_name -> ResourceIdentifier + 56, // 64: ResourceTreeFilter.resourceFilters:type_name -> ResourceFilter + 61, // 65: OCIRegistryRequest.RegistryCredential:type_name -> RegistryCredential + 64, // 66: RegistryCredential.RemoteConnectionConfig:type_name -> RemoteConnectionConfig + 0, // 67: RemoteConnectionConfig.RemoteConnectionMethod:type_name -> RemoteConnectionMethod + 62, // 68: RemoteConnectionConfig.ProxyConfig:type_name -> ProxyConfig + 63, // 69: RemoteConnectionConfig.SSHTunnelConfig:type_name -> SSHTunnelConfig + 66, // 70: OCIRegistryResponse.PushResult:type_name -> OCIRegistryPushResponse + 2, // 71: ApplicationService.ListApplications:input_type -> AppListRequest + 2, // 72: ApplicationService.ListFluxApplications:input_type -> AppListRequest + 26, // 73: ApplicationService.GetHelmReleaseDetailWithDesiredManifest:input_type -> AppConfigRequest + 13, // 74: ApplicationService.GetAppDetail:input_type -> AppDetailRequest + 13, // 75: ApplicationService.GetAppStatus:input_type -> AppDetailRequest + 28, // 76: ApplicationService.Hibernate:input_type -> HibernateRequest + 28, // 77: ApplicationService.UnHibernate:input_type -> HibernateRequest + 13, // 78: ApplicationService.GetDeploymentHistory:input_type -> AppDetailRequest + 13, // 79: ApplicationService.GetValuesYaml:input_type -> AppDetailRequest + 35, // 80: ApplicationService.GetDesiredManifest:input_type -> ObjectRequest + 38, // 81: ApplicationService.UninstallRelease:input_type -> ReleaseIdentifier + 39, // 82: ApplicationService.UpgradeRelease:input_type -> UpgradeReleaseRequest + 41, // 83: ApplicationService.GetDeploymentDetail:input_type -> DeploymentDetailRequest + 44, // 84: ApplicationService.InstallRelease:input_type -> InstallReleaseRequest + 44, // 85: ApplicationService.UpgradeReleaseWithChartInfo:input_type -> InstallReleaseRequest + 38, // 86: ApplicationService.IsReleaseInstalled:input_type -> ReleaseIdentifier + 48, // 87: ApplicationService.RollbackRelease:input_type -> RollbackReleaseRequest + 44, // 88: ApplicationService.TemplateChart:input_type -> InstallReleaseRequest + 45, // 89: ApplicationService.TemplateChartBulk:input_type -> BulkInstallReleaseRequest + 44, // 90: ApplicationService.TemplateChartAndRetrieveChart:input_type -> InstallReleaseRequest + 52, // 91: ApplicationService.InstallReleaseWithCustomChart:input_type -> HelmInstallCustomRequest + 44, // 92: ApplicationService.GetNotes:input_type -> InstallReleaseRequest + 39, // 93: ApplicationService.UpgradeReleaseWithCustomChart:input_type -> UpgradeReleaseRequest + 61, // 94: ApplicationService.ValidateOCIRegistry:input_type -> RegistryCredential + 60, // 95: ApplicationService.PushHelmChartToOCIRegistry:input_type -> OCIRegistryRequest + 3, // 96: ApplicationService.GetResourceTreeForExternalResources:input_type -> ExternalResourceTreeRequest + 8, // 97: ApplicationService.GetFluxAppDetail:input_type -> FluxAppDetailRequest + 38, // 98: ApplicationService.GetReleaseDetails:input_type -> ReleaseIdentifier + 5, // 99: ApplicationService.ListApplications:output_type -> DeployedAppList + 6, // 100: ApplicationService.ListFluxApplications:output_type -> FluxApplicationList + 27, // 101: ApplicationService.GetHelmReleaseDetailWithDesiredManifest:output_type -> GetReleaseDetailWithManifestResponse + 14, // 102: ApplicationService.GetAppDetail:output_type -> AppDetail + 15, // 103: ApplicationService.GetAppStatus:output_type -> AppStatus + 31, // 104: ApplicationService.Hibernate:output_type -> HibernateResponse + 31, // 105: ApplicationService.UnHibernate:output_type -> HibernateResponse + 33, // 106: ApplicationService.GetDeploymentHistory:output_type -> HelmAppDeploymentHistory + 34, // 107: ApplicationService.GetValuesYaml:output_type -> ReleaseInfo + 36, // 108: ApplicationService.GetDesiredManifest:output_type -> DesiredManifestResponse + 37, // 109: ApplicationService.UninstallRelease:output_type -> UninstallReleaseResponse + 40, // 110: ApplicationService.UpgradeRelease:output_type -> UpgradeReleaseResponse + 42, // 111: ApplicationService.GetDeploymentDetail:output_type -> DeploymentDetailResponse + 46, // 112: ApplicationService.InstallRelease:output_type -> InstallReleaseResponse + 40, // 113: ApplicationService.UpgradeReleaseWithChartInfo:output_type -> UpgradeReleaseResponse + 47, // 114: ApplicationService.IsReleaseInstalled:output_type -> BooleanResponse + 47, // 115: ApplicationService.RollbackRelease:output_type -> BooleanResponse + 49, // 116: ApplicationService.TemplateChart:output_type -> TemplateChartResponse + 50, // 117: ApplicationService.TemplateChartBulk:output_type -> BulkTemplateChartResponse + 51, // 118: ApplicationService.TemplateChartAndRetrieveChart:output_type -> TemplateChartResponseWithChart + 53, // 119: ApplicationService.InstallReleaseWithCustomChart:output_type -> HelmInstallCustomResponse + 59, // 120: ApplicationService.GetNotes:output_type -> ChartNotesResponse + 40, // 121: ApplicationService.UpgradeReleaseWithCustomChart:output_type -> UpgradeReleaseResponse + 65, // 122: ApplicationService.ValidateOCIRegistry:output_type -> OCIRegistryResponse + 65, // 123: ApplicationService.PushHelmChartToOCIRegistry:output_type -> OCIRegistryResponse + 18, // 124: ApplicationService.GetResourceTreeForExternalResources:output_type -> ResourceTreeResponse + 9, // 125: ApplicationService.GetFluxAppDetail:output_type -> FluxAppDetail + 11, // 126: ApplicationService.GetReleaseDetails:output_type -> DeployedAppDetail + 99, // [99:127] is the sub-list for method output_type + 71, // [71:99] is the sub-list for method input_type + 71, // [71:71] is the sub-list for extension type_name + 71, // [71:71] is the sub-list for extension extendee + 0, // [0:71] is the sub-list for field type_name } func init() { file_grpc_applist_proto_init() } @@ -5711,7 +5909,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HibernateRequest); i { + switch v := v.(*AppConfigRequest); i { case 0: return &v.state case 1: @@ -5723,7 +5921,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObjectIdentifier); i { + switch v := v.(*GetReleaseDetailWithManifestResponse); i { case 0: return &v.state case 1: @@ -5735,7 +5933,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HibernateStatus); i { + switch v := v.(*HibernateRequest); i { case 0: return &v.state case 1: @@ -5747,7 +5945,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HibernateResponse); i { + switch v := v.(*ObjectIdentifier); i { case 0: return &v.state case 1: @@ -5759,7 +5957,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HelmAppDeploymentDetail); i { + switch v := v.(*HibernateStatus); i { case 0: return &v.state case 1: @@ -5771,7 +5969,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HelmAppDeploymentHistory); i { + switch v := v.(*HibernateResponse); i { case 0: return &v.state case 1: @@ -5783,7 +5981,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReleaseInfo); i { + switch v := v.(*HelmAppDeploymentDetail); i { case 0: return &v.state case 1: @@ -5795,7 +5993,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObjectRequest); i { + switch v := v.(*HelmAppDeploymentHistory); i { case 0: return &v.state case 1: @@ -5807,7 +6005,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DesiredManifestResponse); i { + switch v := v.(*ReleaseInfo); i { case 0: return &v.state case 1: @@ -5819,7 +6017,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UninstallReleaseResponse); i { + switch v := v.(*ObjectRequest); i { case 0: return &v.state case 1: @@ -5831,7 +6029,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReleaseIdentifier); i { + switch v := v.(*DesiredManifestResponse); i { case 0: return &v.state case 1: @@ -5843,7 +6041,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpgradeReleaseRequest); i { + switch v := v.(*UninstallReleaseResponse); i { case 0: return &v.state case 1: @@ -5855,7 +6053,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpgradeReleaseResponse); i { + switch v := v.(*ReleaseIdentifier); i { case 0: return &v.state case 1: @@ -5867,7 +6065,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeploymentDetailRequest); i { + switch v := v.(*UpgradeReleaseRequest); i { case 0: return &v.state case 1: @@ -5879,7 +6077,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeploymentDetailResponse); i { + switch v := v.(*UpgradeReleaseResponse); i { case 0: return &v.state case 1: @@ -5891,7 +6089,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChartRepository); i { + switch v := v.(*DeploymentDetailRequest); i { case 0: return &v.state case 1: @@ -5903,7 +6101,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstallReleaseRequest); i { + switch v := v.(*DeploymentDetailResponse); i { case 0: return &v.state case 1: @@ -5915,7 +6113,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BulkInstallReleaseRequest); i { + switch v := v.(*ChartRepository); i { case 0: return &v.state case 1: @@ -5927,7 +6125,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstallReleaseResponse); i { + switch v := v.(*InstallReleaseRequest); i { case 0: return &v.state case 1: @@ -5939,7 +6137,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BooleanResponse); i { + switch v := v.(*BulkInstallReleaseRequest); i { case 0: return &v.state case 1: @@ -5951,7 +6149,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RollbackReleaseRequest); i { + switch v := v.(*InstallReleaseResponse); i { case 0: return &v.state case 1: @@ -5963,7 +6161,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TemplateChartResponse); i { + switch v := v.(*BooleanResponse); i { case 0: return &v.state case 1: @@ -5975,7 +6173,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BulkTemplateChartResponse); i { + switch v := v.(*RollbackReleaseRequest); i { case 0: return &v.state case 1: @@ -5987,7 +6185,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TemplateChartResponseWithChart); i { + switch v := v.(*TemplateChartResponse); i { case 0: return &v.state case 1: @@ -5999,7 +6197,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HelmInstallCustomRequest); i { + switch v := v.(*BulkTemplateChartResponse); i { case 0: return &v.state case 1: @@ -6011,7 +6209,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HelmInstallCustomResponse); i { + switch v := v.(*TemplateChartResponseWithChart); i { case 0: return &v.state case 1: @@ -6023,7 +6221,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChartContent); i { + switch v := v.(*HelmInstallCustomRequest); i { case 0: return &v.state case 1: @@ -6035,7 +6233,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Gvk); i { + switch v := v.(*HelmInstallCustomResponse); i { case 0: return &v.state case 1: @@ -6047,7 +6245,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceFilter); i { + switch v := v.(*ChartContent); i { case 0: return &v.state case 1: @@ -6059,7 +6257,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceIdentifier); i { + switch v := v.(*Gvk); i { case 0: return &v.state case 1: @@ -6071,7 +6269,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceTreeFilter); i { + switch v := v.(*ResourceFilter); i { case 0: return &v.state case 1: @@ -6083,7 +6281,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChartNotesResponse); i { + switch v := v.(*ResourceIdentifier); i { case 0: return &v.state case 1: @@ -6095,7 +6293,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIRegistryRequest); i { + switch v := v.(*ResourceTreeFilter); i { case 0: return &v.state case 1: @@ -6107,7 +6305,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegistryCredential); i { + switch v := v.(*ChartNotesResponse); i { case 0: return &v.state case 1: @@ -6119,7 +6317,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProxyConfig); i { + switch v := v.(*OCIRegistryRequest); i { case 0: return &v.state case 1: @@ -6131,7 +6329,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SSHTunnelConfig); i { + switch v := v.(*RegistryCredential); i { case 0: return &v.state case 1: @@ -6143,7 +6341,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoteConnectionConfig); i { + switch v := v.(*ProxyConfig); i { case 0: return &v.state case 1: @@ -6155,7 +6353,7 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OCIRegistryResponse); i { + switch v := v.(*SSHTunnelConfig); i { case 0: return &v.state case 1: @@ -6167,6 +6365,30 @@ func file_grpc_applist_proto_init() { } } file_grpc_applist_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoteConnectionConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_grpc_applist_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OCIRegistryResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_grpc_applist_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OCIRegistryPushResponse); i { case 0: return &v.state @@ -6185,7 +6407,7 @@ func file_grpc_applist_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_grpc_applist_proto_rawDesc, NumEnums: 1, - NumMessages: 66, + NumMessages: 68, NumExtensions: 0, NumServices: 1, }, diff --git a/kubelink/grpc/applist.proto b/kubelink/grpc/applist.proto index fce845b60..8d2cc6698 100644 --- a/kubelink/grpc/applist.proto +++ b/kubelink/grpc/applist.proto @@ -20,9 +20,11 @@ message AppListRequest { repeated ClusterConfig clusters = 1; } + service ApplicationService { rpc ListApplications(AppListRequest) returns (stream DeployedAppList){} rpc ListFluxApplications(AppListRequest) returns (stream FluxApplicationList){} + rpc GetHelmReleaseDetailWithDesiredManifest(AppConfigRequest) returns (GetReleaseDetailWithManifestResponse){} rpc GetAppDetail(AppDetailRequest) returns (AppDetail){} rpc GetAppStatus(AppDetailRequest) returns (AppStatus){} rpc Hibernate(HibernateRequest) returns (HibernateResponse){} @@ -228,6 +230,23 @@ message EphemeralContainerData { string name = 1; bool isExternal = 2; } + +message AppConfigRequest { + ClusterConfig clusterConfig = 1; + string namespace = 2; + string ReleaseName = 3; +} + +message GetReleaseDetailWithManifestResponse{ + repeated ObjectIdentifier parentObjects = 1; + ReleaseStatus releaseStatus = 2; + google.protobuf.Timestamp lastDeployed = 3; + ChartMetadata chartMetadata = 4; + EnvironmentDetails environmentDetails = 5; + bool ReleaseExist = 6; +} + + //--------hibernate message HibernateRequest { diff --git a/kubelink/grpc/applist_grpc.pb.go b/kubelink/grpc/applist_grpc.pb.go index fcb367c2e..7b30b82c0 100644 --- a/kubelink/grpc/applist_grpc.pb.go +++ b/kubelink/grpc/applist_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 +// - protoc-gen-go-grpc v1.3.0 // - protoc v3.9.1 // source: grpc/applist.proto @@ -18,12 +18,44 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + ApplicationService_ListApplications_FullMethodName = "/ApplicationService/ListApplications" + ApplicationService_ListFluxApplications_FullMethodName = "/ApplicationService/ListFluxApplications" + ApplicationService_GetHelmReleaseDetailWithDesiredManifest_FullMethodName = "/ApplicationService/GetHelmReleaseDetailWithDesiredManifest" + ApplicationService_GetAppDetail_FullMethodName = "/ApplicationService/GetAppDetail" + ApplicationService_GetAppStatus_FullMethodName = "/ApplicationService/GetAppStatus" + ApplicationService_Hibernate_FullMethodName = "/ApplicationService/Hibernate" + ApplicationService_UnHibernate_FullMethodName = "/ApplicationService/UnHibernate" + ApplicationService_GetDeploymentHistory_FullMethodName = "/ApplicationService/GetDeploymentHistory" + ApplicationService_GetValuesYaml_FullMethodName = "/ApplicationService/GetValuesYaml" + ApplicationService_GetDesiredManifest_FullMethodName = "/ApplicationService/GetDesiredManifest" + ApplicationService_UninstallRelease_FullMethodName = "/ApplicationService/UninstallRelease" + ApplicationService_UpgradeRelease_FullMethodName = "/ApplicationService/UpgradeRelease" + ApplicationService_GetDeploymentDetail_FullMethodName = "/ApplicationService/GetDeploymentDetail" + ApplicationService_InstallRelease_FullMethodName = "/ApplicationService/InstallRelease" + ApplicationService_UpgradeReleaseWithChartInfo_FullMethodName = "/ApplicationService/UpgradeReleaseWithChartInfo" + ApplicationService_IsReleaseInstalled_FullMethodName = "/ApplicationService/IsReleaseInstalled" + ApplicationService_RollbackRelease_FullMethodName = "/ApplicationService/RollbackRelease" + ApplicationService_TemplateChart_FullMethodName = "/ApplicationService/TemplateChart" + ApplicationService_TemplateChartBulk_FullMethodName = "/ApplicationService/TemplateChartBulk" + ApplicationService_TemplateChartAndRetrieveChart_FullMethodName = "/ApplicationService/TemplateChartAndRetrieveChart" + ApplicationService_InstallReleaseWithCustomChart_FullMethodName = "/ApplicationService/InstallReleaseWithCustomChart" + ApplicationService_GetNotes_FullMethodName = "/ApplicationService/GetNotes" + ApplicationService_UpgradeReleaseWithCustomChart_FullMethodName = "/ApplicationService/UpgradeReleaseWithCustomChart" + ApplicationService_ValidateOCIRegistry_FullMethodName = "/ApplicationService/ValidateOCIRegistry" + ApplicationService_PushHelmChartToOCIRegistry_FullMethodName = "/ApplicationService/PushHelmChartToOCIRegistry" + ApplicationService_GetResourceTreeForExternalResources_FullMethodName = "/ApplicationService/GetResourceTreeForExternalResources" + ApplicationService_GetFluxAppDetail_FullMethodName = "/ApplicationService/GetFluxAppDetail" + ApplicationService_GetReleaseDetails_FullMethodName = "/ApplicationService/GetReleaseDetails" +) + // ApplicationServiceClient is the client API for ApplicationService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ApplicationServiceClient interface { ListApplications(ctx context.Context, in *AppListRequest, opts ...grpc.CallOption) (ApplicationService_ListApplicationsClient, error) ListFluxApplications(ctx context.Context, in *AppListRequest, opts ...grpc.CallOption) (ApplicationService_ListFluxApplicationsClient, error) + GetHelmReleaseDetailWithDesiredManifest(ctx context.Context, in *AppConfigRequest, opts ...grpc.CallOption) (*GetReleaseDetailWithManifestResponse, error) GetAppDetail(ctx context.Context, in *AppDetailRequest, opts ...grpc.CallOption) (*AppDetail, error) GetAppStatus(ctx context.Context, in *AppDetailRequest, opts ...grpc.CallOption) (*AppStatus, error) Hibernate(ctx context.Context, in *HibernateRequest, opts ...grpc.CallOption) (*HibernateResponse, error) @@ -60,7 +92,7 @@ func NewApplicationServiceClient(cc grpc.ClientConnInterface) ApplicationService } func (c *applicationServiceClient) ListApplications(ctx context.Context, in *AppListRequest, opts ...grpc.CallOption) (ApplicationService_ListApplicationsClient, error) { - stream, err := c.cc.NewStream(ctx, &ApplicationService_ServiceDesc.Streams[0], "/ApplicationService/ListApplications", opts...) + stream, err := c.cc.NewStream(ctx, &ApplicationService_ServiceDesc.Streams[0], ApplicationService_ListApplications_FullMethodName, opts...) if err != nil { return nil, err } @@ -92,7 +124,7 @@ func (x *applicationServiceListApplicationsClient) Recv() (*DeployedAppList, err } func (c *applicationServiceClient) ListFluxApplications(ctx context.Context, in *AppListRequest, opts ...grpc.CallOption) (ApplicationService_ListFluxApplicationsClient, error) { - stream, err := c.cc.NewStream(ctx, &ApplicationService_ServiceDesc.Streams[1], "/ApplicationService/ListFluxApplications", opts...) + stream, err := c.cc.NewStream(ctx, &ApplicationService_ServiceDesc.Streams[1], ApplicationService_ListFluxApplications_FullMethodName, opts...) if err != nil { return nil, err } @@ -123,9 +155,18 @@ func (x *applicationServiceListFluxApplicationsClient) Recv() (*FluxApplicationL return m, nil } +func (c *applicationServiceClient) GetHelmReleaseDetailWithDesiredManifest(ctx context.Context, in *AppConfigRequest, opts ...grpc.CallOption) (*GetReleaseDetailWithManifestResponse, error) { + out := new(GetReleaseDetailWithManifestResponse) + err := c.cc.Invoke(ctx, ApplicationService_GetHelmReleaseDetailWithDesiredManifest_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *applicationServiceClient) GetAppDetail(ctx context.Context, in *AppDetailRequest, opts ...grpc.CallOption) (*AppDetail, error) { out := new(AppDetail) - err := c.cc.Invoke(ctx, "/ApplicationService/GetAppDetail", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetAppDetail_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -134,7 +175,7 @@ func (c *applicationServiceClient) GetAppDetail(ctx context.Context, in *AppDeta func (c *applicationServiceClient) GetAppStatus(ctx context.Context, in *AppDetailRequest, opts ...grpc.CallOption) (*AppStatus, error) { out := new(AppStatus) - err := c.cc.Invoke(ctx, "/ApplicationService/GetAppStatus", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetAppStatus_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -143,7 +184,7 @@ func (c *applicationServiceClient) GetAppStatus(ctx context.Context, in *AppDeta func (c *applicationServiceClient) Hibernate(ctx context.Context, in *HibernateRequest, opts ...grpc.CallOption) (*HibernateResponse, error) { out := new(HibernateResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/Hibernate", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_Hibernate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -152,7 +193,7 @@ func (c *applicationServiceClient) Hibernate(ctx context.Context, in *HibernateR func (c *applicationServiceClient) UnHibernate(ctx context.Context, in *HibernateRequest, opts ...grpc.CallOption) (*HibernateResponse, error) { out := new(HibernateResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/UnHibernate", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_UnHibernate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -161,7 +202,7 @@ func (c *applicationServiceClient) UnHibernate(ctx context.Context, in *Hibernat func (c *applicationServiceClient) GetDeploymentHistory(ctx context.Context, in *AppDetailRequest, opts ...grpc.CallOption) (*HelmAppDeploymentHistory, error) { out := new(HelmAppDeploymentHistory) - err := c.cc.Invoke(ctx, "/ApplicationService/GetDeploymentHistory", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetDeploymentHistory_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -170,7 +211,7 @@ func (c *applicationServiceClient) GetDeploymentHistory(ctx context.Context, in func (c *applicationServiceClient) GetValuesYaml(ctx context.Context, in *AppDetailRequest, opts ...grpc.CallOption) (*ReleaseInfo, error) { out := new(ReleaseInfo) - err := c.cc.Invoke(ctx, "/ApplicationService/GetValuesYaml", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetValuesYaml_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -179,7 +220,7 @@ func (c *applicationServiceClient) GetValuesYaml(ctx context.Context, in *AppDet func (c *applicationServiceClient) GetDesiredManifest(ctx context.Context, in *ObjectRequest, opts ...grpc.CallOption) (*DesiredManifestResponse, error) { out := new(DesiredManifestResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/GetDesiredManifest", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetDesiredManifest_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -188,7 +229,7 @@ func (c *applicationServiceClient) GetDesiredManifest(ctx context.Context, in *O func (c *applicationServiceClient) UninstallRelease(ctx context.Context, in *ReleaseIdentifier, opts ...grpc.CallOption) (*UninstallReleaseResponse, error) { out := new(UninstallReleaseResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/UninstallRelease", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_UninstallRelease_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -197,7 +238,7 @@ func (c *applicationServiceClient) UninstallRelease(ctx context.Context, in *Rel func (c *applicationServiceClient) UpgradeRelease(ctx context.Context, in *UpgradeReleaseRequest, opts ...grpc.CallOption) (*UpgradeReleaseResponse, error) { out := new(UpgradeReleaseResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/UpgradeRelease", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_UpgradeRelease_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -206,7 +247,7 @@ func (c *applicationServiceClient) UpgradeRelease(ctx context.Context, in *Upgra func (c *applicationServiceClient) GetDeploymentDetail(ctx context.Context, in *DeploymentDetailRequest, opts ...grpc.CallOption) (*DeploymentDetailResponse, error) { out := new(DeploymentDetailResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/GetDeploymentDetail", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetDeploymentDetail_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -215,7 +256,7 @@ func (c *applicationServiceClient) GetDeploymentDetail(ctx context.Context, in * func (c *applicationServiceClient) InstallRelease(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*InstallReleaseResponse, error) { out := new(InstallReleaseResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/InstallRelease", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_InstallRelease_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -224,7 +265,7 @@ func (c *applicationServiceClient) InstallRelease(ctx context.Context, in *Insta func (c *applicationServiceClient) UpgradeReleaseWithChartInfo(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*UpgradeReleaseResponse, error) { out := new(UpgradeReleaseResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/UpgradeReleaseWithChartInfo", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_UpgradeReleaseWithChartInfo_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -233,7 +274,7 @@ func (c *applicationServiceClient) UpgradeReleaseWithChartInfo(ctx context.Conte func (c *applicationServiceClient) IsReleaseInstalled(ctx context.Context, in *ReleaseIdentifier, opts ...grpc.CallOption) (*BooleanResponse, error) { out := new(BooleanResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/IsReleaseInstalled", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_IsReleaseInstalled_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -242,7 +283,7 @@ func (c *applicationServiceClient) IsReleaseInstalled(ctx context.Context, in *R func (c *applicationServiceClient) RollbackRelease(ctx context.Context, in *RollbackReleaseRequest, opts ...grpc.CallOption) (*BooleanResponse, error) { out := new(BooleanResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/RollbackRelease", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_RollbackRelease_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -251,7 +292,7 @@ func (c *applicationServiceClient) RollbackRelease(ctx context.Context, in *Roll func (c *applicationServiceClient) TemplateChart(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*TemplateChartResponse, error) { out := new(TemplateChartResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/TemplateChart", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_TemplateChart_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -260,7 +301,7 @@ func (c *applicationServiceClient) TemplateChart(ctx context.Context, in *Instal func (c *applicationServiceClient) TemplateChartBulk(ctx context.Context, in *BulkInstallReleaseRequest, opts ...grpc.CallOption) (*BulkTemplateChartResponse, error) { out := new(BulkTemplateChartResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/TemplateChartBulk", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_TemplateChartBulk_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -269,7 +310,7 @@ func (c *applicationServiceClient) TemplateChartBulk(ctx context.Context, in *Bu func (c *applicationServiceClient) TemplateChartAndRetrieveChart(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*TemplateChartResponseWithChart, error) { out := new(TemplateChartResponseWithChart) - err := c.cc.Invoke(ctx, "/ApplicationService/TemplateChartAndRetrieveChart", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_TemplateChartAndRetrieveChart_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -278,7 +319,7 @@ func (c *applicationServiceClient) TemplateChartAndRetrieveChart(ctx context.Con func (c *applicationServiceClient) InstallReleaseWithCustomChart(ctx context.Context, in *HelmInstallCustomRequest, opts ...grpc.CallOption) (*HelmInstallCustomResponse, error) { out := new(HelmInstallCustomResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/InstallReleaseWithCustomChart", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_InstallReleaseWithCustomChart_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -287,7 +328,7 @@ func (c *applicationServiceClient) InstallReleaseWithCustomChart(ctx context.Con func (c *applicationServiceClient) GetNotes(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*ChartNotesResponse, error) { out := new(ChartNotesResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/GetNotes", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetNotes_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -296,7 +337,7 @@ func (c *applicationServiceClient) GetNotes(ctx context.Context, in *InstallRele func (c *applicationServiceClient) UpgradeReleaseWithCustomChart(ctx context.Context, in *UpgradeReleaseRequest, opts ...grpc.CallOption) (*UpgradeReleaseResponse, error) { out := new(UpgradeReleaseResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/UpgradeReleaseWithCustomChart", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_UpgradeReleaseWithCustomChart_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -305,7 +346,7 @@ func (c *applicationServiceClient) UpgradeReleaseWithCustomChart(ctx context.Con func (c *applicationServiceClient) ValidateOCIRegistry(ctx context.Context, in *RegistryCredential, opts ...grpc.CallOption) (*OCIRegistryResponse, error) { out := new(OCIRegistryResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/ValidateOCIRegistry", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_ValidateOCIRegistry_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -314,7 +355,7 @@ func (c *applicationServiceClient) ValidateOCIRegistry(ctx context.Context, in * func (c *applicationServiceClient) PushHelmChartToOCIRegistry(ctx context.Context, in *OCIRegistryRequest, opts ...grpc.CallOption) (*OCIRegistryResponse, error) { out := new(OCIRegistryResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/PushHelmChartToOCIRegistry", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_PushHelmChartToOCIRegistry_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -323,7 +364,7 @@ func (c *applicationServiceClient) PushHelmChartToOCIRegistry(ctx context.Contex func (c *applicationServiceClient) GetResourceTreeForExternalResources(ctx context.Context, in *ExternalResourceTreeRequest, opts ...grpc.CallOption) (*ResourceTreeResponse, error) { out := new(ResourceTreeResponse) - err := c.cc.Invoke(ctx, "/ApplicationService/GetResourceTreeForExternalResources", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetResourceTreeForExternalResources_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -332,7 +373,7 @@ func (c *applicationServiceClient) GetResourceTreeForExternalResources(ctx conte func (c *applicationServiceClient) GetFluxAppDetail(ctx context.Context, in *FluxAppDetailRequest, opts ...grpc.CallOption) (*FluxAppDetail, error) { out := new(FluxAppDetail) - err := c.cc.Invoke(ctx, "/ApplicationService/GetFluxAppDetail", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetFluxAppDetail_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -341,7 +382,7 @@ func (c *applicationServiceClient) GetFluxAppDetail(ctx context.Context, in *Flu func (c *applicationServiceClient) GetReleaseDetails(ctx context.Context, in *ReleaseIdentifier, opts ...grpc.CallOption) (*DeployedAppDetail, error) { out := new(DeployedAppDetail) - err := c.cc.Invoke(ctx, "/ApplicationService/GetReleaseDetails", in, out, opts...) + err := c.cc.Invoke(ctx, ApplicationService_GetReleaseDetails_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -354,6 +395,7 @@ func (c *applicationServiceClient) GetReleaseDetails(ctx context.Context, in *Re type ApplicationServiceServer interface { ListApplications(*AppListRequest, ApplicationService_ListApplicationsServer) error ListFluxApplications(*AppListRequest, ApplicationService_ListFluxApplicationsServer) error + GetHelmReleaseDetailWithDesiredManifest(context.Context, *AppConfigRequest) (*GetReleaseDetailWithManifestResponse, error) GetAppDetail(context.Context, *AppDetailRequest) (*AppDetail, error) GetAppStatus(context.Context, *AppDetailRequest) (*AppStatus, error) Hibernate(context.Context, *HibernateRequest) (*HibernateResponse, error) @@ -392,6 +434,9 @@ func (UnimplementedApplicationServiceServer) ListApplications(*AppListRequest, A func (UnimplementedApplicationServiceServer) ListFluxApplications(*AppListRequest, ApplicationService_ListFluxApplicationsServer) error { return status.Errorf(codes.Unimplemented, "method ListFluxApplications not implemented") } +func (UnimplementedApplicationServiceServer) GetHelmReleaseDetailWithDesiredManifest(context.Context, *AppConfigRequest) (*GetReleaseDetailWithManifestResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetHelmReleaseDetailWithDesiredManifest not implemented") +} func (UnimplementedApplicationServiceServer) GetAppDetail(context.Context, *AppDetailRequest) (*AppDetail, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAppDetail not implemented") } @@ -522,6 +567,24 @@ func (x *applicationServiceListFluxApplicationsServer) Send(m *FluxApplicationLi return x.ServerStream.SendMsg(m) } +func _ApplicationService_GetHelmReleaseDetailWithDesiredManifest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AppConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApplicationServiceServer).GetHelmReleaseDetailWithDesiredManifest(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ApplicationService_GetHelmReleaseDetailWithDesiredManifest_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApplicationServiceServer).GetHelmReleaseDetailWithDesiredManifest(ctx, req.(*AppConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ApplicationService_GetAppDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AppDetailRequest) if err := dec(in); err != nil { @@ -532,7 +595,7 @@ func _ApplicationService_GetAppDetail_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetAppDetail", + FullMethod: ApplicationService_GetAppDetail_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetAppDetail(ctx, req.(*AppDetailRequest)) @@ -550,7 +613,7 @@ func _ApplicationService_GetAppStatus_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetAppStatus", + FullMethod: ApplicationService_GetAppStatus_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetAppStatus(ctx, req.(*AppDetailRequest)) @@ -568,7 +631,7 @@ func _ApplicationService_Hibernate_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/Hibernate", + FullMethod: ApplicationService_Hibernate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).Hibernate(ctx, req.(*HibernateRequest)) @@ -586,7 +649,7 @@ func _ApplicationService_UnHibernate_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/UnHibernate", + FullMethod: ApplicationService_UnHibernate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UnHibernate(ctx, req.(*HibernateRequest)) @@ -604,7 +667,7 @@ func _ApplicationService_GetDeploymentHistory_Handler(srv interface{}, ctx conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetDeploymentHistory", + FullMethod: ApplicationService_GetDeploymentHistory_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetDeploymentHistory(ctx, req.(*AppDetailRequest)) @@ -622,7 +685,7 @@ func _ApplicationService_GetValuesYaml_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetValuesYaml", + FullMethod: ApplicationService_GetValuesYaml_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetValuesYaml(ctx, req.(*AppDetailRequest)) @@ -640,7 +703,7 @@ func _ApplicationService_GetDesiredManifest_Handler(srv interface{}, ctx context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetDesiredManifest", + FullMethod: ApplicationService_GetDesiredManifest_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetDesiredManifest(ctx, req.(*ObjectRequest)) @@ -658,7 +721,7 @@ func _ApplicationService_UninstallRelease_Handler(srv interface{}, ctx context.C } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/UninstallRelease", + FullMethod: ApplicationService_UninstallRelease_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UninstallRelease(ctx, req.(*ReleaseIdentifier)) @@ -676,7 +739,7 @@ func _ApplicationService_UpgradeRelease_Handler(srv interface{}, ctx context.Con } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/UpgradeRelease", + FullMethod: ApplicationService_UpgradeRelease_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UpgradeRelease(ctx, req.(*UpgradeReleaseRequest)) @@ -694,7 +757,7 @@ func _ApplicationService_GetDeploymentDetail_Handler(srv interface{}, ctx contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetDeploymentDetail", + FullMethod: ApplicationService_GetDeploymentDetail_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetDeploymentDetail(ctx, req.(*DeploymentDetailRequest)) @@ -712,7 +775,7 @@ func _ApplicationService_InstallRelease_Handler(srv interface{}, ctx context.Con } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/InstallRelease", + FullMethod: ApplicationService_InstallRelease_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).InstallRelease(ctx, req.(*InstallReleaseRequest)) @@ -730,7 +793,7 @@ func _ApplicationService_UpgradeReleaseWithChartInfo_Handler(srv interface{}, ct } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/UpgradeReleaseWithChartInfo", + FullMethod: ApplicationService_UpgradeReleaseWithChartInfo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UpgradeReleaseWithChartInfo(ctx, req.(*InstallReleaseRequest)) @@ -748,7 +811,7 @@ func _ApplicationService_IsReleaseInstalled_Handler(srv interface{}, ctx context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/IsReleaseInstalled", + FullMethod: ApplicationService_IsReleaseInstalled_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).IsReleaseInstalled(ctx, req.(*ReleaseIdentifier)) @@ -766,7 +829,7 @@ func _ApplicationService_RollbackRelease_Handler(srv interface{}, ctx context.Co } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/RollbackRelease", + FullMethod: ApplicationService_RollbackRelease_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).RollbackRelease(ctx, req.(*RollbackReleaseRequest)) @@ -784,7 +847,7 @@ func _ApplicationService_TemplateChart_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/TemplateChart", + FullMethod: ApplicationService_TemplateChart_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).TemplateChart(ctx, req.(*InstallReleaseRequest)) @@ -802,7 +865,7 @@ func _ApplicationService_TemplateChartBulk_Handler(srv interface{}, ctx context. } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/TemplateChartBulk", + FullMethod: ApplicationService_TemplateChartBulk_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).TemplateChartBulk(ctx, req.(*BulkInstallReleaseRequest)) @@ -820,7 +883,7 @@ func _ApplicationService_TemplateChartAndRetrieveChart_Handler(srv interface{}, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/TemplateChartAndRetrieveChart", + FullMethod: ApplicationService_TemplateChartAndRetrieveChart_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).TemplateChartAndRetrieveChart(ctx, req.(*InstallReleaseRequest)) @@ -838,7 +901,7 @@ func _ApplicationService_InstallReleaseWithCustomChart_Handler(srv interface{}, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/InstallReleaseWithCustomChart", + FullMethod: ApplicationService_InstallReleaseWithCustomChart_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).InstallReleaseWithCustomChart(ctx, req.(*HelmInstallCustomRequest)) @@ -856,7 +919,7 @@ func _ApplicationService_GetNotes_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetNotes", + FullMethod: ApplicationService_GetNotes_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetNotes(ctx, req.(*InstallReleaseRequest)) @@ -874,7 +937,7 @@ func _ApplicationService_UpgradeReleaseWithCustomChart_Handler(srv interface{}, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/UpgradeReleaseWithCustomChart", + FullMethod: ApplicationService_UpgradeReleaseWithCustomChart_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UpgradeReleaseWithCustomChart(ctx, req.(*UpgradeReleaseRequest)) @@ -892,7 +955,7 @@ func _ApplicationService_ValidateOCIRegistry_Handler(srv interface{}, ctx contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/ValidateOCIRegistry", + FullMethod: ApplicationService_ValidateOCIRegistry_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).ValidateOCIRegistry(ctx, req.(*RegistryCredential)) @@ -910,7 +973,7 @@ func _ApplicationService_PushHelmChartToOCIRegistry_Handler(srv interface{}, ctx } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/PushHelmChartToOCIRegistry", + FullMethod: ApplicationService_PushHelmChartToOCIRegistry_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).PushHelmChartToOCIRegistry(ctx, req.(*OCIRegistryRequest)) @@ -928,7 +991,7 @@ func _ApplicationService_GetResourceTreeForExternalResources_Handler(srv interfa } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetResourceTreeForExternalResources", + FullMethod: ApplicationService_GetResourceTreeForExternalResources_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetResourceTreeForExternalResources(ctx, req.(*ExternalResourceTreeRequest)) @@ -946,7 +1009,7 @@ func _ApplicationService_GetFluxAppDetail_Handler(srv interface{}, ctx context.C } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetFluxAppDetail", + FullMethod: ApplicationService_GetFluxAppDetail_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetFluxAppDetail(ctx, req.(*FluxAppDetailRequest)) @@ -964,7 +1027,7 @@ func _ApplicationService_GetReleaseDetails_Handler(srv interface{}, ctx context. } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ApplicationService/GetReleaseDetails", + FullMethod: ApplicationService_GetReleaseDetails_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetReleaseDetails(ctx, req.(*ReleaseIdentifier)) @@ -979,6 +1042,10 @@ var ApplicationService_ServiceDesc = grpc.ServiceDesc{ ServiceName: "ApplicationService", HandlerType: (*ApplicationServiceServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "GetHelmReleaseDetailWithDesiredManifest", + Handler: _ApplicationService_GetHelmReleaseDetailWithDesiredManifest_Handler, + }, { MethodName: "GetAppDetail", Handler: _ApplicationService_GetAppDetail_Handler, diff --git a/kubelink/pkg/cache/utils.go b/kubelink/pkg/cache/utils.go index 50fd0bef7..993ef0eda 100644 --- a/kubelink/pkg/cache/utils.go +++ b/kubelink/pkg/cache/utils.go @@ -19,13 +19,7 @@ package cache import ( "errors" "fmt" - k8sUtils "github.com/devtron-labs/common-lib/utils/k8s" - "github.com/devtron-labs/common-lib/utils/k8s/health" - "github.com/devtron-labs/kubelink/bean" - "github.com/devtron-labs/kubelink/pkg/util" kerrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" "net" "net/url" "os/exec" @@ -66,8 +60,7 @@ var ( ) const ( - hibernateReplicaAnnotation = "hibernator.devtron.ai/replicas" - CacheNotSyncError = "cluster cache not yet synced for this cluster id" + CacheNotSyncError = "cluster cache not yet synced for this cluster id" ) // isRetryableError is a helper method to see whether an error @@ -129,76 +122,3 @@ func isTransientNetworkErr(err error) bool { } return false } - -func getResourceNodeFromManifest(un *unstructured.Unstructured, gvk schema.GroupVersionKind) *bean.ResourceNode { - resourceNode := &bean.ResourceNode{ - Port: util.GetPorts(un, gvk), - ResourceVersion: un.GetResourceVersion(), - NetworkingInfo: &bean.ResourceNetworkingInfo{ - Labels: un.GetLabels(), - }, - CreatedAt: un.GetCreationTimestamp().String(), - ResourceRef: &bean.ResourceRef{ - Group: gvk.Group, - Version: gvk.Version, - Kind: gvk.Kind, - Namespace: un.GetNamespace(), - Name: un.GetName(), - UID: string(un.GetUID()), - }, - } - resourceNode.IsHook, resourceNode.HookType = util.GetHookMetadata(un) - util.AddSelectiveInfoInResourceNode(resourceNode, gvk, un.UnstructuredContent()) - return resourceNode -} - -func SetHealthStatusForNode(res *bean.ResourceNode, un *unstructured.Unstructured, gvk schema.GroupVersionKind) { - if k8sUtils.IsService(gvk) && un.GetName() == k8sUtils.DEVTRON_SERVICE_NAME && k8sUtils.IsDevtronApp(res.NetworkingInfo.Labels) { - res.Health = &bean.HealthStatus{ - Status: bean.HealthStatusHealthy, - } - } else { - if healthCheck := health.GetHealthCheckFunc(gvk); healthCheck != nil { - health, err := healthCheck(un) - if err != nil { - res.Health = &bean.HealthStatus{ - Status: bean.HealthStatusUnknown, - Message: err.Error(), - } - } else if health != nil { - res.Health = &bean.HealthStatus{ - Status: string(health.Status), - Message: health.Message, - } - } - } - } -} -func SetHibernationRules(res *bean.ResourceNode, un *unstructured.Unstructured) { - if un.GetOwnerReferences() == nil { - // set CanBeHibernated - replicas, found, _ := unstructured.NestedInt64(un.UnstructuredContent(), "spec", "replicas") - if found { - res.CanBeHibernated = true - } - - // set IsHibernated - annotations := un.GetAnnotations() - if annotations != nil { - if val, ok := annotations[hibernateReplicaAnnotation]; ok { - if val != "0" && replicas == 0 { - res.IsHibernated = true - } - } - } - } -} - -func isInClusterIdList(clusterId int, clusterIdList []int) bool { - for _, id := range clusterIdList { - if id == clusterId { - return true - } - } - return false -} diff --git a/kubelink/pkg/service/HelmAppServiceWrapper.go b/kubelink/pkg/service/HelmAppServiceWrapper.go index b7f278421..760845dff 100644 --- a/kubelink/pkg/service/HelmAppServiceWrapper.go +++ b/kubelink/pkg/service/HelmAppServiceWrapper.go @@ -19,6 +19,7 @@ package service import ( "context" "fmt" + "github.com/devtron-labs/common-lib/utils/k8s/commonBean" "github.com/devtron-labs/kubelink/bean" client "github.com/devtron-labs/kubelink/grpc" "github.com/devtron-labs/kubelink/internals/lock" @@ -96,6 +97,17 @@ func (impl *ApplicationServiceServerImpl) ListApplications(req *client.AppListRe return nil } +func (impl *ApplicationServiceServerImpl) GetHelmReleaseDetailWithDesiredManifest(ctx context.Context, req *client.AppConfigRequest) (*client.GetReleaseDetailWithManifestResponse, error) { + impl.Logger.Infow("App detail request", "clusterName", req.ClusterConfig.ClusterName, "releaseName", req.ReleaseName, + "namespace", req.Namespace) + resp, err := impl.HelmAppService.GetHelmReleaseDetailWithDesiredManifest(req) + if err != nil { + impl.Logger.Errorw("Error in GetHelmReleaseDetailWithDesiredManifest request", "payload", req, "err", err) + return nil, err + } + return resp, nil +} + func (impl *ApplicationServiceServerImpl) GetAppDetail(ctxt context.Context, req *client.AppDetailRequest) (*client.AppDetail, error) { impl.Logger.Infow("App detail request", "clusterName", req.ClusterConfig.ClusterName, "releaseName", req.ReleaseName, "namespace", req.Namespace) @@ -377,7 +389,7 @@ func (impl *ApplicationServiceServerImpl) TemplateChart(ctx context.Context, in return res, err } -func resourceRefResult(resourceRefs []*bean.ResourceRef) (resourceRefResults []*client.ResourceRef) { +func resourceRefResult(resourceRefs []*commonBean.ResourceRef) (resourceRefResults []*client.ResourceRef) { for _, resourceRef := range resourceRefs { resourceRefResult := &client.ResourceRef{ Group: resourceRef.Group, @@ -461,16 +473,14 @@ func (impl *ApplicationServiceServerImpl) AppDetailAdaptor(req *bean.AppDetail) } } resourceNode := &client.ResourceNode{ - Group: node.Group, - Version: node.Version, - Kind: node.Kind, - Namespace: node.Namespace, - Name: node.Name, - Uid: node.UID, - ParentRefs: resourceRefResult(node.ParentRefs), - NetworkingInfo: &client.ResourceNetworkingInfo{ - Labels: node.NetworkingInfo.Labels, - }, + Group: node.Group, + Version: node.Version, + Kind: node.Kind, + Namespace: node.Namespace, + Name: node.Name, + Uid: node.UID, + ParentRefs: resourceRefResult(node.ParentRefs), + NetworkingInfo: getNetworkingInfoFromNode(node.NetworkingInfo), ResourceVersion: node.ResourceVersion, Health: healthStatus, IsHibernated: node.IsHibernated, @@ -529,7 +539,16 @@ func (impl *ApplicationServiceServerImpl) AppDetailAdaptor(req *bean.AppDetail) return appDetail } -func (impl *ApplicationServiceServerImpl) buildInfoItems(infoItemBeans []bean.InfoItem) []*client.InfoItem { +func getNetworkingInfoFromNode(info *commonBean.ResourceNetworkingInfo) *client.ResourceNetworkingInfo { + if info == nil { + return &client.ResourceNetworkingInfo{} + } + return &client.ResourceNetworkingInfo{ + Labels: info.Labels, + } +} + +func (impl *ApplicationServiceServerImpl) buildInfoItems(infoItemBeans []commonBean.InfoItem) []*client.InfoItem { infoItems := make([]*client.InfoItem, 0, len(infoItemBeans)) for _, infoItemBean := range infoItemBeans { switch infoItemBean.Value.(type) { diff --git a/kubelink/pkg/service/commonHelmService/adapter.go b/kubelink/pkg/service/commonHelmService/adapter.go new file mode 100644 index 000000000..63a8c903e --- /dev/null +++ b/kubelink/pkg/service/commonHelmService/adapter.go @@ -0,0 +1,21 @@ +package commonHelmService + +import ( + client "github.com/devtron-labs/kubelink/grpc" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +func GetObjectIdentifierFromHelmManifest(manifest unstructured.Unstructured, namespace string) *client.ObjectIdentifier { + gvk := manifest.GroupVersionKind() + namespaceManifest := manifest.GetNamespace() + if namespaceManifest == "" { + namespaceManifest = namespace + } + return &client.ObjectIdentifier{ + Group: gvk.Group, + Version: gvk.Version, + Kind: gvk.Kind, + Name: manifest.GetName(), + Namespace: namespaceManifest, + } +} diff --git a/kubelink/pkg/service/commonHelmService/bean.go b/kubelink/pkg/service/commonHelmService/bean.go index 9a1dec592..890a4a292 100644 --- a/kubelink/pkg/service/commonHelmService/bean.go +++ b/kubelink/pkg/service/commonHelmService/bean.go @@ -81,7 +81,7 @@ type GetNodeFromManifestRequest struct { type BuildNodesRequest struct { RestConfig *rest.Config ReleaseNamespace string - ParentResourceRef *bean.ResourceRef + ParentResourceRef *commonBean.ResourceRef } func NewBuildNodesRequest(buildNodesConfig *BuildNodesRequest) *BuildNodesConfig { @@ -143,7 +143,7 @@ func (req *BuildNodesRequest) WithReleaseNamespace(releaseNamespace string) *Bui return req } -func (req *BuildNodesRequest) WithParentResourceRef(parentResourceRef *bean.ResourceRef) *BuildNodesRequest { +func (req *BuildNodesRequest) WithParentResourceRef(parentResourceRef *commonBean.ResourceRef) *BuildNodesRequest { if parentResourceRef == nil { return req } @@ -152,14 +152,14 @@ func (req *BuildNodesRequest) WithParentResourceRef(parentResourceRef *bean.Reso } type BuildNodeResponse struct { - Nodes []*bean.ResourceNode - HealthStatusArray []*bean.HealthStatus + Nodes []*commonBean.ResourceNode + HealthStatusArray []*commonBean.HealthStatus } type GetNodeFromManifestResponse struct { - Node *bean.ResourceNode - HealthStatus *bean.HealthStatus - ResourceRef *bean.ResourceRef + Node *commonBean.ResourceNode + HealthStatus *commonBean.HealthStatus + ResourceRef *commonBean.ResourceRef DesiredOrLiveChildrenManifests []*bean.DesiredOrLiveManifest } @@ -167,7 +167,7 @@ func NewGetNodesFromManifestResponse() *GetNodeFromManifestResponse { return &GetNodeFromManifestResponse{} } -func (resp *GetNodeFromManifestResponse) WithNode(node *bean.ResourceNode) *GetNodeFromManifestResponse { +func (resp *GetNodeFromManifestResponse) WithNode(node *commonBean.ResourceNode) *GetNodeFromManifestResponse { if node == nil { return resp } @@ -175,7 +175,7 @@ func (resp *GetNodeFromManifestResponse) WithNode(node *bean.ResourceNode) *GetN return resp } -func (resp *GetNodeFromManifestResponse) WithHealthStatus(healthStatus *bean.HealthStatus) *GetNodeFromManifestResponse { +func (resp *GetNodeFromManifestResponse) WithHealthStatus(healthStatus *commonBean.HealthStatus) *GetNodeFromManifestResponse { if healthStatus == nil { return resp } @@ -183,7 +183,7 @@ func (resp *GetNodeFromManifestResponse) WithHealthStatus(healthStatus *bean.Hea return resp } -func (resp *GetNodeFromManifestResponse) WithParentResourceRef(resourceRef *bean.ResourceRef) *GetNodeFromManifestResponse { +func (resp *GetNodeFromManifestResponse) WithParentResourceRef(resourceRef *commonBean.ResourceRef) *GetNodeFromManifestResponse { if resourceRef == nil { return resp } @@ -203,7 +203,7 @@ func NewBuildNodeResponse() *BuildNodeResponse { return &BuildNodeResponse{} } -func (resp *BuildNodeResponse) WithNodes(nodes []*bean.ResourceNode) *BuildNodeResponse { +func (resp *BuildNodeResponse) WithNodes(nodes []*commonBean.ResourceNode) *BuildNodeResponse { if len(nodes) == 0 { return resp } @@ -211,7 +211,7 @@ func (resp *BuildNodeResponse) WithNodes(nodes []*bean.ResourceNode) *BuildNodeR return resp } -func (resp *BuildNodeResponse) WithHealthStatusArray(healthStatusArray []*bean.HealthStatus) *BuildNodeResponse { +func (resp *BuildNodeResponse) WithHealthStatusArray(healthStatusArray []*commonBean.HealthStatus) *BuildNodeResponse { if len(healthStatusArray) == 0 { return resp } diff --git a/kubelink/pkg/service/commonHelmService/commonHelmService.go b/kubelink/pkg/service/commonHelmService/commonHelmService.go index 25480fe36..d7b8d003f 100644 --- a/kubelink/pkg/service/commonHelmService/commonHelmService.go +++ b/kubelink/pkg/service/commonHelmService/commonHelmService.go @@ -1,20 +1,21 @@ package commonHelmService import ( + "errors" + "fmt" k8sUtils "github.com/devtron-labs/common-lib/utils/k8s" k8sCommonBean "github.com/devtron-labs/common-lib/utils/k8s/commonBean" - k8sObjectUtils "github.com/devtron-labs/common-lib/utils/k8sObjectsUtil" + "github.com/devtron-labs/common-lib/utils/k8sObjectsUtil" yamlUtil "github.com/devtron-labs/common-lib/utils/yaml" "github.com/devtron-labs/common-lib/workerPool" "github.com/devtron-labs/kubelink/bean" globalConfig "github.com/devtron-labs/kubelink/config" "github.com/devtron-labs/kubelink/converter" client "github.com/devtron-labs/kubelink/grpc" - "github.com/devtron-labs/kubelink/pkg/cache" "github.com/devtron-labs/kubelink/pkg/helmClient" "github.com/devtron-labs/kubelink/pkg/util" - "github.com/devtron-labs/kubelink/pkg/util/argo" "go.uber.org/zap" + "google.golang.org/protobuf/types/known/timestamppb" "helm.sh/helm/v3/pkg/release" "k8s.io/api/extensions/v1beta1" errors2 "k8s.io/apimachinery/pkg/api/errors" @@ -31,6 +32,7 @@ type CommonHelmService interface { BuildResourceTree(appDetailRequest *client.AppDetailRequest, release *release.Release) (*bean.ResourceTreeResponse, error) BuildNodes(request *BuildNodesConfig) (*BuildNodeResponse, error) GetResourceTreeForExternalResources(req *client.ExternalResourceTreeRequest) (*bean.ResourceTreeResponse, error) + GetHelmReleaseDetailWithDesiredManifest(appConfig *client.AppConfigRequest) (*client.GetReleaseDetailWithManifestResponse, error) } type CommonHelmServiceImpl struct { @@ -125,10 +127,74 @@ func (impl *CommonHelmServiceImpl) getRestConfigForClusterConfig(clusterConfig * } return conf, nil } -func (impl *CommonHelmServiceImpl) getLiveManifests(config *rest.Config, helmRelease *release.Release) ([]*bean.DesiredOrLiveManifest, error) { + +func (impl *CommonHelmServiceImpl) GetHelmReleaseDetailWithDesiredManifest(appConfig *client.AppConfigRequest) (*client.GetReleaseDetailWithManifestResponse, error) { + if appConfig == nil { + return nil, errors.New("appConfig is nil") + } + helmRelease, err := impl.GetHelmRelease(appConfig.ClusterConfig, appConfig.Namespace, appConfig.ReleaseName) + if err != nil { + impl.logger.Errorw("Error in getting helm release", "appConfig", appConfig, "err", err) + return nil, err + } + if helmRelease == nil { + return nil, errors.New(fmt.Sprintf("no helm release found for name=%s", appConfig.ReleaseName)) + } + manifests, err := impl.getManifestsFromHelmRelease(helmRelease) + if err != nil { + impl.logger.Errorw("Error in getting helm release", "helmRelease", helmRelease, "err", err) + return nil, err + } + + objectIdentifiers := make([]*client.ObjectIdentifier, 0) + for _, manifest := range manifests { + objectIdentifier := GetObjectIdentifierFromHelmManifest(manifest, appConfig.Namespace) + if objectIdentifier != nil && len(objectIdentifier.Kind) > 0 && len(objectIdentifier.Name) > 0 { + objectIdentifiers = append(objectIdentifiers, objectIdentifier) + } + } + + resp := &client.GetReleaseDetailWithManifestResponse{ + ParentObjects: objectIdentifiers, + ReleaseStatus: &client.ReleaseStatus{ + Status: string(helmRelease.Info.Status), + Message: helmRelease.Info.Description, + Description: util.GetMessageFromReleaseStatus(helmRelease.Info.Status), + }, + LastDeployed: timestamppb.New(helmRelease.Info.LastDeployed.Time), + ChartMetadata: &client.ChartMetadata{ + ChartName: helmRelease.Chart.Name(), + ChartVersion: helmRelease.Chart.Metadata.Version, + Notes: helmRelease.Info.Notes, + }, + EnvironmentDetails: &client.EnvironmentDetails{ + ClusterName: appConfig.ClusterConfig.ClusterName, + ClusterId: appConfig.ClusterConfig.ClusterId, + Namespace: helmRelease.Namespace, + }, + ReleaseExist: true, + } + + return resp, nil +} + +func (impl *CommonHelmServiceImpl) getManifestsFromHelmRelease(helmRelease *release.Release) ([]unstructured.Unstructured, error) { manifests, err := yamlUtil.SplitYAMLs([]byte(helmRelease.Manifest)) + if err != nil { + return nil, err + } manifests = impl.addHookResourcesInManifest(helmRelease, manifests) + return manifests, nil +} + +func (impl *CommonHelmServiceImpl) getLiveManifests(config *rest.Config, helmRelease *release.Release) ([]*bean.DesiredOrLiveManifest, error) { + manifests, err := impl.getManifestsFromHelmRelease(helmRelease) + if err != nil { + impl.logger.Errorw("error in parsing manifests", "payload", helmRelease, "error", err) + return nil, err + } // get live manifests from kubernetes + //impl.logger.Infow("manifests added", "manifests", manifests, "helmRelease", helmRelease.Name) desiredOrLiveManifests, err := impl.getDesiredOrLiveManifests(config, manifests, helmRelease.Namespace) if err != nil { impl.logger.Errorw("error in getting desired or live manifest", "host", config.Host, "helmReleaseName", helmRelease.Name, "err", err) @@ -306,8 +372,8 @@ func (impl *CommonHelmServiceImpl) getNodeFromDesiredOrLiveManifest(request *Get if _namespace == "" { _namespace = request.ReleaseNamespace } - ports := util.GetPorts(manifest, gvk) - resourceRef := BuildResourceRef(gvk, *manifest, _namespace) + ports := k8sObjectsUtil.GetPorts(manifest, gvk) + resourceRef := k8sObjectsUtil.BuildResourceRef(gvk, *manifest, _namespace) if impl.k8sService.CanHaveChild(gvk) { children, err := impl.k8sService.GetChildObjects(request.RestConfig, _namespace, gvk, manifest.GetName(), manifest.GetAPIVersion()) @@ -329,64 +395,64 @@ func (impl *CommonHelmServiceImpl) getNodeFromDesiredOrLiveManifest(request *Get if found && err == nil { creationTimeStamp = val } - node := &bean.ResourceNode{ + node := &k8sCommonBean.ResourceNode{ ResourceRef: resourceRef, ResourceVersion: manifest.GetResourceVersion(), - NetworkingInfo: &bean.ResourceNetworkingInfo{ + NetworkingInfo: &k8sCommonBean.ResourceNetworkingInfo{ Labels: manifest.GetLabels(), }, CreatedAt: creationTimeStamp, Port: ports, } - node.IsHook, node.HookType = util.GetHookMetadata(manifest) + node.IsHook, node.HookType = k8sObjectsUtil.GetHookMetadata(manifest) if request.ParentResourceRef != nil { - node.ParentRefs = append(make([]*bean.ResourceRef, 0), request.ParentResourceRef) + node.ParentRefs = append(make([]*k8sCommonBean.ResourceRef, 0), request.ParentResourceRef) } // set health of Node if request.DesiredOrLiveManifest.IsLiveManifestFetchError { if request.DesiredOrLiveManifest.LiveManifestFetchErrorCode == http.StatusNotFound { - node.Health = &bean.HealthStatus{ - Status: bean.HealthStatusMissing, + node.Health = &k8sCommonBean.HealthStatus{ + Status: k8sCommonBean.HealthStatusMissing, Message: "Resource missing as live manifest not found", } } else { - node.Health = &bean.HealthStatus{ - Status: bean.HealthStatusUnknown, + node.Health = &k8sCommonBean.HealthStatus{ + Status: k8sCommonBean.HealthStatusUnknown, Message: "Resource state unknown as error while fetching live manifest", } } } else { - cache.SetHealthStatusForNode(node, manifest, gvk) + k8sObjectsUtil.SetHealthStatusForNode(node, manifest, gvk) } // hibernate set starts if request.ParentResourceRef == nil { // set CanBeHibernated - cache.SetHibernationRules(node, &node.Manifest) + k8sObjectsUtil.SetHibernationRules(node, &node.Manifest) } // hibernate set ends - if k8sUtils.IsPod(gvk) { - infoItems, _ := argo.PopulatePodInfo(manifest) + if k8sObjectsUtil.IsPod(gvk.Kind, gvk.Group) { + infoItems, _ := k8sObjectsUtil.PopulatePodInfo(manifest) node.Info = infoItems } - util.AddSelectiveInfoInResourceNode(node, gvk, manifest.Object) + k8sObjectsUtil.AddSelectiveInfoInResourceNode(node, gvk, manifest.Object) response.WithNode(node).WithHealthStatus(node.Health) return response, nil } -func (impl *CommonHelmServiceImpl) filterNodes(resourceTreeFilter *client.ResourceTreeFilter, nodes []*bean.ResourceNode) []*bean.ResourceNode { +func (impl *CommonHelmServiceImpl) filterNodes(resourceTreeFilter *client.ResourceTreeFilter, nodes []*k8sCommonBean.ResourceNode) []*k8sCommonBean.ResourceNode { resourceFilters := resourceTreeFilter.ResourceFilters globalFilter := resourceTreeFilter.GlobalFilter if globalFilter == nil && (resourceFilters == nil || len(resourceFilters) == 0) { return nodes } - filteredNodes := make([]*bean.ResourceNode, 0, len(nodes)) + filteredNodes := make([]*k8sCommonBean.ResourceNode, 0, len(nodes)) // handle global if globalFilter != nil && len(globalFilter.Labels) > 0 { @@ -424,80 +490,6 @@ func (impl *CommonHelmServiceImpl) filterNodes(resourceTreeFilter *client.Resour return filteredNodes } -func (impl *CommonHelmServiceImpl) buildPodMetadata(nodes []*bean.ResourceNode, restConfig *rest.Config) ([]*bean.PodMetadata, error) { - deploymentPodHashMap, rolloutMap, uidVsExtraNodeInfoMap := getExtraNodeInfoMappings(nodes) - podsMetadata := make([]*bean.PodMetadata, 0, len(nodes)) - for _, node := range nodes { - - if node.Kind != k8sCommonBean.PodKind { - continue - } - // check if pod is new - var isNew bool - var err error - if len(node.ParentRefs) > 0 { - isNew, err = impl.isPodNew(nodes, node, deploymentPodHashMap, rolloutMap, uidVsExtraNodeInfoMap, restConfig) - if err != nil { - return podsMetadata, err - } - } - - // set containers,initContainers and ephemeral container names - var containerNames []string - var initContainerNames []string - var ephemeralContainersInfo []bean.EphemeralContainerInfo - var ephemeralContainerStatus []bean.EphemeralContainerStatusesInfo - - for _, nodeInfo := range node.Info { - switch nodeInfo.Name { - case bean.ContainersNamesType: - containerNames = nodeInfo.Value.([]string) - case bean.InitContainersNamesType: - initContainerNames = nodeInfo.Value.([]string) - case bean.EphemeralContainersInfoType: - ephemeralContainersInfo = nodeInfo.Value.([]bean.EphemeralContainerInfo) - case bean.EphemeralContainersStatusType: - ephemeralContainerStatus = nodeInfo.Value.([]bean.EphemeralContainerStatusesInfo) - default: - continue - } - } - - ephemeralContainerStatusMap := make(map[string]bool) - for _, c := range ephemeralContainerStatus { - // c.state contains three states running,waiting and terminated - // at any point of time only one state will be there - if c.State.Running != nil { - ephemeralContainerStatusMap[c.Name] = true - } - } - ephemeralContainers := make([]*bean.EphemeralContainerData, 0, len(ephemeralContainersInfo)) - // sending only running ephemeral containers in the list - for _, ec := range ephemeralContainersInfo { - if _, ok := ephemeralContainerStatusMap[ec.Name]; ok { - containerData := &bean.EphemeralContainerData{ - Name: ec.Name, - IsExternal: k8sObjectUtils.IsExternalEphemeralContainer(ec.Command, ec.Name), - } - ephemeralContainers = append(ephemeralContainers, containerData) - } - } - - podMetadata := &bean.PodMetadata{ - Name: node.Name, - UID: node.UID, - Containers: containerNames, - InitContainers: initContainerNames, - EphemeralContainers: ephemeralContainers, - IsNew: isNew, - } - - podsMetadata = append(podsMetadata, podMetadata) - - } - return podsMetadata, nil -} - func (impl *CommonHelmServiceImpl) GetResourceTreeForExternalResources(req *client.ExternalResourceTreeRequest) (*bean.ResourceTreeResponse, error) { k8sClusterConfig := impl.converter.GetClusterConfigFromClientBean(req.ClusterConfig) restConfig, err := impl.k8sUtil.GetRestConfigByCluster(k8sClusterConfig) @@ -565,8 +557,34 @@ func (impl *CommonHelmServiceImpl) getManifestsForExternalResources(restConfig * return manifests } -func (impl *CommonHelmServiceImpl) isPodNew(nodes []*bean.ResourceNode, node *bean.ResourceNode, deploymentPodHashMap map[string]string, rolloutMap map[string]*util.ExtraNodeInfo, - uidVsExtraNodeInfoMap map[string]*util.ExtraNodeInfo, restConfig *rest.Config) (bool, error) { +func (impl *CommonHelmServiceImpl) buildPodMetadata(nodes []*k8sCommonBean.ResourceNode, restConfig *rest.Config) ([]*k8sCommonBean.PodMetadata, error) { + podMetadatas, err := k8sObjectsUtil.BuildPodMetadata(nodes) + if err != nil { + impl.logger.Errorw("error in building pod metadata", "err", err) + return nil, err + } + if len(podMetadatas) > 0 { + for _, node := range nodes { + var isNew bool + if len(node.ParentRefs) > 0 { + deploymentPodHashMap, rolloutMap, uidVsExtraNodeInfoMap := k8sObjectsUtil.GetExtraNodeInfoMappings(nodes) + isNew, err = impl.isPodNew(nodes, node, deploymentPodHashMap, rolloutMap, uidVsExtraNodeInfoMap, restConfig) + if err != nil { + return podMetadatas, err + } + } + podMetadata := k8sObjectsUtil.GetMatchingPodMetadataForUID(podMetadatas, node.UID) + if podMetadata != nil { + podMetadata.IsNew = isNew + } + } + } + return podMetadatas, nil + +} + +func (impl *CommonHelmServiceImpl) isPodNew(nodes []*k8sCommonBean.ResourceNode, node *k8sCommonBean.ResourceNode, deploymentPodHashMap map[string]string, rolloutMap map[string]*k8sCommonBean.ExtraNodeInfo, + uidVsExtraNodeInfoMap map[string]*k8sCommonBean.ExtraNodeInfo, restConfig *rest.Config) (bool, error) { isNew := false parentRef := node.ParentRefs[0] @@ -585,7 +603,7 @@ func (impl *CommonHelmServiceImpl) isPodNew(nodes []*bean.ResourceNode, node *be // if parent kind is replica set then if parentKind == k8sCommonBean.ReplicaSetKind { - replicaSetNode := getMatchingNode(nodes, parentKind, parentRef.Name) + replicaSetNode := k8sObjectsUtil.GetMatchingNode(nodes, parentKind, parentRef.Name) // if parent of replicaset is deployment, compare label pod-template-hash if replicaSetParent := replicaSetNode.ParentRefs[0]; replicaSetNode != nil && len(replicaSetNode.ParentRefs) > 0 && replicaSetParent.Kind == k8sCommonBean.DeploymentKind { @@ -594,7 +612,7 @@ func (impl *CommonHelmServiceImpl) isPodNew(nodes []*bean.ResourceNode, node *be if err != nil { return isNew, err } - deploymentNode := getMatchingNode(nodes, replicaSetParent.Kind, replicaSetParent.Name) + deploymentNode := k8sObjectsUtil.GetMatchingNode(nodes, replicaSetParent.Kind, replicaSetParent.Name) // TODO: why do we need deployment object for collisionCount ?? var deploymentCollisionCount *int32 if deploymentNode != nil && deploymentNode.DeploymentCollisionCount != nil { @@ -605,13 +623,13 @@ func (impl *CommonHelmServiceImpl) isPodNew(nodes []*bean.ResourceNode, node *be return isNew, err } } - replicaSetPodHash := util.GetReplicaSetPodHash(replicaSetObj, deploymentCollisionCount) + replicaSetPodHash := k8sObjectsUtil.GetReplicaSetPodHash(replicaSetObj, deploymentCollisionCount) isNew = replicaSetPodHash == deploymentPodHash } else if replicaSetParent.Kind == k8sCommonBean.K8sClusterResourceRolloutKind { rolloutExtraInfo := rolloutMap[replicaSetParent.Name] rolloutPodHash := rolloutExtraInfo.RolloutCurrentPodHash - replicasetPodHash := util.GetRolloutPodTemplateHash(replicaSetNode) + replicasetPodHash := k8sObjectsUtil.GetRolloutPodTemplateHash(replicaSetNode) isNew = rolloutPodHash == replicasetPodHash @@ -621,7 +639,7 @@ func (impl *CommonHelmServiceImpl) isPodNew(nodes []*bean.ResourceNode, node *be // if parent kind is DaemonSet then compare DaemonSet's Child ControllerRevision's label controller-revision-hash with pod label controller-revision-hash if parentKind == k8sCommonBean.DaemonSetKind { - controllerRevisionNodes := getMatchingNodes(nodes, "ControllerRevision") + controllerRevisionNodes := k8sObjectsUtil.GetMatchingNodes(nodes, "ControllerRevision") for _, controllerRevisionNode := range controllerRevisionNodes { if len(controllerRevisionNode.ParentRefs) > 0 && controllerRevisionNode.ParentRefs[0].Kind == parentKind && controllerRevisionNode.ParentRefs[0].Name == parentRef.Name && uidVsExtraNodeInfoMap[parentRef.UID].ResourceNetworkingInfo != nil && @@ -634,7 +652,7 @@ func (impl *CommonHelmServiceImpl) isPodNew(nodes []*bean.ResourceNode, node *be return isNew, nil } -func (impl *CommonHelmServiceImpl) getReplicaSetObject(restConfig *rest.Config, replicaSetNode *bean.ResourceNode) (*v1beta1.ReplicaSet, error) { +func (impl *CommonHelmServiceImpl) getReplicaSetObject(restConfig *rest.Config, replicaSetNode *k8sCommonBean.ResourceNode) (*v1beta1.ReplicaSet, error) { gvk := &schema.GroupVersionKind{ Group: replicaSetNode.Group, Version: replicaSetNode.Version, @@ -655,7 +673,7 @@ func (impl *CommonHelmServiceImpl) getReplicaSetObject(restConfig *rest.Config, replicaSetNodeObj = replicaSetNode.Manifest.Object } - replicaSetObj, err := util.ConvertToV1ReplicaSet(replicaSetNodeObj) + replicaSetObj, err := k8sObjectsUtil.ConvertToV1ReplicaSet(replicaSetNodeObj) if err != nil { impl.logger.Errorw("error in converting replicaSet unstructured object to replicaSet object", "clusterName", restConfig.ServerName, "replicaSetName", replicaSetNode.Name) return nil, err @@ -663,7 +681,7 @@ func (impl *CommonHelmServiceImpl) getReplicaSetObject(restConfig *rest.Config, return replicaSetObj, nil } -func (impl *CommonHelmServiceImpl) getDeploymentCollisionCount(restConfig *rest.Config, deploymentInfo *bean.ResourceRef) (*int32, error) { +func (impl *CommonHelmServiceImpl) getDeploymentCollisionCount(restConfig *rest.Config, deploymentInfo *k8sCommonBean.ResourceRef) (*int32, error) { parentGvk := &schema.GroupVersionKind{ Group: deploymentInfo.Group, Version: deploymentInfo.Version, @@ -684,7 +702,7 @@ func (impl *CommonHelmServiceImpl) getDeploymentCollisionCount(restConfig *rest. deploymentNodeObj = deploymentInfo.Manifest.Object } - deploymentObj, err := util.ConvertToV1Deployment(deploymentNodeObj) + deploymentObj, err := k8sObjectsUtil.ConvertToV1Deployment(deploymentNodeObj) if err != nil { impl.logger.Errorw("error in converting parent deployment unstructured object to replicaSet object", "clusterName", restConfig.ServerName, "deploymentName", deploymentInfo.Name) return nil, err @@ -692,7 +710,7 @@ func (impl *CommonHelmServiceImpl) getDeploymentCollisionCount(restConfig *rest. return deploymentObj.Status.CollisionCount, nil } -func updateHookInfoForChildNodes(nodes []*bean.ResourceNode) { +func updateHookInfoForChildNodes(nodes []*k8sCommonBean.ResourceNode) { hookUidToHookTypeMap := make(map[string]string) for _, node := range nodes { if node.IsHook { @@ -711,51 +729,3 @@ func updateHookInfoForChildNodes(nodes []*bean.ResourceNode) { } } } -func getExtraNodeInfoMappings(nodes []*bean.ResourceNode) (map[string]string, map[string]*util.ExtraNodeInfo, map[string]*util.ExtraNodeInfo) { - deploymentPodHashMap := make(map[string]string) - rolloutNameVsExtraNodeInfoMapping := make(map[string]*util.ExtraNodeInfo) - uidVsExtraNodeInfoMapping := make(map[string]*util.ExtraNodeInfo) - for _, node := range nodes { - if node.Kind == k8sCommonBean.DeploymentKind { - deploymentPodHashMap[node.Name] = node.DeploymentPodHash - } else if node.Kind == k8sCommonBean.K8sClusterResourceRolloutKind { - rolloutNameVsExtraNodeInfoMapping[node.Name] = &util.ExtraNodeInfo{ - RolloutCurrentPodHash: node.RolloutCurrentPodHash, - } - } else if node.Kind == k8sCommonBean.StatefulSetKind || node.Kind == k8sCommonBean.DaemonSetKind { - if _, ok := uidVsExtraNodeInfoMapping[node.UID]; !ok { - uidVsExtraNodeInfoMapping[node.UID] = &util.ExtraNodeInfo{UpdateRevision: node.UpdateRevision, ResourceNetworkingInfo: node.NetworkingInfo} - } - } - } - return deploymentPodHashMap, rolloutNameVsExtraNodeInfoMapping, uidVsExtraNodeInfoMapping -} -func getMatchingNode(nodes []*bean.ResourceNode, kind string, name string) *bean.ResourceNode { - for _, node := range nodes { - if node.Kind == kind && node.Name == name { - return node - } - } - return nil -} -func getMatchingNodes(nodes []*bean.ResourceNode, kind string) []*bean.ResourceNode { - nodesRes := make([]*bean.ResourceNode, 0, len(nodes)) - for _, node := range nodes { - if node.Kind == kind { - nodesRes = append(nodesRes, node) - } - } - return nodesRes -} -func BuildResourceRef(gvk schema.GroupVersionKind, manifest unstructured.Unstructured, namespace string) *bean.ResourceRef { - resourceRef := &bean.ResourceRef{ - Group: gvk.Group, - Version: gvk.Version, - Kind: gvk.Kind, - Namespace: namespace, - Name: manifest.GetName(), - UID: string(manifest.GetUID()), - Manifest: manifest, - } - return resourceRef -} diff --git a/kubelink/pkg/service/helmApplicationService/helmAppService.go b/kubelink/pkg/service/helmApplicationService/helmAppService.go index 20888e3fe..88408f14a 100644 --- a/kubelink/pkg/service/helmApplicationService/helmAppService.go +++ b/kubelink/pkg/service/helmApplicationService/helmAppService.go @@ -23,6 +23,8 @@ import ( "errors" "fmt" registry2 "github.com/devtron-labs/common-lib/helmLib/registry" + "github.com/devtron-labs/common-lib/utils/k8s/commonBean" + "github.com/devtron-labs/common-lib/utils/k8sObjectsUtil" "github.com/devtron-labs/kubelink/converter" error2 "github.com/devtron-labs/kubelink/error" repository "github.com/devtron-labs/kubelink/pkg/cluster" @@ -103,6 +105,7 @@ type HelmAppService interface { PushHelmChartToOCIRegistryRepo(ctx context.Context, OCIRegistryRequest *client.OCIRegistryRequest) (*client.OCIRegistryResponse, error) GetResourceTreeForExternalResources(req *client.ExternalResourceTreeRequest) (*bean.ResourceTreeResponse, error) GetReleaseDetails(ctx context.Context, releaseIdentifier *client.ReleaseIdentifier) (*client.DeployedAppDetail, error) + GetHelmReleaseDetailWithDesiredManifest(appConfig *client.AppConfigRequest) (*client.GetReleaseDetailWithManifestResponse, error) } type HelmAppServiceImpl struct { @@ -220,6 +223,10 @@ func (impl *HelmAppServiceImpl) GetApplicationListForCluster(config *client.Clus func (impl HelmAppServiceImpl) GetResourceTreeForExternalResources(req *client.ExternalResourceTreeRequest) (*bean.ResourceTreeResponse, error) { return impl.common.GetResourceTreeForExternalResources(req) } +func (impl HelmAppServiceImpl) GetHelmReleaseDetailWithDesiredManifest(appConfig *client.AppConfigRequest) (*client.GetReleaseDetailWithManifestResponse, error) { + return impl.common.GetHelmReleaseDetailWithDesiredManifest(appConfig) +} + func (impl HelmAppServiceImpl) BuildAppDetail(req *client.AppDetailRequest) (*bean.AppDetail, error) { helmRelease, err := impl.common.GetHelmRelease(req.ClusterConfig, req.Namespace, req.ReleaseName) if err != nil { @@ -241,7 +248,7 @@ func (impl HelmAppServiceImpl) BuildAppDetail(req *client.AppDetailRequest) (*be appDetail := &bean.AppDetail{ ResourceTreeResponse: resourceTreeResponse, - ApplicationStatus: util.BuildAppHealthStatus(resourceTreeResponse.Nodes), + ApplicationStatus: k8sObjectsUtil.BuildAppHealthStatus(resourceTreeResponse.Nodes), LastDeployed: helmRelease.Info.LastDeployed.Time, ChartMetadata: &bean.ChartMetadata{ ChartName: helmRelease.Chart.Name(), @@ -1271,7 +1278,7 @@ func buildReleaseInfoBasicData(helmRelease *release.Release) (*client.ReleaseInf return res, nil } -func (impl *HelmAppServiceImpl) getNodes(appDetailRequest *client.AppDetailRequest, release *release.Release) ([]*bean.ResourceNode, []*bean.HealthStatus, error) { +func (impl *HelmAppServiceImpl) getNodes(appDetailRequest *client.AppDetailRequest, release *release.Release) ([]*commonBean.ResourceNode, []*commonBean.HealthStatus, error) { k8sClusterConfig := impl.converter.GetClusterConfigFromClientBean(appDetailRequest.ClusterConfig) conf, err := impl.k8sUtil.GetRestConfigByCluster(k8sClusterConfig) if err != nil { @@ -1298,14 +1305,14 @@ func (impl *HelmAppServiceImpl) getNodes(appDetailRequest *client.AppDetailReque return buildNodesResponse.Nodes, buildNodesResponse.HealthStatusArray, nil } -func (impl *HelmAppServiceImpl) filterNodes(resourceTreeFilter *client.ResourceTreeFilter, nodes []*bean.ResourceNode) []*bean.ResourceNode { +func (impl *HelmAppServiceImpl) filterNodes(resourceTreeFilter *client.ResourceTreeFilter, nodes []*commonBean.ResourceNode) []*commonBean.ResourceNode { resourceFilters := resourceTreeFilter.ResourceFilters globalFilter := resourceTreeFilter.GlobalFilter if globalFilter == nil && (resourceFilters == nil || len(resourceFilters) == 0) { return nodes } - filteredNodes := make([]*bean.ResourceNode, 0, len(nodes)) + filteredNodes := make([]*commonBean.ResourceNode, 0, len(nodes)) // handle global if globalFilter != nil && len(globalFilter.Labels) > 0 { @@ -1399,7 +1406,7 @@ func (impl *HelmAppServiceImpl) getManifestData(restConfig *rest.Config, release return desiredOrLiveManifest } -func (impl *HelmAppServiceImpl) getDeploymentCollisionCount(restConfig *rest.Config, deploymentInfo *bean.ResourceRef) (*int32, error) { +func (impl *HelmAppServiceImpl) getDeploymentCollisionCount(restConfig *rest.Config, deploymentInfo *commonBean.ResourceRef) (*int32, error) { parentGvk := &schema.GroupVersionKind{ Group: deploymentInfo.Group, Version: deploymentInfo.Version, @@ -1420,7 +1427,7 @@ func (impl *HelmAppServiceImpl) getDeploymentCollisionCount(restConfig *rest.Con deploymentNodeObj = deploymentInfo.Manifest.Object } - deploymentObj, err := util.ConvertToV1Deployment(deploymentNodeObj) + deploymentObj, err := k8sObjectsUtil.ConvertToV1Deployment(deploymentNodeObj) if err != nil { impl.logger.Errorw("error in converting parent deployment unstructured object to replicaSet object", "clusterName", restConfig.ServerName, "deploymentName", deploymentInfo.Name) return nil, err diff --git a/kubelink/pkg/util/HelmServiceUtil.go b/kubelink/pkg/util/HelmServiceUtil.go index 6cc3904df..646cd49e8 100644 --- a/kubelink/pkg/util/HelmServiceUtil.go +++ b/kubelink/pkg/util/HelmServiceUtil.go @@ -17,32 +17,14 @@ package util import ( - "encoding/binary" "errors" "fmt" - "github.com/davecgh/go-spew/spew" - k8sCommonBean "github.com/devtron-labs/common-lib/utils/k8s/commonBean" + "github.com/devtron-labs/common-lib/utils/k8s/commonBean" "github.com/devtron-labs/common-lib/utils/k8s/health" - "github.com/devtron-labs/kubelink/bean" - "hash" - "hash/fnv" "helm.sh/helm/v3/pkg/release" "helm.sh/helm/v3/pkg/storage/driver" - coreV1 "k8s.io/api/core/v1" - "k8s.io/api/extensions/v1beta1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/util/rand" ) -type ExtraNodeInfo struct { - // UpdateRevision is only used for StatefulSets, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence - UpdateRevision string - ResourceNetworkingInfo *bean.ResourceNetworkingInfo - RolloutCurrentPodHash string -} - // GetAppId returns AppID by logic cluster_id|namespace|release_name func GetAppId(clusterId int32, release *release.Release) string { return fmt.Sprintf("%d|%s|%s", clusterId, release.Namespace, release.Name) @@ -75,49 +57,8 @@ func GetMessageFromReleaseStatus(releaseStatus release.Status) string { return "" } -// app health is worst of the nodes health -// or if app status is healthy then check for hibernation status -func BuildAppHealthStatus(nodes []*bean.ResourceNode) *bean.HealthStatusCode { - appHealthStatus := bean.HealthStatusHealthy - isAppFullyHibernated := true - var isAppPartiallyHibernated bool - var isAnyNodeCanByHibernated bool - - for _, node := range nodes { - if node.IsHook { - continue - } - nodeHealth := node.Health - if node.CanBeHibernated { - isAnyNodeCanByHibernated = true - if !node.IsHibernated { - isAppFullyHibernated = false - } else { - isAppPartiallyHibernated = true - } - } - if nodeHealth == nil { - continue - } - if health.IsWorseStatus(health.HealthStatusCode(appHealthStatus), health.HealthStatusCode(nodeHealth.Status)) { - appHealthStatus = nodeHealth.Status - } - } - - // override hibernate status on app level if status is healthy and hibernation done - if appHealthStatus == bean.HealthStatusHealthy && isAnyNodeCanByHibernated { - if isAppFullyHibernated { - appHealthStatus = bean.HealthStatusHibernated - } else if isAppPartiallyHibernated { - appHealthStatus = bean.HealthStatusPartiallyHibernated - } - } - - return &appHealthStatus -} - -func GetAppStatusOnBasisOfHealthyNonHealthy(healthStatusArray []*bean.HealthStatus) *bean.HealthStatusCode { - appHealthStatus := bean.HealthStatusHealthy +func GetAppStatusOnBasisOfHealthyNonHealthy(healthStatusArray []*commonBean.HealthStatus) *commonBean.HealthStatusCode { + appHealthStatus := commonBean.HealthStatusHealthy for _, node := range healthStatusArray { nodeHealth := node if nodeHealth == nil { @@ -132,128 +73,6 @@ func GetAppStatusOnBasisOfHealthyNonHealthy(healthStatusArray []*bean.HealthStat return &appHealthStatus } -// DeepHashObject writes specified object to hash using the spew library -// which follows pointers and prints actual values of the nested objects -// ensuring the hash does not change when a pointer changes. -func DeepHashObject(hasher hash.Hash, objectToWrite interface{}) { - hasher.Reset() - printer := spew.ConfigState{ - Indent: " ", - SortKeys: true, - DisableMethods: true, - SpewKeys: true, - } - _, err := printer.Fprintf(hasher, "%#v", objectToWrite) - if err != nil { - fmt.Println(err) - } -} - -func ComputePodHash(template *coreV1.PodTemplateSpec, collisionCount *int32) string { - podTemplateSpecHasher := fnv.New32a() - DeepHashObject(podTemplateSpecHasher, *template) - - // Add collisionCount in the hash if it exists. - if collisionCount != nil { - collisionCountBytes := make([]byte, 8) - binary.LittleEndian.PutUint32(collisionCountBytes, uint32(*collisionCount)) - _, err := podTemplateSpecHasher.Write(collisionCountBytes) - if err != nil { - fmt.Println(err) - } - } - return rand.SafeEncodeString(fmt.Sprint(podTemplateSpecHasher.Sum32())) -} - -func ConvertToV1Deployment(nodeObj map[string]interface{}) (*v1beta1.Deployment, error) { - deploymentObj := v1beta1.Deployment{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(nodeObj, &deploymentObj) - if err != nil { - return nil, err - } - return &deploymentObj, nil -} - -func ConvertToV1ReplicaSet(nodeObj map[string]interface{}) (*v1beta1.ReplicaSet, error) { - replicaSetObj := v1beta1.ReplicaSet{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(nodeObj, &replicaSetObj) - if err != nil { - return nil, err - } - return &replicaSetObj, nil -} - -func GetReplicaSetPodHash(replicasetObj *v1beta1.ReplicaSet, collisionCount *int32) string { - labels := make(map[string]string) - for k, v := range replicasetObj.Spec.Template.Labels { - if k != "pod-template-hash" { - labels[k] = v - } - } - replicasetObj.Spec.Template.Labels = labels - podHash := ComputePodHash(&replicasetObj.Spec.Template, collisionCount) - return podHash -} - -func GetRolloutPodTemplateHash(replicasetNode *bean.ResourceNode) string { - if rolloutPodTemplateHash, ok := replicasetNode.NetworkingInfo.Labels["rollouts-pod-template-hash"]; ok { - return rolloutPodTemplateHash - } - return "" -} - -func GetRolloutPodHash(rollout map[string]interface{}) string { - if s, ok := rollout["status"]; ok { - if sm, ok := s.(map[string]interface{}); ok { - if cph, ok := sm["currentPodHash"]; ok { - if cphs, ok := cph.(string); ok { - return cphs - } - } - } - } - return "" -} - -func GetHookMetadata(manifest *unstructured.Unstructured) (bool, string) { - annotations, found, _ := unstructured.NestedStringMap(manifest.Object, "metadata", "annotations") - if found { - if hookType, ok := annotations[release.HookAnnotation]; ok { - return true, hookType - } - } - return false, "" -} - -func AddSelectiveInfoInResourceNode(resourceNode *bean.ResourceNode, gvk schema.GroupVersionKind, obj map[string]interface{}) { - if gvk.Kind == k8sCommonBean.StatefulSetKind { - resourceNode.UpdateRevision = GetUpdateRevisionForStatefulSet(obj) - } - if gvk.Kind == k8sCommonBean.DeploymentKind { - deployment, _ := ConvertToV1Deployment(obj) - if deployment == nil { - return - } - deploymentPodHash := ComputePodHash(&deployment.Spec.Template, deployment.Status.CollisionCount) - resourceNode.DeploymentPodHash = deploymentPodHash - resourceNode.DeploymentCollisionCount = deployment.Status.CollisionCount - } - if gvk.Kind == k8sCommonBean.K8sClusterResourceRolloutKind { - rolloutPodHash, found, _ := unstructured.NestedString(obj, "status", "currentPodHash") - if found { - resourceNode.RolloutCurrentPodHash = rolloutPodHash - } - } -} - -func GetUpdateRevisionForStatefulSet(obj map[string]interface{}) string { - updateRevisionFromManifest, found, _ := unstructured.NestedString(obj, "status", "updateRevision") - if found { - return updateRevisionFromManifest - } - return "" -} - func IsReleaseNotFoundError(err error) bool { return errors.Is(err, driver.ErrReleaseNotFound) || errors.Is(err, driver.ErrNoDeployedReleases) } diff --git a/kubelink/pkg/util/ManifestUtil.go b/kubelink/pkg/util/ManifestUtil.go deleted file mode 100644 index 7e08ae0b2..000000000 --- a/kubelink/pkg/util/ManifestUtil.go +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package util - -import ( - "github.com/devtron-labs/common-lib/utils/k8s/commonBean" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime/schema" -) - -func GetPorts(manifest *unstructured.Unstructured, gvk schema.GroupVersionKind) []int64 { - ports := make([]int64, 0) - if gvk.Kind == commonBean.ServiceKind { - ports = append(ports, getPortsFromService(manifest)...) - } - if gvk.Kind == commonBean.EndPointsSlice { - ports = append(ports, getPortsFromEndPointsSlice(manifest)...) - } - if gvk.Kind == commonBean.EndpointsKind { - ports = append(ports, getPortsFromEndpointsKind(manifest)...) - } - return ports -} - -func getPortsFromService(manifest *unstructured.Unstructured) []int64 { - var ports []int64 - if manifest.Object["spec"] != nil { - spec := manifest.Object["spec"].(map[string]interface{}) - if spec["ports"] != nil { - portList := spec["ports"].([]interface{}) - for _, portItem := range portList { - if portItem.(map[string]interface{}) != nil { - _portNumber := portItem.(map[string]interface{})["port"] - portNumber := _portNumber.(int64) - if portNumber != 0 { - ports = append(ports, portNumber) - } - } - } - } - } - return ports -} - -func getPortsFromEndPointsSlice(manifest *unstructured.Unstructured) []int64 { - var ports []int64 - if manifest.Object["ports"] != nil { - endPointsSlicePorts := manifest.Object["ports"].([]interface{}) - for _, val := range endPointsSlicePorts { - _portNumber := val.(map[string]interface{})["port"] - portNumber := _portNumber.(int64) - if portNumber != 0 { - ports = append(ports, portNumber) - } - } - } - return ports -} - -func getPortsFromEndpointsKind(manifest *unstructured.Unstructured) []int64 { - var ports []int64 - if manifest.Object["subsets"] != nil { - subsets := manifest.Object["subsets"].([]interface{}) - for _, subset := range subsets { - subsetObj := subset.(map[string]interface{}) - if subsetObj != nil { - portsIfs := subsetObj["ports"].([]interface{}) - for _, portsIf := range portsIfs { - portsIfObj := portsIf.(map[string]interface{}) - if portsIfObj != nil { - port := portsIfObj["port"].(int64) - ports = append(ports, port) - } - } - } - } - } - return ports -} diff --git a/kubelink/pkg/util/argo/ArgoUtils.go b/kubelink/pkg/util/argo/ArgoUtils.go deleted file mode 100644 index d5de4aec9..000000000 --- a/kubelink/pkg/util/argo/ArgoUtils.go +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2024. Devtron Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package argo - -import ( - "fmt" - "github.com/devtron-labs/kubelink/bean" - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" -) - -func PopulatePodInfo(un *unstructured.Unstructured) ([]bean.InfoItem, error) { - var infoItems []bean.InfoItem - - pod := v1.Pod{} - err := runtime.DefaultUnstructuredConverter.FromUnstructured(un.Object, &pod) - if err != nil { - return nil, err - } - restarts := 0 - totalContainers := len(pod.Spec.Containers) - readyContainers := 0 - - reason := string(pod.Status.Phase) - if pod.Status.Reason != "" { - reason = pod.Status.Reason - } - - initializing := false - for i := range pod.Status.InitContainerStatuses { - container := pod.Status.InitContainerStatuses[i] - restarts += int(container.RestartCount) - switch { - case container.State.Terminated != nil && container.State.Terminated.ExitCode == 0: - continue - case container.State.Terminated != nil: - // initialization is failed - if len(container.State.Terminated.Reason) == 0 { - if container.State.Terminated.Signal != 0 { - reason = fmt.Sprintf("Init:Signal:%d", container.State.Terminated.Signal) - } else { - reason = fmt.Sprintf("Init:ExitCode:%d", container.State.Terminated.ExitCode) - } - } else { - reason = "Init:" + container.State.Terminated.Reason - } - initializing = true - case container.State.Waiting != nil && len(container.State.Waiting.Reason) > 0 && container.State.Waiting.Reason != "PodInitializing": - reason = "Init:" + container.State.Waiting.Reason - initializing = true - default: - reason = fmt.Sprintf("Init:%d/%d", i, len(pod.Spec.InitContainers)) - initializing = true - } - break - } - if !initializing { - restarts = 0 - hasRunning := false - for i := len(pod.Status.ContainerStatuses) - 1; i >= 0; i-- { - container := pod.Status.ContainerStatuses[i] - - restarts += int(container.RestartCount) - if container.State.Waiting != nil && container.State.Waiting.Reason != "" { - reason = container.State.Waiting.Reason - } else if container.State.Terminated != nil && container.State.Terminated.Reason != "" { - reason = container.State.Terminated.Reason - } else if container.State.Terminated != nil && container.State.Terminated.Reason == "" { - if container.State.Terminated.Signal != 0 { - reason = fmt.Sprintf("Signal:%d", container.State.Terminated.Signal) - } else { - reason = fmt.Sprintf("ExitCode:%d", container.State.Terminated.ExitCode) - } - } else if container.Ready && container.State.Running != nil { - hasRunning = true - readyContainers++ - } - } - - // change pod status back to "Running" if there is at least one container still reporting as "Running" status - if reason == "Completed" && hasRunning { - reason = "Running" - } - } - - // "NodeLost" = https://github.com/kubernetes/kubernetes/blob/cb8ad64243d48d9a3c26b11b2e0945c098457282/pkg/util/node/node.go#L46 - // But depending on the k8s.io/kubernetes package just for a constant - // is not worth it. - // See https://github.com/argoproj/argo-cd/issues/5173 - // and https://github.com/kubernetes/kubernetes/issues/90358#issuecomment-617859364 - if pod.DeletionTimestamp != nil && pod.Status.Reason == "NodeLost" { - reason = "Unknown" - } else if pod.DeletionTimestamp != nil { - reason = "Terminating" - } - infoItems = getAllInfoItems(infoItems, reason, restarts, readyContainers, totalContainers, pod) - return infoItems, nil -} - -func getAllInfoItems(infoItems []bean.InfoItem, reason string, restarts int, readyContainers int, totalContainers int, pod v1.Pod) []bean.InfoItem { - if reason != "" { - infoItems = append(infoItems, bean.InfoItem{Name: bean.StatusReason, Value: reason}) - } - infoItems = append(infoItems, bean.InfoItem{Name: bean.Node, Value: pod.Spec.NodeName}) - - containerNames, initContainerNames, ephemeralContainersInfo, ephemeralContainerStatus := getContainersInfo(pod) - - infoItems = append(infoItems, bean.InfoItem{Name: bean.ContainersType, Value: fmt.Sprintf("%d/%d", readyContainers, totalContainers)}) - infoItems = append(infoItems, bean.InfoItem{Name: bean.ContainersNamesType, Value: containerNames}) - infoItems = append(infoItems, bean.InfoItem{Name: bean.InitContainersNamesType, Value: initContainerNames}) - infoItems = append(infoItems, bean.InfoItem{Name: bean.EphemeralContainersInfoType, Value: ephemeralContainersInfo}) - infoItems = append(infoItems, bean.InfoItem{Name: bean.EphemeralContainersStatusType, Value: ephemeralContainerStatus}) - - if restarts > 0 { - infoItems = append(infoItems, bean.InfoItem{Name: bean.RestartCount, Value: fmt.Sprintf("%d", restarts)}) - } - return infoItems -} - -func getContainersInfo(pod v1.Pod) ([]string, []string, []bean.EphemeralContainerInfo, []bean.EphemeralContainerStatusesInfo) { - containerNames := make([]string, 0, len(pod.Spec.Containers)) - initContainerNames := make([]string, 0, len(pod.Spec.InitContainers)) - ephemeralContainers := make([]bean.EphemeralContainerInfo, 0, len(pod.Spec.EphemeralContainers)) - ephemeralContainerStatus := make([]bean.EphemeralContainerStatusesInfo, 0, len(pod.Status.EphemeralContainerStatuses)) - for _, container := range pod.Spec.Containers { - containerNames = append(containerNames, container.Name) - } - for _, initContainer := range pod.Spec.InitContainers { - initContainerNames = append(initContainerNames, initContainer.Name) - } - for _, ec := range pod.Spec.EphemeralContainers { - ecData := bean.EphemeralContainerInfo{ - Name: ec.Name, - Command: ec.Command, - } - ephemeralContainers = append(ephemeralContainers, ecData) - } - for _, ecStatus := range pod.Status.EphemeralContainerStatuses { - status := bean.EphemeralContainerStatusesInfo{ - Name: ecStatus.Name, - State: ecStatus.State, - } - ephemeralContainerStatus = append(ephemeralContainerStatus, status) - } - return containerNames, initContainerNames, ephemeralContainers, ephemeralContainerStatus -} diff --git a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go index 7734f432b..e243148d0 100644 --- a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go +++ b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/K8sUtil.go @@ -113,8 +113,9 @@ type K8sService interface { CreateConfigMap(namespace string, cm *v1.ConfigMap, client *v12.CoreV1Client) (*v1.ConfigMap, error) GetConfigMap(namespace string, name string, client *v12.CoreV1Client) (*v1.ConfigMap, error) GetConfigMapWithCtx(ctx context.Context, namespace string, name string, client *v12.CoreV1Client) (*v1.ConfigMap, error) - CheckIfNsExists(namespace string, client *v12.CoreV1Client) (exists bool, err error) - CreateNsIfNotExists(namespace string, clusterConfig *ClusterConfig) (err error) + GetNsIfExists(namespace string, client *v12.CoreV1Client) (ns *v1.Namespace, exists bool, err error) + CreateNsIfNotExists(namespace string, clusterConfig *ClusterConfig) (ns *v1.Namespace, nsCreated bool, err error) + UpdateNSLabels(namespace *v1.Namespace, labels map[string]string, clusterConfig *ClusterConfig) (ns *v1.Namespace, err error) GetK8sDiscoveryClientInCluster() (*discovery.DiscoveryClient, error) GetK8sDiscoveryClient(clusterConfig *ClusterConfig) (*discovery.DiscoveryClient, error) GetClientForInCluster() (*v12.CoreV1Client, error) @@ -178,7 +179,7 @@ func (impl *K8sServiceImpl) GetRestConfigByClusterWithoutCustomTransport(cluster bearerToken := clusterConfig.BearerToken var restConfig *rest.Config var err error - if clusterConfig.Host == DefaultClusterUrl && len(bearerToken) == 0 { + if clusterConfig.Host == commonBean.DefaultClusterUrl && len(bearerToken) == 0 { restConfig, err = impl.GetK8sInClusterRestConfig() if err != nil { impl.logger.Errorw("error in getting rest config for default cluster", "err", err) @@ -290,37 +291,58 @@ func (impl *K8sServiceImpl) GetK8sDiscoveryClientInCluster() (*discovery.Discove return discoveryClient, err } -func (impl *K8sServiceImpl) CreateNsIfNotExists(namespace string, clusterConfig *ClusterConfig) (err error) { +func (impl *K8sServiceImpl) CreateNsIfNotExists(namespace string, clusterConfig *ClusterConfig) (ns *v1.Namespace, nsCreated bool, err error) { v12Client, err := impl.GetCoreV1Client(clusterConfig) if err != nil { impl.logger.Errorw("error", "error", err, "clusterConfig", clusterConfig) - return err + return nil, false, err } - exists, err := impl.CheckIfNsExists(namespace, v12Client) + ns, exists, err := impl.GetNsIfExists(namespace, v12Client) if err != nil { impl.logger.Errorw("error", "error", err, "clusterConfig", clusterConfig) - return err + return ns, false, err } if exists { + nsCreated = false impl.logger.Infow("namesapce already exist") - return nil + return ns, nsCreated, nil } impl.logger.Infow("ns not exists creating", "ns", namespace) - _, err = impl.CreateNs(namespace, v12Client) - return err + ns, err = impl.CreateNs(namespace, v12Client) + if err != nil { + impl.logger.Errorw("error in creating ns", "namespace", namespace, "err", err) + return nil, false, err + } + nsCreated = true + return ns, nsCreated, err +} + +func (impl *K8sServiceImpl) UpdateNSLabels(namespace *v1.Namespace, labels map[string]string, clusterConfig *ClusterConfig) (ns *v1.Namespace, err error) { + v12Client, err := impl.GetCoreV1Client(clusterConfig) + if err != nil { + impl.logger.Errorw("error", "error", err, "clusterConfig", clusterConfig) + return nil, err + } + namespace.Labels = labels + ns, err = v12Client.Namespaces().Update(context.Background(), namespace, metav1.UpdateOptions{}) + if err != nil { + impl.logger.Errorw("error in updating ns", "namespace", namespace, "err", err) + return nil, err + } + return ns, nil } -func (impl *K8sServiceImpl) CheckIfNsExists(namespace string, client *v12.CoreV1Client) (exists bool, err error) { - ns, err := client.Namespaces().Get(context.Background(), namespace, metav1.GetOptions{}) +func (impl *K8sServiceImpl) GetNsIfExists(namespace string, client *v12.CoreV1Client) (ns *v1.Namespace, exists bool, err error) { + ns, err = client.Namespaces().Get(context.Background(), namespace, metav1.GetOptions{}) //ns, err := impl.k8sClient.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{}) impl.logger.Debugw("ns fetch", "name", namespace, "res", ns) if errors.IsNotFound(err) { - return false, nil + return nil, false, nil } else if err != nil { impl.logger.Errorw("error in checking if ns exist", "err", err) - return false, err + return nil, false, err } else { - return true, nil + return ns, true, nil } } @@ -610,7 +632,7 @@ func (impl *K8sServiceImpl) DiscoveryClientGetLiveZCall(cluster *ClusterConfig) return nil, err } //using livez path as healthz path is deprecated - response, err := impl.GetLiveZCall(LiveZ, k8sClientSet) + response, err := impl.GetLiveZCall(commonBean.LiveZ, k8sClientSet) if err != nil { impl.logger.Errorw("error in getting livez call", "err", err, "clusterName", cluster.ClusterName) return nil, err @@ -672,7 +694,7 @@ func (impl *K8sServiceImpl) DeletePodByLabel(namespace string, labels string, cl } for _, pod := range (*podList).Items { - if pod.Status.Phase != Running { + if pod.Status.Phase != commonBean.Running { podName := pod.ObjectMeta.Name err := pods.Delete(context.Background(), podName, metav1.DeleteOptions{}) if err != nil && !errors.IsNotFound(err) { @@ -729,7 +751,7 @@ func (impl *K8sServiceImpl) ListNamespaces(client *v12.CoreV1Client) (*v1.Namesp } func (impl *K8sServiceImpl) GetClientByToken(serverUrl string, token map[string]string) (*v12.CoreV1Client, error) { - bearerToken := token[BearerToken] + bearerToken := token[commonBean.BearerToken] clusterCfg := &ClusterConfig{Host: serverUrl, BearerToken: bearerToken} v12Client, err := impl.GetCoreV1Client(clusterCfg) if err != nil { @@ -861,16 +883,30 @@ func (impl *K8sServiceImpl) BuildK8sObjectListTableData(manifest *unstructured.U var cellObj map[string]interface{} if cellObjUncast != nil { cellObj = cellObjUncast.(map[string]interface{}) - if cellObj != nil && cellObj[commonBean.K8sClusterResourceMetadataKey] != nil { - metadata := cellObj[commonBean.K8sClusterResourceMetadataKey].(map[string]interface{}) - if metadata[commonBean.K8sClusterResourceNamespaceKey] != nil { - namespace = metadata[commonBean.K8sClusterResourceNamespaceKey].(string) - if namespaced { - rowIndex[commonBean.K8sClusterResourceNamespaceKey] = namespace + if cellObj != nil { + rowIndex[commonBean.K8sClusterResourceKindKey] = cellObj[commonBean.K8sClusterResourceKindKey].(string) + rowIndex[commonBean.K8sClusterResourceApiVersionKey] = cellObj[commonBean.K8sClusterResourceApiVersionKey].(string) + + if cellObj[commonBean.K8sClusterResourceMetadataKey] != nil { + metadata := cellObj[commonBean.K8sClusterResourceMetadataKey].(map[string]interface{}) + if metadata[commonBean.K8sClusterResourceNamespaceKey] != nil { + namespace = metadata[commonBean.K8sClusterResourceNamespaceKey].(string) + if namespaced { + rowIndex[commonBean.K8sClusterResourceNamespaceKey] = namespace + } + } + if includeMetadata { + rowIndex[commonBean.K8sClusterResourceMetadataKey] = metadata } } - if includeMetadata { - rowIndex[commonBean.K8sClusterResourceMetadataKey] = metadata + + if cellObj[commonBean.K8sClusterResourceSpecKey] != nil { + spec, ok := cellObj[commonBean.K8sClusterResourceSpecKey].(map[string]interface{}) + if ok { + rowIndex[commonBean.K8sClusterResourceSpecKey] = spec + } else { + impl.logger.Warnw("Not able to cast spec key of manifest to map") + } } } } @@ -1199,7 +1235,7 @@ func (impl *K8sServiceImpl) CreateK8sClientSet(restConfig *rest.Config) (*kubern func (impl *K8sServiceImpl) FetchConnectionStatusForCluster(k8sClientSet *kubernetes.Clientset) error { //using livez path as healthz path is deprecated - path := LiveZ + path := commonBean.LiveZ response, err := k8sClientSet.Discovery().RESTClient().Get().AbsPath(path).DoRaw(context.Background()) log.Println("received response for cluster livez status", "response", string(response), "err", err) if err != nil { @@ -1736,24 +1772,6 @@ func (impl *K8sServiceImpl) GetPodListByLabel(namespace, label string, clientSet return podList.Items, nil } -func IsService(gvk schema.GroupVersionKind) bool { - return gvk.Group == "" && gvk.Kind == commonBean.ServiceKind -} - -func IsPod(gvk schema.GroupVersionKind) bool { - return gvk.Group == "" && gvk.Kind == commonBean.PodKind && gvk.Version == "v1" -} - -func IsDevtronApp(labels map[string]string) bool { - isDevtronApp := false - if val, ok := labels[DEVTRON_APP_LABEL_KEY]; ok { - if val == DEVTRON_APP_LABEL_VALUE1 || val == DEVTRON_APP_LABEL_VALUE2 { - isDevtronApp = true - } - } - return isDevtronApp -} - //func GetHealthCheckFunc(gvk schema.GroupVersionKind) func(obj *unstructured.Unstructured) (*health.HealthStatus, error) { // return health.GetHealthCheckFunc(gvk) //} diff --git a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/adapter.go b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/adapter.go index d82cac194..f89681fa3 100644 --- a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/adapter.go +++ b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/adapter.go @@ -40,3 +40,14 @@ func (req *ResourceIdentifier) WithKind(kind string) *ResourceIdentifier { req.GroupVersionKind.Kind = kind return req } + +// +//func GetEmptyResourceForResourceKey(resourceKey *ResourceKey) *Resource { +// return &cache.Resource{ +// Ref: v1.ObjectReference{ +// Kind: resourceKey.Kind, +// Namespace: resourceKey.Namespace, +// Name: resourceKey.Name, +// }, +// } +//} diff --git a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/bean.go b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/bean.go index 05f5220ea..21f0a21be 100644 --- a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/bean.go +++ b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/bean.go @@ -35,22 +35,6 @@ import ( "time" ) -const ( - DEFAULT_CLUSTER = "default_cluster" - DEVTRON_SERVICE_NAME = "devtron-service" - DefaultClusterUrl = "https://kubernetes.default.svc" - BearerToken = "bearer_token" - CertificateAuthorityData = "cert_auth_data" - CertData = "cert_data" - TlsKey = "tls_key" - LiveZ = "/livez" - Running = "Running" - RestartingNotSupported = "restarting not supported" - DEVTRON_APP_LABEL_KEY = "app" - DEVTRON_APP_LABEL_VALUE1 = "devtron" - DEVTRON_APP_LABEL_VALUE2 = "orchestrator" -) - type ClusterConfig struct { ClusterName string Host string diff --git a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/commonBean/bean.go b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/commonBean/bean.go index 3383def20..621b39edf 100644 --- a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/commonBean/bean.go +++ b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8s/commonBean/bean.go @@ -17,7 +17,9 @@ package commonBean import ( + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" ) @@ -73,6 +75,17 @@ const ( StatefulSetsResourceType = "statefulsets" ) +const ( + ContainersType = "Containers" + ContainersNamesType = "ContainerNames" + InitContainersNamesType = "InitContainerNames" + EphemeralContainersInfoType = "EphemeralContainerInfo" + EphemeralContainersStatusType = "EphemeralContainerStatuses" + StatusReason = "Status Reason" + Node = "Node" + RestartCount = "Restart Count" +) + const ( Group = "group" Version = "version" @@ -103,6 +116,7 @@ const K8sClusterResourceNameKey = "name" const K8sClusterResourcePriorityKey = "priority" const K8sClusterResourceNamespaceKey = "namespace" const K8sClusterResourceMetadataKey = "metadata" +const K8sClusterResourceSpecKey = "spec" const K8sClusterResourceMetadataNameKey = "name" const K8sClusterResourceOwnerReferenceKey = "ownerReferences" const K8sClusterResourceCreationTimestampKey = "creationTimestamp" @@ -126,6 +140,9 @@ const V1VERSION = "v1" const BatchGroup = "batch" const AppsGroup = "apps" +const HelmHookAnnotation = "helm.sh/hook" +const HibernateReplicaAnnotation = "hibernator.devtron.ai/replicas" + const ( K8sResourceColumnDefinitionName = "Name" K8sResourceColumnDefinitionSyncStatus = "Sync Status" @@ -200,3 +217,131 @@ type GvrAndScope struct { func GetGvkVsChildGvrAndScope() map[schema.GroupVersionKind][]*GvrAndScope { return gvkVsChildGvrAndScope } + +// ResourceNode contains information about live resource and its children +type ResourceNode struct { + *ResourceRef `json:",inline" protobuf:"bytes,1,opt,name=resourceRef"` + ParentRefs []*ResourceRef `json:"parentRefs,omitempty" protobuf:"bytes,2,opt,name=parentRefs"` + NetworkingInfo *ResourceNetworkingInfo `json:"networkingInfo,omitempty" protobuf:"bytes,4,opt,name=networkingInfo"` + ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,5,opt,name=resourceVersion"` + Health *HealthStatus `json:"health,omitempty" protobuf:"bytes,7,opt,name=health"` + IsHibernated bool `json:"isHibernated"` + CanBeHibernated bool `json:"canBeHibernated"` + Info []InfoItem `json:"info,omitempty"` + Port []int64 `json:"port,omitempty"` + CreatedAt string `json:"createdAt,omitempty"` + IsHook bool `json:"isHook,omitempty"` + HookType string `json:"hookType,omitempty"` + // UpdateRevision is used when a pod's owner is a StatefulSet for identifying if the pod is new or old + UpdateRevision string `json:"updateRevision,omitempty"` + // DeploymentPodHash is the podHash in deployment manifest and is used to compare replicaSet's podHash for identifying new vs old pod + DeploymentPodHash string `json:"deploymentPodHash,omitempty"` + DeploymentCollisionCount *int32 `json:"deploymentCollisionCount,omitempty"` + // RolloutCurrentPodHash is the podHash in rollout manifest and is used to compare replicaSet's podHash for identifying new vs old pod + RolloutCurrentPodHash string `json:"rolloutCurrentPodHash,omitempty"` +} + +// ResourceRef includes fields which unique identify resource +type ResourceRef struct { + Group string `json:"group,omitempty" protobuf:"bytes,1,opt,name=group"` + Version string `json:"version,omitempty" protobuf:"bytes,2,opt,name=version"` + Kind string `json:"kind,omitempty" protobuf:"bytes,3,opt,name=kind"` + Namespace string `json:"namespace,omitempty" protobuf:"bytes,4,opt,name=namespace"` + Name string `json:"name,omitempty" protobuf:"bytes,5,opt,name=name"` + UID string `json:"uid,omitempty" protobuf:"bytes,6,opt,name=uid"` + Manifest unstructured.Unstructured `json:"-"` +} + +func (r *ResourceRef) GetGvk() schema.GroupVersionKind { + if r == nil { + return schema.GroupVersionKind{} + } + return schema.GroupVersionKind{ + Group: r.Group, + Version: r.Version, + Kind: r.Kind, + } +} + +// ResourceNetworkingInfo holds networking resource related information +type ResourceNetworkingInfo struct { + Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,3,opt,name=labels"` +} + +type HealthStatus struct { + Status HealthStatusCode `json:"status,omitempty" protobuf:"bytes,1,opt,name=status"` + Message string `json:"message,omitempty" protobuf:"bytes,2,opt,name=message"` +} + +type HealthStatusCode = string + +const ( + HealthStatusUnknown HealthStatusCode = "Unknown" + HealthStatusProgressing HealthStatusCode = "Progressing" + HealthStatusHealthy HealthStatusCode = "Healthy" + HealthStatusSuspended HealthStatusCode = "Suspended" + HealthStatusDegraded HealthStatusCode = "Degraded" + HealthStatusMissing HealthStatusCode = "Missing" + HealthStatusHibernated HealthStatusCode = "Hibernated" + HealthStatusPartiallyHibernated HealthStatusCode = "Partially Hibernated" +) + +type ResourceTreeResponse struct { + Nodes []*ResourceNode `json:"nodes,omitempty"` + PodMetadata []*PodMetadata `json:"podMetadata,omitempty"` +} + +type PodMetadata struct { + Name string `json:"name"` + UID string `json:"uid"` + Containers []string `json:"containers"` + InitContainers []string `json:"initContainers"` + IsNew bool `json:"isNew"` + EphemeralContainers []*EphemeralContainerData `json:"ephemeralContainers"` +} + +// use value field as generic type +// InfoItem contains arbitrary, human readable information about an application +type InfoItem struct { + // Name is a human readable title for this piece of information. + Name string `json:"name,omitempty"` + // Value is human readable content. + Value interface{} `json:"value,omitempty"` +} + +type EphemeralContainerData struct { + Name string `json:"name"` + IsExternal bool `json:"isExternal"` +} + +type EphemeralContainerStatusesInfo struct { + Name string + State v1.ContainerState +} + +type EphemeralContainerInfo struct { + Name string + Command []string +} +type ExtraNodeInfo struct { + // UpdateRevision is only used for StatefulSets, if not empty, indicates the version of the StatefulSet used to generate Pods in the sequence + UpdateRevision string + ResourceNetworkingInfo *ResourceNetworkingInfo + RolloutCurrentPodHash string +} + +const ( + DEFAULT_CLUSTER = "default_cluster" + DEVTRON_SERVICE_NAME = "devtron-service" + DefaultClusterUrl = "https://kubernetes.default.svc" + BearerToken = "bearer_token" + CertificateAuthorityData = "cert_auth_data" + CertData = "cert_data" + TlsKey = "tls_key" + LiveZ = "/livez" + Running = "Running" + RestartingNotSupported = "restarting not supported" + DEVTRON_APP_LABEL_KEY = "app" + DEVTRON_APP_LABEL_VALUE1 = "devtron" + DEVTRON_APP_LABEL_VALUE2 = "orchestrator" +) diff --git a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8sObjectsUtil/EphemeralContainersUtil.go b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8sObjectsUtil/EphemeralContainersUtil.go index 95c590e95..4522a5f96 100644 --- a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8sObjectsUtil/EphemeralContainersUtil.go +++ b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8sObjectsUtil/EphemeralContainersUtil.go @@ -74,7 +74,3 @@ func IsExternalEphemeralContainer(cmds []string, name string) bool { } return isExternal } - -func IsPod(kind string, group string) bool { - return kind == "Pod" && group == "" -} diff --git a/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8sObjectsUtil/ResourceTreeUtil.go b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8sObjectsUtil/ResourceTreeUtil.go new file mode 100644 index 000000000..c2ce6260a --- /dev/null +++ b/kubelink/vendor/github.com/devtron-labs/common-lib/utils/k8sObjectsUtil/ResourceTreeUtil.go @@ -0,0 +1,700 @@ +package k8sObjectsUtil + +import ( + "encoding/binary" + "fmt" + "github.com/davecgh/go-spew/spew" + "github.com/devtron-labs/common-lib/utils/k8s/commonBean" + "github.com/devtron-labs/common-lib/utils/k8s/health" + "hash" + "hash/fnv" + v1 "k8s.io/api/core/v1" + "k8s.io/api/extensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/rand" +) + +func GetNodeFromResource(manifest *unstructured.Unstructured, resourceReference v1.ObjectReference, ownerRefs []metav1.OwnerReference, requestedNamespace string) (*commonBean.ResourceNode, error) { + gvk := manifest.GroupVersionKind() + _namespace := manifest.GetNamespace() + if _namespace == "" { + _namespace = requestedNamespace + } + ports := GetPorts(manifest, gvk) + resourceRef := BuildResourceRef(gvk, *manifest, _namespace) + + creationTimeStamp := "" + val, found, err := unstructured.NestedString(manifest.Object, "metadata", "creationTimestamp") + if found && err == nil { + creationTimeStamp = val + } + node := &commonBean.ResourceNode{ + ResourceRef: resourceRef, + ResourceVersion: manifest.GetResourceVersion(), + NetworkingInfo: &commonBean.ResourceNetworkingInfo{ + Labels: manifest.GetLabels(), + }, + CreatedAt: creationTimeStamp, + Port: ports, + } + node.IsHook, node.HookType = GetHookMetadata(manifest) + + // set health of Node + SetHealthStatusForNode(node, manifest, gvk) + + // hibernate set starts + if len(ownerRefs) == 0 { + + // set CanBeHibernated + SetHibernationRules(node, &node.Manifest) + } + // hibernate set ends + + if IsPod(gvk.Kind, gvk.Group) { + infoItems, _ := PopulatePodInfo(manifest) + node.Info = infoItems + } + AddSelectiveInfoInResourceNode(node, gvk, manifest.Object) + + return node, nil +} + +func GetPorts(manifest *unstructured.Unstructured, gvk schema.GroupVersionKind) []int64 { + ports := make([]int64, 0) + if gvk.Kind == commonBean.ServiceKind { + ports = append(ports, getPortsFromService(manifest)...) + } + if gvk.Kind == commonBean.EndPointsSlice { + ports = append(ports, getPortsFromEndPointsSlice(manifest)...) + } + if gvk.Kind == commonBean.EndpointsKind { + ports = append(ports, getPortsFromEndpointsKind(manifest)...) + } + return ports +} + +func getPortsFromService(manifest *unstructured.Unstructured) []int64 { + var ports []int64 + if manifest.Object["spec"] != nil { + spec := manifest.Object["spec"].(map[string]interface{}) + if spec["ports"] != nil { + portList := spec["ports"].([]interface{}) + for _, portItem := range portList { + if portItem.(map[string]interface{}) != nil { + _portNumber := portItem.(map[string]interface{})["port"] + portNumber := _portNumber.(int64) + if portNumber != 0 { + ports = append(ports, portNumber) + } + } + } + } + } + return ports +} + +func getPortsFromEndPointsSlice(manifest *unstructured.Unstructured) []int64 { + var ports []int64 + if manifest.Object["ports"] != nil { + endPointsSlicePorts := manifest.Object["ports"].([]interface{}) + for _, val := range endPointsSlicePorts { + _portNumber := val.(map[string]interface{})["port"] + portNumber := _portNumber.(int64) + if portNumber != 0 { + ports = append(ports, portNumber) + } + } + } + return ports +} + +func getPortsFromEndpointsKind(manifest *unstructured.Unstructured) []int64 { + var ports []int64 + if manifest.Object["subsets"] != nil { + subsets := manifest.Object["subsets"].([]interface{}) + for _, subset := range subsets { + subsetObj := subset.(map[string]interface{}) + if subsetObj != nil { + portsIfs := subsetObj["ports"].([]interface{}) + for _, portsIf := range portsIfs { + portsIfObj := portsIf.(map[string]interface{}) + if portsIfObj != nil { + port := portsIfObj["port"].(int64) + ports = append(ports, port) + } + } + } + } + } + return ports +} + +func BuildResourceRef(gvk schema.GroupVersionKind, manifest unstructured.Unstructured, namespace string) *commonBean.ResourceRef { + resourceRef := &commonBean.ResourceRef{ + Group: gvk.Group, + Version: gvk.Version, + Kind: gvk.Kind, + Namespace: namespace, + Name: manifest.GetName(), + UID: string(manifest.GetUID()), + Manifest: manifest, + } + return resourceRef +} + +func GetHookMetadata(manifest *unstructured.Unstructured) (bool, string) { + annotations, found, _ := unstructured.NestedStringMap(manifest.Object, "metadata", "annotations") + if found { + if hookType, ok := annotations[commonBean.HelmHookAnnotation]; ok { + return true, hookType + } + } + return false, "" +} + +func SetHealthStatusForNode(res *commonBean.ResourceNode, un *unstructured.Unstructured, gvk schema.GroupVersionKind) { + if IsService(gvk) && un.GetName() == commonBean.DEVTRON_SERVICE_NAME && IsDevtronApp(res.NetworkingInfo.Labels) { + res.Health = &commonBean.HealthStatus{ + Status: commonBean.HealthStatusHealthy, + } + } else { + if healthCheck := health.GetHealthCheckFunc(gvk); healthCheck != nil { + health, err := healthCheck(un) + if err != nil { + res.Health = &commonBean.HealthStatus{ + Status: commonBean.HealthStatusUnknown, + Message: err.Error(), + } + } else if health != nil { + res.Health = &commonBean.HealthStatus{ + Status: string(health.Status), + Message: health.Message, + } + } + } + } +} + +func SetHibernationRules(res *commonBean.ResourceNode, un *unstructured.Unstructured) { + if un.GetOwnerReferences() == nil { + // set CanBeHibernated + replicas, found, _ := unstructured.NestedInt64(un.UnstructuredContent(), "spec", "replicas") + if found { + res.CanBeHibernated = true + } + + // set IsHibernated + annotations := un.GetAnnotations() + if annotations != nil { + if val, ok := annotations[commonBean.HibernateReplicaAnnotation]; ok { + if val != "0" && replicas == 0 { + res.IsHibernated = true + } + } + } + } +} + +func PopulatePodInfo(un *unstructured.Unstructured) ([]commonBean.InfoItem, error) { + var infoItems []commonBean.InfoItem + + pod := v1.Pod{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(un.Object, &pod) + if err != nil { + return nil, err + } + restarts := 0 + totalContainers := len(pod.Spec.Containers) + readyContainers := 0 + + reason := string(pod.Status.Phase) + if pod.Status.Reason != "" { + reason = pod.Status.Reason + } + + initializing := false + for i := range pod.Status.InitContainerStatuses { + container := pod.Status.InitContainerStatuses[i] + restarts += int(container.RestartCount) + switch { + case container.State.Terminated != nil && container.State.Terminated.ExitCode == 0: + continue + case container.State.Terminated != nil: + // initialization is failed + if len(container.State.Terminated.Reason) == 0 { + if container.State.Terminated.Signal != 0 { + reason = fmt.Sprintf("Init:Signal:%d", container.State.Terminated.Signal) + } else { + reason = fmt.Sprintf("Init:ExitCode:%d", container.State.Terminated.ExitCode) + } + } else { + reason = "Init:" + container.State.Terminated.Reason + } + initializing = true + case container.State.Waiting != nil && len(container.State.Waiting.Reason) > 0 && container.State.Waiting.Reason != "PodInitializing": + reason = "Init:" + container.State.Waiting.Reason + initializing = true + default: + reason = fmt.Sprintf("Init:%d/%d", i, len(pod.Spec.InitContainers)) + initializing = true + } + break + } + if !initializing { + restarts = 0 + hasRunning := false + for i := len(pod.Status.ContainerStatuses) - 1; i >= 0; i-- { + container := pod.Status.ContainerStatuses[i] + + restarts += int(container.RestartCount) + if container.State.Waiting != nil && container.State.Waiting.Reason != "" { + reason = container.State.Waiting.Reason + } else if container.State.Terminated != nil && container.State.Terminated.Reason != "" { + reason = container.State.Terminated.Reason + } else if container.State.Terminated != nil && container.State.Terminated.Reason == "" { + if container.State.Terminated.Signal != 0 { + reason = fmt.Sprintf("Signal:%d", container.State.Terminated.Signal) + } else { + reason = fmt.Sprintf("ExitCode:%d", container.State.Terminated.ExitCode) + } + } else if container.Ready && container.State.Running != nil { + hasRunning = true + readyContainers++ + } + } + + // change pod status back to "Running" if there is at least one container still reporting as "Running" status + if reason == "Completed" && hasRunning { + reason = "Running" + } + } + + // "NodeLost" = https://github.com/kubernetes/kubernetes/blob/cb8ad64243d48d9a3c26b11b2e0945c098457282/pkg/util/node/node.go#L46 + // But depending on the k8s.io/kubernetes package just for a constant + // is not worth it. + // See https://github.com/argoproj/argo-cd/issues/5173 + // and https://github.com/kubernetes/kubernetes/issues/90358#issuecomment-617859364 + if pod.DeletionTimestamp != nil && pod.Status.Reason == "NodeLost" { + reason = "Unknown" + } else if pod.DeletionTimestamp != nil { + reason = "Terminating" + } + infoItems = getAllInfoItems(infoItems, reason, restarts, readyContainers, totalContainers, pod) + return infoItems, nil +} + +func getAllInfoItems(infoItems []commonBean.InfoItem, reason string, restarts int, readyContainers int, totalContainers int, pod v1.Pod) []commonBean.InfoItem { + if reason != "" { + infoItems = append(infoItems, commonBean.InfoItem{Name: commonBean.StatusReason, Value: reason}) + } + infoItems = append(infoItems, commonBean.InfoItem{Name: commonBean.Node, Value: pod.Spec.NodeName}) + + containerNames, initContainerNames, ephemeralContainersInfo, ephemeralContainerStatus := getContainersInfo(pod) + + infoItems = append(infoItems, commonBean.InfoItem{Name: commonBean.ContainersType, Value: fmt.Sprintf("%d/%d", readyContainers, totalContainers)}) + infoItems = append(infoItems, commonBean.InfoItem{Name: commonBean.ContainersNamesType, Value: containerNames}) + infoItems = append(infoItems, commonBean.InfoItem{Name: commonBean.InitContainersNamesType, Value: initContainerNames}) + infoItems = append(infoItems, commonBean.InfoItem{Name: commonBean.EphemeralContainersInfoType, Value: ephemeralContainersInfo}) + infoItems = append(infoItems, commonBean.InfoItem{Name: commonBean.EphemeralContainersStatusType, Value: ephemeralContainerStatus}) + + if restarts > 0 { + infoItems = append(infoItems, commonBean.InfoItem{Name: commonBean.RestartCount, Value: fmt.Sprintf("%d", restarts)}) + } + return infoItems +} + +func getContainersInfo(pod v1.Pod) ([]string, []string, []commonBean.EphemeralContainerInfo, []commonBean.EphemeralContainerStatusesInfo) { + containerNames := make([]string, 0, len(pod.Spec.Containers)) + initContainerNames := make([]string, 0, len(pod.Spec.InitContainers)) + ephemeralContainers := make([]commonBean.EphemeralContainerInfo, 0, len(pod.Spec.EphemeralContainers)) + ephemeralContainerStatus := make([]commonBean.EphemeralContainerStatusesInfo, 0, len(pod.Status.EphemeralContainerStatuses)) + for _, container := range pod.Spec.Containers { + containerNames = append(containerNames, container.Name) + } + for _, initContainer := range pod.Spec.InitContainers { + initContainerNames = append(initContainerNames, initContainer.Name) + } + for _, ec := range pod.Spec.EphemeralContainers { + ecData := commonBean.EphemeralContainerInfo{ + Name: ec.Name, + Command: ec.Command, + } + ephemeralContainers = append(ephemeralContainers, ecData) + } + for _, ecStatus := range pod.Status.EphemeralContainerStatuses { + status := commonBean.EphemeralContainerStatusesInfo{ + Name: ecStatus.Name, + State: ecStatus.State, + } + ephemeralContainerStatus = append(ephemeralContainerStatus, status) + } + return containerNames, initContainerNames, ephemeralContainers, ephemeralContainerStatus +} + +func AddSelectiveInfoInResourceNode(resourceNode *commonBean.ResourceNode, gvk schema.GroupVersionKind, obj map[string]interface{}) { + if gvk.Kind == commonBean.StatefulSetKind { + resourceNode.UpdateRevision = GetUpdateRevisionForStatefulSet(obj) + } + if gvk.Kind == commonBean.DeploymentKind { + deployment, _ := ConvertToV1Deployment(obj) + if deployment == nil { + return + } + deploymentPodHash := ComputePodHash(&deployment.Spec.Template, deployment.Status.CollisionCount) + resourceNode.DeploymentPodHash = deploymentPodHash + resourceNode.DeploymentCollisionCount = deployment.Status.CollisionCount + } + if gvk.Kind == commonBean.K8sClusterResourceRolloutKind { + rolloutPodHash, found, _ := unstructured.NestedString(obj, "status", "currentPodHash") + if found { + resourceNode.RolloutCurrentPodHash = rolloutPodHash + } + } +} + +func ComputePodHash(template *v1.PodTemplateSpec, collisionCount *int32) string { + podTemplateSpecHasher := fnv.New32a() + DeepHashObject(podTemplateSpecHasher, *template) + + // Add collisionCount in the hash if it exists. + if collisionCount != nil { + collisionCountBytes := make([]byte, 8) + binary.LittleEndian.PutUint32(collisionCountBytes, uint32(*collisionCount)) + _, err := podTemplateSpecHasher.Write(collisionCountBytes) + if err != nil { + fmt.Println(err) + } + } + return rand.SafeEncodeString(fmt.Sprint(podTemplateSpecHasher.Sum32())) +} + +func ConvertToV1Deployment(nodeObj map[string]interface{}) (*v1beta1.Deployment, error) { + deploymentObj := v1beta1.Deployment{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(nodeObj, &deploymentObj) + if err != nil { + return nil, err + } + return &deploymentObj, nil +} + +func GetUpdateRevisionForStatefulSet(obj map[string]interface{}) string { + updateRevisionFromManifest, found, _ := unstructured.NestedString(obj, "status", "updateRevision") + if found { + return updateRevisionFromManifest + } + return "" +} + +// DeepHashObject writes specified object to hash using the spew library +// which follows pointers and prints actual values of the nested objects +// ensuring the hash does not change when a pointer changes. +func DeepHashObject(hasher hash.Hash, objectToWrite interface{}) { + hasher.Reset() + printer := spew.ConfigState{ + Indent: " ", + SortKeys: true, + DisableMethods: true, + SpewKeys: true, + } + _, err := printer.Fprintf(hasher, "%#v", objectToWrite) + if err != nil { + fmt.Println(err) + } +} + +func BuildPodMetadata(nodes []*commonBean.ResourceNode) ([]*commonBean.PodMetadata, error) { + podsMetadata := make([]*commonBean.PodMetadata, 0, len(nodes)) + for _, node := range nodes { + + if node.Kind != commonBean.PodKind { + continue + } + // set containers,initContainers and ephemeral container names + var containerNames []string + var initContainerNames []string + var ephemeralContainersInfo []commonBean.EphemeralContainerInfo + var ephemeralContainerStatus []commonBean.EphemeralContainerStatusesInfo + + for _, nodeInfo := range node.Info { + switch nodeInfo.Name { + case commonBean.ContainersNamesType: + containerNames = nodeInfo.Value.([]string) + case commonBean.InitContainersNamesType: + initContainerNames = nodeInfo.Value.([]string) + case commonBean.EphemeralContainersInfoType: + ephemeralContainersInfo = nodeInfo.Value.([]commonBean.EphemeralContainerInfo) + case commonBean.EphemeralContainersStatusType: + ephemeralContainerStatus = nodeInfo.Value.([]commonBean.EphemeralContainerStatusesInfo) + default: + continue + } + } + + ephemeralContainerStatusMap := make(map[string]bool) + for _, c := range ephemeralContainerStatus { + // c.state contains three states running,waiting and terminated + // at any point of time only one state will be there + if c.State.Running != nil { + ephemeralContainerStatusMap[c.Name] = true + } + } + ephemeralContainers := make([]*commonBean.EphemeralContainerData, 0, len(ephemeralContainersInfo)) + // sending only running ephemeral containers in the list + for _, ec := range ephemeralContainersInfo { + if _, ok := ephemeralContainerStatusMap[ec.Name]; ok { + containerData := &commonBean.EphemeralContainerData{ + Name: ec.Name, + IsExternal: IsExternalEphemeralContainer(ec.Command, ec.Name), + } + ephemeralContainers = append(ephemeralContainers, containerData) + } + } + + podMetadata := &commonBean.PodMetadata{ + Name: node.Name, + UID: node.UID, + Containers: containerNames, + InitContainers: initContainerNames, + EphemeralContainers: ephemeralContainers, + } + + podsMetadata = append(podsMetadata, podMetadata) + + } + return podsMetadata, nil +} + +func GetExtraNodeInfoMappings(nodes []*commonBean.ResourceNode) (map[string]string, map[string]*commonBean.ExtraNodeInfo, map[string]*commonBean.ExtraNodeInfo) { + deploymentPodHashMap := make(map[string]string) + rolloutNameVsExtraNodeInfoMapping := make(map[string]*commonBean.ExtraNodeInfo) + uidVsExtraNodeInfoMapping := make(map[string]*commonBean.ExtraNodeInfo) + for _, node := range nodes { + if node.Kind == commonBean.DeploymentKind { + deploymentPodHashMap[node.Name] = node.DeploymentPodHash + } else if node.Kind == commonBean.K8sClusterResourceRolloutKind { + rolloutNameVsExtraNodeInfoMapping[node.Name] = &commonBean.ExtraNodeInfo{ + RolloutCurrentPodHash: node.RolloutCurrentPodHash, + } + } else if node.Kind == commonBean.StatefulSetKind || node.Kind == commonBean.DaemonSetKind { + if _, ok := uidVsExtraNodeInfoMapping[node.UID]; !ok { + uidVsExtraNodeInfoMapping[node.UID] = &commonBean.ExtraNodeInfo{UpdateRevision: node.UpdateRevision, ResourceNetworkingInfo: node.NetworkingInfo} + } + } + } + return deploymentPodHashMap, rolloutNameVsExtraNodeInfoMapping, uidVsExtraNodeInfoMapping +} + +func IsPodNew(nodes []*commonBean.ResourceNode, node *commonBean.ResourceNode, deploymentPodHashMap map[string]string, rolloutMap map[string]*commonBean.ExtraNodeInfo, + uidVsExtraNodeInfoMap map[string]*commonBean.ExtraNodeInfo) (bool, error) { + + isNew := false + parentRef := node.ParentRefs[0] + parentKind := parentRef.Kind + + // if parent is StatefulSet - then pod label controller-revision-hash should match StatefulSet's update revision + if parentKind == commonBean.StatefulSetKind && node.NetworkingInfo != nil { + isNew = uidVsExtraNodeInfoMap[parentRef.UID].UpdateRevision == node.NetworkingInfo.Labels["controller-revision-hash"] + } + + // if parent is Job - then pod label controller-revision-hash should match StatefulSet's update revision + if parentKind == commonBean.JobKind { + // TODO - new or old logic not built in orchestrator for Job's pods. hence not implementing here. as don't know the logic :) + isNew = true + } + + // if parent kind is replica set then + if parentKind == commonBean.ReplicaSetKind { + replicaSetNode := GetMatchingNode(nodes, parentKind, parentRef.Name) + + // if parent of replicaset is deployment, compare label pod-template-hash + if replicaSetParent := replicaSetNode.ParentRefs[0]; replicaSetNode != nil && len(replicaSetNode.ParentRefs) > 0 && replicaSetParent.Kind == commonBean.DeploymentKind { + deploymentPodHash := deploymentPodHashMap[replicaSetParent.Name] + replicaSetObj, err := GetReplicaSetObject(replicaSetNode) + if err != nil { + return isNew, err + } + deploymentNode := GetMatchingNode(nodes, replicaSetParent.Kind, replicaSetParent.Name) + // TODO: why do we need deployment object for collisionCount ?? + var deploymentCollisionCount *int32 + if deploymentNode != nil && deploymentNode.DeploymentCollisionCount != nil { + deploymentCollisionCount = deploymentNode.DeploymentCollisionCount + } else { + deploymentCollisionCount, err = getDeploymentCollisionCount(replicaSetParent) + if err != nil { + return isNew, err + } + } + replicaSetPodHash := GetReplicaSetPodHash(replicaSetObj, deploymentCollisionCount) + isNew = replicaSetPodHash == deploymentPodHash + } else if replicaSetParent.Kind == commonBean.K8sClusterResourceRolloutKind { + + rolloutExtraInfo := rolloutMap[replicaSetParent.Name] + rolloutPodHash := rolloutExtraInfo.RolloutCurrentPodHash + replicasetPodHash := GetRolloutPodTemplateHash(replicaSetNode) + + isNew = rolloutPodHash == replicasetPodHash + + } + + } + + // if parent kind is DaemonSet then compare DaemonSet's Child ControllerRevision's label controller-revision-hash with pod label controller-revision-hash + if parentKind == commonBean.DaemonSetKind { + controllerRevisionNodes := GetMatchingNodes(nodes, "ControllerRevision") + for _, controllerRevisionNode := range controllerRevisionNodes { + if len(controllerRevisionNode.ParentRefs) > 0 && controllerRevisionNode.ParentRefs[0].Kind == parentKind && + controllerRevisionNode.ParentRefs[0].Name == parentRef.Name && uidVsExtraNodeInfoMap[parentRef.UID].ResourceNetworkingInfo != nil && + node.NetworkingInfo != nil { + + isNew = uidVsExtraNodeInfoMap[parentRef.UID].ResourceNetworkingInfo.Labels["controller-revision-hash"] == node.NetworkingInfo.Labels["controller-revision-hash"] + } + } + } + return isNew, nil +} + +func GetRolloutPodTemplateHash(replicasetNode *commonBean.ResourceNode) string { + if rolloutPodTemplateHash, ok := replicasetNode.NetworkingInfo.Labels["rollouts-pod-template-hash"]; ok { + return rolloutPodTemplateHash + } + return "" +} + +func getDeploymentCollisionCount(deploymentInfo *commonBean.ResourceRef) (*int32, error) { + + var deploymentNodeObj map[string]interface{} + var err error + deploymentNodeObj = deploymentInfo.Manifest.Object + + deploymentObj, err := ConvertToV1Deployment(deploymentNodeObj) + if err != nil { + return nil, err + } + return deploymentObj.Status.CollisionCount, nil +} + +func GetMatchingNode(nodes []*commonBean.ResourceNode, kind string, name string) *commonBean.ResourceNode { + for _, node := range nodes { + if node.Kind == kind && node.Name == name { + return node + } + } + return nil +} + +func GetMatchingNodes(nodes []*commonBean.ResourceNode, kind string) []*commonBean.ResourceNode { + nodesRes := make([]*commonBean.ResourceNode, 0, len(nodes)) + for _, node := range nodes { + if node.Kind == kind { + nodesRes = append(nodesRes, node) + } + } + return nodesRes +} + +func GetReplicaSetObject(replicaSetNode *commonBean.ResourceNode) (*v1beta1.ReplicaSet, error) { + var replicaSetNodeObj map[string]interface{} + var err error + replicaSetNodeObj = replicaSetNode.Manifest.Object + + replicaSetObj, err := ConvertToV1ReplicaSet(replicaSetNodeObj) + if err != nil { + return nil, err + } + return replicaSetObj, nil +} + +func ConvertToV1ReplicaSet(nodeObj map[string]interface{}) (*v1beta1.ReplicaSet, error) { + replicaSetObj := v1beta1.ReplicaSet{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(nodeObj, &replicaSetObj) + if err != nil { + return nil, err + } + return &replicaSetObj, nil +} + +func GetReplicaSetPodHash(replicasetObj *v1beta1.ReplicaSet, collisionCount *int32) string { + labels := make(map[string]string) + for k, v := range replicasetObj.Spec.Template.Labels { + if k != "pod-template-hash" { + labels[k] = v + } + } + replicasetObj.Spec.Template.Labels = labels + podHash := ComputePodHash(&replicasetObj.Spec.Template, collisionCount) + return podHash +} + +func IsDevtronApp(labels map[string]string) bool { + isDevtronApp := false + if val, ok := labels[commonBean.DEVTRON_APP_LABEL_KEY]; ok { + if val == commonBean.DEVTRON_APP_LABEL_VALUE1 || val == commonBean.DEVTRON_APP_LABEL_VALUE2 { + isDevtronApp = true + } + } + return isDevtronApp +} + +func IsService(gvk schema.GroupVersionKind) bool { + return gvk.Group == "" && gvk.Kind == commonBean.ServiceKind +} + +func IsPod(kind string, group string) bool { + return kind == "Pod" && group == "" +} + +func GetMatchingPodMetadataForUID(podMetadatas []*commonBean.PodMetadata, uid string) *commonBean.PodMetadata { + if len(podMetadatas) == 0 { + return nil + } + for _, podMetadata := range podMetadatas { + if podMetadata.UID == uid { + return podMetadata + } + } + return nil +} + +// app health is worst of the nodes health +// or if app status is healthy then check for hibernation status +func BuildAppHealthStatus(nodes []*commonBean.ResourceNode) *commonBean.HealthStatusCode { + appHealthStatus := commonBean.HealthStatusHealthy + isAppFullyHibernated := true + var isAppPartiallyHibernated bool + var isAnyNodeCanByHibernated bool + + for _, node := range nodes { + if node.IsHook { + continue + } + nodeHealth := node.Health + if node.CanBeHibernated { + isAnyNodeCanByHibernated = true + if !node.IsHibernated { + isAppFullyHibernated = false + } else { + isAppPartiallyHibernated = true + } + } + if nodeHealth == nil { + continue + } + if health.IsWorseStatus(health.HealthStatusCode(appHealthStatus), health.HealthStatusCode(nodeHealth.Status)) { + appHealthStatus = nodeHealth.Status + } + } + + // override hibernate status on app level if status is healthy and hibernation done + if appHealthStatus == commonBean.HealthStatusHealthy && isAnyNodeCanByHibernated { + if isAppFullyHibernated { + appHealthStatus = commonBean.HealthStatusHibernated + } else if isAppPartiallyHibernated { + appHealthStatus = commonBean.HealthStatusPartiallyHibernated + } + } + + return &appHealthStatus +} diff --git a/kubelink/vendor/modules.txt b/kubelink/vendor/modules.txt index 3e6e8bb86..ca05a3c8c 100644 --- a/kubelink/vendor/modules.txt +++ b/kubelink/vendor/modules.txt @@ -127,7 +127,7 @@ github.com/cyphar/filepath-securejoin # github.com/davecgh/go-spew v1.1.1 ## explicit github.com/davecgh/go-spew/spew -# github.com/devtron-labs/common-lib v0.16.1-0.20240923063129-ff2dc035435e +# github.com/devtron-labs/common-lib v0.18.1-0.20241001061923-eda545dc839e ## explicit; go 1.21 github.com/devtron-labs/common-lib/async github.com/devtron-labs/common-lib/constants diff --git a/kubelink/wire_gen.go b/kubelink/wire_gen.go index 0eaca950c..ccc1455c3 100644 --- a/kubelink/wire_gen.go +++ b/kubelink/wire_gen.go @@ -1,6 +1,6 @@ // Code generated by Wire. DO NOT EDIT. -//go:generate go run github.com/google/wire/cmd/wire +//go:generate go run -mod=mod github.com/google/wire/cmd/wire //go:build !wireinject // +build !wireinject