diff --git a/Wire.go b/Wire.go index 9f7e7811ce..0d279f67c2 100644 --- a/Wire.go +++ b/Wire.go @@ -41,6 +41,7 @@ import ( "github.com/devtron-labs/devtron/api/deployment" "github.com/devtron-labs/devtron/api/devtronResource" "github.com/devtron-labs/devtron/api/externalLink" + fluxApplication "github.com/devtron-labs/devtron/api/fluxApplication" client "github.com/devtron-labs/devtron/api/helm-app" "github.com/devtron-labs/devtron/api/infraConfig" "github.com/devtron-labs/devtron/api/k8s" @@ -200,7 +201,7 @@ func InitializeApp() (*App, error) { build.BuildWireSet, deployment2.DeploymentWireSet, argoApplication.ArgoApplicationWireSet, - + fluxApplication.FluxApplicationWireSet, eventProcessor.EventProcessorWireSet, workflow3.WorkflowWireSet, diff --git a/api/fluxApplication/FluxApplicationRestHandler.go b/api/fluxApplication/FluxApplicationRestHandler.go new file mode 100644 index 0000000000..7d947b2aae --- /dev/null +++ b/api/fluxApplication/FluxApplicationRestHandler.go @@ -0,0 +1,94 @@ +package fluxApplication + +import ( + "errors" + "github.com/devtron-labs/devtron/api/restHandler/common" + "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" + clientErrors "github.com/devtron-labs/devtron/pkg/errors" + "github.com/devtron-labs/devtron/pkg/fluxApplication" + "github.com/gorilla/mux" + "go.uber.org/zap" + "net/http" +) + +type FluxApplicationRestHandler interface { + ListFluxApplications(w http.ResponseWriter, r *http.Request) + GetApplicationDetail(w http.ResponseWriter, r *http.Request) +} + +type FluxApplicationRestHandlerImpl struct { + fluxApplicationService fluxApplication.FluxApplicationService + logger *zap.SugaredLogger + enforcer casbin.Enforcer +} + +func NewFluxApplicationRestHandlerImpl(fluxApplicationService fluxApplication.FluxApplicationService, + logger *zap.SugaredLogger, enforcer casbin.Enforcer) *FluxApplicationRestHandlerImpl { + return &FluxApplicationRestHandlerImpl{ + fluxApplicationService: fluxApplicationService, + logger: logger, + enforcer: enforcer, + } + +} + +func (handler *FluxApplicationRestHandlerImpl) ListFluxApplications(w http.ResponseWriter, r *http.Request) { + + //handle super-admin RBAC + token := r.Header.Get("token") + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok { + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + return + } + v := r.URL.Query() + clusterIdString := v.Get("clusterIds") + var clusterIds []int + var err error + + //handling when the clusterIds string is empty ,it will not support the + if len(clusterIdString) == 0 { + handler.logger.Errorw("error in getting cluster ids", "error", err, "clusterIds", clusterIds) + common.WriteJsonResp(w, errors.New("error in getting cluster ids"), nil, http.StatusBadRequest) + return + } + clusterIds, err = common.ExtractIntArrayQueryParam(w, r, "clusterIds") + if err != nil { + handler.logger.Errorw("error in parsing cluster ids", "error", err, "clusterIds", clusterIds) + return + } + handler.logger.Debugw("extracted ClusterIds successfully ", "clusterIds", clusterIds) + handler.fluxApplicationService.ListFluxApplications(r.Context(), clusterIds, w) +} + +func (handler *FluxApplicationRestHandlerImpl) GetApplicationDetail(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + appIdString := vars["appId"] + appIdentifier, err := fluxApplication.DecodeFluxExternalAppId(appIdString) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + if appIdentifier.IsKustomizeApp == true && appIdentifier.Name == "flux-system" && appIdentifier.Namespace == "flux-system" { + + common.WriteJsonResp(w, errors.New("cannot proceed for the flux system root level "), nil, http.StatusBadRequest) + return + } + + // handle super-admin RBAC + token := r.Header.Get("token") + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok { + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + return + } + + res, err := handler.fluxApplicationService.GetFluxAppDetail(r.Context(), appIdentifier) + if err != nil { + apiError := clientErrors.ConvertToApiError(err) + if apiError != nil { + err = apiError + } + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, res, http.StatusOK) +} diff --git a/api/fluxApplication/FluxApplicationRouter.go b/api/fluxApplication/FluxApplicationRouter.go new file mode 100644 index 0000000000..209a8b337b --- /dev/null +++ b/api/fluxApplication/FluxApplicationRouter.go @@ -0,0 +1,27 @@ +package fluxApplication + +import ( + "github.com/gorilla/mux" +) + +type FluxApplicationRouter interface { + InitFluxApplicationRouter(fluxApplicationRouter *mux.Router) +} + +type FluxApplicationRouterImpl struct { + fluxApplicationRestHandler FluxApplicationRestHandler +} + +func NewFluxApplicationRouterImpl(fluxApplicationRestHandler FluxApplicationRestHandler) *FluxApplicationRouterImpl { + return &FluxApplicationRouterImpl{ + fluxApplicationRestHandler: fluxApplicationRestHandler, + } +} + +func (impl *FluxApplicationRouterImpl) InitFluxApplicationRouter(fluxApplicationRouter *mux.Router) { + fluxApplicationRouter.Path(""). + Methods("GET"). + HandlerFunc(impl.fluxApplicationRestHandler.ListFluxApplications) + fluxApplicationRouter.Path("/app").Queries("appId", "{appId}"). + HandlerFunc(impl.fluxApplicationRestHandler.GetApplicationDetail).Methods("GET") +} diff --git a/api/fluxApplication/wire_fluxApplication.go b/api/fluxApplication/wire_fluxApplication.go new file mode 100644 index 0000000000..bfecc145fa --- /dev/null +++ b/api/fluxApplication/wire_fluxApplication.go @@ -0,0 +1,17 @@ +package fluxApplication + +import ( + "github.com/devtron-labs/devtron/pkg/fluxApplication" + "github.com/google/wire" +) + +var FluxApplicationWireSet = wire.NewSet( + fluxApplication.NewFluxApplicationServiceImpl, + wire.Bind(new(fluxApplication.FluxApplicationService), new(*fluxApplication.FluxApplicationServiceImpl)), + + NewFluxApplicationRestHandlerImpl, + wire.Bind(new(FluxApplicationRestHandler), new(*FluxApplicationRestHandlerImpl)), + + NewFluxApplicationRouterImpl, + wire.Bind(new(FluxApplicationRouter), new(*FluxApplicationRouterImpl)), +) diff --git a/api/helm-app/HelmAppRestHandler.go b/api/helm-app/HelmAppRestHandler.go index 4fdd770fd8..059ce2ad9d 100644 --- a/api/helm-app/HelmAppRestHandler.go +++ b/api/helm-app/HelmAppRestHandler.go @@ -24,7 +24,10 @@ import ( service2 "github.com/devtron-labs/devtron/api/helm-app/service" "github.com/devtron-labs/devtron/pkg/appStore/installedApp/service" "github.com/devtron-labs/devtron/pkg/appStore/installedApp/service/EAMode" + "github.com/devtron-labs/devtron/pkg/argoApplication" clientErrors "github.com/devtron-labs/devtron/pkg/errors" + "github.com/devtron-labs/devtron/pkg/fluxApplication" + bean2 "github.com/devtron-labs/devtron/pkg/k8s/application/bean" "net/http" "strconv" "strings" @@ -72,13 +75,16 @@ type HelmAppRestHandlerImpl struct { userAuthService user.UserService attributesService attributes.AttributesService serverEnvConfig *serverEnvConfig.ServerEnvConfig + fluxApplication fluxApplication.FluxApplicationService + argoApplication argoApplication.ArgoApplicationService } func NewHelmAppRestHandlerImpl(logger *zap.SugaredLogger, helmAppService service2.HelmAppService, enforcer casbin.Enforcer, clusterService cluster.ClusterService, enforcerUtil rbac.EnforcerUtilHelm, appStoreDeploymentService service.AppStoreDeploymentService, installedAppService EAMode.InstalledAppDBService, - userAuthService user.UserService, attributesService attributes.AttributesService, serverEnvConfig *serverEnvConfig.ServerEnvConfig) *HelmAppRestHandlerImpl { + userAuthService user.UserService, attributesService attributes.AttributesService, serverEnvConfig *serverEnvConfig.ServerEnvConfig, fluxApplication fluxApplication.FluxApplicationService, argoApplication argoApplication.ArgoApplicationService, +) *HelmAppRestHandlerImpl { return &HelmAppRestHandlerImpl{ logger: logger, helmAppService: helmAppService, @@ -90,6 +96,8 @@ func NewHelmAppRestHandlerImpl(logger *zap.SugaredLogger, userAuthService: userAuthService, attributesService: attributesService, serverEnvConfig: serverEnvConfig, + fluxApplication: fluxApplication, + argoApplication: argoApplication, } } @@ -159,68 +167,180 @@ func (handler *HelmAppRestHandlerImpl) GetApplicationDetail(w http.ResponseWrite } func (handler *HelmAppRestHandlerImpl) Hibernate(w http.ResponseWriter, r *http.Request) { - hibernateRequest := &openapi.HibernateRequest{} - decoder := json.NewDecoder(r.Body) - err := decoder.Decode(hibernateRequest) + hibernateRequest, err := decodeHibernateRequest(r) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } - appIdentifier, err := handler.helmAppService.DecodeAppId(*hibernateRequest.AppId) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return + + vars := mux.Vars(r) + var appType int + appTypeString := vars["appType"] //to check the type of app + if appTypeString == "" { + appType = 1 + } else { + appType, err = strconv.Atoi(appTypeString) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + } } - // RBAC enforcer applying - rbacObject, rbacObject2 := handler.enforcerUtil.GetHelmObjectByClusterIdNamespaceAndAppName(appIdentifier.ClusterId, appIdentifier.Namespace, appIdentifier.ReleaseName) token := r.Header.Get("token") - ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject2) - if !ok { - common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) - return + var res []*openapi.HibernateStatus + + if appType == bean2.ArgoAppType { + res, err = handler.handleArgoApplicationHibernate(r, token, hibernateRequest) + } else if appType == bean2.HelmAppType { + res, err = handler.handleHelmApplicationHibernate(r, token, hibernateRequest) + } else if appType == bean2.FluxAppType { + res, err = handler.handleFluxApplicationHibernate(r, token, hibernateRequest) } - //RBAC enforcer Ends - res, err := handler.helmAppService.HibernateApplication(r.Context(), appIdentifier, hibernateRequest) + if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, service2.GetStatusCode(err)) return } common.WriteJsonResp(w, err, res, http.StatusOK) } -func (handler *HelmAppRestHandlerImpl) UnHibernate(w http.ResponseWriter, r *http.Request) { +func decodeHibernateRequest(r *http.Request) (*openapi.HibernateRequest, error) { hibernateRequest := &openapi.HibernateRequest{} decoder := json.NewDecoder(r.Body) err := decoder.Decode(hibernateRequest) if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return + return nil, err + } + return hibernateRequest, nil +} + +func (handler *HelmAppRestHandlerImpl) handleFluxApplicationHibernate(r *http.Request, token string, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { + appIdentifier, err := fluxApplication.DecodeFluxExternalAppId(*hibernateRequest.AppId) + if err != nil { + return nil, err + } + + if !handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionUpdate, "*") { + return nil, errors.New("unauthorized") + } + + return handler.fluxApplication.HibernateFluxApplication(r.Context(), appIdentifier, hibernateRequest) +} +func (handler *HelmAppRestHandlerImpl) handleArgoApplicationHibernate(r *http.Request, token string, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { + appIdentifier, err := argoApplication.DecodeExternalArgoAppId(*hibernateRequest.AppId) + if err != nil { + return nil, err + } + + if !handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionUpdate, "*") { + return nil, errors.New("unauthorized") } + + return handler.argoApplication.HibernateArgoApplication(r.Context(), appIdentifier, hibernateRequest) +} + +func (handler *HelmAppRestHandlerImpl) handleHelmApplicationHibernate(r *http.Request, token string, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { appIdentifier, err := handler.helmAppService.DecodeAppId(*hibernateRequest.AppId) + if err != nil { + return nil, err + } + rbacObject, rbacObject2 := handler.enforcerUtil.GetHelmObjectByClusterIdNamespaceAndAppName( + appIdentifier.ClusterId, + appIdentifier.Namespace, + appIdentifier.ReleaseName, + ) + + ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject) || + handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject2) + if !ok { + return nil, errors.New("unauthorized") + } + + return handler.helmAppService.HibernateApplication(r.Context(), appIdentifier, hibernateRequest) +} +func (handler *HelmAppRestHandlerImpl) UnHibernate(w http.ResponseWriter, r *http.Request) { + hibernateRequest, err := decodeHibernateRequest(r) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } - // RBAC enforcer applying - rbacObject, rbacObject2 := handler.enforcerUtil.GetHelmObjectByClusterIdNamespaceAndAppName(appIdentifier.ClusterId, appIdentifier.Namespace, appIdentifier.ReleaseName) - token := r.Header.Get("token") - ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject2) + vars := mux.Vars(r) + var appType int + appTypeString := vars["appType"] //to check the type of app currently handled the case for identifying of external app types + if appTypeString == "" { + appType = 1 + } else { + appType, err = strconv.Atoi(appTypeString) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + } + } + token := r.Header.Get("token") + var res []*openapi.HibernateStatus - if !ok { - common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) - return + if appType == bean2.ArgoAppType { + res, err = handler.handleArgoApplicationUnHibernate(r, token, hibernateRequest) + } else if appType == bean2.HelmAppType { + res, err = handler.handleHelmApplicationUnHibernate(r, token, hibernateRequest) + } else if appType == bean2.FluxAppType { + res, err = handler.handleFluxApplicationUnHibernate(r, token, hibernateRequest) } - //RBAC enforcer Ends - res, err := handler.helmAppService.UnHibernateApplication(r.Context(), appIdentifier, hibernateRequest) + //if k8s.IsClusterStringContainsFluxField(*hibernateRequest.AppId) { + // res, err = handler.handleFluxApplicationUnHibernate(r, token, hibernateRequest) + //} else { + // res, err = handler.handleHelmApplicationUnHibernate(r, token, hibernateRequest) + //} + if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, service2.GetStatusCode(err)) return } + common.WriteJsonResp(w, err, res, http.StatusOK) } +func (handler *HelmAppRestHandlerImpl) handleFluxApplicationUnHibernate(r *http.Request, token string, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { + appIdentifier, err := fluxApplication.DecodeFluxExternalAppId(*hibernateRequest.AppId) + if err != nil { + return nil, err + } + if !handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionUpdate, "*") { + return nil, errors.New("unauthorized") + } + return handler.fluxApplication.UnHibernateFluxApplication(r.Context(), appIdentifier, hibernateRequest) +} +func (handler *HelmAppRestHandlerImpl) handleArgoApplicationUnHibernate(r *http.Request, token string, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { + appIdentifier, err := argoApplication.DecodeExternalArgoAppId(*hibernateRequest.AppId) + if err != nil { + return nil, err + } + if !handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionUpdate, "*") { + return nil, errors.New("unauthorized") + } + return handler.argoApplication.UnHibernateArgoApplication(r.Context(), appIdentifier, hibernateRequest) +} + +func (handler *HelmAppRestHandlerImpl) handleHelmApplicationUnHibernate(r *http.Request, token string, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { + appIdentifier, err := handler.helmAppService.DecodeAppId(*hibernateRequest.AppId) + if err != nil { + return nil, err + } + + rbacObject, rbacObject2 := handler.enforcerUtil.GetHelmObjectByClusterIdNamespaceAndAppName( + appIdentifier.ClusterId, + appIdentifier.Namespace, + appIdentifier.ReleaseName, + ) + + ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject) || + handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject2) + if !ok { + return nil, errors.New("unauthorized") + } + + return handler.helmAppService.UnHibernateApplication(r.Context(), appIdentifier, hibernateRequest) +} + func (handler *HelmAppRestHandlerImpl) GetReleaseInfo(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) appId := vars["appId"] diff --git a/api/helm-app/HelmAppRouter.go b/api/helm-app/HelmAppRouter.go index c9bad97436..2451c4ad23 100644 --- a/api/helm-app/HelmAppRouter.go +++ b/api/helm-app/HelmAppRouter.go @@ -42,8 +42,8 @@ func (impl *HelmAppRouterImpl) InitAppListRouter(helmRouter *mux.Router) { helmRouter.Path("/app/save-telemetry").Queries("appId", "{appId}"). HandlerFunc(impl.helmAppRestHandler.SaveHelmAppDetailsViewedTelemetryData).Methods("GET") - helmRouter.Path("/hibernate").HandlerFunc(impl.helmAppRestHandler.Hibernate).Methods("POST") - helmRouter.Path("/unhibernate").HandlerFunc(impl.helmAppRestHandler.UnHibernate).Methods("POST") + helmRouter.Path("/hibernate").Queries("appType", "{appType}").HandlerFunc(impl.helmAppRestHandler.Hibernate).Methods("POST") + helmRouter.Path("/unhibernate").Queries("appType", "{appType}").HandlerFunc(impl.helmAppRestHandler.UnHibernate).Methods("POST") // GetReleaseInfo used only for external apps helmRouter.Path("/release-info").Queries("appId", "{appId}"). diff --git a/api/helm-app/gRPC/applicationClient.go b/api/helm-app/gRPC/applicationClient.go index 79fae27ecb..ae2efe2922 100644 --- a/api/helm-app/gRPC/applicationClient.go +++ b/api/helm-app/gRPC/applicationClient.go @@ -30,6 +30,7 @@ import ( type HelmAppClient interface { ListApplication(ctx context.Context, req *AppListRequest) (ApplicationService_ListApplicationsClient, error) + ListFluxApplication(ctx context.Context, req *AppListRequest) (ApplicationService_ListFluxApplicationsClient, error) GetAppDetail(ctx context.Context, in *AppDetailRequest) (*AppDetail, error) GetResourceTreeForExternalResources(ctx context.Context, in *ExternalResourceTreeRequest) (*ResourceTreeResponse, error) GetAppStatus(ctx context.Context, in *AppDetailRequest) (*AppStatus, error) @@ -50,6 +51,7 @@ type HelmAppClient interface { InstallReleaseWithCustomChart(ctx context.Context, in *HelmInstallCustomRequest) (*HelmInstallCustomResponse, error) GetNotes(ctx context.Context, request *InstallReleaseRequest) (*ChartNotesResponse, error) ValidateOCIRegistry(ctx context.Context, OCIRegistryRequest *RegistryCredential) (*OCIRegistryResponse, error) + GetExternalFluxAppDetail(ctx context.Context, in *FluxAppDetailRequest) (*FluxAppDetail, error) } type HelmAppClientImpl struct { @@ -368,3 +370,25 @@ func (impl *HelmAppClientImpl) ValidateOCIRegistry(ctx context.Context, in *Regi } return response, nil } +func (impl *HelmAppClientImpl) ListFluxApplication(ctx context.Context, req *AppListRequest) (ApplicationService_ListFluxApplicationsClient, error) { + applicationClient, err := impl.getApplicationClient() + if err != nil { + return nil, err + } + stream, err := applicationClient.ListFluxApplications(ctx, req) + if err != nil { + return nil, err + } + return stream, nil +} +func (impl *HelmAppClientImpl) GetExternalFluxAppDetail(ctx context.Context, in *FluxAppDetailRequest) (*FluxAppDetail, error) { + applicationClient, err := impl.getApplicationClient() + if err != nil { + return nil, err + } + detail, err := applicationClient.GetFluxAppDetail(ctx, in) + if err != nil { + return nil, err + } + return detail, nil +} diff --git a/api/helm-app/gRPC/applist.pb.go b/api/helm-app/gRPC/applist.pb.go index f3de42acc9..6f5d4b7ae4 100644 --- a/api/helm-app/gRPC/applist.pb.go +++ b/api/helm-app/gRPC/applist.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 +// protoc-gen-go v1.34.2 // protoc v3.9.1 // source: api/helm-app/gRPC/applist.proto @@ -354,6 +354,355 @@ func (x *ExternalResourceDetail) GetNamespace() string { return "" } +type FluxApplicationList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClusterId int32 `protobuf:"varint,1,opt,name=clusterId,proto3" json:"clusterId,omitempty"` + FluxApplication []*FluxApplication `protobuf:"bytes,2,rep,name=FluxApplication,proto3" json:"FluxApplication,omitempty"` + ErrorMsg string `protobuf:"bytes,3,opt,name=errorMsg,proto3" json:"errorMsg,omitempty"` + Errored bool `protobuf:"varint,4,opt,name=errored,proto3" json:"errored,omitempty"` +} + +func (x *FluxApplicationList) Reset() { + *x = FluxApplicationList{} + if protoimpl.UnsafeEnabled { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FluxApplicationList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FluxApplicationList) ProtoMessage() {} + +func (x *FluxApplicationList) ProtoReflect() protoreflect.Message { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FluxApplicationList.ProtoReflect.Descriptor instead. +func (*FluxApplicationList) Descriptor() ([]byte, []int) { + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{4} +} + +func (x *FluxApplicationList) GetClusterId() int32 { + if x != nil { + return x.ClusterId + } + return 0 +} + +func (x *FluxApplicationList) GetFluxApplication() []*FluxApplication { + if x != nil { + return x.FluxApplication + } + return nil +} + +func (x *FluxApplicationList) GetErrorMsg() string { + if x != nil { + return x.ErrorMsg + } + return "" +} + +func (x *FluxApplicationList) GetErrored() bool { + if x != nil { + return x.Errored + } + return false +} + +type FluxApplication struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + HealthStatus string `protobuf:"bytes,2,opt,name=healthStatus,proto3" json:"healthStatus,omitempty"` + SyncStatus string `protobuf:"bytes,3,opt,name=syncStatus,proto3" json:"syncStatus,omitempty"` + EnvironmentDetail *EnvironmentDetails `protobuf:"bytes,4,opt,name=environmentDetail,proto3" json:"environmentDetail,omitempty"` + FluxAppDeploymentType string `protobuf:"bytes,5,opt,name=fluxAppDeploymentType,proto3" json:"fluxAppDeploymentType,omitempty"` +} + +func (x *FluxApplication) Reset() { + *x = FluxApplication{} + if protoimpl.UnsafeEnabled { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FluxApplication) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FluxApplication) ProtoMessage() {} + +func (x *FluxApplication) ProtoReflect() protoreflect.Message { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FluxApplication.ProtoReflect.Descriptor instead. +func (*FluxApplication) Descriptor() ([]byte, []int) { + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{5} +} + +func (x *FluxApplication) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FluxApplication) GetHealthStatus() string { + if x != nil { + return x.HealthStatus + } + return "" +} + +func (x *FluxApplication) GetSyncStatus() string { + if x != nil { + return x.SyncStatus + } + return "" +} + +func (x *FluxApplication) GetEnvironmentDetail() *EnvironmentDetails { + if x != nil { + return x.EnvironmentDetail + } + return nil +} + +func (x *FluxApplication) GetFluxAppDeploymentType() string { + if x != nil { + return x.FluxAppDeploymentType + } + return "" +} + +// ---------------flux external app detail------- +type FluxAppDetailRequest 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"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + IsKustomizeApp bool `protobuf:"varint,4,opt,name=IsKustomizeApp,proto3" json:"IsKustomizeApp,omitempty"` +} + +func (x *FluxAppDetailRequest) Reset() { + *x = FluxAppDetailRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FluxAppDetailRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FluxAppDetailRequest) ProtoMessage() {} + +func (x *FluxAppDetailRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FluxAppDetailRequest.ProtoReflect.Descriptor instead. +func (*FluxAppDetailRequest) Descriptor() ([]byte, []int) { + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{6} +} + +func (x *FluxAppDetailRequest) GetClusterConfig() *ClusterConfig { + if x != nil { + return x.ClusterConfig + } + return nil +} + +func (x *FluxAppDetailRequest) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *FluxAppDetailRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FluxAppDetailRequest) GetIsKustomizeApp() bool { + if x != nil { + return x.IsKustomizeApp + } + return false +} + +type FluxAppDetail struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FluxApplication *FluxApplication `protobuf:"bytes,1,opt,name=fluxApplication,proto3" json:"fluxApplication,omitempty"` + FluxAppStatusDetail *FluxAppStatusDetail `protobuf:"bytes,2,opt,name=FluxAppStatusDetail,proto3" json:"FluxAppStatusDetail,omitempty"` + ResourceTreeResponse *ResourceTreeResponse `protobuf:"bytes,3,opt,name=resourceTreeResponse,proto3" json:"resourceTreeResponse,omitempty"` +} + +func (x *FluxAppDetail) Reset() { + *x = FluxAppDetail{} + if protoimpl.UnsafeEnabled { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FluxAppDetail) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FluxAppDetail) ProtoMessage() {} + +func (x *FluxAppDetail) ProtoReflect() protoreflect.Message { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[7] + 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 FluxAppDetail.ProtoReflect.Descriptor instead. +func (*FluxAppDetail) Descriptor() ([]byte, []int) { + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{7} +} + +func (x *FluxAppDetail) GetFluxApplication() *FluxApplication { + if x != nil { + return x.FluxApplication + } + return nil +} + +func (x *FluxAppDetail) GetFluxAppStatusDetail() *FluxAppStatusDetail { + if x != nil { + return x.FluxAppStatusDetail + } + return nil +} + +func (x *FluxAppDetail) GetResourceTreeResponse() *ResourceTreeResponse { + if x != nil { + return x.ResourceTreeResponse + } + return nil +} + +type FluxAppStatusDetail struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status string `protobuf:"bytes,1,opt,name=Status,proto3" json:"Status,omitempty"` + Reason string `protobuf:"bytes,2,opt,name=Reason,proto3" json:"Reason,omitempty"` + Message string `protobuf:"bytes,3,opt,name=Message,proto3" json:"Message,omitempty"` +} + +func (x *FluxAppStatusDetail) Reset() { + *x = FluxAppStatusDetail{} + if protoimpl.UnsafeEnabled { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FluxAppStatusDetail) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FluxAppStatusDetail) ProtoMessage() {} + +func (x *FluxAppStatusDetail) ProtoReflect() protoreflect.Message { + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[8] + 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 FluxAppStatusDetail.ProtoReflect.Descriptor instead. +func (*FluxAppStatusDetail) Descriptor() ([]byte, []int) { + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{8} +} + +func (x *FluxAppStatusDetail) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *FluxAppStatusDetail) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +func (x *FluxAppStatusDetail) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// ---------------flux external app detail ends here------- type DeployedAppList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -368,7 +717,7 @@ type DeployedAppList struct { func (x *DeployedAppList) Reset() { *x = DeployedAppList{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[4] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -381,7 +730,7 @@ func (x *DeployedAppList) String() string { func (*DeployedAppList) ProtoMessage() {} func (x *DeployedAppList) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[4] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -394,7 +743,7 @@ func (x *DeployedAppList) ProtoReflect() protoreflect.Message { // Deprecated: Use DeployedAppList.ProtoReflect.Descriptor instead. func (*DeployedAppList) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{4} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{9} } func (x *DeployedAppList) GetDeployedAppDetail() []*DeployedAppDetail { @@ -442,7 +791,7 @@ type DeployedAppDetail struct { func (x *DeployedAppDetail) Reset() { *x = DeployedAppDetail{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[5] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -455,7 +804,7 @@ func (x *DeployedAppDetail) String() string { func (*DeployedAppDetail) ProtoMessage() {} func (x *DeployedAppDetail) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[5] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -468,7 +817,7 @@ func (x *DeployedAppDetail) ProtoReflect() protoreflect.Message { // Deprecated: Use DeployedAppDetail.ProtoReflect.Descriptor instead. func (*DeployedAppDetail) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{5} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{10} } func (x *DeployedAppDetail) GetAppId() string { @@ -533,7 +882,7 @@ type EnvironmentDetails struct { func (x *EnvironmentDetails) Reset() { *x = EnvironmentDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[6] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -546,7 +895,7 @@ func (x *EnvironmentDetails) String() string { func (*EnvironmentDetails) ProtoMessage() {} func (x *EnvironmentDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[6] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -559,7 +908,7 @@ func (x *EnvironmentDetails) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvironmentDetails.ProtoReflect.Descriptor instead. func (*EnvironmentDetails) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{6} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{11} } func (x *EnvironmentDetails) GetClusterName() string { @@ -598,7 +947,7 @@ type AppDetailRequest struct { func (x *AppDetailRequest) Reset() { *x = AppDetailRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[7] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -611,7 +960,7 @@ func (x *AppDetailRequest) String() string { func (*AppDetailRequest) ProtoMessage() {} func (x *AppDetailRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[7] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -624,7 +973,7 @@ func (x *AppDetailRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AppDetailRequest.ProtoReflect.Descriptor instead. func (*AppDetailRequest) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{7} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{12} } func (x *AppDetailRequest) GetClusterConfig() *ClusterConfig { @@ -672,7 +1021,7 @@ type AppDetail struct { func (x *AppDetail) Reset() { *x = AppDetail{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[8] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -685,7 +1034,7 @@ func (x *AppDetail) String() string { func (*AppDetail) ProtoMessage() {} func (x *AppDetail) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[8] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -698,7 +1047,7 @@ func (x *AppDetail) ProtoReflect() protoreflect.Message { // Deprecated: Use AppDetail.ProtoReflect.Descriptor instead. func (*AppDetail) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{8} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{13} } func (x *AppDetail) GetApplicationStatus() string { @@ -764,7 +1113,7 @@ type AppStatus struct { func (x *AppStatus) Reset() { *x = AppStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[9] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -777,7 +1126,7 @@ func (x *AppStatus) String() string { func (*AppStatus) ProtoMessage() {} func (x *AppStatus) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[9] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -790,7 +1139,7 @@ func (x *AppStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use AppStatus.ProtoReflect.Descriptor instead. func (*AppStatus) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{9} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{14} } func (x *AppStatus) GetApplicationStatus() string { @@ -834,7 +1183,7 @@ type ReleaseStatus struct { func (x *ReleaseStatus) Reset() { *x = ReleaseStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[10] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -847,7 +1196,7 @@ func (x *ReleaseStatus) String() string { func (*ReleaseStatus) ProtoMessage() {} func (x *ReleaseStatus) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[10] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -860,7 +1209,7 @@ func (x *ReleaseStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ReleaseStatus.ProtoReflect.Descriptor instead. func (*ReleaseStatus) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{10} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{15} } func (x *ReleaseStatus) GetStatus() string { @@ -901,7 +1250,7 @@ type ChartMetadata struct { func (x *ChartMetadata) Reset() { *x = ChartMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[11] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -914,7 +1263,7 @@ func (x *ChartMetadata) String() string { func (*ChartMetadata) ProtoMessage() {} func (x *ChartMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[11] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -927,7 +1276,7 @@ func (x *ChartMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use ChartMetadata.ProtoReflect.Descriptor instead. func (*ChartMetadata) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{11} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{16} } func (x *ChartMetadata) GetChartName() string { @@ -984,7 +1333,7 @@ type ResourceTreeResponse struct { func (x *ResourceTreeResponse) Reset() { *x = ResourceTreeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[12] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -997,7 +1346,7 @@ func (x *ResourceTreeResponse) String() string { func (*ResourceTreeResponse) ProtoMessage() {} func (x *ResourceTreeResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[12] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1010,7 +1359,7 @@ func (x *ResourceTreeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceTreeResponse.ProtoReflect.Descriptor instead. func (*ResourceTreeResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{12} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{17} } func (x *ResourceTreeResponse) GetNodes() []*ResourceNode { @@ -1054,7 +1403,7 @@ type ResourceNode struct { func (x *ResourceNode) Reset() { *x = ResourceNode{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[13] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1067,7 +1416,7 @@ func (x *ResourceNode) String() string { func (*ResourceNode) ProtoMessage() {} func (x *ResourceNode) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[13] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1080,7 +1429,7 @@ func (x *ResourceNode) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceNode.ProtoReflect.Descriptor instead. func (*ResourceNode) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{13} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{18} } func (x *ResourceNode) GetGroup() string { @@ -1214,7 +1563,7 @@ type InfoItem struct { func (x *InfoItem) Reset() { *x = InfoItem{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[14] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1227,7 +1576,7 @@ func (x *InfoItem) String() string { func (*InfoItem) ProtoMessage() {} func (x *InfoItem) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[14] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1240,7 +1589,7 @@ func (x *InfoItem) ProtoReflect() protoreflect.Message { // Deprecated: Use InfoItem.ProtoReflect.Descriptor instead. func (*InfoItem) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{14} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{19} } func (x *InfoItem) GetName() string { @@ -1269,7 +1618,7 @@ type HealthStatus struct { func (x *HealthStatus) Reset() { *x = HealthStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[15] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1282,7 +1631,7 @@ func (x *HealthStatus) String() string { func (*HealthStatus) ProtoMessage() {} func (x *HealthStatus) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[15] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1295,7 +1644,7 @@ func (x *HealthStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthStatus.ProtoReflect.Descriptor instead. func (*HealthStatus) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{15} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{20} } func (x *HealthStatus) GetStatus() string { @@ -1323,7 +1672,7 @@ type ResourceNetworkingInfo struct { func (x *ResourceNetworkingInfo) Reset() { *x = ResourceNetworkingInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[16] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1336,7 +1685,7 @@ func (x *ResourceNetworkingInfo) String() string { func (*ResourceNetworkingInfo) ProtoMessage() {} func (x *ResourceNetworkingInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[16] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1349,7 +1698,7 @@ func (x *ResourceNetworkingInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceNetworkingInfo.ProtoReflect.Descriptor instead. func (*ResourceNetworkingInfo) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{16} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{21} } func (x *ResourceNetworkingInfo) GetLabels() map[string]string { @@ -1375,7 +1724,7 @@ type ResourceRef struct { func (x *ResourceRef) Reset() { *x = ResourceRef{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[17] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1388,7 +1737,7 @@ func (x *ResourceRef) String() string { func (*ResourceRef) ProtoMessage() {} func (x *ResourceRef) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[17] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1401,7 +1750,7 @@ func (x *ResourceRef) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceRef.ProtoReflect.Descriptor instead. func (*ResourceRef) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{17} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{22} } func (x *ResourceRef) GetGroup() string { @@ -1462,7 +1811,7 @@ type PodMetadata struct { func (x *PodMetadata) Reset() { *x = PodMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[18] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1475,7 +1824,7 @@ func (x *PodMetadata) String() string { func (*PodMetadata) ProtoMessage() {} func (x *PodMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[18] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1488,7 +1837,7 @@ func (x *PodMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use PodMetadata.ProtoReflect.Descriptor instead. func (*PodMetadata) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{18} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{23} } func (x *PodMetadata) GetName() string { @@ -1545,7 +1894,7 @@ type EphemeralContainerData struct { func (x *EphemeralContainerData) Reset() { *x = EphemeralContainerData{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[19] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1558,7 +1907,7 @@ func (x *EphemeralContainerData) String() string { func (*EphemeralContainerData) ProtoMessage() {} func (x *EphemeralContainerData) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[19] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1571,7 +1920,7 @@ func (x *EphemeralContainerData) ProtoReflect() protoreflect.Message { // Deprecated: Use EphemeralContainerData.ProtoReflect.Descriptor instead. func (*EphemeralContainerData) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{19} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{24} } func (x *EphemeralContainerData) GetName() string { @@ -1600,7 +1949,7 @@ type HibernateRequest struct { func (x *HibernateRequest) Reset() { *x = HibernateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[20] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1613,7 +1962,7 @@ func (x *HibernateRequest) String() string { func (*HibernateRequest) ProtoMessage() {} func (x *HibernateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[20] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1626,7 +1975,7 @@ func (x *HibernateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HibernateRequest.ProtoReflect.Descriptor instead. func (*HibernateRequest) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{20} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{25} } func (x *HibernateRequest) GetClusterConfig() *ClusterConfig { @@ -1658,7 +2007,7 @@ type ObjectIdentifier struct { func (x *ObjectIdentifier) Reset() { *x = ObjectIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[21] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1671,7 +2020,7 @@ func (x *ObjectIdentifier) String() string { func (*ObjectIdentifier) ProtoMessage() {} func (x *ObjectIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[21] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1684,7 +2033,7 @@ func (x *ObjectIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectIdentifier.ProtoReflect.Descriptor instead. func (*ObjectIdentifier) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{21} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{26} } func (x *ObjectIdentifier) GetGroup() string { @@ -1735,7 +2084,7 @@ type HibernateStatus struct { func (x *HibernateStatus) Reset() { *x = HibernateStatus{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[22] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1748,7 +2097,7 @@ func (x *HibernateStatus) String() string { func (*HibernateStatus) ProtoMessage() {} func (x *HibernateStatus) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[22] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1761,7 +2110,7 @@ func (x *HibernateStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use HibernateStatus.ProtoReflect.Descriptor instead. func (*HibernateStatus) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{22} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{27} } func (x *HibernateStatus) GetTargetObject() *ObjectIdentifier { @@ -1796,7 +2145,7 @@ type HibernateResponse struct { func (x *HibernateResponse) Reset() { *x = HibernateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[23] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1809,7 +2158,7 @@ func (x *HibernateResponse) String() string { func (*HibernateResponse) ProtoMessage() {} func (x *HibernateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[23] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1822,7 +2171,7 @@ func (x *HibernateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HibernateResponse.ProtoReflect.Descriptor instead. func (*HibernateResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{23} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{28} } func (x *HibernateResponse) GetStatus() []*HibernateStatus { @@ -1848,7 +2197,7 @@ type HelmAppDeploymentDetail struct { func (x *HelmAppDeploymentDetail) Reset() { *x = HelmAppDeploymentDetail{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[24] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1861,7 +2210,7 @@ func (x *HelmAppDeploymentDetail) String() string { func (*HelmAppDeploymentDetail) ProtoMessage() {} func (x *HelmAppDeploymentDetail) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[24] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1874,7 +2223,7 @@ func (x *HelmAppDeploymentDetail) ProtoReflect() protoreflect.Message { // Deprecated: Use HelmAppDeploymentDetail.ProtoReflect.Descriptor instead. func (*HelmAppDeploymentDetail) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{24} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{29} } func (x *HelmAppDeploymentDetail) GetChartMetadata() *ChartMetadata { @@ -1930,7 +2279,7 @@ type HelmAppDeploymentHistory struct { func (x *HelmAppDeploymentHistory) Reset() { *x = HelmAppDeploymentHistory{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[25] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1943,7 +2292,7 @@ func (x *HelmAppDeploymentHistory) String() string { func (*HelmAppDeploymentHistory) ProtoMessage() {} func (x *HelmAppDeploymentHistory) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[25] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1956,7 +2305,7 @@ func (x *HelmAppDeploymentHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use HelmAppDeploymentHistory.ProtoReflect.Descriptor instead. func (*HelmAppDeploymentHistory) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{25} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{30} } func (x *HelmAppDeploymentHistory) GetDeploymentHistory() []*HelmAppDeploymentDetail { @@ -1982,7 +2331,7 @@ type ReleaseInfo struct { func (x *ReleaseInfo) Reset() { *x = ReleaseInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[26] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1995,7 +2344,7 @@ func (x *ReleaseInfo) String() string { func (*ReleaseInfo) ProtoMessage() {} func (x *ReleaseInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[26] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2008,7 +2357,7 @@ func (x *ReleaseInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ReleaseInfo.ProtoReflect.Descriptor instead. func (*ReleaseInfo) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{26} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{31} } func (x *ReleaseInfo) GetDeployedAppDetail() *DeployedAppDetail { @@ -2067,7 +2416,7 @@ type ObjectRequest struct { func (x *ObjectRequest) Reset() { *x = ObjectRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[27] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2080,7 +2429,7 @@ func (x *ObjectRequest) String() string { func (*ObjectRequest) ProtoMessage() {} func (x *ObjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[27] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2093,7 +2442,7 @@ func (x *ObjectRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObjectRequest.ProtoReflect.Descriptor instead. func (*ObjectRequest) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{27} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{32} } func (x *ObjectRequest) GetClusterConfig() *ClusterConfig { @@ -2135,7 +2484,7 @@ type DesiredManifestResponse struct { func (x *DesiredManifestResponse) Reset() { *x = DesiredManifestResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[28] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2148,7 +2497,7 @@ func (x *DesiredManifestResponse) String() string { func (*DesiredManifestResponse) ProtoMessage() {} func (x *DesiredManifestResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[28] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2161,7 +2510,7 @@ func (x *DesiredManifestResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DesiredManifestResponse.ProtoReflect.Descriptor instead. func (*DesiredManifestResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{28} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{33} } func (x *DesiredManifestResponse) GetManifest() string { @@ -2182,7 +2531,7 @@ type UninstallReleaseResponse struct { func (x *UninstallReleaseResponse) Reset() { *x = UninstallReleaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[29] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2195,7 +2544,7 @@ func (x *UninstallReleaseResponse) String() string { func (*UninstallReleaseResponse) ProtoMessage() {} func (x *UninstallReleaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[29] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2208,7 +2557,7 @@ func (x *UninstallReleaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UninstallReleaseResponse.ProtoReflect.Descriptor instead. func (*UninstallReleaseResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{29} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{34} } func (x *UninstallReleaseResponse) GetSuccess() bool { @@ -2231,7 +2580,7 @@ type ReleaseIdentifier struct { func (x *ReleaseIdentifier) Reset() { *x = ReleaseIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[30] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2244,7 +2593,7 @@ func (x *ReleaseIdentifier) String() string { func (*ReleaseIdentifier) ProtoMessage() {} func (x *ReleaseIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[30] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2257,7 +2606,7 @@ func (x *ReleaseIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ReleaseIdentifier.ProtoReflect.Descriptor instead. func (*ReleaseIdentifier) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{30} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{35} } func (x *ReleaseIdentifier) GetClusterConfig() *ClusterConfig { @@ -2297,7 +2646,7 @@ type UpgradeReleaseRequest struct { func (x *UpgradeReleaseRequest) Reset() { *x = UpgradeReleaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[31] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2310,7 +2659,7 @@ func (x *UpgradeReleaseRequest) String() string { func (*UpgradeReleaseRequest) ProtoMessage() {} func (x *UpgradeReleaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[31] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2323,7 +2672,7 @@ func (x *UpgradeReleaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpgradeReleaseRequest.ProtoReflect.Descriptor instead. func (*UpgradeReleaseRequest) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{31} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{36} } func (x *UpgradeReleaseRequest) GetReleaseIdentifier() *ReleaseIdentifier { @@ -2379,7 +2728,7 @@ type UpgradeReleaseResponse struct { func (x *UpgradeReleaseResponse) Reset() { *x = UpgradeReleaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[32] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2392,7 +2741,7 @@ func (x *UpgradeReleaseResponse) String() string { func (*UpgradeReleaseResponse) ProtoMessage() {} func (x *UpgradeReleaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[32] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2405,7 +2754,7 @@ func (x *UpgradeReleaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpgradeReleaseResponse.ProtoReflect.Descriptor instead. func (*UpgradeReleaseResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{32} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{37} } func (x *UpgradeReleaseResponse) GetSuccess() bool { @@ -2427,7 +2776,7 @@ type DeploymentDetailRequest struct { func (x *DeploymentDetailRequest) Reset() { *x = DeploymentDetailRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[33] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2440,7 +2789,7 @@ func (x *DeploymentDetailRequest) String() string { func (*DeploymentDetailRequest) ProtoMessage() {} func (x *DeploymentDetailRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[33] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2453,7 +2802,7 @@ func (x *DeploymentDetailRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeploymentDetailRequest.ProtoReflect.Descriptor instead. func (*DeploymentDetailRequest) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{33} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{38} } func (x *DeploymentDetailRequest) GetReleaseIdentifier() *ReleaseIdentifier { @@ -2482,7 +2831,7 @@ type DeploymentDetailResponse struct { func (x *DeploymentDetailResponse) Reset() { *x = DeploymentDetailResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[34] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2495,7 +2844,7 @@ func (x *DeploymentDetailResponse) String() string { func (*DeploymentDetailResponse) ProtoMessage() {} func (x *DeploymentDetailResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[34] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2508,7 +2857,7 @@ func (x *DeploymentDetailResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeploymentDetailResponse.ProtoReflect.Descriptor instead. func (*DeploymentDetailResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{34} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{39} } func (x *DeploymentDetailResponse) GetManifest() string { @@ -2540,7 +2889,7 @@ type ChartRepository struct { func (x *ChartRepository) Reset() { *x = ChartRepository{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[35] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2553,7 +2902,7 @@ func (x *ChartRepository) String() string { func (*ChartRepository) ProtoMessage() {} func (x *ChartRepository) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[35] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2566,7 +2915,7 @@ func (x *ChartRepository) ProtoReflect() protoreflect.Message { // Deprecated: Use ChartRepository.ProtoReflect.Descriptor instead. func (*ChartRepository) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{35} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{40} } func (x *ChartRepository) GetName() string { @@ -2626,7 +2975,7 @@ type InstallReleaseRequest struct { func (x *InstallReleaseRequest) Reset() { *x = InstallReleaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[36] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2639,7 +2988,7 @@ func (x *InstallReleaseRequest) String() string { func (*InstallReleaseRequest) ProtoMessage() {} func (x *InstallReleaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[36] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2652,7 +3001,7 @@ func (x *InstallReleaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InstallReleaseRequest.ProtoReflect.Descriptor instead. func (*InstallReleaseRequest) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{36} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{41} } func (x *InstallReleaseRequest) GetReleaseIdentifier() *ReleaseIdentifier { @@ -2750,7 +3099,7 @@ type BulkInstallReleaseRequest struct { func (x *BulkInstallReleaseRequest) Reset() { *x = BulkInstallReleaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[37] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2763,7 +3112,7 @@ func (x *BulkInstallReleaseRequest) String() string { func (*BulkInstallReleaseRequest) ProtoMessage() {} func (x *BulkInstallReleaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[37] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2776,7 +3125,7 @@ func (x *BulkInstallReleaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkInstallReleaseRequest.ProtoReflect.Descriptor instead. func (*BulkInstallReleaseRequest) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{37} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{42} } func (x *BulkInstallReleaseRequest) GetBulkInstallReleaseRequest() []*InstallReleaseRequest { @@ -2797,7 +3146,7 @@ type InstallReleaseResponse struct { func (x *InstallReleaseResponse) Reset() { *x = InstallReleaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[38] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2810,7 +3159,7 @@ func (x *InstallReleaseResponse) String() string { func (*InstallReleaseResponse) ProtoMessage() {} func (x *InstallReleaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[38] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2823,7 +3172,7 @@ func (x *InstallReleaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InstallReleaseResponse.ProtoReflect.Descriptor instead. func (*InstallReleaseResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{38} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{43} } func (x *InstallReleaseResponse) GetSuccess() bool { @@ -2844,7 +3193,7 @@ type BooleanResponse struct { func (x *BooleanResponse) Reset() { *x = BooleanResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[39] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2857,7 +3206,7 @@ func (x *BooleanResponse) String() string { func (*BooleanResponse) ProtoMessage() {} func (x *BooleanResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[39] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2870,7 +3219,7 @@ func (x *BooleanResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BooleanResponse.ProtoReflect.Descriptor instead. func (*BooleanResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{39} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{44} } func (x *BooleanResponse) GetResult() bool { @@ -2892,7 +3241,7 @@ type RollbackReleaseRequest struct { func (x *RollbackReleaseRequest) Reset() { *x = RollbackReleaseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[40] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2905,7 +3254,7 @@ func (x *RollbackReleaseRequest) String() string { func (*RollbackReleaseRequest) ProtoMessage() {} func (x *RollbackReleaseRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[40] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2918,7 +3267,7 @@ func (x *RollbackReleaseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RollbackReleaseRequest.ProtoReflect.Descriptor instead. func (*RollbackReleaseRequest) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{40} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{45} } func (x *RollbackReleaseRequest) GetReleaseIdentifier() *ReleaseIdentifier { @@ -2947,7 +3296,7 @@ type TemplateChartResponse struct { func (x *TemplateChartResponse) Reset() { *x = TemplateChartResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[41] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2960,7 +3309,7 @@ func (x *TemplateChartResponse) String() string { func (*TemplateChartResponse) ProtoMessage() {} func (x *TemplateChartResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[41] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2973,7 +3322,7 @@ func (x *TemplateChartResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TemplateChartResponse.ProtoReflect.Descriptor instead. func (*TemplateChartResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{41} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{46} } func (x *TemplateChartResponse) GetGeneratedManifest() string { @@ -3001,7 +3350,7 @@ type BulkTemplateChartResponse struct { func (x *BulkTemplateChartResponse) Reset() { *x = BulkTemplateChartResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[42] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3014,7 +3363,7 @@ func (x *BulkTemplateChartResponse) String() string { func (*BulkTemplateChartResponse) ProtoMessage() {} func (x *BulkTemplateChartResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[42] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3027,7 +3376,7 @@ func (x *BulkTemplateChartResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BulkTemplateChartResponse.ProtoReflect.Descriptor instead. func (*BulkTemplateChartResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{42} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{47} } func (x *BulkTemplateChartResponse) GetBulkTemplateChartResponse() []*TemplateChartResponse { @@ -3052,7 +3401,7 @@ type HelmInstallCustomRequest struct { func (x *HelmInstallCustomRequest) Reset() { *x = HelmInstallCustomRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[43] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3065,7 +3414,7 @@ func (x *HelmInstallCustomRequest) String() string { func (*HelmInstallCustomRequest) ProtoMessage() {} func (x *HelmInstallCustomRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[43] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3078,7 +3427,7 @@ func (x *HelmInstallCustomRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HelmInstallCustomRequest.ProtoReflect.Descriptor instead. func (*HelmInstallCustomRequest) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{43} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{48} } func (x *HelmInstallCustomRequest) GetValuesYaml() string { @@ -3127,7 +3476,7 @@ type HelmInstallCustomResponse struct { func (x *HelmInstallCustomResponse) Reset() { *x = HelmInstallCustomResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[44] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3140,7 +3489,7 @@ func (x *HelmInstallCustomResponse) String() string { func (*HelmInstallCustomResponse) ProtoMessage() {} func (x *HelmInstallCustomResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[44] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3153,7 +3502,7 @@ func (x *HelmInstallCustomResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HelmInstallCustomResponse.ProtoReflect.Descriptor instead. func (*HelmInstallCustomResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{44} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{49} } func (x *HelmInstallCustomResponse) GetSuccess() bool { @@ -3174,7 +3523,7 @@ type ChartContent struct { func (x *ChartContent) Reset() { *x = ChartContent{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[45] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3187,7 +3536,7 @@ func (x *ChartContent) String() string { func (*ChartContent) ProtoMessage() {} func (x *ChartContent) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[45] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3200,7 +3549,7 @@ func (x *ChartContent) ProtoReflect() protoreflect.Message { // Deprecated: Use ChartContent.ProtoReflect.Descriptor instead. func (*ChartContent) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{45} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{50} } func (x *ChartContent) GetContent() []byte { @@ -3223,7 +3572,7 @@ type Gvk struct { func (x *Gvk) Reset() { *x = Gvk{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[46] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3236,7 +3585,7 @@ func (x *Gvk) String() string { func (*Gvk) ProtoMessage() {} func (x *Gvk) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[46] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3249,7 +3598,7 @@ func (x *Gvk) ProtoReflect() protoreflect.Message { // Deprecated: Use Gvk.ProtoReflect.Descriptor instead. func (*Gvk) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{46} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{51} } func (x *Gvk) GetGroup() string { @@ -3285,7 +3634,7 @@ type ResourceFilter struct { func (x *ResourceFilter) Reset() { *x = ResourceFilter{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[47] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3298,7 +3647,7 @@ func (x *ResourceFilter) String() string { func (*ResourceFilter) ProtoMessage() {} func (x *ResourceFilter) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[47] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3311,7 +3660,7 @@ func (x *ResourceFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceFilter.ProtoReflect.Descriptor instead. func (*ResourceFilter) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{47} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{52} } func (x *ResourceFilter) GetGvk() *Gvk { @@ -3339,7 +3688,7 @@ type ResourceIdentifier struct { func (x *ResourceIdentifier) Reset() { *x = ResourceIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[48] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3352,7 +3701,7 @@ func (x *ResourceIdentifier) String() string { func (*ResourceIdentifier) ProtoMessage() {} func (x *ResourceIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[48] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3365,7 +3714,7 @@ func (x *ResourceIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceIdentifier.ProtoReflect.Descriptor instead. func (*ResourceIdentifier) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{48} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{53} } func (x *ResourceIdentifier) GetLabels() map[string]string { @@ -3387,7 +3736,7 @@ type ResourceTreeFilter struct { func (x *ResourceTreeFilter) Reset() { *x = ResourceTreeFilter{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[49] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3400,7 +3749,7 @@ func (x *ResourceTreeFilter) String() string { func (*ResourceTreeFilter) ProtoMessage() {} func (x *ResourceTreeFilter) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[49] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3413,7 +3762,7 @@ func (x *ResourceTreeFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceTreeFilter.ProtoReflect.Descriptor instead. func (*ResourceTreeFilter) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{49} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{54} } func (x *ResourceTreeFilter) GetGlobalFilter() *ResourceIdentifier { @@ -3441,7 +3790,7 @@ type ChartNotesResponse struct { func (x *ChartNotesResponse) Reset() { *x = ChartNotesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[50] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3454,7 +3803,7 @@ func (x *ChartNotesResponse) String() string { func (*ChartNotesResponse) ProtoMessage() {} func (x *ChartNotesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[50] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3467,7 +3816,7 @@ func (x *ChartNotesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChartNotesResponse.ProtoReflect.Descriptor instead. func (*ChartNotesResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{50} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{55} } func (x *ChartNotesResponse) GetNotes() string { @@ -3500,7 +3849,7 @@ type RegistryCredential struct { func (x *RegistryCredential) Reset() { *x = RegistryCredential{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[51] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3513,7 +3862,7 @@ func (x *RegistryCredential) String() string { func (*RegistryCredential) ProtoMessage() {} func (x *RegistryCredential) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[51] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3526,7 +3875,7 @@ func (x *RegistryCredential) ProtoReflect() protoreflect.Message { // Deprecated: Use RegistryCredential.ProtoReflect.Descriptor instead. func (*RegistryCredential) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{51} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{56} } func (x *RegistryCredential) GetRegistryUrl() string { @@ -3633,7 +3982,7 @@ type RemoteConnectionConfig struct { func (x *RemoteConnectionConfig) Reset() { *x = RemoteConnectionConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[52] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3646,7 +3995,7 @@ func (x *RemoteConnectionConfig) String() string { func (*RemoteConnectionConfig) ProtoMessage() {} func (x *RemoteConnectionConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[52] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3659,7 +4008,7 @@ func (x *RemoteConnectionConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoteConnectionConfig.ProtoReflect.Descriptor instead. func (*RemoteConnectionConfig) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{52} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{57} } func (x *RemoteConnectionConfig) GetRemoteConnectionMethod() RemoteConnectionMethod { @@ -3694,7 +4043,7 @@ type ProxyConfig struct { func (x *ProxyConfig) Reset() { *x = ProxyConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[53] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3707,7 +4056,7 @@ func (x *ProxyConfig) String() string { func (*ProxyConfig) ProtoMessage() {} func (x *ProxyConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[53] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3720,7 +4069,7 @@ func (x *ProxyConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ProxyConfig.ProtoReflect.Descriptor instead. func (*ProxyConfig) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{53} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{58} } func (x *ProxyConfig) GetProxyUrl() string { @@ -3744,7 +4093,7 @@ type SSHTunnelConfig struct { func (x *SSHTunnelConfig) Reset() { *x = SSHTunnelConfig{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[54] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3757,7 +4106,7 @@ func (x *SSHTunnelConfig) String() string { func (*SSHTunnelConfig) ProtoMessage() {} func (x *SSHTunnelConfig) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[54] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3770,7 +4119,7 @@ func (x *SSHTunnelConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use SSHTunnelConfig.ProtoReflect.Descriptor instead. func (*SSHTunnelConfig) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{54} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{59} } func (x *SSHTunnelConfig) GetSSHServerAddress() string { @@ -3812,7 +4161,7 @@ type OCIRegistryResponse struct { func (x *OCIRegistryResponse) Reset() { *x = OCIRegistryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[55] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3825,7 +4174,7 @@ func (x *OCIRegistryResponse) String() string { func (*OCIRegistryResponse) ProtoMessage() {} func (x *OCIRegistryResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[55] + mi := &file_api_helm_app_gRPC_applist_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3838,7 +4187,7 @@ func (x *OCIRegistryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OCIRegistryResponse.ProtoReflect.Descriptor instead. func (*OCIRegistryResponse) Descriptor() ([]byte, []int) { - return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{55} + return file_api_helm_app_gRPC_applist_proto_rawDescGZIP(), []int{60} } func (x *OCIRegistryResponse) GetIsLoggedIn() bool { @@ -3895,626 +4244,689 @@ var file_api_helm_app_gRPC_applist_proto_rawDesc = []byte{ 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, 0xa7, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x11, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x11, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 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, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x65, 0x64, 0x22, 0xaa, 0x02, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, - 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 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, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, - 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x41, - 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x68, 0x61, - 0x72, 0x74, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x12, 0x41, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 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, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x3e, 0x0a, 0x0c, 0x4c, - 0x61, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x18, 0x06, 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, 0x4c, - 0x61, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x63, - 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x72, 0x0a, 0x12, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 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, 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, 0x12, 0x43, - 0x0a, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, - 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x22, 0x99, 0x03, 0x0a, 0x09, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 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, 0x06, 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, 0x07, 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, 0x49, 0x0a, 0x14, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x12, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x09, 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, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x22, - 0xc1, 0x01, 0x0a, 0x09, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, - 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xa5, 0x01, 0x0a, 0x13, 0x46, 0x6c, 0x75, + 0x78, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3a, + 0x0a, 0x0f, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x46, 0x6c, 0x75, 0x78, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x65, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x65, 0x64, + 0x22, 0xe2, 0x01, 0x0a, 0x0f, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, + 0x73, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x11, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x18, 0x04, 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, 0x11, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, + 0x34, 0x0a, 0x15, 0x66, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x66, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x14, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, + 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 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, 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, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x49, 0x73, 0x4b, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x49, 0x73, 0x4b, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x41, 0x70, 0x70, 0x22, 0xde, + 0x01, 0x0a, 0x0d, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x12, 0x3a, 0x0a, 0x0f, 0x66, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x46, 0x6c, 0x75, 0x78, + 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x66, 0x6c, 0x75, + 0x78, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x13, + 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x46, 0x6c, 0x75, 0x78, + 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, + 0x13, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x12, 0x49, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x5f, 0x0a, 0x13, 0x46, 0x6c, 0x75, 0x78, 0x41, 0x70, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0xa7, 0x01, 0x0a, 0x0f, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, + 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x52, 0x11, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x49, 0x64, 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, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x65, 0x64, 0x22, 0xaa, 0x02, 0x0a, 0x11, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x61, 0x70, 0x70, 0x49, 0x64, 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, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x72, 0x74, 0x41, 0x76, 0x61, 0x74, 0x61, 0x72, + 0x12, 0x41, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 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, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x12, 0x3e, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x65, 0x64, 0x18, 0x06, 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, 0x4c, 0x61, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x65, 0x64, 0x22, 0x63, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb7, 0x01, 0x0a, 0x0d, 0x43, 0x68, 0x61, - 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, - 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 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, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x63, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x68, 0x6f, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x74, - 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, - 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, - 0x2e, 0x0a, 0x0b, 0x70, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x0b, 0x70, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, - 0xa9, 0x04, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x66, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x66, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x25, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x73, 0x48, 0x69, - 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x69, 0x73, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, - 0x63, 0x61, 0x6e, 0x42, 0x65, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x61, 0x6e, 0x42, 0x65, 0x48, 0x69, 0x62, 0x65, - 0x72, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0d, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x49, 0x74, 0x65, 0x6d, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0f, 0x20, 0x03, 0x28, - 0x03, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x48, 0x6f, 0x6f, - 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x48, 0x6f, 0x6f, 0x6b, 0x12, - 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x34, 0x0a, 0x08, 0x49, - 0x6e, 0x66, 0x6f, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x40, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3b, - 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 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, 0x95, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xdc, - 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, - 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x73, 0x4e, 0x65, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x4e, - 0x65, 0x77, 0x12, 0x49, 0x0a, 0x13, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x13, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, - 0x72, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x4c, 0x0a, - 0x16, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x44, 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, + 0x79, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x72, 0x0a, 0x12, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x20, 0x0a, + 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x10, + 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 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, - 0x81, 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, + 0x43, 0x6f, 0x6e, 0x66, 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, 0x12, 0x43, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, + 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x54, 0x72, 0x65, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x99, 0x03, 0x0a, 0x09, + 0x41, 0x70, 0x70, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 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, 0x06, 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, 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, + 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, 0x07, + 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, 0x49, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, + 0x0a, 0x12, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x09, 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, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x09, 0x41, 0x70, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0c, 0x4c, + 0x61, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 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, 0x0c, 0x4c, + 0x61, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x64, 0x22, 0x63, 0x0a, 0x0d, 0x52, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xb7, 0x01, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 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, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x14, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x0b, 0x70, 0x6f, 0x64, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x50, + 0x6f, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x6f, 0x64, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xa9, 0x04, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, + 0x12, 0x2c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x66, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x73, 0x12, 0x3f, + 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x06, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x73, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x42, 0x65, 0x48, 0x69, 0x62, + 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, + 0x61, 0x6e, 0x42, 0x65, 0x48, 0x69, 0x62, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1d, + 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x49, + 0x6e, 0x66, 0x6f, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x03, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x69, 0x73, 0x48, 0x6f, 0x6f, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x69, 0x73, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x6f, 0x6b, 0x54, + 0x79, 0x70, 0x65, 0x22, 0x34, 0x0a, 0x08, 0x49, 0x6e, 0x66, 0x6f, 0x49, 0x74, 0x65, 0x6d, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x40, 0x0a, 0x0c, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x16, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, + 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3b, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 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, 0x95, + 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x12, 0x14, + 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x22, 0xdc, 0x01, 0x0a, 0x0b, 0x50, 0x6f, 0x64, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0e, + 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x12, 0x49, 0x0a, 0x13, 0x65, 0x70, + 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, + 0x72, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x13, 0x65, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x73, 0x22, 0x4c, 0x0a, 0x16, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, + 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x44, 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, 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, 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, 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, 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, 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, + 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, 0x81, 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, 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, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x43, 0x74, 0x78, 0x18, 0x04, + 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, 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, 0xeb, 0x03, 0x0a, 0x12, + 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, + 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, 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, 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, 0xd5, 0x01, 0x0a, 0x16, 0x52, 0x65, + 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, 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, 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, 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, + 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, 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, 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, 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, + 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, - 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, 0x35, 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, 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, 0xe7, 0x0b, 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, 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, + 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, 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, 0x35, 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, 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, 0xe7, 0x0c, 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, 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, + 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, 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, 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, + 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, 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, 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, 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, 0x42, 0x31, 0x5a, 0x2f, 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, 0x67, 0x52, 0x50, 0x43, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 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, 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, 0x42, 0x31, 0x5a, 0x2f, 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, 0x67, 0x52, 0x50, 0x43, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4530,173 +4942,188 @@ func file_api_helm_app_gRPC_applist_proto_rawDescGZIP() []byte { } var file_api_helm_app_gRPC_applist_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_api_helm_app_gRPC_applist_proto_msgTypes = make([]protoimpl.MessageInfo, 58) -var file_api_helm_app_gRPC_applist_proto_goTypes = []interface{}{ +var file_api_helm_app_gRPC_applist_proto_msgTypes = make([]protoimpl.MessageInfo, 63) +var file_api_helm_app_gRPC_applist_proto_goTypes = []any{ (RemoteConnectionMethod)(0), // 0: RemoteConnectionMethod (*ClusterConfig)(nil), // 1: ClusterConfig (*AppListRequest)(nil), // 2: AppListRequest (*ExternalResourceTreeRequest)(nil), // 3: ExternalResourceTreeRequest (*ExternalResourceDetail)(nil), // 4: ExternalResourceDetail - (*DeployedAppList)(nil), // 5: DeployedAppList - (*DeployedAppDetail)(nil), // 6: DeployedAppDetail - (*EnvironmentDetails)(nil), // 7: EnvironmentDetails - (*AppDetailRequest)(nil), // 8: AppDetailRequest - (*AppDetail)(nil), // 9: AppDetail - (*AppStatus)(nil), // 10: AppStatus - (*ReleaseStatus)(nil), // 11: ReleaseStatus - (*ChartMetadata)(nil), // 12: ChartMetadata - (*ResourceTreeResponse)(nil), // 13: ResourceTreeResponse - (*ResourceNode)(nil), // 14: ResourceNode - (*InfoItem)(nil), // 15: InfoItem - (*HealthStatus)(nil), // 16: HealthStatus - (*ResourceNetworkingInfo)(nil), // 17: ResourceNetworkingInfo - (*ResourceRef)(nil), // 18: ResourceRef - (*PodMetadata)(nil), // 19: PodMetadata - (*EphemeralContainerData)(nil), // 20: EphemeralContainerData - (*HibernateRequest)(nil), // 21: HibernateRequest - (*ObjectIdentifier)(nil), // 22: ObjectIdentifier - (*HibernateStatus)(nil), // 23: HibernateStatus - (*HibernateResponse)(nil), // 24: HibernateResponse - (*HelmAppDeploymentDetail)(nil), // 25: HelmAppDeploymentDetail - (*HelmAppDeploymentHistory)(nil), // 26: HelmAppDeploymentHistory - (*ReleaseInfo)(nil), // 27: ReleaseInfo - (*ObjectRequest)(nil), // 28: ObjectRequest - (*DesiredManifestResponse)(nil), // 29: DesiredManifestResponse - (*UninstallReleaseResponse)(nil), // 30: UninstallReleaseResponse - (*ReleaseIdentifier)(nil), // 31: ReleaseIdentifier - (*UpgradeReleaseRequest)(nil), // 32: UpgradeReleaseRequest - (*UpgradeReleaseResponse)(nil), // 33: UpgradeReleaseResponse - (*DeploymentDetailRequest)(nil), // 34: DeploymentDetailRequest - (*DeploymentDetailResponse)(nil), // 35: DeploymentDetailResponse - (*ChartRepository)(nil), // 36: ChartRepository - (*InstallReleaseRequest)(nil), // 37: InstallReleaseRequest - (*BulkInstallReleaseRequest)(nil), // 38: BulkInstallReleaseRequest - (*InstallReleaseResponse)(nil), // 39: InstallReleaseResponse - (*BooleanResponse)(nil), // 40: BooleanResponse - (*RollbackReleaseRequest)(nil), // 41: RollbackReleaseRequest - (*TemplateChartResponse)(nil), // 42: TemplateChartResponse - (*BulkTemplateChartResponse)(nil), // 43: BulkTemplateChartResponse - (*HelmInstallCustomRequest)(nil), // 44: HelmInstallCustomRequest - (*HelmInstallCustomResponse)(nil), // 45: HelmInstallCustomResponse - (*ChartContent)(nil), // 46: ChartContent - (*Gvk)(nil), // 47: Gvk - (*ResourceFilter)(nil), // 48: ResourceFilter - (*ResourceIdentifier)(nil), // 49: ResourceIdentifier - (*ResourceTreeFilter)(nil), // 50: ResourceTreeFilter - (*ChartNotesResponse)(nil), // 51: ChartNotesResponse - (*RegistryCredential)(nil), // 52: RegistryCredential - (*RemoteConnectionConfig)(nil), // 53: RemoteConnectionConfig - (*ProxyConfig)(nil), // 54: ProxyConfig - (*SSHTunnelConfig)(nil), // 55: SSHTunnelConfig - (*OCIRegistryResponse)(nil), // 56: OCIRegistryResponse - nil, // 57: ResourceNetworkingInfo.LabelsEntry - nil, // 58: ResourceIdentifier.LabelsEntry - (*timestamp.Timestamp)(nil), // 59: google.protobuf.Timestamp + (*FluxApplicationList)(nil), // 5: FluxApplicationList + (*FluxApplication)(nil), // 6: FluxApplication + (*FluxAppDetailRequest)(nil), // 7: FluxAppDetailRequest + (*FluxAppDetail)(nil), // 8: FluxAppDetail + (*FluxAppStatusDetail)(nil), // 9: FluxAppStatusDetail + (*DeployedAppList)(nil), // 10: DeployedAppList + (*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 + (*HelmInstallCustomRequest)(nil), // 49: HelmInstallCustomRequest + (*HelmInstallCustomResponse)(nil), // 50: HelmInstallCustomResponse + (*ChartContent)(nil), // 51: ChartContent + (*Gvk)(nil), // 52: Gvk + (*ResourceFilter)(nil), // 53: ResourceFilter + (*ResourceIdentifier)(nil), // 54: ResourceIdentifier + (*ResourceTreeFilter)(nil), // 55: ResourceTreeFilter + (*ChartNotesResponse)(nil), // 56: ChartNotesResponse + (*RegistryCredential)(nil), // 57: RegistryCredential + (*RemoteConnectionConfig)(nil), // 58: RemoteConnectionConfig + (*ProxyConfig)(nil), // 59: ProxyConfig + (*SSHTunnelConfig)(nil), // 60: SSHTunnelConfig + (*OCIRegistryResponse)(nil), // 61: OCIRegistryResponse + nil, // 62: ResourceNetworkingInfo.LabelsEntry + nil, // 63: ResourceIdentifier.LabelsEntry + (*timestamp.Timestamp)(nil), // 64: google.protobuf.Timestamp } var file_api_helm_app_gRPC_applist_proto_depIdxs = []int32{ 1, // 0: AppListRequest.clusters:type_name -> ClusterConfig 1, // 1: ExternalResourceTreeRequest.clusterConfig:type_name -> ClusterConfig 4, // 2: ExternalResourceTreeRequest.externalResourceDetail:type_name -> ExternalResourceDetail - 6, // 3: DeployedAppList.DeployedAppDetail:type_name -> DeployedAppDetail - 7, // 4: DeployedAppDetail.environmentDetail:type_name -> EnvironmentDetails - 59, // 5: DeployedAppDetail.LastDeployed:type_name -> google.protobuf.Timestamp - 1, // 6: AppDetailRequest.clusterConfig:type_name -> ClusterConfig - 50, // 7: AppDetailRequest.resourceTreeFilter:type_name -> ResourceTreeFilter - 11, // 8: AppDetail.releaseStatus:type_name -> ReleaseStatus - 59, // 9: AppDetail.lastDeployed:type_name -> google.protobuf.Timestamp - 12, // 10: AppDetail.chartMetadata:type_name -> ChartMetadata - 13, // 11: AppDetail.resourceTreeResponse:type_name -> ResourceTreeResponse - 7, // 12: AppDetail.environmentDetails:type_name -> EnvironmentDetails - 59, // 13: AppStatus.LastDeployed:type_name -> google.protobuf.Timestamp - 14, // 14: ResourceTreeResponse.nodes:type_name -> ResourceNode - 19, // 15: ResourceTreeResponse.podMetadata:type_name -> PodMetadata - 18, // 16: ResourceNode.parentRefs:type_name -> ResourceRef - 17, // 17: ResourceNode.networkingInfo:type_name -> ResourceNetworkingInfo - 16, // 18: ResourceNode.health:type_name -> HealthStatus - 15, // 19: ResourceNode.info:type_name -> InfoItem - 57, // 20: ResourceNetworkingInfo.labels:type_name -> ResourceNetworkingInfo.LabelsEntry - 20, // 21: PodMetadata.ephemeralContainers:type_name -> EphemeralContainerData - 1, // 22: HibernateRequest.clusterConfig:type_name -> ClusterConfig - 22, // 23: HibernateRequest.objectIdentifier:type_name -> ObjectIdentifier - 22, // 24: HibernateStatus.targetObject:type_name -> ObjectIdentifier - 23, // 25: HibernateResponse.status:type_name -> HibernateStatus - 12, // 26: HelmAppDeploymentDetail.chartMetadata:type_name -> ChartMetadata - 59, // 27: HelmAppDeploymentDetail.deployedAt:type_name -> google.protobuf.Timestamp - 25, // 28: HelmAppDeploymentHistory.deploymentHistory:type_name -> HelmAppDeploymentDetail - 6, // 29: ReleaseInfo.deployedAppDetail:type_name -> DeployedAppDetail - 1, // 30: ObjectRequest.clusterConfig:type_name -> ClusterConfig - 22, // 31: ObjectRequest.objectIdentifier:type_name -> ObjectIdentifier - 1, // 32: ReleaseIdentifier.clusterConfig:type_name -> ClusterConfig - 31, // 33: UpgradeReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 46, // 34: UpgradeReleaseRequest.chartContent:type_name -> ChartContent - 31, // 35: DeploymentDetailRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 31, // 36: InstallReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 36, // 37: InstallReleaseRequest.chartRepository:type_name -> ChartRepository - 52, // 38: InstallReleaseRequest.RegistryCredential:type_name -> RegistryCredential - 46, // 39: InstallReleaseRequest.chartContent:type_name -> ChartContent - 37, // 40: BulkInstallReleaseRequest.BulkInstallReleaseRequest:type_name -> InstallReleaseRequest - 31, // 41: RollbackReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 42, // 42: BulkTemplateChartResponse.BulkTemplateChartResponse:type_name -> TemplateChartResponse - 46, // 43: HelmInstallCustomRequest.chartContent:type_name -> ChartContent - 31, // 44: HelmInstallCustomRequest.releaseIdentifier:type_name -> ReleaseIdentifier - 47, // 45: ResourceFilter.gvk:type_name -> Gvk - 49, // 46: ResourceFilter.resourceIdentifier:type_name -> ResourceIdentifier - 58, // 47: ResourceIdentifier.labels:type_name -> ResourceIdentifier.LabelsEntry - 49, // 48: ResourceTreeFilter.globalFilter:type_name -> ResourceIdentifier - 48, // 49: ResourceTreeFilter.resourceFilters:type_name -> ResourceFilter - 53, // 50: RegistryCredential.RemoteConnectionConfig:type_name -> RemoteConnectionConfig - 0, // 51: RemoteConnectionConfig.RemoteConnectionMethod:type_name -> RemoteConnectionMethod - 54, // 52: RemoteConnectionConfig.ProxyConfig:type_name -> ProxyConfig - 55, // 53: RemoteConnectionConfig.SSHTunnelConfig:type_name -> SSHTunnelConfig - 2, // 54: ApplicationService.ListApplications:input_type -> AppListRequest - 8, // 55: ApplicationService.GetAppDetail:input_type -> AppDetailRequest - 8, // 56: ApplicationService.GetAppStatus:input_type -> AppDetailRequest - 21, // 57: ApplicationService.Hibernate:input_type -> HibernateRequest - 21, // 58: ApplicationService.UnHibernate:input_type -> HibernateRequest - 8, // 59: ApplicationService.GetDeploymentHistory:input_type -> AppDetailRequest - 8, // 60: ApplicationService.GetValuesYaml:input_type -> AppDetailRequest - 28, // 61: ApplicationService.GetDesiredManifest:input_type -> ObjectRequest - 31, // 62: ApplicationService.UninstallRelease:input_type -> ReleaseIdentifier - 32, // 63: ApplicationService.UpgradeRelease:input_type -> UpgradeReleaseRequest - 34, // 64: ApplicationService.GetDeploymentDetail:input_type -> DeploymentDetailRequest - 37, // 65: ApplicationService.InstallRelease:input_type -> InstallReleaseRequest - 37, // 66: ApplicationService.UpgradeReleaseWithChartInfo:input_type -> InstallReleaseRequest - 31, // 67: ApplicationService.IsReleaseInstalled:input_type -> ReleaseIdentifier - 41, // 68: ApplicationService.RollbackRelease:input_type -> RollbackReleaseRequest - 37, // 69: ApplicationService.TemplateChart:input_type -> InstallReleaseRequest - 38, // 70: ApplicationService.TemplateChartBulk:input_type -> BulkInstallReleaseRequest - 44, // 71: ApplicationService.InstallReleaseWithCustomChart:input_type -> HelmInstallCustomRequest - 37, // 72: ApplicationService.GetNotes:input_type -> InstallReleaseRequest - 32, // 73: ApplicationService.UpgradeReleaseWithCustomChart:input_type -> UpgradeReleaseRequest - 52, // 74: ApplicationService.ValidateOCIRegistry:input_type -> RegistryCredential - 3, // 75: ApplicationService.GetResourceTreeForExternalResources:input_type -> ExternalResourceTreeRequest - 5, // 76: ApplicationService.ListApplications:output_type -> DeployedAppList - 9, // 77: ApplicationService.GetAppDetail:output_type -> AppDetail - 10, // 78: ApplicationService.GetAppStatus:output_type -> AppStatus - 24, // 79: ApplicationService.Hibernate:output_type -> HibernateResponse - 24, // 80: ApplicationService.UnHibernate:output_type -> HibernateResponse - 26, // 81: ApplicationService.GetDeploymentHistory:output_type -> HelmAppDeploymentHistory - 27, // 82: ApplicationService.GetValuesYaml:output_type -> ReleaseInfo - 29, // 83: ApplicationService.GetDesiredManifest:output_type -> DesiredManifestResponse - 30, // 84: ApplicationService.UninstallRelease:output_type -> UninstallReleaseResponse - 33, // 85: ApplicationService.UpgradeRelease:output_type -> UpgradeReleaseResponse - 35, // 86: ApplicationService.GetDeploymentDetail:output_type -> DeploymentDetailResponse - 39, // 87: ApplicationService.InstallRelease:output_type -> InstallReleaseResponse - 33, // 88: ApplicationService.UpgradeReleaseWithChartInfo:output_type -> UpgradeReleaseResponse - 40, // 89: ApplicationService.IsReleaseInstalled:output_type -> BooleanResponse - 40, // 90: ApplicationService.RollbackRelease:output_type -> BooleanResponse - 42, // 91: ApplicationService.TemplateChart:output_type -> TemplateChartResponse - 43, // 92: ApplicationService.TemplateChartBulk:output_type -> BulkTemplateChartResponse - 45, // 93: ApplicationService.InstallReleaseWithCustomChart:output_type -> HelmInstallCustomResponse - 51, // 94: ApplicationService.GetNotes:output_type -> ChartNotesResponse - 33, // 95: ApplicationService.UpgradeReleaseWithCustomChart:output_type -> UpgradeReleaseResponse - 56, // 96: ApplicationService.ValidateOCIRegistry:output_type -> OCIRegistryResponse - 13, // 97: ApplicationService.GetResourceTreeForExternalResources:output_type -> ResourceTreeResponse - 76, // [76:98] is the sub-list for method output_type - 54, // [54:76] is the sub-list for method input_type - 54, // [54:54] is the sub-list for extension type_name - 54, // [54:54] is the sub-list for extension extendee - 0, // [0:54] is the sub-list for field type_name + 6, // 3: FluxApplicationList.FluxApplication:type_name -> FluxApplication + 12, // 4: FluxApplication.environmentDetail:type_name -> EnvironmentDetails + 1, // 5: FluxAppDetailRequest.clusterConfig:type_name -> ClusterConfig + 6, // 6: FluxAppDetail.fluxApplication:type_name -> FluxApplication + 9, // 7: FluxAppDetail.FluxAppStatusDetail:type_name -> FluxAppStatusDetail + 18, // 8: FluxAppDetail.resourceTreeResponse:type_name -> ResourceTreeResponse + 11, // 9: DeployedAppList.DeployedAppDetail:type_name -> DeployedAppDetail + 12, // 10: DeployedAppDetail.environmentDetail:type_name -> EnvironmentDetails + 64, // 11: DeployedAppDetail.LastDeployed:type_name -> google.protobuf.Timestamp + 1, // 12: AppDetailRequest.clusterConfig:type_name -> ClusterConfig + 55, // 13: AppDetailRequest.resourceTreeFilter:type_name -> ResourceTreeFilter + 16, // 14: AppDetail.releaseStatus:type_name -> ReleaseStatus + 64, // 15: AppDetail.lastDeployed:type_name -> google.protobuf.Timestamp + 17, // 16: AppDetail.chartMetadata:type_name -> ChartMetadata + 18, // 17: AppDetail.resourceTreeResponse:type_name -> ResourceTreeResponse + 12, // 18: AppDetail.environmentDetails:type_name -> EnvironmentDetails + 64, // 19: AppStatus.LastDeployed:type_name -> google.protobuf.Timestamp + 19, // 20: ResourceTreeResponse.nodes:type_name -> ResourceNode + 24, // 21: ResourceTreeResponse.podMetadata:type_name -> PodMetadata + 23, // 22: ResourceNode.parentRefs:type_name -> ResourceRef + 22, // 23: ResourceNode.networkingInfo:type_name -> ResourceNetworkingInfo + 21, // 24: ResourceNode.health:type_name -> HealthStatus + 20, // 25: ResourceNode.info:type_name -> InfoItem + 62, // 26: ResourceNetworkingInfo.labels:type_name -> ResourceNetworkingInfo.LabelsEntry + 25, // 27: PodMetadata.ephemeralContainers:type_name -> EphemeralContainerData + 1, // 28: HibernateRequest.clusterConfig:type_name -> ClusterConfig + 27, // 29: HibernateRequest.objectIdentifier:type_name -> ObjectIdentifier + 27, // 30: HibernateStatus.targetObject:type_name -> ObjectIdentifier + 28, // 31: HibernateResponse.status:type_name -> HibernateStatus + 17, // 32: HelmAppDeploymentDetail.chartMetadata:type_name -> ChartMetadata + 64, // 33: HelmAppDeploymentDetail.deployedAt:type_name -> google.protobuf.Timestamp + 30, // 34: HelmAppDeploymentHistory.deploymentHistory:type_name -> HelmAppDeploymentDetail + 11, // 35: ReleaseInfo.deployedAppDetail:type_name -> DeployedAppDetail + 1, // 36: ObjectRequest.clusterConfig:type_name -> ClusterConfig + 27, // 37: ObjectRequest.objectIdentifier:type_name -> ObjectIdentifier + 1, // 38: ReleaseIdentifier.clusterConfig:type_name -> ClusterConfig + 36, // 39: UpgradeReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 51, // 40: UpgradeReleaseRequest.chartContent:type_name -> ChartContent + 36, // 41: DeploymentDetailRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 36, // 42: InstallReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 41, // 43: InstallReleaseRequest.chartRepository:type_name -> ChartRepository + 57, // 44: InstallReleaseRequest.RegistryCredential:type_name -> RegistryCredential + 51, // 45: InstallReleaseRequest.chartContent:type_name -> ChartContent + 42, // 46: BulkInstallReleaseRequest.BulkInstallReleaseRequest:type_name -> InstallReleaseRequest + 36, // 47: RollbackReleaseRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 47, // 48: BulkTemplateChartResponse.BulkTemplateChartResponse:type_name -> TemplateChartResponse + 51, // 49: HelmInstallCustomRequest.chartContent:type_name -> ChartContent + 36, // 50: HelmInstallCustomRequest.releaseIdentifier:type_name -> ReleaseIdentifier + 52, // 51: ResourceFilter.gvk:type_name -> Gvk + 54, // 52: ResourceFilter.resourceIdentifier:type_name -> ResourceIdentifier + 63, // 53: ResourceIdentifier.labels:type_name -> ResourceIdentifier.LabelsEntry + 54, // 54: ResourceTreeFilter.globalFilter:type_name -> ResourceIdentifier + 53, // 55: ResourceTreeFilter.resourceFilters:type_name -> ResourceFilter + 58, // 56: RegistryCredential.RemoteConnectionConfig:type_name -> RemoteConnectionConfig + 0, // 57: RemoteConnectionConfig.RemoteConnectionMethod:type_name -> RemoteConnectionMethod + 59, // 58: RemoteConnectionConfig.ProxyConfig:type_name -> ProxyConfig + 60, // 59: RemoteConnectionConfig.SSHTunnelConfig:type_name -> SSHTunnelConfig + 2, // 60: ApplicationService.ListApplications:input_type -> AppListRequest + 2, // 61: ApplicationService.ListFluxApplications:input_type -> AppListRequest + 13, // 62: ApplicationService.GetAppDetail:input_type -> AppDetailRequest + 13, // 63: ApplicationService.GetAppStatus:input_type -> AppDetailRequest + 26, // 64: ApplicationService.Hibernate:input_type -> HibernateRequest + 26, // 65: ApplicationService.UnHibernate:input_type -> HibernateRequest + 13, // 66: ApplicationService.GetDeploymentHistory:input_type -> AppDetailRequest + 13, // 67: ApplicationService.GetValuesYaml:input_type -> AppDetailRequest + 33, // 68: ApplicationService.GetDesiredManifest:input_type -> ObjectRequest + 36, // 69: ApplicationService.UninstallRelease:input_type -> ReleaseIdentifier + 37, // 70: ApplicationService.UpgradeRelease:input_type -> UpgradeReleaseRequest + 39, // 71: ApplicationService.GetDeploymentDetail:input_type -> DeploymentDetailRequest + 42, // 72: ApplicationService.InstallRelease:input_type -> InstallReleaseRequest + 42, // 73: ApplicationService.UpgradeReleaseWithChartInfo:input_type -> InstallReleaseRequest + 36, // 74: ApplicationService.IsReleaseInstalled:input_type -> ReleaseIdentifier + 46, // 75: ApplicationService.RollbackRelease:input_type -> RollbackReleaseRequest + 42, // 76: ApplicationService.TemplateChart:input_type -> InstallReleaseRequest + 43, // 77: ApplicationService.TemplateChartBulk:input_type -> BulkInstallReleaseRequest + 49, // 78: ApplicationService.InstallReleaseWithCustomChart:input_type -> HelmInstallCustomRequest + 42, // 79: ApplicationService.GetNotes:input_type -> InstallReleaseRequest + 37, // 80: ApplicationService.UpgradeReleaseWithCustomChart:input_type -> UpgradeReleaseRequest + 57, // 81: ApplicationService.ValidateOCIRegistry:input_type -> RegistryCredential + 3, // 82: ApplicationService.GetResourceTreeForExternalResources:input_type -> ExternalResourceTreeRequest + 7, // 83: ApplicationService.GetFluxAppDetail:input_type -> FluxAppDetailRequest + 10, // 84: ApplicationService.ListApplications:output_type -> DeployedAppList + 5, // 85: ApplicationService.ListFluxApplications:output_type -> FluxApplicationList + 14, // 86: ApplicationService.GetAppDetail:output_type -> AppDetail + 15, // 87: ApplicationService.GetAppStatus:output_type -> AppStatus + 29, // 88: ApplicationService.Hibernate:output_type -> HibernateResponse + 29, // 89: ApplicationService.UnHibernate:output_type -> HibernateResponse + 31, // 90: ApplicationService.GetDeploymentHistory:output_type -> HelmAppDeploymentHistory + 32, // 91: ApplicationService.GetValuesYaml:output_type -> ReleaseInfo + 34, // 92: ApplicationService.GetDesiredManifest:output_type -> DesiredManifestResponse + 35, // 93: ApplicationService.UninstallRelease:output_type -> UninstallReleaseResponse + 38, // 94: ApplicationService.UpgradeRelease:output_type -> UpgradeReleaseResponse + 40, // 95: ApplicationService.GetDeploymentDetail:output_type -> DeploymentDetailResponse + 44, // 96: ApplicationService.InstallRelease:output_type -> InstallReleaseResponse + 38, // 97: ApplicationService.UpgradeReleaseWithChartInfo:output_type -> UpgradeReleaseResponse + 45, // 98: ApplicationService.IsReleaseInstalled:output_type -> BooleanResponse + 45, // 99: ApplicationService.RollbackRelease:output_type -> BooleanResponse + 47, // 100: ApplicationService.TemplateChart:output_type -> TemplateChartResponse + 48, // 101: ApplicationService.TemplateChartBulk:output_type -> BulkTemplateChartResponse + 50, // 102: ApplicationService.InstallReleaseWithCustomChart:output_type -> HelmInstallCustomResponse + 56, // 103: ApplicationService.GetNotes:output_type -> ChartNotesResponse + 38, // 104: ApplicationService.UpgradeReleaseWithCustomChart:output_type -> UpgradeReleaseResponse + 61, // 105: ApplicationService.ValidateOCIRegistry:output_type -> OCIRegistryResponse + 18, // 106: ApplicationService.GetResourceTreeForExternalResources:output_type -> ResourceTreeResponse + 8, // 107: ApplicationService.GetFluxAppDetail:output_type -> FluxAppDetail + 84, // [84:108] is the sub-list for method output_type + 60, // [60:84] is the sub-list for method input_type + 60, // [60:60] is the sub-list for extension type_name + 60, // [60:60] is the sub-list for extension extendee + 0, // [0:60] is the sub-list for field type_name } func init() { file_api_helm_app_gRPC_applist_proto_init() } @@ -4705,7 +5132,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_api_helm_app_gRPC_applist_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*ClusterConfig); i { case 0: return &v.state @@ -4717,7 +5144,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*AppListRequest); i { case 0: return &v.state @@ -4729,7 +5156,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*ExternalResourceTreeRequest); i { case 0: return &v.state @@ -4741,7 +5168,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*ExternalResourceDetail); i { case 0: return &v.state @@ -4753,7 +5180,67 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*FluxApplicationList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_helm_app_gRPC_applist_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*FluxApplication); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_helm_app_gRPC_applist_proto_msgTypes[6].Exporter = func(v any, i int) any { + switch v := v.(*FluxAppDetailRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_helm_app_gRPC_applist_proto_msgTypes[7].Exporter = func(v any, i int) any { + switch v := v.(*FluxAppDetail); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_helm_app_gRPC_applist_proto_msgTypes[8].Exporter = func(v any, i int) any { + switch v := v.(*FluxAppStatusDetail); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_helm_app_gRPC_applist_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*DeployedAppList); i { case 0: return &v.state @@ -4765,7 +5252,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*DeployedAppDetail); i { case 0: return &v.state @@ -4777,7 +5264,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[11].Exporter = func(v any, i int) any { switch v := v.(*EnvironmentDetails); i { case 0: return &v.state @@ -4789,7 +5276,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[12].Exporter = func(v any, i int) any { switch v := v.(*AppDetailRequest); i { case 0: return &v.state @@ -4801,7 +5288,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[13].Exporter = func(v any, i int) any { switch v := v.(*AppDetail); i { case 0: return &v.state @@ -4813,7 +5300,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[14].Exporter = func(v any, i int) any { switch v := v.(*AppStatus); i { case 0: return &v.state @@ -4825,7 +5312,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[15].Exporter = func(v any, i int) any { switch v := v.(*ReleaseStatus); i { case 0: return &v.state @@ -4837,7 +5324,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[16].Exporter = func(v any, i int) any { switch v := v.(*ChartMetadata); i { case 0: return &v.state @@ -4849,7 +5336,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*ResourceTreeResponse); i { case 0: return &v.state @@ -4861,7 +5348,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[18].Exporter = func(v any, i int) any { switch v := v.(*ResourceNode); i { case 0: return &v.state @@ -4873,7 +5360,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[19].Exporter = func(v any, i int) any { switch v := v.(*InfoItem); i { case 0: return &v.state @@ -4885,7 +5372,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[20].Exporter = func(v any, i int) any { switch v := v.(*HealthStatus); i { case 0: return &v.state @@ -4897,7 +5384,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[21].Exporter = func(v any, i int) any { switch v := v.(*ResourceNetworkingInfo); i { case 0: return &v.state @@ -4909,7 +5396,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[22].Exporter = func(v any, i int) any { switch v := v.(*ResourceRef); i { case 0: return &v.state @@ -4921,7 +5408,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[23].Exporter = func(v any, i int) any { switch v := v.(*PodMetadata); i { case 0: return &v.state @@ -4933,7 +5420,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[24].Exporter = func(v any, i int) any { switch v := v.(*EphemeralContainerData); i { case 0: return &v.state @@ -4945,7 +5432,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[25].Exporter = func(v any, i int) any { switch v := v.(*HibernateRequest); i { case 0: return &v.state @@ -4957,7 +5444,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[26].Exporter = func(v any, i int) any { switch v := v.(*ObjectIdentifier); i { case 0: return &v.state @@ -4969,7 +5456,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[27].Exporter = func(v any, i int) any { switch v := v.(*HibernateStatus); i { case 0: return &v.state @@ -4981,7 +5468,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[28].Exporter = func(v any, i int) any { switch v := v.(*HibernateResponse); i { case 0: return &v.state @@ -4993,7 +5480,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[29].Exporter = func(v any, i int) any { switch v := v.(*HelmAppDeploymentDetail); i { case 0: return &v.state @@ -5005,7 +5492,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[30].Exporter = func(v any, i int) any { switch v := v.(*HelmAppDeploymentHistory); i { case 0: return &v.state @@ -5017,7 +5504,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[31].Exporter = func(v any, i int) any { switch v := v.(*ReleaseInfo); i { case 0: return &v.state @@ -5029,7 +5516,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[32].Exporter = func(v any, i int) any { switch v := v.(*ObjectRequest); i { case 0: return &v.state @@ -5041,7 +5528,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[33].Exporter = func(v any, i int) any { switch v := v.(*DesiredManifestResponse); i { case 0: return &v.state @@ -5053,7 +5540,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[34].Exporter = func(v any, i int) any { switch v := v.(*UninstallReleaseResponse); i { case 0: return &v.state @@ -5065,7 +5552,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[35].Exporter = func(v any, i int) any { switch v := v.(*ReleaseIdentifier); i { case 0: return &v.state @@ -5077,7 +5564,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[36].Exporter = func(v any, i int) any { switch v := v.(*UpgradeReleaseRequest); i { case 0: return &v.state @@ -5089,7 +5576,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[37].Exporter = func(v any, i int) any { switch v := v.(*UpgradeReleaseResponse); i { case 0: return &v.state @@ -5101,7 +5588,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[38].Exporter = func(v any, i int) any { switch v := v.(*DeploymentDetailRequest); i { case 0: return &v.state @@ -5113,7 +5600,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[39].Exporter = func(v any, i int) any { switch v := v.(*DeploymentDetailResponse); i { case 0: return &v.state @@ -5125,7 +5612,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[40].Exporter = func(v any, i int) any { switch v := v.(*ChartRepository); i { case 0: return &v.state @@ -5137,7 +5624,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[41].Exporter = func(v any, i int) any { switch v := v.(*InstallReleaseRequest); i { case 0: return &v.state @@ -5149,7 +5636,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[42].Exporter = func(v any, i int) any { switch v := v.(*BulkInstallReleaseRequest); i { case 0: return &v.state @@ -5161,7 +5648,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[43].Exporter = func(v any, i int) any { switch v := v.(*InstallReleaseResponse); i { case 0: return &v.state @@ -5173,7 +5660,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[44].Exporter = func(v any, i int) any { switch v := v.(*BooleanResponse); i { case 0: return &v.state @@ -5185,7 +5672,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[45].Exporter = func(v any, i int) any { switch v := v.(*RollbackReleaseRequest); i { case 0: return &v.state @@ -5197,7 +5684,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[46].Exporter = func(v any, i int) any { switch v := v.(*TemplateChartResponse); i { case 0: return &v.state @@ -5209,7 +5696,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[47].Exporter = func(v any, i int) any { switch v := v.(*BulkTemplateChartResponse); i { case 0: return &v.state @@ -5221,7 +5708,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[48].Exporter = func(v any, i int) any { switch v := v.(*HelmInstallCustomRequest); i { case 0: return &v.state @@ -5233,7 +5720,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[49].Exporter = func(v any, i int) any { switch v := v.(*HelmInstallCustomResponse); i { case 0: return &v.state @@ -5245,7 +5732,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[50].Exporter = func(v any, i int) any { switch v := v.(*ChartContent); i { case 0: return &v.state @@ -5257,7 +5744,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[51].Exporter = func(v any, i int) any { switch v := v.(*Gvk); i { case 0: return &v.state @@ -5269,7 +5756,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[52].Exporter = func(v any, i int) any { switch v := v.(*ResourceFilter); i { case 0: return &v.state @@ -5281,7 +5768,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[53].Exporter = func(v any, i int) any { switch v := v.(*ResourceIdentifier); i { case 0: return &v.state @@ -5293,7 +5780,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[54].Exporter = func(v any, i int) any { switch v := v.(*ResourceTreeFilter); i { case 0: return &v.state @@ -5305,7 +5792,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[55].Exporter = func(v any, i int) any { switch v := v.(*ChartNotesResponse); i { case 0: return &v.state @@ -5317,7 +5804,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[56].Exporter = func(v any, i int) any { switch v := v.(*RegistryCredential); i { case 0: return &v.state @@ -5329,7 +5816,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[57].Exporter = func(v any, i int) any { switch v := v.(*RemoteConnectionConfig); i { case 0: return &v.state @@ -5341,7 +5828,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[58].Exporter = func(v any, i int) any { switch v := v.(*ProxyConfig); i { case 0: return &v.state @@ -5353,7 +5840,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[59].Exporter = func(v any, i int) any { switch v := v.(*SSHTunnelConfig); i { case 0: return &v.state @@ -5365,7 +5852,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { return nil } } - file_api_helm_app_gRPC_applist_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_api_helm_app_gRPC_applist_proto_msgTypes[60].Exporter = func(v any, i int) any { switch v := v.(*OCIRegistryResponse); i { case 0: return &v.state @@ -5384,7 +5871,7 @@ func file_api_helm_app_gRPC_applist_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_helm_app_gRPC_applist_proto_rawDesc, NumEnums: 1, - NumMessages: 58, + NumMessages: 63, NumExtensions: 0, NumServices: 1, }, diff --git a/api/helm-app/gRPC/applist.proto b/api/helm-app/gRPC/applist.proto index 4450b2b50b..4d36fd07e5 100644 --- a/api/helm-app/gRPC/applist.proto +++ b/api/helm-app/gRPC/applist.proto @@ -21,6 +21,7 @@ message AppListRequest { service ApplicationService { rpc ListApplications(AppListRequest) returns (stream DeployedAppList){} + rpc ListFluxApplications(AppListRequest) returns (stream FluxApplicationList){} rpc GetAppDetail(AppDetailRequest) returns (AppDetail){} rpc GetAppStatus(AppDetailRequest) returns (AppStatus){} rpc Hibernate(HibernateRequest) returns (HibernateResponse){} @@ -42,6 +43,8 @@ service ApplicationService { rpc UpgradeReleaseWithCustomChart(UpgradeReleaseRequest) returns(UpgradeReleaseResponse){} rpc ValidateOCIRegistry(RegistryCredential) returns(OCIRegistryResponse) {} rpc GetResourceTreeForExternalResources(ExternalResourceTreeRequest) returns(ResourceTreeResponse){} + rpc GetFluxAppDetail(FluxAppDetailRequest)returns(FluxAppDetail){} + } message ExternalResourceTreeRequest{ @@ -56,8 +59,39 @@ message ExternalResourceDetail { string name = 4; string namespace = 5; } +message FluxApplicationList { + int32 clusterId = 1; + repeated FluxApplication FluxApplication =2; + string errorMsg = 3; + bool errored = 4; +} +message FluxApplication{ + string name=1; + string healthStatus=2; + string syncStatus=3; + EnvironmentDetails environmentDetail = 4; + string fluxAppDeploymentType=5; +} +//---------------flux external app detail------- +message FluxAppDetailRequest{ + ClusterConfig clusterConfig = 1; + string namespace = 2; + string name = 3; + bool IsKustomizeApp =4; +} +message FluxAppDetail{ + FluxApplication fluxApplication=1; + FluxAppStatusDetail FluxAppStatusDetail = 2; + ResourceTreeResponse resourceTreeResponse =3; +} +message FluxAppStatusDetail{ + string Status = 1; + string Reason = 2; + string Message = 3; +} +//---------------flux external app detail ends here------- message DeployedAppList { repeated DeployedAppDetail DeployedAppDetail = 1; int32 clusterId = 2; diff --git a/api/helm-app/gRPC/applist_grpc.pb.go b/api/helm-app/gRPC/applist_grpc.pb.go index 296d5ee15d..3c8416b9ae 100644 --- a/api/helm-app/gRPC/applist_grpc.pb.go +++ b/api/helm-app/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.3.0 +// - protoc-gen-go-grpc v1.2.0 // - protoc v3.9.1 // source: api/helm-app/gRPC/applist.proto @@ -18,36 +18,12 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - ApplicationService_ListApplications_FullMethodName = "/ApplicationService/ListApplications" - 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_InstallReleaseWithCustomChart_FullMethodName = "/ApplicationService/InstallReleaseWithCustomChart" - ApplicationService_GetNotes_FullMethodName = "/ApplicationService/GetNotes" - ApplicationService_UpgradeReleaseWithCustomChart_FullMethodName = "/ApplicationService/UpgradeReleaseWithCustomChart" - ApplicationService_ValidateOCIRegistry_FullMethodName = "/ApplicationService/ValidateOCIRegistry" - ApplicationService_GetResourceTreeForExternalResources_FullMethodName = "/ApplicationService/GetResourceTreeForExternalResources" -) - // 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) 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) @@ -69,6 +45,7 @@ type ApplicationServiceClient interface { UpgradeReleaseWithCustomChart(ctx context.Context, in *UpgradeReleaseRequest, opts ...grpc.CallOption) (*UpgradeReleaseResponse, error) ValidateOCIRegistry(ctx context.Context, in *RegistryCredential, opts ...grpc.CallOption) (*OCIRegistryResponse, error) GetResourceTreeForExternalResources(ctx context.Context, in *ExternalResourceTreeRequest, opts ...grpc.CallOption) (*ResourceTreeResponse, error) + GetFluxAppDetail(ctx context.Context, in *FluxAppDetailRequest, opts ...grpc.CallOption) (*FluxAppDetail, error) } type applicationServiceClient struct { @@ -80,7 +57,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_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &ApplicationService_ServiceDesc.Streams[0], "/ApplicationService/ListApplications", opts...) if err != nil { return nil, err } @@ -111,9 +88,41 @@ func (x *applicationServiceListApplicationsClient) Recv() (*DeployedAppList, err return m, nil } +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...) + if err != nil { + return nil, err + } + x := &applicationServiceListFluxApplicationsClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ApplicationService_ListFluxApplicationsClient interface { + Recv() (*FluxApplicationList, error) + grpc.ClientStream +} + +type applicationServiceListFluxApplicationsClient struct { + grpc.ClientStream +} + +func (x *applicationServiceListFluxApplicationsClient) Recv() (*FluxApplicationList, error) { + m := new(FluxApplicationList) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, 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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/GetAppDetail", in, out, opts...) if err != nil { return nil, err } @@ -122,7 +131,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/GetAppStatus", in, out, opts...) if err != nil { return nil, err } @@ -131,7 +140,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/Hibernate", in, out, opts...) if err != nil { return nil, err } @@ -140,7 +149,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/UnHibernate", in, out, opts...) if err != nil { return nil, err } @@ -149,7 +158,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/GetDeploymentHistory", in, out, opts...) if err != nil { return nil, err } @@ -158,7 +167,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/GetValuesYaml", in, out, opts...) if err != nil { return nil, err } @@ -167,7 +176,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/GetDesiredManifest", in, out, opts...) if err != nil { return nil, err } @@ -176,7 +185,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/UninstallRelease", in, out, opts...) if err != nil { return nil, err } @@ -185,7 +194,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/UpgradeRelease", in, out, opts...) if err != nil { return nil, err } @@ -194,7 +203,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/GetDeploymentDetail", in, out, opts...) if err != nil { return nil, err } @@ -203,7 +212,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/InstallRelease", in, out, opts...) if err != nil { return nil, err } @@ -212,7 +221,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/UpgradeReleaseWithChartInfo", in, out, opts...) if err != nil { return nil, err } @@ -221,7 +230,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/IsReleaseInstalled", in, out, opts...) if err != nil { return nil, err } @@ -230,7 +239,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/RollbackRelease", in, out, opts...) if err != nil { return nil, err } @@ -239,7 +248,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/TemplateChart", in, out, opts...) if err != nil { return nil, err } @@ -248,7 +257,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/TemplateChartBulk", in, out, opts...) if err != nil { return nil, err } @@ -257,7 +266,7 @@ func (c *applicationServiceClient) TemplateChartBulk(ctx context.Context, in *Bu func (c *applicationServiceClient) InstallReleaseWithCustomChart(ctx context.Context, in *HelmInstallCustomRequest, opts ...grpc.CallOption) (*HelmInstallCustomResponse, error) { out := new(HelmInstallCustomResponse) - err := c.cc.Invoke(ctx, ApplicationService_InstallReleaseWithCustomChart_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/InstallReleaseWithCustomChart", in, out, opts...) if err != nil { return nil, err } @@ -266,7 +275,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/GetNotes", in, out, opts...) if err != nil { return nil, err } @@ -275,7 +284,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/UpgradeReleaseWithCustomChart", in, out, opts...) if err != nil { return nil, err } @@ -284,7 +293,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_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/ValidateOCIRegistry", in, out, opts...) if err != nil { return nil, err } @@ -293,7 +302,16 @@ func (c *applicationServiceClient) ValidateOCIRegistry(ctx context.Context, in * func (c *applicationServiceClient) GetResourceTreeForExternalResources(ctx context.Context, in *ExternalResourceTreeRequest, opts ...grpc.CallOption) (*ResourceTreeResponse, error) { out := new(ResourceTreeResponse) - err := c.cc.Invoke(ctx, ApplicationService_GetResourceTreeForExternalResources_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ApplicationService/GetResourceTreeForExternalResources", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +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...) if err != nil { return nil, err } @@ -305,6 +323,7 @@ func (c *applicationServiceClient) GetResourceTreeForExternalResources(ctx conte // for forward compatibility type ApplicationServiceServer interface { ListApplications(*AppListRequest, ApplicationService_ListApplicationsServer) error + ListFluxApplications(*AppListRequest, ApplicationService_ListFluxApplicationsServer) error GetAppDetail(context.Context, *AppDetailRequest) (*AppDetail, error) GetAppStatus(context.Context, *AppDetailRequest) (*AppStatus, error) Hibernate(context.Context, *HibernateRequest) (*HibernateResponse, error) @@ -326,6 +345,7 @@ type ApplicationServiceServer interface { UpgradeReleaseWithCustomChart(context.Context, *UpgradeReleaseRequest) (*UpgradeReleaseResponse, error) ValidateOCIRegistry(context.Context, *RegistryCredential) (*OCIRegistryResponse, error) GetResourceTreeForExternalResources(context.Context, *ExternalResourceTreeRequest) (*ResourceTreeResponse, error) + GetFluxAppDetail(context.Context, *FluxAppDetailRequest) (*FluxAppDetail, error) mustEmbedUnimplementedApplicationServiceServer() } @@ -336,6 +356,9 @@ type UnimplementedApplicationServiceServer struct { func (UnimplementedApplicationServiceServer) ListApplications(*AppListRequest, ApplicationService_ListApplicationsServer) error { return status.Errorf(codes.Unimplemented, "method ListApplications not implemented") } +func (UnimplementedApplicationServiceServer) ListFluxApplications(*AppListRequest, ApplicationService_ListFluxApplicationsServer) error { + return status.Errorf(codes.Unimplemented, "method ListFluxApplications not implemented") +} func (UnimplementedApplicationServiceServer) GetAppDetail(context.Context, *AppDetailRequest) (*AppDetail, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAppDetail not implemented") } @@ -399,6 +422,9 @@ func (UnimplementedApplicationServiceServer) ValidateOCIRegistry(context.Context func (UnimplementedApplicationServiceServer) GetResourceTreeForExternalResources(context.Context, *ExternalResourceTreeRequest) (*ResourceTreeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetResourceTreeForExternalResources not implemented") } +func (UnimplementedApplicationServiceServer) GetFluxAppDetail(context.Context, *FluxAppDetailRequest) (*FluxAppDetail, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFluxAppDetail not implemented") +} func (UnimplementedApplicationServiceServer) mustEmbedUnimplementedApplicationServiceServer() {} // UnsafeApplicationServiceServer may be embedded to opt out of forward compatibility for this service. @@ -433,6 +459,27 @@ func (x *applicationServiceListApplicationsServer) Send(m *DeployedAppList) erro return x.ServerStream.SendMsg(m) } +func _ApplicationService_ListFluxApplications_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(AppListRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ApplicationServiceServer).ListFluxApplications(m, &applicationServiceListFluxApplicationsServer{stream}) +} + +type ApplicationService_ListFluxApplicationsServer interface { + Send(*FluxApplicationList) error + grpc.ServerStream +} + +type applicationServiceListFluxApplicationsServer struct { + grpc.ServerStream +} + +func (x *applicationServiceListFluxApplicationsServer) Send(m *FluxApplicationList) error { + return x.ServerStream.SendMsg(m) +} + 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 { @@ -443,7 +490,7 @@ func _ApplicationService_GetAppDetail_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_GetAppDetail_FullMethodName, + FullMethod: "/ApplicationService/GetAppDetail", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetAppDetail(ctx, req.(*AppDetailRequest)) @@ -461,7 +508,7 @@ func _ApplicationService_GetAppStatus_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_GetAppStatus_FullMethodName, + FullMethod: "/ApplicationService/GetAppStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetAppStatus(ctx, req.(*AppDetailRequest)) @@ -479,7 +526,7 @@ func _ApplicationService_Hibernate_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_Hibernate_FullMethodName, + FullMethod: "/ApplicationService/Hibernate", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).Hibernate(ctx, req.(*HibernateRequest)) @@ -497,7 +544,7 @@ func _ApplicationService_UnHibernate_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_UnHibernate_FullMethodName, + FullMethod: "/ApplicationService/UnHibernate", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UnHibernate(ctx, req.(*HibernateRequest)) @@ -515,7 +562,7 @@ func _ApplicationService_GetDeploymentHistory_Handler(srv interface{}, ctx conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_GetDeploymentHistory_FullMethodName, + FullMethod: "/ApplicationService/GetDeploymentHistory", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetDeploymentHistory(ctx, req.(*AppDetailRequest)) @@ -533,7 +580,7 @@ func _ApplicationService_GetValuesYaml_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_GetValuesYaml_FullMethodName, + FullMethod: "/ApplicationService/GetValuesYaml", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetValuesYaml(ctx, req.(*AppDetailRequest)) @@ -551,7 +598,7 @@ func _ApplicationService_GetDesiredManifest_Handler(srv interface{}, ctx context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_GetDesiredManifest_FullMethodName, + FullMethod: "/ApplicationService/GetDesiredManifest", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetDesiredManifest(ctx, req.(*ObjectRequest)) @@ -569,7 +616,7 @@ func _ApplicationService_UninstallRelease_Handler(srv interface{}, ctx context.C } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_UninstallRelease_FullMethodName, + FullMethod: "/ApplicationService/UninstallRelease", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UninstallRelease(ctx, req.(*ReleaseIdentifier)) @@ -587,7 +634,7 @@ func _ApplicationService_UpgradeRelease_Handler(srv interface{}, ctx context.Con } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_UpgradeRelease_FullMethodName, + FullMethod: "/ApplicationService/UpgradeRelease", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UpgradeRelease(ctx, req.(*UpgradeReleaseRequest)) @@ -605,7 +652,7 @@ func _ApplicationService_GetDeploymentDetail_Handler(srv interface{}, ctx contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_GetDeploymentDetail_FullMethodName, + FullMethod: "/ApplicationService/GetDeploymentDetail", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetDeploymentDetail(ctx, req.(*DeploymentDetailRequest)) @@ -623,7 +670,7 @@ func _ApplicationService_InstallRelease_Handler(srv interface{}, ctx context.Con } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_InstallRelease_FullMethodName, + FullMethod: "/ApplicationService/InstallRelease", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).InstallRelease(ctx, req.(*InstallReleaseRequest)) @@ -641,7 +688,7 @@ func _ApplicationService_UpgradeReleaseWithChartInfo_Handler(srv interface{}, ct } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_UpgradeReleaseWithChartInfo_FullMethodName, + FullMethod: "/ApplicationService/UpgradeReleaseWithChartInfo", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UpgradeReleaseWithChartInfo(ctx, req.(*InstallReleaseRequest)) @@ -659,7 +706,7 @@ func _ApplicationService_IsReleaseInstalled_Handler(srv interface{}, ctx context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_IsReleaseInstalled_FullMethodName, + FullMethod: "/ApplicationService/IsReleaseInstalled", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).IsReleaseInstalled(ctx, req.(*ReleaseIdentifier)) @@ -677,7 +724,7 @@ func _ApplicationService_RollbackRelease_Handler(srv interface{}, ctx context.Co } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_RollbackRelease_FullMethodName, + FullMethod: "/ApplicationService/RollbackRelease", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).RollbackRelease(ctx, req.(*RollbackReleaseRequest)) @@ -695,7 +742,7 @@ func _ApplicationService_TemplateChart_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_TemplateChart_FullMethodName, + FullMethod: "/ApplicationService/TemplateChart", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).TemplateChart(ctx, req.(*InstallReleaseRequest)) @@ -713,7 +760,7 @@ func _ApplicationService_TemplateChartBulk_Handler(srv interface{}, ctx context. } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_TemplateChartBulk_FullMethodName, + FullMethod: "/ApplicationService/TemplateChartBulk", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).TemplateChartBulk(ctx, req.(*BulkInstallReleaseRequest)) @@ -731,7 +778,7 @@ func _ApplicationService_InstallReleaseWithCustomChart_Handler(srv interface{}, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_InstallReleaseWithCustomChart_FullMethodName, + FullMethod: "/ApplicationService/InstallReleaseWithCustomChart", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).InstallReleaseWithCustomChart(ctx, req.(*HelmInstallCustomRequest)) @@ -749,7 +796,7 @@ func _ApplicationService_GetNotes_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_GetNotes_FullMethodName, + FullMethod: "/ApplicationService/GetNotes", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetNotes(ctx, req.(*InstallReleaseRequest)) @@ -767,7 +814,7 @@ func _ApplicationService_UpgradeReleaseWithCustomChart_Handler(srv interface{}, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_UpgradeReleaseWithCustomChart_FullMethodName, + FullMethod: "/ApplicationService/UpgradeReleaseWithCustomChart", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).UpgradeReleaseWithCustomChart(ctx, req.(*UpgradeReleaseRequest)) @@ -785,7 +832,7 @@ func _ApplicationService_ValidateOCIRegistry_Handler(srv interface{}, ctx contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_ValidateOCIRegistry_FullMethodName, + FullMethod: "/ApplicationService/ValidateOCIRegistry", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).ValidateOCIRegistry(ctx, req.(*RegistryCredential)) @@ -803,7 +850,7 @@ func _ApplicationService_GetResourceTreeForExternalResources_Handler(srv interfa } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ApplicationService_GetResourceTreeForExternalResources_FullMethodName, + FullMethod: "/ApplicationService/GetResourceTreeForExternalResources", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApplicationServiceServer).GetResourceTreeForExternalResources(ctx, req.(*ExternalResourceTreeRequest)) @@ -811,6 +858,24 @@ func _ApplicationService_GetResourceTreeForExternalResources_Handler(srv interfa return interceptor(ctx, in, info, handler) } +func _ApplicationService_GetFluxAppDetail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FluxAppDetailRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApplicationServiceServer).GetFluxAppDetail(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ApplicationService/GetFluxAppDetail", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApplicationServiceServer).GetFluxAppDetail(ctx, req.(*FluxAppDetailRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ApplicationService_ServiceDesc is the grpc.ServiceDesc for ApplicationService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -902,6 +967,10 @@ var ApplicationService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetResourceTreeForExternalResources", Handler: _ApplicationService_GetResourceTreeForExternalResources_Handler, }, + { + MethodName: "GetFluxAppDetail", + Handler: _ApplicationService_GetFluxAppDetail_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -909,6 +978,11 @@ var ApplicationService_ServiceDesc = grpc.ServiceDesc{ Handler: _ApplicationService_ListApplications_Handler, ServerStreams: true, }, + { + StreamName: "ListFluxApplications", + Handler: _ApplicationService_ListFluxApplications_Handler, + ServerStreams: true, + }, }, Metadata: "api/helm-app/gRPC/applist.proto", } diff --git a/api/helm-app/service/HelmAppService.go b/api/helm-app/service/HelmAppService.go index de353fe30b..b9a7afdf66 100644 --- a/api/helm-app/service/HelmAppService.go +++ b/api/helm-app/service/HelmAppService.go @@ -192,15 +192,18 @@ func (impl *HelmAppServiceImpl) ListHelmApplications(ctx context.Context, cluste func (impl *HelmAppServiceImpl) HibernateApplication(ctx context.Context, app *helmBean.AppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { conf, err := impl.GetClusterConf(app.ClusterId) if err != nil { + + impl.logger.Errorw("HibernateApplication", "error in getting cluster config", "err", err, "clusterId", app.ClusterId) return nil, err } - req := impl.hibernateReqAdaptor(hibernateRequest) + req := HibernateReqAdaptor(hibernateRequest) req.ClusterConfig = conf res, err := impl.helmAppClient.Hibernate(ctx, req) if err != nil { + impl.logger.Errorw("HibernateApplication", "error in hibernating the resources", "err", err, "clusterId", app.ClusterId, "appReleaseName", app.ReleaseName) return nil, err } - response := impl.hibernateResponseAdaptor(res.Status) + response := HibernateResponseAdaptor(res.Status) return response, nil } @@ -208,15 +211,18 @@ func (impl *HelmAppServiceImpl) UnHibernateApplication(ctx context.Context, app conf, err := impl.GetClusterConf(app.ClusterId) if err != nil { + impl.logger.Errorw("UnHibernateApplication", "error in getting cluster config", "err", err, "clusterId", app.ClusterId) return nil, err } - req := impl.hibernateReqAdaptor(hibernateRequest) + req := HibernateReqAdaptor(hibernateRequest) req.ClusterConfig = conf res, err := impl.helmAppClient.UnHibernate(ctx, req) if err != nil { + impl.logger.Errorw("UnHibernateApplication", "error in UnHibernating the resources", "err", err, "clusterId", app.ClusterId, "appReleaseName", app.ReleaseName) + return nil, err } - response := impl.hibernateResponseAdaptor(res.Status) + response := HibernateResponseAdaptor(res.Status) return response, nil } @@ -1109,40 +1115,6 @@ func (impl *HelmAppServiceImpl) listApplications(ctx context.Context, clusterIds return applicatonStream, err } -func (impl *HelmAppServiceImpl) hibernateReqAdaptor(hibernateRequest *openapi.HibernateRequest) *gRPC.HibernateRequest { - req := &gRPC.HibernateRequest{} - for _, reqObject := range hibernateRequest.GetResources() { - obj := &gRPC.ObjectIdentifier{ - Group: *reqObject.Group, - Kind: *reqObject.Kind, - Version: *reqObject.Version, - Name: *reqObject.Name, - Namespace: *reqObject.Namespace, - } - req.ObjectIdentifier = append(req.ObjectIdentifier, obj) - } - return req -} - -func (impl *HelmAppServiceImpl) hibernateResponseAdaptor(in []*gRPC.HibernateStatus) []*openapi.HibernateStatus { - var resStatus []*openapi.HibernateStatus - for _, status := range in { - resObj := &openapi.HibernateStatus{ - Success: &status.Success, - ErrorMessage: &status.ErrorMsg, - TargetObject: &openapi.HibernateTargetObject{ - Group: &status.TargetObject.Group, - Kind: &status.TargetObject.Kind, - Version: &status.TargetObject.Version, - Name: &status.TargetObject.Name, - Namespace: &status.TargetObject.Namespace, - }, - } - resStatus = append(resStatus, resObj) - } - return resStatus -} - func isSameAppName(deployedAppName string, appDto app.App) bool { if len(appDto.DisplayName) > 0 { return deployedAppName == appDto.DisplayName diff --git a/api/helm-app/service/helper.go b/api/helm-app/service/helper.go index 45f69c70d9..50a6798cc7 100644 --- a/api/helm-app/service/helper.go +++ b/api/helm-app/service/helper.go @@ -18,7 +18,10 @@ package service import ( "fmt" + "github.com/devtron-labs/devtron/api/helm-app/gRPC" + openapi "github.com/devtron-labs/devtron/api/helm-app/openapiClient" "github.com/devtron-labs/devtron/api/helm-app/service/bean" + "net/http" "strconv" "strings" ) @@ -41,3 +44,44 @@ func DecodeExternalAppAppId(appId string) (*bean.AppIdentifier, error) { ReleaseName: component[2], }, nil } + +func HibernateReqAdaptor(hibernateRequest *openapi.HibernateRequest) *gRPC.HibernateRequest { + req := &gRPC.HibernateRequest{} + for _, reqObject := range hibernateRequest.GetResources() { + obj := &gRPC.ObjectIdentifier{ + Group: *reqObject.Group, + Kind: *reqObject.Kind, + Version: *reqObject.Version, + Name: *reqObject.Name, + Namespace: *reqObject.Namespace, + } + req.ObjectIdentifier = append(req.ObjectIdentifier, obj) + } + return req +} + +func HibernateResponseAdaptor(in []*gRPC.HibernateStatus) []*openapi.HibernateStatus { + var resStatus []*openapi.HibernateStatus + for _, status := range in { + resObj := &openapi.HibernateStatus{ + Success: &status.Success, + ErrorMessage: &status.ErrorMsg, + TargetObject: &openapi.HibernateTargetObject{ + Group: &status.TargetObject.Group, + Kind: &status.TargetObject.Kind, + Version: &status.TargetObject.Version, + Name: &status.TargetObject.Name, + Namespace: &status.TargetObject.Namespace, + }, + } + resStatus = append(resStatus, resObj) + } + return resStatus +} + +func GetStatusCode(err error) int { + if err.Error() == "unauthorized" { + return http.StatusForbidden + } + return http.StatusInternalServerError +} diff --git a/api/k8s/application/k8sApplicationRestHandler.go b/api/k8s/application/k8sApplicationRestHandler.go index 823fdba4c0..b6830b7d0d 100644 --- a/api/k8s/application/k8sApplicationRestHandler.go +++ b/api/k8s/application/k8sApplicationRestHandler.go @@ -29,13 +29,16 @@ import ( "github.com/devtron-labs/common-lib/utils/k8sObjectsUtil" "github.com/devtron-labs/devtron/api/bean" "github.com/devtron-labs/devtron/api/connector" + "github.com/devtron-labs/devtron/api/helm-app/gRPC" client "github.com/devtron-labs/devtron/api/helm-app/service" "github.com/devtron-labs/devtron/api/restHandler/common" util2 "github.com/devtron-labs/devtron/internal/util" + "github.com/devtron-labs/devtron/pkg/argoApplication" "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" "github.com/devtron-labs/devtron/pkg/auth/user" "github.com/devtron-labs/devtron/pkg/cluster" clientErrors "github.com/devtron-labs/devtron/pkg/errors" + "github.com/devtron-labs/devtron/pkg/fluxApplication" "github.com/devtron-labs/devtron/pkg/k8s" application2 "github.com/devtron-labs/devtron/pkg/k8s/application" bean2 "github.com/devtron-labs/devtron/pkg/k8s/application/bean" @@ -90,9 +93,12 @@ type K8sApplicationRestHandlerImpl struct { userService user.UserService k8sCommonService k8s.K8sCommonService terminalEnvVariables *util.TerminalEnvVariables + fluxAppService fluxApplication.FluxApplicationService + argoApplication argoApplication.ArgoApplicationService } -func NewK8sApplicationRestHandlerImpl(logger *zap.SugaredLogger, k8sApplicationService application2.K8sApplicationService, pump connector.Pump, terminalSessionHandler terminal.TerminalSessionHandler, enforcer casbin.Enforcer, enforcerUtilHelm rbac.EnforcerUtilHelm, enforcerUtil rbac.EnforcerUtil, helmAppService client.HelmAppService, userService user.UserService, k8sCommonService k8s.K8sCommonService, validator *validator.Validate, envVariables *util.EnvironmentVariables) *K8sApplicationRestHandlerImpl { +func NewK8sApplicationRestHandlerImpl(logger *zap.SugaredLogger, k8sApplicationService application2.K8sApplicationService, pump connector.Pump, terminalSessionHandler terminal.TerminalSessionHandler, enforcer casbin.Enforcer, enforcerUtilHelm rbac.EnforcerUtilHelm, enforcerUtil rbac.EnforcerUtil, helmAppService client.HelmAppService, userService user.UserService, k8sCommonService k8s.K8sCommonService, validator *validator.Validate, envVariables *util.EnvironmentVariables, fluxAppService fluxApplication.FluxApplicationService, argoApplication argoApplication.ArgoApplicationService, +) *K8sApplicationRestHandlerImpl { return &K8sApplicationRestHandlerImpl{ logger: logger, k8sApplicationService: k8sApplicationService, @@ -106,6 +112,8 @@ func NewK8sApplicationRestHandlerImpl(logger *zap.SugaredLogger, k8sApplicationS userService: userService, k8sCommonService: k8sCommonService, terminalEnvVariables: envVariables.TerminalEnvVariables, + fluxAppService: fluxAppService, + argoApplication: argoApplication, } } @@ -160,61 +168,19 @@ func (handler *K8sApplicationRestHandlerImpl) GetResource(w http.ResponseWriter, common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } - vars := r.URL.Query() - request.ExternalArgoApplicationName = vars.Get("externalArgoApplicationName") - rbacObject := "" - rbacObject2 := "" - envObject := "" + token := r.Header.Get("token") - if request.AppId != "" && request.AppType == bean2.HelmAppType { - appIdentifier, err := handler.helmAppService.DecodeAppId(request.AppId) + + //rbac validation for the apps requests + if request.AppId != "" { + ok, err := handler.verifyRbacForAppRequests(token, &request, r, casbin.ActionGet) if err != nil { - handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return - } - //setting appIdentifier value in request - request.AppIdentifier = appIdentifier - request.ClusterId = request.AppIdentifier.ClusterId - if request.DeploymentType == bean2.HelmInstalledType { - if err := handler.k8sApplicationService.ValidateResourceRequest(r.Context(), request.AppIdentifier, request.K8sRequest); err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - } else if request.DeploymentType == bean2.ArgoInstalledType { - //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree - } - // RBAC enforcer applying for Helm App - rbacObject, rbacObject2 = handler.enforcerUtilHelm.GetHelmObjectByClusterIdNamespaceAndAppName(request.AppIdentifier.ClusterId, request.AppIdentifier.Namespace, request.AppIdentifier.ReleaseName) - ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionGet, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionGet, rbacObject2) - if !ok { + } else if !ok { common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) return } - // RBAC enforcer Ends - } else if request.AppId != "" && request.AppType == bean2.DevtronAppType { - devtronAppIdentifier, err := handler.k8sApplicationService.DecodeDevtronAppId(request.AppId) - if err != nil { - handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - //setting devtronAppIdentifier value in request - request.DevtronAppIdentifier = devtronAppIdentifier - request.ClusterId = request.DevtronAppIdentifier.ClusterId - if request.DeploymentType == bean2.HelmInstalledType { - //TODO Implement ResourceRequest Validation for Helm Installed Devtron APPs - } else if request.DeploymentType == bean2.ArgoInstalledType { - //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree - } - // RBAC enforcer applying for Devtron App - envObject = handler.enforcerUtil.GetEnvRBACNameByAppId(request.DevtronAppIdentifier.AppId, request.DevtronAppIdentifier.EnvId) - hasReadAccessForEnv := handler.enforcer.Enforce(token, casbin.ResourceEnvironment, casbin.ActionGet, envObject) - if !hasReadAccessForEnv { - common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) - return - } - // RBAC enforcer Ends } // Invalid cluster id if request.ClusterId <= 0 { @@ -266,69 +232,147 @@ func (handler *K8sApplicationRestHandlerImpl) GetResource(w http.ResponseWriter, common.WriteJsonResp(w, nil, resource, http.StatusOK) } - func (handler *K8sApplicationRestHandlerImpl) GetHostUrlsByBatch(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) - clusterIdString := vars["appId"] - if clusterIdString == "" { + appIdString := vars["appId"] + if appIdString == "" { common.WriteJsonResp(w, fmt.Errorf("empty appid in request"), nil, http.StatusBadRequest) return } - appIdentifier, err := handler.helmAppService.DecodeAppId(clusterIdString) + appTypeString := vars["appType"] + if appTypeString == "" { + common.WriteJsonResp(w, fmt.Errorf("empty appType in request"), nil, http.StatusBadRequest) + return + } + appType, err := strconv.Atoi(appTypeString) if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("invalid appType in request"), nil, http.StatusBadRequest) return } - // RBAC enforcer applying - rbacObject, rbacObject2 := handler.enforcerUtilHelm.GetHelmObjectByClusterIdNamespaceAndAppName(appIdentifier.ClusterId, appIdentifier.Namespace, appIdentifier.ReleaseName) + token := r.Header.Get("token") + var k8sAppDetail bean.AppDetailContainer + var resourceTreeResponse *gRPC.ResourceTreeResponse + var clusterId int + var namespace string + var resourceTreeInf map[string]interface{} + var externalArgoApplicationName string - ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionGet, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionGet, rbacObject2) + if appType == bean2.HelmAppType { + appIdentifier, err := handler.helmAppService.DecodeAppId(appIdString) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + // RBAC enforcer applying + rbacObject, rbacObject2 := handler.enforcerUtilHelm.GetHelmObjectByClusterIdNamespaceAndAppName(appIdentifier.ClusterId, appIdentifier.Namespace, appIdentifier.ReleaseName) - if !ok { - common.WriteJsonResp(w, fmt.Errorf("unauthorized"), nil, http.StatusForbidden) - return - } - //RBAC enforcer Ends - appDetail, err := handler.helmAppService.GetApplicationDetail(r.Context(), appIdentifier) - if err != nil { - apiError := clientErrors.ConvertToApiError(err) - if apiError != nil { - err = apiError + ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionGet, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionGet, rbacObject2) + + if !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized"), nil, http.StatusForbidden) + return } - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return + //RBAC enforcer Ends + appDetail, err := handler.helmAppService.GetApplicationDetail(r.Context(), appIdentifier) + if err != nil { + apiError := clientErrors.ConvertToApiError(err) + if apiError != nil { + err = apiError + } + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + clusterId = appIdentifier.ClusterId + namespace = appIdentifier.Namespace + resourceTreeResponse = appDetail.ResourceTreeResponse + + } else if appType == bean2.ArgoAppType { + appIdentifier, err := argoApplication.DecodeExternalArgoAppId(appIdString) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + // RBAC enforcer applying + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok { + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + return + } + //RBAC enforcer Ends + + appDetail, err := handler.argoApplication.GetAppDetail(appIdentifier.AppName, appIdentifier.Namespace, appIdentifier.ClusterId) + if err != nil { + apiError := clientErrors.ConvertToApiError(err) + if apiError != nil { + err = apiError + } + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + clusterId = appIdentifier.ClusterId + namespace = appIdentifier.Namespace + resourceTreeResponse = appDetail.ResourceTree + externalArgoApplicationName = appIdentifier.AppName + + } else if appType == bean2.FluxAppType { + appIdentifier, err := fluxApplication.DecodeFluxExternalAppId(appIdString) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + // RBAC enforcer applying + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok { + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + return + } + //RBAC enforcer Ends + + appDetail, err := handler.fluxAppService.GetFluxAppDetail(r.Context(), appIdentifier) + if err != nil { + apiError := clientErrors.ConvertToApiError(err) + if apiError != nil { + err = apiError + } + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + clusterId = appIdentifier.ClusterId + namespace = appIdentifier.Namespace + resourceTreeResponse = appDetail.ResourceTreeResponse } - k8sAppDetail := bean.AppDetailContainer{ + + k8sAppDetail = bean.AppDetailContainer{ DeploymentDetailContainer: bean.DeploymentDetailContainer{ - ClusterId: appIdentifier.ClusterId, - Namespace: appIdentifier.Namespace, + ClusterId: clusterId, + Namespace: namespace, }, } - var resourceTreeInf map[string]interface{} - bytes, _ := json.Marshal(appDetail.ResourceTreeResponse) + + bytes, _ := json.Marshal(resourceTreeResponse) err = json.Unmarshal(bytes, &resourceTreeInf) if err != nil { common.WriteJsonResp(w, fmt.Errorf("unmarshal error of resource tree response"), nil, http.StatusInternalServerError) return } - validRequests := handler.k8sCommonService.FilterK8sResources(r.Context(), resourceTreeInf, k8sAppDetail, clusterIdString, []string{k8sCommonBean.ServiceKind, k8sCommonBean.IngressKind}) + + validRequests := handler.k8sCommonService.FilterK8sResources(r.Context(), resourceTreeInf, k8sAppDetail, appIdString, []string{k8sCommonBean.ServiceKind, k8sCommonBean.IngressKind}, externalArgoApplicationName) if len(validRequests) == 0 { - handler.logger.Error("neither service nor ingress found for this app", "appId", clusterIdString) + handler.logger.Error("neither service nor ingress found for this app", "appId", appIdString) common.WriteJsonResp(w, err, nil, http.StatusNoContent) return } resp, err := handler.k8sCommonService.GetManifestsByBatch(r.Context(), validRequests) if err != nil { - handler.logger.Errorw("error in getting manifests in batch", "err", err, "clusterId", appIdentifier.ClusterId) + handler.logger.Errorw("error in getting manifests in batch", "err", err, "clusterId", k8sAppDetail.ClusterId) common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } result := handler.k8sApplicationService.GetUrlsByBatchForIngress(r.Context(), resp) common.WriteJsonResp(w, nil, result, http.StatusOK) -} +} func (handler *K8sApplicationRestHandlerImpl) CreateResource(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) var request k8s.ResourceRequestBean @@ -363,69 +407,27 @@ func (handler *K8sApplicationRestHandlerImpl) CreateResource(w http.ResponseWrit } common.WriteJsonResp(w, nil, resource, http.StatusOK) } - func (handler *K8sApplicationRestHandlerImpl) UpdateResource(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) - token := r.Header.Get("token") var request k8s.ResourceRequestBean + token := r.Header.Get("token") err := decoder.Decode(&request) if err != nil { handler.logger.Errorw("error in decoding request body", "err", err) common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } - if request.AppId != "" && request.AppType == bean2.HelmAppType { - // For helm app resources - appIdentifier, err := handler.helmAppService.DecodeAppId(request.AppId) - if err != nil { - handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - //setting appIdentifier value in request - request.AppIdentifier = appIdentifier - request.ClusterId = appIdentifier.ClusterId - if request.DeploymentType == bean2.HelmAppType { - if err := handler.k8sApplicationService.ValidateResourceRequest(r.Context(), request.AppIdentifier, request.K8sRequest); err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - } else if request.DeploymentType == bean2.ArgoInstalledType { - //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree - } - // RBAC enforcer applying - rbacObject, rbacObject2 := handler.enforcerUtilHelm.GetHelmObjectByClusterIdNamespaceAndAppName(request.AppIdentifier.ClusterId, request.AppIdentifier.Namespace, request.AppIdentifier.ReleaseName) - token := r.Header.Get("token") - ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionUpdate, rbacObject2) - if !ok { - common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) - return - } - //RBAC enforcer Ends - } else if request.AppId != "" && request.AppType == bean2.DevtronAppType { - // For Devtron App resources - devtronAppIdentifier, err := handler.k8sApplicationService.DecodeDevtronAppId(request.AppId) + + //rbac validation for the apps requests + if request.AppId != "" { + ok, err := handler.verifyRbacForAppRequests(token, &request, r, casbin.ActionUpdate) if err != nil { - handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return - } - //setting devtronAppIdentifier value in request - request.DevtronAppIdentifier = devtronAppIdentifier - request.ClusterId = request.DevtronAppIdentifier.ClusterId - if request.DeploymentType == bean2.HelmInstalledType { - //TODO Implement ResourceRequest Validation for Helm Installed Devtron APPs - } else if request.DeploymentType == bean2.ArgoInstalledType { - //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree - } - // RBAC enforcer applying for Devtron App - envObject := handler.enforcerUtil.GetEnvRBACNameByAppId(request.DevtronAppIdentifier.AppId, request.DevtronAppIdentifier.EnvId) - hasAccessForEnv := handler.enforcer.Enforce(token, casbin.ResourceEnvironment, casbin.ActionUpdate, envObject) - if !hasAccessForEnv { + } else if !ok { common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) return } - // RBAC enforcer Ends } else if request.ClusterId > 0 { // RBAC enforcer applying for Resource Browser if ok := handler.handleRbac(r, w, request, token, casbin.ActionUpdate); !ok { @@ -445,7 +447,6 @@ func (handler *K8sApplicationRestHandlerImpl) UpdateResource(w http.ResponseWrit } common.WriteJsonResp(w, nil, resource, http.StatusOK) } - func (handler *K8sApplicationRestHandlerImpl) handleRbac(r *http.Request, w http.ResponseWriter, request k8s.ResourceRequestBean, token string, casbinAction string) bool { // assume direct update in cluster allowed, err := handler.k8sApplicationService.ValidateClusterResourceRequest(r.Context(), &request, handler.getRbacCallbackForResource(token, casbinAction)) @@ -458,7 +459,6 @@ func (handler *K8sApplicationRestHandlerImpl) handleRbac(r *http.Request, w http } return allowed } - func (handler *K8sApplicationRestHandlerImpl) DeleteResource(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { @@ -473,60 +473,19 @@ func (handler *K8sApplicationRestHandlerImpl) DeleteResource(w http.ResponseWrit return } token := r.Header.Get("token") + vars := r.URL.Query() + request.ExternalArgoApplicationName = vars.Get("externalArgoApplicationName") - if request.AppId != "" && request.AppType == bean2.HelmAppType { - // For Helm app resource - appIdentifier, err := handler.helmAppService.DecodeAppId(request.AppId) - if err != nil { - handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - //setting appIdentifier value in request - request.AppIdentifier = appIdentifier - request.ClusterId = appIdentifier.ClusterId - if request.DeploymentType == bean2.HelmInstalledType { - if err := handler.k8sApplicationService.ValidateResourceRequest(r.Context(), request.AppIdentifier, request.K8sRequest); err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - } else if request.DeploymentType == bean2.ArgoInstalledType { - //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree - } - // RBAC enforcer applying for Helm App - rbacObject, rbacObject2 := handler.enforcerUtilHelm.GetHelmObjectByClusterIdNamespaceAndAppName(request.AppIdentifier.ClusterId, request.AppIdentifier.Namespace, request.AppIdentifier.ReleaseName) - - ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionDelete, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionDelete, rbacObject2) - - if !ok { - common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) - return - } - //RBAC enforcer Ends - } else if request.AppId != "" && request.AppType == bean2.DevtronAppType { - // For Devtron App resources - devtronAppIdentifier, err := handler.k8sApplicationService.DecodeDevtronAppId(request.AppId) + //rbac handle for the apps requests + if request.AppId != "" { + ok, err := handler.verifyRbacForAppRequests(token, &request, r, casbin.ActionDelete) if err != nil { - handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return - } - //setting devtronAppIdentifier value in request - request.DevtronAppIdentifier = devtronAppIdentifier - request.ClusterId = request.DevtronAppIdentifier.ClusterId - if request.DeploymentType == bean2.HelmInstalledType { - //TODO Implement ResourceRequest Validation for Helm Installed Devtron APPs - } else if request.DeploymentType == bean2.ArgoInstalledType { - //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree - } - // RBAC enforcer applying for Devtron App - envObject := handler.enforcerUtil.GetEnvRBACNameByAppId(request.DevtronAppIdentifier.AppId, request.DevtronAppIdentifier.EnvId) - hasAccessForEnv := handler.enforcer.Enforce(token, casbin.ResourceEnvironment, casbin.ActionDelete, envObject) - if !hasAccessForEnv { + } else if !ok { common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) return } - // RBAC enforcer Ends } else if request.ClusterId > 0 { // RBAC enforcer applying for resource Browser if ok := handler.handleRbac(r, w, request, token, casbin.ActionDelete); !ok { @@ -555,7 +514,6 @@ func (handler *K8sApplicationRestHandlerImpl) DeleteResource(w http.ResponseWrit } common.WriteJsonResp(w, nil, resource, http.StatusOK) } - func (handler *K8sApplicationRestHandlerImpl) ListEvents(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) token := r.Header.Get("token") @@ -566,66 +524,23 @@ func (handler *K8sApplicationRestHandlerImpl) ListEvents(w http.ResponseWriter, common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } - vars := r.URL.Query() - request.ExternalArgoApplicationName = vars.Get("externalArgoApplicationName") - if request.AppId != "" && request.AppType == bean2.HelmAppType { - // For Helm app resource - appIdentifier, err := handler.helmAppService.DecodeAppId(request.AppId) + //rbac validation for the apps requests + if request.AppId != "" { + ok, err := handler.verifyRbacForAppRequests(token, &request, r, casbin.ActionGet) if err != nil { - handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return - } - //setting appIdentifier value in request - request.AppIdentifier = appIdentifier - request.ClusterId = appIdentifier.ClusterId - if request.DeploymentType == bean2.HelmInstalledType { - if err := handler.k8sApplicationService.ValidateResourceRequest(r.Context(), request.AppIdentifier, request.K8sRequest); err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - } else if request.DeploymentType == bean2.ArgoInstalledType { - //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree - } - // RBAC enforcer applying for Helm App - rbacObject, rbacObject2 := handler.enforcerUtilHelm.GetHelmObjectByClusterIdNamespaceAndAppName(request.AppIdentifier.ClusterId, request.AppIdentifier.Namespace, request.AppIdentifier.ReleaseName) - ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionGet, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionGet, rbacObject2) - if !ok { - common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) - return - } - //RBAC enforcer Ends - } else if request.AppId != "" && request.AppType == bean2.DevtronAppType { - // For Devtron App resources - devtronAppIdentifier, err := handler.k8sApplicationService.DecodeDevtronAppId(request.AppId) - if err != nil { - handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - //setting devtronAppIdentifier value in request - request.DevtronAppIdentifier = devtronAppIdentifier - request.ClusterId = request.DevtronAppIdentifier.ClusterId - if request.DeploymentType == bean2.HelmInstalledType { - //TODO Implement ResourceRequest Validation for Helm Installed Devtron APPs - } else if request.DeploymentType == bean2.ArgoInstalledType { - //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree - } - //RBAC enforcer applying for Devtron App - envObject := handler.enforcerUtil.GetEnvRBACNameByAppId(request.DevtronAppIdentifier.AppId, request.DevtronAppIdentifier.EnvId) - hasAccessForEnv := handler.enforcer.Enforce(token, casbin.ResourceEnvironment, casbin.ActionGet, envObject) - if !hasAccessForEnv { - common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) + } else if !ok { + common.WriteJsonResp(w, errors2.New("unauthorized user"), nil, http.StatusForbidden) return } - //RBAC enforcer Ends - } else if request.ClusterId > 0 && request.AppType != bean2.ArgoAppType { + } else if request.ClusterId > 0 { // RBAC enforcer applying for resource Browser if ok := handler.handleRbac(r, w, request, token, casbin.ActionGet); !ok { return } // RBAC enforcer Ends - } else if request.ClusterId <= 0 { + } else { common.WriteJsonResp(w, errors.New("can not get resource as target cluster is not provided"), nil, http.StatusBadRequest) return } @@ -637,7 +552,6 @@ func (handler *K8sApplicationRestHandlerImpl) ListEvents(w http.ResponseWriter, } common.WriteJsonResp(w, nil, events, http.StatusOK) } - func (handler *K8sApplicationRestHandlerImpl) GetPodLogs(w http.ResponseWriter, r *http.Request) { token := r.Header.Get("token") request, err := handler.k8sApplicationService.ValidatePodLogsRequestQuery(r) @@ -761,7 +675,7 @@ func generatePodLogsFilename(filename string) string { } func (handler *K8sApplicationRestHandlerImpl) requestValidationAndRBAC(w http.ResponseWriter, r *http.Request, token string, request *k8s.ResourceRequestBean) { - if request.AppIdentifier != nil { + if request.AppType == bean2.HelmAppType && request.AppIdentifier != nil { if request.DeploymentType == bean2.HelmInstalledType { if err := handler.k8sApplicationService.ValidateResourceRequest(r.Context(), request.AppIdentifier, request.K8sRequest); err != nil { common.WriteJsonResp(w, err, nil, http.StatusBadRequest) @@ -779,7 +693,7 @@ func (handler *K8sApplicationRestHandlerImpl) requestValidationAndRBAC(w http.Re return } //RBAC enforcer Ends - } else if request.DevtronAppIdentifier != nil { + } else if request.AppType == bean2.DevtronAppType && request.DevtronAppIdentifier != nil { if request.DeploymentType == bean2.HelmInstalledType { //TODO Implement ResourceRequest Validation for Helm Installed Devtron APPs } else if request.DeploymentType == bean2.ArgoInstalledType { @@ -792,7 +706,39 @@ func (handler *K8sApplicationRestHandlerImpl) requestValidationAndRBAC(w http.Re return } //RBAC enforcer Ends - } else if request.AppIdentifier == nil && request.DevtronAppIdentifier == nil && request.ClusterId > 0 && request.AppType != bean2.ArgoAppType { + } else if request.AppType == bean2.FluxAppType && request.ExternalFluxAppIdentifier != nil { + valid, err := handler.k8sApplicationService.ValidateFluxResourceRequest(r.Context(), request.ExternalFluxAppIdentifier, request.K8sRequest) + if err != nil || !valid { + handler.logger.Errorw("error in validating resource request", "err", err) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + //RBAC enforcer starts here + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok { + common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) + return + } + //RBAC enforcer ends here + } else if request.AppType == bean2.ArgoAppType && request.ExternalArgoApplicationName != "" { + appIdentifier, err := argoApplication.DecodeExternalArgoAppId(request.AppId) + if err != nil { + handler.logger.Errorw(bean2.AppIdDecodingError, "err", err, "appIdentifier", request.AppIdentifier) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + } + valid, err := handler.k8sApplicationService.ValidateArgoResourceRequest(r.Context(), appIdentifier, request.K8sRequest) + if err != nil || !valid { + handler.logger.Errorw("error in validating resource request", "err", err) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + //RBAC enforcer starts here + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok { + common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) + return + } + //RBAC enforcer ends here + } else if request.AppIdentifier == nil && request.DevtronAppIdentifier == nil && request.ClusterId > 0 && request.ExternalArgoApplicationName == "" { //RBAC enforcer applying For Resource Browser if !handler.handleRbac(r, w, *request, token, casbin.ActionGet) { return @@ -822,15 +768,11 @@ func (handler *K8sApplicationRestHandlerImpl) GetTerminalSession(w http.Response common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } - vars := r.URL.Query() - appTypeStr := vars.Get("appType") - appType, _ := strconv.Atoi(appTypeStr) //ignore error as this var is not expected for devtron apps/helm apps/resource bowser. appType var is needed in case of Argo Apps request, resourceRequestBean, err := handler.k8sApplicationService.ValidateTerminalRequestQuery(r) if err != nil { common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } - request.ExternalArgoApplicationName = vars.Get("externalArgoApplicationName") // check for super admin restricted := handler.restrictTerminalAccessForNonSuperUsers(w, token) if restricted { @@ -854,7 +796,23 @@ func (handler *K8sApplicationRestHandlerImpl) GetTerminalSession(w http.Response return } //RBAC enforcer Ends - } else if resourceRequestBean.AppIdentifier == nil && resourceRequestBean.DevtronAppIdentifier == nil && resourceRequestBean.ClusterId > 0 && appType != bean2.ArgoAppType { + } else if resourceRequestBean.ExternalFluxAppIdentifier != nil { + // RBAC enforcer applying For external flux app + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionUpdate, "*"); !ok { + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + return + } + //RBAC enforcer Ends + + } else if resourceRequestBean.ExternalArgoApplicationName != "" { + // RBAC enforcer applying For external Argo app + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionUpdate, "*"); !ok { + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + return + } + //RBAC enforcer Ends + + } else if resourceRequestBean.AppIdentifier == nil && resourceRequestBean.DevtronAppIdentifier == nil && resourceRequestBean.ExternalFluxAppIdentifier == nil && resourceRequestBean.ExternalArgoApplicationName == "" && resourceRequestBean.ClusterId > 0 { //RBAC enforcer applying for Resource Browser if !handler.handleRbac(r, w, *resourceRequestBean, token, casbin.ActionUpdate) { return @@ -1060,8 +1018,6 @@ func (handler *K8sApplicationRestHandlerImpl) CreateEphemeralContainer(w http.Re return } request.UserId = userId - vars := r.URL.Query() - request.ExternalArgoApplicationName = vars.Get("externalArgoApplicationName") err = handler.k8sApplicationService.CreatePodEphemeralContainers(&request) if err != nil { handler.logger.Errorw("error occurred in creating ephemeral container", "err", err, "requestPayload", request) @@ -1110,8 +1066,6 @@ func (handler *K8sApplicationRestHandlerImpl) DeleteEphemeralContainer(w http.Re return } request.UserId = userId - vars := r.URL.Query() - request.ExternalArgoApplicationName = vars.Get("externalArgoApplicationName") _, err = handler.k8sApplicationService.TerminatePodEphemeralContainer(request) if err != nil { handler.logger.Errorw("error occurred in terminating ephemeral container", "err", err, "requestPayload", request) @@ -1130,10 +1084,6 @@ func (handler *K8sApplicationRestHandlerImpl) handleEphemeralRBAC(podName, names common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return resourceRequestBean } - vars := r.URL.Query() - appTypeStr := vars.Get("appType") - resourceRequestBean.ExternalArgoApplicationName = vars.Get("externalArgoApplicationName") - appType, _ := strconv.Atoi(appTypeStr) //ignore error as this var is not expected for devtron apps/helm apps/resource bowser. appType var is needed in case of Argo Apps if resourceRequestBean.AppIdentifier != nil { // RBAC enforcer applying For Helm App rbacObject, rbacObject2 := handler.enforcerUtilHelm.GetHelmObjectByClusterIdNamespaceAndAppName(resourceRequestBean.AppIdentifier.ClusterId, resourceRequestBean.AppIdentifier.Namespace, resourceRequestBean.AppIdentifier.ReleaseName) @@ -1152,7 +1102,22 @@ func (handler *K8sApplicationRestHandlerImpl) handleEphemeralRBAC(podName, names return resourceRequestBean } //RBAC enforcer Ends - } else if resourceRequestBean.AppIdentifier == nil && resourceRequestBean.DevtronAppIdentifier == nil && resourceRequestBean.ClusterId > 0 && appType != bean2.ArgoAppType { + } else if resourceRequestBean.ExternalFluxAppIdentifier != nil { + //RBAC enforcer starts here + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok { + common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) + return resourceRequestBean + } + //RBAC enforcer ends here + } else if resourceRequestBean.ExternalArgoApplicationName != "" { + //RBAC enforcer starts here + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok { + common.WriteJsonResp(w, errors2.New("unauthorized"), nil, http.StatusForbidden) + return resourceRequestBean + } + //RBAC enforcer ends here + + } else if resourceRequestBean.AppIdentifier == nil && resourceRequestBean.DevtronAppIdentifier == nil && resourceRequestBean.ExternalArgoApplicationName == "" && resourceRequestBean.ExternalFluxAppIdentifier == nil && resourceRequestBean.ClusterId > 0 { //RBAC enforcer applying for Resource Browser resourceRequestBean.K8sRequest.ResourceIdentifier.Name = podName resourceRequestBean.K8sRequest.ResourceIdentifier.Namespace = namespace @@ -1166,3 +1131,107 @@ func (handler *K8sApplicationRestHandlerImpl) handleEphemeralRBAC(podName, names } return resourceRequestBean } + +/* + true and err =!nil --> not possible [indicates that authorized but error has occurred too.] + true and err ==nil --> Denotes that user is authorized without any error, we can proceed + false and err !=nil --> during the validation of resources, we got an error, resulting the StatusBadRequest + false and err == nil --> denotes that user is not authorized, resulting in Unauthorized +*/ +func (handler *K8sApplicationRestHandlerImpl) verifyRbacForAppRequests(token string, request *k8s.ResourceRequestBean, r *http.Request, actionType string) (bool, error) { + rbacObject := "" + rbacObject2 := "" + envObject := "" + switch request.AppType { + case bean2.ArgoAppType: + argoAppIdentifier, err := argoApplication.DecodeExternalArgoAppId(request.AppId) + if err != nil { + handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) + return false, err + } + request.ClusterId = argoAppIdentifier.ClusterId + request.ExternalArgoApplicationName = argoAppIdentifier.AppName + valid, err := handler.k8sApplicationService.ValidateArgoResourceRequest(r.Context(), argoAppIdentifier, request.K8sRequest) + if err != nil || !valid { + handler.logger.Errorw("error in validating resource request", "err", err) + return false, err + } + //RBAC enforcer starts here + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, actionType, "*"); !ok { + return false, nil + } + return true, nil + //RBAC enforcer ends here + + case bean2.HelmAppType: + appIdentifier, err := handler.helmAppService.DecodeAppId(request.AppId) + if err != nil { + handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) + return false, err + } + //setting appIdentifier value in request + request.AppIdentifier = appIdentifier + request.ClusterId = request.AppIdentifier.ClusterId + if request.DeploymentType == bean2.HelmInstalledType { + if err := handler.k8sApplicationService.ValidateResourceRequest(r.Context(), request.AppIdentifier, request.K8sRequest); err != nil { + return false, err + } + } else if request.DeploymentType == bean2.ArgoInstalledType { + //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree + } + // RBAC enforcer applying for Helm App + rbacObject, rbacObject2 = handler.enforcerUtilHelm.GetHelmObjectByClusterIdNamespaceAndAppName(request.AppIdentifier.ClusterId, request.AppIdentifier.Namespace, request.AppIdentifier.ReleaseName) + ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, actionType, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, actionType, rbacObject2) + if !ok { + return false, nil + } + return true, nil + // RBAC enforcer Ends + case bean2.DevtronAppType: + devtronAppIdentifier, err := handler.k8sApplicationService.DecodeDevtronAppId(request.AppId) + if err != nil { + handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) + return false, err + } + //setting devtronAppIdentifier value in request + request.DevtronAppIdentifier = devtronAppIdentifier + request.ClusterId = request.DevtronAppIdentifier.ClusterId + if request.DeploymentType == bean2.HelmInstalledType { + //TODO Implement ResourceRequest Validation for Helm Installed Devtron APPs + } else if request.DeploymentType == bean2.ArgoInstalledType { + //TODO Implement ResourceRequest Validation for ArgoCD Installed APPs From ResourceTree + } + // RBAC enforcer applying for Devtron App + envObject = handler.enforcerUtil.GetEnvRBACNameByAppId(request.DevtronAppIdentifier.AppId, request.DevtronAppIdentifier.EnvId) + hasReadAccessForEnv := handler.enforcer.Enforce(token, casbin.ResourceEnvironment, actionType, envObject) + if !hasReadAccessForEnv { + return false, nil + } + // RBAC enforcer Ends + return true, nil + case bean2.FluxAppType: + // For flux app resource + appIdentifier, err := fluxApplication.DecodeFluxExternalAppId(request.AppId) + if err != nil { + handler.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) + return false, err + } + //setting fluxAppIdentifier value in request + request.ExternalFluxAppIdentifier = appIdentifier + request.ClusterId = appIdentifier.ClusterId + valid, err := handler.k8sApplicationService.ValidateFluxResourceRequest(r.Context(), request.ExternalFluxAppIdentifier, request.K8sRequest) + if err != nil || !valid { + handler.logger.Errorw("error in validating resource request", "err", err) + return false, err + } + //RBAC enforcer starts here + if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, actionType, "*"); !ok { + return false, nil + } + return true, nil + //RBAC enforcer ends here + default: + handler.logger.Errorw("appType not recognized", "appType", request.AppType) + return false, errors.New("appType not founded in request") + } +} diff --git a/api/k8s/application/k8sApplicationRouter.go b/api/k8s/application/k8sApplicationRouter.go index 911a6eb998..a05b2ca3dc 100644 --- a/api/k8s/application/k8sApplicationRouter.go +++ b/api/k8s/application/k8sApplicationRouter.go @@ -38,7 +38,9 @@ func (impl *K8sApplicationRouterImpl) InitK8sApplicationRouter(k8sAppRouter *mux k8sAppRouter.Path("/resource/rotate").Queries("appId", "{appId}"). HandlerFunc(impl.k8sApplicationRestHandler.RotatePod).Methods("POST") - k8sAppRouter.Path("/resource/urls").Queries("appId", "{appId}"). + k8sAppRouter.Path("/resource/urls"). + Queries("appId", "{appId}"). + Queries("appType", "{appType}"). //introduced for the k8s resource urls HandlerFunc(impl.k8sApplicationRestHandler.GetHostUrlsByBatch).Methods("GET") k8sAppRouter.Path("/resource"). diff --git a/api/restHandler/app/appList/AppListingRestHandler.go b/api/restHandler/app/appList/AppListingRestHandler.go index ee8441de94..73a6226fa3 100644 --- a/api/restHandler/app/appList/AppListingRestHandler.go +++ b/api/restHandler/app/appList/AppListingRestHandler.go @@ -977,7 +977,7 @@ func (handler AppListingRestHandlerImpl) GetHostUrlsByBatch(w http.ResponseWrite return } // valid batch requests, only valid requests will be sent for batch processing - validRequests := handler.k8sCommonService.FilterK8sResources(r.Context(), resourceTree, appDetail, "", []string{k8sCommonBean.ServiceKind, k8sCommonBean.IngressKind}) + validRequests := handler.k8sCommonService.FilterK8sResources(r.Context(), resourceTree, appDetail, "", []string{k8sCommonBean.ServiceKind, k8sCommonBean.IngressKind}, "") if len(validRequests) == 0 { handler.logger.Error("neither service nor ingress found for", "appId", appIdParam, "envId", envIdParam, "installedAppId", installedAppIdParam) common.WriteJsonResp(w, err, nil, http.StatusNoContent) @@ -1148,7 +1148,7 @@ func (handler AppListingRestHandlerImpl) fetchResourceTree(w http.ResponseWriter }, } clusterIdString := strconv.Itoa(cdPipeline.Environment.ClusterId) - validRequest := handler.k8sCommonService.FilterK8sResources(r.Context(), resourceTree, k8sAppDetail, clusterIdString, []string{k8sCommonBean.ServiceKind, k8sCommonBean.EndpointsKind, k8sCommonBean.IngressKind}) + validRequest := handler.k8sCommonService.FilterK8sResources(r.Context(), resourceTree, k8sAppDetail, clusterIdString, []string{k8sCommonBean.ServiceKind, k8sCommonBean.EndpointsKind, k8sCommonBean.IngressKind}, "") resp, err := handler.k8sCommonService.GetManifestsByBatch(r.Context(), validRequest) if err != nil { handler.logger.Errorw("error in getting manifest by batch", "err", err, "clusterId", clusterIdString) diff --git a/api/router/router.go b/api/router/router.go index 95bbeade9a..8902c53caf 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -31,6 +31,7 @@ import ( "github.com/devtron-labs/devtron/api/deployment" "github.com/devtron-labs/devtron/api/devtronResource" "github.com/devtron-labs/devtron/api/externalLink" + fluxApplication2 "github.com/devtron-labs/devtron/api/fluxApplication" client "github.com/devtron-labs/devtron/api/helm-app" "github.com/devtron-labs/devtron/api/infraConfig" "github.com/devtron-labs/devtron/api/k8s/application" @@ -115,6 +116,7 @@ type MuxRouter struct { ciTriggerCron cron.CiTriggerCron infraConfigRouter infraConfig.InfraConfigRouter argoApplicationRouter argoApplication.ArgoApplicationRouter + fluxApplicationRouter fluxApplication2.FluxApplicationRouter devtronResourceRouter devtronResource.DevtronResourceRouter } @@ -146,7 +148,9 @@ func NewMuxRouter(logger *zap.SugaredLogger, proxyRouter proxy.ProxyRouter, infraConfigRouter infraConfig.InfraConfigRouter, argoApplicationRouter argoApplication.ArgoApplicationRouter, - devtronResourceRouter devtronResource.DevtronResourceRouter) *MuxRouter { + devtronResourceRouter devtronResource.DevtronResourceRouter, + fluxApplicationRouter fluxApplication2.FluxApplicationRouter, + ) *MuxRouter { r := &MuxRouter{ Router: mux.NewRouter(), EnvironmentClusterMappingsRouter: EnvironmentClusterMappingsRouter, @@ -209,6 +213,7 @@ func NewMuxRouter(logger *zap.SugaredLogger, infraConfigRouter: infraConfigRouter, argoApplicationRouter: argoApplicationRouter, devtronResourceRouter: devtronResourceRouter, + fluxApplicationRouter: fluxApplicationRouter, } return r } @@ -416,4 +421,7 @@ func (r MuxRouter) Init() { argoApplicationRouter := r.Router.PathPrefix("/orchestrator/argo-application").Subrouter() r.argoApplicationRouter.InitArgoApplicationRouter(argoApplicationRouter) + + fluxApplicationRouter := r.Router.PathPrefix("/orchestrator/flux-application").Subrouter() + r.fluxApplicationRouter.InitFluxApplicationRouter(fluxApplicationRouter) } diff --git a/cmd/external-app/router.go b/cmd/external-app/router.go index 27da8cd83e..972695fb36 100644 --- a/cmd/external-app/router.go +++ b/cmd/external-app/router.go @@ -30,6 +30,7 @@ import ( "github.com/devtron-labs/devtron/api/cluster" "github.com/devtron-labs/devtron/api/dashboardEvent" "github.com/devtron-labs/devtron/api/externalLink" + "github.com/devtron-labs/devtron/api/fluxApplication" client "github.com/devtron-labs/devtron/api/helm-app" "github.com/devtron-labs/devtron/api/k8s/application" "github.com/devtron-labs/devtron/api/k8s/capacity" @@ -82,6 +83,7 @@ type MuxRouter struct { appRouter app.AppRouterEAMode rbacRoleRouter user.RbacRoleRouter argoApplicationRouter argoApplication.ArgoApplicationRouter + fluxApplicationRouter fluxApplication.FluxApplicationRouter } func NewMuxRouter( @@ -113,7 +115,7 @@ func NewMuxRouter( userTerminalAccessRouter terminal.UserTerminalAccessRouter, attributesRouter router.AttributesRouter, appRouter app.AppRouterEAMode, - rbacRoleRouter user.RbacRoleRouter, argoApplicationRouter argoApplication.ArgoApplicationRouter, + rbacRoleRouter user.RbacRoleRouter, argoApplicationRouter argoApplication.ArgoApplicationRouter, fluxApplicationRouter fluxApplication.FluxApplicationRouter, ) *MuxRouter { r := &MuxRouter{ Router: mux.NewRouter(), @@ -148,6 +150,7 @@ func NewMuxRouter( appRouter: appRouter, rbacRoleRouter: rbacRoleRouter, argoApplicationRouter: argoApplicationRouter, + fluxApplicationRouter: fluxApplicationRouter, } return r } @@ -283,4 +286,6 @@ func (r *MuxRouter) Init() { argoApplicationRouter := r.Router.PathPrefix("/orchestrator/argo-application").Subrouter() r.argoApplicationRouter.InitArgoApplicationRouter(argoApplicationRouter) + fluxApplicationRouter := r.Router.PathPrefix("/orchestrator/flux-application").Subrouter() + r.fluxApplicationRouter.InitFluxApplicationRouter(fluxApplicationRouter) } diff --git a/cmd/external-app/wire.go b/cmd/external-app/wire.go index b7df2f2a5f..6f23ffdf64 100644 --- a/cmd/external-app/wire.go +++ b/cmd/external-app/wire.go @@ -37,6 +37,7 @@ import ( "github.com/devtron-labs/devtron/api/connector" "github.com/devtron-labs/devtron/api/dashboardEvent" "github.com/devtron-labs/devtron/api/externalLink" + "github.com/devtron-labs/devtron/api/fluxApplication" client "github.com/devtron-labs/devtron/api/helm-app" "github.com/devtron-labs/devtron/api/k8s" "github.com/devtron-labs/devtron/api/module" @@ -114,6 +115,7 @@ func InitializeApp() (*App, error) { gitOps.GitOpsEAWireSet, providerConfig.DeploymentProviderConfigWireSet, argoApplication.ArgoApplicationWireSet, + fluxApplication.FluxApplicationWireSet, NewApp, NewMuxRouter, util.NewHttpClient, diff --git a/cmd/external-app/wire_gen.go b/cmd/external-app/wire_gen.go index 4734f0cf48..c3a4512ff8 100644 --- a/cmd/external-app/wire_gen.go +++ b/cmd/external-app/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 @@ -26,6 +26,7 @@ import ( "github.com/devtron-labs/devtron/api/connector" "github.com/devtron-labs/devtron/api/dashboardEvent" externalLink2 "github.com/devtron-labs/devtron/api/externalLink" + fluxApplication2 "github.com/devtron-labs/devtron/api/fluxApplication" client2 "github.com/devtron-labs/devtron/api/helm-app" "github.com/devtron-labs/devtron/api/helm-app/gRPC" "github.com/devtron-labs/devtron/api/helm-app/service" @@ -83,6 +84,7 @@ import ( "github.com/devtron-labs/devtron/pkg/deployment/gitOps/config" "github.com/devtron-labs/devtron/pkg/deployment/providerConfig" "github.com/devtron-labs/devtron/pkg/externalLink" + "github.com/devtron-labs/devtron/pkg/fluxApplication" "github.com/devtron-labs/devtron/pkg/genericNotes" repository6 "github.com/devtron-labs/devtron/pkg/genericNotes/repository" k8s2 "github.com/devtron-labs/devtron/pkg/k8s" @@ -290,9 +292,10 @@ func InitializeApp() (*App, error) { } deletePostProcessorImpl := service2.NewDeletePostProcessorImpl(sugaredLogger) appStoreDeploymentServiceImpl := service2.NewAppStoreDeploymentServiceImpl(sugaredLogger, installedAppRepositoryImpl, installedAppDBServiceImpl, appStoreDeploymentDBServiceImpl, chartGroupDeploymentRepositoryImpl, appStoreApplicationVersionRepositoryImpl, appRepositoryImpl, eaModeDeploymentServiceImpl, eaModeDeploymentServiceImpl, environmentServiceImpl, helmAppServiceImpl, installedAppVersionHistoryRepositoryImpl, environmentVariables, acdConfig, gitOpsConfigReadServiceImpl, deletePostProcessorImpl, appStoreValidatorImpl, deploymentConfigServiceImpl) - helmAppRestHandlerImpl := client2.NewHelmAppRestHandlerImpl(sugaredLogger, helmAppServiceImpl, enforcerImpl, clusterServiceImpl, enforcerUtilHelmImpl, appStoreDeploymentServiceImpl, installedAppDBServiceImpl, userServiceImpl, attributesServiceImpl, serverEnvConfigServerEnvConfig) + fluxApplicationServiceImpl := fluxApplication.NewFluxApplicationServiceImpl(sugaredLogger, helmAppServiceImpl, clusterServiceImpl, helmAppClientImpl, pumpImpl) + argoApplicationServiceImpl := argoApplication.NewArgoApplicationServiceImpl(sugaredLogger, clusterRepositoryImpl, k8sServiceImpl, helmUserServiceImpl, helmAppClientImpl, helmAppServiceImpl) + helmAppRestHandlerImpl := client2.NewHelmAppRestHandlerImpl(sugaredLogger, helmAppServiceImpl, enforcerImpl, clusterServiceImpl, enforcerUtilHelmImpl, appStoreDeploymentServiceImpl, installedAppDBServiceImpl, userServiceImpl, attributesServiceImpl, serverEnvConfigServerEnvConfig, fluxApplicationServiceImpl, argoApplicationServiceImpl) helmAppRouterImpl := client2.NewHelmAppRouterImpl(helmAppRestHandlerImpl) - argoApplicationServiceImpl := argoApplication.NewArgoApplicationServiceImpl(sugaredLogger, clusterRepositoryImpl, k8sServiceImpl, helmUserServiceImpl, helmAppServiceImpl) k8sCommonServiceImpl := k8s2.NewK8sCommonServiceImpl(sugaredLogger, k8sServiceImpl, clusterServiceImpl, argoApplicationServiceImpl) environmentRestHandlerImpl := cluster2.NewEnvironmentRestHandlerImpl(environmentServiceImpl, sugaredLogger, userServiceImpl, validate, enforcerImpl, deleteServiceImpl, k8sServiceImpl, k8sCommonServiceImpl) environmentRouterImpl := cluster2.NewEnvironmentRouterImpl(environmentRestHandlerImpl) @@ -301,13 +304,13 @@ func InitializeApp() (*App, error) { ephemeralContainersRepositoryImpl := repository2.NewEphemeralContainersRepositoryImpl(db, transactionUtilImpl) ephemeralContainerServiceImpl := cluster.NewEphemeralContainerServiceImpl(ephemeralContainersRepositoryImpl, sugaredLogger) terminalSessionHandlerImpl := terminal.NewTerminalSessionHandlerImpl(environmentServiceImpl, clusterServiceImpl, sugaredLogger, k8sServiceImpl, ephemeralContainerServiceImpl, argoApplicationServiceImpl) - k8sApplicationServiceImpl, err := application.NewK8sApplicationServiceImpl(sugaredLogger, clusterServiceImpl, pumpImpl, helmAppServiceImpl, k8sServiceImpl, acdAuthConfig, k8sResourceHistoryServiceImpl, k8sCommonServiceImpl, terminalSessionHandlerImpl, ephemeralContainerServiceImpl, ephemeralContainersRepositoryImpl, argoApplicationServiceImpl) + k8sApplicationServiceImpl, err := application.NewK8sApplicationServiceImpl(sugaredLogger, clusterServiceImpl, pumpImpl, helmAppServiceImpl, k8sServiceImpl, acdAuthConfig, k8sResourceHistoryServiceImpl, k8sCommonServiceImpl, terminalSessionHandlerImpl, ephemeralContainerServiceImpl, ephemeralContainersRepositoryImpl, argoApplicationServiceImpl, fluxApplicationServiceImpl) if err != nil { return nil, err } ciPipelineRepositoryImpl := pipelineConfig.NewCiPipelineRepositoryImpl(db, sugaredLogger, transactionUtilImpl) enforcerUtilImpl := rbac.NewEnforcerUtilImpl(sugaredLogger, teamRepositoryImpl, appRepositoryImpl, environmentRepositoryImpl, pipelineRepositoryImpl, ciPipelineRepositoryImpl, clusterRepositoryImpl, enforcerImpl) - k8sApplicationRestHandlerImpl := application2.NewK8sApplicationRestHandlerImpl(sugaredLogger, k8sApplicationServiceImpl, pumpImpl, terminalSessionHandlerImpl, enforcerImpl, enforcerUtilHelmImpl, enforcerUtilImpl, helmAppServiceImpl, userServiceImpl, k8sCommonServiceImpl, validate, environmentVariables) + k8sApplicationRestHandlerImpl := application2.NewK8sApplicationRestHandlerImpl(sugaredLogger, k8sApplicationServiceImpl, pumpImpl, terminalSessionHandlerImpl, enforcerImpl, enforcerUtilHelmImpl, enforcerUtilImpl, helmAppServiceImpl, userServiceImpl, k8sCommonServiceImpl, validate, environmentVariables, fluxApplicationServiceImpl, argoApplicationServiceImpl) k8sApplicationRouterImpl := application2.NewK8sApplicationRouterImpl(k8sApplicationRestHandlerImpl) chartRepositoryRestHandlerImpl := chartRepo2.NewChartRepositoryRestHandlerImpl(sugaredLogger, userServiceImpl, chartRepositoryServiceImpl, enforcerImpl, validate, deleteServiceImpl, attributesServiceImpl) chartRepositoryRouterImpl := chartRepo2.NewChartRepositoryRouterImpl(chartRepositoryRestHandlerImpl) @@ -424,7 +427,9 @@ func InitializeApp() (*App, error) { rbacRoleRouterImpl := user2.NewRbacRoleRouterImpl(sugaredLogger, validate, rbacRoleRestHandlerImpl) argoApplicationRestHandlerImpl := argoApplication2.NewArgoApplicationRestHandlerImpl(argoApplicationServiceImpl, sugaredLogger, enforcerImpl) argoApplicationRouterImpl := argoApplication2.NewArgoApplicationRouterImpl(argoApplicationRestHandlerImpl) - muxRouter := NewMuxRouter(sugaredLogger, ssoLoginRouterImpl, teamRouterImpl, userAuthRouterImpl, userRouterImpl, clusterRouterImpl, dashboardRouterImpl, helmAppRouterImpl, environmentRouterImpl, k8sApplicationRouterImpl, chartRepositoryRouterImpl, appStoreDiscoverRouterImpl, appStoreValuesRouterImpl, appStoreDeploymentRouterImpl, chartProviderRouterImpl, dockerRegRouterImpl, dashboardTelemetryRouterImpl, commonDeploymentRouterImpl, externalLinkRouterImpl, moduleRouterImpl, serverRouterImpl, apiTokenRouterImpl, k8sCapacityRouterImpl, webhookHelmRouterImpl, userAttributesRouterImpl, telemetryRouterImpl, userTerminalAccessRouterImpl, attributesRouterImpl, appRouterEAModeImpl, rbacRoleRouterImpl, argoApplicationRouterImpl) + fluxApplicationRestHandlerImpl := fluxApplication2.NewFluxApplicationRestHandlerImpl(fluxApplicationServiceImpl, sugaredLogger, enforcerImpl) + fluxApplicationRouterImpl := fluxApplication2.NewFluxApplicationRouterImpl(fluxApplicationRestHandlerImpl) + muxRouter := NewMuxRouter(sugaredLogger, ssoLoginRouterImpl, teamRouterImpl, userAuthRouterImpl, userRouterImpl, clusterRouterImpl, dashboardRouterImpl, helmAppRouterImpl, environmentRouterImpl, k8sApplicationRouterImpl, chartRepositoryRouterImpl, appStoreDiscoverRouterImpl, appStoreValuesRouterImpl, appStoreDeploymentRouterImpl, chartProviderRouterImpl, dockerRegRouterImpl, dashboardTelemetryRouterImpl, commonDeploymentRouterImpl, externalLinkRouterImpl, moduleRouterImpl, serverRouterImpl, apiTokenRouterImpl, k8sCapacityRouterImpl, webhookHelmRouterImpl, userAttributesRouterImpl, telemetryRouterImpl, userTerminalAccessRouterImpl, attributesRouterImpl, appRouterEAModeImpl, rbacRoleRouterImpl, argoApplicationRouterImpl, fluxApplicationRouterImpl) mainApp := NewApp(db, sessionManager, muxRouter, telemetryEventClientImpl, posthogClient, sugaredLogger) return mainApp, nil } diff --git a/pkg/appStore/installedApp/service/FullMode/resource/ResourceTreeService.go b/pkg/appStore/installedApp/service/FullMode/resource/ResourceTreeService.go index 6c91f3f446..87bb7dc44f 100644 --- a/pkg/appStore/installedApp/service/FullMode/resource/ResourceTreeService.go +++ b/pkg/appStore/installedApp/service/FullMode/resource/ResourceTreeService.go @@ -280,7 +280,7 @@ func (impl *InstalledAppResourceServiceImpl) fetchResourceTreeForACD(rctx contex }, } clusterIdString := strconv.Itoa(clusterId) - validRequest := impl.k8sCommonService.FilterK8sResources(rctx, resourceTree, k8sAppDetail, clusterIdString, []string{commonBean.ServiceKind, commonBean.EndpointsKind, commonBean.IngressKind}) + validRequest := impl.k8sCommonService.FilterK8sResources(rctx, resourceTree, k8sAppDetail, clusterIdString, []string{commonBean.ServiceKind, commonBean.EndpointsKind, commonBean.IngressKind}, "") response, err := impl.k8sCommonService.GetManifestsByBatch(rctx, validRequest) if err != nil { impl.logger.Errorw("error in getting manifest by batch", "err", err, "clusterId", clusterIdString) diff --git a/pkg/argoApplication/ArgoApplicationService.go b/pkg/argoApplication/ArgoApplicationService.go index eaafea66ef..e75272b84f 100644 --- a/pkg/argoApplication/ArgoApplicationService.go +++ b/pkg/argoApplication/ArgoApplicationService.go @@ -21,6 +21,7 @@ import ( "encoding/json" "fmt" "github.com/devtron-labs/devtron/api/helm-app/gRPC" + openapi "github.com/devtron-labs/devtron/api/helm-app/openapiClient" "github.com/devtron-labs/devtron/api/helm-app/service" "github.com/devtron-labs/common-lib/utils/k8s" @@ -43,6 +44,8 @@ type ArgoApplicationService interface { clusterWithApplicationObject clusterRepository.Cluster, clusterServerUrlIdMap map[string]int) (*rest.Config, error) GetClusterConfigFromAllClusters(clusterId int) (*k8s.ClusterConfig, clusterRepository.Cluster, map[string]int, error) GetRestConfigForExternalArgo(ctx context.Context, clusterId int, externalArgoApplicationName string) (*rest.Config, error) + HibernateArgoApplication(ctx context.Context, app *bean.ArgoAppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) + UnHibernateArgoApplication(ctx context.Context, app *bean.ArgoAppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) } type ArgoApplicationServiceImpl struct { @@ -50,13 +53,14 @@ type ArgoApplicationServiceImpl struct { clusterRepository clusterRepository.ClusterRepository k8sUtil *k8s.K8sServiceImpl argoUserService argo.ArgoUserService + helmAppClient gRPC.HelmAppClient helmAppService service.HelmAppService } func NewArgoApplicationServiceImpl(logger *zap.SugaredLogger, clusterRepository clusterRepository.ClusterRepository, k8sUtil *k8s.K8sServiceImpl, - argoUserService argo.ArgoUserService, + argoUserService argo.ArgoUserService, helmAppClient gRPC.HelmAppClient, helmAppService service.HelmAppService) *ArgoApplicationServiceImpl { return &ArgoApplicationServiceImpl{ logger: logger, @@ -64,6 +68,7 @@ func NewArgoApplicationServiceImpl(logger *zap.SugaredLogger, k8sUtil: k8sUtil, argoUserService: argoUserService, helmAppService: helmAppService, + helmAppClient: helmAppClient, } } @@ -450,3 +455,41 @@ func (impl *ArgoApplicationServiceImpl) GetRestConfigForExternalArgo(ctx context } return restConfig, nil } + +func (impl *ArgoApplicationServiceImpl) HibernateArgoApplication(ctx context.Context, app *bean.ArgoAppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { + _, clusterBean, _, err := impl.GetClusterConfigFromAllClusters(app.ClusterId) + if err != nil { + impl.logger.Errorw("HibernateArgoApplication", "error in getting the cluster config", err, "clusterId", app.ClusterId, "appName", app.AppName) + return nil, err + } + conf := ConvertClusterBeanToGrpcConfig(clusterBean) + + req := service.HibernateReqAdaptor(hibernateRequest) + req.ClusterConfig = conf + res, err := impl.helmAppClient.Hibernate(ctx, req) + if err != nil { + impl.logger.Errorw("HibernateArgoApplication", "error in hibernating the requested resource", err, "clusterId", app.ClusterId, "appName", app.AppName) + return nil, err + } + response := service.HibernateResponseAdaptor(res.Status) + return response, nil +} + +func (impl *ArgoApplicationServiceImpl) UnHibernateArgoApplication(ctx context.Context, app *bean.ArgoAppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { + _, clusterBean, _, err := impl.GetClusterConfigFromAllClusters(app.ClusterId) + if err != nil { + impl.logger.Errorw("HibernateArgoApplication", "error in getting the cluster config", err, "clusterId", app.ClusterId, "appName", app.AppName) + return nil, err + } + conf := ConvertClusterBeanToGrpcConfig(clusterBean) + + req := service.HibernateReqAdaptor(hibernateRequest) + req.ClusterConfig = conf + res, err := impl.helmAppClient.UnHibernate(ctx, req) + if err != nil { + impl.logger.Errorw("UnHibernateArgoApplication", "error in unHibernating the requested resources", err, "clusterId", app.ClusterId, "appName", app.AppName) + return nil, err + } + response := service.HibernateResponseAdaptor(res.Status) + return response, nil +} diff --git a/pkg/argoApplication/bean/bean.go b/pkg/argoApplication/bean/bean.go index 4fb2b1bcbc..899eff0f6c 100644 --- a/pkg/argoApplication/bean/bean.go +++ b/pkg/argoApplication/bean/bean.go @@ -80,3 +80,9 @@ type ArgoClusterConfigObj struct { CaData string `json:"caData,omitempty"` } `json:"tlsClientConfig"` } + +type ArgoAppIdentifier struct { + ClusterId int `json:"clusterId"` + Namespace string `json:"namespace"` + AppName string `json:"appName"` +} diff --git a/pkg/argoApplication/helper.go b/pkg/argoApplication/helper.go new file mode 100644 index 0000000000..97a80e2c4d --- /dev/null +++ b/pkg/argoApplication/helper.go @@ -0,0 +1,47 @@ +package argoApplication + +import ( + "fmt" + "github.com/devtron-labs/common-lib/utils/k8s" + "github.com/devtron-labs/devtron/api/helm-app/gRPC" + "github.com/devtron-labs/devtron/pkg/argoApplication/bean" + "github.com/devtron-labs/devtron/pkg/cluster/repository" + "strconv" + "strings" +) + +func DecodeExternalArgoAppId(appId string) (*bean.ArgoAppIdentifier, error) { + component := strings.Split(appId, "|") + if len(component) != 3 { + return nil, fmt.Errorf("malformed app id %s", appId) + } + clusterId, err := strconv.Atoi(component[0]) + if err != nil { + return nil, err + } + if clusterId <= 0 { + return nil, fmt.Errorf("target cluster is not provided") + } + return &bean.ArgoAppIdentifier{ + ClusterId: clusterId, + Namespace: component[1], + AppName: component[2], + }, nil +} + +func ConvertClusterBeanToGrpcConfig(cluster repository.Cluster) *gRPC.ClusterConfig { + config := &gRPC.ClusterConfig{ + ApiServerUrl: cluster.ServerUrl, + Token: cluster.Config[k8s.BearerToken], + ClusterId: int32(cluster.Id), + ClusterName: cluster.ClusterName, + InsecureSkipTLSVerify: cluster.InsecureSkipTlsVerify, + } + if cluster.InsecureSkipTlsVerify == false { + config.KeyData = cluster.Config[k8s.TlsKey] + config.CertData = cluster.Config[k8s.CertData] + config.CaData = cluster.Config[k8s.CertificateAuthorityData] + } + return config + +} diff --git a/pkg/fluxApplication/FluxApplicationService.go b/pkg/fluxApplication/FluxApplicationService.go new file mode 100644 index 0000000000..2b03fa1665 --- /dev/null +++ b/pkg/fluxApplication/FluxApplicationService.go @@ -0,0 +1,189 @@ +package fluxApplication + +import ( + "context" + "fmt" + "github.com/devtron-labs/common-lib/utils/k8s" + "github.com/devtron-labs/devtron/api/connector" + "github.com/devtron-labs/devtron/api/helm-app/gRPC" + openapi "github.com/devtron-labs/devtron/api/helm-app/openapiClient" + "github.com/devtron-labs/devtron/api/helm-app/service" + "github.com/devtron-labs/devtron/pkg/cluster" + "github.com/devtron-labs/devtron/pkg/fluxApplication/bean" + "github.com/gogo/protobuf/proto" + "go.opentelemetry.io/otel" + "go.uber.org/zap" + "net/http" +) + +type FluxApplicationService interface { + ListFluxApplications(ctx context.Context, clusterIds []int, w http.ResponseWriter) + GetFluxAppDetail(ctx context.Context, app *bean.FluxAppIdentifier) (*bean.FluxApplicationDetailDto, error) + HibernateFluxApplication(ctx context.Context, app *bean.FluxAppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) + UnHibernateFluxApplication(ctx context.Context, app *bean.FluxAppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) +} + +type FluxApplicationServiceImpl struct { + logger *zap.SugaredLogger + helmAppService service.HelmAppService + clusterService cluster.ClusterService + helmAppClient gRPC.HelmAppClient + pump connector.Pump +} + +func NewFluxApplicationServiceImpl(logger *zap.SugaredLogger, + helmAppService service.HelmAppService, + clusterService cluster.ClusterService, + helmAppClient gRPC.HelmAppClient, pump connector.Pump) *FluxApplicationServiceImpl { + return &FluxApplicationServiceImpl{ + logger: logger, + helmAppService: helmAppService, + clusterService: clusterService, + helmAppClient: helmAppClient, + pump: pump, + } + +} +func (impl *FluxApplicationServiceImpl) HibernateFluxApplication(ctx context.Context, app *bean.FluxAppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { + conf, err := impl.helmAppService.GetClusterConf(app.ClusterId) + if err != nil { + impl.logger.Errorw("HibernateFluxApplication", "error in getting the cluster config", err, "clusterId", app.ClusterId, "appName", app.Name) + return nil, err + } + req := service.HibernateReqAdaptor(hibernateRequest) + req.ClusterConfig = conf + res, err := impl.helmAppClient.Hibernate(ctx, req) + if err != nil { + impl.logger.Errorw("HibernateFluxApplication", "error in hibernating the requested resource", err, "clusterId", app.ClusterId, "appName", app.Name) + return nil, err + } + response := service.HibernateResponseAdaptor(res.Status) + return response, nil +} + +func (impl *FluxApplicationServiceImpl) UnHibernateFluxApplication(ctx context.Context, app *bean.FluxAppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) { + + conf, err := impl.helmAppService.GetClusterConf(app.ClusterId) + if err != nil { + impl.logger.Errorw("UnHibernateFluxApplication", "error in getting the cluster config", err, "clusterId", app.ClusterId, "appName", app.Name) + return nil, err + } + req := service.HibernateReqAdaptor(hibernateRequest) + req.ClusterConfig = conf + res, err := impl.helmAppClient.UnHibernate(ctx, req) + if err != nil { + impl.logger.Errorw("UnHibernateFluxApplication", "error in unHibernating the requested resources", err, "clusterId", app.ClusterId, "appName", app.Name) + return nil, err + } + response := service.HibernateResponseAdaptor(res.Status) + return response, nil +} + +func (impl *FluxApplicationServiceImpl) ListFluxApplications(ctx context.Context, clusterIds []int, w http.ResponseWriter) { + appStream, err := impl.listApplications(ctx, clusterIds) + + impl.pump.StartStreamWithTransformer(w, func() (proto.Message, error) { + return appStream.Recv() + }, err, + func(message interface{}) interface{} { + return impl.appListRespProtoTransformer(message.(*gRPC.FluxApplicationList)) + }) +} +func (impl *FluxApplicationServiceImpl) GetFluxAppDetail(ctx context.Context, app *bean.FluxAppIdentifier) (*bean.FluxApplicationDetailDto, error) { + config, err := impl.helmAppService.GetClusterConf(app.ClusterId) + if err != nil { + impl.logger.Errorw("error in getting cluster config", "appIdentifier", app, "err", err) + return nil, fmt.Errorf("failed to get cluster config for app %s in namespace %s: %w", app.Name, app.Namespace, err) + } + fluxDetailResponse, err := impl.getFluxAppDetailTree(ctx, config, app) + if err != nil { + impl.logger.Errorw("error in getting Flux app detail tree", "appIdentifier", app, "err", err) + return nil, fmt.Errorf("failed to get Flux app detail tree for app %s in namespace %s: %w", app.Name, app.Namespace, err) + } + + appDetail := &bean.FluxApplicationDetailDto{ + FluxApplication: &bean.FluxApplication{ + Name: app.Name, + SyncStatus: fluxDetailResponse.FluxApplication.SyncStatus, + HealthStatus: fluxDetailResponse.FluxApplication.HealthStatus, + Namespace: app.Namespace, + ClusterId: app.ClusterId, + FluxAppDeploymentType: fluxDetailResponse.FluxApplication.FluxAppDeploymentType, + ClusterName: fluxDetailResponse.FluxApplication.EnvironmentDetail.GetClusterName(), + }, + FluxAppStatusDetail: &bean.FluxAppStatusDetail{ + Status: fluxDetailResponse.FluxAppStatusDetail.GetStatus(), + Reason: fluxDetailResponse.FluxAppStatusDetail.GetReason(), + Message: fluxDetailResponse.FluxAppStatusDetail.GetMessage(), + }, + ResourceTreeResponse: fluxDetailResponse.ResourceTreeResponse, + } + + return appDetail, nil +} +func (impl *FluxApplicationServiceImpl) listApplications(ctx context.Context, clusterIds []int) (gRPC.ApplicationService_ListFluxApplicationsClient, error) { + var err error + req := &gRPC.AppListRequest{} + if len(clusterIds) == 0 { + return nil, nil + } + _, span := otel.Tracer("clusterService").Start(ctx, "FindByIds") + clusters, err := impl.clusterService.FindByIds(clusterIds) + span.End() + if err != nil { + impl.logger.Errorw("error in fetching cluster detail", "err", err) + return nil, err + } + + for _, clusterDetail := range clusters { + config := &gRPC.ClusterConfig{ + ApiServerUrl: clusterDetail.ServerUrl, + Token: clusterDetail.Config[k8s.BearerToken], + ClusterId: int32(clusterDetail.Id), + ClusterName: clusterDetail.ClusterName, + InsecureSkipTLSVerify: clusterDetail.InsecureSkipTLSVerify, + } + if clusterDetail.InsecureSkipTLSVerify == false { + config.KeyData = clusterDetail.Config[k8s.TlsKey] + config.CertData = clusterDetail.Config[k8s.CertData] + config.CaData = clusterDetail.Config[k8s.CertificateAuthorityData] + } + req.Clusters = append(req.Clusters, config) + } + applicationStream, err := impl.helmAppClient.ListFluxApplication(ctx, req) + + return applicationStream, err +} +func (impl *FluxApplicationServiceImpl) appListRespProtoTransformer(deployedApps *gRPC.FluxApplicationList) bean.FluxAppList { + appList := bean.FluxAppList{ClusterId: &[]int32{deployedApps.ClusterId}} + if deployedApps.Errored { + appList.Errored = &deployedApps.Errored + appList.ErrorMsg = &deployedApps.ErrorMsg + } else { + fluxApps := make([]bean.FluxApplication, 0, len(deployedApps.FluxApplication)) + for _, deployedapp := range deployedApps.FluxApplication { + fluxApp := bean.FluxApplication{ + Name: deployedapp.Name, + HealthStatus: deployedapp.HealthStatus, + SyncStatus: deployedapp.SyncStatus, + ClusterId: int(deployedapp.EnvironmentDetail.ClusterId), + ClusterName: deployedapp.EnvironmentDetail.ClusterName, + Namespace: deployedapp.EnvironmentDetail.Namespace, + FluxAppDeploymentType: deployedapp.FluxAppDeploymentType, + } + fluxApps = append(fluxApps, fluxApp) + } + appList.FluxApps = &fluxApps + } + + return appList +} +func (impl *FluxApplicationServiceImpl) getFluxAppDetailTree(ctx context.Context, config *gRPC.ClusterConfig, appIdentifier *bean.FluxAppIdentifier) (*gRPC.FluxAppDetail, error) { + req := &gRPC.FluxAppDetailRequest{ + ClusterConfig: config, + Namespace: appIdentifier.Namespace, + Name: appIdentifier.Name, + IsKustomizeApp: appIdentifier.IsKustomizeApp, + } + return impl.helmAppClient.GetExternalFluxAppDetail(ctx, req) +} diff --git a/pkg/fluxApplication/bean/bean.go b/pkg/fluxApplication/bean/bean.go new file mode 100644 index 0000000000..1d3c74dbc3 --- /dev/null +++ b/pkg/fluxApplication/bean/bean.go @@ -0,0 +1,43 @@ +package bean + +import "github.com/devtron-labs/devtron/api/helm-app/gRPC" + +type FluxApplicationListDto struct { + ClusterId int `json:"clusterId"` + FluxAppDto []*FluxApplication +} +type FluxApplication struct { + Name string `json:"appName"` + HealthStatus string `json:"appStatus"` + SyncStatus string `json:"syncStatus"` + ClusterId int `json:"clusterId"` + ClusterName string `json:"clusterName"` + Namespace string `json:"namespace"` + FluxAppDeploymentType string `json:"fluxAppDeploymentType"` +} + +type FluxAppList struct { + ClusterId *[]int32 `json:"clusterIds,omitempty"` + FluxApps *[]FluxApplication `json:"fluxApplication,omitempty"` + Errored *bool `json:"errored,omitempty"` + ErrorMsg *string `json:"errorMsg,omitempty"` +} + +type FluxAppIdentifier struct { + Namespace string `json:"namespace"` + Name string `json:"name"` + ClusterId int `json:"clusterId"` + IsKustomizeApp bool `json:"isKustomizeApp"` +} + +type FluxApplicationDetailDto struct { + *FluxApplication + FluxAppStatusDetail *FluxAppStatusDetail + ResourceTreeResponse *gRPC.ResourceTreeResponse `json:"resourceTree"` +} + +type FluxAppStatusDetail struct { + Status string `json:"status"` + Message string `json:"message"` + Reason string `json:"reason"` +} diff --git a/pkg/fluxApplication/helper.go b/pkg/fluxApplication/helper.go new file mode 100644 index 0000000000..5068d9ed29 --- /dev/null +++ b/pkg/fluxApplication/helper.go @@ -0,0 +1,47 @@ +package fluxApplication + +import ( + "fmt" + "github.com/devtron-labs/devtron/pkg/fluxApplication/bean" + "strconv" + "strings" +) + +/* +* appIdString contains four fields, separated by '|': +* 1. clusterId: The ID of the cluster, which is an integer value +* 2. namespace: The namespace, which is a string. +* 3. appName: The name of the Flux application (either Kustomization or HelmRelease), which is a string. +* 4. isKustomize: A boolean value indicating whether the application is of type Kustomization (true) or HelmRelease (false). +* +* +* Example: "123|my-namespace|my-app|true" +* - clusterId: "123" +* - namespace: "my-namespace" +* - appName: "my-app" +* - isKustomization: true + */ + +func DecodeFluxExternalAppId(appId string) (*bean.FluxAppIdentifier, error) { + component := strings.Split(appId, "|") + if len(component) != 4 { + return nil, fmt.Errorf("malformed app id %s", appId) + } + clusterId, err := strconv.Atoi(component[0]) + if err != nil { + return nil, err + } + isKustomizeApp, err := strconv.ParseBool(component[3]) + if err != nil { + return nil, err + } + if clusterId <= 0 { + return nil, fmt.Errorf("target cluster is not provided") + } + return &bean.FluxAppIdentifier{ + ClusterId: clusterId, + Namespace: component[1], + Name: component[2], + IsKustomizeApp: isKustomizeApp, + }, nil +} diff --git a/pkg/k8s/K8sCommonService.go b/pkg/k8s/K8sCommonService.go index e9d55b3603..3d97d2b9ae 100644 --- a/pkg/k8s/K8sCommonService.go +++ b/pkg/k8s/K8sCommonService.go @@ -51,12 +51,13 @@ type K8sCommonService interface { ListEvents(ctx context.Context, request *ResourceRequestBean) (*k8s.EventsResponse, error) GetRestConfigByClusterId(ctx context.Context, clusterId int) (*rest.Config, error, *cluster.ClusterBean) GetManifestsByBatch(ctx context.Context, request []ResourceRequestBean) ([]BatchResourceResponse, error) - FilterK8sResources(ctx context.Context, resourceTreeInf map[string]interface{}, appDetail bean.AppDetailContainer, appId string, kindsToBeFiltered []string) []ResourceRequestBean + FilterK8sResources(ctx context.Context, resourceTreeInf map[string]interface{}, appDetail bean.AppDetailContainer, appId string, kindsToBeFiltered []string, externalArgoAppName string) []ResourceRequestBean RotatePods(ctx context.Context, request *RotatePodRequest) (*RotatePodResponse, error) GetCoreClientByClusterId(clusterId int) (*kubernetes.Clientset, *v1.CoreV1Client, error) GetCoreClientByClusterIdForExternalArgoApps(req *cluster.EphemeralContainerRequest) (*kubernetes.Clientset, *v1.CoreV1Client, error) GetK8sServerVersion(clusterId int) (*version.Info, error) PortNumberExtraction(resp []BatchResourceResponse, resourceTree map[string]interface{}) map[string]interface{} + GetRestConfigOfCluster(ctx context.Context, request *ResourceRequestBean) (*rest.Config, error) GetK8sConfigAndClients(ctx context.Context, cluster *cluster.ClusterBean) (*rest.Config, *http.Client, *kubernetes.Clientset, error) GetK8sConfigAndClientsByClusterId(ctx context.Context, clusterId int) (*rest.Config, *http.Client, *kubernetes.Clientset, error) GetPreferredVersionForAPIGroup(ctx context.Context, clusterId int, groupName string) (string, error) @@ -95,23 +96,13 @@ func (impl *K8sCommonServiceImpl) GetResource(ctx context.Context, request *Reso clusterId := request.ClusterId //getting rest config by clusterId resourceIdentifier := request.K8sRequest.ResourceIdentifier - var restConfigFinal *rest.Config - if len(request.ExternalArgoApplicationName) > 0 { - restConfig, err := impl.argoApplicationService.GetRestConfigForExternalArgo(ctx, clusterId, request.ExternalArgoApplicationName) - if err != nil { - impl.logger.Errorw("error in getting rest config", "err", err, "clusterId", clusterId, "externalArgoApplicationName", request.ExternalArgoApplicationName) - return nil, err - } - restConfigFinal = restConfig - } else { - restConfig, err, _ := impl.GetRestConfigByClusterId(ctx, clusterId) - if err != nil { - impl.logger.Errorw("error in getting rest config by cluster Id", "err", err, "clusterId", clusterId) - return nil, err - } - restConfigFinal = restConfig + + restConfig, err := impl.GetRestConfigOfCluster(ctx, request) + if err != nil { + impl.logger.Errorw("error in getting rest config", "err", err, "clusterId", clusterId, "externalArgoApplicationName", request.ExternalArgoApplicationName) + return nil, err } - resp, err := impl.K8sUtil.GetResource(ctx, resourceIdentifier.Namespace, resourceIdentifier.Name, resourceIdentifier.GroupVersionKind, restConfigFinal) + resp, err := impl.K8sUtil.GetResource(ctx, resourceIdentifier.Namespace, resourceIdentifier.Name, resourceIdentifier.GroupVersionKind, restConfig) if err != nil { impl.logger.Errorw("error in getting resource", "err", err, "resource", resourceIdentifier.Name) return nil, err @@ -125,12 +116,14 @@ func (impl *K8sCommonServiceImpl) GetResource(ctx context.Context, request *Reso func (impl *K8sCommonServiceImpl) UpdateResource(ctx context.Context, request *ResourceRequestBean) (*k8s.ManifestResponse, error) { //getting rest config by clusterId clusterId := request.ClusterId - restConfig, err, _ := impl.GetRestConfigByClusterId(ctx, clusterId) + + resourceIdentifier := request.K8sRequest.ResourceIdentifier + + restConfig, err := impl.GetRestConfigOfCluster(ctx, request) if err != nil { - impl.logger.Errorw("error in getting rest config by cluster Id", "err", err, "clusterId", clusterId) + impl.logger.Errorw("error in getting rest config", "err", err, "clusterId", clusterId, "externalArgoApplicationName", request.ExternalArgoApplicationName) return nil, err } - resourceIdentifier := request.K8sRequest.ResourceIdentifier resp, err := impl.K8sUtil.UpdateResource(ctx, restConfig, resourceIdentifier.GroupVersionKind, resourceIdentifier.Namespace, request.K8sRequest.Patch) if err != nil { impl.logger.Errorw("error in updating resource", "err", err, "clusterId", clusterId) @@ -142,13 +135,32 @@ func (impl *K8sCommonServiceImpl) UpdateResource(ctx context.Context, request *R } return resp, nil } +func (impl *K8sCommonServiceImpl) GetRestConfigOfCluster(ctx context.Context, request *ResourceRequestBean) (*rest.Config, error) { + //getting rest config by clusterId + clusterId := request.ClusterId + if len(request.ExternalArgoApplicationName) > 0 { + restConfig, err := impl.argoApplicationService.GetRestConfigForExternalArgo(ctx, clusterId, request.ExternalArgoApplicationName) + if err != nil { + impl.logger.Errorw("error in getting rest config", "err", err, "clusterId", clusterId, "externalArgoApplicationName", request.ExternalArgoApplicationName) + return nil, err + } + return restConfig, nil + } else { + restConfig, err, _ := impl.GetRestConfigByClusterId(ctx, clusterId) + if err != nil { + impl.logger.Errorw("error in getting rest config by cluster Id", "err", err, "clusterId", clusterId) + return nil, err + } + return restConfig, nil + } +} func (impl *K8sCommonServiceImpl) DeleteResource(ctx context.Context, request *ResourceRequestBean) (*k8s.ManifestResponse, error) { //getting rest config by clusterId clusterId := request.ClusterId - restConfig, err, _ := impl.GetRestConfigByClusterId(ctx, clusterId) + restConfig, err := impl.GetRestConfigOfCluster(ctx, request) if err != nil { - impl.logger.Errorw("error in getting rest config by cluster Id", "err", err, "clusterId", clusterId) + impl.logger.Errorw("error in getting rest config", "err", err, "clusterId", clusterId, "externalArgoApplicationName", request.ExternalArgoApplicationName) return nil, err } resourceIdentifier := request.K8sRequest.ResourceIdentifier @@ -161,34 +173,23 @@ func (impl *K8sCommonServiceImpl) DeleteResource(ctx context.Context, request *R } func (impl *K8sCommonServiceImpl) ListEvents(ctx context.Context, request *ResourceRequestBean) (*k8s.EventsResponse, error) { - clusterId := request.ClusterId resourceIdentifier := request.K8sRequest.ResourceIdentifier - var restConfigFinal *rest.Config - if len(request.ExternalArgoApplicationName) > 0 { - restConfig, err := impl.argoApplicationService.GetRestConfigForExternalArgo(ctx, clusterId, request.ExternalArgoApplicationName) - if err != nil { - impl.logger.Errorw("error in getting rest config", "err", err, "clusterId", clusterId, "externalArgoApplicationName", request.ExternalArgoApplicationName) - return nil, err - } - restConfigFinal = restConfig - } else { - restConfig, err, _ := impl.GetRestConfigByClusterId(ctx, clusterId) - if err != nil { - impl.logger.Errorw("error in getting rest config by cluster Id", "err", err, "clusterId", clusterId) - return nil, err - } - restConfigFinal = restConfig + restConfig, err := impl.GetRestConfigOfCluster(ctx, request) + if err != nil { + impl.logger.Errorw("error in getting rest config", "err", err, "clusterId", request.ClusterId, "externalArgoApplicationName", request.ExternalArgoApplicationName) + return nil, err } - list, err := impl.K8sUtil.ListEvents(restConfigFinal, resourceIdentifier.Namespace, resourceIdentifier.GroupVersionKind, ctx, resourceIdentifier.Name) + + list, err := impl.K8sUtil.ListEvents(restConfig, resourceIdentifier.Namespace, resourceIdentifier.GroupVersionKind, ctx, resourceIdentifier.Name) if err != nil { - impl.logger.Errorw("error in listing events", "err", err, "clusterId", clusterId) + impl.logger.Errorw("error in listing events", "err", err, "clusterId", request.ClusterId) return nil, err } return &k8s.EventsResponse{list}, nil } -func (impl *K8sCommonServiceImpl) FilterK8sResources(ctx context.Context, resourceTree map[string]interface{}, appDetail bean.AppDetailContainer, appId string, kindsToBeFiltered []string) []ResourceRequestBean { +func (impl *K8sCommonServiceImpl) FilterK8sResources(ctx context.Context, resourceTree map[string]interface{}, appDetail bean.AppDetailContainer, appId string, kindsToBeFiltered []string, externalArgoAppName string) []ResourceRequestBean { validRequests := make([]ResourceRequestBean, 0) kindsToBeFilteredMap := util.ConvertStringSliceToMap(kindsToBeFiltered) resourceTreeNodes, ok := resourceTree["nodes"] @@ -227,6 +228,7 @@ func (impl *K8sCommonServiceImpl) FilterK8sResources(ctx context.Context, resour }, }, }, + ExternalArgoApplicationName: externalArgoAppName, } validRequests = append(validRequests, req) } diff --git a/pkg/k8s/application/bean/bean.go b/pkg/k8s/application/bean/bean.go index cdf71e5cdb..7afd74a0a3 100644 --- a/pkg/k8s/application/bean/bean.go +++ b/pkg/k8s/application/bean/bean.go @@ -20,6 +20,10 @@ import ( "github.com/devtron-labs/common-lib/utils/k8s" ) +const ( + InvalidAppId = "invalid app id" + AppIdDecodingError = "error in decoding appId" +) const ( DEFAULT_NAMESPACE = "default" EVENT_K8S_KIND = "Event" @@ -32,9 +36,11 @@ const ( DevtronAppType = 0 // Identifier for Devtron Apps HelmAppType = 1 // Identifier for Helm Apps ArgoAppType = 2 + FluxAppType = 3 //Identifier for Flux Apps // Deployment Type Identifiers HelmInstalledType = 0 // Identifier for Helm deployment ArgoInstalledType = 1 // Identifier for ArgoCD deployment + FluxInstalledType = 2 //identifier for fluxCd Deployment ) const ( diff --git a/pkg/k8s/application/k8sApplicationService.go b/pkg/k8s/application/k8sApplicationService.go index 1141b9c551..39b1902b17 100644 --- a/pkg/k8s/application/k8sApplicationService.go +++ b/pkg/k8s/application/k8sApplicationService.go @@ -25,8 +25,11 @@ import ( "github.com/devtron-labs/devtron/api/helm-app/gRPC" client "github.com/devtron-labs/devtron/api/helm-app/service" "github.com/devtron-labs/devtron/api/helm-app/service/bean" + bean4 "github.com/devtron-labs/devtron/pkg/argoApplication/bean" "github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin" clientErrors "github.com/devtron-labs/devtron/pkg/errors" + "github.com/devtron-labs/devtron/pkg/fluxApplication" + bean2 "github.com/devtron-labs/devtron/pkg/fluxApplication/bean" "io" v1 "k8s.io/client-go/kubernetes/typed/core/v1" "net/http" @@ -86,6 +89,8 @@ type K8sApplicationService interface { RecreateResource(ctx context.Context, request *k8s.ResourceRequestBean) (*k8s2.ManifestResponse, error) DeleteResourceWithAudit(ctx context.Context, request *k8s.ResourceRequestBean, userId int32) (*k8s2.ManifestResponse, error) GetUrlsByBatchForIngress(ctx context.Context, resp []k8s.BatchResourceResponse) []interface{} + ValidateFluxResourceRequest(ctx context.Context, appIdentifier *bean2.FluxAppIdentifier, request *k8s2.K8sRequestBean) (bool, error) + ValidateArgoResourceRequest(ctx context.Context, appIdentifier *bean4.ArgoAppIdentifier, request *k8s2.K8sRequestBean) (bool, error) } type K8sApplicationServiceImpl struct { @@ -102,13 +107,14 @@ type K8sApplicationServiceImpl struct { ephemeralContainerRepository repository.EphemeralContainersRepository ephemeralContainerConfig *EphemeralContainerConfig argoApplicationService argoApplication.ArgoApplicationService + fluxApplicationService fluxApplication.FluxApplicationService } func NewK8sApplicationServiceImpl(Logger *zap.SugaredLogger, clusterService cluster.ClusterService, pump connector.Pump, helmAppService client.HelmAppService, K8sUtil *k8s2.K8sServiceImpl, aCDAuthConfig *util3.ACDAuthConfig, K8sResourceHistoryService kubernetesResourceAuditLogs.K8sResourceHistoryService, k8sCommonService k8s.K8sCommonService, terminalSession terminal.TerminalSessionHandler, ephemeralContainerService cluster.EphemeralContainerService, ephemeralContainerRepository repository.EphemeralContainersRepository, - argoApplicationService argoApplication.ArgoApplicationService) (*K8sApplicationServiceImpl, error) { + argoApplicationService argoApplication.ArgoApplicationService, fluxApplicationService fluxApplication.FluxApplicationService) (*K8sApplicationServiceImpl, error) { ephemeralContainerConfig := &EphemeralContainerConfig{} err := env.Parse(ephemeralContainerConfig) if err != nil { @@ -129,6 +135,7 @@ func NewK8sApplicationServiceImpl(Logger *zap.SugaredLogger, clusterService clus ephemeralContainerRepository: ephemeralContainerRepository, ephemeralContainerConfig: ephemeralContainerConfig, argoApplicationService: argoApplicationService, + fluxApplicationService: fluxApplicationService, }, nil } @@ -181,6 +188,13 @@ func (impl *K8sApplicationServiceImpl) ValidatePodLogsRequestQuery(r *http.Reque } sinceTime = metav1.Unix(sinceTimeVar, 0) } + + namespace := v.Get("namespace") + if namespace == "" { + err = fmt.Errorf("missing required field namespace") + impl.logger.Errorw("empty namespace", "err", err, "appId", request.AppId) + return nil, err + } containerName, clusterIdString := v.Get("containerName"), v.Get("clusterId") prevContainerLogs := v.Get("previous") isPrevLogs, err := strconv.ParseBool(prevContainerLogs) @@ -220,43 +234,59 @@ func (impl *K8sApplicationServiceImpl) ValidatePodLogsRequestQuery(r *http.Reque } request.K8sRequest = k8sRequest if appId != "" { - if len(appTypeStr) > 0 && !(appType == bean3.DevtronAppType || appType == bean3.HelmAppType || appType == bean3.ArgoAppType) { + if len(appTypeStr) > 0 && !request.IsValidAppType() { impl.logger.Errorw("Invalid appType", "err", err, "appType", appType) return nil, err } // Validate Deployment Type deploymentType, err := strconv.Atoi(v.Get("deploymentType")) - if err != nil || !(deploymentType == bean3.HelmInstalledType || deploymentType == bean3.ArgoInstalledType) { + if err != nil || !request.IsValidDeploymentType() { impl.logger.Errorw("Invalid deploymentType", "err", err, "deploymentType", deploymentType) return nil, err } + + //handle the ns coming for the requested resource request.DeploymentType = deploymentType // Validate App Id - if request.AppType == bean3.HelmAppType { + if request.AppType == bean3.ArgoAppType { + appIdentifier, err := argoApplication.DecodeExternalArgoAppId(appId) + if err != nil { + impl.logger.Errorw(bean3.AppIdDecodingError, "err", err, "appId", appId) + return nil, err + } + + request.ClusterId = appIdentifier.ClusterId + request.K8sRequest.ResourceIdentifier.Namespace = namespace + request.AppId = appId + } else if request.AppType == bean3.HelmAppType { // For Helm App resources appIdentifier, err := impl.helmAppService.DecodeAppId(appId) if err != nil { - impl.logger.Errorw("error in decoding appId", "err", err, "appId", appId) + impl.logger.Errorw(bean3.AppIdDecodingError, "err", err, "appId", appId) return nil, err } request.AppIdentifier = appIdentifier request.ClusterId = appIdentifier.ClusterId - request.K8sRequest.ResourceIdentifier.Namespace = appIdentifier.Namespace + request.K8sRequest.ResourceIdentifier.Namespace = namespace } else if request.AppType == bean3.DevtronAppType { // For Devtron App resources devtronAppIdentifier, err := impl.DecodeDevtronAppId(appId) if err != nil { - impl.logger.Errorw("error in decoding appId", "err", err, "appId", request.AppId) + impl.logger.Errorw(bean3.AppIdDecodingError, "err", err, "appId", request.AppId) return nil, err } request.DevtronAppIdentifier = devtronAppIdentifier request.ClusterId = devtronAppIdentifier.ClusterId - namespace := v.Get("namespace") - if namespace == "" { - err = fmt.Errorf("missing required field namespace") - impl.logger.Errorw("empty namespace", "err", err, "appId", request.AppId) + request.K8sRequest.ResourceIdentifier.Namespace = namespace + } else if request.AppType == bean3.FluxAppType { + // For flux App resources + appIdentifier, err := fluxApplication.DecodeFluxExternalAppId(appId) + if err != nil { + impl.logger.Errorw(bean3.AppIdDecodingError, "err", err, "appId", appId) return nil, err } + request.ExternalFluxAppIdentifier = appIdentifier + request.ClusterId = appIdentifier.ClusterId request.K8sRequest.ResourceIdentifier.Namespace = namespace } } else if clusterIdString != "" { @@ -267,12 +297,6 @@ func (impl *K8sApplicationServiceImpl) ValidatePodLogsRequestQuery(r *http.Reque return nil, err } request.ClusterId = clusterId - namespace := v.Get("namespace") - if namespace == "" { - err = fmt.Errorf("missing required field namespace") - impl.logger.Errorw("empty namespace", "err", err, "appId", request.AppId) - return nil, err - } request.K8sRequest.ResourceIdentifier.Namespace = namespace request.K8sRequest.ResourceIdentifier.GroupVersionKind = schema.GroupVersionKind{ Group: "", @@ -292,20 +316,21 @@ func (impl *K8sApplicationServiceImpl) ValidateTerminalRequestQuery(r *http.Requ request.PodName = vars["pod"] request.Shell = vars["shell"] resourceRequestBean := &k8s.ResourceRequestBean{} - resourceRequestBean.ExternalArgoApplicationName = v.Get("externalArgoApplicationName") identifier := vars["identifier"] if strings.Contains(identifier, "|") { // Validate App Type appType, err := strconv.Atoi(v.Get("appType")) - if err != nil || appType < bean3.DevtronAppType && appType > bean3.HelmAppType { + resourceRequestBean.AppType = appType + if err != nil || !resourceRequestBean.IsValidAppType() { impl.logger.Errorw("Invalid appType", "err", err, "appType", appType) return nil, nil, err } request.ApplicationId = identifier + if appType == bean3.HelmAppType { appIdentifier, err := impl.helmAppService.DecodeAppId(request.ApplicationId) if err != nil { - impl.logger.Errorw("invalid app id", "err", err, "appId", request.ApplicationId) + impl.logger.Errorw(bean3.InvalidAppId, "err", err, "appId", request.ApplicationId) return nil, nil, err } resourceRequestBean.AppIdentifier = appIdentifier @@ -314,22 +339,42 @@ func (impl *K8sApplicationServiceImpl) ValidateTerminalRequestQuery(r *http.Requ } else if appType == bean3.DevtronAppType { devtronAppIdentifier, err := impl.DecodeDevtronAppId(request.ApplicationId) if err != nil { - impl.logger.Errorw("invalid app id", "err", err, "appId", request.ApplicationId) + impl.logger.Errorw(bean3.InvalidAppId, "err", err, "appId", request.ApplicationId) return nil, nil, err } resourceRequestBean.DevtronAppIdentifier = devtronAppIdentifier resourceRequestBean.ClusterId = devtronAppIdentifier.ClusterId request.ClusterId = devtronAppIdentifier.ClusterId + } else if appType == bean3.FluxAppType { + fluxAppIdentifier, err := fluxApplication.DecodeFluxExternalAppId(request.ApplicationId) + if err != nil { + impl.logger.Errorw(bean3.InvalidAppId, "err", err, "appId", request.ApplicationId) + return nil, nil, err + } + resourceRequestBean.ExternalFluxAppIdentifier = fluxAppIdentifier + resourceRequestBean.ClusterId = fluxAppIdentifier.ClusterId + request.ClusterId = fluxAppIdentifier.ClusterId + + } else if appType == bean3.ArgoAppType { + appIdentifier, err := argoApplication.DecodeExternalArgoAppId(request.ApplicationId) + if err != nil { + impl.logger.Errorw(bean3.InvalidAppId, "err", err, "appId", request.ApplicationId) + return nil, nil, err + } + resourceRequestBean.ExternalArgoApplicationName = appIdentifier.AppName + resourceRequestBean.ClusterId = appIdentifier.ClusterId + request.ClusterId = appIdentifier.ClusterId + //request.ExternalArgoApplicationName = appIdentifier.AppName } } else { // Validate Cluster Id - clsuterId, err := strconv.Atoi(identifier) - if err != nil || clsuterId <= 0 { + clusterId, err := strconv.Atoi(identifier) + if err != nil || clusterId <= 0 { impl.logger.Errorw("Invalid cluster id", "err", err, "clusterId", identifier) return nil, nil, err } - resourceRequestBean.ClusterId = clsuterId - request.ClusterId = clsuterId + resourceRequestBean.ClusterId = clusterId + request.ClusterId = clusterId k8sRequest := &k8s2.K8sRequestBean{ ResourceIdentifier: k8s2.ResourceIdentifier{ Name: request.PodName, @@ -377,22 +422,12 @@ func (impl *K8sApplicationServiceImpl) GetPodLogs(ctx context.Context, request * clusterId := request.ClusterId resourceIdentifier := request.K8sRequest.ResourceIdentifier podLogsRequest := request.K8sRequest.PodLogsRequest - var restConfigFinal *rest.Config - if len(request.ExternalArgoApplicationName) > 0 { - restConfig, err := impl.argoApplicationService.GetRestConfigForExternalArgo(ctx, clusterId, request.ExternalArgoApplicationName) - if err != nil { - impl.logger.Errorw("error in getting rest config", "err", err, "clusterId", clusterId, "externalArgoApplicationName", request.ExternalArgoApplicationName) - } - restConfigFinal = restConfig - } else { - restConfig, err, _ := impl.k8sCommonService.GetRestConfigByClusterId(ctx, clusterId) - if err != nil { - impl.logger.Errorw("error in getting rest config by cluster Id", "err", err, "clusterId", clusterId) - return nil, err - } - restConfigFinal = restConfig + + restConfig, err := impl.k8sCommonService.GetRestConfigOfCluster(ctx, request) + if err != nil { + impl.logger.Errorw("error in getting rest config by clusterId", "err", err, "clusterId", clusterId, "") } - resp, err := impl.K8sUtil.GetPodLogs(ctx, restConfigFinal, resourceIdentifier.Name, resourceIdentifier.Namespace, podLogsRequest.SinceTime, podLogsRequest.TailLines, podLogsRequest.SinceSeconds, podLogsRequest.Follow, podLogsRequest.ContainerName, podLogsRequest.IsPrevContainerLogsEnabled) + resp, err := impl.K8sUtil.GetPodLogs(ctx, restConfig, resourceIdentifier.Name, resourceIdentifier.Namespace, podLogsRequest.SinceTime, podLogsRequest.TailLines, podLogsRequest.SinceSeconds, podLogsRequest.Follow, podLogsRequest.ContainerName, podLogsRequest.IsPrevContainerLogsEnabled) if err != nil { impl.logger.Errorw("error in getting pod logs", "err", err, "clusterId", clusterId) return nil, err @@ -487,6 +522,72 @@ func (impl *K8sApplicationServiceImpl) validateResourceRequest(ctx context.Conte } return impl.validateContainerNameIfReqd(valid, request, app), nil } +func (impl *K8sApplicationServiceImpl) ValidateArgoResourceRequest(ctx context.Context, appIdentifier *bean4.ArgoAppIdentifier, request *k8s2.K8sRequestBean) (bool, error) { + app, err := impl.argoApplicationService.GetAppDetail(appIdentifier.AppName, appIdentifier.Namespace, appIdentifier.ClusterId) + if err != nil { + impl.logger.Errorw("error in getting app detail", "err", err, "appDetails", appIdentifier) + apiError := clientErrors.ConvertToApiError(err) + if apiError != nil { + err = apiError + } + return false, err + } + + valid := false + + for _, node := range app.ResourceTree.Nodes { + nodeDetails := k8s2.ResourceIdentifier{ + Name: node.Name, + Namespace: node.Namespace, + GroupVersionKind: schema.GroupVersionKind{ + Group: node.Group, + Version: node.Version, + Kind: node.Kind, + }, + } + if nodeDetails == request.ResourceIdentifier { + valid = true + break + } + } + appDetail := &gRPC.AppDetail{ + ResourceTreeResponse: app.ResourceTree, + } + return impl.validateContainerNameIfReqd(valid, request, appDetail), nil +} + +func (impl *K8sApplicationServiceImpl) ValidateFluxResourceRequest(ctx context.Context, appIdentifier *bean2.FluxAppIdentifier, request *k8s2.K8sRequestBean) (bool, error) { + app, err := impl.fluxApplicationService.GetFluxAppDetail(ctx, appIdentifier) + if err != nil { + impl.logger.Errorw("error in getting app detail", "err", err, "appDetails", appIdentifier) + apiError := clientErrors.ConvertToApiError(err) + if apiError != nil { + err = apiError + } + return false, err + } + + valid := false + for _, node := range app.ResourceTreeResponse.Nodes { + nodeDetails := k8s2.ResourceIdentifier{ + Name: node.Name, + Namespace: node.Namespace, + GroupVersionKind: schema.GroupVersionKind{ + Group: node.Group, + Version: node.Version, + Kind: node.Kind, + }, + } + if nodeDetails == request.ResourceIdentifier { + valid = true + break + } + } + appDetail := &gRPC.AppDetail{ + ResourceTreeResponse: app.ResourceTreeResponse, + } + return impl.validateContainerNameIfReqd(valid, request, appDetail), nil +} func (impl *K8sApplicationServiceImpl) validateContainerNameIfReqd(valid bool, request *k8s2.K8sRequestBean, app *gRPC.AppDetail) bool { if !valid { diff --git a/pkg/k8s/bean.go b/pkg/k8s/bean.go index 3c3a6501f5..32100c4ee3 100644 --- a/pkg/k8s/bean.go +++ b/pkg/k8s/bean.go @@ -19,18 +19,28 @@ package k8s import ( "github.com/devtron-labs/common-lib/utils/k8s" helmBean "github.com/devtron-labs/devtron/api/helm-app/service/bean" + bean2 "github.com/devtron-labs/devtron/pkg/fluxApplication/bean" "github.com/devtron-labs/devtron/pkg/k8s/application/bean" ) type ResourceRequestBean struct { AppId string `json:"appId"` - AppType int `json:"appType,omitempty"` // 0: DevtronApp, 1: HelmApp, 2:ArgoApp + AppType int `json:"appType,omitempty"` // 0: DevtronApp, 1: HelmApp, 2:ArgoApp, 3 fluxApp DeploymentType int `json:"deploymentType,omitempty"` // 0: DevtronApp, 1: HelmApp AppIdentifier *helmBean.AppIdentifier `json:"-"` K8sRequest *k8s.K8sRequestBean `json:"k8sRequest"` DevtronAppIdentifier *bean.DevtronAppIdentifier `json:"-"` // For Devtron App Resources ClusterId int `json:"clusterId"` // clusterId is used when request is for direct cluster (not for helm release) ExternalArgoApplicationName string `json:"externalArgoApplicationName,omitempty"` + ExternalFluxAppIdentifier *bean2.FluxAppIdentifier `json: "-"` +} + +func (r *ResourceRequestBean) IsValidAppType() bool { + return r.AppType == bean.DevtronAppType || r.AppType == bean.HelmAppType || r.AppType == bean.ArgoAppType || r.AppType == bean.FluxAppType +} + +func (r *ResourceRequestBean) IsValidDeploymentType() bool { + return r.DeploymentType == bean.HelmInstalledType || r.DeploymentType == bean.ArgoInstalledType || r.DeploymentType == bean.FluxInstalledType } type LogsDownloadBean struct { diff --git a/pkg/k8s/helper.go b/pkg/k8s/helper.go index b49c5f756b..3f7349ab01 100644 --- a/pkg/k8s/helper.go +++ b/pkg/k8s/helper.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "github.com/Masterminds/semver" + "github.com/devtron-labs/devtron/pkg/fluxApplication" k8sErrors "k8s.io/apimachinery/pkg/api/errors" "strings" ) @@ -57,3 +58,11 @@ func StripPrereleaseFromK8sVersion(k8sVersion string) string { } return k8sVersion } + +func IsClusterStringContainsFluxField(str string) bool { + _, err := fluxApplication.DecodeFluxExternalAppId(str) + if err != nil { + return false + } + return true +} diff --git a/specs/fluxcd_app.yaml b/specs/fluxcd_app.yaml new file mode 100644 index 0000000000..ff83979291 --- /dev/null +++ b/specs/fluxcd_app.yaml @@ -0,0 +1,299 @@ +openapi: 3.0.0 +info: + title: Flux Application Orchestrator API + version: 1.0.0 +paths: + /orchestrator/flux-application: + get: + summary: List Flux Applications + operationId: listFluxApplications + parameters: + - name: token + in: header + required: true + schema: + type: string + description: Authorization token + - name: clusterIds + in: query + required: true + schema: + type: string + description: Comma-separated list of cluster IDs. + responses: + '200': + description: List of Flux applications + content: + application/json: + schema: + $ref: '#/components/schemas/AppListDto' + '400': + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + /orchestrator/flux-application/app: + get: + summary: Get application details + description: Retrieve details of a specific Flux application. + parameters: + - name: appId + in: query + required: true + schema: + type: string + description: The application identifier in the format "1|default|myksApp|Kustomization as the first field having the cluster id, then second field having the namespace of the app , third field denoted the app name and last contains a boolean value of true and false". + - name: token + in: header + required: true + schema: + type: string + description: The authentication token. + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: '#/components/schemas/FluxApplicationDetailDto' + '400': + description: Bad request + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '403': + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '500': + description: Internal server error + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + + +components: + schemas: + AppListDto: + type: object + properties: + clusterIds: + type: array + description: Cluster Id to which the result corresponds + example: [1] + items: + type: integer + fluxApplication: + type: array + description: List of Flux applications + items: + $ref: '#/components/schemas/FluxAppDto' + FluxAppDto: + type: object + properties: + appName: + type: string + description: Name of the application + example: flux-system + appStatus: + type: boolean + enum: [True, False] + description: + example: True + syncStatus: + type: string + description: Sync status of the application + example: "Applied revision: main@sha1:a3c3de4083eca4ca01d63f9f1b07599b64f3f8ca" + clusterId: + type: integer + description: ID of the cluster + example: 2 + clusterName: + type: string + description: Name of the cluster + example: test-cluster-1 + namespace: + type: string + description: Namespace of the application + example: flux-system + fluxAppDeploymentType: + type: string + enum": ["Kustomization", "HelmRelease"] + description: Indicates if the application is a Kustomize type or standalone flux made HelmRelease app + example: true + FluxAppStatusDetail: + type: object + properties: + status: + type: string + description: Tells about the status whether true or false of the last action performed + message: + type: string + description: Brief message of the last encountered reason + reason: + type: string + description: Short key words like 'ReconciliationFailed', 'Reconciled', and so on for the user to understand the reason of the given of the status + + InfoItem: + type: object + properties: + name: + type: string + value: + type: string + + HealthStatus: + type: object + properties: + status: + type: string + message: + type: string + + ResourceNetworkingInfo: + type: object + properties: + labels: + type: object + additionalProperties: + type: string + + ResourceRef: + type: object + properties: + group: + type: string + version: + type: string + kind: + type: string + namespace: + type: string + name: + type: string + uid: + type: string + + PodMetadata: + type: object + properties: + name: + type: string + uid: + type: string + containers: + type: array + items: + type: string + initContainers: + type: array + items: + type: string + isNew: + type: boolean + ephemeralContainers: + type: array + items: + $ref: '#/components/schemas/EphemeralContainerData' + + EphemeralContainerData: + type: object + properties: + name: + type: string + isExternal: + type: boolean + + ResourceNode: + type: object + properties: + group: + type: string + version: + type: string + kind: + type: string + namespace: + type: string + name: + type: string + uid: + type: string + parentRefs: + type: array + items: + $ref: '#/components/schemas/ResourceRef' + networkingInfo: + $ref: '#/components/schemas/ResourceNetworkingInfo' + resourceVersion: + type: string + health: + $ref: '#/components/schemas/HealthStatus' + isHibernated: + type: boolean + canBeHibernated: + type: boolean + info: + type: array + items: + $ref: '#/components/schemas/InfoItem' + createdAt: + type: string + format: date-time + port: + type: array + items: + type: integer + isHook: + type: boolean + hookType: + type: string + + ResourceTreeResponse: + type: object + properties: + nodes: + type: array + items: + $ref: '#/components/schemas/ResourceNode' + podMetadata: + type: array + items: + $ref: '#/components/schemas/PodMetadata' + + FluxApplicationDetailDto: + type: object + properties: + FluxApplication: + $ref: '#/components/schemas/FluxAppDto' + FluxAppStatusDetail: + $ref: '#/components/schemas/FluxAppStatusDetail' + ResourceTreeResponse: + $ref: '#/components/schemas/ResourceTreeResponse' + + Error: + type: object + properties: + message: + type: string + description: Error message + example: unauthorized diff --git a/wire_gen.go b/wire_gen.go index bfc84a3cc5..c349364e73 100644 --- a/wire_gen.go +++ b/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 @@ -31,6 +31,7 @@ import ( deployment2 "github.com/devtron-labs/devtron/api/deployment" devtronResource2 "github.com/devtron-labs/devtron/api/devtronResource" externalLink2 "github.com/devtron-labs/devtron/api/externalLink" + fluxApplication2 "github.com/devtron-labs/devtron/api/fluxApplication" client3 "github.com/devtron-labs/devtron/api/helm-app" "github.com/devtron-labs/devtron/api/helm-app/gRPC" "github.com/devtron-labs/devtron/api/helm-app/service" @@ -163,6 +164,7 @@ import ( "github.com/devtron-labs/devtron/pkg/eventProcessor/in" "github.com/devtron-labs/devtron/pkg/eventProcessor/out" "github.com/devtron-labs/devtron/pkg/externalLink" + "github.com/devtron-labs/devtron/pkg/fluxApplication" "github.com/devtron-labs/devtron/pkg/generateManifest" "github.com/devtron-labs/devtron/pkg/genericNotes" repository6 "github.com/devtron-labs/devtron/pkg/genericNotes/repository" @@ -392,7 +394,7 @@ func InitializeApp() (*App, error) { if err != nil { return nil, err } - argoApplicationServiceImpl := argoApplication.NewArgoApplicationServiceImpl(sugaredLogger, clusterRepositoryImpl, k8sServiceImpl, argoUserServiceImpl, helmAppServiceImpl) + argoApplicationServiceImpl := argoApplication.NewArgoApplicationServiceImpl(sugaredLogger, clusterRepositoryImpl, k8sServiceImpl, argoUserServiceImpl, helmAppClientImpl, helmAppServiceImpl) k8sCommonServiceImpl := k8s2.NewK8sCommonServiceImpl(sugaredLogger, k8sServiceImpl, clusterServiceImplExtended, argoApplicationServiceImpl) environmentRestHandlerImpl := cluster3.NewEnvironmentRestHandlerImpl(environmentServiceImpl, sugaredLogger, userServiceImpl, validate, enforcerImpl, deleteServiceExtendedImpl, k8sServiceImpl, k8sCommonServiceImpl) environmentRouterImpl := cluster3.NewEnvironmentRouterImpl(environmentRestHandlerImpl) @@ -707,7 +709,8 @@ func InitializeApp() (*App, error) { ephemeralContainersRepositoryImpl := repository.NewEphemeralContainersRepositoryImpl(db, transactionUtilImpl) ephemeralContainerServiceImpl := cluster2.NewEphemeralContainerServiceImpl(ephemeralContainersRepositoryImpl, sugaredLogger) terminalSessionHandlerImpl := terminal.NewTerminalSessionHandlerImpl(environmentServiceImpl, clusterServiceImplExtended, sugaredLogger, k8sServiceImpl, ephemeralContainerServiceImpl, argoApplicationServiceImpl) - k8sApplicationServiceImpl, err := application2.NewK8sApplicationServiceImpl(sugaredLogger, clusterServiceImplExtended, pumpImpl, helmAppServiceImpl, k8sServiceImpl, acdAuthConfig, k8sResourceHistoryServiceImpl, k8sCommonServiceImpl, terminalSessionHandlerImpl, ephemeralContainerServiceImpl, ephemeralContainersRepositoryImpl, argoApplicationServiceImpl) + fluxApplicationServiceImpl := fluxApplication.NewFluxApplicationServiceImpl(sugaredLogger, helmAppServiceImpl, clusterServiceImplExtended, helmAppClientImpl, pumpImpl) + k8sApplicationServiceImpl, err := application2.NewK8sApplicationServiceImpl(sugaredLogger, clusterServiceImplExtended, pumpImpl, helmAppServiceImpl, k8sServiceImpl, acdAuthConfig, k8sResourceHistoryServiceImpl, k8sCommonServiceImpl, terminalSessionHandlerImpl, ephemeralContainerServiceImpl, ephemeralContainersRepositoryImpl, argoApplicationServiceImpl, fluxApplicationServiceImpl) if err != nil { return nil, err } @@ -860,9 +863,9 @@ func InitializeApp() (*App, error) { appRouterImpl := app3.NewAppRouterImpl(appFilteringRouterImpl, appListingRouterImpl, appInfoRouterImpl, pipelineTriggerRouterImpl, pipelineConfigRouterImpl, pipelineHistoryRouterImpl, pipelineStatusRouterImpl, appWorkflowRouterImpl, devtronAppAutoCompleteRouterImpl, appWorkflowRestHandlerImpl, appListingRestHandlerImpl, appFilteringRestHandlerImpl) coreAppRestHandlerImpl := restHandler.NewCoreAppRestHandlerImpl(sugaredLogger, userServiceImpl, validate, enforcerUtilImpl, enforcerImpl, appCrudOperationServiceImpl, pipelineBuilderImpl, gitRegistryConfigImpl, chartServiceImpl, configMapServiceImpl, appListingServiceImpl, propertiesConfigServiceImpl, appWorkflowServiceImpl, materialRepositoryImpl, gitProviderRepositoryImpl, appWorkflowRepositoryImpl, environmentRepositoryImpl, configMapRepositoryImpl, chartRepositoryImpl, teamServiceImpl, argoUserServiceImpl, pipelineStageServiceImpl, ciPipelineRepositoryImpl) coreAppRouterImpl := router.NewCoreAppRouterImpl(coreAppRestHandlerImpl) - helmAppRestHandlerImpl := client3.NewHelmAppRestHandlerImpl(sugaredLogger, helmAppServiceImpl, enforcerImpl, clusterServiceImplExtended, enforcerUtilHelmImpl, appStoreDeploymentServiceImpl, installedAppDBServiceImpl, userServiceImpl, attributesServiceImpl, serverEnvConfigServerEnvConfig) + helmAppRestHandlerImpl := client3.NewHelmAppRestHandlerImpl(sugaredLogger, helmAppServiceImpl, enforcerImpl, clusterServiceImplExtended, enforcerUtilHelmImpl, appStoreDeploymentServiceImpl, installedAppDBServiceImpl, userServiceImpl, attributesServiceImpl, serverEnvConfigServerEnvConfig, fluxApplicationServiceImpl, argoApplicationServiceImpl) helmAppRouterImpl := client3.NewHelmAppRouterImpl(helmAppRestHandlerImpl) - k8sApplicationRestHandlerImpl := application3.NewK8sApplicationRestHandlerImpl(sugaredLogger, k8sApplicationServiceImpl, pumpImpl, terminalSessionHandlerImpl, enforcerImpl, enforcerUtilHelmImpl, enforcerUtilImpl, helmAppServiceImpl, userServiceImpl, k8sCommonServiceImpl, validate, environmentVariables) + k8sApplicationRestHandlerImpl := application3.NewK8sApplicationRestHandlerImpl(sugaredLogger, k8sApplicationServiceImpl, pumpImpl, terminalSessionHandlerImpl, enforcerImpl, enforcerUtilHelmImpl, enforcerUtilImpl, helmAppServiceImpl, userServiceImpl, k8sCommonServiceImpl, validate, environmentVariables, fluxApplicationServiceImpl, argoApplicationServiceImpl) k8sApplicationRouterImpl := application3.NewK8sApplicationRouterImpl(k8sApplicationRestHandlerImpl) pProfRestHandlerImpl := restHandler.NewPProfRestHandler(userServiceImpl, enforcerImpl) pProfRouterImpl := router.NewPProfRouter(sugaredLogger, pProfRestHandlerImpl) @@ -948,7 +951,9 @@ func InitializeApp() (*App, error) { historyRestHandlerImpl := devtronResource2.NewHistoryRestHandlerImpl(sugaredLogger, enforcerImpl, deploymentHistoryServiceImpl, apiReqDecoderServiceImpl, enforcerUtilImpl) historyRouterImpl := devtronResource2.NewHistoryRouterImpl(historyRestHandlerImpl) devtronResourceRouterImpl := devtronResource2.NewDevtronResourceRouterImpl(historyRouterImpl) - muxRouter := router.NewMuxRouter(sugaredLogger, environmentRouterImpl, clusterRouterImpl, webhookRouterImpl, userAuthRouterImpl, gitProviderRouterImpl, gitHostRouterImpl, dockerRegRouterImpl, notificationRouterImpl, teamRouterImpl, userRouterImpl, chartRefRouterImpl, configMapRouterImpl, appStoreRouterImpl, chartRepositoryRouterImpl, releaseMetricsRouterImpl, deploymentGroupRouterImpl, batchOperationRouterImpl, chartGroupRouterImpl, imageScanRouterImpl, policyRouterImpl, gitOpsConfigRouterImpl, dashboardRouterImpl, attributesRouterImpl, userAttributesRouterImpl, commonRouterImpl, grafanaRouterImpl, ssoLoginRouterImpl, telemetryRouterImpl, telemetryEventClientImplExtended, bulkUpdateRouterImpl, webhookListenerRouterImpl, appRouterImpl, coreAppRouterImpl, helmAppRouterImpl, k8sApplicationRouterImpl, pProfRouterImpl, deploymentConfigRouterImpl, dashboardTelemetryRouterImpl, commonDeploymentRouterImpl, externalLinkRouterImpl, globalPluginRouterImpl, moduleRouterImpl, serverRouterImpl, apiTokenRouterImpl, cdApplicationStatusUpdateHandlerImpl, k8sCapacityRouterImpl, webhookHelmRouterImpl, globalCMCSRouterImpl, userTerminalAccessRouterImpl, jobRouterImpl, ciStatusUpdateCronImpl, resourceGroupingRouterImpl, rbacRoleRouterImpl, scopedVariableRouterImpl, ciTriggerCronImpl, proxyRouterImpl, infraConfigRouterImpl, argoApplicationRouterImpl, devtronResourceRouterImpl) + fluxApplicationRestHandlerImpl := fluxApplication2.NewFluxApplicationRestHandlerImpl(fluxApplicationServiceImpl, sugaredLogger, enforcerImpl) + fluxApplicationRouterImpl := fluxApplication2.NewFluxApplicationRouterImpl(fluxApplicationRestHandlerImpl) + muxRouter := router.NewMuxRouter(sugaredLogger, environmentRouterImpl, clusterRouterImpl, webhookRouterImpl, userAuthRouterImpl, gitProviderRouterImpl, gitHostRouterImpl, dockerRegRouterImpl, notificationRouterImpl, teamRouterImpl, userRouterImpl, chartRefRouterImpl, configMapRouterImpl, appStoreRouterImpl, chartRepositoryRouterImpl, releaseMetricsRouterImpl, deploymentGroupRouterImpl, batchOperationRouterImpl, chartGroupRouterImpl, imageScanRouterImpl, policyRouterImpl, gitOpsConfigRouterImpl, dashboardRouterImpl, attributesRouterImpl, userAttributesRouterImpl, commonRouterImpl, grafanaRouterImpl, ssoLoginRouterImpl, telemetryRouterImpl, telemetryEventClientImplExtended, bulkUpdateRouterImpl, webhookListenerRouterImpl, appRouterImpl, coreAppRouterImpl, helmAppRouterImpl, k8sApplicationRouterImpl, pProfRouterImpl, deploymentConfigRouterImpl, dashboardTelemetryRouterImpl, commonDeploymentRouterImpl, externalLinkRouterImpl, globalPluginRouterImpl, moduleRouterImpl, serverRouterImpl, apiTokenRouterImpl, cdApplicationStatusUpdateHandlerImpl, k8sCapacityRouterImpl, webhookHelmRouterImpl, globalCMCSRouterImpl, userTerminalAccessRouterImpl, jobRouterImpl, ciStatusUpdateCronImpl, resourceGroupingRouterImpl, rbacRoleRouterImpl, scopedVariableRouterImpl, ciTriggerCronImpl, proxyRouterImpl, infraConfigRouterImpl, argoApplicationRouterImpl, devtronResourceRouterImpl, fluxApplicationRouterImpl) loggingMiddlewareImpl := util4.NewLoggingMiddlewareImpl(userServiceImpl) cdWorkflowServiceImpl := cd.NewCdWorkflowServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl) cdWorkflowRunnerServiceImpl := cd.NewCdWorkflowRunnerServiceImpl(sugaredLogger, cdWorkflowRepositoryImpl)