Repository: devtron-labs/devtron
Pull request #3728 (2023-08-04 13:31:49)

feat: Refactored docker registry IP config and added integration test cases
# Description

1. Updated Migration script
2. Refactored Docker Registry Ip config
3. updated and add integration test cases

## How Has This Been Tested?

- [x] Created registry IP config
- [x] Updated registry IP config
- [x] Soft Deleted registry IP config
- [x] Created previously deleted registry IP config

## Checklist:

* [x] The title of the PR states what changed and the related issues number (used for the release note).
* [ ] Does this PR requires documentation updates?
* [ ] I've updated documentation as required by this PR.
* [x] I have performed a self-review of my own code.
* [x] I have commented my code, particularly in hard-to-understand areas.
* [ ] I have tested it for all user roles.
* [x] I have added all the required unit/api test cases.

## Does this PR introduce a user-facing change?
<!--
If NO, leave the release-note block blank.
If YES, a release note is required:
Enter your extended release note in the block below. If the PR requires additional manual action from users switching to the new version, include the string "action-required".

-->
```release-note

```



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

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

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



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3728)

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

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



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3728)

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

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



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3728)

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

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



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3728)

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

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



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3728)

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

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



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3728)

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

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



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3728)

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

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



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3728)

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

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



![idea](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png 'idea') Catch issues before they fail your Quality Gate with our IDE extension ![sonarlint](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png 'sonarlint') [SonarLint](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=sonarcloud-welcome)
sonarcloud[bot]: SonarCloud Quality Gate failed.&nbsp; &nbsp; [![Quality Gate failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonarcloud.io/dashboard?id=devtron-labs_devtron&pullRequest=3728)

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

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



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

Patch:
diff --git a/api/helm-app/mocks/HelmAppService.go b/api/helm-app/mocks/HelmAppService.go
new file mode 100644
index 000000000..59dce9f45
--- /dev/null
+++ b/api/helm-app/mocks/HelmAppService.go
@@ -0,0 +1,611 @@
+// Code generated by mockery v2.32.0. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	client "github.com/devtron-labs/devtron/api/helm-app"
+
+	http "net/http"
+
+	mock "github.com/stretchr/testify/mock"
+
+	openapi "github.com/devtron-labs/devtron/api/helm-app/openapiClient"
+
+	openapiClient "github.com/devtron-labs/devtron/api/openapi/openapiClient"
+)
+
+// HelmAppService is an autogenerated mock type for the HelmAppService type
+type HelmAppService struct {
+	mock.Mock
+}
+
+// DecodeAppId provides a mock function with given fields: appId
+func (_m *HelmAppService) DecodeAppId(appId string) (*client.AppIdentifier, error) {
+	ret := _m.Called(appId)
+
+	var r0 *client.AppIdentifier
+	var r1 error
+	if rf, ok := ret.Get(0).(func(string) (*client.AppIdentifier, error)); ok {
+		return rf(appId)
+	}
+	if rf, ok := ret.Get(0).(func(string) *client.AppIdentifier); ok {
+		r0 = rf(appId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*client.AppIdentifier)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(string) error); ok {
+		r1 = rf(appId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// DeleteApplication provides a mock function with given fields: ctx, app
+func (_m *HelmAppService) DeleteApplication(ctx context.Context, app *client.AppIdentifier) (*openapi.UninstallReleaseResponse, error) {
+	ret := _m.Called(ctx, app)
+
+	var r0 *openapi.UninstallReleaseResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) (*openapi.UninstallReleaseResponse, error)); ok {
+		return rf(ctx, app)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) *openapi.UninstallReleaseResponse); ok {
+		r0 = rf(ctx, app)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*openapi.UninstallReleaseResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier) error); ok {
+		r1 = rf(ctx, app)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// EncodeAppId provides a mock function with given fields: appIdentifier
+func (_m *HelmAppService) EncodeAppId(appIdentifier *client.AppIdentifier) string {
+	ret := _m.Called(appIdentifier)
+
+	var r0 string
+	if rf, ok := ret.Get(0).(func(*client.AppIdentifier) string); ok {
+		r0 = rf(appIdentifier)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	return r0
+}
+
+// GetApplicationDetail provides a mock function with given fields: ctx, app
+func (_m *HelmAppService) GetApplicationDetail(ctx context.Context, app *client.AppIdentifier) (*client.AppDetail, error) {
+	ret := _m.Called(ctx, app)
+
+	var r0 *client.AppDetail
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) (*client.AppDetail, error)); ok {
+		return rf(ctx, app)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) *client.AppDetail); ok {
+		r0 = rf(ctx, app)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*client.AppDetail)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier) error); ok {
+		r1 = rf(ctx, app)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetApplicationDetailWithFilter provides a mock function with given fields: ctx, app, resourceTreeFilter
+func (_m *HelmAppService) GetApplicationDetailWithFilter(ctx context.Context, app *client.AppIdentifier, resourceTreeFilter *client.ResourceTreeFilter) (*client.AppDetail, error) {
+	ret := _m.Called(ctx, app, resourceTreeFilter)
+
+	var r0 *client.AppDetail
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *client.ResourceTreeFilter) (*client.AppDetail, error)); ok {
+		return rf(ctx, app, resourceTreeFilter)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *client.ResourceTreeFilter) *client.AppDetail); ok {
+		r0 = rf(ctx, app, resourceTreeFilter)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*client.AppDetail)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier, *client.ResourceTreeFilter) error); ok {
+		r1 = rf(ctx, app, resourceTreeFilter)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetApplicationStatus provides a mock function with given fields: ctx, app
+func (_m *HelmAppService) GetApplicationStatus(ctx context.Context, app *client.AppIdentifier) (string, error) {
+	ret := _m.Called(ctx, app)
+
+	var r0 string
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) (string, error)); ok {
+		return rf(ctx, app)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) string); ok {
+		r0 = rf(ctx, app)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier) error); ok {
+		r1 = rf(ctx, app)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetClusterConf provides a mock function with given fields: clusterId
+func (_m *HelmAppService) GetClusterConf(clusterId int) (*client.ClusterConfig, error) {
+	ret := _m.Called(clusterId)
+
+	var r0 *client.ClusterConfig
+	var r1 error
+	if rf, ok := ret.Get(0).(func(int) (*client.ClusterConfig, error)); ok {
+		return rf(clusterId)
+	}
+	if rf, ok := ret.Get(0).(func(int) *client.ClusterConfig); ok {
+		r0 = rf(clusterId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*client.ClusterConfig)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(int) error); ok {
+		r1 = rf(clusterId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetDeploymentDetail provides a mock function with given fields: ctx, app, version
+func (_m *HelmAppService) GetDeploymentDetail(ctx context.Context, app *client.AppIdentifier, version int32) (*openapi.HelmAppDeploymentManifestDetail, error) {
+	ret := _m.Called(ctx, app, version)
+
+	var r0 *openapi.HelmAppDeploymentManifestDetail
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, int32) (*openapi.HelmAppDeploymentManifestDetail, error)); ok {
+		return rf(ctx, app, version)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, int32) *openapi.HelmAppDeploymentManifestDetail); ok {
+		r0 = rf(ctx, app, version)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*openapi.HelmAppDeploymentManifestDetail)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier, int32) error); ok {
+		r1 = rf(ctx, app, version)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetDeploymentHistory provides a mock function with given fields: ctx, app
+func (_m *HelmAppService) GetDeploymentHistory(ctx context.Context, app *client.AppIdentifier) (*client.HelmAppDeploymentHistory, error) {
+	ret := _m.Called(ctx, app)
+
+	var r0 *client.HelmAppDeploymentHistory
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) (*client.HelmAppDeploymentHistory, error)); ok {
+		return rf(ctx, app)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) *client.HelmAppDeploymentHistory); ok {
+		r0 = rf(ctx, app)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*client.HelmAppDeploymentHistory)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier) error); ok {
+		r1 = rf(ctx, app)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetDesiredManifest provides a mock function with given fields: ctx, app, resource
+func (_m *HelmAppService) GetDesiredManifest(ctx context.Context, app *client.AppIdentifier, resource *openapi.ResourceIdentifier) (*openapi.DesiredManifestResponse, error) {
+	ret := _m.Called(ctx, app, resource)
+
+	var r0 *openapi.DesiredManifestResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *openapi.ResourceIdentifier) (*openapi.DesiredManifestResponse, error)); ok {
+		return rf(ctx, app, resource)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *openapi.ResourceIdentifier) *openapi.DesiredManifestResponse); ok {
+		r0 = rf(ctx, app, resource)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*openapi.DesiredManifestResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier, *openapi.ResourceIdentifier) error); ok {
+		r1 = rf(ctx, app, resource)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetDevtronHelmAppIdentifier provides a mock function with given fields:
+func (_m *HelmAppService) GetDevtronHelmAppIdentifier() *client.AppIdentifier {
+	ret := _m.Called()
+
+	var r0 *client.AppIdentifier
+	if rf, ok := ret.Get(0).(func() *client.AppIdentifier); ok {
+		r0 = rf()
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*client.AppIdentifier)
+		}
+	}
+
+	return r0
+}
+
+// GetNotes provides a mock function with given fields: ctx, request
+func (_m *HelmAppService) GetNotes(ctx context.Context, request *client.InstallReleaseRequest) (string, error) {
+	ret := _m.Called(ctx, request)
+
+	var r0 string
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.InstallReleaseRequest) (string, error)); ok {
+		return rf(ctx, request)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.InstallReleaseRequest) string); ok {
+		r0 = rf(ctx, request)
+	} else {
+		r0 = ret.Get(0).(string)
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.InstallReleaseRequest) error); ok {
+		r1 = rf(ctx, request)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// GetRevisionHistoryMaxValue provides a mock function with given fields: appType
+func (_m *HelmAppService) GetRevisionHistoryMaxValue(appType client.SourceAppType) int32 {
+	ret := _m.Called(appType)
+
+	var r0 int32
+	if rf, ok := ret.Get(0).(func(client.SourceAppType) int32); ok {
+		r0 = rf(appType)
+	} else {
+		r0 = ret.Get(0).(int32)
+	}
+
+	return r0
+}
+
+// GetValuesYaml provides a mock function with given fields: ctx, app
+func (_m *HelmAppService) GetValuesYaml(ctx context.Context, app *client.AppIdentifier) (*client.ReleaseInfo, error) {
+	ret := _m.Called(ctx, app)
+
+	var r0 *client.ReleaseInfo
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) (*client.ReleaseInfo, error)); ok {
+		return rf(ctx, app)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) *client.ReleaseInfo); ok {
+		r0 = rf(ctx, app)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*client.ReleaseInfo)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier) error); ok {
+		r1 = rf(ctx, app)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// HibernateApplication provides a mock function with given fields: ctx, app, hibernateRequest
+func (_m *HelmAppService) HibernateApplication(ctx context.Context, app *client.AppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) {
+	ret := _m.Called(ctx, app, hibernateRequest)
+
+	var r0 []*openapi.HibernateStatus
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error)); ok {
+		return rf(ctx, app, hibernateRequest)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *openapi.HibernateRequest) []*openapi.HibernateStatus); ok {
+		r0 = rf(ctx, app, hibernateRequest)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*openapi.HibernateStatus)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier, *openapi.HibernateRequest) error); ok {
+		r1 = rf(ctx, app, hibernateRequest)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// InstallRelease provides a mock function with given fields: ctx, clusterId, installReleaseRequest
+func (_m *HelmAppService) InstallRelease(ctx context.Context, clusterId int, installReleaseRequest *client.InstallReleaseRequest) (*client.InstallReleaseResponse, error) {
+	ret := _m.Called(ctx, clusterId, installReleaseRequest)
+
+	var r0 *client.InstallReleaseResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, int, *client.InstallReleaseRequest) (*client.InstallReleaseResponse, error)); ok {
+		return rf(ctx, clusterId, installReleaseRequest)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, int, *client.InstallReleaseRequest) *client.InstallReleaseResponse); ok {
+		r0 = rf(ctx, clusterId, installReleaseRequest)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*client.InstallReleaseResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, int, *client.InstallReleaseRequest) error); ok {
+		r1 = rf(ctx, clusterId, installReleaseRequest)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// IsReleaseInstalled provides a mock function with given fields: ctx, app
+func (_m *HelmAppService) IsReleaseInstalled(ctx context.Context, app *client.AppIdentifier) (bool, error) {
+	ret := _m.Called(ctx, app)
+
+	var r0 bool
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) (bool, error)); ok {
+		return rf(ctx, app)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier) bool); ok {
+		r0 = rf(ctx, app)
+	} else {
+		r0 = ret.Get(0).(bool)
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier) error); ok {
+		r1 = rf(ctx, app)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// ListHelmApplications provides a mock function with given fields: ctx, clusterIds, w, token, helmAuth
+func (_m *HelmAppService) ListHelmApplications(ctx context.Context, clusterIds []int, w http.ResponseWriter, token string, helmAuth func(string, string) bool) {
+	_m.Called(ctx, clusterIds, w, token, helmAuth)
+}
+
+// RollbackRelease provides a mock function with given fields: ctx, app, version
+func (_m *HelmAppService) RollbackRelease(ctx context.Context, app *client.AppIdentifier, version int32) (bool, error) {
+	ret := _m.Called(ctx, app, version)
+
+	var r0 bool
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, int32) (bool, error)); ok {
+		return rf(ctx, app, version)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, int32) bool); ok {
+		r0 = rf(ctx, app, version)
+	} else {
+		r0 = ret.Get(0).(bool)
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier, int32) error); ok {
+		r1 = rf(ctx, app, version)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// TemplateChart provides a mock function with given fields: ctx, templateChartRequest
+func (_m *HelmAppService) TemplateChart(ctx context.Context, templateChartRequest *openapiClient.TemplateChartRequest) (*openapiClient.TemplateChartResponse, error) {
+	ret := _m.Called(ctx, templateChartRequest)
+
+	var r0 *openapiClient.TemplateChartResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *openapiClient.TemplateChartRequest) (*openapiClient.TemplateChartResponse, error)); ok {
+		return rf(ctx, templateChartRequest)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *openapiClient.TemplateChartRequest) *openapiClient.TemplateChartResponse); ok {
+		r0 = rf(ctx, templateChartRequest)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*openapiClient.TemplateChartResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *openapiClient.TemplateChartRequest) error); ok {
+		r1 = rf(ctx, templateChartRequest)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// UnHibernateApplication provides a mock function with given fields: ctx, app, hibernateRequest
+func (_m *HelmAppService) UnHibernateApplication(ctx context.Context, app *client.AppIdentifier, hibernateRequest *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error) {
+	ret := _m.Called(ctx, app, hibernateRequest)
+
+	var r0 []*openapi.HibernateStatus
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *openapi.HibernateRequest) ([]*openapi.HibernateStatus, error)); ok {
+		return rf(ctx, app, hibernateRequest)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *openapi.HibernateRequest) []*openapi.HibernateStatus); ok {
+		r0 = rf(ctx, app, hibernateRequest)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*openapi.HibernateStatus)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier, *openapi.HibernateRequest) error); ok {
+		r1 = rf(ctx, app, hibernateRequest)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// UpdateApplication provides a mock function with given fields: ctx, app, request
+func (_m *HelmAppService) UpdateApplication(ctx context.Context, app *client.AppIdentifier, request *client.UpdateApplicationRequestDto) (*openapi.UpdateReleaseResponse, error) {
+	ret := _m.Called(ctx, app, request)
+
+	var r0 *openapi.UpdateReleaseResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *client.UpdateApplicationRequestDto) (*openapi.UpdateReleaseResponse, error)); ok {
+		return rf(ctx, app, request)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *client.UpdateApplicationRequestDto) *openapi.UpdateReleaseResponse); ok {
+		r0 = rf(ctx, app, request)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*openapi.UpdateReleaseResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier, *client.UpdateApplicationRequestDto) error); ok {
+		r1 = rf(ctx, app, request)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// UpdateApplicationWithChartInfo provides a mock function with given fields: ctx, clusterId, request
+func (_m *HelmAppService) UpdateApplicationWithChartInfo(ctx context.Context, clusterId int, request *client.UpdateApplicationWithChartInfoRequestDto) (*openapi.UpdateReleaseResponse, error) {
+	ret := _m.Called(ctx, clusterId, request)
+
+	var r0 *openapi.UpdateReleaseResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, int, *client.UpdateApplicationWithChartInfoRequestDto) (*openapi.UpdateReleaseResponse, error)); ok {
+		return rf(ctx, clusterId, request)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, int, *client.UpdateApplicationWithChartInfoRequestDto) *openapi.UpdateReleaseResponse); ok {
+		r0 = rf(ctx, clusterId, request)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*openapi.UpdateReleaseResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, int, *client.UpdateApplicationWithChartInfoRequestDto) error); ok {
+		r1 = rf(ctx, clusterId, request)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// UpdateApplicationWithChartInfoWithExtraValues provides a mock function with given fields: ctx, appIdentifier, chartRepository, extraValues, extraValuesYamlUrl, useLatestChartVersion
+func (_m *HelmAppService) UpdateApplicationWithChartInfoWithExtraValues(ctx context.Context, appIdentifier *client.AppIdentifier, chartRepository *client.ChartRepository, extraValues map[string]interface{}, extraValuesYamlUrl string, useLatestChartVersion bool) (*openapi.UpdateReleaseResponse, error) {
+	ret := _m.Called(ctx, appIdentifier, chartRepository, extraValues, extraValuesYamlUrl, useLatestChartVersion)
+
+	var r0 *openapi.UpdateReleaseResponse
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *client.ChartRepository, map[string]interface{}, string, bool) (*openapi.UpdateReleaseResponse, error)); ok {
+		return rf(ctx, appIdentifier, chartRepository, extraValues, extraValuesYamlUrl, useLatestChartVersion)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *client.AppIdentifier, *client.ChartRepository, map[string]interface{}, string, bool) *openapi.UpdateReleaseResponse); ok {
+		r0 = rf(ctx, appIdentifier, chartRepository, extraValues, extraValuesYamlUrl, useLatestChartVersion)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*openapi.UpdateReleaseResponse)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *client.AppIdentifier, *client.ChartRepository, map[string]interface{}, string, bool) error); ok {
+		r1 = rf(ctx, appIdentifier, chartRepository, extraValues, extraValuesYamlUrl, useLatestChartVersion)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// ValidateOCIRegistry provides a mock function with given fields: ctx, OCIRegistryRequest
+func (_m *HelmAppService) ValidateOCIRegistry(ctx context.Context, OCIRegistryRequest *client.RegistryCredential) bool {
+	ret := _m.Called(ctx, OCIRegistryRequest)
+
+	var r0 bool
+	if rf, ok := ret.Get(0).(func(context.Context, *client.RegistryCredential) bool); ok {
+		r0 = rf(ctx, OCIRegistryRequest)
+	} else {
+		r0 = ret.Get(0).(bool)
+	}
+
+	return r0
+}
+
+// NewHelmAppService creates a new instance of HelmAppService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewHelmAppService(t interface {
+	mock.TestingT
+	Cleanup(func())
+}) *HelmAppService {
+	mock := &HelmAppService{}
+	mock.Mock.Test(t)
+
+	t.Cleanup(func() { mock.AssertExpectations(t) })
+
+	return mock
+}
diff --git a/api/restHandler/DockerRegRestHandler.go b/api/restHandler/DockerRegRestHandler.go
index 75458e625..fed507460 100644
--- a/api/restHandler/DockerRegRestHandler.go
+++ b/api/restHandler/DockerRegRestHandler.go
@@ -115,7 +115,7 @@ func NewDockerRegRestHandlerImpl(
 	}
 }
 
-func ValidateDockerArtifactStoreRequestBean(bean pipeline.DockerArtifactStoreBean, isUpdate bool) bool {
+func ValidateDockerArtifactStoreRequestBean(bean pipeline.DockerArtifactStoreBean) bool {
 	// validating secure connection configs
 	if (bean.Connection == secureWithCert && bean.Cert == "") ||
 		(bean.Connection != secureWithCert && bean.Cert != "") {
@@ -131,13 +131,16 @@ func ValidateDockerArtifactStoreRequestBean(bean pipeline.DockerArtifactStoreBea
 		if containerStorageActionExists && containerStorageActionType != repository.STORAGE_ACTION_TYPE_PULL_AND_PUSH && bean.DockerRegistryIpsConfig == nil {
 			return false
 		}
-		if !isUpdate {
-			// For Charts with storage action type "PULL/PUSH" or "PULL", RepositoryList cannot be nil
-			chartStorageActionType, chartStorageActionExists := bean.OCIRegistryConfig[repository.OCI_REGISRTY_REPO_TYPE_CHART]
-			if chartStorageActionExists && (chartStorageActionType == repository.STORAGE_ACTION_TYPE_PULL_AND_PUSH || chartStorageActionType == repository.STORAGE_ACTION_TYPE_PULL) {
-				if bean.RepositoryList == nil || len(bean.RepositoryList) == 0 || slices.Contains(bean.RepositoryList, "") {
-					return false
-				}
+		chartStorageActionType, chartStorageActionExists := bean.OCIRegistryConfig[repository.OCI_REGISRTY_REPO_TYPE_CHART]
+		// For Charts with storage action type "PULL", default will always be false
+		if chartStorageActionExists && chartStorageActionType == repository.STORAGE_ACTION_TYPE_PULL {
+			bean.IsDefault = false
+		}
+
+		// For Charts with storage action type "PULL/PUSH" or "PULL", RepositoryList cannot be nil
+		if chartStorageActionExists && (chartStorageActionType == repository.STORAGE_ACTION_TYPE_PULL_AND_PUSH || chartStorageActionType == repository.STORAGE_ACTION_TYPE_PULL) {
+			if bean.RepositoryList == nil || len(bean.RepositoryList) == 0 || slices.Contains(bean.RepositoryList, "") {
+				return false
 			}
 		}
 		// For public registry, URL prefix "oci://" should be trimmed, DockerRegistryIpsConfig should be nil and default should be false
@@ -145,8 +148,10 @@ func ValidateDockerArtifactStoreRequestBean(bean pipeline.DockerArtifactStoreBea
 			bean.IsDefault = false
 			bean.DockerRegistryIpsConfig = nil
 			bean.RegistryURL = strings.TrimPrefix(bean.RegistryURL, OCIScheme)
+		} else if containerStorageActionExists && bean.DockerRegistryIpsConfig == nil {
+			return false
 		}
-	} else if bean.OCIRegistryConfig != nil || bean.IsPublic {
+	} else if bean.OCIRegistryConfig != nil || bean.IsPublic || bean.DockerRegistryIpsConfig == nil {
 		return false
 	}
 	return true
@@ -167,7 +172,7 @@ func (impl DockerRegRestHandlerImpl) SaveDockerRegistryConfig(w http.ResponseWri
 		return
 	}
 	bean.User = userId
-	if !ValidateDockerArtifactStoreRequestBean(bean, false) {
+	if !ValidateDockerArtifactStoreRequestBean(bean) {
 		err = fmt.Errorf("invalid payload, missing or incorrect values for required fields")
 		impl.logger.Errorw("validation err, SaveDockerRegistryConfig", "err", err, "payload", bean)
 		common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
@@ -219,6 +224,12 @@ func (impl DockerRegRestHandlerImpl) SaveDockerRegistryConfig(w http.ResponseWri
 		return
 	}
 
+	res, err := impl.dockerRegistryConfig.Create(&bean)
+	if err != nil {
+		impl.logger.Errorw("service err, SaveDockerRegistryConfig", "err", err, "payload", bean)
+		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
+		return
+	}
 	// trigger a chart sync job
 	if bean.IsOCICompliantRegistry && len(bean.RepositoryList) != 0 {
 		request := &chartProviderService.ChartProviderRequestDto{
@@ -232,13 +243,6 @@ func (impl DockerRegRestHandlerImpl) SaveDockerRegistryConfig(w http.ResponseWri
 			return
 		}
 	}
-
-	res, err := impl.dockerRegistryConfig.Create(&bean)
-	if err != nil {
-		impl.logger.Errorw("service err, SaveDockerRegistryConfig", "err", err, "payload", bean)
-		common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
-		return
-	}
 	common.WriteJsonResp(w, err, res, http.StatusOK)
 }
 
@@ -273,7 +277,26 @@ func (impl DockerRegRestHandlerImpl) ValidateDockerRegistryConfig(w http.Respons
 		return
 	}
 	//RBAC enforcer Ends
+	existingStore, err := impl.dockerRegistryConfig.FetchOneDockerAccount(bean.Id)
+	if err != nil {
+		impl.logger.Errorw("no matching entry found of update ..", "err", err)
+		return
+	}
+	if bean.Password == "" {
+		bean.Password = existingStore.Password
+	}
+
+	if bean.AWSSecretAccessKey == "" {
+		bean.AWSSecretAccessKey = existingStore.AWSSecretAccessKey
+	}
 
+	if bean.Cert == "" {
+		bean.Cert = existingStore.Cert
+	}
+
+	if bean.Cert == "" {
+		bean.Cert = existingStore.Cert
+	}
 	// valid registry credentials from kubelink
 	if isValid := impl.dockerRegistryConfig.ValidateRegistryCredentials(&bean); !isValid {
 		impl.logger.Errorw("registry credentials validation err, SaveDockerRegistryConfig", "err", err, "payload", bean)
@@ -436,7 +459,7 @@ func (impl DockerRegRestHandlerImpl) UpdateDockerRegistryConfig(w http.ResponseW
 		return
 	}
 	bean.User = userId
-	if !ValidateDockerArtifactStoreRequestBean(bean, true) {
+	if !ValidateDockerArtifactStoreRequestBean(bean) {
 		err = fmt.Errorf("invalid payload, missing or incorrect values for required fields")
 		impl.logger.Errorw("validation err, SaveDockerRegistryConfig", "err", err, "payload", bean)
 		common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
diff --git a/internal/sql/repository/dockerRegistry/DockerArtifactStoreRepository.go b/internal/sql/repository/dockerRegistry/DockerArtifactStoreRepository.go
index 388617618..ef625f02d 100644
--- a/internal/sql/repository/dockerRegistry/DockerArtifactStoreRepository.go
+++ b/internal/sql/repository/dockerRegistry/DockerArtifactStoreRepository.go
@@ -71,6 +71,11 @@ type DockerArtifactStoreExt struct {
 	DeploymentCount int `sql:"deployment_count" json:"deploymentCount"`
 }
 
+type ChartDeploymentCount struct {
+	OCIChartName    string `sql:"oci_chart_name" json:"ociChartName"`
+	DeploymentCount int    `sql:"deployment_count" json:"deploymentCount"`
+}
+
 func (store *DockerArtifactStore) GetRegistryLocation() (registryLocation string, err error) {
 	u, err := url.Parse(registryLocation)
 	if err != nil {
@@ -89,6 +94,7 @@ type DockerArtifactStoreRepository interface {
 	FindAllChartProviders() ([]DockerArtifactStore, error)
 	FindOne(storeId string) (*DockerArtifactStore, error)
 	FindOneWithDeploymentCount(storeId string) (*DockerArtifactStoreExt, error)
+	FindOneWithChartDeploymentCount(storeId, chartName string) (*ChartDeploymentCount, error)
 	FindOneInactive(storeId string) (*DockerArtifactStore, error)
 	Update(artifactStore *DockerArtifactStore, tx *pg.Tx) error
 	Delete(storeId string) error
@@ -148,11 +154,13 @@ func (impl DockerArtifactStoreRepositoryImpl) FindAll() ([]DockerArtifactStore,
 	var providers []DockerArtifactStore
 	err := impl.dbConnection.Model(&providers).
 		Column("docker_artifact_store.*", "IpsConfig", "OCIRegistryConfig").
-		Join("LEFT JOIN docker_registry_ips_config ipc on ipc.docker_artifact_store_id = docker_artifact_store.id").
-		Where("active = ?", true).
+		Where("docker_artifact_store.active = ?", true).
 		Relation("OCIRegistryConfig", func(q *orm.Query) (query *orm.Query, err error) {
 			return q.Where("deleted IS FALSE"), nil
 		}).
+		Relation("IpsConfig", func(q *orm.Query) (query *orm.Query, err error) {
+			return q.JoinOn("(ips_config.active=true or ips_config is null)"), nil
+		}).
 		Select()
 	return providers, err
 }
@@ -161,7 +169,7 @@ func (impl DockerArtifactStoreRepositoryImpl) FindAllChartProviders() ([]DockerA
 	var providers []DockerArtifactStore
 	err := impl.dbConnection.Model(&providers).
 		Column("docker_artifact_store.*", "OCIRegistryConfig").
-		Where("active = ?", true).
+		Where("docker_artifact_store.active = ?", true).
 		Relation("OCIRegistryConfig", func(q *orm.Query) (query *orm.Query, err error) {
 			return q.Where("deleted IS FALSE and " +
 				"repository_type='CHART' and " +
@@ -175,12 +183,14 @@ func (impl DockerArtifactStoreRepositoryImpl) FindOne(storeId string) (*DockerAr
 	var provider DockerArtifactStore
 	err := impl.dbConnection.Model(&provider).
 		Column("docker_artifact_store.*", "IpsConfig", "OCIRegistryConfig").
-		Join("LEFT JOIN docker_registry_ips_config ipc on ipc.docker_artifact_store_id = docker_artifact_store.id").
 		Where("docker_artifact_store.id = ?", storeId).
-		Where("active = ?", true).
+		Where("docker_artifact_store.active = ?", true).
 		Relation("OCIRegistryConfig", func(q *orm.Query) (query *orm.Query, err error) {
 			return q.Where("deleted IS FALSE"), nil
 		}).
+		Relation("IpsConfig", func(q *orm.Query) (query *orm.Query, err error) {
+			return q.JoinOn("(ips_config.active=true or ips_config is null)"), nil
+		}).
 		Select()
 	return &provider, err
 }
@@ -195,13 +205,24 @@ func (impl DockerArtifactStoreRepositoryImpl) FindOneWithDeploymentCount(storeId
 	return &provider, err
 }
 
+func (impl DockerArtifactStoreRepositoryImpl) FindOneWithChartDeploymentCount(storeId, chartName string) (*ChartDeploymentCount, error) {
+	var provider ChartDeploymentCount
+	query := "SELECT aps.name as oci_chart_name, COUNT(ia.id) as deployment_count FROM installed_app_versions iav" +
+		" INNER JOIN installed_apps ia on iav.installed_app_id = ia.id" +
+		" INNER JOIN app_store_application_version asav on iav.app_store_application_version_id = asav.id" +
+		" INNER JOIN app_store aps on asav.app_store_id = aps.id" +
+		" WHERE ia.active=true and iav.active=true and aps.docker_artifact_store_id = ? and aps.name = ?" +
+		" GROUP BY oci_chart_name,aps.docker_artifact_store_id;"
+	_, err := impl.dbConnection.Query(&provider, query, storeId, chartName)
+	return &provider, err
+}
+
 func (impl DockerArtifactStoreRepositoryImpl) FindOneInactive(storeId string) (*DockerArtifactStore, error) {
 	var provider DockerArtifactStore
 	err := impl.dbConnection.Model(&provider).
 		Column("docker_artifact_store.*", "IpsConfig", "OCIRegistryConfig").
-		Join("LEFT JOIN docker_registry_ips_config ipc on ipc.docker_artifact_store_id = docker_artifact_store.id").
 		Where("docker_artifact_store.id = ?", storeId).
-		Where("active = ?", false).
+		Where("docker_artifact_store.active = ?", false).
 		Relation("OCIRegistryConfig", func(q *orm.Query) (query *orm.Query, err error) {
 			return q.Where("deleted IS FALSE"), nil
 		}).
diff --git a/internal/sql/repository/dockerRegistry/DockerRegistryIpsConfigRepository.go b/internal/sql/repository/dockerRegistry/DockerRegistryIpsConfigRepository.go
index a305cf803..5cebb8487 100644
--- a/internal/sql/repository/dockerRegistry/DockerRegistryIpsConfigRepository.go
+++ b/internal/sql/repository/dockerRegistry/DockerRegistryIpsConfigRepository.go
@@ -29,6 +29,7 @@ type DockerRegistryIpsConfig struct {
 	CredentialValue       string                          `sql:"credential_value"`
 	AppliedClusterIdsCsv  string                          `sql:"applied_cluster_ids_csv"` // -1 means all_cluster
 	IgnoredClusterIdsCsv  string                          `sql:"ignored_cluster_ids_csv"`
+	Active                bool                            `sql:"active,notnull"`
 }
 
 type DockerRegistryIpsCredentialType string
@@ -36,6 +37,7 @@ type DockerRegistryIpsCredentialType string
 type DockerRegistryIpsConfigRepository interface {
 	Save(config *DockerRegistryIpsConfig, tx *pg.Tx) error
 	Update(config *DockerRegistryIpsConfig, tx *pg.Tx) error
+	FindInActiveByDockerRegistryId(dockerRegistryId string) (*DockerRegistryIpsConfig, error)
 	FindByDockerRegistryId(dockerRegistryId string) (*DockerRegistryIpsConfig, error)
 }
 
@@ -56,6 +58,16 @@ func (impl DockerRegistryIpsConfigRepositoryImpl) Update(config *DockerRegistryI
 }
 
 func (impl DockerRegistryIpsConfigRepositoryImpl) FindByDockerRegistryId(dockerRegistryId string) (*DockerRegistryIpsConfig, error) {
+	var dockerRegistryIpsConfig DockerRegistryIpsConfig
+	//added limit 1 for fasting querying
+	err := impl.dbConnection.Model(&dockerRegistryIpsConfig).
+		Where("docker_artifact_store_id = ?", dockerRegistryId).
+		Where("active = ?", true).
+		Limit(1).Select()
+	return &dockerRegistryIpsConfig, err
+}
+
+func (impl DockerRegistryIpsConfigRepositoryImpl) FindInActiveByDockerRegistryId(dockerRegistryId string) (*DockerRegistryIpsConfig, error) {
 	var dockerRegistryIpsConfig DockerRegistryIpsConfig
 	//added limit 1 for fasting querying
 	err := impl.dbConnection.Model(&dockerRegistryIpsConfig).
diff --git a/pkg/pipeline/DockerRegistryConfig.go b/pkg/pipeline/DockerRegistryConfig.go
index 82d376e63..09db91658 100644
--- a/pkg/pipeline/DockerRegistryConfig.go
+++ b/pkg/pipeline/DockerRegistryConfig.go
@@ -60,10 +60,10 @@ const (
 )
 
 type DockerArtifactStoreBean struct {
-	Id                      string                       `json:"id,omitempty" validate:"required"`
+	Id                      string                       `json:"id" validate:"required"`
 	PluginId                string                       `json:"pluginId,omitempty" validate:"required"`
-	RegistryURL             string                       `json:"registryUrl,omitempty"`
-	RegistryType            repository.RegistryType      `json:"registryType,omitempty" validate:"required"`
+	RegistryURL             string                       `json:"registryUrl" validate:"required"`
+	RegistryType            repository.RegistryType      `json:"registryType" validate:"required"`
 	IsOCICompliantRegistry  bool                         `json:"isOCICompliantRegistry"`
 	OCIRegistryConfig       map[string]string            `json:"ociRegistryConfig,omitempty"`
 	IsPublic                bool                         `json:"isPublic"`
@@ -79,7 +79,7 @@ type DockerArtifactStoreBean struct {
 	Active                  bool                         `json:"active"`
 	DisabledFields          []DisabledFields             `json:"disabledFields"`
 	User                    int32                        `json:"-"`
-	DockerRegistryIpsConfig *DockerRegistryIpsConfigBean `json:"ipsConfig,notnull,omitempty" validate:"required"`
+	DockerRegistryIpsConfig *DockerRegistryIpsConfigBean `json:"ipsConfig,omitempty"`
 }
 
 type DockerRegistryIpsConfigBean struct {
@@ -88,6 +88,7 @@ type DockerRegistryIpsConfigBean struct {
 	CredentialValue      string                                     `json:"credentialValue,omitempty"`
 	AppliedClusterIdsCsv string                                     `json:"appliedClusterIdsCsv,omitempty"`
 	IgnoredClusterIdsCsv string                                     `json:"ignoredClusterIdsCsv,omitempty"`
+	Active               bool                                       `json:"active,omitempty"`
 }
 
 type DockerRegistryConfigImpl struct {
@@ -357,7 +358,7 @@ func (impl DockerRegistryConfigImpl) Create(bean *DockerArtifactStoreBean) (*Doc
 		impl.logger.Infow("created OCI registry config successfully")
 	}
 
-	if !bean.IsPublic {
+	if !bean.IsPublic && bean.DockerRegistryIpsConfig != nil {
 		// 4- insert imagePullSecretConfig for this docker registry
 		dockerRegistryIpsConfig := bean.DockerRegistryIpsConfig
 		ipsConfig := &repository.DockerRegistryIpsConfig{
@@ -366,18 +367,12 @@ func (impl DockerRegistryConfigImpl) Create(bean *DockerArtifactStoreBean) (*Doc
 			CredentialValue:       dockerRegistryIpsConfig.CredentialValue,
 			AppliedClusterIdsCsv:  dockerRegistryIpsConfig.AppliedClusterIdsCsv,
 			IgnoredClusterIdsCsv:  dockerRegistryIpsConfig.IgnoredClusterIdsCsv,
+			Active:                true,
 		}
-		err = impl.dockerRegistryIpsConfigRepository.Save(ipsConfig, tx)
+		err = impl.createDockerIpConfig(tx, ipsConfig)
 		if err != nil {
-			impl.logger.Errorw("error in saving registry config ips", "ipsConfig", ipsConfig, "err", err)
-			err = &util.ApiError{
-				Code:            constants.DockerRegCreateFailedInDb,
-				InternalMessage: "docker registry ips config to create in db",
-				UserMessage:     fmt.Sprintf("Container registry [%s] already exists.", bean.Id),
-			}
 			return nil, err
 		}
-		impl.logger.Infow("created ips config for this docker repository", "ipsConfig", ipsConfig)
 		dockerRegistryIpsConfig.Id = ipsConfig.Id
 	}
 
@@ -453,6 +448,7 @@ func (impl DockerRegistryConfigImpl) FetchAllDockerAccounts() ([]DockerArtifactS
 				CredentialValue:      ipsConfig.CredentialValue,
 				AppliedClusterIdsCsv: ipsConfig.AppliedClusterIdsCsv,
 				IgnoredClusterIdsCsv: ipsConfig.IgnoredClusterIdsCsv,
+				Active:               ipsConfig.Active,
 			}
 		}
 		storeBeans = append(storeBeans, storeBean)
@@ -511,6 +507,7 @@ func (impl DockerRegistryConfigImpl) FetchOneDockerAccount(storeId string) (*Doc
 			CredentialValue:      ipsConfig.CredentialValue,
 			AppliedClusterIdsCsv: ipsConfig.AppliedClusterIdsCsv,
 			IgnoredClusterIdsCsv: ipsConfig.IgnoredClusterIdsCsv,
+			Active:               ipsConfig.Active,
 		}
 	}
 	return storeBean, err
@@ -560,8 +557,23 @@ func (impl DockerRegistryConfigImpl) Update(bean *DockerArtifactStoreBean) (*Doc
 			existingRepositoryList = strings.Split(ociRegistryConfig.RepositoryList, ",")
 		}
 	}
-	if len(bean.RepositoryList) == 0 {
-		bean.RepositoryList = existingRepositoryList
+	deployedChartList := make([]string, 0)
+	for _, repository := range existingRepositoryList {
+		if !slices.Contains(bean.RepositoryList, repository) {
+			chartDeploymentCount, err := impl.dockerArtifactStoreRepository.FindOneWithChartDeploymentCount(bean.Id, repository)
+			if err != nil && err != pg.ErrNoRows {
+				return nil, err
+			} else if chartDeploymentCount != nil && chartDeploymentCount.DeploymentCount > 0 {
+				deployedChartList = append(deployedChartList, chartDeploymentCount.OCIChartName)
+			}
+		}
+	}
+	if len(deployedChartList) > 0 {
+		err := &util.ApiError{
+			HttpStatusCode:  http.StatusConflict,
+			InternalMessage: fmt.Sprintf("%s chart(s) cannot be removed as they are being used by helm applications.", strings.Join(deployedChartList, ", ")),
+			UserMessage:     fmt.Sprintf("%s chart(s) cannot be removed as they are being used by helm applications.", strings.Join(deployedChartList, ", "))}
+		return nil, err
 	}
 
 	bean.PluginId = existingStore.PluginId
@@ -604,28 +616,48 @@ func (impl DockerRegistryConfigImpl) Update(bean *DockerArtifactStoreBean) (*Doc
 		impl.logger.Infow("updated OCI registry config successfully")
 	}
 
+	// 5- update imagePullSecretConfig for this docker registry
+	existingIpsConfig, err := impl.dockerRegistryIpsConfigRepository.FindByDockerRegistryId(store.Id)
 	if !bean.IsPublic && bean.DockerRegistryIpsConfig != nil {
-		// 5- update imagePullSecretConfig for this docker registry
 		dockerRegistryIpsConfig := bean.DockerRegistryIpsConfig
 		ipsConfig := &repository.DockerRegistryIpsConfig{
-			Id:                    dockerRegistryIpsConfig.Id,
 			DockerArtifactStoreId: store.Id,
 			CredentialType:        dockerRegistryIpsConfig.CredentialType,
 			CredentialValue:       dockerRegistryIpsConfig.CredentialValue,
 			AppliedClusterIdsCsv:  dockerRegistryIpsConfig.AppliedClusterIdsCsv,
 			IgnoredClusterIdsCsv:  dockerRegistryIpsConfig.IgnoredClusterIdsCsv,
+			Active:                true,
 		}
-		err = impl.dockerRegistryIpsConfigRepository.Update(ipsConfig, tx)
 		if err != nil {
-			impl.logger.Errorw("error in updating registry config ips", "ipsConfig", ipsConfig, "err", err)
-			err = &util.ApiError{
-				Code:            constants.DockerRegUpdateFailedInDb,
-				InternalMessage: "docker registry ips config failed to update in db",
-				UserMessage:     "docker registry ips config failed to update in db",
+			impl.logger.Errorw("Error while getting docker registry ips config", "dockerRegistryId", store.Id, "err", err)
+			// Create a new docker registry ips config
+			if err == pg.ErrNoRows {
+				err = impl.createDockerIpConfig(tx, ipsConfig)
+				if err != nil {
+					return nil, err
+				}
+			} else {
+				// Throw error
+				return nil, err
+			}
+		} else {
+			// Update the docker registry ips config
+			ipsConfig.Id = existingIpsConfig.Id
+			err = impl.updateDockerIpConfig(tx, existingIpsConfig)
+			if err != nil {
+				return nil, err
+			}
+		}
+		bean.DockerRegistryIpsConfig.Id = ipsConfig.Id
+	} else {
+		if err == nil {
+			// Update the docker registry ips config to inactive
+			existingIpsConfig.Active = false
+			err = impl.updateDockerIpConfig(tx, existingIpsConfig)
+			if err != nil {
+				return nil, err
 			}
-			return nil, err
 		}
-		impl.logger.Infow("updated ips config for this docker repository ", "ipsConfig", ipsConfig)
 	}
 
 	// 6- now commit transaction
@@ -638,6 +670,49 @@ func (impl DockerRegistryConfigImpl) Update(bean *DockerArtifactStoreBean) (*Doc
 	return bean, nil
 }
 
+func (impl DockerRegistryConfigImpl) updateDockerIpConfig(tx *pg.Tx, existingIpsConfig *repository.DockerRegistryIpsConfig) error {
+	err := impl.dockerRegistryIpsConfigRepository.Update(existingIpsConfig, tx)
+	if err != nil {
+		impl.logger.Errorw("error in updating registry config ips", "ipsConfig", existingIpsConfig, "err", err)
+		err = &util.ApiError{
+			Code:            constants.DockerRegUpdateFailedInDb,
+			InternalMessage: "docker registry ips config failed to update in db",
+			UserMessage:     "docker registry ips config failed to update in db",
+		}
+		return err
+	}
+	impl.logger.Infow("updated ips config for this docker repository ", "ipsConfig", existingIpsConfig)
+	return nil
+}
+
+func (impl DockerRegistryConfigImpl) createDockerIpConfig(tx *pg.Tx, ipsConfig *repository.DockerRegistryIpsConfig) error {
+	existingIpsConfig, err := impl.dockerRegistryIpsConfigRepository.FindInActiveByDockerRegistryId(ipsConfig.DockerArtifactStoreId)
+	if err != nil {
+		if err == pg.ErrNoRows {
+			err = impl.dockerRegistryIpsConfigRepository.Save(ipsConfig, tx)
+			if err != nil {
+				impl.logger.Errorw("error in saving registry config ips", "ipsConfig", ipsConfig, "err", err)
+				err = &util.ApiError{
+					Code:            constants.DockerRegCreateFailedInDb,
+					InternalMessage: "docker registry ips config to create in db",
+					UserMessage:     fmt.Sprintf("Container registry [%s] already exists.", ipsConfig.DockerArtifactStoreId),
+				}
+				return err
+			}
+			impl.logger.Infow("created ips config for this docker repository", "ipsConfig", ipsConfig)
+			return nil
+		} else {
+			return err
+		}
+	}
+	ipsConfig.Id = existingIpsConfig.Id
+	err = impl.updateDockerIpConfig(tx, ipsConfig)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 // UpdateInactive will update the existing soft deleted registry with the given DockerArtifactStoreBean instead of creating one
 func (impl DockerRegistryConfigImpl) UpdateInactive(bean *DockerArtifactStoreBean) (*DockerArtifactStoreBean, error) {
 	impl.logger.Debugw("docker registry update request", "request", bean)
@@ -697,24 +772,25 @@ func (impl DockerRegistryConfigImpl) UpdateInactive(bean *DockerArtifactStoreBea
 		// 5- update imagePullSecretConfig for this docker registry
 		dockerRegistryIpsConfig := bean.DockerRegistryIpsConfig
 		ipsConfig := &repository.DockerRegistryIpsConfig{
-			Id:                    existingStore.IpsConfig.Id,
 			DockerArtifactStoreId: store.Id,
 			CredentialType:        dockerRegistryIpsConfig.CredentialType,
 			CredentialValue:       dockerRegistryIpsConfig.CredentialValue,
 			AppliedClusterIdsCsv:  dockerRegistryIpsConfig.AppliedClusterIdsCsv,
 			IgnoredClusterIdsCsv:  dockerRegistryIpsConfig.IgnoredClusterIdsCsv,
+			Active:                true,
 		}
-		err = impl.dockerRegistryIpsConfigRepository.Update(ipsConfig, tx)
-		if err != nil {
-			impl.logger.Errorw("error in updating registry config ips", "ipsConfig", ipsConfig, "err", err)
-			err = &util.ApiError{
-				Code:            constants.DockerRegUpdateFailedInDb,
-				InternalMessage: "docker registry ips config failed to update in db",
-				UserMessage:     "docker registry ips config failed to update in db",
+		if existingStore.IpsConfig != nil {
+			ipsConfig.Id = existingStore.IpsConfig.Id
+			err = impl.updateDockerIpConfig(tx, ipsConfig)
+			if err != nil {
+				return nil, err
+			}
+		} else {
+			err = impl.createDockerIpConfig(tx, ipsConfig)
+			if err != nil {
+				return nil, err
 			}
-			return nil, err
 		}
-		impl.logger.Infow("updated ips config for this docker repository ", "ipsConfig", ipsConfig)
 	}
 
 	// 6- now commit transaction
diff --git a/scripts/sql/162_virtual_cluster_v3.down.sql b/scripts/sql/162_virtual_cluster_v3.down.sql
index 17cd32eb8..5512dfffc 100644
--- a/scripts/sql/162_virtual_cluster_v3.down.sql
+++ b/scripts/sql/162_virtual_cluster_v3.down.sql
@@ -20,4 +20,9 @@ ALTER TABLE ONLY public.app_store
 ALTER TABLE public.oci_registry_config
     DROP COLUMN IF EXISTS repository_list,
     DROP COLUMN IF EXISTS is_chart_pull_active,
-    DROP COLUMN IF EXISTS is_public;
\ No newline at end of file
+    DROP COLUMN IF EXISTS is_public;
+
+-- docker_registry_ips_config modifications
+-- Step 1: Drop active column
+ALTER TABLE public.docker_registry_ips_config
+    DROP COLUMN IF EXISTS active;
\ No newline at end of file
diff --git a/scripts/sql/162_virtual_cluster_v3.up.sql b/scripts/sql/162_virtual_cluster_v3.up.sql
index 466f7647d..bd7c517a5 100644
--- a/scripts/sql/162_virtual_cluster_v3.up.sql
+++ b/scripts/sql/162_virtual_cluster_v3.up.sql
@@ -22,4 +22,16 @@ ALTER TABLE public.app_store
 ALTER TABLE public.oci_registry_config
     ADD COLUMN IF NOT EXISTS repository_list text,
     ADD COLUMN IF NOT EXISTS is_chart_pull_active bool,
-    ADD COLUMN IF NOT EXISTS is_public bool DEFAULT FALSE;
\ No newline at end of file
+    ADD COLUMN IF NOT EXISTS is_public bool DEFAULT FALSE;
+
+-- docker_registry_ips_config modifications
+-- Step 1: Add active column
+ALTER TABLE public.docker_registry_ips_config
+    ADD COLUMN IF NOT EXISTS active bool DEFAULT TRUE;
+
+-- Migration Script
+BEGIN
+INSERT INTO public.oci_registry_config ("docker_artifact_store_id", "repository_type", "repository_action","created_on", "created_by", "updated_on", "updated_by","deleted")
+    SELECT id, 'CONTAINER', 'PULL/PUSH', 'now()', 1, 'now()', 1, 'f' from docker_artifact_store WHERE registry_type IS NOT 'gcr'AND is_oci_compliant_registry IS FALSE;
+UPDATE docker_artifact_store set is_oci_compliant_registry = TRUE WHERE registry_type IS NOT 'gcr';
+END
\ No newline at end of file


Test patch:
diff --git a/pkg/pipeline/DockerRegistryConfig_test.go b/pkg/pipeline/DockerRegistryConfig_test.go
index 79ca14f33..37d6d82bf 100644
--- a/pkg/pipeline/DockerRegistryConfig_test.go
+++ b/pkg/pipeline/DockerRegistryConfig_test.go
@@ -1,7 +1,12 @@
 package pipeline
 
 import (
+	"context"
+	"fmt"
+	client "github.com/devtron-labs/devtron/api/helm-app"
+	"github.com/devtron-labs/devtron/api/helm-app/mocks"
 	repository "github.com/devtron-labs/devtron/internal/sql/repository/dockerRegistry"
+	"github.com/devtron-labs/devtron/pkg/dockerRegistry"
 	"log"
 	"testing"
 
@@ -21,9 +26,29 @@ type Config struct {
 }
 
 var (
-	dockerRegistryConfig *DockerRegistryConfigImpl
-	validInputForSaving  = &DockerArtifactStoreBean{
-		Id:                     "integration-test-store-1",
+	dockerRegistryConfig          *DockerRegistryConfigImpl
+	dockerArtifactStoreRepository *repository.DockerArtifactStoreRepositoryImpl
+	helmAppServiceMock            *mocks.HelmAppService
+	storeIds                      = []string{"integration-test-store-1", "integration-test-store-2", "integration-test-store-3"}
+	validInput1                   = DockerArtifactStoreBean{
+		Id:                     storeIds[0],
+		PluginId:               "cd.go.artifact.docker.registry",
+		RegistryType:           "docker-hub",
+		IsDefault:              true,
+		RegistryURL:            "docker.io",
+		Username:               "test-user",
+		Password:               "test-password",
+		IsOCICompliantRegistry: false,
+		DockerRegistryIpsConfig: &DockerRegistryIpsConfigBean{
+			Id:                   0,
+			CredentialType:       dockerRegistry.IPS_CREDENTIAL_TYPE_SAME_AS_REGISTRY,
+			AppliedClusterIdsCsv: "",
+			IgnoredClusterIdsCsv: "-1",
+			Active:               true,
+		},
+	}
+	validInput2 = DockerArtifactStoreBean{
+		Id:                     storeIds[1],
 		PluginId:               "cd.go.artifact.docker.registry",
 		RegistryType:           "docker-hub",
 		IsDefault:              true,
@@ -35,89 +60,203 @@ var (
 			"CHART":     "PULL/PUSH",
 			"CONTAINER": "PULL/PUSH",
 		},
+		IsPublic:       false,
+		RepositoryList: []string{"username/test", "username/chart"},
 		DockerRegistryIpsConfig: &DockerRegistryIpsConfigBean{
 			Id:                   0,
-			CredentialType:       "SAME_AS_REGISTRY",
+			CredentialType:       dockerRegistry.IPS_CREDENTIAL_TYPE_SAME_AS_REGISTRY,
 			AppliedClusterIdsCsv: "",
 			IgnoredClusterIdsCsv: "-1",
+			Active:               true,
+		},
+	}
+	validInput3 = DockerArtifactStoreBean{
+		Id:                     storeIds[2],
+		PluginId:               "cd.go.artifact.docker.registry",
+		RegistryType:           "docker-hub",
+		RegistryURL:            "docker.io",
+		IsOCICompliantRegistry: true,
+		OCIRegistryConfig: map[string]string{
+			"CHART": "PULL",
 		},
+		IsPublic: true,
 	}
 )
 
 func TestRegistryConfigService_Save(t *testing.T) {
 	t.SkipNow()
 	if dockerRegistryConfig == nil {
-		InitDockerRegistryConfig()
+		InitDockerRegistryConfig(t)
 	}
 	testCases := []struct {
 		name        string
-		input       *DockerArtifactStoreBean
+		input       DockerArtifactStoreBean
 		expectedErr bool
 	}{
 		{
-			name:        "TEST : successfully save the registry",
-			input:       validInputForSaving,
+			name:        "TEST1 : successfully save the registry",
+			input:       validInput1,
 			expectedErr: false,
-		},
-		{
-			name:        "TEST : error while saving the registry, record already exists",
-			input:       validInputForSaving,
+		}, {
+			name:        "TEST2 : successfully save the registry",
+			input:       validInput2,
+			expectedErr: false,
+		}, {
+			name:        "TEST3 : successfully save the registry",
+			input:       validInput3,
+			expectedErr: false,
+		}, {
+			name:        "TEST4 : error while saving the registry, record already exists",
+			input:       validInput1,
 			expectedErr: true,
 		},
 	}
-
+	//clean data in db
+	t.Cleanup(cleanDb)
 	for _, tc := range testCases {
 		t.Run(tc.name, func(tt *testing.T) {
 			tc.input.User = 1
-			res, err := dockerRegistryConfig.Create(tc.input)
+			res, err := dockerRegistryConfig.Create(&tc.input)
 			if tc.expectedErr {
 				assert.NotNil(tt, err)
 			} else {
+				store, err := dockerRegistryConfig.FetchOneDockerAccount(tc.input.Id)
+				if err != nil {
+					t.Fatalf("Error inserting record in database: %s", err.Error())
+				}
 				assert.Nil(tt, err)
-				assert.Equal(tt, res.Id, "integration-test-store-1")
-				assert.True(tt, res.IsOCICompliantRegistry)
-				assert.Equal(tt, res.OCIRegistryConfig["CONTAINER"], "PULL/PUSH")
-				assert.Equal(tt, res.OCIRegistryConfig["CHART"], "PULL/PUSH")
-				assert.Equal(tt, res.DockerRegistryIpsConfig.CredentialType, repository.DockerRegistryIpsCredentialType("SAME_AS_REGISTRY"))
+				assert.Equal(tt, tc.input.Id, res.Id)
+				assert.Equal(tt, tc.input.Id, store.Id)
+				assert.Equal(tt, tc.input.IsPublic, res.IsPublic)
+				assert.Equal(tt, tc.input.IsPublic, store.IsPublic)
+				assert.Equal(tt, tc.input.IsOCICompliantRegistry, res.IsOCICompliantRegistry)
+				assert.Equal(tt, tc.input.IsOCICompliantRegistry, store.IsOCICompliantRegistry)
+				if tc.input.OCIRegistryConfig != nil {
+					if _, inputStorageActionExists := res.OCIRegistryConfig["CONTAINER"]; !inputStorageActionExists {
+						_, containerStorageActionExists := res.OCIRegistryConfig["CONTAINER"]
+						assert.False(tt, containerStorageActionExists)
+						_, containerStorageActionExists = store.OCIRegistryConfig["CONTAINER"]
+						assert.False(tt, containerStorageActionExists)
+					} else {
+						assert.Equal(tt, tc.input.OCIRegistryConfig["CONTAINER"], res.OCIRegistryConfig["CONTAINER"])
+						assert.Equal(tt, tc.input.OCIRegistryConfig["CONTAINER"], store.OCIRegistryConfig["CONTAINER"])
+					}
+
+					if _, inputStorageActionExists := res.OCIRegistryConfig["CHART"]; !inputStorageActionExists {
+						_, chartStorageActionExists := res.OCIRegistryConfig["CHART"]
+						assert.False(tt, chartStorageActionExists)
+						_, chartStorageActionExists = store.OCIRegistryConfig["CHART"]
+						assert.False(tt, chartStorageActionExists)
+					} else {
+						assert.Equal(tt, tc.input.OCIRegistryConfig["CHART"], res.OCIRegistryConfig["CHART"])
+						assert.Equal(tt, tc.input.OCIRegistryConfig["CHART"], store.OCIRegistryConfig["CHART"])
+					}
+				}
+				if tc.input.DockerRegistryIpsConfig != nil {
+					assert.NotZero(tt, res.DockerRegistryIpsConfig.Id)
+					assert.NotZero(tt, store.DockerRegistryIpsConfig.Id)
+					assert.Equal(tt, res.DockerRegistryIpsConfig.Id, store.DockerRegistryIpsConfig.Id)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.CredentialType, res.DockerRegistryIpsConfig.CredentialType)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.CredentialType, store.DockerRegistryIpsConfig.CredentialType)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.CredentialValue, res.DockerRegistryIpsConfig.CredentialValue)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.CredentialValue, store.DockerRegistryIpsConfig.CredentialValue)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.AppliedClusterIdsCsv, res.DockerRegistryIpsConfig.AppliedClusterIdsCsv)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.AppliedClusterIdsCsv, store.DockerRegistryIpsConfig.AppliedClusterIdsCsv)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.IgnoredClusterIdsCsv, res.DockerRegistryIpsConfig.IgnoredClusterIdsCsv)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.IgnoredClusterIdsCsv, store.DockerRegistryIpsConfig.IgnoredClusterIdsCsv)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.Active, res.DockerRegistryIpsConfig.Active)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.Active, store.DockerRegistryIpsConfig.Active)
+				}
 			}
 		})
 	}
-	//clean data in db
-	cleanDb(t)
+	t.Run(fmt.Sprintf("TEST%v : successfully fetch all chart providers", len(testCases)+1), func(t *testing.T) {
+		list := make([]string, 0)
+		for _, testcase := range testCases {
+			if !testcase.expectedErr {
+				chartConfig, chartConfigExists := testcase.input.OCIRegistryConfig["CHART"]
+				if testcase.input.IsOCICompliantRegistry && chartConfigExists && chartConfig == "PUSH" {
+					continue
+				}
+				list = append(list, testcase.input.Id)
+			}
+		}
+		providerList := make([]string, 0)
+		chartProviders, err := dockerArtifactStoreRepository.FindAllChartProviders()
+		for _, provider := range chartProviders {
+			providerList = append(providerList, provider.Id)
+		}
+		assert.Nil(t, err)
+		for _, registry := range list {
+			assert.Contains(t, providerList, registry)
+		}
+	})
 }
 
 func TestRegistryConfigService_Update(t *testing.T) {
 	t.SkipNow()
 	if dockerRegistryConfig == nil {
-		InitDockerRegistryConfig()
+		InitDockerRegistryConfig(t)
 	}
+	//clean data in db
+	t.Cleanup(cleanDb)
+
 	// insert a cluster note in the database which will be updated later
-	validInputForSaving.User = 1
-	savedRegisrty, err := dockerRegistryConfig.Create(validInputForSaving)
+	updateRgistry1 := validInput2
+	updateRgistry1.User = 1
+
+	updateRgistry3 := validInput2
+	updateRgistry3.User = 1
+
+	updateRgistry5 := validInput2
+	updateRgistry5.User = 1
+
+	savedRegisrty, err := dockerRegistryConfig.Create(&updateRgistry1)
 	if err != nil {
 		t.Fatalf("Error inserting record in database: %s", err.Error())
 	}
-	delete(savedRegisrty.OCIRegistryConfig, "CHART")
+	assert.Equal(t, updateRgistry1.OCIRegistryConfig["CONTAINER"], savedRegisrty.OCIRegistryConfig["CONTAINER"])
+	assert.Equal(t, updateRgistry1.OCIRegistryConfig["CHART"], savedRegisrty.OCIRegistryConfig["CHART"])
+
+	updateRgistry2 := *savedRegisrty
+	updateRgistry2.User = 1
+	updateRgistry2.OCIRegistryConfig = map[string]string{
+		"CONTAINER": "PULL/PUSH",
+	}
+	updateRgistry1.RepositoryList = make([]string, 0)
+
+	updateRgistry4 := *savedRegisrty
+	updateRgistry4.User = 1
+	updateRgistry4.OCIRegistryConfig = map[string]string{
+		"CHART": "PULL/PUSH",
+	}
+	updateRgistry4.DockerRegistryIpsConfig = nil
+
 	// define input for update function
 	testCases := []struct {
 		name        string
-		input       *DockerArtifactStoreBean
+		input       DockerArtifactStoreBean
 		expectedErr bool
 	}{
 		{
-			name: "TEST : error while updating a non-existing registry",
-			input: &DockerArtifactStoreBean{
-				Id:           "non-existing-registry",
-				PluginId:     "cd.go.artifact.docker.registry",
-				RegistryType: "docker-hub",
-				IsDefault:    true,
-				RegistryURL:  "docker.io",
-			},
+			name:        "TEST1 : error while updating a non-existing registry",
+			input:       validInput1,
 			expectedErr: true,
-		},
-		{
-			name:        "TEST : successfully update the note",
-			input:       savedRegisrty,
+		}, {
+			name:        "TEST2 : successfully update the note",
+			input:       updateRgistry2,
+			expectedErr: false,
+		}, {
+			name:        "TEST3 : successfully update the note",
+			input:       updateRgistry3,
+			expectedErr: false,
+		}, {
+			name:        "TEST4 : successfully update the note",
+			input:       updateRgistry4,
+			expectedErr: false,
+		}, {
+			name:        "TEST5 : successfully update the note",
+			input:       updateRgistry5,
 			expectedErr: false,
 		},
 	}
@@ -125,25 +264,85 @@ func TestRegistryConfigService_Update(t *testing.T) {
 	for _, tc := range testCases {
 		t.Run(tc.name, func(tt *testing.T) {
 			tc.input.User = 1
-			res, err := dockerRegistryConfig.Update(tc.input)
+			// Set expectations for the mock method call
+			helmAppServiceMock.On("ValidateOCIRegistry", context.Background(), &client.RegistryCredential{
+				RegistryUrl:  tc.input.RegistryURL,
+				Username:     tc.input.Username,
+				Password:     tc.input.Password,
+				AwsRegion:    tc.input.AWSRegion,
+				AccessKey:    tc.input.AWSAccessKeyId,
+				SecretKey:    tc.input.AWSSecretAccessKey,
+				RegistryType: string(tc.input.RegistryType),
+				IsPublic:     tc.input.IsPublic,
+			}).Return(true)
+			res, err := dockerRegistryConfig.Update(&tc.input)
 			if tc.expectedErr {
 				assert.NotNil(tt, err)
 			} else {
+				store, err := dockerRegistryConfig.FetchOneDockerAccount(validInput2.Id)
+				if err != nil {
+					t.Fatalf("Error fetching record from database: %s", err.Error())
+				}
 				assert.Nil(tt, err)
-				assert.Equal(tt, res.Id, "integration-test-store-1")
-				assert.Equal(tt, res.OCIRegistryConfig["CONTAINER"], "PULL/PUSH")
-				_, containerStorageActionExists := res.OCIRegistryConfig["CHART"]
-				assert.False(tt, containerStorageActionExists)
+				assert.Equal(tt, res.Id, tc.input.Id)
+				assert.Equal(tt, store.Id, tc.input.Id)
+				assert.Equal(tt, res.IsPublic, tc.input.IsPublic)
+				assert.Equal(tt, store.IsPublic, tc.input.IsPublic)
+				assert.Equal(tt, tc.input.IsOCICompliantRegistry, res.IsOCICompliantRegistry)
+				assert.Equal(tt, tc.input.IsOCICompliantRegistry, store.IsOCICompliantRegistry)
+				if tc.input.OCIRegistryConfig != nil {
+					if _, inputStorageActionExists := res.OCIRegistryConfig["CONTAINER"]; !inputStorageActionExists {
+						_, containerStorageActionExists := res.OCIRegistryConfig["CONTAINER"]
+						assert.False(tt, containerStorageActionExists)
+						_, containerStorageActionExists = store.OCIRegistryConfig["CONTAINER"]
+						assert.False(tt, containerStorageActionExists)
+					} else {
+						assert.Equal(tt, tc.input.OCIRegistryConfig["CONTAINER"], res.OCIRegistryConfig["CONTAINER"])
+						assert.Equal(tt, tc.input.OCIRegistryConfig["CONTAINER"], store.OCIRegistryConfig["CONTAINER"])
+					}
+
+					if _, inputStorageActionExists := res.OCIRegistryConfig["CHART"]; !inputStorageActionExists {
+						_, chartStorageActionExists := res.OCIRegistryConfig["CHART"]
+						assert.False(tt, chartStorageActionExists)
+						_, chartStorageActionExists = store.OCIRegistryConfig["CHART"]
+						assert.False(tt, chartStorageActionExists)
+					} else {
+						assert.Equal(tt, tc.input.OCIRegistryConfig["CHART"], res.OCIRegistryConfig["CHART"])
+						assert.Equal(tt, tc.input.OCIRegistryConfig["CHART"], store.OCIRegistryConfig["CHART"])
+					}
+				} else {
+					assert.Nil(tt, res.OCIRegistryConfig)
+					assert.Nil(tt, store.OCIRegistryConfig)
+				}
+				if tc.input.DockerRegistryIpsConfig != nil {
+					assert.NotZero(tt, res.DockerRegistryIpsConfig.Id)
+					assert.NotZero(tt, store.DockerRegistryIpsConfig.Id)
+					assert.Equal(tt, res.DockerRegistryIpsConfig.Id, store.DockerRegistryIpsConfig.Id)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.CredentialType, res.DockerRegistryIpsConfig.CredentialType)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.CredentialType, store.DockerRegistryIpsConfig.CredentialType)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.CredentialValue, res.DockerRegistryIpsConfig.CredentialValue)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.CredentialValue, store.DockerRegistryIpsConfig.CredentialValue)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.AppliedClusterIdsCsv, res.DockerRegistryIpsConfig.AppliedClusterIdsCsv)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.AppliedClusterIdsCsv, store.DockerRegistryIpsConfig.AppliedClusterIdsCsv)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.IgnoredClusterIdsCsv, res.DockerRegistryIpsConfig.IgnoredClusterIdsCsv)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.IgnoredClusterIdsCsv, store.DockerRegistryIpsConfig.IgnoredClusterIdsCsv)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.Active, res.DockerRegistryIpsConfig.Active)
+					assert.Equal(tt, tc.input.DockerRegistryIpsConfig.Active, store.DockerRegistryIpsConfig.Active)
+				} else {
+					assert.Nil(tt, res.DockerRegistryIpsConfig)
+					assert.Nil(tt, store.DockerRegistryIpsConfig)
+				}
 			}
 		})
 	}
-
-	//clean data in db
-	cleanDb(t)
 }
 
 var db *pg.DB
 
+func captureQuery(event *pg.QueryProcessedEvent) {
+	fmt.Println(event.FormattedQuery())
+}
+
 func getDbConn() (*pg.DB, error) {
 	if db != nil {
 		return db, nil
@@ -160,23 +359,26 @@ func getDbConn() (*pg.DB, error) {
 		Database: cfg.Database,
 	}
 	db = pg.Connect(&options)
+
+	// Add the query event listener to capture SQL queries.
+	db.OnQueryProcessed(captureQuery)
+
 	return db, nil
 }
 
-func cleanDb(tt *testing.T) {
+func cleanDb() {
+	log.Println("Cleaning Up...")
 	DB, _ := getDbConn()
-
-	query := "DELETE FROM oci_registry_config WHERE docker_artifact_store_id = ?;\n" +
-		"DELETE FROM docker_registry_ips_config WHERE docker_artifact_store_id = ?;\n" +
-		"DELETE FROM docker_artifact_store WHERE id = ?;\n"
-	_, err := DB.Exec(query, "integration-test-store-1", "integration-test-store-1", "integration-test-store-1")
-	assert.Nil(tt, err)
+	query := "DELETE FROM oci_registry_config WHERE docker_artifact_store_id IN (?) ;\n" +
+		"DELETE FROM docker_registry_ips_config WHERE docker_artifact_store_id IN (?) ;\n" +
+		"DELETE FROM docker_artifact_store WHERE id IN (?) ;\n"
+	_, err := DB.Query(nil, query, pg.In(storeIds), pg.In(storeIds), pg.In(storeIds))
 	if err != nil {
 		return
 	}
 }
 
-func InitDockerRegistryConfig() {
+func InitDockerRegistryConfig(t *testing.T) {
 	if dockerRegistryConfig != nil {
 		return
 	}
@@ -189,8 +391,10 @@ func InitDockerRegistryConfig() {
 		log.Fatalf("error in db connection initialization %s, %s", "err", err)
 	}
 
-	dockerArtifactStoreRepository := repository.NewDockerArtifactStoreRepositoryImpl(conn)
+	dockerArtifactStoreRepository = repository.NewDockerArtifactStoreRepositoryImpl(conn)
 	dockerRegistryIpsConfigRepository := repository.NewDockerRegistryIpsConfigRepositoryImpl(conn)
 	ociRegistryConfigRepository := repository.NewOCIRegistryConfigRepositoryImpl(conn)
-	dockerRegistryConfig = NewDockerRegistryConfigImpl(logger, nil, dockerArtifactStoreRepository, dockerRegistryIpsConfigRepository, ociRegistryConfigRepository)
+	//Mock helm service
+	helmAppServiceMock = mocks.NewHelmAppService(t)
+	dockerRegistryConfig = NewDockerRegistryConfigImpl(logger, helmAppServiceMock, dockerArtifactStoreRepository, dockerRegistryIpsConfigRepository, ociRegistryConfigRepository)
 }