From 3260f85bd14fd9c0ba6f9ab601a65d9ff714a6fe Mon Sep 17 00:00:00 2001 From: nxtcoder17 Date: Fri, 26 Jan 2024 00:32:26 +0530 Subject: [PATCH 1/5] fix(apps/infra): fixes helm release, missing status --- apps/infra/internal/domain/helm-release.go | 1 - apps/infra/internal/entities/helm-release.go | 4 ++-- common/patch-util.go | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/infra/internal/domain/helm-release.go b/apps/infra/internal/domain/helm-release.go index e5c3113f5..943981375 100644 --- a/apps/infra/internal/domain/helm-release.go +++ b/apps/infra/internal/domain/helm-release.go @@ -145,7 +145,6 @@ func (d *domain) UpdateHelmRelease(ctx InfraContext, clusterName string, hrIn en &hrIn, common.PatchOpts{ XPatch: repos.Document{ - fc.HelmReleaseSpec: hrIn.Spec, fc.HelmReleaseSpecChartVersion: hrIn.Spec.ChartVersion, fc.HelmReleaseSpecValues: hrIn.Spec.Values, }, diff --git a/apps/infra/internal/entities/helm-release.go b/apps/infra/internal/entities/helm-release.go index 187c207b6..3ecf052bf 100644 --- a/apps/infra/internal/entities/helm-release.go +++ b/apps/infra/internal/entities/helm-release.go @@ -21,11 +21,11 @@ type HelmRelease struct { } func (h *HelmRelease) GetDisplayName() string { - return h.ResourceMetadata.DisplayName + return h.DisplayName } func (h *HelmRelease) GetStatus() operator.Status { - return operator.Status{} + return h.Status.Status } var HelmReleaseIndices = []repos.IndexField{ diff --git a/common/patch-util.go b/common/patch-util.go index 7b7a59e5c..7b1c0d69a 100644 --- a/common/patch-util.go +++ b/common/patch-util.go @@ -41,7 +41,6 @@ func PatchForSyncFromAgent( status types.ResourceStatus, opts PatchOpts, ) repos.Document { - res.GetCreationTimestamp() generatedPatch := repos.Document{ fields.MetadataCreationTimestamp: res.GetCreationTimestamp(), fields.MetadataLabels: res.GetLabels(), From cc2e56cef45231f2ee9460d9930d120ae6050b71 Mon Sep 17 00:00:00 2001 From: nxtcoder17 Date: Fri, 26 Jan 2024 00:37:33 +0530 Subject: [PATCH 2/5] fix(apps/infra): fixes graphql update for nodepool, and infra VPN devices --- apps/infra/internal/domain/nodepool.go | 3 ++- apps/infra/internal/domain/vpn-device.go | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/infra/internal/domain/nodepool.go b/apps/infra/internal/domain/nodepool.go index 70a54250d..3f83e8758 100644 --- a/apps/infra/internal/domain/nodepool.go +++ b/apps/infra/internal/domain/nodepool.go @@ -170,7 +170,8 @@ func (d *domain) UpdateNodePool(ctx InfraContext, clusterName string, nodePoolIn &nodePoolIn, common.PatchOpts{ XPatch: repos.Document{ - fc.NodePoolSpec: nodePoolIn.Spec, + fc.NodePoolSpecMinCount: nodePoolIn.Spec.MinCount, + fc.NodePoolSpecMaxCount: nodePoolIn.Spec.MaxCount, }, }) diff --git a/apps/infra/internal/domain/vpn-device.go b/apps/infra/internal/domain/vpn-device.go index 6e9401286..0447fd48e 100644 --- a/apps/infra/internal/domain/vpn-device.go +++ b/apps/infra/internal/domain/vpn-device.go @@ -122,7 +122,6 @@ func (d *domain) UpdateVPNDevice(ctx InfraContext, clusterName string, deviceIn &deviceIn, common.PatchOpts{ XPatch: repos.Document{ - fc.VPNDeviceSpec: deviceIn.Spec, fc.VPNDeviceSpecPorts: deviceIn.Spec.Ports, fc.VPNDeviceSpecActiveNamespace: deviceIn.Spec.ActiveNamespace, }, From 3c62ac4d2df4b115a3fcb2260e8908ff58cacdfc Mon Sep 17 00:00:00 2001 From: nxtcoder17 Date: Fri, 26 Jan 2024 00:38:21 +0530 Subject: [PATCH 3/5] feat: adds api for restarting apps, and project managed services - **apps/tenant-agent**, now also have an action `restart`, apart from `apply`, and `delete`. --- .tools/nvim/__http__/console/apps.graphql.yml | 16 + .../console/project-managed-services.yml | 29 ++ .tools/nvim/__http__/infra/names.graphql.yml | 2 +- .../internal/app/graph/generated/generated.go | 366 +++++++++++++++++- .../internal/app/graph/schema.graphqls | 5 +- .../internal/app/graph/schema.resolvers.go | 35 ++ apps/console/internal/domain/api.go | 7 +- apps/console/internal/domain/app.go | 18 +- apps/console/internal/domain/domain.go | 41 +- apps/console/internal/domain/names.go | 3 +- .../domain/project-managed-service.go | 23 +- .../internal/app/process-resource-updates.go | 24 +- apps/tenant-agent/main.go | 92 ++++- apps/tenant-agent/types/types.go | 5 +- 14 files changed, 619 insertions(+), 47 deletions(-) create mode 100644 .tools/nvim/__http__/console/project-managed-services.yml diff --git a/.tools/nvim/__http__/console/apps.graphql.yml b/.tools/nvim/__http__/console/apps.graphql.yml index 2394a314c..52971d18f 100644 --- a/.tools/nvim/__http__/console/apps.graphql.yml +++ b/.tools/nvim/__http__/console/apps.graphql.yml @@ -16,6 +16,10 @@ query: |+ #graphql userId userName } + metadata { + name + annotations + } syncStatus { state action @@ -150,3 +154,15 @@ variables: envName: "{{.envName}}" appName: "{{.name}}" --- + +--- +label: restart app +query: |+ + query Query($projectName: String!, $envName: String!, $appName: String!) { + core_restartApp(projectName: $projectName, envName: $envName, appName: $appName) + } +variables: + projectName: "{{.projectName}}" + envName: "{{.envName}}" + appName: "nginx" +--- diff --git a/.tools/nvim/__http__/console/project-managed-services.yml b/.tools/nvim/__http__/console/project-managed-services.yml new file mode 100644 index 000000000..975cb322e --- /dev/null +++ b/.tools/nvim/__http__/console/project-managed-services.yml @@ -0,0 +1,29 @@ +--- +label: list project managed services +query: |+ + query Core_listProjectManagedServices($projectName: String!) { + core_listProjectManagedServices(projectName: $projectName) { + edges { + node { + metadata { + name + annotations + } + } + } + } + } +variables: + projectName: "{{.projectName}}" +--- + +label: restart project managed service +query: |+ #graphql + query Query($projectName: String!, $name: String!) { + core_restartProjectManagedService(projectName: $projectName, name: $name) + } +variables: + projectName: "{{.projectName}}" + name: "sampledbservice" + +--- diff --git a/.tools/nvim/__http__/infra/names.graphql.yml b/.tools/nvim/__http__/infra/names.graphql.yml index 1e760f22c..8b9cd3205 100644 --- a/.tools/nvim/__http__/infra/names.graphql.yml +++ b/.tools/nvim/__http__/infra/names.graphql.yml @@ -16,7 +16,7 @@ query: |+ variables: resType: vpn_device # name: sample - name: saple + name: sample --- label: Check Name Availability, with ClusterName diff --git a/apps/console/internal/app/graph/generated/generated.go b/apps/console/internal/app/graph/generated/generated.go index ff12e7111..6ada0be78 100644 --- a/apps/console/internal/app/graph/generated/generated.go +++ b/apps/console/internal/app/graph/generated/generated.go @@ -172,6 +172,7 @@ type ComplexityRoot struct { ID func(childComplexity int) int Kind func(childComplexity int) int LastUpdatedBy func(childComplexity int) int + LinkedClusters func(childComplexity int) int MarkedForDeletion func(childComplexity int) int ObjectMeta func(childComplexity int) int ProjectName func(childComplexity int) int @@ -732,6 +733,8 @@ type ComplexityRoot struct { CoreListSecrets func(childComplexity int, projectName string, envName string, search *model.SearchSecrets, pq *repos.CursorPagination) int CoreListVPNDevices func(childComplexity int, search *model.CoreSearchVPNDevices, pq *repos.CursorPagination) int CoreListVPNDevicesForUser func(childComplexity int) int + CoreRestartApp func(childComplexity int, projectName string, envName string, appName string) int + CoreRestartProjectManagedService func(childComplexity int, projectName string, name string) int CoreResyncApp func(childComplexity int, projectName string, envName string, name string) int CoreResyncConfig func(childComplexity int, projectName string, envName string, name string) int CoreResyncEnvironment func(childComplexity int, projectName string, name string) int @@ -969,6 +972,7 @@ type QueryResolver interface { CoreListApps(ctx context.Context, projectName string, envName string, search *model.SearchApps, pq *repos.CursorPagination) (*model.AppPaginatedRecords, error) CoreGetApp(ctx context.Context, projectName string, envName string, name string) (*entities.App, error) CoreResyncApp(ctx context.Context, projectName string, envName string, name string) (bool, error) + CoreRestartApp(ctx context.Context, projectName string, envName string, appName string) (bool, error) CoreGetConfigValues(ctx context.Context, projectName string, envName string, queries []*domain.ConfigKeyRef) ([]*domain.ConfigKeyValueRef, error) CoreListConfigs(ctx context.Context, projectName string, envName string, search *model.SearchConfigs, pq *repos.CursorPagination) (*model.ConfigPaginatedRecords, error) CoreGetConfig(ctx context.Context, projectName string, envName string, name string) (*entities.Config, error) @@ -988,6 +992,7 @@ type QueryResolver interface { CoreListProjectManagedServices(ctx context.Context, projectName string, search *model.SearchProjectManagedService, pq *repos.CursorPagination) (*model.ProjectManagedServicePaginatedRecords, error) CoreGetProjectManagedService(ctx context.Context, projectName string, name string) (*entities.ProjectManagedService, error) CoreResyncProjectManagedService(ctx context.Context, projectName string, name string) (bool, error) + CoreRestartProjectManagedService(ctx context.Context, projectName string, name string) (bool, error) CoreListVPNDevices(ctx context.Context, search *model.CoreSearchVPNDevices, pq *repos.CursorPagination) (*model.ConsoleVPNDevicePaginatedRecords, error) CoreListVPNDevicesForUser(ctx context.Context) ([]*entities.ConsoleVPNDevice, error) CoreGetVPNDevice(ctx context.Context, name string) (*entities.ConsoleVPNDevice, error) @@ -1513,6 +1518,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.ConsoleVPNDevice.LastUpdatedBy(childComplexity), true + case "ConsoleVPNDevice.linkedClusters": + if e.complexity.ConsoleVPNDevice.LinkedClusters == nil { + break + } + + return e.complexity.ConsoleVPNDevice.LinkedClusters(childComplexity), true + case "ConsoleVPNDevice.markedForDeletion": if e.complexity.ConsoleVPNDevice.MarkedForDeletion == nil { break @@ -4337,6 +4349,30 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Query.CoreListVPNDevicesForUser(childComplexity), true + case "Query.core_restartApp": + if e.complexity.Query.CoreRestartApp == nil { + break + } + + args, err := ec.field_Query_core_restartApp_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.CoreRestartApp(childComplexity, args["projectName"].(string), args["envName"].(string), args["appName"].(string)), true + + case "Query.core_restartProjectManagedService": + if e.complexity.Query.CoreRestartProjectManagedService == nil { + break + } + + args, err := ec.field_Query_core_restartProjectManagedService_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.CoreRestartProjectManagedService(childComplexity, args["projectName"].(string), args["name"].(string)), true + case "Query.core_resyncApp": if e.complexity.Query.CoreResyncApp == nil { break @@ -5058,6 +5094,7 @@ type Query { core_listApps(projectName: String!, envName: String!, search: SearchApps, pq: CursorPaginationIn): AppPaginatedRecords @isLoggedInAndVerified @hasAccount core_getApp(projectName: String!, envName: String!, name: String!): App @isLoggedInAndVerified @hasAccount core_resyncApp(projectName: String!, envName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount + core_restartApp(projectName: String!, envName: String!, appName: String!): Boolean! @isLoggedInAndVerified @hasAccount core_getConfigValues(projectName: String!, envName: String!, queries: [ConfigKeyRefIn]): [ConfigKeyValueRef!] @isLoggedInAndVerified @hasAccount core_listConfigs(projectName: String!, envName: String!, search: SearchConfigs, pq: CursorPaginationIn): ConfigPaginatedRecords @isLoggedInAndVerified @hasAccount @@ -5073,7 +5110,6 @@ type Query { core_getRouter(projectName: String!, envName: String!, name: String!): Router @isLoggedInAndVerified @hasAccount core_resyncRouter(projectName: String!, envName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount - core_getManagedResouceOutputKeys(projectName: String!, envName: String!, name: String!): [String!]! @isLoggedInAndVerified @hasAccount core_getManagedResouceOutputKeyValues(projectName: String!, envName: String!, keyrefs: [ManagedResourceKeyRefIn]): [ManagedResourceKeyValueRef!]! @isLoggedInAndVerified @hasAccount core_listManagedResources(projectName: String!, envName: String!, search: SearchManagedResources, pq: CursorPaginationIn): ManagedResourcePaginatedRecords @isLoggedInAndVerified @hasAccount @@ -5082,7 +5118,8 @@ type Query { core_listProjectManagedServices(projectName: String!, search: SearchProjectManagedService, pq: CursorPaginationIn): ProjectManagedServicePaginatedRecords @isLoggedInAndVerified @hasAccount core_getProjectManagedService(projectName: String!, name: String!): ProjectManagedService @isLoggedInAndVerified @hasAccount - core_resyncProjectManagedService(projectName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount + core_resyncProjectManagedService(projectName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount + core_restartProjectManagedService(projectName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount core_listVPNDevices(search: CoreSearchVPNDevices, pq: CursorPaginationIn): ConsoleVPNDevicePaginatedRecords @isLoggedInAndVerified @hasAccount core_listVPNDevicesForUser: [ConsoleVPNDevice!] @isLoggedInAndVerified @hasAccount @@ -5827,6 +5864,7 @@ input ConfigKeyValueRefIn { id: String! kind: String lastUpdatedBy: Github__com___kloudlite___api___common__CreatedOrUpdatedBy! + linkedClusters: [String!] markedForDeletion: Boolean metadata: Metadata @goField(name: "objectMeta") projectName: String @@ -8082,6 +8120,63 @@ func (ec *executionContext) field_Query_core_listVPNDevices_args(ctx context.Con return args, nil } +func (ec *executionContext) field_Query_core_restartApp_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["projectName"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("projectName")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["projectName"] = arg0 + var arg1 string + if tmp, ok := rawArgs["envName"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("envName")) + arg1, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["envName"] = arg1 + var arg2 string + if tmp, ok := rawArgs["appName"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("appName")) + arg2, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["appName"] = arg2 + return args, nil +} + +func (ec *executionContext) field_Query_core_restartProjectManagedService_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["projectName"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("projectName")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["projectName"] = arg0 + var arg1 string + if tmp, ok := rawArgs["name"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + arg1, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["name"] = arg1 + return args, nil +} + func (ec *executionContext) field_Query_core_resyncApp_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -11312,6 +11407,47 @@ func (ec *executionContext) fieldContext_ConsoleVPNDevice_lastUpdatedBy(ctx cont return fc, nil } +func (ec *executionContext) _ConsoleVPNDevice_linkedClusters(ctx context.Context, field graphql.CollectedField, obj *entities.ConsoleVPNDevice) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ConsoleVPNDevice_linkedClusters(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return obj.LinkedClusters, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) + fc.Result = res + return ec.marshalOString2ᚕstringᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ConsoleVPNDevice_linkedClusters(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "ConsoleVPNDevice", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _ConsoleVPNDevice_markedForDeletion(ctx context.Context, field graphql.CollectedField, obj *entities.ConsoleVPNDevice) (ret graphql.Marshaler) { fc, err := ec.fieldContext_ConsoleVPNDevice_markedForDeletion(ctx, field) if err != nil { @@ -11855,6 +11991,8 @@ func (ec *executionContext) fieldContext_ConsoleVPNDeviceEdge_node(ctx context.C return ec.fieldContext_ConsoleVPNDevice_kind(ctx, field) case "lastUpdatedBy": return ec.fieldContext_ConsoleVPNDevice_lastUpdatedBy(ctx, field) + case "linkedClusters": + return ec.fieldContext_ConsoleVPNDevice_linkedClusters(ctx, field) case "markedForDeletion": return ec.fieldContext_ConsoleVPNDevice_markedForDeletion(ctx, field) case "metadata": @@ -25811,6 +25949,8 @@ func (ec *executionContext) fieldContext_Mutation_core_createVPNDevice(ctx conte return ec.fieldContext_ConsoleVPNDevice_kind(ctx, field) case "lastUpdatedBy": return ec.fieldContext_ConsoleVPNDevice_lastUpdatedBy(ctx, field) + case "linkedClusters": + return ec.fieldContext_ConsoleVPNDevice_linkedClusters(ctx, field) case "markedForDeletion": return ec.fieldContext_ConsoleVPNDevice_markedForDeletion(ctx, field) case "metadata": @@ -25927,6 +26067,8 @@ func (ec *executionContext) fieldContext_Mutation_core_updateVPNDevice(ctx conte return ec.fieldContext_ConsoleVPNDevice_kind(ctx, field) case "lastUpdatedBy": return ec.fieldContext_ConsoleVPNDevice_lastUpdatedBy(ctx, field) + case "linkedClusters": + return ec.fieldContext_ConsoleVPNDevice_linkedClusters(ctx, field) case "markedForDeletion": return ec.fieldContext_ConsoleVPNDevice_markedForDeletion(ctx, field) case "metadata": @@ -29705,6 +29847,87 @@ func (ec *executionContext) fieldContext_Query_core_resyncApp(ctx context.Contex return fc, nil } +func (ec *executionContext) _Query_core_restartApp(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_core_restartApp(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + directive0 := func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().CoreRestartApp(rctx, fc.Args["projectName"].(string), fc.Args["envName"].(string), fc.Args["appName"].(string)) + } + directive1 := func(ctx context.Context) (interface{}, error) { + if ec.directives.IsLoggedInAndVerified == nil { + return nil, errors.New("directive isLoggedInAndVerified is not implemented") + } + return ec.directives.IsLoggedInAndVerified(ctx, nil, directive0) + } + directive2 := func(ctx context.Context) (interface{}, error) { + if ec.directives.HasAccount == nil { + return nil, errors.New("directive hasAccount is not implemented") + } + return ec.directives.HasAccount(ctx, nil, directive1) + } + + tmp, err := directive2(rctx) + if err != nil { + return nil, graphql.ErrorOnPath(ctx, err) + } + if tmp == nil { + return nil, nil + } + if data, ok := tmp.(bool); ok { + return data, nil + } + return nil, fmt.Errorf(`unexpected type %T from directive, should be bool`, tmp) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_core_restartApp(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_core_restartApp_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return + } + return fc, nil +} + func (ec *executionContext) _Query_core_getConfigValues(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_core_getConfigValues(ctx, field) if err != nil { @@ -31460,6 +31683,87 @@ func (ec *executionContext) fieldContext_Query_core_resyncProjectManagedService( return fc, nil } +func (ec *executionContext) _Query_core_restartProjectManagedService(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_core_restartProjectManagedService(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + directive0 := func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().CoreRestartProjectManagedService(rctx, fc.Args["projectName"].(string), fc.Args["name"].(string)) + } + directive1 := func(ctx context.Context) (interface{}, error) { + if ec.directives.IsLoggedInAndVerified == nil { + return nil, errors.New("directive isLoggedInAndVerified is not implemented") + } + return ec.directives.IsLoggedInAndVerified(ctx, nil, directive0) + } + directive2 := func(ctx context.Context) (interface{}, error) { + if ec.directives.HasAccount == nil { + return nil, errors.New("directive hasAccount is not implemented") + } + return ec.directives.HasAccount(ctx, nil, directive1) + } + + tmp, err := directive2(rctx) + if err != nil { + return nil, graphql.ErrorOnPath(ctx, err) + } + if tmp == nil { + return nil, nil + } + if data, ok := tmp.(bool); ok { + return data, nil + } + return nil, fmt.Errorf(`unexpected type %T from directive, should be bool`, tmp) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_core_restartProjectManagedService(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_core_restartProjectManagedService_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return + } + return fc, nil +} + func (ec *executionContext) _Query_core_listVPNDevices(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_core_listVPNDevices(ctx, field) if err != nil { @@ -31626,6 +31930,8 @@ func (ec *executionContext) fieldContext_Query_core_listVPNDevicesForUser(ctx co return ec.fieldContext_ConsoleVPNDevice_kind(ctx, field) case "lastUpdatedBy": return ec.fieldContext_ConsoleVPNDevice_lastUpdatedBy(ctx, field) + case "linkedClusters": + return ec.fieldContext_ConsoleVPNDevice_linkedClusters(ctx, field) case "markedForDeletion": return ec.fieldContext_ConsoleVPNDevice_markedForDeletion(ctx, field) case "metadata": @@ -31731,6 +32037,8 @@ func (ec *executionContext) fieldContext_Query_core_getVPNDevice(ctx context.Con return ec.fieldContext_ConsoleVPNDevice_kind(ctx, field) case "lastUpdatedBy": return ec.fieldContext_ConsoleVPNDevice_lastUpdatedBy(ctx, field) + case "linkedClusters": + return ec.fieldContext_ConsoleVPNDevice_linkedClusters(ctx, field) case "markedForDeletion": return ec.fieldContext_ConsoleVPNDevice_markedForDeletion(ctx, field) case "metadata": @@ -40307,6 +40615,10 @@ func (ec *executionContext) _ConsoleVPNDevice(ctx context.Context, sel ast.Selec if out.Values[i] == graphql.Null { atomic.AddUint32(&invalids, 1) } + case "linkedClusters": + + out.Values[i] = ec._ConsoleVPNDevice_linkedClusters(ctx, field, obj) + case "markedForDeletion": out.Values[i] = ec._ConsoleVPNDevice_markedForDeletion(ctx, field, obj) @@ -44324,6 +44636,29 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) } + out.Concurrently(i, func() graphql.Marshaler { + return rrm(innerCtx) + }) + case "core_restartApp": + field := field + + innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_core_restartApp(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + } + out.Concurrently(i, func() graphql.Marshaler { return rrm(innerCtx) }) @@ -44725,6 +45060,29 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) } + out.Concurrently(i, func() graphql.Marshaler { + return rrm(innerCtx) + }) + case "core_restartProjectManagedService": + field := field + + innerFunc := func(ctx context.Context) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_core_restartProjectManagedService(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, innerFunc) + } + out.Concurrently(i, func() graphql.Marshaler { return rrm(innerCtx) }) @@ -47532,7 +47890,7 @@ func (ec *executionContext) marshalN__TypeKind2string(ctx context.Context, sel a return res } -func (ec *executionContext) unmarshalOAny2interface(ctx context.Context, v interface{}) (any, error) { +func (ec *executionContext) unmarshalOAny2interface(ctx context.Context, v interface{}) (interface{}, error) { if v == nil { return nil, nil } @@ -47540,7 +47898,7 @@ func (ec *executionContext) unmarshalOAny2interface(ctx context.Context, v inter return res, graphql.ErrorOnPath(ctx, err) } -func (ec *executionContext) marshalOAny2interface(ctx context.Context, sel ast.SelectionSet, v any) graphql.Marshaler { +func (ec *executionContext) marshalOAny2interface(ctx context.Context, sel ast.SelectionSet, v interface{}) graphql.Marshaler { if v == nil { return graphql.Null } diff --git a/apps/console/internal/app/graph/schema.graphqls b/apps/console/internal/app/graph/schema.graphqls index 65179c128..ec07daab6 100644 --- a/apps/console/internal/app/graph/schema.graphqls +++ b/apps/console/internal/app/graph/schema.graphqls @@ -102,6 +102,7 @@ type Query { core_listApps(projectName: String!, envName: String!, search: SearchApps, pq: CursorPaginationIn): AppPaginatedRecords @isLoggedInAndVerified @hasAccount core_getApp(projectName: String!, envName: String!, name: String!): App @isLoggedInAndVerified @hasAccount core_resyncApp(projectName: String!, envName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount + core_restartApp(projectName: String!, envName: String!, appName: String!): Boolean! @isLoggedInAndVerified @hasAccount core_getConfigValues(projectName: String!, envName: String!, queries: [ConfigKeyRefIn]): [ConfigKeyValueRef!] @isLoggedInAndVerified @hasAccount core_listConfigs(projectName: String!, envName: String!, search: SearchConfigs, pq: CursorPaginationIn): ConfigPaginatedRecords @isLoggedInAndVerified @hasAccount @@ -117,7 +118,6 @@ type Query { core_getRouter(projectName: String!, envName: String!, name: String!): Router @isLoggedInAndVerified @hasAccount core_resyncRouter(projectName: String!, envName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount - core_getManagedResouceOutputKeys(projectName: String!, envName: String!, name: String!): [String!]! @isLoggedInAndVerified @hasAccount core_getManagedResouceOutputKeyValues(projectName: String!, envName: String!, keyrefs: [ManagedResourceKeyRefIn]): [ManagedResourceKeyValueRef!]! @isLoggedInAndVerified @hasAccount core_listManagedResources(projectName: String!, envName: String!, search: SearchManagedResources, pq: CursorPaginationIn): ManagedResourcePaginatedRecords @isLoggedInAndVerified @hasAccount @@ -126,7 +126,8 @@ type Query { core_listProjectManagedServices(projectName: String!, search: SearchProjectManagedService, pq: CursorPaginationIn): ProjectManagedServicePaginatedRecords @isLoggedInAndVerified @hasAccount core_getProjectManagedService(projectName: String!, name: String!): ProjectManagedService @isLoggedInAndVerified @hasAccount - core_resyncProjectManagedService(projectName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount + core_resyncProjectManagedService(projectName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount + core_restartProjectManagedService(projectName: String!, name: String!): Boolean! @isLoggedInAndVerified @hasAccount core_listVPNDevices(search: CoreSearchVPNDevices, pq: CursorPaginationIn): ConsoleVPNDevicePaginatedRecords @isLoggedInAndVerified @hasAccount core_listVPNDevicesForUser: [ConsoleVPNDevice!] @isLoggedInAndVerified @hasAccount diff --git a/apps/console/internal/app/graph/schema.resolvers.go b/apps/console/internal/app/graph/schema.resolvers.go index 6f016cd3f..53b7043ef 100644 --- a/apps/console/internal/app/graph/schema.resolvers.go +++ b/apps/console/internal/app/graph/schema.resolvers.go @@ -575,6 +575,18 @@ func (r *queryResolver) CoreResyncApp(ctx context.Context, projectName string, e return true, nil } +// CoreRestartApp is the resolver for the core_restartApp field. +func (r *queryResolver) CoreRestartApp(ctx context.Context, projectName string, envName string, appName string) (bool, error) { + cc, err := toConsoleContext(ctx) + if err != nil { + return false, errors.NewE(err) + } + if err := r.Domain.RestartApp(newResourceContext(cc, projectName, envName), appName); err != nil { + return false, err + } + return true, nil +} + // CoreGetConfigValues is the resolver for the core_getConfigValues field. func (r *queryResolver) CoreGetConfigValues(ctx context.Context, projectName string, envName string, queries []*domain.ConfigKeyRef) ([]*domain.ConfigKeyValueRef, error) { cc, err := toConsoleContext(ctx) @@ -881,6 +893,19 @@ func (r *queryResolver) CoreResyncProjectManagedService(ctx context.Context, pro return true, nil } +// CoreRestartProjectManagedService is the resolver for the core_restartProjectManagedService field. +func (r *queryResolver) CoreRestartProjectManagedService(ctx context.Context, projectName string, name string) (bool, error) { + cc, err := toConsoleContext(ctx) + if err != nil { + return false, errors.NewE(err) + } + + if err := r.Domain.RestartProjectManagedService(cc, projectName, name); err != nil { + return false, err + } + return true, nil +} + // CoreListVPNDevices is the resolver for the core_listVPNDevices field. func (r *queryResolver) CoreListVPNDevices(ctx context.Context, search *model.CoreSearchVPNDevices, pq *repos.CursorPagination) (*model.ConsoleVPNDevicePaginatedRecords, error) { filter := map[string]repos.MatchFilter{} @@ -935,3 +960,13 @@ func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} } type mutationResolver struct{ *Resolver } type queryResolver struct{ *Resolver } + +// !!! WARNING !!! +// The code below was going to be deleted when updating resolvers. It has been copied here so you have +// one last chance to move it out of harms way if you want. There are two reasons this happens: +// - When renaming or deleting a resolver the old code will be put in here. You can safely delete +// it when you're done. +// - You have helper methods in this file. Move them out to keep these resolver files clean. +func (r *mutationResolver) CoreRestartApp(ctx context.Context, projectName string, envName string, appName string) (bool, error) { + panic(fmt.Errorf("not implemented: CoreRestartApp - core_restartApp")) +} diff --git a/apps/console/internal/domain/api.go b/apps/console/internal/domain/api.go index 041ce66bb..ee94f677c 100644 --- a/apps/console/internal/domain/api.go +++ b/apps/console/internal/domain/api.go @@ -2,9 +2,10 @@ package domain import ( "context" - "github.com/kloudlite/api/common/fields" "time" + "github.com/kloudlite/api/common/fields" + crdsv1 "github.com/kloudlite/operator/apis/crds/v1" wgv1 "github.com/kloudlite/operator/apis/wireguard/v1" @@ -150,6 +151,7 @@ type Domain interface { DeleteApp(ctx ResourceContext, name string) error InterceptApp(ctx ResourceContext, appName string, deviceName string, intercept bool) (bool, error) + RestartApp(ctx ResourceContext, appName string) error OnAppApplyError(ctx ResourceContext, errMsg string, name string, opts UpdateAndDeleteOpts) error OnAppDeleteMessage(ctx ResourceContext, app entities.App) error @@ -234,6 +236,9 @@ type Domain interface { CreateProjectManagedService(ctx ConsoleContext, projectName string, service entities.ProjectManagedService) (*entities.ProjectManagedService, error) UpdateProjectManagedService(ctx ConsoleContext, projectName string, service entities.ProjectManagedService) (*entities.ProjectManagedService, error) DeleteProjectManagedService(ctx ConsoleContext, projectName string, name string) error + + RestartProjectManagedService(ctx ConsoleContext, projectName string, name string) error + OnProjectManagedServiceApplyError(ctx ConsoleContext, projectName, name, errMsg string, opts UpdateAndDeleteOpts) error OnProjectManagedServiceDeleteMessage(ctx ConsoleContext, projectName string, service entities.ProjectManagedService) error OnProjectManagedServiceUpdateMessage(ctx ConsoleContext, projectName string, service entities.ProjectManagedService, status types.ResourceStatus, opts UpdateAndDeleteOpts) error diff --git a/apps/console/internal/domain/app.go b/apps/console/internal/domain/app.go index c041102fd..474a7410a 100644 --- a/apps/console/internal/domain/app.go +++ b/apps/console/internal/domain/app.go @@ -147,7 +147,6 @@ func (d *domain) UpdateApp(ctx ResourceContext, appIn entities.App) (*entities.A ctx.DBFilters().Add(fields.MetadataName, appIn.Name), patchForUpdate, ) - if err != nil { return nil, errors.NewE(err) } @@ -180,6 +179,23 @@ func (d *domain) InterceptApp(ctx ResourceContext, appName string, deviceName st return true, nil } +func (d *domain) RestartApp(ctx ResourceContext, appName string) error { + if err := d.canMutateResourcesInEnvironment(ctx); err != nil { + return errors.NewE(err) + } + + app, err := d.findApp(ctx, appName) + if err != nil { + return err + } + + if err := d.restartK8sResource(ctx, ctx.ProjectName, app.Namespace, app.GetEnsuredLabels()); err != nil { + return err + } + + return nil +} + func (d *domain) OnAppUpdateMessage(ctx ResourceContext, app entities.App, status types.ResourceStatus, opts UpdateAndDeleteOpts) error { xApp, err := d.findApp(ctx, app.Name) if err != nil { diff --git a/apps/console/internal/domain/domain.go b/apps/console/internal/domain/domain.go index 3c663c5ff..f65647219 100644 --- a/apps/console/internal/domain/domain.go +++ b/apps/console/internal/domain/domain.go @@ -17,6 +17,7 @@ import ( "github.com/kloudlite/api/pkg/messaging" msgTypes "github.com/kloudlite/api/pkg/messaging/types" "github.com/kloudlite/api/pkg/types" + // "github.com/kloudlite/operator/pkg/constants" "github.com/kloudlite/api/constants" @@ -32,6 +33,7 @@ import ( fn "github.com/kloudlite/api/pkg/functions" "github.com/kloudlite/api/pkg/k8s" "github.com/kloudlite/api/pkg/repos" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) type MessageDispatcher messaging.Producer @@ -134,8 +136,45 @@ func (d *domain) applyK8sResource(ctx K8sContext, projectName string, obj client return errors.NewE(err) } -func (d *domain) deleteK8sResourceOfCluster(ctx K8sContext, clusterName string, obj client.Object) error { +func (d *domain) restartK8sResource(ctx K8sContext, projectName string, namespace string, labels map[string]string) error { + clusterName, err := d.getClusterAttachedToProject(ctx, projectName) + if err != nil { + return errors.NewE(err) + } + + if clusterName == nil || *clusterName == "" { + return nil + } + + obj := unstructured.Unstructured{ + Object: map[string]any{ + "metadata": map[string]any{ + "namespace": namespace, + "labels": labels, + }, + }, + } + b, err := json.Marshal(t.AgentMessage{ + AccountName: ctx.GetAccountName(), + ClusterName: *clusterName, + Action: t.ActionRestart, + Object: obj.Object, + }) + if err != nil { + return errors.NewE(err) + } + + subject := common.GetTenantClusterMessagingTopic(ctx.GetAccountName(), *clusterName) + + err = d.producer.Produce(ctx, msgTypes.ProduceMsg{ + Subject: subject, + Payload: b, + }) + return errors.NewE(err) +} + +func (d *domain) deleteK8sResourceOfCluster(ctx K8sContext, clusterName string, obj client.Object) error { if obj.GetObjectKind().GroupVersionKind().Empty() { return errors.Newf("object GVK is not set, can not apply") } diff --git a/apps/console/internal/domain/names.go b/apps/console/internal/domain/names.go index f920a9a85..1a4c136dd 100644 --- a/apps/console/internal/domain/names.go +++ b/apps/console/internal/domain/names.go @@ -2,6 +2,7 @@ package domain import ( "context" + "github.com/kloudlite/api/common/fields" "github.com/kloudlite/api/apps/console/internal/entities" @@ -22,7 +23,7 @@ func checkResourceName[T repos.Entity](ctx context.Context, filters repos.Filter return &CheckNameAvailabilityOutput{ Result: false, - SuggestedNames: fn.GenValidK8sResourceNames(filters[fields.Metadata].(string), 3), + SuggestedNames: fn.GenValidK8sResourceNames(filters[fields.MetadataName].(string), 3), }, nil } diff --git a/apps/console/internal/domain/project-managed-service.go b/apps/console/internal/domain/project-managed-service.go index c39931155..b9e781c10 100644 --- a/apps/console/internal/domain/project-managed-service.go +++ b/apps/console/internal/domain/project-managed-service.go @@ -2,6 +2,7 @@ package domain import ( "fmt" + "github.com/kloudlite/api/apps/console/internal/entities" "github.com/kloudlite/api/common/fields" @@ -153,7 +154,7 @@ func (d *domain) UpdateProjectManagedService(ctx ConsoleContext, projectName str &service, common.PatchOpts{ XPatch: repos.Document{ - fc.ProjectManagedServiceSpec: service.Spec, + fc.ProjectManagedServiceSpecMsvcSpecServiceTemplateSpec: service.Spec.MSVCSpec.ServiceTemplate.Spec, }, }) @@ -200,6 +201,24 @@ func (d *domain) DeleteProjectManagedService(ctx ConsoleContext, projectName str return d.deleteK8sResource(ctx, projectName, &upmsvc.ProjectManagedService) } +// RestartProjectManagedService implements Domain. +func (d *domain) RestartProjectManagedService(ctx ConsoleContext, projectName string, name string) error { + if err := d.canMutateResourcesInProject(ctx, projectName); err != nil { + return errors.NewE(err) + } + + pms, err := d.findProjectManagedService(ctx, projectName, name) + if err != nil { + return errors.NewE(err) + } + + if err := d.restartK8sResource(ctx, projectName, pms.Spec.TargetNamespace, pms.GetEnsuredLabels()); err != nil { + return err + } + + return nil +} + func (d *domain) OnProjectManagedServiceApplyError(ctx ConsoleContext, projectName, name, errMsg string, opts UpdateAndDeleteOpts) error { upmsvc, err := d.pmsRepo.Patch( ctx, @@ -214,7 +233,6 @@ func (d *domain) OnProjectManagedServiceApplyError(ctx ConsoleContext, projectNa }, ), ) - if err != nil { return errors.NewE(err) } @@ -267,7 +285,6 @@ func (d *domain) OnProjectManagedServiceUpdateMessage(ctx ConsoleContext, projec fc.ProjectManagedServiceSyncedOutputSecretRef: service.SyncedOutputSecretRef, }, })) - if err != nil { return errors.NewE(err) } diff --git a/apps/infra/internal/app/process-resource-updates.go b/apps/infra/internal/app/process-resource-updates.go index 6476b9a72..99f33c30a 100644 --- a/apps/infra/internal/app/process-resource-updates.go +++ b/apps/infra/internal/app/process-resource-updates.go @@ -65,19 +65,9 @@ func processResourceUpdates(consumer ReceiveResourceUpdatesConsumer, d domain.Do return nil } - obj := unstructured.Unstructured{Object: su.Object} - mLogger := logger.WithKV( - "gvk", obj.GetObjectKind().GroupVersionKind(), - "accountName/clusterName", fmt.Sprintf("%s/%s", su.AccountName, su.ClusterName), - ) - - mLogger.Infof("received message") - defer func() { - mLogger.Infof("processed message") - }() - dctx := domain.InfraContext{Context: context.TODO(), UserId: "sys-user-process-infra-updates", AccountName: su.AccountName} + obj := unstructured.Unstructured{Object: su.Object} gvkStr := obj.GetObjectKind().GroupVersionKind().String() resStatus, err := func() (types.ResourceStatus, error) { @@ -96,6 +86,18 @@ func processResourceUpdates(consumer ReceiveResourceUpdatesConsumer, d domain.Do return err } + mLogger := logger.WithKV( + "gvk", obj.GetObjectKind().GroupVersionKind(), + "NN", fmt.Sprintf("%s/%s", obj.GetNamespace(), obj.GetName()), + "resource-status", resStatus, + "accountName/clusterName", fmt.Sprintf("%s/%s", su.AccountName, su.ClusterName), + ) + + mLogger.Infof("received message") + defer func() { + mLogger.Infof("processed message") + }() + switch gvkStr { case clusterGVK.String(): { diff --git a/apps/tenant-agent/main.go b/apps/tenant-agent/main.go index 5dde81765..92524c91c 100644 --- a/apps/tenant-agent/main.go +++ b/apps/tenant-agent/main.go @@ -89,7 +89,7 @@ func (g *grpcHandler) handleMessage(msg t.AgentMessage) error { } switch msg.Action { - case "apply", "delete": + case t.ActionApply: { ann := obj.GetAnnotations() if ann == nil { @@ -105,31 +105,81 @@ func (g *grpcHandler) handleMessage(msg t.AgentMessage) error { return g.handleErrorOnApply(ctx, err, msg) } - if msg.Action == "apply" { - if _, err := g.yamlClient.ApplyYAML(ctx, b); err != nil { - mLogger.Infof("[%d] [error-on-apply]: %s", g.inMemCounter, err.Error()) - mLogger.Infof("[%d] failed to process message", g.inMemCounter) + if _, err := g.yamlClient.ApplyYAML(ctx, b); err != nil { + mLogger.Infof("[%d] [error-on-apply]: %s", g.inMemCounter, err.Error()) + mLogger.Infof("[%d] failed to process message", g.inMemCounter) + return g.handleErrorOnApply(ctx, err, msg) + } + mLogger.Infof("[%d] processed message", g.inMemCounter) + } + case t.ActionDelete: + { + if err := g.yamlClient.DeleteResource(ctx, &obj); err != nil { + mLogger.Infof("[%d] [error-on-delete]: %v", g.inMemCounter, err) + if apiErrors.IsNotFound(err) { + mLogger.Infof("[%d] processed message, resource does not exist, might already be deleted", g.inMemCounter) return g.handleErrorOnApply(ctx, err, msg) } - mLogger.Infof("[%d] processed message", g.inMemCounter) - return nil + mLogger.Infof("[%d] failed to process message", g.inMemCounter) + } + mLogger.Infof("[%d] processed message", g.inMemCounter) + } + case t.ActionRestart: + { + if err := g.yamlClient.RolloutRestart(ctx, kubectl.Deployment, obj.GetNamespace(), obj.GetLabels()); err != nil { + return err } + mLogger.Infof("[%d] rolled out deployments", g.inMemCounter) - if msg.Action == "delete" { - err := g.yamlClient.DeleteYAML(ctx, b) - if err != nil { - mLogger.Infof("[%d] [error-on-delete]: %v", g.inMemCounter, err) - if apiErrors.IsNotFound(err) { - mLogger.Infof("[%d] process message", g.inMemCounter) - return g.handleErrorOnApply(ctx, err, msg) - } - mLogger.Infof("[%d] failed to process message", g.inMemCounter) - } - mLogger.Infof("[%d] processed message", g.inMemCounter) - return nil + if err := g.yamlClient.RolloutRestart(ctx, kubectl.StatefulSet, obj.GetNamespace(), obj.GetLabels()); err != nil { + return err } - return nil + + mLogger.Infof("[%d] rolled out statefulsets", g.inMemCounter) + mLogger.Infof("[%d] processed message", g.inMemCounter) } + + // case t.ActionApply, t.ActionDelete: + // { + // ann := obj.GetAnnotations() + // if ann == nil { + // ann = make(map[string]string, 2) + // } + // + // ann[constants.ObservabilityAccountNameKey] = g.ev.AccountName + // ann[constants.ObservabilityClusterNameKey] = g.ev.ClusterName + // obj.SetAnnotations(ann) + // + // b, err := yaml.Marshal(msg.Object) + // if err != nil { + // return g.handleErrorOnApply(ctx, err, msg) + // } + // + // if msg.Action == "apply" { + // if _, err := g.yamlClient.ApplyYAML(ctx, b); err != nil { + // mLogger.Infof("[%d] [error-on-apply]: %s", g.inMemCounter, err.Error()) + // mLogger.Infof("[%d] failed to process message", g.inMemCounter) + // return g.handleErrorOnApply(ctx, err, msg) + // } + // mLogger.Infof("[%d] processed message", g.inMemCounter) + // return nil + // } + // + // if msg.Action == "delete" { + // err := g.yamlClient.DeleteYAML(ctx, b) + // if err != nil { + // mLogger.Infof("[%d] [error-on-delete]: %v", g.inMemCounter, err) + // if apiErrors.IsNotFound(err) { + // mLogger.Infof("[%d] process message", g.inMemCounter) + // return g.handleErrorOnApply(ctx, err, msg) + // } + // mLogger.Infof("[%d] failed to process message", g.inMemCounter) + // } + // mLogger.Infof("[%d] processed message", g.inMemCounter) + // return nil + // } + // return nil + // } default: { err := errors.Newf("invalid action (%s)", msg.Action) @@ -138,6 +188,8 @@ func (g *grpcHandler) handleMessage(msg t.AgentMessage) error { return g.handleErrorOnApply(ctx, err, msg) } } + + return nil } func (g *grpcHandler) ensureAccessToken() error { diff --git a/apps/tenant-agent/types/types.go b/apps/tenant-agent/types/types.go index 65189e3a6..5415b8810 100644 --- a/apps/tenant-agent/types/types.go +++ b/apps/tenant-agent/types/types.go @@ -3,8 +3,9 @@ package types type Action string const ( - ActionApply Action = "apply" - ActionDelete Action = "delete" + ActionApply Action = "apply" + ActionDelete Action = "delete" + ActionRestart Action = "restart" ) type AgentMessage struct { From 445274c13eef8a706f41da456d83e0d54acbdfff Mon Sep 17 00:00:00 2001 From: nxtcoder17 Date: Fri, 26 Jan 2024 00:42:50 +0530 Subject: [PATCH 4/5] docs(github issue template): updates assignees --- .github/ISSUE_TEMPLATE/0-feature.md | 2 +- .github/ISSUE_TEMPLATE/1-bug.md | 5 ++--- TASKS.md | 3 --- 3 files changed, 3 insertions(+), 7 deletions(-) delete mode 100644 TASKS.md diff --git a/.github/ISSUE_TEMPLATE/0-feature.md b/.github/ISSUE_TEMPLATE/0-feature.md index 46baf8b57..078d07500 100644 --- a/.github/ISSUE_TEMPLATE/0-feature.md +++ b/.github/ISSUE_TEMPLATE/0-feature.md @@ -3,7 +3,7 @@ name: "✨ New Feature" about: Suggest an idea title: "✨ " labels: enhancement -assignees: "karthik1729" +assignees: "nxtcoder17" projects: Kloudlite --- diff --git a/.github/ISSUE_TEMPLATE/1-bug.md b/.github/ISSUE_TEMPLATE/1-bug.md index 3c4153f1d..40c926c25 100644 --- a/.github/ISSUE_TEMPLATE/1-bug.md +++ b/.github/ISSUE_TEMPLATE/1-bug.md @@ -3,7 +3,7 @@ name: "🐛 Bug Report" about: Create a bug report to help us improve title: "🐛 " labels: bug -assignees: karthik1729 +assignees: nxtcoder17 projects: kloudlite --- @@ -11,8 +11,7 @@ projects: kloudlite ### Describe the Bug ... -### To Reproduce -Steps to reproduce the behavior: +### How To Reproduce 1. ... 2. ... diff --git a/TASKS.md b/TASKS.md deleted file mode 100644 index 68caf673a..000000000 --- a/TASKS.md +++ /dev/null @@ -1,3 +0,0 @@ -- [x] Helm Updates from BYOC Deployments from remote BYOC cluster -- [] Creation of container registry protect and user (pull/push) on creation of account (finance -> apply to k8s new Account) -- [] Protected access needs to be changed to websockets (from remote cluster => kloudlite cluster) From 092680d6ef5a270ac132968699735710e6f0c09d Mon Sep 17 00:00:00 2001 From: nxtcoder17 Date: Fri, 26 Jan 2024 01:00:17 +0530 Subject: [PATCH 5/5] chore: updates `kloudlite/operator` to latest release-1.0.5 - this update, adds support for restarting managed services --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 98114c4ef..a8106c511 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( require ( github.com/kloudlite/container-registry-authorizer v0.0.0-20231021122509-161dc30fde55 - github.com/kloudlite/operator v0.0.0-20240124071634-f1e66969c02c + github.com/kloudlite/operator v0.0.0-20240125192852-5c63464fe989 github.com/nats-io/nats.go v1.31.0 github.com/onsi/ginkgo/v2 v2.12.0 github.com/onsi/gomega v1.27.10 diff --git a/go.sum b/go.sum index 2fccf592f..f917dba56 100644 --- a/go.sum +++ b/go.sum @@ -166,6 +166,8 @@ github.com/kloudlite/operator v0.0.0-20240116073010-358659b6c673 h1:t3e61wr+c2jU github.com/kloudlite/operator v0.0.0-20240116073010-358659b6c673/go.mod h1:eD8xKzwOVtajAglELcEHn2XL4H22ERBLT2uaisA6SzQ= github.com/kloudlite/operator v0.0.0-20240124071634-f1e66969c02c h1:oo6k+eLZ8EULnjLtO0iGTLrw9pcBfWhqYnB8dGBaSvE= github.com/kloudlite/operator v0.0.0-20240124071634-f1e66969c02c/go.mod h1:eD8xKzwOVtajAglELcEHn2XL4H22ERBLT2uaisA6SzQ= +github.com/kloudlite/operator v0.0.0-20240125192852-5c63464fe989 h1:mHshQnMCWiqpHwYn87ARpYRVyN57q0ksOKCM4wXmeHc= +github.com/kloudlite/operator v0.0.0-20240125192852-5c63464fe989/go.mod h1:eD8xKzwOVtajAglELcEHn2XL4H22ERBLT2uaisA6SzQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=