Repository: devtron-labs/devtron
Pull request #2673 (2022-11-23 07:54:50)

feat: Gitops or helm options for cd
# Description

Added GitOps or Helm deployment option for CD. Earlier if GitOps was configured then apps were deployed using GitOps by default, but now user will have option to choose between GitOps or Helm. GitOps and Helm option can be disabled by using environment variable.

Fixes # (issue)

## Type of change

- [ ] Bug fix (non-breaking change which fixes an issue)
- [x] New feature (non-breaking change which adds functionality)
- [x] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update

# How Has This Been Tested?

For testing :- 

1) Check if GitOps/Helm option is available when creating CD pipeline. Also check that this cannot be changed during update.
2) Check if GitOps/Helm option is available when deploying Helm app. Check that this cannot be changed once Helm app is deployed i.e during update.

Unit test cases are also written for testing business logic.


# Checklist:

* [x] The title of the PR states what changed and the related issues number (used for the release note).
* [ ] Does this PR require documentation updates?
* [ ] I've updated documentation as required by this PR.
* [x] I have performed a self-review of my own code
* [ ] I have commented my code, particularly in hard-to-understand areas




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=71033354) | Generic High Entropy Secret | c2e4ba421efb4f92bede511dfb6bc4eb36514184 | scripts/devtron-reference-helm-charts/reference-chart_4-16-0/env-values.yaml | [View secret](https://github.com/devtron-labs/devtron/commit/c2e4ba421efb4f92bede511dfb6bc4eb36514184#diff-d8fc6eeeecd3ea4d43f62c8af54b3738473256bcd339e712f7bb34c1af5545a2R48) |
| [2763127](https://dashboard.gitguardian.com/incidents/2763127?occurrence=71033355) | Generic High Entropy Secret | c2e4ba421efb4f92bede511dfb6bc4eb36514184 | scripts/devtron-reference-helm-charts/reference-chart_4-16-0/secrets-test-values.yaml | [View secret](https://github.com/devtron-labs/devtron/commit/c2e4ba421efb4f92bede511dfb6bc4eb36514184#diff-c4af316de818479d0943acc50ffc4c49aed83bcd871ec62cba609e31bf3deda5R1) |



</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/internal-repositories-monitoring/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>

Patch:
diff --git a/Wire.go b/Wire.go
index 95491a7f9..f04750d31 100644
--- a/Wire.go
+++ b/Wire.go
@@ -199,6 +199,7 @@ func InitializeApp() (*App, error) {
 		app2.NewAppRepositoryImpl,
 		wire.Bind(new(app2.AppRepository), new(*app2.AppRepositoryImpl)),
 
+		pipeline.GetDeploymentServiceTypeConfig,
 		pipeline.NewPipelineBuilderImpl,
 		wire.Bind(new(pipeline.PipelineBuilder), new(*pipeline.PipelineBuilderImpl)),
 		pipeline2.NewPipelineRestHandlerImpl,
diff --git a/api/appStore/deployment/wire_appStoreDeployment.go b/api/appStore/deployment/wire_appStoreDeployment.go
index 188f06006..10178a9f5 100644
--- a/api/appStore/deployment/wire_appStoreDeployment.go
+++ b/api/appStore/deployment/wire_appStoreDeployment.go
@@ -9,6 +9,7 @@ import (
 )
 
 var AppStoreDeploymentWireSet = wire.NewSet(
+	service.GetDeploymentServiceTypeConfig,
 	repository.NewClusterInstalledAppsRepositoryImpl,
 	wire.Bind(new(repository.ClusterInstalledAppsRepository), new(*repository.ClusterInstalledAppsRepositoryImpl)),
 	appStoreDeploymentCommon.NewAppStoreDeploymentCommonServiceImpl,
diff --git a/api/restHandler/app/DeploymentPipelineRestHandler.go b/api/restHandler/app/DeploymentPipelineRestHandler.go
index 9567d5ec1..840fa5ab0 100644
--- a/api/restHandler/app/DeploymentPipelineRestHandler.go
+++ b/api/restHandler/app/DeploymentPipelineRestHandler.go
@@ -196,6 +196,7 @@ func (handler PipelineConfigRestHandlerImpl) CreateCdPipeline(w http.ResponseWri
 	}
 	ctx := context.WithValue(r.Context(), "token", acdToken)
 	createResp, err := handler.pipelineBuilder.CreateCdPipelines(&cdPipeline, ctx)
+
 	if err != nil {
 		handler.Logger.Errorw("service err, CreateCdPipeline", "err", err, "payload", cdPipeline)
 		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
diff --git a/docs/user-guide/creating-application/workflow/ci-pipeline.md b/docs/user-guide/creating-application/workflow/ci-pipeline.md
index d831be675..921c7df33 100644
--- a/docs/user-guide/creating-application/workflow/ci-pipeline.md
+++ b/docs/user-guide/creating-application/workflow/ci-pipeline.md
@@ -1,27 +1,27 @@
 # CI Pipeline
 
-> **Info:**
+> **Note:**
 > 
 > For Devtron version older than v0.4.0, please refer the [CI Pipeline (legacy)](./ci-pipeline-legacy.md) page.
 
-A CI Pipeline can be created in one of the three ways:
+A CI Workflow can be created in one of the following ways:
 
-* [Continuous Integration](#1-continuous-integration)
-* [Linked CI Pipeline](#2.-linked-ci-pipeline)
-* [Incoming Webhook](#3.-incoming-webhook)
+* [Build and Deploy from Source Code](#1.-build-and-deploy-from-source-code)
+* [Linked Build Pipeline](#2.-linked-build-pipeline)
+* [Deploy Image from External Service](#3.-deploy-image-from-external-service)
 
 ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/creating-application/workflow-ci-pipeline/workflow-ci.jpg)
 
-Each of these methods has different use-cases that can be tailored to the needs of the organization.
+Each method has different use-cases that can be tailored according the needs of the organization.
 
-## 1. Continuous Integration
+## 1. Build and Deploy from Source Code
 
-Continuous Integration Pipeline allows you to build the container image from a source code repository.
+`Build and Deploy from Source Code` workflow allows you to build the container image from a source code repository.
 
 1. From the **Applications** menu, select your application.
 2. On the **App Configuration** page, select **Workflow Editor**.
-3. Select **+ New Build Pipeline**.
-4. Select **Continuous Integration**.
+3. Select **+ New Workflow**.
+4. Select **Build and deploy from source code**.
 5. Enter the following fields on the **Create build pipeline** screen:
 
 ![](../../../.gitbook/assets/ci-pipeline-2.png)
@@ -173,14 +173,14 @@ Select **Create Pipeline**.
 >
 > **(b)** The total timeout for the execution of the CI pipeline is by default set as 3600 seconds. This default timeout is configurable according to the use case. The timeout can be edited in the configmap of the orchestrator service in the env variable as `env:"DEFAULT_TIMEOUT" envDefault:"3600"`
 
-## 2. Linked CI Pipeline
+## 2. Linked Build Pipeline
 
-If one code is shared across multiple applications, `Linked CI Pipeline` can be used, and only one image will be built for multiple applications because if there is only one build, it is not advisable to create multiple CI Pipelines.
+If one code is shared across multiple applications, `Linked Build Pipeline` can be used, and only one image will be built for multiple applications because if there is only one build, it is not advisable to create multiple CI Pipelines.
 
 1. From the **Applications** menu, select your application.
 2. On the **App Configuration** page, select **Workflow Editor**.
-3. Select **+ New Build Pipeline**.
-4. Select **Linked CI Pipeline**.
+3. Select **+ New Workflow**.
+4. Select **Linked Build Pipeline**.
 5. Enter the following fields on the **Create linked build pipeline** screen:
 
 ![](../../../.gitbook/assets/ca-workflow-linked.png)
@@ -189,33 +189,121 @@ If one code is shared across multiple applications, `Linked CI Pipeline` can be
 * Select the source CI pipeline from the application that you selected above.
 * Enter a name for the linked CI pipeline.
 
-Select **Create Linked CI Pipeline**.
+Click **Create Linked CI Pipeline**.
 
 After creating a linked CI pipeline, you can create a CD pipeline. 
 Builds cannot be triggered from a linked CI pipeline; they can only be triggered from the source CI pipeline. There will be no images to deploy in the CD pipeline created from the 'linked CI pipeline' at first. To see the images in the CD pipeline of the linked CI pipeline, trigger build in the source CI pipeline. The build images will now be listed in the CD pipeline of the 'linked CI pipeline' whenever you trigger a build in the source CI pipeline.
 
-## 3. Incoming Webhook
+## 3. Deploy Image from External Service
 
-The CI pipeline receives container images from an external source via a webhook service.
+The CI pipeline can receive container images from an external source via webhook API.
 
-You can use Devtron for deployments on Kubernetes while using your CI tool such as Jenkins. External CI features can be used when the CI tool is hosted outside the Devtron platform.
+You can use Devtron for deployments on Kubernetes while using an external CI tool such as Jenkins or CircleCI. External CI feature can be used when the CI tool is hosted outside the Devtron platform. However, by using an external CI, you will not be able to use some of the Devtron features such as Image scanning and security policies, configuring pre-post CI stages etc. 
 
-1. From the **Applications** menu, select your application.
-2. On the **App Configuration** page, select **Workflow Editor**.
-3. Select **+ New Build Pipeline**.
-4. Select **Incoming Webhook**.
 
-![](../../../.gitbook/assets/ca-workflow-external.png)
+* Create a [new](https://docs.devtron.ai/usage/applications/create-application) or [clone](https://docs.devtron.ai/usage/applications/cloning-application) an application.
+* To configure `Git Repository`, you can add any Git repository account (e.g., dummy account) and click **Next**.
+* To configure the `Container Registry` and `Container Repository`, you can leave the fields blank or simply add any test repository and click **Save & Next**.
+* On the `Base Deployment Template` page, select the `Chart type` from the drop-down list and configure as per your [requirements](https://docs.devtron.ai/usage/applications/creating-application/deployment-template) and click **Save & Next**.
+* On the **Workflow Editor** page, click **New Workflow** and select **Deploy image from external service**.
+
+![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/creating-application/webhook-ci/click-new-workflow.png)
+
+![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/creating-application/webhook-ci/select-deploy-image-from-external-service.png)
+
+* On the **Deploy image from external source** page, provide the information in the following fields:
+
+![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/creating-application/webhook-ci/deploy-image-from-external-service.png)
+
+| Fields | Description |
+| --- | --- |
+| **Deploy to environment** | <ul><li>`Environment`: Provide the name of the [environment](https://docs.devtron.ai/getting-started/global-configurations/cluster-and-environments/namespaces-and-environments).</ul></li><ul><li>`Namepsace`: Provide the [namespace](https://docs.devtron.ai/getting-started/global-configurations/cluster-and-environments/namespaces-and-environments).</ul></li> |
+| **When do you want to deploy** | You can deploy either in one of the following ways: <ul><li>`Automatic`: If you select automatic, your application will be deployed automatically everytime a new image is received.</ul></li> <ul><li>`Manual`: In case of manual, you have to select the image and deploy manually. </ul></li>|
+| **Deployment Strategy** | Configure the deployment preferences for this pipeline. |
+
+* Click **Create Pipeline**.
+A new CI pipeline will be created for the external source.
+To get the webhook URL and JSON sample payload to be used in external CI pipeline, click **Show webhook details**.
+
+![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/creating-application/webhook-ci/show-webhook-details.jpg)
+
+* On the **Webhook Details** page, you have to authenticate via `API token` to allow requests from an external service (e.g. Jenkins or CircleCI).
+
+* For authentication, only users with `super-admin` permissions can select or generate an API token:
+    * You can either use **Select API Token** if you have generated an [API Token](https://docs.devtron.ai/getting-started/global-configurations/authorization/api-tokens) under **Global Configurations**. 
+
+    ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/creating-application/webhook-ci/select-api-token-webhook-details.png)
+
+
+    * Or use **Auto-generate token** to generate the API token with the required permissions. Make sure to enter the token name in the **Token name** field.
+
+    ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/creating-application/webhook-ci/auto-generate-token-webhook-details.png)
+
+* To allow requests from the external source, you can request the API by using:
+     * **Webhook URL**
+     * **cURL Request**
+
+### Webhook URL
+
+ HTTP Method: `POST`
+
+ API Endpoint: `https://{domain-name}/orchestrator/webhook/ext-ci/{pipeline-id}`
+    
+ JSON Payload:
+
+```bash
+    {
+    "dockerImage": "445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2"
+}
+ ```  
+
+You can also select metadata to send to Devtron. Sample JSON will be generated accordingly.
+You can send the Payload script to your CI tools such as Jenkins and Devtron will receive the build image every time the CI pipeline is triggered or you can use the Webhook URL, which will build an image every time CI pipeline is triggered using Devtron Dashboard.
+ 
+
+### Sample cURL Request
+   
+```bash
+curl --location --request POST \
+'https://{domain-name}/orchestrator/webhook/ext-ci/{pipeline-id}' \
+--header 'Content-Type: application/json' \
+--header 'token: {token}' \
+--data-raw '{
+    "dockerImage": "445808685819.dkr.ecr.us-east-2.amazonaws.com/orch:23907713-2"
+}'
+ ```
+
+### Response Codes
+
+| Code    | Description |
+| --- | --- |
+| `200` | `app detail page url` |
+| `400` | `Bad request` |
+| `401` | `Unauthorized` |
+
+
+### Integrate with External Sources - Jenkins or CircleCI
+
+ * On the Jenkins dashboard, select the Jenkins job which you want to integrate with the Devtron dashboard.
+ * Go to the **Configuration** > **Build Steps**, click **Add build step**, and then click **Execute Shell**.
+
+ ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/creating-application/webhook-ci/add-build-step-jenkins.png)
+
+ * Enter the cURL request command.
+ * Make sure to enter the `API token` and `dockerImage` in your cURL command and click **Save**.
+
+ ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/creating-application/webhook-ci/execute-shell-jenkins.jpg)
+
+  Now, you can access the images on the Devtron dashboard and deploy manually. In case, if you select **Automatic** deployment option, then your application will be deployed automatically everytime a new image is received.
+
+  Similarly, you can also integrate with external source such as **CircleCI** by:
+  
+  * Select the job on the `CircleCI` dashboard and click `Configuration File`.
+  * On the respective job, enter the `cURL` command and update the `API token` and `dockerImage` in your cURL command.
+
 
-| Field Name | Required/Optional | Description |
-| :--- | :--- | :--- |
-| **Pipeline Name** | Required | Name of the pipeline |
-| **Source Type** | Required | ‘Branch Fixed’ or ‘Tag Regex’ |
-| **Branch Name** | Required | Name of the branch |
 
-* Select **Save and Generate URL**. This generates the Payload format and Webhook URL.
 
-You can send the Payload script to your CI tools such as Jenkins and Devtron will receive the build image every time the CI Service is triggered or you can use the Webhook URL which will build an image every time CI Service is triggered using Devtron Dashboard.
 
 ## Update CI Pipeline
 
diff --git a/docs/user-guide/global-configurations/authorization/api-tokens.md b/docs/user-guide/global-configurations/authorization/api-tokens.md
index 4de31c499..b5607aa26 100644
--- a/docs/user-guide/global-configurations/authorization/api-tokens.md
+++ b/docs/user-guide/global-configurations/authorization/api-tokens.md
@@ -1,16 +1,17 @@
 # API Tokens
-API tokens are like ordinary OAuth access tokens. They can be used instead of username and password for programmatic access to API.
-API token allows users to generate API tokens with the desired access. Only super admin users can generate tokens and see generated tokens.
+
+API tokens are the access tokens for authentication. Instead of using username and password, it can be used for programmatic access to API. It allows users to generate API tokens with the desired access. Only super admin users can generate API tokens and see the generated tokens.
 
 ## Generate API Token
 
-To generate API tokens, go to global configurations -> Authorizations -> API tokens and click on Generate New Token.
+To generate API tokens, go to Global Configurations -> Authorization -> API tokens and click `Generate New Token`.
+
 ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/global-configurations/api-token/api-token-1.png)
 
-1. Enter a name for the token
+1. Enter a name for the token.
 2. Add Description. 
 
-3. Select an Expiration date for the token(7 days, 30 days, 60 days, 90 days, custom and no expiration) 
+3. Select an Expiration date for the token (7 days, 30 days, 60 days, 90 days, custom and no expiration).
 
 ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/global-configurations/api-token/api-token-2.png)
 
@@ -29,7 +30,6 @@ Or select specific permission if you want to generate a token with a specific ro
 5. Now click on Generate Token.
 
 
-
 A pop-up window will appear over the screen from where you can copy the API token.
 
 ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/global-configurations/api-token/api-token-5.png)
@@ -68,7 +68,7 @@ Select a new expiration date and click on regenerated token.
 
 ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/global-configurations/api-token/api-token-11.png)
 
-This will generated a new token with new expiration date.
+This will generated a new token with a new expiration date.
 
 
 To update API token permissions, give the permissions as you want to and click on update token.
@@ -79,7 +79,7 @@ To update API token permissions, give the permissions as you want to and click o
 
 ## Delete API Token
 
-To delete an API token, click on the delete icon. Any applications or scripts using this token will no longer be able to access the Devtron API.
+To delete an API token, click `delete` icon. Any applications or scripts using this token will no longer be able to access the Devtron API.
 
 ![](https://devtron-public-asset.s3.us-east-2.amazonaws.com/images/global-configurations/api-token/api-token-14.png)
 
diff --git a/internal/sql/repository/pipelineConfig/mocks/PipelineRepository.go b/internal/sql/repository/pipelineConfig/mocks/PipelineRepository.go
new file mode 100644
index 000000000..c7d07e0ff
--- /dev/null
+++ b/internal/sql/repository/pipelineConfig/mocks/PipelineRepository.go
@@ -0,0 +1,731 @@
+// Code generated by mockery v2.14.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	pg "github.com/go-pg/pg"
+	mock "github.com/stretchr/testify/mock"
+
+	pipelineConfig "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
+)
+
+// PipelineRepository is an autogenerated mock type for the PipelineRepository type
+type PipelineRepository struct {
+	mock.Mock
+}
+
+// Delete provides a mock function with given fields: id, tx
+func (_m *PipelineRepository) Delete(id int, tx *pg.Tx) error {
+	ret := _m.Called(id, tx)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(int, *pg.Tx) error); ok {
+		r0 = rf(id, tx)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// FindActiveByAppId provides a mock function with given fields: appId
+func (_m *PipelineRepository) FindActiveByAppId(appId int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(appId)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(appId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int) error); ok {
+		r1 = rf(appId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindActiveByAppIdAndEnvironmentId provides a mock function with given fields: appId, environmentId
+func (_m *PipelineRepository) FindActiveByAppIdAndEnvironmentId(appId int, environmentId int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(appId, environmentId)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int, int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(appId, environmentId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int, int) error); ok {
+		r1 = rf(appId, environmentId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindActiveByAppIdAndEnvironmentIdV2 provides a mock function with given fields:
+func (_m *PipelineRepository) FindActiveByAppIdAndEnvironmentIdV2() ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called()
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func() []*pipelineConfig.Pipeline); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindActiveByAppIdAndPipelineId provides a mock function with given fields: appId, pipelineId
+func (_m *PipelineRepository) FindActiveByAppIdAndPipelineId(appId int, pipelineId int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(appId, pipelineId)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int, int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(appId, pipelineId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int, int) error); ok {
+		r1 = rf(appId, pipelineId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindActiveByEnvId provides a mock function with given fields: envId
+func (_m *PipelineRepository) FindActiveByEnvId(envId int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(envId)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(envId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int) error); ok {
+		r1 = rf(envId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindActiveByInFilter provides a mock function with given fields: envId, appIdIncludes
+func (_m *PipelineRepository) FindActiveByInFilter(envId int, appIdIncludes []int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(envId, appIdIncludes)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int, []int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(envId, appIdIncludes)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int, []int) error); ok {
+		r1 = rf(envId, appIdIncludes)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindActiveByNotFilter provides a mock function with given fields: envId, appIdExcludes
+func (_m *PipelineRepository) FindActiveByNotFilter(envId int, appIdExcludes []int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(envId, appIdExcludes)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int, []int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(envId, appIdExcludes)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int, []int) error); ok {
+		r1 = rf(envId, appIdExcludes)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindAllPipelineInLast24Hour provides a mock function with given fields:
+func (_m *PipelineRepository) FindAllPipelineInLast24Hour() ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called()
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func() []*pipelineConfig.Pipeline); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindAllPipelinesByChartsOverrideAndAppIdAndChartId provides a mock function with given fields: chartOverridden, appId, chartId
+func (_m *PipelineRepository) FindAllPipelinesByChartsOverrideAndAppIdAndChartId(chartOverridden bool, appId int, chartId int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(chartOverridden, appId, chartId)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(bool, int, int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(chartOverridden, appId, chartId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(bool, int, int) error); ok {
+		r1 = rf(chartOverridden, appId, chartId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindAutomaticByCiPipelineId provides a mock function with given fields: ciPipelineId
+func (_m *PipelineRepository) FindAutomaticByCiPipelineId(ciPipelineId int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(ciPipelineId)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(ciPipelineId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int) error); ok {
+		r1 = rf(ciPipelineId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindByCiPipelineId provides a mock function with given fields: ciPipelineId
+func (_m *PipelineRepository) FindByCiPipelineId(ciPipelineId int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(ciPipelineId)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(ciPipelineId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int) error); ok {
+		r1 = rf(ciPipelineId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindByCiPipelineIdsIn provides a mock function with given fields: ciPipelineIds
+func (_m *PipelineRepository) FindByCiPipelineIdsIn(ciPipelineIds []int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(ciPipelineIds)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func([]int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(ciPipelineIds)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func([]int) error); ok {
+		r1 = rf(ciPipelineIds)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindById provides a mock function with given fields: id
+func (_m *PipelineRepository) FindById(id int) (*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(id)
+
+	var r0 *pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int) *pipelineConfig.Pipeline); ok {
+		r0 = rf(id)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int) error); ok {
+		r1 = rf(id)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindByIdsIn provides a mock function with given fields: ids
+func (_m *PipelineRepository) FindByIdsIn(ids []int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(ids)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func([]int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(ids)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func([]int) error); ok {
+		r1 = rf(ids)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindByIdsInAndEnvironment provides a mock function with given fields: ids, environmentId
+func (_m *PipelineRepository) FindByIdsInAndEnvironment(ids []int, environmentId int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(ids, environmentId)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func([]int, int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(ids, environmentId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func([]int, int) error); ok {
+		r1 = rf(ids, environmentId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindByName provides a mock function with given fields: pipelineName
+func (_m *PipelineRepository) FindByName(pipelineName string) (*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(pipelineName)
+
+	var r0 *pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(string) *pipelineConfig.Pipeline); ok {
+		r0 = rf(pipelineName)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(string) error); ok {
+		r1 = rf(pipelineName)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindByParentCiPipelineId provides a mock function with given fields: ciPipelineId
+func (_m *PipelineRepository) FindByParentCiPipelineId(ciPipelineId int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(ciPipelineId)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(ciPipelineId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int) error); ok {
+		r1 = rf(ciPipelineId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindByPipelineTriggerGitHash provides a mock function with given fields: gitHash
+func (_m *PipelineRepository) FindByPipelineTriggerGitHash(gitHash string) (*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(gitHash)
+
+	var r0 *pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(string) *pipelineConfig.Pipeline); ok {
+		r0 = rf(gitHash)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(string) error); ok {
+		r1 = rf(gitHash)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindIdsByAppIdsAndEnvironmentIds provides a mock function with given fields: appIds, environmentIds
+func (_m *PipelineRepository) FindIdsByAppIdsAndEnvironmentIds(appIds []int, environmentIds []int) ([]int, error) {
+	ret := _m.Called(appIds, environmentIds)
+
+	var r0 []int
+	if rf, ok := ret.Get(0).(func([]int, []int) []int); ok {
+		r0 = rf(appIds, environmentIds)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]int)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func([]int, []int) error); ok {
+		r1 = rf(appIds, environmentIds)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindIdsByProjectIdsAndEnvironmentIds provides a mock function with given fields: projectIds, environmentIds
+func (_m *PipelineRepository) FindIdsByProjectIdsAndEnvironmentIds(projectIds []int, environmentIds []int) ([]int, error) {
+	ret := _m.Called(projectIds, environmentIds)
+
+	var r0 []int
+	if rf, ok := ret.Get(0).(func([]int, []int) []int); ok {
+		r0 = rf(projectIds, environmentIds)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]int)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func([]int, []int) error); ok {
+		r1 = rf(projectIds, environmentIds)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// FindNumberOfAppsWithCdPipeline provides a mock function with given fields: appIds
+func (_m *PipelineRepository) FindNumberOfAppsWithCdPipeline(appIds []int) (int, error) {
+	ret := _m.Called(appIds)
+
+	var r0 int
+	if rf, ok := ret.Get(0).(func([]int) int); ok {
+		r0 = rf(appIds)
+	} else {
+		r0 = ret.Get(0).(int)
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func([]int) error); ok {
+		r1 = rf(appIds)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetAppAndEnvDetailsForDeploymentAppTypePipeline provides a mock function with given fields: deploymentAppType, clusterIds
+func (_m *PipelineRepository) GetAppAndEnvDetailsForDeploymentAppTypePipeline(deploymentAppType string, clusterIds []int) ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called(deploymentAppType, clusterIds)
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(string, []int) []*pipelineConfig.Pipeline); ok {
+		r0 = rf(deploymentAppType, clusterIds)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(string, []int) error); ok {
+		r1 = rf(deploymentAppType, clusterIds)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetByEnvOverrideId provides a mock function with given fields: envOverrideId
+func (_m *PipelineRepository) GetByEnvOverrideId(envOverrideId int) ([]pipelineConfig.Pipeline, error) {
+	ret := _m.Called(envOverrideId)
+
+	var r0 []pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int) []pipelineConfig.Pipeline); ok {
+		r0 = rf(envOverrideId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int) error); ok {
+		r1 = rf(envOverrideId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetByEnvOverrideIdAndEnvId provides a mock function with given fields: envOverrideId, envId
+func (_m *PipelineRepository) GetByEnvOverrideIdAndEnvId(envOverrideId int, envId int) (pipelineConfig.Pipeline, error) {
+	ret := _m.Called(envOverrideId, envId)
+
+	var r0 pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func(int, int) pipelineConfig.Pipeline); ok {
+		r0 = rf(envOverrideId, envId)
+	} else {
+		r0 = ret.Get(0).(pipelineConfig.Pipeline)
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int, int) error); ok {
+		r1 = rf(envOverrideId, envId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetConnection provides a mock function with given fields:
+func (_m *PipelineRepository) GetConnection() *pg.DB {
+	ret := _m.Called()
+
+	var r0 *pg.DB
+	if rf, ok := ret.Get(0).(func() *pg.DB); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*pg.DB)
+		}
+	}
+
+	return r0
+}
+
+// GetPipelineIdsHavingStatusTimelinesPendingAfterKubectlApplyStatus provides a mock function with given fields: pendingSinceSeconds
+func (_m *PipelineRepository) GetPipelineIdsHavingStatusTimelinesPendingAfterKubectlApplyStatus(pendingSinceSeconds int) ([]int, error) {
+	ret := _m.Called(pendingSinceSeconds)
+
+	var r0 []int
+	if rf, ok := ret.Get(0).(func(int) []int); ok {
+		r0 = rf(pendingSinceSeconds)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]int)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(int) error); ok {
+		r1 = rf(pendingSinceSeconds)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// PipelineExists provides a mock function with given fields: pipelineName
+func (_m *PipelineRepository) PipelineExists(pipelineName string) (bool, error) {
+	ret := _m.Called(pipelineName)
+
+	var r0 bool
+	if rf, ok := ret.Get(0).(func(string) bool); ok {
+		r0 = rf(pipelineName)
+	} else {
+		r0 = ret.Get(0).(bool)
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(string) error); ok {
+		r1 = rf(pipelineName)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Save provides a mock function with given fields: pipeline, tx
+func (_m *PipelineRepository) Save(pipeline []*pipelineConfig.Pipeline, tx *pg.Tx) error {
+	ret := _m.Called(pipeline, tx)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func([]*pipelineConfig.Pipeline, *pg.Tx) error); ok {
+		r0 = rf(pipeline, tx)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// UndoDelete provides a mock function with given fields: id
+func (_m *PipelineRepository) UndoDelete(id int) error {
+	ret := _m.Called(id)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(int) error); ok {
+		r0 = rf(id)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// UniqueAppEnvironmentPipelines provides a mock function with given fields:
+func (_m *PipelineRepository) UniqueAppEnvironmentPipelines() ([]*pipelineConfig.Pipeline, error) {
+	ret := _m.Called()
+
+	var r0 []*pipelineConfig.Pipeline
+	if rf, ok := ret.Get(0).(func() []*pipelineConfig.Pipeline); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*pipelineConfig.Pipeline)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func() error); ok {
+		r1 = rf()
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Update provides a mock function with given fields: pipeline, tx
+func (_m *PipelineRepository) Update(pipeline *pipelineConfig.Pipeline, tx *pg.Tx) error {
+	ret := _m.Called(pipeline, tx)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(*pipelineConfig.Pipeline, *pg.Tx) error); ok {
+		r0 = rf(pipeline, tx)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// UpdateCdPipeline provides a mock function with given fields: pipeline
+func (_m *PipelineRepository) UpdateCdPipeline(pipeline *pipelineConfig.Pipeline) error {
+	ret := _m.Called(pipeline)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(*pipelineConfig.Pipeline) error); ok {
+		r0 = rf(pipeline)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+type mockConstructorTestingTNewPipelineRepository interface {
+	mock.TestingT
+	Cleanup(func())
+}
+
+// NewPipelineRepository creates a new instance of PipelineRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+func NewPipelineRepository(t mockConstructorTestingTNewPipelineRepository) *PipelineRepository {
+	mock := &PipelineRepository{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/pkg/appClone/AppCloneService.go b/pkg/appClone/AppCloneService.go
index f8d7afa93..58d7e19ff 100644
--- a/pkg/appClone/AppCloneService.go
+++ b/pkg/appClone/AppCloneService.go
@@ -828,6 +828,7 @@ func (impl *AppCloneServiceImpl) CreateCdPipeline(req *cloneCdPipelineRequest, c
 		PostStageConfigMapSecretNames: refCdPipeline.PostStageConfigMapSecretNames,
 		RunPostStageInEnv:             refCdPipeline.RunPostStageInEnv,
 		RunPreStageInEnv:              refCdPipeline.RunPreStageInEnv,
+		DeploymentAppType:             refCdPipeline.DeploymentAppType,
 	}
 	cdPipelineReq := &bean.CdPipelines{
 		Pipelines: []*bean.CDPipelineConfigObject{cdPipeline},
diff --git a/pkg/appStore/bean/bean.go b/pkg/appStore/bean/bean.go
index ce759d347..609c91e95 100644
--- a/pkg/appStore/bean/bean.go
+++ b/pkg/appStore/bean/bean.go
@@ -23,7 +23,7 @@ import (
 	"time"
 )
 
-//v1
+// v1
 type InstallAppVersionHistoryDto struct {
 	InstalledAppInfo *InstalledAppDto `json:"installedAppInfo"`
 	IAVHistory       []*IAVHistory    `json:"deploymentHistory"`
@@ -93,7 +93,7 @@ type InstallAppVersionDTO struct {
 	GitHash                   string                     `json:"gitHash"`
 	EnvironmentName           string                     `json:"-"`
 	InstallAppVersionChartDTO *InstallAppVersionChartDTO `json:"-"`
-	DeploymentAppType         string                     `json:"-"`
+	DeploymentAppType         string                     `json:"deploymentAppType"`
 }
 
 type InstallAppVersionChartDTO struct {
@@ -110,7 +110,7 @@ type InstallAppVersionChartRepoDTO struct {
 	Password string `json:"-"`
 }
 
-/// bean for v2
+// / bean for v2
 type ChartGroupInstallRequest struct {
 	ProjectId                     int                              `json:"projectId"  validate:"required,number"`
 	ChartGroupInstallChartRequest []*ChartGroupInstallChartRequest `json:"charts" validate:"dive,required"`
@@ -131,7 +131,7 @@ type ChartGroupInstallChartRequest struct {
 type ChartGroupInstallAppRes struct {
 }
 
-///
+// /
 type RefChartProxyDir string
 
 var CHART_PROXY_TEMPLATE = "reference-chart-proxy"
diff --git a/pkg/appStore/deployment/service/AppStoreDeploymentService.go b/pkg/appStore/deployment/service/AppStoreDeploymentService.go
index 04babcc1c..5dca7017c 100644
--- a/pkg/appStore/deployment/service/AppStoreDeploymentService.go
+++ b/pkg/appStore/deployment/service/AppStoreDeploymentService.go
@@ -21,6 +21,7 @@ import (
 	"context"
 	"errors"
 	"fmt"
+	"github.com/caarlos0/env/v6"
 	client "github.com/devtron-labs/devtron/api/helm-app"
 	openapi "github.com/devtron-labs/devtron/api/helm-app/openapiClient"
 	openapi2 "github.com/devtron-labs/devtron/api/openapi/openapiClient"
@@ -65,6 +66,16 @@ type AppStoreDeploymentService interface {
 	InstallAppByHelm(installAppVersionRequest *appStoreBean.InstallAppVersionDTO, ctx context.Context) (*appStoreBean.InstallAppVersionDTO, error)
 }
 
+type DeploymentServiceTypeConfig struct {
+	IsInternalUse bool `env:"IS_INTERNAL_USE" envDefault:"false"`
+}
+
+func GetDeploymentServiceTypeConfig() (*DeploymentServiceTypeConfig, error) {
+	cfg := &DeploymentServiceTypeConfig{}
+	err := env.Parse(cfg)
+	return cfg, err
+}
+
 type AppStoreDeploymentServiceImpl struct {
 	logger                               *zap.SugaredLogger
 	installedAppRepository               repository.InstalledAppRepository
@@ -81,6 +92,7 @@ type AppStoreDeploymentServiceImpl struct {
 	globalEnvVariables                   *util2.GlobalEnvVariables
 	installedAppRepositoryHistory        repository.InstalledAppVersionHistoryRepository
 	gitOpsRepository                     repository2.GitOpsConfigRepository
+	deploymentTypeConfig                 *DeploymentServiceTypeConfig
 }
 
 func NewAppStoreDeploymentServiceImpl(logger *zap.SugaredLogger, installedAppRepository repository.InstalledAppRepository,
@@ -90,7 +102,8 @@ func NewAppStoreDeploymentServiceImpl(logger *zap.SugaredLogger, installedAppRep
 	appStoreDeploymentArgoCdService appStoreDeploymentGitopsTool.AppStoreDeploymentArgoCdService, environmentService cluster.EnvironmentService,
 	clusterService cluster.ClusterService, helmAppService client.HelmAppService, appStoreDeploymentCommonService appStoreDeploymentCommon.AppStoreDeploymentCommonService,
 	globalEnvVariables *util2.GlobalEnvVariables,
-	installedAppRepositoryHistory repository.InstalledAppVersionHistoryRepository, gitOpsRepository repository2.GitOpsConfigRepository, attributesService attributes.AttributesService) *AppStoreDeploymentServiceImpl {
+	installedAppRepositoryHistory repository.InstalledAppVersionHistoryRepository, gitOpsRepository repository2.GitOpsConfigRepository, attributesService attributes.AttributesService,
+	deploymentTypeConfig *DeploymentServiceTypeConfig) *AppStoreDeploymentServiceImpl {
 	return &AppStoreDeploymentServiceImpl{
 		logger:                               logger,
 		installedAppRepository:               installedAppRepository,
@@ -107,10 +120,14 @@ func NewAppStoreDeploymentServiceImpl(logger *zap.SugaredLogger, installedAppRep
 		globalEnvVariables:                   globalEnvVariables,
 		installedAppRepositoryHistory:        installedAppRepositoryHistory,
 		gitOpsRepository:                     gitOpsRepository,
+		deploymentTypeConfig:                 deploymentTypeConfig,
 	}
 }
 
 func (impl AppStoreDeploymentServiceImpl) AppStoreDeployOperationDB(installAppVersionRequest *appStoreBean.InstallAppVersionDTO, tx *pg.Tx) (*appStoreBean.InstallAppVersionDTO, error) {
+
+	var isInternalUse = impl.deploymentTypeConfig.IsInternalUse
+
 	isGitOpsConfigured := false
 	gitOpsConfig, err := impl.gitOpsRepository.GetGitOpsConfigActive()
 	if err != nil && err != pg.ErrNoRows {
@@ -121,6 +138,16 @@ func (impl AppStoreDeploymentServiceImpl) AppStoreDeployOperationDB(installAppVe
 		isGitOpsConfigured = true
 	}
 
+	if isInternalUse && !isGitOpsConfigured && installAppVersionRequest.DeploymentAppType == util.PIPELINE_DEPLOYMENT_TYPE_ACD {
+		impl.logger.Errorw("gitops not configured but selected for CD")
+		err := &util.ApiError{
+			HttpStatusCode:  http.StatusBadRequest,
+			InternalMessage: "Gitops integration is not installed/configured. Please install/configure gitops or use helm option.",
+			UserMessage:     "Gitops integration is not installed/configured. Please install/configure gitops or use helm option.",
+		}
+		return nil, err
+	}
+
 	appStoreAppVersion, err := impl.appStoreApplicationVersionRepository.FindById(installAppVersionRequest.AppStoreVersion)
 	if err != nil {
 		impl.logger.Errorw("fetching error", "err", err)
@@ -168,11 +195,21 @@ func (impl AppStoreDeploymentServiceImpl) AppStoreDeployOperationDB(installAppVe
 		EnvironmentId: environment.Id,
 		Status:        appStoreBean.DEPLOY_INIT,
 	}
-	if isGitOpsConfigured && appInstallationMode == util2.SERVER_MODE_FULL {
+
+	if isGitOpsConfigured && appInstallationMode == util2.SERVER_MODE_FULL && (installAppVersionRequest.DeploymentAppType == util.PIPELINE_DEPLOYMENT_TYPE_ACD || !isInternalUse) {
 		installedAppModel.DeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_ACD
 	} else {
 		installedAppModel.DeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_HELM
 	}
+
+	if isInternalUse && installedAppModel.DeploymentAppType == "" {
+		if isGitOpsConfigured {
+			installedAppModel.DeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_ACD
+		} else {
+			installedAppModel.DeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_HELM
+		}
+	}
+
 	installAppVersionRequest.DeploymentAppType = installedAppModel.DeploymentAppType
 	installedAppModel.CreatedBy = installAppVersionRequest.UserId
 	installedAppModel.UpdatedBy = installAppVersionRequest.UserId
@@ -595,6 +632,7 @@ func (impl AppStoreDeploymentServiceImpl) LinkHelmApplicationToChartStore(ctx co
 		ValuesOverrideYaml: request.GetValuesYaml(),
 		ReferenceValueId:   int(request.GetReferenceValueId()),
 		ReferenceValueKind: request.GetReferenceValueKind(),
+		DeploymentAppType:  util.PIPELINE_DEPLOYMENT_TYPE_HELM,
 	}
 
 	// STEP-2 InstallApp with only DB operations
diff --git a/pkg/pipeline/PipelineBuilder.go b/pkg/pipeline/PipelineBuilder.go
index bda8f61da..2af02be81 100644
--- a/pkg/pipeline/PipelineBuilder.go
+++ b/pkg/pipeline/PipelineBuilder.go
@@ -72,6 +72,16 @@ func GetEcrConfig() (*EcrConfig, error) {
 	return cfg, err
 }
 
+type DeploymentServiceTypeConfig struct {
+	IsInternalUse bool `env:"IS_INTERNAL_USE" envDefault:"false"`
+}
+
+func GetDeploymentServiceTypeConfig() (*DeploymentServiceTypeConfig, error) {
+	cfg := &DeploymentServiceTypeConfig{}
+	err := env.Parse(cfg)
+	return cfg, err
+}
+
 type PipelineBuilder interface {
 	CreateCiPipeline(createRequest *bean.CiConfigRequest) (*bean.PipelineCreateResponse, error)
 	CreateApp(request *bean.CreateAppDTO) (*bean.CreateAppDTO, error)
@@ -115,6 +125,8 @@ type PipelineBuilder interface {
 	GetBulkActionImpactedPipelines(dto *bean.CdBulkActionRequestDto) ([]*pipelineConfig.Pipeline, error)
 	PerformBulkActionOnCdPipelines(dto *bean.CdBulkActionRequestDto, impactedPipelines []*pipelineConfig.Pipeline, ctx context.Context, dryRun bool, userId int32) ([]*bean.CdBulkActionResponseDto, error)
 	DeleteCiPipeline(request *bean.CiPatchRequest) (*bean.CiPipeline, error)
+	IsGitOpsRequiredForCD(pipelineCreateRequest *bean.CdPipelines) bool
+	SetPipelineDeploymentAppType(pipelineCreateRequest *bean.CdPipelines, isGitOpsConfigured bool)
 }
 
 type PipelineBuilderImpl struct {
@@ -165,6 +177,7 @@ type PipelineBuilderImpl struct {
 	gitMaterialHistoryService    history.GitMaterialHistoryService
 	CiTemplateHistoryService     history.CiTemplateHistoryService
 	CiPipelineHistoryService     history.CiPipelineHistoryService
+	deploymentConfig             *DeploymentServiceTypeConfig
 }
 
 func NewPipelineBuilderImpl(logger *zap.SugaredLogger,
@@ -207,7 +220,8 @@ func NewPipelineBuilderImpl(logger *zap.SugaredLogger,
 	ciTemplateOverrideRepository pipelineConfig.CiTemplateOverrideRepository,
 	gitMaterialHistoryService history.GitMaterialHistoryService,
 	CiTemplateHistoryService history.CiTemplateHistoryService,
-	CiPipelineHistoryService history.CiPipelineHistoryService) *PipelineBuilderImpl {
+	CiPipelineHistoryService history.CiPipelineHistoryService,
+	deploymentConfig *DeploymentServiceTypeConfig) *PipelineBuilderImpl {
 	return &PipelineBuilderImpl{
 		logger:                        logger,
 		ciCdPipelineOrchestrator:      ciCdPipelineOrchestrator,
@@ -256,10 +270,11 @@ func NewPipelineBuilderImpl(logger *zap.SugaredLogger,
 		gitMaterialHistoryService:    gitMaterialHistoryService,
 		CiTemplateHistoryService:     CiTemplateHistoryService,
 		CiPipelineHistoryService:     CiPipelineHistoryService,
+		deploymentConfig:             deploymentConfig,
 	}
 }
 
-//internal use only
+// internal use only
 const (
 	teamIdKey                string = "teamId"
 	teamNameKey              string = "teamName"
@@ -1288,114 +1303,197 @@ func (impl PipelineBuilderImpl) patchCiPipelineUpdateSource(baseCiConfig *bean.C
 
 }
 
-func (impl PipelineBuilderImpl) CreateCdPipelines(pipelineCreateRequest *bean.CdPipelines, ctx context.Context) (*bean.CdPipelines, error) {
+func (impl PipelineBuilderImpl) IsGitopsConfigured() (bool, error) {
+
 	isGitOpsConfigured := false
 	gitOpsConfig, err := impl.gitOpsRepository.GetGitOpsConfigActive()
+
 	if err != nil && err != pg.ErrNoRows {
 		impl.logger.Errorw("GetGitOpsConfigActive, error while getting", "err", err)
-		return nil, err
+		return false, err
 	}
 	if gitOpsConfig != nil && gitOpsConfig.Id > 0 {
 		isGitOpsConfigured = true
 	}
 
-	app, err := impl.appRepo.FindById(pipelineCreateRequest.AppId)
-	if err != nil {
-		impl.logger.Errorw("app not found", "err", err, "appId", pipelineCreateRequest.AppId)
-		return nil, err
+	return isGitOpsConfigured, nil
+
+}
+
+func (impl PipelineBuilderImpl) ValidateCDPipelineRequest(pipelineCreateRequest *bean.CdPipelines, isGitOpsConfigured, haveAtleastOneGitOps bool) (bool, error) {
+
+	if isGitOpsConfigured == false && haveAtleastOneGitOps {
+		impl.logger.Errorw("Gitops not configured but selected in creating cd pipeline")
+		err := &util.ApiError{
+			HttpStatusCode:  http.StatusBadRequest,
+			InternalMessage: "Gitops integration is not installed/configured. Please install/configure gitops or use helm option.",
+			UserMessage:     "Gitops integration is not installed/configured. Please install/configure gitops or use helm option.",
+		}
+		return false, err
 	}
+
 	envPipelineMap := make(map[int]string)
 	for _, pipeline := range pipelineCreateRequest.Pipelines {
 		if envPipelineMap[pipeline.EnvironmentId] != "" {
-			err = &util.ApiError{
+			err := &util.ApiError{
 				HttpStatusCode:  http.StatusBadRequest,
 				InternalMessage: "cd-pipelines already exist for this app and env, cannot create multiple cd-pipelines",
 				UserMessage:     "cd-pipelines already exist for this app and env, cannot create multiple cd-pipelines",
 			}
-			return nil, err
+			return false, err
 		}
 		envPipelineMap[pipeline.EnvironmentId] = pipeline.Name
 
 		existingCdPipelinesForEnv, pErr := impl.pipelineRepository.FindActiveByAppIdAndEnvironmentId(pipelineCreateRequest.AppId, pipeline.EnvironmentId)
 		if pErr != nil && !util.IsErrNoRows(pErr) {
 			impl.logger.Errorw("error in fetching cd pipelines ", "err", pErr, "appId", pipelineCreateRequest.AppId)
-			return nil, pErr
+			return false, pErr
 		}
 		if len(existingCdPipelinesForEnv) > 0 {
-			err = &util.ApiError{
+			err := &util.ApiError{
 				HttpStatusCode:  http.StatusBadRequest,
 				InternalMessage: "cd-pipelines already exist for this app and env, cannot create multiple cd-pipelines",
 				UserMessage:     "cd-pipelines already exist for this app and env, cannot create multiple cd-pipelines",
 			}
-			return nil, err
+			return false, err
 		}
 
 		if len(pipeline.PreStage.Config) > 0 && !strings.Contains(pipeline.PreStage.Config, "beforeStages") {
-			err = &util.ApiError{
+			err := &util.ApiError{
 				HttpStatusCode:  http.StatusBadRequest,
 				InternalMessage: "invalid yaml config, must include - beforeStages",
 				UserMessage:     "invalid yaml config, must include - beforeStages",
 			}
-			return nil, err
+			return false, err
 		}
 		if len(pipeline.PostStage.Config) > 0 && !strings.Contains(pipeline.PostStage.Config, "afterStages") {
-			err = &util.ApiError{
+			err := &util.ApiError{
 				HttpStatusCode:  http.StatusBadRequest,
 				InternalMessage: "invalid yaml config, must include - afterStages",
 				UserMessage:     "invalid yaml config, must include - afterStages",
 			}
-			return nil, err
+			return false, err
 		}
 	}
 
-	if isGitOpsConfigured {
-		//if gitops configured create GIT repository and register into ACD
-		chart, err := impl.chartRepository.FindLatestChartForAppByAppId(app.Id)
-		if err != nil && pg.ErrNoRows != err {
-			return nil, err
+	return true, nil
+
+}
+
+func (impl PipelineBuilderImpl) RegisterInACD(app *app2.App, pipelineCreateRequest *bean.CdPipelines, ctx context.Context) error {
+
+	//if gitops configured create GIT repository and register into ACD
+	chart, err := impl.chartRepository.FindLatestChartForAppByAppId(app.Id)
+	if err != nil && pg.ErrNoRows != err {
+		return err
+	}
+	gitOpsRepoName := impl.chartTemplateService.GetGitOpsRepoName(app.AppName)
+	chartGitAttr, err := impl.chartTemplateService.CreateGitRepositoryForApp(gitOpsRepoName, chart.ReferenceTemplate, chart.ChartVersion, pipelineCreateRequest.UserId)
+	if err != nil {
+		impl.logger.Errorw("error in pushing chart to git ", "path", chartGitAttr.ChartLocation, "err", err)
+		return err
+	}
+	err = impl.chartTemplateService.RegisterInArgo(chartGitAttr, ctx)
+	if err != nil {
+		impl.logger.Errorw("error while register git repo in argo", "err", err)
+		emptyRepoErrorMessage := []string{"failed to get index: 404 Not Found", "remote repository is empty"}
+		if strings.Contains(err.Error(), emptyRepoErrorMessage[0]) || strings.Contains(err.Error(), emptyRepoErrorMessage[1]) {
+			// - found empty repository, create some file in repository
+			err := impl.chartTemplateService.CreateReadmeInGitRepo(gitOpsRepoName, pipelineCreateRequest.UserId)
+			if err != nil {
+				impl.logger.Errorw("error in creating file in git repo", "err", err)
+				return err
+			}
+			// - retry register in argo
+			err = impl.chartTemplateService.RegisterInArgo(chartGitAttr, ctx)
+			if err != nil {
+				impl.logger.Errorw("error in re-try register in argo", "err", err)
+				return err
+			}
+		} else {
+			return err
 		}
-		gitOpsRepoName := impl.chartTemplateService.GetGitOpsRepoName(app.AppName)
-		chartGitAttr, err := impl.chartTemplateService.CreateGitRepositoryForApp(gitOpsRepoName, chart.ReferenceTemplate, chart.ChartVersion, pipelineCreateRequest.UserId)
-		if err != nil {
-			impl.logger.Errorw("error in pushing chart to git ", "path", chartGitAttr.ChartLocation, "err", err)
-			return nil, err
+	}
+
+	// here updating all the chart version git repo url, as per current implementation all are same git repo url but we have to update each row
+	err = impl.updateGitRepoUrlInCharts(app.Id, chartGitAttr, pipelineCreateRequest.UserId)
+	if err != nil {
+		impl.logger.Errorw("error in updating git repo urls in charts", "appId", app.Id, "chartGitAttr", chartGitAttr, "err", err)
+		return err
+
+	}
+	return nil
+}
+
+func (impl PipelineBuilderImpl) IsGitOpsRequiredForCD(pipelineCreateRequest *bean.CdPipelines) bool {
+
+	// if deploymentAppType is not coming in request than hasAtLeastOneGitOps will be false
+
+	haveAtLeastOneGitOps := false
+	for _, pipeline := range pipelineCreateRequest.Pipelines {
+		if pipeline.DeploymentAppType == util.PIPELINE_DEPLOYMENT_TYPE_ACD {
+			haveAtLeastOneGitOps = true
 		}
-		err = impl.chartTemplateService.RegisterInArgo(chartGitAttr, ctx)
-		if err != nil {
-			impl.logger.Errorw("error while register git repo in argo", "err", err)
-			emptyRepoErrorMessage := []string{"failed to get index: 404 Not Found", "remote repository is empty"}
-			if strings.Contains(err.Error(), emptyRepoErrorMessage[0]) || strings.Contains(err.Error(), emptyRepoErrorMessage[1]) {
-				// - found empty repository, create some file in repository
-				err := impl.chartTemplateService.CreateReadmeInGitRepo(gitOpsRepoName, pipelineCreateRequest.UserId)
-				if err != nil {
-					impl.logger.Errorw("error in creating file in git repo", "err", err)
-					return nil, err
-				}
-				// - retry register in argo
-				err = impl.chartTemplateService.RegisterInArgo(chartGitAttr, ctx)
-				if err != nil {
-					impl.logger.Errorw("error in re-try register in argo", "err", err)
-					return nil, err
+	}
+	return haveAtLeastOneGitOps
+}
+
+func (impl PipelineBuilderImpl) SetPipelineDeploymentAppType(pipelineCreateRequest *bean.CdPipelines, isGitOpsConfigured bool) {
+	isInternalUse := impl.deploymentConfig.IsInternalUse
+	var globalDeploymentAppType string
+	if !isInternalUse {
+		if isGitOpsConfigured {
+			globalDeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_ACD
+		} else {
+			globalDeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_HELM
+		}
+	} else {
+		// if gitops or helm is option available, and deployment app type is not present in pipeline request/
+		for _, pipeline := range pipelineCreateRequest.Pipelines {
+			if pipeline.DeploymentAppType == "" {
+				if isGitOpsConfigured {
+					pipeline.DeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_ACD
+				} else {
+					pipeline.DeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_HELM
 				}
-			} else {
-				return nil, err
 			}
 		}
+	}
+	for _, pipeline := range pipelineCreateRequest.Pipelines {
+		if !isInternalUse {
+			pipeline.DeploymentAppType = globalDeploymentAppType
+		}
+	}
+}
 
-		// here updating all the chart version git repo url, as per current implementation all are same git repo url but we have to update each row
-		err = impl.updateGitRepoUrlInCharts(app.Id, chartGitAttr, pipelineCreateRequest.UserId)
+func (impl PipelineBuilderImpl) CreateCdPipelines(pipelineCreateRequest *bean.CdPipelines, ctx context.Context) (*bean.CdPipelines, error) {
+
+	isGitOpsConfigured, err := impl.IsGitopsConfigured()
+
+	isGitOpsRequiredForCD := impl.IsGitOpsRequiredForCD(pipelineCreateRequest)
+
+	app, err := impl.appRepo.FindById(pipelineCreateRequest.AppId)
+	if err != nil {
+		impl.logger.Errorw("app not found", "err", err, "appId", pipelineCreateRequest.AppId)
+		return nil, err
+	}
+
+	_, err = impl.ValidateCDPipelineRequest(pipelineCreateRequest, isGitOpsConfigured, isGitOpsRequiredForCD)
+	if err != nil {
+		return nil, err
+	}
+
+	impl.SetPipelineDeploymentAppType(pipelineCreateRequest, isGitOpsConfigured)
+
+	if isGitOpsConfigured && isGitOpsRequiredForCD {
+		err = impl.RegisterInACD(app, pipelineCreateRequest, ctx)
 		if err != nil {
-			impl.logger.Errorw("error in updating git repo urls in charts", "appId", app.Id, "chartGitAttr", chartGitAttr, "err", err)
 			return nil, err
 		}
 	}
 
 	for _, pipeline := range pipelineCreateRequest.Pipelines {
-		if isGitOpsConfigured {
-			pipeline.DeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_ACD
-		} else {
-			pipeline.DeploymentAppType = util.PIPELINE_DEPLOYMENT_TYPE_HELM
-		}
+
 		id, err := impl.createCdPipeline(ctx, app, pipeline, pipelineCreateRequest.UserId)
 		if err != nil {
 			impl.logger.Errorw("error in creating pipeline", "name", pipeline.Name, "err", err)
@@ -2607,6 +2705,7 @@ func (impl PipelineBuilderImpl) GetCdPipelineById(pipelineId int) (cdPipeline *b
 		CdArgoSetup:                   environment.Cluster.CdArgoSetup,
 		ParentPipelineId:              appWorkflowMapping.ParentId,
 		ParentPipelineType:            appWorkflowMapping.ParentType,
+		DeploymentAppType:             dbPipeline.DeploymentAppType,
 	}
 
 	return cdPipeline, err
diff --git a/wire_gen.go b/wire_gen.go
index 5295fdb3b..46bef51b1 100644
--- a/wire_gen.go
+++ b/wire_gen.go
@@ -370,7 +370,11 @@ func InitializeApp() (*App, error) {
 	}
 	ciTemplateHistoryRepositoryImpl := repository6.NewCiTemplateHistoryRepositoryImpl(db, sugaredLogger)
 	ciTemplateHistoryServiceImpl := history.NewCiTemplateHistoryServiceImpl(ciTemplateHistoryRepositoryImpl, sugaredLogger)
-	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)
+	deploymentServiceTypeConfig, err := pipeline.GetDeploymentServiceTypeConfig()
+	if err != nil {
+		return nil, err
+	}
+	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, deploymentServiceTypeConfig)
 	dbMigrationServiceImpl := pipeline.NewDbMogrationService(sugaredLogger, dbMigrationConfigRepositoryImpl)
 	globalCMCSRepositoryImpl := repository.NewGlobalCMCSRepositoryImpl(sugaredLogger, db)
 	globalCMCSServiceImpl := pipeline.NewGlobalCMCSServiceImpl(sugaredLogger, globalCMCSRepositoryImpl)
@@ -417,7 +421,11 @@ func InitializeApp() (*App, error) {
 	installedAppVersionHistoryRepositoryImpl := repository3.NewInstalledAppVersionHistoryRepositoryImpl(sugaredLogger, db)
 	appStoreDeploymentArgoCdServiceImpl := appStoreDeploymentGitopsTool.NewAppStoreDeploymentArgoCdServiceImpl(sugaredLogger, appStoreDeploymentFullModeServiceImpl, applicationServiceClientImpl, chartGroupDeploymentRepositoryImpl, installedAppRepositoryImpl, installedAppVersionHistoryRepositoryImpl, chartTemplateServiceImpl, gitFactory, argoUserServiceImpl)
 	appStoreDeploymentCommonServiceImpl := appStoreDeploymentCommon.NewAppStoreDeploymentCommonServiceImpl(sugaredLogger, installedAppRepositoryImpl)
-	appStoreDeploymentServiceImpl := service2.NewAppStoreDeploymentServiceImpl(sugaredLogger, installedAppRepositoryImpl, appStoreApplicationVersionRepositoryImpl, environmentRepositoryImpl, clusterInstalledAppsRepositoryImpl, appRepositoryImpl, appStoreDeploymentHelmServiceImpl, appStoreDeploymentArgoCdServiceImpl, environmentServiceImpl, clusterServiceImplExtended, helmAppServiceImpl, appStoreDeploymentCommonServiceImpl, globalEnvVariables, installedAppVersionHistoryRepositoryImpl, gitOpsConfigRepositoryImpl, attributesServiceImpl)
+	serviceDeploymentServiceTypeConfig, err := service2.GetDeploymentServiceTypeConfig()
+	if err != nil {
+		return nil, err
+	}
+	appStoreDeploymentServiceImpl := service2.NewAppStoreDeploymentServiceImpl(sugaredLogger, installedAppRepositoryImpl, appStoreApplicationVersionRepositoryImpl, environmentRepositoryImpl, clusterInstalledAppsRepositoryImpl, appRepositoryImpl, appStoreDeploymentHelmServiceImpl, appStoreDeploymentArgoCdServiceImpl, environmentServiceImpl, clusterServiceImplExtended, helmAppServiceImpl, appStoreDeploymentCommonServiceImpl, globalEnvVariables, installedAppVersionHistoryRepositoryImpl, gitOpsConfigRepositoryImpl, attributesServiceImpl, serviceDeploymentServiceTypeConfig)
 	installedAppServiceImpl, err := service2.NewInstalledAppServiceImpl(sugaredLogger, installedAppRepositoryImpl, chartTemplateServiceImpl, refChartProxyDir, repositoryServiceClientImpl, appStoreApplicationVersionRepositoryImpl, environmentRepositoryImpl, teamRepositoryImpl, appRepositoryImpl, applicationServiceClientImpl, appStoreValuesServiceImpl, pubSubClient, tokenCache, chartGroupDeploymentRepositoryImpl, environmentServiceImpl, argoK8sClientImpl, gitFactory, acdAuthConfig, gitOpsConfigRepositoryImpl, userServiceImpl, appStoreDeploymentFullModeServiceImpl, appStoreDeploymentServiceImpl, installedAppVersionHistoryRepositoryImpl, argoUserServiceImpl, helmAppClientImpl, helmAppServiceImpl, attributesRepositoryImpl)
 	if err != nil {
 		return nil, err


Test patch:
diff --git a/pkg/appStore/deployment/service/AppStoreDeploymentService_test.go b/pkg/appStore/deployment/service/AppStoreDeploymentService_test.go
new file mode 100644
index 000000000..3a0db6dda
--- /dev/null
+++ b/pkg/appStore/deployment/service/AppStoreDeploymentService_test.go
@@ -0,0 +1,156 @@
+package service
+
+import (
+	"github.com/devtron-labs/authenticator/client"
+	"github.com/devtron-labs/devtron/internal/sql/repository"
+	"github.com/devtron-labs/devtron/internal/sql/repository/app"
+	"github.com/devtron-labs/devtron/internal/util"
+	appStoreBean "github.com/devtron-labs/devtron/pkg/appStore/bean"
+	repository3 "github.com/devtron-labs/devtron/pkg/appStore/deployment/repository"
+	appStoreDiscoverRepository "github.com/devtron-labs/devtron/pkg/appStore/discover/repository"
+	"github.com/devtron-labs/devtron/pkg/cluster"
+	repository2 "github.com/devtron-labs/devtron/pkg/cluster/repository"
+	"github.com/devtron-labs/devtron/pkg/sql"
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestAppStoreDeploymentService(t *testing.T) {
+
+	// not considered scenario when gitops is not enabled.
+
+	// testing GitOps vs Helm option in chart store
+	t.SkipNow()
+	t.Run("AppStoreDeployOperationDBInternalUse", func(t *testing.T) {
+		AppStoreDeploymentService := initAppStoreDeploymentService(t, true)
+
+		sugaredLogger, _ := util.InitLogger()
+		config, _ := sql.GetConfig()
+		db, _ := sql.NewDbConnection(config, sugaredLogger)
+
+		tx, _ := db.Begin()
+
+		InstallAppVersionDTO := appStoreBean.InstallAppVersionDTO{
+			Id:                        0,
+			AppId:                     0,
+			AppName:                   "samplesamplesample",
+			TeamId:                    1,
+			EnvironmentId:             1,
+			InstalledAppId:            0,
+			InstalledAppVersionId:     0,
+			AppStoreVersion:           6304,
+			ValuesOverrideYaml:        "## @section Global parameters\n## Global Docker image parameters\n## Please, note that this will override the image parameters, including dependencies, configured to use the global value\n## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass\n\n## @param global.imageRegistry Global Docker image registry\n## @param global.imagePullSecrets Global Docker registry secret names as an array\n## @param global.storageClass Global StorageClass for Persistent Volume(s)\n##\nglobal:\n  imageRegistry: \"\"\n  ## E.g.\n  ## imagePullSecrets:\n  ##   - myRegistryKeySecretName\n  ##\n  imagePullSecrets: []\n  storageClass: \"\"\n\n## @section Common parameters\n\n## @param kubeVersion Override Kubernetes version\n##\nkubeVersion: \"\"\n## @param nameOverride String to partially override common.names.fullname template (will maintain the release name)\n##\nnameOverride: \"\"\n## @param fullnameOverride String to fully override common.names.fullname template\n##\nfullnameOverride: \"\"\n## @param clusterDomain Kubernetes Cluster Domain\n##\nclusterDomain: cluster.local\n## @param extraDeploy Extra objects to deploy (evaluated as a template)\n##\nextraDeploy: []\n## @param commonLabels Add labels to all the deployed resources\n##\ncommonLabels: {}\n## @param commonAnnotations Add annotations to all the deployed resources\n##\ncommonAnnotations: {}\n## Enable diagnostic mode in the deployment(s)/statefulset(s)\n##\ndiagnosticMode:\n  ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden)\n  ##\n  enabled: false\n  ## @param diagnosticMode.command Command to override all containers in the the deployment(s)/statefulset(s)\n  ##\n  command:\n    - sleep\n  ## @param diagnosticMode.args Args to override all containers in the the deployment(s)/statefulset(s)\n  ##\n  args:\n    - infinity\n\n## @section Airflow common parameters\n\n## Authentication parameters\n## ref: https://github.com/bitnami/containers/tree/main/bitnami/airflow#environment-variables\n##\nauth:\n  ## @param auth.username Username to access web UI\n  ##\n  username: user\n  ## @param auth.password Password to access web UI\n  ##\n  password: \"\"\n  ## @param auth.fernetKey Fernet key to secure connections\n  ## ref: https://airflow.readthedocs.io/en/stable/howto/secure-connections.html\n  ## ref: https://bcb.github.io/airflow/fernet-key\n  ##\n  fernetKey: \"\"\n  ## @param auth.secretKey Secret key to run your flask app\n  ## ref: https://airflow.apache.org/docs/apache-airflow/stable/configurations-ref.html#secret-key\n  ##\n  secretKey: \"\"\n  ## @param auth.existingSecret Name of an existing secret to use for Airflow credentials\n  ## `auth.password`, `auth.fernetKey`, and `auth.secretKey` will be ignored and picked up from this secret\n  ## The secret must contain the keys `airflow-password`, `airflow-fernet-key` and `airflow-secret-key'\n  ## The value is evaluated as a template\n  ##\n  existingSecret: \"\"\n## @param executor Airflow executor. Allowed values: `SequentialExecutor`, `LocalExecutor`, `CeleryExecutor`, `KubernetesExecutor`, `CeleryKubernetesExecutor` and `LocalKubernetesExecutor`\n## ref: http://airflow.apache.org/docs/stable/executor/index.html\n##\nexecutor: CeleryExecutor\n## @param loadExamples Switch to load some Airflow examples\n##\nloadExamples: false\n## @param configuration Specify content for Airflow config file (auto-generated based on other env. vars otherwise)\n## e.g:\n## configuration: |-\n##   [core]\n##   dags_folder=/opt/bitnami/airflow/dags\n##   ...\n##\nconfiguration: \"\"\n## @param existingConfigmap Name of an existing ConfigMap with the Airflow config file\n##\nexistingConfigmap: \"\"\n## Load custom DAGs from a ConfigMap\n## Note: an init container will be used to prepare the DAGs available in the ConfigMap to be consumed by Airflow containers\n##\ndags:\n  ## @param dags.existingConfigmap Name of an existing ConfigMap with all the DAGs files you want to load in Airflow\n  ##\n  existingConfigmap: \"\"\n  ## Bitnami Shell image\n  ## ref: https://hub.docker.com/r/bitnami/bitnami-shell/tags/\n  ## @param dags.image.registry Init container load-dags image registry\n  ## @param dags.image.repository Init container load-dags image repository\n  ## @param dags.image.tag Init container load-dags image tag (immutable tags are recommended)\n  ## @param dags.image.digest Init container load-dags image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param dags.image.pullPolicy Init container load-dags image pull policy\n  ## @param dags.image.pullSecrets Init container load-dags image pull secrets\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/bitnami-shell\n    tag: 11-debian-11-r50\n    digest: \"\"\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n## @param extraEnvVars Add extra environment variables for all the Airflow pods\n##\nextraEnvVars: []\n## @param extraEnvVarsCM ConfigMap with extra environment variables for all the Airflow pods\n##\nextraEnvVarsCM: \"\"\n## @param extraEnvVarsSecret Secret with extra environment variables for all the Airflow pods\n##\nextraEnvVarsSecret: \"\"\n## @param extraEnvVarsSecrets List of secrets with extra environment variables for all the Airflow pods\n##\nextraEnvVarsSecrets: []\n## @param sidecars Add additional sidecar containers to all the Airflow pods\n## Example:\n## sidecars:\n##   - name: your-image-name\n##     image: your-image\n##     imagePullPolicy: Always\n##     ports:\n##       - name: portname\n##         containerPort: 1234\n##\nsidecars: []\n## @param initContainers Add additional init containers to all the Airflow pods\n## Example:\n## initContainers:\n##   - name: your-image-name\n##     image: your-image\n##     imagePullPolicy: Always\n##     ports:\n##       - name: portname\n##         containerPort: 1234\n##\ninitContainers: []\n## @param extraVolumeMounts Optionally specify extra list of additional volumeMounts for all the Airflow pods\n##\nextraVolumeMounts: []\n## @param extraVolumes Optionally specify extra list of additional volumes for the all the Airflow pods\n##\nextraVolumes: []\n\n## @section Airflow web parameters\n\nweb:\n  ## Bitnami Airflow image version\n  ## ref: https://hub.docker.com/r/bitnami/airflow/tags/\n  ## @param web.image.registry Airflow image registry\n  ## @param web.image.repository Airflow image repository\n  ## @param web.image.tag Airflow image tag (immutable tags are recommended)\n  ## @param web.image.digest Airflow image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param web.image.pullPolicy Airflow image pull policy\n  ## @param web.image.pullSecrets Airflow image pull secrets\n  ## @param web.image.debug Enable image debug mode\n  image:\n    registry: docker.io\n    repository: bitnami/airflow\n    tag: 2.4.2-debian-11-r6\n    digest: \"\"\n    ## Specify a imagePullPolicy\n    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n    ##\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n    ## Set to true if you would like to see extra information on logs\n    ##\n    debug: false\n  ## @param web.baseUrl URL used to access to Airflow web ui\n  ##\n  baseUrl: \"\"\n  ## @param web.existingConfigmap Name of an existing config map containing the Airflow web config file\n  ##\n  existingConfigmap: \"\"\n  ## @param web.command Override default container command (useful when using custom images)\n  ##\n  command: []\n  ## @param web.args Override default container args (useful when using custom images)\n  ##\n  args: []\n  ## @param web.extraEnvVars Array with extra environment variables to add Airflow web pods\n  ##\n  extraEnvVars: []\n  ## @param web.extraEnvVarsCM ConfigMap containing extra environment variables for Airflow web pods\n  ##\n  extraEnvVarsCM: \"\"\n  ## @param web.extraEnvVarsSecret Secret containing extra environment variables (in case of sensitive data) for Airflow web pods\n  ##\n  extraEnvVarsSecret: \"\"\n  ## @param web.extraEnvVarsSecrets List of secrets with extra environment variables for Airflow web pods\n  ##\n  extraEnvVarsSecrets: []\n  ## @param web.containerPorts.http Airflow web HTTP container port\n  ##\n  containerPorts:\n    http: 8080\n  ## @param web.replicaCount Number of Airflow web replicas\n  ##\n  replicaCount: 1\n  ## Configure extra options for Airflow web containers' liveness, readiness and startup probes\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes\n  ## @param web.livenessProbe.enabled Enable livenessProbe on Airflow web containers\n  ## @param web.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe\n  ## @param web.livenessProbe.periodSeconds Period seconds for livenessProbe\n  ## @param web.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe\n  ## @param web.livenessProbe.failureThreshold Failure threshold for livenessProbe\n  ## @param web.livenessProbe.successThreshold Success threshold for livenessProbe\n  ##\n  livenessProbe:\n    enabled: true\n    initialDelaySeconds: 180\n    periodSeconds: 20\n    timeoutSeconds: 5\n    failureThreshold: 6\n    successThreshold: 1\n  ## @param web.readinessProbe.enabled Enable readinessProbe on Airflow web containers\n  ## @param web.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe\n  ## @param web.readinessProbe.periodSeconds Period seconds for readinessProbe\n  ## @param web.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe\n  ## @param web.readinessProbe.failureThreshold Failure threshold for readinessProbe\n  ## @param web.readinessProbe.successThreshold Success threshold for readinessProbe\n  ##\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 30\n    periodSeconds: 10\n    timeoutSeconds: 5\n    failureThreshold: 6\n    successThreshold: 1\n  ## @param web.startupProbe.enabled Enable startupProbe on Airflow web containers\n  ## @param web.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe\n  ## @param web.startupProbe.periodSeconds Period seconds for startupProbe\n  ## @param web.startupProbe.timeoutSeconds Timeout seconds for startupProbe\n  ## @param web.startupProbe.failureThreshold Failure threshold for startupProbe\n  ## @param web.startupProbe.successThreshold Success threshold for startupProbe\n  ##\n  startupProbe:\n    enabled: false\n    initialDelaySeconds: 60\n    periodSeconds: 10\n    timeoutSeconds: 1\n    failureThreshold: 15\n    successThreshold: 1\n  ## @param web.customLivenessProbe Custom livenessProbe that overrides the default one\n  ##\n  customLivenessProbe: {}\n  ## @param web.customReadinessProbe Custom readinessProbe that overrides the default one\n  ##\n  customReadinessProbe: {}\n  ## @param web.customStartupProbe Custom startupProbe that overrides the default one\n  ##\n  customStartupProbe: {}\n  ## Airflow web resource requests and limits\n  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n  ## @param web.resources.limits The resources limits for the Airflow web containers\n  ## @param web.resources.requests The requested resources for the Airflow web containers\n  ##\n  resources:\n    limits: {}\n    requests: {}\n  ## Configure Airflow web pods Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod\n  ## @param web.podSecurityContext.enabled Enabled Airflow web pods' Security Context\n  ## @param web.podSecurityContext.fsGroup Set Airflow web pod's Security Context fsGroup\n  ##\n  podSecurityContext:\n    enabled: true\n    fsGroup: 1001\n  ## Configure Airflow web containers (only main one) Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container\n  ## @param web.containerSecurityContext.enabled Enabled Airflow web containers' Security Context\n  ## @param web.containerSecurityContext.runAsUser Set Airflow web containers' Security Context runAsUser\n  ## @param web.containerSecurityContext.runAsNonRoot Set Airflow web containers' Security Context runAsNonRoot\n  ##\n  containerSecurityContext:\n    enabled: true\n    runAsUser: 1001\n    runAsNonRoot: true\n  ## @param web.lifecycleHooks for the Airflow web container(s) to automate configuration before or after startup\n  ##\n  lifecycleHooks: {}\n  ## @param web.hostAliases Deployment pod host aliases\n  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\n  ##\n  hostAliases: []\n  ## @param web.podLabels Add extra labels to the Airflow web pods\n  ##\n  podLabels: {}\n  ## @param web.podAnnotations Add extra annotations to the Airflow web pods\n  ##\n  podAnnotations: {}\n  ## @param web.affinity Affinity for Airflow web pods assignment (evaluated as a template)\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ## Note: `web.podAffinityPreset`, `web.podAntiAffinityPreset`, and `web.nodeAffinityPreset` will be ignored when it's set\n  ##\n  affinity: {}\n  ## Node affinity preset\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity\n  ## @param web.nodeAffinityPreset.key Node label key to match. Ignored if `web.affinity` is set.\n  ## @param web.nodeAffinityPreset.type Node affinity preset type. Ignored if `web.affinity` is set. Allowed values: `soft` or `hard`\n  ## @param web.nodeAffinityPreset.values Node label values to match. Ignored if `web.affinity` is set.\n  ##\n  nodeAffinityPreset:\n    ## e.g:\n    ## key: \"kubernetes.io/e2e-az-name\"\n    ##\n    key: \"\"\n    type: \"\"\n    ## e.g:\n    ## values:\n    ##   - e2e-az1\n    ##   - e2e-az2\n    ##\n    values: []\n  ## @param web.nodeSelector Node labels for Airflow web pods assignment\n  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/\n  ##\n  nodeSelector: {}\n  ## @param web.podAffinityPreset Pod affinity preset. Ignored if `web.affinity` is set. Allowed values: `soft` or `hard`.\n  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAffinityPreset: \"\"\n  ## @param web.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `web.affinity` is set. Allowed values: `soft` or `hard`.\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAntiAffinityPreset: soft\n  ## @param web.tolerations Tolerations for Airflow web pods assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n  ## @param web.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template\n  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods\n  ##\n  topologySpreadConstraints: []\n  ## @param web.priorityClassName Priority Class Name\n  ## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass\n  ##\n  priorityClassName: \"\"\n  ## @param web.schedulerName Use an alternate scheduler, e.g. \"stork\".\n  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n  ##\n  schedulerName: \"\"\n  ## @param web.terminationGracePeriodSeconds Seconds Airflow web pod needs to terminate gracefully\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods\n  ##\n  terminationGracePeriodSeconds: \"\"\n  ## @param web.updateStrategy.type Airflow web deployment strategy type\n  ## @param web.updateStrategy.rollingUpdate Airflow web deployment rolling update configuration parameters\n  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy\n  ##\n  updateStrategy:\n    type: RollingUpdate\n    rollingUpdate: {}\n  ## @param web.sidecars Add additional sidecar containers to the Airflow web pods\n  ## Example:\n  ## sidecars:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  sidecars: []\n  ## @param web.initContainers Add additional init containers to the Airflow web pods\n  ## Example:\n  ## initContainers:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  initContainers: []\n  ## @param web.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Airflow web pods\n  ##\n  extraVolumeMounts: []\n  ## @param web.extraVolumes Optionally specify extra list of additional volumes for the Airflow web pods\n  ##\n  extraVolumes: []\n  ## Airflow web Pod Disruption Budget\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n  ## @param web.pdb.create Deploy a pdb object for the Airflow web pods\n  ## @param web.pdb.minAvailable Maximum number/percentage of unavailable Airflow web replicas\n  ## @param web.pdb.maxUnavailable Maximum number/percentage of unavailable Airflow web replicas\n  ##\n  pdb:\n    create: false\n    minAvailable: 1\n    maxUnavailable: \"\"\n\n## @section Airflow scheduler parameters\n\nscheduler:\n  ## Bitnami Airflow Scheduler image version\n  ## ref: https://hub.docker.com/r/bitnami/airflow-scheduler/tags/\n  ## @param scheduler.image.registry Airflow Scheduler image registry\n  ## @param scheduler.image.repository Airflow Scheduler image repository\n  ## @param scheduler.image.tag Airflow Scheduler image tag (immutable tags are recommended)\n  ## @param scheduler.image.digest Airflow Schefuler image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param scheduler.image.pullPolicy Airflow Scheduler image pull policy\n  ## @param scheduler.image.pullSecrets Airflow Scheduler image pull secrets\n  ## @param scheduler.image.debug Enable image debug mode\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/airflow-scheduler\n    tag: 2.4.2-debian-11-r4\n    digest: \"\"\n    ## Specify a imagePullPolicy\n    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n    ##\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n    ## Set to true if you would like to see extra information on logs\n    ##\n    debug: false\n  ## @param scheduler.replicaCount Number of scheduler replicas\n  ##\n  replicaCount: 1\n  ## @param scheduler.command Override cmd\n  ##\n  command: []\n  ## @param scheduler.args Override args\n  ##\n  args: []\n  ## @param scheduler.extraEnvVars Add extra environment variables\n  ##\n  extraEnvVars: []\n  ## @param scheduler.extraEnvVarsCM ConfigMap with extra environment variables\n  ##\n  extraEnvVarsCM: \"\"\n  ## @param scheduler.extraEnvVarsSecret Secret with extra environment variables\n  ##\n  extraEnvVarsSecret: \"\"\n  ## @param scheduler.extraEnvVarsSecrets List of secrets with extra environment variables for Airflow scheduler pods\n  ##\n  extraEnvVarsSecrets: []\n  ## @param scheduler.customLivenessProbe Custom livenessProbe that overrides the default one\n  ##\n  customLivenessProbe: {}\n  ## @param scheduler.customReadinessProbe Custom readinessProbe that overrides the default one\n  ##\n  customReadinessProbe: {}\n  ## @param scheduler.customStartupProbe Custom startupProbe that overrides the default one\n  ##\n  customStartupProbe: {}\n  ## Airflow scheduler resource requests and limits\n  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n  ## @param scheduler.resources.limits The resources limits for the Airflow scheduler containers\n  ## @param scheduler.resources.requests The requested resources for the Airflow scheduler containers\n  ##\n  resources:\n    limits: {}\n    requests: {}\n  ## Configure Airflow scheduler pods Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod\n  ## @param scheduler.podSecurityContext.enabled Enabled Airflow scheduler pods' Security Context\n  ## @param scheduler.podSecurityContext.fsGroup Set Airflow scheduler pod's Security Context fsGroup\n  ##\n  podSecurityContext:\n    enabled: true\n    fsGroup: 1001\n  ## Configure Airflow scheduler containers (only main one) Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container\n  ## @param scheduler.containerSecurityContext.enabled Enabled Airflow scheduler containers' Security Context\n  ## @param scheduler.containerSecurityContext.runAsUser Set Airflow scheduler containers' Security Context runAsUser\n  ## @param scheduler.containerSecurityContext.runAsNonRoot Set Airflow scheduler containers' Security Context runAsNonRoot\n  ##\n  containerSecurityContext:\n    enabled: true\n    runAsUser: 1001\n    runAsNonRoot: true\n  ## @param scheduler.lifecycleHooks for the Airflow scheduler container(s) to automate configuration before or after startup\n  ##\n  lifecycleHooks: {}\n  ## @param scheduler.hostAliases Deployment pod host aliases\n  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\n  ##\n  hostAliases: []\n  ## @param scheduler.podLabels Add extra labels to the Airflow scheduler pods\n  ##\n  podLabels: {}\n  ## @param scheduler.podAnnotations Add extra annotations to the Airflow scheduler pods\n  ##\n  podAnnotations: {}\n  ## @param scheduler.affinity Affinity for Airflow scheduler pods assignment (evaluated as a template)\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ## Note: `scheduler.podAffinityPreset`, `scheduler.podAntiAffinityPreset`, and `scheduler.nodeAffinityPreset` will be ignored when it's set\n  ##\n  affinity: {}\n  ## Node affinity preset\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity\n  ## @param scheduler.nodeAffinityPreset.key Node label key to match. Ignored if `scheduler.affinity` is set.\n  ## @param scheduler.nodeAffinityPreset.type Node affinity preset type. Ignored if `scheduler.affinity` is set. Allowed values: `soft` or `hard`\n  ## @param scheduler.nodeAffinityPreset.values Node label values to match. Ignored if `scheduler.affinity` is set.\n  ##\n  nodeAffinityPreset:\n    ## e.g:\n    ## key: \"kubernetes.io/e2e-az-name\"\n    ##\n    key: \"\"\n    type: \"\"\n    ## e.g:\n    ## values:\n    ##   - e2e-az1\n    ##   - e2e-az2\n    ##\n    values: []\n  ## @param scheduler.nodeSelector Node labels for Airflow scheduler pods assignment\n  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/\n  ##\n  nodeSelector: {}\n  ## @param scheduler.podAffinityPreset Pod affinity preset. Ignored if `scheduler.affinity` is set. Allowed values: `soft` or `hard`.\n  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAffinityPreset: \"\"\n  ## @param scheduler.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `scheduler.affinity` is set. Allowed values: `soft` or `hard`.\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAntiAffinityPreset: soft\n  ## @param scheduler.tolerations Tolerations for Airflow scheduler pods assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n  ## @param scheduler.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template\n  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods\n  ##\n  topologySpreadConstraints: []\n  ## @param scheduler.priorityClassName Priority Class Name\n  ## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass\n  ##\n  priorityClassName: \"\"\n  ## @param scheduler.schedulerName Use an alternate scheduler, e.g. \"stork\".\n  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n  ##\n  schedulerName: \"\"\n  ## @param scheduler.terminationGracePeriodSeconds Seconds Airflow scheduler pod needs to terminate gracefully\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods\n  ##\n  terminationGracePeriodSeconds: \"\"\n  ## @param scheduler.updateStrategy.type Airflow scheduler deployment strategy type\n  ## @param scheduler.updateStrategy.rollingUpdate Airflow scheduler deployment rolling update configuration parameters\n  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy\n  ##\n  updateStrategy:\n    type: RollingUpdate\n    rollingUpdate: {}\n  ## @param scheduler.sidecars Add additional sidecar containers to the Airflow scheduler pods\n  ## Example:\n  ## sidecars:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  sidecars: []\n  ## @param scheduler.initContainers Add additional init containers to the Airflow scheduler pods\n  ## Example:\n  ## initContainers:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  initContainers: []\n  ## @param scheduler.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Airflow scheduler pods\n  ##\n  extraVolumeMounts: []\n  ## @param scheduler.extraVolumes Optionally specify extra list of additional volumes for the Airflow scheduler pods\n  ##\n  extraVolumes: []\n  ## Airflow scheduler Pod Disruption Budget\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n  ## @param scheduler.pdb.create Deploy a pdb object for the Airflow scheduler pods\n  ## @param scheduler.pdb.minAvailable Maximum number/percentage of unavailable Airflow scheduler replicas\n  ## @param scheduler.pdb.maxUnavailable Maximum number/percentage of unavailable Airflow scheduler replicas\n  ##\n  pdb:\n    create: false\n    minAvailable: 1\n    maxUnavailable: \"\"\n\n## @section Airflow worker parameters\n\nworker:\n  ## Bitnami Airflow Worker image version\n  ## ref: https://hub.docker.com/r/bitnami/airflow-worker/tags/\n  ## @param worker.image.registry Airflow Worker image registry\n  ## @param worker.image.repository Airflow Worker image repository\n  ## @param worker.image.tag Airflow Worker image tag (immutable tags are recommended)\n  ## @param worker.image.digest Airflow Worker image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param worker.image.pullPolicy Airflow Worker image pull policy\n  ## @param worker.image.pullSecrets Airflow Worker image pull secrets\n  ## @param worker.image.debug Enable image debug mode\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/airflow-worker\n    tag: 2.4.2-debian-11-r4\n    digest: \"\"\n    ## Specify a imagePullPolicy\n    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n    ##\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n    ## Set to true if you would like to see extra information on logs\n    ##\n    debug: false\n  ## @param worker.command Override default container command (useful when using custom images)\n  ##\n  command: []\n  ## @param worker.args Override default container args (useful when using custom images)\n  ##\n  args: []\n  ## @param worker.extraEnvVars Array with extra environment variables to add Airflow worker pods\n  ##\n  extraEnvVars: []\n  ## @param worker.extraEnvVarsCM ConfigMap containing extra environment variables for Airflow worker pods\n  ##\n  extraEnvVarsCM: \"\"\n  ## @param worker.extraEnvVarsSecret Secret containing extra environment variables (in case of sensitive data) for Airflow worker pods\n  ##\n  extraEnvVarsSecret: \"\"\n  ## @param worker.extraEnvVarsSecrets List of secrets with extra environment variables for Airflow worker pods\n  ##\n  extraEnvVarsSecrets: []\n  ## @param worker.containerPorts.http Airflow worker HTTP container port\n  ##\n  containerPorts:\n    http: 8793\n  ## @param worker.replicaCount Number of Airflow worker replicas\n  ##\n  replicaCount: 1\n  ## Configure extra options for Airflow worker containers' liveness, readiness and startup probes\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes\n  ## @param worker.livenessProbe.enabled Enable livenessProbe on Airflow worker containers\n  ## @param worker.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe\n  ## @param worker.livenessProbe.periodSeconds Period seconds for livenessProbe\n  ## @param worker.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe\n  ## @param worker.livenessProbe.failureThreshold Failure threshold for livenessProbe\n  ## @param worker.livenessProbe.successThreshold Success threshold for livenessProbe\n  ##\n  livenessProbe:\n    enabled: true\n    initialDelaySeconds: 180\n    periodSeconds: 20\n    timeoutSeconds: 5\n    failureThreshold: 6\n    successThreshold: 1\n  ## @param worker.readinessProbe.enabled Enable readinessProbe on Airflow worker containers\n  ## @param worker.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe\n  ## @param worker.readinessProbe.periodSeconds Period seconds for readinessProbe\n  ## @param worker.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe\n  ## @param worker.readinessProbe.failureThreshold Failure threshold for readinessProbe\n  ## @param worker.readinessProbe.successThreshold Success threshold for readinessProbe\n  ##\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 30\n    periodSeconds: 10\n    timeoutSeconds: 5\n    failureThreshold: 6\n    successThreshold: 1\n  ## @param worker.startupProbe.enabled Enable startupProbe on Airflow worker containers\n  ## @param worker.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe\n  ## @param worker.startupProbe.periodSeconds Period seconds for startupProbe\n  ## @param worker.startupProbe.timeoutSeconds Timeout seconds for startupProbe\n  ## @param worker.startupProbe.failureThreshold Failure threshold for startupProbe\n  ## @param worker.startupProbe.successThreshold Success threshold for startupProbe\n  ##\n  startupProbe:\n    enabled: false\n    initialDelaySeconds: 60\n    periodSeconds: 10\n    timeoutSeconds: 1\n    failureThreshold: 15\n    successThreshold: 1\n  ## @param worker.customLivenessProbe Custom livenessProbe that overrides the default one\n  ##\n  customLivenessProbe: {}\n  ## @param worker.customReadinessProbe Custom readinessProbe that overrides the default one\n  ##\n  customReadinessProbe: {}\n  ## @param worker.customStartupProbe Custom startupProbe that overrides the default one\n  ##\n  customStartupProbe: {}\n  ## Airflow worker resource requests and limits\n  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n  ## @param worker.resources.limits The resources limits for the Airflow worker containers\n  ## @param worker.resources.requests The requested resources for the Airflow worker containers\n  ##\n  resources:\n    limits: {}\n    requests: {}\n  ## Configure Airflow worker pods Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod\n  ## @param worker.podSecurityContext.enabled Enabled Airflow worker pods' Security Context\n  ## @param worker.podSecurityContext.fsGroup Set Airflow worker pod's Security Context fsGroup\n  ##\n  podSecurityContext:\n    enabled: true\n    fsGroup: 1001\n  ## Configure Airflow worker containers (only main one) Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container\n  ## @param worker.containerSecurityContext.enabled Enabled Airflow worker containers' Security Context\n  ## @param worker.containerSecurityContext.runAsUser Set Airflow worker containers' Security Context runAsUser\n  ## @param worker.containerSecurityContext.runAsNonRoot Set Airflow worker containers' Security Context runAsNonRoot\n  ##\n  containerSecurityContext:\n    enabled: true\n    runAsUser: 1001\n    runAsNonRoot: true\n  ## @param worker.lifecycleHooks for the Airflow worker container(s) to automate configuration before or after startup\n  ##\n  lifecycleHooks: {}\n  ## @param worker.hostAliases Deployment pod host aliases\n  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\n  ##\n  hostAliases: []\n  ## @param worker.podLabels Add extra labels to the Airflow worker pods\n  ##\n  podLabels: {}\n  ## @param worker.podAnnotations Add extra annotations to the Airflow worker pods\n  ##\n  podAnnotations: {}\n  ## @param worker.affinity Affinity for Airflow worker pods assignment (evaluated as a template)\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ## Note: `worker.podAffinityPreset`, `worker.podAntiAffinityPreset`, and `worker.nodeAffinityPreset` will be ignored when it's set\n  ##\n  affinity: {}\n  ## Node affinity preset\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity\n  ## @param worker.nodeAffinityPreset.key Node label key to match. Ignored if `worker.affinity` is set.\n  ## @param worker.nodeAffinityPreset.type Node affinity preset type. Ignored if `worker.affinity` is set. Allowed values: `soft` or `hard`\n  ## @param worker.nodeAffinityPreset.values Node label values to match. Ignored if `worker.affinity` is set.\n  ##\n  nodeAffinityPreset:\n    ## e.g:\n    ## key: \"kubernetes.io/e2e-az-name\"\n    ##\n    key: \"\"\n    type: \"\"\n    ## e.g:\n    ## values:\n    ##   - e2e-az1\n    ##   - e2e-az2\n    ##\n    values: []\n  ## @param worker.nodeSelector Node labels for Airflow worker pods assignment\n  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/\n  ##\n  nodeSelector: {}\n  ## @param worker.podAffinityPreset Pod affinity preset. Ignored if `worker.affinity` is set. Allowed values: `soft` or `hard`.\n  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAffinityPreset: \"\"\n  ## @param worker.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `worker.affinity` is set. Allowed values: `soft` or `hard`.\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAntiAffinityPreset: soft\n  ## @param worker.tolerations Tolerations for Airflow worker pods assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n  ## @param worker.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template\n  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods\n  ##\n  topologySpreadConstraints: []\n  ## @param worker.priorityClassName Priority Class Name\n  ## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass\n  ##\n  priorityClassName: \"\"\n  ## @param worker.schedulerName Use an alternate scheduler, e.g. \"stork\".\n  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n  ##\n  schedulerName: \"\"\n  ## @param worker.terminationGracePeriodSeconds Seconds Airflow worker pod needs to terminate gracefully\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods\n  ##\n  terminationGracePeriodSeconds: \"\"\n  ## @param worker.updateStrategy.type Airflow worker deployment strategy type\n  ## @param worker.updateStrategy.rollingUpdate Airflow worker deployment rolling update configuration parameters\n  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy\n  ##\n  updateStrategy:\n    type: RollingUpdate\n    rollingUpdate: {}\n  ## @param worker.sidecars Add additional sidecar containers to the Airflow worker pods\n  ## Example:\n  ## sidecars:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  sidecars: []\n  ## @param worker.initContainers Add additional init containers to the Airflow worker pods\n  ## Example:\n  ## initContainers:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  initContainers: []\n  ## @param worker.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Airflow worker pods\n  ##\n  extraVolumeMounts: []\n  ## @param worker.extraVolumes Optionally specify extra list of additional volumes for the Airflow worker pods\n  ##\n  extraVolumes: []\n  ## @param worker.extraVolumeClaimTemplates Optionally specify extra list of volumesClaimTemplates for the Airflow worker statefulset\n  ##\n  extraVolumeClaimTemplates: []\n  ## @param worker.podTemplate Template to replace the default one to be use when `executor=KubernetesExecutor` to create Airflow worker pods\n  ##\n  podTemplate: {}\n  ## Airflow worker Pod Disruption Budget\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n  ## @param worker.pdb.create Deploy a pdb object for the Airflow worker pods\n  ## @param worker.pdb.minAvailable Maximum number/percentage of unavailable Airflow worker replicas\n  ## @param worker.pdb.maxUnavailable Maximum number/percentage of unavailable Airflow worker replicas\n  ##\n  pdb:\n    create: false\n    minAvailable: 1\n    maxUnavailable: \"\"\n  ## Enable HorizontalPodAutoscaler for worker pods\n  ## ref: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/\n  ## @param worker.autoscaling.enabled Whether enable horizontal pod autoscaler\n  ## @param worker.autoscaling.minReplicas Configure a minimum amount of pods\n  ## @param worker.autoscaling.maxReplicas Configure a maximum amount of pods\n  ## @param worker.autoscaling.targetCPU Define the CPU target to trigger the scaling actions (utilization percentage)\n  ## @param worker.autoscaling.targetMemory Define the memory target to trigger the scaling actions (utilization percentage)\n  ##\n  autoscaling:\n    enabled: false\n    minReplicas: 1\n    maxReplicas: 3\n    targetCPU: 80\n    targetMemory: 80\n\n## @section Airflow git sync parameters\n\n## Configure Git to pull dags and plugins\n##\ngit:\n  ## Bitnami Git image version\n  ## ref: https://hub.docker.com/r/bitnami/git/tags/\n  ## @param git.image.registry Git image registry\n  ## @param git.image.repository Git image repository\n  ## @param git.image.tag Git image tag (immutable tags are recommended)\n  ## @param git.image.digest Git image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param git.image.pullPolicy Git image pull policy\n  ## @param git.image.pullSecrets Git image pull secrets\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/git\n    tag: 2.38.1-debian-11-r7\n    digest: \"\"\n    ## Specify a imagePullPolicy\n    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n    ##\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n  ## Get DAG files from git repositories\n  ## @param git.dags.enabled Enable in order to download DAG files from git repositories.\n  ## @param git.dags.repositories [array] Array of repositories from which to download DAG files\n  ##\n  dags:\n    enabled: false\n    ## Name for repositories can be anything unique and must follow same naming conventions as kubernetes.\n    ## Kubernetes resources can have names up to 253 characters long. The characters allowed in names are:\n    ## digits (0-9), lower case letters (a-z), -, and .\n    ## Example:\n    ##   - repository: https://github.com/myuser/myrepo\n    ##     branch: main\n    ##     name: my-dags\n    ##     path: /\n    ##\n    repositories:\n      - repository: \"\"\n        ## Branch from repository to checkout\n        ##\n        branch: \"\"\n        ## An unique identifier for repository, must be unique for each repository\n        ##\n        name: \"\"\n        ## Path to a folder in the repository containing the dags\n        ##\n        path: \"\"\n  ## Get Plugins files from git repositories.\n  ## @param git.plugins.enabled Enable in order to download Plugins files from git repositories.\n  ## @param git.plugins.repositories [array] Array of repositories from which to download DAG files\n  ##\n  plugins:\n    enabled: false\n    repositories:\n      - repository: \"\"\n        ## Branch from repository to checkout\n        ##\n        branch: \"\"\n        ## An unique identifier for repository, must be unique for each repository\n        ##\n        name: \"\"\n        ## Path to a folder in the repository containing the plugins\n        ##\n        path: \"\"\n  ## Properties for the Clone init container\n  ## @param git.clone.command Override cmd\n  ## @param git.clone.args Override args\n  ## @param git.clone.extraVolumeMounts Add extra volume mounts\n  ## @param git.clone.extraEnvVars Add extra environment variables\n  ## @param git.clone.extraEnvVarsCM ConfigMap with extra environment variables\n  ## @param git.clone.extraEnvVarsSecret Secret with extra environment variables\n  ## @param git.clone.resources Clone init container resource requests and limits\n  ##\n  clone:\n    command: []\n    args: []\n    extraVolumeMounts: []\n    extraEnvVars: []\n    extraEnvVarsCM: \"\"\n    extraEnvVarsSecret: \"\"\n    ## Clone init container resource requests and limits\n    ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n    ##\n    resources: {}\n  ## Properties for the Sync sidecar container\n  ## @param git.sync.interval Interval in seconds to pull the git repository containing the plugins and/or DAG files\n  ## @param git.sync.command Override cmd\n  ## @param git.sync.args Override args\n  ## @param git.sync.extraVolumeMounts Add extra volume mounts\n  ## @param git.sync.extraEnvVars Add extra environment variables\n  ## @param git.sync.extraEnvVarsCM ConfigMap with extra environment variables\n  ## @param git.sync.extraEnvVarsSecret Secret with extra environment variables\n  ## @param git.sync.resources Sync sidecar container resource requests and limits\n  ##\n  sync:\n    interval: 60\n    command: []\n    args: []\n    extraVolumeMounts: []\n    extraEnvVars: []\n    extraEnvVarsCM: \"\"\n    extraEnvVarsSecret: \"\"\n    ## Sync sidecar container resource requests and limits\n    ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n    ##\n    resources: {}\n\n## @section Airflow ldap parameters\n\n## LDAP configuration\n## @param ldap.enabled Enable LDAP authentication\n## @param ldap.uri Server URI, eg. ldap://ldap_server:389\n## DEPRECATED ldap.base It will be removed in a future release, please use 'ldap.basedn' instead\n## @param ldap.basedn Base of the search, eg. ou=example,o=org.\n## DEPRECATED ldap.uidField It will be removed in a future release,, please use 'ldap.searchAttribute' instead\n## @param ldap.searchAttribute if doing an indirect bind to ldap, this is the field that matches the username when searching for the account to bind to\n## @param ldap.binddn DN of the account used to search in the LDAP server.\n## @param ldap.bindpw Bind Password\n## @param ldap.userRegistration Set to True to enable user self registration\n## @param ldap.userRegistrationRole Set role name to be assign when a user registers himself. This role must already exist. Mandatory when using ldap.userRegistration\n## @param ldap.rolesMapping mapping from LDAP DN to a list of roles\n## @param ldap.rolesSyncAtLogin replace ALL the user's roles each login, or only on registration\n##\nldap:\n  enabled: false\n  uri: \"ldap://ldap_server:389\"\n  basedn: \"dc=example,dc=org\"\n  searchAttribute: \"cn\"\n  binddn: \"cn=admin,dc=example,dc=org\"\n  bindpw: \"\"\n  userRegistration: 'True'\n  userRegistrationRole: \"Public\"\n  rolesMapping: '{ \"cn=All,ou=Groups,dc=example,dc=org\": [\"User\"], \"cn=Admins,ou=Groups,dc=example,dc=org\": [\"Admin\"], }'\n  rolesSyncAtLogin: 'True'\n\n  ## SSL/TLS parameters for LDAP\n  ## @param ldap.tls.enabled Enabled TLS/SSL for LDAP, you must include the CA file.\n  ## @param ldap.tls.allowSelfSigned Allow to use self signed certificates\n  ## DEPRECATED ldap.tls.CAcertificateSecret It will be removed in a future release, please use ldap.tls.certificatesSecret instead\n  ## @param ldap.tls.certificatesSecret Name of the existing secret containing the certificate CA file that will be used by ldap client\n  ## @param ldap.tls.certificatesMountPath Where LDAP certifcates are mounted.\n  ## DEPRECATED ldap.tls.CAcertificateFilename It will be removed in a future release, please use ldap.tls.CAFilename instead\n  ## @param ldap.tls.CAFilename LDAP CA cert filename\n  ##\n  tls:\n    enabled: false\n    allowSelfSigned: true\n    certificatesSecret: \"\"\n    certificatesMountPath: /opt/bitnami/airflow/conf/certs\n    CAFilename: \"\"\n\n## @section Traffic Exposure Parameters\n\n## Airflow service parameters\n##\nservice:\n  ## @param service.type Airflow service type\n  ##\n  type: ClusterIP\n  ## @param service.ports.http Airflow service HTTP port\n  ##\n  ports:\n    http: 8080\n  ## Node ports to expose\n  ## @param service.nodePorts.http Node port for HTTP\n  ## NOTE: choose port between <30000-32767>\n  ##\n  nodePorts:\n    http: \"\"\n  ## @param service.sessionAffinity Control where client requests go, to the same pod or round-robin\n  ## Values: ClientIP or None\n  ## ref: https://kubernetes.io/docs/user-guide/services/\n  ##\n  sessionAffinity: None\n  ## @param service.sessionAffinityConfig Additional settings for the sessionAffinity\n  ## sessionAffinityConfig:\n  ##   clientIP:\n  ##     timeoutSeconds: 300\n  ##\n  sessionAffinityConfig: {}\n  ## @param service.clusterIP Airflow service Cluster IP\n  ## e.g.:\n  ## clusterIP: None\n  ##\n  clusterIP: \"\"\n  ## @param service.loadBalancerIP Airflow service Load Balancer IP\n  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer\n  ##\n  loadBalancerIP: \"\"\n  ## @param service.loadBalancerSourceRanges Airflow service Load Balancer sources\n  ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service\n  ## e.g:\n  ## loadBalancerSourceRanges:\n  ##   - 10.10.10.0/24\n  ##\n  loadBalancerSourceRanges: []\n  ## @param service.externalTrafficPolicy Airflow service external traffic policy\n  ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip\n  ##\n  externalTrafficPolicy: Cluster\n  ## @param service.annotations Additional custom annotations for Airflow service\n  ##\n  annotations: {}\n  ## @param service.extraPorts Extra port to expose on Airflow service\n  ##\n  extraPorts: []\n\n## Airflow ingress parameters\n## ref: https://kubernetes.io/docs/user-guide/ingress/\n##\ningress:\n  ## @param ingress.enabled Enable ingress record generation for Airflow\n  ##\n  enabled: false\n  ## @param ingress.ingressClassName IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+)\n  ## This is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster .\n  ## ref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/\n  ##\n  ingressClassName: \"\"\n  ## @param ingress.pathType Ingress path type\n  ##\n  pathType: ImplementationSpecific\n  ## @param ingress.apiVersion Force Ingress API version (automatically detected if not set)\n  ##\n  apiVersion: \"\"\n  ## @param ingress.hostname Default host for the ingress record\n  ##\n  hostname: airflow.local\n  ## @param ingress.path Default path for the ingress record\n  ## NOTE: You may need to set this to '/*' in order to use this with ALB ingress controllers\n  ##\n  path: /\n  ## @param ingress.annotations [object] Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations.\n  ## Use this parameter to set the required annotations for cert-manager, see\n  ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations\n  ## e.g:\n  ## annotations:\n  ##   kubernetes.io/ingress.class: nginx\n  ##   cert-manager.io/cluster-issuer: cluster-issuer-name\n  ##\n  annotations: {}\n  ## @param ingress.tls Enable TLS configuration for the host defined at `ingress.hostname` parameter\n  ## TLS certificates will be retrieved from a TLS secret with name: `{{- printf \"%s-tls\" .Values.ingress.hostname }}`\n  ## You can:\n  ##   - Use the `ingress.secrets` parameter to create this TLS secret\n  ##   - Rely on cert-manager to create it by setting the corresponding annotations\n  ##   - Rely on Helm to create self-signed certificates by setting `ingress.selfSigned=true`\n  ##\n  tls: false\n  ## @param ingress.selfSigned Create a TLS secret for this ingress record using self-signed certificates generated by Helm\n  ##\n  selfSigned: false\n  ## @param ingress.extraHosts An array with additional hostname(s) to be covered with the ingress record\n  ## e.g:\n  ## extraHosts:\n  ##   - name: airflow.local\n  ##     path: /\n  ##\n  extraHosts: []\n  ## @param ingress.extraPaths An array with additional arbitrary paths that may need to be added to the ingress under the main host\n  ## e.g:\n  ## extraPaths:\n  ## - path: /*\n  ##   backend:\n  ##     serviceName: ssl-redirect\n  ##     servicePort: use-annotation\n  ##\n  extraPaths: []\n  ## @param ingress.extraTls TLS configuration for additional hostname(s) to be covered with this ingress record\n  ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n  ## e.g:\n  ## extraTls:\n  ## - hosts:\n  ##     - airflow.local\n  ##   secretName: airflow.local-tls\n  ##\n  extraTls: []\n  ## @param ingress.secrets Custom TLS certificates as secrets\n  ## NOTE: 'key' and 'certificate' are expected in PEM format\n  ## NOTE: 'name' should line up with a 'secretName' set further up\n  ## If it is not set and you're using cert-manager, this is unneeded, as it will create a secret for you with valid certificates\n  ## If it is not set and you're NOT using cert-manager either, self-signed certificates will be created valid for 365 days\n  ## It is also possible to create and manage the certificates outside of this helm chart\n  ## Please see README.md for more information\n  ## e.g:\n  ## secrets:\n  ##   - name: airflow.local-tls\n  ##     key: |-\n  ##       -----BEGIN RSA PRIVATE KEY-----\n  ##       ...\n  ##       -----END RSA PRIVATE KEY-----\n  ##     certificate: |-\n  ##       -----BEGIN CERTIFICATE-----\n  ##       ...\n  ##       -----END CERTIFICATE-----\n  ##\n  secrets: []\n  ## @param ingress.extraRules Additional rules to be covered with this ingress record\n  ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-rules\n  ## e.g:\n  ## extraRules:\n  ## - host: example.local\n  ##     http:\n  ##       path: /\n  ##       backend:\n  ##         service:\n  ##           name: example-svc\n  ##           port:\n  ##             name: http\n  ##\n  extraRules: []\n\n## @section Other Parameters\n\n## Service account for Airflow pods to use.\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n##\nserviceAccount:\n  ## @param serviceAccount.create Enable creation of ServiceAccount for Airflow pods\n  ##\n  create: false\n  ## @param serviceAccount.name The name of the ServiceAccount to use.\n  ## If not set and create is true, a name is generated using the common.names.fullname template\n  ##\n  name: \"\"\n  ## @param serviceAccount.automountServiceAccountToken Allows auto mount of ServiceAccountToken on the serviceAccount created\n  ## Can be set to false if pods using this serviceAccount do not need to use K8s API\n  ##\n  automountServiceAccountToken: true\n  ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount\n  ##\n  annotations: {}\n## Role Based Access\n## Ref: https://kubernetes.io/docs/admin/authorization/rbac/\n## @param rbac.create Create Role and RoleBinding\n##\nrbac:\n  create: false\n  ## @param rbac.rules Custom RBAC rules to set\n  ## e.g:\n  ## rules:\n  ##   - apiGroups:\n  ##       - \"\"\n  ##     resources:\n  ##       - pods\n  ##     verbs:\n  ##       - get\n  ##       - list\n  ##\n  rules: []\n\n## @section Airflow metrics parameters\n\nmetrics:\n  ## @param metrics.enabled Whether or not to create a standalone Airflow exporter to expose Airflow metrics\n  ##\n  enabled: false\n  ## Bitnami Airflow exporter image\n  ## ref: https://hub.docker.com/r/bitnami/airflow-exporter/tags/\n  ## @param metrics.image.registry Airflow exporter image registry\n  ## @param metrics.image.repository Airflow exporter image repository\n  ## @param metrics.image.tag Airflow exporter image tag (immutable tags are recommended)\n  ## @param metrics.image.digest Airflow exporter image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param metrics.image.pullPolicy Airflow exporter image pull policy\n  ## @param metrics.image.pullSecrets Airflow exporter image pull secrets\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/airflow-exporter\n    tag: 0.20220314.0-debian-11-r57\n    digest: \"\"\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n  ## @param metrics.extraEnvVars Array with extra environment variables to add Airflow exporter pods\n  ##\n  extraEnvVars: []\n  ## @param metrics.extraEnvVarsCM ConfigMap containing extra environment variables for Airflow exporter pods\n  ##\n  extraEnvVarsCM: \"\"\n  ## @param metrics.extraEnvVarsSecret Secret containing extra environment variables (in case of sensitive data) for Airflow exporter pods\n  ##\n  extraEnvVarsSecret: \"\"\n  ## @param metrics.containerPorts.http Airflow exporter metrics container port\n  ##\n  containerPorts:\n    http: 9112\n  ## Airflow exporter resource requests and limits\n  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n  ## @param metrics.resources.limits The resources limits for the container\n  ## @param metrics.resources.requests The requested resources for the container\n  ##\n  resources:\n    limits: {}\n    requests: {}\n  ## Airflow exporter pods' Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod\n  ## @param metrics.podSecurityContext.enabled Enable security context for the pods\n  ## @param metrics.podSecurityContext.fsGroup Set Airflow exporter pod's Security Context fsGroup\n  ##\n  podSecurityContext:\n    enabled: true\n    fsGroup: 1001\n  ## Airflow exporter containers' Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container\n  ## @param metrics.containerSecurityContext.enabled Enable Airflow exporter containers' Security Context\n  ## @param metrics.containerSecurityContext.runAsUser Set Airflow exporter containers' Security Context runAsUser\n  ## @param metrics.containerSecurityContext.runAsNonRoot Set Airflow exporter containers' Security Context runAsNonRoot\n  ## e.g:\n  ##   containerSecurityContext:\n  ##     enabled: true\n  ##     capabilities:\n  ##       drop: [\"NET_RAW\"]\n  ##     readOnlyRootFilesystem: true\n  ##\n  containerSecurityContext:\n    enabled: true\n    runAsUser: 1001\n    runAsNonRoot: true\n  ## @param metrics.lifecycleHooks for the Airflow exporter container(s) to automate configuration before or after startup\n  ##\n  lifecycleHooks: {}\n  ## @param metrics.hostAliases Airflow exporter pods host aliases\n  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\n  ##\n  hostAliases: []\n  ## @param metrics.podLabels Extra labels for Airflow exporter pods\n  ## Ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/\n  ##\n  podLabels: {}\n  ## @param metrics.podAnnotations Extra annotations for Airflow exporter pods\n  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/\n  ##\n  podAnnotations: {}\n  ## @param metrics.podAffinityPreset Pod affinity preset. Ignored if `metrics.affinity` is set. Allowed values: `soft` or `hard`\n  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAffinityPreset: \"\"\n  ## @param metrics.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `metrics.affinity` is set. Allowed values: `soft` or `hard`\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAntiAffinityPreset: soft\n  ## Node metrics.affinity preset\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity\n  ##\n  nodeAffinityPreset:\n    ## @param metrics.nodeAffinityPreset.type Node affinity preset type. Ignored if `metrics.affinity` is set. Allowed values: `soft` or `hard`\n    ##\n    type: \"\"\n    ## @param metrics.nodeAffinityPreset.key Node label key to match Ignored if `metrics.affinity` is set.\n    ## E.g.\n    ## key: \"kubernetes.io/e2e-az-name\"\n    ##\n    key: \"\"\n    ## @param metrics.nodeAffinityPreset.values Node label values to match. Ignored if `metrics.affinity` is set.\n    ## E.g.\n    ## values:\n    ##   - e2e-az1\n    ##   - e2e-az2\n    ##\n    values: []\n  ## @param metrics.affinity Affinity for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ## Note: metrics.podAffinityPreset, metrics.podAntiAffinityPreset, and metrics.nodeAffinityPreset will be ignored when it's set\n  ##\n  affinity: {}\n  ## @param metrics.nodeSelector Node labels for pod assignment\n  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/\n  ##\n  nodeSelector: {}\n  ## @param metrics.tolerations Tolerations for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n  ## @param metrics.schedulerName Name of the k8s scheduler (other than default) for Airflow exporter\n  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n  ##\n  schedulerName: \"\"\n  ## Airflow exporter service configuration\n  ##\n  service:\n    ## @param metrics.service.ports.http Airflow exporter metrics service port\n    ##\n    ports:\n      http: 9112\n    ## @param metrics.service.clusterIP Static clusterIP or None for headless services\n    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address\n    ##\n    clusterIP: \"\"\n    ## @param metrics.service.sessionAffinity Control where client requests go, to the same pod or round-robin\n    ## Values: ClientIP or None\n    ## ref: https://kubernetes.io/docs/user-guide/services/\n    ##\n    sessionAffinity: None\n    ## @param metrics.service.annotations [object] Annotations for the Airflow exporter service\n    ##\n    annotations:\n      prometheus.io/scrape: \"true\"\n      prometheus.io/port: \"{{ .Values.metrics.service.ports.http }}\"\n  ## Prometheus Operator ServiceMonitor configuration\n  ##\n  serviceMonitor:\n    ## @param metrics.serviceMonitor.enabled if `true`, creates a Prometheus Operator ServiceMonitor (requires `metrics.enabled` to be `true`)\n    ##\n    enabled: false\n    ## @param metrics.serviceMonitor.namespace Namespace in which Prometheus is running\n    ##\n    namespace: \"\"\n    ## @param metrics.serviceMonitor.interval Interval at which metrics should be scraped\n    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint\n    ##\n    interval: \"\"\n    ## @param metrics.serviceMonitor.scrapeTimeout Timeout after which the scrape is ended\n    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint\n    ##\n    scrapeTimeout: \"\"\n    ## @param metrics.serviceMonitor.labels Additional labels that can be used so ServiceMonitor will be discovered by Prometheus\n    ##\n    labels: {}\n    ## @param metrics.serviceMonitor.selector Prometheus instance selector labels\n    ## ref: https://github.com/bitnami/charts/tree/main/bitnami/prometheus-operator#prometheus-configuration\n    ##\n    selector: {}\n    ## @param metrics.serviceMonitor.relabelings RelabelConfigs to apply to samples before scraping\n    ##\n    relabelings: []\n    ## @param metrics.serviceMonitor.metricRelabelings MetricRelabelConfigs to apply to samples before ingestion\n    ##\n    metricRelabelings: []\n    ## @param metrics.serviceMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint\n    ##\n    honorLabels: false\n    ## @param metrics.serviceMonitor.jobLabel The name of the label on the target service to use as the job name in prometheus.\n    ##\n    jobLabel: \"\"\n\n## @section Airflow database parameters\n\n## PostgreSQL chart configuration\n## ref: https://github.com/bitnami/charts/blob/main/bitnami/postgresql/values.yaml\n## @param postgresql.enabled Switch to enable or disable the PostgreSQL helm chart\n## @param postgresql.auth.enablePostgresUser Assign a password to the \"postgres\" admin user. Otherwise, remote access will be blocked for this user\n## @param postgresql.auth.username Name for a custom user to create\n## @param postgresql.auth.password Password for the custom user to create\n## @param postgresql.auth.database Name for a custom database to create\n## @param postgresql.auth.existingSecret Name of existing secret to use for PostgreSQL credentials\n## @param postgresql.architecture PostgreSQL architecture (`standalone` or `replication`)\n##\npostgresql:\n  enabled: true\n  auth:\n    enablePostgresUser: false\n    username: bn_airflow\n    password: \"\"\n    database: bitnami_airflow\n    existingSecret: \"\"\n  architecture: standalone\n## External PostgreSQL configuration\n## All of these values are only used when postgresql.enabled is set to false\n## @param externalDatabase.host Database host\n## @param externalDatabase.port Database port number\n## @param externalDatabase.user Non-root username for Airflow\n## @param externalDatabase.password Password for the non-root username for Airflow\n## @param externalDatabase.database Airflow database name\n## @param externalDatabase.existingSecret Name of an existing secret resource containing the database credentials\n## @param externalDatabase.existingSecretPasswordKey Name of an existing secret key containing the database credentials\n##\nexternalDatabase:\n  host: localhost\n  port: 5432\n  user: bn_airflow\n  database: bitnami_airflow\n  password: \"\"\n  existingSecret: \"\"\n  existingSecretPasswordKey: \"\"\n\n## Redis&reg; chart configuration\n## ref: https://github.com/bitnami/charts/blob/main/bitnami/redis/values.yaml\n## @param redis.enabled Switch to enable or disable the Redis&reg; helm\n## @param redis.auth.enabled Enable password authentication\n## @param redis.auth.password Redis&reg; password\n## @param redis.auth.existingSecret The name of an existing secret with Redis&reg; credentials\n## @param redis.architecture Redis&reg; architecture. Allowed values: `standalone` or `replication`\n##\nredis:\n  enabled: true\n  auth:\n    enabled: true\n    ## Redis&reg; password (both master and slave). Defaults to a random 10-character alphanumeric string if not set and auth.enabled is true.\n    ## It should always be set using the password value or in the existingSecret to avoid issues\n    ## with Airflow.\n    ## The password value is ignored if existingSecret is set\n    password: \"\"\n    existingSecret: \"\"\n  architecture: standalone\n\n## External Redis&reg; configuration\n## All of these values are only used when redis.enabled is set to false\n## @param externalRedis.host Redis&reg; host\n## @param externalRedis.port Redis&reg; port number\n## @param externalRedis.username Redis&reg; username\n## @param externalRedis.password Redis&reg; password\n## @param externalRedis.existingSecret Name of an existing secret resource containing the Redis&trade credentials\n## @param externalRedis.existingSecretPasswordKey Name of an existing secret key containing the Redis&trade credentials\n##\nexternalRedis:\n  host: localhost\n  port: 6379\n  ## Most Redis&reg; implementations do not require a username\n  ## to authenticate and it should be enough with the password\n  username: \"\"\n  password: \"\"\n  existingSecret: \"\"\n  existingSecretPasswordKey: \"\"\n",
+			Readme:                    "",
+			UserId:                    6,
+			ReferenceValueId:          6304,
+			ReferenceValueKind:        "DEFAULT",
+			ACDAppName:                "",
+			Environment:               nil,
+			ChartGroupEntryId:         0,
+			DefaultClusterComponent:   false,
+			Status:                    appStoreBean.WF_UNKNOWN,
+			AppStoreId:                0,
+			AppStoreName:              "",
+			Deprecated:                false,
+			ForceDelete:               false,
+			ClusterId:                 0,
+			Namespace:                 "devtron-demo",
+			AppOfferingMode:           "",
+			GitOpsRepoName:            "",
+			GitOpsPath:                "",
+			GitHash:                   "",
+			EnvironmentName:           "",
+			InstallAppVersionChartDTO: nil,
+			DeploymentAppType:         "helm",
+		}
+
+		installedAppVersion, err := AppStoreDeploymentService.AppStoreDeployOperationDB(&InstallAppVersionDTO, tx)
+
+		assert.Nil(t, err)
+		assert.Equal(t, installedAppVersion.DeploymentAppType, "helm")
+
+	})
+
+	t.Run("AppStoreDeployOperationDBExternallUse", func(t *testing.T) {
+		AppStoreDeploymentService := initAppStoreDeploymentService(t, false)
+
+		sugaredLogger, _ := util.InitLogger()
+		config, _ := sql.GetConfig()
+		db, _ := sql.NewDbConnection(config, sugaredLogger)
+
+		tx, _ := db.Begin()
+
+		InstallAppVersionDTO := appStoreBean.InstallAppVersionDTO{
+			Id:                        0,
+			AppId:                     0,
+			AppName:                   "samplesamplesample",
+			TeamId:                    1,
+			EnvironmentId:             1,
+			InstalledAppId:            0,
+			InstalledAppVersionId:     0,
+			AppStoreVersion:           6304,
+			ValuesOverrideYaml:        "## @section Global parameters\n## Global Docker image parameters\n## Please, note that this will override the image parameters, including dependencies, configured to use the global value\n## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass\n\n## @param global.imageRegistry Global Docker image registry\n## @param global.imagePullSecrets Global Docker registry secret names as an array\n## @param global.storageClass Global StorageClass for Persistent Volume(s)\n##\nglobal:\n  imageRegistry: \"\"\n  ## E.g.\n  ## imagePullSecrets:\n  ##   - myRegistryKeySecretName\n  ##\n  imagePullSecrets: []\n  storageClass: \"\"\n\n## @section Common parameters\n\n## @param kubeVersion Override Kubernetes version\n##\nkubeVersion: \"\"\n## @param nameOverride String to partially override common.names.fullname template (will maintain the release name)\n##\nnameOverride: \"\"\n## @param fullnameOverride String to fully override common.names.fullname template\n##\nfullnameOverride: \"\"\n## @param clusterDomain Kubernetes Cluster Domain\n##\nclusterDomain: cluster.local\n## @param extraDeploy Extra objects to deploy (evaluated as a template)\n##\nextraDeploy: []\n## @param commonLabels Add labels to all the deployed resources\n##\ncommonLabels: {}\n## @param commonAnnotations Add annotations to all the deployed resources\n##\ncommonAnnotations: {}\n## Enable diagnostic mode in the deployment(s)/statefulset(s)\n##\ndiagnosticMode:\n  ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden)\n  ##\n  enabled: false\n  ## @param diagnosticMode.command Command to override all containers in the the deployment(s)/statefulset(s)\n  ##\n  command:\n    - sleep\n  ## @param diagnosticMode.args Args to override all containers in the the deployment(s)/statefulset(s)\n  ##\n  args:\n    - infinity\n\n## @section Airflow common parameters\n\n## Authentication parameters\n## ref: https://github.com/bitnami/containers/tree/main/bitnami/airflow#environment-variables\n##\nauth:\n  ## @param auth.username Username to access web UI\n  ##\n  username: user\n  ## @param auth.password Password to access web UI\n  ##\n  password: \"\"\n  ## @param auth.fernetKey Fernet key to secure connections\n  ## ref: https://airflow.readthedocs.io/en/stable/howto/secure-connections.html\n  ## ref: https://bcb.github.io/airflow/fernet-key\n  ##\n  fernetKey: \"\"\n  ## @param auth.secretKey Secret key to run your flask app\n  ## ref: https://airflow.apache.org/docs/apache-airflow/stable/configurations-ref.html#secret-key\n  ##\n  secretKey: \"\"\n  ## @param auth.existingSecret Name of an existing secret to use for Airflow credentials\n  ## `auth.password`, `auth.fernetKey`, and `auth.secretKey` will be ignored and picked up from this secret\n  ## The secret must contain the keys `airflow-password`, `airflow-fernet-key` and `airflow-secret-key'\n  ## The value is evaluated as a template\n  ##\n  existingSecret: \"\"\n## @param executor Airflow executor. Allowed values: `SequentialExecutor`, `LocalExecutor`, `CeleryExecutor`, `KubernetesExecutor`, `CeleryKubernetesExecutor` and `LocalKubernetesExecutor`\n## ref: http://airflow.apache.org/docs/stable/executor/index.html\n##\nexecutor: CeleryExecutor\n## @param loadExamples Switch to load some Airflow examples\n##\nloadExamples: false\n## @param configuration Specify content for Airflow config file (auto-generated based on other env. vars otherwise)\n## e.g:\n## configuration: |-\n##   [core]\n##   dags_folder=/opt/bitnami/airflow/dags\n##   ...\n##\nconfiguration: \"\"\n## @param existingConfigmap Name of an existing ConfigMap with the Airflow config file\n##\nexistingConfigmap: \"\"\n## Load custom DAGs from a ConfigMap\n## Note: an init container will be used to prepare the DAGs available in the ConfigMap to be consumed by Airflow containers\n##\ndags:\n  ## @param dags.existingConfigmap Name of an existing ConfigMap with all the DAGs files you want to load in Airflow\n  ##\n  existingConfigmap: \"\"\n  ## Bitnami Shell image\n  ## ref: https://hub.docker.com/r/bitnami/bitnami-shell/tags/\n  ## @param dags.image.registry Init container load-dags image registry\n  ## @param dags.image.repository Init container load-dags image repository\n  ## @param dags.image.tag Init container load-dags image tag (immutable tags are recommended)\n  ## @param dags.image.digest Init container load-dags image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param dags.image.pullPolicy Init container load-dags image pull policy\n  ## @param dags.image.pullSecrets Init container load-dags image pull secrets\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/bitnami-shell\n    tag: 11-debian-11-r50\n    digest: \"\"\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n## @param extraEnvVars Add extra environment variables for all the Airflow pods\n##\nextraEnvVars: []\n## @param extraEnvVarsCM ConfigMap with extra environment variables for all the Airflow pods\n##\nextraEnvVarsCM: \"\"\n## @param extraEnvVarsSecret Secret with extra environment variables for all the Airflow pods\n##\nextraEnvVarsSecret: \"\"\n## @param extraEnvVarsSecrets List of secrets with extra environment variables for all the Airflow pods\n##\nextraEnvVarsSecrets: []\n## @param sidecars Add additional sidecar containers to all the Airflow pods\n## Example:\n## sidecars:\n##   - name: your-image-name\n##     image: your-image\n##     imagePullPolicy: Always\n##     ports:\n##       - name: portname\n##         containerPort: 1234\n##\nsidecars: []\n## @param initContainers Add additional init containers to all the Airflow pods\n## Example:\n## initContainers:\n##   - name: your-image-name\n##     image: your-image\n##     imagePullPolicy: Always\n##     ports:\n##       - name: portname\n##         containerPort: 1234\n##\ninitContainers: []\n## @param extraVolumeMounts Optionally specify extra list of additional volumeMounts for all the Airflow pods\n##\nextraVolumeMounts: []\n## @param extraVolumes Optionally specify extra list of additional volumes for the all the Airflow pods\n##\nextraVolumes: []\n\n## @section Airflow web parameters\n\nweb:\n  ## Bitnami Airflow image version\n  ## ref: https://hub.docker.com/r/bitnami/airflow/tags/\n  ## @param web.image.registry Airflow image registry\n  ## @param web.image.repository Airflow image repository\n  ## @param web.image.tag Airflow image tag (immutable tags are recommended)\n  ## @param web.image.digest Airflow image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param web.image.pullPolicy Airflow image pull policy\n  ## @param web.image.pullSecrets Airflow image pull secrets\n  ## @param web.image.debug Enable image debug mode\n  image:\n    registry: docker.io\n    repository: bitnami/airflow\n    tag: 2.4.2-debian-11-r6\n    digest: \"\"\n    ## Specify a imagePullPolicy\n    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n    ##\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n    ## Set to true if you would like to see extra information on logs\n    ##\n    debug: false\n  ## @param web.baseUrl URL used to access to Airflow web ui\n  ##\n  baseUrl: \"\"\n  ## @param web.existingConfigmap Name of an existing config map containing the Airflow web config file\n  ##\n  existingConfigmap: \"\"\n  ## @param web.command Override default container command (useful when using custom images)\n  ##\n  command: []\n  ## @param web.args Override default container args (useful when using custom images)\n  ##\n  args: []\n  ## @param web.extraEnvVars Array with extra environment variables to add Airflow web pods\n  ##\n  extraEnvVars: []\n  ## @param web.extraEnvVarsCM ConfigMap containing extra environment variables for Airflow web pods\n  ##\n  extraEnvVarsCM: \"\"\n  ## @param web.extraEnvVarsSecret Secret containing extra environment variables (in case of sensitive data) for Airflow web pods\n  ##\n  extraEnvVarsSecret: \"\"\n  ## @param web.extraEnvVarsSecrets List of secrets with extra environment variables for Airflow web pods\n  ##\n  extraEnvVarsSecrets: []\n  ## @param web.containerPorts.http Airflow web HTTP container port\n  ##\n  containerPorts:\n    http: 8080\n  ## @param web.replicaCount Number of Airflow web replicas\n  ##\n  replicaCount: 1\n  ## Configure extra options for Airflow web containers' liveness, readiness and startup probes\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes\n  ## @param web.livenessProbe.enabled Enable livenessProbe on Airflow web containers\n  ## @param web.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe\n  ## @param web.livenessProbe.periodSeconds Period seconds for livenessProbe\n  ## @param web.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe\n  ## @param web.livenessProbe.failureThreshold Failure threshold for livenessProbe\n  ## @param web.livenessProbe.successThreshold Success threshold for livenessProbe\n  ##\n  livenessProbe:\n    enabled: true\n    initialDelaySeconds: 180\n    periodSeconds: 20\n    timeoutSeconds: 5\n    failureThreshold: 6\n    successThreshold: 1\n  ## @param web.readinessProbe.enabled Enable readinessProbe on Airflow web containers\n  ## @param web.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe\n  ## @param web.readinessProbe.periodSeconds Period seconds for readinessProbe\n  ## @param web.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe\n  ## @param web.readinessProbe.failureThreshold Failure threshold for readinessProbe\n  ## @param web.readinessProbe.successThreshold Success threshold for readinessProbe\n  ##\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 30\n    periodSeconds: 10\n    timeoutSeconds: 5\n    failureThreshold: 6\n    successThreshold: 1\n  ## @param web.startupProbe.enabled Enable startupProbe on Airflow web containers\n  ## @param web.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe\n  ## @param web.startupProbe.periodSeconds Period seconds for startupProbe\n  ## @param web.startupProbe.timeoutSeconds Timeout seconds for startupProbe\n  ## @param web.startupProbe.failureThreshold Failure threshold for startupProbe\n  ## @param web.startupProbe.successThreshold Success threshold for startupProbe\n  ##\n  startupProbe:\n    enabled: false\n    initialDelaySeconds: 60\n    periodSeconds: 10\n    timeoutSeconds: 1\n    failureThreshold: 15\n    successThreshold: 1\n  ## @param web.customLivenessProbe Custom livenessProbe that overrides the default one\n  ##\n  customLivenessProbe: {}\n  ## @param web.customReadinessProbe Custom readinessProbe that overrides the default one\n  ##\n  customReadinessProbe: {}\n  ## @param web.customStartupProbe Custom startupProbe that overrides the default one\n  ##\n  customStartupProbe: {}\n  ## Airflow web resource requests and limits\n  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n  ## @param web.resources.limits The resources limits for the Airflow web containers\n  ## @param web.resources.requests The requested resources for the Airflow web containers\n  ##\n  resources:\n    limits: {}\n    requests: {}\n  ## Configure Airflow web pods Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod\n  ## @param web.podSecurityContext.enabled Enabled Airflow web pods' Security Context\n  ## @param web.podSecurityContext.fsGroup Set Airflow web pod's Security Context fsGroup\n  ##\n  podSecurityContext:\n    enabled: true\n    fsGroup: 1001\n  ## Configure Airflow web containers (only main one) Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container\n  ## @param web.containerSecurityContext.enabled Enabled Airflow web containers' Security Context\n  ## @param web.containerSecurityContext.runAsUser Set Airflow web containers' Security Context runAsUser\n  ## @param web.containerSecurityContext.runAsNonRoot Set Airflow web containers' Security Context runAsNonRoot\n  ##\n  containerSecurityContext:\n    enabled: true\n    runAsUser: 1001\n    runAsNonRoot: true\n  ## @param web.lifecycleHooks for the Airflow web container(s) to automate configuration before or after startup\n  ##\n  lifecycleHooks: {}\n  ## @param web.hostAliases Deployment pod host aliases\n  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\n  ##\n  hostAliases: []\n  ## @param web.podLabels Add extra labels to the Airflow web pods\n  ##\n  podLabels: {}\n  ## @param web.podAnnotations Add extra annotations to the Airflow web pods\n  ##\n  podAnnotations: {}\n  ## @param web.affinity Affinity for Airflow web pods assignment (evaluated as a template)\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ## Note: `web.podAffinityPreset`, `web.podAntiAffinityPreset`, and `web.nodeAffinityPreset` will be ignored when it's set\n  ##\n  affinity: {}\n  ## Node affinity preset\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity\n  ## @param web.nodeAffinityPreset.key Node label key to match. Ignored if `web.affinity` is set.\n  ## @param web.nodeAffinityPreset.type Node affinity preset type. Ignored if `web.affinity` is set. Allowed values: `soft` or `hard`\n  ## @param web.nodeAffinityPreset.values Node label values to match. Ignored if `web.affinity` is set.\n  ##\n  nodeAffinityPreset:\n    ## e.g:\n    ## key: \"kubernetes.io/e2e-az-name\"\n    ##\n    key: \"\"\n    type: \"\"\n    ## e.g:\n    ## values:\n    ##   - e2e-az1\n    ##   - e2e-az2\n    ##\n    values: []\n  ## @param web.nodeSelector Node labels for Airflow web pods assignment\n  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/\n  ##\n  nodeSelector: {}\n  ## @param web.podAffinityPreset Pod affinity preset. Ignored if `web.affinity` is set. Allowed values: `soft` or `hard`.\n  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAffinityPreset: \"\"\n  ## @param web.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `web.affinity` is set. Allowed values: `soft` or `hard`.\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAntiAffinityPreset: soft\n  ## @param web.tolerations Tolerations for Airflow web pods assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n  ## @param web.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template\n  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods\n  ##\n  topologySpreadConstraints: []\n  ## @param web.priorityClassName Priority Class Name\n  ## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass\n  ##\n  priorityClassName: \"\"\n  ## @param web.schedulerName Use an alternate scheduler, e.g. \"stork\".\n  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n  ##\n  schedulerName: \"\"\n  ## @param web.terminationGracePeriodSeconds Seconds Airflow web pod needs to terminate gracefully\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods\n  ##\n  terminationGracePeriodSeconds: \"\"\n  ## @param web.updateStrategy.type Airflow web deployment strategy type\n  ## @param web.updateStrategy.rollingUpdate Airflow web deployment rolling update configuration parameters\n  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy\n  ##\n  updateStrategy:\n    type: RollingUpdate\n    rollingUpdate: {}\n  ## @param web.sidecars Add additional sidecar containers to the Airflow web pods\n  ## Example:\n  ## sidecars:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  sidecars: []\n  ## @param web.initContainers Add additional init containers to the Airflow web pods\n  ## Example:\n  ## initContainers:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  initContainers: []\n  ## @param web.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Airflow web pods\n  ##\n  extraVolumeMounts: []\n  ## @param web.extraVolumes Optionally specify extra list of additional volumes for the Airflow web pods\n  ##\n  extraVolumes: []\n  ## Airflow web Pod Disruption Budget\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n  ## @param web.pdb.create Deploy a pdb object for the Airflow web pods\n  ## @param web.pdb.minAvailable Maximum number/percentage of unavailable Airflow web replicas\n  ## @param web.pdb.maxUnavailable Maximum number/percentage of unavailable Airflow web replicas\n  ##\n  pdb:\n    create: false\n    minAvailable: 1\n    maxUnavailable: \"\"\n\n## @section Airflow scheduler parameters\n\nscheduler:\n  ## Bitnami Airflow Scheduler image version\n  ## ref: https://hub.docker.com/r/bitnami/airflow-scheduler/tags/\n  ## @param scheduler.image.registry Airflow Scheduler image registry\n  ## @param scheduler.image.repository Airflow Scheduler image repository\n  ## @param scheduler.image.tag Airflow Scheduler image tag (immutable tags are recommended)\n  ## @param scheduler.image.digest Airflow Schefuler image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param scheduler.image.pullPolicy Airflow Scheduler image pull policy\n  ## @param scheduler.image.pullSecrets Airflow Scheduler image pull secrets\n  ## @param scheduler.image.debug Enable image debug mode\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/airflow-scheduler\n    tag: 2.4.2-debian-11-r4\n    digest: \"\"\n    ## Specify a imagePullPolicy\n    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n    ##\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n    ## Set to true if you would like to see extra information on logs\n    ##\n    debug: false\n  ## @param scheduler.replicaCount Number of scheduler replicas\n  ##\n  replicaCount: 1\n  ## @param scheduler.command Override cmd\n  ##\n  command: []\n  ## @param scheduler.args Override args\n  ##\n  args: []\n  ## @param scheduler.extraEnvVars Add extra environment variables\n  ##\n  extraEnvVars: []\n  ## @param scheduler.extraEnvVarsCM ConfigMap with extra environment variables\n  ##\n  extraEnvVarsCM: \"\"\n  ## @param scheduler.extraEnvVarsSecret Secret with extra environment variables\n  ##\n  extraEnvVarsSecret: \"\"\n  ## @param scheduler.extraEnvVarsSecrets List of secrets with extra environment variables for Airflow scheduler pods\n  ##\n  extraEnvVarsSecrets: []\n  ## @param scheduler.customLivenessProbe Custom livenessProbe that overrides the default one\n  ##\n  customLivenessProbe: {}\n  ## @param scheduler.customReadinessProbe Custom readinessProbe that overrides the default one\n  ##\n  customReadinessProbe: {}\n  ## @param scheduler.customStartupProbe Custom startupProbe that overrides the default one\n  ##\n  customStartupProbe: {}\n  ## Airflow scheduler resource requests and limits\n  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n  ## @param scheduler.resources.limits The resources limits for the Airflow scheduler containers\n  ## @param scheduler.resources.requests The requested resources for the Airflow scheduler containers\n  ##\n  resources:\n    limits: {}\n    requests: {}\n  ## Configure Airflow scheduler pods Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod\n  ## @param scheduler.podSecurityContext.enabled Enabled Airflow scheduler pods' Security Context\n  ## @param scheduler.podSecurityContext.fsGroup Set Airflow scheduler pod's Security Context fsGroup\n  ##\n  podSecurityContext:\n    enabled: true\n    fsGroup: 1001\n  ## Configure Airflow scheduler containers (only main one) Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container\n  ## @param scheduler.containerSecurityContext.enabled Enabled Airflow scheduler containers' Security Context\n  ## @param scheduler.containerSecurityContext.runAsUser Set Airflow scheduler containers' Security Context runAsUser\n  ## @param scheduler.containerSecurityContext.runAsNonRoot Set Airflow scheduler containers' Security Context runAsNonRoot\n  ##\n  containerSecurityContext:\n    enabled: true\n    runAsUser: 1001\n    runAsNonRoot: true\n  ## @param scheduler.lifecycleHooks for the Airflow scheduler container(s) to automate configuration before or after startup\n  ##\n  lifecycleHooks: {}\n  ## @param scheduler.hostAliases Deployment pod host aliases\n  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\n  ##\n  hostAliases: []\n  ## @param scheduler.podLabels Add extra labels to the Airflow scheduler pods\n  ##\n  podLabels: {}\n  ## @param scheduler.podAnnotations Add extra annotations to the Airflow scheduler pods\n  ##\n  podAnnotations: {}\n  ## @param scheduler.affinity Affinity for Airflow scheduler pods assignment (evaluated as a template)\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ## Note: `scheduler.podAffinityPreset`, `scheduler.podAntiAffinityPreset`, and `scheduler.nodeAffinityPreset` will be ignored when it's set\n  ##\n  affinity: {}\n  ## Node affinity preset\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity\n  ## @param scheduler.nodeAffinityPreset.key Node label key to match. Ignored if `scheduler.affinity` is set.\n  ## @param scheduler.nodeAffinityPreset.type Node affinity preset type. Ignored if `scheduler.affinity` is set. Allowed values: `soft` or `hard`\n  ## @param scheduler.nodeAffinityPreset.values Node label values to match. Ignored if `scheduler.affinity` is set.\n  ##\n  nodeAffinityPreset:\n    ## e.g:\n    ## key: \"kubernetes.io/e2e-az-name\"\n    ##\n    key: \"\"\n    type: \"\"\n    ## e.g:\n    ## values:\n    ##   - e2e-az1\n    ##   - e2e-az2\n    ##\n    values: []\n  ## @param scheduler.nodeSelector Node labels for Airflow scheduler pods assignment\n  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/\n  ##\n  nodeSelector: {}\n  ## @param scheduler.podAffinityPreset Pod affinity preset. Ignored if `scheduler.affinity` is set. Allowed values: `soft` or `hard`.\n  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAffinityPreset: \"\"\n  ## @param scheduler.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `scheduler.affinity` is set. Allowed values: `soft` or `hard`.\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAntiAffinityPreset: soft\n  ## @param scheduler.tolerations Tolerations for Airflow scheduler pods assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n  ## @param scheduler.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template\n  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods\n  ##\n  topologySpreadConstraints: []\n  ## @param scheduler.priorityClassName Priority Class Name\n  ## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass\n  ##\n  priorityClassName: \"\"\n  ## @param scheduler.schedulerName Use an alternate scheduler, e.g. \"stork\".\n  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n  ##\n  schedulerName: \"\"\n  ## @param scheduler.terminationGracePeriodSeconds Seconds Airflow scheduler pod needs to terminate gracefully\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods\n  ##\n  terminationGracePeriodSeconds: \"\"\n  ## @param scheduler.updateStrategy.type Airflow scheduler deployment strategy type\n  ## @param scheduler.updateStrategy.rollingUpdate Airflow scheduler deployment rolling update configuration parameters\n  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy\n  ##\n  updateStrategy:\n    type: RollingUpdate\n    rollingUpdate: {}\n  ## @param scheduler.sidecars Add additional sidecar containers to the Airflow scheduler pods\n  ## Example:\n  ## sidecars:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  sidecars: []\n  ## @param scheduler.initContainers Add additional init containers to the Airflow scheduler pods\n  ## Example:\n  ## initContainers:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  initContainers: []\n  ## @param scheduler.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Airflow scheduler pods\n  ##\n  extraVolumeMounts: []\n  ## @param scheduler.extraVolumes Optionally specify extra list of additional volumes for the Airflow scheduler pods\n  ##\n  extraVolumes: []\n  ## Airflow scheduler Pod Disruption Budget\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n  ## @param scheduler.pdb.create Deploy a pdb object for the Airflow scheduler pods\n  ## @param scheduler.pdb.minAvailable Maximum number/percentage of unavailable Airflow scheduler replicas\n  ## @param scheduler.pdb.maxUnavailable Maximum number/percentage of unavailable Airflow scheduler replicas\n  ##\n  pdb:\n    create: false\n    minAvailable: 1\n    maxUnavailable: \"\"\n\n## @section Airflow worker parameters\n\nworker:\n  ## Bitnami Airflow Worker image version\n  ## ref: https://hub.docker.com/r/bitnami/airflow-worker/tags/\n  ## @param worker.image.registry Airflow Worker image registry\n  ## @param worker.image.repository Airflow Worker image repository\n  ## @param worker.image.tag Airflow Worker image tag (immutable tags are recommended)\n  ## @param worker.image.digest Airflow Worker image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param worker.image.pullPolicy Airflow Worker image pull policy\n  ## @param worker.image.pullSecrets Airflow Worker image pull secrets\n  ## @param worker.image.debug Enable image debug mode\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/airflow-worker\n    tag: 2.4.2-debian-11-r4\n    digest: \"\"\n    ## Specify a imagePullPolicy\n    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n    ##\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n    ## Set to true if you would like to see extra information on logs\n    ##\n    debug: false\n  ## @param worker.command Override default container command (useful when using custom images)\n  ##\n  command: []\n  ## @param worker.args Override default container args (useful when using custom images)\n  ##\n  args: []\n  ## @param worker.extraEnvVars Array with extra environment variables to add Airflow worker pods\n  ##\n  extraEnvVars: []\n  ## @param worker.extraEnvVarsCM ConfigMap containing extra environment variables for Airflow worker pods\n  ##\n  extraEnvVarsCM: \"\"\n  ## @param worker.extraEnvVarsSecret Secret containing extra environment variables (in case of sensitive data) for Airflow worker pods\n  ##\n  extraEnvVarsSecret: \"\"\n  ## @param worker.extraEnvVarsSecrets List of secrets with extra environment variables for Airflow worker pods\n  ##\n  extraEnvVarsSecrets: []\n  ## @param worker.containerPorts.http Airflow worker HTTP container port\n  ##\n  containerPorts:\n    http: 8793\n  ## @param worker.replicaCount Number of Airflow worker replicas\n  ##\n  replicaCount: 1\n  ## Configure extra options for Airflow worker containers' liveness, readiness and startup probes\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes\n  ## @param worker.livenessProbe.enabled Enable livenessProbe on Airflow worker containers\n  ## @param worker.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe\n  ## @param worker.livenessProbe.periodSeconds Period seconds for livenessProbe\n  ## @param worker.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe\n  ## @param worker.livenessProbe.failureThreshold Failure threshold for livenessProbe\n  ## @param worker.livenessProbe.successThreshold Success threshold for livenessProbe\n  ##\n  livenessProbe:\n    enabled: true\n    initialDelaySeconds: 180\n    periodSeconds: 20\n    timeoutSeconds: 5\n    failureThreshold: 6\n    successThreshold: 1\n  ## @param worker.readinessProbe.enabled Enable readinessProbe on Airflow worker containers\n  ## @param worker.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe\n  ## @param worker.readinessProbe.periodSeconds Period seconds for readinessProbe\n  ## @param worker.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe\n  ## @param worker.readinessProbe.failureThreshold Failure threshold for readinessProbe\n  ## @param worker.readinessProbe.successThreshold Success threshold for readinessProbe\n  ##\n  readinessProbe:\n    enabled: true\n    initialDelaySeconds: 30\n    periodSeconds: 10\n    timeoutSeconds: 5\n    failureThreshold: 6\n    successThreshold: 1\n  ## @param worker.startupProbe.enabled Enable startupProbe on Airflow worker containers\n  ## @param worker.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe\n  ## @param worker.startupProbe.periodSeconds Period seconds for startupProbe\n  ## @param worker.startupProbe.timeoutSeconds Timeout seconds for startupProbe\n  ## @param worker.startupProbe.failureThreshold Failure threshold for startupProbe\n  ## @param worker.startupProbe.successThreshold Success threshold for startupProbe\n  ##\n  startupProbe:\n    enabled: false\n    initialDelaySeconds: 60\n    periodSeconds: 10\n    timeoutSeconds: 1\n    failureThreshold: 15\n    successThreshold: 1\n  ## @param worker.customLivenessProbe Custom livenessProbe that overrides the default one\n  ##\n  customLivenessProbe: {}\n  ## @param worker.customReadinessProbe Custom readinessProbe that overrides the default one\n  ##\n  customReadinessProbe: {}\n  ## @param worker.customStartupProbe Custom startupProbe that overrides the default one\n  ##\n  customStartupProbe: {}\n  ## Airflow worker resource requests and limits\n  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n  ## @param worker.resources.limits The resources limits for the Airflow worker containers\n  ## @param worker.resources.requests The requested resources for the Airflow worker containers\n  ##\n  resources:\n    limits: {}\n    requests: {}\n  ## Configure Airflow worker pods Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod\n  ## @param worker.podSecurityContext.enabled Enabled Airflow worker pods' Security Context\n  ## @param worker.podSecurityContext.fsGroup Set Airflow worker pod's Security Context fsGroup\n  ##\n  podSecurityContext:\n    enabled: true\n    fsGroup: 1001\n  ## Configure Airflow worker containers (only main one) Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container\n  ## @param worker.containerSecurityContext.enabled Enabled Airflow worker containers' Security Context\n  ## @param worker.containerSecurityContext.runAsUser Set Airflow worker containers' Security Context runAsUser\n  ## @param worker.containerSecurityContext.runAsNonRoot Set Airflow worker containers' Security Context runAsNonRoot\n  ##\n  containerSecurityContext:\n    enabled: true\n    runAsUser: 1001\n    runAsNonRoot: true\n  ## @param worker.lifecycleHooks for the Airflow worker container(s) to automate configuration before or after startup\n  ##\n  lifecycleHooks: {}\n  ## @param worker.hostAliases Deployment pod host aliases\n  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\n  ##\n  hostAliases: []\n  ## @param worker.podLabels Add extra labels to the Airflow worker pods\n  ##\n  podLabels: {}\n  ## @param worker.podAnnotations Add extra annotations to the Airflow worker pods\n  ##\n  podAnnotations: {}\n  ## @param worker.affinity Affinity for Airflow worker pods assignment (evaluated as a template)\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ## Note: `worker.podAffinityPreset`, `worker.podAntiAffinityPreset`, and `worker.nodeAffinityPreset` will be ignored when it's set\n  ##\n  affinity: {}\n  ## Node affinity preset\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity\n  ## @param worker.nodeAffinityPreset.key Node label key to match. Ignored if `worker.affinity` is set.\n  ## @param worker.nodeAffinityPreset.type Node affinity preset type. Ignored if `worker.affinity` is set. Allowed values: `soft` or `hard`\n  ## @param worker.nodeAffinityPreset.values Node label values to match. Ignored if `worker.affinity` is set.\n  ##\n  nodeAffinityPreset:\n    ## e.g:\n    ## key: \"kubernetes.io/e2e-az-name\"\n    ##\n    key: \"\"\n    type: \"\"\n    ## e.g:\n    ## values:\n    ##   - e2e-az1\n    ##   - e2e-az2\n    ##\n    values: []\n  ## @param worker.nodeSelector Node labels for Airflow worker pods assignment\n  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/\n  ##\n  nodeSelector: {}\n  ## @param worker.podAffinityPreset Pod affinity preset. Ignored if `worker.affinity` is set. Allowed values: `soft` or `hard`.\n  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAffinityPreset: \"\"\n  ## @param worker.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `worker.affinity` is set. Allowed values: `soft` or `hard`.\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAntiAffinityPreset: soft\n  ## @param worker.tolerations Tolerations for Airflow worker pods assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n  ## @param worker.topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template\n  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods\n  ##\n  topologySpreadConstraints: []\n  ## @param worker.priorityClassName Priority Class Name\n  ## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass\n  ##\n  priorityClassName: \"\"\n  ## @param worker.schedulerName Use an alternate scheduler, e.g. \"stork\".\n  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n  ##\n  schedulerName: \"\"\n  ## @param worker.terminationGracePeriodSeconds Seconds Airflow worker pod needs to terminate gracefully\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods\n  ##\n  terminationGracePeriodSeconds: \"\"\n  ## @param worker.updateStrategy.type Airflow worker deployment strategy type\n  ## @param worker.updateStrategy.rollingUpdate Airflow worker deployment rolling update configuration parameters\n  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy\n  ##\n  updateStrategy:\n    type: RollingUpdate\n    rollingUpdate: {}\n  ## @param worker.sidecars Add additional sidecar containers to the Airflow worker pods\n  ## Example:\n  ## sidecars:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  sidecars: []\n  ## @param worker.initContainers Add additional init containers to the Airflow worker pods\n  ## Example:\n  ## initContainers:\n  ##   - name: your-image-name\n  ##     image: your-image\n  ##     imagePullPolicy: Always\n  ##     ports:\n  ##       - name: portname\n  ##         containerPort: 1234\n  ##\n  initContainers: []\n  ## @param worker.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the Airflow worker pods\n  ##\n  extraVolumeMounts: []\n  ## @param worker.extraVolumes Optionally specify extra list of additional volumes for the Airflow worker pods\n  ##\n  extraVolumes: []\n  ## @param worker.extraVolumeClaimTemplates Optionally specify extra list of volumesClaimTemplates for the Airflow worker statefulset\n  ##\n  extraVolumeClaimTemplates: []\n  ## @param worker.podTemplate Template to replace the default one to be use when `executor=KubernetesExecutor` to create Airflow worker pods\n  ##\n  podTemplate: {}\n  ## Airflow worker Pod Disruption Budget\n  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/\n  ## @param worker.pdb.create Deploy a pdb object for the Airflow worker pods\n  ## @param worker.pdb.minAvailable Maximum number/percentage of unavailable Airflow worker replicas\n  ## @param worker.pdb.maxUnavailable Maximum number/percentage of unavailable Airflow worker replicas\n  ##\n  pdb:\n    create: false\n    minAvailable: 1\n    maxUnavailable: \"\"\n  ## Enable HorizontalPodAutoscaler for worker pods\n  ## ref: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/\n  ## @param worker.autoscaling.enabled Whether enable horizontal pod autoscaler\n  ## @param worker.autoscaling.minReplicas Configure a minimum amount of pods\n  ## @param worker.autoscaling.maxReplicas Configure a maximum amount of pods\n  ## @param worker.autoscaling.targetCPU Define the CPU target to trigger the scaling actions (utilization percentage)\n  ## @param worker.autoscaling.targetMemory Define the memory target to trigger the scaling actions (utilization percentage)\n  ##\n  autoscaling:\n    enabled: false\n    minReplicas: 1\n    maxReplicas: 3\n    targetCPU: 80\n    targetMemory: 80\n\n## @section Airflow git sync parameters\n\n## Configure Git to pull dags and plugins\n##\ngit:\n  ## Bitnami Git image version\n  ## ref: https://hub.docker.com/r/bitnami/git/tags/\n  ## @param git.image.registry Git image registry\n  ## @param git.image.repository Git image repository\n  ## @param git.image.tag Git image tag (immutable tags are recommended)\n  ## @param git.image.digest Git image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param git.image.pullPolicy Git image pull policy\n  ## @param git.image.pullSecrets Git image pull secrets\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/git\n    tag: 2.38.1-debian-11-r7\n    digest: \"\"\n    ## Specify a imagePullPolicy\n    ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'\n    ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images\n    ##\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n  ## Get DAG files from git repositories\n  ## @param git.dags.enabled Enable in order to download DAG files from git repositories.\n  ## @param git.dags.repositories [array] Array of repositories from which to download DAG files\n  ##\n  dags:\n    enabled: false\n    ## Name for repositories can be anything unique and must follow same naming conventions as kubernetes.\n    ## Kubernetes resources can have names up to 253 characters long. The characters allowed in names are:\n    ## digits (0-9), lower case letters (a-z), -, and .\n    ## Example:\n    ##   - repository: https://github.com/myuser/myrepo\n    ##     branch: main\n    ##     name: my-dags\n    ##     path: /\n    ##\n    repositories:\n      - repository: \"\"\n        ## Branch from repository to checkout\n        ##\n        branch: \"\"\n        ## An unique identifier for repository, must be unique for each repository\n        ##\n        name: \"\"\n        ## Path to a folder in the repository containing the dags\n        ##\n        path: \"\"\n  ## Get Plugins files from git repositories.\n  ## @param git.plugins.enabled Enable in order to download Plugins files from git repositories.\n  ## @param git.plugins.repositories [array] Array of repositories from which to download DAG files\n  ##\n  plugins:\n    enabled: false\n    repositories:\n      - repository: \"\"\n        ## Branch from repository to checkout\n        ##\n        branch: \"\"\n        ## An unique identifier for repository, must be unique for each repository\n        ##\n        name: \"\"\n        ## Path to a folder in the repository containing the plugins\n        ##\n        path: \"\"\n  ## Properties for the Clone init container\n  ## @param git.clone.command Override cmd\n  ## @param git.clone.args Override args\n  ## @param git.clone.extraVolumeMounts Add extra volume mounts\n  ## @param git.clone.extraEnvVars Add extra environment variables\n  ## @param git.clone.extraEnvVarsCM ConfigMap with extra environment variables\n  ## @param git.clone.extraEnvVarsSecret Secret with extra environment variables\n  ## @param git.clone.resources Clone init container resource requests and limits\n  ##\n  clone:\n    command: []\n    args: []\n    extraVolumeMounts: []\n    extraEnvVars: []\n    extraEnvVarsCM: \"\"\n    extraEnvVarsSecret: \"\"\n    ## Clone init container resource requests and limits\n    ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n    ##\n    resources: {}\n  ## Properties for the Sync sidecar container\n  ## @param git.sync.interval Interval in seconds to pull the git repository containing the plugins and/or DAG files\n  ## @param git.sync.command Override cmd\n  ## @param git.sync.args Override args\n  ## @param git.sync.extraVolumeMounts Add extra volume mounts\n  ## @param git.sync.extraEnvVars Add extra environment variables\n  ## @param git.sync.extraEnvVarsCM ConfigMap with extra environment variables\n  ## @param git.sync.extraEnvVarsSecret Secret with extra environment variables\n  ## @param git.sync.resources Sync sidecar container resource requests and limits\n  ##\n  sync:\n    interval: 60\n    command: []\n    args: []\n    extraVolumeMounts: []\n    extraEnvVars: []\n    extraEnvVarsCM: \"\"\n    extraEnvVarsSecret: \"\"\n    ## Sync sidecar container resource requests and limits\n    ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n    ##\n    resources: {}\n\n## @section Airflow ldap parameters\n\n## LDAP configuration\n## @param ldap.enabled Enable LDAP authentication\n## @param ldap.uri Server URI, eg. ldap://ldap_server:389\n## DEPRECATED ldap.base It will be removed in a future release, please use 'ldap.basedn' instead\n## @param ldap.basedn Base of the search, eg. ou=example,o=org.\n## DEPRECATED ldap.uidField It will be removed in a future release,, please use 'ldap.searchAttribute' instead\n## @param ldap.searchAttribute if doing an indirect bind to ldap, this is the field that matches the username when searching for the account to bind to\n## @param ldap.binddn DN of the account used to search in the LDAP server.\n## @param ldap.bindpw Bind Password\n## @param ldap.userRegistration Set to True to enable user self registration\n## @param ldap.userRegistrationRole Set role name to be assign when a user registers himself. This role must already exist. Mandatory when using ldap.userRegistration\n## @param ldap.rolesMapping mapping from LDAP DN to a list of roles\n## @param ldap.rolesSyncAtLogin replace ALL the user's roles each login, or only on registration\n##\nldap:\n  enabled: false\n  uri: \"ldap://ldap_server:389\"\n  basedn: \"dc=example,dc=org\"\n  searchAttribute: \"cn\"\n  binddn: \"cn=admin,dc=example,dc=org\"\n  bindpw: \"\"\n  userRegistration: 'True'\n  userRegistrationRole: \"Public\"\n  rolesMapping: '{ \"cn=All,ou=Groups,dc=example,dc=org\": [\"User\"], \"cn=Admins,ou=Groups,dc=example,dc=org\": [\"Admin\"], }'\n  rolesSyncAtLogin: 'True'\n\n  ## SSL/TLS parameters for LDAP\n  ## @param ldap.tls.enabled Enabled TLS/SSL for LDAP, you must include the CA file.\n  ## @param ldap.tls.allowSelfSigned Allow to use self signed certificates\n  ## DEPRECATED ldap.tls.CAcertificateSecret It will be removed in a future release, please use ldap.tls.certificatesSecret instead\n  ## @param ldap.tls.certificatesSecret Name of the existing secret containing the certificate CA file that will be used by ldap client\n  ## @param ldap.tls.certificatesMountPath Where LDAP certifcates are mounted.\n  ## DEPRECATED ldap.tls.CAcertificateFilename It will be removed in a future release, please use ldap.tls.CAFilename instead\n  ## @param ldap.tls.CAFilename LDAP CA cert filename\n  ##\n  tls:\n    enabled: false\n    allowSelfSigned: true\n    certificatesSecret: \"\"\n    certificatesMountPath: /opt/bitnami/airflow/conf/certs\n    CAFilename: \"\"\n\n## @section Traffic Exposure Parameters\n\n## Airflow service parameters\n##\nservice:\n  ## @param service.type Airflow service type\n  ##\n  type: ClusterIP\n  ## @param service.ports.http Airflow service HTTP port\n  ##\n  ports:\n    http: 8080\n  ## Node ports to expose\n  ## @param service.nodePorts.http Node port for HTTP\n  ## NOTE: choose port between <30000-32767>\n  ##\n  nodePorts:\n    http: \"\"\n  ## @param service.sessionAffinity Control where client requests go, to the same pod or round-robin\n  ## Values: ClientIP or None\n  ## ref: https://kubernetes.io/docs/user-guide/services/\n  ##\n  sessionAffinity: None\n  ## @param service.sessionAffinityConfig Additional settings for the sessionAffinity\n  ## sessionAffinityConfig:\n  ##   clientIP:\n  ##     timeoutSeconds: 300\n  ##\n  sessionAffinityConfig: {}\n  ## @param service.clusterIP Airflow service Cluster IP\n  ## e.g.:\n  ## clusterIP: None\n  ##\n  clusterIP: \"\"\n  ## @param service.loadBalancerIP Airflow service Load Balancer IP\n  ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer\n  ##\n  loadBalancerIP: \"\"\n  ## @param service.loadBalancerSourceRanges Airflow service Load Balancer sources\n  ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service\n  ## e.g:\n  ## loadBalancerSourceRanges:\n  ##   - 10.10.10.0/24\n  ##\n  loadBalancerSourceRanges: []\n  ## @param service.externalTrafficPolicy Airflow service external traffic policy\n  ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip\n  ##\n  externalTrafficPolicy: Cluster\n  ## @param service.annotations Additional custom annotations for Airflow service\n  ##\n  annotations: {}\n  ## @param service.extraPorts Extra port to expose on Airflow service\n  ##\n  extraPorts: []\n\n## Airflow ingress parameters\n## ref: https://kubernetes.io/docs/user-guide/ingress/\n##\ningress:\n  ## @param ingress.enabled Enable ingress record generation for Airflow\n  ##\n  enabled: false\n  ## @param ingress.ingressClassName IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+)\n  ## This is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster .\n  ## ref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/\n  ##\n  ingressClassName: \"\"\n  ## @param ingress.pathType Ingress path type\n  ##\n  pathType: ImplementationSpecific\n  ## @param ingress.apiVersion Force Ingress API version (automatically detected if not set)\n  ##\n  apiVersion: \"\"\n  ## @param ingress.hostname Default host for the ingress record\n  ##\n  hostname: airflow.local\n  ## @param ingress.path Default path for the ingress record\n  ## NOTE: You may need to set this to '/*' in order to use this with ALB ingress controllers\n  ##\n  path: /\n  ## @param ingress.annotations [object] Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations.\n  ## Use this parameter to set the required annotations for cert-manager, see\n  ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations\n  ## e.g:\n  ## annotations:\n  ##   kubernetes.io/ingress.class: nginx\n  ##   cert-manager.io/cluster-issuer: cluster-issuer-name\n  ##\n  annotations: {}\n  ## @param ingress.tls Enable TLS configuration for the host defined at `ingress.hostname` parameter\n  ## TLS certificates will be retrieved from a TLS secret with name: `{{- printf \"%s-tls\" .Values.ingress.hostname }}`\n  ## You can:\n  ##   - Use the `ingress.secrets` parameter to create this TLS secret\n  ##   - Rely on cert-manager to create it by setting the corresponding annotations\n  ##   - Rely on Helm to create self-signed certificates by setting `ingress.selfSigned=true`\n  ##\n  tls: false\n  ## @param ingress.selfSigned Create a TLS secret for this ingress record using self-signed certificates generated by Helm\n  ##\n  selfSigned: false\n  ## @param ingress.extraHosts An array with additional hostname(s) to be covered with the ingress record\n  ## e.g:\n  ## extraHosts:\n  ##   - name: airflow.local\n  ##     path: /\n  ##\n  extraHosts: []\n  ## @param ingress.extraPaths An array with additional arbitrary paths that may need to be added to the ingress under the main host\n  ## e.g:\n  ## extraPaths:\n  ## - path: /*\n  ##   backend:\n  ##     serviceName: ssl-redirect\n  ##     servicePort: use-annotation\n  ##\n  extraPaths: []\n  ## @param ingress.extraTls TLS configuration for additional hostname(s) to be covered with this ingress record\n  ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls\n  ## e.g:\n  ## extraTls:\n  ## - hosts:\n  ##     - airflow.local\n  ##   secretName: airflow.local-tls\n  ##\n  extraTls: []\n  ## @param ingress.secrets Custom TLS certificates as secrets\n  ## NOTE: 'key' and 'certificate' are expected in PEM format\n  ## NOTE: 'name' should line up with a 'secretName' set further up\n  ## If it is not set and you're using cert-manager, this is unneeded, as it will create a secret for you with valid certificates\n  ## If it is not set and you're NOT using cert-manager either, self-signed certificates will be created valid for 365 days\n  ## It is also possible to create and manage the certificates outside of this helm chart\n  ## Please see README.md for more information\n  ## e.g:\n  ## secrets:\n  ##   - name: airflow.local-tls\n  ##     key: |-\n  ##       -----BEGIN RSA PRIVATE KEY-----\n  ##       ...\n  ##       -----END RSA PRIVATE KEY-----\n  ##     certificate: |-\n  ##       -----BEGIN CERTIFICATE-----\n  ##       ...\n  ##       -----END CERTIFICATE-----\n  ##\n  secrets: []\n  ## @param ingress.extraRules Additional rules to be covered with this ingress record\n  ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-rules\n  ## e.g:\n  ## extraRules:\n  ## - host: example.local\n  ##     http:\n  ##       path: /\n  ##       backend:\n  ##         service:\n  ##           name: example-svc\n  ##           port:\n  ##             name: http\n  ##\n  extraRules: []\n\n## @section Other Parameters\n\n## Service account for Airflow pods to use.\n## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n##\nserviceAccount:\n  ## @param serviceAccount.create Enable creation of ServiceAccount for Airflow pods\n  ##\n  create: false\n  ## @param serviceAccount.name The name of the ServiceAccount to use.\n  ## If not set and create is true, a name is generated using the common.names.fullname template\n  ##\n  name: \"\"\n  ## @param serviceAccount.automountServiceAccountToken Allows auto mount of ServiceAccountToken on the serviceAccount created\n  ## Can be set to false if pods using this serviceAccount do not need to use K8s API\n  ##\n  automountServiceAccountToken: true\n  ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount\n  ##\n  annotations: {}\n## Role Based Access\n## Ref: https://kubernetes.io/docs/admin/authorization/rbac/\n## @param rbac.create Create Role and RoleBinding\n##\nrbac:\n  create: false\n  ## @param rbac.rules Custom RBAC rules to set\n  ## e.g:\n  ## rules:\n  ##   - apiGroups:\n  ##       - \"\"\n  ##     resources:\n  ##       - pods\n  ##     verbs:\n  ##       - get\n  ##       - list\n  ##\n  rules: []\n\n## @section Airflow metrics parameters\n\nmetrics:\n  ## @param metrics.enabled Whether or not to create a standalone Airflow exporter to expose Airflow metrics\n  ##\n  enabled: false\n  ## Bitnami Airflow exporter image\n  ## ref: https://hub.docker.com/r/bitnami/airflow-exporter/tags/\n  ## @param metrics.image.registry Airflow exporter image registry\n  ## @param metrics.image.repository Airflow exporter image repository\n  ## @param metrics.image.tag Airflow exporter image tag (immutable tags are recommended)\n  ## @param metrics.image.digest Airflow exporter image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag\n  ## @param metrics.image.pullPolicy Airflow exporter image pull policy\n  ## @param metrics.image.pullSecrets Airflow exporter image pull secrets\n  ##\n  image:\n    registry: docker.io\n    repository: bitnami/airflow-exporter\n    tag: 0.20220314.0-debian-11-r57\n    digest: \"\"\n    pullPolicy: IfNotPresent\n    ## Optionally specify an array of imagePullSecrets.\n    ## Secrets must be manually created in the namespace.\n    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n    ## e.g:\n    ## pullSecrets:\n    ##   - myRegistryKeySecretName\n    ##\n    pullSecrets: []\n  ## @param metrics.extraEnvVars Array with extra environment variables to add Airflow exporter pods\n  ##\n  extraEnvVars: []\n  ## @param metrics.extraEnvVarsCM ConfigMap containing extra environment variables for Airflow exporter pods\n  ##\n  extraEnvVarsCM: \"\"\n  ## @param metrics.extraEnvVarsSecret Secret containing extra environment variables (in case of sensitive data) for Airflow exporter pods\n  ##\n  extraEnvVarsSecret: \"\"\n  ## @param metrics.containerPorts.http Airflow exporter metrics container port\n  ##\n  containerPorts:\n    http: 9112\n  ## Airflow exporter resource requests and limits\n  ## ref: https://kubernetes.io/docs/user-guide/compute-resources/\n  ## @param metrics.resources.limits The resources limits for the container\n  ## @param metrics.resources.requests The requested resources for the container\n  ##\n  resources:\n    limits: {}\n    requests: {}\n  ## Airflow exporter pods' Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod\n  ## @param metrics.podSecurityContext.enabled Enable security context for the pods\n  ## @param metrics.podSecurityContext.fsGroup Set Airflow exporter pod's Security Context fsGroup\n  ##\n  podSecurityContext:\n    enabled: true\n    fsGroup: 1001\n  ## Airflow exporter containers' Security Context\n  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container\n  ## @param metrics.containerSecurityContext.enabled Enable Airflow exporter containers' Security Context\n  ## @param metrics.containerSecurityContext.runAsUser Set Airflow exporter containers' Security Context runAsUser\n  ## @param metrics.containerSecurityContext.runAsNonRoot Set Airflow exporter containers' Security Context runAsNonRoot\n  ## e.g:\n  ##   containerSecurityContext:\n  ##     enabled: true\n  ##     capabilities:\n  ##       drop: [\"NET_RAW\"]\n  ##     readOnlyRootFilesystem: true\n  ##\n  containerSecurityContext:\n    enabled: true\n    runAsUser: 1001\n    runAsNonRoot: true\n  ## @param metrics.lifecycleHooks for the Airflow exporter container(s) to automate configuration before or after startup\n  ##\n  lifecycleHooks: {}\n  ## @param metrics.hostAliases Airflow exporter pods host aliases\n  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/\n  ##\n  hostAliases: []\n  ## @param metrics.podLabels Extra labels for Airflow exporter pods\n  ## Ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/\n  ##\n  podLabels: {}\n  ## @param metrics.podAnnotations Extra annotations for Airflow exporter pods\n  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/\n  ##\n  podAnnotations: {}\n  ## @param metrics.podAffinityPreset Pod affinity preset. Ignored if `metrics.affinity` is set. Allowed values: `soft` or `hard`\n  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAffinityPreset: \"\"\n  ## @param metrics.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `metrics.affinity` is set. Allowed values: `soft` or `hard`\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity\n  ##\n  podAntiAffinityPreset: soft\n  ## Node metrics.affinity preset\n  ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity\n  ##\n  nodeAffinityPreset:\n    ## @param metrics.nodeAffinityPreset.type Node affinity preset type. Ignored if `metrics.affinity` is set. Allowed values: `soft` or `hard`\n    ##\n    type: \"\"\n    ## @param metrics.nodeAffinityPreset.key Node label key to match Ignored if `metrics.affinity` is set.\n    ## E.g.\n    ## key: \"kubernetes.io/e2e-az-name\"\n    ##\n    key: \"\"\n    ## @param metrics.nodeAffinityPreset.values Node label values to match. Ignored if `metrics.affinity` is set.\n    ## E.g.\n    ## values:\n    ##   - e2e-az1\n    ##   - e2e-az2\n    ##\n    values: []\n  ## @param metrics.affinity Affinity for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity\n  ## Note: metrics.podAffinityPreset, metrics.podAntiAffinityPreset, and metrics.nodeAffinityPreset will be ignored when it's set\n  ##\n  affinity: {}\n  ## @param metrics.nodeSelector Node labels for pod assignment\n  ## Ref: https://kubernetes.io/docs/user-guide/node-selection/\n  ##\n  nodeSelector: {}\n  ## @param metrics.tolerations Tolerations for pod assignment\n  ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/\n  ##\n  tolerations: []\n  ## @param metrics.schedulerName Name of the k8s scheduler (other than default) for Airflow exporter\n  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/\n  ##\n  schedulerName: \"\"\n  ## Airflow exporter service configuration\n  ##\n  service:\n    ## @param metrics.service.ports.http Airflow exporter metrics service port\n    ##\n    ports:\n      http: 9112\n    ## @param metrics.service.clusterIP Static clusterIP or None for headless services\n    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#choosing-your-own-ip-address\n    ##\n    clusterIP: \"\"\n    ## @param metrics.service.sessionAffinity Control where client requests go, to the same pod or round-robin\n    ## Values: ClientIP or None\n    ## ref: https://kubernetes.io/docs/user-guide/services/\n    ##\n    sessionAffinity: None\n    ## @param metrics.service.annotations [object] Annotations for the Airflow exporter service\n    ##\n    annotations:\n      prometheus.io/scrape: \"true\"\n      prometheus.io/port: \"{{ .Values.metrics.service.ports.http }}\"\n  ## Prometheus Operator ServiceMonitor configuration\n  ##\n  serviceMonitor:\n    ## @param metrics.serviceMonitor.enabled if `true`, creates a Prometheus Operator ServiceMonitor (requires `metrics.enabled` to be `true`)\n    ##\n    enabled: false\n    ## @param metrics.serviceMonitor.namespace Namespace in which Prometheus is running\n    ##\n    namespace: \"\"\n    ## @param metrics.serviceMonitor.interval Interval at which metrics should be scraped\n    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint\n    ##\n    interval: \"\"\n    ## @param metrics.serviceMonitor.scrapeTimeout Timeout after which the scrape is ended\n    ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint\n    ##\n    scrapeTimeout: \"\"\n    ## @param metrics.serviceMonitor.labels Additional labels that can be used so ServiceMonitor will be discovered by Prometheus\n    ##\n    labels: {}\n    ## @param metrics.serviceMonitor.selector Prometheus instance selector labels\n    ## ref: https://github.com/bitnami/charts/tree/main/bitnami/prometheus-operator#prometheus-configuration\n    ##\n    selector: {}\n    ## @param metrics.serviceMonitor.relabelings RelabelConfigs to apply to samples before scraping\n    ##\n    relabelings: []\n    ## @param metrics.serviceMonitor.metricRelabelings MetricRelabelConfigs to apply to samples before ingestion\n    ##\n    metricRelabelings: []\n    ## @param metrics.serviceMonitor.honorLabels Specify honorLabels parameter to add the scrape endpoint\n    ##\n    honorLabels: false\n    ## @param metrics.serviceMonitor.jobLabel The name of the label on the target service to use as the job name in prometheus.\n    ##\n    jobLabel: \"\"\n\n## @section Airflow database parameters\n\n## PostgreSQL chart configuration\n## ref: https://github.com/bitnami/charts/blob/main/bitnami/postgresql/values.yaml\n## @param postgresql.enabled Switch to enable or disable the PostgreSQL helm chart\n## @param postgresql.auth.enablePostgresUser Assign a password to the \"postgres\" admin user. Otherwise, remote access will be blocked for this user\n## @param postgresql.auth.username Name for a custom user to create\n## @param postgresql.auth.password Password for the custom user to create\n## @param postgresql.auth.database Name for a custom database to create\n## @param postgresql.auth.existingSecret Name of existing secret to use for PostgreSQL credentials\n## @param postgresql.architecture PostgreSQL architecture (`standalone` or `replication`)\n##\npostgresql:\n  enabled: true\n  auth:\n    enablePostgresUser: false\n    username: bn_airflow\n    password: \"\"\n    database: bitnami_airflow\n    existingSecret: \"\"\n  architecture: standalone\n## External PostgreSQL configuration\n## All of these values are only used when postgresql.enabled is set to false\n## @param externalDatabase.host Database host\n## @param externalDatabase.port Database port number\n## @param externalDatabase.user Non-root username for Airflow\n## @param externalDatabase.password Password for the non-root username for Airflow\n## @param externalDatabase.database Airflow database name\n## @param externalDatabase.existingSecret Name of an existing secret resource containing the database credentials\n## @param externalDatabase.existingSecretPasswordKey Name of an existing secret key containing the database credentials\n##\nexternalDatabase:\n  host: localhost\n  port: 5432\n  user: bn_airflow\n  database: bitnami_airflow\n  password: \"\"\n  existingSecret: \"\"\n  existingSecretPasswordKey: \"\"\n\n## Redis&reg; chart configuration\n## ref: https://github.com/bitnami/charts/blob/main/bitnami/redis/values.yaml\n## @param redis.enabled Switch to enable or disable the Redis&reg; helm\n## @param redis.auth.enabled Enable password authentication\n## @param redis.auth.password Redis&reg; password\n## @param redis.auth.existingSecret The name of an existing secret with Redis&reg; credentials\n## @param redis.architecture Redis&reg; architecture. Allowed values: `standalone` or `replication`\n##\nredis:\n  enabled: true\n  auth:\n    enabled: true\n    ## Redis&reg; password (both master and slave). Defaults to a random 10-character alphanumeric string if not set and auth.enabled is true.\n    ## It should always be set using the password value or in the existingSecret to avoid issues\n    ## with Airflow.\n    ## The password value is ignored if existingSecret is set\n    password: \"\"\n    existingSecret: \"\"\n  architecture: standalone\n\n## External Redis&reg; configuration\n## All of these values are only used when redis.enabled is set to false\n## @param externalRedis.host Redis&reg; host\n## @param externalRedis.port Redis&reg; port number\n## @param externalRedis.username Redis&reg; username\n## @param externalRedis.password Redis&reg; password\n## @param externalRedis.existingSecret Name of an existing secret resource containing the Redis&trade credentials\n## @param externalRedis.existingSecretPasswordKey Name of an existing secret key containing the Redis&trade credentials\n##\nexternalRedis:\n  host: localhost\n  port: 6379\n  ## Most Redis&reg; implementations do not require a username\n  ## to authenticate and it should be enough with the password\n  username: \"\"\n  password: \"\"\n  existingSecret: \"\"\n  existingSecretPasswordKey: \"\"\n",
+			Readme:                    "",
+			UserId:                    6,
+			ReferenceValueId:          6304,
+			ReferenceValueKind:        "DEFAULT",
+			ACDAppName:                "",
+			Environment:               nil,
+			ChartGroupEntryId:         0,
+			DefaultClusterComponent:   false,
+			Status:                    appStoreBean.WF_UNKNOWN,
+			AppStoreId:                0,
+			AppStoreName:              "",
+			Deprecated:                false,
+			ForceDelete:               false,
+			ClusterId:                 0,
+			Namespace:                 "devtron-demo",
+			AppOfferingMode:           "",
+			GitOpsRepoName:            "",
+			GitOpsPath:                "",
+			GitHash:                   "",
+			EnvironmentName:           "",
+			InstallAppVersionChartDTO: nil,
+			DeploymentAppType:         "helm",
+		}
+
+		installedAppVersion, err := AppStoreDeploymentService.AppStoreDeployOperationDB(&InstallAppVersionDTO, tx)
+
+		assert.Nil(t, err)
+		assert.Equal(t, installedAppVersion.DeploymentAppType, "argo_cd")
+
+	})
+
+}
+
+func initAppStoreDeploymentService(t *testing.T, internalUse bool) *AppStoreDeploymentServiceImpl {
+	sugaredLogger, _ := util.InitLogger()
+
+	config, _ := sql.GetConfig()
+	db, _ := sql.NewDbConnection(config, sugaredLogger)
+
+	gitOpsRepository := repository.NewGitOpsConfigRepositoryImpl(sugaredLogger, db)
+
+	appStoreDiscoverRepository := appStoreDiscoverRepository.NewAppStoreApplicationVersionRepositoryImpl(sugaredLogger, db)
+
+	environmentRepository := repository2.NewEnvironmentRepositoryImpl(db)
+
+	k8sUtil := util.NewK8sUtil(sugaredLogger, &client.RuntimeConfig{LocalDevMode: true})
+
+	clusterRepository := repository2.NewClusterRepositoryImpl(db, sugaredLogger)
+	clusterService := cluster.NewClusterServiceImpl(clusterRepository, sugaredLogger, k8sUtil, nil)
+
+	environmentService := cluster.NewEnvironmentServiceImpl(environmentRepository, clusterService, sugaredLogger, k8sUtil, nil, nil)
+
+	AppRepository := app.NewAppRepositoryImpl(db, sugaredLogger)
+	InstalledAppRepository := repository3.NewInstalledAppRepositoryImpl(sugaredLogger, db)
+	InstalledAppVersionHistoryRepository := repository3.NewInstalledAppVersionHistoryRepositoryImpl(sugaredLogger, db)
+	ClusterInstalledAppsRepository := repository3.NewClusterInstalledAppsRepositoryImpl(db, sugaredLogger)
+
+	AppStoreDeploymentServiceImpl := NewAppStoreDeploymentServiceImpl(sugaredLogger, InstalledAppRepository,
+		appStoreDiscoverRepository, environmentRepository,
+		ClusterInstalledAppsRepository, AppRepository, nil,
+		nil, environmentService, clusterService, nil, nil, nil, InstalledAppVersionHistoryRepository, gitOpsRepository, nil, &DeploymentServiceTypeConfig{IsInternalUse: internalUse})
+
+	return AppStoreDeploymentServiceImpl
+}
diff --git a/pkg/pipeline/GitopsOrHelmOption_test.go b/pkg/pipeline/GitopsOrHelmOption_test.go
new file mode 100644
index 000000000..84308b815
--- /dev/null
+++ b/pkg/pipeline/GitopsOrHelmOption_test.go
@@ -0,0 +1,322 @@
+package pipeline
+
+import (
+	"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig/mocks"
+	"github.com/devtron-labs/devtron/internal/util"
+	"github.com/devtron-labs/devtron/pkg/bean"
+	"github.com/stretchr/testify/assert"
+	"testing"
+)
+
+func TestGitopsOrHelmOption(t *testing.T) {
+
+	t.Run("DeploymentAppSetterFunctionIfGitOpsConfiguredExternalUse", func(t *testing.T) {
+
+		sugaredLogger, err := util.NewSugardLogger()
+		assert.Nil(t, err)
+
+		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, nil,
+			nil, nil, nil, nil, nil,
+			nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil, nil, nil, &DeploymentServiceTypeConfig{IsInternalUse: false})
+
+		pipelineCreateRequest := &bean.CdPipelines{
+			Pipelines: []*bean.CDPipelineConfigObject{
+				{
+					Id:                            0,
+					EnvironmentId:                 1,
+					EnvironmentName:               "",
+					CiPipelineId:                  1,
+					TriggerType:                   "AUTOMATIC",
+					Name:                          "cd-1-vo8q",
+					Strategies:                    nil,
+					Namespace:                     "devtron-demo",
+					AppWorkflowId:                 1,
+					DeploymentTemplate:            "",
+					PreStage:                      bean.CdStage{},
+					PostStage:                     bean.CdStage{},
+					PreStageConfigMapSecretNames:  bean.PreStageConfigMapSecretNames{},
+					PostStageConfigMapSecretNames: bean.PostStageConfigMapSecretNames{},
+					RunPreStageInEnv:              false,
+					RunPostStageInEnv:             false,
+					CdArgoSetup:                   false,
+					ParentPipelineId:              1,
+					ParentPipelineType:            "CI_PIPELINE",
+					DeploymentAppType:             "",
+				},
+			},
+			AppId:  1,
+			UserId: 0,
+		}
+		isGitOpsConfigured := true
+		pipelineBuilderService.SetPipelineDeploymentAppType(pipelineCreateRequest, isGitOpsConfigured)
+
+		for _, pipeline := range pipelineCreateRequest.Pipelines {
+			assert.Equal(t, pipeline.DeploymentAppType, "argo_cd")
+		}
+
+	})
+
+	t.Run("DeploymentAppSetterFunctionIfGitOpsNotConfiguredExternalUse", func(t *testing.T) {
+
+		sugaredLogger, err := util.NewSugardLogger()
+		assert.Nil(t, err)
+
+		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, nil,
+			nil, nil, nil, nil, nil,
+			nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil, nil, nil, &DeploymentServiceTypeConfig{IsInternalUse: false})
+
+		pipelineCreateRequest := &bean.CdPipelines{
+			Pipelines: []*bean.CDPipelineConfigObject{
+				{
+					Id:                            0,
+					EnvironmentId:                 1,
+					EnvironmentName:               "",
+					CiPipelineId:                  1,
+					TriggerType:                   "AUTOMATIC",
+					Name:                          "cd-1-vo8q",
+					Strategies:                    nil,
+					Namespace:                     "devtron-demo",
+					AppWorkflowId:                 1,
+					DeploymentTemplate:            "",
+					PreStage:                      bean.CdStage{},
+					PostStage:                     bean.CdStage{},
+					PreStageConfigMapSecretNames:  bean.PreStageConfigMapSecretNames{},
+					PostStageConfigMapSecretNames: bean.PostStageConfigMapSecretNames{},
+					RunPreStageInEnv:              false,
+					RunPostStageInEnv:             false,
+					CdArgoSetup:                   false,
+					ParentPipelineId:              1,
+					ParentPipelineType:            "CI_PIPELINE",
+					DeploymentAppType:             "",
+				},
+			},
+			AppId:  1,
+			UserId: 0,
+		}
+		isGitOpsConfigured := false
+		pipelineBuilderService.SetPipelineDeploymentAppType(pipelineCreateRequest, isGitOpsConfigured)
+
+		for _, pipeline := range pipelineCreateRequest.Pipelines {
+			assert.Equal(t, pipeline.DeploymentAppType, "helm")
+		}
+
+	})
+
+	t.Run("DeploymentAppSetterFunctionInternalUse", func(t *testing.T) {
+
+		sugaredLogger, err := util.NewSugardLogger()
+		assert.Nil(t, err)
+
+		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, nil,
+			nil, nil, nil, nil, nil,
+			nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil, nil, nil, &DeploymentServiceTypeConfig{IsInternalUse: true})
+
+		pipelineCreateRequestHelm := &bean.CdPipelines{
+			Pipelines: []*bean.CDPipelineConfigObject{
+				&bean.CDPipelineConfigObject{
+					Id:                            0,
+					EnvironmentId:                 1,
+					EnvironmentName:               "",
+					CiPipelineId:                  1,
+					TriggerType:                   "AUTOMATIC",
+					Name:                          "cd-1-vo8q",
+					Strategies:                    nil,
+					Namespace:                     "devtron-demo",
+					AppWorkflowId:                 1,
+					DeploymentTemplate:            "",
+					PreStage:                      bean.CdStage{},
+					PostStage:                     bean.CdStage{},
+					PreStageConfigMapSecretNames:  bean.PreStageConfigMapSecretNames{},
+					PostStageConfigMapSecretNames: bean.PostStageConfigMapSecretNames{},
+					RunPreStageInEnv:              false,
+					RunPostStageInEnv:             false,
+					CdArgoSetup:                   false,
+					ParentPipelineId:              1,
+					ParentPipelineType:            "CI_PIPELINE",
+					DeploymentAppType:             "helm",
+				},
+			},
+			AppId:  1,
+			UserId: 0,
+		}
+		isGitOpsConfigured := true
+		pipelineBuilderService.SetPipelineDeploymentAppType(pipelineCreateRequestHelm, isGitOpsConfigured)
+
+		for _, pipeline := range pipelineCreateRequestHelm.Pipelines {
+			assert.Equal(t, pipeline.DeploymentAppType, "helm")
+		}
+
+		pipelineCreateRequestGitOps := &bean.CdPipelines{
+			Pipelines: []*bean.CDPipelineConfigObject{
+				&bean.CDPipelineConfigObject{
+					Id:                            0,
+					EnvironmentId:                 1,
+					EnvironmentName:               "",
+					CiPipelineId:                  1,
+					TriggerType:                   "AUTOMATIC",
+					Name:                          "cd-1-vo8q",
+					Strategies:                    nil,
+					Namespace:                     "devtron-demo",
+					AppWorkflowId:                 1,
+					DeploymentTemplate:            "",
+					PreStage:                      bean.CdStage{},
+					PostStage:                     bean.CdStage{},
+					PreStageConfigMapSecretNames:  bean.PreStageConfigMapSecretNames{},
+					PostStageConfigMapSecretNames: bean.PostStageConfigMapSecretNames{},
+					RunPreStageInEnv:              false,
+					RunPostStageInEnv:             false,
+					CdArgoSetup:                   false,
+					ParentPipelineId:              1,
+					ParentPipelineType:            "CI_PIPELINE",
+					DeploymentAppType:             "argo_cd",
+				},
+			},
+			AppId:  1,
+			UserId: 0,
+		}
+		pipelineBuilderService.SetPipelineDeploymentAppType(pipelineCreateRequestGitOps, isGitOpsConfigured)
+
+		for _, pipeline := range pipelineCreateRequestGitOps.Pipelines {
+			assert.Equal(t, pipeline.DeploymentAppType, "argo_cd")
+		}
+
+	})
+
+	t.Run("TestValidateCDPipelineRequestExternalUse", func(t *testing.T) {
+
+		sugaredLogger, err := util.NewSugardLogger()
+		assert.Nil(t, err)
+
+		mockedPipelineRepository := mocks.NewPipelineRepository(t)
+
+		mockedPipelineRepository.On("FindActiveByAppIdAndEnvironmentId", 1, 1).Return(nil, nil)
+
+		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, nil,
+			nil, nil, nil, nil, nil,
+			nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil, nil, nil, &DeploymentServiceTypeConfig{IsInternalUse: false})
+
+		pipelineCreateRequest := &bean.CdPipelines{
+			Pipelines: []*bean.CDPipelineConfigObject{
+				&bean.CDPipelineConfigObject{
+					Id:                            0,
+					EnvironmentId:                 1,
+					EnvironmentName:               "",
+					CiPipelineId:                  1,
+					TriggerType:                   "AUTOMATIC",
+					Name:                          "cd-1-vo8q",
+					Strategies:                    nil,
+					Namespace:                     "devtron-demo",
+					AppWorkflowId:                 1,
+					DeploymentTemplate:            "",
+					PreStage:                      bean.CdStage{},
+					PostStage:                     bean.CdStage{},
+					PreStageConfigMapSecretNames:  bean.PreStageConfigMapSecretNames{},
+					PostStageConfigMapSecretNames: bean.PostStageConfigMapSecretNames{},
+					RunPreStageInEnv:              false,
+					RunPostStageInEnv:             false,
+					CdArgoSetup:                   false,
+					ParentPipelineId:              1,
+					ParentPipelineType:            "CI_PIPELINE",
+					DeploymentAppType:             "",
+				},
+			},
+			AppId:  1,
+			UserId: 0,
+		}
+		isGitOpsConfigured := false
+		isGitOpsRequired := pipelineBuilderService.IsGitOpsRequiredForCD(pipelineCreateRequest)
+
+		_, err = pipelineBuilderService.ValidateCDPipelineRequest(pipelineCreateRequest, isGitOpsConfigured, isGitOpsRequired)
+
+		assert.Nil(t, err)
+
+	})
+
+	t.Run("TestValidateCDPipelineRequestInternalUse", func(t *testing.T) {
+
+		sugaredLogger, err := util.NewSugardLogger()
+		assert.Nil(t, err)
+
+		mockedPipelineRepository := mocks.NewPipelineRepository(t)
+
+		//mockedPipelineRepository.On("FindActiveByAppIdAndEnvironmentId", 1, 1).Return(nil, nil)
+
+		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, nil,
+			nil, nil, nil, nil, nil,
+			nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil,
+			nil, nil, nil, nil, nil, nil, &DeploymentServiceTypeConfig{IsInternalUse: true})
+
+		pipelineCreateRequest := &bean.CdPipelines{
+			Pipelines: []*bean.CDPipelineConfigObject{
+				&bean.CDPipelineConfigObject{
+					Id:                            0,
+					EnvironmentId:                 1,
+					EnvironmentName:               "",
+					CiPipelineId:                  1,
+					TriggerType:                   "AUTOMATIC",
+					Name:                          "cd-1-vo8q",
+					Strategies:                    nil,
+					Namespace:                     "devtron-demo",
+					AppWorkflowId:                 1,
+					DeploymentTemplate:            "",
+					PreStage:                      bean.CdStage{},
+					PostStage:                     bean.CdStage{},
+					PreStageConfigMapSecretNames:  bean.PreStageConfigMapSecretNames{},
+					PostStageConfigMapSecretNames: bean.PostStageConfigMapSecretNames{},
+					RunPreStageInEnv:              false,
+					RunPostStageInEnv:             false,
+					CdArgoSetup:                   false,
+					ParentPipelineId:              1,
+					ParentPipelineType:            "CI_PIPELINE",
+					DeploymentAppType:             "argo_cd",
+				},
+			},
+			AppId:  1,
+			UserId: 0,
+		}
+		isGitOpsConfigured := false
+		isGitOpsRequired := pipelineBuilderService.IsGitOpsRequiredForCD(pipelineCreateRequest)
+
+		InvalidRequest, err := pipelineBuilderService.ValidateCDPipelineRequest(pipelineCreateRequest, isGitOpsConfigured, isGitOpsRequired)
+
+		if err != nil {
+			assert.Equal(t, InvalidRequest, false)
+		}
+
+	})
+
+}