Skip to content

Commit e3b9a2f

Browse files
Merge pull request #49 from devtron-labs/release-candidate-v0.23.0
chore: Release candidate v0.23.0
2 parents cb3cad6 + 58fcf35 commit e3b9a2f

File tree

3,474 files changed

+542007
-126246
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

3,474 files changed

+542007
-126246
lines changed

app/App.go

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"github.com/caarlos0/env"
6+
"github.com/devtron-labs/silver-surfer/app/api"
7+
"github.com/devtron-labs/silver-surfer/app/constants"
8+
grpc2 "github.com/devtron-labs/silver-surfer/app/grpc"
9+
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/recovery"
10+
grpcPrometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
11+
"go.uber.org/zap"
12+
"google.golang.org/grpc"
13+
"google.golang.org/grpc/codes"
14+
"google.golang.org/grpc/keepalive"
15+
"google.golang.org/grpc/status"
16+
"log"
17+
"net"
18+
"os"
19+
"runtime/debug"
20+
"time"
21+
)
22+
23+
type App struct {
24+
grpcServer *grpc.Server
25+
StartupConfig *StartupConfig
26+
logger *zap.SugaredLogger
27+
GrpcHandler *api.GrpcHandlerImpl
28+
}
29+
30+
func NewApp(
31+
logger *zap.SugaredLogger,
32+
GrpcHandler *api.GrpcHandlerImpl,
33+
) *App {
34+
return &App{
35+
logger: logger,
36+
GrpcHandler: GrpcHandler,
37+
}
38+
}
39+
40+
type StartupConfig struct {
41+
GrpcPort int `env:"SERVER_GRPC_PORT" envDefault:"8111"`
42+
GrpcMaxRecvMsgSize int `env:"GRPC_MAX_RECEIVE_MSG_SIZE" envDefault:"20"` // In mb
43+
GrpcMaxSendMsgSize int `env:"GRPC_MAX_SEND_MSG_SIZE" envDefault:"4"` // In mb
44+
}
45+
46+
func (app *App) Start() {
47+
// Parse config
48+
app.StartupConfig = &StartupConfig{}
49+
err := env.Parse(app.StartupConfig)
50+
if err != nil {
51+
app.logger.Errorw("failed to parse configuration")
52+
os.Exit(2)
53+
}
54+
55+
// Start gRPC server
56+
err = app.initGrpcServer(app.StartupConfig.GrpcPort)
57+
if err != nil {
58+
app.logger.Errorw("error starting grpc server", "err", err)
59+
os.Exit(2)
60+
}
61+
}
62+
63+
func (app *App) initGrpcServer(port int) error {
64+
app.logger.Infow("gRPC server starting", "port", app.StartupConfig.GrpcPort)
65+
66+
//listen on the port
67+
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
68+
if err != nil {
69+
log.Fatalf("failed to start grpcServer %v", err)
70+
return err
71+
}
72+
73+
grpcPanicRecoveryHandler := func(p any) (err error) {
74+
app.logger.Error(constants.PanicLogIdentifier, "recovered from panic", "panic", p, "stack", string(debug.Stack()))
75+
return status.Errorf(codes.Internal, "%s", p)
76+
}
77+
recoveryOption := recovery.WithRecoveryHandler(grpcPanicRecoveryHandler)
78+
opts := []grpc.ServerOption{
79+
grpc.MaxRecvMsgSize(app.StartupConfig.GrpcMaxRecvMsgSize * 1024 * 1024), // GRPC Request size
80+
grpc.MaxSendMsgSize(app.StartupConfig.GrpcMaxSendMsgSize * 1024 * 1024), // GRPC Response size
81+
grpc.KeepaliveParams(keepalive.ServerParameters{
82+
MaxConnectionAge: 10 * time.Second,
83+
}),
84+
grpc.ChainStreamInterceptor(
85+
grpcPrometheus.StreamServerInterceptor,
86+
recovery.StreamServerInterceptor(recoveryOption)), // panic interceptor, should be at last
87+
grpc.ChainUnaryInterceptor(
88+
grpcPrometheus.UnaryServerInterceptor,
89+
recovery.UnaryServerInterceptor(recoveryOption)), // panic interceptor, should be at last
90+
}
91+
// create a new gRPC grpcServer
92+
app.grpcServer = grpc.NewServer(opts...)
93+
94+
// register Silver Surfer service
95+
grpc2.RegisterSilverSurferServiceServer(app.grpcServer, app.GrpcHandler)
96+
grpcPrometheus.EnableHandlingTimeHistogram()
97+
grpcPrometheus.Register(app.grpcServer)
98+
// start listening on address
99+
if err = app.grpcServer.Serve(lis); err != nil {
100+
log.Fatalf("failed to start: %v", err)
101+
return err
102+
}
103+
return nil
104+
}
105+
106+
func (app *App) Stop() {
107+
108+
app.logger.Infow("silver-surfer shutdown initiating")
109+
110+
// Gracefully stop the gRPC server
111+
app.logger.Info("Stopping gRPC server...")
112+
app.grpcServer.GracefulStop()
113+
114+
app.logger.Infow("housekeeping done. exiting now")
115+
}

app/DockerfileMVC

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Binary Build
2+
FROM golang:1.21-alpine3.17 AS build-env
3+
RUN echo $GOPATH
4+
RUN apk add --no-cache git gcc musl-dev
5+
RUN apk add --update make
6+
RUN mkdir /silver-surfer
7+
WORKDIR /silver-surfer
8+
ADD . /silver-surfer/
9+
RUN rm -rf ./bin
10+
RUN mkdir ./bin
11+
RUN GOOS=linux go build -o ./bin/kubedd-mvc ./app
12+
13+
# Prod Build
14+
FROM alpine:3.17
15+
RUN apk add --no-cache ca-certificates
16+
RUN apk update
17+
RUN apk add git
18+
COPY --from=build-env /silver-surfer/bin .
19+
ENTRYPOINT ["./kubedd-mvc"]

app/Wire.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//go:build wireinject
2+
// +build wireinject
3+
4+
package main
5+
6+
import (
7+
"github.com/devtron-labs/common-lib/utils/k8s"
8+
"github.com/devtron-labs/silver-surfer/app/api"
9+
"github.com/devtron-labs/silver-surfer/app/logger"
10+
"github.com/devtron-labs/silver-surfer/app/service"
11+
"github.com/google/wire"
12+
)
13+
14+
func InitializeApp() (*App, error) {
15+
wire.Build(
16+
NewApp,
17+
logger.NewSugaredLogger,
18+
api.NewGrpcHandlerImpl,
19+
service.NewClusterUpgradeReadServiceImpl,
20+
wire.Bind(new(service.ClusterUpgradeReadService), new(*service.ClusterUpgradeReadServiceImpl)),
21+
k8s.GetRuntimeConfig,
22+
k8s.NewK8sUtil,
23+
wire.Bind(new(k8s.K8sService), new(*k8s.K8sServiceImpl)),
24+
)
25+
return &App{}, nil
26+
}

app/adaptors/adaptor.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package adaptors
2+
3+
import (
4+
"github.com/devtron-labs/common-lib/utils/k8s"
5+
"github.com/devtron-labs/common-lib/utils/remoteConnection/bean"
6+
"github.com/devtron-labs/silver-surfer/app/grpc"
7+
"github.com/devtron-labs/silver-surfer/pkg"
8+
)
9+
10+
func ConvertSummaryValidationResultToGrpcObj(req []pkg.SummaryValidationResult) []*grpc.SummaryValidationResult {
11+
resp := make([]*grpc.SummaryValidationResult, 0, len(req))
12+
for _, item := range req {
13+
svr := &grpc.SummaryValidationResult{
14+
FileName: item.FileName,
15+
Kind: item.Kind,
16+
APIVersion: item.APIVersion,
17+
ResourceName: item.ResourceName,
18+
ResourceNamespace: item.ResourceNamespace,
19+
Deleted: item.Deleted,
20+
Deprecated: item.Deprecated,
21+
LatestAPIVersion: item.LatestAPIVersion,
22+
IsVersionSupported: int32(item.IsVersionSupported),
23+
ErrorsForOriginal: ConvertSummarySchemaErrorToGrpcObj(item.ErrorsForOriginal),
24+
ErrorsForLatest: ConvertSummarySchemaErrorToGrpcObj(item.ErrorsForLatest),
25+
DeprecationForOriginal: ConvertSummarySchemaErrorToGrpcObj(item.DeprecationForOriginal),
26+
DeprecationForLatest: ConvertSummarySchemaErrorToGrpcObj(item.DeprecationForLatest),
27+
}
28+
resp = append(resp, svr)
29+
}
30+
return resp
31+
}
32+
33+
func ConvertSummarySchemaErrorToGrpcObj(req []*pkg.SummarySchemaError) []*grpc.SummarySchemaError {
34+
resp := make([]*grpc.SummarySchemaError, 0, len(req))
35+
for _, item := range req {
36+
if item != nil {
37+
sse := &grpc.SummarySchemaError{
38+
Path: item.Path,
39+
SchemaField: item.SchemaField,
40+
Reason: item.Reason,
41+
}
42+
resp = append(resp, sse)
43+
}
44+
}
45+
return resp
46+
}
47+
48+
func ConvertGrpcObjToClusterConfig(req *grpc.ClusterConfig) *k8s.ClusterConfig {
49+
if req != nil {
50+
return &k8s.ClusterConfig{
51+
ClusterName: req.ClusterName,
52+
Host: req.ApiServerUrl,
53+
BearerToken: req.Token,
54+
InsecureSkipTLSVerify: req.InsecureSkipTLSVerify,
55+
KeyData: req.KeyData,
56+
CertData: req.CertData,
57+
CAData: req.CaData,
58+
ClusterId: int(req.ClusterId),
59+
RemoteConnectionConfig: ConvertGrpcObjToRemoteConnectionConfig(req.RemoteConnectionConfig),
60+
}
61+
}
62+
return &k8s.ClusterConfig{}
63+
}
64+
65+
func ConvertGrpcObjToRemoteConnectionConfig(req *grpc.RemoteConnectionConfig) *bean.RemoteConnectionConfigBean {
66+
if req != nil {
67+
return &bean.RemoteConnectionConfigBean{
68+
ConnectionMethod: bean.RemoteConnectionMethod(req.RemoteConnectionMethod),
69+
ProxyConfig: ConvertGrpcObjToProxyConfig(req.ProxyConfig),
70+
SSHTunnelConfig: ConvertGrpcObjToSSHTunnelConfig(req.SSHTunnelConfig),
71+
}
72+
}
73+
return &bean.RemoteConnectionConfigBean{}
74+
}
75+
76+
func ConvertGrpcObjToProxyConfig(req *grpc.ProxyConfig) *bean.ProxyConfig {
77+
if req != nil {
78+
return &bean.ProxyConfig{ProxyUrl: req.ProxyUrl}
79+
}
80+
return &bean.ProxyConfig{}
81+
}
82+
83+
func ConvertGrpcObjToSSHTunnelConfig(req *grpc.SSHTunnelConfig) *bean.SSHTunnelConfig {
84+
if req != nil {
85+
return &bean.SSHTunnelConfig{
86+
SSHServerAddress: req.SSHServerAddress,
87+
SSHUsername: req.SSHUsername,
88+
SSHPassword: req.SSHPassword,
89+
SSHAuthKey: req.SSHAuthKey,
90+
}
91+
}
92+
return &bean.SSHTunnelConfig{}
93+
}

app/api/GrpcHandler.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package api
2+
3+
import (
4+
"context"
5+
"github.com/devtron-labs/silver-surfer/app/adaptors"
6+
"github.com/devtron-labs/silver-surfer/app/grpc"
7+
"github.com/devtron-labs/silver-surfer/app/service"
8+
"go.uber.org/zap"
9+
)
10+
11+
type GrpcHandlerImpl struct {
12+
grpc.UnimplementedSilverSurferServiceServer
13+
logger *zap.SugaredLogger
14+
clusterUpgradeReadService service.ClusterUpgradeReadService
15+
}
16+
17+
func NewGrpcHandlerImpl(
18+
logger *zap.SugaredLogger,
19+
clusterUpgradeReadService service.ClusterUpgradeReadService,
20+
) *GrpcHandlerImpl {
21+
return &GrpcHandlerImpl{
22+
logger: logger,
23+
clusterUpgradeReadService: clusterUpgradeReadService,
24+
}
25+
}
26+
27+
func (impl *GrpcHandlerImpl) GetClusterUpgradeSummaryValidationResult(ctx context.Context, request *grpc.ClusterUpgradeRequest) (*grpc.ClusterUpgradeResponse, error) {
28+
impl.logger.Infow("scan cluster resources compatibility for k8s version upgrade request", "clusterId", request.ClusterConfig.ClusterId, "clusterName", request.ClusterConfig.ClusterName, "serverUrl", request.ClusterConfig.ApiServerUrl)
29+
summaryValidationResult, err := impl.clusterUpgradeReadService.GetClusterUpgradeSummaryValidationResult(request.TargetK8SVersion, request.ClusterConfig)
30+
if err != nil {
31+
impl.logger.Errorw("error in getting cluster upgrade summary validation result", "targetK8sVersion", request.TargetK8SVersion, "err", err)
32+
return nil, err
33+
}
34+
svr := adaptors.ConvertSummaryValidationResultToGrpcObj(summaryValidationResult)
35+
return &grpc.ClusterUpgradeResponse{Results: svr}, nil
36+
}

app/constants/Constants.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package constants
2+
3+
const (
4+
PanicLogIdentifier = "DEVTRON_PANIC_RECOVER"
5+
OutputJson = "json"
6+
)

0 commit comments

Comments
 (0)