Repository: devtron-labs/devtron
Pull request #3510 (2023-06-13 13:44:34)

release: PR for v0.6.18-rc.2
Updates in hyperion micro-service and charts

sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3510)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3510) No Coverage information  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3510&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3510&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3510)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3510) No Coverage information  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3510&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3510&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!&nbsp; &nbsp; [![Quality Gate passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3510)

[![Bug](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug-16px.png 'Bug')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=BUG) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=BUG)  
[![Vulnerability](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability-16px.png 'Vulnerability')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=VULNERABILITY) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot-16px.png 'Security Hotspot')](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=SECURITY_HOTSPOT) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=SECURITY_HOTSPOT)  
[![Code Smell](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell-16px.png 'Code Smell')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=CODE_SMELL) [![A](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A-16px.png 'A')](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3510&resolved=false&types=CODE_SMELL)

[![No Coverage information](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3510) No Coverage information  
[![0.0%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3-16px.png '0.0%')](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3510&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3510&metric=new_duplicated_lines_density&view=list)



Patch:
diff --git a/api/appStore/AppStoreRouter.go b/api/appStore/AppStoreRouter.go
index 8e90b64d7..75a65324e 100644
--- a/api/appStore/AppStoreRouter.go
+++ b/api/appStore/AppStoreRouter.go
@@ -76,6 +76,9 @@ func (router AppStoreRouterImpl) Init(configRouter *mux.Router) {
 	configRouter.Path("/installed-app/detail").Queries("installed-app-id", "{installed-app-id}").Queries("env-id", "{env-id}").
 		HandlerFunc(router.deployRestHandler.FetchAppDetailsForInstalledApp).
 		Methods("GET")
+	configRouter.Path("/installed-app/delete/{installedAppId}/non-cascade").
+		HandlerFunc(router.deployRestHandler.DeleteArgoInstalledAppWithNonCascade).
+		Methods("DELETE")
 	configRouter.Path("/installed-app/detail/v2").Queries("installed-app-id", "{installed-app-id}").Queries("env-id", "{env-id}").
 		HandlerFunc(router.deployRestHandler.FetchAppDetailsForInstalledAppV2).
 		Methods("GET")
diff --git a/api/appStore/InstalledAppRestHandler.go b/api/appStore/InstalledAppRestHandler.go
index bc63ff279..c54009284 100644
--- a/api/appStore/InstalledAppRestHandler.go
+++ b/api/appStore/InstalledAppRestHandler.go
@@ -18,6 +18,7 @@
 package appStore
 
 import (
+	"context"
 	"encoding/json"
 	"errors"
 	"fmt"
@@ -36,6 +37,7 @@ import (
 	"github.com/devtron-labs/devtron/pkg/cluster"
 	"github.com/devtron-labs/devtron/pkg/user"
 	"github.com/devtron-labs/devtron/pkg/user/casbin"
+	"github.com/devtron-labs/devtron/util"
 	"github.com/devtron-labs/devtron/util/argo"
 	"github.com/devtron-labs/devtron/util/rbac"
 	"github.com/devtron-labs/devtron/util/response"
@@ -55,6 +57,7 @@ type InstalledAppRestHandler interface {
 	CheckAppExists(w http.ResponseWriter, r *http.Request)
 	DefaultComponentInstallation(w http.ResponseWriter, r *http.Request)
 	FetchAppDetailsForInstalledApp(w http.ResponseWriter, r *http.Request)
+	DeleteArgoInstalledAppWithNonCascade(w http.ResponseWriter, r *http.Request)
 	FetchAppDetailsForInstalledAppV2(w http.ResponseWriter, r *http.Request)
 	FetchResourceTree(w http.ResponseWriter, r *http.Request)
 	FetchResourceTreeForACDApp(w http.ResponseWriter, r *http.Request)
@@ -66,6 +69,7 @@ type InstalledAppRestHandlerImpl struct {
 	userAuthService                  user.UserService
 	enforcer                         casbin.Enforcer
 	enforcerUtil                     rbac.EnforcerUtil
+	enforcerUtilHelm                 rbac.EnforcerUtilHelm
 	installedAppService              service.InstalledAppService
 	validator                        *validator.Validate
 	clusterService                   cluster.ClusterService
@@ -79,7 +83,7 @@ type InstalledAppRestHandlerImpl struct {
 }
 
 func NewInstalledAppRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService user.UserService,
-	enforcer casbin.Enforcer, enforcerUtil rbac.EnforcerUtil, installedAppService service.InstalledAppService,
+	enforcer casbin.Enforcer, enforcerUtil rbac.EnforcerUtil, enforcerUtilHelm rbac.EnforcerUtilHelm, installedAppService service.InstalledAppService,
 	validator *validator.Validate, clusterService cluster.ClusterService, acdServiceClient application.ServiceClient,
 	appStoreDeploymentService service.AppStoreDeploymentService, helmAppClient client.HelmAppClient, helmAppService client.HelmAppService,
 	argoUserService argo.ArgoUserService,
@@ -91,6 +95,7 @@ func NewInstalledAppRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService u
 		userAuthService:                  userAuthService,
 		enforcer:                         enforcer,
 		enforcerUtil:                     enforcerUtil,
+		enforcerUtilHelm:                 enforcerUtilHelm,
 		installedAppService:              installedAppService,
 		validator:                        validator,
 		clusterService:                   clusterService,
@@ -429,6 +434,82 @@ func (handler *InstalledAppRestHandlerImpl) FetchNotesForArgoInstalledApp(w http
 	common.WriteJsonResp(w, err, &bean2.Notes{Notes: notes}, http.StatusOK)
 
 }
+
+func (handler *InstalledAppRestHandlerImpl) DeleteArgoInstalledAppWithNonCascade(w http.ResponseWriter, r *http.Request) {
+	token := r.Header.Get("token")
+	userId, err := handler.userAuthService.GetLoggedInUser(r)
+	if userId == 0 || err != nil {
+		common.WriteJsonResp(w, err, nil, http.StatusUnauthorized)
+		return
+	}
+	vars := mux.Vars(r)
+	installedAppId, err := strconv.Atoi(vars["installedAppId"])
+	if err != nil {
+		handler.Logger.Errorw("request err, DeleteArgoInstalledAppWithNonCascade", "err", err, "installedAppId", installedAppId)
+		common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+		return
+	}
+	handler.Logger.Infow("request payload, delete app", "appId", installedAppId)
+	v := r.URL.Query()
+	forceDelete := false
+	force := v.Get("force")
+	if len(force) > 0 {
+		forceDelete, err = strconv.ParseBool(force)
+		if err != nil {
+			handler.Logger.Errorw("request err, NonCascadeDeleteCdPipeline", "err", err)
+			common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+			return
+		}
+	}
+	installedApp, err := handler.appStoreDeploymentService.GetInstalledApp(installedAppId)
+	if err != nil {
+		handler.Logger.Error("request err, NonCascadeDeleteCdPipeline", "err", err)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	if util.IsBaseStack() || util.IsHelmApp(installedApp.AppOfferingMode) || util2.IsHelmApp(installedApp.DeploymentAppType) {
+		handler.Logger.Errorw("request err, NonCascadeDeleteCdPipeline", "err", fmt.Errorf("nocascade delete is not supported for %s", installedApp.AppName))
+		common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+		return
+	}
+	//rbac block starts from here
+	rbacObject, rbacObject2 := handler.enforcerUtil.GetHelmObjectByAppNameAndEnvId(installedApp.AppName, installedApp.EnvironmentId)
+	ok := handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionDelete, rbacObject) || handler.enforcer.Enforce(token, casbin.ResourceHelmApp, casbin.ActionDelete, rbacObject2)
+	if !ok {
+		common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden)
+		return
+	}
+	//rback block ends here
+	acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken()
+	if err != nil {
+		handler.Logger.Errorw("error in getting acd token", "err", err)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	ctx := context.WithValue(r.Context(), "token", acdToken)
+	request := &appStoreBean.InstallAppVersionDTO{}
+	request.InstalledAppId = installedAppId
+	request.AppName = installedApp.AppName
+	request.AppId = installedApp.AppId
+	request.EnvironmentId = installedApp.EnvironmentId
+	request.UserId = userId
+	request.ForceDelete = forceDelete
+	request.NonCascadeDelete = true
+	request.AppOfferingMode = installedApp.AppOfferingMode
+	request.ClusterId = installedApp.ClusterId
+	request.Namespace = installedApp.Namespace
+	request.AcdPartialDelete = true
+
+	request, err = handler.appStoreDeploymentService.DeleteInstalledApp(ctx, request)
+	if err != nil {
+		handler.Logger.Errorw("service err, DeleteInstalledApp", "err", err, "installAppId", installedAppId)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	common.WriteJsonResp(w, nil, nil, http.StatusOK)
+
+}
+
 func (handler *InstalledAppRestHandlerImpl) checkNotesAuth(token string, appName string, envId int) bool {
 
 	object, object2 := handler.enforcerUtil.GetHelmObjectByAppNameAndEnvId(appName, envId)
diff --git a/api/appStore/deployment/AppStoreDeploymentRestHandler.go b/api/appStore/deployment/AppStoreDeploymentRestHandler.go
index 68e9840f8..0aca96129 100644
--- a/api/appStore/deployment/AppStoreDeploymentRestHandler.go
+++ b/api/appStore/deployment/AppStoreDeploymentRestHandler.go
@@ -256,12 +256,25 @@ func (handler AppStoreDeploymentRestHandlerImpl) DeleteInstalledApp(w http.Respo
 	v := r.URL.Query()
 	forceDelete := false
 	force := v.Get("force")
+	cascadeDelete := true
+	cascade := v.Get("cascade")
+	if len(force) > 0 && len(cascade) > 0 {
+		handler.Logger.Errorw("request err, PatchCdPipeline", "err", fmt.Errorf("cannot perform both cascade and force delete"), "installAppId", installAppId)
+		common.WriteJsonResp(w, fmt.Errorf("invalid query params! cannot perform both force and cascade together"), nil, http.StatusBadRequest)
+		return
+	}
 	if len(force) > 0 {
 		forceDelete, err = strconv.ParseBool(force)
 		if err != nil {
 			common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
 			return
 		}
+	} else if len(cascade) > 0 {
+		cascadeDelete, err = strconv.ParseBool(cascade)
+		if err != nil {
+			common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+			return
+		}
 	}
 	partialDelete := false
 	partialDeleteStr := v.Get("partialDelete")
@@ -311,6 +324,7 @@ func (handler AppStoreDeploymentRestHandlerImpl) DeleteInstalledApp(w http.Respo
 	request.EnvironmentId = installedApp.EnvironmentId
 	request.UserId = userId
 	request.ForceDelete = forceDelete
+	request.NonCascadeDelete = !cascadeDelete
 	request.AppOfferingMode = installedApp.AppOfferingMode
 	request.ClusterId = installedApp.ClusterId
 	request.Namespace = installedApp.Namespace
diff --git a/api/cluster/EnvironmentRestHandler.go b/api/cluster/EnvironmentRestHandler.go
index 7e0319a15..8458fea9c 100644
--- a/api/cluster/EnvironmentRestHandler.go
+++ b/api/cluster/EnvironmentRestHandler.go
@@ -18,7 +18,11 @@
 package cluster
 
 import (
+	"context"
 	"encoding/json"
+	"github.com/devtron-labs/devtron/internal/util"
+	"github.com/devtron-labs/devtron/util/k8s"
+	"k8s.io/client-go/kubernetes"
 	"net/http"
 	"strconv"
 	"strings"
@@ -49,12 +53,14 @@ type EnvironmentRestHandler interface {
 	FindById(w http.ResponseWriter, r *http.Request)
 	GetEnvironmentListForAutocomplete(w http.ResponseWriter, r *http.Request)
 	GetCombinedEnvironmentListForDropDown(w http.ResponseWriter, r *http.Request)
+	GetEnvironmentConnection(w http.ResponseWriter, r *http.Request)
 	DeleteEnvironment(w http.ResponseWriter, r *http.Request)
 	GetCombinedEnvironmentListForDropDownByClusterIds(w http.ResponseWriter, r *http.Request)
 }
 
 type EnvironmentRestHandlerImpl struct {
 	environmentClusterMappingsService request.EnvironmentService
+	k8sApplicationService             k8s.K8sApplicationService
 	logger                            *zap.SugaredLogger
 	userService                       user.UserService
 	validator                         *validator.Validate
@@ -63,7 +69,12 @@ type EnvironmentRestHandlerImpl struct {
 	cfg                               *bean.Config
 }
 
-func NewEnvironmentRestHandlerImpl(svc request.EnvironmentService, logger *zap.SugaredLogger, userService user.UserService,
+type ClusterReachableResponse struct {
+	ClusterReachable bool   `json:"clusterReachable"`
+	ClusterName      string `json:"clusterName"`
+}
+
+func NewEnvironmentRestHandlerImpl(svc request.EnvironmentService, k8sApplicationService k8s.K8sApplicationService, logger *zap.SugaredLogger, userService user.UserService,
 	validator *validator.Validate, enforcer casbin.Enforcer,
 	deleteService delete2.DeleteService,
 ) *EnvironmentRestHandlerImpl {
@@ -76,6 +87,7 @@ func NewEnvironmentRestHandlerImpl(svc request.EnvironmentService, logger *zap.S
 	logger.Infow("evironment rest handler initialized", "ignoreAuthCheckValue", cfg.IgnoreAuthCheck)
 	return &EnvironmentRestHandlerImpl{
 		environmentClusterMappingsService: svc,
+		k8sApplicationService:             k8sApplicationService,
 		logger:                            logger,
 		userService:                       userService,
 		validator:                         validator,
@@ -460,3 +472,73 @@ func (impl EnvironmentRestHandlerImpl) GetCombinedEnvironmentListForDropDownByCl
 	}
 	common.WriteJsonResp(w, err, clusters, http.StatusOK)
 }
+
+func (impl EnvironmentRestHandlerImpl) GetEnvironmentConnection(w http.ResponseWriter, r *http.Request) {
+	//token := r.Header.Get("token")
+	vars := mux.Vars(r)
+	envIdString := vars["envId"]
+	envId, err := strconv.Atoi(envIdString)
+	if err != nil {
+		impl.logger.Errorw("failed to extract clusterId from param", "error", err, "clusterId", envIdString)
+		common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+		return
+	}
+	userId, err := impl.userService.GetLoggedInUser(r)
+	if userId == 0 || err != nil {
+		impl.logger.Errorw("user not authorized", "error", err, "userId", userId)
+		common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
+		return
+	}
+	bean, err := impl.environmentClusterMappingsService.FindById(envId)
+	if err != nil {
+		impl.logger.Errorw("request err, FindById", "err", err, "envId", envId)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	clusterBean, err := impl.environmentClusterMappingsService.FindClusterByEnvId(bean.ClusterId)
+	if err != nil {
+		impl.logger.Errorw("request err, FindById", "err", err, "envId", envId)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	// RBAC enforcer applying
+	token := r.Header.Get("token")
+	if ok := impl.enforcer.Enforce(token, casbin.ResourceGlobalEnvironment, casbin.ActionGet, strings.ToLower(bean.EnvironmentIdentifier)); !ok {
+		common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
+		return
+	}
+	//RBAC enforcer Ends
+	// getting restConfig and clientSet outside the goroutine because we don't want to call goroutine func with receiver function
+	restConfig, err := impl.k8sApplicationService.GetRestConfigByClusterId(context.Background(), clusterBean.Id)
+	if err != nil {
+		impl.logger.Errorw("error in getting restConfig by cluster", "err", err, "clusterId", clusterBean.Id)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	k8sHttpClient, err := util.OverrideK8sHttpClientWithTracer(restConfig)
+	if err != nil {
+		impl.logger.Errorw("service err, OverrideK8sHttpClientWithTracer", "err", err, "restConfig", restConfig)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	k8sClientSet, err := kubernetes.NewForConfigAndClient(restConfig, k8sHttpClient)
+	if err != nil {
+		impl.logger.Errorw("error in getting client set by rest config", "err", err, "restConfig", restConfig)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	responseObj := &ClusterReachableResponse{
+		ClusterReachable: true,
+		ClusterName:      clusterBean.ClusterName,
+	}
+	err = impl.k8sApplicationService.FetchConnectionStatusForCluster(k8sClientSet, clusterBean.Id)
+	if err != nil {
+		responseObj.ClusterReachable = false
+	}
+	//updating the cluster connection error to db
+	mapObj := map[int]error{
+		clusterBean.Id: err,
+	}
+	impl.environmentClusterMappingsService.HandleErrorInClusterConnections([]*request.ClusterBean{clusterBean}, mapObj, true)
+	common.WriteJsonResp(w, nil, responseObj, http.StatusOK)
+}
diff --git a/api/cluster/EnvironmentRouter.go b/api/cluster/EnvironmentRouter.go
index 224b79141..b83a12928 100644
--- a/api/cluster/EnvironmentRouter.go
+++ b/api/cluster/EnvironmentRouter.go
@@ -71,5 +71,7 @@ func (impl EnvironmentRouterImpl) InitEnvironmentClusterMappingsRouter(environme
 	environmentClusterMappingsRouter.Path("/namespace/autocomplete").
 		Methods("GET").
 		HandlerFunc(impl.environmentClusterMappingsRestHandler.GetCombinedEnvironmentListForDropDownByClusterIds)
-
+	environmentClusterMappingsRouter.Path("/{envId}/connection").
+		Methods("GET").
+		HandlerFunc(impl.environmentClusterMappingsRestHandler.GetEnvironmentConnection)
 }
diff --git a/api/helm-app/HelmAppService.go b/api/helm-app/HelmAppService.go
index 36655fa8b..aed1ffc0e 100644
--- a/api/helm-app/HelmAppService.go
+++ b/api/helm-app/HelmAppService.go
@@ -4,6 +4,12 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"net/http"
+	"reflect"
+	"strconv"
+	"strings"
+	"time"
+
 	"github.com/caarlos0/env/v6"
 	"github.com/devtron-labs/devtron/api/connector"
 	openapi "github.com/devtron-labs/devtron/api/helm-app/openapiClient"
@@ -23,17 +29,12 @@ import (
 	util2 "github.com/devtron-labs/devtron/util"
 	"github.com/devtron-labs/devtron/util/rbac"
 	jsonpatch "github.com/evanphx/json-patch"
-	"github.com/ghodss/yaml"
 	"github.com/gogo/protobuf/proto"
 	"github.com/tidwall/gjson"
 	"github.com/tidwall/sjson"
 	"go.opentelemetry.io/otel"
 	"go.uber.org/zap"
-	"net/http"
-	"reflect"
-	"strconv"
-	"strings"
-	"time"
+	"sigs.k8s.io/yaml"
 )
 
 type HelmAppService interface {
diff --git a/api/restHandler/BulkUpdateRestHandler.go b/api/restHandler/BulkUpdateRestHandler.go
index 3c7bd0c79..1ce3fb268 100644
--- a/api/restHandler/BulkUpdateRestHandler.go
+++ b/api/restHandler/BulkUpdateRestHandler.go
@@ -422,19 +422,11 @@ func (handler BulkUpdateRestHandlerImpl) HandleCdPipelineBulkAction(w http.Respo
 		return
 	}
 
-	v := r.URL.Query()
-	forceDelete := false
-	forceDeleteParam := v.Get("forceDelete")
-	if len(forceDeleteParam) > 0 {
-		forceDelete, err = strconv.ParseBool(forceDeleteParam)
-		if err != nil {
-			handler.logger.Errorw("request err, HandleCdPipelineBulkAction", "err", err, "payload", cdPipelineBulkActionReq)
-			common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
-			return
-		}
+	if cdPipelineBulkActionReq.ForceDelete {
+		cdPipelineBulkActionReq.NonCascadeDelete = true
 	}
-	cdPipelineBulkActionReq.ForceDelete = forceDelete
 
+	v := r.URL.Query()
 	dryRun := false
 	dryRunParam := v.Get("dryRun")
 	if len(dryRunParam) > 0 {
diff --git a/api/restHandler/CoreAppRestHandler.go b/api/restHandler/CoreAppRestHandler.go
index bf068004a..a2dca34dc 100644
--- a/api/restHandler/CoreAppRestHandler.go
+++ b/api/restHandler/CoreAppRestHandler.go
@@ -1146,11 +1146,12 @@ func (handler CoreAppRestHandlerImpl) deleteApp(ctx context.Context, appId int,
 
 		for _, cdPipeline := range cdPipelines.Pipelines {
 			cdPipelineDeleteRequest := &bean.CDPatchRequest{
-				AppId:       appId,
-				UserId:      userId,
-				Action:      bean.CD_DELETE,
-				ForceDelete: true,
-				Pipeline:    cdPipeline,
+				AppId:            appId,
+				UserId:           userId,
+				Action:           bean.CD_DELETE,
+				ForceDelete:      true,
+				NonCascadeDelete: false,
+				Pipeline:         cdPipeline,
 			}
 			_, err = handler.pipelineBuilder.PatchCdPipelines(cdPipelineDeleteRequest, ctx)
 			if err != nil {
@@ -1762,7 +1763,7 @@ func (handler CoreAppRestHandlerImpl) createEnvDeploymentTemplate(appId int, use
 	}
 
 	// if chart not found for chart_ref then create
-	_, err = handler.chartRepo.FindChartByAppIdAndRefId(appId, chartRefId)
+	chartEntry, err := handler.chartRepo.FindChartByAppIdAndRefId(appId, chartRefId)
 	if err != nil {
 		if pg.ErrNoRows == err {
 			templateRequest := chart.TemplateRequest{
@@ -1784,9 +1785,15 @@ func (handler CoreAppRestHandlerImpl) createEnvDeploymentTemplate(appId int, use
 	}
 
 	// create if required
-	_, err = handler.propertiesConfigService.CreateEnvironmentProperties(appId, envConfigProperties)
+	appMetrics := false
+	if envConfigProperties.AppMetrics != nil {
+		appMetrics = *envConfigProperties.AppMetrics
+	}
+	chartEntry.GlobalOverride = string(envConfigProperties.EnvOverrideValues)
+	_, err = handler.propertiesConfigService.CreateIfRequired(chartEntry, envId, userId, envConfigProperties.ManualReviewed, models.CHARTSTATUS_SUCCESS,
+		true, appMetrics, envConfigProperties.Namespace, envConfigProperties.IsBasicViewLocked, envConfigProperties.CurrentViewEditor, nil)
 	if err != nil {
-		handler.logger.Errorw("service err, CreateEnvironmentProperties", "err", err, "appId", appId, "envId", envId, "chartRefId", chartRefId)
+		handler.logger.Errorw("service err, CreateIfRequired", "err", err, "appId", appId, "envId", envId, "chartRefId", chartRefId)
 		return err
 	}
 
@@ -2088,7 +2095,6 @@ func (handler CoreAppRestHandlerImpl) CreateAppWorkflow(w http.ResponseWriter, r
 	//rbac ends
 
 	handler.logger.Infow("creating app workflow created ", "createAppRequest", createAppRequest)
-	var errResp *multierror.Error
 	var statusCode int
 
 	//creating workflow starts
@@ -2099,7 +2105,7 @@ func (handler CoreAppRestHandlerImpl) CreateAppWorkflow(w http.ResponseWriter, r
 		}
 		err, statusCode = handler.createWorkflows(ctx, createAppRequest.AppId, userId, createAppRequest.AppWorkflows, token, app.AppName)
 		if err != nil {
-			common.WriteJsonResp(w, errResp, nil, statusCode)
+			common.WriteJsonResp(w, err, nil, statusCode)
 			return
 		}
 	}
@@ -2109,7 +2115,7 @@ func (handler CoreAppRestHandlerImpl) CreateAppWorkflow(w http.ResponseWriter, r
 	if createAppRequest.EnvironmentOverrides != nil && len(createAppRequest.EnvironmentOverrides) > 0 {
 		err, statusCode = handler.createEnvOverrides(ctx, createAppRequest.AppId, userId, createAppRequest.EnvironmentOverrides, token)
 		if err != nil {
-			common.WriteJsonResp(w, errResp, nil, statusCode)
+			common.WriteJsonResp(w, err, nil, statusCode)
 			return
 		}
 	}
diff --git a/api/restHandler/app/DeploymentPipelineRestHandler.go b/api/restHandler/app/DeploymentPipelineRestHandler.go
index e659ced26..2ee67c32f 100644
--- a/api/restHandler/app/DeploymentPipelineRestHandler.go
+++ b/api/restHandler/app/DeploymentPipelineRestHandler.go
@@ -237,7 +237,14 @@ func (handler PipelineConfigRestHandlerImpl) PatchCdPipeline(w http.ResponseWrit
 
 	v := r.URL.Query()
 	forceDelete := false
+	cascadeDelete := true
 	force := v.Get("force")
+	cascade := v.Get("cascade")
+	if len(force) > 0 && len(cascade) > 0 {
+		handler.Logger.Errorw("request err, PatchCdPipeline", "err", fmt.Errorf("cannot perform both cascade and force delete"), "payload", cdPipeline)
+		common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+		return
+	}
 	if len(force) > 0 {
 		forceDelete, err = strconv.ParseBool(force)
 		if err != nil {
@@ -245,8 +252,16 @@ func (handler PipelineConfigRestHandlerImpl) PatchCdPipeline(w http.ResponseWrit
 			common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
 			return
 		}
+	} else if len(cascade) > 0 {
+		cascadeDelete, err = strconv.ParseBool(cascade)
+		if err != nil {
+			handler.Logger.Errorw("request err, PatchCdPipeline", "err", err, "payload", cdPipeline)
+			common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+			return
+		}
 	}
 	cdPipeline.ForceDelete = forceDelete
+	cdPipeline.NonCascadeDelete = !cascadeDelete
 	handler.Logger.Infow("request payload, PatchCdPipeline", "payload", cdPipeline)
 	err = handler.validator.StructPartial(cdPipeline, "AppId", "Action")
 	if err == nil {
diff --git a/api/restHandler/app/PipelineConfigRestHandler.go b/api/restHandler/app/PipelineConfigRestHandler.go
index 3bd46a62b..dcfbf878f 100644
--- a/api/restHandler/app/PipelineConfigRestHandler.go
+++ b/api/restHandler/app/PipelineConfigRestHandler.go
@@ -29,6 +29,7 @@ import (
 	"github.com/devtron-labs/devtron/pkg/chart"
 	"github.com/devtron-labs/devtron/pkg/user/casbin"
 	"github.com/devtron-labs/devtron/util/argo"
+	"github.com/go-pg/pg"
 	"go.opentelemetry.io/otel"
 	"io"
 	"net/http"
@@ -63,6 +64,7 @@ import (
 type DevtronAppRestHandler interface {
 	CreateApp(w http.ResponseWriter, r *http.Request)
 	DeleteApp(w http.ResponseWriter, r *http.Request)
+	DeleteACDAppWithNonCascade(w http.ResponseWriter, r *http.Request)
 	GetApp(w http.ResponseWriter, r *http.Request)
 	FindAppsByTeamId(w http.ResponseWriter, r *http.Request)
 	FindAppsByTeamName(w http.ResponseWriter, r *http.Request)
@@ -234,6 +236,86 @@ func (handler PipelineConfigRestHandlerImpl) DeleteApp(w http.ResponseWriter, r
 	common.WriteJsonResp(w, err, nil, http.StatusOK)
 }
 
+func (handler PipelineConfigRestHandlerImpl) DeleteACDAppWithNonCascade(w http.ResponseWriter, r *http.Request) {
+	token := r.Header.Get("token")
+	userId, err := handler.userAuthService.GetLoggedInUser(r)
+	if userId == 0 || err != nil {
+		common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
+		return
+	}
+	vars := mux.Vars(r)
+	appId, err := strconv.Atoi(vars["appId"])
+	if err != nil {
+		handler.Logger.Errorw("request err, delete app", "err", err, "appId", appId)
+		common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+		return
+	}
+	envId, err := strconv.Atoi(vars["envId"])
+	if err != nil {
+		handler.Logger.Errorw("request err, delete app", "err", err, "envId", envId)
+		common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+		return
+	}
+	handler.Logger.Infow("request payload, delete app", "appId", appId)
+
+	v := r.URL.Query()
+	forceDelete := false
+	force := v.Get("force")
+	if len(force) > 0 {
+		forceDelete, err = strconv.ParseBool(force)
+		if err != nil {
+			handler.Logger.Errorw("request err, NonCascadeDeleteCdPipeline", "err", err)
+			common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+			return
+		}
+	}
+	app, err := handler.pipelineBuilder.GetApp(appId)
+	if err != nil {
+		handler.Logger.Infow("service error, NonCascadeDeleteCdPipeline", "err", err, "appId", appId)
+		common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
+		return
+	}
+	// rbac enforcer applying
+	resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName)
+	if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionGet, resourceName); !ok {
+		common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
+		return
+	}
+	object := handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId)
+	if ok := handler.enforcer.Enforce(token, casbin.ResourceEnvironment, casbin.ActionDelete, object); !ok {
+		common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden)
+		return
+	}
+	// rbac enforcer ends
+	acdToken, err := handler.argoUserService.GetLatestDevtronArgoCdUserToken()
+	if err != nil {
+		handler.Logger.Errorw("error in getting acd token", "err", err)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	ctx := context.WithValue(r.Context(), "token", acdToken)
+	pipelines, err := handler.pipelineRepository.FindActiveByAppIdAndEnvironmentId(appId, envId)
+	if err != nil && err != pg.ErrNoRows {
+		handler.Logger.Errorw("error in fetching pipelines from db", "appId", appId, "envId", envId)
+		common.WriteJsonResp(w, err, "error in fetching pipelines from db", http.StatusInternalServerError)
+		return
+	} else if len(pipelines) == 0 {
+		common.WriteJsonResp(w, err, "deployment not found, unable to fetch resource tree", http.StatusNotFound)
+		return
+	} else if len(pipelines) > 1 {
+		common.WriteJsonResp(w, err, "multiple pipelines found for an envId", http.StatusBadRequest)
+		return
+	}
+	cdPipeline := pipelines[0]
+	err = handler.pipelineBuilder.DeleteACDAppCdPipelineWithNonCascade(cdPipeline, ctx, forceDelete, userId)
+	if err != nil {
+		handler.Logger.Errorw("service err, NonCascadeDeleteCdPipeline", "err", err, "payload", cdPipeline)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
+	common.WriteJsonResp(w, err, nil, http.StatusOK)
+}
+
 func (handler PipelineConfigRestHandlerImpl) CreateApp(w http.ResponseWriter, r *http.Request) {
 	token := r.Header.Get("token")
 	decoder := json.NewDecoder(r.Body)
diff --git a/api/router/PipelineConfigRouter.go b/api/router/PipelineConfigRouter.go
index 965c12010..882fd212e 100644
--- a/api/router/PipelineConfigRouter.go
+++ b/api/router/PipelineConfigRouter.go
@@ -52,6 +52,7 @@ func NewPipelineRouterImpl(restHandler app.PipelineConfigRestHandler,
 func (router PipelineConfigRouterImpl) initPipelineConfigRouter(configRouter *mux.Router) {
 	configRouter.Path("").HandlerFunc(router.restHandler.CreateApp).Methods("POST")
 	configRouter.Path("/{appId}").HandlerFunc(router.restHandler.DeleteApp).Methods("DELETE")
+	configRouter.Path("/delete/{appId}/{envId}/non-cascade").HandlerFunc(router.restHandler.DeleteACDAppWithNonCascade).Methods("DELETE")
 	configRouter.Path("/material").HandlerFunc(router.restHandler.CreateMaterial).Methods("POST")
 	configRouter.Path("/material").HandlerFunc(router.restHandler.UpdateMaterial).Methods("PUT")
 	configRouter.Path("/material/delete").HandlerFunc(router.restHandler.DeleteMaterial).Methods("DELETE")
diff --git a/api/router/pubsub/ApplicationStatusHandler.go b/api/router/pubsub/ApplicationStatusHandler.go
index b02ab088c..5b453226c 100644
--- a/api/router/pubsub/ApplicationStatusHandler.go
+++ b/api/router/pubsub/ApplicationStatusHandler.go
@@ -22,11 +22,13 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"time"
+
 	"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
 	appStoreBean "github.com/devtron-labs/devtron/pkg/appStore/bean"
 	repository4 "github.com/devtron-labs/devtron/pkg/appStore/deployment/repository"
+	"github.com/devtron-labs/devtron/pkg/bean"
 	"k8s.io/utils/strings/slices"
-	"time"
 
 	v1alpha12 "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1"
 	pubsub "github.com/devtron-labs/common-lib/pubsub-lib"
@@ -224,6 +226,7 @@ func (impl *ApplicationStatusHandlerImpl) updateArgoAppDeleteStatus(app *v1alpha
 		}
 		deleteRequest := &appStoreBean.InstallAppVersionDTO{}
 		deleteRequest.ForceDelete = false
+		deleteRequest.NonCascadeDelete = false
 		deleteRequest.AcdPartialDelete = false
 		deleteRequest.InstalledAppId = model.InstalledAppId
 		deleteRequest.AppId = model.AppId
@@ -240,7 +243,7 @@ func (impl *ApplicationStatusHandlerImpl) updateArgoAppDeleteStatus(app *v1alpha
 		}
 	} else {
 		// devtron app
-		err = impl.pipelineBuilder.DeleteCdPipeline(&pipeline, context.Background(), true, false, 1)
+		_, err = impl.pipelineBuilder.DeleteCdPipeline(&pipeline, context.Background(), bean.FORCE_DELETE, false, 1)
 		if err != nil {
 			impl.logger.Errorw("error in deleting cd pipeline", "err", err)
 			return err
diff --git a/charts/devtron/Chart.yaml b/charts/devtron/Chart.yaml
index 1e6888505..1b6684157 100644
--- a/charts/devtron/Chart.yaml
+++ b/charts/devtron/Chart.yaml
@@ -1,6 +1,6 @@
 apiVersion: v2
 name: devtron-operator
-appVersion: 0.6.18-rc.1
+appVersion: 0.6.18-rc.2
 description: Chart to configure and install Devtron. Devtron is a Kubernetes Orchestration system.
 keywords:
   - Devtron
diff --git a/charts/devtron/devtron-bom.yaml b/charts/devtron/devtron-bom.yaml
index f7585351a..345bb82f4 100644
--- a/charts/devtron/devtron-bom.yaml
+++ b/charts/devtron/devtron-bom.yaml
@@ -9,26 +9,26 @@ global:
     runAsNonRoot: true
 
 installer:
-  release: "v0.6.18-rc.1"
+  release: "v0.6.18-rc.2"
   image: "quay.io/devtron/inception"
   tag: "44b30917-185-13275"
   
 components:
   dashboard:
-    image: "quay.io/devtron/dashboard:b1ae0175-325-14079"
+    image: "quay.io/devtron/dashboard:961adac9-325-14236"
     config:
       extraConfigs:
         USE_V2: "true"
         ENABLE_BUILD_CONTEXT: "true"
   devtron:
-    image: "quay.io/devtron/hyperion:2c6ed701-280-14059"
-    cicdImage: "quay.io/devtron/devtron:2c6ed701-434-14060"
+    image: "quay.io/devtron/hyperion:73f1aa56-280-14239"
+    cicdImage: "quay.io/devtron/devtron:73f1aa56-434-14240"
   argocdDexServer:
     image: "ghcr.io/dexidp/dex:v2.30.2"
     initContainer:
       authenticator: "quay.io/devtron/authenticator:e414faff-393-13273"
   kubelink:
-    image: "quay.io/devtron/kubelink:451a1a1a-318-13790"
+    image: "quay.io/devtron/kubelink:63967b3a-318-14165"
     configs:
       ENABLE_HELM_RELEASE_CACHE: "true"
       PG_ADDR: postgresql-postgresql.devtroncd
@@ -48,10 +48,10 @@ components:
     envVars:
       devtron:
         GIT_BRANCH: "main"
-        GIT_HASH: "2c6ed701f1c9b357eee0c07587c426033bd4c4f4"
+        GIT_HASH: "73f1aa560d4bfbca97d702bbb12577cb800699fa"
       casbin:
         GIT_BRANCH: "main"
-        GIT_HASH: "2c6ed701f1c9b357eee0c07587c426033bd4c4f4"
+        GIT_HASH: "73f1aa560d4bfbca97d702bbb12577cb800699fa"
         
 argo-cd:
   global:
diff --git a/charts/devtron/values.yaml b/charts/devtron/values.yaml
index dfdc769bd..65c38072e 100644
--- a/charts/devtron/values.yaml
+++ b/charts/devtron/values.yaml
@@ -10,7 +10,7 @@ global:
 installer:
   repo: "devtron-labs/devtron"
 #  For Kubernetes version < 1.16, set release: legacy. You won't be able to upgrade Devtron unless you upgrade the K8s version to 1.16 or above.
-  release: "v0.6.18-rc.1" #You can use a branch name or a release tag name as a release, for gitee as source only "main" is supported as of now
+  release: "v0.6.18-rc.2" #You can use a branch name or a release tag name as a release, for gitee as source only "main" is supported as of now
   image: quay.io/devtron/inception
   tag: 44b30917-185-13275
   source: "github" # Available options are github and gitee
@@ -55,12 +55,12 @@ components:
       extraConfigs:
         USE_V2: "true"
         ENABLE_BUILD_CONTEXT: "true"
-    image: "quay.io/devtron/dashboard:b1ae0175-325-14079"
+    image: "quay.io/devtron/dashboard:961adac9-325-14236"
     imagePullPolicy: IfNotPresent
 
   devtron:
-    image: "quay.io/devtron/hyperion:2c6ed701-280-14059"
-    cicdImage: "quay.io/devtron/devtron:2c6ed701-434-14060"
+    image: "quay.io/devtron/hyperion:73f1aa56-280-14239"
+    cicdImage: "quay.io/devtron/devtron:73f1aa56-434-14240"
     imagePullPolicy: IfNotPresent
     customOverrides: {}
     serviceMonitor:
@@ -92,7 +92,7 @@ components:
       authenticator: "quay.io/devtron/authenticator:e414faff-393-13273"
 
   kubelink:
-    image: "quay.io/devtron/kubelink:451a1a1a-318-13790"
+    image: "quay.io/devtron/kubelink:63967b3a-318-14165"
     imagePullPolicy: IfNotPresent
     configs:
       ENABLE_HELM_RELEASE_CACHE: "true"
@@ -120,13 +120,13 @@ components:
         SCRIPT_LOCATION: "scripts/sql/"
         GIT_REPO_URL: "https://github.com/devtron-labs/devtron.git"
         DB_NAME: "orchestrator"
-        GIT_HASH: "2c6ed701f1c9b357eee0c07587c426033bd4c4f4"
+        GIT_HASH: "73f1aa560d4bfbca97d702bbb12577cb800699fa"
       casbin:
         GIT_BRANCH: "main"
         SCRIPT_LOCATION: "scripts/casbin/"
         GIT_REPO_URL: "https://github.com/devtron-labs/devtron.git"
         DB_NAME: "casbin"
-        GIT_HASH: "2c6ed701f1c9b357eee0c07587c426033bd4c4f4"
+        GIT_HASH: "73f1aa560d4bfbca97d702bbb12577cb800699fa"
 
 # values for argocd integration
 argo-cd:
diff --git a/cmd/external-app/wire_gen.go b/cmd/external-app/wire_gen.go
index 1b0c8cb1e..bf776ef98 100644
--- a/cmd/external-app/wire_gen.go
+++ b/cmd/external-app/wire_gen.go
@@ -231,12 +231,12 @@ func InitializeApp() (*App, error) {
 	attributesServiceImpl := attributes.NewAttributesServiceImpl(sugaredLogger, attributesRepositoryImpl)
 	helmAppRestHandlerImpl := client2.NewHelmAppRestHandlerImpl(sugaredLogger, helmAppServiceImpl, enforcerImpl, clusterServiceImpl, enforcerUtilHelmImpl, appStoreDeploymentCommonServiceImpl, userServiceImpl, attributesServiceImpl, serverEnvConfigServerEnvConfig)
 	helmAppRouterImpl := client2.NewHelmAppRouterImpl(helmAppRestHandlerImpl)
-	environmentRestHandlerImpl := cluster2.NewEnvironmentRestHandlerImpl(environmentServiceImpl, sugaredLogger, userServiceImpl, validate, enforcerImpl, deleteServiceImpl)
-	environmentRouterImpl := cluster2.NewEnvironmentRouterImpl(environmentRestHandlerImpl)
 	k8sClientServiceImpl := application.NewK8sClientServiceImpl(sugaredLogger, clusterRepositoryImpl)
 	k8sResourceHistoryRepositoryImpl := repository5.NewK8sResourceHistoryRepositoryImpl(db, sugaredLogger)
 	k8sResourceHistoryServiceImpl := kubernetesResourceAuditLogs.Newk8sResourceHistoryServiceImpl(k8sResourceHistoryRepositoryImpl, sugaredLogger, appRepositoryImpl, environmentRepositoryImpl)
 	k8sApplicationServiceImpl := k8s.NewK8sApplicationServiceImpl(sugaredLogger, clusterServiceImpl, pumpImpl, k8sClientServiceImpl, helmAppServiceImpl, k8sUtil, acdAuthConfig, k8sResourceHistoryServiceImpl)
+	environmentRestHandlerImpl := cluster2.NewEnvironmentRestHandlerImpl(environmentServiceImpl, k8sApplicationServiceImpl, sugaredLogger, userServiceImpl, validate, enforcerImpl, deleteServiceImpl)
+	environmentRouterImpl := cluster2.NewEnvironmentRouterImpl(environmentRestHandlerImpl)
 	terminalSessionHandlerImpl := terminal.NewTerminalSessionHandlerImpl(environmentServiceImpl, clusterServiceImpl, sugaredLogger)
 	ciPipelineRepositoryImpl := pipelineConfig.NewCiPipelineRepositoryImpl(db, sugaredLogger)
 	enforcerUtilImpl := rbac.NewEnforcerUtilImpl(sugaredLogger, teamRepositoryImpl, appRepositoryImpl, environmentRepositoryImpl, pipelineRepositoryImpl, ciPipelineRepositoryImpl, clusterRepositoryImpl)
diff --git a/go.mod b/go.mod
index 60045e268..870357ec3 100644
--- a/go.mod
+++ b/go.mod
@@ -18,7 +18,6 @@ require (
 	github.com/devtron-labs/common-lib v0.0.0-20230407072229-d4f665f5ca12
 	github.com/devtron-labs/protos v0.0.0-20230503113602-282404f70fd2
 	github.com/evanphx/json-patch v5.6.0+incompatible
-	github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
 	github.com/go-pg/pg v6.15.1+incompatible
 	github.com/go-resty/resty/v2 v2.7.0
 	github.com/gogo/protobuf v1.3.2
@@ -122,6 +121,7 @@ require (
 	github.com/fatih/camelcase v1.0.0 // indirect
 	github.com/felixge/httpsnoop v1.0.3 // indirect
 	github.com/fvbommel/sortorder v1.0.1 // indirect
+	github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect
 	github.com/go-errors/errors v1.0.1 // indirect
 	github.com/go-git/gcfg v1.5.0 // indirect
 	github.com/go-git/go-billy/v5 v5.3.1 // indirect
diff --git a/internal/util/ChartService.go b/internal/util/ChartService.go
index e3cd5d42e..acfa05ec6 100644
--- a/internal/util/ChartService.go
+++ b/internal/util/ChartService.go
@@ -21,15 +21,7 @@ import (
 	"compress/gzip"
 	"context"
 	"fmt"
-	"github.com/devtron-labs/devtron/api/bean"
-	"github.com/devtron-labs/devtron/internal/sql/repository"
-	appStoreBean "github.com/devtron-labs/devtron/pkg/appStore/bean"
-	//appStoreBean "github.com/devtron-labs/devtron/pkg/appStore/bean"
-	chartRepoRepository "github.com/devtron-labs/devtron/pkg/chartRepo/repository"
-	repository2 "github.com/devtron-labs/devtron/pkg/user/repository"
-	"github.com/devtron-labs/devtron/util"
-	"github.com/go-pg/pg"
-	"go.opentelemetry.io/otel"
+
 	"io/ioutil"
 	"math/rand"
 	"net/http"
@@ -40,11 +32,19 @@ import (
 	"strings"
 	"time"
 
-	"github.com/ghodss/yaml"
+	"github.com/devtron-labs/devtron/api/bean"
+	"github.com/devtron-labs/devtron/internal/sql/repository"
+	appStoreBean "github.com/devtron-labs/devtron/pkg/appStore/bean"
+	chartRepoRepository "github.com/devtron-labs/devtron/pkg/chartRepo/repository"
+	repository2 "github.com/devtron-labs/devtron/pkg/user/repository"
+	"github.com/devtron-labs/devtron/util"
+	"github.com/go-pg/pg"
 	dirCopy "github.com/otiai10/copy"
+	"go.opentelemetry.io/otel"
 	"go.uber.org/zap"
 	"k8s.io/helm/pkg/chartutil"
 	"k8s.io/helm/pkg/proto/hapi/chart"
+	"sigs.k8s.io/yaml"
 )
 
 type ChartWorkingDir string
diff --git a/internal/util/K8sUtil.go b/internal/util/K8sUtil.go
index 2ed4c5902..612919486 100644
--- a/internal/util/K8sUtil.go
+++ b/internal/util/K8sUtil.go
@@ -23,19 +23,19 @@ import (
 	error2 "errors"
 	"flag"
 	"fmt"
-	"github.com/argoproj/gitops-engine/pkg/utils/kube"
-	"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
-	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"k8s.io/apimachinery/pkg/version"
 	"net/http"
 	"os/user"
 	"path/filepath"
 	"strings"
 	"time"
 
+	"github.com/argoproj/gitops-engine/pkg/utils/kube"
+	"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
+	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/version"
+
 	"github.com/devtron-labs/authenticator/client"
-	"github.com/ghodss/yaml"
 	"go.uber.org/zap"
 	batchV1 "k8s.io/api/batch/v1"
 	v1 "k8s.io/api/core/v1"
@@ -47,6 +47,7 @@ import (
 	v12 "k8s.io/client-go/kubernetes/typed/core/v1"
 	"k8s.io/client-go/rest"
 	"k8s.io/client-go/tools/clientcmd"
+	"sigs.k8s.io/yaml"
 )
 
 type K8sUtil struct {
diff --git a/manifests/install/devtron-installer.yaml b/manifests/install/devtron-installer.yaml
index 4412b7769..3fe522e44 100644
--- a/manifests/install/devtron-installer.yaml
+++ b/manifests/install/devtron-installer.yaml
@@ -4,4 +4,4 @@ metadata:
   name: installer-devtron
   namespace: devtroncd
 spec:
-  url: https://raw.githubusercontent.com/devtron-labs/devtron/v0.6.18-rc.1/manifests/installation-script
+  url: https://raw.githubusercontent.com/devtron-labs/devtron/v0.6.18-rc.2/manifests/installation-script
diff --git a/manifests/installation-script b/manifests/installation-script
index fe62007d3..2084edbc4 100644
--- a/manifests/installation-script
+++ b/manifests/installation-script
@@ -1,4 +1,4 @@
-LTAG="v0.6.18-rc.1";
+LTAG="v0.6.18-rc.2";
 REPO_RAW_URL="https://raw.githubusercontent.com/devtron-labs/devtron/";
 
 operatorSecret = kubectl get secret -n devtroncd devtron-operator-secret;
diff --git a/manifests/release.txt b/manifests/release.txt
index df7e4a1ff..ee411555e 100644
--- a/manifests/release.txt
+++ b/manifests/release.txt
@@ -1,1 +1,1 @@
-beta 1 v0.6.18-rc.1
+beta 2 v0.6.18-rc.2
diff --git a/manifests/yamls/dashboard.yaml b/manifests/yamls/dashboard.yaml
index 103052b3d..a670fd659 100644
--- a/manifests/yamls/dashboard.yaml
+++ b/manifests/yamls/dashboard.yaml
@@ -235,7 +235,7 @@ spec:
             - name: envoy-config-volume
               mountPath: /etc/envoy-config/
         - name: dashboard
-          image: "quay.io/devtron/dashboard:b1ae0175-325-14079"
+          image: "quay.io/devtron/dashboard:961adac9-325-14236"
           imagePullPolicy: IfNotPresent
           securityContext:
             allowPrivilegeEscalation: false
diff --git a/manifests/yamls/devtron.yaml b/manifests/yamls/devtron.yaml
index cdb68f544..09ba24d7a 100644
--- a/manifests/yamls/devtron.yaml
+++ b/manifests/yamls/devtron.yaml
@@ -53,7 +53,7 @@ data:
   CD_NODE_TAINTS_VALUE: "ci"
   CD_ARTIFACT_LOCATION_FORMAT: "%d/%d.zip"
   DEFAULT_CD_NAMESPACE: "devtron-cd"
-  DEFAULT_CI_IMAGE: "quay.io/devtron/ci-runner:7d081d0a-138-14092"
+  DEFAULT_CI_IMAGE: "quay.io/devtron/ci-runner:37b94b38-138-14234"
   DEFAULT_CD_TIMEOUT: "3600"
   WF_CONTROLLER_INSTANCE_ID: "devtron-runner"
   CI_LOGS_KEY_PREFIX: "ci-artifacts"
@@ -162,7 +162,7 @@ spec:
         runAsUser: 1000
       containers:
         - name: devtron
-          image: "quay.io/devtron/devtron:2c6ed701-434-14060"
+          image: "quay.io/devtron/devtron:73f1aa56-434-14240"
           securityContext:
             allowPrivilegeEscalation: false
             runAsUser: 1000
diff --git a/manifests/yamls/kubelink.yaml b/manifests/yamls/kubelink.yaml
index 4cb9df876..9b6e19f67 100644
--- a/manifests/yamls/kubelink.yaml
+++ b/manifests/yamls/kubelink.yaml
@@ -25,7 +25,7 @@ spec:
         runAsUser: 1000
       containers:
         - name: kubelink
-          image: "quay.io/devtron/kubelink:451a1a1a-318-13790"
+          image: "quay.io/devtron/kubelink:63967b3a-318-14165"
           securityContext:
             allowPrivilegeEscalation: false
             runAsUser: 1000
diff --git a/manifests/yamls/migrator.yaml b/manifests/yamls/migrator.yaml
index 1f681acb0..6b7743ce0 100644
--- a/manifests/yamls/migrator.yaml
+++ b/manifests/yamls/migrator.yaml
@@ -47,7 +47,7 @@ spec:
         - name: MIGRATE_TO_VERSION
           value: "0"
         - name: GIT_HASH
-          value: 2c6ed701f1c9b357eee0c07587c426033bd4c4f4
+          value: 73f1aa560d4bfbca97d702bbb12577cb800699fa
         envFrom:
           - secretRef:
               name: postgresql-migrator
@@ -96,7 +96,7 @@ spec:
         - name: MIGRATE_TO_VERSION
           value: "0"
         - name: GIT_HASH
-          value: 2c6ed701f1c9b357eee0c07587c426033bd4c4f4
+          value: 73f1aa560d4bfbca97d702bbb12577cb800699fa
         - name: GIT_BRANCH
           value: main
         envFrom:
diff --git a/pkg/app/AppService.go b/pkg/app/AppService.go
index 6208983e3..66439ee2e 100644
--- a/pkg/app/AppService.go
+++ b/pkg/app/AppService.go
@@ -3246,6 +3246,72 @@ func (impl *AppServiceImpl) UpdateCdWorkflowRunnerByACDObject(app *v1alpha1.Appl
 	return nil
 }
 
+const kedaAutoscaling = "kedaAutoscaling"
+const HorizontalPodAutoscaler = "HorizontalPodAutoscaler"
+const fullnameOverride = "fullnameOverride"
+const nameOverride = "nameOverride"
+const enabled = "enabled"
+const replicaCount = "replicaCount"
+
+func (impl *AppServiceImpl) getAutoScalingReplicaCount(templateMap map[string]interface{}, appName string) *util2.HpaResourceRequest {
+	hasOverride := false
+	if _, ok := templateMap[fullnameOverride]; ok {
+		appNameOverride := templateMap[fullnameOverride].(string)
+		if len(appNameOverride) > 0 {
+			appName = appNameOverride
+			hasOverride = true
+		}
+	}
+	if !hasOverride {
+		if _, ok := templateMap[nameOverride]; ok {
+			nameOverride := templateMap[nameOverride].(string)
+			if len(nameOverride) > 0 {
+				appName = fmt.Sprintf("%s-%s", appName, nameOverride)
+			}
+		}
+	}
+	hpaResourceRequest := &util2.HpaResourceRequest{}
+	hpaResourceRequest.Version = ""
+	hpaResourceRequest.Group = autoscaling.ServiceName
+	hpaResourceRequest.Kind = HorizontalPodAutoscaler
+	impl.logger.Infow("getAutoScalingReplicaCount", "hpaResourceRequest", hpaResourceRequest)
+	if _, ok := templateMap[kedaAutoscaling]; ok {
+		as := templateMap[kedaAutoscaling]
+		asd := as.(map[string]interface{})
+		if _, ok := asd[enabled]; ok {
+			impl.logger.Infow("getAutoScalingReplicaCount", "hpaResourceRequest", hpaResourceRequest)
+			enable := asd[enabled].(bool)
+			if enable {
+				hpaResourceRequest.IsEnable = enable
+				hpaResourceRequest.ReqReplicaCount = templateMap[replicaCount].(float64)
+				hpaResourceRequest.ReqMaxReplicas = asd["maxReplicaCount"].(float64)
+				hpaResourceRequest.ReqMinReplicas = asd["minReplicaCount"].(float64)
+				hpaResourceRequest.ResourceName = fmt.Sprintf("%s-%s-%s", "keda-hpa", appName, "keda")
+				impl.logger.Infow("getAutoScalingReplicaCount", "hpaResourceRequest", hpaResourceRequest)
+				return hpaResourceRequest
+			}
+		}
+	}
+
+	if _, ok := templateMap[autoscaling.ServiceName]; ok {
+		as := templateMap[autoscaling.ServiceName]
+		asd := as.(map[string]interface{})
+		if _, ok := asd[enabled]; ok {
+			enable := asd[enabled].(bool)
+			if enable {
+				hpaResourceRequest.IsEnable = asd[enabled].(bool)
+				hpaResourceRequest.ReqReplicaCount = templateMap[replicaCount].(float64)
+				hpaResourceRequest.ReqMaxReplicas = asd["MaxReplicas"].(float64)
+				hpaResourceRequest.ReqMinReplicas = asd["MinReplicas"].(float64)
+				hpaResourceRequest.ResourceName = fmt.Sprintf("%s-%s", appName, "hpa")
+				return hpaResourceRequest
+			}
+		}
+	}
+	return hpaResourceRequest
+
+}
+
 func (impl *AppServiceImpl) autoscalingCheckBeforeTrigger(ctx context.Context, appName string, namespace string, merged []byte, overrideRequest *bean.ValuesOverrideRequest) []byte {
 	//pipeline := overrideRequest.Pipeline
 	var appId = overrideRequest.AppId
@@ -3258,77 +3324,66 @@ func (impl *AppServiceImpl) autoscalingCheckBeforeTrigger(ctx context.Context, a
 	if err != nil {
 		return merged
 	}
-	if _, ok := templateMap[autoscaling.ServiceName]; ok {
-		as := templateMap[autoscaling.ServiceName]
-		asd := as.(map[string]interface{})
-		isEnable := false
-		if _, ok := asd["enabled"]; ok {
-			isEnable = asd["enabled"].(bool)
-		}
-		if isEnable {
-			reqReplicaCount := templateMap["replicaCount"].(float64)
-			reqMaxReplicas := asd["MaxReplicas"].(float64)
-			reqMinReplicas := asd["MinReplicas"].(float64)
-			version := ""
-			group := autoscaling.ServiceName
-			kind := "HorizontalPodAutoscaler"
-			resourceName := fmt.Sprintf("%s-%s", appName, "hpa")
-			resourceManifest := make(map[string]interface{})
-			if IsAcdApp(appDeploymentType) {
-				query := &application2.ApplicationResourceRequest{
-					Name:         &appName,
-					Version:      &version,
-					Group:        &group,
-					Kind:         &kind,
-					ResourceName: &resourceName,
-					Namespace:    &namespace,
-				}
-				recv, err := impl.acdClient.GetResource(ctx, query)
-				impl.logger.Debugw("resource manifest get replica count", "response", recv)
-				if err != nil {
-					impl.logger.Errorw("ACD Get Resource API Failed", "err", err)
-					middleware.AcdGetResourceCounter.WithLabelValues(strconv.Itoa(appId), namespace, appName).Inc()
-					return merged
-				}
-				if recv != nil && len(*recv.Manifest) > 0 {
-					err := json.Unmarshal([]byte(*recv.Manifest), &resourceManifest)
-					if err != nil {
-						impl.logger.Errorw("unmarshal failed for hpa check", "err", err)
-						return merged
-					}
-				}
-			} else {
-				version = "v2beta2"
-				k8sResource, err := impl.k8sApplicationService.GetResource(ctx, &k8s.ResourceRequestBean{ClusterId: clusterId,
-					K8sRequest: &application3.K8sRequestBean{ResourceIdentifier: application3.ResourceIdentifier{Name: resourceName,
-						Namespace: namespace, GroupVersionKind: schema.GroupVersionKind{Group: group, Kind: kind, Version: version}}}})
-				if err != nil {
-					impl.logger.Errorw("error occurred while fetching resource for app", "resourceName", resourceName, "err", err)
-					return merged
-				}
-				resourceManifest = k8sResource.Manifest.Object
-			}
-			if len(resourceManifest) > 0 {
-				statusMap := resourceManifest["status"].(map[string]interface{})
-				currentReplicaVal := statusMap["currentReplicas"]
-				currentReplicaCount, err := util2.ParseFloatNumber(currentReplicaVal)
-				if err != nil {
-					impl.logger.Errorw("error occurred while parsing replica count", "currentReplicas", currentReplicaVal, "err", err)
-					return merged
-				}
 
-				reqReplicaCount = impl.fetchRequiredReplicaCount(currentReplicaCount, reqMaxReplicas, reqMinReplicas)
-				templateMap["replicaCount"] = reqReplicaCount
-				merged, err = json.Marshal(&templateMap)
+	hpaResourceRequest := impl.getAutoScalingReplicaCount(templateMap, appName)
+	impl.logger.Debugw("autoscalingCheckBeforeTrigger", "hpaResourceRequest", hpaResourceRequest)
+	if hpaResourceRequest.IsEnable {
+		resourceManifest := make(map[string]interface{})
+		if IsAcdApp(appDeploymentType) {
+			query := &application2.ApplicationResourceRequest{
+				Name:         &appName,
+				Version:      &hpaResourceRequest.Version,
+				Group:        &hpaResourceRequest.Group,
+				Kind:         &hpaResourceRequest.Kind,
+				ResourceName: &hpaResourceRequest.ResourceName,
+				Namespace:    &namespace,
+			}
+			recv, err := impl.acdClient.GetResource(ctx, query)
+			impl.logger.Debugw("resource manifest get replica count", "response", recv)
+			if err != nil {
+				impl.logger.Errorw("ACD Get Resource API Failed", "err", err)
+				middleware.AcdGetResourceCounter.WithLabelValues(strconv.Itoa(appId), namespace, appName).Inc()
+				return merged
+			}
+			if recv != nil && len(*recv.Manifest) > 0 {
+				err := json.Unmarshal([]byte(*recv.Manifest), &resourceManifest)
 				if err != nil {
-					impl.logger.Errorw("marshaling failed for hpa check", "err", err)
+					impl.logger.Errorw("unmarshal failed for hpa check", "err", err)
 					return merged
 				}
 			}
 		} else {
-			impl.logger.Errorw("autoscaling is not enabled", "pipelineId", pipelineId)
+			version := "v2beta2"
+			k8sResource, err := impl.k8sApplicationService.GetResource(ctx, &k8s.ResourceRequestBean{ClusterId: clusterId,
+				K8sRequest: &application3.K8sRequestBean{ResourceIdentifier: application3.ResourceIdentifier{Name: hpaResourceRequest.ResourceName,
+					Namespace: namespace, GroupVersionKind: schema.GroupVersionKind{Group: hpaResourceRequest.Group, Kind: hpaResourceRequest.Kind, Version: version}}}})
+			if err != nil {
+				impl.logger.Errorw("error occurred while fetching resource for app", "resourceName", hpaResourceRequest.ResourceName, "err", err)
+				return merged
+			}
+			resourceManifest = k8sResource.Manifest.Object
+		}
+		if len(resourceManifest) > 0 {
+			statusMap := resourceManifest["status"].(map[string]interface{})
+			currentReplicaVal := statusMap["currentReplicas"]
+			currentReplicaCount, err := util2.ParseFloatNumber(currentReplicaVal)
+			if err != nil {
+				impl.logger.Errorw("error occurred while parsing replica count", "currentReplicas", currentReplicaVal, "err", err)
+				return merged
+			}
+
+			reqReplicaCount := impl.fetchRequiredReplicaCount(currentReplicaCount, hpaResourceRequest.ReqMaxReplicas, hpaResourceRequest.ReqMinReplicas)
+			templateMap["replicaCount"] = reqReplicaCount
+			merged, err = json.Marshal(&templateMap)
+			if err != nil {
+				impl.logger.Errorw("marshaling failed for hpa check", "err", err)
+				return merged
+			}
 		}
+	} else {
+		impl.logger.Errorw("autoscaling is not enabled", "pipelineId", pipelineId)
 	}
+
 	//check for custom chart support
 	if autoscalingEnabledPath, ok := templateMap[bean2.CustomAutoScalingEnabledPathKey]; ok {
 		if deploymentType == models.DEPLOYMENTTYPE_STOP {
diff --git a/pkg/appStore/bean/bean.go b/pkg/appStore/bean/bean.go
index 72dac0101..be1991aa0 100644
--- a/pkg/appStore/bean/bean.go
+++ b/pkg/appStore/bean/bean.go
@@ -63,40 +63,42 @@ type InstalledAppDto struct {
 }
 
 type InstallAppVersionDTO struct {
-	Id                           int                        `json:"id,omitempty"`
-	AppId                        int                        `json:"appId,omitempty"`
-	AppName                      string                     `json:"appName,omitempty"`
-	TeamId                       int                        `json:"teamId,omitempty"`
-	TeamName                     string                     `json:"teamName,omitempty"`
-	EnvironmentId                int                        `json:"environmentId,omitempty"`
-	InstalledAppId               int                        `json:"installedAppId,omitempty,notnull"`
-	InstalledAppVersionId        int                        `json:"installedAppVersionId,omitempty,notnull"`
-	InstalledAppVersionHistoryId int                        `json:"installedAppVersionHistoryId,omitempty"`
-	AppStoreVersion              int                        `json:"appStoreVersion,omitempty,notnull"`
-	ValuesOverrideYaml           string                     `json:"valuesOverrideYaml,omitempty"`
-	Readme                       string                     `json:"readme,omitempty"`
-	UserId                       int32                      `json:"-"`
-	ReferenceValueId             int                        `json:"referenceValueId, omitempty" validate:"required,number"`
-	ReferenceValueKind           string                     `json:"referenceValueKind, omitempty" validate:"oneof=DEFAULT TEMPLATE DEPLOYED EXISTING"`
-	ACDAppName                   string                     `json:"-"`
-	Environment                  *repository2.Environment   `json:"-"`
-	ChartGroupEntryId            int                        `json:"-"`
-	DefaultClusterComponent      bool                       `json:"-"`
-	Status                       AppstoreDeploymentStatus   `json:"-"`
-	AppStoreId                   int                        `json:"appStoreId"`
-	AppStoreName                 string                     `json:"appStoreName"`
-	Deprecated                   bool                       `json:"deprecated"`
-	ForceDelete                  bool                       `json:"-"`
-	ClusterId                    int                        `json:"clusterId"` // needed for hyperion mode
-	Namespace                    string                     `json:"namespace"` // needed for hyperion mode
-	AppOfferingMode              string                     `json:"appOfferingMode"`
-	GitOpsRepoName               string                     `json:"gitOpsRepoName"`
-	GitOpsPath                   string                     `json:"gitOpsPath"`
-	GitHash                      string                     `json:"gitHash"`
-	EnvironmentName              string                     `json:"-"`
-	InstallAppVersionChartDTO    *InstallAppVersionChartDTO `json:"-"`
-	DeploymentAppType            string                     `json:"deploymentAppType"`
-	AcdPartialDelete             bool                       `json:"acdPartialDelete"`
+	Id                           int                            `json:"id,omitempty"`
+	AppId                        int                            `json:"appId,omitempty"`
+	AppName                      string                         `json:"appName,omitempty"`
+	TeamId                       int                            `json:"teamId,omitempty"`
+	TeamName                     string                         `json:"teamName,omitempty"`
+	EnvironmentId                int                            `json:"environmentId,omitempty"`
+	InstalledAppId               int                            `json:"installedAppId,omitempty,notnull"`
+	InstalledAppVersionId        int                            `json:"installedAppVersionId,omitempty,notnull"`
+	InstalledAppVersionHistoryId int                            `json:"installedAppVersionHistoryId,omitempty"`
+	AppStoreVersion              int                            `json:"appStoreVersion,omitempty,notnull"`
+	ValuesOverrideYaml           string                         `json:"valuesOverrideYaml,omitempty"`
+	Readme                       string                         `json:"readme,omitempty"`
+	UserId                       int32                          `json:"-"`
+	ReferenceValueId             int                            `json:"referenceValueId, omitempty" validate:"required,number"`
+	ReferenceValueKind           string                         `json:"referenceValueKind, omitempty" validate:"oneof=DEFAULT TEMPLATE DEPLOYED EXISTING"`
+	ACDAppName                   string                         `json:"-"`
+	Environment                  *repository2.Environment       `json:"-"`
+	ChartGroupEntryId            int                            `json:"-"`
+	DefaultClusterComponent      bool                           `json:"-"`
+	Status                       AppstoreDeploymentStatus       `json:"-"`
+	AppStoreId                   int                            `json:"appStoreId"`
+	AppStoreName                 string                         `json:"appStoreName"`
+	Deprecated                   bool                           `json:"deprecated"`
+	ForceDelete                  bool                           `json:"-"`
+	NonCascadeDelete             bool                           `json:"-"`
+	ClusterId                    int                            `json:"clusterId"` // needed for hyperion mode
+	Namespace                    string                         `json:"namespace"` // needed for hyperion mode
+	AppOfferingMode              string                         `json:"appOfferingMode"`
+	GitOpsRepoName               string                         `json:"gitOpsRepoName"`
+	GitOpsPath                   string                         `json:"gitOpsPath"`
+	GitHash                      string                         `json:"gitHash"`
+	EnvironmentName              string                         `json:"-"`
+	InstallAppVersionChartDTO    *InstallAppVersionChartDTO     `json:"-"`
+	DeploymentAppType            string                         `json:"deploymentAppType"`
+	AcdPartialDelete             bool                           `json:"acdPartialDelete"`
+	InstalledAppDeleteResponse   *InstalledAppDeleteResponseDTO `json:"deleteResponse,omitempty"`
 	AppStoreApplicationVersionId int
 	PerformGitOpsForHelmApp      bool `json:"performGitOpsForHelmApp"`
 	PerformGitOps                bool `json:"performGitOps"`
@@ -104,6 +106,12 @@ type InstallAppVersionDTO struct {
 	PerformHelmDeployment        bool `json:"performHelmDeployment"`
 }
 
+type InstalledAppDeleteResponseDTO struct {
+	DeleteInitiated  bool   `json:"deleteInitiated"`
+	ClusterReachable bool   `json:"clusterReachable"`
+	ClusterName      string `json:"clusterName"`
+}
+
 type InstallAppVersionChartDTO struct {
 	AppStoreChartId               int                            `json:"-"`
 	ChartName                     string                         `json:"-"`
@@ -157,6 +165,7 @@ type InstalledAppsResponse struct {
 	EnvironmentName              string    `json:"environmentName"`
 	DeployedAt                   time.Time `json:"deployedAt"`
 	DeployedBy                   string    `json:"deployedBy"`
+	DeploymentAppType            string    `json:"deploymentAppType,omitempty"`
 	InstalledAppsId              int       `json:"installedAppId"`
 	Readme                       string    `json:"readme"`
 	EnvironmentId                int       `json:"environmentId"`
diff --git a/pkg/appStore/deployment/fullMode/AppStoreDeploymentFullModeService.go b/pkg/appStore/deployment/fullMode/AppStoreDeploymentFullModeService.go
index 5269a6026..4efa2d185 100644
--- a/pkg/appStore/deployment/fullMode/AppStoreDeploymentFullModeService.go
+++ b/pkg/appStore/deployment/fullMode/AppStoreDeploymentFullModeService.go
@@ -21,6 +21,10 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+	"path"
+	"regexp"
+	"time"
+
 	"github.com/devtron-labs/devtron/api/bean"
 	"github.com/devtron-labs/devtron/client/argocdServer"
 	repository3 "github.com/devtron-labs/devtron/internal/sql/repository"
@@ -36,9 +40,6 @@ import (
 	util3 "github.com/devtron-labs/devtron/util"
 	"github.com/devtron-labs/devtron/util/argo"
 	"github.com/go-pg/pg"
-	"path"
-	"regexp"
-	"time"
 
 	"github.com/argoproj/argo-cd/v2/pkg/apiclient/application"
 	repository2 "github.com/argoproj/argo-cd/v2/pkg/apiclient/repository"
@@ -46,10 +47,10 @@ import (
 	application2 "github.com/devtron-labs/devtron/client/argocdServer/application"
 	"github.com/devtron-labs/devtron/client/argocdServer/repository"
 	"github.com/devtron-labs/devtron/internal/util"
-	"github.com/ghodss/yaml"
 	"go.uber.org/zap"
 	"k8s.io/helm/pkg/chartutil"
 	"k8s.io/helm/pkg/proto/hapi/chart"
+	"sigs.k8s.io/yaml"
 )
 
 const (
diff --git a/pkg/appStore/deployment/repository/InstalledAppRepository.go b/pkg/appStore/deployment/repository/InstalledAppRepository.go
index bed306bf5..cf67e81fb 100644
--- a/pkg/appStore/deployment/repository/InstalledAppRepository.go
+++ b/pkg/appStore/deployment/repository/InstalledAppRepository.go
@@ -161,6 +161,7 @@ type InstalledAppAndEnvDetails struct {
 	AppId                        int       `json:"app_id"`
 	InstalledAppId               int       `json:"installed_app_id"`
 	AppStoreApplicationVersionId int       `json:"app_store_application_version_id"`
+	AppStatus                    string    `json:"app_status"`
 	DeploymentAppType            string    `json:"-"`
 }
 
@@ -335,13 +336,14 @@ func (impl InstalledAppRepositoryImpl) GetAllInstalledApps(filter *appStoreBean.
 func (impl InstalledAppRepositoryImpl) GetAllIntalledAppsByAppStoreId(appStoreId int) ([]InstalledAppAndEnvDetails, error) {
 	var installedAppAndEnvDetails []InstalledAppAndEnvDetails
 	var queryTemp = "select env.environment_name, env.id as environment_id, a.app_name, a.app_offering_mode, ia.updated_on, u.email_id," +
-		" asav.id as app_store_application_version_id, iav.id as installed_app_version_id, ia.id as installed_app_id, ia.app_id, ia.deployment_app_type" +
+		" asav.id as app_store_application_version_id, iav.id as installed_app_version_id, ia.id as installed_app_id, ia.app_id, ia.deployment_app_type, app_status.status as app_status" +
 		" from installed_app_versions iav inner join installed_apps ia on iav.installed_app_id = ia.id" +
 		" inner join app a on a.id = ia.app_id " +
 		" inner join app_store_application_version asav on iav.app_store_application_version_id = asav.id " +
 		" inner join app_store aps on asav.app_store_id = aps.id " +
 		" inner join environment env on ia.environment_id = env.id " +
 		" left join users u on u.id = ia.updated_by " +
+		" left join app_status on app_status.app_id = ia.app_id and ia.environment_id = app_status.env_id\n" +
 		" where aps.id = " + strconv.Itoa(appStoreId) + " and ia.active=true and iav.active=true and env.active=true"
 	_, err := impl.dbConnection.Query(&installedAppAndEnvDetails, queryTemp)
 	if err != nil {
diff --git a/pkg/appStore/deployment/service/AppStoreDeploymentService.go b/pkg/appStore/deployment/service/AppStoreDeploymentService.go
index e6533e2e4..3ee301a98 100644
--- a/pkg/appStore/deployment/service/AppStoreDeploymentService.go
+++ b/pkg/appStore/deployment/service/AppStoreDeploymentService.go
@@ -653,31 +653,18 @@ func (impl AppStoreDeploymentServiceImpl) GetAllInstalledAppsByAppStoreId(w http
 	}
 	var installedAppsEnvResponse []appStoreBean.InstalledAppsResponse
 	for _, a := range installedApps {
-		var status string
-		if util2.IsBaseStack() || util2.IsHelmApp(a.AppOfferingMode) || util.IsHelmApp(a.DeploymentAppType) {
-			status, err = impl.appStoreDeploymentHelmService.GetAppStatus(a, w, r, token)
-		} else {
-			status, err = impl.appStoreDeploymentArgoCdService.GetAppStatus(a, w, r, token)
-		}
-		if apiErr, ok := err.(*util.ApiError); ok {
-			if apiErr.Code == constants.AppDetailResourceTreeNotFound {
-				status = "Not Found"
-			}
-		} else if err != nil {
-			impl.logger.Error(err)
-			return nil, err
-		}
 		installedAppRes := appStoreBean.InstalledAppsResponse{
 			EnvironmentName:              a.EnvironmentName,
 			AppName:                      a.AppName,
 			DeployedAt:                   a.UpdatedOn,
 			DeployedBy:                   a.EmailId,
-			Status:                       status,
+			Status:                       a.AppStatus,
 			AppStoreApplicationVersionId: a.AppStoreApplicationVersionId,
 			InstalledAppVersionId:        a.InstalledAppVersionId,
 			InstalledAppsId:              a.InstalledAppId,
 			EnvironmentId:                a.EnvironmentId,
 			AppOfferingMode:              a.AppOfferingMode,
+			DeploymentAppType:            a.DeploymentAppType,
 		}
 
 		// if hyperion mode app, then fill clusterId and namespace
@@ -697,6 +684,10 @@ func (impl AppStoreDeploymentServiceImpl) GetAllInstalledAppsByAppStoreId(w http
 }
 
 func (impl AppStoreDeploymentServiceImpl) DeleteInstalledApp(ctx context.Context, installAppVersionRequest *appStoreBean.InstallAppVersionDTO) (*appStoreBean.InstallAppVersionDTO, error) {
+	installAppVersionRequest.InstalledAppDeleteResponse = &appStoreBean.InstalledAppDeleteResponseDTO{
+		DeleteInitiated:  false,
+		ClusterReachable: true,
+	}
 	dbConnection := impl.installedAppRepository.GetConnection()
 	tx, err := dbConnection.Begin()
 	if err != nil {
@@ -710,6 +701,11 @@ func (impl AppStoreDeploymentServiceImpl) DeleteInstalledApp(ctx context.Context
 		impl.logger.Errorw("fetching error", "err", err)
 		return nil, err
 	}
+	if len(environment.Cluster.ErrorInConnecting) > 0 {
+		installAppVersionRequest.InstalledAppDeleteResponse.ClusterReachable = false
+		installAppVersionRequest.InstalledAppDeleteResponse.ClusterName = environment.Cluster.ClusterName
+	}
+
 	app, err := impl.appRepository.FindById(installAppVersionRequest.AppId)
 	if err != nil {
 		return nil, err
@@ -724,6 +720,12 @@ func (impl AppStoreDeploymentServiceImpl) DeleteInstalledApp(ctx context.Context
 		if util2.IsBaseStack() || util2.IsHelmApp(app.AppOfferingMode) || util.IsHelmApp(model.DeploymentAppType) {
 			err = impl.appStoreDeploymentHelmService.DeleteDeploymentApp(ctx, app.AppName, environment.Name, installAppVersionRequest)
 		} else {
+			if !installAppVersionRequest.InstalledAppDeleteResponse.ClusterReachable {
+				impl.logger.Errorw("cluster connection error", "err", environment.Cluster.ErrorInConnecting)
+				if !installAppVersionRequest.NonCascadeDelete {
+					return installAppVersionRequest, nil
+				}
+			}
 			err = impl.appStoreDeploymentArgoCdService.DeleteDeploymentApp(ctx, app.AppName, environment.Name, installAppVersionRequest)
 		}
 		if err != nil {
@@ -738,7 +740,6 @@ func (impl AppStoreDeploymentServiceImpl) DeleteInstalledApp(ctx context.Context
 			impl.logger.Errorw("error while creating install app", "error", err)
 			return nil, err
 		}
-
 	} else {
 		//soft delete app
 		app.Active = false
@@ -795,7 +796,7 @@ func (impl AppStoreDeploymentServiceImpl) DeleteInstalledApp(ctx context.Context
 		impl.logger.Errorw("error in commit db transaction on delete", "err", err)
 		return nil, err
 	}
-
+	installAppVersionRequest.InstalledAppDeleteResponse.DeleteInitiated = true
 	return installAppVersionRequest, nil
 }
 
diff --git a/pkg/appStore/deployment/service/InstalledAppService.go b/pkg/appStore/deployment/service/InstalledAppService.go
index c8963e219..fc4af88cd 100644
--- a/pkg/appStore/deployment/service/InstalledAppService.go
+++ b/pkg/appStore/deployment/service/InstalledAppService.go
@@ -1129,6 +1129,7 @@ func (impl InstalledAppServiceImpl) MarkGitOpsInstalledAppsDeletedIfArgoAppIsDel
 	//make call to delete it from pipeline DB
 	deleteRequest := &appStoreBean.InstallAppVersionDTO{}
 	deleteRequest.ForceDelete = false
+	deleteRequest.NonCascadeDelete = false
 	deleteRequest.AcdPartialDelete = false
 	deleteRequest.InstalledAppId = installedApp.Id
 	deleteRequest.AppId = installedApp.AppId
diff --git a/pkg/appStore/deployment/tool/AppStoreDeploymentHelmService.go b/pkg/appStore/deployment/tool/AppStoreDeploymentHelmService.go
index 8437f763b..cb81a0c86 100644
--- a/pkg/appStore/deployment/tool/AppStoreDeploymentHelmService.go
+++ b/pkg/appStore/deployment/tool/AppStoreDeploymentHelmService.go
@@ -3,6 +3,9 @@ package appStoreDeploymentTool
 import (
 	"context"
 	"errors"
+	"net/http"
+	"time"
+
 	client "github.com/devtron-labs/devtron/api/helm-app"
 	openapi "github.com/devtron-labs/devtron/api/helm-app/openapiClient"
 	"github.com/devtron-labs/devtron/internal/constants"
@@ -12,12 +15,10 @@ import (
 	"github.com/devtron-labs/devtron/pkg/appStore/deployment/repository"
 	appStoreDiscoverRepository "github.com/devtron-labs/devtron/pkg/appStore/discover/repository"
 	clusterRepository "github.com/devtron-labs/devtron/pkg/cluster/repository"
-	"github.com/ghodss/yaml"
 	"github.com/go-pg/pg"
 	"go.opentelemetry.io/otel"
 	"go.uber.org/zap"
-	"net/http"
-	"time"
+	"sigs.k8s.io/yaml"
 )
 
 type AppStoreDeploymentHelmService interface {
@@ -134,6 +135,9 @@ func (impl AppStoreDeploymentHelmServiceImpl) GetAppStatus(installedAppAndEnvDet
 }
 
 func (impl AppStoreDeploymentHelmServiceImpl) DeleteInstalledApp(ctx context.Context, appName string, environmentName string, installAppVersionRequest *appStoreBean.InstallAppVersionDTO, installedApps *repository.InstalledApps, dbTransaction *pg.Tx) error {
+	if installAppVersionRequest.ForceDelete {
+		return nil
+	}
 	appIdentifier := &client.AppIdentifier{
 		ClusterId:   installAppVersionRequest.ClusterId,
 		ReleaseName: installAppVersionRequest.AppName,
diff --git a/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go b/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go
index 5b087fb75..1fccab1f5 100644
--- a/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go
+++ b/pkg/appStore/deployment/tool/gitops/AppStoreDeploymentArgoCdService.go
@@ -339,9 +339,11 @@ func (impl AppStoreDeploymentArgoCdServiceImpl) RollbackRelease(ctx context.Cont
 	return installedApp, true, nil
 }
 
-func (impl AppStoreDeploymentArgoCdServiceImpl) deleteACD(acdAppName string, ctx context.Context) error {
+func (impl AppStoreDeploymentArgoCdServiceImpl) deleteACD(acdAppName string, ctx context.Context, isNonCascade bool) error {
 	req := new(application.ApplicationDeleteRequest)
 	req.Name = &acdAppName
+	cascadeDelete := !isNonCascade
+	req.Cascade = &cascadeDelete
 	if ctx == nil {
 		impl.Logger.Errorw("err in delete ACD for AppStore, ctx is NULL", "acdAppName", acdAppName)
 		return fmt.Errorf("context is null")
@@ -621,14 +623,15 @@ func (impl AppStoreDeploymentArgoCdServiceImpl) updateValuesYaml(environment *cl
 
 func (impl AppStoreDeploymentArgoCdServiceImpl) DeleteDeploymentApp(ctx context.Context, appName string, environmentName string, installAppVersionRequest *appStoreBean.InstallAppVersionDTO) error {
 	acdAppName := appName + "-" + environmentName
-	err := impl.deleteACD(acdAppName, ctx)
+	var err error
+	err = impl.deleteACD(acdAppName, ctx, installAppVersionRequest.NonCascadeDelete)
 	if err != nil {
 		impl.Logger.Errorw("error in deleting ACD ", "name", acdAppName, "err", err)
 		if installAppVersionRequest.ForceDelete {
 			impl.Logger.Warnw("error while deletion of app in acd, continue to delete in db as this operation is force delete", "error", err)
 		} else {
 			//statusError, _ := err.(*errors2.StatusError)
-			if strings.Contains(err.Error(), "code = NotFound") {
+			if !installAppVersionRequest.NonCascadeDelete && strings.Contains(err.Error(), "code = NotFound") {
 				err = &util.ApiError{
 					UserMessage:     "Could not delete as application not found in argocd",
 					InternalMessage: err.Error(),
diff --git a/pkg/bean/app.go b/pkg/bean/app.go
index c0709fd04..1de218431 100644
--- a/pkg/bean/app.go
+++ b/pkg/bean/app.go
@@ -181,6 +181,11 @@ const (
 	EXTERNAL PipelineType = "EXTERNAL"
 )
 
+const (
+	CASCADE_DELETE int = iota
+	NON_CASCADE_DELETE
+	FORCE_DELETE
+)
 const (
 	WEBHOOK_SELECTOR_UNIQUE_ID_NAME          string = "unique id"
 	WEBHOOK_SELECTOR_REPOSITORY_URL_NAME     string = "repository url"
@@ -529,17 +534,25 @@ type Strategy struct {
 }
 
 type CdPipelines struct {
-	Pipelines []*CDPipelineConfigObject `json:"pipelines,omitempty" validate:"dive"`
-	AppId     int                       `json:"appId,omitempty"  validate:"number,required" `
-	UserId    int32                     `json:"-"`
+	Pipelines         []*CDPipelineConfigObject `json:"pipelines,omitempty" validate:"dive"`
+	AppId             int                       `json:"appId,omitempty"  validate:"number,required" `
+	UserId            int32                     `json:"-"`
+	AppDeleteResponse *AppDeleteResponseDTO     `json:"deleteResponse,omitempty"`
+}
+
+type AppDeleteResponseDTO struct {
+	DeleteInitiated  bool   `json:"deleteInitiated"`
+	ClusterReachable bool   `json:"clusterReachable"`
+	ClusterName      string `json:"clusterName"`
 }
 
 type CDPatchRequest struct {
-	Pipeline    *CDPipelineConfigObject `json:"pipeline,omitempty"`
-	AppId       int                     `json:"appId,omitempty"`
-	Action      CdPatchAction           `json:"action,omitempty"`
-	UserId      int32                   `json:"-"`
-	ForceDelete bool                    `json:"-"`
+	Pipeline         *CDPipelineConfigObject `json:"pipeline,omitempty"`
+	AppId            int                     `json:"appId,omitempty"`
+	Action           CdPatchAction           `json:"action,omitempty"`
+	UserId           int32                   `json:"-"`
+	ForceDelete      bool                    `json:"-"`
+	NonCascadeDelete bool                    `json:"-"`
 }
 
 type CdPatchAction int
@@ -722,12 +735,13 @@ const (
 )
 
 type CdBulkActionRequestDto struct {
-	Action      CdBulkAction `json:"action"`
-	EnvIds      []int        `json:"envIds"`
-	AppIds      []int        `json:"appIds"`
-	ProjectIds  []int        `json:"projectIds"`
-	ForceDelete bool         `json:"forceDelete"`
-	UserId      int32        `json:"-"`
+	Action        CdBulkAction `json:"action"`
+	EnvIds        []int        `json:"envIds"`
+	AppIds        []int        `json:"appIds"`
+	ProjectIds    []int        `json:"projectIds"`
+	ForceDelete   bool         `json:"forceDelete"`
+	CascadeDelete bool         `json:"cascadeDelete"`
+	UserId        int32        `json:"-"`
 }
 
 type CdBulkActionResponseDto struct {
diff --git a/pkg/bulkAction/BulkUpdateService.go b/pkg/bulkAction/BulkUpdateService.go
index c3af4da40..8f22cdc2f 100644
--- a/pkg/bulkAction/BulkUpdateService.go
+++ b/pkg/bulkAction/BulkUpdateService.go
@@ -1515,7 +1515,13 @@ func (impl BulkUpdateServiceImpl) PerformBulkActionOnCdPipelines(dto *CdBulkActi
 	ctx context.Context, dryRun bool, impactedAppWfIds []int, impactedCiPipelineIds []int) (*PipelineAndWfBulkActionResponseDto, error) {
 	switch dto.Action {
 	case CD_BULK_DELETE:
-		bulkDeleteResp, err := impl.PerformBulkDeleteActionOnCdPipelines(impactedPipelines, ctx, dryRun, dto.ForceDelete, dto.DeleteWfAndCiPipeline, impactedAppWfIds, impactedCiPipelineIds, dto.UserId)
+		deleteAction := bean2.CASCADE_DELETE
+		if dto.ForceDelete {
+			deleteAction = bean2.FORCE_DELETE
+		} else if dto.NonCascadeDelete {
+			deleteAction = bean2.NON_CASCADE_DELETE
+		}
+		bulkDeleteResp, err := impl.PerformBulkDeleteActionOnCdPipelines(impactedPipelines, ctx, dryRun, deleteAction, dto.DeleteWfAndCiPipeline, impactedAppWfIds, impactedCiPipelineIds, dto.UserId)
 		if err != nil {
 			impl.logger.Errorw("error in cd pipelines bulk deletion")
 		}
@@ -1525,8 +1531,7 @@ func (impl BulkUpdateServiceImpl) PerformBulkActionOnCdPipelines(dto *CdBulkActi
 	}
 }
 
-func (impl BulkUpdateServiceImpl) PerformBulkDeleteActionOnCdPipelines(impactedPipelines []*pipelineConfig.Pipeline, ctx context.Context,
-	dryRun, forceDelete, deleteWfAndCiPipeline bool, impactedAppWfIds, impactedCiPipelineIds []int, userId int32) (*PipelineAndWfBulkActionResponseDto, error) {
+func (impl BulkUpdateServiceImpl) PerformBulkDeleteActionOnCdPipelines(impactedPipelines []*pipelineConfig.Pipeline, ctx context.Context, dryRun bool, deleteAction int, deleteWfAndCiPipeline bool, impactedAppWfIds, impactedCiPipelineIds []int, userId int32) (*PipelineAndWfBulkActionResponseDto, error) {
 	var cdPipelineRespDtos []*CdBulkActionResponseDto
 	var wfRespDtos []*WfBulkActionResponseDto
 	var ciPipelineRespDtos []*CiBulkActionResponseDto
@@ -1547,13 +1552,17 @@ func (impl BulkUpdateServiceImpl) PerformBulkDeleteActionOnCdPipelines(impactedP
 			EnvironmentName: pipeline.Environment.Name,
 		}
 		if !dryRun {
-			err := impl.pipelineBuilder.DeleteCdPipeline(pipeline, ctx, forceDelete, true, userId)
+			// Delete Cd pipeline
+			deleteResponse, err := impl.pipelineBuilder.DeleteCdPipeline(pipeline, ctx, deleteAction, true, userId)
 			if err != nil {
 				impl.logger.Errorw("error in deleting cd pipeline", "err", err, "pipelineId", pipeline.Id)
 				respDto.DeletionResult = fmt.Sprintf("Not able to delete pipeline, %v", err)
+			} else if !(deleteResponse.DeleteInitiated || deleteResponse.ClusterReachable) {
+				respDto.DeletionResult = fmt.Sprintf("Not able to delete pipeline, %s, piplineId, %v", "cluster connection error", pipeline.Id)
 			} else {
 				respDto.DeletionResult = "Pipeline deleted successfully."
 			}
+
 		}
 		cdPipelineRespDtos = append(cdPipelineRespDtos, respDto)
 	}
diff --git a/pkg/bulkAction/bean.go b/pkg/bulkAction/bean.go
index 54e73bd01..3b8fbb194 100644
--- a/pkg/bulkAction/bean.go
+++ b/pkg/bulkAction/bean.go
@@ -110,6 +110,7 @@ type CdBulkActionRequestDto struct {
 	ProjectNames          []string     `json:"projectNames"`
 	DeleteWfAndCiPipeline bool         `json:"deleteWfAndCiPipeline"`
 	ForceDelete           bool         `json:"forceDelete"`
+	NonCascadeDelete      bool         `json:"nonCascadeDelete"`
 	UserId                int32        `json:"-"`
 }
 
diff --git a/pkg/chart/ChartService.go b/pkg/chart/ChartService.go
index b78fb05f8..d85e1d830 100644
--- a/pkg/chart/ChartService.go
+++ b/pkg/chart/ChartService.go
@@ -22,6 +22,7 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
+
 	"go.opentelemetry.io/otel"
 
 	"github.com/devtron-labs/devtron/internal/constants"
@@ -54,13 +55,13 @@ import (
 	"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
 	"github.com/devtron-labs/devtron/internal/util"
 	util2 "github.com/devtron-labs/devtron/util"
-	"github.com/ghodss/yaml"
 	"github.com/go-pg/pg"
 	"github.com/juju/errors"
 	"github.com/xeipuuv/gojsonschema"
 	"go.uber.org/zap"
 	"k8s.io/helm/pkg/chartutil"
 	"k8s.io/helm/pkg/proto/hapi/chart"
+	"sigs.k8s.io/yaml"
 )
 
 type TemplateRequest struct {
diff --git a/pkg/chartRepo/ChartRepositoryService.go b/pkg/chartRepo/ChartRepositoryService.go
index 4fdf6c8c1..54f67c5fb 100644
--- a/pkg/chartRepo/ChartRepositoryService.go
+++ b/pkg/chartRepo/ChartRepositoryService.go
@@ -22,6 +22,13 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"io"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+	"time"
+
 	"github.com/devtron-labs/devtron/internal/sql/repository"
 	"github.com/devtron-labs/devtron/internal/util"
 	chartRepoRepository "github.com/devtron-labs/devtron/pkg/chartRepo/repository"
@@ -29,19 +36,13 @@ import (
 	serverEnvConfig "github.com/devtron-labs/devtron/pkg/server/config"
 	"github.com/devtron-labs/devtron/pkg/sql"
 	util2 "github.com/devtron-labs/devtron/pkg/util"
-	"github.com/ghodss/yaml"
 	"github.com/google/uuid"
 	"go.uber.org/zap"
-	"io"
-	"io/ioutil"
 	"k8s.io/helm/pkg/getter"
 	"k8s.io/helm/pkg/helm/environment"
 	"k8s.io/helm/pkg/repo"
 	"k8s.io/helm/pkg/version"
-	"net/http"
-	"net/url"
-	"strings"
-	"time"
+	"sigs.k8s.io/yaml"
 )
 
 // secret keys
@@ -572,6 +573,12 @@ func (impl *ChartRepositoryServiceImpl) GetChartRepoListMin() ([]*ChartRepoDto,
 
 func (impl *ChartRepositoryServiceImpl) ValidateChartRepo(request *ChartRepoDto) *DetailedErrorHelmRepoValidation {
 	var detailedErrorHelmRepoValidation DetailedErrorHelmRepoValidation
+	if len(request.Name) < 3 || strings.Contains(request.Name, " ") {
+		impl.logger.Errorw("name should not contain white spaces and should contain min 3 chars")
+		detailedErrorHelmRepoValidation.CustomErrMsg = fmt.Sprintf("name should not contain white spaces and should have min 3 chars")
+		detailedErrorHelmRepoValidation.ActualErrMsg = fmt.Sprintf("name should not contain white spaces and should have min 3 chars")
+		return &detailedErrorHelmRepoValidation
+	}
 	helmRepoConfig := &repo.Entry{
 		Name:     request.Name,
 		URL:      request.Url,
diff --git a/pkg/cluster/ClusterService.go b/pkg/cluster/ClusterService.go
index ad06d8d23..a800c351b 100644
--- a/pkg/cluster/ClusterService.go
+++ b/pkg/cluster/ClusterService.go
@@ -177,6 +177,7 @@ type ClusterService interface {
 	FindAllNamespacesByUserIdAndClusterId(userId int32, clusterId int, isActionUserSuperAdmin bool) ([]string, error)
 	FindAllForClusterByUserId(userId int32, isActionUserSuperAdmin bool) ([]ClusterBean, error)
 	FetchRolesFromGroup(userId int32) ([]*repository2.RoleModel, error)
+	HandleErrorInClusterConnections(clusters []*ClusterBean, respMap map[int]error, clusterExistInDb bool)
 	ConnectClustersInBatch(clusters []*ClusterBean, clusterExistInDb bool)
 	ConvertClusterBeanToCluster(clusterBean *ClusterBean, userId int32) *repository.Cluster
 	ConvertClusterBeanObjectToCluster(bean *ClusterBean) *v1alpha1.Cluster
diff --git a/pkg/cluster/EnvironmentService.go b/pkg/cluster/EnvironmentService.go
index eeb876d52..e3db5e6ad 100644
--- a/pkg/cluster/EnvironmentService.go
+++ b/pkg/cluster/EnvironmentService.go
@@ -87,6 +87,7 @@ type EnvironmentService interface {
 	GetByClusterId(id int) ([]*EnvironmentBean, error)
 	GetCombinedEnvironmentListForDropDown(emailId string, isActionUserSuperAdmin bool, auth func(email string, object []string) map[string]bool) ([]*ClusterEnvDto, error)
 	GetCombinedEnvironmentListForDropDownByClusterIds(token string, clusterIds []int, auth func(token string, object string) bool) ([]*ClusterEnvDto, error)
+	HandleErrorInClusterConnections(clusters []*ClusterBean, respMap map[int]error, clusterExistInDb bool)
 }
 
 type EnvironmentServiceImpl struct {
@@ -678,3 +679,7 @@ func (impl EnvironmentServiceImpl) Delete(deleteReq *EnvironmentBean, userId int
 	}
 	return nil
 }
+
+func (impl EnvironmentServiceImpl) HandleErrorInClusterConnections(clusters []*ClusterBean, respMap map[int]error, clusterExistInDb bool) {
+	impl.clusterService.HandleErrorInClusterConnections(clusters, respMap, clusterExistInDb)
+}
diff --git a/pkg/gitops/GitOpsConfigService.go b/pkg/gitops/GitOpsConfigService.go
index c0b5f3068..9c3ef5bff 100644
--- a/pkg/gitops/GitOpsConfigService.go
+++ b/pkg/gitops/GitOpsConfigService.go
@@ -21,11 +21,6 @@ import (
 	"context"
 	"encoding/json"
 	"fmt"
-	cluster3 "github.com/argoproj/argo-cd/v2/pkg/apiclient/cluster"
-	cluster2 "github.com/devtron-labs/devtron/client/argocdServer/cluster"
-	"github.com/devtron-labs/devtron/pkg/sql"
-	util3 "github.com/devtron-labs/devtron/pkg/util"
-	"github.com/devtron-labs/devtron/util/argo"
 	"math/rand"
 	"net/http"
 	"net/url"
@@ -35,18 +30,23 @@ import (
 	"strings"
 	"time"
 
+	cluster3 "github.com/argoproj/argo-cd/v2/pkg/apiclient/cluster"
 	bean2 "github.com/devtron-labs/devtron/api/bean"
 	"github.com/devtron-labs/devtron/client/argocdServer"
+	cluster2 "github.com/devtron-labs/devtron/client/argocdServer/cluster"
 	"github.com/devtron-labs/devtron/internal/sql/repository"
 	"github.com/devtron-labs/devtron/internal/util"
 	"github.com/devtron-labs/devtron/pkg/cluster"
+	"github.com/devtron-labs/devtron/pkg/sql"
+	util3 "github.com/devtron-labs/devtron/pkg/util"
 	util2 "github.com/devtron-labs/devtron/util"
-	"github.com/ghodss/yaml"
+	"github.com/devtron-labs/devtron/util/argo"
 	"github.com/go-pg/pg"
 	"github.com/microsoft/azure-devops-go-api/azuredevops"
 	"github.com/xanzy/go-gitlab"
 	"go.uber.org/zap"
 	"k8s.io/apimachinery/pkg/api/errors"
+	"sigs.k8s.io/yaml"
 )
 
 type GitOpsConfigService interface {
diff --git a/pkg/pipeline/PipelineBuilder.go b/pkg/pipeline/PipelineBuilder.go
index 0b882b727..bd37067d8 100644
--- a/pkg/pipeline/PipelineBuilder.go
+++ b/pkg/pipeline/PipelineBuilder.go
@@ -106,7 +106,8 @@ type PipelineBuilder interface {
 	CreateCdPipelines(cdPipelines *bean.CdPipelines, ctx context.Context) (*bean.CdPipelines, error)
 	GetApp(appId int) (application *bean.CreateAppDTO, err error)
 	PatchCdPipelines(cdPipelines *bean.CDPatchRequest, ctx context.Context) (*bean.CdPipelines, error)
-	DeleteCdPipeline(pipeline *pipelineConfig.Pipeline, ctx context.Context, forceDelete bool, acdDelete bool, userId int32) (err error)
+	DeleteCdPipeline(pipeline *pipelineConfig.Pipeline, ctx context.Context, deleteAction int, acdDelete bool, userId int32) (*bean.AppDeleteResponseDTO, error)
+	DeleteACDAppCdPipelineWithNonCascade(pipeline *pipelineConfig.Pipeline, ctx context.Context, forceDelete bool, userId int32) (err error)
 	ChangeDeploymentType(ctx context.Context, request *bean.DeploymentAppTypeChangeRequest) (*bean.DeploymentAppTypeChangeResponse, error)
 	ChangePipelineDeploymentType(ctx context.Context, request *bean.DeploymentAppTypeChangeRequest) (*bean.DeploymentAppTypeChangeResponse, error)
 	TriggerDeploymentAfterTypeChange(ctx context.Context, request *bean.DeploymentAppTypeChangeRequest) (*bean.DeploymentAppTypeChangeResponse, error)
@@ -169,6 +170,7 @@ type PipelineBuilderImpl struct {
 	ecrConfig                        *EcrConfig
 	envConfigOverrideRepository      chartConfig.EnvConfigOverrideRepository
 	environmentRepository            repository2.EnvironmentRepository
+	clusterRepository                repository2.ClusterRepository
 	pipelineConfigRepository         chartConfig.PipelineConfigRepository
 	mergeUtil                        util.MergeUtil
 	appWorkflowRepository            appWorkflow.AppWorkflowRepository
@@ -228,6 +230,7 @@ func NewPipelineBuilderImpl(logger *zap.SugaredLogger,
 	ecrConfig *EcrConfig,
 	envConfigOverrideRepository chartConfig.EnvConfigOverrideRepository,
 	environmentRepository repository2.EnvironmentRepository,
+	clusterRepository repository2.ClusterRepository,
 	pipelineConfigRepository chartConfig.PipelineConfigRepository,
 	mergeUtil util.MergeUtil,
 	appWorkflowRepository appWorkflow.AppWorkflowRepository,
@@ -279,6 +282,7 @@ func NewPipelineBuilderImpl(logger *zap.SugaredLogger,
 		ecrConfig:                        ecrConfig,
 		envConfigOverrideRepository:      envConfigOverrideRepository,
 		environmentRepository:            environmentRepository,
+		clusterRepository:                clusterRepository,
 		pipelineConfigRepository:         pipelineConfigRepository,
 		mergeUtil:                        mergeUtil,
 		appWorkflowRepository:            appWorkflowRepository,
@@ -1812,6 +1816,12 @@ func (impl PipelineBuilderImpl) PatchCdPipelines(cdPipelines *bean.CDPatchReques
 		AppId:     cdPipelines.AppId,
 		Pipelines: []*bean.CDPipelineConfigObject{cdPipelines.Pipeline},
 	}
+	deleteAction := bean.CASCADE_DELETE
+	if cdPipelines.ForceDelete {
+		deleteAction = bean.FORCE_DELETE
+	} else if cdPipelines.NonCascadeDelete {
+		deleteAction = bean.NON_CASCADE_DELETE
+	}
 	switch cdPipelines.Action {
 	case bean.CD_CREATE:
 		return impl.CreateCdPipelines(pipelineRequest, ctx)
@@ -1824,7 +1834,8 @@ func (impl PipelineBuilderImpl) PatchCdPipelines(cdPipelines *bean.CDPatchReques
 			impl.logger.Errorw("error in getting cd pipeline by id", "err", err, "id", cdPipelines.Pipeline.Id)
 			return pipelineRequest, err
 		}
-		err = impl.DeleteCdPipeline(pipeline, ctx, cdPipelines.ForceDelete, false, cdPipelines.UserId)
+		deleteResponse, err := impl.DeleteCdPipeline(pipeline, ctx, deleteAction, false, cdPipelines.UserId)
+		pipelineRequest.AppDeleteResponse = deleteResponse
 		return pipelineRequest, err
 	case bean.CD_DELETE_PARTIAL:
 		pipeline, err := impl.pipelineRepository.FindById(cdPipelines.Pipeline.Id)
@@ -1832,64 +1843,86 @@ func (impl PipelineBuilderImpl) PatchCdPipelines(cdPipelines *bean.CDPatchReques
 			impl.logger.Errorw("error in getting cd pipeline by id", "err", err, "id", cdPipelines.Pipeline.Id)
 			return pipelineRequest, err
 		}
-		err = impl.DeleteCdPipelinePartial(pipeline, ctx, cdPipelines.ForceDelete, cdPipelines.UserId)
+		deleteResponse, err := impl.DeleteCdPipelinePartial(pipeline, ctx, deleteAction)
+		pipelineRequest.AppDeleteResponse = deleteResponse
 		return pipelineRequest, err
 	default:
 		return nil, &util.ApiError{Code: "404", HttpStatusCode: 404, UserMessage: "operation not supported"}
 	}
 }
 
-func (impl PipelineBuilderImpl) DeleteCdPipeline(pipeline *pipelineConfig.Pipeline, ctx context.Context, forceDelete, deleteFromAcd bool, userId int32) (err error) {
+func (impl PipelineBuilderImpl) DeleteCdPipeline(pipeline *pipelineConfig.Pipeline, ctx context.Context, deleteAction int, deleteFromAcd bool, userId int32) (*bean.AppDeleteResponseDTO, error) {
+	cascadeDelete := true
+	forceDelete := false
+	deleteResponse := &bean.AppDeleteResponseDTO{
+		DeleteInitiated:  false,
+		ClusterReachable: true,
+	}
+	if deleteAction == bean.FORCE_DELETE {
+		forceDelete = true
+		cascadeDelete = false
+	} else if deleteAction == bean.NON_CASCADE_DELETE {
+		cascadeDelete = false
+	}
+	// updating cluster reachable flag
+	clusterBean, err := impl.clusterRepository.FindById(pipeline.Environment.ClusterId)
+	if err != nil {
+		impl.logger.Errorw("error in getting cluster details", "err", err, "clusterId", pipeline.Environment.ClusterId)
+	}
+	deleteResponse.ClusterName = clusterBean.ClusterName
+	if len(clusterBean.ErrorInConnecting) > 0 {
+		deleteResponse.ClusterReachable = false
+	}
 	//getting children CD pipeline details
 	childNodes, err := impl.appWorkflowRepository.FindWFCDMappingByParentCDPipelineId(pipeline.Id)
 	if err != nil && err != pg.ErrNoRows {
 		impl.logger.Errorw("error in getting children cd details", "err", err)
-		return err
+		return deleteResponse, err
 	} else if len(childNodes) > 0 {
 		impl.logger.Debugw("cannot delete cd pipeline, contains children cd")
-		return fmt.Errorf("Please delete children CD pipelines before deleting this pipeline.")
+		return deleteResponse, fmt.Errorf("Please delete children CD pipelines before deleting this pipeline.")
 	}
 	//getting deployment group for this pipeline
 	deploymentGroupNames, err := impl.deploymentGroupRepository.GetNamesByAppIdAndEnvId(pipeline.EnvironmentId, pipeline.AppId)
 	if err != nil && err != pg.ErrNoRows {
 		impl.logger.Errorw("error in getting deployment group names by appId and envId", "err", err)
-		return err
+		return deleteResponse, err
 	} else if len(deploymentGroupNames) > 0 {
 		groupNamesByte, err := json.Marshal(deploymentGroupNames)
 		if err != nil {
 			impl.logger.Errorw("error in marshaling deployment group names", "err", err, "deploymentGroupNames", deploymentGroupNames)
 		}
 		impl.logger.Debugw("cannot delete cd pipeline, is being used in deployment group")
-		return fmt.Errorf("Please remove this CD pipeline from deployment groups : %s", string(groupNamesByte))
+		return deleteResponse, fmt.Errorf("Please remove this CD pipeline from deployment groups : %s", string(groupNamesByte))
 	}
 	dbConnection := impl.pipelineRepository.GetConnection()
 	tx, err := dbConnection.Begin()
 	if err != nil {
-		return err
+		return deleteResponse, err
 	}
 	// Rollback tx on error.
 	defer tx.Rollback()
 	if err = impl.ciCdPipelineOrchestrator.DeleteCdPipeline(pipeline.Id, userId, tx); err != nil {
 		impl.logger.Errorw("err in deleting pipeline from db", "id", pipeline, "err", err)
-		return err
+		return deleteResponse, err
 	}
 	// delete entry in app_status table
 	err = impl.appStatusRepository.Delete(tx, pipeline.AppId, pipeline.EnvironmentId)
 	if err != nil && err != pg.ErrNoRows {
 		impl.logger.Errorw("err in deleting app_status from db", "appId", pipeline.AppId, "envId", pipeline.EnvironmentId, "err", err)
-		return err
+		return deleteResponse, err
 	}
 	//delete app workflow mapping
 	appWorkflowMapping, err := impl.appWorkflowRepository.FindWFCDMappingByCDPipelineId(pipeline.Id)
 	if err != nil {
 		impl.logger.Errorw("error in deleting workflow mapping", "err", err)
-		return err
+		return deleteResponse, err
 	}
 	if appWorkflowMapping.ParentType == appWorkflow.WEBHOOK {
 		childNodes, err := impl.appWorkflowRepository.FindWFCDMappingByExternalCiId(appWorkflowMapping.ParentId)
 		if err != nil && !util.IsErrNoRows(err) {
 			impl.logger.Errorw("error in fetching external ci", "err", err)
-			return err
+			return deleteResponse, err
 		}
 		noOtherChildNodes := true
 		for _, childNode := range childNodes {
@@ -1901,7 +1934,7 @@ func (impl PipelineBuilderImpl) DeleteCdPipeline(pipeline *pipelineConfig.Pipeli
 			externalCiPipeline, err := impl.ciPipelineRepository.FindExternalCiById(appWorkflowMapping.ParentId)
 			if err != nil {
 				impl.logger.Errorw("error in deleting workflow mapping", "err", err)
-				return err
+				return deleteResponse, err
 			}
 			externalCiPipeline.Active = false
 			externalCiPipeline.UpdatedOn = time.Now()
@@ -1909,49 +1942,53 @@ func (impl PipelineBuilderImpl) DeleteCdPipeline(pipeline *pipelineConfig.Pipeli
 			_, err = impl.ciPipelineRepository.UpdateExternalCi(externalCiPipeline, tx)
 			if err != nil {
 				impl.logger.Errorw("error in deleting workflow mapping", "err", err)
-				return err
+				return deleteResponse, err
 			}
 
 			appWorkflow, err := impl.appWorkflowRepository.FindById(appWorkflowMapping.AppWorkflowId)
 			if err != nil {
 				impl.logger.Errorw("error in deleting workflow mapping", "err", err)
-				return err
+				return deleteResponse, err
 			}
 			err = impl.appWorkflowRepository.DeleteAppWorkflow(appWorkflow, tx)
 			if err != nil {
 				impl.logger.Errorw("error in deleting workflow mapping", "err", err)
-				return err
+				return deleteResponse, err
 			}
 		}
 	}
 	err = impl.appWorkflowRepository.DeleteAppWorkflowMapping(appWorkflowMapping, tx)
 	if err != nil {
 		impl.logger.Errorw("error in deleting workflow mapping", "err", err)
-		return err
+		return deleteResponse, err
 	}
 
 	if pipeline.PreStageConfig != "" {
 		err = impl.prePostCdScriptHistoryService.CreatePrePostCdScriptHistory(pipeline, tx, repository4.PRE_CD_TYPE, false, 0, time.Time{})
 		if err != nil {
 			impl.logger.Errorw("error in creating pre cd script entry", "err", err, "pipeline", pipeline)
-			return err
+			return deleteResponse, err
 		}
 	}
 	if pipeline.PostStageConfig != "" {
 		err = impl.prePostCdScriptHistoryService.CreatePrePostCdScriptHistory(pipeline, tx, repository4.POST_CD_TYPE, false, 0, time.Time{})
 		if err != nil {
 			impl.logger.Errorw("error in creating post cd script entry", "err", err, "pipeline", pipeline)
-			return err
+			return deleteResponse, err
 		}
 	}
 	//delete app from argo cd, if created
 	if pipeline.DeploymentAppCreated == true {
 		deploymentAppName := fmt.Sprintf("%s-%s", pipeline.App.AppName, pipeline.Environment.Name)
 		if util.IsAcdApp(pipeline.DeploymentAppType) {
-			//todo: provide option for cascading to user
+			if !deleteResponse.ClusterReachable {
+				impl.logger.Errorw("cluster connection error", "err", clusterBean.ErrorInConnecting)
+				if cascadeDelete {
+					return deleteResponse, nil
+				}
+			}
 			impl.logger.Debugw("acd app is already deleted for this pipeline", "pipeline", pipeline)
 			if deleteFromAcd {
-				cascadeDelete := true
 				req := &application2.ApplicationDeleteRequest{
 					Name:    &deploymentAppName,
 					Cascade: &cascadeDelete,
@@ -1963,7 +2000,7 @@ func (impl PipelineBuilderImpl) DeleteCdPipeline(pipeline *pipelineConfig.Pipeli
 						impl.logger.Warnw("error while deletion of app in acd, continue to delete in db as this operation is force delete", "error", err)
 					} else {
 						//statusError, _ := err.(*errors2.StatusError)
-						if strings.Contains(err.Error(), "code = NotFound") {
+						if cascadeDelete && strings.Contains(err.Error(), "code = NotFound") {
 							err = &util.ApiError{
 								UserMessage:     "Could not delete as application not found in argocd",
 								InternalMessage: err.Error(),
@@ -1974,10 +2011,9 @@ func (impl PipelineBuilderImpl) DeleteCdPipeline(pipeline *pipelineConfig.Pipeli
 								InternalMessage: err.Error(),
 							}
 						}
-						return err
+						return deleteResponse, err
 					}
 				}
-
 				impl.logger.Infow("app deleted from argocd", "id", pipeline.Id, "pipelineName", pipeline.Name, "app", deploymentAppName)
 			}
 		} else if util.IsHelmApp(pipeline.DeploymentAppType) {
@@ -1986,16 +2022,16 @@ func (impl PipelineBuilderImpl) DeleteCdPipeline(pipeline *pipelineConfig.Pipeli
 				ReleaseName: deploymentAppName,
 				Namespace:   pipeline.Environment.Namespace,
 			}
-			deleteResponse, err := impl.helmAppService.DeleteApplication(ctx, appIdentifier)
+			deleteResourceResponse, err := impl.helmAppService.DeleteApplication(ctx, appIdentifier)
 			if forceDelete {
 				impl.logger.Warnw("error while deletion of helm application, ignore error and delete from db since force delete req", "error", err, "pipelineId", pipeline.Id)
 			} else {
 				if err != nil {
 					impl.logger.Errorw("error in deleting helm application", "error", err, "appIdentifier", appIdentifier)
-					return err
+					return deleteResponse, err
 				}
-				if deleteResponse == nil || !deleteResponse.GetSuccess() {
-					return errors.New("delete application response unsuccessful")
+				if deleteResourceResponse == nil || !deleteResourceResponse.GetSuccess() {
+					return deleteResponse, errors.New("delete application response unsuccessful")
 				}
 			}
 		}
@@ -2003,49 +2039,75 @@ func (impl PipelineBuilderImpl) DeleteCdPipeline(pipeline *pipelineConfig.Pipeli
 	err = tx.Commit()
 	if err != nil {
 		impl.logger.Errorw("error in committing db transaction", "err", err)
-		return err
+		return deleteResponse, err
 	}
-	return nil
+	deleteResponse.DeleteInitiated = true
+	return deleteResponse, nil
 }
 
-func (impl PipelineBuilderImpl) DeleteCdPipelinePartial(pipeline *pipelineConfig.Pipeline, ctx context.Context, forceDelete bool, userId int32) (err error) {
+func (impl PipelineBuilderImpl) DeleteCdPipelinePartial(pipeline *pipelineConfig.Pipeline, ctx context.Context, deleteAction int) (*bean.AppDeleteResponseDTO, error) {
+	cascadeDelete := true
+	forceDelete := false
+	deleteResponse := &bean.AppDeleteResponseDTO{
+		DeleteInitiated:  false,
+		ClusterReachable: true,
+	}
+	if deleteAction == bean.FORCE_DELETE {
+		forceDelete = true
+		cascadeDelete = false
+	} else if deleteAction == bean.NON_CASCADE_DELETE {
+		cascadeDelete = false
+	}
+	//Updating clusterReachable flag
+	clusterBean, err := impl.clusterRepository.FindById(pipeline.Environment.ClusterId)
+	if err != nil {
+		impl.logger.Errorw("error in getting cluster details", "err", err, "clusterId", pipeline.Environment.ClusterId)
+	}
+	deleteResponse.ClusterName = clusterBean.ClusterName
+	if len(clusterBean.ErrorInConnecting) > 0 {
+		deleteResponse.ClusterReachable = false
+	}
 	//getting children CD pipeline details
 	childNodes, err := impl.appWorkflowRepository.FindWFCDMappingByParentCDPipelineId(pipeline.Id)
 	if err != nil && err != pg.ErrNoRows {
 		impl.logger.Errorw("error in getting children cd details", "err", err)
-		return err
+		return deleteResponse, err
 	} else if len(childNodes) > 0 {
 		impl.logger.Debugw("cannot delete cd pipeline, contains children cd")
-		return fmt.Errorf("Please delete children CD pipelines before deleting this pipeline.")
+		return deleteResponse, fmt.Errorf("Please delete children CD pipelines before deleting this pipeline.")
 	}
 	//getting deployment group for this pipeline
 	deploymentGroupNames, err := impl.deploymentGroupRepository.GetNamesByAppIdAndEnvId(pipeline.EnvironmentId, pipeline.AppId)
 	if err != nil && err != pg.ErrNoRows {
 		impl.logger.Errorw("error in getting deployment group names by appId and envId", "err", err)
-		return err
+		return deleteResponse, err
 	} else if len(deploymentGroupNames) > 0 {
 		groupNamesByte, err := json.Marshal(deploymentGroupNames)
 		if err != nil {
 			impl.logger.Errorw("error in marshaling deployment group names", "err", err, "deploymentGroupNames", deploymentGroupNames)
 		}
 		impl.logger.Debugw("cannot delete cd pipeline, is being used in deployment group")
-		return fmt.Errorf("Please remove this CD pipeline from deployment groups : %s", string(groupNamesByte))
+		return deleteResponse, fmt.Errorf("Please remove this CD pipeline from deployment groups : %s", string(groupNamesByte))
 	}
 	dbConnection := impl.pipelineRepository.GetConnection()
 	tx, err := dbConnection.Begin()
 	if err != nil {
-		return err
+		return deleteResponse, err
 	}
 	// Rollback tx on error.
 	defer tx.Rollback()
 
 	//delete app from argo cd, if created
-	if pipeline.DeploymentAppCreated == true && pipeline.DeploymentAppDeleteRequest == false {
+	if pipeline.DeploymentAppCreated && !pipeline.DeploymentAppDeleteRequest {
 		deploymentAppName := fmt.Sprintf("%s-%s", pipeline.App.AppName, pipeline.Environment.Name)
 		if util.IsAcdApp(pipeline.DeploymentAppType) {
-			//todo: provide option for cascading to user
+			if !deleteResponse.ClusterReachable {
+				impl.logger.Errorw("cluster connection error", "err", clusterBean.ErrorInConnecting)
+				if cascadeDelete {
+					return deleteResponse, nil
+				}
+			}
 			impl.logger.Debugw("acd app is already deleted for this pipeline", "pipeline", pipeline)
-			cascadeDelete := true
 			req := &application2.ApplicationDeleteRequest{
 				Name:    &deploymentAppName,
 				Cascade: &cascadeDelete,
@@ -2057,7 +2119,7 @@ func (impl PipelineBuilderImpl) DeleteCdPipelinePartial(pipeline *pipelineConfig
 					impl.logger.Warnw("error while deletion of app in acd, continue to delete in db as this operation is force delete", "error", err)
 				} else {
 					//statusError, _ := err.(*errors2.StatusError)
-					if strings.Contains(err.Error(), "code = NotFound") {
+					if cascadeDelete && strings.Contains(err.Error(), "code = NotFound") {
 						err = &util.ApiError{
 							UserMessage:     "Could not delete as application not found in argocd",
 							InternalMessage: err.Error(),
@@ -2068,7 +2130,7 @@ func (impl PipelineBuilderImpl) DeleteCdPipelinePartial(pipeline *pipelineConfig
 							InternalMessage: err.Error(),
 						}
 					}
-					return err
+					return deleteResponse, err
 				}
 			}
 			impl.logger.Infow("app deleted from argocd", "id", pipeline.Id, "pipelineName", pipeline.Name, "app", deploymentAppName)
@@ -2076,15 +2138,47 @@ func (impl PipelineBuilderImpl) DeleteCdPipelinePartial(pipeline *pipelineConfig
 			err = impl.pipelineRepository.Update(pipeline, tx)
 			if err != nil {
 				impl.logger.Errorw("error in partially delete cd pipeline", "err", err)
-				return err
+				return deleteResponse, err
 			}
 		}
+		deleteResponse.DeleteInitiated = true
 	}
 	err = tx.Commit()
 	if err != nil {
 		impl.logger.Errorw("error in committing db transaction", "err", err)
+		return deleteResponse, err
+	}
+	return deleteResponse, nil
+}
+
+func (impl PipelineBuilderImpl) DeleteACDAppCdPipelineWithNonCascade(pipeline *pipelineConfig.Pipeline, ctx context.Context, forceDelete bool, userId int32) error {
+	if forceDelete {
+		_, err := impl.DeleteCdPipeline(pipeline, ctx, bean.FORCE_DELETE, false, userId)
 		return err
 	}
+	//delete app from argo cd with non-cascade, if created
+	if pipeline.DeploymentAppCreated && util.IsAcdApp(pipeline.DeploymentAppType) {
+		appDetails, err := impl.appRepo.FindById(pipeline.AppId)
+		deploymentAppName := fmt.Sprintf("%s-%s", appDetails.AppName, pipeline.Environment.Name)
+		impl.logger.Debugw("acd app is already deleted for this pipeline", "pipeline", pipeline)
+		cascadeDelete := false
+		req := &application2.ApplicationDeleteRequest{
+			Name:    &deploymentAppName,
+			Cascade: &cascadeDelete,
+		}
+		if _, err = impl.application.Delete(ctx, req); err != nil {
+			impl.logger.Errorw("err in deleting pipeline on argocd", "id", pipeline, "err", err)
+			//statusError, _ := err.(*errors2.StatusError)
+			if !strings.Contains(err.Error(), "code = NotFound") {
+				err = &util.ApiError{
+					UserMessage:     "Could not delete application",
+					InternalMessage: err.Error(),
+				}
+				return err
+			}
+		}
+
+	}
 	return nil
 }
 
@@ -3963,14 +4057,20 @@ func (impl PipelineBuilderImpl) updateGitRepoUrlInCharts(appId int, chartGitAttr
 func (impl PipelineBuilderImpl) PerformBulkActionOnCdPipelines(dto *bean.CdBulkActionRequestDto, impactedPipelines []*pipelineConfig.Pipeline, ctx context.Context, dryRun bool, userId int32) ([]*bean.CdBulkActionResponseDto, error) {
 	switch dto.Action {
 	case bean.CD_BULK_DELETE:
-		bulkDeleteResp := impl.BulkDeleteCdPipelines(impactedPipelines, ctx, dryRun, dto.ForceDelete, userId)
+		deleteAction := bean.CASCADE_DELETE
+		if dto.ForceDelete {
+			deleteAction = bean.FORCE_DELETE
+		} else if !dto.CascadeDelete {
+			deleteAction = bean.NON_CASCADE_DELETE
+		}
+		bulkDeleteResp := impl.BulkDeleteCdPipelines(impactedPipelines, ctx, dryRun, deleteAction, userId)
 		return bulkDeleteResp, nil
 	default:
 		return nil, &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "this action is not supported"}
 	}
 }
 
-func (impl PipelineBuilderImpl) BulkDeleteCdPipelines(impactedPipelines []*pipelineConfig.Pipeline, ctx context.Context, dryRun, forceDelete bool, userId int32) []*bean.CdBulkActionResponseDto {
+func (impl PipelineBuilderImpl) BulkDeleteCdPipelines(impactedPipelines []*pipelineConfig.Pipeline, ctx context.Context, dryRun bool, deleteAction int, userId int32) []*bean.CdBulkActionResponseDto {
 	var respDtos []*bean.CdBulkActionResponseDto
 	for _, pipeline := range impactedPipelines {
 		respDto := &bean.CdBulkActionResponseDto{
@@ -3979,10 +4079,12 @@ func (impl PipelineBuilderImpl) BulkDeleteCdPipelines(impactedPipelines []*pipel
 			EnvironmentName: pipeline.Environment.Name,
 		}
 		if !dryRun {
-			err := impl.DeleteCdPipeline(pipeline, ctx, forceDelete, true, userId)
+			deleteResponse, err := impl.DeleteCdPipeline(pipeline, ctx, deleteAction, true, userId)
 			if err != nil {
 				impl.logger.Errorw("error in deleting cd pipeline", "err", err, "pipelineId", pipeline.Id)
 				respDto.DeletionResult = fmt.Sprintf("Not able to delete pipeline, %v", err)
+			} else if !(deleteResponse.DeleteInitiated || deleteResponse.ClusterReachable) {
+				respDto.DeletionResult = fmt.Sprintf("Not able to delete pipeline, cluster connection error")
 			} else {
 				respDto.DeletionResult = "Pipeline deleted successfully."
 			}
@@ -4160,7 +4262,7 @@ func (impl PipelineBuilderImpl) MarkGitOpsDevtronAppsDeletedWhereArgoAppIsDelete
 	}
 	impl.logger.Warnw("app not found in argo, deleting from db ", "err", err)
 	//make call to delete it from pipeline DB because it's ACD counterpart is deleted
-	err = impl.DeleteCdPipeline(pipeline, context.Background(), true, false, 1)
+	_, err = impl.DeleteCdPipeline(pipeline, context.Background(), bean.FORCE_DELETE, false, 1)
 	if err != nil {
 		impl.logger.Errorw("error in deleting cd pipeline", "err", err)
 		return acdAppFound, err
diff --git a/pkg/sso/SSOLoginService.go b/pkg/sso/SSOLoginService.go
index 049014875..7daf898de 100644
--- a/pkg/sso/SSOLoginService.go
+++ b/pkg/sso/SSOLoginService.go
@@ -20,15 +20,16 @@ package sso
 import (
 	"encoding/json"
 	"fmt"
+	"time"
+
 	"github.com/devtron-labs/devtron/api/bean"
 	"github.com/devtron-labs/devtron/internal/util"
 	"github.com/devtron-labs/devtron/pkg/auth"
 	util2 "github.com/devtron-labs/devtron/util"
 	"github.com/devtron-labs/devtron/util/argo"
-	"github.com/ghodss/yaml"
 	"github.com/go-pg/pg"
 	"go.uber.org/zap"
-	"time"
+	"sigs.k8s.io/yaml"
 )
 
 type SSOLoginService interface {
diff --git a/pkg/team/TeamService.go b/pkg/team/TeamService.go
index 72ebb9d56..a6b678c28 100644
--- a/pkg/team/TeamService.go
+++ b/pkg/team/TeamService.go
@@ -18,12 +18,14 @@
 package team
 
 import (
+	"errors"
 	"github.com/devtron-labs/devtron/internal/constants"
 	"github.com/devtron-labs/devtron/internal/util"
 	"github.com/devtron-labs/devtron/pkg/sql"
 	"github.com/devtron-labs/devtron/pkg/user"
 	"github.com/devtron-labs/devtron/pkg/user/bean"
 	"go.uber.org/zap"
+	"strings"
 	"time"
 )
 
@@ -62,6 +64,11 @@ func NewTeamServiceImpl(logger *zap.SugaredLogger, teamRepository TeamRepository
 
 func (impl TeamServiceImpl) Create(request *TeamRequest) (*TeamRequest, error) {
 	impl.logger.Debugw("team create request", "req", request)
+	if len(request.Name) < 3 || strings.Contains(request.Name, " ") {
+		impl.logger.Errorw("name should not contain white spaces and should have min 3 chars ")
+		err := errors.New("name should not contain white spaces and should have min 3 chars")
+		return nil, err
+	}
 	t := &Team{
 		Name:     request.Name,
 		Id:       request.Id,
diff --git a/releasenotes.md b/releasenotes.md
index ea25fe6d8..6de9136cf 100644
--- a/releasenotes.md
+++ b/releasenotes.md
@@ -1,3 +1,21 @@
+## v0.6.18-rc.2
+
+
+
+
+## Bugs
+- fix: Global secret data bug in CI workflow (#3504)
+- fix: app workflow creation api panic and app metrics update issue (#3511)
+- fix: HPA support for keda autoscaling and fixes for nameOverrides (#3522)
+- fix : field validation and projects and chart repo fields (#3528)
+- fix: acd app delete non cascade (#3506)
+## Enhancements
+- feat: releaseVersion in job of cron-job template 1.5.0 (#3358)
+## Others
+- task: added global policy db scripts (#3486)
+- chore: replace `github.com/ghodss/yaml` with `sigs.k8s.io/yaml` (#3355)
+
+
 ## v0.6.18-rc.1
 
 
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/.image_descriptor_template.json b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/.image_descriptor_template.json
new file mode 100644
index 000000000..8a99a9566
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/.image_descriptor_template.json
@@ -0,0 +1,1 @@
+{"server":{"deployment":{"image_tag":"{{.Tag}}","image":"{{.Name}}"}},"pipelineName": "{{.PipelineName}}","releaseVersion":"{{.ReleaseVersion}}","deploymentType": "{{.DeploymentType}}", "app": "{{.App}}", "env": "{{.Env}}", "appMetrics": {{.AppMetrics}}}
\ No newline at end of file
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/Chart.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/Chart.yaml
new file mode 100644
index 000000000..78d5c1518
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/Chart.yaml
@@ -0,0 +1,5 @@
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm chart for Kubernetes
+name: cronjob-chart_1-5-0
+version: 1.5.0
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/app-values.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/app-values.yaml
new file mode 100644
index 000000000..8af5840d9
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/app-values.yaml
@@ -0,0 +1,177 @@
+# Mandatory configs
+kind: Job
+
+jobConfigs:
+  backoffLimit: 5
+  activeDeadlineSeconds: 100
+  parallelism: 1
+  completions: 2
+  suspend: false
+ # ttlSecondsAfterFinished: 100
+
+cronjobConfigs:
+  schedule: "* * * * *"
+  startingDeadlineSeconds: 100
+  concurrencyPolicy: Allow
+  suspend: false
+  successfulJobsHistoryLimit: 3
+  failedJobsHistoryLimit: 1
+  restartPolicy: OnFailure
+
+kedaAutoscaling:
+  envSourceContainerName: "" 
+  minReplicaCount: 1 
+  maxReplicaCount: 2
+  pollingInterval: 30                         
+  successfulJobsHistoryLimit: 5              
+  failedJobsHistoryLimit: 5
+  rolloutStrategy: default
+  scalingStrategy:
+    strategy: "custom"                        
+    customScalingQueueLengthDeduction: 1      
+    customScalingRunningJobPercentage: "0.5"  
+    pendingPodConditions:                     
+      - "Ready"
+      - "PodScheduled"
+      - "AnyOtherCustomPodCondition"
+    multipleScalersCalculation : "max"
+  triggers: 
+  - type: rabbitmq
+    metadata:
+      queueName: hello
+      host: RabbitMqHost
+      queueLength  : '5'
+    authenticationRef: {}
+  triggerAuthentication:
+    enabled: false
+    name: ""
+    spec: {}
+
+MinReadySeconds: 60
+GracePeriod: 30
+image:
+  pullPolicy: IfNotPresent
+service:
+  type: ClusterIP
+  enabled: false
+  #name: "service-1234567890"
+  annotations: {}
+    # test1: test2
+    # test3: test4
+ContainerPort:
+  - name: app
+    port: 8080
+    servicePort: 80
+    envoyPort: 8799
+    useHTTP2: true
+    supportStreaming: true
+    idleTimeout: 1800s
+#    servicemonitor:
+#      enabled: true
+#      path: /abc
+#      scheme: 'http'
+#      interval: 30s
+#      scrapeTimeout: 20s
+#      metricRelabelings:
+#        - sourceLabels: [namespace]
+#          regex: '(.*)'
+#          replacement: myapp
+#          targetLabel: target_namespace
+resources:
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  limits:
+    cpu: 1
+    memory: 200Mi
+  requests:
+    cpu: 0.10
+    memory: 100Mi
+
+# Optional configs
+
+command:
+  enabled: false
+  value: []
+
+args:
+  enabled: false
+  value:
+    - /bin/sh
+    - -c
+    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
+
+#For adding custom labels to pods
+
+podLabels: {}
+#  customKey: customValue
+podAnnotations: {}
+#  customKey: customValue
+
+rawYaml: []
+
+initContainers: []
+  ## Additional init containers to run before the Scheduler pods.
+  ## for example, be used to run a sidecar that chown Logs storage.
+  #- name: volume-mount-hack
+  #  image: busybox
+  #  command: ["sh", "-c", "chown -R 1000:1000 logs"]
+  #  volumeMounts:
+  #    - mountPath: /usr/local/airflow/logs
+  #      name: logs-data
+
+containers: []
+  ## Additional containers to run along with application pods.
+  ## for example, be used to run a sidecar that chown Logs storage .
+  #- name: volume-mount-hack
+  #  image: busybox
+  #  command: ["sh", "-c", "chown -R 1000:1000 logs"]
+  #  volumeMounts:
+  #    - mountPath: /usr/local/airflow/logs
+  #      name: logs-data
+
+volumeMounts: []
+#     - name: log-volume
+#       mountPath: /var/log
+
+volumes: []
+#     - name: log-volume
+#       emptyDir: {}
+
+tolerations: []
+
+Spec:
+  Affinity:
+    Key:
+    #  Key: kops.k8s.io/instancegroup
+    Values:
+
+prometheus:
+  release: monitoring
+
+server:
+  deployment:
+    image_tag: 1-95af053
+    image: ""
+
+servicemonitor:
+  additionalLabels: {}
+
+imagePullSecrets: []
+  # - test1
+  # - test2
+
+containerSecurityContext:
+  allowPrivilegeEscalation: false
+
+podSecurityContext: {}
+  # runAsUser: 1000
+  # runAsGroup: 3000
+  # fsGroup: 2000
+
+shareProcessNamespace: false
+setHostnameAsFQDN: false
+readinessGates: []
+ephemeralContainers: []
+topologySpreadConstraints: []
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/env-values.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/env-values.yaml
new file mode 100644
index 000000000..a0fcb7e26
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/env-values.yaml
@@ -0,0 +1,33 @@
+MaxSurge: 1
+MaxUnavailable: 0
+GracePeriod: 30
+pauseForSecondsBeforeSwitchActive: 30
+waitForSecondsBeforeScalingDown: 30
+
+Spec:
+ Affinity:
+  key: ""
+  Values: nodes
+
+secret:
+ enabled: false
+ data: {}
+#   my_own_secret: S3ViZXJuZXRlcyBXb3Jrcw==
+
+EnvVariables: []
+#  - name: FLASK_ENV
+#    value: qa
+
+resources:
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+   limits:
+    cpu: "0.05"
+    memory: 50Mi
+   requests:
+    cpu: "0.01"
+    memory: 10Mi
+
+
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/pipeline-values.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/pipeline-values.yaml
new file mode 100644
index 000000000..40a5ec633
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/pipeline-values.yaml
@@ -0,0 +1,24 @@
+deployment:
+  strategy:
+    blueGreen:
+      autoPromotionSeconds: 30
+      scaleDownDelaySeconds: 30
+      previewReplicaCount: 1
+      autoPromotionEnabled: false
+    rolling:
+      maxSurge: "25%"
+      maxUnavailable: 1
+    canary:
+      maxSurge: "25%"
+      maxUnavailable: 1
+      steps:
+        - setWeight: 25
+        - pause:
+            duration: 15 # 1 min
+        - setWeight: 50
+        - pause:
+            duration: 15 # 1 min
+        - setWeight: 75
+        - pause:
+            duration: 15 # 1 min
+    recreate: {}
\ No newline at end of file
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/release-values.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/release-values.yaml
new file mode 100644
index 000000000..48eb3f482
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/release-values.yaml
@@ -0,0 +1,14 @@
+server:
+ deployment:
+   image_tag: IMAGE_TAG
+   image: IMAGE_REPO
+   enabled: false
+dbMigrationConfig:
+  enabled: false
+
+pauseForSecondsBeforeSwitchActive: 0
+waitForSecondsBeforeScalingDown: 0
+autoPromotionSeconds: 30
+
+#used for deployment algo selection
+orchestrator.deploymant.algo: 1 
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/NOTES.txt b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/NOTES.txt
new file mode 100644
index 000000000..c6ccbb821
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/NOTES.txt
@@ -0,0 +1,13 @@
+1. Get the application URL by running these commands:
+{{- if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include ".Chart.Name .fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get svc -w {{ include ".Chart.Name .fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include ".Chart.Name .fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include ".Chart.Name .name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+{{- end }}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/_helpers.tpl b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/_helpers.tpl
new file mode 100644
index 000000000..03fabbc33
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/_helpers.tpl
@@ -0,0 +1,159 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define ".Chart.Name .name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create service name
+*/}}
+{{- define ".servicename" -}}
+{{- if .Values.service.name -}}
+{{- .Values.service.name | trunc 63 | trimSuffix "-" -}}
+{{- else if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 55 | trimSuffix "-" -}}-service
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 55 | trimSuffix "-" -}}-service
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 55 | trimSuffix "-" -}}-service
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create preview service name
+*/}}
+{{- define ".previewservicename" -}}
+{{- if .Values.service.name -}}
+{{- .Values.service.name | trunc 55 | trimSuffix "-" -}}-preview
+{{- else if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 47 | trimSuffix "-" -}}-preview-service
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 47 | trimSuffix "-" -}}-preview-service
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 47 | trimSuffix "-" -}}-preview-service
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define ".Chart.Name .fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define ".Chart.Name .chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{- define ".Chart.Name .color" -}}
+{{- $active0 := (index .Values.server.deployment 0).enabled -}}
+{{/*
+{{- $active1 := (index .Values.server.deployment 1).enabled -}}
+*/}}
+{{- $active1 := include "safeenabledcheck" . -}}
+{{- $active := and $active0 $active1 -}}
+{{- $active -}}
+{{- end -}}
+
+{{- define "safeenabledcheck" -}}
+{{- if (eq (len .Values.server.deployment) 2) -}}
+  {{- if (index .Values.server.deployment 1).enabled -}}
+    {{- $active := true -}}
+    {{- $active -}}
+  {{- else -}}
+    {{-  $active := false -}}
+    {{- $active -}}
+  {{- end -}}
+{{- else -}}
+  {{- $active := false -}}
+  {{- $active -}}
+{{- end -}}
+{{- end -}}
+
+
+{{- define "isCMVolumeExists" -}}
+  {{- $isCMVolumeExists := false -}}
+    {{- if .Values.ConfigMaps.enabled }}
+      {{- range .Values.ConfigMaps.maps }}
+        {{- if eq .type "volume"}}
+          {{- $isCMVolumeExists = true}}
+        {{- end }}
+      {{- end }}
+    {{- end }}
+  {{- $isCMVolumeExists -}}
+{{- end -}}
+
+{{- define "isSecretVolumeExists" -}}
+  {{- $isSecretVolumeExists := false -}}
+    {{- if .Values.ConfigSecrets.enabled }}
+      {{- range .Values.ConfigSecrets.secrets }}
+        {{- if eq .type "volume"}}
+          {{- $isSecretVolumeExists = true}}
+        {{- end }}
+      {{- end }}
+    {{- end }}
+  {{- $isSecretVolumeExists -}}
+{{- end -}}
+
+
+
+
+{{- define "serviceMonitorEnabled" -}}
+   {{- $SMenabled := false -}}
+   {{- range .Values.ContainerPort }}
+       {{- if .servicemonitor }}
+             {{- if and .servicemonitor.enabled }}
+                 {{- $SMenabled = true -}}
+             {{- end }}
+       {{- end }}
+   {{- end }}
+   {{- $SMenabled -}}
+{{- end -}}
+
+  {{- $hasCMEnvExists := false -}}
+  {{- $hasCMVolumeExists := false -}}
+  {{- if .Values.ConfigMaps.enabled }}
+  {{- range .Values.ConfigMaps.maps }}
+  {{- if eq .type "volume"}}
+  {{- $hasCMVolumeExists = true}}
+  {{- end }}
+  {{- if eq .type "environment"}}
+  {{- $hasCMEnvExists = true}}
+  {{- end }}
+  {{- end }}
+  {{- end }}
+
+  {{- $hasSecretEnvExists := false -}}
+  {{- $hasSecretVolumeExists := false -}}
+  {{- if .Values.ConfigSecrets.enabled }}
+  {{- range .Values.ConfigSecrets.secrets }}
+  {{- if eq .type "volume"}}
+  {{- $hasSecretVolumeExists = true}}
+  {{- end }}
+  {{- if eq .type "environment"}}
+  {{- $hasSecretEnvExists = true}}
+  {{- end }}
+  {{- end }}
+  {{- end }}
\ No newline at end of file
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/_job_template_spec.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/_job_template_spec.yaml
new file mode 100644
index 000000000..0ff1ddc64
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/_job_template_spec.yaml
@@ -0,0 +1,42 @@
+{{- define "job-template-spec" }}
+{{- if $.Values.jobConfigs }}
+{{- if $.Values.jobConfigs.backoffLimit }}
+backoffLimit: {{ $.Values.jobConfigs.backoffLimit }}
+{{- end }}
+{{- if $.Values.jobConfigs.activeDeadlineSeconds }}
+activeDeadlineSeconds: {{ $.Values.jobConfigs.activeDeadlineSeconds }}
+{{- end }}
+{{- if $.Values.jobConfigs.parallelism }}
+parallelism: {{ $.Values.jobConfigs.parallelism }}
+{{- end }}
+{{- if $.Values.jobConfigs.completions }}
+completions: {{ $.Values.jobConfigs.completions }}
+{{- end }}
+{{- if semverCompare ">1.20" .Capabilities.KubeVersion.GitVersion }}
+{{- if $.Values.jobConfigs.suspend }}
+suspend: {{ $.Values.jobConfigs.suspend }}
+{{- end }}
+{{- end }}
+{{- if $.Values.jobConfigs.ttlSecondsAfterFinished }}
+ttlSecondsAfterFinished: {{ $.Values.jobConfigs.ttlSecondsAfterFinished }}
+{{- end }}
+{{- end }}
+template:
+  metadata:
+  {{- if $.Values.podAnnotations }}
+    annotations:
+    {{- range $key, $value := $.Values.podAnnotations }}
+      {{ $key }}: {{ $value | quote }}
+    {{- end }}
+  {{- end }}
+    labels:
+      app: {{ template ".Chart.Name .name" $ }}
+      appId: {{ $.Values.app | quote }}
+      envId: {{ $.Values.env | quote }}
+      release: {{ $.Release.Name }}
+      {{- if $.Values.podLabels }}
+{{ toYaml $.Values.podLabels | indent 6 }}
+      {{- end }}
+  spec:
+    {{- include "pod-template-spec" . | indent 4 }}
+{{- end }}
\ No newline at end of file
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/_pod_template_spec.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/_pod_template_spec.yaml
new file mode 100644
index 000000000..202dfda6d
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/_pod_template_spec.yaml
@@ -0,0 +1,313 @@
+{{ define "pod-template-spec" }}
+{{- $hasCMEnvExists := false -}}
+{{- $hasCMVolumeExists := false -}}
+{{- if .Values.ConfigMaps.enabled }}
+{{- range .Values.ConfigMaps.maps }}
+{{- if eq .type "volume"}}
+{{- $hasCMVolumeExists = true}}
+{{- end }}
+{{- if eq .type "environment"}}
+{{- $hasCMEnvExists = true}}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{- $hasSecretEnvExists := false -}}
+{{- $hasSecretVolumeExists := false -}}
+{{- if .Values.ConfigSecrets.enabled }}
+{{- range .Values.ConfigSecrets.secrets }}
+{{- if eq .type "volume"}}
+{{- $hasSecretVolumeExists = true}}
+{{- end }}
+{{- if eq .type "environment"}}
+{{- $hasSecretEnvExists = true}}
+{{- end }}
+{{- end }}
+{{- end }}
+{{- if $.Values.shareProcessNamespace }}
+shareProcessNamespace: {{ $.Values.shareProcessNamespace }}
+{{- end }}
+{{- if $.Values.GracePeriod }}
+terminationGracePeriodSeconds: {{ $.Values.GracePeriod }}
+{{- end }}
+{{- if $.Values.topologySpreadConstraints }}
+topologySpreadConstraints:
+{{- range $.Values.topologySpreadConstraints }}
+- maxSkew: {{ .maxSkew }}
+  topologyKey: {{ .topologyKey }}
+  whenUnsatisfiable: {{ .whenUnsatisfiable }}
+  labelSelector:
+    matchLabels:
+    {{- if and .autoLabelSelector .customLabelSelector }}
+{{ toYaml .customLabelSelector | indent 6 }}
+    {{- else if .autoLabelSelector }}
+      app: {{ template ".Chart.Name .name" $ }}
+      appId: {{ $.Values.app | quote }}
+      envId: {{ $.Values.env | quote }}
+      release: {{ $.Release.Name }}
+    {{- else if .customLabelSelector }}
+{{ toYaml .customLabelSelector | indent 6 }}
+    {{- end }}
+{{- end }}
+{{- end }}
+{{- if $.Values.podSpec.subdomain }}
+subdomain: {{ $.Values.podSpec.subdomain }}
+{{- end }}
+{{- if $.Values.podSpec.setHostnameAsFQDN }}
+setHostnameAsFQDN: {{ $.Values.podSpec.setHostnameAsFQDN }}
+{{- end }}
+{{- if $.Values.podSpec.schedulerName }}
+schedulerName: {{ $.Values.podSpec.schedulerName }}
+{{- end }}
+{{- if $.Values.podSpec.readinessGates }}
+readinessGates: 
+  {{ toYaml $.podSpec.readinessGates }}
+{{- end }}
+{{- if $.Values.podSpec.dnsPolicy }}
+dnsPolicy: {{ $.Values.podSpec.dnsPolicy }}
+{{- end }}
+{{- if $.Values.podSpec.enableServiceLinks }}
+dnsPolicy: {{ $.Values.podSpec.enableServiceLinks }}
+{{- end }}
+{{- with $.Values.ephemeralContainers }}
+ephemeralContainers:
+{{- toYaml $.Values.ephemeralContainers }}
+{{- end }}
+{{- with $.Values.dnsConfig }}
+dnsConfig:
+{{- toYaml $.Values.dnsConfig }}
+{{- end }}
+restartPolicy: OnFailure
+{{- if and $.Values.Spec.Affinity.Key $.Values.Spec.Affinity.Values }}
+affinity:
+  nodeAffinity:
+    requiredDuringSchedulingIgnoredDuringExecution:
+      nodeSelectorTerms:
+      - matchExpressions:
+        - key: {{ $.Values.Spec.Affinity.Key  }}
+          operator: In
+          values:
+          - {{ $.Values.Spec.Affinity.Values | default "nodes"  }}
+{{- end }}
+{{- if $.Values.serviceAccountName }}
+serviceAccountName: {{ $.Values.serviceAccountName }}
+{{- end }}
+{{- if .Values.tolerations }}
+tolerations:
+{{ toYaml .Values.tolerations | indent 2 }}
+{{- end }}
+{{- if $.Values.podSecurityContext }}
+securityContext:
+{{ toYaml .Values.podSecurityContext | indent 2 }}
+{{- end }}  
+{{- if $.Values.imagePullSecrets }}
+imagePullSecrets:
+{{- range .Values.imagePullSecrets }}
+  - name: {{ . }}
+{{- end }}
+{{- end}}
+{{- if $.Values.initContainers }}
+initContainers:
+{{- range $i, $c := .Values.initContainers }}
+{{- if .reuseContainerImage }}
+  - name: {{ $.Chart.Name }}-init-{{ add1 $i }}
+    image: "{{ $.Values.server.deployment.image }}:{{ $.Values.server.deployment.image_tag }}"
+    imagePullPolicy: {{ $.Values.image.pullPolicy }}
+{{- if .command }}
+    command:
+{{ toYaml .command | indent 6 -}}
+{{- end }}
+{{- if .resources }}
+    resources:
+{{ toYaml .resources | indent 6 }}
+{{- end }}
+{{- if .volumeMounts }}
+    volumeMounts:
+{{ toYaml .volumeMounts | indent 6 -}}
+{{- end }}
+{{- else }}
+  -
+{{ toYaml $c | indent 4 -}}
+{{- end }}
+{{- end }}
+{{- end }}
+containers:
+{{- if $.Values.containers }}
+{{ toYaml $.Values.containers | indent 2 -}}
+{{- end }}
+  - name: {{ $.Chart.Name }}
+    image: "{{ .Values.server.deployment.image }}:{{ .Values.server.deployment.image_tag }}"
+    imagePullPolicy: {{ $.Values.image.pullPolicy }}
+{{- if $.Values.privileged }}
+    securityContext:
+      privileged: true
+{{- end }}
+{{- if $.Values.containerSecurityContext }}
+    securityContext:
+{{ toYaml .Values.containerSecurityContext | indent 6 }}
+{{- end }}
+{{- if and $.Values.containerSecurityContext $.Values.privileged }}
+    securityContext:
+      privileged: true
+{{ toYaml .Values.containerSecurityContext | indent 6 }}
+{{- end }}
+    ports:
+    {{- range $.Values.ContainerPort }}
+      - name: {{ .name }}
+        containerPort: {{ .port  }}
+        protocol: TCP
+    {{- end }}
+{{- if and $.Values.command.value $.Values.command.enabled }}
+    command:
+{{ toYaml $.Values.command.value | indent 6 -}}
+{{- end }}
+{{- if and $.Values.args.value $.Values.args.enabled }}
+    args:
+{{ toYaml $.Values.args.value | indent 6 -}}
+{{- end }}
+    env:
+      - name: CONFIG_HASH
+        value: {{ include (print $.Chart.Name "/templates/configmap.yaml") . | sha256sum }}
+      - name: SECRET_HASH
+        value: {{ include (print $.Chart.Name "/templates/secret.yaml") . | sha256sum }}
+      - name: DEVTRON_APP_NAME
+        value: {{ template ".Chart.Name .name" $ }}
+      - name: POD_NAME
+        valueFrom:
+          fieldRef:
+            fieldPath: metadata.name
+    {{- range $.Values.EnvVariablesFromFieldPath }}
+      - name: {{ .name }}
+        valueFrom:
+          fieldRef:
+            fieldPath: {{ .fieldPath }}
+    {{- end }}
+    {{- range $.Values.EnvVariables }}
+      - name: {{ .name}}
+        value: {{ .value | quote }}
+    {{- end }}
+    {{- if or (and ($hasCMEnvExists) (.Values.ConfigMaps.enabled)) (and ($hasSecretEnvExists) (.Values.ConfigSecrets.enabled)) }}
+    envFrom:
+    {{- if .Values.ConfigMaps.enabled }}
+    {{- range .Values.ConfigMaps.maps }}
+    {{- if eq .type "environment" }}
+    - configMapRef:
+        {{- if eq .external true }}
+        name: {{ .name }}
+        {{- else if eq .external false }}
+        name: {{ .name}}-{{ $.Values.app }}
+        {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- if .Values.ConfigSecrets.enabled }}
+    {{- range .Values.ConfigSecrets.secrets }}
+    {{- if eq .type "environment" }}
+    - secretRef:
+        {{if eq .external true}}
+        name: {{ .name }}
+        {{else if eq .external false}}
+        name: {{ .name}}-{{ $.Values.app }}
+        {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- end }}
+    resources:
+{{ toYaml $.Values.resources | trim | indent 6 }}
+    volumeMounts:
+{{- with .Values.volumeMounts }}
+{{ toYaml . | trim | indent 6 }}
+{{- end }}
+    {{- if .Values.ConfigMaps.enabled }}
+    {{- range .Values.ConfigMaps.maps }}
+    {{- if eq .type "volume"}}
+    {{- $cmName := .name -}}
+    {{- $cmMountPath := .mountPath -}}
+    {{- if eq .subPath false }}
+      - name: {{ $cmName | replace "." "-"}}-vol
+        mountPath: {{ $cmMountPath }}
+    {{- else }}
+    {{- range $k, $v := .data }}
+      - name: {{ $cmName | replace "." "-"}}-vol
+        mountPath: {{ $cmMountPath }}/{{ $k}}
+        subPath: {{ $k}}
+    {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- if .Values.ConfigSecrets.enabled }}
+    {{- range .Values.ConfigSecrets.secrets }}
+    {{- if eq .type "volume" }}
+    {{- $cmName := .name -}}
+    {{- $cmMountPath := .mountPath -}}
+    {{- if eq .subPath false }}
+      - name: {{ $cmName | replace "." "-"}}-vol
+        mountPath: {{ $cmMountPath }}
+    {{- else if and (eq (.subPath) true) (eq (.externalType) "KubernetesSecret") }}
+    {{- else if and (eq (.subPath) true) (eq (.external) true) }}
+    {{- range .secretData }}
+      - name: {{ $cmName | replace "." "-"}}-vol
+        mountPath: {{ $cmMountPath}}/{{ .name }}
+        subPath: {{ .name }}
+    {{- end }}
+    {{- else }}
+    {{- range $k, $v := .data }}
+      - name: {{ $cmName | replace "." "-"}}-vol
+        mountPath: {{ $cmMountPath}}/{{ $k}}
+        subPath: {{ $k}}
+    {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- if and (eq (len .Values.volumes) 0) (or (eq (.Values.ConfigSecrets.enabled) true) (eq (.Values.ConfigMaps.enabled) true)) (eq ($hasCMVolumeExists) false) (eq ($hasSecretVolumeExists) false) }} []{{- end }}
+    {{- if and (eq (len .Values.volumeMounts) 0) (eq (.Values.ConfigSecrets.enabled) false) (eq (.Values.ConfigMaps.enabled) false) }} []{{- end }}
+volumes:
+{{- if $.Values.appMetrics }}
+  - name: envoy-config-volume
+    configMap:
+      name: sidecar-config-{{ template ".Chart.Name .name" $ }}
+{{- end }}
+{{- with .Values.volumes }}
+{{ toYaml . | trim | indent 2 }}
+{{- end }}
+{{- if .Values.ConfigMaps.enabled }}
+{{- range .Values.ConfigMaps.maps }}
+{{- if eq .type "volume"}}
+  - name: {{ .name | replace "." "-"}}-vol
+    configMap:
+      {{- if eq .external true }}
+      name: {{ .name }}
+      {{- else if eq .external false }}
+      name: {{ .name}}-{{ $.Values.app }}
+      {{- end }}
+      {{- if eq (len .filePermission) 0 }}
+      {{- else }}
+      defaultMode: {{ .filePermission}}
+      {{- end }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{- if .Values.ConfigSecrets.enabled }}
+{{- range .Values.ConfigSecrets.secrets }}
+{{- if eq .type "volume"}}
+  - name: {{ .name | replace "." "-"}}-vol
+    secret:
+      {{- if eq .external true }}
+      secretName: {{ .name }}
+      {{- else if eq .external false }}
+      secretName: {{ .name}}-{{ $.Values.app }}
+      {{- end }}
+      {{- if eq (len .filePermission) 0 }}
+      {{- else }}
+      defaultMode: {{ .filePermission}}
+      {{- end }}
+{{- end }}
+{{- end }}
+{{- end }}
+{{- if and (eq (len .Values.volumes) 0) (or (eq (.Values.ConfigSecrets.enabled) true) (eq (.Values.ConfigMaps.enabled) true)) (eq ($hasCMVolumeExists) false) (eq ($hasSecretVolumeExists) false) (eq (.Values.appMetrics) false) }} []{{- end }}
+{{- if and (eq (len .Values.volumes) 0) (eq (.Values.ConfigSecrets.enabled) false) (eq (.Values.ConfigMaps.enabled) false) (eq (.Values.appMetrics) false) }} []{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/configmap.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/configmap.yaml
new file mode 100644
index 000000000..ac7f15faf
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/configmap.yaml
@@ -0,0 +1,14 @@
+{{- if .Values.ConfigMaps.enabled }}
+  {{- range .Values.ConfigMaps.maps }}
+    {{if eq .external false}}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  creationTimestamp: 2019-08-12T18:38:34Z
+  name: {{ .name}}-{{ $.Values.app }}
+data:
+{{ toYaml .data | trim | indent 2 }}
+    {{- end}}
+  {{- end}}
+{{- end }}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/cronjob.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/cronjob.yaml
new file mode 100644
index 000000000..aebc009bd
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/cronjob.yaml
@@ -0,0 +1,41 @@
+{{- if eq .Values.kind "CronJob" }}
+{{- if semverCompare "<1.21" .Capabilities.KubeVersion.GitVersion }}
+apiVersion: batch/v1beta1
+{{- else }}
+apiVersion: batch/v1
+{{- end }}
+kind: CronJob
+metadata:
+  name: {{ include ".Chart.Name .fullname" $ }}
+  labels:
+    app: {{ template ".Chart.Name .name" $ }}
+    chart: {{ template ".Chart.Name .chart" $ }}
+    release: {{ $.Release.Name }}
+    releaseVersion: {{ $.Values.releaseVersion | quote }}
+spec:
+  {{- if $.Values.cronjobConfigs }}
+  {{- if $.Values.cronjobConfigs.schedule }}
+  schedule: {{ $.Values.cronjobConfigs.schedule | quote }}
+  {{- end }}
+  {{- if $.Values.cronjobConfigs.startingDeadlineSeconds }}
+  startingDeadlineSeconds: {{ $.Values.cronjobConfigs.startingDeadlineSeconds }}
+  {{- end }}
+  {{- if $.Values.cronjobConfigs.concurrencyPolicy }}
+  concurrencyPolicy: {{ $.Values.cronjobConfigs.concurrencyPolicy }}
+  {{- end }}
+  {{- if semverCompare ">1.20" .Capabilities.KubeVersion.GitVersion }}
+  {{- if $.Values.cronjobConfigs.suspend }}
+  suspend: {{ $.Values.cronjobConfigs.suspend }}
+  {{- end }}
+  {{- end }}
+  {{- if $.Values.cronjobConfigs.successfulJobsHistoryLimit }}
+  successfulJobsHistoryLimit: {{ $.Values.cronjobConfigs.successfulJobsHistoryLimit }}
+  {{- end }}
+  {{- if $.Values.cronjobConfigs.failedJobsHistoryLimit }}
+  failedJobsHistoryLimit: {{ $.Values.cronjobConfigs.failedJobsHistoryLimit }}
+  {{- end }}
+  {{- end }}
+  jobTemplate:
+    spec:
+      {{- include "job-template-spec" . | indent 6 }}
+{{- end }}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/externalsecrets.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/externalsecrets.yaml
new file mode 100644
index 000000000..4a475e13a
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/externalsecrets.yaml
@@ -0,0 +1,49 @@
+{{- if .Values.ConfigSecrets.enabled }}
+  {{- range .Values.ConfigSecrets.secrets }}
+  {{if eq .external true }}
+  {{if (or (eq .externalType "ESO_GoogleSecretsManager") (eq .externalType "ESO_AWSSecretsManager") (eq .externalType "ESO_HashiCorpVault") (eq .externalType "ESO_AzureSecretsManager"))}}
+---
+apiVersion: external-secrets.io/v1beta1
+kind: SecretStore
+metadata:
+  name: {{ .name }}
+{{- if $.Values.appLabels }}
+  labels:
+{{ toYaml $.Values.appLabels | indent 4 }}
+{{- end }}
+spec:
+  provider:
+    {{- toYaml .esoSecretData.secretStore | nindent 4 }}
+
+---
+apiVersion: external-secrets.io/v1beta1 
+kind: ExternalSecret
+metadata:
+  name: {{ .name }}
+{{- if $.Values.appLabels }}
+  labels:
+{{ toYaml $.Values.appLabels | indent 4 }}
+{{- end }}
+spec:
+  {{- if .refreshInterval }}
+  refreshInterval: {{ .refreshInterval }}
+  {{- else }}
+  refreshInterval: 1h
+  {{- end }}
+  secretStoreRef:
+    name: {{ .name }}
+    kind: SecretStore
+  target:
+    name: {{ .name }}
+    creationPolicy: Owner
+  data:
+  {{- range .esoSecretData.esoData }}
+  - secretKey: {{ .secretKey }}
+    remoteRef:
+        key: {{ .key }}
+        property: {{ .property }} 
+  {{- end }}
+{{- end }}
+{{- end }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/generic.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/generic.yaml
new file mode 100644
index 000000000..db95e8426
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/generic.yaml
@@ -0,0 +1,4 @@
+{{- range .Values.rawYaml }}
+---
+{{ toYaml . }}
+  {{- end -}}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/job.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/job.yaml
new file mode 100644
index 000000000..e2762026e
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/job.yaml
@@ -0,0 +1,14 @@
+{{ if eq .Values.kind "Job" }}
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: {{ include ".Chart.Name .fullname" $ }}-{{ $.Values.releaseVersion }}
+  labels:
+    app: {{ template ".Chart.Name .name" $ }}
+    chart: {{ template ".Chart.Name .chart" $ }}
+    release: {{ $.Release.Name }}
+    releaseVersion: {{ $.Values.releaseVersion | quote }}
+    pipelineName: {{ .Values.pipelineName }}
+spec:
+  {{- include "job-template-spec" . | indent 2 }}
+{{ end }}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/keda-autoscaling.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/keda-autoscaling.yaml
new file mode 100644
index 000000000..7601b1791
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/keda-autoscaling.yaml
@@ -0,0 +1,45 @@
+{{- if eq .Values.kind "ScaledJob" }}
+apiVersion: keda.sh/v1alpha1
+kind: ScaledJob
+metadata:
+  name: {{ template ".Chart.Name .fullname" $ }}-keda
+spec:
+  {{- if $.Values.kedaAutoscaling.maxReplicaCount }}
+  maxReplicaCount: {{ $.Values.kedaAutoscaling.maxReplicaCount | default 1 }}
+  {{- end }}
+  {{- if $.Values.kedaAutoscaling.minReplicaCount }}
+  minReplicaCount: {{ $.Values.kedaAutoscaling.minReplicaCount | default 0 }}
+  {{- end }}
+  {{- if $.Values.kedaAutoscaling.pollingInterval }}
+  pollingInterval: {{ $.Values.kedaAutoscaling.pollingInterval | default 30 }}
+  {{- end }}
+  {{- if $.Values.kedaAutoscaling.scalingStrategy }}
+  scalingStrategy:
+{{ toYaml $.Values.kedaAutoscaling.scalingStrategy | indent 4 }}
+  {{- end }}
+  {{- if $.Values.kedaAutoscaling.successfulJobsHistoryLimit }}
+  successfulJobsHistoryLimit: {{ $.Values.kedaAutoscaling.successfulJobsHistoryLimit | default 100 }}
+  {{- end }}
+  {{- if $.Values.kedaAutoscaling.rolloutStrategy }}
+  rolloutStrategy: {{ $.Values.kedaAutoscaling.rolloutStrategy }} 
+  {{- end }}
+  {{- if $.Values.kedaAutoscaling.failedJobsHistoryLimit }}
+  failedJobsHistoryLimit: {{ $.Values.kedaAutoscaling.failedJobsHistoryLimit | default 100 }}
+  {{- end }}
+  {{- if $.Values.kedaAutoscaling.envSourceContainerName }}
+  envSourceContainerName: {{ $.Values.kedaAutoscaling.envSourceContainerName }}
+  {{- end }}
+  triggers:
+{{ toYaml $.Values.kedaAutoscaling.triggers | indent 4 }}
+  jobTargetRef:
+{{- include "job-template-spec" . | indent 4 }}
+---
+{{- if $.Values.kedaAutoscaling.triggerAuthentication.enabled }}
+apiVersion: keda.sh/v1alpha1
+kind: TriggerAuthentication
+metadata:
+  name: {{ $.Values.kedaAutoscaling.triggerAuthentication.name }}
+spec:
+{{ toYaml $.Values.kedaAutoscaling.triggerAuthentication.spec | indent 2 }}
+{{- end }}
+{{- end }}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/metrics-service-monitor.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/metrics-service-monitor.yaml
new file mode 100644
index 000000000..9130dc2f8
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/metrics-service-monitor.yaml
@@ -0,0 +1,30 @@
+{{- if $.Values.appMetrics -}}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template ".Chart.Name .fullname" $ }}
+  labels:
+    app: {{ template ".Chart.Name .name" . }}
+    appId: {{ $.Values.app | quote }}
+    envId: {{ $.Values.env | quote }}
+    chart: {{ template ".Chart.Name .chart" . }}
+    release: {{ .Values.prometheus.release }}
+spec:
+  jobLabel: {{ template ".Chart.Name .name" $ }}
+  endpoints:
+    - port: envoy-admin
+      interval: 30s
+      path: /stats/prometheus
+  selector:
+    matchLabels:
+      app: {{ template ".Chart.Name .name" $ }}
+      appId: {{ $.Values.app | quote }}
+      envId: {{ $.Values.env | quote }}
+  namespaceSelector:
+    matchNames:
+      - {{.Release.Namespace}}
+  podTargetLabels:
+    - appId
+    - envId
+    - rollouts-pod-template-hash
+{{- end }}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/prometheusrules.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/prometheusrules.yaml
new file mode 100644
index 000000000..90f398bff
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/prometheusrules.yaml
@@ -0,0 +1,22 @@
+{{- if  .Values.prometheusRule.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+  name:  {{ template ".Chart.Name .fullname" . }}
+  {{- if .Values.prometheusRule.namespace }}
+  namespace: {{ .Values.prometheusRule.namespace }}
+  {{- end }}
+  labels:
+    kind: Prometheus
+    chart: {{ template ".Chart.Name .chart" . }}
+    release: {{ .Values.prometheus.release }}
+  {{- if .Values.prometheusRule.additionalLabels }}
+{{ toYaml .Values.prometheusRule.additionalLabels | indent 4 }}
+  {{- end }}
+spec:
+  {{- with .Values.prometheusRule.rules }}
+  groups:
+    - name: {{ template ".Chart.Name .fullname" $ }}
+      rules: {{- toYaml . | nindent 6 }}
+  {{- end }}
+  {{- end }}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/secret.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/secret.yaml
new file mode 100644
index 000000000..9a8ab6783
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/secret.yaml
@@ -0,0 +1,57 @@
+{{- if $.Values.secret.enabled }}
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: app-secret
+type: Opaque
+data:
+{{ toYaml $.Values.secret.data | indent 2 }}
+{{- end }}
+
+
+{{- if .Values.ConfigSecrets.enabled }}
+  {{- range .Values.ConfigSecrets.secrets }}
+  {{if eq .external false}}
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ .name}}-{{ $.Values.app }}
+type: Opaque
+data:
+{{ toYaml .data | trim | indent 2 }}
+{{- end}}
+  {{if eq .external true }}
+  {{if (or (eq .externalType "AWSSecretsManager") (eq .externalType "AWSSystemManager") (eq .externalType "HashiCorpVault"))}}
+---
+apiVersion: kubernetes-client.io/v1
+kind: ExternalSecret
+metadata:
+  name: {{ .name}}
+spec:
+  {{- if .roleARN }}
+  roleArn: .roleARN
+  {{- end}}
+  {{- if eq .externalType "AWSSecretsManager"}}
+  backendType: secretsManager
+  {{- end}}
+  {{- if eq .externalType "AWSSystemManager"}}
+  backendType: systemManager
+  {{- end}}
+  {{- if eq .externalType "HashiCorpVault"}}
+  backendType: vault
+  {{- end}}
+  data:
+  {{- range .secretData }}
+  - key: {{.key}}
+    name: {{.name}}
+    {{- if .property }}
+    property: {{.property}}
+    {{- end}}
+    isBinary: {{.isBinary}}
+  {{- end}}
+  {{- end}}
+  {{- end}}
+  {{- end}}
+  {{- end}}
\ No newline at end of file
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/service.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/service.yaml
new file mode 100644
index 000000000..99ef805c7
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/service.yaml
@@ -0,0 +1,67 @@
+{{- if .Values.service.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template ".servicename" . }}
+  labels:
+    app: {{ template ".Chart.Name .name" . }}
+    appId: {{ $.Values.app | quote }}
+    envId: {{ $.Values.env | quote }}
+    chart: {{ template ".Chart.Name .chart" . }}
+    release: {{ .Release.Name }}
+{{- if .Values.service.annotations }}
+  annotations:
+{{ toYaml .Values.service.annotations | indent 4 }}
+{{- end}}
+spec:
+  type: {{ .Values.service.type | default "ClusterIP" }}
+  ports:
+    {{- range .Values.ContainerPort }}
+      {{- if .servicePort }}
+    - port: {{ .servicePort }}
+      {{- else }}
+    - port: {{ .port }}
+       {{- end }}
+      targetPort: {{ .name }}
+      protocol: TCP
+      name: {{ .name }}
+    {{- end }}
+      {{- if $.Values.appMetrics }}
+    - port: 9901
+      name: envoy-admin
+      {{- end }}
+  selector:
+    app: {{ template ".Chart.Name .name" . }}
+{{- if eq .Values.deploymentType "BLUE-GREEN" }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template ".previewservicename" . }}
+  labels:
+    app: {{ template ".Chart.Name .name" . }}
+    appId: {{ $.Values.app | quote }}
+    envId: {{ $.Values.env | quote }}
+    chart: {{ template ".Chart.Name .chart" . }}
+    release: {{ .Release.Name }}
+spec:
+  type: ClusterIP
+  ports:
+    {{- range .Values.ContainerPort }}
+      {{- if .servicePort }}
+      - port: {{ .servicePort }}
+        {{- else }}
+      - port: {{ .port }}
+        {{- end }}
+        targetPort: {{ .name }}
+        protocol: TCP
+        name: {{ .name }}
+      {{- end }}
+      {{- if $.Values.appMetrics }}
+      - port: 9901
+        name: envoy-admin
+      {{- end }}
+  selector:
+    app: {{ template ".Chart.Name .name" . }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/servicemonitor.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/servicemonitor.yaml
new file mode 100644
index 000000000..1f90c722c
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/servicemonitor.yaml
@@ -0,0 +1,48 @@
+{{ $serviceMonitorEnabled := include "serviceMonitorEnabled" . }}
+{{- if eq "true" $serviceMonitorEnabled -}}
+---
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ template ".Chart.Name .fullname" . }}-sm
+  labels:
+    kind: Prometheus
+    app: {{ template ".Chart.Name .name" . }}
+    appId: {{ $.Values.app | quote }}
+    envId: {{ $.Values.env | quote }}
+    chart: {{ template ".Chart.Name .chart" . }}
+    release: {{ .Values.prometheus.release }}
+    {{- if .Values.servicemonitor.additionalLabels }}
+{{ toYaml .Values.servicemonitor.additionalLabels | indent 4 }}
+    {{- end }}
+spec:
+  endpoints:
+    {{- range .Values.ContainerPort }}
+      {{- if  .servicemonitor }}
+        {{- if .servicemonitor.enabled}}
+          {{- if .servicePort }}
+    - port: {{ .name }}
+      {{- if .servicemonitor.path }}
+      path: {{ .servicemonitor.path}}
+      {{- end }}
+      {{- if .servicemonitor.scheme }}
+      scheme: {{ .servicemonitor.scheme}}
+      {{- end }}
+      {{- if .servicemonitor.interval }}
+      interval: {{ .servicemonitor.interval}}
+      {{- end }}
+      {{- if .servicemonitor.scrapeTimeout }}
+      scrapeTimeout: {{ .servicemonitor.scrapeTimeout}}
+      {{- end }}
+      {{- if .servicemonitor.metricRelabelings}}
+      metricRelabelings:
+{{toYaml .servicemonitor.metricRelabelings | indent 8 }}
+      {{- end }}
+          {{- end }}
+        {{- end }}
+      {{- end }}
+    {{- end }}
+  selector:
+    matchLabels:
+      app: {{ template ".Chart.Name .name" $ }}
+{{- end }}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/sidecar-configmap.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/sidecar-configmap.yaml
new file mode 100644
index 000000000..30dc74cbd
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/templates/sidecar-configmap.yaml
@@ -0,0 +1,166 @@
+{{- if .Values.appMetrics }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  creationTimestamp: 2019-08-12T18:38:34Z
+  name: sidecar-config-{{ template ".Chart.Name .name" $ }}
+data:
+  envoy-config.json: |
+    {
+      "stats_config": {
+        "use_all_default_tags": false,
+        "stats_tags": [
+          {
+            "tag_name": "cluster_name",
+            "regex": "^cluster\\.((.+?(\\..+?\\.svc\\.cluster\\.local)?)\\.)"
+          },
+          {
+            "tag_name": "tcp_prefix",
+            "regex": "^tcp\\.((.*?)\\.)\\w+?$"
+          },
+          {
+            "tag_name": "response_code",
+            "regex": "_rq(_(\\d{3}))$"
+          },
+          {
+            "tag_name": "response_code_class",
+            "regex": ".*_rq(_(\\dxx))$"
+          },
+          {
+            "tag_name": "http_conn_manager_listener_prefix",
+            "regex": "^listener(?=\\.).*?\\.http\\.(((?:[_.[:digit:]]*|[_\\[\\]aAbBcCdDeEfF[:digit:]]*))\\.)"
+          },
+          {
+            "tag_name": "http_conn_manager_prefix",
+            "regex": "^http\\.(((?:[_.[:digit:]]*|[_\\[\\]aAbBcCdDeEfF[:digit:]]*))\\.)"
+          },
+          {
+            "tag_name": "listener_address",
+            "regex": "^listener\\.(((?:[_.[:digit:]]*|[_\\[\\]aAbBcCdDeEfF[:digit:]]*))\\.)"
+          },
+          {
+            "tag_name": "mongo_prefix",
+            "regex": "^mongo\\.(.+?)\\.(collection|cmd|cx_|op_|delays_|decoding_)(.*?)$"
+          }
+        ],
+        "stats_matcher": {
+          "inclusion_list": {
+            "patterns": [
+              {
+              "regex": ".*_rq_\\dxx$"
+              },
+              {
+              "regex": ".*_rq_time$"
+              },
+              {
+              "regex": "cluster.*"
+              },
+            ]
+          }
+        }
+      },
+      "admin": {
+        "access_log_path": "/dev/null",
+        "address": {
+          "socket_address": {
+            "address": "0.0.0.0",
+            "port_value": 9901
+          }
+        }
+      },
+      "static_resources": {
+        "clusters": [
+    {{- range $index, $element := .Values.ContainerPort }}
+          {
+            "name": "{{ $.Values.app }}-{{ $index }}",
+            "type": "STATIC",
+            "connect_timeout": "0.250s",
+            "lb_policy": "ROUND_ROBIN",
+{{- if $element.idleTimeout }}
+            "common_http_protocol_options": {
+              "idle_timeout": {{ $element.idleTimeout | quote }}
+            },
+{{- end }}
+{{- if or $element.useHTTP2 $element.useGRPC }}
+            "http2_protocol_options": {},
+{{- end }}
+{{- if and (not $element.useGRPC) (not $element.supportStreaming) }}
+            "max_requests_per_connection": "1",
+{{- end }}
+            "load_assignment": {
+              "cluster_name": "9",
+              "endpoints": {
+                "lb_endpoints": [
+                {
+                  "endpoint": {
+                    "address": {
+                      "socket_address": {
+                        "protocol": "TCP",
+                        "address": "127.0.0.1",
+                        "port_value": {{ $element.port  }}
+                      }
+                    }
+                  }
+                }
+                ]
+              }
+            }
+          },
+    {{- end }}
+        ],
+        "listeners":[
+    {{- range $index, $element := .Values.ContainerPort }}
+          {
+            "address": {
+              "socket_address": {
+                "protocol": "TCP",
+                "address": "0.0.0.0",
+                "port_value": {{ $element.envoyPort | default (add 8790 $index) }}
+              }
+            },
+            "filter_chains": [
+              {
+                "filters": [
+                  {
+                    "name": "envoy.filters.network.http_connection_manager",
+                    "config": {
+                      "codec_type": "AUTO",
+                      "stat_prefix": "stats",
+                      "route_config": {
+                        "virtual_hosts": [
+                          {
+                            "name": "backend",
+                            "domains": [
+                              "*"
+                            ],
+                            "routes": [
+                              {
+                                "match": {
+                                  "prefix": "/"
+                                },
+                                "route": {
+{{- if $element.supportStreaming }}
+                                  "timeout": "0s",
+{{- end }}
+                                  "cluster": "{{ $.Values.app }}-{{ $index }}"
+                                }
+                              }
+                            ]
+                          }
+                        ]
+                      },
+                      "http_filters": {
+                        "name": "envoy.filters.http.router"
+                      }
+                    }
+                  }
+                ]
+              }
+            ]
+          },
+    {{- end }}
+        ]
+      }
+    }
+---
+{{- end }}
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/values.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/values.yaml
new file mode 100644
index 000000000..d616d5d3f
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/values.yaml
@@ -0,0 +1,319 @@
+# Default values for myapp.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+MinReadySeconds: 5
+MaxSurge: 1
+MaxUnavailable: 0
+GracePeriod: 30
+ContainerPort:
+  - name: app
+    port: 8080
+    servicePort: 80
+    envoyPort: 8799
+    useHTTP2: true
+    supportStreaming: true
+    idleTimeout: 1800s
+#    servicemonitor:
+#      enabled: true
+#      path: /abc
+#      scheme: 'http'
+#      interval: 30s
+#      scrapeTimeout: 20s
+#      metricRelabelings:
+#        - sourceLabels: [namespace]
+#          regex: '(.*)'
+#          replacement: myapp
+#          targetLabel: target_namespace
+
+  # - name: app1
+  #   port: 8090
+  #   servicePort: 8080
+  #   useGRPC: true
+
+pauseForSecondsBeforeSwitchActive: 30
+waitForSecondsBeforeScalingDown: 30
+autoPromotionSeconds: 30
+shareProcessNamespace: false
+setHostnameAsFQDN: false
+readinessGates: []
+ephemeralContainers: []
+topologySpreadConstraints: []
+  # - maxSkew: 1
+  #   topologyKey: zone
+  #   whenUnsatisfiable: DoNotSchedule
+  #   autoLabelSelector: true
+  #   customLabelSelector:
+  #     foo: bar
+
+podSpec: {}
+  # subdomain: ""
+  # setHostnameAsFQDN: ""
+  # schedulerName: ""
+  # readinessGates:
+  #   - conditionType: "www.example.com/feature-1"
+  # dnsPolicy: ""
+  # enableServiceLinks: false
+  # dnsConfig: {}
+
+Spec:
+ Affinity:
+  Key:
+#  Key: kops.k8s.io/instancegroup 
+  Values:
+
+
+image:
+  pullPolicy: IfNotPresent
+
+secret:
+  enabled: false
+
+service:
+  type: ClusterIP
+  enabled: false
+#  name: "1234567890123456789012345678901234567890123456789012345678901234567890"
+  annotations: {}
+    # test1: test2
+    # test3: test4
+
+server:
+ deployment:
+   image_tag: 1-95af053
+   image: ""
+
+
+EnvVariables: []
+  # - name: FLASK_ENV
+  #   value: qa
+
+EnvVariablesFromFieldPath: []
+# - name: POD_NAME
+#   fieldPath: metadata.name
+
+prometheus:
+  release: monitoring
+
+servicemonitor:
+  additionalLabels: {}
+
+
+prometheusRule:
+  enabled: false
+  additionalLabels: {}
+  namespace: ""
+#  rules:
+#    # These are just examples rules, please adapt them to your needs
+#    - alert: TooMany500s
+#      expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"5.+"} ) / sum(nginx_ingress_controller_requests) ) > 5
+#      for: 1m
+#      labels:
+#        severity: critical
+#      annotations:
+#        description: Too many 5XXs
+#        summary: More than 5% of the all requests did return 5XX, this require your attention
+#    - alert: TooMany400s
+#      expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"4.+"} ) / sum(nginx_ingress_controller_requests) ) > 5
+#      for: 1m
+#      labels:
+#        severity: critical
+#      annotations:
+#        description: Too many 4XXs
+#        summary: More than 5% of the all requests did return 4XX, this require your attention
+#
+
+command:
+ enabled: false
+ value: []
+
+args:
+ enabled: false
+ value: []
+
+resources:
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+   limits:
+    cpu: 1
+    memory: 200Mi
+   requests:
+    cpu: 0.10
+    memory: 100Mi
+
+volumeMounts: []
+#     - name: log-volume
+#       mountPath: /var/log
+
+volumes: []
+#     - name: log-volume
+#       emptyDir: {}
+
+
+nodeSelector: {}
+
+
+#used for deployment algo selection
+orchestrator.deploymant.algo: 1
+
+ConfigMaps:
+ enabled: false
+ maps: []
+#  - name: config-map-1
+#    type: environment
+#    external: false
+#    data:
+#     key1: key1value-1
+#     key2: key2value-1
+#     key3: key3value-1
+#  - name: config-map-2
+#    type: volume
+#    external: false
+#    mountPath: /etc/config/2
+#    data:
+#     key1: |
+#      club : manchester utd
+#      nation : england
+#     key2: abc-2
+#     key3: abc-2
+#  - name: config-map-3
+#    type: environment
+#    external: true
+#    mountPath: /etc/config/3
+#    data: []
+#  - name: config-map-4
+#    type: volume
+#    external: true
+#    mountPath: /etc/config/4
+#    data: []
+
+
+ConfigSecrets:
+ enabled: false
+ secrets: []
+#  - name: config-secret-1
+#    type: environment
+#    external: false
+#    data:
+#     key1: key1value-1
+#     key2: key2value-1
+#     key3: key3value-1
+#  - name: config-secret-2
+#    type: volume
+#    external: false
+#    mountPath: /etc/config/2
+#    data:
+#     key1: |
+#      club : manchester utd
+#      nation : england
+#     key2: abc-2
+
+
+initContainers: []
+  ## Additional init containers to run before the Scheduler pods.
+  ## for example, be used to run a sidecar that chown Logs storage .
+  #- name: volume-mount-hack
+  #  image: busybox
+  #  command: ["sh", "-c", "chown -R 1000:1000 logs"]
+  #  volumeMounts:
+  #    - mountPath: /usr/local/airflow/logs
+  #      name: logs-data
+  ## Uncomment below line ONLY IF you want to reuse the container image.
+  ## This will assign your application's docker image to init container.
+  #  reuseContainerImage: true
+
+containers: []
+  ## Additional init containers to run before the Scheduler pods.
+  ## for example, be used to run a sidecar that chown Logs storage .
+  #- name: volume-mount-hack
+  #  image: busybox
+  #  command: ["sh", "-c", "chown -R 1000:1000 logs"]
+  #  volumeMounts:
+  #    - mountPath: /usr/local/airflow/logs
+  #      name: logs-data
+
+kedaAutoscaling: {}
+  # envSourceContainerName: "" 
+  # minReplicaCount: 1 
+  # maxReplicaCount: 2
+  # pollingInterval: 30                         
+  # successfulJobsHistoryLimit: 5              
+  # failedJobsHistoryLimit: 5
+  # rolloutStrategy: default
+  # scalingStrategy:
+  #   strategy: "custom"                        
+  #   customScalingQueueLengthDeduction: 1      
+  #   customScalingRunningJobPercentage: "0.5"  
+  #   pendingPodConditions:                     
+  #     - "Ready"
+  #     - "PodScheduled"
+  #     - "AnyOtherCustomPodCondition"
+  #   multipleScalersCalculation : "max"
+  # triggers: 
+  # - type: rabbitmq
+  #   metadata:
+  #     queueName: hello
+  #     host: RabbitMqHost
+  #     queueLength  : '5'
+  #   authenticationRef: {}
+  # triggerAuthentication:
+  #   enabled: false
+  #   name: ""
+  #   spec: {}
+
+rawYaml: []
+# - apiVersion: v1
+#   kind: Service
+#   metadata:
+#    annotations:
+#    labels:
+#     app: sample-metrics-app
+#    name: sample-metrics-app
+#    namespace: default
+#   spec:
+#    ports:
+#     - name: web
+#       port: 80
+#       protocol: TCP
+#       targetPort: 8080
+#    selector:
+#     app: sample-metrics-app
+#    sessionAffinity: None
+#    type: ClusterIP
+# - apiVersion: v1
+#   kind: Service
+#   metadata:
+#    annotations:
+#    labels:
+#     app: sample-metrics-app
+#    name: sample-metrics-app
+#    namespace: default
+#   spec:
+#    ports:
+#     - name: web
+#       port: 80
+#       protocol: TCP
+#       targetPort: 8080
+#    selector:
+#     app: sample-metrics-app
+#    sessionAffinity: None
+#    type: ClusterIP
+
+podDisruptionBudget: {}
+#  minAvailable: 1
+#  maxUnavailable: 1
+
+  ## Node tolerations for server scheduling to nodes with taints
+  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
+  ##
+
+tolerations: []
+  #  - key: "key"
+  #    operator: "Equal|Exists"
+  #    value: "value"
+  #    effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
+
+imagePullSecrets: []
+  # - test1
+  # - test2
\ No newline at end of file
diff --git a/scripts/sql/149_global_policy.down.sql b/scripts/sql/149_global_policy.down.sql
new file mode 100644
index 000000000..71ee12d19
--- /dev/null
+++ b/scripts/sql/149_global_policy.down.sql
@@ -0,0 +1,13 @@
+DROP TABLE IF EXISTS devtron_resource_searchable_key CASCADE;
+DROP SEQUENCE IF EXISTS id_seq_devtron_resource_searchable_key CASCADE;
+
+
+DROP TABLE IF EXISTS global_policy_history;
+DROP SEQUENCE IF EXISTS id_seq_global_policy_history;
+
+DROP TABLE IF EXISTS global_policy_searchable_field;
+DROP SEQUENCE IF EXISTS id_seq_global_policy_searchable_field;
+
+DROP TABLE IF EXISTS global_policy CASCADE;
+DROP SEQUENCE IF EXISTS id_seq_global_policy CASCADE;
+
diff --git a/scripts/sql/149_global_policy.up.sql b/scripts/sql/149_global_policy.up.sql
new file mode 100644
index 000000000..97926fc21
--- /dev/null
+++ b/scripts/sql/149_global_policy.up.sql
@@ -0,0 +1,85 @@
+CREATE SEQUENCE IF NOT EXISTS id_seq_devtron_resource_searchable_key;
+
+CREATE TABLE IF NOT EXISTS devtron_resource_searchable_key
+(
+    "id"         integer     NOT NULL DEFAULT nextval('id_seq_devtron_resource_searchable_key'::regclass),
+    "name"       varchar(100),
+    "is_removed" bool,
+    "created_on" timestamptz NOT NULL,
+    "created_by" int4        NOT NULL,
+    "updated_on" timestamptz NOT NULL,
+    "updated_by" int4        NOT NULL,
+    PRIMARY KEY ("id")
+);
+
+
+CREATE SEQUENCE IF NOT EXISTS id_seq_global_policy;
+
+CREATE TABLE IF NOT EXISTS global_policy
+(
+    "id"          integer     NOT NULL DEFAULT nextval('id_seq_global_policy'::regclass),
+    "name"        varchar(200),
+    "policy_of"   varchar(100),
+    "version"     varchar(20),
+    "policy_json" text,
+    "description" text,
+    "enabled"     bool,
+    "deleted"     bool,
+    "created_on"  timestamptz NOT NULL,
+    "created_by"  int4        NOT NULL,
+    "updated_on"  timestamptz NOT NULL,
+    "updated_by"  int4        NOT NULL,
+    PRIMARY KEY ("id")
+);
+
+
+CREATE SEQUENCE IF NOT EXISTS id_seq_global_policy_searchable_field;
+
+CREATE TABLE IF NOT EXISTS global_policy_searchable_field
+(
+    "id"                integer     NOT NULL DEFAULT nextval('id_seq_global_policy_searchable_field'::regclass),
+    "global_policy_id"  integer,
+    "searchable_key_id" integer,
+    "value"             text,
+    "is_regex"          bool        NOT NULL,
+    "policy_component"  integer,
+    "created_on"        timestamptz NOT NULL,
+    "created_by"        int4        NOT NULL,
+    "updated_on"        timestamptz NOT NULL,
+    "updated_by"        int4        NOT NULL,
+    PRIMARY KEY ("id"),
+    CONSTRAINT "global_policy_searchable_field_global_policy_id_fkey" FOREIGN KEY ("global_policy_id") REFERENCES "global_policy" ("id"),
+    CONSTRAINT "global_policy_searchable_field_searchable_key_id_fkey" FOREIGN KEY ("searchable_key_id") REFERENCES "devtron_resource_searchable_key" ("id")
+);
+
+CREATE INDEX "gpsf_value_idx" ON global_policy_searchable_field USING BTREE ("value");
+
+
+CREATE SEQUENCE IF NOT EXISTS id_seq_global_policy_history;
+
+CREATE TABLE IF NOT EXISTS global_policy_history
+(
+    "id"                integer     NOT NULL DEFAULT nextval('id_seq_global_policy_history'::regclass),
+    "global_policy_id"  integer,
+    "history_of_action" varchar(50),
+    "history_data"      jsonb,
+    "policy_of"         varchar(100),
+    "policy_version"    varchar(20),
+    "policy_data"       text,
+    "description"       text,
+    "enabled"           bool,
+    "created_on"        timestamptz NOT NULL,
+    "created_by"        int4        NOT NULL,
+    "updated_on"        timestamptz NOT NULL,
+    "updated_by"        int4        NOT NULL,
+    PRIMARY KEY ("id"),
+    CONSTRAINT "global_policy_history_global_policy_id_fkey" FOREIGN KEY ("global_policy_id") REFERENCES "global_policy" ("id")
+);
+
+
+INSERT INTO devtron_resource_searchable_key(name, is_removed, created_on, created_by, updated_on, updated_by)
+VALUES ('PROJECT_APP_NAME', false, now(), 1, now(), 1),
+       ('CLUSTER_ENV_NAME', false, now(), 1, now(), 1),
+       ('IS_ALL_PRODUCTION_ENV', false, now(), 1, now(), 1),
+       ('CI_PIPELINE_BRANCH', false, now(), 1, now(), 1),
+       ('CI_PIPELINE_TRIGGER_ACTION', false, now(), 1, now(), 1);
diff --git a/scripts/sql/150_cronjob_job_1-5-0.down.sql b/scripts/sql/150_cronjob_job_1-5-0.down.sql
new file mode 100644
index 000000000..365cc3ee3
--- /dev/null
+++ b/scripts/sql/150_cronjob_job_1-5-0.down.sql
@@ -0,0 +1,3 @@
+DELETE FROM global_strategy_metadata_chart_ref_mapping WHERE chart_ref_id=(select id from chart_ref where version='1.5.0' and name ='Job & CronJob');
+
+DELETE FROM "public"."chart_ref" WHERE ("location" = 'cronjob-chart_1-5-0' AND "version" = '1.5.0');
diff --git a/scripts/sql/150_cronjob_job_1-5-0.up.sql b/scripts/sql/150_cronjob_job_1-5-0.up.sql
new file mode 100644
index 000000000..3b6337a9c
--- /dev/null
+++ b/scripts/sql/150_cronjob_job_1-5-0.up.sql
@@ -0,0 +1,8 @@
+UPDATE chart_ref SET is_default=false;
+INSERT INTO "public"."chart_ref" ("location", "version", "is_default", "active", "created_on", "created_by", "updated_on", "updated_by", "name","deployment_strategy_path") VALUES
+('cronjob-chart_1-5-0', '1.5.0', 'f', 't', 'now()', 1, 'now()', 1, 'Job & CronJob','pipeline-values.yaml');
+
+UPDATE "public"."chart_ref" SET "is_default" = 't' WHERE "location" = 'reference-chart_4-17-0' AND "version" = '4.17.0';
+
+INSERT INTO global_strategy_metadata_chart_ref_mapping ("global_strategy_metadata_id","chart_ref_id", "active","default","created_on", "created_by", "updated_on", "updated_by") VALUES 
+((select id from global_strategy_metadata where name='ROLLING') ,(select id from chart_ref where location='cronjob-chart_1-5-0'), true,true,now(), 1, now(), 1);
diff --git a/util/helper.go b/util/helper.go
index 7b02c7369..47f4e9d52 100644
--- a/util/helper.go
+++ b/util/helper.go
@@ -294,3 +294,14 @@ func InterfaceToFloat(resp interface{}) float64 {
 	}
 	return dat
 }
+
+type HpaResourceRequest struct {
+	ResourceName    string
+	ReqReplicaCount float64
+	ReqMaxReplicas  float64
+	ReqMinReplicas  float64
+	IsEnable        bool
+	Group           string
+	Version         string
+	Kind            string
+}
diff --git a/util/k8s/k8sApplicationService.go b/util/k8s/k8sApplicationService.go
index 57d95ee3f..d2589333c 100644
--- a/util/k8s/k8sApplicationService.go
+++ b/util/k8s/k8sApplicationService.go
@@ -25,7 +25,10 @@ import (
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/rest"
+	"log"
+	"net/url"
 	"strconv"
 	"strings"
 	"sync"
@@ -55,6 +58,7 @@ type K8sApplicationService interface {
 	GetAllApiResources(ctx context.Context, clusterId int, isSuperAdmin bool, userId int32) (*application.GetAllApiResourcesResponse, error)
 	GetResourceList(ctx context.Context, token string, request *ResourceRequestBean, validateResourceAccess func(token string, clusterName string, request ResourceRequestBean, casbinAction string) bool) (*util.ClusterResourceListMap, error)
 	ApplyResources(ctx context.Context, token string, request *application.ApplyResourcesRequest, resourceRbacHandler func(token string, clusterName string, request ResourceRequestBean, casbinAction string) bool) ([]*application.ApplyResourcesResponse, error)
+	FetchConnectionStatusForCluster(k8sClientSet *kubernetes.Clientset, clusterId int) error
 	RotatePods(ctx context.Context, request *RotatePodRequest) (*RotatePodResponse, error)
 }
 type K8sApplicationServiceImpl struct {
@@ -857,3 +861,33 @@ func (impl *K8sApplicationServiceImpl) applyResourceFromManifest(ctx context.Con
 
 	return isUpdateResource, nil
 }
+
+func (impl *K8sApplicationServiceImpl) FetchConnectionStatusForCluster(k8sClientSet *kubernetes.Clientset, clusterId int) error {
+	//using livez path as healthz path is deprecated
+	path := "/livez"
+	response, err := k8sClientSet.Discovery().RESTClient().Get().AbsPath(path).DoRaw(context.Background())
+	log.Println("received response for cluster livez status", "response", string(response), "err", err, "clusterId", clusterId)
+	if err != nil {
+		if _, ok := err.(*url.Error); ok {
+			err = fmt.Errorf("Incorrect server url : %v", err)
+		} else if statusError, ok := err.(*errors2.StatusError); ok {
+			if statusError != nil {
+				errReason := statusError.ErrStatus.Reason
+				var errMsg string
+				if errReason == metav1.StatusReasonUnauthorized {
+					errMsg = "token seems invalid or does not have sufficient permissions"
+				} else {
+					errMsg = statusError.ErrStatus.Message
+				}
+				err = fmt.Errorf("%s : %s", errReason, errMsg)
+			} else {
+				err = fmt.Errorf("Validation failed : %v", err)
+			}
+		} else {
+			err = fmt.Errorf("Validation failed : %v", err)
+		}
+	} else if err == nil && string(response) != "ok" {
+		err = fmt.Errorf("Validation failed with response : %s", string(response))
+	}
+	return err
+}
diff --git a/wire_gen.go b/wire_gen.go
index c9ebcfb6d..a3a2f4d64 100644
--- a/wire_gen.go
+++ b/wire_gen.go
@@ -431,7 +431,7 @@ func InitializeApp() (*App, error) {
 	appGroupMappingRepositoryImpl := appGroup.NewAppGroupMappingRepositoryImpl(db)
 	appGroupServiceImpl := appGroup2.NewAppGroupServiceImpl(sugaredLogger, appGroupRepositoryImpl, appGroupMappingRepositoryImpl, enforcerUtilImpl)
 	chartDeploymentServiceImpl := util.NewChartDeploymentServiceImpl(sugaredLogger, repositoryServiceClientImpl)
-	pipelineBuilderImpl := pipeline.NewPipelineBuilderImpl(sugaredLogger, ciCdPipelineOrchestratorImpl, dockerArtifactStoreRepositoryImpl, materialRepositoryImpl, appRepositoryImpl, pipelineRepositoryImpl, propertiesConfigServiceImpl, ciTemplateRepositoryImpl, ciPipelineRepositoryImpl, applicationServiceClientImpl, chartRepositoryImpl, ciArtifactRepositoryImpl, ecrConfig, envConfigOverrideRepositoryImpl, environmentRepositoryImpl, pipelineConfigRepositoryImpl, utilMergeUtil, appWorkflowRepositoryImpl, ciConfig, cdWorkflowRepositoryImpl, appServiceImpl, imageScanResultRepositoryImpl, argoK8sClientImpl, gitFactory, attributesServiceImpl, acdAuthConfig, gitOpsConfigRepositoryImpl, pipelineStrategyHistoryServiceImpl, prePostCiScriptHistoryServiceImpl, prePostCdScriptHistoryServiceImpl, deploymentTemplateHistoryServiceImpl, appLevelMetricsRepositoryImpl, pipelineStageServiceImpl, chartRefRepositoryImpl, chartTemplateServiceImpl, chartServiceImpl, helmAppServiceImpl, deploymentGroupRepositoryImpl, ciPipelineMaterialRepositoryImpl, userServiceImpl, ciTemplateServiceImpl, ciTemplateOverrideRepositoryImpl, gitMaterialHistoryServiceImpl, ciTemplateHistoryServiceImpl, ciPipelineHistoryServiceImpl, globalStrategyMetadataRepositoryImpl, globalStrategyMetadataChartRefMappingRepositoryImpl, pipelineDeploymentServiceTypeConfig, appStatusRepositoryImpl, workflowDagExecutorImpl, enforcerUtilImpl, argoUserServiceImpl, ciWorkflowRepositoryImpl, appGroupServiceImpl, chartDeploymentServiceImpl)
+	pipelineBuilderImpl := pipeline.NewPipelineBuilderImpl(sugaredLogger, ciCdPipelineOrchestratorImpl, dockerArtifactStoreRepositoryImpl, materialRepositoryImpl, appRepositoryImpl, pipelineRepositoryImpl, propertiesConfigServiceImpl, ciTemplateRepositoryImpl, ciPipelineRepositoryImpl, applicationServiceClientImpl, chartRepositoryImpl, ciArtifactRepositoryImpl, ecrConfig, envConfigOverrideRepositoryImpl, environmentRepositoryImpl, clusterRepositoryImpl, pipelineConfigRepositoryImpl, utilMergeUtil, appWorkflowRepositoryImpl, ciConfig, cdWorkflowRepositoryImpl, appServiceImpl, imageScanResultRepositoryImpl, argoK8sClientImpl, gitFactory, attributesServiceImpl, acdAuthConfig, gitOpsConfigRepositoryImpl, pipelineStrategyHistoryServiceImpl, prePostCiScriptHistoryServiceImpl, prePostCdScriptHistoryServiceImpl, deploymentTemplateHistoryServiceImpl, appLevelMetricsRepositoryImpl, pipelineStageServiceImpl, chartRefRepositoryImpl, chartTemplateServiceImpl, chartServiceImpl, helmAppServiceImpl, deploymentGroupRepositoryImpl, ciPipelineMaterialRepositoryImpl, userServiceImpl, ciTemplateServiceImpl, ciTemplateOverrideRepositoryImpl, gitMaterialHistoryServiceImpl, ciTemplateHistoryServiceImpl, ciPipelineHistoryServiceImpl, globalStrategyMetadataRepositoryImpl, globalStrategyMetadataChartRefMappingRepositoryImpl, pipelineDeploymentServiceTypeConfig, appStatusRepositoryImpl, workflowDagExecutorImpl, enforcerUtilImpl, argoUserServiceImpl, ciWorkflowRepositoryImpl, appGroupServiceImpl, chartDeploymentServiceImpl)
 	dbMigrationServiceImpl := pipeline.NewDbMogrationService(sugaredLogger, dbMigrationConfigRepositoryImpl)
 	workflowServiceImpl := pipeline.NewWorkflowServiceImpl(sugaredLogger, ciConfig, globalCMCSServiceImpl)
 	ciServiceImpl := pipeline.NewCiServiceImpl(sugaredLogger, workflowServiceImpl, ciPipelineMaterialRepositoryImpl, ciWorkflowRepositoryImpl, ciConfig, eventRESTClientImpl, eventSimpleFactoryImpl, mergeUtil, ciPipelineRepositoryImpl, prePostCiScriptHistoryServiceImpl, pipelineStageServiceImpl, userServiceImpl, ciTemplateServiceImpl, appCrudOperationServiceImpl)
@@ -474,7 +474,7 @@ func InitializeApp() (*App, error) {
 	appListingRouterImpl := router.NewAppListingRouterImpl(appListingRestHandlerImpl)
 	chartRepositoryServiceImpl := chartRepo.NewChartRepositoryServiceImpl(sugaredLogger, chartRepoRepositoryImpl, k8sUtil, clusterServiceImplExtended, acdAuthConfig, httpClient, serverEnvConfigServerEnvConfig)
 	deleteServiceExtendedImpl := delete2.NewDeleteServiceExtendedImpl(sugaredLogger, teamServiceImpl, clusterServiceImplExtended, environmentServiceImpl, appRepositoryImpl, environmentRepositoryImpl, pipelineRepositoryImpl, chartRepositoryServiceImpl, installedAppRepositoryImpl)
-	environmentRestHandlerImpl := cluster3.NewEnvironmentRestHandlerImpl(environmentServiceImpl, sugaredLogger, userServiceImpl, validate, enforcerImpl, deleteServiceExtendedImpl)
+	environmentRestHandlerImpl := cluster3.NewEnvironmentRestHandlerImpl(environmentServiceImpl, k8sApplicationServiceImpl, sugaredLogger, userServiceImpl, validate, enforcerImpl, deleteServiceExtendedImpl)
 	environmentRouterImpl := cluster3.NewEnvironmentRouterImpl(environmentRestHandlerImpl)
 	clusterNoteRepositoryImpl := repository2.NewClusterNoteRepositoryImpl(db, sugaredLogger)
 	clusterNoteHistoryRepositoryImpl := repository2.NewClusterNoteHistoryRepositoryImpl(db, sugaredLogger)
@@ -557,7 +557,7 @@ func InitializeApp() (*App, error) {
 	chartRefRouterImpl := router.NewChartRefRouterImpl(chartRefRestHandlerImpl)
 	configMapRestHandlerImpl := restHandler.NewConfigMapRestHandlerImpl(pipelineBuilderImpl, sugaredLogger, chartServiceImpl, userServiceImpl, teamServiceImpl, enforcerImpl, pipelineRepositoryImpl, enforcerUtilImpl, configMapServiceImpl)
 	configMapRouterImpl := router.NewConfigMapRouterImpl(configMapRestHandlerImpl)
-	installedAppRestHandlerImpl := appStore.NewInstalledAppRestHandlerImpl(sugaredLogger, userServiceImpl, enforcerImpl, enforcerUtilImpl, installedAppServiceImpl, validate, clusterServiceImplExtended, applicationServiceClientImpl, appStoreDeploymentServiceImpl, helmAppClientImpl, helmAppServiceImpl, argoUserServiceImpl, cdApplicationStatusUpdateHandlerImpl, installedAppRepositoryImpl)
+	installedAppRestHandlerImpl := appStore.NewInstalledAppRestHandlerImpl(sugaredLogger, userServiceImpl, enforcerImpl, enforcerUtilImpl, enforcerUtilHelmImpl, installedAppServiceImpl, validate, clusterServiceImplExtended, applicationServiceClientImpl, appStoreDeploymentServiceImpl, helmAppClientImpl, helmAppServiceImpl, argoUserServiceImpl, cdApplicationStatusUpdateHandlerImpl, installedAppRepositoryImpl)
 	appStoreValuesRestHandlerImpl := appStoreValues.NewAppStoreValuesRestHandlerImpl(sugaredLogger, userServiceImpl, appStoreValuesServiceImpl)
 	appStoreValuesRouterImpl := appStoreValues.NewAppStoreValuesRouterImpl(appStoreValuesRestHandlerImpl)
 	appStoreServiceImpl := service3.NewAppStoreServiceImpl(sugaredLogger, appStoreApplicationVersionRepositoryImpl)


Test patch:
diff --git a/pkg/chartRepo/ChartRepositoryService_test.go b/pkg/chartRepo/ChartRepositoryService_test.go
index 3ddd40696..65c8731ef 100644
--- a/pkg/chartRepo/ChartRepositoryService_test.go
+++ b/pkg/chartRepo/ChartRepositoryService_test.go
@@ -2,12 +2,13 @@ package chartRepo
 
 import (
 	"encoding/json"
+	"testing"
+
 	"github.com/devtron-labs/devtron/internal/sql/repository"
 	"github.com/devtron-labs/devtron/internal/util"
-	"github.com/ghodss/yaml"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
-	"testing"
+	"sigs.k8s.io/yaml"
 )
 
 type ChartRepositoryServiceMock struct {
diff --git a/pkg/pipeline/GitopsOrHelmOption_test.go b/pkg/pipeline/GitopsOrHelmOption_test.go
index 7b4e36b77..5f4f6416c 100644
--- a/pkg/pipeline/GitopsOrHelmOption_test.go
+++ b/pkg/pipeline/GitopsOrHelmOption_test.go
@@ -18,7 +18,7 @@ func TestGitopsOrHelmOption(t *testing.T) {
 		pipelineBuilderService := NewPipelineBuilderImpl(sugaredLogger, nil, nil, nil, nil,
 			nil, nil, nil,
 			nil, nil, nil, nil, nil,
-			nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
+			nil, nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil,
@@ -71,7 +71,7 @@ func TestGitopsOrHelmOption(t *testing.T) {
 		pipelineBuilderService := NewPipelineBuilderImpl(sugaredLogger, nil, nil, nil, nil,
 			nil, nil, nil,
 			nil, nil, nil, nil, nil,
-			nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
+			nil, nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil,
@@ -124,7 +124,7 @@ func TestGitopsOrHelmOption(t *testing.T) {
 		pipelineBuilderService := NewPipelineBuilderImpl(sugaredLogger, nil, nil, nil, nil,
 			nil, nil, nil,
 			nil, nil, nil, nil, nil,
-			nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
+			nil, nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil,
@@ -215,7 +215,7 @@ func TestGitopsOrHelmOption(t *testing.T) {
 		pipelineBuilderService := NewPipelineBuilderImpl(sugaredLogger, nil, nil, nil, nil,
 			mockedPipelineRepository, nil, nil,
 			nil, nil, nil, nil, nil,
-			nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
+			nil, nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil,
@@ -272,7 +272,7 @@ func TestGitopsOrHelmOption(t *testing.T) {
 		pipelineBuilderService := NewPipelineBuilderImpl(sugaredLogger, nil, nil, nil, nil,
 			mockedPipelineRepository, nil, nil,
 			nil, nil, nil, nil, nil,
-			nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
+			nil, nil, nil, nil, util.MergeUtil{Logger: sugaredLogger}, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil, nil, nil,
 			nil, nil, nil,
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/secrets-test-values.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/secrets-test-values.yaml
new file mode 100644
index 000000000..4a20404db
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/secrets-test-values.yaml
@@ -0,0 +1,1 @@
+{"ConfigSecrets":{"enabled":true,"secrets":[{"data":{"standard_key":"c3RhbmRhcmQtdmFsdWU="},"external":false,"externalType":"","mountPath":"/test","name":"normal-secret","type":"volume"},{"data":{"secret_key":"U0VDUkVUIERBVEE="},"external":true,"externalType":"AWSSecretsManager","mountPath":"","name":"external-secret-3","type":"environment"}]}}
\ No newline at end of file
diff --git a/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/test_values.yaml b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/test_values.yaml
new file mode 100644
index 000000000..af35e1562
--- /dev/null
+++ b/scripts/devtron-reference-helm-charts/cronjob-chart_1-5-0/test_values.yaml
@@ -0,0 +1,404 @@
+# Default values for myapp.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+kind: ScaledJob
+
+jobConfigs:
+  backoffLimit: 5
+  activeDeadlineSeconds: 100
+  parallelism: 1
+  completions: 2
+  suspend: false
+  ttlSecondsAfterFinished: 100
+
+cronjobConfigs:
+  schedule: "* * * * *"
+  startingDeadlineSeconds: 100
+  concurrencyPolicy: Allow
+  suspend: false
+  successfulJobsHistoryLimit: 3
+  failedJobsHistoryLimit: 1
+  restartPolicy: OnFailure
+
+imagePullSecrets:
+  - test1
+  - test2
+MinReadySeconds: 5
+MaxSurge: 1
+MaxUnavailable: 0
+GracePeriod: 30
+ContainerPort:
+  - name: app
+    port: 8080
+    servicePort: 80
+    envoyPort: 8799
+    useHTTP2: true
+    supportStreaming: true
+    idleTimeout: 1800s
+    servicemonitor:
+      enabled: true
+      path: /abc
+      scheme: 'http'
+      interval: 30s
+      scrapeTimeout: 20s
+      metricRelabelings:
+        - sourceLabels: [namespace]
+          regex: '(.*)'
+          replacement: myapp
+          targetLabel: target_namespace
+  - name: app1
+    port: 8090
+    servicePort: 8080
+    useGRPC: true
+    servicemonitor:
+      enabled: true
+  - name: app2
+    port: 8091
+    servicePort: 8081
+    useGRPC: true
+
+pauseForSecondsBeforeSwitchActive: 30
+waitForSecondsBeforeScalingDown: 30
+autoPromotionSeconds: 30
+
+Spec:
+  Affinity:
+    Key:
+    #  Key: kops.k8s.io/instancegroup
+    Values:
+
+
+image:
+  pullPolicy: IfNotPresent
+
+secret:
+  enabled: false
+
+service:
+  enabled: false
+  type: ClusterIP
+  #  name: "1234567890123456789012345678901234567890123456789012345678901234567890"
+  annotations: {}
+    # test1: test2
+  # test3: test4
+
+server:
+  deployment:
+    image_tag: 1-95af053
+    image: ""
+deploymentType: "RECREATE"
+
+
+EnvVariables:
+  - name: FLASK_ENV
+    value: qa
+
+prometheus:
+  release: monitoring
+
+servicemonitor:
+  additionalLabels: {}
+
+kedaAutoscaling:
+  envSourceContainerName: "" 
+  minReplicaCount: 1 
+  maxReplicaCount: 2
+  pollingInterval: 30                         
+  successfulJobsHistoryLimit: 5              
+  failedJobsHistoryLimit: 5
+  rolloutStrategy: default
+  scalingStrategy:
+    strategy: "custom"                        
+    customScalingQueueLengthDeduction: 1      
+    customScalingRunningJobPercentage: "0.5"  
+    pendingPodConditions:                     
+      - "Ready"
+      - "PodScheduled"
+      - "AnyOtherCustomPodCondition"
+    multipleScalersCalculation : "max"
+  triggers: 
+  - type: rabbitmq
+    metadata:
+      queueName: hello
+      host: RabbitMqHost
+      queueLength  : '5'
+  authenticationRef: {}
+  triggerAuthentication:
+    enabled: true
+    name: ""
+    spec: {}
+
+prometheusRule:
+  enabled: true
+  additionalLabels: {}
+  namespace: ""
+  rules:
+    # These are just examples rules, please adapt them to your needs
+    - alert: TooMany500s
+      expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"5.+"} ) / sum(nginx_ingress_controller_requests) ) > 5
+      for: 1m
+      labels:
+        severity: critical
+      annotations:
+        description: Too many 5XXs
+        summary: More than 5% of the all requests did return 5XX, this require your attention
+    - alert: TooMany400s
+      expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"4.+"} ) / sum(nginx_ingress_controller_requests) ) > 5
+      for: 1m
+      labels:
+        severity: critical
+      annotations:
+        description: Too many 4XXs
+        summary: More than 5% of the all requests did return 4XX, this require your attention
+
+command:
+  enabled: true
+  value:
+    - /bin/sh
+    
+args:
+  enabled: false
+  value: []
+
+resources:
+  # We usually recommend not to specify default resources and to leave this as a conscious
+  # choice for the user. This also increases chances charts run on environments with little
+  # resources, such as Minikube. If you do want to specify resources, uncomment the following
+  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+  limits:
+    cpu: 1
+    memory: 200Mi
+  requests:
+    cpu: 0.10
+    memory: 100Mi
+volumeMounts:
+  - name: log-volume
+    mountPath: /var/log
+
+volumes:
+  - name: log-volume
+    emptyDir: {}
+
+
+nodeSelector: {}
+
+
+#used for deployment algo selection
+orchestrator.deploymant.algo: 1
+
+ConfigMaps:
+  enabled: false
+  # maps:
+  # - name: config-map-1
+  #   type: environment
+  #   external: false
+  #   data:
+  #     key1: key1value-1
+  #     key2: key2value-1
+  #     key3: key3value-1
+  # - name: config-map-2
+  #   type: volume
+  #   external: false
+  #   mountPath: /etc/config/2
+  #   subPath: false
+  #   filePermission: "777"
+  #   data:
+  #     key1: |
+  #       club : manchester utd
+  #       nation : england
+  #     key2: abc-2
+  #     key3: abc-2
+  # - name: config-map-3
+  #   type: environment
+  #   external: true
+  #   mountPath: /etc/config/3
+  #   data: []
+  # - name: config-map-4
+  #   type: volume
+  #   external: true
+  #   mountPath: /etc/config/4
+  #   data: []
+
+
+ConfigSecrets:
+  enabled: false
+  secrets:
+  - name: config-secret-1
+    type: environment
+    external: true
+    externalType: ESO_AWSSecretsManager
+    esoSecretData:
+      secretStore:
+        aws:
+          service: SecretsManager
+          region: us-east-1
+          auth:
+            secretRef:
+              accessKeyIDSecretRef:
+                name: awssm-secret
+                key: access-key
+              secretAccessKeySecretRef:
+                name: awssm-secret
+                key: secret-access-key
+      esoData:
+        - secretKey: prod-mysql-password
+          key: secrets/prod-mysql-secrets
+          property: prodPassword
+        - secretKey: prod-mysql-password
+          key: secrets/prod-mysql-secrets
+          property: prodPassword
+        - secretKey: prod-mysql-password
+          key: secrets/prod-mysql-secrets
+          property: prodPassword
+        - secretKey: prod-mysql-password
+          key: secrets/prod-mysql-secrets
+          property: prodPassword
+    data:
+      key1: key1value-1
+      key2: key2value-1
+      key3: key3value-1
+  # - name: config-secret-1
+  #   type: environment
+  #   external: false
+  #   data:
+  #     key1: key1value-1
+  #     key2: key2value-1
+  #     key3: key3value-1
+  # - name: config-secret-2x
+  #   type: volume
+  #   external: false
+  #   mountPath: /etc/config/2
+  #   subPath: false
+  #   filePermission: "777"
+  #   data:
+  #     key1: |
+  #       club : manchester utd
+  #       nation : england
+  #     key2: abc-2
+  #     key3: abc-2
+
+
+initContainers:
+  ## Additional init containers to run before the Scheduler pods.
+  ## for example, be used to run a sidecar that chown Logs storage.
+  ## If reuse container image is set as true, you cannot specify an addition init container along with the image.
+  # - reuseContainerImage: true
+  #   volumeMounts:
+  #     - mountPath: /etc/ls-oms
+  #       name: ls-oms-cm-vol
+  #   command:
+  #     - flyway
+  #     - -configFiles=/etc/ls-oms/flyway.conf
+  #     - migrate
+
+  # - name: volume-mount-hack
+  #   image: busybox
+  #   command: ["sh", "-c", "chown -R 1000:1000 logs"]
+  #   volumeMounts:
+  #    - mountPath: /usr/local/airflow/logs
+  #      name: logs-data
+  #   resources:
+  #     limits:
+  #       cpu: 50m
+  #       memory: 100Mi
+  #     requests:
+  #       cpu: 10m
+  #       memory: 50Mi
+  - name: volume-mount-hack2
+    image: busybox
+    command: ["sh", "-c", "chown -R 1000:1000 logs"]
+    volumeMounts:
+     - mountPath: /usr/local/airflow/logs
+       name: logs-data
+    resources:
+      limits:
+        cpu: 50m
+        memory: 100Mi
+      requests:
+        cpu: 10m
+        memory: 50Mi
+
+containers:
+  ## Additional init containers to run before the Scheduler pods.
+  ## for example, be used to run a sidecar that chown Logs storage .
+  # - name: volume-mount-hack
+  #   image: busybox
+  #   command: ["sh", "-c", "chown -R 1000:1000 logs"]
+  #   volumeMounts:
+  #    - mountPath: /usr/local/airflow/logs
+  #      name: logs-data
+
+
+rawYaml: []
+# - apiVersion: v1
+#   kind: Service
+#   metadata:
+#    annotations:
+#    labels:
+#     app: sample-metrics-app
+#    name: sample-metrics-app
+#    namespace: default
+#   spec:
+#    ports:
+#     - name: web
+#       port: 80
+#       protocol: TCP
+#       targetPort: 8080
+#    selector:
+#     app: sample-metrics-app
+#    sessionAffinity: None
+#    type: ClusterIP
+# - apiVersion: v1
+#   kind: Service
+#   metadata:
+#    annotations:
+#    labels:
+#     app: sample-metrics-app
+#    name: sample-metrics-app
+#    namespace: default
+#   spec:
+#    ports:
+#     - name: web
+#       port: 80
+#       protocol: TCP
+#       targetPort: 8080
+#    selector:
+#     app: sample-metrics-app
+#    sessionAffinity: None
+#    type: ClusterIP
+
+podDisruptionBudget: {}
+  #  minAvailable: 1
+  #  maxUnavailable: 1
+
+  ## Node tolerations for server scheduling to nodes with taints
+  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
+##
+
+tolerations: []
+  # - key: "key"
+  #   operator: "Equal|Exists"
+  #   value: "value"
+  #   effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
+
+appMetrics: false
+
+podAnnotations:
+  fluentbit.io/exclude: true
+
+podLabels:
+  severity: critical
+
+containerSecurityContext:
+  allowPrivilegeEscalation: false
+  capabilities:
+    add:
+    - SYS_PTRACE
+
+
+podSecurityContext: 
+  runAsUser: 1000
+  runAsGroup: 3000
+  fsGroup: 2000 
+
+shareProcessNamespace: true