Repository: devtron-labs/devtron
Pull request #3506 (2023-06-13 11:42:22)

fix: acd app delete non cascade
Duplicate of https://github.com/devtron-labs/devtron/pull/3339

gitguardian[bot]: #### ⚠️ GitGuardian has uncovered 2 secrets following the scan of your pull request.

Please consider investigating the findings and remediating the incidents. Failure to do so may lead to compromising the associated services or software components.

<details>
<summary>🔎 Detected hardcoded secrets in your pull request</summary>
<br>

| GitGuardian id | Secret                    | Commit           | Filename        |                      |
| -------------- | ------------------------- | ---------------- | --------------- | -------------------- |
| [141558](https://dashboard.gitguardian.com/incidents/141558?occurrence=95174993) | Generic High Entropy Secret | ac512044fae012e61e71747a24907582048b1a46 | scripts/devtron-reference-helm-charts/statefulset-chart_4-18-0/env-values.yaml | [View secret](https://github.com/devtron-labs/devtron/commit/ac512044fae012e61e71747a24907582048b1a46#diff-017ea268e08632afafd2af65b083f5d3985586b58cef061e738efc95433c2f9dR48) |
| [2763127](https://dashboard.gitguardian.com/incidents/2763127?occurrence=95174994) | Generic High Entropy Secret | ac512044fae012e61e71747a24907582048b1a46 | scripts/devtron-reference-helm-charts/statefulset-chart_4-18-0/secrets-test-values.yaml | [View secret](https://github.com/devtron-labs/devtron/commit/ac512044fae012e61e71747a24907582048b1a46#diff-20d6f03f2d7efcb6931f52419609ce946899823dce66646d9912f7f5dabf4d26R1) |



</details>

<details>
<summary>🛠 Guidelines to remediate hardcoded secrets</summary>
<br>

1. Understand the implications of revoking this secret by investigating where it is used in your code.
2. Replace and store your secrets safely. [Learn here](https://blog.gitguardian.com/secrets-api-management?utm_source=product&amp;utm_medium=GitHub_checks&amp;utm_campaign=check_run_comment) the best practices.
3. Revoke and [rotate these secrets](https://docs.gitguardian.com/secrets-detection/detectors/generics/generic_high_entropy_secret#revoke-the-secret?utm_source=product&amp;utm_medium=GitHub_checks&amp;utm_campaign=check_run_comment).
4. If possible, [rewrite git history](https://blog.gitguardian.com/rewriting-git-history-cheatsheet?utm_source=product&amp;utm_medium=GitHub_checks&amp;utm_campaign=check_run_comment). Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.

To avoid such incidents in the future consider

-   following these [best practices](https://blog.gitguardian.com/secrets-api-management/?utm_source=product&amp;utm_medium=GitHub_checks&amp;utm_campaign=check_run_comment) for managing and storing secrets including API keys and other credentials
-   install [secret detection on pre-commit](https://docs.gitguardian.com/ggshield-docs/integrations/git-hooks/pre-commit?utm_source=product&amp;utm_medium=GitHub_checks&amp;utm_campaign=check_run_comment) to catch secret before it leaves your machine and ease remediation.


</details>

---

<sup>🦉 [GitGuardian](https://dashboard.gitguardian.com/auth/login/?utm_medium=checkruns&amp;utm_source=github&amp;utm_campaign=cr1) detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.<br/><br/>Our GitHub checks need improvements? [Share your feedbacks](https://050127dayho.typeform.com/to/KmeAPTMk)!</sup>
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3506)

[![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=3506&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=3506&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3506&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=3506&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=3506&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3506&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=3506&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=3506&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3506&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=3506&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=3506&resolved=false&types=CODE_SMELL) [14 Code Smells](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3506&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=3506) No Coverage information  
[![16.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/20-16px.png '16.1%')](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3506&metric=new_duplicated_lines_density&view=list) [16.1% Duplication](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3506&metric=new_duplicated_lines_density&view=list)


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

[![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=3506&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=3506&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3506&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=3506&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=3506&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3506&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=3506&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=3506&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=devtron-labs_devtron&pullRequest=3506&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=3506&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=3506&resolved=false&types=CODE_SMELL) [14 Code Smells](https://sonarcloud.io/project/issues?id=devtron-labs_devtron&pullRequest=3506&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=3506) No Coverage information  
[![16.1%](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/20-16px.png '16.1%')](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3506&metric=new_duplicated_lines_density&view=list) [16.1% Duplication](https://sonarcloud.io/component_measures?id=devtron-labs_devtron&pullRequest=3506&metric=new_duplicated_lines_density&view=list)



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)

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/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 00574addf..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 {
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/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/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/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..026defc98 100644
--- a/pkg/appStore/deployment/tool/AppStoreDeploymentHelmService.go
+++ b/pkg/appStore/deployment/tool/AppStoreDeploymentHelmService.go
@@ -134,6 +134,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/chartRepo/ChartRepositoryService.go b/pkg/chartRepo/ChartRepositoryService.go
index 4fdf6c8c1..d933a4eaf 100644
--- a/pkg/chartRepo/ChartRepositoryService.go
+++ b/pkg/chartRepo/ChartRepositoryService.go
@@ -572,6 +572,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/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/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/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/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/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/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