Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

misc: Release candidate v0.19.0 #5930

Merged
merged 65 commits into from
Oct 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
ffbee8d
added config sql script (#5681)
ayu-devtron Aug 13, 2024
cbace84
Merge branch 'main' into develop
vikramdevtron Aug 13, 2024
92aeea3
Merge branch 'main' into develop
vikramdevtron Aug 14, 2024
3967bbc
feat: CVE severity categorisation and scan result listing API enhance…
gireesh-naidu Aug 21, 2024
5661d5c
feat: casbin deny policy sql scripts (#5677)
Shivam-nagar23 Aug 21, 2024
af3133d
feat: Config diff phase 2 oss (#5488)
prakash100198 Aug 21, 2024
f1aa1fc
fix: Helm apps entries in Ea mode (#5652)
RajeevRanjan27 Aug 21, 2024
6820ffe
feat: refactoring deployment app name usage (#5702)
iamayushm Aug 23, 2024
095d81c
migration syn with ent (#5719)
prkhrkat Aug 23, 2024
ea4974b
fix: group image vulnerabilities by base/os image (#5680)
gireesh-naidu Aug 23, 2024
7f5db23
fix: remove sql script (#5727)
gireesh-naidu Aug 23, 2024
17747c2
Revert "fix: Helm apps entries in Ea mode (#5652)" (#5733)
RajeevRanjan27 Aug 23, 2024
6738628
chore: custom argo-workflow dependency (#5731)
Ash-exp Aug 23, 2024
7048c68
chore: fix go.sum file (#5734)
Ash-exp Aug 23, 2024
0c56885
misc: Main sync develop (#5737)
vikramdevtron Aug 23, 2024
ed70d3e
chore: sql scripts sync (#5763)
gireesh-naidu Aug 29, 2024
29d96a8
fix: Scan tool migration fix develop (#5773)
kripanshdevtron Aug 30, 2024
af5f36d
chore: Oss sync 2 sept 2024 oss (#5779)
prakash100198 Sep 2, 2024
dc67204
chore: plugin creation oss (#5780)
prakash100198 Sep 2, 2024
1f66fdd
fix: Sql injection fix develop (#5785)
kripanshdevtron Sep 2, 2024
63197e9
feat: add support for tag name for external CI (#5689)
ayu-devtron Sep 3, 2024
214bd62
argo-assets moved out (#5788)
prkhrkat Sep 3, 2024
813c3d7
query param split (#5801) (#5803)
Shivam-nagar23 Sep 4, 2024
d4e599e
feat: acr polling plugin support (#5724)
Ash-exp Sep 5, 2024
c022e5f
fix: build failed due to argo assets (#5805)
Ash-exp Sep 5, 2024
c0dc007
handled the release not found case for app detail of external app (#5…
RajeevRanjan27 Sep 9, 2024
61bf950
chore: Main develop sync bd5118 (#5817)
kartik-579 Sep 9, 2024
d38a408
feat: Argo listing change (#5768)
kartik-579 Sep 9, 2024
5727221
feat: Feature release v7 sql scripts (#5757)
Shivam-nagar23 Sep 9, 2024
3ad88d5
fix: sync with common-lib changes (#5820)
systemsdt Sep 9, 2024
f121111
feat: Custom tag for copy container image plugin (#5760)
iamayushm Sep 10, 2024
413e216
adding pco id in app details query (#5826)
iamayushm Sep 10, 2024
4b70ff4
fix: reverse proxy panic noises (#5833)
Ash-exp Sep 12, 2024
16f2443
feat: release v8 (Release Creation RBAC Scripts) (#5821)
Shivam-nagar23 Sep 12, 2024
b7b1de9
get with deduplicate (#5838)
prkhrkat Sep 13, 2024
3cf1c86
chore: Main sync 13 sept 2024 (#5843)
prakash100198 Sep 13, 2024
afd7845
chore: inject ci-runner pod UID and name as env variable (#5839)
gireesh-naidu Sep 16, 2024
12686c7
feat: add cluster filter in notification setting (#5828)
gireesh-naidu Sep 17, 2024
1265542
fix: ignore kubelink errors in server startup (#5852)
gireesh-naidu Sep 17, 2024
3fa1069
chore: Main sync (#5862)
kartik-579 Sep 18, 2024
85710ec
feat: added deployment failed message in deployment history (#5845)
Ash-exp Sep 18, 2024
6d10fff
wip (#5865)
iamayushm Sep 19, 2024
de0c426
script numebr change (#5878)
Shivam-nagar23 Sep 23, 2024
246c8cf
chore: Dependabot fixes 17sept (#5853)
prakash100198 Sep 23, 2024
9746089
feat: ns label refactoring (#5882)
iamayushm Sep 23, 2024
d02ffa8
feat: added the host url in the pre post ci cd steps (#5864)
RajeevRanjan27 Sep 23, 2024
fce48ae
fix: Image broken in default slack notification template (#5829)
SATYAsasini Sep 24, 2024
23b63fa
fix: create gitops configuration issue (#5883) (#5891)
Ash-exp Sep 24, 2024
9ff059f
image in imagescanresp in executionDetail api (#5894)
prakash100198 Sep 24, 2024
508a70b
chore: OSS main branch sync
Ash-exp Sep 24, 2024
02269f1
Merge remote-tracking branch 'origin/main' into oss-main-sync-24-sep
Ash-exp Sep 24, 2024
9eabc12
Merge pull request #5895 from devtron-labs/oss-main-sync-24-sep
Ash-exp Sep 24, 2024
a35790a
removing image field (#5909)
iamayushm Sep 25, 2024
0ef2a59
fix: Packet testing fixes (#5916)
iamayushm Sep 27, 2024
826b5d7
get with deduplicate (#5921)
prkhrkat Sep 27, 2024
0a44f00
fix: nil ptr fix in copying extraEnvVars (#5920)
gireesh-naidu Sep 27, 2024
de19970
docker file and make file build changes (#5922)
vikramdevtron Sep 27, 2024
c869fce
fix: user flows permissions fix (#5917)
Shivam-nagar23 Sep 27, 2024
a995a2b
Revert "fix: user flows permissions fix (#5917)" (#5923)
Shivam-nagar23 Sep 28, 2024
b0731dc
fix: update User Rbac Fixes (#5929)
Shivam-nagar23 Oct 1, 2024
c84e8dd
fix: sync with common-lib changes (#5946)
systemsdt Oct 3, 2024
ea4254c
updated migration numbers (#5951)
akshatsinha007 Oct 3, 2024
ac22eb6
misc: Main sync rc19 (#5953)
vikramdevtron Oct 3, 2024
4fa3e1a
conflict resolve
vikramdevtron Oct 3, 2024
e798cdb
Merge pull request #5955 from devtron-labs/main-sync-release-candidat…
vikramdevtron Oct 3, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
RUN go install github.com/google/wire/cmd/wire@latest
WORKDIR /go/src/github.com/devtron-labs/devtron
ADD . /go/src/github.com/devtron-labs/devtron/
ADD ./vendor/github.com/Microsoft/ /go/src/github.com/devtron-labs/devtron/vendor/github.com/microsoft/

Check notice

Code scanning / SonarCloud

Prefer COPY over ADD for copying local resources Low

Replace this ADD instruction with a COPY instruction. See more on SonarCloud
RUN GOOS=linux make build-all

# uncomment this post build arg
Expand Down
1 change: 1 addition & 0 deletions DockerfileEA
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ RUN apt install git gcc musl-dev make -y
RUN go install github.com/google/wire/cmd/wire@latest
WORKDIR /go/src/github.com/devtron-labs/devtron
ADD . /go/src/github.com/devtron-labs/devtron/
ADD ./vendor/github.com/Microsoft/ /go/src/github.com/devtron-labs/devtron/vendor/github.com/microsoft/
RUN GOOS=linux make build-all

FROM ubuntu:22.04@sha256:1b8d8ff4777f36f19bfe73ee4df61e3a0b789caeff29caa019539ec7c9a57f95 as devtron-ea
Expand Down
5 changes: 2 additions & 3 deletions api/appStore/deployment/CommonDeploymentRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,7 @@ func (handler *CommonDeploymentRestHandlerImpl) getAppOfferingMode(installedAppI
err = &util.ApiError{HttpStatusCode: http.StatusBadRequest, UserMessage: "invalid app id"}
return appOfferingMode, installedAppDto, err
}
uniqueAppName := appIdentifier.GetUniqueAppNameIdentifier()
installedAppDto, err = handler.installedAppService.GetInstalledAppByClusterNamespaceAndName(appIdentifier.ClusterId, appIdentifier.Namespace, uniqueAppName)
installedAppDto, err = handler.installedAppService.GetInstalledAppByClusterNamespaceAndName(appIdentifier)
if err != nil {
err = &util.ApiError{HttpStatusCode: http.StatusBadRequest, UserMessage: "unable to find app in database"}
return appOfferingMode, installedAppDto, err
Expand Down Expand Up @@ -171,7 +170,7 @@ func (handler *CommonDeploymentRestHandlerImpl) GetDeploymentHistory(w http.Resp
}
//rbac block ends here

ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
ctx, cancel := context.WithTimeout(r.Context(), 30*time.Second)
defer cancel()
res, err := handler.appStoreDeploymentService.GetDeploymentHistory(ctx, installedAppDto)
if err != nil {
Expand Down
107 changes: 60 additions & 47 deletions api/auth/user/UserRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ func (handler UserRestHandlerImpl) CreateUser(w http.ResponseWriter, r *http.Req
//RBAC enforcer Ends
//In create req, we also check if any email exists already. If yes, then in that case we go on and merge existing roles and groups with the ones in request
//but rbac is only checked on create request roles and groups as existing roles and groups are assumed to be checked when created/updated before
res, err := handler.userService.CreateUser(&userInfo)
res, err := handler.userService.CreateUser(&userInfo, token, handler.CheckManagerAuth)
if err != nil {
handler.logger.Errorw("service err, CreateUser", "err", err, "payload", userInfo)
if _, ok := err.(*util.ApiError); ok {
Expand Down Expand Up @@ -192,7 +192,7 @@ func (handler UserRestHandlerImpl) UpdateUser(w http.ResponseWriter, r *http.Req
return
}

res, err := handler.userService.UpdateUser(&userInfo, token, handler.checkRBACForUserUpdate)
res, err := handler.userService.UpdateUser(&userInfo, token, handler.checkRBACForUserUpdate, handler.CheckManagerAuth)
if err != nil {
handler.logger.Errorw("service err, UpdateUser", "err", err, "payload", userInfo)
common.WriteJsonResp(w, err, "", http.StatusInternalServerError)
Expand Down Expand Up @@ -243,18 +243,9 @@ func (handler UserRestHandlerImpl) GetById(w http.ResponseWriter, r *http.Reques
// RBAC enforcer applying
filteredRoleFilter := make([]bean.RoleFilter, 0)
if res.RoleFilters != nil && len(res.RoleFilters) > 0 {
isUserSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*")
for _, filter := range res.RoleFilters {
authPass := true
if len(filter.Team) > 0 {
if ok := handler.enforcer.Enforce(token, casbin.ResourceUser, casbin.ActionGet, filter.Team); !ok {
authPass = false
}
}
if filter.Entity == bean.CLUSTER_ENTITIY {
if ok := handler.userCommonService.CheckRbacForClusterEntity(filter.Cluster, filter.Namespace, filter.Group, filter.Kind, filter.Resource, token, handler.CheckManagerAuth); !ok {
authPass = false
}
}
authPass := handler.checkRbacForFilter(token, filter, isUserSuperAdmin)
if authPass {
filteredRoleFilter = append(filteredRoleFilter, filter)
}
Expand Down Expand Up @@ -316,7 +307,7 @@ func (handler UserRestHandlerImpl) GetAllV2(w http.ResponseWriter, r *http.Reque
break
}
}
if filter.Entity == bean.CLUSTER_ENTITIY {
if filter.Entity == bean2.CLUSTER_ENTITIY {
if ok := handler.userCommonService.CheckRbacForClusterEntity(filter.Cluster, filter.Namespace, filter.Group, filter.Kind, filter.Resource, token, handler.CheckManagerAuth); ok {
isAuthorised = true
break
Expand Down Expand Up @@ -387,7 +378,7 @@ func (handler UserRestHandlerImpl) GetAll(w http.ResponseWriter, r *http.Request
break
}
}
if filter.Entity == bean.CLUSTER_ENTITIY {
if filter.Entity == bean2.CLUSTER_ENTITIY {
if ok := handler.userCommonService.CheckRbacForClusterEntity(filter.Cluster, filter.Namespace, filter.Group, filter.Kind, filter.Resource, token, handler.CheckManagerAuth); ok {
isAuthorised = true
break
Expand Down Expand Up @@ -464,7 +455,7 @@ func (handler UserRestHandlerImpl) DeleteUser(w http.ResponseWriter, r *http.Req
}
if user.RoleFilters != nil && len(user.RoleFilters) > 0 {
for _, filter := range user.RoleFilters {
if filter.AccessType == bean.APP_ACCESS_TYPE_HELM && !isActionUserSuperAdmin {
if filter.AccessType == bean2.APP_ACCESS_TYPE_HELM && !isActionUserSuperAdmin {
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}
Expand All @@ -474,7 +465,7 @@ func (handler UserRestHandlerImpl) DeleteUser(w http.ResponseWriter, r *http.Req
return
}
}
if filter.Entity == bean.CLUSTER_ENTITIY {
if filter.Entity == bean2.CLUSTER_ENTITIY {
if ok := handler.userCommonService.CheckRbacForClusterEntity(filter.Cluster, filter.Namespace, filter.Group, filter.Kind, filter.Resource, token, handler.CheckManagerAuth); !ok {
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
Expand Down Expand Up @@ -578,18 +569,9 @@ func (handler UserRestHandlerImpl) FetchRoleGroupById(w http.ResponseWriter, r *
token := r.Header.Get("token")
filteredRoleFilter := make([]bean.RoleFilter, 0)
if res.RoleFilters != nil && len(res.RoleFilters) > 0 {
isUserSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*")
for _, filter := range res.RoleFilters {
authPass := true
if len(filter.Team) > 0 {
if ok := handler.enforcer.Enforce(token, casbin.ResourceUser, casbin.ActionGet, filter.Team); !ok {
authPass = false
}
}
if filter.Entity == bean.CLUSTER_ENTITIY {
if isValidAuth := handler.userCommonService.CheckRbacForClusterEntity(filter.Cluster, filter.Namespace, filter.Group, filter.Kind, filter.Resource, token, handler.CheckManagerAuth); !isValidAuth {
authPass = false
}
}
authPass := handler.checkRbacForFilter(token, filter, isUserSuperAdmin)
if authPass {
filteredRoleFilter = append(filteredRoleFilter, filter)
}
Expand All @@ -610,6 +592,35 @@ func (handler UserRestHandlerImpl) FetchRoleGroupById(w http.ResponseWriter, r *
common.WriteJsonResp(w, err, res, http.StatusOK)
}

func (handler UserRestHandlerImpl) checkRbacForFilter(token string, filter bean.RoleFilter, isUserSuperAdmin bool) bool {
isAuthorised := true
switch {
case isUserSuperAdmin:
isAuthorised = true
case filter.AccessType == bean2.APP_ACCESS_TYPE_HELM || filter.Entity == bean2.EntityJobs:
if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok {
isAuthorised = false
}

case len(filter.Team) > 0:
// this is case of devtron app
if ok := handler.enforcer.Enforce(token, casbin.ResourceUser, casbin.ActionGet, filter.Team); !ok {
isAuthorised = false
}

case filter.Entity == bean.CLUSTER_ENTITIY:
isValidAuth := handler.userCommonService.CheckRbacForClusterEntity(filter.Cluster, filter.Namespace, filter.Group, filter.Kind, filter.Resource, token, handler.CheckManagerAuth)
if !isValidAuth {
isAuthorised = false
}
case filter.Entity == bean.CHART_GROUP_ENTITY:
isAuthorised = true
default:
isAuthorised = false
}
return isAuthorised
}

func (handler UserRestHandlerImpl) CreateRoleGroup(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
userId, err := handler.userService.GetLoggedInUser(r)
Expand Down Expand Up @@ -698,7 +709,7 @@ func (handler UserRestHandlerImpl) UpdateRoleGroup(w http.ResponseWriter, r *htt
return
}

res, err := handler.roleGroupService.UpdateRoleGroup(&request, token, handler.checkRBACForRoleGroupUpdate)
res, err := handler.roleGroupService.UpdateRoleGroup(&request, token, handler.checkRBACForRoleGroupUpdate, handler.CheckManagerAuth)
if err != nil {
handler.logger.Errorw("service err, UpdateRoleGroup", "err", err, "payload", request)
common.WriteJsonResp(w, err, "", http.StatusInternalServerError)
Expand Down Expand Up @@ -749,7 +760,7 @@ func (handler UserRestHandlerImpl) FetchRoleGroupsV2(w http.ResponseWriter, r *h
break
}
}
if filter.Entity == bean.CLUSTER_ENTITIY {
if filter.Entity == bean2.CLUSTER_ENTITIY {
if isValidAuth := handler.userCommonService.CheckRbacForClusterEntity(filter.Cluster, filter.Namespace, filter.Group, filter.Kind, filter.Resource, token, handler.CheckManagerAuth); isValidAuth {
isAuthorised = true
break
Expand Down Expand Up @@ -820,7 +831,7 @@ func (handler UserRestHandlerImpl) FetchRoleGroups(w http.ResponseWriter, r *htt
break
}
}
if filter.Entity == bean.CLUSTER_ENTITIY {
if filter.Entity == bean2.CLUSTER_ENTITIY {
if isValidAuth := handler.userCommonService.CheckRbacForClusterEntity(filter.Cluster, filter.Namespace, filter.Group, filter.Kind, filter.Resource, token, handler.CheckManagerAuth); isValidAuth {
isAuthorised = true
break
Expand Down Expand Up @@ -908,7 +919,7 @@ func (handler UserRestHandlerImpl) DeleteRoleGroup(w http.ResponseWriter, r *htt
return
}
token := r.Header.Get("token")
isAuthorised, err := handler.checkRBACForRoleGroupDelete(token, userGroup.RoleFilters)
isAuthorised, err := handler.checkRBACForRoleGroupDelete(token, userGroup)
if err != nil {
common.WriteJsonResp(w, err, "", http.StatusInternalServerError)
return
Expand Down Expand Up @@ -1038,7 +1049,7 @@ func (handler UserRestHandlerImpl) SyncOrchestratorToCasbin(w http.ResponseWrite
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
userEmailId, err := handler.userService.GetEmailById(userId)
userEmailId, err := handler.userService.GetActiveEmailById(userId)
if err != nil {
handler.logger.Errorw("service err, SyncOrchestratorToCasbin", "err", err, "userId", userId)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
Expand Down Expand Up @@ -1138,7 +1149,7 @@ func (handler UserRestHandlerImpl) checkRBACForUserCreate(token string, requestS
isAuthorised = false
}
if !isAuthorised {
break
return false, nil
}
}
}
Expand Down Expand Up @@ -1167,7 +1178,7 @@ func (handler UserRestHandlerImpl) checkRBACForUserCreate(token string, requestS
isAuthorised = false
}
if !isAuthorised {
break
return false, nil
}
}
} else {
Expand Down Expand Up @@ -1206,7 +1217,7 @@ func (handler UserRestHandlerImpl) checkRBACForUserUpdate(token string, userInfo
isAuthorised = false
}
if !isAuthorised {
break
return false, nil
}
}
}
Expand All @@ -1225,7 +1236,7 @@ func (handler UserRestHandlerImpl) checkRBACForUserUpdate(token string, userInfo
isAuthorised = false
}
if !isAuthorised {
break
return false, nil
}
}
}
Expand All @@ -1252,7 +1263,7 @@ func (handler UserRestHandlerImpl) checkRBACForUserUpdate(token string, userInfo
isAuthorised = false
}
if !isAuthorised {
break
return false, nil
}
}
} else {
Expand All @@ -1263,11 +1274,10 @@ func (handler UserRestHandlerImpl) checkRBACForUserUpdate(token string, userInfo
return isAuthorised, nil
}

func (handler UserRestHandlerImpl) checkRBACForRoleGroupUpdate(token string, groupInfo *bean.RoleGroup,
eliminatedRoleFilters []*repository.RoleModel) (isAuthorised bool, err error) {
func (handler UserRestHandlerImpl) checkRBACForRoleGroupUpdate(token string, groupInfo *bean.RoleGroup, eliminatedRoleFilters []*repository.RoleModel, isRoleGroupAlreadySuperAdmin bool) (isAuthorised bool, err error) {
isActionUserSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*")
requestSuperAdmin := groupInfo.SuperAdmin
if requestSuperAdmin && !isActionUserSuperAdmin {
if (requestSuperAdmin || isRoleGroupAlreadySuperAdmin) && !isActionUserSuperAdmin {
//if user is going to be provided with super-admin access or already a super-admin then the action user should be a super-admin
return false, nil
}
Expand All @@ -1290,7 +1300,7 @@ func (handler UserRestHandlerImpl) checkRBACForRoleGroupUpdate(token string, gro
isAuthorised = false
}
if !isAuthorised {
break
return false, nil
}
}
}
Expand All @@ -1309,20 +1319,23 @@ func (handler UserRestHandlerImpl) checkRBACForRoleGroupUpdate(token string, gro
isAuthorised = false
}
if !isAuthorised {
break
return false, nil
}
}
}
}
return isAuthorised, nil
}

func (handler UserRestHandlerImpl) checkRBACForRoleGroupDelete(token string, groupRoles []bean.RoleFilter) (isAuthorised bool, err error) {
func (handler UserRestHandlerImpl) checkRBACForRoleGroupDelete(token string, userGroup *bean.RoleGroup) (isAuthorised bool, err error) {
isActionUserSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*")
if userGroup.SuperAdmin && !isActionUserSuperAdmin {
return false, nil
}
isAuthorised = isActionUserSuperAdmin
if !isAuthorised {
if groupRoles != nil && len(groupRoles) > 0 { //auth check inside roleFilters
for _, filter := range groupRoles {
if userGroup.RoleFilters != nil && len(userGroup.RoleFilters) > 0 { //auth check inside roleFilters
for _, filter := range userGroup.RoleFilters {
switch {
case filter.Action == bean.ACTION_SUPERADMIN:
isAuthorised = isActionUserSuperAdmin
Expand All @@ -1338,7 +1351,7 @@ func (handler UserRestHandlerImpl) checkRBACForRoleGroupDelete(token string, gro
isAuthorised = false
}
if !isAuthorised {
break
return false, nil
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion api/helm-app/HelmAppRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ func (handler *HelmAppRestHandlerImpl) GetApplicationDetail(w http.ResponseWrite
return
}

installedApp, err := handler.installedAppService.GetInstalledAppByClusterNamespaceAndName(appIdentifier.ClusterId, appIdentifier.Namespace, appIdentifier.ReleaseName)
installedApp, err := handler.installedAppService.GetInstalledAppByClusterNamespaceAndName(appIdentifier)
if err != nil {
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
Expand Down
Loading
Loading