Skip to content
This repository was archived by the owner on Jun 11, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .tools/nvim/__http__/infra/clusters.graphql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,14 @@ variables:
iamInstanceProfileRole: "EC2StorageAccess"

---
label: Upgrade Helm Kloudlite Agent
query: |+
mutation Infra_upgradeHelmKloudliteAgent($clusterName: String!) {
infra_upgradeHelmKloudliteAgent(clusterName: $clusterName)
}
variables:
clusterName: "ab-cluster-3"
---

label: Delete Cluster
query: |+
Expand Down
125 changes: 123 additions & 2 deletions apps/infra/internal/app/graph/generated/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions apps/infra/internal/app/graph/schema.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ type Mutation {
infra_deleteCluster(name: String!): Boolean! @isLoggedInAndVerified @hasAccount
# infra_resyncCluster(name: String!): Boolean! @isLoggedInAndVerified @hasAccount

infra_upgradeHelmKloudliteAgent(clusterName: String!): Boolean! @isLoggedInAndVerified @hasAccount

infra_createProviderSecret(secret: CloudProviderSecretIn!): CloudProviderSecret @isLoggedInAndVerified @hasAccount
infra_updateProviderSecret(secret: CloudProviderSecretIn!): CloudProviderSecret @isLoggedInAndVerified @hasAccount
infra_deleteProviderSecret(secretName: String!): Boolean! @isLoggedInAndVerified @hasAccount
Expand Down
23 changes: 20 additions & 3 deletions apps/infra/internal/app/graph/schema.resolvers.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion apps/infra/internal/domain/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ package domain

import (
"context"
networkingv1 "k8s.io/api/networking/v1"
"time"

networkingv1 "k8s.io/api/networking/v1"

"github.com/kloudlite/api/apps/infra/internal/entities"
"github.com/kloudlite/api/pkg/repos"
"github.com/kloudlite/operator/operators/resource-watcher/types"
Expand Down Expand Up @@ -54,6 +55,8 @@ type Domain interface {
UpdateCluster(ctx InfraContext, cluster entities.Cluster) (*entities.Cluster, error)
DeleteCluster(ctx InfraContext, name string) error

UpgradeHelmKloudliteAgent(ctx InfraContext, clusterName string) error

ListClusters(ctx InfraContext, search map[string]repos.MatchFilter, pagination repos.CursorPagination) (*repos.PaginatedRecord[*entities.Cluster], error)
GetCluster(ctx InfraContext, name string) (*entities.Cluster, error)

Expand Down
31 changes: 24 additions & 7 deletions apps/infra/internal/domain/clusters.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,22 +261,23 @@ func (d *domain) CreateCluster(ctx InfraContext, cluster entities.Cluster) (*ent

d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeCluster, nCluster.Name, PublishAdd)

if err := d.applyHelmKloudliteAgent(ctx, nCluster, string(tokenScrt.Data[keyClusterToken])); err != nil {
if err := d.applyHelmKloudliteAgent(ctx, nCluster.Name, string(tokenScrt.Data[keyClusterToken])); err != nil {
return nil, errors.NewE(err)
}

return nCluster, nil
}

func (d *domain) applyHelmKloudliteAgent(ctx InfraContext, cluster *entities.Cluster, clusterToken string) error {
func (d *domain) applyHelmKloudliteAgent(ctx InfraContext, clusterName string, clusterToken string) error {
b, err := templates.Read(templates.HelmKloudliteAgent)
if err != nil {
return errors.NewE(err)
}

b2, err := templates.ParseBytes(b, map[string]any{
"account-name": ctx.AccountName,
"cluster-name": cluster.Name,
"account-name": ctx.AccountName,

"cluster-name": clusterName,
"cluster-token": clusterToken,

"kloudlite-release": d.env.KloudliteRelease,
Expand Down Expand Up @@ -312,18 +313,34 @@ func (d *domain) applyHelmKloudliteAgent(ctx InfraContext, cluster *entities.Clu
},
},
AccountName: ctx.AccountName,
ClusterName: cluster.Name,
ClusterName: clusterName,
SyncStatus: t.GenSyncStatus(t.SyncActionApply, 0),
}

hr.IncrementRecordVersion()

uhr, err := d.upsertHelmRelease(ctx, cluster.Name, &hr)
uhr, err := d.upsertHelmRelease(ctx, clusterName, &hr)
if err != nil {
return errors.NewE(err)
}

if err := d.resDispatcher.ApplyToTargetCluster(ctx, clusterName, &uhr.HelmChart, uhr.RecordVersion); err != nil {
return errors.NewE(err)
}

return nil
}

func (d *domain) UpgradeHelmKloudliteAgent(ctx InfraContext, clusterName string) error {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (llm): The introduction of UpgradeHelmKloudliteAgent is a significant addition. It's crucial to ensure that the upgrade process is idempotent. Given the nature of Helm upgrades, if the same version is applied, it should not result in changes or errors. This is important for maintaining stability in automated environments.

out, err := d.messageOfficeInternalClient.GetClusterToken(ctx, &message_office_internal.GetClusterTokenIn{
AccountName: ctx.AccountName,
ClusterName: clusterName,
})
if err != nil {
return errors.NewE(err)
}

if err := d.resDispatcher.ApplyToTargetCluster(ctx, cluster.Name, &uhr.HelmChart, uhr.RecordVersion); err != nil {
if err := d.applyHelmKloudliteAgent(ctx, clusterName, out.ClusterToken); err != nil {
return errors.NewE(err)
}

Expand Down
4 changes: 1 addition & 3 deletions apps/message-office/internal/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,7 @@ var Module = fx.Module("app",
}
}),

fx.Provide(func(d domain.Domain) message_office_internal.MessageOfficeInternalServer {
return newInternalMsgServer(d)
}),
fx.Provide(newInternalMsgServer),

fx.Invoke(func(server InternalGrpcServer, internalMsgServer message_office_internal.MessageOfficeInternalServer) {
message_office_internal.RegisterMessageOfficeInternalServer(server, internalMsgServer)
Expand Down
4 changes: 2 additions & 2 deletions apps/message-office/internal/app/grpc-server.go
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ func (g *grpcServer) processError(ctx context.Context, accountName string, clust
}

// GetAccessToken implements messages.MessageDispatchServiceServer
func (g *grpcServer) GetAccessToken(ctx context.Context, msg *messages.GetClusterTokenIn) (*messages.GetClusterTokenOut, error) {
func (g *grpcServer) GetAccessToken(ctx context.Context, msg *messages.GetAccessTokenIn) (*messages.GetAccessTokenOut, error) {
g.logger.Infof("request received for cluster-token (%q) exchange", msg.ClusterToken)

ct, err := g.domain.GetClusterToken(ctx, msg.AccountName, msg.ClusterName)
Expand All @@ -297,7 +297,7 @@ func (g *grpcServer) GetAccessToken(ctx context.Context, msg *messages.GetCluste
s := encodeAccessToken(msg.AccountName, msg.ClusterName, msg.ClusterToken, g.ev.TokenHashingSecret)
g.logger.Infof("SUCCESSFUL cluster-token exchange for account=%q, cluster=%q", msg.ClusterToken, msg.AccountName, msg.ClusterName)

return &messages.GetClusterTokenOut{
return &messages.GetAccessTokenOut{
AccessToken: s,
}, nil
}
Expand Down
13 changes: 12 additions & 1 deletion apps/message-office/internal/app/internal-grpc-server.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package app

import (
"context"

"github.com/kloudlite/api/apps/message-office/internal/domain"
"github.com/kloudlite/api/grpc-interfaces/kloudlite.io/rpc/message-office-internal"
"github.com/kloudlite/api/pkg/errors"
Expand All @@ -22,6 +23,16 @@ func (s *internalMsgServer) GenerateClusterToken(ctx context.Context, in *messag
}, nil
}

func newInternalMsgServer(d domain.Domain) *internalMsgServer {
func (s *internalMsgServer) GetClusterToken(ctx context.Context, in *message_office_internal.GetClusterTokenIn) (*message_office_internal.GetClusterTokenOut, error) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (llm): Implementing the GetClusterToken method is crucial for the functionality of the MessageOfficeInternal service. It's important to ensure proper error handling and validation of input parameters to maintain the integrity of the service.

token, err := s.d.GetClusterToken(ctx, in.AccountName, in.ClusterName)
if err != nil {
return nil, errors.NewE(err)
}
return &message_office_internal.GetClusterTokenOut{
ClusterToken: token,
}, nil
}

func newInternalMsgServer(d domain.Domain) message_office_internal.MessageOfficeInternalServer {
return &internalMsgServer{d: d}
}
Loading