Repository: chef/automate
Pull request #7901 (2023-05-22 06:06:17)

Added api for system resource for deployment
### :nut_and_bolt: Description: What code changed, and why?

<!-- /!\ Please ensure that you are NOT disclosing any customer information without their consent /!\ -->

### :chains: Related Resources
https://chefio.atlassian.net/browse/CHEF-2056

### :+1: Definition of Done

### :athletic_shoe: How to Build and Test the Change

### :white_check_mark: Checklist

**All PRs** must tick these:

- [X] I have read the [CONTRIBUTING document](https://github.com/chef/automate/blob/master/CONTRIBUTING.md).
- [X] All commits signed-off for the [Developer Certification of Origin](https://github.com/chef/chef/blob/master/CONTRIBUTING.md#developer-certification-of-origin-dco).

With occasional exceptions, all PRs **from Progress employees** must tick these:

- [ ] Is the code clear? *(complicated code or lots of comments--subdivide and use well-named methods, meaningful variable names, etc.)*
- [ ] Consistency checked? *(user notifications, user prompts, visual patterns, code patterns, variable names)*
- [ ] Repeated code blocks eliminated? *(adapt and reuse existing components, blocks, functions, etc.)*
- [ ] Spelling, grammar, typos checked? *(at a minimum use `make spell` in any component directory)*
- [ ] Code well-formatted? *(indents, line breaks, etc. improve rather than hinder readability)*

All PRs **from Progress employees** should tick these if appropriate:

- [ ] Tests added/updated? (all new code needs new tests)
- [ ] Docs added/updated? (all customer-facing changes)

*Please add a note next to any checkbox above if you are NOT ticking it.*

### :camera: Screenshots, if applicable
https://progresssoftware.sharepoint.com/:i:/s/ChefCoreC/ETn0l558VfxAtxce5nUrxFwBks8Tmeh5fLc6W257YbA1kA?e=55X34W

https://progresssoftware.sharepoint.com/:i:/s/ChefCoreC/EaU3ZrDH2mRHlmJJWYzOZdkBA2H_yvC6hqe3cOgDVY6XsQ?e=V1E99H

https://progresssoftware.sharepoint.com/:i:/s/ChefCoreC/ERpTnS1zmxtMg1rNwJuIVmgBSsQp0XhBlTYBjoDe2qBDYg?e=dVYvaD

https://progresssoftware.sharepoint.com/:i:/s/ChefCoreC/EdrL8uMlnWFOpPQtZljKdsMBEhzXRnJp9d4eSzLn1DnaCw?e=NhUCyJ

short demo video
https://progresssoftware.sharepoint.com/:v:/s/ChefCoreC/EcN3Yz58H29KldAsTfz2z4IB9Vae5P_vlYxwFcCoEhtl5w?e=TlwzhL


netlify[bot]: ### <span aria-hidden="true">👷</span> Deploy Preview for *chef-automate* processing.


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 1dcef07fb456185683b114d7ed81968cdc530e66 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/chef-automate/deploys/646b065b8139170008246b26 |
sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![59.5%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/50-16px.png '59.5%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 59.5% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![64.1%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '64.1%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 64.1% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![68.5%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '68.5%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 68.5% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![68.5%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '68.5%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 68.5% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![81.3%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '81.3%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [81.3% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/0-16px.png '0.0%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 0.0% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/0-16px.png '0.0%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 0.0% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![80.5%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '80.5%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [80.5% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![80.3%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '80.3%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [80.3% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![80.3%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '80.3%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [80.3% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/0-16px.png '0.0%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 0.0% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/0-16px.png '0.0%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 0.0% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/0-16px.png '0.0%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 0.0% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![79.6%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '79.6%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 79.6% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![79.6%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '79.6%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 79.6% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate failed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/failed-16px.png 'Quality Gate failed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Failed condition](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/FailedConditionIcon-16px.png 'Failed condition')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![79.6%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '79.6%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) 79.6% Coverage on New Code (is less than 80%)  

[See analysis details on SonarQube](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![86.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '86.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [86.0% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![88.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '88.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [88.0% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![88.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '88.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [88.0% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![92.1%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/90-16px.png '92.1%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [92.1% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![92.1%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/90-16px.png '92.1%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [92.1% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![92.6%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/90-16px.png '92.6%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [92.6% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)


sonarqube-for-infrastructure-prod[bot]: **SonarQube Quality Gate**

[![Quality Gate passed](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/QualityGateBadge/passed-16px.png 'Quality Gate passed')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)

[![Bug](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/bug-16px.png 'Bug')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=BUG)  
[![Vulnerability](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/vulnerability-16px.png 'Vulnerability')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=VULNERABILITY)  
[![Security Hotspot](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/security_hotspot-16px.png 'Security Hotspot')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901)  
[![Code Smell](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/common/code_smell-16px.png 'Code Smell')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [![A](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/RatingBadge/A-16px.png 'A')](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&resolved=false&types=CODE_SMELL)

[![85.3%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '85.3%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list) [85.3% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_coverage&view=list)  
[![0.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/3-16px.png '0.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7901&metric=new_duplicated_lines_density&view=list)



Patch:
diff --git a/.bldr.toml b/.bldr.toml
index 29319dd3d..a6f81d5a6 100644
--- a/.bldr.toml
+++ b/.bldr.toml
@@ -458,6 +458,7 @@ paths = [
   "lib/reporting/*",
   "lib/secrets/*",
   "lib/stringutils/*",
+  "lib/systemresource/*",
   "lib/tls/*",
   "lib/tracing/*",
   "lib/user/*",
diff --git a/VERSION b/VERSION
index 7568d2105..9477e85ba 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-4.7.31
\ No newline at end of file
+4.7.32
\ No newline at end of file
diff --git a/components/automate-cli/cmd/chef-automate/initConfigHaTmpl.go b/components/automate-cli/cmd/chef-automate/initConfigHaTmpl.go
index 532fee0e6..913794a2f 100644
--- a/components/automate-cli/cmd/chef-automate/initConfigHaTmpl.go
+++ b/components/automate-cli/cmd/chef-automate/initConfigHaTmpl.go
@@ -65,10 +65,13 @@ config_file = "configs/automate.toml"
 
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add Automate load balancer root-ca and keys
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+
+# Add Automate Load Balancer root-ca
+# root_ca = """root_ca_contents"""
+
+# Add Automate node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 
 [chef_server.config]
@@ -79,9 +82,10 @@ instance_count = ""
 
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add Chef Server load balancer root-ca and keys
-# private_key = ""
-# public_key = ""
+
+# Add Chef Server node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 ## === ===
 
@@ -94,12 +98,13 @@ instance_count = ""
 
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add OpenSearch load balancer root-ca and keys
-# root_ca = ""
-# admin_key = ""
-# admin_cert = ""
-# private_key = ""
-# public_key = ""
+
+# Add OpenSearch root-ca and keys
+# root_ca = """root_ca_contents"""
+# admin_key = """admin_private_key_contents"""
+# admin_cert = """admin_public_key_contents"""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 ## === ===
 
@@ -111,10 +116,11 @@ instance_count = ""
 
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add Postgresql load balancer root-ca and keys
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+
+# Add Postgresql root-ca and keys
+# root_ca = """root_ca_contents"""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 ## === ===
 
@@ -368,14 +374,18 @@ config_file = "configs/automate.toml"
 
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add Automate load balancer root-ca and keys
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+
+# Add Automate Load Balancer root-ca
+# root_ca = """root_ca_contents"""
+
+# Add Automate node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
+
 # [[automate.config.certs_by_ip]]
 # ip = ""
-# private_key = ""
-# public_key = ""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 [chef_server.config]
 ## === INPUT NEEDED ===
@@ -385,13 +395,15 @@ instance_count = ""
 
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add Chef Server load balancer root-ca and keys
-# private_key = ""
-# public_key = ""
+
+# Add Chef Server node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
+
 # [[chef_server.config.certs_by_ip]]
 # ip = ""
-# private_key = ""
-# public_key = ""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 ## === ===
 
@@ -403,16 +415,16 @@ instance_count = ""
 
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add OpenSearch load balancer root-ca and keys
-# root_ca = ""
-# admin_key = ""
-# admin_cert = ""
-# private_key = ""
-# public_key = ""
+# Add OpenSearch root-ca and keys
+# root_ca = """root_ca_contents"""
+# admin_key = """admin_private_key_contents"""
+# admin_cert = """admin_public_key_contents"""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 # [[opensearch.config.certs_by_ip]]
 # ip = ""
-# private_key = ""
-# public_key = ""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 ## === ===
 
@@ -424,14 +436,14 @@ instance_count = ""
 
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add postgresql load balancer root-ca and keys
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+# Add postgresql root-ca and keys
+# root_ca = """root_ca_contents"""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 # [[postgresql.config.certs_by_ip]]
 # ip = ""
-# private_key = ""
-# public_key = ""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 ## === ===
 
diff --git a/components/automate-cli/pkg/verifyserver/constants/deploymenttypes.go b/components/automate-cli/pkg/verifyserver/constants/deploymenttypes.go
new file mode 100644
index 000000000..2111332ef
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/constants/deploymenttypes.go
@@ -0,0 +1,6 @@
+package constants
+
+const (
+	PRE_DEPLOY  = "pre-deploy"
+	POST_DEPLOY = "post-deploy"
+)
diff --git a/components/automate-cli/pkg/verifyserver/constants/systemresourcesfordepconstants.go b/components/automate-cli/pkg/verifyserver/constants/systemresourcesfordepconstants.go
new file mode 100644
index 000000000..4d5456853
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/constants/systemresourcesfordepconstants.go
@@ -0,0 +1,46 @@
+package constants
+
+const (
+	MIN_CPU_COUNT = 4
+	MIN_CPU_SPEED = 2.0
+	MIN_MEMORY    = 14
+
+	HAB_FREE_DISK_BEFORE_DEP_A2      = 80
+	HAB_FREE_DISK_BEFORE_DEP_CS      = 80
+	HAB_FREE_DISK_BEFORE_DEP_PG      = 150
+	HAB_FREE_DISK_BEFORE_DEP_OS      = 150
+	HAB_FREE_DISK_BEFORE_DEP_BASTION = 150
+
+	HAB_FREE_DISK_AFTER_DEP_A2      = 10
+	HAB_FREE_DISK_AFTER_DEP_CS      = 10
+	HAB_FREE_DISK_AFTER_DEP_PG      = 50
+	HAB_FREE_DISK_AFTER_DEP_OS      = 50
+	HAB_FREE_DISK_AFTER_DEP_BASTION = 30
+
+	HAB_FREE_DISK_AFTER_DEP_A2_IN_PER      = 0.05
+	HAB_FREE_DISK_AFTER_DEP_CS_IN_PER      = 0.05
+	HAB_FREE_DISK_AFTER_DEP_PG_IN_PER      = 0.15
+	HAB_FREE_DISK_AFTER_DEP_OS_IN_PER      = 0.15
+	HAB_FREE_DISK_AFTER_DEP_BASTION_IN_PER = 0.15
+
+	TMP_FREE_DISK_IN_GB  = 10
+	TMP_FREE_DISK_IN_PER = 0.05
+
+	ROOT_FREE_DISK_IN_GB  = 20
+	ROOT_FREE_DISK_IN_PER = 0.20
+
+	GB_TO_BYTES = 1024 * 1024 * 1024
+)
+
+const (
+	CPU_COUNT_CHECK_TITLE   = "CPU count check"
+	CPU_SPEED_CHECK_TITLE   = "CPU speed check"
+	MEMORY_SIZE_CHECK_TITLE = "Memory size check"
+	FREE_SPACE_CHECK        = "%s free space check"
+
+	SUCCESS_MSG        = "%s should have free space >=%vGB"
+	ERROR_MSG          = "%s free space is %0.2fGB"
+	SUCCESS_MSG_IN_PER = " or %v%% of total size of /hab"
+
+	RESOLUTION_MSG = "Please run system on supported platform"
+)
diff --git a/components/automate-cli/pkg/verifyserver/enums/deploymentState.go b/components/automate-cli/pkg/verifyserver/enums/deploymentState.go
new file mode 100644
index 000000000..85edb1fe8
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/enums/deploymentState.go
@@ -0,0 +1,40 @@
+package enums
+
+import (
+	"errors"
+
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
+)
+
+type DeploymentState string
+
+const (
+	DeploymentStatePreDeploy  DeploymentState = constants.PRE_DEPLOY
+	DeploymentStatePostDeploy DeploymentState = constants.POST_DEPLOY
+)
+
+func getDeploymentStateMap() map[string]DeploymentState {
+	return map[string]DeploymentState{
+		string(DeploymentStatePreDeploy):  DeploymentStatePreDeploy,
+		string(DeploymentStatePostDeploy): DeploymentStatePostDeploy,
+	}
+}
+
+func getDeploymentStateOptions() string {
+	options := ""
+	optionsMap := getDeploymentStateMap()
+
+	for option, _ := range optionsMap {
+		options = options + option + ","
+	}
+	return options[:len(options)-1]
+}
+
+func GetDeploymentState(deploymentState string) (DeploymentState, error) {
+	value, present := getDeploymentStateMap()[deploymentState]
+
+	if !present {
+		return DeploymentState(""), errors.New("Invalid DeploymentState,valid value can be " + getDeploymentStateOptions())
+	}
+	return value, nil
+}
diff --git a/components/automate-cli/pkg/verifyserver/enums/nodeType.go b/components/automate-cli/pkg/verifyserver/enums/nodeType.go
new file mode 100644
index 000000000..a5ef441a5
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/enums/nodeType.go
@@ -0,0 +1,46 @@
+package enums
+
+import (
+	"errors"
+
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
+)
+
+type NodeType string
+
+const (
+	NodeTypeAutomate   NodeType = constants.AUTOMATE
+	NodeTypeChefServer NodeType = constants.CHEF_INFRA_SERVER
+	NodeTypePostgresql NodeType = constants.POSTGRESQL
+	NodeTypeOpensearch NodeType = constants.OPENSEARCH
+	NodeTypeBastion    NodeType = constants.BASTION
+)
+
+func getNodeTypeMap() map[string]NodeType {
+	return map[string]NodeType{
+		string(NodeTypeAutomate):   NodeTypeAutomate,
+		string(NodeTypeChefServer): NodeTypeChefServer,
+		string(NodeTypePostgresql): NodeTypePostgresql,
+		string(NodeTypeOpensearch): NodeTypeOpensearch,
+		string(NodeTypeBastion):    NodeTypeBastion,
+	}
+}
+
+func getNodeTypeOptions() string {
+	options := ""
+	optionsMap := getNodeTypeMap()
+
+	for option, _ := range optionsMap {
+		options = options + option + ","
+	}
+	return options[:len(options)-1]
+}
+
+func GetNodeType(nodeType string) (NodeType, error) {
+	value, present := getNodeTypeMap()[nodeType]
+
+	if !present {
+		return NodeType(""), errors.New("Invalid NodeType,valid value can be " + getNodeTypeOptions())
+	}
+	return value, nil
+}
diff --git a/components/automate-cli/pkg/verifyserver/server/api/v1/handler.go b/components/automate-cli/pkg/verifyserver/server/api/v1/handler.go
index da5cac20e..fa219afb9 100644
--- a/components/automate-cli/pkg/verifyserver/server/api/v1/handler.go
+++ b/components/automate-cli/pkg/verifyserver/server/api/v1/handler.go
@@ -13,6 +13,7 @@ import (
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/statusservice"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/stopmockserverservice"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/systemuserservice"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/systemresourceservice"
 	"github.com/chef/automate/lib/logger"
 )
 
@@ -30,6 +31,7 @@ type Handler struct {
 	PortReachableService         portreachableservice.IPortReachableService
 	ExternalPostgresqlService    externalpostgresqlservice.ExternalPostgresqlService
 	SystemUserService            systemuserservice.SystemUserService
+	SystemResourceService        systemresourceservice.SystemResourcesService
 }
 
 func NewHandler(logger logger.Logger) *Handler {
@@ -94,3 +96,8 @@ func (h *Handler) AddExternalPostgresqlService(pg externalpostgresqlservice.Exte
 	h.ExternalPostgresqlService = pg
 	return h
 }
+
+func (h *Handler) AddSystemResourceService(srs systemresourceservice.SystemResourcesService) *Handler {
+	h.SystemResourceService = srs
+	return h
+}
diff --git a/components/automate-cli/pkg/verifyserver/server/api/v1/systemresources.go b/components/automate-cli/pkg/verifyserver/server/api/v1/systemresources.go
new file mode 100644
index 000000000..b7b93ec12
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/server/api/v1/systemresources.go
@@ -0,0 +1,27 @@
+package v1
+
+import (
+	"fmt"
+
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/enums"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/response"
+	"github.com/gofiber/fiber/v2"
+)
+
+func (h *Handler) GetSystemResource(c *fiber.Ctx) error {
+
+	nodeType, err := enums.GetNodeType(c.Query("node_type"))
+
+	if err != nil {
+		return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf(`Unsupported query or missing query. Expected values for query 'node_type' are %v,%v,%v,%v,%v`, enums.NodeTypeAutomate, enums.NodeTypeChefServer, enums.NodeTypePostgresql, enums.NodeTypeOpensearch, enums.NodeTypeBastion))
+	}
+
+	deploymentState, err := enums.GetDeploymentState(c.Query("deployment_state"))
+
+	if err != nil {
+		return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf(`Unsupported query or missing query. Expected values for query 'deployment_state' are %s,%s`, enums.DeploymentStatePreDeploy, enums.DeploymentStatePostDeploy))
+	}
+
+	service := h.SystemResourceService.GetSystemResourcesForDeployment(nodeType, deploymentState)
+	return c.JSON(response.BuildSuccessResponse(service))
+}
diff --git a/components/automate-cli/pkg/verifyserver/server/routes.go b/components/automate-cli/pkg/verifyserver/server/routes.go
index 0e022a5ed..a49c05888 100644
--- a/components/automate-cli/pkg/verifyserver/server/routes.go
+++ b/components/automate-cli/pkg/verifyserver/server/routes.go
@@ -22,6 +22,8 @@ func (vs *VerifyServer) SetupRoutes() {
 	
 	apiChecksGroup.Get("/system-user", vs.Handler.CheckSystemUser)
 
+	apiChecksGroup.Get("/system-resource", vs.Handler.GetSystemResource)
+
 	apiStartGroup := apiV1Group.Group("/start")
 	apiStartGroup.Post("/mock-server", vs.Handler.StartMockServer)
 	apiChecksGroup.Post("/aws-opensearch-s3-bucket-access", vs.Handler.CheckOSBackupS3)
diff --git a/components/automate-cli/pkg/verifyserver/server/server.go b/components/automate-cli/pkg/verifyserver/server/server.go
index b0c14bd78..49169640f 100644
--- a/components/automate-cli/pkg/verifyserver/server/server.go
+++ b/components/automate-cli/pkg/verifyserver/server/server.go
@@ -26,14 +26,16 @@ import (
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/startmockserverservice"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/statusservice"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/stopmockserverservice"
-	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/utils/awsutils"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/utils/db"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/systemuserservice"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/systemresourceservice"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/utils/awsutils"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/utils/fiberutils"
 	"github.com/chef/automate/lib/io/fileutils"
 	"github.com/chef/automate/lib/executil"
 	"github.com/chef/automate/lib/logger"
 	"github.com/chef/automate/lib/userutils"
+	"github.com/chef/automate/lib/systemresource"
 	"github.com/gofiber/fiber/v2"
 	"github.com/gofiber/fiber/v2/middleware/cors"
 	fiberlogger "github.com/gofiber/fiber/v2/middleware/logger"
@@ -98,6 +100,7 @@ func NewVerifyServer(port string, debug bool) (*VerifyServer, error) {
 		AddNFSMountService(nfsmountservice.NewNFSMountService(l, port)).
 		AddHardwareResourceCountService(hardwareresourcecount.NewHardwareResourceCountService(l)).
 		AddSoftwareVersionService(softwareversionservice.NewSoftwareVersionService(l, fiberutils.CheckPath)).
+		AddSystemResourceService(systemresourceservice.NewSystemResourceService(l, systemresource.NewSystemResourceInfoImpl(), &fileutils.FileSystemUtils{})).
 		AddMockServerServices(startmockserverservice.New(l)).
 		AddS3ConfigService(s3configservice.NewS3ConfigService(l, awsutils.NewAwsUtils())).
 		AddStopMockServerService(stopmockserverservice.NewStopMockServerService(l)).
diff --git a/components/automate-cli/pkg/verifyserver/services/systemresourceservice/mocksystemresourcesservice.go b/components/automate-cli/pkg/verifyserver/services/systemresourceservice/mocksystemresourcesservice.go
new file mode 100644
index 000000000..9277e7a4e
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/systemresourceservice/mocksystemresourcesservice.go
@@ -0,0 +1,14 @@
+package systemresourceservice
+
+import (
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/enums"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/models"
+)
+
+type MockSystemResourcesServiceImpl struct {
+	GetSystemResourcesForDeploymentFunc func(enums.NodeType, enums.DeploymentState) *models.ApiResult
+}
+
+func (msrs *MockSystemResourcesServiceImpl) GetSystemResourcesForDeployment(nodeType enums.NodeType, deploymentState enums.DeploymentState) *models.ApiResult {
+	return msrs.GetSystemResourcesForDeploymentFunc(nodeType, deploymentState)
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/systemresourceservice/systemresourcesservice.go b/components/automate-cli/pkg/verifyserver/services/systemresourceservice/systemresourcesservice.go
new file mode 100644
index 000000000..e589e650d
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/systemresourceservice/systemresourcesservice.go
@@ -0,0 +1,319 @@
+package systemresourceservice
+
+import (
+	"fmt"
+	"math"
+
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/enums"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/models"
+	"github.com/chef/automate/lib/io/fileutils"
+	"github.com/chef/automate/lib/logger"
+	"github.com/chef/automate/lib/systemresource"
+	"github.com/shirou/gopsutil/disk"
+)
+
+type SystemResourcesService interface {
+	GetSystemResourcesForDeployment(enums.NodeType, enums.DeploymentState) *models.ApiResult
+}
+
+type SystemResourcesServiceImpl struct {
+	logger             logger.Logger
+	SystemResourceInfo systemresource.SystemResourceInfo
+	Fileutils          fileutils.FileUtils
+}
+
+func NewSystemResourceService(log logger.Logger, sysResInfo systemresource.SystemResourceInfo, fileUtils fileutils.FileUtils) *SystemResourcesServiceImpl {
+	return &SystemResourcesServiceImpl{
+		logger:             log,
+		SystemResourceInfo: sysResInfo,
+		Fileutils:          fileUtils,
+	}
+}
+
+func (srs *SystemResourcesServiceImpl) GetSystemResourcesForDeployment(nodeType enums.NodeType, deploymentState enums.DeploymentState) *models.ApiResult {
+
+	srsResponse := &models.ApiResult{
+		Passed: true,
+		Checks: []models.Checks{},
+	}
+
+	cpuCountCheck := srs.CheckCpuCount()
+	srsResponse.Checks = append(srsResponse.Checks, *cpuCountCheck)
+
+	cpuSpeedCheck := srs.CheckCpuSpeed()
+	srsResponse.Checks = append(srsResponse.Checks, *cpuSpeedCheck)
+
+	memorySizeCheck := srs.CheckMemorySize()
+	srsResponse.Checks = append(srsResponse.Checks, *memorySizeCheck)
+
+	habFreeSpaceCheck := srs.CheckHabFreeSpace(nodeType, deploymentState)
+	srsResponse.Checks = append(srsResponse.Checks, *habFreeSpaceCheck)
+
+	tmpFreeSpaceCheck := srs.CheckFreeDiskSpaceOfDir("/tmp", constants.TMP_FREE_DISK_IN_PER, constants.TMP_FREE_DISK_IN_GB, "Temp")
+	srsResponse.Checks = append(srsResponse.Checks, *tmpFreeSpaceCheck)
+
+	rootFreeSpaceCheck := srs.CheckFreeDiskSpaceOfDir("/", constants.ROOT_FREE_DISK_IN_PER, constants.ROOT_FREE_DISK_IN_GB, "/(root volume)")
+	srsResponse.Checks = append(srsResponse.Checks, *rootFreeSpaceCheck)
+
+	if !cpuCountCheck.Passed ||
+		!cpuSpeedCheck.Passed ||
+		!memorySizeCheck.Passed ||
+		!habFreeSpaceCheck.Passed ||
+		!tmpFreeSpaceCheck.Passed ||
+		!rootFreeSpaceCheck.Passed {
+		srsResponse.Passed = false
+	}
+
+	return srsResponse
+}
+
+func (srs *SystemResourcesServiceImpl) CheckCpuCount() *models.Checks {
+	srs.logger.Debug("CPU count check is running")
+	cpuCount := srs.SystemResourceInfo.GetNumberOfCPU()
+	srs.logger.Debug("CPU count is : ", cpuCount)
+
+	if cpuCount >= constants.MIN_CPU_COUNT {
+		successMsg := fmt.Sprintf("CPU count is >=%v", constants.MIN_CPU_COUNT)
+		return srs.GetChecksModel(true, constants.CPU_COUNT_CHECK_TITLE, successMsg, "", "")
+	}
+
+	errorMsg := fmt.Sprintf("CPU count is %v", cpuCount)
+	resolutionMsg := fmt.Sprintf("CPU count should be >=%v", constants.MIN_CPU_COUNT)
+	return srs.GetChecksModel(false, constants.CPU_COUNT_CHECK_TITLE, "", errorMsg, resolutionMsg)
+}
+
+func (srs *SystemResourcesServiceImpl) CheckCpuSpeed() *models.Checks {
+	srs.logger.Debug("CPU speed check is running")
+	cpuSpeed, err := srs.SystemResourceInfo.GetCPUSpeed()
+
+	if err != nil {
+		srs.logger.Error("Error occured while getting cpu speed :", err)
+		return srs.GetChecksModel(false, constants.CPU_SPEED_CHECK_TITLE, "", err.Error(), constants.RESOLUTION_MSG)
+	}
+	srs.logger.Debug("CPU speed is : ", cpuSpeed)
+	if cpuSpeed >= constants.MIN_CPU_SPEED {
+		successMsg := fmt.Sprintf("CPU speed should be >=%vGHz", constants.MIN_CPU_SPEED)
+		return srs.GetChecksModel(true, constants.CPU_SPEED_CHECK_TITLE, successMsg, "", "")
+	}
+	errorMsg := fmt.Sprintf("CPU speed is %vGHz", cpuSpeed)
+	resolutionMsg := fmt.Sprintf("CPU speed should be >=%vGHz", constants.MIN_CPU_SPEED)
+	return srs.GetChecksModel(false, constants.CPU_SPEED_CHECK_TITLE, "", errorMsg, resolutionMsg)
+}
+
+func (srs *SystemResourcesServiceImpl) CheckMemorySize() *models.Checks {
+	srs.logger.Debug("Memory size check is running")
+	memoryInGB, err := srs.SystemResourceInfo.GetMemory()
+	srs.logger.Debug("Current memory of system is :", memoryInGB)
+
+	if err != nil {
+		srs.logger.Error("Error occured while getting memory information : ", err.Error())
+		return srs.GetChecksModel(false, constants.MEMORY_SIZE_CHECK_TITLE, "", err.Error(), constants.RESOLUTION_MSG)
+	}
+	srs.logger.Debugf("Current memory of system is :%vGB", memoryInGB)
+
+	if memoryInGB >= constants.MIN_MEMORY {
+		successMsg := fmt.Sprintf("Memory should be >=%vGB", constants.MIN_MEMORY)
+		return srs.GetChecksModel(true, constants.MEMORY_SIZE_CHECK_TITLE, successMsg, "", "")
+	}
+	errorMsg := fmt.Sprintf("Memory is %.2fGB", memoryInGB)
+	resolutionMsg := fmt.Sprintf("Memory should be >=%vGB", constants.MIN_MEMORY)
+	return srs.GetChecksModel(false, constants.MEMORY_SIZE_CHECK_TITLE, "", errorMsg, resolutionMsg)
+}
+
+func (srs *SystemResourcesServiceImpl) CheckHabFreeSpace(nodeType enums.NodeType, deploymentState enums.DeploymentState) *models.Checks {
+
+	switch deploymentState {
+	case enums.DeploymentStatePreDeploy:
+		return srs.CheckHabFreeSpacePreDeployment(nodeType)
+	case enums.DeploymentStatePostDeploy:
+		return srs.CheckHabFreeSpacePostDeployment(nodeType)
+	}
+	return &models.Checks{}
+}
+
+func (srs *SystemResourcesServiceImpl) CheckHabFreeSpacePreDeployment(nodeType enums.NodeType) *models.Checks {
+	srs.logger.Debug("Hab free space check is running for node_type : ", nodeType, " and deployment_state :", enums.DeploymentStatePreDeploy)
+
+	currentFreeSpaceInGB, err := srs.GetFreeDiskSpaceOfGivenDir("/hab")
+
+	var resp *models.Checks
+	if err != nil {
+		srs.logger.Error("Unable to determine free space of /hab :", err)
+		resp = srs.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), "", err.Error(), constants.RESOLUTION_MSG)
+		return resp
+	}
+	srs.logger.Debugf("The current total free space in hab : %0.2fGB", currentFreeSpaceInGB)
+
+	switch nodeType {
+	case enums.NodeTypeAutomate:
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(constants.HAB_FREE_DISK_BEFORE_DEP_A2, currentFreeSpaceInGB, 0, constants.HAB_FREE_DISK_BEFORE_DEP_A2, constants.PRE_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	case enums.NodeTypeChefServer:
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(constants.HAB_FREE_DISK_BEFORE_DEP_CS, currentFreeSpaceInGB, 0, constants.HAB_FREE_DISK_BEFORE_DEP_CS, constants.PRE_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	case enums.NodeTypeOpensearch:
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(constants.HAB_FREE_DISK_BEFORE_DEP_OS, currentFreeSpaceInGB, 0, constants.HAB_FREE_DISK_BEFORE_DEP_OS, constants.PRE_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	case enums.NodeTypePostgresql:
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(constants.HAB_FREE_DISK_BEFORE_DEP_PG, currentFreeSpaceInGB, 0, constants.HAB_FREE_DISK_BEFORE_DEP_PG, constants.PRE_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	case enums.NodeTypeBastion:
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(constants.HAB_FREE_DISK_BEFORE_DEP_BASTION, currentFreeSpaceInGB, 0, constants.HAB_FREE_DISK_BEFORE_DEP_BASTION, constants.PRE_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	}
+	return resp
+}
+
+func (srs *SystemResourcesServiceImpl) CheckHabFreeSpacePostDeployment(nodeType enums.NodeType) *models.Checks {
+	srs.logger.Debugf("Hab free space check is running for node_type : %s  and deployment_state : %s", nodeType, enums.DeploymentStatePostDeploy)
+	currentFreeSpaceInGB, err := srs.GetFreeDiskSpaceOfGivenDir("/hab")
+	var resp *models.Checks
+	if err != nil {
+		srs.logger.Error("Unable to determine free space of /hab :", err.Error())
+		resp = srs.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), "", err.Error(), constants.RESOLUTION_MSG)
+		return resp
+	}
+	srs.logger.Debugf("current free space in /hab after deployment :%0.2fGB", currentFreeSpaceInGB)
+
+	totalSpaceInGBInHab, err := srs.GetTotalSpaceOfGivenDir("/hab")
+	if err != nil {
+		srs.logger.Error("Unable to retrive total space of /hab :", err.Error())
+		resp = srs.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "/hab"), "", err.Error(), constants.RESOLUTION_MSG)
+		return resp
+	}
+	srs.logger.Debugf("current total space in /hab : %0.2f", totalSpaceInGBInHab)
+
+	switch nodeType {
+	case enums.NodeTypeAutomate:
+		expectedFreeSpace := srs.GetExpectedFreeSpaceValueAfterDeploy(totalSpaceInGBInHab, constants.HAB_FREE_DISK_AFTER_DEP_A2_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_A2)
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(expectedFreeSpace, currentFreeSpaceInGB, constants.HAB_FREE_DISK_AFTER_DEP_A2_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_A2, constants.POST_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	case enums.NodeTypeChefServer:
+		expectedFreeSpace := srs.GetExpectedFreeSpaceValueAfterDeploy(totalSpaceInGBInHab, constants.HAB_FREE_DISK_AFTER_DEP_CS_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_CS)
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(expectedFreeSpace, currentFreeSpaceInGB, constants.HAB_FREE_DISK_AFTER_DEP_CS_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_CS, constants.POST_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	case enums.NodeTypeOpensearch:
+		expectedFreeSpace := srs.GetExpectedFreeSpaceValueAfterDeploy(totalSpaceInGBInHab, constants.HAB_FREE_DISK_AFTER_DEP_OS_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_OS)
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(expectedFreeSpace, currentFreeSpaceInGB, constants.HAB_FREE_DISK_AFTER_DEP_OS_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_OS, constants.POST_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	case enums.NodeTypePostgresql:
+		expectedFreeSpace := srs.GetExpectedFreeSpaceValueAfterDeploy(totalSpaceInGBInHab, constants.HAB_FREE_DISK_AFTER_DEP_PG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_PG)
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(expectedFreeSpace, currentFreeSpaceInGB, constants.HAB_FREE_DISK_AFTER_DEP_PG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_PG, constants.POST_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	case enums.NodeTypeBastion:
+		expectedFreeSpace := srs.GetExpectedFreeSpaceValueAfterDeploy(totalSpaceInGBInHab, constants.HAB_FREE_DISK_AFTER_DEP_BASTION_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_BASTION)
+		passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(expectedFreeSpace, currentFreeSpaceInGB, constants.HAB_FREE_DISK_AFTER_DEP_BASTION_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_BASTION, constants.POST_DEPLOY, "/hab")
+		resp = srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), successMsg, errorMsg, resolutionMsg)
+	}
+	return resp
+}
+
+func (srs *SystemResourcesServiceImpl) CheckFreeDiskSpaceOfDir(dirPath string, freeDiskSpaceWantInPer, freeDiskSpaceWantInGB float64, checkTitle string) *models.Checks {
+	srs.logger.Debugf("free disk space check is running for %s directory", dirPath)
+
+	currentFreeSpaceInDir, err := srs.GetFreeDiskSpaceOfGivenDir(dirPath)
+	if err != nil {
+		srs.logger.Errorf("Unable to determine free space of %s error=%v", dirPath, err)
+		return srs.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, checkTitle), "", err.Error(), constants.RESOLUTION_MSG)
+	}
+	srs.logger.Debugf("Current free disk space in %s is %0.2fGB", dirPath, currentFreeSpaceInDir)
+	var totalSpaceInHab float64
+	totalSpaceInHab, err = srs.GetTotalSpaceOfGivenDir("/hab")
+
+	if err != nil {
+		srs.logger.Error("Unable to determine total space of /hab :", err)
+		return srs.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, checkTitle), "", err.Error(), constants.RESOLUTION_MSG)
+	}
+	srs.logger.Debugf("Current total space in /hab : %0.2fGB", totalSpaceInHab)
+
+	expectedFreeSpaceValue := srs.GetExpectedFreeSpaceValueAfterDeploy(totalSpaceInHab, freeDiskSpaceWantInPer, freeDiskSpaceWantInGB)
+	srs.logger.Debugf("Expected free space calculated for %s is %0.2fGB", dirPath, expectedFreeSpaceValue)
+
+	passed, successMsg, errorMsg, resolutionMsg := srs.GetCheckModelValuesDetailsForStorageChecks(expectedFreeSpaceValue, currentFreeSpaceInDir, freeDiskSpaceWantInPer, freeDiskSpaceWantInGB, constants.POST_DEPLOY, dirPath)
+	return srs.GetChecksModel(passed, fmt.Sprintf(constants.FREE_SPACE_CHECK, checkTitle), successMsg, errorMsg, resolutionMsg)
+}
+
+func (srs *SystemResourcesServiceImpl) GetCheckModelValuesDetailsForStorageChecks(expectedFreeSpaceCalculated, currentFreeSpace, expectedFreeSpaceWantInPer, expectedFreeSpaceWantInGB float64, deploymentState, dirName string) (bool, string, string, string) {
+
+	if dirName == "/" {
+		dirName = "/(root volume)"
+	}
+
+	successMsg := ""
+	resolutionMsg := ""
+	errorMsg := ""
+	passed := false
+	if currentFreeSpace >= expectedFreeSpaceCalculated {
+		passed = true
+		successMsg = fmt.Sprintf(constants.SUCCESS_MSG, dirName, expectedFreeSpaceWantInGB)
+		errorMsg = ""
+		resolutionMsg = ""
+	} else {
+		successMsg = ""
+		errorMsg = fmt.Sprintf(constants.ERROR_MSG, dirName, currentFreeSpace)
+		resolutionMsg = fmt.Sprintf(constants.SUCCESS_MSG, dirName, expectedFreeSpaceWantInGB)
+	}
+
+	if deploymentState == constants.POST_DEPLOY {
+		if passed {
+			successMsg = successMsg + fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, expectedFreeSpaceWantInPer*100)
+			errorMsg = ""
+			resolutionMsg = ""
+		} else {
+			successMsg = ""
+			resolutionMsg = resolutionMsg + fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, expectedFreeSpaceWantInPer*100)
+		}
+	}
+	return passed, successMsg, errorMsg, resolutionMsg
+}
+
+func (srs *SystemResourcesServiceImpl) GetExpectedFreeSpaceValueAfterDeploy(totalSpaceInGB, freeSpaceWantInPercentage, freeSpaceWantInGB float64) float64 {
+	percentageValueOfTotalSpace := totalSpaceInGB * freeSpaceWantInPercentage
+	return math.Max(percentageValueOfTotalSpace, float64(freeSpaceWantInGB))
+}
+
+func (srs *SystemResourcesServiceImpl) GetChecksModel(passed bool, checkTitle, successMsg, errorMsg, resolutionMsg string) *models.Checks {
+	return &models.Checks{
+		Title:         checkTitle,
+		Passed:        passed,
+		SuccessMsg:    successMsg,
+		ErrorMsg:      errorMsg,
+		ResolutionMsg: resolutionMsg,
+	}
+}
+
+func (srs *SystemResourcesServiceImpl) GetFreeDiskSpaceOfGivenDir(dirPath string) (float64, error) {
+	usage, err := srs.GetUsage(dirPath)
+
+	if err != nil {
+		return 0, err
+	}
+	return float64(usage.Free) / (1024 * 1024 * 1024), nil
+}
+
+func (srs *SystemResourcesServiceImpl) GetTotalSpaceOfGivenDir(dirPath string) (float64, error) {
+	usage, err := srs.GetUsage(dirPath)
+	if err != nil {
+		return 0, err
+	}
+	return float64(usage.Total) / (1024 * 1024 * 1024), nil
+}
+
+func (srs *SystemResourcesServiceImpl) GetUsage(dirPath string) (disk.UsageStat, error) {
+	isPathExist, err := srs.Fileutils.PathExists(dirPath)
+
+	if err != nil {
+		return disk.UsageStat{}, err
+	}
+
+	if !isPathExist {
+		dirPath = "/"
+	}
+
+	usage, err := srs.SystemResourceInfo.GetDiskSpaceInfo(dirPath)
+	if err != nil {
+		return disk.UsageStat{}, err
+	}
+	return usage, nil
+}
diff --git a/components/docs-chef-io/content/automate/create_amazon_opensearch.md b/components/docs-chef-io/content/automate/create_amazon_opensearch.md
new file mode 100644
index 000000000..aa24c8cc9
--- /dev/null
+++ b/components/docs-chef-io/content/automate/create_amazon_opensearch.md
@@ -0,0 +1,83 @@
++++
+title = "Create an Amazon OpenSearch Cluster and Obtain Connection Details"
+
+draft = false
+gh_repo = "automate"
+
+[menu]
+  [menu.automate]
+    title = "Create Amazon OpenSearch"
+    parent = "automate/deploy_high_availability/reference"
+    identifier = "automate/deploy_high_availability/reference/create_amazon_opensearch.md Create Amazon OpenSearch"
+    weight = 204
++++
+
+{{< warning >}}
+{{% automate/ha-warn %}}
+{{< /warning >}}
+
+You can follow the AWS documentation directly for detailed steps on [how to create an Amazon OpenSearch Cluster](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.PostgreSQL.html).
+
+Below is our guide on the steps required to create an Amazon OpenSearch cluster. This guide will walk you through creating an Amazon OpenSearch cluster and retrieving the necessary connection details, including the hostname, username, and password.
+
+## Prerequisites
+
+Before proceeding, make sure you have the following prerequisites in place:
+
+- An active AWS account
+- Sufficient permissions to create Amazon OpenSearch clusters
+
+## Step 1: Sign in to the AWS Management Console
+
+1. Open your preferred web browser and go to the [AWS Management Console](https://console.aws.amazon.com/).
+1. Sign in to your AWS account using your credentials.
+
+## Step 2: Navigate to the Amazon OpenSearch Service Dashboard
+
+1. Once logged in to the AWS Management Console, search for **OpenSearch** in the search bar at the top of the page.
+1. Click on the **Amazon OpenSearch Service** service from the search results to open the Amazon OpenSearch Service dashboard.
+
+## Step 3: Create a New Amazon OpenSearch 1.3 Cluster
+
+1. Click the **Create a new domain** button in the Amazon OpenSearch Service dashboard.
+1. Enter a new **Domain name** for your OpenSearch cluster
+1. In **Domain creation method**, select **Standard create**
+1. Choose the appropriate deployment configuration, such as development or production, based on your requirements.
+1. Under the **Engine options** section, select **1.3** as the version for your cluster.
+1. In the **Networks** section, provide the following information:
+   - **VPC**: Select the VPC in which you have your automate cluster
+   - **Subnets**: Select all three private subnets available in your VPC
+   - **Security groups**: Select a security block with incoming access from your VPC CIDR range.
+1. In **Fine-grained access control**,
+   - Enable **Fine-grained access control**
+   - Choose **Create master user**
+   - Enter the **Master username** and **Master password** you want to create
+1. In **Access policy**,
+   - Select **Configure domain level access policy**
+   - Choose action **Allow**.
+1. Configure the remaining settings per your requirements, such as the number of nodes and storage options.
+1. Review all the settings and make sure they are accurate.
+1. Click the **Confirm** button to start the cluster creation process.
+
+## Step 4: Wait for the Amazon OpenSearch Cluster to be Created
+
+1. The Amazon OpenSearch cluster creation process may take several minutes. Wait for the process to complete.
+1. You can monitor the progress of the cluster creation on the Amazon OpenSearch Service dashboard.
+
+## Step 5: Retrieve Connection Details
+
+You can obtain the necessary connection details once the Amazon OpenSearch 1.3 cluster is created successfully.
+
+1. Go to the Amazon OpenSearch Service dashboard.
+1. Find and select your newly created cluster from the list.
+1. In the cluster details view, navigate to the **Endpoint** tab.
+1. Here, you will find the following connection details:
+   - **Domain name**: This is the domain name we gave for this OpenSearch cluster.
+   - **Domain URL**: This is the endpoint or hostname of your OpenSearch cluster. It will look something like `my-opensearch-cluster-1234567890.us-east-1.es.amazonaws.com`.
+   - **Username**: The username for accessing your OpenSearch cluster.
+   - **Password**: The password for the specified username.
+
+## Step 6: Connect to Your Amazon OpenSearch 1.3 Cluster
+
+Using the connection details obtained in the previous step, you can now connect to your Amazon OpenSearch 1.3 cluster from Automate.
+Congratulations! You have successfully created an Amazon OpenSearch 1.3 cluster, and it's ready to be used with Automate.
diff --git a/components/docs-chef-io/content/automate/create_amazon_rds.md b/components/docs-chef-io/content/automate/create_amazon_rds.md
new file mode 100644
index 000000000..d87e5562d
--- /dev/null
+++ b/components/docs-chef-io/content/automate/create_amazon_rds.md
@@ -0,0 +1,93 @@
++++
+title = "Create an Amazon RDS PostgreSQL Instance and Obtain Connection Details"
+
+draft = false
+gh_repo = "automate"
+
+[menu]
+  [menu.automate]
+    title = "Create Amazon RDS"
+    parent = "automate/deploy_high_availability/reference"
+    identifier = "automate/deploy_high_availability/reference/create_amazon_rds.md Create Amazon RDS"
+    weight = 208
++++
+
+{{< warning >}}
+{{% automate/ha-warn %}}
+{{< /warning >}}
+
+You can follow the AWS documentation directly for detailed steps on [how to create an Amazon RDS PostgreSQL Instance](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html).
+
+Below is our guide on the steps required to create an Amazon RDS PostgreSQL instance. This guide will walk you through creating an Amazon RDS PostgreSQL instance and retrieving the necessary connection details, including the hostname, port, username, and password.
+
+## Prerequisites
+
+Before proceeding, make sure you have the following prerequisites in place:
+
+- An active AWS account
+- Sufficient permissions to create Amazon RDS instances
+
+## Step 1: Sign in to the AWS Management Console
+
+1. Open your preferred web browser and go to the [AWS Management Console](https://console.aws.amazon.com/).
+1. Sign in to your AWS account using your credentials.
+
+## Step 2: Navigate to the Amazon RDS Dashboard
+
+1. Once logged in to the AWS Management Console, search for **RDS** in the search bar at the top of the page.
+1. Click on the **Amazon RDS** service from the search results to open the Amazon RDS dashboard.
+
+## Step 3: Create a New Amazon RDS PostgreSQL Instance
+
+1. Click the **Create database** button in the Amazon RDS dashboard.
+1. On the **Choose a database creation method** page, select the **Standard Create** option.
+1. Under the **Engine options** section, select **PostgreSQL** as the database engine.
+1. Choose **PostgreSQL 13.5-R1**.
+1. Under the **Templates** section, select the template that suits your needs or choose the default template.
+1. In the **Settings** section, provide the following information:
+   - **DB instance identifier**: Enter a unique identifier for your RDS instance.
+   - **Master username**: Specify the username for the master user account.
+   - **Master password**: Set a secure password for the master user account.
+1. In the **Instance configuration** section, select the appropriate instance size for your needs.
+1. In the **Connectivity** section,
+    - In **Compute resource**, select **Don't connect to an EC2 compute resource**.
+    - Select **Network type** as per your requirements.
+    - In **Virtual private cloud**, select the VPC you want to use for your Automate cluster.
+    - In **DB subnet group**, choose any private subnet available in your VPC.
+    - In **Public Access** select **NO**
+1. Configure the remaining settings as per your requirements.
+1. Review all the settings and make sure they are accurate.
+1. Click on the **Create database** button to start the creation process.
+
+## Step 4: Wait for the Amazon RDS Instance to be Created
+
+1. The RDS instance creation process may take a few minutes. Wait for the process to complete.
+1. You can monitor the progress of the instance creation on the Amazon RDS dashboard.
+
+## Step 5: Open the port in the RDS security group
+
+1. Go to the Amazon RDS dashboard.
+1. Find and select your newly created PostgreSQL instance from the list.
+1. In the instance details view, navigate to the **Connectivity & security** tab.
+1. Open the Security Group under **VPC security groups**
+1. Under **Inbound Rules**, edit and select **Type** as **PostgreSQL**
+1. Select **Source** as **custom** and give appropriate cidr block for your VPC
+1. Click **Save Rules**
+
+## Step 6: Retrieve Connection Details
+
+Once the Amazon RDS PostgreSQL instance is created successfully, you can obtain the necessary connection details.
+
+1. Go to the Amazon RDS dashboard.
+1. Find and select your newly created PostgreSQL instance from the list.
+1. In the instance details view, navigate to the **Connectivity & security** tab.
+1. Here, you will find the following connection details:
+   - **Instance URL**: This is the endpoint or hostname of your RDS instance. It will look something like `my-rds-instance.abcdefg12345.us-east-1.rds.amazonaws.com`.
+   - **Port**: The port number your PostgreSQL instance listens to. The default port is usually `5432`.
+   - **Username**: The username of the master user account you specified during instance creation.
+   - **Password**: The password for the master user account.
+
+## Step 7: Connect to Your Amazon RDS PostgreSQL Instance
+
+Using the connection details obtained in the previous step, you can now connect to your Amazon RDS PostgreSQL instance from Automate.
+Congratulations! You have successfully created an Amazon RDS PostgreSQL instance, and it's ready to be used with Automate.
diff --git a/components/docs-chef-io/content/automate/ha_aws_deploy_steps.md b/components/docs-chef-io/content/automate/ha_aws_deploy_steps.md
index 12b3a35c4..21f9a00dc 100644
--- a/components/docs-chef-io/content/automate/ha_aws_deploy_steps.md
+++ b/components/docs-chef-io/content/automate/ha_aws_deploy_steps.md
@@ -211,6 +211,8 @@ Check if Chef Automate UI is accessible by going to (Domain used for Chef Automa
 
 - Following config will create s3 bucket for backup.
 
+- To provide multiline certificates use triple quotes like `"""multiline certificate contents"""`
+
 {{< /note >}}
 
 ```config
@@ -231,36 +233,42 @@ backup_mount = "/mnt/automate_backups"
 [automate.config]
 admin_password = "MY-AUTOMATE-UI-PASSWORD"
 fqdn = ""
-instance_count = "1"
+instance_count = "2"
 config_file = "configs/automate.toml"
 enable_custom_certs = false
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+
+# Add Automate Load Balancer root-ca
+# root_ca = """root_ca_contents"""
+
+# Add Automate node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 [chef_server.config]
-instance_count = "1"
+instance_count = "2"
 enable_custom_certs = false
-# Add Chef Server load balancer root-ca and keys
-# private_key = ""
-# public_key = ""
+
+# Add Chef Server node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 [opensearch.config]
 instance_count = "3"
 enable_custom_certs = false
-# root_ca = ""
-# admin_key = ""
-# admin_cert = ""
-# private_key = ""
-# public_key = ""
+# Add OpenSearch root-ca and keys
+# root_ca = """root_ca_contents"""
+# admin_key = """admin_private_key_contents"""
+# admin_cert = """admin_public_key_contents"""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 [postgresql.config]
 instance_count = "3"
 enable_custom_certs = false
-# Add Postgresql load balancer root-ca and keys
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+# Add Postgresql root-ca and keys
+# root_ca = """root_ca_contents"""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 [aws.config]
 profile = "default"
diff --git a/components/docs-chef-io/content/automate/ha_aws_managed_deploy_steps.md b/components/docs-chef-io/content/automate/ha_aws_managed_deploy_steps.md
index 734c6be2b..233093a82 100644
--- a/components/docs-chef-io/content/automate/ha_aws_managed_deploy_steps.md
+++ b/components/docs-chef-io/content/automate/ha_aws_managed_deploy_steps.md
@@ -27,8 +27,8 @@ Follow the steps below to deploy Chef Automate High Availability (HA) on AWS (Am
 - If you want to use Default VPC, then you have to create Public and Private Subnet, if subnet are not available. Please refer [this](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)
 - We need 3 private and 3 public subnet in a vpc (1 subnet for each AZ). As of now we support dedicate subnet for each AZ.
 - We recommend to create a new VPC. And Bastion should be in the same VPC.
-- Setup AWS RDS Postgresql 13.5 in the same VPC where we have the basion and automate ha node going to be created. Click [here](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.PostgreSQL.html) to know more.
-- Setup AWS OpenSearch 1.3.7 in the same VPC where we have the basion and automate ha node going to be created. Click [here](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html) to know more.
+- Setup AWS RDS PostgreSQL 13.5-R1 in the same VPC where we have the basion and automate ha node going to be created. Click [here](/automate/create_amazon_rds/) to know more.
+- Setup AWS OpenSearch 1.3 in the same VPC where we have the basion and automate ha node going to be created. Click [here](/automate/create_amazon_opensearch/) to know more.
 - For Backup with Managed Service we have only one option which is `Amazon S3`.
 - For Backup and Restore with Managed Service. Click [here](/automate/managed_services/#enabling-opensearch-backup-restore) to know more.
 - Get AWS credetials (`aws_access_key_id` and `aws_secret_access_key`) which have privileges like: `AmazonS3FullAccess`, `AdministratorAccess`. Click [here](/automate/ha_iam_user/) to know more on how to create IAM Users.
@@ -123,6 +123,8 @@ Set the above prerequisites in `~/.aws/credentials` in Bastion Host:
         - For backup and restore configuration set `managed_opensearch_certificate`, `aws_os_snapshot_role_arn`, `os_snapshot_user_access_key_id`, `os_snapshot_user_access_key_secret`.  [Refer this document](/automate/managed_services/#enabling-opensearch-backup-restore) to create them and get their values.
         - Set `managed_rds_instance_url` as the URL with Port No. For example: `["database-1.c2kvay.eu-north-1.rds.amazonaws.com:5432"]`
         - Set `managed_rds_instance_url`, `managed_rds_superuser_username`, `managed_rds_superuser_password`, `managed_rds_dbuser_username`, `managed_rds_dbuser_password` from the **Managed AWS RDS Postgresql** created in the Prerequisite steps.
+          - The master username value which you used while creating AWS RDS Postgresql can be used for both `managed_rds_superuser_username` and `managed_rds_dbuser_username`
+          - The master password value which you used while creating AWS RDS Postgresql can be used for both `managed_rds_superuser_password` and `managed_rds_dbuser_password`
       - Set the `ami_id` value, which depends on the AWS Region and the Operating System image you want to use.
       - Use the [Hardware Requirement Calculator sheet](/calculator/automate_ha_hardware_calculator.xlsx) to get information on which instance type you will need for your load.
       - Set Instance Type for:
@@ -217,6 +219,8 @@ Check if Chef Automate UI is accessible by going to (Domain used for Chef Automa
 
 - Following config will create s3 bucket for backup.
 
+- To provide multiline certificates use triple quotes like `"""multiline certificate contents"""`
+
 {{< /note >}}
 
 ```config
@@ -236,26 +240,31 @@ backup_mount = ""
 [automate.config]
 admin_password = "MY-AUTOMATE-UI-PASSWORD"
 fqdn = ""
-instance_count = "1"
+instance_count = "2"
 config_file = "configs/automate.toml"
 enable_custom_certs = false
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+
+# Add Automate Load Balancer root-ca
+# root_ca = """root_ca_contents"""
+
+# Add Automate node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 [chef_server.config]
-instance_count = "1"
+instance_count = "2"
 enable_custom_certs = false
-# Add Chef Server load balancer root-ca and keys
-# private_key = ""
-# public_key = ""
+
+# Add Chef Server node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 
 [opensearch.config]
-instance_count = "3"
+instance_count = "0"
 enable_custom_certs = false
 
 [postgresql.config]
-instance_count = "3"
+instance_count = "0"
 enable_custom_certs = false
 
 [aws.config]
diff --git a/components/docs-chef-io/content/automate/ha_cert_deployment.md b/components/docs-chef-io/content/automate/ha_cert_deployment.md
index 48a71155b..3623ae882 100644
--- a/components/docs-chef-io/content/automate/ha_cert_deployment.md
+++ b/components/docs-chef-io/content/automate/ha_cert_deployment.md
@@ -30,9 +30,13 @@ To add a common custom certificate for all the nodes of the Chef Automate servic
 ```toml
 [automate.config]
 enable_custom_certs = true
-root_ca = "ADD_YOUR_ROOT_CA_CERT_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_HERE"
+
+# Add Automate Load Balancer root-ca
+root_ca = """ADD_YOUR_ROOT_CA_HERE"""
+
+# Add Automate node internal public and private keys
+private_key = """ADD_YOUR_PRIVATE_KEY_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_HERE"""
 ```
 
 ### Common custom certificate for Chef Server
@@ -42,8 +46,8 @@ To add a common custom certificate for all the nodes of the Chef Server service,
 ```toml
 [chef_server.config]
 enable_custom_certs = true
-private_key = "ADD_YOUR_PRIVATE_KEY_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_HERE"""
 ```
 
 ### Common custom certificate for OpenSearch
@@ -53,11 +57,11 @@ To add a common custom certificate for all the nodes of the OpenSearch service,
 ```toml
 [opensearch.config]
 enable_custom_certs = true
-root_ca = "ADD_YOUR_ROOT_CA_CERT_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_HERE"
-admin_key = "ADD_YOUR_ADMIN_KEY_HERE"
-admin_cert = "ADD_YOUR_ADMIN_CERT_HERE"
+root_ca = """ADD_YOUR_ROOT_CA_CERT_HERE"""
+private_key = """ADD_YOUR_PRIVATE_KEY_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_HERE"""
+admin_key = """ADD_YOUR_ADMIN_KEY_HERE"""
+admin_cert = """ADD_YOUR_ADMIN_CERT_HERE"""
 ```
 
 ### Common custom certificate for PostgreSQL
@@ -67,9 +71,9 @@ To add a common custom certificate for all the nodes of the PostgreSQL service,
 ```toml
 [postgresql.config]
 enable_custom_certs = true
-root_ca = "ADD_YOUR_ROOT_CA_CERT_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_HERE"
+root_ca = """ADD_YOUR_ROOT_CA_CERT_HERE"""
+private_key = """ADD_YOUR_PRIVATE_KEY_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_HERE"""
 ```
 
 ## Setting unique certificates for different nodes of a service
@@ -91,15 +95,18 @@ To add unique custom certificates for 2 the nodes of the Chef Automate service,
 ```toml
 [automate.config]
 enable_custom_certs = true
-root_ca = "ADD_YOUR_ROOT_CA_CERT_HERE"
+
+# Add Automate Load Balancer root-ca
+root_ca = """ADD_YOUR_ROOT_CA_CERT_HERE"""
+
 [[automate.config.certs_by_ip]]
 ip = "ADD_YOUR_FIRST_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_FIRST_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_FIRST_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_FIRST_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_FIRST_IP_ADDRESS_HERE"""
 [[automate.config.certs_by_ip]]
 ip = "ADD_YOUR_SECOND_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_SECOND_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_SECOND_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_SECOND_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_SECOND_IP_ADDRESS_HERE"""
 ```
 
 ### Unique custom certificates for Chef Server
@@ -111,12 +118,12 @@ To add unique custom certificates for 2 the nodes of the Chef Server service, ad
 enable_custom_certs = true
 [[chef_server.config.certs_by_ip]]
 ip = "ADD_YOUR_FIRST_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_FIRST_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_FIRST_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_FIRST_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_FIRST_IP_ADDRESS_HERE"""
 [[chef_server.config.certs_by_ip]]
 ip = "ADD_YOUR_SECOND_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_SECOND_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_SECOND_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_SECOND_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_SECOND_IP_ADDRESS_HERE"""
 ```
 
 ### Unique custom certificates for OpenSearch
@@ -126,21 +133,21 @@ To add unique custom certificates for 3 of the nodes of the OpenSearch service,
 ```toml
 [opensearch.config]
 enable_custom_certs = true
-root_ca = "ADD_YOUR_ROOT_CA_CERT_HERE"
-admin_key = "ADD_YOUR_ADMIN_KEY_HERE"
-admin_cert = "ADD_YOUR_ADMIN_CERT_HERE"
+root_ca = """ADD_YOUR_ROOT_CA_CERT_HERE"""
+admin_key = """ADD_YOUR_ADMIN_KEY_HERE"""
+admin_cert = """ADD_YOUR_ADMIN_CERT_HERE"""
 [[opensearch.config.certs_by_ip]]
 ip = "ADD_YOUR_FIRST_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_FIRST_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_FIRST_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_FIRST_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_FIRST_IP_ADDRESS_HERE"""
 [[opensearch.config.certs_by_ip]]
 ip = "ADD_YOUR_SECOND_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_SECOND_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_SECOND_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_SECOND_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_SECOND_IP_ADDRESS_HERE"""
 [[opensearch.config.certs_by_ip]]
 ip = "ADD_YOUR_THIRD_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_THIRD_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_THIRD_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_THIRD_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_THIRD_IP_ADDRESS_HERE"""
 ```
 
 ### Unique custom certificates for PostgreSQL
@@ -150,17 +157,17 @@ To add unique custom certificates for 3 of the nodes of the PostgreSQL service,
 ```toml
 [postgresql.config]
 enable_custom_certs = true
-root_ca = "ADD_YOUR_ROOT_CA_CERT_HERE"
+root_ca = """ADD_YOUR_ROOT_CA_CERT_HERE"""
 [[postgresql.config.certs_by_ip]]
 ip = "ADD_YOUR_FIRST_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_FIRST_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_FIRST_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_FIRST_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_FIRST_IP_ADDRESS_HERE"""
 [[postgresql.config.certs_by_ip]]
 ip = "ADD_YOUR_SECOND_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_SECOND_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_SECOND_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_SECOND_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_SECOND_IP_ADDRESS_HERE"""
 [[postgresql.config.certs_by_ip]]
 ip = "ADD_YOUR_THIRD_IP_ADDRESS_HERE"
-private_key = "ADD_YOUR_PRIVATE_KEY_OF_THIRD_IP_ADDRESS_HERE"
-public_key = "ADD_YOUR_PUBLIC_KEY_OF_THIRD_IP_ADDRESS_HERE"
+private_key = """ADD_YOUR_PRIVATE_KEY_OF_THIRD_IP_ADDRESS_HERE"""
+public_key = """ADD_YOUR_PUBLIC_KEY_OF_THIRD_IP_ADDRESS_HERE"""
 ```
diff --git a/components/docs-chef-io/content/automate/ha_cert_rotation.md b/components/docs-chef-io/content/automate/ha_cert_rotation.md
index d80f37115..650d3df71 100644
--- a/components/docs-chef-io/content/automate/ha_cert_rotation.md
+++ b/components/docs-chef-io/content/automate/ha_cert_rotation.md
@@ -41,7 +41,7 @@ If you want to rotate certificates of the entire cluster, then you can follow th
 
 - To rotate certificates of automate cluster:
 
-`chef-automate cert-rotate --public-cert <path of public certificate> --private-cert <path of private certificate> --root-ca <path of root certificate> --a2`
+`chef-automate cert-rotate --public-cert <path of public certificate of automate node> --private-cert <path of private certificate of automate node> --root-ca <path of root certificate of automate load balancer> --a2`
 
 You can also use `--automate` or `-a` instead of a2 flag
 
diff --git a/components/docs-chef-io/content/automate/ha_chef_backend_to_automate_ha.md b/components/docs-chef-io/content/automate/ha_chef_backend_to_automate_ha.md
index 594ebd30c..045f17477 100644
--- a/components/docs-chef-io/content/automate/ha_chef_backend_to_automate_ha.md
+++ b/components/docs-chef-io/content/automate/ha_chef_backend_to_automate_ha.md
@@ -118,13 +118,15 @@ Before restoring the backup on the Automate HA Chef Server, configure [S3 storag
 - Execute the below command to install the habitat package for `knife-ec-backup`
 
     ```cmd
-        hab pkg install chef/knife-ec-backup
+    hab pkg install chef/knife-ec-backup
     ```
 
 - Execute the below command to restore the backup.
 
     ```cmd
-        hab pkg exec chef/knife-ec-backup knife ec restore <path/to/directory/backup_file> -yes --concurrency 1 --webui-key /hab/svc/automate-cs-oc-erchef/data/webui\_priv.pem --purge -c /hab/pkgs/chef/chef-server-ctl/*/*/omnibus-ctl/spec/fixtures/pivotal.rb
+    export LC_ALL=en_US.UTF-8
+    export LANG=en_US.UTF-8
+    hab pkg exec chef/knife-ec-backup knife ec restore <path/to/directory/backup_file> -yes --concurrency 1 --webui-key /hab/svc/automate-cs-oc-erchef/data/webui\_priv.pem --purge -c /hab/pkgs/chef/chef-server-ctl/*/*/omnibus-ctl/spec/fixtures/pivotal.rb
     ```
 
 ## Steps to Validate if Migration is Successful
diff --git a/components/docs-chef-io/content/automate/ha_onprim_deployment_procedure.md b/components/docs-chef-io/content/automate/ha_onprim_deployment_procedure.md
index a27d55a66..8a2289e1d 100644
--- a/components/docs-chef-io/content/automate/ha_onprim_deployment_procedure.md
+++ b/components/docs-chef-io/content/automate/ha_onprim_deployment_procedure.md
@@ -145,6 +145,7 @@ sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
 
 - Assuming 10+1 nodes (1 bastion, 2 for automate UI, 2 for Chef-server, 3 for Postgresql, 3 for Opensearch)
 - Following config will by default leave the backup configuration empty
+- To provide multiline certificates use triple quotes like `"""multiline certificate contents"""`
 
 {{< /note >}}
 
@@ -187,56 +188,61 @@ instance_count = "2"
 config_file = "configs/automate.toml"
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add Automate load balancer root-ca and keys
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+
+# Add Automate Load Balancer root-ca
+# root_ca = """root_ca_contents"""
+
+# Add Automate node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
+
 # Or you can provide certificates at the node level using the below fields
 # [[automate.config.certs_by_ip]]
 # ip = "A.B.C.D"
-# private_key = ""
-# public_key = ""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 [chef_server.config]
 instance_count = "2"
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add Chef Server load balancer root-ca and keys
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+
+# Add Chef Server node internal public and private keys
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
+
 # Or you can provide certificates at the node level using the below fields
 # [[chef_server.config.certs_by_ip]]
 # ip = "I.J.K.L"
-# private_key = ""
-# public_key = ""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 [opensearch.config]
 instance_count = "3"
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add OpenSearch load balancer root-ca and keys
-# root_ca = ""
-# admin_key = ""
-# admin_cert = ""
-# private_key = ""
-# public_key = ""
+# Add OpenSearch root-ca and keys
+# root_ca = """root_ca_contents"""
+# admin_key = """admin_private_key_contents"""
+# admin_cert = """admin_public_key_contents"""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 # Or you can provide certificates at the node level using the below fields
 # [[opensearch.config.certs_by_ip]]
 # ip = "A1.A2.A3.A4"
-# private_key = ""
-# public_key = ""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 [postgresql.config]
 instance_count = "3"
 # Set enable_custom_certs = true to provide custom certificates during deployment
 enable_custom_certs = false
-# Add Postgresql load balancer root-ca and keys
-# root_ca = ""
-# private_key = ""
-# public_key = ""
+# Add Postgresql root-ca and keys
+# root_ca = """root_ca_contents"""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 # Or you can provide certificates at the node level using the below fields
 # [[postgresql.config.certs_by_ip]]
 # ip = "D1.D2.D3.D4"
-# private_key = ""
-# public_key = ""
+# private_key = """private_key_contents"""
+# public_key = """public_key_contents"""
 [existing_infra.config]
 ## === INPUT NEEDED ===
 # provide comma separate IP address of nodes, like ["192.0.0.1", "192.0.0.2", "192.0.0.2"]
@@ -267,8 +273,8 @@ postgresql_private_ips = ["D1.D2.D3.D4","E1.E2.E3.E4","F1.F2.F3.F4"]
 
 - Follow the Prerequisites for On-Premise deployment. Click [here](#prerequisites) to know more.
 - This deployment excludes the installation for Postgresql and OpenSearch as we are using the AWS Managed Services.
-- Set up AWS RDS Postgresql 13.5. Click [here](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.PostgreSQL.html) to know more. Open the required port in Security Groups while creating AWS RDS Postgresql.
-- Set up AWS OpenSearch 1.2. Click [here](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html) to know more.
+- Set up AWS RDS PostgreSQL 13.5-R1. Click [here](/automate/create_amazon_rds/) to know more. Open the required port in Security Groups while creating AWS RDS Postgresql.
+- Set up AWS OpenSearch 1.3. Click [here](/automate/create_amazon_opensearch/) to know more.
 - For Backup and Restore with Managed Service. Click [here](/automate/managed_services/#prerequisites) to know more.
 - Create the Virtual Private Cloud (VPC) in AWS before starting or using default. Click [here](/automate/ha_vpc_setup/) to learn more about VPC and CIDR creation.
 - Get AWS credentials (`aws_access_key_id` and `aws_secret_access_key`) with privileges like: `AmazonS3FullAccess` and `AdministratorAccess`. Click [here](/automate/ha_iam_user/) to learn more about creating IAM Users.
@@ -281,7 +287,9 @@ Update Config with relevant data. Click [here](#sample-config-to-setup-on-premis
 
   - Provide instance count as `0` for both [opensearch.config] and [postgresql.config] and leave the values of opensearch_private_ips and postgresql_private_ips as an empty array.
   - Set `type` as `aws`, as these deployment steps are for Managed Services AWS Deployment. The default value is blank, which should change.
-  - Set `instance_url`, `superuser_username`, `superuser_password`, `dbuser_username`, `dbuser_password` for the **Managed AWS RDS Postgresql** created in the Prerequisite steps.
+  - Set `instance_url`, `superuser_username`, `superuser_password`, `dbuser_username`, `dbuser_password` for the **Managed AWS RDS Postgresql** created in the Prerequisite steps. 
+    - The master username value which you used while creating AWS RDS Postgresql can be used for both `superuser_username` and `dbuser_username`
+    - The master password value which you used while creating AWS RDS Postgresql can be used for both `superuser_password` and `dbuser_password`
   - Set `instance_url` as the URL with Port No. For example: `"database-1.c2kvay.eu-north-1.rds.amazonaws.com:5432"`
   - Set `opensearch_domain_name`, `opensearch_domain_url`, `opensearch_username`, `opensearch_user_password` for the **Managed AWS OpenSearch** created in the Prerequisite steps.
   - Set `opensearch_domain_url` as the URL without Port No. For example: `"vpc-automate-ha-cbyqy5q.eu-north-1.es.amazonaws.com"`.
@@ -364,6 +372,8 @@ Update Config with relevant data. Click [here](#sample-config-to-setup-on-premis
   - Provide instance count as `0` for both [opensearch.config] and [postgresql.config] and leave the values of opensearch_private_ips and postgresql_private_ips as an empty array.
   - Set `type` as `self-managed`, as these deployment steps are for Managed Services AWS Deployment. The default value is blank, which should change.
   - Set `instance_url`, `superuser_username`, `superuser_password`, `dbuser_username`, `dbuser_password` for your Self Managed RDS.
+    - You can use the same values for both `superuser_username` and `dbuser_username` too
+    - You can use the same values for both `superuser_password` and `dbuser_password` too
   - Set `instance_url` as the URL with Port No. For example: `"10.1.2.189:7432"`.
   - Provide the Root ca value of Postgresql `postgresql_root_cert`.
   - Set `opensearch_domain_name`, `opensearch_domain_url`, `opensearch_username`, `opensearch_user_password` for your Self Managed OpenSearch.
diff --git a/go.mod b/go.mod
index 8e9d62279..c894b477d 100644
--- a/go.mod
+++ b/go.mod
@@ -113,6 +113,7 @@ require (
 	github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869
 	github.com/gofiber/fiber/v2 v2.46.0
 	github.com/gofiber/utils v1.1.0
+	github.com/shirou/gopsutil v3.21.11+incompatible
 )
 
 require (
@@ -147,6 +148,7 @@ require (
 	github.com/felixge/httpsnoop v1.0.0 // indirect
 	github.com/fsnotify/fsnotify v1.4.7 // indirect
 	github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 // indirect
+	github.com/go-ole/go-ole v1.2.6 // indirect
 	github.com/go-openapi/errors v0.19.0 // indirect
 	github.com/go-openapi/strfmt v0.19.0 // indirect
 	github.com/gobwas/glob v0.2.3 // indirect
@@ -213,6 +215,8 @@ require (
 	github.com/stretchr/objx v0.4.0 // indirect
 	github.com/subosito/gotenv v1.2.0 // indirect
 	github.com/tinylib/msgp v1.1.8 // indirect
+	github.com/tklauser/go-sysconf v0.3.11 // indirect
+	github.com/tklauser/numcpus v0.6.0 // indirect
 	github.com/uber-go/atomic v1.4.0 // indirect
 	github.com/uber/jaeger-lib v1.3.1 // indirect
 	github.com/valyala/bytebufferpool v1.0.0 // indirect
@@ -221,6 +225,7 @@ require (
 	github.com/xrash/smetrics v0.0.0-20170218160415-a3153f7040e9 // indirect
 	github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c // indirect
 	github.com/yashtewari/glob-intersection v0.0.0-20180916065949-5c77d914dd0b // indirect
+	github.com/yusufpapurcu/wmi v1.2.3 // indirect
 	github.com/ziutek/mymysql v1.5.4 // indirect
 	go.etcd.io/bbolt v1.3.3 // indirect
 	go.opencensus.io v0.23.0 // indirect
diff --git a/go.sum b/go.sum
index 8c618ae48..2b4bc785a 100644
--- a/go.sum
+++ b/go.sum
@@ -269,6 +269,8 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
 github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
 github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 github.com/go-openapi/errors v0.19.0 h1:guf3T2lnCBKlODmERt4T9GtMWRpJOikgKGyIvi0xcb8=
 github.com/go-openapi/errors v0.19.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
@@ -766,6 +768,8 @@ github.com/segmentio/backo-go v0.0.0-20160424052352-204274ad699c/go.mod h1:kJ9mm
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/gopsutil v2.20.4+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
+github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/sirupsen/logrus v0.0.0-20180523074243-ea8897e79973/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
@@ -826,6 +830,10 @@ github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDW
 github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw=
 github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0=
 github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw=
+github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
+github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
+github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
+github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
 github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o=
@@ -857,6 +865,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
+github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 github.com/zclconf/go-cty v1.1.0 h1:uJwc9HiBOCpoKIObTQaLR+tsEXx1HBHnOsOOpcdhZgw=
 github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s=
 github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
@@ -1045,6 +1055,7 @@ golang.org/x/sys v0.0.0-20190620070143-6f217b454f45/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1078,6 +1089,7 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
diff --git a/lib/systemresource/mocksystemresource.go b/lib/systemresource/mocksystemresource.go
new file mode 100644
index 000000000..3b6800b30
--- /dev/null
+++ b/lib/systemresource/mocksystemresource.go
@@ -0,0 +1,26 @@
+package systemresource
+
+import "github.com/shirou/gopsutil/disk"
+
+type MockSystemResourceInfoImpl struct {
+	GetNumberOfCPUFunc   func() int
+	GetCPUSpeedFunc      func() (float64, error)
+	GetMemoryFunc        func() (float64, error)
+	GetDiskSpaceInfoFunc func(string) (disk.UsageStat, error)
+}
+
+func (mock *MockSystemResourceInfoImpl) GetNumberOfCPU() int {
+	return mock.GetNumberOfCPUFunc()
+}
+
+func (mock *MockSystemResourceInfoImpl) GetCPUSpeed() (float64, error) {
+	return mock.GetCPUSpeedFunc()
+}
+
+func (mock *MockSystemResourceInfoImpl) GetMemory() (float64, error) {
+	return mock.GetMemoryFunc()
+}
+
+func (mock *MockSystemResourceInfoImpl) GetDiskSpaceInfo(dirPath string) (disk.UsageStat, error) {
+	return mock.GetDiskSpaceInfoFunc(dirPath)
+}
diff --git a/lib/systemresource/systemresource.go b/lib/systemresource/systemresource.go
new file mode 100644
index 000000000..8f71baa6a
--- /dev/null
+++ b/lib/systemresource/systemresource.go
@@ -0,0 +1,61 @@
+package systemresource
+
+import (
+	"fmt"
+	"runtime"
+
+	"github.com/shirou/gopsutil/cpu"
+	"github.com/shirou/gopsutil/disk"
+	"github.com/shirou/gopsutil/mem"
+)
+
+type SystemResourceInfo interface {
+	GetNumberOfCPU() int
+	GetCPUSpeed() (float64, error)
+	GetMemory() (float64, error)
+	GetDiskSpaceInfo(dirPath string) (disk.UsageStat, error)
+}
+
+func NewSystemResourceInfoImpl() *SystemResourceInfoImpl {
+	return &SystemResourceInfoImpl{}
+}
+
+type SystemResourceInfoImpl struct{}
+
+func (s *SystemResourceInfoImpl) GetNumberOfCPU() int {
+	return runtime.NumCPU()
+}
+
+func (s *SystemResourceInfoImpl) GetCPUSpeed() (float64, error) {
+	info, err := cpu.Info()
+	if err != nil {
+		return 0, err
+	}
+
+	if len(info) == 0 {
+		return 0, fmt.Errorf("no CPU information available")
+	}
+
+	cpuSpeed := info[0].Mhz
+	return cpuSpeed / 1000, nil
+}
+
+func (s *SystemResourceInfoImpl) GetMemory() (float64, error) {
+
+	virtualMemory, err := mem.VirtualMemory()
+	if err != nil {
+		return 0, err
+	}
+
+	totalRAM := float64(virtualMemory.Total) / (1024 * 1024 * 1024)
+	return totalRAM, nil
+}
+
+func (s *SystemResourceInfoImpl) GetDiskSpaceInfo(dirPath string) (disk.UsageStat, error) {
+
+	usage, err := disk.Usage(dirPath)
+	if err != nil {
+		return disk.UsageStat{}, err
+	}
+	return *usage, nil
+}


Test patch:
diff --git a/components/automate-cli/cmd/chef-automate/testHA.go b/components/automate-cli/cmd/chef-automate/testHA.go
index b70b0d891..d35f41d8d 100644
--- a/components/automate-cli/cmd/chef-automate/testHA.go
+++ b/components/automate-cli/cmd/chef-automate/testHA.go
@@ -34,7 +34,7 @@ func runTestCmd(cmd *cobra.Command, args []string) error {
 		if testCommandFlags.full {
 			args = append(args, "--full")
 		}
-		return executeAutomateClusterCtlCommandAsync("test", args, testHAHelpDocs, true)
+		return executeAutomateClusterCtlCommandAsync("test", args, testHAHelpDocs, false)
 	} else {
 		return status.Wrap(errors.New(AUTOMATE_HA_INVALID_BASTION), status.ConfigError, testHAHelpDocs)
 	}
diff --git a/components/automate-cli/pkg/verifyserver/server/api/v1/systemresource_test.go b/components/automate-cli/pkg/verifyserver/server/api/v1/systemresource_test.go
new file mode 100644
index 000000000..c4bf07ea0
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/server/api/v1/systemresource_test.go
@@ -0,0 +1,151 @@
+package v1_test
+
+import (
+	"fmt"
+	"io"
+	"net/http/httptest"
+	"testing"
+
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/enums"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/models"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/server"
+	v1 "github.com/chef/automate/components/automate-cli/pkg/verifyserver/server/api/v1"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/systemresourceservice"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/utils/fiberutils"
+	"github.com/chef/automate/lib/logger"
+	"github.com/gofiber/fiber/v2"
+	"github.com/stretchr/testify/assert"
+)
+
+func SetupMockSystemResourceService(responseBody *models.ApiResult) systemresourceservice.SystemResourcesService {
+	return &systemresourceservice.MockSystemResourcesServiceImpl{
+		GetSystemResourcesForDeploymentFunc: func(nodeType enums.NodeType, deploymentState enums.DeploymentState) *models.ApiResult {
+			return responseBody
+		},
+	}
+}
+
+func SetupSystemResourceServiceHandler(srs systemresourceservice.SystemResourcesService) (*fiber.App, error) {
+	log, err := logger.NewLogger("text", "debug")
+	if err != nil {
+		return nil, err
+	}
+
+	fconf := fiber.Config{
+		ServerHeader: server.SERVICE,
+		ErrorHandler: fiberutils.CustomErrorHandler,
+	}
+	app := fiber.New(fconf)
+	handler := v1.NewHandler(log).AddSystemResourceService(srs)
+
+	vs := &server.VerifyServer{
+		Port:    server.DEFAULT_PORT,
+		Log:     log,
+		App:     app,
+		Handler: handler,
+	}
+	vs.SetupRoutes()
+	return vs.App, nil
+}
+
+func TestSystemResourceAPI(t *testing.T) {
+	testCases := []struct {
+		testCaseDescreption string
+		responseBody        *models.ApiResult
+		expectedCode        int
+		expectedBody        string
+		expectedError       error
+		nodeType            enums.NodeType
+		deploymentState     enums.DeploymentState
+	}{
+		{
+			testCaseDescreption: "200:Success response no error",
+			responseBody: &models.ApiResult{
+				Passed: true,
+				Checks: []models.Checks{
+					{
+						Title:         "CPU count check",
+						Passed:        true,
+						SuccessMsg:    fmt.Sprintf("CPU count is >=%d", constants.MIN_CPU_COUNT),
+						ErrorMsg:      "",
+						ResolutionMsg: "",
+					},
+					{
+						Title:         "CPU speed check",
+						Passed:        true,
+						SuccessMsg:    fmt.Sprintf("CPU speed should be >=%vGhz", constants.MIN_CPU_SPEED),
+						ErrorMsg:      "",
+						ResolutionMsg: "",
+					},
+					{
+						Title:         "Memory size check",
+						Passed:        true,
+						SuccessMsg:    fmt.Sprintf("Memory should be >=%vGB", constants.MIN_MEMORY),
+						ErrorMsg:      "",
+						ResolutionMsg: "",
+					},
+					{
+						Title:         "Hab free space check",
+						Passed:        true,
+						SuccessMsg:    fmt.Sprintf("/hab should have free space >=%vGB", constants.HAB_FREE_DISK_BEFORE_DEP_A2),
+						ErrorMsg:      "",
+						ResolutionMsg: "",
+					},
+					{
+						Title:         "Temp free space check",
+						Passed:        true,
+						SuccessMsg:    fmt.Sprintf("/tmp should have free space >=%vGB or %v%% of total size of /hab", constants.TMP_FREE_DISK_IN_GB, constants.TMP_FREE_DISK_IN_PER*100),
+						ErrorMsg:      "",
+						ResolutionMsg: "",
+					},
+					{
+						Title:         "/(root volume) free space check",
+						Passed:        true,
+						SuccessMsg:    fmt.Sprintf("/(root volume) should have free space >=%vGB or %v%% of total size of /hab", constants.ROOT_FREE_DISK_IN_GB, constants.ROOT_FREE_DISK_IN_PER*100),
+						ErrorMsg:      "",
+						ResolutionMsg: "",
+					},
+				},
+			},
+			expectedCode:    200,
+			expectedBody:    "{\"status\":\"SUCCESS\",\"result\":{\"passed\":true,\"msg\":\"\",\"check\":\"\",\"checks\":[{\"title\":\"CPU count check\",\"passed\":true,\"success_msg\":\"CPU count is \\u003e=4\",\"error_msg\":\"\",\"resolution_msg\":\"\"},{\"title\":\"CPU speed check\",\"passed\":true,\"success_msg\":\"CPU speed should be \\u003e=2Ghz\",\"error_msg\":\"\",\"resolution_msg\":\"\"},{\"title\":\"Memory size check\",\"passed\":true,\"success_msg\":\"Memory should be \\u003e=14GB\",\"error_msg\":\"\",\"resolution_msg\":\"\"},{\"title\":\"Hab free space check\",\"passed\":true,\"success_msg\":\"/hab should have free space \\u003e=80GB\",\"error_msg\":\"\",\"resolution_msg\":\"\"},{\"title\":\"Temp free space check\",\"passed\":true,\"success_msg\":\"/tmp should have free space \\u003e=10GB or 5% of total size of /hab\",\"error_msg\":\"\",\"resolution_msg\":\"\"},{\"title\":\"/(root volume) free space check\",\"passed\":true,\"success_msg\":\"/(root volume) should have free space \\u003e=20GB or 20% of total size of /hab\",\"error_msg\":\"\",\"resolution_msg\":\"\"}]}}",
+			nodeType:        enums.NodeTypeAutomate,
+			deploymentState: enums.DeploymentStatePreDeploy,
+		},
+		{
+			testCaseDescreption: "400:WrongQuery | deployment_state",
+			responseBody:        nil,
+			expectedCode:        400,
+			expectedBody:        "{\"status\":\"FAILED\",\"result\":null,\"error\":{\"code\":400,\"message\":\"Unsupported query or missing query. Expected values for query 'deployment_state' are pre-deploy,post-deploy\"}}",
+			nodeType:            enums.NodeTypeAutomate,
+			deploymentState:     enums.DeploymentState("InvalidDepState"),
+		},
+		{
+			testCaseDescreption: "400:WrongQuery | nodeType",
+			responseBody:        nil,
+			expectedCode:        400,
+			expectedBody:        "{\"status\":\"FAILED\",\"result\":null,\"error\":{\"code\":400,\"message\":\"Unsupported query or missing query. Expected values for query 'node_type' are automate,chef-infra-server,postgresql,opensearch,bastion\"}}",
+			nodeType:            enums.NodeType("wrongnode"),
+			deploymentState:     enums.DeploymentStatePreDeploy,
+		},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.testCaseDescreption, func(t *testing.T) {
+			app, err := SetupSystemResourceServiceHandler(SetupMockSystemResourceService(testCase.responseBody))
+
+			reqUrl := fmt.Sprintf("/api/v1/checks/system-resource?node_type=%s&deployment_state=%s", testCase.nodeType, testCase.deploymentState)
+			assert.NoError(t, err)
+			req := httptest.NewRequest("GET", reqUrl, nil)
+			req.Header.Add("Content-Type", "application/json")
+			res, err := app.Test(req, -1)
+			assert.NoError(t, err)
+			body, err := io.ReadAll(res.Body)
+
+			assert.NoError(t, err)
+			assert.Equal(t, testCase.expectedBody, string(body))
+			assert.Equal(t, res.StatusCode, testCase.expectedCode)
+		})
+	}
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/systemresourceservice/systemresourcesservice_test.go b/components/automate-cli/pkg/verifyserver/services/systemresourceservice/systemresourcesservice_test.go
new file mode 100644
index 000000000..8dd61c576
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/systemresourceservice/systemresourcesservice_test.go
@@ -0,0 +1,695 @@
+package systemresourceservice_test
+
+import (
+	"errors"
+	"fmt"
+	"testing"
+
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/enums"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/models"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/systemresourceservice"
+	"github.com/chef/automate/lib/io/fileutils"
+	"github.com/chef/automate/lib/logger"
+	"github.com/chef/automate/lib/systemresource"
+	"github.com/shirou/gopsutil/disk"
+	"github.com/stretchr/testify/assert"
+)
+
+type testCase struct {
+	testCaseDescription string
+	nodeType            enums.NodeType
+	respWant            *models.Checks
+	mockSystemResource  systemresource.SystemResourceInfo
+	mockFileUtils       fileutils.FileUtils
+}
+
+const (
+	DISK_SPACE_CALC_ERR = "error occured while fetching total and/or free disk space"
+)
+
+func TestGetCpuCountCheck(t *testing.T) {
+	log, _ := logger.NewLogger("text", "debug")
+	srv := systemresourceservice.NewSystemResourceService(log, &systemresource.MockSystemResourceInfoImpl{}, &fileutils.MockFileSystemUtils{})
+
+	testCases := []testCase{
+		{
+			testCaseDescription: "Cpu count is expected",
+			respWant:            srv.GetChecksModel(true, constants.CPU_COUNT_CHECK_TITLE, fmt.Sprintf("CPU count is >=%v", constants.MIN_CPU_COUNT), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetNumberOfCPUFunc: func() int {
+					return constants.MIN_CPU_COUNT
+				},
+			},
+		},
+		{
+			testCaseDescription: "Cpu count is not expected",
+			respWant:            srv.GetChecksModel(false, constants.CPU_COUNT_CHECK_TITLE, "", fmt.Sprintf("CPU count is %v", constants.MIN_CPU_COUNT-1), fmt.Sprintf("CPU count should be >=%v", constants.MIN_CPU_COUNT)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetNumberOfCPUFunc: func() int {
+					return constants.MIN_CPU_COUNT - 1
+				},
+			},
+		},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.testCaseDescription, func(t *testing.T) {
+			srv.SystemResourceInfo = testCase.mockSystemResource
+			respGet := srv.CheckCpuCount()
+			assert.Equal(t, testCase.respWant, respGet)
+		})
+	}
+}
+
+func TestGetCpuSpeedCheck(t *testing.T) {
+	log, _ := logger.NewLogger("text", "debug")
+	srv := systemresourceservice.NewSystemResourceService(log, &systemresource.MockSystemResourceInfoImpl{}, &fileutils.MockFileSystemUtils{})
+	testCases := []testCase{
+		{
+			testCaseDescription: "CPU speed is expected",
+			respWant:            srv.GetChecksModel(true, constants.CPU_SPEED_CHECK_TITLE, fmt.Sprintf("CPU speed should be >=%vGHz", constants.MIN_CPU_SPEED), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetCPUSpeedFunc: func() (float64, error) {
+					return constants.MIN_CPU_SPEED + 1, nil
+				},
+			},
+		},
+		{
+			testCaseDescription: "CPU speed is not expected",
+			respWant:            srv.GetChecksModel(false, constants.CPU_SPEED_CHECK_TITLE, "", fmt.Sprintf("CPU speed is %vGHz", constants.MIN_CPU_SPEED-1), fmt.Sprintf("CPU speed should be >=%vGHz", constants.MIN_CPU_SPEED)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetCPUSpeedFunc: func() (float64, error) {
+					return constants.MIN_CPU_SPEED - 1, nil
+				},
+			},
+		},
+		{
+			testCaseDescription: "System is not running on supported platform",
+			respWant:            srv.GetChecksModel(false, constants.CPU_SPEED_CHECK_TITLE, "", errors.New("error occured while fetching cpu speed").Error(), constants.RESOLUTION_MSG),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetCPUSpeedFunc: func() (float64, error) {
+					return 0, errors.New("error occured while fetching cpu speed")
+				},
+			},
+		},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.testCaseDescription, func(t *testing.T) {
+			srv.SystemResourceInfo = testCase.mockSystemResource
+			respGet := srv.CheckCpuSpeed()
+			assert.Equal(t, testCase.respWant, respGet)
+		})
+	}
+}
+
+func TestGetMemorySizeCheck(t *testing.T) {
+	log, _ := logger.NewLogger("text", "debug")
+	srv := systemresourceservice.NewSystemResourceService(log, &systemresource.MockSystemResourceInfoImpl{}, &fileutils.MockFileSystemUtils{})
+	testCases := []testCase{
+		{
+			testCaseDescription: "Memory value is expected",
+			respWant:            srv.GetChecksModel(true, constants.MEMORY_SIZE_CHECK_TITLE, fmt.Sprintf("Memory should be >=%vGB", constants.MIN_MEMORY), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetMemoryFunc: func() (float64, error) {
+					return float64(constants.MIN_MEMORY), nil
+				},
+			},
+		},
+		{
+			testCaseDescription: "Memory value is not expected",
+			respWant:            srv.GetChecksModel(false, constants.MEMORY_SIZE_CHECK_TITLE, "", fmt.Sprintf("Memory is %0.2fGB", float64(constants.MIN_MEMORY-2)), fmt.Sprintf("Memory should be >=%vGB", constants.MIN_MEMORY)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetMemoryFunc: func() (float64, error) {
+					return float64(constants.MIN_MEMORY - 2), nil
+				},
+			},
+		},
+		{
+			testCaseDescription: "Error while reading memory size",
+			respWant:            srv.GetChecksModel(false, constants.MEMORY_SIZE_CHECK_TITLE, "", "error occured while reading memory size", constants.RESOLUTION_MSG),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetMemoryFunc: func() (float64, error) {
+					return float64(0), errors.New("error occured while reading memory size")
+				},
+			},
+		},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.testCaseDescription, func(t *testing.T) {
+			srv.SystemResourceInfo = testCase.mockSystemResource
+			respGet := srv.CheckMemorySize()
+			assert.Equal(t, testCase.respWant, respGet)
+		})
+	}
+}
+
+func TestGetFreeDiskSpaceCheckOfDir(t *testing.T) {
+	log, _ := logger.NewLogger("text", "debug")
+	srv := systemresourceservice.NewSystemResourceService(log, &systemresource.MockSystemResourceInfoImpl{}, &fileutils.MockFileSystemUtils{})
+	successMockCheckDirFunc := func(s string) (bool, error) {
+		return true, nil
+	}
+
+	testCasesTmpSpaceCheck := []testCase{
+		{
+			testCaseDescription: "Checking free disk in /tmp",
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Temp"), fmt.Sprintf(constants.SUCCESS_MSG, "/tmp", constants.TMP_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.TMP_FREE_DISK_IN_PER*100), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64(11 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Checking free disk in /tmp",
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Temp"), "", fmt.Sprintf(constants.ERROR_MSG, "/tmp", float64(9)), fmt.Sprintf(constants.SUCCESS_MSG, "/tmp", constants.TMP_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.TMP_FREE_DISK_IN_PER*100)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64(9 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Checking free disk in /tmp",
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Temp"), fmt.Sprintf(constants.SUCCESS_MSG, "/tmp", constants.TMP_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.TMP_FREE_DISK_IN_PER*100), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(300 * constants.GB_TO_BYTES),
+						Free:  uint64(16 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Checking free disk in /tmp",
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Temp"), "", fmt.Sprintf(constants.ERROR_MSG, "/tmp", float64(14)), fmt.Sprintf(constants.SUCCESS_MSG, "/tmp", constants.TMP_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.TMP_FREE_DISK_IN_PER*100)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(300 * constants.GB_TO_BYTES),
+						Free:  uint64(14 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Checking free disk in /tmp | error",
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Temp"), "", "error occured while fetching tmp disk space", constants.RESOLUTION_MSG),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{}, errors.New("error occured while fetching tmp disk space")
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+	}
+
+	for _, testCase := range testCasesTmpSpaceCheck {
+		t.Run(testCase.testCaseDescription, func(t *testing.T) {
+			srv.SystemResourceInfo = testCase.mockSystemResource
+			srv.Fileutils = testCase.mockFileUtils
+			respGet := srv.CheckFreeDiskSpaceOfDir("/tmp", constants.TMP_FREE_DISK_IN_PER, constants.TMP_FREE_DISK_IN_GB, "Temp")
+			assert.Equal(t, testCase.respWant, respGet)
+		})
+	}
+
+	testCasesRootSpaceCheck := []testCase{
+		{
+			testCaseDescription: "Checking free disk in / (root)",
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "/(root volume)"), fmt.Sprintf(constants.SUCCESS_MSG, "/(root volume)", constants.ROOT_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.ROOT_FREE_DISK_IN_PER*100), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64(21 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Checking free disk in / (root)",
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "/(root volume)"), "", fmt.Sprintf(constants.ERROR_MSG, "/(root volume)", float64(19)), fmt.Sprintf(constants.SUCCESS_MSG, "/(root volume)", constants.ROOT_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.ROOT_FREE_DISK_IN_PER*100)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64(19 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Checking free disk in / (root)",
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "/(root volume)"), "", fmt.Sprintf(constants.ERROR_MSG, "/(root volume)", float64(25)), fmt.Sprintf(constants.SUCCESS_MSG, "/(root volume)", constants.ROOT_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.ROOT_FREE_DISK_IN_PER*100)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(200 * constants.GB_TO_BYTES),
+						Free:  uint64(25 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Checking free disk in / (root)",
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "/(root volume)"), fmt.Sprintf(constants.SUCCESS_MSG, "/(root volume)", constants.ROOT_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.ROOT_FREE_DISK_IN_PER*100), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(200 * constants.GB_TO_BYTES),
+						Free:  uint64(42 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+	}
+
+	for _, testCase := range testCasesRootSpaceCheck {
+		t.Run(testCase.testCaseDescription, func(t *testing.T) {
+			srv.SystemResourceInfo = testCase.mockSystemResource
+			srv.Fileutils = testCase.mockFileUtils
+			respGet := srv.CheckFreeDiskSpaceOfDir("/", constants.ROOT_FREE_DISK_IN_PER, constants.ROOT_FREE_DISK_IN_GB, "/(root volume)")
+			assert.Equal(t, testCase.respWant, respGet)
+		})
+	}
+}
+
+func TestGetHabFreeSpaceCheckPreDeployment(t *testing.T) {
+	log, _ := logger.NewLogger("text", "debug")
+	srv := systemresourceservice.NewSystemResourceService(log, &systemresource.MockSystemResourceInfoImpl{}, &fileutils.MockFileSystemUtils{})
+	successMockCheckDirFunc := func(s string) (bool, error) {
+		return true, nil
+	}
+
+	testCases := []testCase{
+		{
+			testCaseDescription: "Pre-deployment hab free space check | automate",
+			nodeType:            enums.NodeTypeAutomate,
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_BEFORE_DEP_A2), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64((constants.HAB_FREE_DISK_BEFORE_DEP_A2 + 1) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Pre-deployment hab free space check | chef-serve",
+			nodeType:            enums.NodeTypeChefServer,
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_BEFORE_DEP_CS), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64((constants.HAB_FREE_DISK_BEFORE_DEP_CS + 1) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Pre-deployment hab free space check | postgresql",
+			nodeType:            enums.NodeTypePostgresql,
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_BEFORE_DEP_PG), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64((constants.HAB_FREE_DISK_BEFORE_DEP_PG + 1) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Pre-deployment hab free space check | opensearch",
+			nodeType:            enums.NodeTypeOpensearch,
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_BEFORE_DEP_OS), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64((constants.HAB_FREE_DISK_BEFORE_DEP_OS + 1) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Pre-deployment hab free space check | bastion",
+			nodeType:            enums.NodeTypeBastion,
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_BEFORE_DEP_BASTION), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64((constants.HAB_FREE_DISK_BEFORE_DEP_BASTION + 1) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Pre-deployment hab free space check | automate",
+			nodeType:            enums.NodeTypeAutomate,
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), "", fmt.Sprintf(constants.ERROR_MSG, "/hab", float64(constants.HAB_FREE_DISK_BEFORE_DEP_A2-1)), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_BEFORE_DEP_A2)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64((constants.HAB_FREE_DISK_BEFORE_DEP_A2 - 1) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Pre-deployment hab free space check | error case",
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), "", DISK_SPACE_CALC_ERR, constants.RESOLUTION_MSG),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{}, errors.New(DISK_SPACE_CALC_ERR)
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.testCaseDescription, func(t *testing.T) {
+			srv.SystemResourceInfo = testCase.mockSystemResource
+			srv.Fileutils = testCase.mockFileUtils
+			respGet := srv.CheckHabFreeSpacePreDeployment(testCase.nodeType)
+			assert.Equal(t, testCase.respWant, respGet)
+		})
+	}
+}
+
+func TestGetHabFreeSpaceCheckPostDeployment(t *testing.T) {
+	log, _ := logger.NewLogger("text", "debug")
+	srv := systemresourceservice.NewSystemResourceService(log, &systemresource.MockSystemResourceInfoImpl{}, &fileutils.MockFileSystemUtils{})
+	successMockCheckDirFunc := func(s string) (bool, error) {
+		return true, nil
+	}
+
+	testCases := []testCase{
+		{
+			testCaseDescription: "Post-deployment hab free space check | automate",
+			nodeType:            enums.NodeTypeAutomate,
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_AFTER_DEP_A2)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_A2_IN_PER*100), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64((constants.HAB_FREE_DISK_AFTER_DEP_A2 + 1) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Post-deployment hab free space check | automate",
+			nodeType:            enums.NodeTypeAutomate,
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), "", fmt.Sprintf(constants.ERROR_MSG, "/hab", float64(14)), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_AFTER_DEP_A2)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_A2_IN_PER*100)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(300 * constants.GB_TO_BYTES),
+						Free:  uint64(14 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Post-deployment hab free space check | chef-server",
+			nodeType:            enums.NodeTypeChefServer,
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), "", fmt.Sprintf(constants.ERROR_MSG, "/hab", float64(constants.HAB_FREE_DISK_AFTER_DEP_CS-1)), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_AFTER_DEP_CS)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_CS_IN_PER*100)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64((constants.HAB_FREE_DISK_AFTER_DEP_CS - 1) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Post-deployment hab free space check | opensearch",
+			nodeType:            enums.NodeTypeOpensearch,
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_AFTER_DEP_OS)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_OS_IN_PER*100), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64((constants.HAB_FREE_DISK_AFTER_DEP_OS + 1) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Post-deployment hab free space check | opensearch",
+			nodeType:            enums.NodeTypeOpensearch,
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), "", fmt.Sprintf(constants.ERROR_MSG, "/hab", float64(100)), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_AFTER_DEP_OS)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_OS_IN_PER*100)),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(1000 * constants.GB_TO_BYTES),
+						Free:  uint64(100 * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Post-deployment hab free space check | postgresql",
+			nodeType:            enums.NodeTypePostgresql,
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_AFTER_DEP_PG)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_PG_IN_PER*100), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(1000 * constants.GB_TO_BYTES),
+						Free:  uint64((1000 * constants.HAB_FREE_DISK_AFTER_DEP_PG_IN_PER) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Post-deployment hab free space check | bastion",
+			nodeType:            enums.NodeTypeBastion,
+			respWant:            srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_AFTER_DEP_BASTION)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_BASTION_IN_PER*100), "", ""),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(300 * constants.GB_TO_BYTES),
+						Free:  uint64((300 * constants.HAB_FREE_DISK_AFTER_DEP_BASTION_IN_PER) * constants.GB_TO_BYTES),
+					}, nil
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+		{
+			testCaseDescription: "Post-deployment hab free space check | error case",
+			nodeType:            enums.NodeTypeAutomate,
+			respWant:            srv.GetChecksModel(false, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), "", "error occured while fetching disk space info", constants.RESOLUTION_MSG),
+			mockSystemResource: &systemresource.MockSystemResourceInfoImpl{
+				GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{}, errors.New("error occured while fetching disk space info")
+				},
+			},
+			mockFileUtils: &fileutils.MockFileSystemUtils{
+				PathExistsFunc: successMockCheckDirFunc,
+			},
+		},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.testCaseDescription, func(t *testing.T) {
+			srv.SystemResourceInfo = testCase.mockSystemResource
+			srv.Fileutils = testCase.mockFileUtils
+			respGet := srv.CheckHabFreeSpacePostDeployment(testCase.nodeType)
+			assert.Equal(t, testCase.respWant, respGet)
+		})
+	}
+}
+
+func TestGetSystemResourcesForDeployment(t *testing.T) {
+	log, _ := logger.NewLogger("text", "debug")
+	srv := systemresourceservice.NewSystemResourceService(log, &systemresource.MockSystemResourceInfoImpl{}, &fileutils.MockFileSystemUtils{})
+	successMockCheckDirFunc := func(s string) (bool, error) {
+		return true, nil
+	}
+
+	type testCase struct {
+		testCaseDescription string
+		respWant            *models.ApiResult
+		mockSystemResource  *systemresource.MockSystemResourceInfoImpl
+		mockFsUtils         fileutils.FileUtils
+		nodeType            enums.NodeType
+		deploymentState     enums.DeploymentState
+	}
+
+	validChecks := []models.Checks{
+		*srv.GetChecksModel(true, constants.CPU_COUNT_CHECK_TITLE, fmt.Sprintf("CPU count is >=%v", constants.MIN_CPU_COUNT), "", ""),
+		*srv.GetChecksModel(true, constants.CPU_SPEED_CHECK_TITLE, fmt.Sprintf("CPU speed should be >=%vGHz", constants.MIN_CPU_SPEED), "", ""),
+		*srv.GetChecksModel(true, constants.MEMORY_SIZE_CHECK_TITLE, fmt.Sprintf("Memory should be >=%vGB", constants.MIN_MEMORY), "", ""),
+		*srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_BEFORE_DEP_A2), "", ""),
+		*srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Temp"), fmt.Sprintf(constants.SUCCESS_MSG, "/tmp", constants.TMP_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.TMP_FREE_DISK_IN_PER*100), "", ""),
+		*srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "/(root volume)"), fmt.Sprintf(constants.SUCCESS_MSG, "/(root volume)", constants.ROOT_FREE_DISK_IN_GB)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.ROOT_FREE_DISK_IN_PER*100), "", ""),
+	}
+
+	mockSystemResourceInfo := &systemresource.MockSystemResourceInfoImpl{
+		GetNumberOfCPUFunc: func() int {
+			return constants.MIN_CPU_COUNT
+		},
+		GetCPUSpeedFunc: func() (float64, error) {
+			return constants.MIN_CPU_SPEED + 1, nil
+		},
+		GetMemoryFunc: func() (float64, error) {
+			return float64(constants.MIN_MEMORY), nil
+		},
+		GetDiskSpaceInfoFunc: func(s string) (disk.UsageStat, error) {
+			return disk.UsageStat{
+				Total: uint64(100 * constants.GB_TO_BYTES),
+				Free:  uint64((constants.HAB_FREE_DISK_BEFORE_DEP_A2 + 1) * constants.GB_TO_BYTES),
+			}, nil
+		},
+	}
+
+	mockFsUtils := &fileutils.MockFileSystemUtils{
+		PathExistsFunc: successMockCheckDirFunc,
+	}
+
+	testCases := []testCase{
+		{
+			testCaseDescription: "nodeType=automate,deploymentState=pre-deploy",
+			respWant: &models.ApiResult{
+				Passed: true,
+				Checks: validChecks,
+			},
+			mockSystemResource: mockSystemResourceInfo,
+			mockFsUtils:        mockFsUtils,
+			nodeType:           enums.NodeTypeAutomate,
+			deploymentState:    enums.DeploymentStatePreDeploy,
+		},
+		{
+			testCaseDescription: "nodeType=automate,deploymentState=postDeploy",
+			respWant: &models.ApiResult{
+				Passed: true,
+				Checks: validChecks,
+			},
+			mockSystemResource: mockSystemResourceInfo,
+			mockFsUtils:        mockFsUtils,
+			nodeType:           enums.NodeTypeAutomate,
+			deploymentState:    enums.DeploymentStatePostDeploy,
+		},
+		{
+			testCaseDescription: "nodeType=automate,deploymentState=preDeploy",
+			respWant: &models.ApiResult{
+				Passed: false,
+				Checks: validChecks,
+			},
+			mockSystemResource: mockSystemResourceInfo,
+			mockFsUtils:        mockFsUtils,
+			nodeType:           enums.NodeTypeAutomate,
+			deploymentState:    enums.DeploymentStatePostDeploy,
+		},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.testCaseDescription, func(t *testing.T) {
+
+			if testCase.deploymentState == constants.POST_DEPLOY {
+				testCase.respWant.Checks[3] = *srv.GetChecksModel(true, fmt.Sprintf(constants.FREE_SPACE_CHECK, "Hab"), fmt.Sprintf(constants.SUCCESS_MSG, "/hab", constants.HAB_FREE_DISK_AFTER_DEP_A2)+fmt.Sprintf(constants.SUCCESS_MSG_IN_PER, constants.HAB_FREE_DISK_AFTER_DEP_A2_IN_PER*100), "", "")
+				testCase.mockSystemResource.GetDiskSpaceInfoFunc = func(s string) (disk.UsageStat, error) {
+					return disk.UsageStat{
+						Total: uint64(100 * constants.GB_TO_BYTES),
+						Free:  uint64(30 * constants.GB_TO_BYTES),
+					}, nil
+				}
+			}
+
+			if !testCase.respWant.Passed {
+				testCase.respWant.Checks[0] = *srv.GetChecksModel(false, constants.CPU_COUNT_CHECK_TITLE, "", fmt.Sprintf("CPU count is %v", constants.MIN_CPU_COUNT-1), fmt.Sprintf("CPU count should be >=%v", constants.MIN_CPU_COUNT))
+				testCase.mockSystemResource.GetNumberOfCPUFunc = func() int {
+					return constants.MIN_CPU_COUNT - 1
+				}
+			}
+
+			srv.SystemResourceInfo = testCase.mockSystemResource
+			srv.Fileutils = testCase.mockFsUtils
+			respGet := srv.GetSystemResourcesForDeployment(testCase.nodeType, testCase.deploymentState)
+			assert.Equal(t, testCase.respWant, respGet)
+		})
+	}
+}
diff --git a/lib/systemresource/systemresource_test.go b/lib/systemresource/systemresource_test.go
new file mode 100644
index 000000000..440758518
--- /dev/null
+++ b/lib/systemresource/systemresource_test.go
@@ -0,0 +1,71 @@
+package systemresource_test
+
+import (
+	"errors"
+	"testing"
+
+	"github.com/chef/automate/lib/systemresource"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestGetNumberOfCPU(t *testing.T) {
+	systemresource := systemresource.NewSystemResourceInfoImpl()
+
+	ncpu := systemresource.GetNumberOfCPU()
+	assert.NotZero(t, ncpu)
+}
+
+func TestGetDiskSpaceInfo(t *testing.T) {
+	systemresource := systemresource.NewSystemResourceInfoImpl()
+
+	testCase := []struct {
+		path string
+		err  error
+	}{
+		{
+			"./",
+			nil,
+		},
+		{
+			"/notexist",
+			errors.New("path not exist"),
+		},
+	}
+
+	for _, testCase := range testCase {
+
+		t.Run("Disk space check", func(t *testing.T) {
+			usage, err := systemresource.GetDiskSpaceInfo(testCase.path)
+
+			if err != nil {
+				assert.Zero(t, usage)
+				assert.Zero(t, usage)
+			} else {
+				assert.NotZero(t, usage)
+				assert.NotZero(t, usage)
+			}
+		})
+	}
+}
+
+func TestGetCPUSpeed(t *testing.T) {
+	systemresource := systemresource.NewSystemResourceInfoImpl()
+	cpuSpeed, err := systemresource.GetCPUSpeed()
+
+	if err != nil {
+		assert.Zero(t, cpuSpeed)
+	} else {
+		assert.NotZero(t, cpuSpeed)
+	}
+}
+
+func TestGetMemory(t *testing.T) {
+	systemresource := systemresource.NewSystemResourceInfoImpl()
+	memory, err := systemresource.GetMemory()
+
+	if err != nil {
+		assert.Zero(t, memory)
+	} else {
+		assert.NotZero(t, memory)
+	}
+}