Skip to content

Commit 11d3bc2

Browse files
introduced enterprise, oss_helm, oss_kubectl user support (#1639)
1 parent 46d5810 commit 11d3bc2

File tree

10 files changed

+125
-74
lines changed

10 files changed

+125
-74
lines changed

cmd/external-app/wire_gen.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/module/ModuleCacheService.go

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package module
2020
import (
2121
"context"
2222
"github.com/devtron-labs/devtron/internal/util"
23+
serverBean "github.com/devtron-labs/devtron/pkg/server/bean"
2324
serverEnvConfig "github.com/devtron-labs/devtron/pkg/server/config"
2425
serverDataStore "github.com/devtron-labs/devtron/pkg/server/store"
2526
util2 "github.com/devtron-labs/devtron/util"
@@ -39,6 +40,16 @@ import (
3940
type ModuleCacheService interface {
4041
}
4142

43+
type ModuleCacheServiceImpl struct {
44+
logger *zap.SugaredLogger
45+
mutex sync.Mutex
46+
K8sUtil *util.K8sUtil
47+
moduleEnvConfig *ModuleEnvConfig
48+
serverEnvConfig *serverEnvConfig.ServerEnvConfig
49+
serverDataStore *serverDataStore.ServerDataStore
50+
moduleRepository ModuleRepository
51+
}
52+
4253
func NewModuleCacheServiceImpl(logger *zap.SugaredLogger, K8sUtil *util.K8sUtil, moduleEnvConfig *ModuleEnvConfig, serverEnvConfig *serverEnvConfig.ServerEnvConfig,
4354
serverDataStore *serverDataStore.ServerDataStore, moduleRepository ModuleRepository) *ModuleCacheServiceImpl {
4455
impl := &ModuleCacheServiceImpl{
@@ -50,30 +61,23 @@ func NewModuleCacheServiceImpl(logger *zap.SugaredLogger, K8sUtil *util.K8sUtil,
5061
moduleRepository: moduleRepository,
5162
}
5263

53-
// for hyperion mode, installer crd won't come in picture
54-
// for full mode, need to update modules to installed in db in found as installing
55-
if util2.GetDevtronVersion().ServerMode == util2.SERVER_MODE_FULL {
56-
// handle cicd module status
57-
impl.updateModuleStatusToInstalled()
58-
}
64+
// if devtron user type is OSS_HELM then only installer object and modules installation is useful
65+
if serverEnvConfig.DevtronInstallationType == serverBean.DevtronInstallationTypeOssHelm {
66+
// for hyperion mode, installer crd won't come in picture
67+
// for full mode, need to update modules to installed in db in found as installing
68+
if util2.GetDevtronVersion().ServerMode == util2.SERVER_MODE_FULL {
69+
// handle cicd module status
70+
impl.updateModuleStatusToInstalled()
71+
}
5972

60-
// listen in installer object to save status in-memory
61-
// build informer to listen on installer object
62-
go impl.buildInformerToListenOnInstallerObject()
73+
// listen in installer object to save status in-memory
74+
// build informer to listen on installer object
75+
go impl.buildInformerToListenOnInstallerObject()
76+
}
6377

6478
return impl
6579
}
6680

67-
type ModuleCacheServiceImpl struct {
68-
logger *zap.SugaredLogger
69-
mutex sync.Mutex
70-
K8sUtil *util.K8sUtil
71-
moduleEnvConfig *ModuleEnvConfig
72-
serverEnvConfig *serverEnvConfig.ServerEnvConfig
73-
serverDataStore *serverDataStore.ServerDataStore
74-
moduleRepository ModuleRepository
75-
}
76-
7781
func (impl *ModuleCacheServiceImpl) updateModuleStatusToInstalled() {
7882
impl.logger.Debug("updating module status to installed")
7983
modules, err := impl.moduleRepository.FindAll()

pkg/module/ModuleCronService.go

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ package module
1919

2020
import (
2121
"fmt"
22+
serverBean "github.com/devtron-labs/devtron/pkg/server/bean"
23+
serverEnvConfig "github.com/devtron-labs/devtron/pkg/server/config"
2224
"github.com/robfig/cron/v3"
2325
"go.uber.org/zap"
2426
"time"
@@ -32,29 +34,35 @@ type ModuleCronServiceImpl struct {
3234
cron *cron.Cron
3335
moduleEnvConfig *ModuleEnvConfig
3436
moduleRepository ModuleRepository
37+
serverEnvConfig *serverEnvConfig.ServerEnvConfig
3538
}
3639

37-
func NewModuleCronServiceImpl(logger *zap.SugaredLogger, moduleEnvConfig *ModuleEnvConfig, moduleRepository ModuleRepository) (*ModuleCronServiceImpl, error) {
40+
func NewModuleCronServiceImpl(logger *zap.SugaredLogger, moduleEnvConfig *ModuleEnvConfig, moduleRepository ModuleRepository, serverEnvConfig *serverEnvConfig.ServerEnvConfig) (*ModuleCronServiceImpl, error) {
3841

3942
moduleCronServiceImpl := &ModuleCronServiceImpl{
4043
logger: logger,
44+
moduleEnvConfig: moduleEnvConfig,
4145
moduleRepository: moduleRepository,
46+
serverEnvConfig: serverEnvConfig,
4247
}
4348

44-
// cron job to update status as timeout if installing state keeps in more than 1 hour
45-
// initialise cron
46-
cron := cron.New(
47-
cron.WithChain())
48-
cron.Start()
49+
// if devtron user type is OSS_HELM then only cron to update module timeout status is useful
50+
if serverEnvConfig.DevtronInstallationType == serverBean.DevtronInstallationTypeOssHelm {
51+
// cron job to update status as timeout if installing state keeps in more than 1 hour
52+
// initialise cron
53+
cron := cron.New(
54+
cron.WithChain())
55+
cron.Start()
4956

50-
// add function into cron
51-
_, err := cron.AddFunc(fmt.Sprintf("@every %dm", moduleEnvConfig.ModuleTimeoutStatusHandlingCronDurationInMin), moduleCronServiceImpl.HandleModuleTimeoutStatus)
52-
if err != nil {
53-
fmt.Println("error in adding cron function into module cron service")
54-
return nil, err
55-
}
57+
// add function into cron
58+
_, err := cron.AddFunc(fmt.Sprintf("@every %dm", moduleEnvConfig.ModuleTimeoutStatusHandlingCronDurationInMin), moduleCronServiceImpl.HandleModuleTimeoutStatus)
59+
if err != nil {
60+
fmt.Println("error in adding cron function into module cron service")
61+
return nil, err
62+
}
5663

57-
moduleCronServiceImpl.cron = cron
64+
moduleCronServiceImpl.cron = cron
65+
}
5866

5967
return moduleCronServiceImpl, nil
6068
}
@@ -71,7 +79,6 @@ func (impl *ModuleCronServiceImpl) HandleModuleTimeoutStatus() {
7179
return
7280
}
7381

74-
7582
// update status timeout if module status is installing for more than 1 hour
7683
for _, module := range modules {
7784
if module.Status != ModuleStatusInstalling || !time.Now().After(module.UpdatedOn.Add(1*time.Hour)) {

pkg/module/ModuleService.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
"context"
2222
"errors"
2323
client "github.com/devtron-labs/devtron/api/helm-app"
24+
"github.com/devtron-labs/devtron/pkg/server"
25+
serverBean "github.com/devtron-labs/devtron/pkg/server/bean"
2426
serverEnvConfig "github.com/devtron-labs/devtron/pkg/server/config"
2527
util2 "github.com/devtron-labs/devtron/util"
2628
"github.com/go-pg/pg"
@@ -39,19 +41,22 @@ type ModuleServiceImpl struct {
3941
moduleRepository ModuleRepository
4042
moduleActionAuditLogRepository ModuleActionAuditLogRepository
4143
helmAppService client.HelmAppService
42-
// no need to inject moduleCacheService and cronService, but not generating in wire_gen (not triggering cache work in constructor) if not injecting. hence injecting
44+
// no need to inject serverCacheService, moduleCacheService and cronService, but not generating in wire_gen (not triggering cache work in constructor) if not injecting. hence injecting
45+
// serverCacheService should be injected first as it changes serverEnvConfig in its constructor, which is used by moduleCacheService and moduleCronService
46+
serverCacheService server.ServerCacheService
4347
moduleCacheService ModuleCacheService
4448
moduleCronService ModuleCronService
4549
}
4650

4751
func NewModuleServiceImpl(logger *zap.SugaredLogger, serverEnvConfig *serverEnvConfig.ServerEnvConfig, moduleRepository ModuleRepository,
48-
moduleActionAuditLogRepository ModuleActionAuditLogRepository, helmAppService client.HelmAppService, moduleCacheService ModuleCacheService, moduleCronService ModuleCronService) *ModuleServiceImpl {
52+
moduleActionAuditLogRepository ModuleActionAuditLogRepository, helmAppService client.HelmAppService, serverCacheService server.ServerCacheService, moduleCacheService ModuleCacheService, moduleCronService ModuleCronService) *ModuleServiceImpl {
4953
return &ModuleServiceImpl{
5054
logger: logger,
5155
serverEnvConfig: serverEnvConfig,
5256
moduleRepository: moduleRepository,
5357
moduleActionAuditLogRepository: moduleActionAuditLogRepository,
5458
helmAppService: helmAppService,
59+
serverCacheService: serverCacheService,
5560
moduleCacheService: moduleCacheService,
5661
moduleCronService: moduleCronService,
5762
}
@@ -86,7 +91,7 @@ func (impl ModuleServiceImpl) HandleModuleAction(userId int32, moduleName string
8691
impl.logger.Debugw("handling module action request", "moduleName", moduleName, "userId", userId, "payload", moduleActionRequest)
8792

8893
// check if can update server
89-
if !impl.serverEnvConfig.CanServerUpdate {
94+
if impl.serverEnvConfig.DevtronInstallationType != serverBean.DevtronInstallationTypeOssHelm {
9095
return nil, errors.New("module installation is not allowed")
9196
}
9297

pkg/server/ServerCacheService.go

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package server
2020
import (
2121
"context"
2222
client "github.com/devtron-labs/devtron/api/helm-app"
23+
serverBean "github.com/devtron-labs/devtron/pkg/server/bean"
2324
serverEnvConfig "github.com/devtron-labs/devtron/pkg/server/config"
2425
serverDataStore "github.com/devtron-labs/devtron/pkg/server/store"
2526
"github.com/tidwall/gjson"
@@ -45,23 +46,46 @@ func NewServerCacheServiceImpl(logger *zap.SugaredLogger, serverEnvConfig *serve
4546
helmAppService: helmAppService,
4647
}
4748

48-
// fetch current version from helm release
49+
// if devtron user type is enterprise, then don't do anything to get current devtron version
50+
// if not enterprise, then fetch devtron helm release -
51+
// if devtron helm release is found, treat it as OSS Helm user otherwise OSS kubectl user
52+
if serverEnvConfig.DevtronInstallationType == serverBean.DevtronInstallationTypeEnterprise {
53+
return impl
54+
}
55+
56+
// devtron helm release identifier
4957
appIdentifier := client.AppIdentifier{
5058
ClusterId: 1,
5159
Namespace: impl.serverEnvConfig.DevtronHelmReleaseNamespace,
5260
ReleaseName: impl.serverEnvConfig.DevtronHelmReleaseName,
5361
}
54-
releaseInfo, err := impl.helmAppService.GetValuesYaml(context.Background(), &appIdentifier)
62+
63+
// check if the release is installed or not
64+
isDevtronHelmReleaseInstalled, err := impl.helmAppService.IsReleaseInstalled(context.Background(), &appIdentifier)
5565
if err != nil {
56-
log.Fatalln("got error in fetching devtron helm release values.", "error", err)
57-
}
58-
currentVersion := gjson.Get(releaseInfo.GetMergedValues(), impl.serverEnvConfig.DevtronVersionIdentifierInHelmValues).String()
59-
if len(currentVersion) == 0 {
60-
log.Fatalln("current devtron version found empty")
66+
log.Fatalln("not able to check if the devtron helm release exists or not.", "error", err)
6167
}
6268

63-
// store current version in-memory
64-
impl.serverDataStore.CurrentVersion = currentVersion
69+
// if not installed, treat it as OSS kubectl user
70+
// if installed, treat it as OSS helm user and fetch current version
71+
if isDevtronHelmReleaseInstalled {
72+
serverEnvConfig.DevtronInstallationType = serverBean.DevtronInstallationTypeOssHelm
73+
74+
// fetch current version from helm release
75+
releaseInfo, err := impl.helmAppService.GetValuesYaml(context.Background(), &appIdentifier)
76+
if err != nil {
77+
log.Fatalln("got error in fetching devtron helm release values.", "error", err)
78+
}
79+
currentVersion := gjson.Get(releaseInfo.GetMergedValues(), impl.serverEnvConfig.DevtronVersionIdentifierInHelmValues).String()
80+
if len(currentVersion) == 0 {
81+
log.Fatalln("current devtron version found empty")
82+
}
83+
84+
// store current version in-memory
85+
impl.serverDataStore.CurrentVersion = currentVersion
86+
} else {
87+
serverEnvConfig.DevtronInstallationType = serverBean.DevtronInstallationTypeOssKubectl
88+
}
6589

6690
return impl
6791
}

pkg/server/ServerService.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,25 +40,34 @@ type ServerServiceImpl struct {
4040
serverDataStore *serverDataStore.ServerDataStore
4141
serverEnvConfig *serverEnvConfig.ServerEnvConfig
4242
helmAppService client.HelmAppService
43-
// no need to inject serverCacheService, but not generating in wire_gen (not triggering cache work in constructor) if not injecting. hence injecting
44-
serverCacheService ServerCacheService
4543
}
4644

4745
func NewServerServiceImpl(logger *zap.SugaredLogger, serverActionAuditLogRepository ServerActionAuditLogRepository,
48-
serverDataStore *serverDataStore.ServerDataStore, serverEnvConfig *serverEnvConfig.ServerEnvConfig, helmAppService client.HelmAppService, serverCacheService ServerCacheService) *ServerServiceImpl {
46+
serverDataStore *serverDataStore.ServerDataStore, serverEnvConfig *serverEnvConfig.ServerEnvConfig, helmAppService client.HelmAppService) *ServerServiceImpl {
4947
return &ServerServiceImpl{
5048
logger: logger,
5149
serverActionAuditLogRepository: serverActionAuditLogRepository,
5250
serverDataStore: serverDataStore,
5351
serverEnvConfig: serverEnvConfig,
5452
helmAppService: helmAppService,
55-
serverCacheService: serverCacheService,
5653
}
5754
}
5855

5956
func (impl ServerServiceImpl) GetServerInfo() (*serverBean.ServerInfoDto, error) {
6057
impl.logger.Debug("getting server info")
6158

59+
serverInfoDto := &serverBean.ServerInfoDto{
60+
CurrentVersion: impl.serverDataStore.CurrentVersion,
61+
ReleaseName: impl.serverEnvConfig.DevtronHelmReleaseName,
62+
Status: serverBean.ServerStatusUnknown,
63+
InstallationType: impl.serverEnvConfig.DevtronInstallationType,
64+
}
65+
66+
// if installation type is not OSS helm, then return (do not calculate server status)
67+
if serverInfoDto.InstallationType != serverBean.DevtronInstallationTypeOssHelm {
68+
return serverInfoDto, nil
69+
}
70+
6271
// fetch status of devtron helm app
6372
devtronHelmAppIdentifier := impl.helmAppService.GetDevtronHelmAppIdentifier()
6473
devtronAppDetail, err := impl.helmAppService.GetApplicationDetail(context.Background(), devtronHelmAppIdentifier)
@@ -90,21 +99,15 @@ func (impl ServerServiceImpl) GetServerInfo() (*serverBean.ServerInfoDto, error)
9099
}
91100
}
92101

93-
serverInfoDto := &serverBean.ServerInfoDto{
94-
CurrentVersion: impl.serverDataStore.CurrentVersion,
95-
ReleaseName: impl.serverEnvConfig.DevtronHelmReleaseName,
96-
Status: serverStatus,
97-
CanUpdateServer: impl.serverEnvConfig.CanServerUpdate,
98-
}
99-
102+
serverInfoDto.Status = serverStatus
100103
return serverInfoDto, nil
101104
}
102105

103106
func (impl ServerServiceImpl) HandleServerAction(userId int32, serverActionRequest *serverBean.ServerActionRequestDto) (*serverBean.ActionResponse, error) {
104107
impl.logger.Debugw("handling server action request", "userId", userId, "payload", serverActionRequest)
105108

106109
// check if can update server
107-
if !impl.serverEnvConfig.CanServerUpdate {
110+
if impl.serverEnvConfig.DevtronInstallationType != serverBean.DevtronInstallationTypeOssHelm {
108111
return nil, errors.New("server up-gradation is not allowed")
109112
}
110113

pkg/server/bean/Bean.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
package serverBean
1919

2020
type ServerInfoDto struct {
21-
CurrentVersion string `json:"currentVersion,notnull"`
22-
Status string `json:"status,notnull" validate:"oneof=healthy upgrading upgradeFailed unknown timeout"`
23-
ReleaseName string `json:"releaseName,notnull"`
24-
CanUpdateServer bool `json:"canUpdateServer,notnull"`
21+
CurrentVersion string `json:"currentVersion,omitempty"`
22+
Status string `json:"status,notnull" validate:"oneof=healthy upgrading upgradeFailed unknown timeout"`
23+
ReleaseName string `json:"releaseName,notnull"`
24+
InstallationType string `json:"installationType,notnull" validate:"oneof=oss_kubectl oss_helm enterprise"`
2525
}
2626

2727
type ServerActionRequestDto struct {
@@ -79,3 +79,11 @@ const (
7979
AppHealthStatusProgressing AppHealthStatusCode = "Progressing"
8080
AppHealthStatusDegraded AppHealthStatusCode = "Degraded"
8181
)
82+
83+
type DevtronInstallationType = string
84+
85+
const (
86+
DevtronInstallationTypeOssKubectl DevtronInstallationType = "oss_kubectl"
87+
DevtronInstallationTypeOssHelm DevtronInstallationType = "oss_helm"
88+
DevtronInstallationTypeEnterprise DevtronInstallationType = "enterprise"
89+
)

pkg/server/config/ServerEnvConfig.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
)
77

88
type ServerEnvConfig struct {
9-
CanServerUpdate bool `env:"CAN_SERVER_UPDATE" envDefault:"true"` // default true
9+
DevtronInstallationType string `env:"DEVTRON_INSTALLATION_TYPE"`
1010
InstallerCrdObjectGroupName string `env:"INSTALLER_CRD_OBJECT_GROUP_NAME" envDefault:"installer.devtron.ai"`
1111
InstallerCrdObjectVersion string `env:"INSTALLER_CRD_OBJECT_VERSION" envDefault:"v1alpha1"`
1212
InstallerCrdObjectResource string `env:"INSTALLER_CRD_OBJECT_RESOURCE" envDefault:"installers"`

specs/modularisation/v1.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,10 @@ components:
110110
type: string
111111
description: helm release name of the devtron server
112112
example: "devtron"
113-
canUpdateServer:
114-
type: boolean
115-
description: if server update is allowed programatically
116-
example: "true"
113+
installationType:
114+
type: string
115+
description: devtron installation type
116+
example: "oss_kubectl|oss_helm|enterprise"
117117
ServerActionRequest:
118118
type: object
119119
properties:

0 commit comments

Comments
 (0)