From 8ea966de7ef76e0264f13cfc438fdd0bf119cddd Mon Sep 17 00:00:00 2001 From: Modular Magician Date: Fri, 9 Dec 2022 20:56:47 +0000 Subject: [PATCH] Make compute subnetwork ipv6_access_type field updatable (#6928) fixes https://github.com/hashicorp/terraform-provider-google/issues/12860 Signed-off-by: Modular Magician --- .changelog/6928.txt | 3 + google/resource_compute_subnetwork.go | 9 ++- google/resource_compute_subnetwork_test.go | 65 ++++++++++++++++++++++ 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 .changelog/6928.txt diff --git a/.changelog/6928.txt b/.changelog/6928.txt new file mode 100644 index 00000000000..69c2252b99f --- /dev/null +++ b/.changelog/6928.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +compute: Made subnetwork ipv6_access_type field updatable +``` diff --git a/google/resource_compute_subnetwork.go b/google/resource_compute_subnetwork.go index 977e3f66151..cf39c753e51 100644 --- a/google/resource_compute_subnetwork.go +++ b/google/resource_compute_subnetwork.go @@ -111,7 +111,6 @@ creation time.`, "ipv6_access_type": { Type: schema.TypeString, Optional: true, - ForceNew: true, ValidateFunc: validateEnum([]string{"EXTERNAL", "INTERNAL", ""}), Description: `The access type of IPv6 address this subnet holds. It's immutable and can only be specified during creation or the first time the subnet is updated into IPV4_IPV6 dual stack. If the ipv6_type is EXTERNAL then this subnet @@ -661,7 +660,7 @@ func resourceComputeSubnetworkUpdate(d *schema.ResourceData, meta interface{}) e return err } } - if d.HasChange("private_ipv6_google_access") || d.HasChange("stack_type") { + if d.HasChange("private_ipv6_google_access") || d.HasChange("stack_type") || d.HasChange("ipv6_access_type") { obj := make(map[string]interface{}) getUrl, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") @@ -693,6 +692,12 @@ func resourceComputeSubnetworkUpdate(d *schema.ResourceData, meta interface{}) e } else if v, ok := d.GetOkExists("stack_type"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, stackTypeProp)) { obj["stackType"] = stackTypeProp } + ipv6AccessTypeProp, err := expandComputeSubnetworkIpv6AccessType(d.Get("ipv6_access_type"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("ipv6_access_type"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, ipv6AccessTypeProp)) { + obj["ipv6AccessType"] = ipv6AccessTypeProp + } url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/regions/{{region}}/subnetworks/{{name}}") if err != nil { diff --git a/google/resource_compute_subnetwork_test.go b/google/resource_compute_subnetwork_test.go index a9e5136a94b..1eb67a5e87f 100644 --- a/google/resource_compute_subnetwork_test.go +++ b/google/resource_compute_subnetwork_test.go @@ -331,6 +331,37 @@ func TestAccComputeSubnetwork_flowLogsMigrate(t *testing.T) { }) } +func TestAccComputeSubnetwork_ipv6(t *testing.T) { + t.Parallel() + + cnName := fmt.Sprintf("tf-test-%s", randString(t, 10)) + subnetworkName := fmt.Sprintf("tf-test-%s", randString(t, 10)) + + vcrTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckComputeSubnetworkDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccComputeSubnetwork_ipv4(cnName, subnetworkName), + }, + { + ResourceName: "google_compute_subnetwork.subnetwork", + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccComputeSubnetwork_ipv6(cnName, subnetworkName), + }, + { + ResourceName: "google_compute_subnetwork.subnetwork", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func testAccCheckComputeSubnetworkExists(t *testing.T, n string, subnetwork *compute.Subnetwork) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -728,3 +759,37 @@ resource "google_compute_subnetwork" "network-with-flow-logs" { } `, cnName, subnetworkName) } + +func testAccComputeSubnetwork_ipv4(cnName, subnetworkName string) string { + return fmt.Sprintf(` +resource "google_compute_network" "custom-test" { + name = "%s" + auto_create_subnetworks = false +} + +resource "google_compute_subnetwork" "subnetwork" { + name = "%s" + ip_cidr_range = "10.0.0.0/16" + region = "us-central1" + network = google_compute_network.custom-test.self_link +} +`, cnName, subnetworkName) +} + +func testAccComputeSubnetwork_ipv6(cnName, subnetworkName string) string { + return fmt.Sprintf(` +resource "google_compute_network" "custom-test" { + name = "%s" + auto_create_subnetworks = false +} + +resource "google_compute_subnetwork" "subnetwork" { + name = "%s" + ip_cidr_range = "10.0.0.0/16" + region = "us-central1" + network = google_compute_network.custom-test.self_link + stack_type = "IPV4_IPV6" + ipv6_access_type = "EXTERNAL" +} +`, cnName, subnetworkName) +}