anthos-attached-clusters/modules/attached-install-mesh/main.tf (219 lines of code) (raw):

/** * Copyright 2018-2024 Google LLC * * 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. */ locals { tmp_credentials_path = "${path.module}/terraform-google-credentials.json" cache_path = "${path.module}/.cache/${random_id.cache.hex}" gcloud_tar_path = "${local.cache_path}/google-cloud-sdk.tar.gz" gcloud_bin_path = "${local.cache_path}/google-cloud-sdk/bin" gcloud_bin_abs_path = abspath(local.gcloud_bin_path) gcloud = "${local.gcloud_bin_path}/gcloud" gcloud_download_url = var.gcloud_download_url != null ? var.gcloud_download_url : "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${var.gcloud_sdk_version}-${var.platform}-x86_64.tar.gz" jq_platform = var.platform == "darwin" ? "osx-amd" : var.platform jq_download_url = var.jq_download_url != null ? var.jq_download_url : "https://github.com/stedolan/jq/releases/download/jq-${var.jq_version}/jq-${local.jq_platform}64" asmcli_download_url = var.asmcli_download_url != null ? var.asmcli_download_url : "https://storage.googleapis.com/csm-artifacts/asm/asmcli_${var.asmcli_version}" asmcli_options = join("", [ " --ca ${var.asmcli_ca}", var.asmcli_enable_all ? " --enable_all" : "", var.asmcli_enable_cluster_roles ? " --enable_cluster_roles" : "", var.asmcli_enable_cluster_labels ? " --enable_cluster_labels" : "", var.asmcli_enable_gcp_components ? " --enable_gcp_components" : "", var.asmcli_enable_gcp_apis ? " --enable_gcp_apis" : "", var.asmcli_enable_gcp_iam_roles ? " --enable_gcp_iam_roles" : "", var.asmcli_enable_meshconfig_init ? " --enable_meshconfig_init" : "", var.asmcli_enable_namespace_creation ? " --enable_namespace_creation" : "", var.asmcli_enable_registration ? " --enable_registration" : "", var.asmcli_verbose ? " --verbose" : "", var.asmcli_additional_arguments != null ? " ${var.asmcli_additional_arguments}" : "" ]) cmd_entrypoint = "${local.gcloud_bin_path}/asmcli" create_cmd_body = "install --kubeconfig ${var.kubeconfig} --context ${var.context} --fleet_id ${var.fleet_id} --platform multicloud --option attached-cluster${local.asmcli_options}" wait = length(null_resource.additional_components[*].triggers) + length( null_resource.gcloud_auth_service_account_key_file[*].triggers, ) + length(null_resource.gcloud_auth_google_credentials[*].triggers, ) + length(null_resource.run_command[*].triggers) prepare_cache_command = "mkdir -p ${local.cache_path}" download_gcloud_command = "curl -sL -o ${local.cache_path}/google-cloud-sdk.tar.gz ${local.gcloud_download_url}" download_jq_command = "curl -sL -o ${local.cache_path}/jq ${local.jq_download_url} && chmod +x ${local.cache_path}/jq" download_asmcli_command = "curl -sL -o ${local.cache_path}/asmcli ${local.asmcli_download_url} && chmod +x ${local.cache_path}/asmcli" decompress_command = "tar -xzf ${local.gcloud_tar_path} -C ${local.cache_path} && cp ${local.cache_path}/jq ${local.cache_path}/google-cloud-sdk/bin/ && cp ${local.cache_path}/asmcli ${local.cache_path}/google-cloud-sdk/bin/" additional_components_command = "${path.module}/scripts/check_components.sh ${local.gcloud} kubectl" gcloud_auth_service_account_key_file_command = "${local.gcloud} auth activate-service-account --key-file ${var.service_account_key_file}" activate_service_account = var.activate_service_account ? "${local.gcloud} auth activate-service-account --key-file ${local.tmp_credentials_path}" : "true" gcloud_auth_google_credentials_command = <<-EOT printf "%s" "$GOOGLE_CREDENTIALS" > ${local.tmp_credentials_path} && \ ${local.activate_service_account} EOT } resource "random_id" "cache" { byte_length = 4 } resource "null_resource" "prepare_cache" { triggers = { arguments = md5(local.create_cmd_body) prepare_cache_command = local.prepare_cache_command } provisioner "local-exec" { when = create command = self.triggers.prepare_cache_command } } resource "null_resource" "download_gcloud" { triggers = { arguments = md5(local.create_cmd_body) download_gcloud_command = local.download_gcloud_command version = var.gcloud_sdk_version } provisioner "local-exec" { when = create command = self.triggers.download_gcloud_command } depends_on = [null_resource.prepare_cache] } resource "null_resource" "download_jq" { triggers = { arguments = md5(local.create_cmd_body) download_jq_command = local.download_jq_command version = var.jq_version } provisioner "local-exec" { when = create command = self.triggers.download_jq_command } depends_on = [null_resource.prepare_cache] } resource "null_resource" "download_asmcli" { triggers = { arguments = md5(local.create_cmd_body) download_asmcli_command = local.download_asmcli_command version = var.asmcli_version } provisioner "local-exec" { when = create command = self.triggers.download_asmcli_command } depends_on = [null_resource.prepare_cache] } resource "null_resource" "decompress" { triggers = { arguments = md5(local.create_cmd_body) decompress_command = local.decompress_command download_gcloud_command = local.download_gcloud_command download_jq_command = local.download_jq_command download_asmcli_command = local.download_asmcli_command } provisioner "local-exec" { when = create command = self.triggers.decompress_command } depends_on = [null_resource.download_gcloud, null_resource.download_jq, null_resource.download_asmcli] } resource "null_resource" "additional_components" { depends_on = [null_resource.decompress] triggers = { arguments = md5(local.create_cmd_body) additional_components_command = local.additional_components_command } provisioner "local-exec" { when = create command = self.triggers.additional_components_command } } resource "null_resource" "gcloud_auth_service_account_key_file" { count = length(var.service_account_key_file) > 0 ? 1 : 0 depends_on = [null_resource.decompress] triggers = { arguments = md5(local.create_cmd_body) gcloud_auth_service_account_key_file_command = local.gcloud_auth_service_account_key_file_command } provisioner "local-exec" { when = create command = self.triggers.gcloud_auth_service_account_key_file_command } } resource "null_resource" "gcloud_auth_google_credentials" { count = var.use_tf_google_credentials_env_var ? 1 : 0 depends_on = [null_resource.decompress] triggers = { arguments = md5(local.create_cmd_body) gcloud_auth_google_credentials_command = local.gcloud_auth_google_credentials_command } provisioner "local-exec" { when = create command = self.triggers.gcloud_auth_google_credentials_command } } resource "null_resource" "run_command" { depends_on = [ null_resource.decompress, null_resource.additional_components, null_resource.gcloud_auth_google_credentials, null_resource.gcloud_auth_service_account_key_file ] triggers = { arguments = md5(local.create_cmd_body) cmd_entrypoint = local.cmd_entrypoint create_cmd_body = local.create_cmd_body gcloud_bin_abs_path = local.gcloud_bin_abs_path } provisioner "local-exec" { when = create command = <<-EOT PATH=${self.triggers.gcloud_bin_abs_path}:$PATH ${self.triggers.cmd_entrypoint} ${self.triggers.create_cmd_body} EOT environment = { PROJECT_ID = "" } } } resource "null_resource" "gcloud_auth_google_credentials_destroy" { count = var.use_tf_google_credentials_env_var ? 1 : 0 triggers = { gcloud_auth_google_credentials_command = local.gcloud_auth_google_credentials_command } provisioner "local-exec" { when = destroy command = self.triggers.gcloud_auth_google_credentials_command } } resource "null_resource" "gcloud_auth_service_account_key_file_destroy" { count = length(var.service_account_key_file) > 0 ? 1 : 0 triggers = { gcloud_auth_service_account_key_file_command = local.gcloud_auth_service_account_key_file_command } provisioner "local-exec" { when = destroy command = self.triggers.gcloud_auth_service_account_key_file_command } } resource "null_resource" "additional_components_destroy" { triggers = { additional_components_command = local.additional_components_command } provisioner "local-exec" { when = destroy command = self.triggers.additional_components_command } } resource "null_resource" "decompress_destroy" { triggers = { decompress_command = local.decompress_command } provisioner "local-exec" { when = destroy command = self.triggers.decompress_command } }