Repository: chef/automate
Pull request #7947 (2023-06-05 10:21:20)

Chef 3227 - Integrate Mock server in batchcheck service
### :nut_and_bolt: Description: What code changed, and why?
Added mock serve start and stop implementation in batch-check api  so that it can run mock server on nodes to run test.

### :chains: Related Resources
https://chefio.atlassian.net/browse/CHEF-3227

### :+1: Definition of Done

### :athletic_shoe: How to Build and Test the Change
1. rebuild component/automate-cli
2. scp automate-cli to all the nodes.
3. Run chef-automate verify serve
4. Hit the batch check api.

### :white_check_mark: Checklist
1. When verify server is running on all nodes -> mock server started successfully -> batch check execute tests
2. When verify server is running on some nodes that are present in config -> Mock server start fails on some nodes so overall it stops mock server on other nodes -> batch check do not execute test but give error
3. When verify server is running on some nodes that are present in config  and  some wrong ip are also passed in config-> Mock server start fails on wrong ip nodes so overall it stops mock server on other nodes -> batch check do not execute test but give error
4. When verify server is running on all nodes -> Mock server is already running on a port on a node -> mock server start fails so it stop other started mock servers -> batch check do not execute test but give error
 

**All PRs** must tick these:

- [ ] I have read the [CONTRIBUTING document](https://github.com/chef/automate/blob/master/CONTRIBUTING.md).
- [ ] 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
<img width="840" alt="Screenshot 2023-06-06 at 1 14 57 PM" src="https://github.com/chef/automate/assets/10796521/16a6ff16-8772-43be-b03f-03e441ea5adb">
<img width="518" alt="Screenshot 2023-06-07 at 10 37 24 AM" src="https://github.com/chef/automate/assets/10796521/20d2e4cd-350f-44eb-8e1c-60eb3a204906">

https://progresssoftware.sharepoint.com/:v:/s/ChefCoreC/ESrmiev1CRNIgR6BwMYplVcBBNKQXFWtPGiF_LfFKOUtwQ?e=JkITu9




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


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | cb100211c267845f22959cd5cd59fa3437c24166 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/chef-automate/deploys/647db723bcb7fa00085b9ce8 |
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=7947)

[![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=7947) [![76.9%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '76.9%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947) 76.9% Coverage on New Code (is less than 80%)  
[![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=7947) [![5.3%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/10-16px.png '5.3%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947) 5.26% Duplicated Lines (%) on New Code (is greater than 3%)  

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


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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [4 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![91.9%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/90-16px.png '91.9%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [91.9% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [4 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![91.9%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/90-16px.png '91.9%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [91.9% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [5 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![92.0%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/90-16px.png '92.0%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [92.0% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [3 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_coverage&view=list) [92.1% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![91.5%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/90-16px.png '91.5%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [91.5% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_coverage&view=list) [86.0% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947) [![39.7%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/25-16px.png '39.7%')](https://sonar.progress.com/dashboard?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947) 39.7% Coverage on New Code (is less than 80%)  

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


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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![83.9%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '83.9%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [83.9% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![83.9%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '83.9%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [83.9% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![83.9%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '83.9%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [83.9% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![83.9%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '83.9%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [83.9% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![83.9%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '83.9%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [83.9% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![84.4%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '84.4%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [84.4% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947)

[![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=7947&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=7947&resolved=false&types=BUG) [0 Bugs](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&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=7947&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947) [![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=7947) [0 Security Hotspots](https://sonar.progress.com/security_hotspots?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947)  
[![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=7947&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=7947&resolved=false&types=CODE_SMELL) [1 Code Smell](https://sonar.progress.com/project/issues?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&resolved=false&types=CODE_SMELL)

[![84.3%](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/60-16px.png '84.3%')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_coverage&view=list) [84.3% Coverage](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&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=7947&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=7947&metric=new_duplicated_lines_density&view=list)



Patch:
diff --git a/.bldr.toml b/.bldr.toml
index 13c9dbb12..d6876584d 100644
--- a/.bldr.toml
+++ b/.bldr.toml
@@ -439,7 +439,9 @@ paths = [
   "components/automate-grpc/*",
   "components/es-sidecar-service/*",
   "components/local-user-service/*",
+  "lib/arrayutils/*",
   "lib/cereal/*",
+  "lib/certgenerateutils/*",
   "lib/config/*",
   "lib/config_parser/*",
   "lib/db/*",
diff --git a/VERSION b/VERSION
index 741c5a6b3..ebf6c5cfe 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-4.7.71
\ No newline at end of file
+4.7.79
\ No newline at end of file
diff --git a/components/automate-cli/cmd/chef-automate/gather-logs.go b/components/automate-cli/cmd/chef-automate/gather-logs.go
index 3e8733b0e..e5949c69c 100644
--- a/components/automate-cli/cmd/chef-automate/gather-logs.go
+++ b/components/automate-cli/cmd/chef-automate/gather-logs.go
@@ -43,7 +43,7 @@ func newGatherLogsCmd() *cobra.Command {
 		RunE:  runGatherLogsCmd,
 		Args:  cobra.RangeArgs(0, 3),
 		Annotations: map[string]string{
-			docs.Tag: docs.FrontEnd,
+			docs.Tag: docs.BastionHost,
 		},
 	}
 
diff --git a/components/automate-cli/cmd/chef-automate/pre_flight_check.go b/components/automate-cli/cmd/chef-automate/pre_flight_check.go
index fda384882..763e03f80 100644
--- a/components/automate-cli/cmd/chef-automate/pre_flight_check.go
+++ b/components/automate-cli/cmd/chef-automate/pre_flight_check.go
@@ -112,7 +112,7 @@ var preflightCheckCmd = &cobra.Command{
 	Long:  "Perform preflight check to verify host meets installation criteria.",
 	Annotations: map[string]string{
 		NoCheckVersionAnnotation: NoCheckVersionAnnotation,
-		docs.Tag:                 docs.FrontEnd,
+		docs.Tag:                 docs.BastionHost,
 	},
 	RunE: runPreflightCheckCmd,
 }
diff --git a/components/automate-cli/pkg/verifyserver/constants/apiurlconstant.go b/components/automate-cli/pkg/verifyserver/constants/apiurlconstant.go
index f47adb2b8..30397a819 100644
--- a/components/automate-cli/pkg/verifyserver/constants/apiurlconstant.go
+++ b/components/automate-cli/pkg/verifyserver/constants/apiurlconstant.go
@@ -20,4 +20,7 @@ const (
 	PORT_REACHABLE_API_PATH                  = "/api/v1/checks/port-reachable"
 	EXTERNAL_OPENSEARCH_API_PATH             = "/api/v1/checks/external-opensearch"
 	EXTERNAL_POSTGRESQL_API_PATH             = "/api/v1/checks/external-postgresql"
+	STATUS_API_PATH                          = "/status"
+	START_MOCK_SERVER                        = "/api/v1/start/mock-server"
+	STOP_MOCK_SERVER                         = "/api/v1/stop/mock-server"
 )
diff --git a/components/automate-cli/pkg/verifyserver/models/batchcheck.go b/components/automate-cli/pkg/verifyserver/models/batchcheck.go
index df6d446ff..a50002d98 100644
--- a/components/automate-cli/pkg/verifyserver/models/batchcheck.go
+++ b/components/automate-cli/pkg/verifyserver/models/batchcheck.go
@@ -12,6 +12,14 @@ type BatchCheckRequest struct {
 	Config Config   `json:"config"`
 }
 
+type MockServerFromBatchServiceResponse struct {
+	Host       string `json:"host"`
+	Protocol   string `json:"protocol"`
+	Port       int    `json:"port"`
+	Error      error  `json:"error"`
+	StatusCode int    `json:"status_code"`
+}
+
 type Hardware struct {
 	AutomateNodeCount        int      `json:"automate_node_count"`
 	AutomateNodeIps          []string `json:"automate_node_ips"`
@@ -24,6 +32,7 @@ type Hardware struct {
 }
 type SSHUser struct {
 	Username     string `json:"user_name"`
+	Port         string `json:"ssh_port"`
 	PrivateKey   string `json:"private_key"`
 	SudoPassword string `json:"sudo_password"`
 }
@@ -203,6 +212,7 @@ func (c *Config) populateObjectStorageConfig(haConfig *config.HaDeployConfig) {
 func (c *Config) populateConfigInitials(haConfig *config.HaDeployConfig) {
 	configInitials := haConfig.GetConfigInitials()
 	c.SSHUser.Username = configInitials.SSHUser
+	c.SSHUser.Port = configInitials.SSHPort
 	c.SSHUser.PrivateKey = configInitials.SSHKeyFile
 	c.SSHUser.SudoPassword = configInitials.SudoPassword
 	c.Arch = configInitials.Architecture
@@ -377,6 +387,7 @@ type CertificateCheckRequest struct {
 type SShUserRequest struct {
 	IP           string `json:"ip"`
 	Username     string `json:"user_name"`
+	Port         string `json:"ssh_port"`
 	PrivateKey   string `json:"private_key"`
 	SudoPassword string `json:"sudo_password"`
 }
diff --git a/components/automate-cli/pkg/verifyserver/models/status.go b/components/automate-cli/pkg/verifyserver/models/status.go
index 99b826a90..ebc5e422f 100644
--- a/components/automate-cli/pkg/verifyserver/models/status.go
+++ b/components/automate-cli/pkg/verifyserver/models/status.go
@@ -11,3 +11,8 @@ type StatusDetails struct {
 	Services *[]ServiceDetails `json:"services"`
 	Error    string            `json:"error"`
 }
+
+type StatusApiResponse struct {
+	Status string        `json:"status"`
+	Result StatusDetails `json:"result"`
+}
diff --git a/components/automate-cli/pkg/verifyserver/models/stopmockserver.go b/components/automate-cli/pkg/verifyserver/models/stopmockserver.go
index 8fb9c2c16..4f71b872a 100644
--- a/components/automate-cli/pkg/verifyserver/models/stopmockserver.go
+++ b/components/automate-cli/pkg/verifyserver/models/stopmockserver.go
@@ -5,3 +5,8 @@ type StopMockServerRequestBody struct {
 	Port     int
 	Protocol string
 }
+
+type StopMockServerResponse struct {
+	Status string `json:"status"`
+	Result string `json:"result"`
+}
diff --git a/components/automate-cli/pkg/verifyserver/server/api/v1/batchcheck.go b/components/automate-cli/pkg/verifyserver/server/api/v1/batchcheck.go
index b562b19d4..bd6ce6326 100644
--- a/components/automate-cli/pkg/verifyserver/server/api/v1/batchcheck.go
+++ b/components/automate-cli/pkg/verifyserver/server/api/v1/batchcheck.go
@@ -24,7 +24,10 @@ func (h *Handler) BatchCheck(c *fiber.Ctx) error {
 		return fiber.NewError(http.StatusBadRequest, err.Error())
 	}
 
-	resp := h.BatchCheckService.BatchCheck(req.Checks, req.Config)
+	resp, err := h.BatchCheckService.BatchCheck(req.Checks, req.Config)
+	if err != nil {
+		return fiber.NewError(http.StatusInternalServerError, err.Error())
+	}
 	return c.Status(fiber.StatusOK).JSON(response.BuildSuccessResponse(resp.Result))
 }
 
diff --git a/components/automate-cli/pkg/verifyserver/server/server.go b/components/automate-cli/pkg/verifyserver/server/server.go
index aab3a1580..ec16aa7e3 100644
--- a/components/automate-cli/pkg/verifyserver/server/server.go
+++ b/components/automate-cli/pkg/verifyserver/server/server.go
@@ -108,7 +108,7 @@ func NewVerifyServer(port string, debug bool) (*VerifyServer, error) {
 				softwareversionchecktrigger.NewSoftwareVersionCheck(l, port),
 				systemresourcechecktrigger.NewSystemResourceCheck(l, port),
 				systemuserchecktrigger.NewSystemUserCheck(l, port),
-			))).
+			), l, port)).
 		AddNFSMountService(nfsmountservice.NewNFSMountService(l, port, systemresource.NewSystemResourceInfoImpl())).
 		AddHardwareResourceCountService(hardwareresourcecount.NewHardwareResourceCountService(l)).
 		AddSoftwareVersionService(softwareversionservice.NewSoftwareVersionService(l, fiberutils.CheckPath)).
@@ -117,7 +117,7 @@ func NewVerifyServer(port string, debug bool) (*VerifyServer, error) {
 		AddS3ConfigService(s3configservice.NewS3ConfigService(l, awsutils.NewAwsUtils())).
 		AddOSS3BackupService(opensearchbackupservice.NewOSS3BackupService(l)).
 		AddPortReachableService(portreachableservice.NewPortReachableService(l, constants.TIMEOUT)).
-		AddExternalPostgresqlService(externalpostgresqlservice.NewExternalPostgresqlService(db.NewDBImpl(), fileutils.NewFileSystemUtils(), l)).
+		AddExternalPostgresqlService(externalpostgresqlservice.NewExternalPostgresqlService(db.NewDBImpl(),  fileutils.NewFileSystemUtils(),  l)).
 		AddSystemUserService(systemuserservice.NewSystemUserService(l, executil.NewExecCmdServiceImp(), userutils.NewUserUtilImp())).
 		AddExternalOpensearchService(externalopensearchservice.NewExternalOpensearchService(l, constants.TIMEOUT)).
 		AddFqdnService(fqdnservice.NewFqdnService(l, constants.TIMEOUT)).
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice.go
index 97a743597..7bb896ae5 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice.go
@@ -1,28 +1,46 @@
 package batchcheckservice
 
 import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"net/http"
+	"strings"
+
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/models"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/utils/httputils"
+	"github.com/chef/automate/lib/arrayutils"
+	"github.com/chef/automate/lib/certgenerateutils"
+	"github.com/chef/automate/lib/io/fileutils"
+	"github.com/chef/automate/lib/logger"
 	"github.com/chef/automate/lib/stringutils"
 )
 
 type IBatchCheckService interface {
-	BatchCheck(checks []string, config models.Config) models.BatchCheckResponse
+	BatchCheck(checks []string, config models.Config) (models.BatchCheckResponse, error)
 }
 
 type BatchCheckService struct {
-	CheckTrigger trigger.CheckTrigger
+	checkTrigger      trigger.CheckTrigger
+	port              string
+	log               logger.Logger
+	httpRequestClient httputils.IHttpRequestClient
+	fileUtils         fileutils.FileUtils
 }
 
-func NewBatchCheckService(trigger trigger.CheckTrigger) *BatchCheckService {
+func NewBatchCheckService(trigger trigger.CheckTrigger, log logger.Logger, port string) *BatchCheckService {
 	return &BatchCheckService{
-		CheckTrigger: trigger,
+		checkTrigger:      trigger,
+		port:              port,
+		log:               log,
+		httpRequestClient: httputils.NewHttpRequestClient(),
+		fileUtils:         fileutils.NewFileSystemUtils(),
 	}
 }
 
-func (ss *BatchCheckService) BatchCheck(checks []string, config models.Config) models.BatchCheckResponse {
-	//batchApisResultMap := make(map[string][]models.ApiResult)
+func (ss *BatchCheckService) BatchCheck(checks []string, config models.Config) (models.BatchCheckResponse, error) {
 	var bastionChecks = stringutils.SliceIntersection(checks, constants.GetBastionChecks())
 	var remoteChecks = stringutils.SliceIntersection(checks, constants.GetRemoteChecks())
 	checkTriggerRespMap := make(map[string][]models.CheckTriggerResponse)
@@ -32,13 +50,274 @@ func (ss *BatchCheckService) BatchCheck(checks []string, config models.Config) m
 		checkTriggerRespMap = getBastionCheckResp(ss, bastionChecks, config)
 	}
 
-	// Get remote check trigger resp and append to checkTriggerRespMap (keys and values)
+	successfullyStartedMockServers, notStartedMockServers, err := ss.startMockServerIfNeeded(remoteChecks, config)
+	if err != nil {
+		ss.log.Error("Error occurred while starting mock server")
+		return models.BatchCheckResponse{}, err
+	}
+
+	if len(notStartedMockServers) > 0 {
+		mockServersStoppedSuccessfully := ss.stopAllMockServers(successfullyStartedMockServers)
+		if !mockServersStoppedSuccessfully {
+			return models.BatchCheckResponse{}, errors.New("mock server stop failed on some nodes")
+		}
+		return models.BatchCheckResponse{}, errors.New("mock server start failed on some nodes")
+	}
 	if len(remoteChecks) > 0 {
 		for key, value := range getRemoteCheckResp(ss, remoteChecks, config) {
 			checkTriggerRespMap[key] = value
 		}
 	}
-	return constructBatchCheckResponse(checkTriggerRespMap, append(bastionChecks, remoteChecks...))
+	mockServersStoppedSuccessfully := ss.stopAllMockServers(successfullyStartedMockServers)
+	if !mockServersStoppedSuccessfully {
+		return models.BatchCheckResponse{}, errors.New("mock server stop failed on some nodes")
+	}
+	return constructBatchCheckResponse(checkTriggerRespMap, append(bastionChecks, remoteChecks...)), nil
+}
+
+func (ss *BatchCheckService) stopAllMockServers(successfullyStartedMockServers []models.MockServerFromBatchServiceResponse) bool {
+	if len(successfullyStartedMockServers) > 0 {
+		totalReq := 0
+		for _, successfullyStartedMockServer := range successfullyStartedMockServers {
+			if successfullyStartedMockServer.Host != "" {
+				totalReq = totalReq + 1
+			}
+		}
+		stopMockServerChannel := make(chan models.MockServerFromBatchServiceResponse, totalReq)
+		defer close(stopMockServerChannel)
+		mockServersStoppedSuccessfully := true
+		for _, successfullyStartedMockServer := range successfullyStartedMockServers {
+
+			go ss.stopMockServerOnHostAndPort(successfullyStartedMockServer.Host, successfullyStartedMockServer.Protocol, successfullyStartedMockServer.Port, stopMockServerChannel)
+
+		}
+		for i := 0; i < totalReq; i++ {
+			result := <-stopMockServerChannel
+			if result.Error != nil {
+				mockServersStoppedSuccessfully = false
+				errMsg := fmt.Sprintf("Error occurred while stoping mock server on host %s for port %v for protocol %s", result.Host, result.Port, result.Protocol)
+				ss.log.Error(errMsg, result.Error.Error())
+			}
+		}
+		return mockServersStoppedSuccessfully
+	}
+	return true
+}
+
+func (ss *BatchCheckService) startMockServerIfNeeded(remoteChecks []string, config models.Config) ([]models.MockServerFromBatchServiceResponse, []models.MockServerFromBatchServiceResponse, error) {
+	successfullyStartedMockServers := []models.MockServerFromBatchServiceResponse{}
+	notStartedMockServers := []models.MockServerFromBatchServiceResponse{}
+
+	if len(remoteChecks) > 0 {
+		startMockServer, err := ss.shouldStartMockServer(remoteChecks, config)
+		if err != nil {
+			return successfullyStartedMockServers, notStartedMockServers, err
+		}
+		if startMockServer {
+			successfullyStartedMockServers, notStartedMockServers = ss.startMockServer(remoteChecks, config)
+		}
+	}
+	return successfullyStartedMockServers, notStartedMockServers, nil
+}
+
+func (ss *BatchCheckService) shouldStartMockServer(remoteChecks []string, config models.Config) (bool, error) {
+	if stringutils.SliceContains(remoteChecks, constants.FIREWALL) || stringutils.SliceContains(remoteChecks, constants.FQDN) {
+		deploymentState, err := ss.getDeploymentState(config)
+		if err != nil {
+			ss.log.Error("Error while calling status api from batch check service:", err)
+			return false, err
+		}
+		return deploymentState == constants.PRE_DEPLOY, nil
+	}
+	return false, nil
+}
+
+func (ss *BatchCheckService) createNodeTypeMap(remoteChecks []string) map[string]map[string][]int {
+	nodeTypePortMap := map[string]map[string][]int{
+		constants.AUTOMATE: {
+			constants.TCP:   []int{},
+			constants.HTTP:  []int{},
+			constants.UDP:   []int{},
+			constants.HTTPS: []int{},
+		},
+		constants.CHEF_INFRA_SERVER: {
+			constants.TCP:   []int{},
+			constants.HTTP:  []int{},
+			constants.UDP:   []int{},
+			constants.HTTPS: []int{},
+		},
+		constants.POSTGRESQL: {
+			constants.TCP:   []int{},
+			constants.HTTP:  []int{},
+			constants.UDP:   []int{},
+			constants.HTTPS: []int{},
+		},
+		constants.OPENSEARCH: {
+			constants.TCP:   []int{},
+			constants.HTTP:  []int{},
+			constants.UDP:   []int{},
+			constants.HTTPS: []int{},
+		},
+	}
+	for _, check := range remoteChecks {
+		resp := ss.getPortsToOpenForCheck(check)
+		if len(resp) != 0 {
+			constructUniquePortMap(resp, &nodeTypePortMap)
+		}
+	}
+	return nodeTypePortMap
+}
+
+func (ss *BatchCheckService) startMockServer(remoteChecks []string, config models.Config) ([]models.MockServerFromBatchServiceResponse, []models.MockServerFromBatchServiceResponse) {
+	hardwareDetails := config.Hardware
+	nodeTypePortMap := ss.createNodeTypeMap(remoteChecks)
+	ipMap := map[string][]string{
+		constants.AUTOMATE:          hardwareDetails.AutomateNodeIps,
+		constants.CHEF_INFRA_SERVER: hardwareDetails.ChefInfraServerNodeIps,
+		constants.POSTGRESQL:        hardwareDetails.PostgresqlNodeIps,
+		constants.OPENSEARCH:        hardwareDetails.OpenSearchNodeIps,
+	}
+
+	// construct a map that holds list of ports to start on a particular ip
+	nodeTypeAndIpWithPortProtocolMap := make(map[string]map[string][]int)
+	for nodeType, ipArray := range ipMap {
+		for _, ip := range ipArray {
+			nodeTypeAndIpWithPortProtocolMap[nodeType+"_"+ip] = make(map[string][]int)
+			nodeTypeAndIpWithPortProtocolMap[nodeType+"_"+ip][constants.TCP] = nodeTypePortMap[nodeType][constants.TCP]
+			nodeTypeAndIpWithPortProtocolMap[nodeType+"_"+ip][constants.HTTP] = nodeTypePortMap[nodeType][constants.HTTP]
+			nodeTypeAndIpWithPortProtocolMap[nodeType+"_"+ip][constants.UDP] = nodeTypePortMap[nodeType][constants.UDP]
+			nodeTypeAndIpWithPortProtocolMap[nodeType+"_"+ip][constants.HTTPS] = nodeTypePortMap[nodeType][constants.HTTPS]
+		}
+	}
+
+	// iterrate over each port for an ip and make request to start server.
+	ipPortProtocolMap := make(map[string]bool)
+	startMockServerChannel := make(chan models.MockServerFromBatchServiceResponse)
+	totalReq := 0
+	defer close(startMockServerChannel)
+	for nodeTypeWithIp, protocolMap := range nodeTypeAndIpWithPortProtocolMap {
+		host := getHostFromNodeTypeAndIpCombination(nodeTypeWithIp)
+		ss.constructAndStartMockServerForAvailableProtocals(protocolMap, host, startMockServerChannel, &ipPortProtocolMap, &totalReq, config)
+	}
+
+	successfullyStartedMockServers := []models.MockServerFromBatchServiceResponse{}
+	notStartedMockServers := []models.MockServerFromBatchServiceResponse{}
+	for i := 0; i < totalReq; i++ {
+		result := <-startMockServerChannel
+		if result.Error == nil {
+			successfullyStartedMockServers = append(successfullyStartedMockServers, result)
+		} else {
+			notStartedMockServers = append(notStartedMockServers, result)
+		}
+
+	}
+	return successfullyStartedMockServers, notStartedMockServers
+}
+
+func (ss *BatchCheckService) constructAndStartMockServerForAvailableProtocals(protocolMap map[string][]int, host string, startMockServerChannel chan models.MockServerFromBatchServiceResponse, ipPortProtocolMap *map[string]bool, totalReq *int, config models.Config) {
+	startMockServerRequestBody := models.StartMockServerRequestBody{}
+	if len(protocolMap[constants.TCP]) != 0 {
+		startMockServerRequestBody.Protocol = constants.TCP
+		ss.constructRequestAndStartMockServer(protocolMap, host, startMockServerRequestBody, startMockServerChannel, ipPortProtocolMap, totalReq)
+	}
+	if len(protocolMap[constants.UDP]) != 0 {
+		startMockServerRequestBody.Protocol = constants.UDP
+		ss.constructRequestAndStartMockServer(protocolMap, host, startMockServerRequestBody, startMockServerChannel, ipPortProtocolMap, totalReq)
+	}
+	if len(protocolMap[constants.HTTP]) != 0 {
+		startMockServerRequestBody.Protocol = constants.HTTP
+		ss.constructRequestAndStartMockServer(protocolMap, host, startMockServerRequestBody, startMockServerChannel, ipPortProtocolMap, totalReq)
+	}
+	if len(protocolMap[constants.HTTPS]) != 0 {
+		startMockServerRequestBody.Protocol = constants.HTTPS
+		ss.generateRootCaAndPrivateKeyForHost(host, &startMockServerRequestBody, config)
+		ss.constructRequestAndStartMockServer(protocolMap, host, startMockServerRequestBody, startMockServerChannel, ipPortProtocolMap, totalReq)
+	}
+}
+
+func (ss *BatchCheckService) constructRequestAndStartMockServer(protocolMap map[string][]int, host string, startMockServerRequestBody models.StartMockServerRequestBody, startMockServerChannel chan models.MockServerFromBatchServiceResponse, ipPortProtocolMap *map[string]bool, totalReq *int) {
+	protocolType := startMockServerRequestBody.Protocol
+	for _, port := range protocolMap[protocolType] {
+		startMockServerRequestBody.Port = port
+		key := fmt.Sprint(host, "_", protocolType, "_", port)
+
+		if !(*ipPortProtocolMap)[key] {
+			go ss.startMockServerOnHostAndPort(host, ss.port, startMockServerRequestBody, startMockServerChannel)
+			*totalReq = *totalReq + 1
+			(*ipPortProtocolMap)[key] = true
+		}
+	}
+}
+
+func getHostFromNodeTypeAndIpCombination(nodeTypeWithIp string) string {
+	return nodeTypeWithIp[strings.Index(nodeTypeWithIp, "_")+1:]
+}
+
+func (ss *BatchCheckService) generateRootCaAndPrivateKeyForHost(host string, startMockServerRequestBody *models.StartMockServerRequestBody, config models.Config) {
+	if len(config.Certificate.Nodes) > 0 {
+		nodes := config.Certificate.Nodes
+		for _, nodeData := range nodes {
+			if host == nodeData.IP {
+				startMockServerRequestBody.Cert = nodeData.Cert
+				startMockServerRequestBody.Key = nodeData.Key
+				break
+			}
+		}
+		return
+	}
+
+	privateKeyFilePath, certificateFilePath, err := certgenerateutils.GenerateCert(host)
+	if err != nil {
+		ss.log.Error(err)
+		return
+	}
+	defer ss.fileUtils.DeleteFile(certificateFilePath)
+	defer ss.fileUtils.DeleteFile(privateKeyFilePath)
+
+	cert, err := ss.fileUtils.ReadFile(certificateFilePath)
+	if err != nil {
+		ss.log.Error("Unable to read %s file", certificateFilePath, err)
+		return
+	}
+	publicKey := string(cert[:])
+	startMockServerRequestBody.Cert = publicKey
+	key, err := ss.fileUtils.ReadFile(privateKeyFilePath)
+	if err != nil {
+		ss.log.Error("Unable to read %s file", privateKeyFilePath, err)
+		return
+	}
+	privateKey := string(key[:])
+	startMockServerRequestBody.Key = privateKey
+}
+
+func constructUniquePortMap(resp map[string]map[string][]int, nodeTypePortMap *map[string]map[string][]int) {
+	nodeTypeMap := []string{
+		constants.AUTOMATE,
+		constants.CHEF_INFRA_SERVER,
+		constants.POSTGRESQL,
+		constants.OPENSEARCH,
+	}
+
+	for _, nodeType := range nodeTypeMap {
+		if resp[nodeType] != nil {
+			if resp[nodeType][constants.TCP] != nil {
+				newPortsToBeAdded := arrayutils.SliceDifference(resp[nodeType][constants.TCP], (*nodeTypePortMap)[nodeType][constants.TCP])
+				(*nodeTypePortMap)[nodeType][constants.TCP] = append((*nodeTypePortMap)[nodeType][constants.TCP], newPortsToBeAdded...)
+			}
+			if resp[nodeType][constants.UDP] != nil {
+				newPortsToBeAdded := arrayutils.SliceDifference(resp[nodeType][constants.UDP], (*nodeTypePortMap)[nodeType][constants.UDP])
+				(*nodeTypePortMap)[nodeType][constants.UDP] = append((*nodeTypePortMap)[nodeType][constants.UDP], newPortsToBeAdded...)
+			}
+			if resp[nodeType][constants.HTTP] != nil {
+				newPortsToBeAdded := arrayutils.SliceDifference(resp[nodeType][constants.HTTP], (*nodeTypePortMap)[nodeType][constants.HTTP])
+				(*nodeTypePortMap)[nodeType][constants.HTTP] = append((*nodeTypePortMap)[nodeType][constants.HTTP], newPortsToBeAdded...)
+			}
+			if resp[nodeType][constants.HTTPS] != nil {
+				newPortsToBeAdded := arrayutils.SliceDifference(resp[nodeType][constants.HTTPS], (*nodeTypePortMap)[nodeType][constants.HTTPS])
+				(*nodeTypePortMap)[nodeType][constants.HTTPS] = append((*nodeTypePortMap)[nodeType][constants.HTTPS], newPortsToBeAdded...)
+			}
+		}
+	}
 }
 
 func getIndexOfCheck(checks []string, check string) (int, error) {
@@ -51,7 +330,111 @@ func (ss *BatchCheckService) RunBastionCheck(check string, config models.Config,
 		resp[i].CheckType = check
 	}
 	resultChan <- resp
+}
 
+func (ss *BatchCheckService) getPortsToOpenForCheck(check string) map[string]map[string][]int {
+	return ss.getCheckInstance(check).GetPortsForMockServer()
+}
+
+func (ss *BatchCheckService) getDeploymentState(config models.Config) (string, error) {
+	if config.Hardware.AutomateNodeCount > 0 {
+		for index, ip := range config.Hardware.AutomateNodeIps {
+			result, err := ss.getStatusFromNode(ip)
+			if err != nil && index == len(config.Hardware.AutomateNodeIps)-1 {
+				errMsg := "received no response for status api from any automate nodes"
+				ss.log.Error(errMsg)
+				return "", errors.New(errMsg)
+			}
+			if result != "" {
+				return result, nil
+			}
+		}
+	}
+	return "", errors.New("automate nodes not present")
+}
+
+func (ss *BatchCheckService) getStatusFromNode(ip string) (string, error) {
+	url := fmt.Sprintf("http://%s:%s%s", ip, ss.port, constants.STATUS_API_PATH)
+	resp, err := ss.httpRequestClient.MakeRequest(http.MethodGet, url, nil)
+	if err != nil {
+		ss.log.Error("Error while calling status API from batch check service:", err)
+		return "", err
+	}
+
+	var statusApiResponse models.StatusApiResponse
+	err = json.NewDecoder(resp.Body).Decode(&statusApiResponse)
+	if err != nil {
+		ss.log.Error("Error while unmarshalling response of status API from batch check service:", err)
+		return "", err
+	}
+
+	if len(*statusApiResponse.Result.Services) == 0 && statusApiResponse.Result.Error != "" {
+		return constants.PRE_DEPLOY, nil
+	}
+
+	return constants.POST_DEPLOY, nil
+}
+
+func (ss *BatchCheckService) startMockServerOnHostAndPort(host, port string, startMockServerRequestBody models.StartMockServerRequestBody, respChan chan models.MockServerFromBatchServiceResponse) {
+	url := fmt.Sprintf("%s%s:%s%s", "http://", host, port, constants.START_MOCK_SERVER)
+	resp, err := ss.httpRequestClient.MakeRequest(http.MethodPost, url, startMockServerRequestBody)
+	if err != nil && resp == nil {
+		ss.log.Error("Error occurred while making request to start mock server", err.Error())
+		respChan <- models.MockServerFromBatchServiceResponse{
+			Host:       host,
+			Error:      err,
+			StatusCode: http.StatusBadRequest,
+			Protocol:   startMockServerRequestBody.Protocol,
+			Port:       startMockServerRequestBody.Port,
+		}
+		return
+	}
+	if err != nil {
+		ss.log.Error("Error occurred while starting mock server: ", err.Error())
+	}
+	chanResponse := models.MockServerFromBatchServiceResponse{
+		Host:       host,
+		Error:      err,
+		StatusCode: resp.StatusCode,
+		Protocol:   startMockServerRequestBody.Protocol,
+		Port:       startMockServerRequestBody.Port,
+	}
+	respChan <- chanResponse
+}
+
+func (ss *BatchCheckService) stopMockServerOnHostAndPort(host, protocol string, port int, stopMockServerChannel chan models.MockServerFromBatchServiceResponse) {
+	stopMockServerRequestBody := models.StopMockServerRequestBody{
+		Port:     port,
+		Protocol: protocol,
+	}
+	url := fmt.Sprintf("%s%s:%s%s", "http://", host, ss.port, constants.STOP_MOCK_SERVER)
+	resp, err := ss.httpRequestClient.MakeRequest(http.MethodPost, url, stopMockServerRequestBody)
+	if err != nil && resp == nil {
+		ss.log.Error("Error occurred while making request to stop mock server: ", err.Error())
+		chanResponse := models.MockServerFromBatchServiceResponse{
+			Host:       host,
+			Error:      err,
+			StatusCode: http.StatusInternalServerError,
+			Protocol:   stopMockServerRequestBody.Protocol,
+			Port:       stopMockServerRequestBody.Port,
+		}
+		stopMockServerChannel <- chanResponse
+		return
+	}
+	if err != nil {
+		ss.log.Error("Error occurred while stoping mock server: ", err.Error())
+		chanResponse := models.MockServerFromBatchServiceResponse{
+			Host:       host,
+			Error:      err,
+			StatusCode: resp.StatusCode,
+			Protocol:   stopMockServerRequestBody.Protocol,
+			Port:       stopMockServerRequestBody.Port,
+		}
+		stopMockServerChannel <- chanResponse
+		return
+	}
+	ss.log.Debug("Successfully stopped mock server")
+	stopMockServerChannel <- models.MockServerFromBatchServiceResponse{}
 }
 
 func (ss *BatchCheckService) RunRemoteCheck(check string, config models.Config) []models.CheckTriggerResponse {
@@ -61,31 +444,31 @@ func (ss *BatchCheckService) RunRemoteCheck(check string, config models.Config)
 func (ss *BatchCheckService) getCheckInstance(check string) trigger.ICheck {
 	switch check {
 	case constants.HARDWARE_RESOURCE_COUNT:
-		return ss.CheckTrigger.HardwareResourceCountCheck
+		return ss.checkTrigger.HardwareResourceCountCheck
 	case constants.CERTIFICATE:
-		return ss.CheckTrigger.CertificateCheck
+		return ss.checkTrigger.CertificateCheck
 	case constants.SSH_USER:
-		return ss.CheckTrigger.SshUserAccessCheck
+		return ss.checkTrigger.SshUserAccessCheck
 	case constants.SYSTEM_RESOURCES:
-		return ss.CheckTrigger.SystemResourceCheck
+		return ss.checkTrigger.SystemResourceCheck
 	case constants.SOFTWARE_VERSIONS:
-		return ss.CheckTrigger.SoftwareVersionCheck
+		return ss.checkTrigger.SoftwareVersionCheck
 	case constants.SYSTEM_USER:
-		return ss.CheckTrigger.SystemUserCheck
+		return ss.checkTrigger.SystemUserCheck
 	case constants.S3_BACKUP_CONFIG:
-		return ss.CheckTrigger.S3BackupConfigCheck
+		return ss.checkTrigger.S3BackupConfigCheck
 	case constants.FQDN:
-		return ss.CheckTrigger.FqdnCheck
+		return ss.checkTrigger.FqdnCheck
 	case constants.FIREWALL:
-		return ss.CheckTrigger.FirewallCheck
+		return ss.checkTrigger.FirewallCheck
 	case constants.EXTERNAL_OPENSEARCH:
-		return ss.CheckTrigger.ExternalOpensearchCheck
+		return ss.checkTrigger.ExternalOpensearchCheck
 	case constants.AWS_OPENSEARCH_S3_BUCKET_ACCESS:
-		return ss.CheckTrigger.OpensearchS3BucketAccessCheck
+		return ss.checkTrigger.OpensearchS3BucketAccessCheck
 	case constants.EXTERNAL_POSTGRESQL:
-		return ss.CheckTrigger.ExternalPostgresCheck
+		return ss.checkTrigger.ExternalPostgresCheck
 	case constants.NFS_BACKUP_CONFIG:
-		return ss.CheckTrigger.NfsBackupConfigCheck
+		return ss.checkTrigger.NfsBackupConfigCheck
 	default:
 		return nil
 	}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservicemock.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservicemock.go
index 8210b4a0c..57604ce98 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservicemock.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservicemock.go
@@ -7,47 +7,70 @@ import (
 )
 
 type MockBatchCheckService struct {
-	BatchCheckFunc func([]string, models.Config) models.BatchCheckResponse
+	BatchCheckFunc func([]string, models.Config) (models.BatchCheckResponse, error)
 }
 
-func (mss *MockBatchCheckService) BatchCheck(checks []string, config models.Config) models.BatchCheckResponse {
+func (mss *MockBatchCheckService) BatchCheck(checks []string, config models.Config) (models.BatchCheckResponse, error) {
 	return mss.BatchCheckFunc(checks, config)
 }
 
 type MockHardwareResourceCountCheck struct {
 	HardwareResourceCountCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc      func() map[string]map[string][]int
 }
 
 func (mss *MockHardwareResourceCountCheck) Run(config models.Config) []models.CheckTriggerResponse {
 	return mss.HardwareResourceCountCheckFunc(config)
 }
 
+func (mss *MockHardwareResourceCountCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
+}
+
 func SetupMockHardwareResourceCountCheck(resp []models.CheckTriggerResponse) trigger.ICheck {
 	return &MockHardwareResourceCountCheck{
 		HardwareResourceCountCheckFunc: func(config models.Config) []models.CheckTriggerResponse {
 			return resp
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockSshUserAccessCheck struct {
-	SshUserAccessCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	SshUserAccessCheckFunc    func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
 }
 
 func (mss *MockSshUserAccessCheck) Run(config models.Config) []models.CheckTriggerResponse {
 	return mss.SshUserAccessCheckFunc(config)
 }
 
+func (mss *MockSshUserAccessCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
+}
+
 func SetupMockSshUserAccessCheck(resp []models.CheckTriggerResponse) trigger.ICheck {
 	return &MockSshUserAccessCheck{
 		SshUserAccessCheckFunc: func(config models.Config) []models.CheckTriggerResponse {
 			return resp
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockCertificateCheck struct {
-	CertificateCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	CertificateCheckFunc      func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
+}
+
+func (mss *MockCertificateCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
 }
 
 func (mss *MockCertificateCheck) Run(config models.Config) []models.CheckTriggerResponse {
@@ -97,11 +120,20 @@ func SetupMockCertificateCheck() trigger.ICheck {
 			}
 			return m
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockExternalOpenSearchCheck struct {
 	ExternalOpenSearchCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc   func() map[string]map[string][]int
+}
+
+func (mss *MockExternalOpenSearchCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
 }
 
 func (mss *MockExternalOpenSearchCheck) Run(config models.Config) []models.CheckTriggerResponse {
@@ -113,11 +145,20 @@ func SetupMockExternalOpenSearchCheck(resp []models.CheckTriggerResponse) trigge
 		ExternalOpenSearchCheckFunc: func(config models.Config) []models.CheckTriggerResponse {
 			return resp
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockExternalPostgresCheck struct {
 	ExternalPostgresCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
+}
+
+func (mss *MockExternalPostgresCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
 }
 
 func (mss *MockExternalPostgresCheck) Run(config models.Config) []models.CheckTriggerResponse {
@@ -129,11 +170,20 @@ func SetupMockExternalPostgresCheck(resp []models.CheckTriggerResponse) trigger.
 		ExternalPostgresCheckFunc: func(config models.Config) []models.CheckTriggerResponse {
 			return resp
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockFirewallCheck struct {
-	FirewallCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	FirewallCheckFunc         func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
+}
+
+func (mss *MockFirewallCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
 }
 
 func (mss *MockFirewallCheck) Run(config models.Config) []models.CheckTriggerResponse {
@@ -146,11 +196,36 @@ func SetupMockFirewallCheck() trigger.ICheck {
 			m := []models.CheckTriggerResponse{}
 			return m
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			nodeTypePortMap := map[string]map[string][]int{
+				constants.AUTOMATE: {
+					constants.TCP:   []int{9631, 9638},
+					constants.HTTPS: []int{443},
+				},
+				constants.CHEF_INFRA_SERVER: {
+					constants.TCP:   []int{9631, 9638},
+					constants.HTTPS: []int{443},
+				},
+				constants.POSTGRESQL: {
+					constants.TCP: []int{7432, 9631, 5432, 6432, 9638},
+					constants.UDP: []int{9638},
+				},
+				constants.OPENSEARCH: {
+					constants.TCP: []int{9200, 9300, 9631, 9638},
+				},
+			}
+			return nodeTypePortMap
+		},
 	}
 }
 
 type MockFqdnCheck struct {
-	FqdnCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	FqdnCheckFunc             func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
+}
+
+func (mss *MockFqdnCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
 }
 
 func (mss *MockFqdnCheck) Run(config models.Config) []models.CheckTriggerResponse {
@@ -163,28 +238,53 @@ func SetupMockFqdnCheck() trigger.ICheck {
 			m := []models.CheckTriggerResponse{}
 			return m
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			nodeTypePortMap := map[string]map[string][]int{
+				constants.AUTOMATE: {
+					constants.HTTPS: []int{443},
+				},
+				constants.CHEF_INFRA_SERVER: {
+					constants.HTTPS: []int{443},
+				},
+			}
+			return nodeTypePortMap
+		},
 	}
 }
 
 type MockNfsBackupConfigCheck struct {
-	NfsBackupConfigCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	NfsBackupConfigCheckFunc  func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
 }
 
 func (mss *MockNfsBackupConfigCheck) Run(config models.Config) []models.CheckTriggerResponse {
 	return mss.NfsBackupConfigCheckFunc(config)
 }
 
+func (mss *MockNfsBackupConfigCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
+}
+
 func SetupMockNfsBackupConfigCheck() trigger.ICheck {
 	return &MockNfsBackupConfigCheck{
 		NfsBackupConfigCheckFunc: func(config models.Config) []models.CheckTriggerResponse {
 			m := []models.CheckTriggerResponse{}
 			return m
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockOpenSearchS3BucketAccessCheck struct {
 	OpenSearchS3BucketAccessCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc         func() map[string]map[string][]int
+}
+
+func (mss *MockOpenSearchS3BucketAccessCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
 }
 
 func (mss *MockOpenSearchS3BucketAccessCheck) Run(config models.Config) []models.CheckTriggerResponse {
@@ -197,28 +297,46 @@ func SetupMockOpenSearchS3BucketAccessCheck() trigger.ICheck {
 			m := []models.CheckTriggerResponse{}
 			return m
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockS3BackupConfigCheck struct {
-	S3BackupConfigCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	S3BackupConfigCheckFunc   func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
 }
 
 func (mss *MockS3BackupConfigCheck) Run(config models.Config) []models.CheckTriggerResponse {
 	return mss.S3BackupConfigCheckFunc(config)
 }
 
+func (mss *MockS3BackupConfigCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
+}
+
 func SetupMockS3BackupConfigCheck() trigger.ICheck {
 	return &MockS3BackupConfigCheck{
 		S3BackupConfigCheckFunc: func(config models.Config) []models.CheckTriggerResponse {
 			m := []models.CheckTriggerResponse{}
 			return m
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockSoftwareVersionCheck struct {
-	SoftwareVersionCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	SoftwareVersionCheckFunc  func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
+}
+
+func (mss *MockSoftwareVersionCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
 }
 
 func (mss *MockSoftwareVersionCheck) Run(config models.Config) []models.CheckTriggerResponse {
@@ -231,11 +349,20 @@ func SetupMockSoftwareVersionCheck() trigger.ICheck {
 			m := []models.CheckTriggerResponse{}
 			return m
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockSystemResourceCheck struct {
-	SystemResourceCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	SystemResourceCheckFunc   func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
+}
+
+func (mss *MockSystemResourceCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
 }
 
 func (mss *MockSystemResourceCheck) Run(config models.Config) []models.CheckTriggerResponse {
@@ -248,13 +375,21 @@ func SetupMockSystemResourceCheck() trigger.ICheck {
 			m := []models.CheckTriggerResponse{}
 			return m
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
 
 type MockSystemUserCheck struct {
-	SystemUserCheckFunc func(config models.Config) []models.CheckTriggerResponse
+	SystemUserCheckFunc       func(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
 }
 
+func (mss *MockSystemUserCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
+}
 func (mss *MockSystemUserCheck) Run(config models.Config) []models.CheckTriggerResponse {
 	return mss.SystemUserCheckFunc(config)
 }
@@ -265,5 +400,9 @@ func SetupMockSystemUserCheck() trigger.ICheck {
 			m := []models.CheckTriggerResponse{}
 			return m
 		},
+		GetPortsForMockServerFunc: func() map[string]map[string][]int {
+			m := make(map[string]map[string][]int)
+			return m
+		},
 	}
 }
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/certificatechecktrigger/certificatechecktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/certificatechecktrigger/certificatechecktrigger.go
index 9ecdd26fc..90250a595 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/certificatechecktrigger/certificatechecktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/certificatechecktrigger/certificatechecktrigger.go
@@ -64,3 +64,8 @@ func (ss *CertificateCheck) Run(config models.Config) []models.CheckTriggerRespo
 	close(outputCh)
 	return finalResult
 }
+
+func (ss *CertificateCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
\ No newline at end of file
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/checktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/checktrigger.go
index 6f4884f83..48dc0da94 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/checktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/checktrigger.go
@@ -21,6 +21,7 @@ type CheckTrigger struct {
 }
 type ICheck interface {
 	Run(config models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServer() map[string]map[string][]int
 }
 
 func NewCheckTrigger(hrc, sshC, cert, eop, epc, fc, fqdn, nfs, os3, s3b, svc, src, suc ICheck) CheckTrigger {
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalopensearchchecktrigger/externalopensearchcheck.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalopensearchchecktrigger/externalopensearchcheck.go
index 7a97b5e55..c68d1dcca 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalopensearchchecktrigger/externalopensearchcheck.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalopensearchchecktrigger/externalopensearchcheck.go
@@ -26,6 +26,11 @@ func (eoc *ExternalOpensearchCheck) Run(config models.Config) []models.CheckTrig
 	return runCheckForOpensearch(config, eoc.port, eoc.log)
 }
 
+func (ss *ExternalOpensearchCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
+
 func runCheckForOpensearch(config models.Config, port string, log logger.Logger) []models.CheckTriggerResponse {
 	log.Debug("Trigger Opensearch check for automate and chef server nodes")
 	req := getOpensearchRequest(config.ExternalOS)
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalpostgresqlchecktrigger/externalpostgresqlcheck.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalpostgresqlchecktrigger/externalpostgresqlcheck.go
index 22d7fa5df..0dc66479f 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalpostgresqlchecktrigger/externalpostgresqlcheck.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalpostgresqlchecktrigger/externalpostgresqlcheck.go
@@ -27,6 +27,11 @@ func (epc *ExternalPostgresCheck) Run(config models.Config) []models.CheckTrigge
 	return runCheckForPostgresql(config, epc.port, epc.log)
 }
 
+func (ss *ExternalPostgresCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
+
 func runCheckForPostgresql(config models.Config, port string, log logger.Logger) []models.CheckTriggerResponse {
 	log.Debug("Trigger Postgresql check for automate and chef server nodes")
 	req := getPostgresRequest(config.ExternalPG)
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/firewallchecktrigger/firewallchecktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/firewallchecktrigger/firewallchecktrigger.go
index 2ba6efaf8..c04c6c3be 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/firewallchecktrigger/firewallchecktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/firewallchecktrigger/firewallchecktrigger.go
@@ -37,6 +37,29 @@ func (fc *FirewallCheck) Run(config models.Config) []models.CheckTriggerResponse
 	return response
 }
 
+func (fc *FirewallCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := map[string]map[string][]int{
+		constants.AUTOMATE: {
+			constants.TCP:   []int{9631, 9638},
+			constants.HTTPS: []int{443},
+			constants.HTTP:  []int{80},
+		},
+		constants.CHEF_INFRA_SERVER: {
+			constants.TCP:   []int{9631, 9638},
+			constants.HTTP:  []int{80},
+			constants.HTTPS: []int{443},
+		},
+		constants.POSTGRESQL: {
+			constants.TCP: []int{7432, 9631, 5432, 6432, 9638},
+			constants.UDP: []int{9638},
+		},
+		constants.OPENSEARCH: {
+			constants.TCP: []int{9200, 9300, 9631, 9638},
+		},
+	}
+	return nodeTypePortMap
+}
+
 // The request response is being constructed based on the https://docs.chef.io/automate/ha_on_premises_deployment_prerequisites/#firewall-checks (Firewall Checks)
 func makeRequests(config models.Config, reqMap map[string][]models.FirewallRequest) {
 	reqMap[constants.AUTOMATE] = getRequestsForAutomateAsSource(config)
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/fqdnchecktrigger/fqdncheck.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/fqdnchecktrigger/fqdncheck.go
index 1ff111c88..443113537 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/fqdnchecktrigger/fqdncheck.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/fqdnchecktrigger/fqdncheck.go
@@ -86,3 +86,15 @@ func getFqdnCheckRequest(ip, nodeType string, rootcert string, fqdn string, isAf
 
 	return fqdnReq
 }
+
+func (ss *FqdnCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := map[string]map[string][]int{
+		constants.AUTOMATE: {
+			constants.HTTPS: []int{443},
+		},
+		constants.CHEF_INFRA_SERVER: {
+			constants.HTTPS: []int{443},
+		},
+	}
+	return nodeTypePortMap
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/hardwareresourcechecktrigger/hardwareresourcecountchecktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/hardwareresourcechecktrigger/hardwareresourcecountchecktrigger.go
index be9cdfa9d..e44de4673 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/hardwareresourcechecktrigger/hardwareresourcecountchecktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/hardwareresourcechecktrigger/hardwareresourcecountchecktrigger.go
@@ -3,7 +3,7 @@ package hardwareresourcechecktrigger
 import (
 	"encoding/json"
 	"fmt"
-	"io/ioutil"
+	"io"
 	"net/http"
 
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
@@ -74,7 +74,7 @@ func (ss *HardwareResourceCountCheck) TriggerHardwareResourceCountCheck(body int
 		ss.log.Error("Error while Performing Hardware resource count check from batch Check API : ", err)
 		return nil, err
 	}
-	respBody, err := ioutil.ReadAll(resp.Body) // nosemgrep
+	respBody, err := io.ReadAll(resp.Body)
 	if err != nil {
 		ss.log.Error("Error while reading response of Hardware resource count check from batch Check API : ", err)
 		return nil, err
@@ -87,3 +87,8 @@ func (ss *HardwareResourceCountCheck) TriggerHardwareResourceCountCheck(body int
 	}
 	return &response, nil
 }
+
+func (ss *HardwareResourceCountCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/nfsmountbackupchecktrigger/nfsmountbackupcheck.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/nfsmountbackupchecktrigger/nfsmountbackupcheck.go
index 6255c0af2..31187d743 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/nfsmountbackupchecktrigger/nfsmountbackupcheck.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/nfsmountbackupchecktrigger/nfsmountbackupcheck.go
@@ -110,3 +110,8 @@ func constructSuccessResult(resp models.NFSMountCheckResponse) []models.CheckTri
 
 	return result
 }
+
+func (ss *NfsBackupConfigCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/opensearchs3bucketaccesschecktrigger/opensearchs3bucketaccesscheck.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/opensearchs3bucketaccesschecktrigger/opensearchs3bucketaccesscheck.go
index 34726ae67..7061747ce 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/opensearchs3bucketaccesschecktrigger/opensearchs3bucketaccesscheck.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/opensearchs3bucketaccesschecktrigger/opensearchs3bucketaccesscheck.go
@@ -45,6 +45,11 @@ func (osb *OpensearchS3BucketAccessCheck) Run(config models.Config) []models.Che
 
 }
 
+func (ss *OpensearchS3BucketAccessCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
+
 // setHostAsOpensearchInResponse sets the Host as external OS endpoint as this will help us in mapping the result correctly
 func setHostAsOpensearchInResponse(response []models.CheckTriggerResponse, osExternalUrl string) []models.CheckTriggerResponse {
 	for i := range response {
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/s3backupchecktrigger/s3backupconfigchecktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/s3backupchecktrigger/s3backupconfigchecktrigger.go
index 87f72980c..6a2add481 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/s3backupchecktrigger/s3backupconfigchecktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/s3backupchecktrigger/s3backupconfigchecktrigger.go
@@ -27,6 +27,11 @@ func (svc *S3BackupConfigCheck) Run(config models.Config) []models.CheckTriggerR
 	return runCheckForS3Config(config.Hardware.AutomateNodeIps, svc.log, svc.port, http.MethodPost, req)
 }
 
+func (ss *S3BackupConfigCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
+
 // runCheckForS3Config triggers the API on gives node automate nodes only for validating s3 backup config
 func runCheckForS3Config(nodeIps []string, log logger.Logger, port string, method string, reqBody models.S3ConfigRequest) []models.CheckTriggerResponse {
 	log.Debugf("Triggering the api call for automate nodes only for s3 backup config")
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/softwareversionchecktrigger/softwareversionchecktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/softwareversionchecktrigger/softwareversionchecktrigger.go
index 8d94a2c7c..4e32eadda 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/softwareversionchecktrigger/softwareversionchecktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/softwareversionchecktrigger/softwareversionchecktrigger.go
@@ -22,3 +22,8 @@ func NewSoftwareVersionCheck(log logger.Logger, port string) *SoftwareVersionChe
 func (svc *SoftwareVersionCheck) Run(config models.Config) []models.CheckTriggerResponse {
 	return trigger.RunCheck(config, svc.log, svc.port, constants.SOFTWARE_VERSION_CHECK_API_PATH, "")
 }
+
+func (ss *SoftwareVersionCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/sshuseraccesschecktrigger/sshuseraccesschecktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/sshuseraccesschecktrigger/sshuseraccesschecktrigger.go
index 9eef919bb..923cb9961 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/sshuseraccesschecktrigger/sshuseraccesschecktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/sshuseraccesschecktrigger/sshuseraccesschecktrigger.go
@@ -56,8 +56,13 @@ func getSShUserAPIRquest(ip string, sshUser models.SSHUser) models.SShUserReques
 	return models.SShUserRequest{
 		IP:           ip,
 		Username:     sshUser.Username,
+		Port:         sshUser.Port,
 		SudoPassword: sshUser.SudoPassword,
 		PrivateKey:   sshUser.PrivateKey,
 	}
+}
 
+func (ss *SshUserAccessCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
 }
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemresourcechecktrigger/systemresourceschecktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemresourcechecktrigger/systemresourceschecktrigger.go
index 2226c6436..118889674 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemresourcechecktrigger/systemresourceschecktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemresourcechecktrigger/systemresourceschecktrigger.go
@@ -22,3 +22,8 @@ func NewSystemResourceCheck(log logger.Logger, port string) *SystemResourceCheck
 func (src *SystemResourceCheck) Run(config models.Config) []models.CheckTriggerResponse {
 	return trigger.RunCheck(config, src.log, src.port, constants.SYSTEM_RESOURCE_CHECK_API_PATH, config.DeploymentState)
 }
+
+func (ss *SystemResourceCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
\ No newline at end of file
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemuserchecktrigger/systemuserchecktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemuserchecktrigger/systemuserchecktrigger.go
index 34b675ba5..17c0d8820 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemuserchecktrigger/systemuserchecktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemuserchecktrigger/systemuserchecktrigger.go
@@ -22,3 +22,8 @@ func NewSystemUserCheck(log logger.Logger, port string) *SystemUserCheck {
 func (suc *SystemUserCheck) Run(config models.Config) []models.CheckTriggerResponse {
 	return trigger.RunCheck(config, suc.log, suc.port, constants.SYSTEM_USER_CHECK_API_PATH, "")
 }
+
+func (ss *SystemUserCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/triggerapi.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/triggerapi.go
index 823051e1b..b94c517d0 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/triggerapi.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/triggerapi.go
@@ -98,6 +98,7 @@ func TriggerCheckAPI(endPoint, host, nodeType, method string, output chan<- mode
 	}
 
 	req, err := http.NewRequest(method, endPoint, reader)
+	req.Header.Set("Content-Type", "application/json")
 	if err != nil {
 		output <- models.CheckTriggerResponse{
 			Host:     host,
diff --git a/components/automate-cli/pkg/verifyserver/services/externalpostgresqlservice/externalpostgresqlservice.go b/components/automate-cli/pkg/verifyserver/services/externalpostgresqlservice/externalpostgresqlservice.go
index 549f7efc4..9856b70a6 100644
--- a/components/automate-cli/pkg/verifyserver/services/externalpostgresqlservice/externalpostgresqlservice.go
+++ b/components/automate-cli/pkg/verifyserver/services/externalpostgresqlservice/externalpostgresqlservice.go
@@ -55,7 +55,7 @@ func (pg *ExternalPostgresqlServiceImpl) GetPgConnection(req *models.ExternalPgR
 	}
 
 	// delete the file when its done
-	defer pg.fileUtils.DeleteTempFile(rootcert)
+	defer pg.fileUtils.DeleteFile(rootcert)
 
 	return resp, nil
 }
diff --git a/components/automate-cli/pkg/verifyserver/services/sshusercheckservice/sshusercheckservice.go b/components/automate-cli/pkg/verifyserver/services/sshusercheckservice/sshusercheckservice.go
index 4577867db..40893e1c2 100644
--- a/components/automate-cli/pkg/verifyserver/services/sshusercheckservice/sshusercheckservice.go
+++ b/components/automate-cli/pkg/verifyserver/services/sshusercheckservice/sshusercheckservice.go
@@ -47,7 +47,7 @@ func (ssu *SshUserServiceImpl) CheckSshUserDetails(req *models.SshUserChecksRequ
 	serviceResponse.Passed = isCheckPassed
 	serviceResponse.Checks = sshCheckResponse
 
-	ssu.FileUtils.DeleteTempFile(filePath)
+	ssu.FileUtils.DeleteFile(filePath)
 	return serviceResponse, nil
 }
 
@@ -57,7 +57,7 @@ func (ssu *SshUserServiceImpl) CheckSshConnection(sshConfig sshutils.SSHConfig,
 	checkResponse, err := ssu.SshUtil.Execute(sshConfig, command)
 	ssu.logger.Debug("The response after creating connection and executing command on the terminal: ", checkResponse)
 	if err != nil {
-		if strings.Contains(checkResponse, "Connection creation falied") {
+		if strings.Contains(checkResponse, "Connection creation failed") {
 			sshCheckResponse := models.NewFailureCheck(constants.SSH_USER_FAILURE_TITLE, constants.SSH_USER_ERROR_MESSAGE+ip, constants.SSH_USER_RESOLUTION_MESSAGE+ip)
 			sudoPasswordCheckResponse := models.NewFailureCheck(constants.SUDO_PASSWORD_FAILURE_TITLE, constants.SUDO_PASSWORD_CONNECTION_ERROR_MESSAGE+ip, constants.SUDO_PASSWORD_CONNECTION_RESOLUTION_MESSAGE+ip)
 			responseArray = append(responseArray, *sshCheckResponse, *sudoPasswordCheckResponse)
diff --git a/components/automate-cli/pkg/verifyserver/utils/httputils/httputil.go b/components/automate-cli/pkg/verifyserver/utils/httputils/httputil.go
index 9936b8461..e541be514 100644
--- a/components/automate-cli/pkg/verifyserver/utils/httputils/httputil.go
+++ b/components/automate-cli/pkg/verifyserver/utils/httputils/httputil.go
@@ -10,7 +10,21 @@ import (
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
 )
 
-//Post - This function performs HTTP Post request to the given endpoint with the provided request body
+type HttpRequestClient struct{}
+
+func NewHttpRequestClient() *HttpRequestClient {
+	return &HttpRequestClient{}
+}
+
+type IHttpRequestClient interface {
+	MakeRequest(requestMethod, url string, body interface{}) (*http.Response, error)
+}
+
+func (ht *HttpRequestClient) MakeRequest(requestMethod string, url string, body interface{}) (*http.Response, error) {
+	return MakeRequest(requestMethod, url, body)
+}
+
+// Post - This function performs HTTP Post request to the given endpoint with the provided request body
 func MakeRequest(requestMethod string, url string, body interface{}) (*http.Response, error) {
 	var reader io.Reader
 	if body != nil {
@@ -29,10 +43,10 @@ func MakeRequest(requestMethod string, url string, body interface{}) (*http.Resp
 	client := &http.Client{}
 	resp, err := client.Do(req)
 	if err != nil {
-		return nil, err
+		return resp, err
 	}
 	if err == nil && resp.StatusCode != 200 {
-		return nil, errors.New(resp.Status)
+		return resp, errors.New(resp.Status)
 	}
 	return resp, nil
 }
diff --git a/components/automate-cli/pkg/verifyserver/utils/httputils/httputilsmock.go b/components/automate-cli/pkg/verifyserver/utils/httputils/httputilsmock.go
new file mode 100644
index 000000000..cb1b5c2ee
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/utils/httputils/httputilsmock.go
@@ -0,0 +1,13 @@
+package httputils
+
+import (
+	"net/http"
+)
+
+type MockHttpRequestClient struct {
+	MakeRequestFunc func(requestMethod, url string, body interface{}) (*http.Response, error)
+}
+
+func (mss *MockHttpRequestClient) MakeRequest(requestMethod, url string, body interface{}) (*http.Response, error) {
+	return mss.MakeRequestFunc(requestMethod, url, body)
+}
diff --git a/components/automate-opensearch/habitat/hooks/init b/components/automate-opensearch/habitat/hooks/init
index 20c6a37b9..9961986fa 100644
--- a/components/automate-opensearch/habitat/hooks/init
+++ b/components/automate-opensearch/habitat/hooks/init
@@ -43,7 +43,7 @@ openssl x509 -extfile <(printf "subjectAltName=DNS:chefnode") -req -in {{pkg.svc
 openssl genrsa -out {{pkg.svc_config_path}}/client-key-temp.pem 2048
 openssl pkcs8 -inform PEM -outform PEM -in {{pkg.svc_config_path}}/client-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out {{pkg.svc_config_path}}/client-key.pem
 openssl req -new -key {{pkg.svc_config_path}}/client-key.pem -subj "/C=US/ST=Washington/L=Seattle/O=Chef Software Inc/CN=chefclient" -out {{pkg.svc_config_path}}/client.csr
-openssl x509  -extfile <(printf "subjectAltName=DNS:chefclient")-req -in {{pkg.svc_config_path}}/client.csr -CA {{pkg.svc_config_path}}/root-ca.pem -CAkey {{pkg.svc_config_path}}/root-ca-key.pem -CAcreateserial -sha256 -out {{pkg.svc_config_path}}/client.pem -days 1095
+openssl x509 -extfile <(printf "subjectAltName=DNS:chefclient") -req -in {{pkg.svc_config_path}}/client.csr -CA {{pkg.svc_config_path}}/root-ca.pem -CAkey {{pkg.svc_config_path}}/root-ca-key.pem -CAcreateserial -sha256 -out {{pkg.svc_config_path}}/client.pem -days 1095
 # Cleanup
 rm {{pkg.svc_config_path}}/admin-key-temp.pem
 rm {{pkg.svc_config_path}}/admin.csr
diff --git a/components/docs-chef-io/content/automate/ha_cert_selfsign.md b/components/docs-chef-io/content/automate/ha_cert_selfsign.md
index 4f98d37e4..93c15f9f7 100644
--- a/components/docs-chef-io/content/automate/ha_cert_selfsign.md
+++ b/components/docs-chef-io/content/automate/ha_cert_selfsign.md
@@ -45,7 +45,11 @@ You can create a self-signed key and certificate pair with the **OpenSSL** utili
     # !/bin/bash
 
     echo extendedKeyUsage = clientAuth, serverAuth > server_cert_ext.cnf
+    echo subjectAltName = DNS:chefadmin >> server_cert_ext.cnf
+    echo extendedKeyUsage = clientAuth, serverAuth > node_cert_ext.cnf
+    echo subjectAltName = DNS:chefnode >> node_cert_ext.cnf 
     echo extendedKeyUsage = clientAuth, serverAuth > client_cert_ext.cnf
+    echo subjectAltName = DNS:chefclient >> client_cert_ext.cnf
         openssl genrsa -out root-ca-key.pem 2048
         openssl req -new -x509 -sha256 -key root-ca-key.pem -subj "/C=US/ST=Washington/L=Seattle/O=Chef Software Inc/CN=progress" -out root-ca.pem -days 1095
 
@@ -53,25 +57,25 @@ You can create a self-signed key and certificate pair with the **OpenSSL** utili
         openssl genrsa -out admin-key-temp.pem 2048
         openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
         openssl req -new -key admin-key.pem -subj "/C=US/ST=Washington/L=Seattle/O=Chef Software Inc/CN=chefadmin" -out admin.csr
-        openssl x509 -extfile <(printf "subjectAltName=DNS:chefadmin") -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 1095 -extfile server_cert_ext.cnf
+        openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 1095 -extfile server_cert_ext.cnf
 
         # Node cert 1
         openssl genrsa -out node1-key-temp.pem 2048
         openssl pkcs8 -inform PEM -outform PEM -in node1-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node1-key.pem
         openssl req -new -key node1-key.pem -subj "/C=US/ST=Washington/L=Seattle/O=Chef Software Inc/CN=chefnode" -out node1.csr
-        openssl x509 -extfile <(printf "subjectAltName=DNS:chefnode") -req -in node1.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node1.pem -days 1095 -extfile client_cert_ext.cnf
+        openssl x509 -req -in node1.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node1.pem -days 1095 -extfile node_cert_ext.cnf
 
         # Node cert 2
         openssl genrsa -out node2-key-temp.pem 2048
         openssl pkcs8 -inform PEM -outform PEM -in node2-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node2-key.pem
         openssl req -new -key node2-key.pem -subj "/C=US/ST=Washington/L=Seattle/O=Chef Software Inc/CN=chefnode" -out node2.csr
-        openssl x509 -extfile <(printf "subjectAltName=DNS:chefnode") -req -in node2.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node2.pem -days 1095 -extfile client_cert_ext.cnf
+        openssl x509 -req -in node2.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node2.pem -days 1095 -extfile node_cert_ext.cnf
 
         # Client cert
         openssl genrsa -out client-key-temp.pem 2048
         openssl pkcs8 -inform PEM -outform PEM -in client-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out client-key.pem
         openssl req -new -key client-key.pem -subj "/C=US/ST=Washington/L=Seattle/O=Chef Software Inc/CN=chefclient" -out client.csr
-        openssl x509 -extfile <(printf "subjectAltName=DNS:chefclient") -req -in client.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out client.pem -days 1095 -extfile client_cert_ext.cnf
+        openssl x509 -req -in client.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out client.pem -days 1095 -extfile client_cert_ext.cnf
     ```
 
 1. The script generates the certificates at the newly created directory, `rotate-certs` in this case.
diff --git a/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_gather-logs.yaml b/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_gather-logs.yaml
index b0659d24d..b04a2512d 100644
--- a/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_gather-logs.yaml
+++ b/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_gather-logs.yaml
@@ -33,4 +33,4 @@ inherited_options:
   usage: Write command result as JSON to PATH
 see_also:
 - chef-automate - Chef Automate CLI
-supported_on: FrontEnd
+supported_on: Bastion
diff --git a/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_preflight-check.yaml b/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_preflight-check.yaml
index 79a48a5d6..b88be8ef0 100644
--- a/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_preflight-check.yaml
+++ b/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_preflight-check.yaml
@@ -56,4 +56,4 @@ see_also:
 - chef-automate - Chef Automate CLI
 - migrate-from-v1 - Run preflight checks specific to migrating from Chef Automate
   v1
-supported_on: FrontEnd
+supported_on: Bastion
diff --git a/lib/arrayutils/slice.go b/lib/arrayutils/slice.go
new file mode 100644
index 000000000..d4bed06df
--- /dev/null
+++ b/lib/arrayutils/slice.go
@@ -0,0 +1,16 @@
+package arrayutils
+
+// This method is used to find the difference between the two slices and return the uncommon elements in the first set. It returns (A-B) operation
+func SliceDifference(first, second []int) []int {
+	mb := make(map[int]struct{}, len(second))
+	for _, x := range second {
+		mb[x] = struct{}{}
+	}
+	var diff []int
+	for _, x := range first {
+		if _, found := mb[x]; !found {
+			diff = append(diff, x)
+		}
+	}
+	return diff
+}
diff --git a/lib/certgenerateutils/certgenerate.go b/lib/certgenerateutils/certgenerate.go
new file mode 100644
index 000000000..6c64a9a05
--- /dev/null
+++ b/lib/certgenerateutils/certgenerate.go
@@ -0,0 +1,114 @@
+package certgenerateutils
+
+import (
+	"crypto/rand"
+	"crypto/rsa"
+	"crypto/x509"
+	"crypto/x509/pkix"
+	"encoding/pem"
+	"fmt"
+	"math/big"
+	"os"
+	"time"
+
+	"github.com/pkg/errors"
+)
+
+func generateSerial() (*big.Int, error) {
+	// According to
+	// https://cabforum.org/wp-content/uploads/CA-Browser-Forum-BR-1.6.4.pdf:
+	//
+	// Effective September 30, 2016, CAs SHALL generate
+	// non-sequential Certificate serial numbers greater than zero
+	// (0) containing at least 64 bits of output from a CSPRNG.
+	//
+	// Here, we set the limit to double this requirement.
+	limit := new(big.Int).Lsh(big.NewInt(1), 128)
+	ret, err := rand.Int(rand.Reader, limit)
+	if err != nil {
+		return nil, errors.Wrap(err, "failed to generate serial number")
+	}
+	return ret, nil
+}
+
+func GenerateCert(ip string) (string, string, error) {
+	// Generate a private key
+	privateKeyFilePath := ""
+	publicKeyFilePath := ""
+	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
+	if err != nil {
+		fmt.Println("Failed to generate private key:", err)
+		return privateKeyFilePath, publicKeyFilePath, err
+	}
+
+	serial, err := generateSerial()
+	if err != nil {
+		fmt.Println("Failed to generate serial:", err)
+		return privateKeyFilePath, publicKeyFilePath, err
+	}
+
+	// Create a self-signed certificate
+	template := &x509.Certificate{
+		SerialNumber: serial,
+		Subject: pkix.Name{
+			Country:            []string{"US"},
+			Organization:       []string{"Chef Software"},
+			OrganizationalUnit: []string{"Chef Automate"},
+			CommonName:         ip,
+		},
+		NotBefore:             time.Now(),
+		NotAfter:              time.Now().AddDate(10, 0, 0),
+		ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth},
+		KeyUsage:              x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
+		BasicConstraintsValid: true,
+		IsCA:                  true,
+		DNSNames:              []string{ip},
+	}
+
+	derBytes, err := x509.CreateCertificate(rand.Reader, template, template, &privateKey.PublicKey, privateKey)
+	if err != nil {
+		fmt.Println("Failed to create certificate:", err)
+		return privateKeyFilePath, publicKeyFilePath, err
+	}
+
+	// Save private key to file
+	privateKeyFile, err := os.CreateTemp("", "private_key.pem")
+	if err != nil {
+		fmt.Println("Failed to create private key file:", err)
+		return privateKeyFilePath, publicKeyFilePath, err
+	}
+	defer privateKeyFile.Close()
+
+	privateKeyBlock := &pem.Block{
+		Type:  "PRIVATE KEY",
+		Bytes: x509.MarshalPKCS1PrivateKey(privateKey),
+	}
+
+	err = pem.Encode(privateKeyFile, privateKeyBlock)
+	if err != nil {
+		fmt.Println("Failed to encode private key:", err)
+		return privateKeyFilePath, publicKeyFilePath, err
+	}
+
+	// Save certificate to file
+	certFile, err := os.CreateTemp("", "certificate.pem")
+	if err != nil {
+		fmt.Println("Failed to create certificate file:", err)
+		return privateKeyFilePath, publicKeyFilePath, err
+	}
+	defer certFile.Close()
+
+	certBlock := &pem.Block{
+		Type:  "CERTIFICATE",
+		Bytes: derBytes,
+	}
+
+	err = pem.Encode(certFile, certBlock)
+	if err != nil {
+		fmt.Println("Failed to encode certificate:", err)
+		return privateKeyFilePath, publicKeyFilePath, err
+	}
+	privateKeyFilePath = privateKeyFile.Name()
+	publicKeyFilePath = certFile.Name()
+	return privateKeyFilePath, publicKeyFilePath, nil
+}
diff --git a/lib/io/fileutils/fileutils.go b/lib/io/fileutils/fileutils.go
index 834f09270..19093bd9e 100644
--- a/lib/io/fileutils/fileutils.go
+++ b/lib/io/fileutils/fileutils.go
@@ -29,7 +29,7 @@ type FileUtils interface {
 	ReadFile(filename string) ([]byte, error)
 	WriteFile(filepath string, data []byte, perm os.FileMode) error
 	CreateTempFile(content string, filename string) (string, error)
-	DeleteTempFile(tempFile string) error
+	DeleteFile(fileName string) error
 }
 
 type FileSystemUtils struct{}
@@ -68,8 +68,8 @@ func (fsu *FileSystemUtils) WriteFile(filepath string, data []byte, perm os.File
 func (fsu *FileSystemUtils) CreateTempFile(content string, filename string) (string, error) {
 	return CreateTempFile(content, filename)
 }
-func (fsu *FileSystemUtils) DeleteTempFile(tempFile string) error {
-	return DeleteTempFile(tempFile)
+func (fsu *FileSystemUtils) DeleteFile(filePath string) error {
+	return DeleteFile(filePath)
 }
 
 // LogCLose closes the given io.Closer, logging any error.
@@ -172,6 +172,6 @@ func CreateTempFile(content string, filename string) (string, error) {
 	return tempFile.Name(), nil
 }
 
-func DeleteTempFile(tempFile string) error {
-	return os.Remove(tempFile)
+func DeleteFile(filePath string) error {
+	return os.Remove(filePath)
 }
diff --git a/lib/io/fileutils/mockFileUtils.go b/lib/io/fileutils/mockFileUtils.go
index dbad5bc1b..15e9642af 100644
--- a/lib/io/fileutils/mockFileUtils.go
+++ b/lib/io/fileutils/mockFileUtils.go
@@ -48,6 +48,6 @@ func (fsu *MockFileSystemUtils) WriteFile(filepath string, data []byte, perm os.
 func (fsu *MockFileSystemUtils) CreateTempFile(content string, filename string) (string, error) {
 	return fsu.CreateTempFileFunc(content, filename)
 }
-func (fsu *MockFileSystemUtils) DeleteTempFile(tempFile string) error {
+func (fsu *MockFileSystemUtils) DeleteFile(tempFile string) error {
 	return fsu.DeleteTempFileFunc(tempFile)
 }


Test patch:
diff --git a/components/automate-cli/pkg/verifyserver/models/batchcheck_test.go b/components/automate-cli/pkg/verifyserver/models/batchcheck_test.go
index 7a9861fd1..2c11f1d6b 100644
--- a/components/automate-cli/pkg/verifyserver/models/batchcheck_test.go
+++ b/components/automate-cli/pkg/verifyserver/models/batchcheck_test.go
@@ -132,6 +132,7 @@ func TestPopulateWith(t *testing.T) {
 				SSHUser: SSHUser{
 					Username:     "ubuntu",
 					PrivateKey:   "./testdata/A2HA.pem",
+					Port:         "22",
 					SudoPassword: "",
 				},
 				Arch: "existing_nodes",
@@ -197,6 +198,7 @@ func TestPopulateWith(t *testing.T) {
 				SSHUser: SSHUser{
 					Username:     "ubuntu",
 					PrivateKey:   "./testdata/A2HA.pem",
+					Port:         "22",
 					SudoPassword: "",
 				},
 				Arch: "aws",
@@ -284,6 +286,7 @@ func TestPopulateWith(t *testing.T) {
 				SSHUser: SSHUser{
 					Username:     "ubuntu",
 					PrivateKey:   "./testdata/A2HA.pem",
+					Port:         "22",
 					SudoPassword: "",
 				},
 				Arch: "existing_nodes",
diff --git a/components/automate-cli/pkg/verifyserver/server/api/v1/batchcheck_test.go b/components/automate-cli/pkg/verifyserver/server/api/v1/batchcheck_test.go
index 43789948a..1ed349a53 100644
--- a/components/automate-cli/pkg/verifyserver/server/api/v1/batchcheck_test.go
+++ b/components/automate-cli/pkg/verifyserver/server/api/v1/batchcheck_test.go
@@ -1,7 +1,8 @@
 package v1_test
 
 import (
-	"io/ioutil"
+	"errors"
+	"io"
 	"net/http/httptest"
 	"strings"
 	"testing"
@@ -17,9 +18,12 @@ import (
 	"github.com/stretchr/testify/assert"
 )
 
-func SetupMockBatchCheckService() batchcheckservice.IBatchCheckService {
+func SetupMockBatchCheckService(errorFromBatchCheck bool) batchcheckservice.IBatchCheckService {
 	return &batchcheckservice.MockBatchCheckService{
-		BatchCheckFunc: func(checks []string, config models.Config) models.BatchCheckResponse {
+		BatchCheckFunc: func(checks []string, config models.Config) (models.BatchCheckResponse, error) {
+			if errorFromBatchCheck {
+				return models.BatchCheckResponse{}, errors.New("error occurred in batch check service")
+			}
 			return models.BatchCheckResponse{
 				Status: "SUCCESS",
 				Result: []models.BatchCheckResult{
@@ -64,7 +68,7 @@ func SetupMockBatchCheckService() batchcheckservice.IBatchCheckService {
 						},
 					},
 				},
-			}
+			}, nil
 		},
 	}
 }
@@ -93,10 +97,11 @@ func SetupHandlers(ss batchcheckservice.IBatchCheckService) (*fiber.App, error)
 
 func TestBatchCheckAPI(t *testing.T) {
 	tests := []struct {
-		description  string
-		expectedCode int
-		expectedBody string
-		requestBody  string
+		description         string
+		expectedCode        int
+		expectedBody        string
+		requestBody         string
+		errorFromBatchCheck bool
 	}{
 		{
 			description: "200:success batch check route",
@@ -155,20 +160,37 @@ func TestBatchCheckAPI(t *testing.T) {
 			expectedCode: 400,
 			expectedBody: "\"batch check request body parsing failed: unexpected end of JSON input\"",
 		},
+		{
+			description: "Batch check service returns error",
+			requestBody: `{
+				"checks": ["hardware-resource-count", "ssh-user"],
+				"config":{
+					"ssh_user":{
+						"user_name": "ubuntu",
+						"private_key": "",
+						"sudo_password": ""
+						}
+					}
+				}`,
+			expectedCode:        500,
+			errorFromBatchCheck: true,
+
+			expectedBody: "\"error occurred in batch check service\"",
+		},
 	}
 	batchCheckEndpoint := "/api/v1/checks/batch-checks"
 	// Setup the app as it is done in the main function
-	app, err := SetupHandlers(SetupMockBatchCheckService())
-	assert.NoError(t, err)
-
 	for _, test := range tests {
 		t.Run(test.description, func(t *testing.T) {
+			app, err := SetupHandlers(SetupMockBatchCheckService(test.errorFromBatchCheck))
+			assert.NoError(t, err)
+
 			bodyReader := strings.NewReader(test.requestBody)
 			req := httptest.NewRequest("POST", batchCheckEndpoint, bodyReader)
 			req.Header.Add("Content-Type", "application/json")
 			res, err := app.Test(req, -1)
 			assert.NoError(t, err)
-			body, err := ioutil.ReadAll(res.Body)
+			body, err := io.ReadAll(res.Body)
 			assert.NoError(t, err, test.description)
 			assert.Contains(t, string(body), test.expectedBody)
 			assert.Equal(t, test.expectedCode, res.StatusCode)
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice_test.go
index f055604cb..7d5777dd6 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice_test.go
@@ -1,36 +1,182 @@
 package batchcheckservice
 
 import (
+	"bytes"
 	"encoding/json"
-	"testing"
 
-	"github.com/gofiber/fiber/v2"
+	"errors"
+	"io"
+	"net/http"
+	"testing"
 
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/models"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/utils/httputils"
+	"github.com/chef/automate/lib/io/fileutils"
+	"github.com/chef/automate/lib/logger"
+	"github.com/gofiber/fiber/v2"
+
 	"github.com/stretchr/testify/assert"
 )
 
+func SetupMockHttpRequestClient(responseJson string, err error, shouldStartMockServerOnSomeNodesOnly bool) httputils.IHttpRequestClient {
+	r := io.NopCloser(bytes.NewReader([]byte(responseJson)))
+	return &httputils.MockHttpRequestClient{
+		MakeRequestFunc: func(requestMethod, url string, body interface{}) (*http.Response, error) {
+			if shouldStartMockServerOnSomeNodesOnly && url == "http://1.2.3.4:1234/api/v1/start/mock-server" {
+				return &http.Response{
+					StatusCode: 500,
+				}, errors.New("Error occurred")
+			}
+			return &http.Response{
+				StatusCode: 200,
+				Body:       r,
+			}, err
+		},
+	}
+}
+
 func TestBatchCheckService(t *testing.T) {
 	tests := []struct {
-		description                      string
-		totalIpsCount                    int
-		hardwareCheckMockedResponse      []models.CheckTriggerResponse
-		sshUserCheckMockedResponse       []models.CheckTriggerResponse
-		externalOpenSearchMockedResponse []models.CheckTriggerResponse
-		externalPostgresMockedResponse   []models.CheckTriggerResponse
-		chefServerIpArray                []string
-		expectedResponseForAutomateIp    string
-		expectedResponseFromChefServerIp string
-		expectedResponseForPostgresIp1   string
-		expectedResponseForPostgresIp2   string
-		expectedResponseForOpenSearchIp1 string
-		expectedResponseForOpenSearchIp2 string
+		description                          string
+		totalIpsCount                        int
+		hardwareCheckMockedResponse          []models.CheckTriggerResponse
+		sshUserCheckMockedResponse           []models.CheckTriggerResponse
+		externalOpenSearchMockedResponse     []models.CheckTriggerResponse
+		externalPostgresMockedResponse       []models.CheckTriggerResponse
+		checksToExecute                      []string
+		chefServerIpArray                    []string
+		statusApiResponse                    string
+		statusApiError                       error
+		avoidSuccessResponse                 bool
+		checkForError                        bool
+		expectedError                        error
+		shouldStartMockServerOnSomeNodesOnly bool
+		expectedResponseForAutomateIp        string
+		expectedResponseFromChefServerIp     string
+		expectedResponseForPostgresIp1       string
+		expectedResponseForPostgresIp2       string
+		expectedResponseForOpenSearchIp1     string
+		expectedResponseForOpenSearchIp2     string
+		mockServerPort                       string
 	}{
 		{
-			description:       "Batch check server success with automate and chef-server on same IP",
-			totalIpsCount:     6,
+			description:          "Batch check service returns error when status api fails",
+			totalIpsCount:        6,
+			chefServerIpArray:    []string{"1.2.3.4"},
+			avoidSuccessResponse: true,
+			checkForError:        true,
+			mockServerPort:       "1212",
+			statusApiResponse:    `{}`,
+			statusApiError:       errors.New("Invalid request"),
+			externalPostgresMockedResponse: []models.CheckTriggerResponse{
+				{
+					Status:   "Passed",
+					Host:     "1.2.3.7",
+					NodeType: "postgresql",
+					Result: models.ApiResult{
+						Passed: false,
+						Checks: []models.Checks{
+							{
+								Title: "external-postgresql-1",
+							},
+							{
+								Title: "external-postgresql-2",
+							},
+						},
+					},
+				},
+				{
+					Status:   "Passed",
+					Host:     "1.2.3.8",
+					NodeType: "postgresql",
+					Result: models.ApiResult{
+						Passed: true,
+						Checks: []models.Checks{
+							{
+								Title: "external-postgresql-check-1",
+							},
+							{
+								Title: "external-postgresql-check-2",
+							},
+						},
+					},
+				},
+			},
+		},
+		{
+			description:                          "Batch check service returns error when mock server not started on some nodes",
+			totalIpsCount:                        6,
+			chefServerIpArray:                    []string{"1.2.3.4"},
+			avoidSuccessResponse:                 true,
+			shouldStartMockServerOnSomeNodesOnly: true,
+			checkForError:                        true,
+			expectedError:                        errors.New("mock server stop failed on some nodes"),
+			mockServerPort:                       "1234",
+			statusApiResponse: `{
+				"status": "SUCCESS",
+				"result": {
+					"status": "OK",
+					"services": [],
+					"error": "error getting services from hab svc status"
+				}
+			}`,
+		},
+		{
+			description:          "Batch check service returns error when status api response body parse fails",
+			totalIpsCount:        6,
+			chefServerIpArray:    []string{"1.2.3.4"},
+			avoidSuccessResponse: true,
+			checkForError:        true,
+			mockServerPort:       "1234",
+			statusApiResponse:    `invalid JSON`,
+			externalPostgresMockedResponse: []models.CheckTriggerResponse{
+				{
+					Status:   "Passed",
+					Host:     "1.2.3.7",
+					NodeType: "postgresql",
+					Result: models.ApiResult{
+						Passed: false,
+						Checks: []models.Checks{
+							{
+								Title: "external-postgresql-1",
+							},
+							{
+								Title: "external-postgresql-2",
+							},
+						},
+					},
+				},
+				{
+					Status:   "Passed",
+					Host:     "1.2.3.8",
+					NodeType: "postgresql",
+					Result: models.ApiResult{
+						Passed: true,
+						Checks: []models.Checks{
+							{
+								Title: "external-postgresql-check-1",
+							},
+							{
+								Title: "external-postgresql-check-2",
+							},
+						},
+					},
+				},
+			},
+		},
+		{
+			description:   "Batch check server success with automate and chef-server on same IP",
+			totalIpsCount: 6,
+			statusApiResponse: `{
+					"status": "SUCCESS",
+					"result": {
+						"status": "OK",
+						"services": [],
+						"error": "error getting services from hab svc status"
+					}
+				}`,
 			chefServerIpArray: []string{"1.2.3.4"},
 			hardwareCheckMockedResponse: []models.CheckTriggerResponse{
 				{
@@ -240,8 +386,16 @@ func TestBatchCheckService(t *testing.T) {
 			expectedResponseForOpenSearchIp2: "{\"node_type\":\"opensearch\",\"ip\":\"1.2.3.6\",\"tests\":[{\"passed\":true,\"msg\":\"Hardware Resource Count Check\",\"check\":\"hardware-resource-count\",\"checks\":[{\"title\":\"hardware-resource-count-check-1\",\"passed\":false,\"success_msg\":\"\",\"error_msg\":\"\",\"resolution_msg\":\"\"},{\"title\":\"hardware-resource-count-check-2\",\"passed\":false,\"success_msg\":\"\",\"error_msg\":\"\",\"resolution_msg\":\"\"}]},{\"passed\":true,\"msg\":\"External Opensearch Check\",\"check\":\"external-opensearch\",\"checks\":[{\"title\":\"external-opensearch-check-1\",\"passed\":false,\"success_msg\":\"\",\"error_msg\":\"\",\"resolution_msg\":\"\"},{\"title\":\"external-opensearch-check-2\",\"passed\":false,\"success_msg\":\"\",\"error_msg\":\"\",\"resolution_msg\":\"\"}]}]}",
 		},
 		{
-			description:       "Batch check server success with nodes on different ip",
-			totalIpsCount:     7,
+			description:   "Batch check server success with nodes on different ip",
+			totalIpsCount: 7,
+			statusApiResponse: `{
+					"status": "SUCCESS",
+					"result": {
+						"status": "OK",
+						"services": [],
+						"error": "error getting services from hab svc status"
+					}
+				}`,
 			chefServerIpArray: []string{"1.2.8.4"},
 			hardwareCheckMockedResponse: []models.CheckTriggerResponse{
 				{
@@ -387,8 +541,34 @@ func TestBatchCheckService(t *testing.T) {
 			expectedResponseForOpenSearchIp2: "{\"node_type\":\"opensearch\",\"ip\":\"1.2.3.6\",\"tests\":[{\"passed\":true,\"msg\":\"External Opensearch Check\",\"check\":\"external-opensearch\",\"checks\":[{\"title\":\"external-opensearch-check-1\",\"passed\":false,\"success_msg\":\"\",\"error_msg\":\"\",\"resolution_msg\":\"\"},{\"title\":\"external-opensearch-check-2\",\"passed\":false,\"success_msg\":\"\",\"error_msg\":\"\",\"resolution_msg\":\"\"}]}]}",
 		},
 		{
-			description:       "Batch check server success with error on some nodes",
-			totalIpsCount:     7,
+			description:                          "Batch check service returns error mock server in not started successfully on all nodes",
+			totalIpsCount:                        6,
+			chefServerIpArray:                    []string{"1.2.3.4"},
+			avoidSuccessResponse:                 true,
+			checkForError:                        true,
+			expectedError:                        errors.New("mock server start failed on some nodes"),
+			mockServerPort:                       "1234",
+			shouldStartMockServerOnSomeNodesOnly: true,
+			statusApiResponse: `{
+					"status": "SUCCESS",
+					"result": {
+						"status": "OK",
+						"services": [],
+						"error": "error getting services from hab svc status"
+					}
+				}`,
+		},
+		{
+			description:   "Batch check server success with error on some nodes",
+			totalIpsCount: 7,
+			statusApiResponse: `{
+					"status": "SUCCESS",
+					"result": {
+						"status": "OK",
+						"services": [],
+						"error": "error getting services from hab svc status"
+					}
+				}`,
 			chefServerIpArray: []string{"1.2.8.4"},
 			hardwareCheckMockedResponse: []models.CheckTriggerResponse{
 				{
@@ -544,8 +724,10 @@ func TestBatchCheckService(t *testing.T) {
 				SetupMockSoftwareVersionCheck(),
 				SetupMockSystemResourceCheck(),
 				SetupMockSystemUserCheck(),
-			))
-			resp := ss.BatchCheck([]string{
+			), logger.NewTestLogger(), "1234")
+
+			ss.httpRequestClient = SetupMockHttpRequestClient(test.statusApiResponse, test.statusApiError, test.shouldStartMockServerOnSomeNodesOnly)
+			checksToExecute := []string{
 				constants.FIREWALL,
 				constants.FQDN,
 				constants.SSH_USER,
@@ -558,7 +740,13 @@ func TestBatchCheckService(t *testing.T) {
 				constants.SOFTWARE_VERSIONS,
 				constants.SYSTEM_RESOURCES,
 				constants.SYSTEM_USER,
-				constants.AWS_OPENSEARCH_S3_BUCKET_ACCESS}, models.Config{
+				constants.AWS_OPENSEARCH_S3_BUCKET_ACCESS,
+			}
+
+			if len(test.checksToExecute) > 0 {
+				checksToExecute = test.checksToExecute
+			}
+			resp, err := ss.BatchCheck(checksToExecute, models.Config{
 				Hardware: models.Hardware{
 					AutomateNodeCount:        1,
 					AutomateNodeIps:          []string{"1.2.3.4"},
@@ -571,25 +759,228 @@ func TestBatchCheckService(t *testing.T) {
 				},
 			})
 
-			assert.Equal(t, resp.Status, "SUCCESS")
-			assert.Equal(t, len(resp.Result), test.totalIpsCount)
-			res := getResponseForIp(resp.Result, "1.2.3.4", "automate")
-			res1 := getResponseForIp(resp.Result, test.chefServerIpArray[0], "chef-infra-server")
-			res2 := getResponseForIp(resp.Result, "1.2.3.7", "postgresql")
-			res3 := getResponseForIp(resp.Result, "1.2.3.8", "postgresql")
-			res4 := getResponseForIp(resp.Result, "1.2.3.5", "opensearch")
-			res5 := getResponseForIp(resp.Result, "1.2.3.6", "opensearch")
-			assert.Equal(t, test.expectedResponseForAutomateIp, res)
-			assert.Equal(t, test.expectedResponseFromChefServerIp, res1)
-			assert.Equal(t, test.expectedResponseForPostgresIp1, res2)
-			assert.Equal(t, test.expectedResponseForPostgresIp2, res3)
-			assert.Equal(t, test.expectedResponseForOpenSearchIp1, res4)
-			assert.Equal(t, test.expectedResponseForOpenSearchIp2, res5)
+			if test.checkForError {
+				assert.NotEqual(t, err.Error(), test.expectedError)
+			}
+
+			if !test.avoidSuccessResponse {
+				assert.Equal(t, resp.Status, "SUCCESS")
+				assert.Equal(t, len(resp.Result), test.totalIpsCount)
+				assert.Equal(t, test.expectedResponseForAutomateIp, getResponseForIp(resp.Result, "1.2.3.4", "automate"))
+				assert.Equal(t, test.expectedResponseFromChefServerIp, getResponseForIp(resp.Result, test.chefServerIpArray[0], "chef-infra-server"))
+				assert.Equal(t, test.expectedResponseForPostgresIp1, getResponseForIp(resp.Result, "1.2.3.7", "postgresql"))
+				assert.Equal(t, test.expectedResponseForPostgresIp2, getResponseForIp(resp.Result, "1.2.3.8", "postgresql"))
+				assert.Equal(t, test.expectedResponseForOpenSearchIp1, getResponseForIp(resp.Result, "1.2.3.5", "opensearch"))
+				assert.Equal(t, test.expectedResponseForOpenSearchIp2, getResponseForIp(resp.Result, "1.2.3.6", "opensearch"))
+			}
 		})
 	}
 
 }
 
+func TestStartMockServer(t *testing.T) {
+	ss := getBatchCheckServiceInstance()
+	ss.httpRequestClient = SetupMockHttpRequestClient(`{
+		"status": "SUCCESS",
+		"result": {
+			"status": "OK",
+			"services": [],
+			"error": "error getting services from hab svc status"
+		}
+	}`, nil, false)
+	startedServers, failedServers := ss.startMockServer([]string{constants.FIREWALL, constants.FQDN},
+		models.Config{
+			Hardware: models.Hardware{
+				AutomateNodeCount:        1,
+				AutomateNodeIps:          []string{"1.2.3.4"},
+				ChefInfraServerNodeCount: 1,
+				ChefInfraServerNodeIps:   []string{"1.2.3.4"},
+				PostgresqlNodeCount:      1,
+				PostgresqlNodeIps:        []string{"1.2.3.7", "1.2.3.8"},
+				OpenSearchNodeCount:      1,
+				OpenSearchNodeIps:        []string{"1.2.3.5", "1.2.3.6"},
+			},
+		},
+	)
+	totalA := 0
+	totalP := 0
+	totalO := 0
+	for _, resp := range startedServers {
+		if resp.Host == "1.2.3.4" {
+			totalA += 1
+		}
+		if resp.Host == "1.2.3.7" || resp.Host == "1.2.3.8" {
+			totalP += 1
+		}
+		if resp.Host == "1.2.3.5" || resp.Host == "1.2.3.6" {
+			totalO += 1
+		}
+	}
+	assert.Equal(t, len(startedServers), 23)
+	assert.Equal(t, len(failedServers), 0)
+}
+
+func TestGetDeploymentStateReturnsErrorWhenAutomateNotReachable(t *testing.T) {
+	ss := getBatchCheckServiceInstance()
+
+	ss.httpRequestClient = SetupMockHttpRequestClient("", errors.New("error occurred"), true)
+	_, err := ss.getDeploymentState(models.Config{
+		Hardware: models.Hardware{
+			AutomateNodeCount: 2,
+			AutomateNodeIps:   []string{"1.2.3.4", "1,2,3.5"},
+		},
+	})
+	assert.NotNil(t, "received no response for status api from any automate nodes", err.Error())
+}
+
+func TestGetDeploymentStateReturnsErrorNoAutomateNodePresent(t *testing.T) {
+	ss := getBatchCheckServiceInstance()
+
+	ss.httpRequestClient = SetupMockHttpRequestClient("", errors.New("error occurred"), true)
+	_, err := ss.getDeploymentState(models.Config{
+		Hardware: models.Hardware{
+			AutomateNodeCount: 0,
+			AutomateNodeIps:   []string{"1.2.3.4", "1,2,3.5"},
+		},
+	})
+	assert.NotNil(t, "automate nodes not present", err.Error())
+}
+
+func TestStopMockServerOnHostAndPortPostDeploy(t *testing.T) {
+	ss := getBatchCheckServiceInstance()
+	ss.httpRequestClient = SetupMockHttpRequestClient(`{
+		"status": "SUCCESS",
+		"result": {
+			"status": "OK",
+			"services": [{"service_name": "deployment-service", "status": "OK", "version": "version-1"}],
+			"error": ""
+		}
+	}`, nil, false)
+	deployState, _ := ss.getDeploymentState(models.Config{
+		Hardware: models.Hardware{
+			AutomateNodeCount:        1,
+			AutomateNodeIps:          []string{"1.2.3.4"},
+			ChefInfraServerNodeCount: 1,
+			ChefInfraServerNodeIps:   []string{"1.2.3.4"},
+			PostgresqlNodeCount:      1,
+			PostgresqlNodeIps:        []string{"1.2.3.7", "1.2.3.8"},
+			OpenSearchNodeCount:      1,
+			OpenSearchNodeIps:        []string{"1.2.3.5", "1.2.3.6"},
+		},
+	})
+	assert.Equal(t, "post-deploy", deployState)
+}
+
+func TestStopMockServerOnHostAndPortPostDeployWhenServicesStopped(t *testing.T) {
+	ss := getBatchCheckServiceInstance()
+	ss.httpRequestClient = SetupMockHttpRequestClient(`{
+		"status": "SUCCESS",
+		"result": {
+			"status": "OK",
+			"services": [],
+			"error": ""
+		}
+	}`, nil, false)
+	deployState, _ := ss.getDeploymentState(models.Config{
+		Hardware: models.Hardware{
+			AutomateNodeCount:        1,
+			AutomateNodeIps:          []string{"1.2.3.4"},
+			ChefInfraServerNodeCount: 1,
+			ChefInfraServerNodeIps:   []string{"1.2.3.4"},
+			PostgresqlNodeCount:      1,
+			PostgresqlNodeIps:        []string{"1.2.3.7", "1.2.3.8"},
+			OpenSearchNodeCount:      1,
+			OpenSearchNodeIps:        []string{"1.2.3.5", "1.2.3.6"},
+		},
+	})
+	assert.Equal(t, "post-deploy", deployState)
+}
+
+func TestShouldStartMockServer(t *testing.T) {
+	ss := getBatchCheckServiceInstance()
+
+	ss.httpRequestClient = SetupMockHttpRequestClient(`{
+		"status": "SUCCESS",
+		"result": {
+			"status": "OK",
+			"services": [{"service_name": "deployment-service", "status": "OK", "version": "version-1"}],
+			"error": ""
+		}
+	}`, nil, false)
+	shouldStartMockServer, _ := ss.shouldStartMockServer([]string{"abc"}, models.Config{
+		Hardware: models.Hardware{
+			AutomateNodeCount:        1,
+			AutomateNodeIps:          []string{"1.2.3.4"},
+			ChefInfraServerNodeCount: 1,
+			ChefInfraServerNodeIps:   []string{"1.2.3.4"},
+			PostgresqlNodeCount:      1,
+			PostgresqlNodeIps:        []string{"1.2.3.7", "1.2.3.8"},
+			OpenSearchNodeCount:      1,
+			OpenSearchNodeIps:        []string{"1.2.3.5", "1.2.3.6"},
+		},
+	})
+	assert.Equal(t, false, shouldStartMockServer)
+}
+
+func TestShouldGenerateRootCaAndPrivateKeyForHostLogErrorForCert(t *testing.T) {
+	tests := []struct {
+		description string
+		fileName    string
+	}{
+		{
+			description: "Test error for reading certificate pem file",
+			fileName:    "certificate.pem",
+		},
+		{
+			description: "Test error for reading private_key pem file",
+			fileName:    "private_key.pem",
+		},
+	}
+
+	ss := getBatchCheckServiceInstance()
+	for _, test := range tests {
+		t.Run(test.description, func(t *testing.T) {
+			ss.fileUtils = mockFileUtils(test.fileName, true)
+
+			ss.generateRootCaAndPrivateKeyForHost("abc", &models.StartMockServerRequestBody{}, models.Config{
+				Hardware: models.Hardware{
+					AutomateNodeCount:        1,
+					AutomateNodeIps:          []string{"1.2.3.4"},
+					ChefInfraServerNodeCount: 1,
+					ChefInfraServerNodeIps:   []string{"1.2.3.4"},
+					PostgresqlNodeCount:      1,
+					PostgresqlNodeIps:        []string{"1.2.3.7", "1.2.3.8"},
+					OpenSearchNodeCount:      1,
+					OpenSearchNodeIps:        []string{"1.2.3.5", "1.2.3.6"},
+				},
+			})
+			fileutils.DeleteFile("certificate.pem")
+			fileutils.DeleteFile("private_key.pem")
+			assert.NotNil(t, ss.log)
+		})
+	}
+}
+
+func TestStartMockServerIfNeeded(t *testing.T) {
+	ss := getBatchCheckServiceInstance()
+
+	ss.httpRequestClient = SetupMockHttpRequestClient(`{}`, errors.New("error occurred"), false)
+	resp, _, err := ss.startMockServerIfNeeded([]string{"firewall"}, models.Config{
+		Hardware: models.Hardware{
+			AutomateNodeCount:        1,
+			AutomateNodeIps:          []string{"1.2.3.4"},
+			ChefInfraServerNodeCount: 1,
+			ChefInfraServerNodeIps:   []string{"1.2.3.4"},
+			PostgresqlNodeCount:      1,
+			PostgresqlNodeIps:        []string{"1.2.3.7", "1.2.3.8"},
+			OpenSearchNodeCount:      1,
+			OpenSearchNodeIps:        []string{"1.2.3.5", "1.2.3.6"},
+		},
+	})
+	assert.Equal(t, "received no response for status api from any automate nodes", err.Error())
+	assert.Equal(t, 0, len(resp))
+}
+
 func getResponseForIp(resp []models.BatchCheckResult, ip string, nodeType string) string {
 	for _, res := range resp {
 		if res.Ip == ip && res.NodeType == nodeType {
@@ -600,6 +991,40 @@ func getResponseForIp(resp []models.BatchCheckResult, ip string, nodeType string
 	return ""
 }
 
+func getBatchCheckServiceInstance() *BatchCheckService {
+	return NewBatchCheckService(trigger.NewCheckTrigger(SetupMockHardwareResourceCountCheck([]models.CheckTriggerResponse{}),
+		SetupMockSshUserAccessCheck([]models.CheckTriggerResponse{}),
+		SetupMockCertificateCheck(),
+		SetupMockExternalOpenSearchCheck([]models.CheckTriggerResponse{}),
+		SetupMockExternalPostgresCheck([]models.CheckTriggerResponse{}),
+		SetupMockFirewallCheck(),
+		SetupMockFqdnCheck(),
+		SetupMockNfsBackupConfigCheck(),
+		SetupMockOpenSearchS3BucketAccessCheck(),
+		SetupMockS3BackupConfigCheck(),
+		SetupMockSoftwareVersionCheck(),
+		SetupMockSystemResourceCheck(),
+		SetupMockSystemUserCheck(),
+	), logger.NewTestLogger(), "1234")
+}
+
+func mockFileUtils(fileName string, shouldReturnError bool) *fileutils.MockFileSystemUtils {
+	return &fileutils.MockFileSystemUtils{
+		ReadFileFunc: func(filename string) ([]byte, error) {
+			if filename == fileName && shouldReturnError {
+				return []byte{}, errors.New("Error occurred")
+			}
+			if filename == fileName && shouldReturnError {
+				return []byte{}, errors.New("Error occurred")
+			}
+			return []byte{}, nil
+		},
+		DeleteTempFileFunc: func(filename string) error {
+			return nil
+		},
+	}
+}
+
 func TestConstructResult(t *testing.T) {
 	// Test case 1: Empty input map
 	ipMap := make(map[string][]models.CheckTriggerResponse)
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/certificatechecktrigger/certificatechecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/certificatechecktrigger/certificatechecktrigger_test.go
index 81201be84..c4aeae94b 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/certificatechecktrigger/certificatechecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/certificatechecktrigger/certificatechecktrigger_test.go
@@ -484,3 +484,10 @@ func TestCertificateCheck_Run(t *testing.T) {
 	})
 
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewCertificateCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalopensearchchecktrigger/externalopensearchchecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalopensearchchecktrigger/externalopensearchchecktrigger_test.go
index b33ba4ed1..4dd017791 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalopensearchchecktrigger/externalopensearchchecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalopensearchchecktrigger/externalopensearchchecktrigger_test.go
@@ -496,3 +496,10 @@ func createDummyServer(t *testing.T, requiredStatusCode int, isPassed bool) (*ht
 
 	return server, ip, port
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewExternalOpensearchCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalpostgresqlchecktrigger/externalpostgresqlchecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalpostgresqlchecktrigger/externalpostgresqlchecktrigger_test.go
index d23b82cb6..18792485b 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalpostgresqlchecktrigger/externalpostgresqlchecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalpostgresqlchecktrigger/externalpostgresqlchecktrigger_test.go
@@ -507,3 +507,10 @@ func createDummyServer(t *testing.T, requiredStatusCode int, isPassed bool) (*ht
 
 	return server, ip, port
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewExternalPostgresCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/firewallchecktrigger/firewallchecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/firewallchecktrigger/firewallchecktrigger_test.go
index 3aca7544f..4a755cfc6 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/firewallchecktrigger/firewallchecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/firewallchecktrigger/firewallchecktrigger_test.go
@@ -3,7 +3,7 @@ package firewallchecktrigger
 import (
 	"encoding/json"
 
-	"io/ioutil"
+	"io"
 	"net/http"
 	"net/http/httptest"
 	"strings"
@@ -436,7 +436,7 @@ func createDummyServer(t *testing.T, requiredStatusCode int, invalidParseRespons
 	if requiredStatusCode == http.StatusOK {
 		server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 			if r.URL.Path == constants.FIREWALL_API_PATH {
-				body, err := ioutil.ReadAll(r.Body)
+				body, err := io.ReadAll(r.Body)
 				require.NoError(t, err)
 
 				var req models.FirewallRequest
@@ -628,3 +628,18 @@ func TestFirewallCheck_Run(t *testing.T) {
 
 	}
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewFirewallCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 4, len(resp))
+	assert.Equal(t, 2, len(resp["automate"]["tcp"]))
+	assert.Equal(t, 1, len(resp["automate"]["https"]))
+	assert.Equal(t, 2, len(resp["chef-infra-server"]["tcp"]))
+	assert.Equal(t, 1, len(resp["chef-infra-server"]["https"]))
+	assert.Equal(t, 5, len(resp["postgresql"]["tcp"]))
+	assert.Equal(t, 1, len(resp["postgresql"]["udp"]))
+	assert.Equal(t, 4, len(resp["opensearch"]["tcp"]))
+	assert.Equal(t, true, true)
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/fqdnchecktrigger/fqdncheck_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/fqdnchecktrigger/fqdncheck_test.go
index 86d2d459a..74b6a4036 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/fqdnchecktrigger/fqdncheck_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/fqdnchecktrigger/fqdncheck_test.go
@@ -525,3 +525,13 @@ func getRequest() models.FqdnRequest {
 		RootCert: certificate.RootCert,
 	}
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewFqdnCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 2, len(resp))
+	assert.Equal(t, 1, len(resp["automate"]["https"]))
+	assert.Equal(t, 1, len(resp["chef-infra-server"]["https"]))
+	assert.Equal(t, true, true)
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/hardwareresourcechecktrigger/hardwareresourcecountchecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/hardwareresourcechecktrigger/hardwareresourcecountchecktrigger_test.go
index a863343a4..4783b18f1 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/hardwareresourcechecktrigger/hardwareresourcecountchecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/hardwareresourcechecktrigger/hardwareresourcecountchecktrigger_test.go
@@ -316,3 +316,10 @@ func TestHardwareResourceCountCheck_TriggerHardwareResourceCountCheck(t *testing
 		require.Nil(t, resp)
 	})
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewHardwareResourceCountCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/nfsmountbackupchecktrigger/nfsmountbackupcheck_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/nfsmountbackupchecktrigger/nfsmountbackupcheck_test.go
index 9a34d13ce..155138da6 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/nfsmountbackupchecktrigger/nfsmountbackupcheck_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/nfsmountbackupchecktrigger/nfsmountbackupcheck_test.go
@@ -827,3 +827,10 @@ func getRequest() models.NFSMountRequest {
 		MountLocation:          mountLocation,
 	}
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewNfsBackupConfigCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/opensearchs3bucketaccesschecktrigger/opensearchs3bucketaccesscheck_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/opensearchs3bucketaccesschecktrigger/opensearchs3bucketaccesscheck_test.go
index f55ec0360..0d00848fc 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/opensearchs3bucketaccesschecktrigger/opensearchs3bucketaccesscheck_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/opensearchs3bucketaccesschecktrigger/opensearchs3bucketaccesscheck_test.go
@@ -296,3 +296,10 @@ func Test_setHostAsOpensearchInResponse(t *testing.T) {
 		})
 	}
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewOpensearchS3BucketAccessCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/s3backupchecktrigger/s3backupconfigchecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/s3backupchecktrigger/s3backupconfigchecktrigger_test.go
index 94065dc32..b9106ee23 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/s3backupchecktrigger/s3backupconfigchecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/s3backupchecktrigger/s3backupconfigchecktrigger_test.go
@@ -369,3 +369,10 @@ func createDummyServer(t *testing.T, requiredStatusCode int, isPassed bool) (*ht
 
 	return server, ip, port
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewS3BackupConfigCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/softwareversionchecktrigger/softwareversionchecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/softwareversionchecktrigger/softwareversionchecktrigger_test.go
index 27133b24c..1ce5ab8c6 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/softwareversionchecktrigger/softwareversionchecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/softwareversionchecktrigger/softwareversionchecktrigger_test.go
@@ -131,3 +131,10 @@ func createDummyServer(t *testing.T, requiredStatusCode int) (*httptest.Server,
 
 	return server, ip, port
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewSoftwareVersionCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/sshuseraccesschecktrigger/sshuseraccesschecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/sshuseraccesschecktrigger/sshuseraccesschecktrigger_test.go
index 18e010a80..cf7e1480b 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/sshuseraccesschecktrigger/sshuseraccesschecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/sshuseraccesschecktrigger/sshuseraccesschecktrigger_test.go
@@ -300,3 +300,10 @@ func GetSshRequest() models.SShUserRequest {
 	}
 	return request
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewSshUserAccessCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemresourcechecktrigger/systemresourceschecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemresourcechecktrigger/systemresourceschecktrigger_test.go
index 0de149ebf..4126e36d1 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemresourcechecktrigger/systemresourceschecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemresourcechecktrigger/systemresourceschecktrigger_test.go
@@ -130,3 +130,10 @@ func createDummyServer(t *testing.T, requiredStatusCode int) (*httptest.Server,
 
 	return server, ip, port
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewSystemResourceCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemuserchecktrigger/systemuserchecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemuserchecktrigger/systemuserchecktrigger_test.go
index c045bed4d..4200f501c 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemuserchecktrigger/systemuserchecktrigger_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/systemuserchecktrigger/systemuserchecktrigger_test.go
@@ -128,3 +128,10 @@ func createDummyServer(t *testing.T, requiredStatusCode int) (*httptest.Server,
 
 	return server, ip, port
 }
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewSystemUserCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/opensearchbackupservice/opensearchs3backupmanaged_test.go b/components/automate-cli/pkg/verifyserver/services/opensearchbackupservice/opensearchs3backupmanaged_test.go
index 4e2879f39..80fbbb38e 100644
--- a/components/automate-cli/pkg/verifyserver/services/opensearchbackupservice/opensearchs3backupmanaged_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/opensearchbackupservice/opensearchs3backupmanaged_test.go
@@ -3,7 +3,6 @@ package opensearchbackupservice
 import (
 	"encoding/json"
 	"errors"
-	"fmt"
 	"net/http"
 	"net/http/httptest"
 	"testing"
@@ -214,8 +213,7 @@ func TestCreateIndex(t *testing.T) {
 
 	resp, err := os.CreateTestIndex(client, &fiber.Ctx{}, "abc")
 	assert.NoError(t, err)
-
-	fmt.Println(resp)
+	assert.Equal(t, resp, false)
 }
 
 func TestCreateSnapShotRepo(t *testing.T) {
@@ -245,8 +243,7 @@ func TestCreateSnapShotRepo(t *testing.T) {
 
 	resp, err := os.CreateSnapshotRepo(client, &fiber.Ctx{}, s3Request, "abc")
 	assert.NoError(t, err)
-
-	fmt.Println(resp)
+	assert.Equal(t, resp, false)
 }
 
 func TestDeleteSnapShot(t *testing.T) {
@@ -269,8 +266,7 @@ func TestDeleteSnapShot(t *testing.T) {
 
 	resp, err := os.DeleteTestSnapshot(client, &fiber.Ctx{}, "repo", "snapshot")
 	assert.NoError(t, err)
-
-	fmt.Println(resp)
+	assert.Equal(t, resp, false)
 }
 
 func TestDeleteSnapShotRepo(t *testing.T) {
@@ -293,8 +289,7 @@ func TestDeleteSnapShotRepo(t *testing.T) {
 
 	resp, err := os.DeleteTestSnapshotRepo(client, &fiber.Ctx{}, "repo")
 	assert.NoError(t, err)
-
-	fmt.Println(resp)
+	assert.Equal(t, resp, false)
 }
 
 func TestDeleteIndex(t *testing.T) {
@@ -317,8 +312,7 @@ func TestDeleteIndex(t *testing.T) {
 
 	resp, err := os.DeleteTestIndex(client, &fiber.Ctx{}, "index")
 	assert.NoError(t, err)
-
-	fmt.Println(resp)
+	assert.Equal(t, resp, false)
 }
 
 func TestCreateSnapShot(t *testing.T) {
@@ -344,8 +338,7 @@ func TestCreateSnapShot(t *testing.T) {
 
 	resp, err := os.CreateSnapshot(client, &fiber.Ctx{}, "repo", "snapshot", "index")
 	assert.NoError(t, err)
-
-	fmt.Println(resp)
+	assert.Equal(t, resp, true)
 }
 
 func TestGetSnapshotStatus(t *testing.T) {
@@ -378,6 +371,5 @@ func TestGetSnapshotStatus(t *testing.T) {
 
 	resp, err := os.GetSnapshotStatus(client, &fiber.Ctx{}, "repo", "snapshot")
 	assert.NoError(t, err)
-
-	fmt.Println(resp)
+	assert.Equal(t, resp, "SUCCESS")
 }
diff --git a/components/automate-cli/pkg/verifyserver/services/sshusercheckservice/sshusercheckservice_test.go b/components/automate-cli/pkg/verifyserver/services/sshusercheckservice/sshusercheckservice_test.go
index 61aa83171..0162ab9db 100644
--- a/components/automate-cli/pkg/verifyserver/services/sshusercheckservice/sshusercheckservice_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/sshusercheckservice/sshusercheckservice_test.go
@@ -191,7 +191,7 @@ func TestCheckSshConnection(t *testing.T) {
 				sudoPassword: sudoPassword,
 				MockSSHUtil: &sshutils.MockSSHUtilsImpl{
 					Executefunc: func(sshConfig sshutils.SSHConfig, cmd string) (string, error) {
-						return "Connection creation falied", errors.New("ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain")
+						return "Connection creation failed", errors.New("ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain")
 					},
 				},
 			},
diff --git a/components/automate-cli/pkg/verifyserver/utils/httputils/httputil_test.go b/components/automate-cli/pkg/verifyserver/utils/httputils/httputil_test.go
index 9a3a44357..be809e57b 100644
--- a/components/automate-cli/pkg/verifyserver/utils/httputils/httputil_test.go
+++ b/components/automate-cli/pkg/verifyserver/utils/httputils/httputil_test.go
@@ -1,49 +1,75 @@
 package httputils
 
 import (
-	"io/ioutil"
+	"io"
 	"net/http"
 	"net/http/httptest"
 	"testing"
 )
 
 func TestMakeRequest(t *testing.T) {
-	// Create a test server to receive requests
-	server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
-		// Check that the request body is correct
-		expectedBody := "{\"org\":\"chef\"}"
-		requestBody, err := ioutil.ReadAll(req.Body)
-		if err != nil {
-			t.Errorf("Unexpected error reading request body: %v", err)
-		}
-		if string(requestBody) != expectedBody {
-			t.Errorf("Unexpected request body. Expected %v, got %v", expectedBody, string(requestBody))
-		}
-		// Write a response to the client
-		rw.WriteHeader(http.StatusOK)
-		rw.Write([]byte("{\"status\":\"OK\"}"))
-	}))
-	defer server.Close()
-
-	// Call the Post function with a test URL and body
-	url := server.URL
-	body := map[string]string{"org": "chef"}
-	resp, err := MakeRequest(http.MethodPost, url, body)
-	if err != nil {
-		t.Errorf("Unexpected error from Post function: %v", err)
+	tests := []struct {
+		description         string
+		isInterfaceFunction bool
+	}{
+		{
+			description:         "Test make request function",
+			isInterfaceFunction: false,
+		},
+		{
+			description:         "Test make request interface function ",
+			isInterfaceFunction: true,
+		},
 	}
+	for _, test := range tests {
+		t.Run(test.description, func(t *testing.T) {
+			// Create a test server to receive requests
+			server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
+				// Check that the request body is correct
+				expectedBody := "{\"org\":\"chef\"}"
+				requestBody, err := io.ReadAll(req.Body)
+				if err != nil {
+					t.Errorf("Unexpected error reading request body: %v", err)
+				}
+				if string(requestBody) != expectedBody {
+					t.Errorf("Unexpected request body. Expected %v, got %v", expectedBody, string(requestBody))
+				}
+				// Write a response to the client
+				rw.WriteHeader(http.StatusOK)
+				rw.Write([]byte("{\"status\":\"OK\"}"))
+			}))
+			defer server.Close()
+
+			// Call the Post function with a test URL and body
+			url := server.URL
+			body := map[string]string{"org": "chef"}
+
+			var resp *http.Response
+			var err error
+			if test.isInterfaceFunction {
+				httpUtils := NewHttpRequestClient()
+				resp, err = httpUtils.MakeRequest(http.MethodPost, url, body)
+			} else {
+				resp, err = MakeRequest(http.MethodPost, url, body)
+			}
+			if err != nil {
+				t.Errorf("Unexpected error from Post function: %v", err)
+			}
+
+			// Check that the response status code is correct
+			if resp.StatusCode != http.StatusOK {
+				t.Errorf("Unexpected response status code. Expected %v, got %v", http.StatusOK, resp.StatusCode)
+			}
+			// Check that the response body is correct
+			expectedResponse := "{\"status\":\"OK\"}"
+			responseBody, err := io.ReadAll(resp.Body)
+			if err != nil {
+				t.Errorf("Unexpected error reading response body: %v", err)
+			}
+			if string(responseBody) != expectedResponse {
+				t.Errorf("Unexpected response body. Expected %v, got %v", expectedResponse, string(responseBody))
+			}
+		})
 
-	// Check that the response status code is correct
-	if resp.StatusCode != http.StatusOK {
-		t.Errorf("Unexpected response status code. Expected %v, got %v", http.StatusOK, resp.StatusCode)
-	}
-	// Check that the response body is correct
-	expectedResponse := "{\"status\":\"OK\"}"
-	responseBody, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		t.Errorf("Unexpected error reading response body: %v", err)
-	}
-	if string(responseBody) != expectedResponse {
-		t.Errorf("Unexpected response body. Expected %v, got %v", expectedResponse, string(responseBody))
 	}
 }
diff --git a/lib/arrayutils/slice_test.go b/lib/arrayutils/slice_test.go
new file mode 100644
index 000000000..ed984e0ef
--- /dev/null
+++ b/lib/arrayutils/slice_test.go
@@ -0,0 +1,16 @@
+package arrayutils_test
+
+import (
+	"testing"
+
+	"github.com/bmizerany/assert"
+	"github.com/chef/automate/lib/arrayutils"
+)
+
+func TestGetPortsForMockServer(t *testing.T) {
+	firstList := []int{1, 2, 3}
+	secondList := []int{2, 3, 4}
+
+	diff := arrayutils.SliceDifference(firstList, secondList)
+	assert.Equal(t, 1, diff[0])
+}
diff --git a/lib/certgenerateutils/certgenerate_test.go b/lib/certgenerateutils/certgenerate_test.go
new file mode 100644
index 000000000..5927a9ea5
--- /dev/null
+++ b/lib/certgenerateutils/certgenerate_test.go
@@ -0,0 +1,16 @@
+package certgenerateutils
+
+import (
+	"testing"
+
+	"github.com/bmizerany/assert"
+	"github.com/chef/automate/lib/io/fileutils"
+	//"github.com/chef/automate/lib/io/fileutils"
+)
+
+func TestMakeRequest(t *testing.T) {
+	privateKeyFilePath, publicKeyFilePath, err := GenerateCert("54.169.203.144")
+	fileutils.DeleteFile(privateKeyFilePath)
+	fileutils.DeleteFile(publicKeyFilePath)
+	assert.Equal(t, nil, err)
+}
diff --git a/lib/io/fileutils/fileutils_test.go b/lib/io/fileutils/fileutils_test.go
index a6698c846..e350b3920 100644
--- a/lib/io/fileutils/fileutils_test.go
+++ b/lib/io/fileutils/fileutils_test.go
@@ -77,7 +77,7 @@ func TestDeleteTempFile(t *testing.T) {
 	}
 	defer tempFile.Close()
 
-	err = fileutils.DeleteTempFile(tempFile.Name())
+	err = fileutils.DeleteFile(tempFile.Name())
 	if err != nil {
 		return
 	}