From 3f1825ffa8c953ee2464bcb7bbfb9116f0597623 Mon Sep 17 00:00:00 2001 From: Abdhesh Nayak Date: Wed, 7 Feb 2024 18:57:22 +0530 Subject: [PATCH 01/15] :bug: Fixed issue with memory leak on socket-server --- apps/websocket-server/internal/domain/logs.go | 82 ++++++++++--------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/apps/websocket-server/internal/domain/logs.go b/apps/websocket-server/internal/domain/logs.go index 232a0dd69..8f171691b 100644 --- a/apps/websocket-server/internal/domain/logs.go +++ b/apps/websocket-server/internal/domain/logs.go @@ -242,54 +242,56 @@ func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) continue } - if err := jc.Consume( - func(msg *types.ConsumeMsg) error { - if c != nil { - var resp MessageResponse - if err := json.Unmarshal(msg.Payload, &resp); err != nil { - if err := writeError(c, err); err != nil { + resources[hash] = &Subscription{ + resource: msg.Data, + jc: jc, + open: true, + } + + go func() { + + if err := writeInfo(c, "subscribed to logs"); err != nil { + log.Warnf("websocket write: %w", err) + } + + if err := jc.Consume( + func(msg *types.ConsumeMsg) error { + if c != nil { + var resp MessageResponse + if err := json.Unmarshal(msg.Payload, &resp); err != nil { + if err := writeError(c, err); err != nil { + log.Warnf("websocket write: %w", err) + } + } + resp.Type = MessageTypeLog + sp := strings.Split(msg.Subject, ".") + resp.Spec = &MsgSpec{ + PodName: sp[len(sp)-2], + ContainerName: sp[len(sp)-1], + } + if err := c.WriteJSON(resp); err != nil { log.Warnf("websocket write: %w", err) } } - resp.Type = MessageTypeLog - sp := strings.Split(msg.Subject, ".") - resp.Spec = &MsgSpec{ - PodName: sp[len(sp)-2], - ContainerName: sp[len(sp)-1], - } - if err := c.WriteJSON(resp); err != nil { - log.Warnf("websocket write: %w", err) - } - } - return nil - }, - types.ConsumeOpts{ - OnError: func(err error) error { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } + return nil + }, + types.ConsumeOpts{ + OnError: func(err error) error { + if err := writeError(c, err); err != nil { + log.Warnf("websocket write: %w", err) + } - return err + return err + }, }, - }, - ); err != nil { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) + ); err != nil { + if err := writeError(c, err); err != nil { + log.Warnf("websocket write: %w", err) + } } - continue - } - - if err := writeInfo(c, "subscribed to logs"); err != nil { - log.Warnf("websocket write: %w", err) - } - - resources[hash] = &Subscription{ - resource: msg.Data, - jc: jc, - open: true, - } + }() case "unsubscribe": if _, ok := resources[hash]; !ok { From 960db9cb0321123c7c4a3f38ef2012355b720fdd Mon Sep 17 00:00:00 2001 From: Abdhesh Nayak Date: Wed, 7 Feb 2024 18:57:22 +0530 Subject: [PATCH 02/15] :bug: Fixed issue with memory leak on socket-server --- apps/websocket-server/internal/domain/logs.go | 82 ++++++++++--------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/apps/websocket-server/internal/domain/logs.go b/apps/websocket-server/internal/domain/logs.go index 232a0dd69..8f171691b 100644 --- a/apps/websocket-server/internal/domain/logs.go +++ b/apps/websocket-server/internal/domain/logs.go @@ -242,54 +242,56 @@ func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) continue } - if err := jc.Consume( - func(msg *types.ConsumeMsg) error { - if c != nil { - var resp MessageResponse - if err := json.Unmarshal(msg.Payload, &resp); err != nil { - if err := writeError(c, err); err != nil { + resources[hash] = &Subscription{ + resource: msg.Data, + jc: jc, + open: true, + } + + go func() { + + if err := writeInfo(c, "subscribed to logs"); err != nil { + log.Warnf("websocket write: %w", err) + } + + if err := jc.Consume( + func(msg *types.ConsumeMsg) error { + if c != nil { + var resp MessageResponse + if err := json.Unmarshal(msg.Payload, &resp); err != nil { + if err := writeError(c, err); err != nil { + log.Warnf("websocket write: %w", err) + } + } + resp.Type = MessageTypeLog + sp := strings.Split(msg.Subject, ".") + resp.Spec = &MsgSpec{ + PodName: sp[len(sp)-2], + ContainerName: sp[len(sp)-1], + } + if err := c.WriteJSON(resp); err != nil { log.Warnf("websocket write: %w", err) } } - resp.Type = MessageTypeLog - sp := strings.Split(msg.Subject, ".") - resp.Spec = &MsgSpec{ - PodName: sp[len(sp)-2], - ContainerName: sp[len(sp)-1], - } - if err := c.WriteJSON(resp); err != nil { - log.Warnf("websocket write: %w", err) - } - } - return nil - }, - types.ConsumeOpts{ - OnError: func(err error) error { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } + return nil + }, + types.ConsumeOpts{ + OnError: func(err error) error { + if err := writeError(c, err); err != nil { + log.Warnf("websocket write: %w", err) + } - return err + return err + }, }, - }, - ); err != nil { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) + ); err != nil { + if err := writeError(c, err); err != nil { + log.Warnf("websocket write: %w", err) + } } - continue - } - - if err := writeInfo(c, "subscribed to logs"); err != nil { - log.Warnf("websocket write: %w", err) - } - - resources[hash] = &Subscription{ - resource: msg.Data, - jc: jc, - open: true, - } + }() case "unsubscribe": if _, ok := resources[hash]; !ok { From 9ffe5f667ea3de81f2ca9031019dc4c3f826d85f Mon Sep 17 00:00:00 2001 From: nxtcoder17 Date: Thu, 8 Feb 2024 16:15:43 +0530 Subject: [PATCH 03/15] ci: workflow updates to build gateway container whenever other docker imagss are built --- .github/workflows/gateway-container.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/gateway-container.yml b/.github/workflows/gateway-container.yml index 44eab07d0..362e3d48e 100644 --- a/.github/workflows/gateway-container.yml +++ b/.github/workflows/gateway-container.yml @@ -1,6 +1,11 @@ name: build-gateway-image on: + workflow_run: + workflows: ["build-docker-images"] + types: + - completed + repository_dispatch: types: - webhook From fb4bbf6091a3eda88720fb6817f2900f2e4d463e Mon Sep 17 00:00:00 2001 From: Abdhesh Nayak Date: Thu, 8 Feb 2024 17:48:41 +0530 Subject: [PATCH 04/15] Fix/socket clean up (#258) * :bug: Fixed issue with memory leak on socket-server * :bug: Fixed issue with memory leak with websocket --- apps/websocket-server/internal/domain/logs.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apps/websocket-server/internal/domain/logs.go b/apps/websocket-server/internal/domain/logs.go index 8f171691b..39e5e2abd 100644 --- a/apps/websocket-server/internal/domain/logs.go +++ b/apps/websocket-server/internal/domain/logs.go @@ -142,6 +142,16 @@ func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) resources := make(map[string]*Subscription) + defer func() { + for _, v := range resources { + if v.jc != nil { + if err := v.jc.Stop(ctx); err != nil { + log.Warnf("stop jetstream consumer: %w", err) + } + } + } + }() + type Message struct { Event string `json:"event"` Data LogsReqData `json:"data"` From 20bca4a9be08e7a8f11eefff9a104b1cca10699b Mon Sep 17 00:00:00 2001 From: Piyush Kumar Date: Thu, 8 Feb 2024 19:19:09 +0530 Subject: [PATCH 05/15] fix(infra): added grpc api for cluster existance fix(console): implement project deletion even when cluster is deleted --- apps/console/internal/domain/project.go | 45 +++- apps/infra/internal/app/grpc-server.go | 19 ++ grpc-interfaces/infra.proto | 16 ++ .../kloudlite.io/rpc/accounts/accounts.pb.go | 2 +- .../rpc/accounts/accounts_grpc.pb.go | 10 +- .../kloudlite.io/rpc/agent/kubeagent.pb.go | 2 +- .../rpc/agent/kubeagent_grpc.pb.go | 10 +- .../kloudlite.io/rpc/auth/auth.pb.go | 2 +- .../kloudlite.io/rpc/auth/auth_grpc.pb.go | 20 +- grpc-interfaces/kloudlite.io/rpc/ci/ci.pb.go | 2 +- .../kloudlite.io/rpc/ci/ci_grpc.pb.go | 15 +- .../kloudlite.io/rpc/comms/comms.pb.go | 2 +- .../kloudlite.io/rpc/comms/comms_grpc.pb.go | 30 +-- .../kloudlite.io/rpc/console/console.pb.go | 2 +- .../rpc/console/console_grpc.pb.go | 25 +-- .../container-registry.pb.go | 2 +- .../container-registry_grpc.pb.go | 15 +- .../kloudlite.io/rpc/dns/dns.pb.go | 2 +- .../kloudlite.io/rpc/dns/dns_grpc.pb.go | 10 +- .../rpc/finance/finance-infra.pb.go | 2 +- .../rpc/finance/finance-infra_grpc.pb.go | 55 ++--- .../kloudlite.io/rpc/finance/finance.pb.go | 2 +- .../rpc/finance/finance_grpc.pb.go | 20 +- .../kloudlite.io/rpc/iam/iam.pb.go | 2 +- .../kloudlite.io/rpc/iam/iam_grpc.pb.go | 50 ++--- .../kloudlite.io/rpc/infra/infra.pb.go | 211 ++++++++++++++++-- .../kloudlite.io/rpc/infra/infra_grpc.pb.go | 51 ++++- .../kloudlite.io/rpc/jseval/jseval.pb.go | 2 +- .../kloudlite.io/rpc/jseval/jseval_grpc.pb.go | 10 +- .../message-office-internal.pb.go | 2 +- .../message-office-internal_grpc.pb.go | 10 +- 31 files changed, 422 insertions(+), 226 deletions(-) diff --git a/apps/console/internal/domain/project.go b/apps/console/internal/domain/project.go index f20e86b61..5f91bcd7a 100644 --- a/apps/console/internal/domain/project.go +++ b/apps/console/internal/domain/project.go @@ -5,6 +5,7 @@ import ( "crypto/md5" "encoding/hex" "fmt" + "github.com/kloudlite/api/grpc-interfaces/kloudlite.io/rpc/infra" "github.com/kloudlite/api/common/fields" "github.com/kloudlite/api/pkg/errors" @@ -59,6 +60,26 @@ func (d *domain) getClusterAttachedToProject(ctx K8sContext, projectName string) return fn.New(string(clusterName)), nil } +func (d *domain) clusterStatus(ctx ConsoleContext, projectName string) (*infra.ClusterExistsOut, error) { + prj, err := d.findProject(ctx, projectName) + if err != nil { + return nil, errors.NewE(err) + } + + clusterExistStatus, err := d.infraClient.ClusterExists(ctx, &infra.ClusterExistsIn{ + UserId: string(ctx.UserId), + UserName: ctx.UserName, + UserEmail: ctx.UserEmail, + AccountName: ctx.AccountName, + ClusterName: *prj.ClusterName, + }) + if err != nil { + return nil, errors.NewE(err) + } + + return clusterExistStatus, nil +} + func (d *domain) ListProjects(ctx context.Context, userId repos.ID, accountName string, search map[string]repos.MatchFilter, pagination repos.CursorPagination) (*repos.PaginatedRecord[*entities.Project], error) { co, err := d.iamClient.Can(ctx, &iam.CanIn{ UserId: string(userId), @@ -223,6 +244,26 @@ func (d *domain) DeleteProject(ctx ConsoleContext, name string) error { return errors.Newf("unauthorized to delete project") } + cluster, err := d.clusterStatus(ctx, name) + if err != nil { + return errors.NewE(err) + } + + if !cluster.Exists { + err := d.projectRepo.DeleteOne( + ctx, + repos.Filter{ + fields.AccountName: ctx.AccountName, + fields.MetadataName: name, + }, + ) + if err != nil { + return errors.NewE(err) + } + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeProject, name, PublishDelete) + return nil + } + uproj, err := d.projectRepo.Patch( ctx, repos.Filter{ @@ -302,7 +343,7 @@ func (d *domain) OnProjectDeleteMessage(ctx ConsoleContext, project entities.Pro if err != nil { return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeApp, project.Name, PublishDelete) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeProject, project.Name, PublishDelete) return nil } @@ -358,7 +399,7 @@ func (d *domain) OnProjectApplyError(ctx ConsoleContext, errMsg string, name str return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeApp, uproject.Name, PublishDelete) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeProject, uproject.Name, PublishDelete) return errors.NewE(err) } diff --git a/apps/infra/internal/app/grpc-server.go b/apps/infra/internal/app/grpc-server.go index 1ed0e085c..39aa8c05a 100644 --- a/apps/infra/internal/app/grpc-server.go +++ b/apps/infra/internal/app/grpc-server.go @@ -86,6 +86,25 @@ func (g *grpcServer) GetNodepool(ctx context.Context, in *infra.GetNodepoolIn) ( }, nil } +func (g *grpcServer) ClusterExists(ctx context.Context, in *infra.ClusterExistsIn) (*infra.ClusterExistsOut, error) { + infraCtx := domain.InfraContext{ + Context: ctx, + UserId: repos.ID(in.UserId), + UserEmail: in.UserEmail, + UserName: in.UserName, + AccountName: in.AccountName, + } + cluster, err := g.d.GetCluster(infraCtx, in.ClusterName) + if err != nil { + return nil, errors.NewE(err) + } + if cluster == nil { + return &infra.ClusterExistsOut{Exists: false}, nil + } + + return &infra.ClusterExistsOut{Exists: true}, nil +} + func newGrpcServer(d domain.Domain) infra.InfraServer { return &grpcServer{ d: d, diff --git a/grpc-interfaces/infra.proto b/grpc-interfaces/infra.proto index 93f3b567a..ec3e46e1a 100644 --- a/grpc-interfaces/infra.proto +++ b/grpc-interfaces/infra.proto @@ -5,6 +5,7 @@ option go_package = "kloudlite.io/rpc/infra"; service Infra { rpc GetCluster(GetClusterIn) returns (GetClusterOut); rpc GetNodepool(GetNodepoolIn) returns (GetNodepoolOut); + rpc ClusterExists(ClusterExistsIn) returns (ClusterExistsOut); } message GetClusterIn { @@ -38,3 +39,18 @@ message GetNodepoolOut { string IACJobName = 1; string IACJobNamespace = 2; } + +message ClusterExistsIn { + string userId = 1; + string userName = 2; + string userEmail = 3; + + string accountName = 4; + string clusterName = 5; +} + +message ClusterExistsOut { + bool exists = 1; +} + + diff --git a/grpc-interfaces/kloudlite.io/rpc/accounts/accounts.pb.go b/grpc-interfaces/kloudlite.io/rpc/accounts/accounts.pb.go index f84d0eadb..f56956db4 100644 --- a/grpc-interfaces/kloudlite.io/rpc/accounts/accounts.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/accounts/accounts.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.32.0 // protoc v4.24.4 // source: accounts.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/accounts/accounts_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/accounts/accounts_grpc.pb.go index 91b0b817c..beca1a899 100644 --- a/grpc-interfaces/kloudlite.io/rpc/accounts/accounts_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/accounts/accounts_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 v4.24.4 // source: accounts.proto @@ -18,10 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - Accounts_GetAccount_FullMethodName = "/Accounts/GetAccount" -) - // AccountsClient is the client API for Accounts 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. @@ -39,7 +35,7 @@ func NewAccountsClient(cc grpc.ClientConnInterface) AccountsClient { func (c *accountsClient) GetAccount(ctx context.Context, in *GetAccountIn, opts ...grpc.CallOption) (*GetAccountOut, error) { out := new(GetAccountOut) - err := c.cc.Invoke(ctx, Accounts_GetAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Accounts/GetAccount", in, out, opts...) if err != nil { return nil, err } @@ -84,7 +80,7 @@ func _Accounts_GetAccount_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Accounts_GetAccount_FullMethodName, + FullMethod: "/Accounts/GetAccount", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(AccountsServer).GetAccount(ctx, req.(*GetAccountIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/agent/kubeagent.pb.go b/grpc-interfaces/kloudlite.io/rpc/agent/kubeagent.pb.go index b69a7602d..df0445227 100644 --- a/grpc-interfaces/kloudlite.io/rpc/agent/kubeagent.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/agent/kubeagent.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.32.0 // protoc v4.24.4 // source: kubeagent.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/agent/kubeagent_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/agent/kubeagent_grpc.pb.go index 0d761c0bd..28fa37624 100644 --- a/grpc-interfaces/kloudlite.io/rpc/agent/kubeagent_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/agent/kubeagent_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 v4.24.4 // source: kubeagent.proto @@ -18,10 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - KubeAgent_KubeApply_FullMethodName = "/KubeAgent/KubeApply" -) - // KubeAgentClient is the client API for KubeAgent 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. @@ -39,7 +35,7 @@ func NewKubeAgentClient(cc grpc.ClientConnInterface) KubeAgentClient { func (c *kubeAgentClient) KubeApply(ctx context.Context, in *PayloadIn, opts ...grpc.CallOption) (*PayloadOut, error) { out := new(PayloadOut) - err := c.cc.Invoke(ctx, KubeAgent_KubeApply_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/KubeAgent/KubeApply", in, out, opts...) if err != nil { return nil, err } @@ -84,7 +80,7 @@ func _KubeAgent_KubeApply_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: KubeAgent_KubeApply_FullMethodName, + FullMethod: "/KubeAgent/KubeApply", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(KubeAgentServer).KubeApply(ctx, req.(*PayloadIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/auth/auth.pb.go b/grpc-interfaces/kloudlite.io/rpc/auth/auth.pb.go index e732090d6..bc0102096 100644 --- a/grpc-interfaces/kloudlite.io/rpc/auth/auth.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/auth/auth.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.32.0 // protoc v4.24.4 // source: auth.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/auth/auth_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/auth/auth_grpc.pb.go index d7b047468..0a3d22c95 100644 --- a/grpc-interfaces/kloudlite.io/rpc/auth/auth_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/auth/auth_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 v4.24.4 // source: auth.proto @@ -18,12 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - Auth_GetAccessToken_FullMethodName = "/Auth/GetAccessToken" - Auth_EnsureUserByEmail_FullMethodName = "/Auth/EnsureUserByEmail" - Auth_GetUser_FullMethodName = "/Auth/GetUser" -) - // AuthClient is the client API for Auth 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. @@ -43,7 +37,7 @@ func NewAuthClient(cc grpc.ClientConnInterface) AuthClient { func (c *authClient) GetAccessToken(ctx context.Context, in *GetAccessTokenRequest, opts ...grpc.CallOption) (*AccessTokenOut, error) { out := new(AccessTokenOut) - err := c.cc.Invoke(ctx, Auth_GetAccessToken_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Auth/GetAccessToken", in, out, opts...) if err != nil { return nil, err } @@ -52,7 +46,7 @@ func (c *authClient) GetAccessToken(ctx context.Context, in *GetAccessTokenReque func (c *authClient) EnsureUserByEmail(ctx context.Context, in *GetUserByEmailRequest, opts ...grpc.CallOption) (*GetUserByEmailOut, error) { out := new(GetUserByEmailOut) - err := c.cc.Invoke(ctx, Auth_EnsureUserByEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Auth/EnsureUserByEmail", in, out, opts...) if err != nil { return nil, err } @@ -61,7 +55,7 @@ func (c *authClient) EnsureUserByEmail(ctx context.Context, in *GetUserByEmailRe func (c *authClient) GetUser(ctx context.Context, in *GetUserIn, opts ...grpc.CallOption) (*GetUserOut, error) { out := new(GetUserOut) - err := c.cc.Invoke(ctx, Auth_GetUser_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Auth/GetUser", in, out, opts...) if err != nil { return nil, err } @@ -114,7 +108,7 @@ func _Auth_GetAccessToken_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Auth_GetAccessToken_FullMethodName, + FullMethod: "/Auth/GetAccessToken", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(AuthServer).GetAccessToken(ctx, req.(*GetAccessTokenRequest)) @@ -132,7 +126,7 @@ func _Auth_EnsureUserByEmail_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Auth_EnsureUserByEmail_FullMethodName, + FullMethod: "/Auth/EnsureUserByEmail", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(AuthServer).EnsureUserByEmail(ctx, req.(*GetUserByEmailRequest)) @@ -150,7 +144,7 @@ func _Auth_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Auth_GetUser_FullMethodName, + FullMethod: "/Auth/GetUser", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(AuthServer).GetUser(ctx, req.(*GetUserIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/ci/ci.pb.go b/grpc-interfaces/kloudlite.io/rpc/ci/ci.pb.go index 956a394a4..7a6f793b5 100644 --- a/grpc-interfaces/kloudlite.io/rpc/ci/ci.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/ci/ci.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.32.0 // protoc v4.24.4 // source: ci.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/ci/ci_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/ci/ci_grpc.pb.go index aa4fbd339..5792f1ea0 100644 --- a/grpc-interfaces/kloudlite.io/rpc/ci/ci_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/ci/ci_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 v4.24.4 // source: ci.proto @@ -18,11 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - CI_CreateHarborProject_FullMethodName = "/CI/CreateHarborProject" - CI_DeleteHarborProject_FullMethodName = "/CI/DeleteHarborProject" -) - // CIClient is the client API for CI 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. @@ -41,7 +36,7 @@ func NewCIClient(cc grpc.ClientConnInterface) CIClient { func (c *cIClient) CreateHarborProject(ctx context.Context, in *HarborProjectIn, opts ...grpc.CallOption) (*HarborProjectOut, error) { out := new(HarborProjectOut) - err := c.cc.Invoke(ctx, CI_CreateHarborProject_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/CI/CreateHarborProject", in, out, opts...) if err != nil { return nil, err } @@ -50,7 +45,7 @@ func (c *cIClient) CreateHarborProject(ctx context.Context, in *HarborProjectIn, func (c *cIClient) DeleteHarborProject(ctx context.Context, in *HarborProjectIn, opts ...grpc.CallOption) (*HarborProjectOut, error) { out := new(HarborProjectOut) - err := c.cc.Invoke(ctx, CI_DeleteHarborProject_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/CI/DeleteHarborProject", in, out, opts...) if err != nil { return nil, err } @@ -99,7 +94,7 @@ func _CI_CreateHarborProject_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: CI_CreateHarborProject_FullMethodName, + FullMethod: "/CI/CreateHarborProject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CIServer).CreateHarborProject(ctx, req.(*HarborProjectIn)) @@ -117,7 +112,7 @@ func _CI_DeleteHarborProject_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: CI_DeleteHarborProject_FullMethodName, + FullMethod: "/CI/DeleteHarborProject", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CIServer).DeleteHarborProject(ctx, req.(*HarborProjectIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/comms/comms.pb.go b/grpc-interfaces/kloudlite.io/rpc/comms/comms.pb.go index 645945bea..1cf5a8d98 100644 --- a/grpc-interfaces/kloudlite.io/rpc/comms/comms.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/comms/comms.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.32.0 // protoc v4.24.4 // source: comms.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/comms/comms_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/comms/comms_grpc.pb.go index 68f1c675e..922658e32 100644 --- a/grpc-interfaces/kloudlite.io/rpc/comms/comms_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/comms/comms_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 v4.24.4 // source: comms.proto @@ -18,14 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - Comms_SendVerificationEmail_FullMethodName = "/Comms/SendVerificationEmail" - Comms_SendPasswordResetEmail_FullMethodName = "/Comms/SendPasswordResetEmail" - Comms_SendAccountMemberInviteEmail_FullMethodName = "/Comms/SendAccountMemberInviteEmail" - Comms_SendProjectMemberInviteEmail_FullMethodName = "/Comms/SendProjectMemberInviteEmail" - Comms_SendWelcomeEmail_FullMethodName = "/Comms/SendWelcomeEmail" -) - // CommsClient is the client API for Comms 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. @@ -47,7 +39,7 @@ func NewCommsClient(cc grpc.ClientConnInterface) CommsClient { func (c *commsClient) SendVerificationEmail(ctx context.Context, in *VerificationEmailInput, opts ...grpc.CallOption) (*Void, error) { out := new(Void) - err := c.cc.Invoke(ctx, Comms_SendVerificationEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Comms/SendVerificationEmail", in, out, opts...) if err != nil { return nil, err } @@ -56,7 +48,7 @@ func (c *commsClient) SendVerificationEmail(ctx context.Context, in *Verificatio func (c *commsClient) SendPasswordResetEmail(ctx context.Context, in *PasswordResetEmailInput, opts ...grpc.CallOption) (*Void, error) { out := new(Void) - err := c.cc.Invoke(ctx, Comms_SendPasswordResetEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Comms/SendPasswordResetEmail", in, out, opts...) if err != nil { return nil, err } @@ -65,7 +57,7 @@ func (c *commsClient) SendPasswordResetEmail(ctx context.Context, in *PasswordRe func (c *commsClient) SendAccountMemberInviteEmail(ctx context.Context, in *AccountMemberInviteEmailInput, opts ...grpc.CallOption) (*Void, error) { out := new(Void) - err := c.cc.Invoke(ctx, Comms_SendAccountMemberInviteEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Comms/SendAccountMemberInviteEmail", in, out, opts...) if err != nil { return nil, err } @@ -74,7 +66,7 @@ func (c *commsClient) SendAccountMemberInviteEmail(ctx context.Context, in *Acco func (c *commsClient) SendProjectMemberInviteEmail(ctx context.Context, in *ProjectMemberInviteEmailInput, opts ...grpc.CallOption) (*Void, error) { out := new(Void) - err := c.cc.Invoke(ctx, Comms_SendProjectMemberInviteEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Comms/SendProjectMemberInviteEmail", in, out, opts...) if err != nil { return nil, err } @@ -83,7 +75,7 @@ func (c *commsClient) SendProjectMemberInviteEmail(ctx context.Context, in *Proj func (c *commsClient) SendWelcomeEmail(ctx context.Context, in *WelcomeEmailInput, opts ...grpc.CallOption) (*Void, error) { out := new(Void) - err := c.cc.Invoke(ctx, Comms_SendWelcomeEmail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Comms/SendWelcomeEmail", in, out, opts...) if err != nil { return nil, err } @@ -144,7 +136,7 @@ func _Comms_SendVerificationEmail_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Comms_SendVerificationEmail_FullMethodName, + FullMethod: "/Comms/SendVerificationEmail", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CommsServer).SendVerificationEmail(ctx, req.(*VerificationEmailInput)) @@ -162,7 +154,7 @@ func _Comms_SendPasswordResetEmail_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Comms_SendPasswordResetEmail_FullMethodName, + FullMethod: "/Comms/SendPasswordResetEmail", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CommsServer).SendPasswordResetEmail(ctx, req.(*PasswordResetEmailInput)) @@ -180,7 +172,7 @@ func _Comms_SendAccountMemberInviteEmail_Handler(srv interface{}, ctx context.Co } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Comms_SendAccountMemberInviteEmail_FullMethodName, + FullMethod: "/Comms/SendAccountMemberInviteEmail", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CommsServer).SendAccountMemberInviteEmail(ctx, req.(*AccountMemberInviteEmailInput)) @@ -198,7 +190,7 @@ func _Comms_SendProjectMemberInviteEmail_Handler(srv interface{}, ctx context.Co } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Comms_SendProjectMemberInviteEmail_FullMethodName, + FullMethod: "/Comms/SendProjectMemberInviteEmail", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CommsServer).SendProjectMemberInviteEmail(ctx, req.(*ProjectMemberInviteEmailInput)) @@ -216,7 +208,7 @@ func _Comms_SendWelcomeEmail_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Comms_SendWelcomeEmail_FullMethodName, + FullMethod: "/Comms/SendWelcomeEmail", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CommsServer).SendWelcomeEmail(ctx, req.(*WelcomeEmailInput)) diff --git a/grpc-interfaces/kloudlite.io/rpc/console/console.pb.go b/grpc-interfaces/kloudlite.io/rpc/console/console.pb.go index d1b22c3f7..c09616a9b 100644 --- a/grpc-interfaces/kloudlite.io/rpc/console/console.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/console/console.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.32.0 // protoc v4.24.4 // source: console.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/console/console_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/console/console_grpc.pb.go index d1ae92d93..21a48dd8c 100644 --- a/grpc-interfaces/kloudlite.io/rpc/console/console_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/console/console_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 v4.24.4 // source: console.proto @@ -18,13 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - Console_GetProjectName_FullMethodName = "/Console/GetProjectName" - Console_GetApp_FullMethodName = "/Console/GetApp" - Console_GetManagedSvc_FullMethodName = "/Console/GetManagedSvc" - Console_SetupAccount_FullMethodName = "/Console/SetupAccount" -) - // ConsoleClient is the client API for Console 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. @@ -45,7 +38,7 @@ func NewConsoleClient(cc grpc.ClientConnInterface) ConsoleClient { func (c *consoleClient) GetProjectName(ctx context.Context, in *ProjectIn, opts ...grpc.CallOption) (*ProjectOut, error) { out := new(ProjectOut) - err := c.cc.Invoke(ctx, Console_GetProjectName_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Console/GetProjectName", in, out, opts...) if err != nil { return nil, err } @@ -54,7 +47,7 @@ func (c *consoleClient) GetProjectName(ctx context.Context, in *ProjectIn, opts func (c *consoleClient) GetApp(ctx context.Context, in *AppIn, opts ...grpc.CallOption) (*AppOut, error) { out := new(AppOut) - err := c.cc.Invoke(ctx, Console_GetApp_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Console/GetApp", in, out, opts...) if err != nil { return nil, err } @@ -63,7 +56,7 @@ func (c *consoleClient) GetApp(ctx context.Context, in *AppIn, opts ...grpc.Call func (c *consoleClient) GetManagedSvc(ctx context.Context, in *MSvcIn, opts ...grpc.CallOption) (*MSvcOut, error) { out := new(MSvcOut) - err := c.cc.Invoke(ctx, Console_GetManagedSvc_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Console/GetManagedSvc", in, out, opts...) if err != nil { return nil, err } @@ -72,7 +65,7 @@ func (c *consoleClient) GetManagedSvc(ctx context.Context, in *MSvcIn, opts ...g func (c *consoleClient) SetupAccount(ctx context.Context, in *AccountSetupIn, opts ...grpc.CallOption) (*AccountSetupVoid, error) { out := new(AccountSetupVoid) - err := c.cc.Invoke(ctx, Console_SetupAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Console/SetupAccount", in, out, opts...) if err != nil { return nil, err } @@ -129,7 +122,7 @@ func _Console_GetProjectName_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Console_GetProjectName_FullMethodName, + FullMethod: "/Console/GetProjectName", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ConsoleServer).GetProjectName(ctx, req.(*ProjectIn)) @@ -147,7 +140,7 @@ func _Console_GetApp_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Console_GetApp_FullMethodName, + FullMethod: "/Console/GetApp", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ConsoleServer).GetApp(ctx, req.(*AppIn)) @@ -165,7 +158,7 @@ func _Console_GetManagedSvc_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Console_GetManagedSvc_FullMethodName, + FullMethod: "/Console/GetManagedSvc", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ConsoleServer).GetManagedSvc(ctx, req.(*MSvcIn)) @@ -183,7 +176,7 @@ func _Console_SetupAccount_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Console_SetupAccount_FullMethodName, + FullMethod: "/Console/SetupAccount", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ConsoleServer).SetupAccount(ctx, req.(*AccountSetupIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/container_registry/container-registry.pb.go b/grpc-interfaces/kloudlite.io/rpc/container_registry/container-registry.pb.go index 30582ea80..c3578853a 100644 --- a/grpc-interfaces/kloudlite.io/rpc/container_registry/container-registry.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/container_registry/container-registry.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.32.0 // protoc v4.24.4 // source: container-registry.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/container_registry/container-registry_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/container_registry/container-registry_grpc.pb.go index d43d00396..5a88a6ba2 100644 --- a/grpc-interfaces/kloudlite.io/rpc/container_registry/container-registry_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/container_registry/container-registry_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 v4.24.4 // source: container-registry.proto @@ -18,11 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - ContainerRegistry_CreateProjectForAccount_FullMethodName = "/ContainerRegistry/CreateProjectForAccount" - ContainerRegistry_GetSvcCredentials_FullMethodName = "/ContainerRegistry/GetSvcCredentials" -) - // ContainerRegistryClient is the client API for ContainerRegistry 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. @@ -41,7 +36,7 @@ func NewContainerRegistryClient(cc grpc.ClientConnInterface) ContainerRegistryCl func (c *containerRegistryClient) CreateProjectForAccount(ctx context.Context, in *CreateProjectIn, opts ...grpc.CallOption) (*CreateProjectOut, error) { out := new(CreateProjectOut) - err := c.cc.Invoke(ctx, ContainerRegistry_CreateProjectForAccount_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ContainerRegistry/CreateProjectForAccount", in, out, opts...) if err != nil { return nil, err } @@ -50,7 +45,7 @@ func (c *containerRegistryClient) CreateProjectForAccount(ctx context.Context, i func (c *containerRegistryClient) GetSvcCredentials(ctx context.Context, in *GetSvcCredentialsIn, opts ...grpc.CallOption) (*GetSvcCredentialsOut, error) { out := new(GetSvcCredentialsOut) - err := c.cc.Invoke(ctx, ContainerRegistry_GetSvcCredentials_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/ContainerRegistry/GetSvcCredentials", in, out, opts...) if err != nil { return nil, err } @@ -99,7 +94,7 @@ func _ContainerRegistry_CreateProjectForAccount_Handler(srv interface{}, ctx con } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ContainerRegistry_CreateProjectForAccount_FullMethodName, + FullMethod: "/ContainerRegistry/CreateProjectForAccount", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ContainerRegistryServer).CreateProjectForAccount(ctx, req.(*CreateProjectIn)) @@ -117,7 +112,7 @@ func _ContainerRegistry_GetSvcCredentials_Handler(srv interface{}, ctx context.C } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: ContainerRegistry_GetSvcCredentials_FullMethodName, + FullMethod: "/ContainerRegistry/GetSvcCredentials", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ContainerRegistryServer).GetSvcCredentials(ctx, req.(*GetSvcCredentialsIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/dns/dns.pb.go b/grpc-interfaces/kloudlite.io/rpc/dns/dns.pb.go index 5f6a66af9..a8931df2e 100644 --- a/grpc-interfaces/kloudlite.io/rpc/dns/dns.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/dns/dns.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.32.0 // protoc v4.24.4 // source: dns.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/dns/dns_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/dns/dns_grpc.pb.go index 079d66d82..1ca73d5a7 100644 --- a/grpc-interfaces/kloudlite.io/rpc/dns/dns_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/dns/dns_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 v4.24.4 // source: dns.proto @@ -18,10 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - DNS_GetAccountDomains_FullMethodName = "/DNS/GetAccountDomains" -) - // DNSClient is the client API for DNS 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. @@ -39,7 +35,7 @@ func NewDNSClient(cc grpc.ClientConnInterface) DNSClient { func (c *dNSClient) GetAccountDomains(ctx context.Context, in *GetAccountDomainsIn, opts ...grpc.CallOption) (*GetAccountDomainsOut, error) { out := new(GetAccountDomainsOut) - err := c.cc.Invoke(ctx, DNS_GetAccountDomains_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/DNS/GetAccountDomains", in, out, opts...) if err != nil { return nil, err } @@ -84,7 +80,7 @@ func _DNS_GetAccountDomains_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: DNS_GetAccountDomains_FullMethodName, + FullMethod: "/DNS/GetAccountDomains", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DNSServer).GetAccountDomains(ctx, req.(*GetAccountDomainsIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/finance/finance-infra.pb.go b/grpc-interfaces/kloudlite.io/rpc/finance/finance-infra.pb.go index 5683406ee..9cf2a27a6 100644 --- a/grpc-interfaces/kloudlite.io/rpc/finance/finance-infra.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/finance/finance-infra.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.32.0 // protoc v4.24.4 // source: finance-infra.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/finance/finance-infra_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/finance/finance-infra_grpc.pb.go index 417b15177..e5471555c 100644 --- a/grpc-interfaces/kloudlite.io/rpc/finance/finance-infra_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/finance/finance-infra_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 v4.24.4 // source: finance-infra.proto @@ -18,19 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - FinanceInfra_ComputeStart_FullMethodName = "/FinanceInfra/ComputeStart" - FinanceInfra_ComputeEnd_FullMethodName = "/FinanceInfra/ComputeEnd" - FinanceInfra_LambdaStart_FullMethodName = "/FinanceInfra/LambdaStart" - FinanceInfra_LambdaEnd_FullMethodName = "/FinanceInfra/LambdaEnd" - FinanceInfra_BlockStorageStart_FullMethodName = "/FinanceInfra/BlockStorageStart" - FinanceInfra_BlockStorageEnd_FullMethodName = "/FinanceInfra/BlockStorageEnd" - FinanceInfra_ObjectStorageStart_FullMethodName = "/FinanceInfra/ObjectStorageStart" - FinanceInfra_ObjectStorageEnd_FullMethodName = "/FinanceInfra/ObjectStorageEnd" - FinanceInfra_CIStart_FullMethodName = "/FinanceInfra/CIStart" - FinanceInfra_CIEnd_FullMethodName = "/FinanceInfra/CIEnd" -) - // FinanceInfraClient is the client API for FinanceInfra 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. @@ -57,7 +44,7 @@ func NewFinanceInfraClient(cc grpc.ClientConnInterface) FinanceInfraClient { func (c *financeInfraClient) ComputeStart(ctx context.Context, in *ComputeStartIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_ComputeStart_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/ComputeStart", in, out, opts...) if err != nil { return nil, err } @@ -66,7 +53,7 @@ func (c *financeInfraClient) ComputeStart(ctx context.Context, in *ComputeStartI func (c *financeInfraClient) ComputeEnd(ctx context.Context, in *ComputeEndIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_ComputeEnd_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/ComputeEnd", in, out, opts...) if err != nil { return nil, err } @@ -75,7 +62,7 @@ func (c *financeInfraClient) ComputeEnd(ctx context.Context, in *ComputeEndIn, o func (c *financeInfraClient) LambdaStart(ctx context.Context, in *LambdaStartIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_LambdaStart_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/LambdaStart", in, out, opts...) if err != nil { return nil, err } @@ -84,7 +71,7 @@ func (c *financeInfraClient) LambdaStart(ctx context.Context, in *LambdaStartIn, func (c *financeInfraClient) LambdaEnd(ctx context.Context, in *LambdaEndIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_LambdaEnd_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/LambdaEnd", in, out, opts...) if err != nil { return nil, err } @@ -93,7 +80,7 @@ func (c *financeInfraClient) LambdaEnd(ctx context.Context, in *LambdaEndIn, opt func (c *financeInfraClient) BlockStorageStart(ctx context.Context, in *BlockStorageStartIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_BlockStorageStart_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/BlockStorageStart", in, out, opts...) if err != nil { return nil, err } @@ -102,7 +89,7 @@ func (c *financeInfraClient) BlockStorageStart(ctx context.Context, in *BlockSto func (c *financeInfraClient) BlockStorageEnd(ctx context.Context, in *BlockStorageEndIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_BlockStorageEnd_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/BlockStorageEnd", in, out, opts...) if err != nil { return nil, err } @@ -111,7 +98,7 @@ func (c *financeInfraClient) BlockStorageEnd(ctx context.Context, in *BlockStora func (c *financeInfraClient) ObjectStorageStart(ctx context.Context, in *ObjectStorageStartIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_ObjectStorageStart_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/ObjectStorageStart", in, out, opts...) if err != nil { return nil, err } @@ -120,7 +107,7 @@ func (c *financeInfraClient) ObjectStorageStart(ctx context.Context, in *ObjectS func (c *financeInfraClient) ObjectStorageEnd(ctx context.Context, in *ObjectStorageEndIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_ObjectStorageEnd_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/ObjectStorageEnd", in, out, opts...) if err != nil { return nil, err } @@ -129,7 +116,7 @@ func (c *financeInfraClient) ObjectStorageEnd(ctx context.Context, in *ObjectSto func (c *financeInfraClient) CIStart(ctx context.Context, in *CIStartIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_CIStart_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/CIStart", in, out, opts...) if err != nil { return nil, err } @@ -138,7 +125,7 @@ func (c *financeInfraClient) CIStart(ctx context.Context, in *CIStartIn, opts .. func (c *financeInfraClient) CIEnd(ctx context.Context, in *CIEndIn, opts ...grpc.CallOption) (*FinanceInfraVoid, error) { out := new(FinanceInfraVoid) - err := c.cc.Invoke(ctx, FinanceInfra_CIEnd_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/FinanceInfra/CIEnd", in, out, opts...) if err != nil { return nil, err } @@ -219,7 +206,7 @@ func _FinanceInfra_ComputeStart_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_ComputeStart_FullMethodName, + FullMethod: "/FinanceInfra/ComputeStart", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).ComputeStart(ctx, req.(*ComputeStartIn)) @@ -237,7 +224,7 @@ func _FinanceInfra_ComputeEnd_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_ComputeEnd_FullMethodName, + FullMethod: "/FinanceInfra/ComputeEnd", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).ComputeEnd(ctx, req.(*ComputeEndIn)) @@ -255,7 +242,7 @@ func _FinanceInfra_LambdaStart_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_LambdaStart_FullMethodName, + FullMethod: "/FinanceInfra/LambdaStart", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).LambdaStart(ctx, req.(*LambdaStartIn)) @@ -273,7 +260,7 @@ func _FinanceInfra_LambdaEnd_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_LambdaEnd_FullMethodName, + FullMethod: "/FinanceInfra/LambdaEnd", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).LambdaEnd(ctx, req.(*LambdaEndIn)) @@ -291,7 +278,7 @@ func _FinanceInfra_BlockStorageStart_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_BlockStorageStart_FullMethodName, + FullMethod: "/FinanceInfra/BlockStorageStart", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).BlockStorageStart(ctx, req.(*BlockStorageStartIn)) @@ -309,7 +296,7 @@ func _FinanceInfra_BlockStorageEnd_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_BlockStorageEnd_FullMethodName, + FullMethod: "/FinanceInfra/BlockStorageEnd", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).BlockStorageEnd(ctx, req.(*BlockStorageEndIn)) @@ -327,7 +314,7 @@ func _FinanceInfra_ObjectStorageStart_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_ObjectStorageStart_FullMethodName, + FullMethod: "/FinanceInfra/ObjectStorageStart", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).ObjectStorageStart(ctx, req.(*ObjectStorageStartIn)) @@ -345,7 +332,7 @@ func _FinanceInfra_ObjectStorageEnd_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_ObjectStorageEnd_FullMethodName, + FullMethod: "/FinanceInfra/ObjectStorageEnd", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).ObjectStorageEnd(ctx, req.(*ObjectStorageEndIn)) @@ -363,7 +350,7 @@ func _FinanceInfra_CIStart_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_CIStart_FullMethodName, + FullMethod: "/FinanceInfra/CIStart", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).CIStart(ctx, req.(*CIStartIn)) @@ -381,7 +368,7 @@ func _FinanceInfra_CIEnd_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: FinanceInfra_CIEnd_FullMethodName, + FullMethod: "/FinanceInfra/CIEnd", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceInfraServer).CIEnd(ctx, req.(*CIEndIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/finance/finance.pb.go b/grpc-interfaces/kloudlite.io/rpc/finance/finance.pb.go index 092912d55..b13d5a015 100644 --- a/grpc-interfaces/kloudlite.io/rpc/finance/finance.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/finance/finance.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.32.0 // protoc v4.24.4 // source: finance.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/finance/finance_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/finance/finance_grpc.pb.go index 61e0d9dd7..a99d8e8b8 100644 --- a/grpc-interfaces/kloudlite.io/rpc/finance/finance_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/finance/finance_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 v4.24.4 // source: finance.proto @@ -18,12 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - Finance_StartBillable_FullMethodName = "/Finance/startBillable" - Finance_StopBillable_FullMethodName = "/Finance/stopBillable" - Finance_GetAttachedCluster_FullMethodName = "/Finance/getAttachedCluster" -) - // FinanceClient is the client API for Finance 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. @@ -43,7 +37,7 @@ func NewFinanceClient(cc grpc.ClientConnInterface) FinanceClient { func (c *financeClient) StartBillable(ctx context.Context, in *StartBillableIn, opts ...grpc.CallOption) (*StartBillableOut, error) { out := new(StartBillableOut) - err := c.cc.Invoke(ctx, Finance_StartBillable_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Finance/startBillable", in, out, opts...) if err != nil { return nil, err } @@ -52,7 +46,7 @@ func (c *financeClient) StartBillable(ctx context.Context, in *StartBillableIn, func (c *financeClient) StopBillable(ctx context.Context, in *StopBillableIn, opts ...grpc.CallOption) (*StopBillableOut, error) { out := new(StopBillableOut) - err := c.cc.Invoke(ctx, Finance_StopBillable_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Finance/stopBillable", in, out, opts...) if err != nil { return nil, err } @@ -61,7 +55,7 @@ func (c *financeClient) StopBillable(ctx context.Context, in *StopBillableIn, op func (c *financeClient) GetAttachedCluster(ctx context.Context, in *GetAttachedClusterIn, opts ...grpc.CallOption) (*GetAttachedClusterOut, error) { out := new(GetAttachedClusterOut) - err := c.cc.Invoke(ctx, Finance_GetAttachedCluster_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Finance/getAttachedCluster", in, out, opts...) if err != nil { return nil, err } @@ -114,7 +108,7 @@ func _Finance_StartBillable_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Finance_StartBillable_FullMethodName, + FullMethod: "/Finance/startBillable", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceServer).StartBillable(ctx, req.(*StartBillableIn)) @@ -132,7 +126,7 @@ func _Finance_StopBillable_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Finance_StopBillable_FullMethodName, + FullMethod: "/Finance/stopBillable", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceServer).StopBillable(ctx, req.(*StopBillableIn)) @@ -150,7 +144,7 @@ func _Finance_GetAttachedCluster_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Finance_GetAttachedCluster_FullMethodName, + FullMethod: "/Finance/getAttachedCluster", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FinanceServer).GetAttachedCluster(ctx, req.(*GetAttachedClusterIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/iam/iam.pb.go b/grpc-interfaces/kloudlite.io/rpc/iam/iam.pb.go index 63f51fe3b..e81e5472c 100644 --- a/grpc-interfaces/kloudlite.io/rpc/iam/iam.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/iam/iam.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.32.0 // protoc v4.24.4 // source: iam.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/iam/iam_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/iam/iam_grpc.pb.go index 1810941e2..45fd8cee4 100644 --- a/grpc-interfaces/kloudlite.io/rpc/iam/iam_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/iam/iam_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 v4.24.4 // source: iam.proto @@ -18,18 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - IAM_Ping_FullMethodName = "/IAM/Ping" - IAM_Can_FullMethodName = "/IAM/Can" - IAM_ListMembershipsForResource_FullMethodName = "/IAM/ListMembershipsForResource" - IAM_ListMembershipsForUser_FullMethodName = "/IAM/ListMembershipsForUser" - IAM_GetMembership_FullMethodName = "/IAM/GetMembership" - IAM_AddMembership_FullMethodName = "/IAM/AddMembership" - IAM_UpdateMembership_FullMethodName = "/IAM/UpdateMembership" - IAM_RemoveMembership_FullMethodName = "/IAM/RemoveMembership" - IAM_RemoveResource_FullMethodName = "/IAM/RemoveResource" -) - // IAMClient is the client API for IAM 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. @@ -57,7 +45,7 @@ func NewIAMClient(cc grpc.ClientConnInterface) IAMClient { func (c *iAMClient) Ping(ctx context.Context, in *Message, opts ...grpc.CallOption) (*Message, error) { out := new(Message) - err := c.cc.Invoke(ctx, IAM_Ping_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/IAM/Ping", in, out, opts...) if err != nil { return nil, err } @@ -66,7 +54,7 @@ func (c *iAMClient) Ping(ctx context.Context, in *Message, opts ...grpc.CallOpti func (c *iAMClient) Can(ctx context.Context, in *CanIn, opts ...grpc.CallOption) (*CanOut, error) { out := new(CanOut) - err := c.cc.Invoke(ctx, IAM_Can_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/IAM/Can", in, out, opts...) if err != nil { return nil, err } @@ -75,7 +63,7 @@ func (c *iAMClient) Can(ctx context.Context, in *CanIn, opts ...grpc.CallOption) func (c *iAMClient) ListMembershipsForResource(ctx context.Context, in *MembershipsForResourceIn, opts ...grpc.CallOption) (*ListMembershipsOut, error) { out := new(ListMembershipsOut) - err := c.cc.Invoke(ctx, IAM_ListMembershipsForResource_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/IAM/ListMembershipsForResource", in, out, opts...) if err != nil { return nil, err } @@ -84,7 +72,7 @@ func (c *iAMClient) ListMembershipsForResource(ctx context.Context, in *Membersh func (c *iAMClient) ListMembershipsForUser(ctx context.Context, in *MembershipsForUserIn, opts ...grpc.CallOption) (*ListMembershipsOut, error) { out := new(ListMembershipsOut) - err := c.cc.Invoke(ctx, IAM_ListMembershipsForUser_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/IAM/ListMembershipsForUser", in, out, opts...) if err != nil { return nil, err } @@ -93,7 +81,7 @@ func (c *iAMClient) ListMembershipsForUser(ctx context.Context, in *MembershipsF func (c *iAMClient) GetMembership(ctx context.Context, in *GetMembershipIn, opts ...grpc.CallOption) (*GetMembershipOut, error) { out := new(GetMembershipOut) - err := c.cc.Invoke(ctx, IAM_GetMembership_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/IAM/GetMembership", in, out, opts...) if err != nil { return nil, err } @@ -102,7 +90,7 @@ func (c *iAMClient) GetMembership(ctx context.Context, in *GetMembershipIn, opts func (c *iAMClient) AddMembership(ctx context.Context, in *AddMembershipIn, opts ...grpc.CallOption) (*AddMembershipOut, error) { out := new(AddMembershipOut) - err := c.cc.Invoke(ctx, IAM_AddMembership_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/IAM/AddMembership", in, out, opts...) if err != nil { return nil, err } @@ -111,7 +99,7 @@ func (c *iAMClient) AddMembership(ctx context.Context, in *AddMembershipIn, opts func (c *iAMClient) UpdateMembership(ctx context.Context, in *UpdateMembershipIn, opts ...grpc.CallOption) (*UpdateMembershipOut, error) { out := new(UpdateMembershipOut) - err := c.cc.Invoke(ctx, IAM_UpdateMembership_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/IAM/UpdateMembership", in, out, opts...) if err != nil { return nil, err } @@ -120,7 +108,7 @@ func (c *iAMClient) UpdateMembership(ctx context.Context, in *UpdateMembershipIn func (c *iAMClient) RemoveMembership(ctx context.Context, in *RemoveMembershipIn, opts ...grpc.CallOption) (*RemoveMembershipOut, error) { out := new(RemoveMembershipOut) - err := c.cc.Invoke(ctx, IAM_RemoveMembership_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/IAM/RemoveMembership", in, out, opts...) if err != nil { return nil, err } @@ -129,7 +117,7 @@ func (c *iAMClient) RemoveMembership(ctx context.Context, in *RemoveMembershipIn func (c *iAMClient) RemoveResource(ctx context.Context, in *RemoveResourceIn, opts ...grpc.CallOption) (*RemoveResourceOut, error) { out := new(RemoveResourceOut) - err := c.cc.Invoke(ctx, IAM_RemoveResource_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/IAM/RemoveResource", in, out, opts...) if err != nil { return nil, err } @@ -208,7 +196,7 @@ func _IAM_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{ } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: IAM_Ping_FullMethodName, + FullMethod: "/IAM/Ping", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMServer).Ping(ctx, req.(*Message)) @@ -226,7 +214,7 @@ func _IAM_Can_Handler(srv interface{}, ctx context.Context, dec func(interface{} } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: IAM_Can_FullMethodName, + FullMethod: "/IAM/Can", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMServer).Can(ctx, req.(*CanIn)) @@ -244,7 +232,7 @@ func _IAM_ListMembershipsForResource_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: IAM_ListMembershipsForResource_FullMethodName, + FullMethod: "/IAM/ListMembershipsForResource", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMServer).ListMembershipsForResource(ctx, req.(*MembershipsForResourceIn)) @@ -262,7 +250,7 @@ func _IAM_ListMembershipsForUser_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: IAM_ListMembershipsForUser_FullMethodName, + FullMethod: "/IAM/ListMembershipsForUser", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMServer).ListMembershipsForUser(ctx, req.(*MembershipsForUserIn)) @@ -280,7 +268,7 @@ func _IAM_GetMembership_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: IAM_GetMembership_FullMethodName, + FullMethod: "/IAM/GetMembership", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMServer).GetMembership(ctx, req.(*GetMembershipIn)) @@ -298,7 +286,7 @@ func _IAM_AddMembership_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: IAM_AddMembership_FullMethodName, + FullMethod: "/IAM/AddMembership", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMServer).AddMembership(ctx, req.(*AddMembershipIn)) @@ -316,7 +304,7 @@ func _IAM_UpdateMembership_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: IAM_UpdateMembership_FullMethodName, + FullMethod: "/IAM/UpdateMembership", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMServer).UpdateMembership(ctx, req.(*UpdateMembershipIn)) @@ -334,7 +322,7 @@ func _IAM_RemoveMembership_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: IAM_RemoveMembership_FullMethodName, + FullMethod: "/IAM/RemoveMembership", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMServer).RemoveMembership(ctx, req.(*RemoveMembershipIn)) @@ -352,7 +340,7 @@ func _IAM_RemoveResource_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: IAM_RemoveResource_FullMethodName, + FullMethod: "/IAM/RemoveResource", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(IAMServer).RemoveResource(ctx, req.(*RemoveResourceIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/infra/infra.pb.go b/grpc-interfaces/kloudlite.io/rpc/infra/infra.pb.go index 5c02906f5..dfcf371a2 100644 --- a/grpc-interfaces/kloudlite.io/rpc/infra/infra.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/infra/infra.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.32.0 // protoc v4.24.4 // source: infra.proto @@ -312,6 +312,132 @@ func (x *GetNodepoolOut) GetIACJobNamespace() string { return "" } +type ClusterExistsIn struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` + UserName string `protobuf:"bytes,2,opt,name=userName,proto3" json:"userName,omitempty"` + UserEmail string `protobuf:"bytes,3,opt,name=userEmail,proto3" json:"userEmail,omitempty"` + AccountName string `protobuf:"bytes,4,opt,name=accountName,proto3" json:"accountName,omitempty"` + ClusterName string `protobuf:"bytes,5,opt,name=clusterName,proto3" json:"clusterName,omitempty"` +} + +func (x *ClusterExistsIn) Reset() { + *x = ClusterExistsIn{} + if protoimpl.UnsafeEnabled { + mi := &file_infra_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterExistsIn) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterExistsIn) ProtoMessage() {} + +func (x *ClusterExistsIn) ProtoReflect() protoreflect.Message { + mi := &file_infra_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 ClusterExistsIn.ProtoReflect.Descriptor instead. +func (*ClusterExistsIn) Descriptor() ([]byte, []int) { + return file_infra_proto_rawDescGZIP(), []int{4} +} + +func (x *ClusterExistsIn) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *ClusterExistsIn) GetUserName() string { + if x != nil { + return x.UserName + } + return "" +} + +func (x *ClusterExistsIn) GetUserEmail() string { + if x != nil { + return x.UserEmail + } + return "" +} + +func (x *ClusterExistsIn) GetAccountName() string { + if x != nil { + return x.AccountName + } + return "" +} + +func (x *ClusterExistsIn) GetClusterName() string { + if x != nil { + return x.ClusterName + } + return "" +} + +type ClusterExistsOut struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Exists bool `protobuf:"varint,1,opt,name=exists,proto3" json:"exists,omitempty"` +} + +func (x *ClusterExistsOut) Reset() { + *x = ClusterExistsOut{} + if protoimpl.UnsafeEnabled { + mi := &file_infra_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterExistsOut) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterExistsOut) ProtoMessage() {} + +func (x *ClusterExistsOut) ProtoReflect() protoreflect.Message { + mi := &file_infra_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 ClusterExistsOut.ProtoReflect.Descriptor instead. +func (*ClusterExistsOut) Descriptor() ([]byte, []int) { + return file_infra_proto_rawDescGZIP(), []int{5} +} + +func (x *ClusterExistsOut) GetExists() bool { + if x != nil { + return x.Exists + } + return false +} + var File_infra_proto protoreflect.FileDescriptor var file_infra_proto_rawDesc = []byte{ @@ -355,15 +481,32 @@ var file_infra_proto_rawDesc = []byte{ 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x41, 0x43, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x49, 0x41, 0x43, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x32, 0x64, 0x0a, 0x05, 0x49, 0x6e, 0x66, 0x72, 0x61, 0x12, 0x2b, 0x0a, 0x0a, 0x47, 0x65, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x0d, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x1a, 0x0e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x12, 0x2e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x70, - 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x1a, 0x0f, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x70, - 0x6f, 0x6f, 0x6c, 0x4f, 0x75, 0x74, 0x42, 0x18, 0x5a, 0x16, 0x6b, 0x6c, 0x6f, 0x75, 0x64, 0x6c, - 0x69, 0x74, 0x65, 0x2e, 0x69, 0x6f, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x22, 0xa7, 0x01, 0x0a, 0x0f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x49, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, + 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, + 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2a, 0x0a, 0x10, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x32, 0x9a, 0x01, 0x0a, 0x05, 0x49, 0x6e, 0x66, 0x72, 0x61, + 0x12, 0x2b, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x0d, + 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x1a, 0x0e, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x12, 0x2e, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x1a, 0x0f, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x70, 0x6f, 0x6f, 0x6c, 0x4f, 0x75, 0x74, 0x12, 0x34, 0x0a, + 0x0d, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x10, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x49, 0x6e, + 0x1a, 0x11, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, + 0x4f, 0x75, 0x74, 0x42, 0x18, 0x5a, 0x16, 0x6b, 0x6c, 0x6f, 0x75, 0x64, 0x6c, 0x69, 0x74, 0x65, + 0x2e, 0x69, 0x6f, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -378,20 +521,24 @@ func file_infra_proto_rawDescGZIP() []byte { return file_infra_proto_rawDescData } -var file_infra_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_infra_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_infra_proto_goTypes = []interface{}{ - (*GetClusterIn)(nil), // 0: GetClusterIn - (*GetClusterOut)(nil), // 1: GetClusterOut - (*GetNodepoolIn)(nil), // 2: GetNodepoolIn - (*GetNodepoolOut)(nil), // 3: GetNodepoolOut + (*GetClusterIn)(nil), // 0: GetClusterIn + (*GetClusterOut)(nil), // 1: GetClusterOut + (*GetNodepoolIn)(nil), // 2: GetNodepoolIn + (*GetNodepoolOut)(nil), // 3: GetNodepoolOut + (*ClusterExistsIn)(nil), // 4: ClusterExistsIn + (*ClusterExistsOut)(nil), // 5: ClusterExistsOut } var file_infra_proto_depIdxs = []int32{ 0, // 0: Infra.GetCluster:input_type -> GetClusterIn 2, // 1: Infra.GetNodepool:input_type -> GetNodepoolIn - 1, // 2: Infra.GetCluster:output_type -> GetClusterOut - 3, // 3: Infra.GetNodepool:output_type -> GetNodepoolOut - 2, // [2:4] is the sub-list for method output_type - 0, // [0:2] is the sub-list for method input_type + 4, // 2: Infra.ClusterExists:input_type -> ClusterExistsIn + 1, // 3: Infra.GetCluster:output_type -> GetClusterOut + 3, // 4: Infra.GetNodepool:output_type -> GetNodepoolOut + 5, // 5: Infra.ClusterExists:output_type -> ClusterExistsOut + 3, // [3:6] is the sub-list for method output_type + 0, // [0:3] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name @@ -451,6 +598,30 @@ func file_infra_proto_init() { return nil } } + file_infra_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterExistsIn); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_infra_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClusterExistsOut); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -458,7 +629,7 @@ func file_infra_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_infra_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, diff --git a/grpc-interfaces/kloudlite.io/rpc/infra/infra_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/infra/infra_grpc.pb.go index b2e347c64..82934340f 100644 --- a/grpc-interfaces/kloudlite.io/rpc/infra/infra_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/infra/infra_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 v4.24.4 // source: infra.proto @@ -18,17 +18,13 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - Infra_GetCluster_FullMethodName = "/Infra/GetCluster" - Infra_GetNodepool_FullMethodName = "/Infra/GetNodepool" -) - // InfraClient is the client API for Infra 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 InfraClient interface { GetCluster(ctx context.Context, in *GetClusterIn, opts ...grpc.CallOption) (*GetClusterOut, error) GetNodepool(ctx context.Context, in *GetNodepoolIn, opts ...grpc.CallOption) (*GetNodepoolOut, error) + ClusterExists(ctx context.Context, in *ClusterExistsIn, opts ...grpc.CallOption) (*ClusterExistsOut, error) } type infraClient struct { @@ -41,7 +37,7 @@ func NewInfraClient(cc grpc.ClientConnInterface) InfraClient { func (c *infraClient) GetCluster(ctx context.Context, in *GetClusterIn, opts ...grpc.CallOption) (*GetClusterOut, error) { out := new(GetClusterOut) - err := c.cc.Invoke(ctx, Infra_GetCluster_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Infra/GetCluster", in, out, opts...) if err != nil { return nil, err } @@ -50,7 +46,16 @@ func (c *infraClient) GetCluster(ctx context.Context, in *GetClusterIn, opts ... func (c *infraClient) GetNodepool(ctx context.Context, in *GetNodepoolIn, opts ...grpc.CallOption) (*GetNodepoolOut, error) { out := new(GetNodepoolOut) - err := c.cc.Invoke(ctx, Infra_GetNodepool_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/Infra/GetNodepool", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *infraClient) ClusterExists(ctx context.Context, in *ClusterExistsIn, opts ...grpc.CallOption) (*ClusterExistsOut, error) { + out := new(ClusterExistsOut) + err := c.cc.Invoke(ctx, "/Infra/ClusterExists", in, out, opts...) if err != nil { return nil, err } @@ -63,6 +68,7 @@ func (c *infraClient) GetNodepool(ctx context.Context, in *GetNodepoolIn, opts . type InfraServer interface { GetCluster(context.Context, *GetClusterIn) (*GetClusterOut, error) GetNodepool(context.Context, *GetNodepoolIn) (*GetNodepoolOut, error) + ClusterExists(context.Context, *ClusterExistsIn) (*ClusterExistsOut, error) mustEmbedUnimplementedInfraServer() } @@ -76,6 +82,9 @@ func (UnimplementedInfraServer) GetCluster(context.Context, *GetClusterIn) (*Get func (UnimplementedInfraServer) GetNodepool(context.Context, *GetNodepoolIn) (*GetNodepoolOut, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNodepool not implemented") } +func (UnimplementedInfraServer) ClusterExists(context.Context, *ClusterExistsIn) (*ClusterExistsOut, error) { + return nil, status.Errorf(codes.Unimplemented, "method ClusterExists not implemented") +} func (UnimplementedInfraServer) mustEmbedUnimplementedInfraServer() {} // UnsafeInfraServer may be embedded to opt out of forward compatibility for this service. @@ -99,7 +108,7 @@ func _Infra_GetCluster_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Infra_GetCluster_FullMethodName, + FullMethod: "/Infra/GetCluster", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(InfraServer).GetCluster(ctx, req.(*GetClusterIn)) @@ -117,7 +126,7 @@ func _Infra_GetNodepool_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Infra_GetNodepool_FullMethodName, + FullMethod: "/Infra/GetNodepool", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(InfraServer).GetNodepool(ctx, req.(*GetNodepoolIn)) @@ -125,6 +134,24 @@ func _Infra_GetNodepool_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _Infra_ClusterExists_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ClusterExistsIn) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(InfraServer).ClusterExists(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/Infra/ClusterExists", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(InfraServer).ClusterExists(ctx, req.(*ClusterExistsIn)) + } + return interceptor(ctx, in, info, handler) +} + // Infra_ServiceDesc is the grpc.ServiceDesc for Infra service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -140,6 +167,10 @@ var Infra_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetNodepool", Handler: _Infra_GetNodepool_Handler, }, + { + MethodName: "ClusterExists", + Handler: _Infra_ClusterExists_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "infra.proto", diff --git a/grpc-interfaces/kloudlite.io/rpc/jseval/jseval.pb.go b/grpc-interfaces/kloudlite.io/rpc/jseval/jseval.pb.go index 14b49384b..bdaa70343 100644 --- a/grpc-interfaces/kloudlite.io/rpc/jseval/jseval.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/jseval/jseval.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.32.0 // protoc v4.24.4 // source: jseval.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/jseval/jseval_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/jseval/jseval_grpc.pb.go index 8c2cb8221..f818f1903 100644 --- a/grpc-interfaces/kloudlite.io/rpc/jseval/jseval_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/jseval/jseval_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 v4.24.4 // source: jseval.proto @@ -18,10 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - JSEval_Eval_FullMethodName = "/JSEval/Eval" -) - // JSEvalClient is the client API for JSEval 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. @@ -39,7 +35,7 @@ func NewJSEvalClient(cc grpc.ClientConnInterface) JSEvalClient { func (c *jSEvalClient) Eval(ctx context.Context, in *EvalIn, opts ...grpc.CallOption) (*EvalOut, error) { out := new(EvalOut) - err := c.cc.Invoke(ctx, JSEval_Eval_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/JSEval/Eval", in, out, opts...) if err != nil { return nil, err } @@ -84,7 +80,7 @@ func _JSEval_Eval_Handler(srv interface{}, ctx context.Context, dec func(interfa } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: JSEval_Eval_FullMethodName, + FullMethod: "/JSEval/Eval", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(JSEvalServer).Eval(ctx, req.(*EvalIn)) diff --git a/grpc-interfaces/kloudlite.io/rpc/message-office-internal/message-office-internal.pb.go b/grpc-interfaces/kloudlite.io/rpc/message-office-internal/message-office-internal.pb.go index 734e85fd4..c383b612e 100644 --- a/grpc-interfaces/kloudlite.io/rpc/message-office-internal/message-office-internal.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/message-office-internal/message-office-internal.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.32.0 // protoc v4.24.4 // source: message-office-internal.proto diff --git a/grpc-interfaces/kloudlite.io/rpc/message-office-internal/message-office-internal_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/message-office-internal/message-office-internal_grpc.pb.go index 6ba4302d3..852eff2a4 100644 --- a/grpc-interfaces/kloudlite.io/rpc/message-office-internal/message-office-internal_grpc.pb.go +++ b/grpc-interfaces/kloudlite.io/rpc/message-office-internal/message-office-internal_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 v4.24.4 // source: message-office-internal.proto @@ -18,10 +18,6 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 -const ( - MessageOfficeInternal_GenerateClusterToken_FullMethodName = "/MessageOfficeInternal/GenerateClusterToken" -) - // MessageOfficeInternalClient is the client API for MessageOfficeInternal 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. @@ -39,7 +35,7 @@ func NewMessageOfficeInternalClient(cc grpc.ClientConnInterface) MessageOfficeIn func (c *messageOfficeInternalClient) GenerateClusterToken(ctx context.Context, in *GenerateClusterTokenIn, opts ...grpc.CallOption) (*GenerateClusterTokenOut, error) { out := new(GenerateClusterTokenOut) - err := c.cc.Invoke(ctx, MessageOfficeInternal_GenerateClusterToken_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, "/MessageOfficeInternal/GenerateClusterToken", in, out, opts...) if err != nil { return nil, err } @@ -84,7 +80,7 @@ func _MessageOfficeInternal_GenerateClusterToken_Handler(srv interface{}, ctx co } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: MessageOfficeInternal_GenerateClusterToken_FullMethodName, + FullMethod: "/MessageOfficeInternal/GenerateClusterToken", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(MessageOfficeInternalServer).GenerateClusterToken(ctx, req.(*GenerateClusterTokenIn)) From 7300455de0437a9956c994d9de4c05f7b499d8e8 Mon Sep 17 00:00:00 2001 From: Abdhesh Nayak Date: Thu, 8 Feb 2024 20:08:39 +0530 Subject: [PATCH 06/15] Improvement/websocket for logs (#260) * :bug: Fixed issue with memory leak on socket-server * :art: Imporved logic for logs socket --- apps/websocket-server/internal/domain/logs.go | 71 ++++++++++++++----- 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/apps/websocket-server/internal/domain/logs.go b/apps/websocket-server/internal/domain/logs.go index 39e5e2abd..c3114c2ac 100644 --- a/apps/websocket-server/internal/domain/logs.go +++ b/apps/websocket-server/internal/domain/logs.go @@ -21,6 +21,13 @@ import ( "github.com/nats-io/nats.go/jetstream" ) +type Event string + +const ( + EventSubscribe Event = "subscribe" + EventUnsubscribe Event = "unsubscribe" +) + func parseTime(since string) (time.Time, error) { now := time.Now() @@ -84,13 +91,18 @@ func (d *domain) newJetstreamConsumerForLog(ctx context.Context, subject string, return nil, errors.NewE(err) } + id := uuid.New().String() + cid := fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%s-%s", consumerId, id)))) + + fmt.Println("consumerId: ", cid) + if t != nil { return msg_nats.NewJetstreamConsumer(ctx, d.jetStreamClient, msg_nats.JetstreamConsumerArgs{ Stream: d.env.LogsStreamName, ConsumerConfig: msg_nats.ConsumerConfig{ DeliverPolicy: jetstream.DeliverByStartTimePolicy, OptStartTime: t, - Name: consumerId, + Name: cid, Description: "this is an ephemeral consumer which dispatches logs to a websocket client", FilterSubjects: []string{ subject, @@ -111,9 +123,8 @@ func (d *domain) newJetstreamConsumerForLog(ctx context.Context, subject string, }) } -func getLogHash(ld LogsReqData, userId repos.ID) string { - uuid := uuid.New().String() - return fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%s-%s-%s-%s-%s", ld.AccountName, ld.ClusterName, ld.TrackingId, userId, uuid)))) +func getLogHash(ld LogsReqData, userId repos.ID, sid string) string { + return fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%s-%s-%s-%s", ld.AccountName, ld.ClusterName, ld.TrackingId, userId)))) } func (d *domain) getLogSubsId(ld LogsReqData) string { @@ -138,6 +149,7 @@ func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) resource LogsReqData jc *msg_nats.JetstreamConsumer open bool + Id string } resources := make(map[string]*Subscription) @@ -153,8 +165,9 @@ func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) }() type Message struct { - Event string `json:"event"` + Event Event `json:"event"` Data LogsReqData `json:"data"` + Id string } type MessageType string @@ -173,6 +186,7 @@ func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) type MessageResponse struct { Timestamp time.Time `json:"timestamp"` Message string `json:"message"` + Id string `json:"id"` Spec *MsgSpec `json:"spec,omitempty"` Type MessageType `json:"type"` } @@ -221,27 +235,39 @@ func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) continue } - if err := d.checkAccountAccess(ctx, msg.Data.AccountName, sess.UserId, iamT.GetAccount); err != nil { + if err := d.checkAccountAccess(ctx, msg.Data.AccountName, sess.UserId, iamT.ReadLogs); err != nil { if err := writeError(c, err); err != nil { log.Warnf("websocket write: %w", err) } continue } - hash := getLogHash(msg.Data, sess.UserId) + if msg.Id == "" { + msg.Id = "default" + } + + hash := getLogHash(msg.Data, sess.UserId, msg.Id) switch msg.Event { - case "subscribe": + case EventSubscribe: if _, ok := resources[hash]; ok { - if err := writeError( - c, errors.Newf("already subscribed to logs for account: %s, cluster: %s, trackingId: %s", - msg.Data.AccountName, msg.Data.ClusterName, msg.Data.TrackingId, - ), - ); err != nil { - log.Warnf("websocket write: %w", err) + + if resources[hash].jc != nil { + err := resources[hash].jc.Stop(ctx) + if err != nil { + if err := writeError( + c, errors.Newf("already subscribed to logs for account: %s, cluster: %s, trackingId: %s", + msg.Data.AccountName, msg.Data.ClusterName, msg.Data.TrackingId, + ), + ); err != nil { + log.Warnf("websocket write: %w", err) + } + // todo: reverify + continue + } } - continue + } jc, err := d.newJetstreamConsumerForLog(ctx, d.getLogSubsId(msg.Data), hash, msg.Data.Since) @@ -256,25 +282,26 @@ func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) resource: msg.Data, jc: jc, open: true, + Id: msg.Id, } go func() { - if err := writeInfo(c, "subscribed to logs"); err != nil { log.Warnf("websocket write: %w", err) } if err := jc.Consume( - func(msg *types.ConsumeMsg) error { + func(m *types.ConsumeMsg) error { if c != nil { var resp MessageResponse - if err := json.Unmarshal(msg.Payload, &resp); err != nil { + if err := json.Unmarshal(m.Payload, &resp); err != nil { if err := writeError(c, err); err != nil { log.Warnf("websocket write: %w", err) } } resp.Type = MessageTypeLog - sp := strings.Split(msg.Subject, ".") + resp.Id = msg.Id + sp := strings.Split(m.Subject, ".") resp.Spec = &MsgSpec{ PodName: sp[len(sp)-2], ContainerName: sp[len(sp)-1], @@ -321,6 +348,12 @@ func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) if err := writeError(c, err); err != nil { log.Warnf("websocket write: %w", err) } + continue + } + + delete(resources, hash) + if err := writeInfo(c, "unsubscribed from logs"); err != nil { + log.Warnf("websocket write: %w", err) } } From 682738f1bea1ed967d9bd319e58d1219b53610ae Mon Sep 17 00:00:00 2001 From: nxtcoder17 Date: Thu, 8 Feb 2024 20:11:38 +0530 Subject: [PATCH 07/15] fix(apps/infra): clusterExists GRPC implementation --- apps/infra/internal/app/grpc-server.go | 4 ++++ apps/infra/internal/domain/clusters.go | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/infra/internal/app/grpc-server.go b/apps/infra/internal/app/grpc-server.go index 39aa8c05a..3ef9e636c 100644 --- a/apps/infra/internal/app/grpc-server.go +++ b/apps/infra/internal/app/grpc-server.go @@ -96,8 +96,12 @@ func (g *grpcServer) ClusterExists(ctx context.Context, in *infra.ClusterExistsI } cluster, err := g.d.GetCluster(infraCtx, in.ClusterName) if err != nil { + if !errors.Is(err, domain.ErrClusterNotFound) { + return &infra.ClusterExistsOut{Exists: false}, nil + } return nil, errors.NewE(err) } + if cluster == nil { return &infra.ClusterExistsOut{Exists: false}, nil } diff --git a/apps/infra/internal/domain/clusters.go b/apps/infra/internal/domain/clusters.go index 325688c4a..5b9d1801b 100644 --- a/apps/infra/internal/domain/clusters.go +++ b/apps/infra/internal/domain/clusters.go @@ -35,6 +35,8 @@ type ErrClusterAlreadyExists struct { AccountName string } +var ErrClusterNotFound error = fmt.Errorf("cluster not found") + func (e ErrClusterAlreadyExists) Error() string { return fmt.Sprintf("cluster with name %q already exists for account: %s", e.ClusterName, e.AccountName) } @@ -504,7 +506,7 @@ func (d *domain) findCluster(ctx InfraContext, clusterName string) (*entities.Cl } if cluster == nil { - return nil, errors.Newf("cluster with name %q not found", clusterName) + return nil, ErrClusterNotFound } return cluster, nil } From 6f6926e61cdddf3a759b1d392b3f65d3be8c969c Mon Sep 17 00:00:00 2001 From: nxtcoder17 Date: Fri, 9 Feb 2024 02:03:17 +0530 Subject: [PATCH 08/15] feat(apps/infra): Check AWS Access, now returns true, only when the given cloudformation is completed --- .../infra/cloud-provider-secrets.graphql.yml | 2 +- .../domain/provider-secrets-validator.go | 145 ------------------ .../infra/internal/domain/provider-secrets.go | 49 +++++- 3 files changed, 43 insertions(+), 153 deletions(-) delete mode 100644 apps/infra/internal/domain/provider-secrets-validator.go diff --git a/.tools/nvim/__http__/infra/cloud-provider-secrets.graphql.yml b/.tools/nvim/__http__/infra/cloud-provider-secrets.graphql.yml index e17e1bd0c..beb72517f 100644 --- a/.tools/nvim/__http__/infra/cloud-provider-secrets.graphql.yml +++ b/.tools/nvim/__http__/infra/cloud-provider-secrets.graphql.yml @@ -4,7 +4,7 @@ global: clusterName: sample-cluster providerNamespace: kl-account-kloudlite-dev - providerName: aws-creds + providerName: aws-creds2 --- diff --git a/apps/infra/internal/domain/provider-secrets-validator.go b/apps/infra/internal/domain/provider-secrets-validator.go deleted file mode 100644 index 9a0ebe143..000000000 --- a/apps/infra/internal/domain/provider-secrets-validator.go +++ /dev/null @@ -1,145 +0,0 @@ -package domain - -import ( - "encoding/json" - "github.com/kloudlite/api/pkg/errors" - "net/url" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/iam" -) - -func (d *domain) ValidateProviderSecret(providerName string, accessKeyId, secretAccessKey string) error { - switch providerName { - case "aws": - { - return validateAwsKeys(accessKeyId, secretAccessKey) - } - default: - { - return errors.Newf("provider %s is not supported", providerName) - } - } -} - -func validateAwsKeys(accessKeyID, secretAccessKey string) error { - requiredActions := []string{"iam:*", "s3:*", "ec2:*"} - - sess, err := session.NewSession(&aws.Config{ - Region: aws.String("us-west-2"), - Credentials: credentials.NewStaticCredentials(accessKeyID, secretAccessKey, ""), - }) - - if err != nil { - return errors.Newf("Error creating session: %s", err) - } - - svc := iam.New(sess) - userOutput, err := svc.GetUser(nil) - - if err != nil { - return errors.Newf("Failed to get user: %s", err) - } - - // Getting the policies attached to the user - listUserPoliciesInput := &iam.ListAttachedUserPoliciesInput{ - UserName: userOutput.User.UserName, - } - - policies, err := svc.ListAttachedUserPolicies(listUserPoliciesInput) - - if err != nil { - return errors.Newf("Failed to list user policies: %s", err) - } - - for _, attachedPolicy := range policies.AttachedPolicies { - policyOutput, err := svc.GetPolicy(&iam.GetPolicyInput{ - PolicyArn: attachedPolicy.PolicyArn, - }) - - if err != nil { - // fmt.Println("Failed to get policy:", err) - continue - } - - policyVersionOutput, err := svc.GetPolicyVersion(&iam.GetPolicyVersionInput{ - PolicyArn: policyOutput.Policy.Arn, - VersionId: policyOutput.Policy.DefaultVersionId, - }) - - if err != nil { - // fmt.Println("Failed to get policy version:", err) - continue - } - - s, err := url.QueryUnescape(*policyVersionOutput.PolicyVersion.Document) - if err != nil { - // fmt.Println("Failed to get policy version:", err) - continue - } - - b, err := validatePolicyJson(s, requiredActions) - if err != nil { - // fmt.Println("Permission Check Error:", err) - continue - } - - if b { - return nil - } - } - return errors.Newf("coudn't find the required permissions ( full access to [S3,EC2,IAM] on all resources )") - -} - -func validatePolicyJson(policyJSON string, actions []string) (bool, error) { - type Statement struct { - Action []string `json:"Action"` - Resource string `json:"Resource"` - } - - type Policy struct { - Statement []Statement `json:"Statement"` - } - - var policy Policy - if err := json.Unmarshal([]byte(policyJSON), &policy); err != nil { - return false, errors.Newf("Failed to unmarshal policy document: %v", err) - } - - for _, s := range policy.Statement { - if s.Resource != "*" { - continue - } - found := false - for _, v := range actions { - f := false - for _, v2 := range s.Action { - if v == v2 { - f = true - } - } - if !f { - found = false - break - } - found = true - } - if found { - return true, nil - } - } - - return false, errors.Newf("permissions not matched") -} - -func contains(slice []string, value string) bool { - for _, v := range slice { - if v == value { - return true - } - } - return false -} diff --git a/apps/infra/internal/domain/provider-secrets.go b/apps/infra/internal/domain/provider-secrets.go index 57a9b4118..d7b732e9f 100644 --- a/apps/infra/internal/domain/provider-secrets.go +++ b/apps/infra/internal/domain/provider-secrets.go @@ -4,13 +4,14 @@ import ( "bytes" "context" "fmt" + "strings" + "time" + fc "github.com/kloudlite/api/apps/infra/internal/entities/field-constants" "github.com/kloudlite/api/common/fields" "github.com/kloudlite/api/pkg/errors" "github.com/kloudlite/operator/pkg/constants" corev1 "k8s.io/api/core/v1" - "strings" - "time" iamT "github.com/kloudlite/api/apps/iam/types" "github.com/kloudlite/api/common" @@ -22,7 +23,9 @@ import ( "github.com/kloudlite/api/pkg/repos" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/cloudformation" "github.com/aws/aws-sdk-go/service/sts" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -49,13 +52,15 @@ func generateAWSCloudformationTemplateUrl(args entities.AWSSecretCredentials, ev return result.String(), nil } -func (d *domain) validateAWSAssumeRole(_ context.Context, paramExternalId string, roleARN string) error { +func (d *domain) validateAWSAssumeRole(_ context.Context, paramExternalId string, roleARN string, instanceProfileName string, cfStackName string) error { sess, err := session.NewSession() + sess.Config.Region = aws.String("ap-south-1") if err != nil { d.logger.Errorf(err, "while creating new session") return errors.NewE(err) } + // 1. validating IAM Assume Role svc := sts.New(sess) resp, err := svc.AssumeRole(&sts.AssumeRoleInput{ @@ -68,8 +73,39 @@ func (d *domain) validateAWSAssumeRole(_ context.Context, paramExternalId string return errors.NewE(err) } - if resp.AssumedRoleUser.Arn != nil { - return nil + if resp.AssumedRoleUser == nil || resp.AssumedRoleUser.Arn == nil { + return errors.Newf("AWS assume role (%s) not found", roleARN) + } + + nsess, err := session.NewSession(&aws.Config{ + Region: aws.String("ap-south-1"), + Credentials: credentials.NewStaticCredentials(*resp.Credentials.AccessKeyId, *resp.Credentials.SecretAccessKey, *resp.Credentials.SessionToken), + }) + if err != nil { + return errors.NewE(err) + } + + cf := cloudformation.New(nsess) + dso, err := cf.DescribeStacks(&cloudformation.DescribeStacksInput{ + StackName: &cfStackName, + }) + if err != nil { + return errors.NewE(err) + } + + stackFound := false + + for i := range dso.Stacks { + if dso.Stacks[i] != nil && *dso.Stacks[i].StackName == cfStackName { + stackFound = true + if *dso.Stacks[i].StackStatus != cloudformation.StackStatusCreateComplete { + return errors.Newf("cloudformation stack (%s) is not completed, yet", cfStackName) + } + } + } + + if !stackFound { + return errors.Newf("waiting for cloudformation stack to be created") } return nil @@ -94,7 +130,7 @@ func (d *domain) ValidateProviderSecretAWSAccess(ctx InfraContext, name string) return nil, errors.NewE(err) } - if err := d.validateAWSAssumeRole(ctx, psecret.AWS.CfParamExternalID, psecret.AWS.GetAssumeRoleRoleARN()); err != nil { + if err := d.validateAWSAssumeRole(ctx, psecret.AWS.CfParamExternalID, psecret.AWS.GetAssumeRoleRoleARN(), psecret.AWS.CfParamInstanceProfileName, psecret.AWS.CfParamStackName); err != nil { installationURL, err := generateAWSCloudformationTemplateUrl(*psecret.AWS, d.env) if err != nil { return nil, errors.NewE(err) @@ -246,7 +282,6 @@ func (d *domain) UpdateProviderSecret(ctx InfraContext, providerSecretIn entitie }, patchForUpdate, ) - if err != nil { return nil, errors.NewE(err) } From c83f5ba0ca2ca2576d0db00fc007ee2299625a38 Mon Sep 17 00:00:00 2001 From: Piyush Kumar Date: Fri, 9 Feb 2024 18:47:36 +0530 Subject: [PATCH 09/15] fix(console): Add environment name while publishing nats event for environment resources --- .../app/adapter-resource-update-publish.go | 7 ++++++- apps/console/internal/domain/api.go | 1 + apps/console/internal/domain/environment.go | 12 ++++++------ .../internal/domain/project-managed-service.go | 12 ++++++------ apps/console/internal/domain/vpn-device.go | 16 ++++++++-------- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/apps/console/internal/app/adapter-resource-update-publish.go b/apps/console/internal/app/adapter-resource-update-publish.go index b230c0615..0e53b5363 100644 --- a/apps/console/internal/app/adapter-resource-update-publish.go +++ b/apps/console/internal/app/adapter-resource-update-publish.go @@ -14,13 +14,18 @@ type ResourceEventPublisherImpl struct { logger logging.Logger } +func (r *ResourceEventPublisherImpl) PublishProjectResourceEvent(ctx domain.ConsoleContext, projectName string, resourceType entities.ResourceType, name string, update domain.PublishMsg) { + subject := fmt.Sprintf("res-updates.account.%s.project.%s.%s.%s", ctx.AccountName, projectName, resourceType, name) + r.publish(subject, update) +} + func (r *ResourceEventPublisherImpl) PublishConsoleEvent(ctx domain.ConsoleContext, resourceType entities.ResourceType, name string, update domain.PublishMsg) { subject := fmt.Sprintf("res-updates.account.%s.resourceType.%s.%s", ctx.AccountName, resourceType, name) r.publish(subject, update) } func (r *ResourceEventPublisherImpl) PublishResourceEvent(ctx domain.ResourceContext, resourceType entities.ResourceType, name string, update domain.PublishMsg) { - subject := fmt.Sprintf("res-updates.account.%s.project.%s.%s.%s", ctx.AccountName, ctx.ProjectName, resourceType, name) + subject := fmt.Sprintf("res-updates.account.%s.project.%s.environmentName.%s.%s.%s", ctx.AccountName, ctx.ProjectName, ctx.EnvironmentName, resourceType, name) r.publish(subject, update) } diff --git a/apps/console/internal/domain/api.go b/apps/console/internal/domain/api.go index 797ddb540..64ab32c74 100644 --- a/apps/console/internal/domain/api.go +++ b/apps/console/internal/domain/api.go @@ -271,5 +271,6 @@ const ( type ResourceEventPublisher interface { PublishConsoleEvent(ctx ConsoleContext, resourceType entities.ResourceType, name string, update PublishMsg) + PublishProjectResourceEvent(ctx ConsoleContext, projectName string, resourceType entities.ResourceType, name string, update PublishMsg) PublishResourceEvent(ctx ResourceContext, resourceType entities.ResourceType, name string, update PublishMsg) } diff --git a/apps/console/internal/domain/environment.go b/apps/console/internal/domain/environment.go index ee1d7f674..2a3a99126 100644 --- a/apps/console/internal/domain/environment.go +++ b/apps/console/internal/domain/environment.go @@ -150,7 +150,7 @@ func (d *domain) CreateEnvironment(ctx ConsoleContext, projectName string, env e return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeEnvironment, nenv.Name, PublishAdd) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, nenv.ProjectName, entities.ResourceTypeEnvironment, nenv.Name, PublishAdd) if _, err := d.iamClient.AddMembership(ctx, &iam.AddMembershipIn{ UserId: string(ctx.UserId), @@ -448,7 +448,7 @@ func (d *domain) UpdateEnvironment(ctx ConsoleContext, projectName string, env e if err != nil { return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeEnvironment, upEnv.Name, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, upEnv.ProjectName, entities.ResourceTypeEnvironment, upEnv.Name, PublishUpdate) if err := d.applyK8sResource(ctx, upEnv.ProjectName, &upEnv.Environment, upEnv.RecordVersion); err != nil { return nil, errors.NewE(err) @@ -474,7 +474,7 @@ func (d *domain) DeleteEnvironment(ctx ConsoleContext, projectName string, name return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeEnvironment, uenv.Name, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, uenv.ProjectName, entities.ResourceTypeEnvironment, uenv.Name, PublishUpdate) if err := d.deleteK8sResource(ctx, uenv.ProjectName, &uenv.Environment); err != nil { if errors.Is(err, ErrNoClusterAttached) { @@ -504,7 +504,7 @@ func (d *domain) OnEnvironmentApplyError(ctx ConsoleContext, errMsg, namespace, return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeEnvironment, uenv.Name, PublishDelete) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, uenv.ProjectName, entities.ResourceTypeEnvironment, uenv.Name, PublishDelete) return errors.NewE(err) } @@ -527,7 +527,7 @@ func (d *domain) OnEnvironmentDeleteMessage(ctx ConsoleContext, env entities.Env return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeEnvironment, env.Name, PublishDelete) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, env.ProjectName, entities.ResourceTypeEnvironment, env.Name, PublishDelete) return nil } @@ -560,7 +560,7 @@ func (d *domain) OnEnvironmentUpdateMessage(ctx ConsoleContext, env entities.Env return err } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeEnvironment, uenv.Name, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, uenv.ProjectName, entities.ResourceTypeEnvironment, uenv.Name, PublishUpdate) return nil } diff --git a/apps/console/internal/domain/project-managed-service.go b/apps/console/internal/domain/project-managed-service.go index 0aa1ee58e..7d5526f05 100644 --- a/apps/console/internal/domain/project-managed-service.go +++ b/apps/console/internal/domain/project-managed-service.go @@ -124,7 +124,7 @@ func (d *domain) CreateProjectManagedService(ctx ConsoleContext, projectName str return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeProjectManagedService, pms.Name, PublishAdd) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, pms.ProjectName, entities.ResourceTypeProjectManagedService, pms.Name, PublishAdd) return pms, nil } @@ -180,7 +180,7 @@ func (d *domain) UpdateProjectManagedService(ctx ConsoleContext, projectName str return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeProjectManagedService, service.Name, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, upmsvc.ProjectName, entities.ResourceTypeProjectManagedService, service.Name, PublishUpdate) if err := d.applyProjectManagedService(ctx, upmsvc); err != nil { return nil, errors.NewE(err) @@ -206,7 +206,7 @@ func (d *domain) DeleteProjectManagedService(ctx ConsoleContext, projectName str return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeProjectManagedService, name, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, upmsvc.ProjectName, entities.ResourceTypeProjectManagedService, name, PublishUpdate) return d.deleteK8sResource(ctx, projectName, &upmsvc.ProjectManagedService) } @@ -247,7 +247,7 @@ func (d *domain) OnProjectManagedServiceApplyError(ctx ConsoleContext, projectNa return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeProjectManagedService, upmsvc.Name, PublishDelete) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, upmsvc.ProjectName, entities.ResourceTypeProjectManagedService, upmsvc.Name, PublishDelete) return errors.NewE(err) } @@ -263,7 +263,7 @@ func (d *domain) OnProjectManagedServiceDeleteMessage(ctx ConsoleContext, projec if err != nil { return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeProjectManagedService, service.Name, PublishDelete) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, projectName, entities.ResourceTypeProjectManagedService, service.Name, PublishDelete) return nil } @@ -299,7 +299,7 @@ func (d *domain) OnProjectManagedServiceUpdateMessage(ctx ConsoleContext, projec return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeProjectManagedService, upmsvc.Name, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, upmsvc.ProjectName, entities.ResourceTypeProjectManagedService, upmsvc.Name, PublishUpdate) return nil } diff --git a/apps/console/internal/domain/vpn-device.go b/apps/console/internal/domain/vpn-device.go index a2d7d00bb..61baf952a 100644 --- a/apps/console/internal/domain/vpn-device.go +++ b/apps/console/internal/domain/vpn-device.go @@ -202,7 +202,7 @@ func (d *domain) CreateVPNDevice(ctx ConsoleContext, device entities.ConsoleVPND return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, nDevice.Name, PublishAdd) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *nDevice.ProjectName, entities.ResourceTypeVPNDevice, nDevice.Name, PublishAdd) if device.ProjectName == nil || device.EnvironmentName == nil { return nDevice, nil @@ -237,7 +237,7 @@ func (d *domain) ActivateVPNDeviceOnNamespace(ctx ConsoleContext, devName string if err != nil { return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, devName, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, devName, PublishUpdate) if err := d.applyVPNDevice(ctx, upDevice); err != nil { return errors.NewE(err) @@ -310,7 +310,7 @@ func (d *domain) updateVpnDevice(ctx ConsoleContext, device entities.ConsoleVPND return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, device.Name, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, device.Name, PublishUpdate) if err := d.updateVpnOnCluster(ctx, upDevice, xdevice); err != nil { return nil, errors.NewE(err) @@ -340,7 +340,7 @@ func (d *domain) DeleteVPNDevice(ctx ConsoleContext, name string) error { return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, name, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, name, PublishUpdate) for _, v := range upDevice.LinkedClusters { if err := d.deleteK8sResourceOfCluster(ctx, v, &upDevice.Device); err != nil { @@ -387,7 +387,7 @@ func (d *domain) UpdateVpnDevicePorts(ctx ConsoleContext, devName string, ports return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, devName, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, devName, PublishUpdate) return nil } @@ -458,7 +458,7 @@ func (d *domain) OnVPNDeviceUpdateMessage(ctx ConsoleContext, device entities.Co return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, upDevice.Name, PublishUpdate) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, upDevice.Name, PublishUpdate) return nil } @@ -502,7 +502,7 @@ func (d *domain) OnVPNDeviceDeleteMessage(ctx ConsoleContext, device entities.Co return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, device.Name, PublishDelete) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *device.ProjectName, entities.ResourceTypeVPNDevice, device.Name, PublishDelete) return nil } @@ -536,6 +536,6 @@ func (d *domain) OnVPNDeviceApplyError(ctx ConsoleContext, errMsg string, name s if err != nil { return errors.NewE(err) } - d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, udevice.Name, PublishDelete) + d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *udevice.ProjectName, entities.ResourceTypeVPNDevice, udevice.Name, PublishDelete) return errors.NewE(err) } From 73dc495f490deadb65a7a5a70f01ef2ebce56534 Mon Sep 17 00:00:00 2001 From: Piyush Kumar Date: Fri, 9 Feb 2024 18:54:20 +0530 Subject: [PATCH 10/15] Add environment name while publishing nats event for environment resources --- apps/console/internal/app/adapter-resource-update-publish.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/console/internal/app/adapter-resource-update-publish.go b/apps/console/internal/app/adapter-resource-update-publish.go index 0e53b5363..64ecceae1 100644 --- a/apps/console/internal/app/adapter-resource-update-publish.go +++ b/apps/console/internal/app/adapter-resource-update-publish.go @@ -25,7 +25,7 @@ func (r *ResourceEventPublisherImpl) PublishConsoleEvent(ctx domain.ConsoleConte } func (r *ResourceEventPublisherImpl) PublishResourceEvent(ctx domain.ResourceContext, resourceType entities.ResourceType, name string, update domain.PublishMsg) { - subject := fmt.Sprintf("res-updates.account.%s.project.%s.environmentName.%s.%s.%s", ctx.AccountName, ctx.ProjectName, ctx.EnvironmentName, resourceType, name) + subject := fmt.Sprintf("res-updates.account.%s.project.%s.environment.%s.%s.%s", ctx.AccountName, ctx.ProjectName, ctx.EnvironmentName, resourceType, name) r.publish(subject, update) } From 58278e1d63d77fd223451ec2d8b5bd9df95e1156 Mon Sep 17 00:00:00 2001 From: Piyush Kumar Date: Mon, 12 Feb 2024 10:48:48 +0530 Subject: [PATCH 11/15] fix(infra): Add clustername in nats event publishing for below resources: - helm release - domain entry --- apps/infra/internal/domain/domain-entries.go | 14 ++++++++++---- apps/infra/internal/domain/helm-release.go | 12 ++++++------ apps/infra/internal/domain/ingress.go | 4 ++-- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/apps/infra/internal/domain/domain-entries.go b/apps/infra/internal/domain/domain-entries.go index bd438d8ff..037e01742 100644 --- a/apps/infra/internal/domain/domain-entries.go +++ b/apps/infra/internal/domain/domain-entries.go @@ -45,7 +45,7 @@ func (d *domain) CreateDomainEntry(ctx InfraContext, de entities.DomainEntry) (* if err != nil { return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeDomainEntries, nde.DomainName, PublishAdd) + d.resourceEventPublisher.PublishResourceEvent(ctx, nde.ClusterName, ResourceTypeDomainEntries, nde.DomainName, PublishAdd) return nde, nil } @@ -71,7 +71,7 @@ func (d *domain) UpdateDomainEntry(ctx InfraContext, de entities.DomainEntry) (* if err != nil { return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeDomainEntries, newDe.DomainName, PublishUpdate) + d.resourceEventPublisher.PublishResourceEvent(ctx, newDe.ClusterName, ResourceTypeDomainEntries, newDe.DomainName, PublishUpdate) return newDe, nil } @@ -79,7 +79,13 @@ func (d *domain) DeleteDomainEntry(ctx InfraContext, domainName string) error { if err := d.canPerformActionInAccount(ctx, iamT.DeleteDomainEntry); err != nil { return errors.NewE(err) } - err := d.domainEntryRepo.DeleteOne( + + existing, err := d.findDomainEntry(ctx, ctx.AccountName, domainName) + if err != nil { + return errors.NewE(err) + } + + err = d.domainEntryRepo.DeleteOne( ctx, repos.Filter{ fields.AccountName: ctx.AccountName, @@ -89,7 +95,7 @@ func (d *domain) DeleteDomainEntry(ctx InfraContext, domainName string) error { if err != nil { return errors.NewE(err) } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeDomainEntries, domainName, PublishDelete) + d.resourceEventPublisher.PublishResourceEvent(ctx, existing.ClusterName, ResourceTypeDomainEntries, domainName, PublishDelete) return nil } diff --git a/apps/infra/internal/domain/helm-release.go b/apps/infra/internal/domain/helm-release.go index b56e6dfc6..a47ddbfee 100644 --- a/apps/infra/internal/domain/helm-release.go +++ b/apps/infra/internal/domain/helm-release.go @@ -125,7 +125,7 @@ func (d *domain) CreateHelmRelease(ctx InfraContext, clusterName string, hr enti return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeHelmRelease, nhr.Name, PublishAdd) + d.resourceEventPublisher.PublishResourceEvent(ctx, nhr.ClusterName, ResourceTypeHelmRelease, nhr.Name, PublishAdd) if err = d.resDispatcher.ApplyToTargetCluster(ctx, clusterName, &corev1.Namespace{ TypeMeta: metav1.TypeMeta{ @@ -179,7 +179,7 @@ func (d *domain) UpdateHelmRelease(ctx InfraContext, clusterName string, hrIn en return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeHelmRelease, uphr.Name, PublishUpdate) + d.resourceEventPublisher.PublishResourceEvent(ctx, uphr.ClusterName, ResourceTypeHelmRelease, uphr.Name, PublishUpdate) if err := d.applyHelmRelease(ctx, uphr); err != nil { return nil, errors.NewE(err) } @@ -204,7 +204,7 @@ func (d *domain) DeleteHelmRelease(ctx InfraContext, clusterName string, name st return errors.NewE(err) } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeHelmRelease, uphr.Name, PublishUpdate) + d.resourceEventPublisher.PublishResourceEvent(ctx, uphr.ClusterName, ResourceTypeHelmRelease, uphr.Name, PublishUpdate) return d.resDispatcher.DeleteFromTargetCluster(ctx, clusterName, &uphr.HelmChart) } @@ -227,7 +227,7 @@ func (d *domain) OnHelmReleaseApplyError(ctx InfraContext, clusterName string, n if err != nil { return errors.NewE(err) } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeHelmRelease, uphr.Name, PublishUpdate) + d.resourceEventPublisher.PublishResourceEvent(ctx, uphr.ClusterName, ResourceTypeHelmRelease, uphr.Name, PublishUpdate) return errors.NewE(err) } @@ -243,7 +243,7 @@ func (d *domain) OnHelmReleaseDeleteMessage(ctx InfraContext, clusterName string if err != nil { return errors.NewE(err) } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeHelmRelease, hr.Name, PublishDelete) + d.resourceEventPublisher.PublishResourceEvent(ctx, clusterName, ResourceTypeHelmRelease, hr.Name, PublishDelete) return err } @@ -268,6 +268,6 @@ func (d *domain) OnHelmReleaseUpdateMessage(ctx InfraContext, clusterName string return errors.NewE(err) } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeHelmRelease, uphr.GetName(), PublishUpdate) + d.resourceEventPublisher.PublishResourceEvent(ctx, uphr.ClusterName, ResourceTypeHelmRelease, uphr.GetName(), PublishUpdate) return nil } diff --git a/apps/infra/internal/domain/ingress.go b/apps/infra/internal/domain/ingress.go index 290c808a2..735148e06 100644 --- a/apps/infra/internal/domain/ingress.go +++ b/apps/infra/internal/domain/ingress.go @@ -31,7 +31,7 @@ func (d *domain) OnIngressUpdateMessage(ctx InfraContext, clusterName string, in return err } - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeDomainEntries, de.DomainName, PublishUpdate) + d.resourceEventPublisher.PublishResourceEvent(ctx, clusterName, ResourceTypeDomainEntries, de.DomainName, PublishUpdate) } return nil @@ -61,7 +61,7 @@ func (d *domain) OnIngressDeleteMessage(ctx InfraContext, clusterName string, in } for i := range domainNames { - d.resourceEventPublisher.PublishInfraEvent(ctx, ResourceTypeDomainEntries, domainNames[i].(string), PublishDelete) + d.resourceEventPublisher.PublishResourceEvent(ctx, clusterName, ResourceTypeDomainEntries, domainNames[i].(string), PublishDelete) } return nil } From 8db502e236fafd0d9a7c8eadef561b161c2619c6 Mon Sep 17 00:00:00 2001 From: Abdhesh Nayak Date: Mon, 12 Feb 2024 19:20:34 +0530 Subject: [PATCH 12/15] :art: Improved logs and resource-watcher --- apps/websocket-server/internal/app/app.go | 14 +- .../internal/domain/commons.go | 4 - .../internal/domain/domain.go | 3 +- apps/websocket-server/internal/domain/logs.go | 343 ++++-------------- .../internal/domain/logs/main.go | 104 ++++++ apps/websocket-server/internal/domain/main.go | 115 ++++++ .../internal/domain/resource-update.go | 258 +++---------- .../internal/domain/resource_watch/main.go | 73 ++++ .../internal/domain/samp/main.go | 39 ++ .../internal/domain/types/main.go | 45 +++ .../internal/domain/utils/main.go | 38 ++ 11 files changed, 534 insertions(+), 502 deletions(-) create mode 100644 apps/websocket-server/internal/domain/logs/main.go create mode 100644 apps/websocket-server/internal/domain/main.go create mode 100644 apps/websocket-server/internal/domain/resource_watch/main.go create mode 100644 apps/websocket-server/internal/domain/samp/main.go create mode 100644 apps/websocket-server/internal/domain/types/main.go create mode 100644 apps/websocket-server/internal/domain/utils/main.go diff --git a/apps/websocket-server/internal/app/app.go b/apps/websocket-server/internal/app/app.go index e05eb5d6f..e0986aabe 100644 --- a/apps/websocket-server/internal/app/app.go +++ b/apps/websocket-server/internal/app/app.go @@ -59,23 +59,11 @@ var Module = fx.Module("app", // Web socket route a.Use("/ws", setUpgradable) - a.Use("/logs", setUpgradable) - - a.Use("/logs", func(c *fiber.Ctx) error { - ctx := c.Context() - - return websocket.New(func(sockConn *websocket.Conn) { - if err := d.HandleWebSocketForLogs(ctx, sockConn); err != nil { - logr.Errorf(err, "while handling websocket for logs") - } - })(c) - }) - a.Use("/ws", func(c *fiber.Ctx) error { ctx := c.Context() return websocket.New(func(sockConn *websocket.Conn) { - if err := d.HandleWebSocketForRUpdate(ctx, sockConn); err != nil { + if err := d.HandleWebSocket(ctx, sockConn); err != nil { logr.Errorf(err, "while handling websocket for resource update") } })(c) diff --git a/apps/websocket-server/internal/domain/commons.go b/apps/websocket-server/internal/domain/commons.go index ecf1de012..d8293a962 100644 --- a/apps/websocket-server/internal/domain/commons.go +++ b/apps/websocket-server/internal/domain/commons.go @@ -23,10 +23,6 @@ func (d *domain) checkAccountAccess(ctx context.Context, accountName string, use Action: string(action), }) - // if err != nil { - // return err - // } - if err != nil { d.logger.Errorf(err, "iam.can check for action: ", action) return errors.Newf("unauthorized to perform action: %s", action) diff --git a/apps/websocket-server/internal/domain/domain.go b/apps/websocket-server/internal/domain/domain.go index 46cf781e5..f6978bc45 100644 --- a/apps/websocket-server/internal/domain/domain.go +++ b/apps/websocket-server/internal/domain/domain.go @@ -13,8 +13,7 @@ import ( ) type SocketService interface { - HandleWebSocketForRUpdate(ctx context.Context, c *websocket.Conn) error - HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) error + HandleWebSocket(ctx context.Context, c *websocket.Conn) error } type Domain interface { diff --git a/apps/websocket-server/internal/domain/logs.go b/apps/websocket-server/internal/domain/logs.go index c3114c2ac..0cd0708a2 100644 --- a/apps/websocket-server/internal/domain/logs.go +++ b/apps/websocket-server/internal/domain/logs.go @@ -5,88 +5,22 @@ import ( "crypto/md5" "encoding/json" "fmt" - "strconv" "strings" - "time" - "github.com/gofiber/websocket/v2" "github.com/google/uuid" iamT "github.com/kloudlite/api/apps/iam/types" - "github.com/kloudlite/api/common" + "github.com/kloudlite/api/apps/websocket-server/internal/domain/logs" + "github.com/kloudlite/api/apps/websocket-server/internal/domain/types" + "github.com/kloudlite/api/apps/websocket-server/internal/domain/utils" "github.com/kloudlite/api/pkg/errors" - httpServer "github.com/kloudlite/api/pkg/http-server" msg_nats "github.com/kloudlite/api/pkg/messaging/nats" - "github.com/kloudlite/api/pkg/messaging/types" - "github.com/kloudlite/api/pkg/repos" - "github.com/nats-io/nats.go/jetstream" -) - -type Event string + msg_types "github.com/kloudlite/api/pkg/messaging/types" -const ( - EventSubscribe Event = "subscribe" - EventUnsubscribe Event = "unsubscribe" + "github.com/nats-io/nats.go/jetstream" ) -func parseTime(since string) (time.Time, error) { - now := time.Now() - - // Split the string into the numeric and duration type parts - length := len(since) - if length < 2 { - return now, fmt.Errorf("invalid expiration format") - } - - durationValStr := since[:length-1] - durationVal, err := strconv.Atoi(durationValStr) - if err != nil { - return now, fmt.Errorf("invalid duration value: %v", err) - } - - durationType := since[length-1] - - switch durationType { - case 'm': - return now.Add(-time.Duration(durationVal) * time.Minute), nil - case 'h': - return now.Add(-time.Duration(durationVal) * time.Hour), nil - case 'd': - return now.AddDate(0, 0, -durationVal), nil - case 'w': - return now.AddDate(0, 0, -durationVal*7), nil - case 'M': - return now.AddDate(0, -durationVal, 0), nil - default: - return now, fmt.Errorf("invalid duration type: %v, available types: m, h, d, w, M", durationType) - } -} - -func parseSince(since *string) (*time.Time, error) { - if since == nil { - return nil, nil - } - - if *since == "" { - return nil, nil - } - - t, err := parseTime(*since) - if err != nil { - return nil, errors.NewE(err) - } - - return &t, nil -} - -type LogsReqData struct { - AccountName string `json:"account"` - ClusterName string `json:"cluster"` - TrackingId string `json:"trackingId"` - Since *string `json:"since,omitempty"` -} - func (d *domain) newJetstreamConsumerForLog(ctx context.Context, subject string, consumerId string, since *string) (*msg_nats.JetstreamConsumer, error) { - t, err := parseSince(since) + t, err := logs.ParseSince(since) if err != nil { return nil, errors.NewE(err) } @@ -94,8 +28,6 @@ func (d *domain) newJetstreamConsumerForLog(ctx context.Context, subject string, id := uuid.New().String() cid := fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%s-%s", consumerId, id)))) - fmt.Println("consumerId: ", cid) - if t != nil { return msg_nats.NewJetstreamConsumer(ctx, d.jetStreamClient, msg_nats.JetstreamConsumerArgs{ Stream: d.env.LogsStreamName, @@ -123,248 +55,127 @@ func (d *domain) newJetstreamConsumerForLog(ctx context.Context, subject string, }) } -func getLogHash(ld LogsReqData, userId repos.ID, sid string) string { - return fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%s-%s-%s-%s", ld.AccountName, ld.ClusterName, ld.TrackingId, userId)))) -} - -func (d *domain) getLogSubsId(ld LogsReqData) string { - return fmt.Sprintf("%s.%s.%s.%s.>", d.env.LogsStreamName, ld.AccountName, ld.ClusterName, ld.TrackingId) -} - -func (d *domain) HandleWebSocketForLogs(ctx context.Context, c *websocket.Conn) error { - sess := httpServer.GetSession[*common.AuthSession](ctx) - if sess == nil { - return errors.NewE(fmt.Errorf("session not found")) - } - - defer func() { - if err := c.Close(); err != nil { - d.logger.Warnf("websocket close: %w", err) - } - }() - +func (d *domain) handleLogsMsg(ctx types.Context, logsSubs *logs.LogsSubsMap, msgAny map[string]any) error { log := d.logger - type Subscription struct { - resource LogsReqData - jc *msg_nats.JetstreamConsumer - open bool - Id string - } - - resources := make(map[string]*Subscription) - - defer func() { - for _, v := range resources { - if v.jc != nil { - if err := v.jc.Stop(ctx); err != nil { - log.Warnf("stop jetstream consumer: %w", err) - } - } - } - }() - - type Message struct { - Event Event `json:"event"` - Data LogsReqData `json:"data"` - Id string - } - - type MessageType string - - const ( - MessageTypeError MessageType = "error" - MessageTypeUpdate MessageType = "update" - MessageTypeInfo MessageType = "info" - MessageTypeLog MessageType = "log" - ) - type MsgSpec struct { - PodName string `json:"podName"` - ContainerName string `json:"containerName"` - } - - type MessageResponse struct { - Timestamp time.Time `json:"timestamp"` - Message string `json:"message"` - Id string `json:"id"` - Spec *MsgSpec `json:"spec,omitempty"` - Type MessageType `json:"type"` + var msg logs.Message + b, err := json.Marshal(msgAny) + if err != nil { + return err } - closed := false - - writeError := func(c *websocket.Conn, err error) error { - if c != nil { - return c.WriteJSON(MessageResponse{ - Type: MessageTypeError, - Message: err.Error(), - }) - } - return nil + if err := json.Unmarshal(b, &msg); err != nil { + return err } - writeInfo := func(c *websocket.Conn, msg string) error { - if c != nil { - return c.WriteJSON(MessageResponse{ - Type: MessageTypeInfo, - Message: msg, - }) - } - return nil + if msg.Id == "" { + msg.Id = "default" } - for { - if closed { - break - } - - var msg Message - if err := c.ReadJSON(&msg); err != nil { + hash := logs.LogHash(msg.Spec, ctx.Session.UserId, msg.Id) - if websocket.IsCloseError(err, websocket.CloseGoingAway) { - break - } - if websocket.IsCloseError(err, websocket.CloseAbnormalClosure) { - break - } + switch msg.Event { + case logs.EventSubscribe: + { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) + if err := d.checkAccountAccess(ctx.Context, msg.Spec.Account, ctx.Session.UserId, iamT.ReadLogs); err != nil { + return err } - continue - } - - if err := d.checkAccountAccess(ctx, msg.Data.AccountName, sess.UserId, iamT.ReadLogs); err != nil { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } - continue - } - - if msg.Id == "" { - msg.Id = "default" - } - - hash := getLogHash(msg.Data, sess.UserId, msg.Id) - - switch msg.Event { - case EventSubscribe: - - if _, ok := resources[hash]; ok { - - if resources[hash].jc != nil { - err := resources[hash].jc.Stop(ctx) - if err != nil { - if err := writeError( - c, errors.Newf("already subscribed to logs for account: %s, cluster: %s, trackingId: %s", - msg.Data.AccountName, msg.Data.ClusterName, msg.Data.TrackingId, - ), - ); err != nil { - log.Warnf("websocket write: %w", err) - } - // todo: reverify - continue + if _, ok := (*logsSubs)[hash]; ok { + if (*logsSubs)[hash].Jc != nil { + if err := (*logsSubs)[hash].Jc.Stop(ctx.Context); err != nil { + return err } } - } - jc, err := d.newJetstreamConsumerForLog(ctx, d.getLogSubsId(msg.Data), hash, msg.Data.Since) + jc, err := d.newJetstreamConsumerForLog(ctx.Context, logs.LogSubsId(msg.Spec, d.env.LogsStreamName), hash, msg.Spec.Since) if err != nil { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } - continue + return err + } + + if (*logsSubs) == nil { + *logsSubs = make(logs.LogsSubsMap) } - resources[hash] = &Subscription{ - resource: msg.Data, - jc: jc, - open: true, + (*logsSubs)[hash] = logs.LogsSubs{ + Jc: jc, Id: msg.Id, + Resource: msg.Spec, } go func() { - if err := writeInfo(c, "subscribed to logs"); err != nil { - log.Warnf("websocket write: %w", err) - } + + utils.WriteInfo(ctx, "subscribed to logs", msg.Id, types.ForLogs) if err := jc.Consume( - func(m *types.ConsumeMsg) error { - if c != nil { - var resp MessageResponse - if err := json.Unmarshal(m.Payload, &resp); err != nil { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } + func(m *msg_types.ConsumeMsg) error { + if ctx.Connection != nil { + var data logs.Response + var resp types.Response[logs.Response] + if err := json.Unmarshal(m.Payload, &data); err != nil { + return err } - resp.Type = MessageTypeLog + + resp.Type = types.MessageTypeResponse resp.Id = msg.Id sp := strings.Split(m.Subject, ".") - resp.Spec = &MsgSpec{ - PodName: sp[len(sp)-2], - ContainerName: sp[len(sp)-1], - } - if err := c.WriteJSON(resp); err != nil { - log.Warnf("websocket write: %w", err) + + data.PodName = sp[len(sp)-2] + data.ContainerName = sp[len(sp)-1] + + resp.Data = data + resp.For = types.ForLogs + + ctx.Mutex.Lock() + if ctx.Connection != nil { + if err := ctx.Connection.WriteJSON(resp); err != nil { + log.Warnf("websocket write: %w", err) + } } + ctx.Mutex.Unlock() } return nil }, - types.ConsumeOpts{ + msg_types.ConsumeOpts{ OnError: func(err error) error { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } - + utils.WriteError(ctx, err, msg.Id, types.ForLogs) return err }, }, ); err != nil { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } + utils.WriteError(ctx, err, msg.Id, types.ForLogs) } }() - case "unsubscribe": - if _, ok := resources[hash]; !ok { - if err := writeError( - c, errors.Newf("not subscribed to logs for account: %s, cluster: %s, trackingId: %s", - msg.Data.AccountName, msg.Data.ClusterName, msg.Data.TrackingId, - ), - ); err != nil { - log.Warnf("websocket write: %w", err) - } + } - continue - } + case logs.EventUnsubscribe: + { - if resources[hash].jc != nil { - if err := resources[hash].jc.Stop(ctx); err != nil { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) + ctx.Mutex.Lock() + if res, ok := (*logsSubs)[hash]; ok { + if res.Jc != nil { + if err := res.Jc.Stop(ctx.Context); err != nil { + return err } - continue - } - delete(resources, hash) - if err := writeInfo(c, "unsubscribed from logs"); err != nil { - log.Warnf("websocket write: %w", err) + delete(*logsSubs, hash) } + ctx.Mutex.Unlock() + utils.WriteInfo(ctx, "[logs] subscription cancelled for ", msg.Id, types.ForLogs) + } else { + ctx.Mutex.Unlock() + utils.WriteError(ctx, fmt.Errorf("[logs] no subscription found for account: %s, cluster: %s, trackingId: %s", + msg.Spec.Account, msg.Spec.Cluster, msg.Spec.TrackingId), msg.Id, types.ForLogs) } - default: - if err := writeError( - c, errors.Newf("invalid event: %s, available events: subscribe, unsubscribe", msg.Event), - ); err != nil { - log.Warnf("websocket write: %w", err) - } } - + default: + return fmt.Errorf("invalid event: %s", msg.Event) } return nil diff --git a/apps/websocket-server/internal/domain/logs/main.go b/apps/websocket-server/internal/domain/logs/main.go new file mode 100644 index 000000000..9cd6d91ed --- /dev/null +++ b/apps/websocket-server/internal/domain/logs/main.go @@ -0,0 +1,104 @@ +package logs + +import ( + "crypto/md5" + "fmt" + "strconv" + "time" + + "github.com/kloudlite/api/pkg/errors" + msg_nats "github.com/kloudlite/api/pkg/messaging/nats" + "github.com/kloudlite/api/pkg/repos" +) + +type Event string + +const ( + EventSubscribe Event = "subscribe" + EventUnsubscribe Event = "unsubscribe" +) + +type MsgData struct { + Account string `json:"account"` + Cluster string `json:"cluster"` + TrackingId string `json:"trackingId"` + Since *string `json:"since,omitempty"` +} + +type Message struct { + Event Event `json:"event"` + Spec MsgData `json:"spec"` + Id string `json:"id"` +} + +type Response struct { + Message string `json:"message"` + Timestamp time.Time `json:"timestamp"` + PodName string `json:"podName"` + ContainerName string `json:"containerName"` +} + +type LogsSubsMap map[string]LogsSubs +type LogsSubs struct { + Jc *msg_nats.JetstreamConsumer + Id string + Resource MsgData +} + +func LogHash(md MsgData, userId repos.ID, sid string) string { + return fmt.Sprintf("%x", md5.Sum([]byte(fmt.Sprintf("%s-%s-%s-%s", md.Account, md.Cluster, md.TrackingId, userId)))) +} + +func parseTime(since string) (time.Time, error) { + now := time.Now() + + // Split the string into the numeric and duration type parts + length := len(since) + if length < 2 { + return now, fmt.Errorf("invalid expiration format") + } + + durationValStr := since[:length-1] + durationVal, err := strconv.Atoi(durationValStr) + if err != nil { + return now, fmt.Errorf("invalid duration value: %v", err) + } + + durationType := since[length-1] + + switch durationType { + case 'm': + return now.Add(-time.Duration(durationVal) * time.Minute), nil + case 'h': + return now.Add(-time.Duration(durationVal) * time.Hour), nil + case 'd': + return now.AddDate(0, 0, -durationVal), nil + case 'w': + return now.AddDate(0, 0, -durationVal*7), nil + case 'M': + return now.AddDate(0, -durationVal, 0), nil + default: + return now, fmt.Errorf("invalid duration type: %v, available types: m, h, d, w, M", durationType) + } +} + +func ParseSince(since *string) (*time.Time, error) { + if since == nil { + return nil, nil + } + + if *since == "" { + return nil, nil + } + + t, err := parseTime(*since) + if err != nil { + return nil, errors.NewE(err) + } + + return &t, nil +} + +func LogSubsId(md MsgData, logStreamName string) string { + return fmt.Sprintf("%s.%s.%s.%s.>", logStreamName, md.Account, md.Cluster, md.TrackingId) +} diff --git a/apps/websocket-server/internal/domain/main.go b/apps/websocket-server/internal/domain/main.go new file mode 100644 index 000000000..e3ab586b5 --- /dev/null +++ b/apps/websocket-server/internal/domain/main.go @@ -0,0 +1,115 @@ +package domain + +import ( + "context" + "fmt" + "sync" + + "github.com/gofiber/websocket/v2" + "github.com/kloudlite/api/apps/websocket-server/internal/domain/logs" + res_watch "github.com/kloudlite/api/apps/websocket-server/internal/domain/resource_watch" + "github.com/kloudlite/api/apps/websocket-server/internal/domain/types" + "github.com/kloudlite/api/apps/websocket-server/internal/domain/utils" + "github.com/kloudlite/api/common" + "github.com/kloudlite/api/pkg/errors" + httpServer "github.com/kloudlite/api/pkg/http-server" +) + +func (d *domain) HandleWebSocket(ctx context.Context, c *websocket.Conn) error { + sess := httpServer.GetSession[*common.AuthSession](ctx) + if sess == nil { + return errors.NewE(fmt.Errorf("session not found")) + } + + mu := sync.Mutex{} + + var logsSubs = &logs.LogsSubsMap{} + var rWatchSubs = &res_watch.ResWatchSubsMap{} + + defer func() { + if err := c.Close(); err != nil { + d.logger.Warnf("websocket close: %w", err) + } + + if logsSubs != nil { + for _, v := range *logsSubs { + if v.Jc != nil { + if err := v.Jc.Stop(ctx); err != nil { + d.logger.Warnf("stop jetstream consumer: %w", err) + } + } + } + } + + if rWatchSubs != nil { + for _, v := range *rWatchSubs { + if v.Sub != nil { + if err := v.Sub.Unsubscribe(); err != nil { + d.logger.Warnf("unsubscribe: %w", err) + } + } + } + } + + }() + + closed := false + c.SetCloseHandler(func(_ int, _ string) error { + closed = true + return nil + }) + + sc := types.Context{ + Context: ctx, + Session: sess, + Connection: c, + Mutex: &mu, + } + + for { + + if closed { + break + } + + var msg types.Message + if err := c.ReadJSON(&msg); err != nil { + if websocket.IsCloseError(err, websocket.CloseGoingAway) { + break + } + if websocket.IsCloseError(err, websocket.CloseAbnormalClosure) { + break + } + + utils.WriteError(sc, err, "", "") + continue + } + + switch msg.For { + case types.ForLogs: + if err := d.handleLogsMsg(types.Context{ + Context: ctx, + Session: sess, + Connection: c, + Mutex: &mu, + }, logsSubs, msg.Data); err != nil { + utils.WriteError(sc, err, "", types.ForLogs) + } + + case types.ForResourceUpdate: + if err := d.handleResWatchMsg(types.Context{ + Context: ctx, + Session: sess, + Mutex: &mu, + }, rWatchSubs, msg.Data); err != nil { + utils.WriteError(sc, err, "", types.ForResourceUpdate) + } + + default: + utils.WriteError(sc, fmt.Errorf("invalid for: %s", msg.For), "", "") + } + + } + + return nil +} diff --git a/apps/websocket-server/internal/domain/resource-update.go b/apps/websocket-server/internal/domain/resource-update.go index a1cbcac20..77d10b635 100644 --- a/apps/websocket-server/internal/domain/resource-update.go +++ b/apps/websocket-server/internal/domain/resource-update.go @@ -2,30 +2,19 @@ package domain import ( "context" + "encoding/json" "fmt" - "strings" - "github.com/gofiber/websocket/v2" iamT "github.com/kloudlite/api/apps/iam/types" - "github.com/kloudlite/api/common" + res_watch "github.com/kloudlite/api/apps/websocket-server/internal/domain/resource_watch" + "github.com/kloudlite/api/apps/websocket-server/internal/domain/types" + "github.com/kloudlite/api/apps/websocket-server/internal/domain/utils" "github.com/kloudlite/api/grpc-interfaces/kloudlite.io/rpc/iam" - "github.com/kloudlite/api/pkg/errors" - httpServer "github.com/kloudlite/api/pkg/http-server" "github.com/kloudlite/api/pkg/repos" mnats "github.com/nats-io/nats.go" ) -type RUpdateReqData struct { - AccountName string `json:"account"` - ProjectName string `json:"project"` - - // ResourceName string `json:"resource"` - // ResourceType string `json:"resource_type"` - Topic string `json:"topic"` - ReqTopic string `json:"req_topic"` -} - -func (d *domain) checkAccess(ctx context.Context, rdata *RUpdateReqData, userId repos.ID) error { +func (d *domain) checkAccess(ctx context.Context, rdata *res_watch.ReqData, userId repos.ID) error { co, err := d.iamClient.Can(ctx, &iam.CanIn{ UserId: string(userId), ResourceRefs: func() []string { @@ -60,230 +49,65 @@ func (d *domain) checkAccess(ctx context.Context, rdata *RUpdateReqData, userId return nil } -func (d *domain) parseRUpdateReq(rt string) (*RUpdateReqData, error) { - - entriesStrs := strings.Split(rt, ".") - - rdata := &RUpdateReqData{} - - nTopics := "res-updates" - - for _, entryStr := range entriesStrs { - entry := strings.Split(entryStr, ":") - - if len(entry) != 2 { - nTopics += fmt.Sprintf(".%s.*", entry[0]) - } else { - nTopics += fmt.Sprintf(".%s.%s", entry[0], entry[1]) - } - - if (entry[0] == "account" || entry[0] == "project") && len(entry) == 2 { - if entry[0] == "account" { - rdata.AccountName = entry[1] - } - if entry[0] == "project" { - rdata.ProjectName = entry[1] - } - } - - } - - rdata.Topic = nTopics - rdata.ReqTopic = rt - if rdata.AccountName == "" { - return nil, fmt.Errorf("invalid topic %s", rt) - } - - return rdata, nil -} - -func (d *domain) HandleWebSocketForRUpdate(ctx context.Context, c *websocket.Conn) error { - - sess := httpServer.GetSession[*common.AuthSession](ctx) - if sess == nil { - return errors.NewE(fmt.Errorf("session not found")) - } - - defer func() { - if err := c.Close(); err != nil { - d.logger.Warnf("websocket close: %w", err) - } - }() - log := d.logger - - type Subscription struct { - resource RUpdateReqData - sub *mnats.Subscription - open bool +func (d *domain) handleResWatchMsg(ctx types.Context, resources *res_watch.ResWatchSubsMap, msgAny map[string]any) error { + var msg res_watch.Message + b, err := json.Marshal(msgAny) + if err != nil { + return err } - resources := make(map[string]*Subscription) - - type Message struct { - Event string `json:"event"` - Data string `json:"data"` + if err := json.Unmarshal(b, &msg); err != nil { + return err } - // "account:accid.cluster:clusterid.nodepool:nodepoolid" - - type MessageType string - - const ( - MessageTypeError MessageType = "error" - MessageTypeUpdate MessageType = "update" - MessageTypeInfo MessageType = "info" - ) - - type MessageResponse struct { - Topic string `json:"topic"` - Message string `json:"message"` - Type MessageType `json:"type"` + if msg.Id == "" { + msg.Id = "default" } - closed := false - - c.SetCloseHandler(func(_ int, _ string) error { - closed = true - return nil - }) - - defer func() { - for _, r := range resources { - if err := r.sub.Unsubscribe(); err != nil { - log.Warnf("websocket unsubscribe: %w", err) - } - } - }() + rd, err := res_watch.ParseReq(msg.ResPath) - writeError := func(c *websocket.Conn, err error) error { - if c != nil { - return c.WriteJSON(MessageResponse{ - Type: MessageTypeError, - Message: err.Error(), - }) - } - return nil + if err != nil { + return err } - writeInfo := func(c *websocket.Conn, msg string) error { - if c != nil { - return c.WriteJSON(MessageResponse{ - Type: MessageTypeInfo, - Message: msg, - }) - } - return nil + if err := d.checkAccess(ctx.Context, rd, ctx.Session.UserId); err != nil { + return err } - // Keep the connection open - for { - - if closed { - break - } - - var message Message - if err := c.ReadJSON(&message); err != nil { - - if websocket.IsCloseError(err, websocket.CloseGoingAway) { - break - } - if websocket.IsCloseError(err, websocket.CloseAbnormalClosure) { - break - } - - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } - - continue - } - - rd, err := d.parseRUpdateReq(message.Data) - if err != nil { - - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } - - continue - } - - if err := d.checkAccess(ctx, rd, sess.UserId); err != nil { - - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } - - continue - } - - switch message.Event { - case "subscribe": - if _, ok := resources[message.Data]; ok { - if err := writeError(c, fmt.Errorf("resource already subscribed")); err != nil { - log.Warnf("websocket write: %w", err) - } + switch msg.Event { + case res_watch.EventSubscribe: + { + if _, ok := (*resources)[rd.Topic]; ok { + return fmt.Errorf("resource already subscribed") } - sub, err := d.natsClient.Conn.Subscribe(rd.Topic, func(_ *mnats.Msg) { - - rmessage := MessageResponse{ - Topic: rd.ReqTopic, - Message: resources[rd.Topic].resource.ReqTopic, - Type: MessageTypeUpdate, - } - - if c != nil && resources[rd.Topic] != nil && resources[rd.Topic].open { - if err := c.WriteJSON(rmessage); err != nil { - log.Warnf("websocket write: %w", err) - } - } - - }) - + s, err := d.natsClient.Conn.Subscribe(rd.Topic, func(m *mnats.Msg) {}) if err != nil { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } - - continue - } - - if err := writeInfo(c, fmt.Sprintf("subscribed to %s", rd.Topic)); err != nil { - log.Warnf("websocket write: %w", err) - } - - resources[rd.Topic] = &Subscription{ - resource: *rd, - sub: sub, - open: true, + return err } - case "unsubscribe": - if _, ok := resources[message.Data]; !ok { - if err := writeError(c, fmt.Errorf("resource not subscribed")); err != nil { - log.Warnf("websocket write: %w", err) - } - - continue + (*resources)[rd.Topic] = res_watch.ResWatchSubs{ + Sub: s, + Resource: *rd, } - if resources[rd.Topic].sub != nil { - if err := resources[rd.Topic].sub.Unsubscribe(); err != nil { - if err := writeError(c, err); err != nil { - log.Warnf("websocket write: %w", err) - } - break + utils.WriteInfo(ctx, fmt.Sprintf("subscribed to %s", rd.Topic), msg.Id, types.ForResourceUpdate) + } + case res_watch.EventUnsubscribe: + { + if s, ok := (*resources)[rd.Topic]; ok { + if err := s.Sub.Unsubscribe(); err != nil { + return err } - delete(resources, message.Data) + delete(*resources, rd.Topic) + utils.WriteInfo(ctx, fmt.Sprintf("unsubscribed from %s", rd.Topic), msg.Id, types.ForResourceUpdate) } - default: - log.Errorf(fmt.Errorf("websocket read: invalid event %s", message.Event)) + utils.WriteError(ctx, fmt.Errorf("resource not found"), msg.Id, types.ForResourceUpdate) } - + default: + return fmt.Errorf("invalid event: %s", msg.Event) } return nil diff --git a/apps/websocket-server/internal/domain/resource_watch/main.go b/apps/websocket-server/internal/domain/resource_watch/main.go new file mode 100644 index 000000000..a8ebb202f --- /dev/null +++ b/apps/websocket-server/internal/domain/resource_watch/main.go @@ -0,0 +1,73 @@ +package res_watch + +import ( + "fmt" + mnats "github.com/nats-io/nats.go" + "strings" +) + +type ResWatchSubsMap map[string]ResWatchSubs +type ResWatchSubs struct { + Sub *mnats.Subscription + Resource ReqData +} + +type Event string + +const ( + EventSubscribe Event = "subscribe" + EventUnsubscribe Event = "unsubscribe" +) + +type Message struct { + ResPath string + Id string + Event Event +} + +type ReqData struct { + AccountName string `json:"account"` + ProjectName string `json:"project"` + + // ResourceName string `json:"resource"` + // ResourceType string `json:"resource_type"` + Topic string `json:"topic"` + ReqTopic string `json:"req_topic"` +} + +func ParseReq(rt string) (*ReqData, error) { + + entriesStrs := strings.Split(rt, ".") + + rdata := &ReqData{} + + nTopics := "res-updates" + + for _, entryStr := range entriesStrs { + entry := strings.Split(entryStr, ":") + + if len(entry) != 2 { + nTopics += fmt.Sprintf(".%s.*", entry[0]) + } else { + nTopics += fmt.Sprintf(".%s.%s", entry[0], entry[1]) + } + + if (entry[0] == "account" || entry[0] == "project") && len(entry) == 2 { + if entry[0] == "account" { + rdata.AccountName = entry[1] + } + if entry[0] == "project" { + rdata.ProjectName = entry[1] + } + } + + } + + rdata.Topic = nTopics + rdata.ReqTopic = rt + if rdata.AccountName == "" { + return nil, fmt.Errorf("invalid topic %s", rt) + } + + return rdata, nil +} diff --git a/apps/websocket-server/internal/domain/samp/main.go b/apps/websocket-server/internal/domain/samp/main.go new file mode 100644 index 000000000..59db586b4 --- /dev/null +++ b/apps/websocket-server/internal/domain/samp/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "fmt" + "sync" + "time" +) + +// SafeCounter is safe to use concurrently. +type SafeCounter struct { + mu sync.Mutex + v map[string]int +} + +// Inc increments the counter for the given key. +func (c *SafeCounter) Inc(key string) { + c.mu.Lock() + // Lock so only one goroutine at a time can access the map c.v. + c.v[key]++ + c.mu.Unlock() +} + +// Value returns the current value of the counter for the given key. +func (c *SafeCounter) Value(key string) int { + c.mu.Lock() + // Lock so only one goroutine at a time can access the map c.v. + defer c.mu.Unlock() + return c.v[key] +} + +func main() { + c := SafeCounter{v: make(map[string]int)} + for i := 0; i < 1000; i++ { + go c.Inc("somekey") + } + + time.Sleep(time.Second) + fmt.Println(c.Value("somekey")) +} diff --git a/apps/websocket-server/internal/domain/types/main.go b/apps/websocket-server/internal/domain/types/main.go new file mode 100644 index 000000000..ee17080d2 --- /dev/null +++ b/apps/websocket-server/internal/domain/types/main.go @@ -0,0 +1,45 @@ +package types + +import ( + "context" + "sync" + + "github.com/gofiber/websocket/v2" + "github.com/kloudlite/api/common" +) + +type For string + +const ( + ForLogs For = "logs" + ForResourceUpdate For = "resource-update" +) + +type MessageType string + +const ( + MessageTypeError MessageType = "error" + MessageTypeResponse MessageType = "response" + MessageTypeInfo MessageType = "info" +) + +type Response[T any] struct { + Type MessageType `json:"type"` + For For `json:"for"` + + Data T `json:"data"` + Message string `json:"message"` + Id string `json:"id"` +} + +type Message struct { + For For `json:"for"` + Data map[string]any `json:"data"` +} + +type Context struct { + Context context.Context + Session *common.AuthSession + Connection *websocket.Conn + Mutex *sync.Mutex +} diff --git a/apps/websocket-server/internal/domain/utils/main.go b/apps/websocket-server/internal/domain/utils/main.go new file mode 100644 index 000000000..b324174b1 --- /dev/null +++ b/apps/websocket-server/internal/domain/utils/main.go @@ -0,0 +1,38 @@ +package utils + +import ( + "github.com/gofiber/fiber/v2/log" + "github.com/kloudlite/api/apps/websocket-server/internal/domain/types" +) + +func WriteError(ctx types.Context, err error, id string, For types.For) { + if ctx.Context != nil { + ctx.Mutex.Lock() + if err := ctx.Connection.WriteJSON(types.Response[any]{ + Type: types.MessageTypeError, + Message: err.Error(), + For: For, + Id: id, + }); err != nil { + log.Warnf("websocket write: %w", err) + } + ctx.Mutex.Unlock() + } +} + +func WriteInfo(ctx types.Context, msg string, id string, For types.For) { + if ctx.Context != nil { + ctx.Mutex.Lock() + if err := ctx.Connection.WriteJSON(types.Response[any]{ + Type: types.MessageTypeInfo, + Message: msg, + Id: id, + For: For, + }); err != nil { + log.Warnf("websocket write: %w", err) + } + ctx.Mutex.Unlock() + } else { + log.Warnf("websocket connection is nil") + } +} From 003dff9aea39b914293e74d3c0ab5837074e3634 Mon Sep 17 00:00:00 2001 From: Abdhesh Nayak Date: Mon, 12 Feb 2024 19:21:25 +0530 Subject: [PATCH 13/15] :bug: Fixed issue with jetstream stop --- pkg/messaging/nats/jetstream-consumer.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkg/messaging/nats/jetstream-consumer.go b/pkg/messaging/nats/jetstream-consumer.go index 81f1f79aa..5ddab7a32 100644 --- a/pkg/messaging/nats/jetstream-consumer.go +++ b/pkg/messaging/nats/jetstream-consumer.go @@ -86,7 +86,9 @@ func (jc *JetstreamConsumer) Consume(consumeFn func(msg *types.ConsumeMsg) error // Stop implements Consumer. func (nc *JetstreamConsumer) Stop(context.Context) error { - nc.consumeCtx.Stop() + if nc.consumeCtx != nil { + nc.consumeCtx.Stop() + } return nil } From d6c861eea57933e901c944750612d4b9553e2b7a Mon Sep 17 00:00:00 2001 From: Piyush Kumar Date: Mon, 12 Feb 2024 22:06:49 +0530 Subject: [PATCH 14/15] fix(console/infra): change error return type in schema resolver --- apps/console/internal/app/graph/schema.resolvers.go | 6 +++--- apps/infra/internal/app/graph/schema.resolvers.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/console/internal/app/graph/schema.resolvers.go b/apps/console/internal/app/graph/schema.resolvers.go index 41d08e163..8d760c4f8 100644 --- a/apps/console/internal/app/graph/schema.resolvers.go +++ b/apps/console/internal/app/graph/schema.resolvers.go @@ -44,7 +44,7 @@ func (r *mutationResolver) CoreDeleteProject(ctx context.Context, name string) ( return false, errors.NewE(err) } if err := r.Domain.DeleteProject(cc, name); err != nil { - return false, nil + return false, errors.NewE(err) } return true, nil } @@ -74,7 +74,7 @@ func (r *mutationResolver) CoreDeleteEnvironment(ctx context.Context, projectNam return false, errors.NewE(err) } if err := r.Domain.DeleteEnvironment(cc, projectName, envName); err != nil { - return false, nil + return false, errors.NewE(err) } return true, nil } @@ -105,7 +105,7 @@ func (r *mutationResolver) CoreDeleteImagePullSecret(ctx context.Context, projec return false, errors.NewE(err) } if err := r.Domain.DeleteImagePullSecret(newResourceContext(cc, projectName, envName), secretName); err != nil { - return false, nil + return false, errors.NewE(err) } return true, nil } diff --git a/apps/infra/internal/app/graph/schema.resolvers.go b/apps/infra/internal/app/graph/schema.resolvers.go index 482cb1712..94db030e6 100644 --- a/apps/infra/internal/app/graph/schema.resolvers.go +++ b/apps/infra/internal/app/graph/schema.resolvers.go @@ -220,7 +220,7 @@ func (r *mutationResolver) InfraDeleteHelmRelease(ctx context.Context, clusterNa return false, errors.NewE(err) } if err := r.Domain.DeleteHelmRelease(ictx, clusterName, releaseName); err != nil { - return false, err + return false, errors.NewE(err) } return true, nil } From 91ba3e412669e254f57770817c91222dfe9829da Mon Sep 17 00:00:00 2001 From: nxtcoder17 Date: Wed, 14 Feb 2024 03:00:53 +0530 Subject: [PATCH 15/15] fix: IAM missing account name, infra missing cluster grpc error, and vpn device message publishing --- apps/console/internal/domain/vpn-device.go | 16 ++++++++-------- apps/iam/internal/app/grpc-server.go | 6 ++++++ apps/infra/internal/app/grpc-server.go | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/console/internal/domain/vpn-device.go b/apps/console/internal/domain/vpn-device.go index 61baf952a..a2d7d00bb 100644 --- a/apps/console/internal/domain/vpn-device.go +++ b/apps/console/internal/domain/vpn-device.go @@ -202,7 +202,7 @@ func (d *domain) CreateVPNDevice(ctx ConsoleContext, device entities.ConsoleVPND return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *nDevice.ProjectName, entities.ResourceTypeVPNDevice, nDevice.Name, PublishAdd) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, nDevice.Name, PublishAdd) if device.ProjectName == nil || device.EnvironmentName == nil { return nDevice, nil @@ -237,7 +237,7 @@ func (d *domain) ActivateVPNDeviceOnNamespace(ctx ConsoleContext, devName string if err != nil { return errors.NewE(err) } - d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, devName, PublishUpdate) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, devName, PublishUpdate) if err := d.applyVPNDevice(ctx, upDevice); err != nil { return errors.NewE(err) @@ -310,7 +310,7 @@ func (d *domain) updateVpnDevice(ctx ConsoleContext, device entities.ConsoleVPND return nil, errors.NewE(err) } - d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, device.Name, PublishUpdate) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, device.Name, PublishUpdate) if err := d.updateVpnOnCluster(ctx, upDevice, xdevice); err != nil { return nil, errors.NewE(err) @@ -340,7 +340,7 @@ func (d *domain) DeleteVPNDevice(ctx ConsoleContext, name string) error { return errors.NewE(err) } - d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, name, PublishUpdate) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, name, PublishUpdate) for _, v := range upDevice.LinkedClusters { if err := d.deleteK8sResourceOfCluster(ctx, v, &upDevice.Device); err != nil { @@ -387,7 +387,7 @@ func (d *domain) UpdateVpnDevicePorts(ctx ConsoleContext, devName string, ports return errors.NewE(err) } - d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, devName, PublishUpdate) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, devName, PublishUpdate) return nil } @@ -458,7 +458,7 @@ func (d *domain) OnVPNDeviceUpdateMessage(ctx ConsoleContext, device entities.Co return errors.NewE(err) } - d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *upDevice.ProjectName, entities.ResourceTypeVPNDevice, upDevice.Name, PublishUpdate) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, upDevice.Name, PublishUpdate) return nil } @@ -502,7 +502,7 @@ func (d *domain) OnVPNDeviceDeleteMessage(ctx ConsoleContext, device entities.Co return errors.NewE(err) } - d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *device.ProjectName, entities.ResourceTypeVPNDevice, device.Name, PublishDelete) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, device.Name, PublishDelete) return nil } @@ -536,6 +536,6 @@ func (d *domain) OnVPNDeviceApplyError(ctx ConsoleContext, errMsg string, name s if err != nil { return errors.NewE(err) } - d.resourceEventPublisher.PublishProjectResourceEvent(ctx, *udevice.ProjectName, entities.ResourceTypeVPNDevice, udevice.Name, PublishDelete) + d.resourceEventPublisher.PublishConsoleEvent(ctx, entities.ResourceTypeVPNDevice, udevice.Name, PublishDelete) return errors.NewE(err) } diff --git a/apps/iam/internal/app/grpc-server.go b/apps/iam/internal/app/grpc-server.go index b6b9f46a9..8858443d6 100644 --- a/apps/iam/internal/app/grpc-server.go +++ b/apps/iam/internal/app/grpc-server.go @@ -2,6 +2,7 @@ package app import ( "context" + "fmt" "strings" "github.com/kloudlite/api/apps/iam/internal/entities" @@ -138,6 +139,11 @@ func (s *GrpcService) Can(ctx context.Context, in *iam.CanIn) (*iam.CanOut, erro if err != nil { return nil, err } + + if strings.TrimSpace(accountName) == "" { + return nil, fmt.Errorf("accountName must be provided") + } + nf := s.rbRepo.MergeMatchFilters(repos.Filter{}, map[string]repos.MatchFilter{ "resource_ref": { MatchType: repos.MatchTypeRegex, diff --git a/apps/infra/internal/app/grpc-server.go b/apps/infra/internal/app/grpc-server.go index 3ef9e636c..7a4b9a3da 100644 --- a/apps/infra/internal/app/grpc-server.go +++ b/apps/infra/internal/app/grpc-server.go @@ -96,7 +96,7 @@ func (g *grpcServer) ClusterExists(ctx context.Context, in *infra.ClusterExistsI } cluster, err := g.d.GetCluster(infraCtx, in.ClusterName) if err != nil { - if !errors.Is(err, domain.ErrClusterNotFound) { + if errors.Is(err, domain.ErrClusterNotFound) { return &infra.ClusterExistsOut{Exists: false}, nil } return nil, errors.NewE(err)