diff --git a/.changelog/6652.txt b/.changelog/6652.txt new file mode 100644 index 00000000000..3381b3774e5 --- /dev/null +++ b/.changelog/6652.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +firebase: added deletion support and new field `deletion_policy` for `google_firebase_web_app` +``` diff --git a/google/resource_firebase_web_app_sweeper_test.go b/google/resource_firebase_web_app_sweeper_test.go new file mode 100644 index 00000000000..745f75798e9 --- /dev/null +++ b/google/resource_firebase_web_app_sweeper_test.go @@ -0,0 +1,119 @@ +// ---------------------------------------------------------------------------- +// +// *** HANDWRITTEN CODE *** Type: MMv1 *** +// +// ---------------------------------------------------------------------------- + +package google + +import ( + "context" + "log" + "strings" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func init() { + resource.AddTestSweepers("FirebaseWebApp", &resource.Sweeper{ + Name: "FirebaseWebApp", + F: testSweepFirebaseWebApp, + }) +} + +// At the time of writing, the CI only passes us-central1 as the region +func testSweepFirebaseWebApp(region string) error { + resourceName := "FirebaseWebApp" + log.Printf("[INFO][SWEEPER_LOG] Starting sweeper for %s", resourceName) + + config, err := sharedConfigForRegion(region) + if err != nil { + log.Printf("[INFO][SWEEPER_LOG] error getting shared config for region: %s", err) + return err + } + + err = config.LoadAndValidate(context.Background()) + if err != nil { + log.Printf("[INFO][SWEEPER_LOG] error loading: %s", err) + return err + } + + t := &testing.T{} + billingId := getTestBillingAccountFromEnv(t) + + // Setup variables to replace in list template + d := &ResourceDataMock{ + FieldsInSchema: map[string]interface{}{ + "project": config.Project, + "region": region, + "location": region, + "zone": "-", + "billing_account": billingId, + }, + } + + listTemplate := strings.Split("https://firebase.googleapis.com/v1beta1/projects/{{project}}/webApps", "?")[0] + listUrl, err := replaceVars(d, config, listTemplate) + if err != nil { + log.Printf("[INFO][SWEEPER_LOG] error preparing sweeper list url: %s", err) + return nil + } + + res, err := sendRequest(config, "GET", config.Project, listUrl, config.userAgent, nil) + if err != nil { + log.Printf("[INFO][SWEEPER_LOG] Error in response from request %s: %s", listUrl, err) + return nil + } + + resourceList, ok := res["webApps"] + if !ok { + log.Printf("[INFO][SWEEPER_LOG] Nothing found in response.") + return nil + } + + rl := resourceList.([]interface{}) + + log.Printf("[INFO][SWEEPER_LOG] Found %d items in %s list response.", len(rl), resourceName) + // Keep count of items that aren't sweepable for logging. + nonPrefixCount := 0 + for _, ri := range rl { + obj := ri.(map[string]interface{}) + if obj["name"] == nil { + log.Printf("[INFO][SWEEPER_LOG] %s resource name was nil", resourceName) + return nil + } + + name := GetResourceNameFromSelfLink(obj["name"].(string)) + // Skip resources that shouldn't be sweeped + if !isSweepableTestResource(name) { + nonPrefixCount++ + continue + } + + deleteTemplate := "https://firebase.googleapis.com/v1beta1/{{name}}:remove" + deleteUrl, err := replaceVars(d, config, deleteTemplate) + if err != nil { + log.Printf("[INFO][SWEEPER_LOG] error preparing delete url: %s", err) + return nil + } + deleteUrl = deleteUrl + name + + body := make(map[string]interface{}) + body["immediate"] = true + + // Don't wait on operations as we may have a lot to delete + _, err = sendRequest(config, "POST", config.Project, deleteUrl, config.userAgent, body) + if err != nil { + log.Printf("[INFO][SWEEPER_LOG] Error deleting for url %s : %s", deleteUrl, err) + } else { + log.Printf("[INFO][SWEEPER_LOG] Sent delete request for %s resource: %s", resourceName, name) + } + } + + if nonPrefixCount > 0 { + log.Printf("[INFO][SWEEPER_LOG] %d items were non-sweepable and skipped.", nonPrefixCount) + } + + return nil +} diff --git a/website/docs/r/firebase_web_app.html.markdown b/website/docs/r/firebase_web_app.html.markdown index 4374778e6f6..9cc408db947 100644 --- a/website/docs/r/firebase_web_app.html.markdown +++ b/website/docs/r/firebase_web_app.html.markdown @@ -52,6 +52,7 @@ resource "google_firebase_web_app" "basic" { provider = google-beta project = google_project.default.project_id display_name = "Display Name Basic" + deletion_policy = "DELETE" depends_on = [google_firebase_project.default] } @@ -97,6 +98,12 @@ The following arguments are supported: - - - +* `deletion_policy` - + (Optional) + (Optional) Set to `ABANDON` to allow the WebApp to be untracked from terraform state + rather than deleted upon `terraform destroy`. This is useful becaue the WebApp may be + serving traffic. Set to `DELETE` to delete the WebApp. Default to `ABANDON` + * `project` - (Optional) The ID of the project in which the resource belongs. If it is not provided, the provider project is used.