blob: 74c1fc3e66c5084112186e39367ab3535e43bff6 [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package gkehub2_test
import (
"fmt"
"strings"
"testing"
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/hashicorp/terraform-plugin-testing/terraform"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/envvar"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
)
func TestAccGKEHubFeature_gkehubFeatureFleetObservability(t *testing.T) {
// VCR fails to handle batched project services
acctest.SkipIfVcr(t)
t.Parallel()
context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
"org_id": envvar.GetTestOrgFromEnv(t),
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
}
acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckGKEHubFeatureDestroyProducer(t),
ExternalProviders: map[string]resource.ExternalProvider{
"time": {},
},
Steps: []resource.TestStep{
{
Config: testAccGKEHubFeature_gkehubFeatureFleetObservability(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
{
Config: testAccGKEHubFeature_gkehubFeatureFleetObservabilityUpdate1(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
{
Config: testAccGKEHubFeature_gkehubFeatureFleetObservabilityUpdate2(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
},
})
}
func testAccGKEHubFeature_gkehubFeatureFleetObservability(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "time_sleep" "wait_for_gkehub_enablement" {
create_duration = "150s"
depends_on = [google_project_service.gkehub]
}
resource "google_gke_hub_feature" "feature" {
name = "fleetobservability"
location = "global"
project = google_project.project.project_id
spec {
fleetobservability {
logging_config {
default_config {
mode = "MOVE"
}
fleet_scope_logs_config {
mode = "COPY"
}
}
}
}
depends_on = [time_sleep.wait_for_gkehub_enablement]
}
`, context)
}
func testAccGKEHubFeature_gkehubFeatureFleetObservabilityUpdate1(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "time_sleep" "wait_for_gkehub_enablement" {
create_duration = "150s"
depends_on = [google_project_service.gkehub]
}
resource "google_gke_hub_feature" "feature" {
name = "fleetobservability"
location = "global"
project = google_project.project.project_id
spec {
fleetobservability {
logging_config {
default_config {
mode = "MOVE"
}
}
}
}
depends_on = [time_sleep.wait_for_gkehub_enablement]
}
`, context)
}
func testAccGKEHubFeature_gkehubFeatureFleetObservabilityUpdate2(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "time_sleep" "wait_for_gkehub_enablement" {
create_duration = "150s"
depends_on = [google_project_service.gkehub]
}
resource "google_gke_hub_feature" "feature" {
name = "fleetobservability"
location = "global"
project = google_project.project.project_id
spec {
fleetobservability {
logging_config {
fleet_scope_logs_config {
mode = "COPY"
}
}
}
}
depends_on = [time_sleep.wait_for_gkehub_enablement]
}
`, context)
}
func gkeHubFeatureProjectSetup(context map[string]interface{}) string {
return acctest.Nprintf(`
resource "google_project" "project" {
name = "tf-test-gkehub%{random_suffix}"
project_id = "tf-test-gkehub%{random_suffix}"
org_id = "%{org_id}"
billing_account = "%{billing_account}"
provider = google-beta
deletion_policy = "DELETE"
}
resource "google_project_service" "mesh" {
project = google_project.project.project_id
service = "meshconfig.googleapis.com"
provider = google-beta
}
resource "google_project_service" "mci" {
project = google_project.project.project_id
service = "multiclusteringress.googleapis.com"
provider = google-beta
}
resource "google_project_service" "acm" {
project = google_project.project.project_id
service = "anthosconfigmanagement.googleapis.com"
provider = google-beta
}
resource "google_project_service" "mcsd" {
project = google_project.project.project_id
service = "multiclusterservicediscovery.googleapis.com"
provider = google-beta
}
resource "google_project_service" "compute" {
project = google_project.project.project_id
service = "compute.googleapis.com"
disable_on_destroy = false
provider = google-beta
}
resource "google_project_service" "container" {
project = google_project.project.project_id
service = "container.googleapis.com"
disable_on_destroy = false
provider = google-beta
}
resource "google_project_service" "gkehub" {
project = google_project.project.project_id
service = "gkehub.googleapis.com"
disable_on_destroy = false
provider = google-beta
}
`, context)
}
func TestAccGKEHubFeature_gkehubFeatureMciUpdate(t *testing.T) {
// VCR fails to handle batched project services
acctest.SkipIfVcr(t)
t.Parallel()
context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
"org_id": envvar.GetTestOrgFromEnv(t),
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
}
acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckGKEHubFeatureDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccGKEHubFeature_gkehubFeatureMciUpdateStart(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"update_time"},
},
{
Config: testAccGKEHubFeature_gkehubFeatureMciChangeMembership(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"update_time", "labels", "terraform_labels"},
},
},
})
}
func testAccGKEHubFeature_gkehubFeatureMciUpdateStart(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_container_cluster" "primary" {
name = "tf-test%{random_suffix}"
location = "us-central1-a"
initial_node_count = 1
project = google_project.project.project_id
deletion_protection = false
depends_on = [google_project_service.mci, google_project_service.container, google_project_service.container, google_project_service.gkehub]
}
resource "google_container_cluster" "secondary" {
name = "tf-test2%{random_suffix}"
location = "us-central1-a"
initial_node_count = 1
project = google_project.project.project_id
deletion_protection = false
depends_on = [google_project_service.mci, google_project_service.container, google_project_service.container, google_project_service.gkehub]
}
resource "google_gke_hub_membership" "membership" {
membership_id = "tf-test%{random_suffix}"
endpoint {
gke_cluster {
resource_link = "//container.googleapis.com/${google_container_cluster.primary.id}"
}
}
project = google_project.project.project_id
}
resource "google_gke_hub_membership" "membership_second" {
membership_id = "tf-test2%{random_suffix}"
endpoint {
gke_cluster {
resource_link = "//container.googleapis.com/${google_container_cluster.secondary.id}"
}
}
project = google_project.project.project_id
}
resource "google_gke_hub_feature" "feature" {
name = "multiclusteringress"
location = "global"
spec {
multiclusteringress {
config_membership = google_gke_hub_membership.membership.id
}
}
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_gkehubFeatureMciChangeMembership(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_container_cluster" "primary" {
name = "tf-test%{random_suffix}"
location = "us-central1-a"
initial_node_count = 1
project = google_project.project.project_id
deletion_protection = false
depends_on = [google_project_service.mci, google_project_service.container, google_project_service.container, google_project_service.gkehub]
}
resource "google_container_cluster" "secondary" {
name = "tf-test2%{random_suffix}"
location = "us-central1-a"
initial_node_count = 1
project = google_project.project.project_id
deletion_protection = false
depends_on = [google_project_service.mci, google_project_service.container, google_project_service.container, google_project_service.gkehub]
}
resource "google_gke_hub_membership" "membership" {
membership_id = "tf-test%{random_suffix}"
endpoint {
gke_cluster {
resource_link = "//container.googleapis.com/${google_container_cluster.primary.id}"
}
}
project = google_project.project.project_id
}
resource "google_gke_hub_membership" "membership_second" {
membership_id = "tf-test2%{random_suffix}"
endpoint {
gke_cluster {
resource_link = "//container.googleapis.com/${google_container_cluster.secondary.id}"
}
}
project = google_project.project.project_id
}
resource "google_gke_hub_feature" "feature" {
name = "multiclusteringress"
location = "global"
spec {
multiclusteringress {
config_membership = google_gke_hub_membership.membership_second.id
}
}
labels = {
foo = "bar"
}
project = google_project.project.project_id
}
`, context)
}
func TestAccGKEHubFeature_FleetDefaultMemberConfigServiceMesh(t *testing.T) {
// VCR fails to handle batched project services
acctest.SkipIfVcr(t)
t.Parallel()
context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
"org_id": envvar.GetTestOrgFromEnv(t),
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
}
acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckGKEHubFeatureDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigServiceMesh(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"project"},
},
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigServiceMeshUpdate(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigServiceMeshRemovalUpdate(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigServiceMeshReAddUpdate(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
},
})
}
func testAccGKEHubFeature_FleetDefaultMemberConfigServiceMesh(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "servicemesh"
location = "global"
fleet_default_member_config {
mesh {
management = "MANAGEMENT_AUTOMATIC"
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.mesh]
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_FleetDefaultMemberConfigServiceMeshUpdate(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "servicemesh"
location = "global"
fleet_default_member_config {
mesh {
management = "MANAGEMENT_MANUAL"
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.mesh]
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_FleetDefaultMemberConfigServiceMeshRemovalUpdate(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "servicemesh"
location = "global"
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.mesh]
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_FleetDefaultMemberConfigServiceMeshReAddUpdate(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "servicemesh"
location = "global"
fleet_default_member_config {
mesh {
management = "MANAGEMENT_MANUAL"
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.mesh]
project = google_project.project.project_id
}
`, context)
}
func TestAccGKEHubFeature_FleetDefaultMemberConfigConfigManagement(t *testing.T) {
// VCR fails to handle batched project services
acctest.SkipIfVcr(t)
t.Parallel()
context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
"org_id": envvar.GetTestOrgFromEnv(t),
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
}
acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckGKEHubFeatureDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagement(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"project"},
},
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagementUpdate(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagementEnableAutomaticManagementUpdate(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagementRemovalUpdate(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagementAutomaticManagement(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
},
})
}
func testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagementAutomaticManagement(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "configmanagement"
location = "global"
fleet_default_member_config {
configmanagement {
management = "MANAGEMENT_AUTOMATIC"
config_sync {
enabled = true
}
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.acm]
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagement(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "configmanagement"
location = "global"
fleet_default_member_config {
configmanagement {
version = "1.16.0"
config_sync {
source_format = "hierarchy"
git {
sync_repo = "https://github.com/GoogleCloudPlatform/magic-modules"
sync_branch = "master"
policy_dir = "."
sync_rev = "HEAD"
secret_type = "none"
sync_wait_secs = "15"
}
}
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.acm]
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagementUpdate(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "configmanagement"
location = "global"
fleet_default_member_config {
configmanagement {
version = "1.16.1"
management = "MANAGEMENT_MANUAL"
config_sync {
enabled = true
prevent_drift = true
source_format = "unstructured"
oci {
sync_repo = "us-central1-docker.pkg.dev/corp-gke-build-artifacts/acm/configs:latest"
policy_dir = "/acm/nonprod-root/"
secret_type = "gcpserviceaccount"
sync_wait_secs = "15"
gcp_service_account_email = "gke-cluster@gke-foo-nonprod.iam.gserviceaccount.com"
}
}
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.acm]
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagementEnableAutomaticManagementUpdate(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "configmanagement"
location = "global"
fleet_default_member_config {
configmanagement {
version = "1.16.1"
management = "MANAGEMENT_AUTOMATIC"
config_sync {
prevent_drift = true
source_format = "unstructured"
oci {
sync_repo = "us-central1-docker.pkg.dev/corp-gke-build-artifacts/acm/configs:latest"
policy_dir = "/acm/nonprod-root/"
secret_type = "gcpserviceaccount"
sync_wait_secs = "15"
gcp_service_account_email = "gke-cluster@gke-foo-nonprod.iam.gserviceaccount.com"
}
}
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.acm]
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_FleetDefaultMemberConfigConfigManagementRemovalUpdate(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "configmanagement"
location = "global"
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.acm]
project = google_project.project.project_id
}
`, context)
}
func TestAccGKEHubFeature_Clusterupgrade(t *testing.T) {
// VCR fails to handle batched project services
acctest.SkipIfVcr(t)
t.Parallel()
context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
"org_id": envvar.GetTestOrgFromEnv(t),
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
}
acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckGKEHubFeatureDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccGKEHubFeature_Clusterupgrade(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"project", "update_time"},
},
{
Config: testAccGKEHubFeature_ClusterupgradeUpdate(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"update_time"},
},
},
})
}
func testAccGKEHubFeature_Clusterupgrade(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "clusterupgrade"
location = "global"
spec {
clusterupgrade {
upstream_fleets = []
post_conditions {
soaking = "60s"
}
}
}
depends_on = [google_project_service.gkehub]
project = google_project.project.project_id
}
resource "google_gke_hub_feature" "feature_2" {
name = "clusterupgrade"
location = "global"
spec {
clusterupgrade {
upstream_fleets = []
post_conditions {
soaking = "60s"
}
}
}
depends_on = [google_project_service.gkehub_2]
project = google_project.project_2.project_id
}
`, context)
}
func testAccGKEHubFeature_ClusterupgradeUpdate(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "clusterupgrade"
location = "global"
spec {
clusterupgrade {
upstream_fleets = [google_project.project_2.number]
post_conditions {
soaking = "120s"
}
gke_upgrade_overrides {
upgrade {
name = "k8s_control_plane"
version = "1.22.1-gke.100"
}
post_conditions {
soaking = "240s"
}
}
}
}
project = google_project.project.project_id
}
resource "google_gke_hub_feature" "feature_2" {
name = "clusterupgrade"
location = "global"
spec {
clusterupgrade {
upstream_fleets = []
post_conditions {
soaking = "60s"
}
}
}
depends_on = [google_project_service.gkehub_2]
project = google_project.project_2.project_id
}
`, context)
}
func TestAccGKEHubFeature_FleetDefaultMemberConfigPolicyController(t *testing.T) {
// VCR fails to handle batched project services
acctest.SkipIfVcr(t)
t.Parallel()
context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
"org_id": envvar.GetTestOrgFromEnv(t),
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
}
acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckGKEHubFeatureDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigPolicyController(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"project", "update_time"},
},
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigPolicyControllerFull(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
{
Config: testAccGKEHubFeature_FleetDefaultMemberConfigPolicyControllerMinimal(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
},
},
})
}
func testAccGKEHubFeature_FleetDefaultMemberConfigPolicyController(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "policycontroller"
location = "global"
fleet_default_member_config {
policycontroller {
policy_controller_hub_config {
install_spec = "INSTALL_SPEC_ENABLED"
exemptable_namespaces = ["foo"]
policy_content {
bundles {
bundle = "policy-essentials-v2022"
exempted_namespaces = ["foo", "bar"]
}
}
audit_interval_seconds = 30
referential_rules_enabled = true
}
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.poco]
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_FleetDefaultMemberConfigPolicyControllerFull(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "policycontroller"
location = "global"
fleet_default_member_config {
policycontroller {
policy_controller_hub_config {
install_spec = "INSTALL_SPEC_SUSPENDED"
policy_content {
bundles {
bundle = "pci-dss-v3.2.1"
exempted_namespaces = ["baz", "bar"]
}
bundles {
bundle = "nist-sp-800-190"
exempted_namespaces = []
}
template_library {
installation = "ALL"
}
}
constraint_violation_limit = 50
referential_rules_enabled = true
log_denies_enabled = true
mutation_enabled = true
deployment_configs {
component = "admission"
replica_count = 2
pod_affinity = "ANTI_AFFINITY"
}
deployment_configs {
component = "audit"
container_resources {
limits {
memory = "1Gi"
cpu = "1.5"
}
requests {
memory = "500Mi"
cpu = "150m"
}
}
pod_toleration {
key = "key1"
operator = "Equal"
value = "value1"
effect = "NoSchedule"
}
}
monitoring {
backends = [
"PROMETHEUS"
]
}
}
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.poco]
project = google_project.project.project_id
}
`, context)
}
func testAccGKEHubFeature_FleetDefaultMemberConfigPolicyControllerMinimal(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "policycontroller"
location = "global"
fleet_default_member_config {
policycontroller {
policy_controller_hub_config {
install_spec = "INSTALL_SPEC_ENABLED"
policy_content {}
constraint_violation_limit = 50
referential_rules_enabled = true
log_denies_enabled = true
mutation_enabled = true
deployment_configs {
component = "admission"
}
monitoring {}
}
}
}
depends_on = [google_project_service.anthos, google_project_service.gkehub, google_project_service.poco]
project = google_project.project.project_id
}
`, context)
}
func TestAccGKEHubFeature_gkehubFeatureMcsd(t *testing.T) {
// VCR fails to handle batched project services
acctest.SkipIfVcr(t)
t.Parallel()
context := map[string]interface{}{
"random_suffix": acctest.RandString(t, 10),
"org_id": envvar.GetTestOrgFromEnv(t),
"billing_account": envvar.GetTestBillingAccountFromEnv(t),
}
acctest.VcrTest(t, resource.TestCase{
PreCheck: func() { acctest.AccTestPreCheck(t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
CheckDestroy: testAccCheckGKEHubFeatureDestroyProducer(t),
Steps: []resource.TestStep{
{
Config: testAccGKEHubFeature_gkehubFeatureMcsd(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"project", "labels", "terraform_labels"},
},
{
Config: testAccGKEHubFeature_gkehubFeatureMcsdUpdate(context),
},
{
ResourceName: "google_gke_hub_feature.feature",
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"labels", "terraform_labels"},
},
},
})
}
func testAccGKEHubFeature_gkehubFeatureMcsd(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "multiclusterservicediscovery"
location = "global"
project = "projects/${google_project.project.project_id}"
labels = {
foo = "bar"
}
depends_on = [google_project_service.mcsd]
}
`, context)
}
func testAccGKEHubFeature_gkehubFeatureMcsdUpdate(context map[string]interface{}) string {
return gkeHubFeatureProjectSetupForGA(context) + acctest.Nprintf(`
resource "google_gke_hub_feature" "feature" {
name = "multiclusterservicediscovery"
location = "global"
project = google_project.project.project_id
labels = {
foo = "quux"
baz = "qux"
}
depends_on = [google_project_service.mcsd]
}
`, context)
}
func gkeHubFeatureProjectSetupForGA(context map[string]interface{}) string {
return acctest.Nprintf(`
resource "google_project" "project" {
name = "tf-test-gkehub%{random_suffix}"
project_id = "tf-test-gkehub%{random_suffix}"
org_id = "%{org_id}"
billing_account = "%{billing_account}"
deletion_policy = "DELETE"
}
resource "google_project_service" "mesh" {
project = google_project.project.project_id
service = "meshconfig.googleapis.com"
}
resource "google_project_service" "mci" {
project = google_project.project.project_id
service = "multiclusteringress.googleapis.com"
}
resource "google_project_service" "acm" {
project = google_project.project.project_id
service = "anthosconfigmanagement.googleapis.com"
}
resource "google_project_service" "poco" {
project = google_project.project.project_id
service = "anthospolicycontroller.googleapis.com"
}
resource "google_project_service" "mcsd" {
project = google_project.project.project_id
service = "multiclusterservicediscovery.googleapis.com"
}
resource "google_project_service" "compute" {
project = google_project.project.project_id
service = "compute.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "container" {
project = google_project.project.project_id
service = "container.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "anthos" {
project = google_project.project.project_id
service = "anthos.googleapis.com"
}
resource "google_project_service" "gkehub" {
project = google_project.project.project_id
service = "gkehub.googleapis.com"
disable_on_destroy = false
}
resource "google_project" "project_2" {
name = "tf-test-gkehub%{random_suffix}-2"
project_id = "tf-test-gkehub%{random_suffix}-2"
org_id = "%{org_id}"
billing_account = "%{billing_account}"
deletion_policy = "DELETE"
}
resource "google_project_service" "compute_2" {
project = google_project.project_2.project_id
service = "compute.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "container_2" {
project = google_project.project_2.project_id
service = "container.googleapis.com"
disable_on_destroy = false
}
resource "google_project_service" "gkehub_2" {
project = google_project.project_2.project_id
service = "gkehub.googleapis.com"
disable_on_destroy = false
}
`, context)
}
func testAccCheckGKEHubFeatureDestroyProducer(t *testing.T) func(s *terraform.State) error {
return func(s *terraform.State) error {
for name, rs := range s.RootModule().Resources {
if rs.Type != "google_gke_hub_feature" {
continue
}
if strings.HasPrefix(name, "data.") {
continue
}
config := acctest.GoogleProviderConfig(t)
url, err := tpgresource.ReplaceVarsForTest(config, rs, "{{GKEHub2BasePath}}projects/{{project}}/locations/{{location}}/features/{{name}}")
if err != nil {
return err
}
billingProject := ""
if config.BillingProject != "" {
billingProject = config.BillingProject
}
_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "GET",
Project: billingProject,
RawURL: url,
UserAgent: config.UserAgent,
})
if err == nil {
return fmt.Errorf("GKEHubFeature still exists at %s", url)
}
}
return nil
}
}