Skip to content

Commit 09793e3

Browse files
Support Undelete for Vmwareengine Private Cloud (#11480) (#8005)
[upstream:c52857ebf0dbeff8d8894e7e30a0a2072b7eb492] Signed-off-by: Modular Magician <[email protected]>
1 parent 12d957e commit 09793e3

File tree

3 files changed

+119
-11
lines changed

3 files changed

+119
-11
lines changed

.changelog/11480.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
vmwareengine: Added PC undelete support in `google_vmwareengine_private_cloud`
3+
```

google-beta/services/vmwareengine/resource_vmwareengine_private_cloud.go

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727

2828
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
2929
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
30+
"google.golang.org/api/googleapi"
3031

3132
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
3233
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
@@ -67,6 +68,52 @@ func isMultiNodePrivateCloud(d *schema.ResourceData) bool {
6768
return false
6869
}
6970

71+
func isPrivateCloudInDeletedState(config *transport_tpg.Config, d *schema.ResourceData, billingProject string, userAgent string) (bool, error) {
72+
baseurl, err := tpgresource.ReplaceVars(d, config, "{{VmwareengineBasePath}}projects/{{project}}/locations/{{location}}/privateClouds/{{name}}")
73+
if err != nil {
74+
return false, err
75+
}
76+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
77+
Config: config,
78+
Method: "GET",
79+
Project: billingProject,
80+
RawURL: baseurl,
81+
UserAgent: userAgent,
82+
})
83+
if err != nil {
84+
if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
85+
log.Printf("[DEBUG] No existing private cloud found")
86+
return false, nil
87+
}
88+
return false, err
89+
}
90+
// if resource exists but is marked for deletion
91+
v, ok := res["state"]
92+
if ok && v.(string) == "DELETED" {
93+
log.Printf("[DEBUG] The Private cloud exists and is marked for deletion.")
94+
return true, nil
95+
}
96+
return false, nil
97+
}
98+
99+
// Check if private cloud is absent or if it exists in a deleted state.
100+
func pollCheckForPrivateCloudAbsence(resp map[string]interface{}, respErr error) transport_tpg.PollResult {
101+
if respErr != nil {
102+
if transport_tpg.IsGoogleApiErrorWithCode(respErr, 404) {
103+
return transport_tpg.SuccessPollResult()
104+
}
105+
return transport_tpg.ErrorPollResult(respErr)
106+
}
107+
// if resource exists but is marked for deletion
108+
log.Printf("[DEBUG] Fetching state of the private cloud.")
109+
v, ok := resp["state"]
110+
if ok && v.(string) == "DELETED" {
111+
log.Printf("[DEBUG] The Private cloud has been successfully marked for delayed deletion.")
112+
return transport_tpg.SuccessPollResult()
113+
}
114+
return transport_tpg.PendingStatusPollResult("found")
115+
}
116+
70117
func ResourceVmwareenginePrivateCloud() *schema.Resource {
71118
return &schema.Resource{
72119
Create: resourceVmwareenginePrivateCloudCreate,
@@ -400,6 +447,21 @@ func resourceVmwareenginePrivateCloudCreate(d *schema.ResourceData, meta interfa
400447
}
401448

402449
headers := make(http.Header)
450+
// Check if the project exists in a deleted state
451+
pcMarkedForDeletion, err := isPrivateCloudInDeletedState(config, d, billingProject, userAgent)
452+
if err != nil {
453+
return fmt.Errorf("Error checking if Private Cloud exists and is marked for deletion: %s", err)
454+
}
455+
if pcMarkedForDeletion {
456+
log.Printf("[DEBUG] Private Cloud exists and is marked for deletion. Triggering UNDELETE of the Private Cloud.\n")
457+
url, err = tpgresource.ReplaceVars(d, config, "{{VmwareengineBasePath}}projects/{{project}}/locations/{{location}}/privateClouds/{{name}}:undelete")
458+
if err != nil {
459+
return err
460+
}
461+
obj = make(map[string]interface{})
462+
} else {
463+
log.Printf("[DEBUG] Private Cloud is not found to be marked for deletion. Triggering CREATE of the Private Cloud.\n")
464+
}
403465
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
404466
Config: config,
405467
Method: "POST",
@@ -742,18 +804,11 @@ func resourceVmwareenginePrivateCloudDelete(d *schema.ResourceData, meta interfa
742804
if err != nil {
743805
return res, err
744806
}
745-
// if resource exists but is marked for deletion
746-
log.Printf("[DEBUG] Fetching state of the private cloud.")
747-
v, ok := res["state"]
748-
if ok && v.(string) == "DELETED" {
749-
log.Printf("[DEBUG] The Private cloud has been successfully marked for delayed deletion.")
750-
return nil, nil
751-
}
752807
return res, nil
753808
}
754809
}
755810

756-
err = transport_tpg.PollingWaitTime(privateCloudPollRead(d, meta), transport_tpg.PollCheckForAbsence, "Deleting PrivateCloud", d.Timeout(schema.TimeoutDelete), 10)
811+
err = transport_tpg.PollingWaitTime(privateCloudPollRead(d, meta), pollCheckForPrivateCloudAbsence, "Deleting PrivateCloud", d.Timeout(schema.TimeoutDelete), 10)
757812
if err != nil {
758813
return fmt.Errorf("Error waiting to delete PrivateCloud: %s", err)
759814
}

google-beta/services/vmwareengine/resource_vmwareengine_private_cloud_test.go

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@ func TestAccVmwareenginePrivateCloud_vmwareEnginePrivateCloudUpdate(t *testing.T
4949
testAccCheckGoogleVmwareengineVcenterCredentialsMeta("data.google_vmwareengine_vcenter_credentials.vcenter-ds"),
5050
),
5151
},
52-
5352
{
5453
ResourceName: "google_vmwareengine_private_cloud.vmw-engine-pc",
5554
ImportState: true,
5655
ImportStateVerify: true,
5756
ImportStateVerifyIgnore: []string{"location", "name", "update_time", "type", "deletion_delay_hours", "send_deletion_delay_hours_if_zero"},
5857
},
58+
5959
{
6060
Config: testVmwareenginePrivateCloudUpdateConfig(context),
6161
Check: resource.ComposeTestCheckFunc(
@@ -69,13 +69,43 @@ func TestAccVmwareenginePrivateCloud_vmwareEnginePrivateCloudUpdate(t *testing.T
6969
}),
7070
),
7171
},
72+
{
73+
ResourceName: "google_vmwareengine_private_cloud.vmw-engine-pc",
74+
ImportState: true,
75+
ImportStateVerify: true,
76+
ImportStateVerifyIgnore: []string{"location", "name", "update_time", "type", "deletion_delay_hours", "send_deletion_delay_hours_if_zero"},
77+
},
7278

79+
{
80+
Config: testVmwareenginePrivateCloudDelayedDeleteConfig(context),
81+
},
82+
{
83+
ResourceName: "google_vmwareengine_network.vmw-engine-nw",
84+
ImportState: true,
85+
ImportStateVerify: true,
86+
ImportStateVerifyIgnore: []string{"location", "name"},
87+
},
88+
89+
{
90+
Config: testVmwareenginePrivateCloudUndeleteConfig(context),
91+
Check: resource.ComposeTestCheckFunc(
92+
acctest.CheckDataSourceStateMatchesResourceStateWithIgnores(
93+
"data.google_vmwareengine_private_cloud.ds",
94+
"google_vmwareengine_private_cloud.vmw-engine-pc",
95+
map[string]struct{}{
96+
"type": {},
97+
"deletion_delay_hours": {},
98+
"send_deletion_delay_hours_if_zero": {},
99+
}),
100+
),
101+
},
73102
{
74103
ResourceName: "google_vmwareengine_private_cloud.vmw-engine-pc",
75104
ImportState: true,
76105
ImportStateVerify: true,
77106
ImportStateVerifyIgnore: []string{"location", "name", "update_time", "type", "deletion_delay_hours", "send_deletion_delay_hours_if_zero"},
78107
},
108+
79109
{
80110
Config: testVmwareengineSubnetImportConfig(context),
81111
Check: resource.ComposeTestCheckFunc(
@@ -88,6 +118,7 @@ func TestAccVmwareenginePrivateCloud_vmwareEnginePrivateCloudUpdate(t *testing.T
88118
ImportStateVerify: true,
89119
ImportStateVerifyIgnore: []string{"parent", "name"},
90120
},
121+
91122
{
92123
Config: testVmwareengineSubnetUpdateConfig(context),
93124
},
@@ -106,6 +137,14 @@ func testVmwareenginePrivateCloudCreateConfig(context map[string]interface{}) st
106137
}
107138

108139
func testVmwareenginePrivateCloudUpdateConfig(context map[string]interface{}) string {
140+
return testVmwareenginePrivateCloudConfig(context, "sample updated description", "STANDARD", 3, 8) + testVmwareengineVcenterNSXCredentailsConfig(context)
141+
}
142+
143+
func testVmwareenginePrivateCloudDelayedDeleteConfig(context map[string]interface{}) string {
144+
return testVmwareenginePrivateCloudDeletedConfig(context)
145+
}
146+
147+
func testVmwareenginePrivateCloudUndeleteConfig(context map[string]interface{}) string {
109148
return testVmwareenginePrivateCloudConfig(context, "sample updated description", "STANDARD", 3, 0) + testVmwareengineVcenterNSXCredentailsConfig(context)
110149
}
111150

@@ -123,7 +162,7 @@ func testVmwareenginePrivateCloudConfig(context map[string]interface{}, descript
123162
context["description"] = description
124163
context["type"] = pcType
125164
return acctest.Nprintf(`
126-
resource "google_vmwareengine_network" "default-nw" {
165+
resource "google_vmwareengine_network" "vmw-engine-nw" {
127166
name = "tf-test-pc-nw-%{random_suffix}"
128167
location = "global"
129168
type = "STANDARD"
@@ -139,7 +178,7 @@ resource "google_vmwareengine_private_cloud" "vmw-engine-pc" {
139178
send_deletion_delay_hours_if_zero = true
140179
network_config {
141180
management_cidr = "192.168.0.0/24"
142-
vmware_engine_network = google_vmwareengine_network.default-nw.id
181+
vmware_engine_network = google_vmwareengine_network.vmw-engine-nw.id
143182
}
144183
management_cluster {
145184
cluster_id = "tf-test-sample-mgmt-cluster-custom-core-count%{random_suffix}"
@@ -161,6 +200,17 @@ data "google_vmwareengine_private_cloud" "ds" {
161200
`, context)
162201
}
163202

203+
func testVmwareenginePrivateCloudDeletedConfig(context map[string]interface{}) string {
204+
return acctest.Nprintf(`
205+
resource "google_vmwareengine_network" "vmw-engine-nw" {
206+
name = "tf-test-pc-nw-%{random_suffix}"
207+
location = "global"
208+
type = "STANDARD"
209+
description = "PC network description."
210+
}
211+
`, context)
212+
}
213+
164214
func testVmwareengineVcenterNSXCredentailsConfig(context map[string]interface{}) string {
165215
return acctest.Nprintf(`
166216
data "google_vmwareengine_nsx_credentials" "nsx-ds" {

0 commit comments

Comments
 (0)