Skip to content

Commit 2d1ee33

Browse files
Add support to delete Client resource of Application Integration (#10280) (#7142)
[upstream:4abde8d7e72bb3aef0b8c40694ba6375b8cc629f] Signed-off-by: Modular Magician <[email protected]>
1 parent 836777f commit 2d1ee33

File tree

4 files changed

+235
-4
lines changed

4 files changed

+235
-4
lines changed

.changelog/10280.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
integrations: added deletion of `google_integrations_client` resource
3+
```

google-beta/services/integrations/resource_integrations_client.go

+47-4
Original file line numberDiff line numberDiff line change
@@ -251,11 +251,54 @@ func resourceIntegrationsClientRead(d *schema.ResourceData, meta interface{}) er
251251
}
252252

253253
func resourceIntegrationsClientDelete(d *schema.ResourceData, meta interface{}) error {
254-
log.Printf("[WARNING] Integrations Client resources"+
255-
" cannot be deleted from Google Cloud. The resource %s will be removed from Terraform"+
256-
" state, but will still be present on Google Cloud.", d.Id())
257-
d.SetId("")
254+
config := meta.(*transport_tpg.Config)
255+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
256+
if err != nil {
257+
return err
258+
}
259+
260+
billingProject := ""
261+
262+
project, err := tpgresource.GetProject(d, config)
263+
if err != nil {
264+
return fmt.Errorf("Error fetching project for Client: %s", err)
265+
}
266+
billingProject = project
267+
268+
lockName, err := tpgresource.ReplaceVars(d, config, "Client/{{location}}")
269+
if err != nil {
270+
return err
271+
}
272+
transport_tpg.MutexStore.Lock(lockName)
273+
defer transport_tpg.MutexStore.Unlock(lockName)
274+
275+
url, err := tpgresource.ReplaceVars(d, config, "{{IntegrationsBasePath}}projects/{{project}}/locations/{{location}}/clients:deprovision")
276+
if err != nil {
277+
return err
278+
}
279+
280+
var obj map[string]interface{}
281+
282+
// err == nil indicates that the billing_project value was found
283+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
284+
billingProject = bp
285+
}
286+
287+
log.Printf("[DEBUG] Deleting Client %q", d.Id())
288+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
289+
Config: config,
290+
Method: "POST",
291+
Project: billingProject,
292+
RawURL: url,
293+
UserAgent: userAgent,
294+
Body: obj,
295+
Timeout: d.Timeout(schema.TimeoutDelete),
296+
})
297+
if err != nil {
298+
return transport_tpg.HandleNotFoundError(err, d, "Client")
299+
}
258300

301+
log.Printf("[DEBUG] Finished deleting Client %q: %#v", d.Id(), res)
259302
return nil
260303
}
261304

google-beta/services/integrations/resource_integrations_client_generated_test.go

+46
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,16 @@
1818
package integrations_test
1919

2020
import (
21+
"fmt"
22+
"strings"
2123
"testing"
2224

2325
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
26+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
2427

2528
"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
29+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
30+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
2631
)
2732

2833
func TestAccIntegrationsClient_integrationsClientBasicExample(t *testing.T) {
@@ -35,6 +40,7 @@ func TestAccIntegrationsClient_integrationsClientBasicExample(t *testing.T) {
3540
acctest.VcrTest(t, resource.TestCase{
3641
PreCheck: func() { acctest.AccTestPreCheck(t) },
3742
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
43+
CheckDestroy: testAccCheckIntegrationsClientDestroyProducer(t),
3844
Steps: []resource.TestStep{
3945
{
4046
Config: testAccIntegrationsClient_integrationsClientBasicExample(context),
@@ -68,6 +74,7 @@ func TestAccIntegrationsClient_integrationsClientAdvanceExample(t *testing.T) {
6874
acctest.VcrTest(t, resource.TestCase{
6975
PreCheck: func() { acctest.AccTestPreCheck(t) },
7076
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
77+
CheckDestroy: testAccCheckIntegrationsClientDestroyProducer(t),
7178
Steps: []resource.TestStep{
7279
{
7380
Config: testAccIntegrationsClient_integrationsClientAdvanceExample(context),
@@ -120,3 +127,42 @@ resource "google_integrations_client" "example" {
120127
}
121128
`, context)
122129
}
130+
131+
func testAccCheckIntegrationsClientDestroyProducer(t *testing.T) func(s *terraform.State) error {
132+
return func(s *terraform.State) error {
133+
for name, rs := range s.RootModule().Resources {
134+
if rs.Type != "google_integrations_client" {
135+
continue
136+
}
137+
if strings.HasPrefix(name, "data.") {
138+
continue
139+
}
140+
141+
config := acctest.GoogleProviderConfig(t)
142+
143+
url, err := tpgresource.ReplaceVarsForTest(config, rs, "{{IntegrationsBasePath}}projects/{{project}}/locations/{{location}}/clients")
144+
if err != nil {
145+
return err
146+
}
147+
148+
billingProject := ""
149+
150+
if config.BillingProject != "" {
151+
billingProject = config.BillingProject
152+
}
153+
154+
_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
155+
Config: config,
156+
Method: "GET",
157+
Project: billingProject,
158+
RawURL: url,
159+
UserAgent: config.UserAgent,
160+
})
161+
if err == nil {
162+
return fmt.Errorf("IntegrationsClient still exists at %s", url)
163+
}
164+
}
165+
166+
return nil
167+
}
168+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
// ----------------------------------------------------------------------------
5+
//
6+
// *** AUTO GENERATED CODE *** Type: MMv1 ***
7+
//
8+
// ----------------------------------------------------------------------------
9+
//
10+
// This file is automatically generated by Magic Modules and manual
11+
// changes will be clobbered when the file is regenerated.
12+
//
13+
// Please read more about how to change this file in
14+
// .github/CONTRIBUTING.md.
15+
//
16+
// ----------------------------------------------------------------------------
17+
18+
package integrations
19+
20+
import (
21+
"context"
22+
"log"
23+
"strings"
24+
"testing"
25+
26+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/envvar"
27+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/sweeper"
28+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
29+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
30+
)
31+
32+
func init() {
33+
sweeper.AddTestSweepers("IntegrationsClient", testSweepIntegrationsClient)
34+
}
35+
36+
// At the time of writing, the CI only passes us-central1 as the region
37+
func testSweepIntegrationsClient(region string) error {
38+
resourceName := "IntegrationsClient"
39+
log.Printf("[INFO][SWEEPER_LOG] Starting sweeper for %s", resourceName)
40+
41+
config, err := sweeper.SharedConfigForRegion(region)
42+
if err != nil {
43+
log.Printf("[INFO][SWEEPER_LOG] error getting shared config for region: %s", err)
44+
return err
45+
}
46+
47+
err = config.LoadAndValidate(context.Background())
48+
if err != nil {
49+
log.Printf("[INFO][SWEEPER_LOG] error loading: %s", err)
50+
return err
51+
}
52+
53+
t := &testing.T{}
54+
billingId := envvar.GetTestBillingAccountFromEnv(t)
55+
56+
// Setup variables to replace in list template
57+
d := &tpgresource.ResourceDataMock{
58+
FieldsInSchema: map[string]interface{}{
59+
"project": config.Project,
60+
"region": region,
61+
"location": region,
62+
"zone": "-",
63+
"billing_account": billingId,
64+
},
65+
}
66+
67+
listTemplate := strings.Split("https://integrations.googleapis.com/v1/projects/{{project}}/locations/{{location}}/clients", "?")[0]
68+
listUrl, err := tpgresource.ReplaceVars(d, config, listTemplate)
69+
if err != nil {
70+
log.Printf("[INFO][SWEEPER_LOG] error preparing sweeper list url: %s", err)
71+
return nil
72+
}
73+
74+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
75+
Config: config,
76+
Method: "GET",
77+
Project: config.Project,
78+
RawURL: listUrl,
79+
UserAgent: config.UserAgent,
80+
})
81+
if err != nil {
82+
log.Printf("[INFO][SWEEPER_LOG] Error in response from request %s: %s", listUrl, err)
83+
return nil
84+
}
85+
86+
resourceList, ok := res["clients"]
87+
if !ok {
88+
log.Printf("[INFO][SWEEPER_LOG] Nothing found in response.")
89+
return nil
90+
}
91+
92+
rl := resourceList.([]interface{})
93+
94+
log.Printf("[INFO][SWEEPER_LOG] Found %d items in %s list response.", len(rl), resourceName)
95+
// Keep count of items that aren't sweepable for logging.
96+
nonPrefixCount := 0
97+
for _, ri := range rl {
98+
obj := ri.(map[string]interface{})
99+
if obj["name"] == nil {
100+
log.Printf("[INFO][SWEEPER_LOG] %s resource name was nil", resourceName)
101+
return nil
102+
}
103+
104+
name := tpgresource.GetResourceNameFromSelfLink(obj["name"].(string))
105+
// Skip resources that shouldn't be sweeped
106+
if !sweeper.IsSweepableTestResource(name) {
107+
nonPrefixCount++
108+
continue
109+
}
110+
111+
deleteTemplate := "https://integrations.googleapis.com/v1/projects/{{project}}/locations/{{location}}/clients:deprovision"
112+
deleteUrl, err := tpgresource.ReplaceVars(d, config, deleteTemplate)
113+
if err != nil {
114+
log.Printf("[INFO][SWEEPER_LOG] error preparing delete url: %s", err)
115+
return nil
116+
}
117+
deleteUrl = deleteUrl + name
118+
119+
// Don't wait on operations as we may have a lot to delete
120+
_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
121+
Config: config,
122+
Method: "DELETE",
123+
Project: config.Project,
124+
RawURL: deleteUrl,
125+
UserAgent: config.UserAgent,
126+
})
127+
if err != nil {
128+
log.Printf("[INFO][SWEEPER_LOG] Error deleting for url %s : %s", deleteUrl, err)
129+
} else {
130+
log.Printf("[INFO][SWEEPER_LOG] Sent delete request for %s resource: %s", resourceName, name)
131+
}
132+
}
133+
134+
if nonPrefixCount > 0 {
135+
log.Printf("[INFO][SWEEPER_LOG] %d items were non-sweepable and skipped.", nonPrefixCount)
136+
}
137+
138+
return nil
139+
}

0 commit comments

Comments
 (0)