diff --git a/mmv1/products/compute/RegionBackendService.yaml b/mmv1/products/compute/RegionBackendService.yaml index 81629a3fed02..821c5706fe5f 100644 --- a/mmv1/products/compute/RegionBackendService.yaml +++ b/mmv1/products/compute/RegionBackendService.yaml @@ -18,6 +18,9 @@ kind: 'compute#backendService' description: | A Region Backend Service defines a regionally-scoped group of virtual machines that will serve traffic for load balancing. + + ~> **Note:** Recreating a `google_compute_region_backend_service` that references other dependent resources like `google_compute_instance_group` will give a `resourceInUseByAnotherResource` error, when decreasing the number of other dependent resources. + Use `lifecycle.create_before_destroy` on the dependent resources to avoid this type of error as shown in the Dynamic Backend Count example. references: guides: 'Internal TCP/UDP Load Balancing': 'https://cloud.google.com/compute/docs/load-balancing/internal/' @@ -128,6 +131,14 @@ examples: default_neg_name: 'network-endpoint' health_check_name: 'rbs-health-check' network_name: 'network' + - name: 'region_backend_service_dynamic_backend_count' + primary_resource_id: 'default' + vars: + region_backend_service_name: 'region-service' + health_check_name: 'health-check' + instance_group_name: 'instance_group' + network_name: 'network' + exclude_test: true parameters: - name: 'region' type: ResourceRef diff --git a/mmv1/templates/terraform/examples/region_backend_service_dynamic_backend_count.tf.tmpl b/mmv1/templates/terraform/examples/region_backend_service_dynamic_backend_count.tf.tmpl new file mode 100644 index 000000000000..d4bb1c29a3ec --- /dev/null +++ b/mmv1/templates/terraform/examples/region_backend_service_dynamic_backend_count.tf.tmpl @@ -0,0 +1,43 @@ +locals { + zones = ["europe-west1-b", "europe-west1-c", "europe-west1-d"] + s1_count = 3 +} + +resource "google_compute_network" "network" { + name = "{{index $.Vars "network_name"}}" +} + +resource "google_compute_region_backend_service" "default" { + name = "{{index $.Vars "region_backend_service_name"}}" + region = "europe-west1" + + dynamic "backend" { + for_each = google_compute_instance_group.s1 + content { + balancing_mode = "CONNECTION" + group = backend.value.self_link + } + } + + health_checks = [ + google_compute_health_check.default.self_link, + ] +} + +resource "google_compute_health_check" "default" { + name = "{{index $.Vars "health_check_name"}}" + tcp_health_check { + port = "80" + } +} + +resource "google_compute_instance_group" "s1" { + count = local.s1_count + name = "{{index $.Vars "instance_group_name"}}-${count.index}" + zone = element(local.zones, count.index) + network = google_compute_network.network.self_link + + lifecycle { + create_before_destroy = true + } +} \ No newline at end of file diff --git a/mmv1/third_party/terraform/services/compute/resource_compute_region_backend_service_test.go.tmpl b/mmv1/third_party/terraform/services/compute/resource_compute_region_backend_service_test.go.tmpl index dc1776d2d2d1..ee55e2bba82a 100644 --- a/mmv1/third_party/terraform/services/compute/resource_compute_region_backend_service_test.go.tmpl +++ b/mmv1/third_party/terraform/services/compute/resource_compute_region_backend_service_test.go.tmpl @@ -421,6 +421,145 @@ func TestAccComputeRegionBackendService_withLogConfig(t *testing.T) { }) } +func TestAccComputeRegionBackendService_withDynamicBackendCount(t *testing.T) { + t.Parallel() + + randString := acctest.RandString(t, 10) + + serviceName := fmt.Sprintf("tf-test-%s", randString) + checkName := fmt.Sprintf("tf-test-%s", randString) + netName := fmt.Sprintf("tf-test-%s", randString) + igName := fmt.Sprintf("tf-test-%s", randString) + + acctest.VcrTest(t, resource.TestCase{ + PreCheck: func() { acctest.AccTestPreCheck(t) }, + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t), + CheckDestroy: testAccCheckComputeRegionBackendServiceDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccComputeRegionBackendService_withDynamicBackendCount(serviceName, netName, checkName, igName), + }, + { + ResourceName: "google_compute_region_backend_service.foobar", + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccComputeRegionBackendService_withDynamicBackendCountUpdate(serviceName, netName, checkName, igName), + }, + { + ResourceName: "google_compute_region_backend_service.foobar", + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccComputeRegionBackendService_withDynamicBackendCount(serviceName, netName, checkName, igName), + }, + { + ResourceName: "google_compute_region_backend_service.foobar", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccComputeRegionBackendService_withDynamicBackendCount(serviceName, netName, hcName, igName string) string { + return fmt.Sprintf(` +locals { + zones = ["europe-west1-b", "europe-west1-c", "europe-west1-d"] + s1_count = 3 +} + +resource "google_compute_network" "network" { + name = "%s" +} + +resource "google_compute_region_backend_service" "foobar" { + name = "%s" + region = "europe-west1" + + dynamic "backend" { + for_each = google_compute_instance_group.s1 + content { + balancing_mode = "CONNECTION" + group = backend.value.self_link + } + } + + health_checks = [ + google_compute_health_check.default.self_link, + ] +} + +resource "google_compute_health_check" "default" { + name = "%s" + tcp_health_check { + port = "80" + } +} + +resource "google_compute_instance_group" "s1" { + count = local.s1_count + name = "%s-${count.index}" + zone = element(local.zones, count.index) + network = google_compute_network.network.self_link + + lifecycle { + create_before_destroy = true + } +} +`, netName, serviceName, hcName, igName) +} + +func testAccComputeRegionBackendService_withDynamicBackendCountUpdate(serviceName, netName, hcName, igName string) string { + return fmt.Sprintf(` +locals { + zones = ["europe-west1-b", "europe-west1-c", "europe-west1-d"] + s1_count = 1 +} + +resource "google_compute_network" "network" { + name = "%s" +} + +resource "google_compute_region_backend_service" "foobar" { + name = "%s" + region = "europe-west1" + + dynamic "backend" { + for_each = google_compute_instance_group.s1 + content { + balancing_mode = "CONNECTION" + group = backend.value.self_link + } + } + + health_checks = [ + google_compute_health_check.default.self_link, + ] +} + +resource "google_compute_health_check" "default" { + name = "%s" + tcp_health_check { + port = "80" + } +} + +resource "google_compute_instance_group" "s1" { + count = local.s1_count + name = "%s-${count.index}" + zone = element(local.zones, count.index) + network = google_compute_network.network.self_link + + lifecycle { + create_before_destroy = true + } +} +`, netName, serviceName, hcName, igName) +} + func testAccComputeRegionBackendService_ilbBasic_withUnspecifiedProtocol(serviceName, checkName string) string { return fmt.Sprintf(` resource "google_compute_region_backend_service" "foobar" {