Skip to content

Commit fed99b2

Browse files
feat: Functionality added to install chart, chart-repository feature for hyperion mode (#1249)
* App store values file placement, packaging and wiring change * wiring fix * wip * fix * reverted hardcoding * Delete app * some fix * installed app and release info * compilation fix * some fix * app info in app detail * UpdateApplicationWithChartInfo added * wiring fix for helm and arhocd * FIx: hotfix commit and nil pointer on chart install #1263 * rbac fix * db file number change * updated manifest - change back tag before merging * update git has for migrator - change it before merging * updated git has for migrator - update before merging * revert * code comments incorporate * context pass revert Co-authored-by: Prashant Ghildiyal <[email protected]>
1 parent ed1fe3a commit fed99b2

39 files changed

+2581
-1111
lines changed

Wire.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ package main
2222

2323
import (
2424
appStoreRestHandler "github.com/devtron-labs/devtron/api/appStore"
25+
appStoreDeployment "github.com/devtron-labs/devtron/api/appStore/deployment"
2526
appStoreDiscover "github.com/devtron-labs/devtron/api/appStore/discover"
27+
appStoreValues "github.com/devtron-labs/devtron/api/appStore/values"
2628
chartRepo "github.com/devtron-labs/devtron/api/chartRepo"
2729
"github.com/devtron-labs/devtron/api/cluster"
2830
"github.com/devtron-labs/devtron/api/connector"
@@ -63,6 +65,8 @@ import (
6365
"github.com/devtron-labs/devtron/pkg/appClone/batch"
6466
appStore "github.com/devtron-labs/devtron/pkg/appStore"
6567
appStoreBean "github.com/devtron-labs/devtron/pkg/appStore/bean"
68+
appStoreDeploymentFullMode "github.com/devtron-labs/devtron/pkg/appStore/deployment/fullMode"
69+
appStoreDeploymentGitopsTool "github.com/devtron-labs/devtron/pkg/appStore/deployment/tool/gitops"
6670
appStoreRepository "github.com/devtron-labs/devtron/pkg/appStore/repository"
6771
"github.com/devtron-labs/devtron/pkg/appWorkflow"
6872
"github.com/devtron-labs/devtron/pkg/attributes"
@@ -102,6 +106,8 @@ func InitializeApp() (*App, error) {
102106
k8s.K8sApplicationWireSet,
103107
chartRepo.ChartRepositoryWireSet,
104108
appStoreDiscover.AppStoreDiscoverWireSet,
109+
appStoreValues.AppStoreValuesWireSet,
110+
appStoreDeployment.AppStoreDeploymentWireSet,
105111
// -------wireset end ----------
106112
gitSensor.GetGitSensorConfig,
107113
gitSensor.NewGitSensorSession,
@@ -409,8 +415,6 @@ func InitializeApp() (*App, error) {
409415
wire.Bind(new(appStoreRestHandler.InstalledAppRestHandler), new(*appStoreRestHandler.InstalledAppRestHandlerImpl)),
410416
appStore.NewInstalledAppServiceImpl,
411417
wire.Bind(new(appStore.InstalledAppService), new(*appStore.InstalledAppServiceImpl)),
412-
appStoreRepository.NewInstalledAppRepositoryImpl,
413-
wire.Bind(new(appStoreRepository.InstalledAppRepository), new(*appStoreRepository.InstalledAppRepositoryImpl)),
414418

415419
appStoreRestHandler.NewAppStoreRouterImpl,
416420
wire.Bind(new(appStoreRestHandler.AppStoreRouter), new(*appStoreRestHandler.AppStoreRouterImpl)),
@@ -477,12 +481,6 @@ func InitializeApp() (*App, error) {
477481
pubsub2.NewNatsPublishClientImpl,
478482
wire.Bind(new(pubsub2.NatsPublishClient), new(*pubsub2.NatsPublishClientImpl)),
479483

480-
appStoreRestHandler.NewAppStoreValuesRestHandlerImpl,
481-
wire.Bind(new(appStoreRestHandler.AppStoreValuesRestHandler), new(*appStoreRestHandler.AppStoreValuesRestHandlerImpl)),
482-
appStore.NewAppStoreValuesServiceImpl,
483-
wire.Bind(new(appStore.AppStoreValuesService), new(*appStore.AppStoreValuesServiceImpl)),
484-
appStoreRepository.NewAppStoreVersionValuesRepositoryImpl,
485-
wire.Bind(new(appStoreRepository.AppStoreVersionValuesRepository), new(*appStoreRepository.AppStoreVersionValuesRepositoryImpl)),
486484

487485
//Batch actions
488486
batch.NewWorkflowActionImpl,
@@ -545,8 +543,6 @@ func InitializeApp() (*App, error) {
545543
wire.Bind(new(security.PolicyService), new(*security.PolicyServiceImpl)),
546544
security2.NewPolicyRepositoryImpl,
547545
wire.Bind(new(security2.CvePolicyRepository), new(*security2.CvePolicyRepositoryImpl)),
548-
appStoreRepository.NewClusterInstalledAppsRepositoryImpl,
549-
wire.Bind(new(appStoreRepository.ClusterInstalledAppsRepository), new(*appStoreRepository.ClusterInstalledAppsRepositoryImpl)),
550546

551547
argocdServer.NewArgoK8sClientImpl,
552548
wire.Bind(new(argocdServer.ArgoK8sClient), new(*argocdServer.ArgoK8sClientImpl)),
@@ -635,6 +631,12 @@ func InitializeApp() (*App, error) {
635631
wire.Bind(new(delete2.DeleteService), new(*delete2.DeleteServiceExtendedImpl)),
636632
delete2.NewDeleteServiceFullModeImpl,
637633
wire.Bind(new(delete2.DeleteServiceFullMode), new(*delete2.DeleteServiceFullModeImpl)),
634+
635+
636+
appStoreDeploymentFullMode.NewAppStoreDeploymentFullModeServiceImpl,
637+
wire.Bind(new(appStoreDeploymentFullMode.AppStoreDeploymentFullModeService), new(*appStoreDeploymentFullMode.AppStoreDeploymentFullModeServiceImpl)),
638+
appStoreDeploymentGitopsTool.NewAppStoreDeploymentArgoCdServiceImpl,
639+
wire.Bind(new(appStoreDeploymentGitopsTool.AppStoreDeploymentArgoCdService), new(*appStoreDeploymentGitopsTool.AppStoreDeploymentArgoCdServiceImpl)),
638640
)
639641
return &App{}, nil
640642
}

api/appStore/AppStoreDeploymentRestHandler.go

Lines changed: 23 additions & 192 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ import (
2828
"github.com/devtron-labs/devtron/client/argocdServer/application"
2929
"github.com/devtron-labs/devtron/internal/constants"
3030
"github.com/devtron-labs/devtron/internal/util"
31-
appStore "github.com/devtron-labs/devtron/pkg/appStore"
31+
"github.com/devtron-labs/devtron/pkg/appStore"
3232
appStoreBean "github.com/devtron-labs/devtron/pkg/appStore/bean"
33+
appStoreDeployment "github.com/devtron-labs/devtron/pkg/appStore/deployment"
3334
"github.com/devtron-labs/devtron/pkg/cluster"
3435
"github.com/devtron-labs/devtron/pkg/user"
3536
"github.com/devtron-labs/devtron/pkg/user/casbin"
@@ -45,112 +46,45 @@ import (
4546
)
4647

4748
type InstalledAppRestHandler interface {
48-
CreateInstalledApp(w http.ResponseWriter, r *http.Request)
4949
UpdateInstalledApp(w http.ResponseWriter, r *http.Request)
5050
GetAllInstalledApp(w http.ResponseWriter, r *http.Request)
51-
GetInstalledAppsByAppStoreId(w http.ResponseWriter, r *http.Request)
5251
GetInstalledAppVersion(w http.ResponseWriter, r *http.Request)
53-
DeleteInstalledApp(w http.ResponseWriter, r *http.Request)
5452
DeployBulk(w http.ResponseWriter, r *http.Request)
5553
CheckAppExists(w http.ResponseWriter, r *http.Request)
5654
DefaultComponentInstallation(w http.ResponseWriter, r *http.Request)
5755
FetchAppDetailsForInstalledApp(w http.ResponseWriter, r *http.Request)
5856
}
5957

6058
type InstalledAppRestHandlerImpl struct {
61-
Logger *zap.SugaredLogger
62-
userAuthService user.UserService
63-
enforcer casbin.Enforcer
64-
enforcerUtil rbac.EnforcerUtil
65-
installedAppService appStore.InstalledAppService
66-
validator *validator.Validate
67-
clusterService cluster.ClusterService
68-
acdServiceClient application.ServiceClient
59+
Logger *zap.SugaredLogger
60+
userAuthService user.UserService
61+
enforcer casbin.Enforcer
62+
enforcerUtil rbac.EnforcerUtil
63+
installedAppService appStore.InstalledAppService
64+
validator *validator.Validate
65+
clusterService cluster.ClusterService
66+
acdServiceClient application.ServiceClient
67+
appStoreDeploymentService appStoreDeployment.AppStoreDeploymentService
6968
}
7069

7170
func NewInstalledAppRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService user.UserService,
7271
enforcer casbin.Enforcer, enforcerUtil rbac.EnforcerUtil, installedAppService appStore.InstalledAppService,
7372
validator *validator.Validate, clusterService cluster.ClusterService, acdServiceClient application.ServiceClient,
73+
appStoreDeploymentService appStoreDeployment.AppStoreDeploymentService,
7474
) *InstalledAppRestHandlerImpl {
7575
return &InstalledAppRestHandlerImpl{
76-
Logger: Logger,
77-
userAuthService: userAuthService,
78-
enforcer: enforcer,
79-
enforcerUtil: enforcerUtil,
80-
installedAppService: installedAppService,
81-
validator: validator,
82-
clusterService: clusterService,
83-
acdServiceClient: acdServiceClient,
76+
Logger: Logger,
77+
userAuthService: userAuthService,
78+
enforcer: enforcer,
79+
enforcerUtil: enforcerUtil,
80+
installedAppService: installedAppService,
81+
validator: validator,
82+
clusterService: clusterService,
83+
acdServiceClient: acdServiceClient,
84+
appStoreDeploymentService: appStoreDeploymentService,
8485
}
8586
}
8687

87-
func (handler InstalledAppRestHandlerImpl) CreateInstalledApp(w http.ResponseWriter, r *http.Request) {
88-
decoder := json.NewDecoder(r.Body)
89-
userId, err := handler.userAuthService.GetLoggedInUser(r)
90-
if userId == 0 || err != nil {
91-
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
92-
return
93-
}
94-
var request appStoreBean.InstallAppVersionDTO
95-
96-
err = decoder.Decode(&request)
97-
if err != nil {
98-
handler.Logger.Errorw("request err, CreateInstalledApp", "err", err, "payload", request)
99-
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
100-
return
101-
}
102-
err = handler.validator.Struct(request)
103-
if err != nil {
104-
handler.Logger.Errorw("validation err, CreateInstalledApp", "err", err, "payload", request)
105-
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
106-
return
107-
}
108-
token := r.Header.Get("token")
109-
//rbac block starts from here
110-
object := handler.enforcerUtil.GetHelmObjectByAppNameAndEnvId(request.AppName, request.EnvironmentId)
111-
if ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionCreate, object); !ok {
112-
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden)
113-
return
114-
}
115-
//rback block ends here
116-
117-
isChartRepoActive, err := handler.installedAppService.IsChartRepoActive(request.AppStoreVersion)
118-
if err != nil {
119-
handler.Logger.Errorw("service err, CreateInstalledApp", "err", err, "payload", request)
120-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
121-
return
122-
}
123-
if !isChartRepoActive {
124-
common.WriteJsonResp(w, fmt.Errorf("chart repo is disabled"), nil, http.StatusNotAcceptable)
125-
return
126-
}
127-
128-
request.UserId = userId
129-
handler.Logger.Infow("request payload, CreateInstalledApp", "payload", request)
130-
ctx, cancel := context.WithCancel(r.Context())
131-
if cn, ok := w.(http.CloseNotifier); ok {
132-
go func(done <-chan struct{}, closed <-chan bool) {
133-
select {
134-
case <-done:
135-
case <-closed:
136-
cancel()
137-
}
138-
}(ctx.Done(), cn.CloseNotify())
139-
}
140-
ctx = context.WithValue(r.Context(), "token", token)
141-
defer cancel()
142-
res, err := handler.installedAppService.CreateInstalledAppV2(&request, ctx)
143-
if err != nil {
144-
if strings.Contains(err.Error(), "application spec is invalid") {
145-
err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "application spec is invalid, please check provided chart values"}
146-
}
147-
handler.Logger.Errorw("service err, CreateInstalledApp", "err", err, "payload", request)
148-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
149-
return
150-
}
151-
common.WriteJsonResp(w, err, res, http.StatusOK)
152-
}
153-
15488
func (handler InstalledAppRestHandlerImpl) UpdateInstalledApp(w http.ResponseWriter, r *http.Request) {
15589
decoder := json.NewDecoder(r.Body)
15690
userId, err := handler.userAuthService.GetLoggedInUser(r)
@@ -173,7 +107,7 @@ func (handler InstalledAppRestHandlerImpl) UpdateInstalledApp(w http.ResponseWri
173107
}
174108
token := r.Header.Get("token")
175109
handler.Logger.Infow("request payload, UpdateInstalledApp", "payload", request)
176-
installedApp, err := handler.installedAppService.GetInstalledApp(request.InstalledAppId)
110+
installedApp, err := handler.appStoreDeploymentService.GetInstalledApp(request.InstalledAppId)
177111
if err != nil {
178112
handler.Logger.Errorw("service err, UpdateInstalledApp", "err", err, "payload", request)
179113
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
@@ -309,43 +243,6 @@ func (handler InstalledAppRestHandlerImpl) GetAllInstalledApp(w http.ResponseWri
309243
common.WriteJsonResp(w, err, res, http.StatusOK)
310244
}
311245

312-
func (handler InstalledAppRestHandlerImpl) GetInstalledAppsByAppStoreId(w http.ResponseWriter, r *http.Request) {
313-
userId, err := handler.userAuthService.GetLoggedInUser(r)
314-
if userId == 0 || err != nil {
315-
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
316-
return
317-
}
318-
319-
vars := mux.Vars(r)
320-
appStoreId, err := strconv.Atoi(vars["appStoreId"])
321-
if err != nil {
322-
handler.Logger.Errorw("request err, GetInstalledAppsByAppStoreId", "err", err, "appStoreId", appStoreId)
323-
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
324-
return
325-
}
326-
token := r.Header.Get("token")
327-
handler.Logger.Infow("request payload, GetInstalledAppsByAppStoreId", "appStoreId", appStoreId)
328-
res, err := handler.installedAppService.GetAllInstalledAppsByAppStoreId(w, r, token, appStoreId)
329-
if err != nil {
330-
handler.Logger.Errorw("service err, GetInstalledAppsByAppStoreId", "err", err, "appStoreId", appStoreId)
331-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
332-
return
333-
}
334-
335-
var installedAppsResponse []appStoreBean.InstalledAppsResponse
336-
for _, app := range res {
337-
//rbac block starts from here
338-
object := handler.enforcerUtil.GetHelmObjectByAppNameAndEnvId(app.AppName, app.EnvironmentId)
339-
if ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionGet, object); !ok {
340-
continue
341-
}
342-
//rback block ends here
343-
installedAppsResponse = append(installedAppsResponse, app)
344-
}
345-
346-
common.WriteJsonResp(w, err, installedAppsResponse, http.StatusOK)
347-
}
348-
349246
func (handler InstalledAppRestHandlerImpl) GetInstalledAppVersion(w http.ResponseWriter, r *http.Request) {
350247
userId, err := handler.userAuthService.GetLoggedInUser(r)
351248
if userId == 0 || err != nil {
@@ -379,72 +276,6 @@ func (handler InstalledAppRestHandlerImpl) GetInstalledAppVersion(w http.Respons
379276
common.WriteJsonResp(w, err, dto, http.StatusOK)
380277
}
381278

382-
func (handler InstalledAppRestHandlerImpl) DeleteInstalledApp(w http.ResponseWriter, r *http.Request) {
383-
userId, err := handler.userAuthService.GetLoggedInUser(r)
384-
if userId == 0 || err != nil {
385-
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
386-
return
387-
}
388-
vars := mux.Vars(r)
389-
installAppId, err := strconv.Atoi(vars["id"])
390-
if err != nil {
391-
handler.Logger.Errorw("request err, DeleteInstalledApp", "err", err, "installAppId", installAppId)
392-
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
393-
return
394-
}
395-
396-
v := r.URL.Query()
397-
forceDelete := false
398-
force := v.Get("force")
399-
if len(force) > 0 {
400-
forceDelete, err = strconv.ParseBool(force)
401-
if err != nil {
402-
handler.Logger.Errorw("request err, DeleteInstalledApp", "err", err, "installAppId", installAppId)
403-
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
404-
return
405-
}
406-
}
407-
handler.Logger.Infow("request payload, DeleteInstalledApp", "installAppId", installAppId)
408-
token := r.Header.Get("token")
409-
//rbac block starts from here
410-
installedApp, err := handler.installedAppService.GetInstalledApp(installAppId)
411-
if err != nil {
412-
handler.Logger.Error(err)
413-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
414-
return
415-
}
416-
object := handler.enforcerUtil.GetHelmObjectByAppNameAndEnvId(installedApp.AppName, installedApp.EnvironmentId)
417-
if ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionDelete, object); !ok {
418-
common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden)
419-
return
420-
}
421-
//rback block ends here
422-
request := appStoreBean.InstallAppVersionDTO{}
423-
request.InstalledAppId = installAppId
424-
request.AppId = installedApp.AppId
425-
request.EnvironmentId = installedApp.EnvironmentId
426-
request.UserId = userId
427-
request.ForceDelete = forceDelete
428-
ctx, cancel := context.WithCancel(r.Context())
429-
if cn, ok := w.(http.CloseNotifier); ok {
430-
go func(done <-chan struct{}, closed <-chan bool) {
431-
select {
432-
case <-done:
433-
case <-closed:
434-
cancel()
435-
}
436-
}(ctx.Done(), cn.CloseNotify())
437-
}
438-
ctx = context.WithValue(r.Context(), "token", token)
439-
res, err := handler.installedAppService.DeleteInstalledApp(ctx, &request)
440-
if err != nil {
441-
handler.Logger.Errorw("service err, DeleteInstalledApp", "err", err, "installAppId", installAppId)
442-
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
443-
return
444-
}
445-
common.WriteJsonResp(w, err, res, http.StatusOK)
446-
}
447-
448279
func (handler *InstalledAppRestHandlerImpl) DeployBulk(w http.ResponseWriter, r *http.Request) {
449280
userId, err := handler.userAuthService.GetLoggedInUser(r)
450281
if userId == 0 || err != nil {
@@ -477,7 +308,7 @@ func (handler *InstalledAppRestHandlerImpl) DeployBulk(w http.ResponseWriter, r
477308
//RBAC block ends here
478309

479310
for _, item := range request.ChartGroupInstallChartRequest {
480-
isChartRepoActive, err := handler.installedAppService.IsChartRepoActive(item.AppStoreVersion)
311+
isChartRepoActive, err := handler.appStoreDeploymentService.IsChartRepoActive(item.AppStoreVersion)
481312
if err != nil {
482313
handler.Logger.Errorw("service err, CreateInstalledApp", "err", err, "payload", request)
483314
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)

0 commit comments

Comments
 (0)