terraform/env/main.tf (291 lines of code) (raw):
# Copyright (c) 2024-2025 Accenture, All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Description:
# Main configuration file contains GCP project details such as
# project ID, region, zone, network etc. Set up service accounts and
# the required secrets.
module "base" {
source = "../modules/base"
# The project is used by provider.tf to define the GCP project
sdv_project = var.sdv_gcp_project_id
sdv_location = var.sdv_gcp_cloud_region
sdv_region = var.sdv_gcp_cloud_region
sdv_zone = var.sdv_gcp_cloud_zone
sdv_network = "sdv-network"
sdv_subnetwork = "sdv-subnet"
sdv_computer_sa = var.sdv_computer_sa
sdv_list_of_apis = toset([
"compute.googleapis.com",
"dns.googleapis.com",
"oslogin.googleapis.com",
"monitoring.googleapis.com",
"secretmanager.googleapis.com",
"iamcredentials.googleapis.com",
"container.googleapis.com",
"cloudresourcemanager.googleapis.com",
"autoscaling.googleapis.com",
"iam.googleapis.com",
"certificatemanager.googleapis.com",
"file.googleapis.com",
"sts.googleapis.com",
"artifactregistry.googleapis.com",
"iap.googleapis.com",
"serviceusage.googleapis.com",
"networkconnectivity.googleapis.com",
"networkmanagement.googleapis.com",
"integrations.googleapis.com"
])
sdv_cluster_name = "sdv-cluster"
sdv_cluster_node_pool_name = "sdv-node-pool"
sdv_cluster_node_pool_machine_type = "n1-standard-4"
sdv_cluster_node_pool_count = 3
sdv_cluster_node_locations = [
"${var.sdv_gcp_cloud_zone}"
]
sdv_build_node_pool_machine_type = "c2d-highcpu-112"
sdv_build_node_pool_max_node_count = 20
sdv_bastion_host_name = "sdv-bastion-host"
sdv_bastion_host_sa = "sdv-bastion-host-sa-iap"
sdv_bastion_host_members = []
sdv_network_egress_router_name = "sdv-egress-internet"
sdv_artifact_registry_repository_id = "horizon-sdv"
sdv_artifact_registry_repository_members = []
sdv_artifact_registry_repository_reader_members = [
"serviceAccount:${var.sdv_computer_sa}",
]
sdv_ssl_certificate_name = "horizon-sdv"
sdv_ssl_certificate_domain = "${var.sdv_gh_env_name}.${var.sdv_gh_domain_name}"
#
# To create a new SA with access from GKE to GC, add a new saN block.
#
sdv_wi_service_accounts = {
sa1 = {
account_id = "gke-jenkins-sa"
display_name = "jenkins SA"
description = "the deployment of jenkins in GKE cluster makes use of this account through WIF"
gke_sas = [
{
gke_ns = "jenkins"
gke_sa = "jenkins-sa"
},
{
gke_ns = "jenkins"
gke_sa = "jenkins"
}
]
roles = toset([
"roles/storage.objectUser",
"roles/artifactregistry.writer",
"roles/secretmanager.secretAccessor",
"roles/iam.serviceAccountTokenCreator",
"roles/container.admin",
"roles/iap.tunnelResourceAccessor",
"roles/iam.serviceAccountUser",
"roles/compute.instanceAdmin.v1"
])
},
sa2 = {
account_id = "gke-argocd-sa"
display_name = "gke-argocd SA"
description = "argocd/argocd-sa in GKE cluster makes use of this account through WI"
gke_sas = [
{
gke_ns = "argocd"
gke_sa = "argocd-sa"
}
]
roles = toset([
"roles/secretmanager.secretAccessor",
"roles/iam.serviceAccountTokenCreator",
])
},
sa3 = {
account_id = "gke-keycloak-sa"
display_name = "keycloak SA"
description = "keycloak/keycloak-sa in GKE cluster makes use of this account through WI"
gke_sas = [
{
gke_ns = "keycloak"
gke_sa = "keycloak-sa"
}
]
roles = toset([
"roles/secretmanager.secretAccessor",
"roles/iam.serviceAccountTokenCreator",
])
},
sa4 = {
account_id = "gke-gerrit-sa"
display_name = "gke-gerrit SA"
description = "gerrit/gerrit-sa in GKE cluster makes use of this account through WI"
gke_sas = [
{
gke_ns = "gerrit"
gke_sa = "gerrit-sa"
}
]
roles = toset([
"roles/secretmanager.secretAccessor",
"roles/iam.serviceAccountTokenCreator",
])
}
}
#
# Define the secrets and values and gke access rules
sdv_gcp_secrets_map = {
s1 = {
secret_id = "githubAppID"
value = var.sdv_gh_app_id
use_github_value = true
gke_access = [
{
ns = "argocd"
sa = "argocd-sa"
},
{
ns = "jenkins"
sa = "jenkins-sa"
}
]
}
s2 = {
secret_id = "githubAppInstallationID"
value = var.sdv_gh_installation_id
use_github_value = true
gke_access = [
{
ns = "argocd"
sa = "argocd-sa"
},
{
ns = "jenkins"
sa = "jenkins-sa"
}
]
}
s3 = {
secret_id = "githubAppPrivateKey"
value = var.sdv_gh_app_key
use_github_value = true
gke_access = [
{
ns = "argocd"
sa = "argocd-sa"
},
{
ns = "jenkins"
sa = "jenkins-sa"
}
]
}
s4 = {
secret_id = "keycloakIdpCredentials"
value = "dummy"
use_github_value = false
gke_access = [
{
ns = "keycloak"
sa = "keycloak-sa"
}
]
}
s5 = {
secret_id = "argocdInitialPassword"
value = var.sdv_gh_argocd_initial_password_bcrypt
use_github_value = true
gke_access = [
{
ns = "argocd"
sa = "argocd-sa"
},
]
}
s6 = {
secret_id = "jenkinsInitialPassword"
value = var.sdv_gh_jenkins_initial_password
use_github_value = true
gke_access = [
{
ns = "jenkins"
sa = "jenkins-sa"
},
]
}
s7 = {
secret_id = "keycloakInitialPassword"
value = var.sdv_gh_keycloak_initial_password
use_github_value = true
gke_access = [
{
ns = "keycloak"
sa = "keycloak-sa"
},
]
}
s8 = {
secret_id = "githubAppPrivateKeyPKCS8"
value = var.sdv_gh_app_key_pkcs8
use_github_value = true
gke_access = [
{
ns = "jenkins"
sa = "jenkins"
}
]
}
# GCP secret name: gerrit-admin-initial-password
# WI to GKE at ns/gerrit/sa/gerrit-sa.
s9 = {
secret_id = "gerritAdminInitialPassword"
value = var.sdv_gh_gerrit_admin_initial_password
use_github_value = true
gke_access = [
{
ns = "gerrit"
sa = "gerrit-sa"
}
]
}
# GCP secret name: gh-gerrit-admin-private-key
# WI to GKE at ns/gerrit/sa/gerrit-sa.
s10 = {
secret_id = "gerritAdminPrivateKey"
value = var.sdv_gh_gerrit_admin_private_key
use_github_value = true
gke_access = [
{
ns = "gerrit"
sa = "gerrit-sa"
}
]
}
# GCP secret name: gh-keycloak-horizon-admin-password
# WI to GKE at ns/jenkins/sa/jenkins-sa.
s11 = {
secret_id = "keycloakHorizonAdminPassword"
value = var.sdv_gh_keycloak_horizon_admin_password
use_github_value = true
gke_access = [
{
ns = "jenkins"
sa = "jenkins-sa"
}
]
}
# GCP secret name: gh-cuttlefish-vm-ssh-private-key
# WI to GKE at ns/jenkins/sa/jenkins-sa.
s12 = {
secret_id = "jenkinsCuttlefishVmSshPrivateKey"
value = var.sdv_gh_cuttlefish_vm_ssh_private_key
use_github_value = true
gke_access = [
{
ns = "jenkins"
sa = "jenkins-sa"
}
]
}
}
sdv_bastion_host_bash_command = <<EOT
export GITHUB_ACCESS_TOKEN=${var.sdv_gh_access_token}
echo $GITHUB_ACCESS_TOKEN
export GITHUB_REPO_NAME=${var.sdv_gh_repo_name}
echo $GITHUB_REPO_NAME
export GITHUB_ENV_NAME=${var.sdv_gh_env_name}
echo $GITHUB_ENV_NAME
export GITHUB_DOMAIN_NAME=${var.sdv_gh_domain_name}
echo $GITHUB_DOMAIN_NAME
export GCP_PROJECT_ID=${var.sdv_gcp_project_id}
echo $GCP_PROJECT_ID
export GCP_COMPUTER_SA=${var.sdv_computer_sa}
echo $GCP_COMPUTER_SA
export GCP_CLOUD_REGION=${var.sdv_gcp_cloud_region}
echo $GCP_CLOUD_REGION
export GCP_CLOUD_ZONE=${var.sdv_gcp_cloud_zone}
echo $GCP_CLOUD_ZONE
cd bash-scripts
chmod +x stage1.sh
./stage1.sh
cd -
EOT
}