Skip to content

Commit

Permalink
feat: Add support for deletion_policy on shared vpc service project (#…
Browse files Browse the repository at this point in the history
…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 <p.wellershaus@googlemail.com>
Signed-off-by: Modular Magician <magic-modules@google.com>
Co-authored-by: Stephen Lewis (Burrows) <stephen.r.burrows@gmail.com>
  • Loading branch information
modular-magician and melinath authored Feb 23, 2023
1 parent 763e364 commit 984817b
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .changelog/7283.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
compute: added field `deletion_policy` to resource `google_compute_shared_vpc_service_project`
```
22 changes: 22 additions & 0 deletions google/resource_compute_shared_vpc_service_project.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -17,6 +18,7 @@ func ResourceComputeSharedVpcServiceProject() *schema.Resource {
Create: resourceComputeSharedVpcServiceProjectCreate,
Read: resourceComputeSharedVpcServiceProjectRead,
Delete: resourceComputeSharedVpcServiceProjectDelete,
Update: resourceComputeSharedVpcServiceProjectUpdate,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Expand All @@ -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,
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
}
93 changes: 93 additions & 0 deletions google/resource_compute_shared_vpc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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)
}

0 comments on commit 984817b

Please sign in to comment.