Repository: chef/automate
Pull request #8210 (2023-09-07 09:56:42)

add the policy msg in user creation
### :nut_and_bolt: Description: What code changed, and why?

<!-- /!\ Please ensure that you are NOT disclosing any customer information without their consent /!\ -->

### :chains: Related Resources

### :+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


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


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | 78e8fd5583171a87305996010d3cfdc0d6c5ee98 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/chef-automate/deploys/64f99e5c1381b9000853a8b1 |
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=8210)

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

[![No Coverage information](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/CoverageChart/NoCoverageInfo-16px.png 'No Coverage information')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=8210&metric=coverage&view=list) No Coverage information  
[![No Duplication information](https://raw.githubusercontent.com/SonarSource/sonarqube-static-resources/master/v97/checks/Duplications/NoDuplicationInfo-16px.png 'No Duplication information')](https://sonar.progress.com/component_measures?id=chef_automate_AYeOVEbqJ4YHsO5MtKWC&pullRequest=8210&metric=duplicated_lines_density&view=list) No Duplication information



Patch:
diff --git a/VERSION b/VERSION
index 470d61092..969d141a5 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-4.10.4
\ No newline at end of file
+4.10.12
\ No newline at end of file
diff --git a/components/automate-cli/cmd/chef-automate/automateHADeployExistingInfra.go b/components/automate-cli/cmd/chef-automate/automateHADeployExistingInfra.go
index ebd9087d1..c910bf35c 100644
--- a/components/automate-cli/cmd/chef-automate/automateHADeployExistingInfra.go
+++ b/components/automate-cli/cmd/chef-automate/automateHADeployExistingInfra.go
@@ -14,7 +14,6 @@ import (
 	ptoml "github.com/pelletier/go-toml"
 )
 
-const AUTOMATE_HA_WORKSPACE_GOOGLE_SERVICE_FILE = "/hab/a2_deploy_workspace/googleServiceAccount.json"
 const GCS = "gcs"
 const S3 = "s3"
 
diff --git a/components/automate-cli/cmd/chef-automate/pullAndGenerateConfig.go b/components/automate-cli/cmd/chef-automate/pullAndGenerateConfig.go
index b3d6f0000..6cb46003f 100644
--- a/components/automate-cli/cmd/chef-automate/pullAndGenerateConfig.go
+++ b/components/automate-cli/cmd/chef-automate/pullAndGenerateConfig.go
@@ -21,6 +21,7 @@ import (
 )
 
 const GET_OS_PASSWORD = "sudo HAB_LICENSE=accept-no-persist hab pkg exec chef/automate-platform-tools secrets-helper show userconfig.os_password"
+const AUTOMATE_HA_WORKSPACE_GOOGLE_SERVICE_FILE = "/hab/a2_deploy_workspace/googleServiceAccount.json"
 
 type ConfigKeys struct {
 	rootCA     string
diff --git a/components/automate-cli/pkg/verifyserver/constants/apiurlconstant.go b/components/automate-cli/pkg/verifyserver/constants/apiurlconstant.go
index 4f17955d9..c1e5070ff 100644
--- a/components/automate-cli/pkg/verifyserver/constants/apiurlconstant.go
+++ b/components/automate-cli/pkg/verifyserver/constants/apiurlconstant.go
@@ -20,6 +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"
+	GCP_CLOUD_STORAGE_CONFIG_API_PATH        = "/api/v1/checks/gcp-cloud-storage-config"
 	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/constants/checkconstant.go b/components/automate-cli/pkg/verifyserver/constants/checkconstant.go
index 45f5d3844..f34d59438 100644
--- a/components/automate-cli/pkg/verifyserver/constants/checkconstant.go
+++ b/components/automate-cli/pkg/verifyserver/constants/checkconstant.go
@@ -11,6 +11,7 @@ const SYSTEM_RESOURCES = "system-resources"
 const SOFTWARE_VERSIONS = "software-versions"
 const SYSTEM_USER = "system-user"
 const S3_BACKUP_CONFIG = "s3-backup-config"
+const GCP_BACKUP_CONFIG = "gcp-backup-config"
 const FQDN = "fqdn"
 const FIREWALL = "firewall"
 const EXTERNAL_OPENSEARCH = "external-opensearch"
@@ -26,6 +27,7 @@ const (
 	SOFTWARE_VERSIONS_MSG               = "Software Versions Check"
 	SYSTEM_USER_MSG                     = "System User Check"
 	S3_BACKUP_CONFIG_MSG                = "S3 Backup Config Check"
+	GCP_BACKUP_CONFIG_MSG               = "GCP Backup Config Check"
 	FQDN_MSG                            = "FQDN Check"
 	FIREWALL_MSG                        = "Firewall Check"
 	EXTERNAL_OPENSEARCH_MSG             = "External OpenSearch Check"
@@ -107,6 +109,11 @@ var checkMap map[string]models.CheckAndType = map[string]models.CheckAndType{
 		CheckName: NFS_BACKUP_CONFIG,
 		CheckMsg:  NFS_BACKUP_CONFIG_MSG,
 	},
+	GCP_BACKUP_CONFIG: {
+		CheckType: REMOTE_CHECK,
+		CheckName: GCP_BACKUP_CONFIG,
+		CheckMsg:  GCP_BACKUP_CONFIG_MSG,
+	},
 }
 
 func GetCheckMessageByName(CheckName string) string {
diff --git a/components/automate-cli/pkg/verifyserver/constants/error.go b/components/automate-cli/pkg/verifyserver/constants/error.go
index efb49c6d6..801661be0 100644
--- a/components/automate-cli/pkg/verifyserver/constants/error.go
+++ b/components/automate-cli/pkg/verifyserver/constants/error.go
@@ -8,6 +8,7 @@ const (
 	MISSING_CERTIFICATE    = "Certificate is missing"
 	MOUNT_LOCATION_MISSING = "MountLocation is missing"
 	S3_BACKUP_MISSING      = "S3 backup detail is missing"
+	GCS_BACKUP_MISSING     = "GCS backup detail is missing"
 	OBJECT_STORAGE_MISSING = "Object storage detail or OS detail is missing"
 	PG_DETAILS_MISSING     = "PG configuration is missing"
 	OS_DETAILS_MISSING     = "OS configuration is missing"
diff --git a/components/automate-cli/pkg/verifyserver/constants/gcpconfig.go b/components/automate-cli/pkg/verifyserver/constants/gcpconfig.go
new file mode 100644
index 000000000..5d817a53f
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/constants/gcpconfig.go
@@ -0,0 +1,49 @@
+package constants
+
+const (
+	GCP_CONNECTION_TITLE                  = "GCS connection test"
+	GCP_BUCKET_NOT_FOUND                  = "Cannot find the Bucket in GCS cloud storage with provided credentials"
+	GCP_BUCKET_NOT_FOUND_RESOLUTION_MSG   = "Create a bucket in GCS cloud storage"
+	GCP_CONNECTION_ERROR_MSG              = "Machine is not able to connect with GCS using the provided credentials"
+	GCP_CONNECTION_RESOLUTION_MSG         = "Provide the correct GCS credentials"
+	GCP_CONNECTION_SUCCESS_MSG            = "Machine is able to connect with GCS using the provided credentials"
+	GCP_CONNECTION_RESOLUTION_GENERAL_MSG = "Machine is not able to connect, check if the bucket exists and the provided credential is correct"
+	GCP_BUCKET_ACCESS_TITLE               = "GCS bucket access test"
+	GCP_BUCKET_ACCESS_ERROR_MSG           = "Machine is not able to access the GCS bucket using the provided credentials"
+	GCP_BUCKET_ACCESS_RESOLUTION_MSG      = "Please check if the provided GCS bucket exists or not. If it exists then provide the correct credentials."
+	GCP_BUCKET_UPLOAD_ERROR_MSG           = "Unable to upload the object to given bucket"
+	GCP_BUCKET_UPLOAD_RESOLUTION_MSG      = "Please check if the valid permissions given to upload the object to the bucket"
+	GCP_BUCKET_LIST_ERROR_MSG             = "Unable to list the objects in given bucket"
+	GCP_BUCKET_LIST_RESOLUTION_MSG        = "Please check if the valid permissions given to list the objects in the bucket"
+	GCP_BUCKET_DELETE_ERROR_MSG           = "Unable to delete the object from the given bucket"
+	GCP_BUCKET_DELETE_RESOLUTION_MSG      = "Please check if the valid permissions given to delete the object in the bucket"
+
+	GCP_CHECK_FILE_PREFIX = "gcp_check_test_"
+)
+
+const (
+	GCS_TYPE_MISSING                = "'type' field is missing in gcs service account file"
+	GCS_PROJECT_ID                  = "'project_id' field is missing in gcs service account file"
+	GCS_PRIVATE_KEY_ID              = "'private_key_id' field is missing in gcs service account file"
+	GCS_PRIVATE_KEY                 = "'private_key' field is missing in gcs service account file"
+	GCS_CLIENT_EMAIL                = "'client_email' field is missing in gcs service account file"
+	GCS_CLIENT_ID                   = "'client_id' field is missing in gcs service account file"
+	GCS_AUTH_URI                    = "'auth_uri' field is missing in gcs service account file"
+	GCS_TOKEN_URI                   = "'token_uri' field is missing in gcs service account file"
+	GCS_AUTH_PROVIDER_x509_CERT_URL = "'auth_provider_x509_cert_url' field is missing in gcs service account file"
+	GCS_CLIENT_x509_CERT_URL        = "'client_x509_cert_url' field is missing in gcs service account file"
+	GCS_UNIVERSAL_DOMAIN            = "'universe_domain' field is missing in gcs service account file"
+
+	// Resolutions
+	GCS_TYPE_MISSING_RESOLUTION                = "Provide 'type' in gcs service account file"
+	GCS_PROJECT_ID_RESOLUTION                  = "Provide 'project_id' in gcs service account file"
+	GCS_PRIVATE_KEY_ID_RESOLUTION              = "Provide 'private_key_id' in gcs service account file"
+	GCS_PRIVATE_KEY_RESOLUTION                 = "Provide 'private_key' in gcs service account file"
+	GCS_CLIENT_EMAIL_RESOLUTION                = "Provide 'client_email' in gcs service account file"
+	GCS_CLIENT_ID_RESOLUTION                   = "Provide 'client_id' in gcs service account file"
+	GCS_AUTH_URI_RESOLUTION                    = "Provide 'auth_uri' in gcs service account file"
+	GCS_TOKEN_URI_RESOLUTION                   = "Provide 'token_uri' in gcs service account file"
+	GCS_AUTH_PROVIDER_x509_CERT_URL_RESOLUTION = "Provide 'auth_provider_x509_cert_url' in gcs service account file"
+	GCS_CLIENT_x509_CERT_URL_RESOLUTION        = "Provide 'client_x509_cert_url' in gcs service account file"
+	GCS_UNIVERSAL_DOMAIN_RESOLUTION            = "Provide 'universe_domain' in gcs service account file"
+)
diff --git a/components/automate-cli/pkg/verifyserver/constants/skipmessages.go b/components/automate-cli/pkg/verifyserver/constants/skipmessages.go
index e17def224..1cba82af7 100644
--- a/components/automate-cli/pkg/verifyserver/constants/skipmessages.go
+++ b/components/automate-cli/pkg/verifyserver/constants/skipmessages.go
@@ -7,6 +7,7 @@ const (
 	SKIP_MANAGED_PG_TEST_MESSAGE             = "- No External OpenSearch configuration found\n- Using Chef Managed PostgreSQL"
 	SKIP_BACKUP_TEST_MESSAGE_NFS             = "- Backup configuration not set to file_system/efs"
 	SKIP_BACKUP_TEST_MESSAGE_S3              = "- Backup configuration not set to object_storage/s3"
+	SKIP_BACKUP_TEST_MESSAGE_GCS             = "- Backup configuration not set to object_storage/gcs"
 	SKIP_OS_BUCKET_TEST_MESSAGE              = "- No External OpenSearch configuration provided or,\n- No S3 Backup configuration was provided"
 	SKIP_OS_BUCKET_TEST_SELF_MANAGED_MESSAGE = "- External OpenSearch is self managed"
 	SKIP_MISSING_HARDWARE_MESSAGE            = "- Instance count and Instance IPs are missing"
diff --git a/components/automate-cli/pkg/verifyserver/models/batchcheck.go b/components/automate-cli/pkg/verifyserver/models/batchcheck.go
index d0ba3043a..862d63f63 100644
--- a/components/automate-cli/pkg/verifyserver/models/batchcheck.go
+++ b/components/automate-cli/pkg/verifyserver/models/batchcheck.go
@@ -7,10 +7,17 @@ import (
 	"strings"
 
 	"github.com/aws/aws-sdk-go/aws/credentials"
+	"github.com/sirupsen/logrus"
+
 	"github.com/chef/automate/lib/config"
 	"github.com/gofiber/fiber/v2"
 )
 
+const (
+	AWS_S3            = "s3"
+	GCP_CLOUD_STORAGE = "gcs"
+)
+
 type BatchCheckRequest struct {
 	Checks []string `json:"checks"`
 	Config *Config  `json:"config"`
@@ -44,13 +51,31 @@ type SSHUser struct {
 type FileSystem struct {
 	MountLocation string `json:"mount_location"`
 }
+
+type GcpServiceAccount struct {
+	Type                    string `json:"type"`
+	ProjectID               string `json:"project_id"`
+	PrivateKeyID            string `json:"private_key_id"`
+	PrivateKey              string `json:"private_key"`
+	ClientEmail             string `json:"client_email"`
+	ClientID                string `json:"client_id"`
+	AuthURI                 string `json:"auth_uri"`
+	TokenURI                string `json:"token_uri"`
+	AuthProviderX509CertURL string `json:"auth_provider_x509_cert_url"`
+	ClientX509CertURL       string `json:"client_x509_cert_url"`
+	UniverseDomain          string `json:"universe_domain"`
+}
+
 type ObjectStorage struct {
-	Endpoint   string `json:"endpoint"`
-	BucketName string `json:"bucket_name"`
-	BasePath   string `json:"base_path"`
-	AccessKey  string `json:"access_key"`
-	SecretKey  string `json:"secret_key"`
-	AWSRegion  string `json:"aws_region"`
+	Location                 string             `json:"location"`
+	Endpoint                 string             `json:"endpoint"`
+	BucketName               string             `json:"bucket_name"`
+	BasePath                 string             `json:"base_path"`
+	AccessKey                string             `json:"access_key"`
+	SecretKey                string             `json:"secret_key"`
+	AWSRegion                string             `json:"aws_region"`
+	GoogleServiceAccountFile string             `json:"google_service_account_file"`
+	GcpServiceAccount        *GcpServiceAccount `json:"gcp_service_account"`
 }
 type Backup struct {
 	FileSystem    *FileSystem    `json:"file_system"`
@@ -253,15 +278,39 @@ func (c *Config) populateCommonConfig(haConfig *config.HaDeployConfig) error {
 }
 
 func (c *Config) populateObjectStorageConfig(haConfig *config.HaDeployConfig) {
+	if haConfig == nil {
+		logrus.Errorln("haConfig cannot be nil")
+		return
+	}
+
 	objectStorageConfig := haConfig.GetObjectStorageConfig()
-	c.Backup = &Backup{
-		ObjectStorage: &ObjectStorage{
-			BucketName: objectStorageConfig.BucketName,
-			AWSRegion:  objectStorageConfig.Region,
-			AccessKey:  objectStorageConfig.AccessKey,
-			SecretKey:  objectStorageConfig.SecretKey,
-			Endpoint:   objectStorageConfig.Endpoint,
-		},
+	if objectStorageConfig.Location == "" {
+		logrus.Errorln("object storage location cannot be empty")
+		return
+	}
+
+	if objectStorageConfig.Location == AWS_S3 {
+		c.Backup = &Backup{
+			ObjectStorage: &ObjectStorage{
+				Location:   objectStorageConfig.Location,
+				BucketName: objectStorageConfig.BucketName,
+				AWSRegion:  objectStorageConfig.Region,
+				AccessKey:  objectStorageConfig.AccessKey,
+				SecretKey:  objectStorageConfig.SecretKey,
+				Endpoint:   objectStorageConfig.Endpoint,
+			},
+		}
+	} else if objectStorageConfig.Location == GCP_CLOUD_STORAGE {
+		c.Backup = &Backup{
+			ObjectStorage: &ObjectStorage{
+				Location:                 objectStorageConfig.Location,
+				BucketName:               objectStorageConfig.BucketName,
+				GoogleServiceAccountFile: objectStorageConfig.GoogleServiceAccountFile,
+			},
+		}
+	} else {
+		logrus.Errorf("invalid location: %s", objectStorageConfig.Location)
+		return
 	}
 }
 
diff --git a/components/automate-cli/pkg/verifyserver/models/gcpconfig.go b/components/automate-cli/pkg/verifyserver/models/gcpconfig.go
new file mode 100644
index 000000000..205d84876
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/models/gcpconfig.go
@@ -0,0 +1,11 @@
+package models
+
+type GCPCloudStorageConfigRequest struct {
+	BucketName               string             `json:"bucket_name"`
+	GoogleServiceAccountFile string             `json:"google_service_account_file"`
+	GcpServiceAccount        *GcpServiceAccount `json:"gcp_service_account"`
+}
+type GCPCloudStorageResponse struct {
+	Passed bool     `json:"passed"`
+	Checks []Checks `json:"checks"`
+}
diff --git a/components/automate-cli/pkg/verifyserver/server/api/v1/gcpcloudstorage.go b/components/automate-cli/pkg/verifyserver/server/api/v1/gcpcloudstorage.go
new file mode 100644
index 000000000..fbd71a280
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/server/api/v1/gcpcloudstorage.go
@@ -0,0 +1,91 @@
+package v1
+
+import (
+	"errors"
+	"fmt"
+
+	"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/response"
+	"github.com/gofiber/fiber/v2"
+)
+
+func (h *Handler) GetGCPCloudStorageConfig(c *fiber.Ctx) error {
+	var bucketAccess *models.Checks
+	var checks []models.Checks
+	gcpConfigRequest := new(models.GCPCloudStorageConfigRequest)
+	if err := c.BodyParser(&gcpConfigRequest); err != nil {
+		errString := fmt.Sprintf("GCP config request body parsing failed: %v", err.Error())
+		h.Logger.Error(fmt.Errorf(errString))
+		return fiber.NewError(fiber.StatusBadRequest, err.Error())
+	}
+
+	if res, err := CredentialsCheck(gcpConfigRequest); err != nil {
+		return c.JSON(response.BuildSuccessResponse(&models.GCPCloudStorageResponse{
+			Passed: false,
+			Checks: CredCheckErr(res, err),
+		}))
+	}
+
+	gcpConnection := h.GCPConfigService.GetGCPConnection(c.Context(), gcpConfigRequest)
+	if gcpConnection.Passed {
+		bucketAccess = h.GCPConfigService.GetBucketAccess(c.Context(), gcpConfigRequest)
+		checks = append(checks, []models.Checks{*gcpConnection, *bucketAccess}...)
+	} else {
+		checks = append(checks, *gcpConnection)
+	}
+
+	return c.JSON(response.BuildSuccessResponse(&models.GCPCloudStorageResponse{
+		Passed: gcpConnection.Passed && bucketAccess.Passed,
+		Checks: checks,
+	}))
+}
+
+func CredentialsCheck(cred *models.GCPCloudStorageConfigRequest) (string, error) {
+	if cred.GcpServiceAccount.Type == "" {
+		return constants.GCS_TYPE_MISSING_RESOLUTION, errors.New(constants.GCS_TYPE_MISSING)
+	}
+	if cred.GcpServiceAccount.ProjectID == "" {
+		return constants.GCS_PROJECT_ID_RESOLUTION, errors.New(constants.GCS_PROJECT_ID)
+	}
+	if cred.GcpServiceAccount.PrivateKeyID == "" {
+		return constants.GCS_PRIVATE_KEY_ID_RESOLUTION, errors.New(constants.GCS_PRIVATE_KEY_ID)
+	}
+	if cred.GcpServiceAccount.PrivateKey == "" {
+		return constants.GCS_PRIVATE_KEY_RESOLUTION, errors.New(constants.GCS_PRIVATE_KEY)
+	}
+	if cred.GcpServiceAccount.ClientEmail == "" {
+		return constants.GCS_CLIENT_EMAIL_RESOLUTION, errors.New(constants.GCS_CLIENT_EMAIL)
+	}
+	if cred.GcpServiceAccount.ClientID == "" {
+		return constants.GCS_CLIENT_ID_RESOLUTION, errors.New(constants.GCS_CLIENT_ID)
+	}
+	if cred.GcpServiceAccount.AuthURI == "" {
+		return constants.GCS_AUTH_URI_RESOLUTION, errors.New(constants.GCS_AUTH_URI)
+	}
+	if cred.GcpServiceAccount.TokenURI == "" {
+		return constants.GCS_TOKEN_URI_RESOLUTION, errors.New(constants.GCS_TOKEN_URI)
+	}
+	if cred.GcpServiceAccount.AuthProviderX509CertURL == "" {
+		return constants.GCS_AUTH_PROVIDER_x509_CERT_URL_RESOLUTION, errors.New(constants.GCS_AUTH_PROVIDER_x509_CERT_URL)
+	}
+	if cred.GcpServiceAccount.ClientX509CertURL == "" {
+		return constants.GCS_CLIENT_x509_CERT_URL_RESOLUTION, errors.New(constants.GCS_CLIENT_x509_CERT_URL)
+	}
+	if cred.GcpServiceAccount.UniverseDomain == "" {
+		return constants.GCS_UNIVERSAL_DOMAIN_RESOLUTION, errors.New(constants.GCS_UNIVERSAL_DOMAIN)
+	}
+	return "", nil
+}
+
+func CredCheckErr(resolution string, err error) []models.Checks {
+	return []models.Checks{
+		{
+			Title:         constants.GCP_CONNECTION_TITLE,
+			Passed:        false,
+			ErrorMsg:      err.Error(),
+			ResolutionMsg: resolution,
+		},
+	}
+}
diff --git a/components/automate-cli/pkg/verifyserver/server/api/v1/handler.go b/components/automate-cli/pkg/verifyserver/server/api/v1/handler.go
index ad6005a72..c0377f8d7 100644
--- a/components/automate-cli/pkg/verifyserver/server/api/v1/handler.go
+++ b/components/automate-cli/pkg/verifyserver/server/api/v1/handler.go
@@ -7,6 +7,7 @@ import (
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/externalpostgresqlservice"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/firewallservice"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/fqdnservice"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/hardwareresourcecount"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/mockserverservice"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/nfsmountservice"
@@ -40,6 +41,7 @@ type Handler struct {
 	FirewallService              firewallservice.IFirewallService
 	ValidateCertificateService   certificatevalidation.IValidateCertificateService
 	SshUserCheckService          sshusercheckservice.SshUserCheckService
+	GCPConfigService             gcpcloudstorageservice.GCPCloudStorageConfig
 }
 
 func NewHandler(logger logger.Logger) *Handler {
@@ -129,3 +131,8 @@ func (h *Handler) AddSshUserCheckService(ssu sshusercheckservice.SshUserCheckSer
 	h.SshUserCheckService = ssu
 	return h
 }
+
+func (h *Handler) AddGCSConfigService(ss gcpcloudstorageservice.GCPCloudStorageConfig) *Handler {
+	h.GCPConfigService = ss
+	return h
+}
diff --git a/components/automate-cli/pkg/verifyserver/server/routes.go b/components/automate-cli/pkg/verifyserver/server/routes.go
index c06fb62bb..e586aa2cd 100644
--- a/components/automate-cli/pkg/verifyserver/server/routes.go
+++ b/components/automate-cli/pkg/verifyserver/server/routes.go
@@ -26,6 +26,7 @@ func (vs *VerifyServer) SetupRoutes() {
 	apiChecksGroup.Post("/external-opensearch", vs.Handler.ExternalOpensearch)
 	apiChecksGroup.Post("/firewall", vs.Handler.FirewallCheck)
 	apiChecksGroup.Post("/aws-opensearch-s3-bucket-access", vs.Handler.CheckOSBackupS3)
+	apiChecksGroup.Post("/gcp-cloud-storage-config", vs.Handler.GetGCPCloudStorageConfig)
 
 	apiStartGroup := apiV1Group.Group("/start")
 	apiStartGroup.Post("/mock-server", vs.Handler.StartMockServer)
diff --git a/components/automate-cli/pkg/verifyserver/server/server.go b/components/automate-cli/pkg/verifyserver/server/server.go
index 449ecdfa4..18f157850 100644
--- a/components/automate-cli/pkg/verifyserver/server/server.go
+++ b/components/automate-cli/pkg/verifyserver/server/server.go
@@ -7,6 +7,7 @@ import (
 	"github.com/ansrivas/fiberprometheus/v2"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/fqdnservice"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice"
 
 	v1 "github.com/chef/automate/components/automate-cli/pkg/verifyserver/server/api/v1"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice"
@@ -16,6 +17,7 @@ import (
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/externalpostgresqlchecktrigger"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/firewallchecktrigger"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/fqdnchecktrigger"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/hardwareresourcechecktrigger"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/nfsmountbackupchecktrigger"
 	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/opensearchs3bucketaccesschecktrigger"
@@ -109,8 +111,9 @@ func NewVerifyServer(port string, debug bool) (*VerifyServer, error) {
 				softwareversionchecktrigger.NewSoftwareVersionCheck(l, port),
 				systemresourcechecktrigger.NewSystemResourceCheck(l, port),
 				systemuserchecktrigger.NewSystemUserCheck(l, port),
+				gcsbackupchecktrigger.NewGcsBackupConfigCheck(l, port),
 			), l, port)).
-		AddNFSMountService(nfsmountservice.NewNFSMountService(l, port, httputils.NewClient(l),systemresource.NewSystemResourceInfoImpl())).
+		AddNFSMountService(nfsmountservice.NewNFSMountService(l, port, httputils.NewClient(l), systemresource.NewSystemResourceInfoImpl())).
 		AddHardwareResourceCountService(hardwareresourcecount.NewHardwareResourceCountService(l)).
 		AddSoftwareVersionService(softwareversionservice.NewSoftwareVersionService(l, fiberutils.CheckPath)).
 		AddSystemResourceService(systemresourceservice.NewSystemResourceService(l, systemresource.NewSystemResourceInfoImpl(), &fileutils.FileSystemUtils{})).
@@ -124,7 +127,9 @@ func NewVerifyServer(port string, debug bool) (*VerifyServer, error) {
 		AddFqdnService(fqdnservice.NewFqdnService(l, constants.TIMEOUT)).
 		AddFirewallService(firewallservice.NewFirewallService(l, constants.TIMEOUT, port)).
 		AddCertificateValidation(certificatevalidation.NewValidateCertificateService(l)).
-		AddSshUserCheckService(sshusercheckservice.NewSshUserCheckService(l, fileutils.NewFileSystemUtils(), sshutils.NewSSHUtil(sshutils.NewSshClient(), l)))
+		AddSshUserCheckService(sshusercheckservice.NewSshUserCheckService(l, fileutils.NewFileSystemUtils(), sshutils.NewSSHUtil(sshutils.NewSshClient(), l))).
+		AddGCSConfigService(gcpcloudstorageservice.NewGCPCloudStorageConfig(l))
+
 	vs := &VerifyServer{
 		Port:    port,
 		Log:     l,
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice.go
index c051808e1..5d0fefb57 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice.go
@@ -478,6 +478,8 @@ func (ss *BatchCheckService) getCheckInstance(check string) trigger.ICheck {
 		return ss.checkTrigger.ExternalPostgresCheck
 	case constants.NFS_BACKUP_CONFIG:
 		return ss.checkTrigger.NfsBackupConfigCheck
+	case constants.GCP_BACKUP_CONFIG:
+		return ss.checkTrigger.GCPBackupConfigCheck
 	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 d1652034a..2c2052566 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservicemock.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservicemock.go
@@ -406,3 +406,29 @@ func SetupMockSystemUserCheck() trigger.ICheck {
 		},
 	}
 }
+
+type MockGCPBackupConfigCheck struct {
+	GCPBackupConfigCheckFunc  func(config *models.Config) []models.CheckTriggerResponse
+	GetPortsForMockServerFunc func() map[string]map[string][]int
+}
+
+func (mss *MockGCPBackupConfigCheck) Run(config *models.Config) []models.CheckTriggerResponse {
+	return mss.GCPBackupConfigCheckFunc(config)
+}
+
+func (mss *MockGCPBackupConfigCheck) GetPortsForMockServer() map[string]map[string][]int {
+	return mss.GetPortsForMockServerFunc()
+}
+
+func SetupMockGCPBackupConfigCheck() trigger.ICheck {
+	return &MockGCPBackupConfigCheck{
+		GCPBackupConfigCheckFunc: 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
+		},
+	}
+}
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 2657fa9e2..13dd3d09a 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/checktrigger.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/checktrigger.go
@@ -18,13 +18,14 @@ type CheckTrigger struct {
 	SoftwareVersionCheck          ICheck
 	SystemResourceCheck           ICheck
 	SystemUserCheck               ICheck
+	GCPBackupConfigCheck          ICheck
 }
 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 {
+func NewCheckTrigger(hrc, sshC, cert, eop, epc, fc, fqdn, nfs, os3, s3b, svc, src, suc, gcpb ICheck) CheckTrigger {
 	return CheckTrigger{
 		HardwareResourceCountCheck:    hrc,
 		SshUserAccessCheck:            sshC,
@@ -39,5 +40,6 @@ func NewCheckTrigger(hrc, sshC, cert, eop, epc, fc, fqdn, nfs, os3, s3b, svc, sr
 		SoftwareVersionCheck:          svc,
 		SystemResourceCheck:           src,
 		SystemUserCheck:               suc,
+		GCPBackupConfigCheck:          gcpb,
 	}
 }
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/gcsbackupconfigchecktrigger.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/gcsbackupconfigchecktrigger.go
new file mode 100644
index 000000000..b7ad039fa
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/gcsbackupconfigchecktrigger.go
@@ -0,0 +1,157 @@
+package gcsbackupchecktrigger
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	"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/checkutils"
+	"github.com/chef/automate/lib/io/fileutils"
+	"github.com/chef/automate/lib/logger"
+)
+
+type GcsBackupConfigCheck struct {
+	log  logger.Logger
+	port string
+}
+
+func NewGcsBackupConfigCheck(log logger.Logger, port string) *GcsBackupConfigCheck {
+	return &GcsBackupConfigCheck{
+		log:  log,
+		port: port,
+	}
+}
+
+func (svc *GcsBackupConfigCheck) Run(config *models.Config) []models.CheckTriggerResponse {
+	if config.Hardware == nil {
+		return []models.CheckTriggerResponse{
+			trigger.SkippedTriggerCheckResp("-", constants.GCP_BACKUP_CONFIG, constants.AUTOMATE, constants.SKIP_MISSING_HARDWARE_MESSAGE),
+		}
+	}
+
+	if config.Backup == nil || config.Backup.ObjectStorage == nil || config.Backup.ObjectStorage.Location != "gcs" {
+		return GcsConfigSkippedResponse(config, constants.GCP_BACKUP_CONFIG, constants.SKIP_BACKUP_TEST_MESSAGE_GCS)
+	}
+
+	if !isGcsStorage(config) {
+		return emptyResp(config, constants.GCP_BACKUP_CONFIG)
+	}
+	err := readGCSConfigFile(config)
+	if err != nil {
+		return errorResp(config, constants.GCP_BACKUP_CONFIG, err)
+	}
+	req := getGCSCheckRequest(config.Backup.ObjectStorage)
+	return runCheckForGCSConfig(config.Hardware.AutomateNodeIps, svc.log, svc.port, http.MethodPost, req)
+}
+
+func GcsConfigSkippedResponse(config *models.Config, checkType, message string) []models.CheckTriggerResponse {
+	var triggerResps []models.CheckTriggerResponse
+
+	for _, ip := range config.Hardware.AutomateNodeIps {
+		triggerResps = append(triggerResps, trigger.SkippedTriggerCheckResp(ip, checkType, constants.AUTOMATE, message))
+	}
+
+	for _, ip := range config.Hardware.ChefInfraServerNodeIps {
+		triggerResps = append(triggerResps, trigger.SkippedTriggerCheckResp(ip, checkType, constants.CHEF_INFRA_SERVER, message))
+	}
+
+	return triggerResps
+}
+
+func (ss *GcsBackupConfigCheck) GetPortsForMockServer() map[string]map[string][]int {
+	nodeTypePortMap := make(map[string]map[string][]int)
+	return nodeTypePortMap
+}
+
+// runCheckForGCSConfig triggers the API on gives node automate nodes only for validating GCS backup config
+func runCheckForGCSConfig(nodeIps []string, log logger.Logger, port string, method string, reqBody models.GCPCloudStorageConfigRequest) []models.CheckTriggerResponse {
+	log.Debugf("Triggering the api call for automate nodes only for Gcp backup config")
+	outputCh := make(chan models.CheckTriggerResponse)
+	for _, ip := range nodeIps {
+		log.Debugf("Triggering api %s for the node %s", constants.GCP_CLOUD_STORAGE_CONFIG_API_PATH, ip)
+		endpoint := checkutils.PrepareEndPoint(ip, port, constants.GCP_CLOUD_STORAGE_CONFIG_API_PATH)
+		go trigger.TriggerCheckAPI(endpoint, ip, constants.AUTOMATE, method, outputCh, reqBody)
+	}
+
+	response := getResultFromOutputChan(len(nodeIps), outputCh)
+	close(outputCh)
+	return response
+}
+
+// getResultFromOutputChan gets the result from output channel
+func getResultFromOutputChan(reqList int, outputCh chan models.CheckTriggerResponse) []models.CheckTriggerResponse {
+	var result []models.CheckTriggerResponse
+
+	for i := 0; i < reqList; i++ {
+		res := <-outputCh
+		result = append(result, res)
+	}
+
+	return result
+}
+
+func getGCSCheckRequest(object *models.ObjectStorage) models.GCPCloudStorageConfigRequest {
+	//passing a default value if GCS bucket path not provided
+	if object.BasePath == "" {
+		object.BasePath = "automate"
+	}
+	return models.GCPCloudStorageConfigRequest{
+		BucketName:               object.BucketName,
+		GoogleServiceAccountFile: object.GoogleServiceAccountFile,
+		GcpServiceAccount: &models.GcpServiceAccount{
+			Type:                    object.GcpServiceAccount.Type,
+			ProjectID:               object.GcpServiceAccount.ProjectID,
+			PrivateKeyID:            object.GcpServiceAccount.PrivateKeyID,
+			PrivateKey:              object.GcpServiceAccount.PrivateKey,
+			ClientEmail:             object.GcpServiceAccount.ClientEmail,
+			ClientID:                object.GcpServiceAccount.ClientID,
+			AuthURI:                 object.GcpServiceAccount.AuthURI,
+			TokenURI:                object.GcpServiceAccount.TokenURI,
+			AuthProviderX509CertURL: object.GcpServiceAccount.AuthProviderX509CertURL,
+			ClientX509CertURL:       object.GcpServiceAccount.ClientX509CertURL,
+			UniverseDomain:          object.GcpServiceAccount.UniverseDomain,
+		},
+	}
+}
+
+func isGcsStorage(config *models.Config) bool {
+	backup := config.Backup
+	return backup.ObjectStorage.BucketName != "" || backup.ObjectStorage.GoogleServiceAccountFile != ""
+}
+
+func emptyResp(config *models.Config, checktype string) []models.CheckTriggerResponse {
+	resps := []models.CheckTriggerResponse{}
+	for _, ip := range config.Hardware.AutomateNodeIps {
+		resps = append(resps, trigger.ErrTriggerCheckResp(ip, checktype, constants.AUTOMATE, constants.GCS_BACKUP_MISSING))
+	}
+
+	return resps
+}
+
+func errorResp(config *models.Config, checktype string, err error) []models.CheckTriggerResponse {
+	resps := []models.CheckTriggerResponse{}
+	for _, ip := range config.Hardware.AutomateNodeIps {
+		resps = append(resps, trigger.ErrTriggerCheckResp(ip, checktype, constants.AUTOMATE, "Json File is empty or Incorrect Json File"))
+	}
+
+	return resps
+}
+
+func readGCSConfigFile(config *models.Config) error {
+	fileUtils := &fileutils.FileSystemUtils{}
+	gcpServiceAccount := config.Backup.ObjectStorage.GcpServiceAccount
+	filepath, err := fileUtils.ReadFile(config.Backup.ObjectStorage.GoogleServiceAccountFile)
+	if err != nil {
+		return fmt.Errorf("error reading Json file: %w", err)
+	}
+	err = json.Unmarshal(filepath, &gcpServiceAccount)
+	if err != nil {
+		return fmt.Errorf("error unmarshalling Json file: %w", err)
+	}
+	config.Backup.ObjectStorage.GcpServiceAccount = gcpServiceAccount
+	return nil
+
+}
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 e25a05272..71bfa5665 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
@@ -29,7 +29,7 @@ func (svc *S3BackupConfigCheck) Run(config *models.Config) []models.CheckTrigger
 		}
 	}
 
-	if config.Backup == nil || config.Backup.ObjectStorage == nil {
+	if config.Backup == nil || config.Backup.ObjectStorage == nil || (config.Backup.ObjectStorage.Location != "s3" && config.Backup.ObjectStorage.Location != "") {
 		return s3ConfigSkippedResponse(config, constants.S3_BACKUP_CONFIG, constants.SKIP_BACKUP_TEST_MESSAGE_S3)
 	}
 
diff --git a/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice/gcpconfigservice.go b/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice/gcpconfigservice.go
new file mode 100644
index 000000000..83334eeb6
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice/gcpconfigservice.go
@@ -0,0 +1,152 @@
+package gcpcloudstorageservice
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+
+	"google.golang.org/api/iterator"
+	"google.golang.org/api/option"
+
+	"cloud.google.com/go/storage"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/models"
+	"github.com/chef/automate/lib/logger"
+	"github.com/google/uuid"
+	"github.com/pkg/errors"
+)
+
+type GCPCloudStorageConfig interface {
+	GetGCPConnection(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks
+	GetBucketAccess(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks
+}
+
+type GCPConfigService struct {
+	Logger   logger.Logger
+	Req      *models.GCPCloudStorageConfigRequest
+	GCPUtils GCPUtils
+}
+
+func NewGCPCloudStorageConfig(logger logger.Logger) GCPCloudStorageConfig {
+	return &GCPConfigService{
+		Logger:   logger,
+		GCPUtils: NewGCPUtils(logger),
+	}
+}
+
+func (ss *GCPConfigService) GetGCPConnection(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks {
+	ss.Req = req
+	client, err := ss.GCPUtils.NewSessionWithOptions(ctx, ss.Req.GcpServiceAccount)
+	if err != nil {
+		ss.Logger.Errorf("error while creating a client: %v", err)
+		return ss.Response(constants.GCP_CONNECTION_TITLE, "", errors.Wrap(err, constants.GCP_CONNECTION_ERROR_MSG).Error(), constants.GCP_CONNECTION_RESOLUTION_MSG, false)
+	}
+
+	defer client.Close()
+	bucket := client.Bucket(ss.Req.BucketName)
+	err = ss.GCPUtils.BucketAttributes(ctx, bucket)
+	if err != nil {
+		return ss.Response(constants.GCP_CONNECTION_TITLE, "", errors.Wrap(err, constants.GCP_BUCKET_NOT_FOUND).Error(), constants.GCP_CONNECTION_RESOLUTION_GENERAL_MSG, false)
+	}
+
+	return ss.Response(constants.GCP_CONNECTION_TITLE, constants.GCP_CONNECTION_SUCCESS_MSG, "", "", true)
+}
+
+func (ss *GCPConfigService) GetBucketAccess(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks {
+	ss.Req = req
+	client, err := ss.GCPUtils.NewSessionWithOptions(ctx, ss.Req.GcpServiceAccount)
+	if err != nil {
+		ss.Logger.Errorf("error while creating a client: %v", err)
+		return ss.Response(constants.GCP_CONNECTION_TITLE, "", errors.Wrap(err, constants.GCP_CONNECTION_ERROR_MSG).Error(), constants.GCP_CONNECTION_RESOLUTION_MSG, false)
+	}
+
+	// Upload data in GCP bucket
+	uniqueID := uuid.New().String()
+	fileName := constants.GCP_CHECK_FILE_PREFIX + uniqueID + ".txt"
+	bucket := client.Bucket(ss.Req.BucketName)
+	obj := bucket.Object(fileName)
+	if err := ss.GCPUtils.NewUploader(ctx, obj); err != nil {
+		ss.Logger.Errorf("Error uploading the objects")
+		return ss.Response(constants.GCP_CONNECTION_TITLE, "", errors.Wrap(err, constants.GCP_BUCKET_UPLOAD_ERROR_MSG).Error(), constants.GCP_BUCKET_UPLOAD_RESOLUTION_MSG, false)
+	}
+
+	// read/list data in GCP bucket
+	query := &storage.Query{Prefix: constants.GCP_CHECK_FILE_PREFIX}
+	if err := ss.GCPUtils.ListObjects(ctx, bucket, query); err != nil {
+		ss.Logger.Errorf("Error listing the objects")
+		return ss.Response(constants.GCP_CONNECTION_TITLE, "", errors.Wrap(err, constants.GCP_BUCKET_LIST_ERROR_MSG).Error(), constants.GCP_BUCKET_LIST_RESOLUTION_MSG, false)
+	}
+
+	// Delete data in GCP bucket
+	if err := ss.GCPUtils.DeleteObject(ctx, obj); err != nil {
+		ss.Logger.Errorf("Error deleting the objects")
+		return ss.Response(constants.GCP_CONNECTION_TITLE, "", errors.Wrap(err, constants.GCP_BUCKET_DELETE_ERROR_MSG).Error(), constants.GCP_BUCKET_DELETE_RESOLUTION_MSG, false)
+	}
+
+	return ss.Response(constants.GCP_BUCKET_ACCESS_TITLE, constants.GCP_CONNECTION_SUCCESS_MSG, "", "", true)
+}
+
+func (ss *GCPConfigService) Response(Title, SuccessMsg, ErrorMsg, ResolutionMsg string, Passed bool) *models.Checks {
+	return &models.Checks{
+		Title:         Title,
+		Passed:        Passed,
+		SuccessMsg:    SuccessMsg,
+		ErrorMsg:      ErrorMsg,
+		ResolutionMsg: ResolutionMsg,
+	}
+}
+
+type GCPUtils interface {
+	NewSessionWithOptions(ctx context.Context, gsa *models.GcpServiceAccount) (*storage.Client, error)
+	DeleteObject(ctx context.Context, obj *storage.ObjectHandle) error
+	ListObjects(ctx context.Context, bucket *storage.BucketHandle, query *storage.Query) error
+	NewUploader(ctx context.Context, obj *storage.ObjectHandle) error
+	BucketAttributes(ctx context.Context, bucket *storage.BucketHandle) error
+}
+
+func NewGCPUtils(logger logger.Logger) *GCPUtilsImpl {
+	return &GCPUtilsImpl{
+		Logger: logger,
+	}
+}
+
+type GCPUtilsImpl struct {
+	Logger logger.Logger
+}
+
+func (au *GCPUtilsImpl) NewSessionWithOptions(ctx context.Context, gsa *models.GcpServiceAccount) (*storage.Client, error) {
+	bx, _ := json.Marshal(gsa)
+	return storage.NewClient(ctx, option.WithCredentialsJSON(bx))
+}
+
+func (au *GCPUtilsImpl) NewUploader(ctx context.Context, uploadObject *storage.ObjectHandle) error {
+	wc := uploadObject.NewWriter(ctx)
+	_, err := fmt.Fprintf(wc, "test message")
+	if err != nil {
+		return err
+	}
+	return wc.Close()
+}
+
+func (au *GCPUtilsImpl) DeleteObject(ctx context.Context, obj *storage.ObjectHandle) error {
+	return obj.Delete(ctx)
+}
+
+func (au *GCPUtilsImpl) ListObjects(ctx context.Context, bucket *storage.BucketHandle, query *storage.Query) error {
+	it := bucket.Objects(ctx, query)
+	for attrs, err := it.Next(); err != iterator.Done; attrs, err = it.Next() {
+		if err != nil {
+			au.Logger.Errorf("Error listing the objects")
+			return err
+		}
+		au.Logger.Debug("Objects in the bucket", attrs.Name)
+	}
+	return nil
+}
+
+func (au *GCPUtilsImpl) BucketAttributes(ctx context.Context, bucket *storage.BucketHandle) error {
+	if _, err := bucket.Attrs(ctx); err != nil {
+		return err
+	}
+	return nil
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice/mockgcpconfigservice.go b/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice/mockgcpconfigservice.go
new file mode 100644
index 000000000..ff2ff4208
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice/mockgcpconfigservice.go
@@ -0,0 +1,20 @@
+package gcpcloudstorageservice
+
+import (
+	"context"
+
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/models"
+)
+
+type MockGCPCloudStorageConfig struct {
+	GetGCPConnectionFunc func(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks
+	GetBucketAccessFunc  func(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks
+}
+
+func (msc *MockGCPCloudStorageConfig) GetGCPConnection(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks {
+	return msc.GetGCPConnectionFunc(ctx, req)
+}
+
+func (msc *MockGCPCloudStorageConfig) GetBucketAccess(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks {
+	return msc.GetBucketAccessFunc(ctx, req)
+}
diff --git a/components/docs-chef-io/content/automate/users.md b/components/docs-chef-io/content/automate/users.md
index c572648b9..ed5f3069f 100644
--- a/components/docs-chef-io/content/automate/users.md
+++ b/components/docs-chef-io/content/automate/users.md
@@ -30,6 +30,7 @@ Navigate to _Users_ in the **Settings** tab. Select the **Create User** button,
 
 ![Add Local User](/images/automate/admin-tab-users-list.png)
 
+Please attach the policy to the new users before their first login, and refer to it [Attached policies]({{< relref "policies.md#adding-members-to-policies" >}}).
 ### Changing Display Names
 
 Navigate to _Users_ in the **Settings** tab and locate the user who needs their display name changed. Navigate to their user page, provide a new display name, and select the **Save** button.
diff --git a/cspell.json b/cspell.json
index 4fc868d0e..acf27f76d 100644
--- a/cspell.json
+++ b/cspell.json
@@ -142,7 +142,6 @@
         "dups",
         "eaaccess",
         "EAS",
-        "opensearch",
         "elif",
         "EMEA",
         "endpt",
@@ -241,6 +240,7 @@
         "heapsize",
         "helpdesk",
         "heroku",
+        "Heute",
         "histo",
         "horiz",
         "htmlhint",
@@ -373,6 +373,7 @@
         "onwriteend",
         "onwritestart",
         "openapi",
+        "opensearch",
         "openssh",
         "openssl",
         "opscode",
diff --git a/go.mod b/go.mod
index 695b6e972..6f321cb75 100644
--- a/go.mod
+++ b/go.mod
@@ -120,7 +120,7 @@ require github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirec
 
 require (
 	cloud.google.com/go v0.65.0 // indirect
-	cloud.google.com/go/storage v1.10.0 // indirect
+	cloud.google.com/go/storage v1.10.0
 	github.com/Azure/go-autorest v14.2.0+incompatible // indirect
 	github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 // indirect
 	github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
diff --git a/lib/config/genconfig/hadeployconfig.go b/lib/config/genconfig/hadeployconfig.go
index b7cc8ca8a..006a4dd02 100644
--- a/lib/config/genconfig/hadeployconfig.go
+++ b/lib/config/genconfig/hadeployconfig.go
@@ -1030,14 +1030,30 @@ func (c *HaDeployConfigGen) DefaultExistingInfraValues() {
 }
 
 func (c *HaDeployConfigGen) PromptBackup() (err error) {
-	isBackupNeeded, err := c.Prompt.Confirm("Configured backup during deployment", "yes", "no")
+	var isBackupNeeded bool
+	if c.Config.External == nil || c.Config.External.Database.Type != "self-managed" {
+		isBackupNeeded, err = c.Prompt.Confirm("Configured backup during deployment", "yes", "no")
+	}
 	if isBackupNeeded {
 		c.Config.InitArchitecture().InitExistingInfra().BackupMount = "/mnt/automate_backups"
-		_, backupOption, err1 := c.Prompt.Select("Choose backup option", AWS_S3, MINIO, OBJECT_STORE, GOOGLE_BUCKET, FILE_SYSTEM, NFS, EFS)
-		if err1 != nil {
-			return err1
-		}
+		c.Config.InitExternal().InitDatabase()
 		backupConfig := ""
+		backupOption := ""
+		var err1 error
+		if c.Config.External != nil && c.Config.External.Database.Type == "aws" {
+			_, backupOption, err1 = c.Prompt.Select("Choose backup option", AWS_S3)
+			if err1 != nil {
+				return err1
+			}
+		}
+
+		if c.Config.External == nil || c.Config.External.Database.Type != "aws" {
+			_, backupOption, err1 = c.Prompt.Select("Choose backup option", AWS_S3, MINIO, OBJECT_STORE, GOOGLE_BUCKET, FILE_SYSTEM, NFS, EFS)
+			if err1 != nil {
+				return err1
+			}
+		}
+
 		switch backupOption {
 		case AWS_S3, MINIO, OBJECT_STORE, GOOGLE_BUCKET:
 			backupConfig = "object_storage"
diff --git a/lib/config/hadeployconfig.go b/lib/config/hadeployconfig.go
index 7af1ebee2..026ace7e7 100644
--- a/lib/config/hadeployconfig.go
+++ b/lib/config/hadeployconfig.go
@@ -7,6 +7,11 @@ import (
 	ptoml "github.com/pelletier/go-toml"
 )
 
+const (
+	AWS_S3      = "s3"
+	GCS_STORAGE = "gcs"
+)
+
 type HaDeployConfig struct {
 	Architecture  *Architecture          `toml:"architecture,omitempty"`
 	ObjectStorage *ObjectStorage         `toml:"object_storage,omitempty"`
@@ -19,6 +24,20 @@ type HaDeployConfig struct {
 	External      *ExternalSettings      `toml:"external,omitempty"`
 }
 
+type GcpServiceAccount struct {
+	Type                    string `json:"type"`
+	ProjectID               string `json:"project_id"`
+	PrivateKeyID            string `json:"private_key_id"`
+	PrivateKey              string `json:"private_key"`
+	ClientEmail             string `json:"client_email"`
+	ClientID                string `json:"client_id"`
+	AuthURI                 string `json:"auth_uri"`
+	TokenURI                string `json:"token_uri"`
+	AuthProviderX509CertURL string `json:"auth_provider_x509_cert_url"`
+	ClientX509CertURL       string `json:"client_x509_cert_url"`
+	UniverseDomain          string `json:"universe_domain"`
+}
+
 type Architecture struct {
 	ExistingInfra *ConfigInitials `toml:"existing_infra,omitempty"`
 	Aws           *ConfigInitials `toml:"aws,omitempty"`
@@ -54,13 +73,14 @@ type CertByIP struct {
 }
 
 type ConfigObjectStorage struct {
-	BucketName               string `toml:"bucket_name,omitempty"`
-	AccessKey                string `toml:"access_key,omitempty"`
-	SecretKey                string `toml:"secret_key,omitempty"`
-	Endpoint                 string `toml:"endpoint,omitempty"`
-	Region                   string `toml:"region,omitempty"`
-	Location                 string `toml:"location,omitempty"`
-	GoogleServiceAccountFile string `toml:"google_service_account_file,omitempty"`
+	Location                 string             `toml:"location,omitempty"`
+	BucketName               string             `toml:"bucket_name,omitempty"`
+	AccessKey                string             `toml:"access_key,omitempty"`
+	SecretKey                string             `toml:"secret_key,omitempty"`
+	Endpoint                 string             `toml:"endpoint,omitempty"`
+	Region                   string             `toml:"region,omitempty"`
+	GoogleServiceAccountFile string             `toml:"google_service_account_file"`
+	GcpServiceAccount        *GcpServiceAccount `toml:"gcp_service_account,omitempty"`
 }
 
 type AutomateSettings struct {
diff --git a/lib/config/hadeployconfigverify.go b/lib/config/hadeployconfigverify.go
index e9b0338c6..67eee5024 100644
--- a/lib/config/hadeployconfigverify.go
+++ b/lib/config/hadeployconfigverify.go
@@ -6,6 +6,7 @@ import (
 )
 
 func (c *HaDeployConfig) Verify() error {
+
 	errorList := list.New()
 
 	if !c.IsValidHaDeployConfig() {
@@ -174,20 +175,23 @@ func (c *HaDeployConfig) validateAwsBackupConfig() error {
 
 func (c *HaDeployConfig) verifyObjectStorage(objectStorage *ConfigObjectStorage) error {
 	errorList := list.New()
-	if err := validateRequiredString(objectStorage.AccessKey, "access_key"); err != nil {
-		errorList.PushBack(err)
-	}
-	if err := validateRequiredString(objectStorage.SecretKey, "secret_key"); err != nil {
-		errorList.PushBack(err)
+
+	if c.IsExternalDb() {
+		if err := validateRequiredString(objectStorage.Location, "location", "s3"); err != nil {
+			return err
+		}
 	}
+
 	if err := validateRequiredString(objectStorage.BucketName, "bucket_name"); err != nil {
 		errorList.PushBack(err)
 	}
-	if err := validateS3Endpoint(objectStorage.Endpoint); err != nil {
-		errorList.PushBack(err)
+	if objectStorage.Location == GCS_STORAGE {
+		if err := validateRequiredPathField(objectStorage.GoogleServiceAccountFile, "google_service_account_file"); err != nil {
+			errorList.PushBack(err)
+		}
 	}
-	if objectStorage.Region != "" {
-		if err := validateS3AWSRegion(objectStorage.Region); err != nil {
+	if objectStorage.Location == AWS_S3 {
+		if err := verifyS3(objectStorage); err != nil {
 			errorList.PushBack(err)
 		}
 	}
@@ -715,3 +719,22 @@ func awsChefSettings(aws *ConfigAwsSettings) error {
 
 	return getSingleErrorFromList(errorList)
 }
+
+func verifyS3(objectStorage *ConfigObjectStorage) error {
+	errorList := list.New()
+	if err := validateRequiredString(objectStorage.AccessKey, "access_key"); err != nil {
+		errorList.PushBack(err)
+	}
+	if err := validateRequiredString(objectStorage.SecretKey, "secret_key"); err != nil {
+		errorList.PushBack(err)
+	}
+	if err := validateS3Endpoint(objectStorage.Endpoint); err != nil {
+		errorList.PushBack(err)
+	}
+	if objectStorage.Region != "" {
+		if err := validateS3AWSRegion(objectStorage.Region); err != nil {
+			errorList.PushBack(err)
+		}
+	}
+	return getSingleErrorFromList(errorList)
+}


Test patch:
diff --git a/components/automate-cli/cmd/chef-automate/deployedConfig_test.go b/components/automate-cli/cmd/chef-automate/deployedConfig_test.go
index c317beed1..3da45d2ea 100644
--- a/components/automate-cli/cmd/chef-automate/deployedConfig_test.go
+++ b/components/automate-cli/cmd/chef-automate/deployedConfig_test.go
@@ -132,11 +132,13 @@ var existingInfraConfig = &ExistingInfraConfigToml{
 	},
 	ObjectStorage: ObjectStorageToml{
 		Config: ObjectStorageConfigToml{
-			AccessKey:  "existing-access-key",
-			BucketName: "existing-bucket",
-			Endpoint:   "existing-endpoint",
-			Region:     "existing-region",
-			SecretKey:  "existing-secret-key",
+			AccessKey:                "existing-access-key",
+			BucketName:               "existing-bucket",
+			Endpoint:                 "existing-endpoint",
+			Region:                   "existing-region",
+			SecretKey:                "existing-secret-key",
+			Location:                 "gcs",
+			GoogleServiceAccountFile: "googleServiceAccount.json",
 		},
 	},
 }
@@ -489,7 +491,6 @@ func TestCopyCertsByIP(t *testing.T) {
 func TestCopyExistingInfra(t *testing.T) {
 
 	haDeployConfig := CopyExistingInfra(existingInfraConfig)
-
 	assert.Equal(t, "existing-ssh-user", haDeployConfig.Architecture.ExistingInfra.SSHUser)
 	assert.Equal(t, "existing-architecture", haDeployConfig.Architecture.ExistingInfra.Architecture)
 	assert.Equal(t, "object_storage", haDeployConfig.Architecture.ExistingInfra.BackupConfig)
@@ -576,6 +577,8 @@ func TestCopyExistingInfra(t *testing.T) {
 	assert.Equal(t, "existing-endpoint", haDeployConfig.ObjectStorage.Config.Endpoint)
 	assert.Equal(t, "existing-region", haDeployConfig.ObjectStorage.Config.Region)
 	assert.Equal(t, "existing-secret-key", haDeployConfig.ObjectStorage.Config.SecretKey)
+	assert.Equal(t, "gcs", haDeployConfig.ObjectStorage.Config.Location)
+	assert.Equal(t, "googleServiceAccount.json", haDeployConfig.ObjectStorage.Config.GoogleServiceAccountFile)
 
 }
 
diff --git a/components/automate-cli/pkg/verifyserver/constants/checkconstant_test.go b/components/automate-cli/pkg/verifyserver/constants/checkconstant_test.go
index d48c96d85..6fcedb360 100644
--- a/components/automate-cli/pkg/verifyserver/constants/checkconstant_test.go
+++ b/components/automate-cli/pkg/verifyserver/constants/checkconstant_test.go
@@ -17,7 +17,7 @@ func TestGetBastionChecks(t *testing.T) {
 
 func TestGetRemoteChecks(t *testing.T) {
 	resp := GetRemoteChecks()
-	assert.Equal(t, len(resp), 10)
+	assert.Equal(t, len(resp), 11)
 	assert.Contains(t, resp, SYSTEM_RESOURCES)
 	assert.Contains(t, resp, SOFTWARE_VERSIONS)
 	assert.Contains(t, resp, SYSTEM_USER)
@@ -28,6 +28,7 @@ func TestGetRemoteChecks(t *testing.T) {
 	assert.Contains(t, resp, AWS_OPENSEARCH_S3_BUCKET_ACCESS)
 	assert.Contains(t, resp, EXTERNAL_POSTGRESQL)
 	assert.Contains(t, resp, NFS_BACKUP_CONFIG)
+	assert.Contains(t, resp, GCP_BACKUP_CONFIG)
 }
 
 func TestGetCheckMessageByName(t *testing.T) {
@@ -96,6 +97,11 @@ func TestGetCheckMessageByName(t *testing.T) {
 		assert.Equal(t, resp, NFS_BACKUP_CONFIG_MSG)
 	})
 
+	t.Run("Get GCP_BACKUP_CONFIG_MSG", func(t *testing.T) {
+		resp := GetCheckMessageByName(GCP_BACKUP_CONFIG)
+		assert.Equal(t, resp, GCP_BACKUP_CONFIG_MSG)
+	})
+
 	t.Run("Get Empty MSG", func(t *testing.T) {
 		resp := GetCheckMessageByName("random-string")
 		assert.Equal(t, resp, "")
diff --git a/components/automate-cli/pkg/verifyserver/models/batchcheck_test.go b/components/automate-cli/pkg/verifyserver/models/batchcheck_test.go
index 9528f6d4f..9c4e054ae 100644
--- a/components/automate-cli/pkg/verifyserver/models/batchcheck_test.go
+++ b/components/automate-cli/pkg/verifyserver/models/batchcheck_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/chef/automate/lib/config"
 	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 )
 
 var (
@@ -632,3 +633,118 @@ func TestPopulateWith(t *testing.T) {
 		})
 	}
 }
+
+func TestPopulateObjectStorageConfig(t *testing.T) {
+	t.Run("Nil Config", func(t *testing.T) {
+		mockConfig := &Config{}
+		mockConfig.populateObjectStorageConfig(nil)
+		require.Empty(t, mockConfig)
+	})
+	t.Run("Empty Location", func(t *testing.T) {
+		mockHaDeployConfig := &config.HaDeployConfig{
+			ObjectStorage: &config.ObjectStorage{
+				Config: &config.ConfigObjectStorage{
+					BucketName: "dummybucket",
+					AccessKey:  "access",
+					SecretKey:  "secret",
+					Endpoint:   "endpoint",
+					Region:     "Somewhere",
+				},
+			},
+			Architecture: &config.Architecture{
+				Aws: &config.ConfigInitials{
+					SSHUser: "ec2-user",
+				},
+				ExistingInfra: &config.ConfigInitials{
+					SSHUser: "ec2-user",
+				},
+			},
+		}
+		mockConfig := &Config{}
+		mockConfig.populateObjectStorageConfig(mockHaDeployConfig)
+		require.Empty(t, mockConfig)
+	})
+	t.Run("Not Supported Location", func(t *testing.T) {
+		mockHaDeployConfig := &config.HaDeployConfig{
+			ObjectStorage: &config.ObjectStorage{
+				Config: &config.ConfigObjectStorage{
+					Location:   "Azure",
+					BucketName: "dummybucket",
+					AccessKey:  "access",
+					SecretKey:  "secret",
+					Endpoint:   "endpoint",
+					Region:     "Somewhere",
+				},
+			},
+			Architecture: &config.Architecture{
+				Aws: &config.ConfigInitials{
+					SSHUser: "ec2-user",
+				},
+				ExistingInfra: &config.ConfigInitials{
+					SSHUser: "ec2-user",
+				},
+			},
+		}
+		mockConfig := &Config{}
+		mockConfig.populateObjectStorageConfig(mockHaDeployConfig)
+		require.Empty(t, mockConfig)
+	})
+
+	t.Run("Valid Config S3", func(t *testing.T) {
+		mockHaDeployConfig := &config.HaDeployConfig{
+			ObjectStorage: &config.ObjectStorage{
+				Config: &config.ConfigObjectStorage{
+					Location:   AWS_S3,
+					BucketName: "dummybucket",
+					AccessKey:  "access",
+					SecretKey:  "secret",
+					Endpoint:   "endpoint",
+					Region:     "Somewhere",
+				},
+			},
+			Architecture: &config.Architecture{
+				Aws: &config.ConfigInitials{
+					SSHUser: "ec2-user",
+				},
+				ExistingInfra: &config.ConfigInitials{
+					SSHUser: "ec2-user",
+				},
+			},
+		}
+
+		mockConfig := &Config{}
+		mockConfig.populateObjectStorageConfig(mockHaDeployConfig)
+		require.NotNil(t, mockConfig)
+		require.Equal(t, mockConfig.Backup.ObjectStorage.AWSRegion, "Somewhere")
+		require.Equal(t, mockConfig.Backup.ObjectStorage.BucketName, "dummybucket")
+		require.Equal(t, mockConfig.Backup.ObjectStorage.AccessKey, "access")
+		require.Equal(t, mockConfig.Backup.ObjectStorage.SecretKey, "secret")
+		require.Equal(t, mockConfig.Backup.ObjectStorage.Endpoint, "endpoint")
+	})
+
+	t.Run("Valid Config GCS", func(t *testing.T) {
+		mockHaDeployConfig := &config.HaDeployConfig{
+			ObjectStorage: &config.ObjectStorage{
+				Config: &config.ConfigObjectStorage{
+					Location:                 GCP_CLOUD_STORAGE,
+					BucketName:               "dummybucket",
+					GoogleServiceAccountFile: "./testdata/servicefile",
+				},
+			},
+			Architecture: &config.Architecture{
+				Aws: &config.ConfigInitials{
+					SSHUser: "ec2-user",
+				},
+				ExistingInfra: &config.ConfigInitials{
+					SSHUser: "ec2-user",
+				},
+			},
+		}
+
+		mockConfig := &Config{}
+		mockConfig.populateObjectStorageConfig(mockHaDeployConfig)
+		require.NotNil(t, mockConfig)
+		require.Equal(t, mockConfig.Backup.ObjectStorage.BucketName, "dummybucket")
+		require.Equal(t, mockConfig.Backup.ObjectStorage.GoogleServiceAccountFile, "./testdata/servicefile")
+	})
+}
diff --git a/components/automate-cli/pkg/verifyserver/server/api/v1/gcpcloudstorage_test.go b/components/automate-cli/pkg/verifyserver/server/api/v1/gcpcloudstorage_test.go
new file mode 100644
index 000000000..445b7cfa3
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/server/api/v1/gcpcloudstorage_test.go
@@ -0,0 +1,409 @@
+package v1_test
+
+import (
+	"context"
+	"errors"
+	"io/ioutil"
+	"net/http/httptest"
+	"strings"
+	"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/server"
+	v1 "github.com/chef/automate/components/automate-cli/pkg/verifyserver/server/api/v1"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/utils/fiberutils"
+	"github.com/chef/automate/lib/logger"
+	"github.com/gofiber/fiber/v2"
+	"github.com/stretchr/testify/assert"
+)
+
+var (
+	gcpConnectionTitle                  = "GCP connection test"
+	gcpConnectionErrorMsg               = "Machine is not able to connect with GCP using the provided access key and secret key"
+	gcpConnectionResolutionMsg          = "Provide the correct GCP url or access or secret keys"
+	gcpConnectionSuccessMsg             = "Machine is able to connect with GCP using the provided access key and secret key"
+	gcpBucketAccessTitle                = "GCP bucket access test"
+	gcpBucketAccessErrorMsg             = "Machine is not able to access the GCP bucket using the provided access key and secret key"
+	gcpBucketAccessResolutionMsg        = "Provide the necessary access to the GCP bucket"
+	gcpBucketAccessSuccessMsg           = "Machine is able to access the GCP bucket using the provided access key and secret key"
+	successMessagegcpConfig             = "{\"status\":\"SUCCESS\",\"result\":{\"passed\":true,\"checks\":[{\"title\":\"GCP connection test\",\"passed\":true,\"success_msg\":\"Machine is able to connect with GCP using the provided access key and secret key\",\"error_msg\":\"\",\"resolution_msg\":\"\",\"skipped\":false},{\"title\":\"GCP bucket access test\",\"passed\":true,\"success_msg\":\"Machine is able to access the GCP bucket using the provided access key and secret key\",\"error_msg\":\"\",\"resolution_msg\":\"\",\"skipped\":false}]}}"
+	failureMessagegcpConfig             = "{\"status\":\"SUCCESS\",\"result\":{\"passed\":false,\"checks\":[{\"title\":\"GCP connection test\",\"passed\":false,\"success_msg\":\"\",\"error_msg\":\"Machine is not able to connect with GCP using the provided access key and secret key\",\"resolution_msg\":\"Provide the correct GCP url or access or secret keys\",\"skipped\":false}]}}"
+	bucketAccessfailureMessagegcpConfig = "{\"status\":\"SUCCESS\",\"result\":{\"passed\":false,\"checks\":[{\"title\":\"GCP connection test\",\"passed\":true,\"success_msg\":\"Machine is able to connect with GCP using the provided access key and secret key\",\"error_msg\":\"\",\"resolution_msg\":\"\",\"skipped\":false},{\"title\":\"GCP bucket access test\",\"passed\":false,\"success_msg\":\"\",\"error_msg\":\"Machine is not able to access the GCP bucket using the provided access key and secret key\",\"resolution_msg\":\"Provide the necessary access to the GCP bucket\",\"skipped\":false}]}}"
+
+	reqBodyGCS = `{
+		"location": "gcs",
+		"bucket_name": "backup-test",
+		"gcp_service_account": {
+			"type": "svc_account",
+			"project_id": "backup-testing",
+			"private_key_id": "lksdhksbdjkcbdsjhcds",
+			"private_key": "certificate",
+			"client_email": "--testing..com",
+			"client_id": "dfv",
+			"auth_uri": "https://",
+			"token_uri": "https://",
+			"auth_provider_x509_cert_url": "https://",
+			"client_x509_cert_url": "https://",
+			"universe_domain": "google"
+		}
+	}`
+)
+
+func SetupMockgcpConfigService(mockGCPConnectionModel, mockGCPBucketAccessModel models.Checks) gcpcloudstorageservice.GCPCloudStorageConfig {
+	return &gcpcloudstorageservice.MockGCPCloudStorageConfig{
+		GetGCPConnectionFunc: func(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks {
+			return &mockGCPConnectionModel
+		},
+		GetBucketAccessFunc: func(ctx context.Context, req *models.GCPCloudStorageConfigRequest) *models.Checks {
+			return &mockGCPBucketAccessModel
+		},
+	}
+}
+
+func SetupgcpConfigHandlers(ss gcpcloudstorageservice.GCPCloudStorageConfig) *fiber.App {
+	log, _ := logger.NewLogger("text", "debug")
+	fconf := fiber.Config{
+		ServerHeader: server.SERVICE,
+		ErrorHandler: fiberutils.CustomErrorHandler,
+	}
+	app := fiber.New(fconf)
+	handler := v1.NewHandler(log).
+		AddGCSConfigService(ss)
+	vs := &server.VerifyServer{
+		Port:    server.DEFAULT_PORT,
+		Log:     log,
+		App:     app,
+		Handler: handler,
+	}
+	vs.SetupRoutes()
+	return vs.App
+}
+
+func TestGetGCPCloudStorageConfig(t *testing.T) {
+	tests := []struct {
+		description              string
+		expectedCode             int
+		expectedBody             string
+		body                     string
+		mockgcpConnectionModel   models.Checks
+		mockgcpBucketAccessModel models.Checks
+	}{
+		{
+			description:  "200:success status route",
+			expectedCode: 200,
+			mockgcpConnectionModel: models.Checks{
+				Title:         gcpConnectionTitle,
+				Passed:        true,
+				SuccessMsg:    gcpConnectionSuccessMsg,
+				ErrorMsg:      "",
+				ResolutionMsg: "",
+			},
+			mockgcpBucketAccessModel: models.Checks{
+				Title:         gcpBucketAccessTitle,
+				Passed:        true,
+				SuccessMsg:    gcpBucketAccessSuccessMsg,
+				ErrorMsg:      "",
+				ResolutionMsg: "",
+			},
+			body:         reqBodyGCS,
+			expectedBody: successMessagegcpConfig,
+		},
+		{
+			description:  "200:fail both gcpconnection and gcpBucketAccess",
+			expectedCode: 200,
+			mockgcpConnectionModel: models.Checks{
+				Title:         gcpConnectionTitle,
+				Passed:        false,
+				SuccessMsg:    "",
+				ErrorMsg:      gcpConnectionErrorMsg,
+				ResolutionMsg: gcpConnectionResolutionMsg,
+			},
+			mockgcpBucketAccessModel: models.Checks{
+				Title:         gcpBucketAccessTitle,
+				Passed:        false,
+				SuccessMsg:    "",
+				ErrorMsg:      gcpBucketAccessErrorMsg,
+				ResolutionMsg: gcpBucketAccessResolutionMsg,
+			},
+			body:         reqBodyGCS,
+			expectedBody: failureMessagegcpConfig,
+		},
+		{
+			description:  "200:fail gcpBucketAccess",
+			expectedCode: 200,
+			mockgcpConnectionModel: models.Checks{
+				Title:         gcpConnectionTitle,
+				Passed:        true,
+				SuccessMsg:    gcpConnectionSuccessMsg,
+				ErrorMsg:      "",
+				ResolutionMsg: "",
+			},
+			mockgcpBucketAccessModel: models.Checks{
+				Title:         gcpBucketAccessTitle,
+				Passed:        false,
+				SuccessMsg:    "",
+				ErrorMsg:      gcpBucketAccessErrorMsg,
+				ResolutionMsg: gcpBucketAccessResolutionMsg,
+			},
+			body:         reqBodyGCS,
+			expectedBody: bucketAccessfailureMessagegcpConfig,
+		},
+		{
+			description:  "400: body parser error",
+			expectedCode: 400,
+			mockgcpConnectionModel: models.Checks{
+				Title:         gcpConnectionTitle,
+				Passed:        true,
+				SuccessMsg:    gcpConnectionSuccessMsg,
+				ErrorMsg:      "",
+				ResolutionMsg: "",
+			},
+			mockgcpBucketAccessModel: models.Checks{
+				Title:         gcpBucketAccessTitle,
+				Passed:        false,
+				SuccessMsg:    "",
+				ErrorMsg:      gcpBucketAccessErrorMsg,
+				ResolutionMsg: gcpBucketAccessResolutionMsg,
+			},
+			body: `{
+				"endpoint": "gcp://example-gcp.region.com",
+				"bucket_name": "backups",
+				"base_path": "automate",
+			}`,
+			expectedBody: errorBodyParser,
+		},
+	}
+	statusEndpoint := "/api/v1/checks/gcp-cloud-storage-config"
+	for _, test := range tests {
+
+		t.Run(test.description, func(t *testing.T) {
+			// Setup the app as it is done in the main function
+			app := SetupgcpConfigHandlers(SetupMockgcpConfigService(test.mockgcpConnectionModel, test.mockgcpBucketAccessModel))
+			req := httptest.NewRequest("POST", statusEndpoint, strings.NewReader(test.body))
+			req.Header.Add("Content-Type", "application/json")
+			res, err := app.Test(req, -1)
+			assert.NoError(t, err)
+			body, err := ioutil.ReadAll(res.Body)
+			assert.NoError(t, err, test.description)
+			assert.Contains(t, string(body), test.expectedBody)
+			assert.Equal(t, res.StatusCode, test.expectedCode)
+
+		})
+	}
+}
+
+func TestCredentialsCheck(t *testing.T) {
+	t.Run("type not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				ProjectID: "project-id",
+			},
+		}
+
+		// Test missing type
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_TYPE_MISSING_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_TYPE_MISSING)
+	})
+
+	t.Run("project_id not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type: "svc-scc",
+			},
+		}
+
+		// Test missing type
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_PROJECT_ID_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_PROJECT_ID)
+	})
+
+	t.Run("private_key_id not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:      "svc-scc",
+				ProjectID: "new-id",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_PRIVATE_KEY_ID_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_PRIVATE_KEY_ID)
+	})
+
+	t.Run("private_key not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:         "svc-scc",
+				ProjectID:    "new-id",
+				PrivateKeyID: "key-id",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_PRIVATE_KEY_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_PRIVATE_KEY)
+	})
+
+	t.Run("client_email not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:         "svc-scc",
+				ProjectID:    "new-id",
+				PrivateKeyID: "key-id",
+				PrivateKey:   "certificate",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_CLIENT_EMAIL_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_CLIENT_EMAIL)
+	})
+
+	t.Run("client_id not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:         "svc-scc",
+				ProjectID:    "new-id",
+				PrivateKeyID: "key-id",
+				PrivateKey:   "certificate",
+				ClientEmail:  "newclient",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_CLIENT_ID_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_CLIENT_ID)
+	})
+
+	t.Run("auth_uri not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:         "svc-scc",
+				ProjectID:    "new-id",
+				PrivateKeyID: "key-id",
+				PrivateKey:   "certificate",
+				ClientEmail:  "newclient",
+				ClientID:     "new client id",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_AUTH_URI_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_AUTH_URI)
+	})
+
+	t.Run("token_uri not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:         "svc-scc",
+				ProjectID:    "new-id",
+				PrivateKeyID: "key-id",
+				PrivateKey:   "certificate",
+				ClientEmail:  "newclient",
+				ClientID:     "new client id",
+				AuthURI:      "auth.auth",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_TOKEN_URI_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_TOKEN_URI)
+	})
+
+	t.Run("auth_provider_x509_cert_url not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:         "svc-scc",
+				ProjectID:    "new-id",
+				PrivateKeyID: "key-id",
+				PrivateKey:   "certificate",
+				ClientEmail:  "newclient",
+				ClientID:     "new client id",
+				AuthURI:      "auth.auth",
+				TokenURI:     "new token",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_AUTH_PROVIDER_x509_CERT_URL_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_AUTH_PROVIDER_x509_CERT_URL)
+	})
+
+	t.Run("client_x509_cert_url not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "svc-scc",
+				ProjectID:               "new-id",
+				PrivateKeyID:            "key-id",
+				PrivateKey:              "certificate",
+				ClientEmail:             "newclient",
+				ClientID:                "new client id",
+				AuthURI:                 "auth.auth",
+				TokenURI:                "new token",
+				AuthProviderX509CertURL: "https://",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_CLIENT_x509_CERT_URL_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_CLIENT_x509_CERT_URL)
+	})
+
+	t.Run("universe_domain not available", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "svc-scc",
+				ProjectID:               "new-id",
+				PrivateKeyID:            "key-id",
+				PrivateKey:              "certificate",
+				ClientEmail:             "newclient",
+				ClientID:                "new client id",
+				AuthURI:                 "auth.auth",
+				TokenURI:                "new token",
+				AuthProviderX509CertURL: "https://",
+				ClientX509CertURL:       "https://",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, constants.GCS_UNIVERSAL_DOMAIN_RESOLUTION)
+		assert.Equal(t, err.Error(), constants.GCS_UNIVERSAL_DOMAIN)
+	})
+
+	t.Run("no error", func(t *testing.T) {
+		cred := &models.GCPCloudStorageConfigRequest{
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "svc-scc",
+				ProjectID:               "new-id",
+				PrivateKeyID:            "key-id",
+				PrivateKey:              "certificate",
+				ClientEmail:             "newclient",
+				ClientID:                "new client id",
+				AuthURI:                 "auth.auth",
+				TokenURI:                "new token",
+				AuthProviderX509CertURL: "https://",
+				ClientX509CertURL:       "https://",
+				UniverseDomain:          "google.com",
+			},
+		}
+
+		result, err := v1.CredentialsCheck(cred)
+		assert.Equal(t, result, "")
+		assert.NoError(t, err)
+	})
+}
+
+func TestCredCheckErr(t *testing.T) {
+	// Test error case
+	err := errors.New("error message")
+	result := v1.CredCheckErr("resolution message", err)
+	assert.Equal(t, len(result), 1)
+	assert.Equal(t, result[0].Title, constants.GCP_CONNECTION_TITLE)
+	assert.Equal(t, result[0].Passed, false)
+	assert.Equal(t, result[0].ErrorMsg, err.Error())
+	assert.Equal(t, result[0].ResolutionMsg, "resolution message")
+}
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 343e54a58..6a0256b61 100644
--- a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice_test.go
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/batchcheckservice_test.go
@@ -730,6 +730,7 @@ func TestBatchCheckService(t *testing.T) {
 				SetupMockSoftwareVersionCheck(),
 				SetupMockSystemResourceCheck(),
 				SetupMockSystemUserCheck(),
+				SetupMockGCPBackupConfigCheck(),
 			), logger.NewTestLogger(), "1234")
 
 			ss.httpRequestClient = SetupMockHttpRequestClient(test.statusApiResponse, test.statusApiError, test.shouldStartMockServerOnSomeNodesOnly)
@@ -747,6 +748,7 @@ func TestBatchCheckService(t *testing.T) {
 				constants.SYSTEM_RESOURCES,
 				constants.SYSTEM_USER,
 				constants.AWS_OPENSEARCH_S3_BUCKET_ACCESS,
+				constants.GCP_BACKUP_CONFIG,
 			}
 
 			if len(test.checksToExecute) > 0 {
@@ -1010,6 +1012,7 @@ func getBatchCheckServiceInstance() *BatchCheckService {
 		SetupMockSoftwareVersionCheck(),
 		SetupMockSystemResourceCheck(),
 		SetupMockSystemUserCheck(),
+		SetupMockGCPBackupConfigCheck(),
 	), logger.NewTestLogger(), "1234")
 }
 
@@ -1176,6 +1179,7 @@ func TestBastionBatchChecks(t *testing.T) {
 		SetupMockSoftwareVersionCheck(),
 		SetupMockSystemResourceCheck(),
 		SetupMockSystemUserCheck(),
+		SetupMockGCPBackupConfigCheck(),
 	), logger.NewTestLogger(), "1234")
 
 	checksToExecute := []string{
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/gcsbackupconfigchecktrigger_test.go b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/gcsbackupconfigchecktrigger_test.go
new file mode 100644
index 000000000..c5b72b84b
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/gcsbackupconfigchecktrigger_test.go
@@ -0,0 +1,573 @@
+package gcsbackupchecktrigger
+
+import (
+	"encoding/json"
+	"io"
+	"net/http"
+	"net/http/httptest"
+	"strings"
+	"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/lib/logger"
+	"github.com/stretchr/testify/assert"
+)
+
+const (
+	GCPBackupConfigCheckResponseFromOneNodeSuccess = `{
+		"status": "SUCCESS",
+		"node_type": "automate",
+		"result": {
+		  "passed": true,
+		  "checks": [
+			{
+			  "title": "GCP connection test",
+			  "passed": true,
+			  "success_msg": "Machine is able to connect with GCP using the provided access key and secret key",
+			  "error_msg": "",
+			  "resolution_msg": ""
+			},
+			{
+			  "title": "GCP bucket access test",
+			  "passed": true,
+			  "success_msg": "Machine is able to access the GCP bucket using the provided access key and secret key",
+			  "error_msg": "",
+			  "resolution_msg": ""
+			}
+		  ]
+		}
+	  }`
+
+	GCPBackupCheckResponseExpectedSuccess = `[
+	{
+		"status": "SUCCESS",
+		"node_type": "automate",
+		"result": {
+		  "passed": true,
+		  "checks": [
+			{
+			  "title": "GCP connection test",
+			  "passed": true,
+			  "success_msg": "Machine is able to connect with GCP using the provided access key and secret key",
+			  "error_msg": "",
+			  "resolution_msg": ""
+			},
+			{
+			  "title": "GCP bucket access test",
+			  "passed": true,
+			  "success_msg": "Machine is able to access the GCP bucket using the provided access key and secret key",
+			  "error_msg": "",
+			  "resolution_msg": ""
+			}
+		  ]
+		}
+	  },{
+		"status": "SUCCESS",
+		"node_type": "automate",
+		"result": {
+		  "passed": true,
+		  "checks": [
+			{
+			  "title": "GCP connection test",
+			  "passed": true,
+			  "success_msg": "Machine is able to connect with GCP using the provided access key and secret key",
+			  "error_msg": "",
+			  "resolution_msg": ""
+			},
+			{
+			  "title": "GCP bucket access test",
+			  "passed": true,
+			  "success_msg": "Machine is able to access the GCP bucket using the provided access key and secret key",
+			  "error_msg": "",
+			  "resolution_msg": ""
+			}
+		  ]
+		}
+	  }
+	]
+	`
+	GCPBackupCheckResponseFailure = `
+	{
+		"status": "SUCCESS",
+		"result": {
+		  "passed": false,
+		  "checks": [
+			{
+			  "title": "GCP connection test",
+			  "passed": false,
+			  "success_msg": "",
+			  "error_msg": "Machine is not able to connect with GCP using the provided access key and secret key",
+			  "resolution_msg": "Provide the correct GCP url or access or secret keys"
+			},
+			{
+			  "title": "GCP bucket access test",
+			  "passed": false,
+			  "success_msg": "",
+			  "error_msg": "Machine is not able to access the GCP bucket using the provided access key and secret key",
+			  "resolution_msg": "Provide the necessary access to the GCP bucket"
+			}
+		  ]
+		}
+	  }
+	  `
+
+	GCPBackupCheckResponseFailureExpected = `[
+	{
+		"status": "SUCCESS",
+		"node_type" :"automate",
+		"result": {
+		  "passed": false,
+		  "checks": [
+			{
+			  "title": "GCP connection test",
+			  "passed": false,
+			  "success_msg": "",
+			  "error_msg": "Machine is not able to connect with GCP using the provided access key and secret key",
+			  "resolution_msg": "Provide the correct GCP url or access or secret keys"
+			},
+			{
+			  "title": "GCP bucket access test",
+			  "passed": false,
+			  "success_msg": "",
+			  "error_msg": "Machine is not able to access the GCP bucket using the provided access key and secret key",
+			  "resolution_msg": "Provide the necessary access to the GCP bucket"
+			}
+		  ]
+		}
+	  },
+	  {
+		"status": "SUCCESS",
+		"node_type" :"automate",
+		"result": {
+		  "passed": false,
+		  "checks": [
+			{
+			  "title": "GCP connection test",
+			  "passed": false,
+			  "success_msg": "",
+			  "error_msg": "Machine is not able to connect with GCP using the provided access key and secret key",
+			  "resolution_msg": "Provide the correct GCP url or access or secret keys"
+			},
+			{
+			  "title": "GCP bucket access test",
+			  "passed": false,
+			  "success_msg": "",
+			  "error_msg": "Machine is not able to access the GCP bucket using the provided access key and secret key",
+			  "resolution_msg": "Provide the necessary access to the GCP bucket"
+			}
+		  ]
+		}
+	  }
+	  ]
+	  `
+	GCPBackupConfigCheckResponseSkipped = `{
+		"status": "",
+		"node_type": "automate",
+		"result": {
+		  "passed": true,
+		  "checks": [
+			{}
+		  ]
+		  "Skipped": true,
+		  "skip_message":"- Backup configuration not set to object_storage/gcs"
+		}
+	  }`
+	bucketName              = "test"
+	accountServiceFilepath  = "./testdata/account.json"
+	location                = "gcs"
+	typeS                   = "service_account"
+	projectId               = "dev"
+	privateKeyId            = "e123454a6668a89b970f703f"
+	privateKey              = "certificate"
+	clientEmail             = "abc.gserviceaccount.com"
+	clientId                = "1146674505608030"
+	authUri                 = "https://accounts.google.com/o/oauth2/auth"
+	tokenUri                = "https://oauth2.googleapis.com/token"
+	authProviderx509CertUrl = "https://www.googleapis.com/oauth2/v1/certs"
+	clientx509CertUrl       = "https://www.googleapis.com/robot/v1/metadata/x509/test"
+	universeDomain          = "main"
+)
+
+func getRequest() models.GCPCloudStorageConfigRequest {
+	return models.GCPCloudStorageConfigRequest{
+		BucketName:               bucketName,
+		GoogleServiceAccountFile: accountServiceFilepath,
+		GcpServiceAccount: &models.GcpServiceAccount{
+			Type:                    typeS,
+			ProjectID:               projectId,
+			PrivateKeyID:            privateKeyId,
+			PrivateKey:              privateKey,
+			ClientEmail:             clientEmail,
+			ClientID:                clientId,
+			AuthURI:                 authUri,
+			TokenURI:                tokenUri,
+			AuthProviderX509CertURL: authProviderx509CertUrl,
+			ClientX509CertURL:       clientx509CertUrl,
+			UniverseDomain:          universeDomain,
+		},
+	}
+}
+
+func TestGCPBackupConfigCheck_Run(t *testing.T) {
+	type args struct {
+		config *models.Config
+	}
+
+	tests := []struct {
+		name                   string
+		isPassed               bool
+		args                   args
+		response               string
+		httpStatusCode         int
+		isError                bool
+		requiredStatusResponse string
+	}{
+		{
+			name:           "All the GCP checks passed",
+			isPassed:       true,
+			isError:        false,
+			httpStatusCode: http.StatusOK,
+			args: args{
+				config: &models.Config{
+					Hardware: &models.Hardware{
+						AutomateNodeCount: 2,
+					},
+					Backup: &models.Backup{
+						ObjectStorage: &models.ObjectStorage{
+							Location:                 location,
+							BucketName:               bucketName,
+							GoogleServiceAccountFile: accountServiceFilepath,
+						},
+					},
+				},
+			},
+			response: GCPBackupCheckResponseExpectedSuccess,
+		},
+		{
+			name:           "All the GCP checks failed",
+			isPassed:       false,
+			isError:        false,
+			httpStatusCode: http.StatusOK,
+			args: args{
+				config: &models.Config{
+					Hardware: &models.Hardware{
+						AutomateNodeCount: 1,
+					},
+					Backup: &models.Backup{
+						ObjectStorage: &models.ObjectStorage{
+							Location:                 location,
+							BucketName:               bucketName,
+							GoogleServiceAccountFile: accountServiceFilepath,
+						},
+					},
+				},
+			},
+			response: GCPBackupCheckResponseFailureExpected,
+		},
+		{
+			name:           "Internal Server Error",
+			isPassed:       false,
+			isError:        true,
+			httpStatusCode: http.StatusInternalServerError,
+			args: args{
+				config: &models.Config{
+					Hardware: &models.Hardware{
+						AutomateNodeCount: 2,
+					},
+					Backup: &models.Backup{
+						ObjectStorage: &models.ObjectStorage{
+							Location:                 location,
+							BucketName:               bucketName,
+							GoogleServiceAccountFile: accountServiceFilepath,
+						},
+					},
+				},
+			},
+			response:               "Internal Server Error",
+			requiredStatusResponse: `{"error":{"code":500,"message":"Internal Server Error"}}`,
+		},
+		{
+			name:           "Gateway Timeout",
+			isPassed:       false,
+			isError:        true,
+			httpStatusCode: http.StatusGatewayTimeout,
+			args: args{
+				config: &models.Config{
+					Hardware: &models.Hardware{
+						AutomateNodeCount: 2,
+						AutomateNodeIps:   []string{"1.1.1.1", "2.2.2.2"},
+					},
+					Backup: &models.Backup{
+						ObjectStorage: &models.ObjectStorage{
+							Location:                 location,
+							BucketName:               bucketName,
+							GoogleServiceAccountFile: accountServiceFilepath,
+						},
+					},
+				},
+			},
+			requiredStatusResponse: `{"error":{"code":504,"message":"context deadline exceeded"}}`,
+			response:               "context deadline exceeded",
+		},
+		{
+			name:           "Parsing Error",
+			isPassed:       false,
+			isError:        true,
+			httpStatusCode: http.StatusBadRequest,
+			args: args{
+				config: &models.Config{
+					Hardware: &models.Hardware{
+						AutomateNodeCount: 2,
+					},
+					Backup: &models.Backup{
+						ObjectStorage: &models.ObjectStorage{
+							Location:                 location,
+							BucketName:               bucketName,
+							GoogleServiceAccountFile: "service.json",
+						},
+					},
+				},
+			},
+			response: "Json File is empty or Incorrect Json File",
+		},
+		{
+			name:           "Parsing Empty",
+			isPassed:       false,
+			isError:        true,
+			httpStatusCode: http.StatusBadRequest,
+			args: args{
+				config: &models.Config{
+					Hardware: &models.Hardware{
+						AutomateNodeCount: 2,
+					},
+					Backup: &models.Backup{
+						ObjectStorage: &models.ObjectStorage{
+							Location:                 location,
+							BucketName:               bucketName,
+							GoogleServiceAccountFile: "./testdata/service.json",
+						},
+					},
+				},
+			},
+			response: "Json File is empty or Incorrect Json File",
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			var want []models.CheckTriggerResponse
+			server, host, port := createDummyServer(t, tt.httpStatusCode, tt.isPassed, tt.requiredStatusResponse)
+			defer server.Close()
+
+			svc := NewGcsBackupConfigCheck(
+				logger.NewLogrusStandardLogger(),
+				port,
+			)
+
+			tt.args.config.Hardware.AutomateNodeIps = []string{host, host}
+
+			json.Unmarshal([]byte(tt.response), &want)
+			for i := range want {
+				want[i].Host = host
+			}
+
+			got := svc.Run(tt.args.config)
+
+			if tt.isError {
+				assert.Len(t, got, tt.args.config.Hardware.AutomateNodeCount)
+				assert.NotNil(t, got[0].Result.Error)
+				assert.Equal(t, "automate", got[0].NodeType)
+				assert.Equal(t, got[0].Result.Error.Code, tt.httpStatusCode)
+				assert.Equal(t, tt.response, got[0].Result.Error.Error())
+			} else {
+				assert.Equal(t, want, got)
+			}
+
+		})
+	}
+}
+
+func TestRunGCPBackupCheck(t *testing.T) {
+	t.Run("NIl Hardware", func(t *testing.T) {
+		svc := NewGcsBackupConfigCheck(
+			logger.NewLogrusStandardLogger(),
+			"8081",
+		)
+		config := &models.Config{
+			Hardware: nil,
+		}
+
+		got := svc.Run(config)
+
+		assert.Len(t, got, 1)
+		assert.Equal(t, "-", got[0].Host)
+		assert.Equal(t, constants.AUTOMATE, got[0].NodeType)
+		assert.Equal(t, constants.GCP_BACKUP_CONFIG, got[0].CheckType)
+		assert.True(t, got[0].Result.Skipped)
+		assert.Equal(t, constants.SKIP_MISSING_HARDWARE_MESSAGE, got[0].Result.SkipMessage)
+
+	})
+
+	t.Run("Empty Object storage", func(t *testing.T) {
+		svc := NewGcsBackupConfigCheck(
+			logger.NewLogrusStandardLogger(),
+			"8081",
+		)
+		config := &models.Config{
+			Hardware: &models.Hardware{
+				AutomateNodeCount: 1,
+				AutomateNodeIps:   []string{constants.LOCALHOST},
+			},
+			Backup: &models.Backup{
+				ObjectStorage: &models.ObjectStorage{
+					Location: "gcs",
+				},
+			},
+		}
+
+		got := svc.Run(config)
+
+		assert.Len(t, got, 1)
+		assert.Equal(t, constants.LOCALHOST, got[0].Host)
+		assert.Equal(t, constants.AUTOMATE, got[0].NodeType)
+		assert.Equal(t, constants.GCP_BACKUP_CONFIG, got[0].CheckType)
+		assert.Equal(t, http.StatusBadRequest, got[0].Result.Error.Code)
+		assert.Equal(t, constants.GCS_BACKUP_MISSING, got[0].Result.Error.Message)
+		assert.False(t, got[0].Result.Skipped)
+	})
+
+	t.Run("Empty", func(t *testing.T) {
+		svc := NewGcsBackupConfigCheck(
+			logger.NewLogrusStandardLogger(),
+			"8081",
+		)
+		config := &models.Config{
+			Hardware: &models.Hardware{
+				AutomateNodeCount: 1,
+				AutomateNodeIps:   []string{constants.LOCALHOST},
+			},
+			Backup: &models.Backup{
+				ObjectStorage: &models.ObjectStorage{
+					Location: "",
+				},
+			},
+		}
+
+		got := svc.Run(config)
+		want := &models.ApiResult{
+			SkipMessage: "- Backup configuration not set to object_storage/gcs",
+		}
+		assert.Equal(t, got[0].Result.SkipMessage, want.SkipMessage)
+	})
+}
+
+// Helper function to create a dummy server
+func createDummyServer(t *testing.T, requiredStatusCode int, isPassed bool, requiredStatusResponse string) (*httptest.Server, string, string) {
+	if requiredStatusCode == http.StatusOK {
+		server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+			var got models.GCPCloudStorageConfigRequest
+			req := r.Body
+			reader, _ := io.ReadAll(req)
+			json.Unmarshal(reader, &got)
+
+			wantReq := getRequest()
+
+			assert.NotNil(t, got)
+			assert.Equal(t, got, wantReq)
+			if r.URL.Path == constants.GCP_CLOUD_STORAGE_CONFIG_API_PATH {
+				if isPassed {
+					w.WriteHeader(http.StatusOK)
+					w.Write([]byte(GCPBackupConfigCheckResponseFromOneNodeSuccess))
+				} else {
+					w.WriteHeader(http.StatusOK)
+					w.Write([]byte(GCPBackupCheckResponseFailure))
+				}
+			}
+		}))
+
+		// Extract IP and port from the server's URL
+		address := server.URL[strings.Index(server.URL, "//")+2:]
+		colonIndex := strings.Index(address, ":")
+		ip := address[:colonIndex]
+		port := address[colonIndex+1:]
+
+		return server, ip, port
+	}
+
+	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		w.WriteHeader(requiredStatusCode)
+		w.Write([]byte(requiredStatusResponse))
+	}))
+
+	// Extract IP and port from the server's URL
+	address := server.URL[strings.Index(server.URL, "//")+2:]
+	colonIndex := strings.Index(address, ":")
+	ip := address[:colonIndex]
+	port := address[colonIndex+1:]
+
+	return server, ip, port
+}
+
+func TestGetPortsForMockServer(t *testing.T) {
+	fwc := NewGcsBackupConfigCheck(logger.NewLogrusStandardLogger(), "1234")
+	resp := fwc.GetPortsForMockServer()
+
+	assert.Equal(t, 0, len(resp))
+}
+
+func TestGCPConfigSkippedResponse(t *testing.T) {
+	type args struct {
+		config    *models.Config
+		checkType string
+	}
+	tests := []struct {
+		name string
+		args args
+		want []models.CheckTriggerResponse
+	}{
+		{
+			name: "Make the skip Response",
+			args: args{
+				config: &models.Config{
+					Hardware: &models.Hardware{
+						AutomateNodeCount:        1,
+						AutomateNodeIps:          []string{constants.LOCALHOST},
+						ChefInfraServerNodeCount: 1,
+						ChefInfraServerNodeIps:   []string{constants.LOCALHOST},
+					},
+				},
+				checkType: "GCP-backup-config",
+			},
+			want: []models.CheckTriggerResponse{
+				{
+					NodeType:  "automate",
+					CheckType: "GCP-backup-config",
+					Result: models.ApiResult{
+						Passed:      false,
+						Skipped:     true,
+						Check:       "GCP-backup-config",
+						SkipMessage: constants.SKIP_BACKUP_TEST_MESSAGE_GCS,
+					},
+					Host: constants.LOCALHOST,
+				},
+				{
+					NodeType:  "chef-infra-server",
+					CheckType: "GCP-backup-config",
+					Result: models.ApiResult{
+						Passed:      false,
+						Skipped:     true,
+						Check:       "GCP-backup-config",
+						SkipMessage: constants.SKIP_BACKUP_TEST_MESSAGE_GCS,
+					},
+					Host: constants.LOCALHOST,
+				},
+			},
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got := GcsConfigSkippedResponse(tt.args.config, tt.args.checkType, constants.SKIP_BACKUP_TEST_MESSAGE_GCS)
+			assert.Equal(t, tt.want, got)
+		})
+	}
+}
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/testdata/account.json b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/testdata/account.json
new file mode 100644
index 000000000..db70a2ab0
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/testdata/account.json
@@ -0,0 +1,13 @@
+{
+  "type": "service_account",
+  "project_id": "dev",
+  "private_key_id": "e123454a6668a89b970f703f",
+  "private_key": "certificate",
+  "client_email": "abc.gserviceaccount.com",
+  "client_id": "1146674505608030",
+  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+  "token_uri": "https://oauth2.googleapis.com/token",
+  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
+  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/test",
+  "universe_domain": "main"
+}
\ No newline at end of file
diff --git a/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/testdata/service.json b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/testdata/service.json
new file mode 100644
index 000000000..1610ea14b
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/batchcheckservice/trigger/gcsbackupchecktrigger/testdata/service.json
@@ -0,0 +1,3 @@
+[
+    
+]
\ No newline at end of file
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 cb6bc35e2..2be2070f5 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
@@ -162,11 +162,12 @@ const (
 	  ]
 	  `
 	endPoint   = "//s3-url-test.com"
-	basePath   = "s3.url.test"
+	basePath   = "automate"
 	BucketName = "test"
 	accessKey  = "test-access-key"
 	secretKey  = "test-secret-key"
 	awsRegion  = "region"
+	location   = "s3"
 )
 
 func getRequest() models.S3ConfigRequest {
@@ -206,9 +207,9 @@ func TestS3BackupConfigCheck_Run(t *testing.T) {
 					},
 					Backup: &models.Backup{
 						ObjectStorage: &models.ObjectStorage{
+							Location:   "",
 							Endpoint:   endPoint,
 							BucketName: BucketName,
-							BasePath:   basePath,
 							AccessKey:  accessKey,
 							SecretKey:  secretKey,
 							AWSRegion:  awsRegion,
@@ -254,6 +255,7 @@ func TestS3BackupConfigCheck_Run(t *testing.T) {
 					},
 					Backup: &models.Backup{
 						ObjectStorage: &models.ObjectStorage{
+							Location:   location,
 							BucketName: BucketName,
 							BasePath:   basePath,
 							AccessKey:  accessKey,
@@ -279,6 +281,7 @@ func TestS3BackupConfigCheck_Run(t *testing.T) {
 					},
 					Backup: &models.Backup{
 						ObjectStorage: &models.ObjectStorage{
+							Location:   location,
 							Endpoint:   endPoint,
 							BucketName: BucketName,
 							BasePath:   basePath,
@@ -348,6 +351,29 @@ func TestRunS3BackupCheck(t *testing.T) {
 
 	})
 
+	t.Run("NIl Backup", func(t *testing.T) {
+		svc := NewS3BackupConfigCheck(
+			logger.NewLogrusStandardLogger(),
+			"8081",
+		)
+		config := &models.Config{
+			Hardware: &models.Hardware{
+				AutomateNodeCount: 1,
+				AutomateNodeIps:   []string{constants.LOCALHOST},
+			},
+		}
+
+		got := svc.Run(config)
+
+		assert.Len(t, got, 1)
+		assert.Equal(t, "127.0.0.1", got[0].Host)
+		assert.Equal(t, constants.AUTOMATE, got[0].NodeType)
+		assert.Equal(t, constants.S3_BACKUP_CONFIG, got[0].CheckType)
+		assert.True(t, got[0].Result.Skipped)
+		assert.Equal(t, constants.SKIP_BACKUP_TEST_MESSAGE_S3, got[0].Result.SkipMessage)
+
+	})
+
 	t.Run("Empty Object storage", func(t *testing.T) {
 		svc := NewS3BackupConfigCheck(
 			logger.NewLogrusStandardLogger(),
@@ -365,6 +391,35 @@ func TestRunS3BackupCheck(t *testing.T) {
 
 		got := svc.Run(config)
 
+		assert.Len(t, got, 1)
+		assert.Equal(t, constants.LOCALHOST, got[0].Host)
+		assert.Equal(t, constants.AUTOMATE, got[0].NodeType)
+		assert.Equal(t, constants.S3_BACKUP_CONFIG, got[0].CheckType)
+		assert.Equal(t, http.StatusBadRequest, got[0].Result.Error.Code)
+		assert.Equal(t, constants.S3_BACKUP_MISSING, got[0].Result.Error.Message)
+		assert.False(t, got[0].Result.Skipped)
+	})
+	t.Run("Empty Bucket Access Key", func(t *testing.T) {
+		svc := NewS3BackupConfigCheck(
+			logger.NewLogrusStandardLogger(),
+			"8081",
+		)
+		config := &models.Config{
+			Hardware: &models.Hardware{
+				AutomateNodeCount: 1,
+				AutomateNodeIps:   []string{constants.LOCALHOST},
+			},
+			Profile: "default",
+			Backup: &models.Backup{
+				ObjectStorage: &models.ObjectStorage{
+					BucketName: BucketName,
+					AccessKey:  accessKey,
+				},
+			},
+		}
+
+		got := svc.Run(config)
+
 		assert.Len(t, got, 1)
 		assert.Equal(t, constants.LOCALHOST, got[0].Host)
 		assert.Equal(t, constants.AUTOMATE, got[0].NodeType)
@@ -387,7 +442,7 @@ func createDummyServer(t *testing.T, requiredStatusCode int, isPassed bool, requ
 			wantReq := getRequest()
 
 			assert.NotNil(t, got)
-			assert.Equal(t, got, wantReq)
+			assert.Equal(t, wantReq, got)
 			if r.URL.Path == constants.S3_BACKUP_CHECK_API_PATH {
 				if isPassed {
 					w.WriteHeader(http.StatusOK)
diff --git a/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice/gcpconfigservice_test.go b/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice/gcpconfigservice_test.go
new file mode 100644
index 000000000..6fe55c3b6
--- /dev/null
+++ b/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice/gcpconfigservice_test.go
@@ -0,0 +1,326 @@
+package gcpcloudstorageservice_test
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"testing"
+
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/constants"
+
+	"cloud.google.com/go/storage"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/models"
+	"github.com/chef/automate/components/automate-cli/pkg/verifyserver/services/gcpcloudstorageservice"
+	"github.com/chef/automate/lib/logger"
+	"github.com/stretchr/testify/assert"
+	"google.golang.org/api/option"
+)
+
+var (
+	gcpConnectionTitle        = "GCS connection test"
+	gcpConnectionErrorMsg     = "Machine is not able to connect with GCS using the provided credentials: "
+	gcpConnectionSuccessMsg   = "Machine is able to connect with GCS using the provided credentials"
+	gcpBucketAccessSuccessMsg = "Machine is able to connect with GCS using the provided credentials"
+)
+
+type MockGCPUtils struct {
+	TestProbe               *testing.T
+	InvalidCredentials      bool
+	IsBucketAttributesError bool
+	IsUploadError           bool
+	IsListError             bool
+	IsDeleteObjError        bool
+}
+
+func (au *MockGCPUtils) NewSessionWithOptions(ctx context.Context, gsa *models.GcpServiceAccount) (*storage.Client, error) {
+	assert.Equal(au.TestProbe, "65464654684864353165486", gsa.ClientID)
+	if au.InvalidCredentials {
+		return nil, errors.New("Invalid Credentials")
+	}
+	bx, _ := json.Marshal(gsa)
+	return storage.NewClient(ctx, option.WithCredentialsJSON(bx))
+}
+
+func (au *MockGCPUtils) NewUploader(ctx context.Context, uploadObject *storage.ObjectHandle) error {
+	assert.Equal(au.TestProbe, "backups", uploadObject.BucketName())
+	assert.Contains(au.TestProbe, uploadObject.ObjectName(), "gcp_check_test")
+	if au.IsUploadError {
+		return errors.New("error in uploading the object")
+	}
+	return nil
+}
+
+func (au *MockGCPUtils) DeleteObject(ctx context.Context, obj *storage.ObjectHandle) error {
+	if au.IsDeleteObjError {
+		return errors.New("error in deleting the object from the bucket")
+	}
+	return nil
+}
+
+func (au *MockGCPUtils) ListObjects(ctx context.Context, bucket *storage.BucketHandle, query *storage.Query) error {
+	if au.IsListError {
+		return errors.New("error in listing the object")
+	}
+	return nil
+}
+
+func (au *MockGCPUtils) BucketAttributes(ctx context.Context, bucket *storage.BucketHandle) error {
+	if au.IsBucketAttributesError {
+		return errors.New("error in getting bucket attributes")
+	}
+	return nil
+}
+
+func TestNewGCPCloudStorageConfig(t *testing.T) {
+	log, _ := logger.NewLogger("text", "debug")
+	gcpobj := gcpcloudstorageservice.NewGCPCloudStorageConfig(log)
+	assert.NotNil(t, gcpobj)
+}
+
+func TestGetGCPConnection(t *testing.T) {
+
+	t.Run("Wrong Credentials", func(t *testing.T) {
+		log, _ := logger.NewLogger("text", "debug")
+		cs := &gcpcloudstorageservice.GCPConfigService{
+			Logger: log,
+			GCPUtils: &MockGCPUtils{
+				TestProbe:          t,
+				InvalidCredentials: true,
+			},
+		}
+
+		services := cs.GetGCPConnection(context.TODO(), &models.GCPCloudStorageConfigRequest{
+			BucketName:               "backups",
+			GoogleServiceAccountFile: "dummy_file.json",
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "service_account",
+				ProjectID:               "dev",
+				PrivateKeyID:            "e123454a6668a89b970f703f",
+				PrivateKey:              "-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----\n\n",
+				ClientEmail:             "email@automate-backup-unit-testing.iam.gserviceaccount.com",
+				ClientID:                "65464654684864353165486",
+				AuthURI:                 "https://accounts.google.com",
+				TokenURI:                "https://accounts.google.com",
+				AuthProviderX509CertURL: "https://accounts.google.com",
+				ClientX509CertURL:       "https://accounts.google.com",
+				UniverseDomain:          "https://accounts.google.com",
+			},
+		})
+
+		assert.Contains(t, services.ErrorMsg, constants.GCP_CONNECTION_ERROR_MSG)
+		assert.Equal(t, services.ResolutionMsg, constants.GCP_CONNECTION_RESOLUTION_MSG)
+	})
+
+	t.Run("No bucket exists", func(t *testing.T) {
+		log, _ := logger.NewLogger("text", "debug")
+		cs := &gcpcloudstorageservice.GCPConfigService{
+			Logger: log,
+			GCPUtils: &MockGCPUtils{
+				TestProbe:               t,
+				IsBucketAttributesError: true,
+			},
+		}
+		services := cs.GetGCPConnection(context.TODO(), &models.GCPCloudStorageConfigRequest{
+			BucketName:               "backups",
+			GoogleServiceAccountFile: "dummy_file.json",
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "service_account",
+				ProjectID:               "dev",
+				PrivateKeyID:            "e123454a6668a89b970f703f",
+				PrivateKey:              "-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----\n\n",
+				ClientEmail:             "email@automate-backup-unit-testing.iam.gserviceaccount.com",
+				ClientID:                "65464654684864353165486",
+				AuthURI:                 "https://accounts.google.com",
+				TokenURI:                "https://accounts.google.com",
+				AuthProviderX509CertURL: "https://accounts.google.com",
+				ClientX509CertURL:       "https://accounts.google.com",
+				UniverseDomain:          "https://accounts.google.com",
+			},
+		})
+
+		assert.Contains(t, services.ErrorMsg, constants.GCP_BUCKET_NOT_FOUND)
+		assert.Equal(t, services.ResolutionMsg, constants.GCP_CONNECTION_RESOLUTION_GENERAL_MSG)
+	})
+
+	t.Run("success", func(t *testing.T) {
+		log, _ := logger.NewLogger("text", "debug")
+		cs := &gcpcloudstorageservice.GCPConfigService{
+			Logger: log,
+			GCPUtils: &MockGCPUtils{
+				TestProbe: t,
+			},
+		}
+		services := cs.GetGCPConnection(context.TODO(), &models.GCPCloudStorageConfigRequest{
+			BucketName:               "backups",
+			GoogleServiceAccountFile: "dummy_file.json",
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "service_account",
+				ProjectID:               "dev",
+				PrivateKeyID:            "e123454a6668a89b970f703f",
+				PrivateKey:              "-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----\n\n",
+				ClientEmail:             "email@automate-backup-unit-testing.iam.gserviceaccount.com",
+				ClientID:                "65464654684864353165486",
+				AuthURI:                 "https://accounts.google.com",
+				TokenURI:                "https://accounts.google.com",
+				AuthProviderX509CertURL: "https://accounts.google.com",
+				ClientX509CertURL:       "https://accounts.google.com",
+				UniverseDomain:          "https://accounts.google.com",
+			},
+		})
+
+		assert.Equal(t, gcpConnectionSuccessMsg, services.SuccessMsg)
+	})
+}
+
+func TestGetBucketAccess(t *testing.T) {
+	t.Run("success", func(t *testing.T) {
+		log, _ := logger.NewLogger("text", "debug")
+		cs := &gcpcloudstorageservice.GCPConfigService{
+			Logger: log,
+			GCPUtils: &MockGCPUtils{
+				TestProbe: t,
+			},
+		}
+		services := cs.GetBucketAccess(context.TODO(), &models.GCPCloudStorageConfigRequest{
+			BucketName:               "backups",
+			GoogleServiceAccountFile: "dummy_file.json",
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "service_account",
+				ProjectID:               "dev",
+				PrivateKeyID:            "e123454a6668a89b970f703f",
+				PrivateKey:              "-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----\n\n",
+				ClientEmail:             "email@automate-backup-unit-testing.iam.gserviceaccount.com",
+				ClientID:                "65464654684864353165486",
+				AuthURI:                 "https://accounts.google.com",
+				TokenURI:                "https://accounts.google.com",
+				AuthProviderX509CertURL: "https://accounts.google.com",
+				ClientX509CertURL:       "https://accounts.google.com",
+				UniverseDomain:          "https://accounts.google.com",
+			},
+		})
+
+		assert.Equal(t, gcpBucketAccessSuccessMsg, services.SuccessMsg)
+	})
+
+	t.Run("Wrong Credentials", func(t *testing.T) {
+		log, _ := logger.NewLogger("text", "debug")
+		cs := &gcpcloudstorageservice.GCPConfigService{
+			Logger: log,
+			GCPUtils: &MockGCPUtils{
+				TestProbe:          t,
+				InvalidCredentials: true,
+			},
+		}
+
+		services := cs.GetBucketAccess(context.TODO(), &models.GCPCloudStorageConfigRequest{
+			BucketName:               "backups",
+			GoogleServiceAccountFile: "dummy_file.json",
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "service_account",
+				ProjectID:               "dev",
+				PrivateKeyID:            "e123454a6668a89b970f703f",
+				PrivateKey:              "-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----\n\n",
+				ClientEmail:             "email@automate-backup-unit-testing.iam.gserviceaccount.com",
+				ClientID:                "65464654684864353165486",
+				AuthURI:                 "https://accounts.google.com",
+				TokenURI:                "https://accounts.google.com",
+				AuthProviderX509CertURL: "https://accounts.google.com",
+				ClientX509CertURL:       "https://accounts.google.com",
+				UniverseDomain:          "https://accounts.google.com",
+			},
+		})
+
+		assert.Contains(t, services.ErrorMsg, constants.GCP_CONNECTION_ERROR_MSG)
+		assert.Equal(t, services.ResolutionMsg, constants.GCP_CONNECTION_RESOLUTION_MSG)
+	})
+
+	t.Run("error for upload", func(t *testing.T) {
+		log, _ := logger.NewLogger("text", "debug")
+		cs := &gcpcloudstorageservice.GCPConfigService{
+			Logger: log,
+			GCPUtils: &MockGCPUtils{
+				TestProbe:     t,
+				IsUploadError: true,
+			},
+		}
+		services := cs.GetBucketAccess(context.TODO(), &models.GCPCloudStorageConfigRequest{
+			BucketName: "backups",
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "service_account",
+				ProjectID:               "dev",
+				PrivateKeyID:            "e123454a6668a89b970f703f",
+				PrivateKey:              "-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----\n\n",
+				ClientEmail:             "email@automate-backup-unit-testing.iam.gserviceaccount.com",
+				ClientID:                "65464654684864353165486",
+				AuthURI:                 "https://accounts.google.com",
+				TokenURI:                "https://accounts.google.com",
+				AuthProviderX509CertURL: "https://accounts.google.com",
+				ClientX509CertURL:       "https://accounts.google.com",
+				UniverseDomain:          "https://accounts.google.com",
+			},
+		})
+
+		assert.Contains(t, services.ErrorMsg, constants.GCP_BUCKET_UPLOAD_ERROR_MSG)
+		assert.Equal(t, services.ResolutionMsg, constants.GCP_BUCKET_UPLOAD_RESOLUTION_MSG)
+	})
+
+	t.Run("error for list", func(t *testing.T) {
+		log, _ := logger.NewLogger("text", "debug")
+		cs := &gcpcloudstorageservice.GCPConfigService{
+			Logger: log,
+			GCPUtils: &MockGCPUtils{
+				TestProbe:   t,
+				IsListError: true,
+			},
+		}
+		services := cs.GetBucketAccess(context.TODO(), &models.GCPCloudStorageConfigRequest{
+			BucketName: "backups",
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "service_account",
+				ProjectID:               "dev",
+				PrivateKeyID:            "e123454a6668a89b970f703f",
+				PrivateKey:              "-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----\n\n",
+				ClientEmail:             "email@automate-backup-unit-testing.iam.gserviceaccount.com",
+				ClientID:                "65464654684864353165486",
+				AuthURI:                 "https://accounts.google.com",
+				TokenURI:                "https://accounts.google.com",
+				AuthProviderX509CertURL: "https://accounts.google.com",
+				ClientX509CertURL:       "https://accounts.google.com",
+				UniverseDomain:          "https://accounts.google.com",
+			},
+		})
+
+		assert.Contains(t, services.ErrorMsg, constants.GCP_BUCKET_LIST_ERROR_MSG)
+		assert.Equal(t, services.ResolutionMsg, constants.GCP_BUCKET_LIST_RESOLUTION_MSG)
+	})
+
+	t.Run("error for delete", func(t *testing.T) {
+		log, _ := logger.NewLogger("text", "debug")
+		cs := &gcpcloudstorageservice.GCPConfigService{
+			Logger: log,
+			GCPUtils: &MockGCPUtils{
+				TestProbe:        t,
+				IsDeleteObjError: true,
+			},
+		}
+		services := cs.GetBucketAccess(context.TODO(), &models.GCPCloudStorageConfigRequest{
+			BucketName: "backups",
+			GcpServiceAccount: &models.GcpServiceAccount{
+				Type:                    "service_account",
+				ProjectID:               "dev",
+				PrivateKeyID:            "e123454a6668a89b970f703f",
+				PrivateKey:              "-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----\n\n",
+				ClientEmail:             "email@automate-backup-unit-testing.iam.gserviceaccount.com",
+				ClientID:                "65464654684864353165486",
+				AuthURI:                 "https://accounts.google.com",
+				TokenURI:                "https://accounts.google.com",
+				AuthProviderX509CertURL: "https://accounts.google.com",
+				ClientX509CertURL:       "https://accounts.google.com",
+				UniverseDomain:          "https://accounts.google.com",
+			},
+		})
+
+		assert.Contains(t, services.ErrorMsg, constants.GCP_BUCKET_DELETE_ERROR_MSG)
+		assert.Equal(t, services.ResolutionMsg, constants.GCP_BUCKET_DELETE_RESOLUTION_MSG)
+	})
+}
diff --git a/lib/config/hadeployconfig_test.go b/lib/config/hadeployconfig_test.go
index 89bddbc9f..77c743cbd 100644
--- a/lib/config/hadeployconfig_test.go
+++ b/lib/config/hadeployconfig_test.go
@@ -1,7 +1,6 @@
 package config
 
 import (
-	"errors"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
@@ -819,19 +818,6 @@ Dv6bUUXSsZF4fb1diLIBpmD1hh8OGNY65LUPpzAxJeZvo5w=
 			},
 			wantErr: false,
 			err:     nil,
-		}, {
-			name:    "Parse OnPrem Config file not found",
-			args:    args{configFile: "./testdata/OnPremConfig.toml"},
-			want:    &HaDeployConfig{},
-			wantErr: true,
-			err:     errors.New("error reading config TOML file: open ./testdata/OnPremConfig.toml: no such file or directory"),
-		},
-		{
-			name:    "Error unmarshalling toml file",
-			args:    args{configFile: "./testdata/UnmarshalErr.toml"},
-			want:    &HaDeployConfig{},
-			wantErr: true,
-			err:     errors.New("error unmarshalling config TOML file: (5, 2): unexpected token table key cannot contain ']', was expecting a table key"),
 		},
 	}
 	for _, tt := range tests {
diff --git a/lib/config/hadeployconfigverify_test.go b/lib/config/hadeployconfigverify_test.go
index e564a6097..1d9a6d0dd 100644
--- a/lib/config/hadeployconfigverify_test.go
+++ b/lib/config/hadeployconfigverify_test.go
@@ -83,6 +83,27 @@ func TestParseAndVerify(t *testing.T) {
 			wantErr: true,
 			err:     errors.New("error unmarshalling config TOML file: (5, 2): unexpected token table key cannot contain ']', was expecting a table key"),
 		},
+		{
+			name: "Parse OnPrem Config file not found",
+			args: args{configFile: "./testdata/OnPremConfig.toml"},
+
+			wantErr: true,
+			err:     errors.New("error reading config TOML file: open ./testdata/OnPremConfig.toml: no such file or directory"),
+		},
+		{
+			name: "Error unmarshalling toml file",
+			args: args{configFile: "./testdata/UnmarshalErr.toml"},
+
+			wantErr: true,
+			err:     errors.New("error unmarshalling config TOML file: (5, 2): unexpected token table key cannot contain ']', was expecting a table key"),
+		},
+		{
+			name: "Success for gcs",
+			args: args{configFile: "./testdata/HaOnPremGcs.toml"},
+
+			wantErr: false,
+			err:     nil,
+		},
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -99,79 +120,127 @@ func TestParseAndVerify(t *testing.T) {
 
 func TestVerifyObjectStorage(t *testing.T) {
 	testCases := []struct {
-		name          string
-		objectStorage *ConfigObjectStorage
-		expectedError error
+		name           string
+		objectStorage  *ConfigObjectStorage
+		haDeployConfig *HaDeployConfig
+		expectedError  error
 	}{
 		{
 			name: "Valid Object Storage Configuration",
 			objectStorage: &ConfigObjectStorage{
+				Location:   AWS_S3,
 				BucketName: "my-bucket",
 				AccessKey:  "access-key",
 				SecretKey:  "secret-key",
 				Endpoint:   "https://example.com",
 				Region:     "us-east-1",
 			},
-			expectedError: nil,
+			haDeployConfig: &HaDeployConfig{},
+			expectedError:  nil,
 		},
 		{
 			name: "Missing Bucket Name",
 			objectStorage: &ConfigObjectStorage{
+				Location:  AWS_S3,
 				AccessKey: "access-key",
 				SecretKey: "secret-key",
 				Endpoint:  "https://example.com",
 				Region:    "us-east-1",
 			},
-			expectedError: errors.New("invalid or empty: bucket_name"),
+			haDeployConfig: &HaDeployConfig{},
+			expectedError:  errors.New("invalid or empty: bucket_name"),
 		},
 		{
 			name: "Missing Access Key",
 			objectStorage: &ConfigObjectStorage{
+				Location:   AWS_S3,
 				BucketName: "my-bucket",
 				SecretKey:  "secret-key",
 				Endpoint:   "https://example.com",
 				Region:     "us-east-1",
 			},
-			expectedError: errors.New("invalid or empty: access_key"),
+			haDeployConfig: &HaDeployConfig{},
+			expectedError:  errors.New("invalid or empty: access_key"),
 		},
 		{
 			name: "Missing Secret Key",
 			objectStorage: &ConfigObjectStorage{
+				Location:   AWS_S3,
 				BucketName: "my-bucket",
 				AccessKey:  "access-key",
 				Endpoint:   "https://example.com",
 				Region:     "us-east-1",
 			},
-			expectedError: errors.New("invalid or empty: secret_key"),
+			haDeployConfig: &HaDeployConfig{},
+			expectedError:  errors.New("invalid or empty: secret_key"),
 		},
 		{
 			name: "Missing Endpoint",
 			objectStorage: &ConfigObjectStorage{
+				Location:   AWS_S3,
 				BucketName: "my-bucket",
 				AccessKey:  "access-key",
 				SecretKey:  "secret-key",
 				Region:     "us-east-1",
 			},
-			expectedError: errors.New("invalid or empty: endpoint"),
+			haDeployConfig: &HaDeployConfig{},
+			expectedError:  errors.New("invalid or empty: endpoint"),
 		},
 		{
 			name: "Invalid Region",
 			objectStorage: &ConfigObjectStorage{
+				Location:   AWS_S3,
 				BucketName: "my-bucket",
 				AccessKey:  "access-key",
 				SecretKey:  "secret-key",
 				Endpoint:   "https://example.com",
 				Region:     "invalid-region",
 			},
-			expectedError: errors.New("invalid AWS region for S3"),
+			haDeployConfig: &HaDeployConfig{},
+			expectedError:  errors.New("invalid AWS region for S3"),
+		},
+		{
+			name: "Empty Bucket",
+			objectStorage: &ConfigObjectStorage{
+				Location:                 GCS_STORAGE,
+				GoogleServiceAccountFile: "./testdata/gcsservicefile.json",
+			},
+			haDeployConfig: &HaDeployConfig{},
+			expectedError:  errors.New("invalid or empty: bucket_name"),
+		},
+		{
+			name: "Empty ServiceFile",
+			objectStorage: &ConfigObjectStorage{
+				Location:                 GCS_STORAGE,
+				BucketName:               "bucket",
+				GoogleServiceAccountFile: "./testdata/servicefile.json",
+			},
+			haDeployConfig: &HaDeployConfig{},
+			expectedError:  errors.New("invalid google_service_account_file: ./testdata/servicefile.json no such file or directory"),
+		},
+		{
+			name: "Error For haDeployConfigDatabase",
+			objectStorage: &ConfigObjectStorage{
+				Location:                 GCS_STORAGE,
+				BucketName:               "bucket",
+				GoogleServiceAccountFile: "./testdata/servicefile.json",
+			},
+			haDeployConfig: &HaDeployConfig{
+				External: &ExternalSettings{
+					Database: &ExternalDBSettings{
+						Type: "aws",
+					},
+				},
+			},
+			expectedError: errors.New("invalid value 'gcs' for field 'location'. Expected values are: s3"),
 		},
 	}
 	for _, tc := range testCases {
 		t.Run(tc.name, func(t *testing.T) {
-			c := &HaDeployConfig{} // Initialize HaDeployConfig instance
-			err := c.verifyObjectStorage(tc.objectStorage)
-			if err == nil && tc.expectedError != nil {
-				t.Errorf("Expected error: %v, but got: %v", tc.expectedError, err)
+			// Initialize HaDeployConfig instance
+			err := tc.haDeployConfig.verifyObjectStorage(tc.objectStorage)
+			if err != nil && tc.expectedError != nil {
+				assert.EqualErrorf(t, err, tc.expectedError.Error(), "")
 			}
 		})
 	}
diff --git a/lib/config/testdata/HaOnPremGcs.toml b/lib/config/testdata/HaOnPremGcs.toml
new file mode 100644
index 000000000..186d8a603
--- /dev/null
+++ b/lib/config/testdata/HaOnPremGcs.toml
@@ -0,0 +1,121 @@
+# This is a Chef Automate on-prem HA mode configuration file. You can run
+# 'chef-automate deploy' with this config file and it should
+# successfully create a new Chef Automate HA instances with default settings.
+
+[architecture.existing_infra]
+## === INPUT NEEDED ===
+# Eg.: ssh_user = "ubuntu"
+ssh_user = "ubuntu"
+
+# custom ssh group name, it will be defaulted to ssh_user
+# Eg.: ssh_group_name = "ubuntu"
+ssh_group_name = "ubuntu"
+
+# private ssh key file path to access instances
+# Eg.: ssh_key_file = "~/.ssh/A2HA.pem"
+ssh_key_file = "./testdata/.ssh/A2HA.pem"
+
+# custome ssh port no to connect instances, default will be 22
+# Eg.: ssh_port = "22"
+ssh_port = "22"
+
+secrets_key_file = "/hab/a2_deploy_workspace/secrets.key"
+secrets_store_file = "/hab/a2_deploy_workspace/secrets.json"
+architecture = "existing_nodes"
+workspace_path = "/hab/a2_deploy_workspace"
+# DON'T MODIFY THE BELOW LINE (backup_mount)
+backup_mount = "automate_backups"
+
+# Eg.: backup_config = "object_storage" or "file_system"
+backup_config = "object_storage"
+
+# If backup_config = "object_storage" fill out [object_storage.config] as well 
+## Object storage similar to AWS S3 Bucket
+[object_storage.config]
+location = "gcs"
+bucket_name = "test"
+google_service_account_file = "./testdata/gcsservicefile.json"
+
+# [Optional] Mention object_storage region if applicable
+# Eg: region = "us-west-1"
+region = ""
+## === ===
+
+# ============== EC2 Nodes Config ======================
+[automate.config]
+## === INPUT NEEDED ===
+
+# Password for Automate UI for 'admin' user.
+admin_password = "chefautomate"
+
+
+# Automate Load Balancer FQDN eg.: "chefautomate.example.com"
+fqdn = "chefautomate.example.com"
+
+# No. of Automate Frontend Machine or VM eg.: instance_count = "2"
+instance_count = "2"
+
+## === ===
+
+
+# teams_port = ""
+config_file = "configs/automate.toml"
+root_ca = ""
+# Set enable_custom_certs = true to provide custom certificates during deployment
+enable_custom_certs = false
+# Add Automate load balancer root-ca and keys
+private_key = "a2_pvt_key"
+public_key = ""
+[[automate.config.certs_by_ip]]
+ip = "127.0.0.1"
+private_key = "a2_pvt_key"
+public_key = ""
+
+[chef_server.config]
+## === INPUT NEEDED ===
+
+# No. of Chef Server Frontend Machine or VM eg.: instance_count = "2"
+instance_count = "2"
+
+# Set enable_custom_certs = true to provide custom certificates during deployment
+enable_custom_certs = false
+# Add Chef Server load balancer keys
+private_key = ""
+public_key = ""
+
+
+## === ===
+
+[opensearch.config]
+## === INPUT NEEDED ===
+
+# No. of OpenSearch DB Backend Machine or VM eg.: instance_count = "3"
+instance_count = "3"
+
+# Set enable_custom_certs = true to provide custom certificates during deployment
+enable_custom_certs = false
+
+## === ===
+
+[postgresql.config]
+## === INPUT NEEDED ===
+
+# No. of Postgresql DB Backend Machine or VM eg.: instance_count = "3"
+instance_count = "3"
+
+# Set enable_custom_certs = true to provide custom certificates during deployment
+enable_custom_certs = false
+
+## === ===
+
+[existing_infra.config]
+## === INPUT NEEDED ===
+
+# provide comma-seperated IP addresses of nodes, like ["192.0.0.1", "192.0.0.2", "192.0.0.2"]
+# No. of IP address should be the same as the No. of instance_count count mentioned above in
+# automate.config, chef_server.config, opensearch.config and postgresql.config
+automate_private_ips = ["120.0.0.1","120.0.0.2"]
+chef_server_private_ips = ["120.0.0.3","120.0.0.4"]
+opensearch_private_ips = ["120.0.1.1","120.0.1.2","120.0.1.3"]
+postgresql_private_ips = ["120.0.1.4","120.0.1.5","120.0.1.6"]
+## === ===
\ No newline at end of file
diff --git a/lib/config/testdata/HaOnPremGcsFailed.toml b/lib/config/testdata/HaOnPremGcsFailed.toml
new file mode 100644
index 000000000..fffd3aa9c
--- /dev/null
+++ b/lib/config/testdata/HaOnPremGcsFailed.toml
@@ -0,0 +1,109 @@
+[architecture.existing_infra]
+# Eg.: backup_config = "object_storage" or "file_system"
+backup_config = "object_storage"
+
+# If backup_config = "object_storage" fill out [object_storage.config] as well 
+## Object storage similar to AWS S3 Bucket
+[object_storage.config]
+location = "gcs"
+bucket_name = "test"
+google_service_account_file = "./testdata/service.json"
+
+[automate.config]
+## === INPUT NEEDED ===
+
+# Password for Automate UI for 'admin' user.
+admin_password = ""
+
+
+# Automate Load Balancer FQDN eg.: "chefautomate.example.com"
+fqdn = "https://chefautomate.example.com"
+
+# No. of Automate Frontend Machine or VM eg.: instance_count = "2"
+instance_count = ""
+
+## === ===
+
+
+# teams_port = ""
+config_file = "automate.toml"
+root_ca = "a2_cert"
+# Set enable_custom_certs = true to provide custom certificates during deployment
+enable_custom_certs = true
+# Add Automate load balancer root-ca and keys
+private_key = "a2_pvt_key"
+public_key = "a2_public_key"
+[[automate.config.certs_by_ip]]
+ip = "127.0.0.1"
+private_key = "a2_pvt_key"
+public_key = "a2_public_key"
+
+[chef_server.config]
+## === INPUT NEEDED ===
+
+# No. of Chef Server Frontend Machine or VM eg.: instance_count = "2"
+instance_count = "two"
+
+# Set enable_custom_certs = true to provide custom certificates during deployment
+enable_custom_certs = true
+# Add Chef Server load balancer keys
+private_key = "cs_pvt_key"
+public_key = "cs_public_key"
+[[chef_server.config.certs_by_ip]]
+ip = "127.0.0.1"
+private_key = "cs_pvt_key"
+public_key = "cs_public_key"
+
+## === ===
+
+[opensearch.config]
+## === INPUT NEEDED ===
+
+# No. of OpenSearch DB Backend Machine or VM eg.: instance_count = "3"
+instance_count = ""
+
+# Set enable_custom_certs = true to provide custom certificates during deployment
+enable_custom_certs = true
+# Add OpenSearch load balancer root-ca and keys
+root_ca = "os_cert"
+admin_key = "os_admin_key"
+admin_cert = ""
+private_key = "os_pvt_key"
+public_key = "os_public_key"
+[[opensearch.config.certs_by_ip]]
+ip = ""
+private_key = "os_pvt_key"
+public_key = "os_public_key"
+
+## === ===
+
+[postgresql.config]
+## === INPUT NEEDED ===
+
+# No. of Postgresql DB Backend Machine or VM eg.: instance_count = "3"
+instance_count = ""
+
+# Set enable_custom_certs = true to provide custom certificates during deployment
+enable_custom_certs = true
+# Add postgresql load balancer root-ca and keys
+root_ca = "pg_cert"
+private_key = "pg_pvt_key"
+public_key = "pg_pvt_key"
+[[postgresql.config.certs_by_ip]]
+ip = "0.0.1"
+private_key = "pg_pvt_key"
+public_key = "pg_pvt_key"
+
+## === ===
+
+[existing_infra.config]
+## === INPUT NEEDED ===
+
+# provide comma-seperated IP addresses of nodes, like ["192.0.0.1", "192.0.0.2", "192.0.0.2"]
+# No. of IP address should be the same as the No. of instance_count count mentioned above in
+# automate.config, chef_server.config, opensearch.config and postgresql.config
+automate_private_ips = ["1324.2534.1"]
+chef_server_private_ips = []
+opensearch_private_ips = []
+postgresql_private_ips = []
+## === ===
\ No newline at end of file
diff --git a/lib/config/testdata/gcsservicefile.json b/lib/config/testdata/gcsservicefile.json
new file mode 100644
index 000000000..5ce5ca427
--- /dev/null
+++ b/lib/config/testdata/gcsservicefile.json
@@ -0,0 +1,13 @@
+{
+  "type": "service_account",
+  "project_id": "dev",
+  "private_key_id": "e123454a6668a89b970f703f",
+  "private_key": "-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----\n",
+  "client_email": "abc.gserviceaccount.com",
+  "client_id": "1146674505608030",
+  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+  "token_uri": "https://oauth2.googleapis.com/token",
+  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
+  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/test",
+  "universe_domain": "main"
+}
\ No newline at end of file