From 984817bc88a4be079aa7b1484f2ad141bc5045b4 Mon Sep 17 00:00:00 2001 From: The Magician Date: Thu, 23 Feb 2023 10:46:19 -0800 Subject: [PATCH] feat: Add support for deletion_policy on shared vpc service project (#7283) (#13822) * feat: Add support for deletion_policy on shared vpc service project * test: Add tests for deletion_policy on shared vpc service project * fix: reorder tests for better coverage * Update mmv1/third_party/terraform/resources/resource_compute_shared_vpc_service_project.go.erb * fix: add comma in test * fix formatting --------- Signed-off-by: NexusNull Signed-off-by: Modular Magician Co-authored-by: Stephen Lewis (Burrows) --- .changelog/7283.txt | 3 + ...urce_compute_shared_vpc_service_project.go | 22 +++++ google/resource_compute_shared_vpc_test.go | 93 +++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 .changelog/7283.txt diff --git a/.changelog/7283.txt b/.changelog/7283.txt new file mode 100644 index 00000000000..88a49803790 --- /dev/null +++ b/.changelog/7283.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +compute: added field `deletion_policy` to resource `google_compute_shared_vpc_service_project` +``` diff --git a/google/resource_compute_shared_vpc_service_project.go b/google/resource_compute_shared_vpc_service_project.go index 0e390c3a49f..8f761278683 100644 --- a/google/resource_compute_shared_vpc_service_project.go +++ b/google/resource_compute_shared_vpc_service_project.go @@ -7,6 +7,7 @@ import ( "time" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "google.golang.org/api/googleapi" "google.golang.org/api/compute/v1" @@ -17,6 +18,7 @@ func ResourceComputeSharedVpcServiceProject() *schema.Resource { Create: resourceComputeSharedVpcServiceProjectCreate, Read: resourceComputeSharedVpcServiceProjectRead, Delete: resourceComputeSharedVpcServiceProjectDelete, + Update: resourceComputeSharedVpcServiceProjectUpdate, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, @@ -39,6 +41,14 @@ func ResourceComputeSharedVpcServiceProject() *schema.Resource { ForceNew: true, Description: `The ID of the project that will serve as a Shared VPC service project.`, }, + "deletion_policy": { + Type: schema.TypeString, + Optional: true, + ForceNew: false, + Description: `The deletion policy for the shared VPC service. Setting ABANDON allows the resource + to be abandoned rather than deleted. Possible values are: "ABANDON".`, + ValidateFunc: validation.StringInSlice([]string{"ABANDON", ""}, false), + }, }, UseJSONNumber: true, } @@ -117,6 +127,12 @@ func resourceComputeSharedVpcServiceProjectDelete(d *schema.ResourceData, meta i hostProject := d.Get("host_project").(string) serviceProject := d.Get("service_project").(string) + if deletionPolicy := d.Get("deletion_policy"); deletionPolicy == "ABANDON" { + log.Printf("[WARN] Shared VPC service project %q deletion_policy is set to 'ABANDON', skip disabling shared VPC service project", d.Id()) + d.SetId("") + return nil + } + if err := disableXpnResource(d, config, hostProject, serviceProject); err != nil { // Don't fail if the service project is already disabled. if !isDisabledXpnResourceError(err) { @@ -158,3 +174,9 @@ func isDisabledXpnResourceError(err error) bool { } return false } + +func resourceComputeSharedVpcServiceProjectUpdate(d *schema.ResourceData, meta interface{}) error { + // This update method is no-op because the only updatable fields + // are state/config-only, i.e. they aren't sent in requests to the API. + return nil +} diff --git a/google/resource_compute_shared_vpc_test.go b/google/resource_compute_shared_vpc_test.go index 2ff28ff4e20..a94c6ddc8ff 100644 --- a/google/resource_compute_shared_vpc_test.go +++ b/google/resource_compute_shared_vpc_test.go @@ -22,6 +22,22 @@ func TestAccComputeSharedVpc_basic(t *testing.T) { PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, Steps: []resource.TestStep{ + //Create resources with the deletion_policy flag + { + Config: testAccComputeSharedVpc_SharedVPCServiceProjectWithDeletionPolicy(hostProject, serviceProject, org, billingId), + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeSharedVpcHostProject(t, hostProject, true), + testAccCheckComputeSharedVpcServiceProject(t, hostProject, serviceProject, true), + ), + }, + // Test that resource haven't been deleted after resource has been removed + { + Config: testAccComputeSharedVpc_SharedVPCServiceProjectWithDeletionPolicyDeleted(hostProject, serviceProject, org, billingId), + Check: resource.ComposeTestCheckFunc( + testAccCheckComputeSharedVpcHostProject(t, hostProject, true), + testAccCheckComputeSharedVpcServiceProject(t, hostProject, serviceProject, true), + ), + }, { Config: testAccComputeSharedVpc_basic(hostProject, serviceProject, org, billingId), Check: resource.ComposeTestCheckFunc( @@ -161,3 +177,80 @@ resource "google_project_service" "service" { } `, hostProject, hostProject, org, billing, serviceProject, serviceProject, org, billing) } + +func testAccComputeSharedVpc_SharedVPCServiceProjectWithDeletionPolicy(hostProject, serviceProject, org, billing string) string { + return fmt.Sprintf(` +resource "google_project" "host" { + project_id = "%s" + name = "%s" + org_id = "%s" + billing_account = "%s" +} + +resource "google_project" "service" { + project_id = "%s" + name = "%s" + org_id = "%s" + billing_account = "%s" +} + +resource "google_project_service" "host" { + project = google_project.host.project_id + service = "compute.googleapis.com" +} + +resource "google_project_service" "service" { + project = google_project.service.project_id + service = "compute.googleapis.com" +} + +resource "google_compute_shared_vpc_host_project" "host" { + project = google_project.host.project_id + depends_on = [google_project_service.host] +} + +resource "google_compute_shared_vpc_service_project" "service" { + host_project = google_project.host.project_id + service_project = google_project.service.project_id + deletion_policy = "ABANDON" + depends_on = [ + google_compute_shared_vpc_host_project.host, + google_project_service.service, + ] +} +`, hostProject, hostProject, org, billing, serviceProject, serviceProject, org, billing) +} + +func testAccComputeSharedVpc_SharedVPCServiceProjectWithDeletionPolicyDeleted(hostProject, serviceProject, org, billing string) string { + return fmt.Sprintf(` +resource "google_project" "host" { + project_id = "%s" + name = "%s" + org_id = "%s" + billing_account = "%s" +} + +resource "google_project" "service" { + project_id = "%s" + name = "%s" + org_id = "%s" + billing_account = "%s" +} + +resource "google_project_service" "host" { + project = google_project.host.project_id + service = "compute.googleapis.com" +} + +resource "google_project_service" "service" { + project = google_project.service.project_id + service = "compute.googleapis.com" +} + +resource "google_compute_shared_vpc_host_project" "host" { + project = google_project.host.project_id + depends_on = [google_project_service.host] +} + +`, hostProject, hostProject, org, billing, serviceProject, serviceProject, org, billing) +}