Repository: chef/automate
Pull request #8244 (2023-10-03 05:32:38)

FQDN check should pass/fail after retrying mutliple times to reach the node
### :nut_and_bolt: Description: What code changed, and why?
As an Automate HA user, when I try to run the verify command with my configuration, the FQDN error is generic. It should be detailed on the error

### :chains: Related Resources
Jira: https://chefio.atlassian.net/browse/CHEF-6048

### :+1: Definition of Done

### :athletic_shoe: How to Build and Test the Change

### :white_check_mark: Checklist

**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
Demo Video: https://progresssoftware.sharepoint.com/:v:/s/ChefCoreC/EZdDU_9hw0BEgZEA0p401RgBBCeJCmQRTfDEqMhkzL-fJw?e=qV3RKz



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


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 8cbea1490426882aba4e82dac4a8eafbb51550c1 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/chef-automate/deploys/651ba7782c65220007b67b36 |
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=8244)

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

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

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

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

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

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

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

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

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

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



Patch:
diff --git a/VERSION b/VERSION
index 4dec61a8b..acd434e96 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-4.10.32
\ No newline at end of file
+4.10.42
\ No newline at end of file
diff --git a/components/automate-backend-deployment/habitat/plan.sh b/components/automate-backend-deployment/habitat/plan.sh
index f47f2ee54..f55152d67 100644
--- a/components/automate-backend-deployment/habitat/plan.sh
+++ b/components/automate-backend-deployment/habitat/plan.sh
@@ -27,6 +27,7 @@ pkg_deps=(
 )
 
 
+
 pkg_build_deps=(
   core/gcc
 )
diff --git a/components/automate-backend-elasticsearch/habitat/plan.sh b/components/automate-backend-elasticsearch/habitat/plan.sh
index 99ccfb402..5d92e8232 100644
--- a/components/automate-backend-elasticsearch/habitat/plan.sh
+++ b/components/automate-backend-elasticsearch/habitat/plan.sh
@@ -28,6 +28,7 @@ pkg_exports=(
   [dashboard_username]=opendistro_auth.dashboard_username
   [dashboard_password]=opendistro_auth.dashboard_password
 )
+
 pkg_exposes=(http-port transport-port)
 
 do_before() {
diff --git a/components/automate-cli/cmd/chef-automate/config.go b/components/automate-cli/cmd/chef-automate/config.go
index 74bf552f9..1784d0cf0 100644
--- a/components/automate-cli/cmd/chef-automate/config.go
+++ b/components/automate-cli/cmd/chef-automate/config.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+	"bytes"
 	"reflect"
 	"regexp"
 	"strings"
@@ -11,6 +12,8 @@ import (
 	"path/filepath"
 
 	"github.com/fatih/color"
+	ptoml "github.com/pelletier/go-toml"
+
 	"github.com/pkg/errors"
 	"github.com/spf13/cobra"
 
@@ -462,6 +465,23 @@ func runPatchCommand(cmd *cobra.Command, args []string) error {
 		if configCmdFlags.waitTimeout < DEFAULT_TIMEOUT {
 			return errors.Errorf("The operation timeout duration for each individual node during the config patch process should be set to a value greater than %v seconds.", DEFAULT_TIMEOUT)
 		}
+		isLoggerConfig, err := checkIfRequestedConfigHasCentrailisedLogging(args)
+		if err != nil {
+			return err
+		}
+		if (configCmdFlags.opensearch || configCmdFlags.postgresql) && isLoggerConfig {
+			modifiedConfig, err := patchAndRemoveCentralisedLoggingForBackend(args, infra)
+			if err != nil {
+				return err
+			}
+			checkIfConfigHasOnlyLogConfig, err := checkUserConfigHasOnlyCentrailisedLogConfig(modifiedConfig)
+			if err != nil {
+				return err
+			}
+			if checkIfConfigHasOnlyLogConfig {
+				return nil
+			}
+		}
 
 		configFile := args[0]
 		configFileName := stringutils.GetFileName(configFile)
@@ -561,6 +581,9 @@ func runPatchCommand(cmd *cobra.Command, args []string) error {
 		} else {
 			writer.Println(cmd.UsageString())
 		}
+		if (configCmdFlags.opensearch || configCmdFlags.postgresql) && isLoggerConfig {
+			os.Remove(configFile)
+		}
 
 	} else {
 		cfg, err := dc.LoadUserOverrideConfigFile(args[0])
@@ -592,6 +615,55 @@ func runPatchCommand(cmd *cobra.Command, args []string) error {
 	return nil
 }
 
+func patchAndRemoveCentralisedLoggingForBackend(args []string, infra *AutomateHAInfraDetails) (string, error) {
+	var inputfile string
+	sshconfig := &SSHConfig{}
+	sshconfig.sshUser = infra.Outputs.SSHUser.Value
+	sshconfig.sshKeyFile = infra.Outputs.SSHKeyFile.Value
+	sshconfig.sshPort = infra.Outputs.SSHPort.Value
+	sshUtil := NewSSHUtil(sshconfig)
+
+	err := patchCentralisedLoggingForBackend(args, sshUtil, infra)
+	if err != nil {
+		return "", err
+	}
+	writer.Success("Centralised logging configuration is patched. \n")
+	if configCmdFlags.postgresql {
+		inputfile, err = removeCentralisedLogsFromUserConfigForPg(args[0])
+		if err != nil {
+			return "", err
+		}
+	}
+	if configCmdFlags.opensearch {
+		inputfile, err = removeCentralisedLogsFromUserConfigForOs(args[0])
+		if err != nil {
+			return "", err
+		}
+	}
+	args[0] = inputfile
+	return inputfile, nil
+}
+
+func checkUserConfigHasOnlyCentrailisedLogConfig(inputfile string) (bool, error) {
+	file, err := os.Open(inputfile)
+	if err != nil {
+		return false, err
+	}
+	defer file.Close()
+	buf := new(bytes.Buffer)
+	_, err = buf.ReadFrom(file)
+	if err != nil {
+		return false, err
+	}
+
+	content := buf.String()
+	if content == "" {
+		os.Remove(inputfile)
+		return true, nil
+	}
+	return false, nil
+}
+
 // prePatchCheckForFrontendNodes patches the configuration for front end nodes in Automate HA
 func prePatchCheckForFrontendNodes(inputs *CmdInputs, sshUtil SSHUtil, infra *AutomateHAInfraDetails, remoteService string, writer *cli.Writer) error {
 	srcPath, err := parseAndRemoveRestrictedKeysFromSrcFile(inputs.Args[0])
@@ -604,6 +676,25 @@ func prePatchCheckForFrontendNodes(inputs *CmdInputs, sshUtil SSHUtil, infra *Au
 	return nil
 }
 
+func patchCentralisedLoggingForBackend(args []string, sshUtil SSHUtil, infra *AutomateHAInfraDetails) error {
+	var remoteService string
+	var remoteIps []string
+	if configCmdFlags.postgresql {
+		remoteService = "postgresql"
+		remoteIps = infra.Outputs.PostgresqlPrivateIps.Value
+	}
+	if configCmdFlags.opensearch {
+		remoteService = "opensearch"
+		remoteIps = infra.Outputs.OpensearchPrivateIps.Value
+	}
+	// checking for log configuration
+	err := enableCentralizedLogConfigForHA(args, remoteService, sshUtil, remoteIps)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 // prePatchCheckForPostgresqlNodes patches the config for postgresql nodes in Automate HA
 func prePatchCheckForPostgresqlNodes(inputs *CmdInputs, sshUtil SSHUtil, infra *AutomateHAInfraDetails, remoteService string, writer *cli.Writer) error {
 	if isManagedServicesOn() {
@@ -617,14 +708,8 @@ func prePatchCheckForPostgresqlNodes(inputs *CmdInputs, sshUtil SSHUtil, infra *
 
 	args := inputs.Args
 
-	//checking for log configuration
-	err := enableCentralizedLogConfigForHA(args, remoteService, sshUtil, infra.Outputs.PostgresqlPrivateIps.Value)
-	if err != nil {
-		return err
-	}
-
 	//checking database configuration
-	existConfig, reqConfig, err := getExistingAndRequestedConfigForPostgres(args, infra, GET_APPLIED_CONFIG, sshUtil)
+	existConfig, reqConfig, err := getExistingAndRequestedConfigForPostgres(args, infra, GET_APPLIED_CONFIG, sshUtil, inputs)
 	if err != nil {
 		return err
 	}
@@ -664,12 +749,6 @@ func prePatchCheckForOpensearch(inputs *CmdInputs, sshUtil SSHUtil, infra *Autom
 
 	args := inputs.Args
 
-	//checking for log configuration
-	err := enableCentralizedLogConfigForHA(args, remoteService, sshUtil, infra.Outputs.OpensearchPrivateIps.Value)
-	if err != nil {
-		return err
-	}
-
 	//checking database configuration
 	existConfig, reqConfig, err := getExistingAndRequestedConfigForOpenSearch(args, infra, GET_APPLIED_CONFIG, sshUtil)
 	if err != nil {
@@ -905,7 +984,7 @@ func setConfigForPostgresqlNodes(args []string, remoteService string, sshUtil SS
 	}
 
 	//Getting Requested Config
-	reqConfigInterface, err := getConfigForArgsPostgresqlOrOpenSearch(args, postgresql)
+	reqConfigInterface, err := getConfigInterfaceForPostgresqlOrOpenSearch(args, postgresql)
 	if err != nil {
 		return err
 	}
@@ -939,7 +1018,7 @@ func setConfigForOpensearch(args []string, remoteService string, sshUtil SSHUtil
 	}
 
 	//Getting Requested Config
-	reqConfigInterface, err := getConfigForArgsPostgresqlOrOpenSearch(args, opensearch_const)
+	reqConfigInterface, err := getConfigInterfaceForPostgresqlOrOpenSearch(args, opensearch_const)
 	if err != nil {
 		return err
 	}
@@ -1130,8 +1209,8 @@ func getDecodedConfig(input string, remoteService string) (interface{}, error) {
 	return nil, nil
 }
 
-// getConfigForArgsPostgresqlAndOpenSearch gets the requested config from the args provided for postgresql or opensearch
-func getConfigForArgsPostgresqlOrOpenSearch(args []string, remoteService string) (interface{}, error) {
+// getConfigInterfaceForPostgresqlOrOpenSearch gets the requested config from the args provided for postgresql or opensearch
+func getConfigInterfaceForPostgresqlOrOpenSearch(args []string, remoteService string) (interface{}, error) {
 	pemBytes, err := os.ReadFile(args[0])
 	if err != nil {
 		return nil, err
@@ -1157,33 +1236,54 @@ func isConfigChanged(src interface{}, dest interface{}) bool {
 	return !reflect.DeepEqual(src, dest)
 }
 
-// getExistingAndRequestedConfigForPostgres get requested and existing config for postgresql
-func getExistingAndRequestedConfigForPostgres(args []string, infra *AutomateHAInfraDetails, config string, sshUtil SSHUtil) (PostgresqlConfig, PostgresqlConfig, error) {
+// getExistingAndRequestedConfigForPostgres get user updating config and existing *applied* config for postgresql
+func getExistingAndRequestedConfigForPostgres(args []string, infra *AutomateHAInfraDetails, config string, sshUtil SSHUtil, inputs *CmdInputs) (PostgresqlConfig, PostgresqlConfig, error) {
+
 	//Getting Existing config from server
-	var existingConfig PostgresqlConfig
+	var existingAppliedConfig PostgresqlConfig
 	var reqConfig PostgresqlConfig
 	var emptyConfig PostgresqlConfig
+
+	// getting applied remote config from pg node
 	srcInputString, err := getConfigFromRemoteServer(infra, postgresql, config, sshUtil)
 	if err != nil {
-		return existingConfig, reqConfig, errors.Wrapf(err, "Unable to get config from the server with error")
+		return existingAppliedConfig, reqConfig, errors.Wrapf(err, "Unable to get config from the server with error")
 	}
-	existingConfigInterface, err := getDecodedConfig(srcInputString, postgresql)
+	existingAppliedConfigInterface, err := getDecodedConfig(srcInputString, postgresql)
 	if err != nil {
-		return existingConfig, reqConfig, err
+		return existingAppliedConfig, reqConfig, err
 	}
-	existingConfig = existingConfigInterface.(PostgresqlConfig)
+	existingAppliedConfig = existingAppliedConfigInterface.(PostgresqlConfig)
 
 	//Getting Requested Config
-	reqConfigInterface, err := getConfigForArgsPostgresqlOrOpenSearch(args, postgresql)
+	reqConfigInterface, err := getConfigInterfaceForPostgresqlOrOpenSearch(args, postgresql)
 	if err != nil {
-		return existingConfig, reqConfig, err
+		return existingAppliedConfig, reqConfig, err
 	}
 	reqConfig = reqConfigInterface.(PostgresqlConfig)
 	if !isConfigChanged(emptyConfig, reqConfig) {
-		return existingConfig, reqConfig, status.Annotate(errors.New("Incorrect Config"), status.ConfigError)
+		return existingAppliedConfig, reqConfig, status.Annotate(errors.New("Incorrect Config"), status.ConfigError)
 	}
-	mergo.Merge(&reqConfig, existingConfig)
-	return existingConfig, reqConfig, nil
+	mergo.Merge(&reqConfig, existingAppliedConfig)
+	return existingAppliedConfig, reqConfig, nil
+}
+
+func checkIfRequestedConfigHasCentrailisedLogging(args []string) (bool, error) {
+	config, err := ptoml.LoadFile(args[0])
+	if err != nil {
+		writer.Println(err.Error())
+		return false, err
+	}
+	if config.Get("global.v1.log") != nil {
+		isconfig := config.Get("global.v1.log").(*ptoml.Tree)
+		if isconfig != nil {
+			val := isconfig.Get("redirect_sys_log").(bool)
+			if val == true {
+				return true, nil
+			}
+		}
+	}
+	return false, nil
 }
 
 // getExistingAndRequestedConfigForOpenSearch gets existed and requested config for opensearch
@@ -1203,7 +1303,7 @@ func getExistingAndRequestedConfigForOpenSearch(args []string, infra *AutomateHA
 	existingConfig = existingConfigInterface.(OpensearchConfig)
 
 	//Getting Requested Config
-	reqConfigInterface, err := getConfigForArgsPostgresqlOrOpenSearch(args, opensearch_const)
+	reqConfigInterface, err := getConfigInterfaceForPostgresqlOrOpenSearch(args, opensearch_const)
 	if err != nil {
 		return existingConfig, reqConfig, err
 	}
@@ -1266,6 +1366,40 @@ func parseAndRemoveRestrictedKeysFromSrcFile(srcString string) (string, error) {
 	}
 }
 
+func removeCentralisedLogsFromUserConfigForPg(srcString string) (string, error) {
+	tomlbyt, _ := os.ReadFile(srcString)
+	destString := string(tomlbyt)
+	var dest PostgresqlConfig
+	if _, err := toml.Decode(destString, &dest); err != nil {
+		fmt.Println(err)
+		return "", err
+	}
+	timestamp := time.Now().Format("20060102150405")
+	tomlFile := srcString + timestamp
+	newSrcString, err := createTomlFileFromConfig(dest, tomlFile)
+	if err != nil {
+		return "", err
+	}
+	return newSrcString, nil
+}
+
+func removeCentralisedLogsFromUserConfigForOs(srcString string) (string, error) {
+	tomlbyt, _ := os.ReadFile(srcString)
+	destString := string(tomlbyt)
+	var dest OpensearchConfig
+	if _, err := toml.Decode(destString, &dest); err != nil {
+		fmt.Println(err)
+		return "", err
+	}
+	timestamp := time.Now().Format("20060102150405")
+	tomlFile := srcString + timestamp
+	newSrcString, err := createTomlFileFromConfig(dest, tomlFile)
+	if err != nil {
+		return "", err
+	}
+	return newSrcString, nil
+}
+
 // If the output contains the word "error" then return error
 func checkOutputForError(output string) error {
 	if strings.Contains(strings.ToUpper(strings.TrimSpace(output)), "ERROR") {
diff --git a/components/automate-cli/cmd/chef-automate/constants.go b/components/automate-cli/cmd/chef-automate/constants.go
index 54de2046a..91ced645e 100644
--- a/components/automate-cli/cmd/chef-automate/constants.go
+++ b/components/automate-cli/cmd/chef-automate/constants.go
@@ -22,6 +22,7 @@ const (
 	OSVERSIONREGEX      = `"number"\s*:\s*"([^"]+)"`
 	PGCOREPKG           = "core/postgresql13 "
 	AUTOMATE_NAME       = "Automate"
+	BASTION_NAME        = "Bastion"
 	CHEF_SERVER_NAME    = "Chef Server"
 	OPENSEARCH_NAME     = "Opensearch"
 	POSTGRESQL_NAME     = "Postgresql"
diff --git a/components/automate-cli/cmd/chef-automate/verify.go b/components/automate-cli/cmd/chef-automate/verify.go
index 19b00fcc0..f605adb01 100644
--- a/components/automate-cli/cmd/chef-automate/verify.go
+++ b/components/automate-cli/cmd/chef-automate/verify.go
@@ -18,6 +18,7 @@ import (
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/server"
 	"github.com/chef/automate/components/automate-cli/pkg/verifysystemdcreate"
 	"github.com/chef/automate/components/automate-deployment/pkg/cli"
+	"github.com/chef/automate/lib/arrayutils"
 	"github.com/chef/automate/lib/config"
 	"github.com/chef/automate/lib/httputils"
 	"github.com/chef/automate/lib/logger"
@@ -484,8 +485,11 @@ func (v *verifyCmdFlow) runVerifyServiceForRemote(batchCheckConfig models.Config
 			return nil, err
 		}
 
+		// Remove duplicates
+		hostIpWihtoutDuplicates := arrayutils.RemoveStringDuplicates(hostIPs)
+
 		// Starting automate-verify service on remote nodes
-		err = v.startServiceOnRemoteNodes(destFileName, sshConfig, hostIPs)
+		err = v.startServiceOnRemoteNodes(destFileName, sshConfig, hostIpWihtoutDuplicates)
 		if err != nil {
 			return nil, err
 		}
diff --git a/components/automate-cli/cmd/chef-automate/version.go b/components/automate-cli/cmd/chef-automate/version.go
index e994ab5d5..b4d9bd429 100644
--- a/components/automate-cli/cmd/chef-automate/version.go
+++ b/components/automate-cli/cmd/chef-automate/version.go
@@ -49,6 +49,7 @@ var verbose bool
 var VersionCommandFlags = struct {
 	node         string
 	verbose      bool
+	isBastion    bool
 	isAutomate   bool
 	isChefServer bool
 	isOpenSearch bool
@@ -165,27 +166,47 @@ func printUpgradeStatus() error {
 }
 
 func init() {
-	versionCmd.Flags().BoolVarP(&VersionCommandFlags.verbose, "verbose", "v", false, "Show additional version information")
-
-	versionCmd.PersistentFlags().BoolVar(&VersionCommandFlags.isAutomate, "a2", false, "Get only automate Status")
+	versionCmd.PersistentFlags().BoolVarP(&VersionCommandFlags.isBastion, "bastion", "b", false, "Shows the versions of bastion node(HA)")
+	versionCmd.PersistentFlags().SetAnnotation("bastion", docs.Compatibility, []string{docs.CompatiblewithHA})
+	versionCmd.PersistentFlags().BoolVarP(&VersionCommandFlags.isAutomate, "automate", "a", false, "Shows the versions of Automate node(HA)")
 	versionCmd.PersistentFlags().SetAnnotation("automate", docs.Compatibility, []string{docs.CompatiblewithHA})
-
-	versionCmd.PersistentFlags().BoolVar(&VersionCommandFlags.isChefServer, "cs", false, "Get only chef server Status")
-	versionCmd.PersistentFlags().SetAnnotation("chef-server", docs.Compatibility, []string{docs.CompatiblewithHA})
-
-	versionCmd.PersistentFlags().BoolVar(&VersionCommandFlags.isOpenSearch, "os", false, "Get only opensearch Status")
-	versionCmd.PersistentFlags().SetAnnotation("opensearch", docs.Compatibility, []string{docs.CompatiblewithHA})
-
-	versionCmd.PersistentFlags().BoolVar(&VersionCommandFlags.isPostgresql, "pg", false, "Get only postgresql Status")
+	versionCmd.PersistentFlags().BoolVarP(&VersionCommandFlags.isChefServer, "chef_server", "c", false, "Shows the versions of Chef-server node(HA)")
+	versionCmd.PersistentFlags().SetAnnotation("chef_server", docs.Compatibility, []string{docs.CompatiblewithHA})
+	versionCmd.PersistentFlags().BoolVarP(&VersionCommandFlags.isPostgresql, "postgresql", "p", false, "Shows the versions of PostgresQL node")
 	versionCmd.PersistentFlags().SetAnnotation("postgresql", docs.Compatibility, []string{docs.CompatiblewithHA})
+	versionCmd.PersistentFlags().BoolVarP(&VersionCommandFlags.isOpenSearch, "opensearch", "o", false, "Shows the versions of OpenSearch node")
+	versionCmd.PersistentFlags().SetAnnotation("opensearch", docs.Compatibility, []string{docs.CompatiblewithHA})
+	versionCmd.PersistentFlags().BoolVar(&VersionCommandFlags.isAutomate, "a2", false, "Shows the versions of Automate node(HA)[DUPLICATE]")
+	versionCmd.PersistentFlags().SetAnnotation("a2", docs.Compatibility, []string{docs.CompatiblewithHA})
+	versionCmd.PersistentFlags().BoolVar(&VersionCommandFlags.isChefServer, "cs", false, "Shows the versions of Chef-server node(HA)[DUPLICATE]")
+	versionCmd.PersistentFlags().SetAnnotation("cs", docs.Compatibility, []string{docs.CompatiblewithHA})
+	versionCmd.PersistentFlags().BoolVar(&VersionCommandFlags.isPostgresql, "pg", false, "Shows the versions of PostgresQL node[DUPLICATE]")
+	versionCmd.PersistentFlags().SetAnnotation("pg", docs.Compatibility, []string{docs.CompatiblewithHA})
+	versionCmd.PersistentFlags().BoolVar(&VersionCommandFlags.isOpenSearch, "os", false, "Shows the versions of OpenSearch node[DUPLICATE]")
+	versionCmd.PersistentFlags().SetAnnotation("os", docs.Compatibility, []string{docs.CompatiblewithHA})
+	versionCmd.Flags().BoolVarP(&VersionCommandFlags.verbose, "verbose", "v", false, "Show additional version information")
 
 	versionCmd.PersistentFlags().StringVar(&VersionCommandFlags.node, "node", "", "Node Ip address. While using this flag, pass the node type as well. Example : chef-automate version --node 192.0.0.1 --cs")
 	versionCmd.PersistentFlags().SetAnnotation("node", docs.Compatibility, []string{docs.CompatiblewithHA})
 	RootCmd.AddCommand(versionCmd)
 }
 
+func isServiceFlagsNotProvided() bool {
+	return !VersionCommandFlags.isAutomate &&
+		!VersionCommandFlags.isChefServer &&
+		!VersionCommandFlags.isOpenSearch &&
+		!VersionCommandFlags.isPostgresql
+}
+
 func runCommandOnBastion(args []string) error {
 
+	err := getVersionBasedOnFlag()
+	if err != nil {
+		return err
+	}
+	if VersionCommandFlags.isBastion && isServiceFlagsNotProvided() {
+		return nil
+	}
 	infra, err := getAutomateHAInfraDetails()
 	if err != nil {
 		logrus.Errorf("Error while getting HA Infra details :: %s", err)
@@ -276,6 +297,44 @@ func runCommandOnBastion(args []string) error {
 	return nil
 }
 
+func getVersionBasedOnFlag() error {
+	isServiceFlagsNotProvided := isServiceFlagsNotProvided()
+	//get version of just bastion
+	if VersionCommandFlags.isBastion && isServiceFlagsNotProvided {
+		err := getBastionVersion()
+		if err != nil {
+			return err
+		}
+	}
+	//get version of bastion along with all service flags
+	if !VersionCommandFlags.isBastion && isServiceFlagsNotProvided {
+		err := getBastionVersion()
+		if err != nil {
+			return err
+		}
+	}
+	//get version of bastion along with other service flags
+	if VersionCommandFlags.isBastion && !isServiceFlagsNotProvided {
+		err := getBastionVersion()
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func getBastionVersion() error {
+	writer.Println(color.New(color.Bold).Add(color.Underline).Sprint(BASTION_NAME))
+	writer.Println("\n")
+	printClientVersion()
+	workspaceVersion := getCurrentInstalledWorsapceVersion(false)
+	if len(workspaceVersion) >= 2 {
+		timestamp := strings.TrimRight(workspaceVersion[1], "]")
+		writer.Bodyf("Workspace Build: %s", timestamp)
+	}
+	return nil
+}
+
 func getChefAutomateVersion(automateIps []string, infra *AutomateHAInfraDetails, cmdExecuter RemoteCmdExecutor) (map[string]string, error) {
 	automateCmd := A2VERSIONCMD
 	if VersionCommandFlags.verbose {
diff --git a/components/automate-cli/pkg/verifyserver/constants/fqdn.go b/components/automate-cli/pkg/verifyserver/constants/fqdn.go
index 37a868e82..8e4caf941 100644
--- a/components/automate-cli/pkg/verifyserver/constants/fqdn.go
+++ b/components/automate-cli/pkg/verifyserver/constants/fqdn.go
@@ -1,20 +1,25 @@
 package constants
 
 const (
-	FQDN_TITLE                     = "FQDN is reachable"
-	FQDN_ERROR_MESSAGE             = "FQDN is not reachable"
-	FQDN_RESOLUTION_MESSAGE        = "Ensure FQDN is reachable and mapped to load balancer.Also, ensure your Port 443 is open and load balancer is able to reach to the machine on port 443. Review security group or firewall settings."
-	NODE_TITLE                     = "Nodes are reachable"
-	NODE_SUCCESS_MESSAGE           = "All nodes are reachable"
-	NODE_ERROR_MESSAGE             = "%v is not reachable"
-	NODE_RESOLUTION_MESSAGE        = "Ensure your Port 443 is open. Review security group or firewall settings."
-	CERTIFICATE_TITLE              = "Certificate validity for FQDN"
-	CERTIFICATE_SUCCESS_MESSAGE    = "FQDN has with valid certificates"
-	CERTIFICATE_ERROR_MESSAGE      = "FQDN certificate is not valid."
-	CERTIFICATE_RESOLUTION_MESSAGE = "Generate new valid certificates and provide those."
-	IP_TO_HASH_FAIL_MESSAGE        = "Failed to hash the IP."
-	DEFAULT_HTTPS_PORT             = "443"
-	SERVER_IP_HEADER_KEY           = "x-server-ip"
-	CHAN_RESULT_ERROR_MESSAGE      = "error recieved"
-	MIN_NUMBER_OF_CALLS            = 50
+	FQDN_TITLE                           = "FQDN is reachable"
+	FQDN_ERROR_MESSAGE                   = "FQDN is not reachable"
+	FQDN_RESOLUTION_MESSAGE              = "Ensure FQDN is reachable and mapped to load balancer. Also, ensure your Port 443 is open and load balancer is able to reach to the machine on port 443. Review security group or firewall settings."
+	CERT_CN_MISMATCH_RESOLUTION_MESSAGE  = "Ensure the certificate provided is Valid. In case of self-signed certificate, make sure the DNS provided in \"subjectAltName\" matches with \"CN\" (Common Name)"
+	CERT_CN_MISMATCH_ERROR_PATTERN       = "x509: certificate is not valid for any names, but wanted to match"
+	INVALID_FQDN_CERT_RESOLUTION_MESSAGE = "Ensure the certificate provided is Valid. In case of self-signed certificate, make sure the root-ca and the certificate provided in LB belongs to same CA"
+	INVALID_FQDN_CERT_ERROR_PATTERN      = "x509: certificate signed by unknown authority"
+	GENERIC_FQDN_CERT_RESOLUTION_MESSAGE = "Ensure the certificate provided is Valid. Also check if the FQDN is reachable, and mapped to load balancer. Review security group or firewall settings for the load-balance."
+	NODE_TITLE                           = "Nodes are reachable"
+	NODE_SUCCESS_MESSAGE                 = "All nodes are reachable"
+	NODE_ERROR_MESSAGE                   = "%v is not reachable"
+	NODE_RESOLUTION_MESSAGE              = "Ensure your Port 443 is open. Review security group or firewall settings of the node."
+	CERTIFICATE_TITLE                    = "Certificate validity for FQDN"
+	CERTIFICATE_SUCCESS_MESSAGE          = "FQDN has with valid certificates"
+	CERTIFICATE_ERROR_MESSAGE            = "FQDN certificate is not valid."
+	CERTIFICATE_RESOLUTION_MESSAGE       = "Generate new valid certificates and provide those."
+	IP_TO_HASH_FAIL_MESSAGE              = "Failed to hash the IP."
+	DEFAULT_HTTPS_PORT                   = "443"
+	SERVER_IP_HEADER_KEY                 = "x-server-ip"
+	CHAN_RESULT_ERROR_MESSAGE            = "error recieved"
+	MIN_NUMBER_OF_CALLS                  = 50
 )
diff --git a/components/automate-cli/pkg/verifyserver/server/api/v1/fqdn.go b/components/automate-cli/pkg/verifyserver/server/api/v1/fqdn.go
index 19ea1593b..9d4792090 100644
--- a/components/automate-cli/pkg/verifyserver/server/api/v1/fqdn.go
+++ b/components/automate-cli/pkg/verifyserver/server/api/v1/fqdn.go
@@ -37,6 +37,6 @@ func (h *Handler) CheckFqdn(c *fiber.Ctx) error {
 		return fiber.NewError(http.StatusBadRequest, "node_type should be automate or chef-infra-server, Please provide node_type.")
 	}
 
-	res := h.FqdnService.CheckFqdnReachability(*req, constants.DEFAULT_HTTPS_PORT, time.Minute*1)
+	res := h.FqdnService.CheckFqdnReachability(*req, constants.DEFAULT_HTTPS_PORT, time.Second*60)
 	return c.JSON(response.BuildSuccessResponse(res))
 }
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 5b4590b10..a580b1d1c 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/triggerapi.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/triggerapi.go
@@ -121,7 +121,7 @@ func TriggerCheckAPI(endPoint, host, nodeType, method string, output chan<- mode
 	}
 
 	client := http.Client{
-		Timeout: 35 * time.Second,
+		Timeout: 65 * time.Second,
 	}
 	resp, err := client.Do(req)
 	if err != nil {
diff --git a/components/automate-cli/pkg/verifyserver/services/fqdnservice/fqdnservice.go b/components/automate-cli/pkg/verifyserver/services/fqdnservice/fqdnservice.go
index bcadd9eea..fe530293a 100644
--- a/components/automate-cli/pkg/verifyserver/services/fqdnservice/fqdnservice.go
+++ b/components/automate-cli/pkg/verifyserver/services/fqdnservice/fqdnservice.go
@@ -149,25 +149,45 @@ func (fq *FqdnService) MakeConcurrentCalls(url string, client *http.Client, setN
 	return errors.New("nodes are not reachable")
 }
 
-func (fq *FqdnService) triggerRequest(client *http.Client, url string) error {
-	res, err := client.Get(url)
-	if err != nil {
-		fq.log.Error(err.Error())
-		return err
-	}
+func (fq *FqdnService) triggerRequest(client *http.Client, url string, duration time.Duration) error {
+	timeout := time.After(duration)
+
+	var fqdnError error
+loop:
+	for {
+		select {
+		case <-timeout:
+			fq.log.Debugf("Stopped making API calls after %v seconds.", duration)
+			if fqdnError == nil {
+				return errors.New(constants.FQDN_ERROR_MESSAGE)
+			}
+			return fqdnError
+		default:
+			res, err := client.Get(url)
+			if err != nil {
+				fq.log.Error("Iteration logs: ", err.Error())
+				fqdnError = err
+				time.Sleep(3 * time.Second)
+				continue
+			}
+			fq.log.Debug("Status Code: ", res.StatusCode)
+			if res.StatusCode != 200 {
+				fq.log.Errorf("%v is not reachable.", url)
+			}
+			if res.StatusCode == 200 {
+				fq.log.Debug("FQDN is reachable")
+				// return nil
+				break loop
+			}
+		}
+		time.Sleep(3 * time.Second)
 
-	fq.log.Debug("Status Code: ", res.StatusCode)
-	if res.StatusCode != 200 {
-		fq.log.Debugf("%v is not reachable.", url)
-		return errors.New("fqdn is not reachable")
 	}
-
-	fq.log.Debug("Fqdn is Reachable.")
 	return nil
 }
 
 // fqdnReachable function will check that are we able to hit the load balancer fqdn or not.
-func (fq *FqdnService) fqdnReachable(fqdn, rootCert, nodeType string, isAfterDeployment bool, port string) models.Checks {
+func (fq *FqdnService) fqdnReachable(fqdn, rootCert, nodeType string, isAfterDeployment bool, port string, duration time.Duration) models.Checks {
 	fq.log.Debug("Checking Fqdn Reachability...")
 	client := fq.createClient(rootCert)
 	var url string
@@ -179,9 +199,17 @@ func (fq *FqdnService) fqdnReachable(fqdn, rootCert, nodeType string, isAfterDep
 	}
 	fq.log.Debug("URL: ", url)
 
-	err := fq.triggerRequest(client, url)
+	err := fq.triggerRequest(client, url, duration)
 	if err != nil {
-		return createCheck(constants.FQDN_TITLE, false, "", constants.FQDN_ERROR_MESSAGE, constants.FQDN_RESOLUTION_MESSAGE)
+		resoultion_message := ""
+		if strings.Contains(err.Error(), constants.CERT_CN_MISMATCH_ERROR_PATTERN) {
+			resoultion_message = constants.CERT_CN_MISMATCH_RESOLUTION_MESSAGE
+		} else if strings.Contains(err.Error(), constants.INVALID_FQDN_CERT_ERROR_PATTERN) {
+			resoultion_message = constants.INVALID_FQDN_CERT_RESOLUTION_MESSAGE
+		} else {
+			resoultion_message = constants.GENERIC_FQDN_CERT_RESOLUTION_MESSAGE
+		}
+		return createCheck(constants.FQDN_TITLE, false, "", err.Error(), resoultion_message)
 	}
 	return createCheck(constants.FQDN_TITLE, true, constants.FQDN_TITLE, "", "")
 }
@@ -266,7 +294,7 @@ func (fq *FqdnService) CheckFqdnReachability(req models.FqdnRequest, port string
 	}
 
 	if certificateValidityCheck {
-		check = fq.fqdnReachable(req.Fqdn, req.RootCert, req.NodeType, req.IsAfterDeployment, port)
+		check = fq.fqdnReachable(req.Fqdn, req.RootCert, req.NodeType, req.IsAfterDeployment, port, duration)
 	} else {
 		check = createCheck(constants.FQDN_TITLE, false, "", constants.FQDN_ERROR_MESSAGE, constants.FQDN_RESOLUTION_MESSAGE)
 	}
diff --git a/components/automate-cluster-ctl/habitat/plan.sh b/components/automate-cluster-ctl/habitat/plan.sh
index 87cac0f72..6547f5c37 100644
--- a/components/automate-cluster-ctl/habitat/plan.sh
+++ b/components/automate-cluster-ctl/habitat/plan.sh
@@ -26,6 +26,7 @@ pkg_deps=(
   core/hab/1.6.521/20220603154827
 )
 
+
 pkg_build_deps=(
   core/gcc
 )
diff --git a/components/automate-es-gateway/habitat/plan.sh b/components/automate-es-gateway/habitat/plan.sh
index feaf977d4..aa4ce2867 100644
--- a/components/automate-es-gateway/habitat/plan.sh
+++ b/components/automate-es-gateway/habitat/plan.sh
@@ -54,6 +54,7 @@ pkg_deps=(
   chef/automate-platform-tools
 )
 
+
 pkg_build_deps=(
   core/gcc
   core/make
diff --git a/components/automate-load-balancer/habitat/plan.sh b/components/automate-load-balancer/habitat/plan.sh
index 63e65243e..9a7ffa027 100644
--- a/components/automate-load-balancer/habitat/plan.sh
+++ b/components/automate-load-balancer/habitat/plan.sh
@@ -34,6 +34,7 @@ pkg_deps=(
   chef/mlsa
   core/bash
 )
+
 pkg_build_deps=(
   core/gcc
   core/make
diff --git a/components/automate-ui/src/app/services/license-usage/license-usage.service.ts b/components/automate-ui/src/app/services/license-usage/license-usage.service.ts
index 8d7f701bd..c87ffe4a4 100644
--- a/components/automate-ui/src/app/services/license-usage/license-usage.service.ts
+++ b/components/automate-ui/src/app/services/license-usage/license-usage.service.ts
@@ -90,14 +90,14 @@ export class LicenseUsageService {
 
   constructPayload() {
     const data = {
-      'license_id': this.licenseId,
+      'licenseId': this.licenseId,
       'customerId': this.customerId,
       'expiration': this.expiration,
       'customerName': this.customerName,
-      'metaData': {
+      'metadata': {
         'Automate': {
-             'instanceId': this.deploymentId,
-             'deploymentType': this.deploymentType
+          'instanceId': this.deploymentId,
+          'deploymentType': this.deploymentType
         }
       },
       'periods': [{
@@ -109,13 +109,13 @@ export class LicenseUsageService {
         },
         'summary': {
           'nodes': {
-            'total': this.totalNodes
+            'total': parseInt(this.totalNodes, 10)
           },
           'scans': {
-            'targets': this.totalScans
+            'targets': parseInt(this.totalScans, 10)
           },
-          'service': {
-            'targets': this.totalService
+          'services': {
+            'targets': parseInt(this.totalService, 10)
           }
         }
       }],
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 bbb7054d9..c6a86a896 100644
--- a/components/docs-chef-io/content/automate/ha_cert_selfsign.md
+++ b/components/docs-chef-io/content/automate/ha_cert_selfsign.md
@@ -51,7 +51,7 @@ You can create a self-signed key and certificate pair with the **OpenSSL** utili
     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
+        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 -addext basicConstraints=CA:TRUE
 
         # Admin cert
         openssl genrsa -out admin-key-temp.pem 2048
@@ -82,6 +82,12 @@ You can create a self-signed key and certificate pair with the **OpenSSL** utili
 
 {{< note >}}
 
+To create self-signed certificate for FQDN make sure to provide proper DNS and CN value. The DNS in Subject Alternative Name should match with the CN (Comman Name) 
+
+{{< /note >}}
+
+{{< note >}}
+
 Please refer Opensearch certificate [documentation](https://opensearch.org/docs/1.2/security-plugin/configuration/tls/#x509-pem-certificates-and-pkcs-8-keys)
 
 {{< /note >}}
\ No newline at end of file
diff --git a/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_version.yaml b/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_version.yaml
index 7cc302a77..18645134c 100644
--- a/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_version.yaml
+++ b/components/docs-chef-io/data/automate/cli_chef_automate/commands/chef-automate_version.yaml
@@ -5,10 +5,27 @@ description: Show the CLI version.
 options:
 - name: a2
   default_value: "false"
-  usage: Get only automate Status
+  usage: Shows the versions of Automate node(HA)[DUPLICATE]
+  compatible_with_options: AutomateHA
+- name: automate
+  shorthand: a
+  default_value: "false"
+  usage: Shows the versions of Automate node(HA)
+  compatible_with_options: AutomateHA
+- name: bastion
+  shorthand: b
+  default_value: "false"
+  usage: Shows the versions of bastion node(HA)
+  compatible_with_options: AutomateHA
+- name: chef_server
+  shorthand: c
+  default_value: "false"
+  usage: Shows the versions of Chef-server node(HA)
+  compatible_with_options: AutomateHA
 - name: cs
   default_value: "false"
-  usage: Get only chef server Status
+  usage: Shows the versions of Chef-server node(HA)[DUPLICATE]
+  compatible_with_options: AutomateHA
 - name: help
   shorthand: h
   default_value: "false"
@@ -17,12 +34,24 @@ options:
   usage: |
     Node Ip address. While using this flag, pass the node type as well. Example : chef-automate version --node 192.0.0.1 --cs
   compatible_with_options: AutomateHA
+- name: opensearch
+  shorthand: o
+  default_value: "false"
+  usage: Shows the versions of OpenSearch node
+  compatible_with_options: AutomateHA
 - name: os
   default_value: "false"
-  usage: Get only opensearch Status
+  usage: Shows the versions of OpenSearch node[DUPLICATE]
+  compatible_with_options: AutomateHA
 - name: pg
   default_value: "false"
-  usage: Get only postgresql Status
+  usage: Shows the versions of PostgresQL node[DUPLICATE]
+  compatible_with_options: AutomateHA
+- name: postgresql
+  shorthand: p
+  default_value: "false"
+  usage: Shows the versions of PostgresQL node
+  compatible_with_options: AutomateHA
 - name: verbose
   shorthand: v
   default_value: "false"
diff --git a/integration/helpers/ssl_filters.jq b/integration/helpers/ssl_filters.jq
index b58bca9b9..4dcc7244e 100644
--- a/integration/helpers/ssl_filters.jq
+++ b/integration/helpers/ssl_filters.jq
@@ -40,8 +40,10 @@ map(select(
          (.id != "HSTS" or .port != "10161") and
          (.id != "HSTS" or .port != "10143") and
          (.id != "HSTS" or .port != "10200") and
+         (.id != "HSTS" or .port != "10201") and
          (.id != "security_headers" or .port != "10161") and
          (.id != "security_headers" or .port != "10200") and
+         (.id != "security_headers" or .port != "10201") and
          (.id != "security_headers" or .port != "10104") and
 
          # automate-cs erlang-services
diff --git a/lib/arrayutils/remove_duplicate.go b/lib/arrayutils/remove_duplicate.go
new file mode 100644
index 000000000..291dcadde
--- /dev/null
+++ b/lib/arrayutils/remove_duplicate.go
@@ -0,0 +1,21 @@
+package arrayutils
+
+func RemoveStringDuplicates(inputArray []string) []string {
+	arrayWithoutDuplicate := []string{}
+	for _, item := range inputArray {
+		if !contains(arrayWithoutDuplicate, item) {
+			arrayWithoutDuplicate = append(arrayWithoutDuplicate, item)
+		}
+	}
+	return arrayWithoutDuplicate
+}
+
+func contains(arrayWithoutDuplicate []string, item string) bool {
+	index := -1
+	for i := range arrayWithoutDuplicate {
+		if item == arrayWithoutDuplicate[i] {
+			index = i
+		}
+	}
+	return index >= 0
+}


Test patch:
diff --git a/components/automate-cli/cmd/chef-automate/config_test.go b/components/automate-cli/cmd/chef-automate/config_test.go
index ca3a53cfa..b1b43f51d 100644
--- a/components/automate-cli/cmd/chef-automate/config_test.go
+++ b/components/automate-cli/cmd/chef-automate/config_test.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+	"io/ioutil"
 	"os"
 	"testing"
 
@@ -8,7 +9,9 @@ import (
 	"github.com/chef/automate/api/config/shared"
 	w "github.com/chef/automate/api/config/shared/wrappers"
 	"github.com/pkg/errors"
+	"github.com/spf13/cobra"
 	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 )
 
 var fqdn = "a2.test.com"
@@ -103,6 +106,30 @@ func TestTomlFileCreateFromReqConfigLog(t *testing.T) {
 	os.Remove(fileName)
 }
 
+func TestCheckIfRequestedIsCentrailisedLogging(t *testing.T) {
+	file := []string{"../../pkg/testfiles/aws/centralised_log.toml"}
+	val, _ := checkIfRequestedConfigHasCentrailisedLogging(file)
+	assert.True(t, val)
+}
+
+func TestCheckIfRequestedIsCentrailisedLoggingWithPgConfig(t *testing.T) {
+	file := []string{"../../pkg/testfiles/aws/pg.toml"}
+	val, _ := checkIfRequestedConfigHasCentrailisedLogging(file)
+	assert.Equal(t, val, false)
+}
+
+func TestCheckIfRequestedIsCentrailisedLoggingWithInvalidFile(t *testing.T) {
+	file := []string{"../../pkg/testfiles/aws/centralised.toml"}
+	_, err := checkIfRequestedConfigHasCentrailisedLogging(file)
+	assert.Error(t, err)
+}
+
+func TestCheckIfRequestedIsCentrailisedLoggingwitherror(t *testing.T) {
+	file := []string{"../../pkg/testfiles/aws/centralised_log.toml"}
+	val, _ := checkIfRequestedConfigHasCentrailisedLogging(file)
+	assert.True(t, val)
+}
+
 func TestErrorOnSelfManaged(t *testing.T) {
 	testCases := []struct {
 		isPostgresql bool
@@ -248,6 +275,279 @@ func TestSetConfigForFrontEndNodes(t *testing.T) {
 	}
 }
 
+func TestPatchConfigCommand(t *testing.T) {
+	infra := getMockInfra()
+	file := "../../pkg/testfiles/aws/centralised_log.toml"
+	tests := []struct {
+		testName     string
+		infra        *AutomateHAInfraDetails
+		sshUtil      SSHUtil
+		args         []string
+		isAutomate   bool
+		isChefServer bool
+		iPostgresql  bool
+		isOpenSearch bool
+		wantErr      bool
+	}{
+		{
+			"patch for pg",
+			infra,
+			getMockSSHUtil(&SSHConfig{}, nil, "", nil),
+			[]string{file},
+			false,
+			false,
+			true,
+			false,
+			true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.testName, func(t *testing.T) {
+			if err := runPatchCommand(&cobra.Command{}, tt.args); (err != nil) != tt.wantErr {
+				t.Errorf("error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
+func TestCheckUserConfigHasOnlyCentrailisedLogConfig(t *testing.T) {
+	t.Run("Returning false as the file is not empty", func(t *testing.T) {
+		fileContent := `[global.v1.log]
+		compress_rotated_logs = true
+		max_number_rotated_logs = 10
+		max_size_rotate_logs = "10M"
+		redirect_log_file_path = "/var/tmp/"
+		redirect_sys_log = true`
+		tmpfile, err := ioutil.TempFile("", "test-output.toml")
+		require.NoError(t, err)
+
+		n, err := tmpfile.Write([]byte(fileContent))
+		require.NoError(t, err)
+		require.NotZero(t, n)
+
+		err = tmpfile.Close()
+		require.NoError(t, err)
+
+		isOnlyCentralisedLog, err := checkUserConfigHasOnlyCentrailisedLogConfig(tmpfile.Name())
+		require.NoError(t, err)
+		require.Equal(t, isOnlyCentralisedLog, false)
+		require.NoError(t, err)
+		err = os.Remove(tmpfile.Name())
+		require.NoError(t, err)
+	})
+	t.Run("Returning true as the file is empty", func(t *testing.T) {
+		fileContent := ``
+		tmpfile, err := ioutil.TempFile("", "test-output.toml")
+		require.NoError(t, err)
+
+		_, err = tmpfile.Write([]byte(fileContent))
+		require.NoError(t, err)
+
+		err = tmpfile.Close()
+		require.NoError(t, err)
+
+		isOnlyCentralisedLog, err := checkUserConfigHasOnlyCentrailisedLogConfig(tmpfile.Name())
+		require.NoError(t, err)
+		require.Equal(t, isOnlyCentralisedLog, true)
+		require.NoError(t, err)
+		require.NoError(t, err)
+		err = os.Remove(tmpfile.Name())
+
+	})
+	t.Run("File not found", func(t *testing.T) {
+		filePath := "testdata/notfound.json"
+		_, err := checkUserConfigHasOnlyCentrailisedLogConfig(filePath)
+		require.Error(t, err)
+	})
+}
+
+func TestPatchAndRemoveCentralisedLoggingForBackendForPg(t *testing.T) {
+	infra := getMockInfra()
+	file := "../../pkg/testfiles/aws/centralised_log.toml"
+	tests := []struct {
+		testName string
+		infra    *AutomateHAInfraDetails
+		sshUtil  SSHUtil
+		args     []string
+		wantErr  bool
+	}{
+		{
+			"patch and remove centralised log for pg",
+			infra,
+			getMockSSHUtil(&SSHConfig{}, nil, "", nil),
+			[]string{file},
+			true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.testName, func(t *testing.T) {
+			fileName, err := patchAndRemoveCentralisedLoggingForBackend(tt.args, infra)
+			os.Remove(fileName)
+			assert.Nilf(t, err, "Unable to created toml file for postgresql toml")
+
+		})
+	}
+
+}
+
+func TestPatchAndRemoveCentralisedLoggingForBackendWithError(t *testing.T) {
+	infra := getMockInfra()
+	file := ""
+	tests := []struct {
+		testName string
+		infra    *AutomateHAInfraDetails
+		sshUtil  SSHUtil
+		args     []string
+		wantErr  bool
+	}{
+		{
+			"Error while patching and remove centralised log for pg",
+			infra,
+			getMockSSHUtil(&SSHConfig{}, nil, "", nil),
+			[]string{file},
+			true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.testName, func(t *testing.T) {
+			fileName, err := patchAndRemoveCentralisedLoggingForBackend(tt.args, infra)
+			os.Remove(fileName)
+			assert.Error(t, err)
+
+		})
+	}
+
+}
+
+func TestPatchCentralisedLoggingForBackendForPg(t *testing.T) {
+	infra := getMockInfra()
+	file := "../../pkg/testfiles/aws/centralised_log.toml"
+	tests := []struct {
+		testName string
+		infra    *AutomateHAInfraDetails
+		sshUtil  SSHUtil
+		args     []string
+		wantErr  bool
+	}{
+		{
+			"Patch centralised log for pg",
+			infra,
+			getMockSSHUtil(&SSHConfig{}, nil, "", nil),
+			[]string{file},
+			true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.testName, func(t *testing.T) {
+			configCmdFlags.postgresql = true
+			err := patchCentralisedLoggingForBackend(tt.args, tt.sshUtil, infra)
+			assert.Nilf(t, err, "Unable to created toml file for postgresql toml")
+
+		})
+	}
+
+}
+
+func TestPatchCentralisedLoggingForBackendForPgWithError(t *testing.T) {
+	infra := getMockInfra()
+	file := ""
+	tests := []struct {
+		testName string
+		infra    *AutomateHAInfraDetails
+		sshUtil  SSHUtil
+		args     []string
+		wantErr  bool
+	}{
+		{
+			"Error while patching centralised log for pg",
+			infra,
+			getMockSSHUtil(&SSHConfig{}, nil, "", nil),
+			[]string{file},
+			true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.testName, func(t *testing.T) {
+			configCmdFlags.postgresql = true
+			err := patchCentralisedLoggingForBackend(tt.args, tt.sshUtil, infra)
+			assert.Error(t, err)
+
+		})
+	}
+
+}
+
+func TestPatchCentralisedLoggingForBackendForOs(t *testing.T) {
+	infra := getMockInfra()
+	file := "../../pkg/testfiles/aws/centralised_log.toml"
+	tests := []struct {
+		testName string
+		infra    *AutomateHAInfraDetails
+		sshUtil  SSHUtil
+		args     []string
+		wantErr  bool
+	}{
+		{
+			"Patch centralised log for os",
+			infra,
+			getMockSSHUtil(&SSHConfig{}, nil, "", nil),
+			[]string{file},
+			true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.testName, func(t *testing.T) {
+			configCmdFlags.opensearch = true
+			err := patchCentralisedLoggingForBackend(tt.args, tt.sshUtil, infra)
+			assert.Nilf(t, err, "Unable to created toml file for postgresql toml")
+
+		})
+	}
+
+}
+
+func TestRemoveCentralisedLogsFromUserConfigForPg(t *testing.T) {
+	file := "../../pkg/testfiles/aws/centralised_log.toml"
+	emptyFile := "../../pkg/testfiles/aws/invalid_pg.toml"
+	t.Run("Remove log config from the file",
+		func(t *testing.T) {
+			file, err := removeCentralisedLogsFromUserConfigForPg(file)
+			os.Remove(file)
+			assert.NoError(t, err)
+
+		},
+	)
+	t.Run("Error while removing log config from the file",
+		func(t *testing.T) {
+			file, err := removeCentralisedLogsFromUserConfigForPg(emptyFile)
+			os.Remove(file)
+			assert.Error(t, err)
+
+		},
+	)
+}
+
+func TestRemoveCentralisedLogsFromUserConfigForOs(t *testing.T) {
+	file := "../../pkg/testfiles/aws/centralised_log.toml"
+	emptyFile := "../../pkg/testfiles/aws/invalid_pg.toml"
+	t.Run("Remove log config from the file",
+		func(t *testing.T) {
+			file, err := removeCentralisedLogsFromUserConfigForOs(file)
+			os.Remove(file)
+			assert.NoError(t, err)
+
+		},
+	)
+	t.Run("Error while removing log config from the file",
+		func(t *testing.T) {
+			file, err := removeCentralisedLogsFromUserConfigForOs(emptyFile)
+			os.Remove(file)
+			assert.Error(t, err)
+
+		},
+	)
+
+}
+
 func getMockSSHUtil(sshConfig *SSHConfig, CFTRError error, CSECOROutput string, CSECORError error) *MockSSHUtilsImpl {
 	return &MockSSHUtilsImpl{
 		getSSHConfigFunc: func() *SSHConfig {
diff --git a/components/automate-cli/cmd/chef-automate/version_test.go b/components/automate-cli/cmd/chef-automate/version_test.go
index a1d30f70c..b135e52ac 100644
--- a/components/automate-cli/cmd/chef-automate/version_test.go
+++ b/components/automate-cli/cmd/chef-automate/version_test.go
@@ -37,6 +37,26 @@ const configShow = `[global]
 			username = "admin"
 			password = "admin"`
 
+func Test_getVersionBasedOnFlag(t *testing.T) {
+	t.Run("Version only for bastion", func(t *testing.T) {
+		VersionCommandFlags.isBastion = true
+		err := getVersionBasedOnFlag()
+		assert.Nil(t, err)
+	})
+	t.Run("Version for bastion along with service flag", func(t *testing.T) {
+		VersionCommandFlags.isBastion = true
+		VersionCommandFlags.isAutomate = true
+		err := getVersionBasedOnFlag()
+		assert.Nil(t, err)
+	})
+	t.Run("Version for all nodes including bastion", func(t *testing.T) {
+		VersionCommandFlags.isBastion = false
+		VersionCommandFlags.isAutomate = false
+		err := getVersionBasedOnFlag()
+		assert.Nil(t, err)
+	})
+}
+
 func Test_getChefAutomateVersion(t *testing.T) {
 	t.Run("Success", func(t *testing.T) {
 		mockCmdExecutor := &MockRemoteCmdExecutor{
diff --git a/components/automate-cli/pkg/testfiles/aws/centralised_log.toml b/components/automate-cli/pkg/testfiles/aws/centralised_log.toml
new file mode 100644
index 000000000..544298438
--- /dev/null
+++ b/components/automate-cli/pkg/testfiles/aws/centralised_log.toml
@@ -0,0 +1,6 @@
+[global.v1.log]
+      compress_rotated_logs = true
+      max_number_rotated_logs = 10
+      max_size_rotate_logs = "10M"
+      redirect_log_file_path = "/var/tmp/"
+      redirect_sys_log = true
\ No newline at end of file
diff --git a/components/automate-cli/pkg/testfiles/aws/invalid_pg.toml b/components/automate-cli/pkg/testfiles/aws/invalid_pg.toml
new file mode 100644
index 000000000..455ccd4f8
--- /dev/null
+++ b/components/automate-cli/pkg/testfiles/aws/invalid_pg.toml
@@ -0,0 +1,3 @@
+[pg_dump]
+  enable = *true
+  path = "/mnt/automate_backups/postgresql/pg_dump
\ No newline at end of file
diff --git a/components/automate-cli/pkg/testfiles/aws/pg.toml b/components/automate-cli/pkg/testfiles/aws/pg.toml
new file mode 100644
index 000000000..002eb46aa
--- /dev/null
+++ b/components/automate-cli/pkg/testfiles/aws/pg.toml
@@ -0,0 +1,3 @@
+[pg_dump]
+  enable = true
+  path = "/mnt/automate_backups/postgresql/pg_dump"
\ No newline at end of file
diff --git a/components/automate-cli/pkg/verifyserver/services/fqdnservice/fqdnservice_test.go b/components/automate-cli/pkg/verifyserver/services/fqdnservice/fqdnservice_test.go
index feffddd44..58c3269a3 100644
--- a/components/automate-cli/pkg/verifyserver/services/fqdnservice/fqdnservice_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/fqdnservice/fqdnservice_test.go
@@ -325,8 +325,8 @@ func TestCheckFqdnReachability(t *testing.T) {
 						Title:         constants.FQDN_TITLE,
 						Passed:        false,
 						SuccessMsg:    "",
-						ErrorMsg:      constants.FQDN_ERROR_MESSAGE,
-						ResolutionMsg: constants.FQDN_RESOLUTION_MESSAGE,
+						ErrorMsg:      "no such host",
+						ResolutionMsg: constants.GENERIC_FQDN_CERT_RESOLUTION_MESSAGE,
 					},
 					{
 						Title:         constants.NODE_TITLE,
@@ -545,8 +545,8 @@ func TestCheckFqdnReachability(t *testing.T) {
 						Title:         constants.FQDN_TITLE,
 						Passed:        false,
 						SuccessMsg:    "",
-						ErrorMsg:      constants.FQDN_ERROR_MESSAGE,
-						ResolutionMsg: constants.FQDN_RESOLUTION_MESSAGE,
+						ErrorMsg:      "no such host",
+						ResolutionMsg: constants.GENERIC_FQDN_CERT_RESOLUTION_MESSAGE,
 					},
 					{
 						Title:         constants.NODE_TITLE,
@@ -609,8 +609,8 @@ func TestCheckFqdnReachability(t *testing.T) {
 						Title:         constants.FQDN_TITLE,
 						Passed:        false,
 						SuccessMsg:    "",
-						ErrorMsg:      constants.FQDN_ERROR_MESSAGE,
-						ResolutionMsg: constants.FQDN_RESOLUTION_MESSAGE,
+						ErrorMsg:      "no such host",
+						ResolutionMsg: constants.GENERIC_FQDN_CERT_RESOLUTION_MESSAGE,
 					},
 					{
 						Title:         constants.NODE_TITLE,
@@ -713,7 +713,7 @@ func TestCheckFqdnReachability(t *testing.T) {
 						Passed:        false,
 						SuccessMsg:    "",
 						ErrorMsg:      constants.FQDN_ERROR_MESSAGE,
-						ResolutionMsg: constants.FQDN_RESOLUTION_MESSAGE,
+						ResolutionMsg: constants.GENERIC_FQDN_CERT_RESOLUTION_MESSAGE,
 					},
 					{
 						Title:         constants.NODE_TITLE,
@@ -731,7 +731,18 @@ func TestCheckFqdnReachability(t *testing.T) {
 	for _, e := range tests {
 		t.Run(e.TestName, func(t *testing.T) {
 			res := fq.CheckFqdnReachability(e.ReqBody, e.Port, time.Second*2)
-			assert.Equal(t, e.ResponseBody, res)
+			if e.ResponseBody.Passed {
+				assert.Equal(t, e.ResponseBody, res)
+			} else {
+				for i := 0; i < len(e.ResponseBody.Checks); i++ {
+					check := e.ResponseBody.Checks[i]
+					if check.Passed {
+						assert.Contains(t, res.Checks[i].SuccessMsg, check.SuccessMsg)
+					} else {
+						assert.Contains(t, res.Checks[i].ErrorMsg, check.ErrorMsg)
+					}
+				}
+			}
 		})
 	}
 }
diff --git a/lib/arrayutils/remove_duplicate_test.go b/lib/arrayutils/remove_duplicate_test.go
new file mode 100644
index 000000000..525b24597
--- /dev/null
+++ b/lib/arrayutils/remove_duplicate_test.go
@@ -0,0 +1,51 @@
+package arrayutils_test
+
+import (
+	"testing"
+
+	"github.com/bmizerany/assert"
+	"github.com/chef/automate/lib/arrayutils"
+)
+
+func TestRemoveStringDuplicates(t *testing.T) {
+
+	testCases := []struct {
+		title         string
+		inputArray    []string
+		expectedArray []string
+		wantErr       bool
+		expectedErr   error
+	}{
+		{
+			title:         "Have duplicate value",
+			inputArray:    []string{"0.0.0.0", "0.0.0.0", "0.0.0.1"},
+			expectedArray: []string{"0.0.0.0", "0.0.0.1"},
+			wantErr:       false,
+			expectedErr:   nil,
+		},
+		{
+			title:         "Have no duplicate value",
+			inputArray:    []string{"0.0.0.0", "0.0.0.1"},
+			expectedArray: []string{"0.0.0.0", "0.0.0.1"},
+			wantErr:       false,
+			expectedErr:   nil,
+		},
+		{
+			title:         "empty array",
+			inputArray:    []string{},
+			expectedArray: []string{},
+			wantErr:       false,
+			expectedErr:   nil,
+		},
+	}
+	for _, testCase := range testCases {
+		t.Run(testCase.title, func(t *testing.T) {
+			output := arrayutils.RemoveStringDuplicates(testCase.inputArray)
+			if !testCase.wantErr {
+				// assert.Error(t, err)
+				assert.Equal(t, testCase.expectedArray, output)
+			}
+		})
+	}
+
+}