Skip to content

Commit caa3f7c

Browse files
Add delete support and handwriten sweeper for Firebase Web App (#6652) (#12812)
Signed-off-by: Modular Magician <[email protected]> Signed-off-by: Modular Magician <[email protected]>
1 parent eadde57 commit caa3f7c

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

.changelog/6652.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
firebase: added deletion support and new field `deletion_policy` for `google_firebase_web_app`
3+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// ----------------------------------------------------------------------------
2+
//
3+
// *** HANDWRITTEN CODE *** Type: MMv1 ***
4+
//
5+
// ----------------------------------------------------------------------------
6+
7+
package google
8+
9+
import (
10+
"context"
11+
"log"
12+
"strings"
13+
"testing"
14+
15+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
16+
)
17+
18+
func init() {
19+
resource.AddTestSweepers("FirebaseWebApp", &resource.Sweeper{
20+
Name: "FirebaseWebApp",
21+
F: testSweepFirebaseWebApp,
22+
})
23+
}
24+
25+
// At the time of writing, the CI only passes us-central1 as the region
26+
func testSweepFirebaseWebApp(region string) error {
27+
resourceName := "FirebaseWebApp"
28+
log.Printf("[INFO][SWEEPER_LOG] Starting sweeper for %s", resourceName)
29+
30+
config, err := sharedConfigForRegion(region)
31+
if err != nil {
32+
log.Printf("[INFO][SWEEPER_LOG] error getting shared config for region: %s", err)
33+
return err
34+
}
35+
36+
err = config.LoadAndValidate(context.Background())
37+
if err != nil {
38+
log.Printf("[INFO][SWEEPER_LOG] error loading: %s", err)
39+
return err
40+
}
41+
42+
t := &testing.T{}
43+
billingId := getTestBillingAccountFromEnv(t)
44+
45+
// Setup variables to replace in list template
46+
d := &ResourceDataMock{
47+
FieldsInSchema: map[string]interface{}{
48+
"project": config.Project,
49+
"region": region,
50+
"location": region,
51+
"zone": "-",
52+
"billing_account": billingId,
53+
},
54+
}
55+
56+
listTemplate := strings.Split("https://firebase.googleapis.com/v1beta1/projects/{{project}}/webApps", "?")[0]
57+
listUrl, err := replaceVars(d, config, listTemplate)
58+
if err != nil {
59+
log.Printf("[INFO][SWEEPER_LOG] error preparing sweeper list url: %s", err)
60+
return nil
61+
}
62+
63+
res, err := sendRequest(config, "GET", config.Project, listUrl, config.userAgent, nil)
64+
if err != nil {
65+
log.Printf("[INFO][SWEEPER_LOG] Error in response from request %s: %s", listUrl, err)
66+
return nil
67+
}
68+
69+
resourceList, ok := res["webApps"]
70+
if !ok {
71+
log.Printf("[INFO][SWEEPER_LOG] Nothing found in response.")
72+
return nil
73+
}
74+
75+
rl := resourceList.([]interface{})
76+
77+
log.Printf("[INFO][SWEEPER_LOG] Found %d items in %s list response.", len(rl), resourceName)
78+
// Keep count of items that aren't sweepable for logging.
79+
nonPrefixCount := 0
80+
for _, ri := range rl {
81+
obj := ri.(map[string]interface{})
82+
if obj["name"] == nil {
83+
log.Printf("[INFO][SWEEPER_LOG] %s resource name was nil", resourceName)
84+
return nil
85+
}
86+
87+
name := GetResourceNameFromSelfLink(obj["name"].(string))
88+
// Skip resources that shouldn't be sweeped
89+
if !isSweepableTestResource(name) {
90+
nonPrefixCount++
91+
continue
92+
}
93+
94+
deleteTemplate := "https://firebase.googleapis.com/v1beta1/{{name}}:remove"
95+
deleteUrl, err := replaceVars(d, config, deleteTemplate)
96+
if err != nil {
97+
log.Printf("[INFO][SWEEPER_LOG] error preparing delete url: %s", err)
98+
return nil
99+
}
100+
deleteUrl = deleteUrl + name
101+
102+
body := make(map[string]interface{})
103+
body["immediate"] = true
104+
105+
// Don't wait on operations as we may have a lot to delete
106+
_, err = sendRequest(config, "POST", config.Project, deleteUrl, config.userAgent, body)
107+
if err != nil {
108+
log.Printf("[INFO][SWEEPER_LOG] Error deleting for url %s : %s", deleteUrl, err)
109+
} else {
110+
log.Printf("[INFO][SWEEPER_LOG] Sent delete request for %s resource: %s", resourceName, name)
111+
}
112+
}
113+
114+
if nonPrefixCount > 0 {
115+
log.Printf("[INFO][SWEEPER_LOG] %d items were non-sweepable and skipped.", nonPrefixCount)
116+
}
117+
118+
return nil
119+
}

website/docs/r/firebase_web_app.html.markdown

+7
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ resource "google_firebase_web_app" "basic" {
5252
provider = google-beta
5353
project = google_project.default.project_id
5454
display_name = "Display Name Basic"
55+
deletion_policy = "DELETE"
5556
5657
depends_on = [google_firebase_project.default]
5758
}
@@ -97,6 +98,12 @@ The following arguments are supported:
9798
- - -
9899

99100

101+
* `deletion_policy` -
102+
(Optional)
103+
(Optional) Set to `ABANDON` to allow the WebApp to be untracked from terraform state
104+
rather than deleted upon `terraform destroy`. This is useful becaue the WebApp may be
105+
serving traffic. Set to `DELETE` to delete the WebApp. Default to `ABANDON`
106+
100107
* `project` - (Optional) The ID of the project in which the resource belongs.
101108
If it is not provided, the provider project is used.
102109

0 commit comments

Comments
 (0)