blob: d596c036a21c8d1dcadd38d0a957c3a63d00143c [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
// ----------------------------------------------------------------------------
//
// *** AUTO GENERATED CODE *** Type: MMv1 ***
//
// ----------------------------------------------------------------------------
//
// This file is automatically generated by Magic Modules and manual
// changes will be clobbered when the file is regenerated.
//
// Please read more about how to change this file in
// .github/CONTRIBUTING.md.
//
// ----------------------------------------------------------------------------
package firebase
import (
"fmt"
"log"
"net/http"
"reflect"
"strings"
"time"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
)
func ResourceFirebaseAndroidApp() *schema.Resource {
return &schema.Resource{
Create: resourceFirebaseAndroidAppCreate,
Read: resourceFirebaseAndroidAppRead,
Update: resourceFirebaseAndroidAppUpdate,
Delete: resourceFirebaseAndroidAppDelete,
Importer: &schema.ResourceImporter{
State: resourceFirebaseAndroidAppImport,
},
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(20 * time.Minute),
Update: schema.DefaultTimeout(20 * time.Minute),
Delete: schema.DefaultTimeout(20 * time.Minute),
},
CustomizeDiff: customdiff.All(
tpgresource.DefaultProviderProject,
),
Schema: map[string]*schema.Schema{
"display_name": {
Type: schema.TypeString,
Required: true,
Description: `The user-assigned display name of the AndroidApp.`,
},
"package_name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: `The canonical package name of the Android app as would appear in the Google Play
Developer Console.`,
},
"api_key_id": {
Type: schema.TypeString,
Computed: true,
Optional: true,
Description: `The globally unique, Google-assigned identifier (UID) for the Firebase API key associated with the AndroidApp.
If apiKeyId is not set during creation, then Firebase automatically associates an apiKeyId with the AndroidApp.
This auto-associated key may be an existing valid key or, if no valid key exists, a new one will be provisioned.`,
},
"sha1_hashes": {
Type: schema.TypeList,
Optional: true,
Description: `The SHA1 certificate hashes for the AndroidApp.`,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"sha256_hashes": {
Type: schema.TypeList,
Optional: true,
Description: `The SHA256 certificate hashes for the AndroidApp.`,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"app_id": {
Type: schema.TypeString,
Computed: true,
Description: `The globally unique, Firebase-assigned identifier of the AndroidApp.
This identifier should be treated as an opaque token, as the data format is not specified.`,
},
"etag": {
Type: schema.TypeString,
Computed: true,
Description: `This checksum is computed by the server based on the value of other fields, and it may be sent
with update requests to ensure the client has an up-to-date value before proceeding.`,
},
"name": {
Type: schema.TypeString,
Computed: true,
Description: `The fully qualified resource name of the AndroidApp, for example:
projects/projectId/androidApps/appId`,
},
"deletion_policy": {
Type: schema.TypeString,
Optional: true,
Description: `(Optional) Set to 'ABANDON' to allow the AndroidApp to be untracked from terraform state
rather than deleted upon 'terraform destroy'. This is useful because the AndroidApp may be
serving traffic. Set to 'DELETE' to delete the AndroidApp. Defaults to 'DELETE'.`,
Default: "DELETE",
},
"project": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
},
UseJSONNumber: true,
}
}
func resourceFirebaseAndroidAppCreate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}
obj := make(map[string]interface{})
displayNameProp, err := expandFirebaseAndroidAppDisplayName(d.Get("display_name"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("display_name"); !tpgresource.IsEmptyValue(reflect.ValueOf(displayNameProp)) && (ok || !reflect.DeepEqual(v, displayNameProp)) {
obj["displayName"] = displayNameProp
}
packageNameProp, err := expandFirebaseAndroidAppPackageName(d.Get("package_name"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("package_name"); !tpgresource.IsEmptyValue(reflect.ValueOf(packageNameProp)) && (ok || !reflect.DeepEqual(v, packageNameProp)) {
obj["packageName"] = packageNameProp
}
sha1HashesProp, err := expandFirebaseAndroidAppSha1Hashes(d.Get("sha1_hashes"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("sha1_hashes"); !tpgresource.IsEmptyValue(reflect.ValueOf(sha1HashesProp)) && (ok || !reflect.DeepEqual(v, sha1HashesProp)) {
obj["sha1Hashes"] = sha1HashesProp
}
sha256HashesProp, err := expandFirebaseAndroidAppSha256Hashes(d.Get("sha256_hashes"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("sha256_hashes"); !tpgresource.IsEmptyValue(reflect.ValueOf(sha256HashesProp)) && (ok || !reflect.DeepEqual(v, sha256HashesProp)) {
obj["sha256Hashes"] = sha256HashesProp
}
apiKeyIdProp, err := expandFirebaseAndroidAppApiKeyId(d.Get("api_key_id"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("api_key_id"); !tpgresource.IsEmptyValue(reflect.ValueOf(apiKeyIdProp)) && (ok || !reflect.DeepEqual(v, apiKeyIdProp)) {
obj["apiKeyId"] = apiKeyIdProp
}
etagProp, err := expandFirebaseAndroidAppEtag(d.Get("etag"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("etag"); !tpgresource.IsEmptyValue(reflect.ValueOf(etagProp)) && (ok || !reflect.DeepEqual(v, etagProp)) {
obj["etag"] = etagProp
}
url, err := tpgresource.ReplaceVars(d, config, "{{FirebaseBasePath}}projects/{{project}}/androidApps")
if err != nil {
return err
}
log.Printf("[DEBUG] Creating new AndroidApp: %#v", obj)
billingProject := ""
project, err := tpgresource.GetProject(d, config)
if err != nil {
return fmt.Errorf("Error fetching project for AndroidApp: %s", err)
}
billingProject = project
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
headers := make(http.Header)
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "POST",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
Body: obj,
Timeout: d.Timeout(schema.TimeoutCreate),
Headers: headers,
})
if err != nil {
return fmt.Errorf("Error creating AndroidApp: %s", err)
}
// Store the ID now
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/androidApps/{{app_id}}")
if err != nil {
return fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)
// Use the resource in the operation response to populate
// identity fields and d.Id() before read
var opRes map[string]interface{}
err = FirebaseOperationWaitTimeWithResponse(
config, res, &opRes, project, "Creating AndroidApp", userAgent,
d.Timeout(schema.TimeoutCreate))
if err != nil {
// The resource didn't actually create
d.SetId("")
return fmt.Errorf("Error waiting to create AndroidApp: %s", err)
}
if err := d.Set("name", flattenFirebaseAndroidAppName(opRes["name"], d, config)); err != nil {
return err
}
if err := d.Set("app_id", flattenFirebaseAndroidAppAppId(opRes["appId"], d, config)); err != nil {
return err
}
// This may have caused the ID to update - update it if so.
id, err = tpgresource.ReplaceVars(d, config, "projects/{{project}}/androidApps/{{app_id}}")
if err != nil {
return fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)
log.Printf("[DEBUG] Finished creating AndroidApp %q: %#v", d.Id(), res)
return resourceFirebaseAndroidAppRead(d, meta)
}
func resourceFirebaseAndroidAppRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}
url, err := tpgresource.ReplaceVars(d, config, "{{FirebaseBasePath}}projects/{{project}}/androidApps/{{app_id}}")
if err != nil {
return err
}
billingProject := ""
project, err := tpgresource.GetProject(d, config)
if err != nil {
return fmt.Errorf("Error fetching project for AndroidApp: %s", err)
}
billingProject = project
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
headers := make(http.Header)
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "GET",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
Headers: headers,
})
if err != nil {
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("FirebaseAndroidApp %q", d.Id()))
}
// Explicitly set virtual fields to default values if unset
if _, ok := d.GetOkExists("deletion_policy"); !ok {
if err := d.Set("deletion_policy", "DELETE"); err != nil {
return fmt.Errorf("Error setting deletion_policy: %s", err)
}
}
if err := d.Set("project", project); err != nil {
return fmt.Errorf("Error reading AndroidApp: %s", err)
}
if err := d.Set("name", flattenFirebaseAndroidAppName(res["name"], d, config)); err != nil {
return fmt.Errorf("Error reading AndroidApp: %s", err)
}
if err := d.Set("display_name", flattenFirebaseAndroidAppDisplayName(res["displayName"], d, config)); err != nil {
return fmt.Errorf("Error reading AndroidApp: %s", err)
}
if err := d.Set("app_id", flattenFirebaseAndroidAppAppId(res["appId"], d, config)); err != nil {
return fmt.Errorf("Error reading AndroidApp: %s", err)
}
if err := d.Set("package_name", flattenFirebaseAndroidAppPackageName(res["packageName"], d, config)); err != nil {
return fmt.Errorf("Error reading AndroidApp: %s", err)
}
if err := d.Set("sha1_hashes", flattenFirebaseAndroidAppSha1Hashes(res["sha1Hashes"], d, config)); err != nil {
return fmt.Errorf("Error reading AndroidApp: %s", err)
}
if err := d.Set("sha256_hashes", flattenFirebaseAndroidAppSha256Hashes(res["sha256Hashes"], d, config)); err != nil {
return fmt.Errorf("Error reading AndroidApp: %s", err)
}
if err := d.Set("api_key_id", flattenFirebaseAndroidAppApiKeyId(res["apiKeyId"], d, config)); err != nil {
return fmt.Errorf("Error reading AndroidApp: %s", err)
}
if err := d.Set("etag", flattenFirebaseAndroidAppEtag(res["etag"], d, config)); err != nil {
return fmt.Errorf("Error reading AndroidApp: %s", err)
}
return nil
}
func resourceFirebaseAndroidAppUpdate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}
billingProject := ""
project, err := tpgresource.GetProject(d, config)
if err != nil {
return fmt.Errorf("Error fetching project for AndroidApp: %s", err)
}
billingProject = project
obj := make(map[string]interface{})
displayNameProp, err := expandFirebaseAndroidAppDisplayName(d.Get("display_name"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("display_name"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, displayNameProp)) {
obj["displayName"] = displayNameProp
}
sha1HashesProp, err := expandFirebaseAndroidAppSha1Hashes(d.Get("sha1_hashes"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("sha1_hashes"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, sha1HashesProp)) {
obj["sha1Hashes"] = sha1HashesProp
}
sha256HashesProp, err := expandFirebaseAndroidAppSha256Hashes(d.Get("sha256_hashes"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("sha256_hashes"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, sha256HashesProp)) {
obj["sha256Hashes"] = sha256HashesProp
}
apiKeyIdProp, err := expandFirebaseAndroidAppApiKeyId(d.Get("api_key_id"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("api_key_id"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, apiKeyIdProp)) {
obj["apiKeyId"] = apiKeyIdProp
}
etagProp, err := expandFirebaseAndroidAppEtag(d.Get("etag"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("etag"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, etagProp)) {
obj["etag"] = etagProp
}
url, err := tpgresource.ReplaceVars(d, config, "{{FirebaseBasePath}}projects/{{project}}/androidApps/{{app_id}}")
if err != nil {
return err
}
log.Printf("[DEBUG] Updating AndroidApp %q: %#v", d.Id(), obj)
headers := make(http.Header)
updateMask := []string{}
if d.HasChange("display_name") {
updateMask = append(updateMask, "displayName")
}
if d.HasChange("sha1_hashes") {
updateMask = append(updateMask, "sha1Hashes")
}
if d.HasChange("sha256_hashes") {
updateMask = append(updateMask, "sha256Hashes")
}
if d.HasChange("api_key_id") {
updateMask = append(updateMask, "apiKeyId")
}
if d.HasChange("etag") {
updateMask = append(updateMask, "etag")
}
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
// won't set it
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
if err != nil {
return err
}
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
// if updateMask is empty we are not updating anything so skip the post
if len(updateMask) > 0 {
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "PATCH",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
Body: obj,
Timeout: d.Timeout(schema.TimeoutUpdate),
Headers: headers,
})
if err != nil {
return fmt.Errorf("Error updating AndroidApp %q: %s", d.Id(), err)
} else {
log.Printf("[DEBUG] Finished updating AndroidApp %q: %#v", d.Id(), res)
}
}
return resourceFirebaseAndroidAppRead(d, meta)
}
func resourceFirebaseAndroidAppDelete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*transport_tpg.Config)
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
if err != nil {
return err
}
// Handwritten
obj := make(map[string]interface{})
if d.Get("deletion_policy") == "DELETE" {
obj["immediate"] = true
} else {
fmt.Printf("Skip deleting App %q due to deletion_policy: %q\n", d.Id(), d.Get("deletion_policy"))
return nil
}
// End of Handwritten
billingProject := ""
project, err := tpgresource.GetProject(d, config)
if err != nil {
return fmt.Errorf("Error fetching project for App: %s", err)
}
billingProject = project
url, err := tpgresource.ReplaceVars(d, config, "{{FirebaseBasePath}}{{name}}:remove")
if err != nil {
return err
}
log.Printf("[DEBUG] Deleting App %q", d.Id())
// err == nil indicates that the billing_project value was found
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
billingProject = bp
}
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: config,
Method: "POST",
Project: billingProject,
RawURL: url,
UserAgent: userAgent,
Body: obj,
Timeout: d.Timeout(schema.TimeoutDelete),
})
if err != nil {
return transport_tpg.HandleNotFoundError(err, d, "App")
}
err = FirebaseOperationWaitTime(
config, res, project, "Deleting App", userAgent,
d.Timeout(schema.TimeoutDelete))
if err != nil {
return err
}
log.Printf("[DEBUG] Finished deleting App %q: %#v", d.Id(), res)
// This is useful if the Delete operation returns before the Get operation
// during post-test destroy shows the completed state of the resource.
time.Sleep(5 * time.Second)
return nil
}
func resourceFirebaseAndroidAppImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
config := meta.(*transport_tpg.Config)
if err := tpgresource.ParseImportId([]string{
"^(?P<project>[^/]+) projects/(?P<project>[^/]+)/androidApps/(?P<app_id>[^/]+)$",
"^projects/(?P<project>[^/]+)/androidApps/(?P<app_id>[^/]+)$",
"^(?P<project>[^/]+)/(?P<project>[^/]+)/(?P<app_id>[^/]+)$",
"^androidApps/(?P<app_id>[^/]+)$",
"^(?P<app_id>[^/]+)$",
}, d, config); err != nil {
return nil, err
}
// Replace import id for the resource id
id, err := tpgresource.ReplaceVars(d, config, "projects/{{project}}/androidApps/{{app_id}}")
if err != nil {
return nil, fmt.Errorf("Error constructing id: %s", err)
}
d.SetId(id)
// Explicitly set virtual fields to default values on import
if err := d.Set("deletion_policy", "DELETE"); err != nil {
return nil, fmt.Errorf("Error setting deletion_policy: %s", err)
}
return []*schema.ResourceData{d}, nil
}
func flattenFirebaseAndroidAppName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenFirebaseAndroidAppDisplayName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenFirebaseAndroidAppAppId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenFirebaseAndroidAppPackageName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenFirebaseAndroidAppSha1Hashes(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenFirebaseAndroidAppSha256Hashes(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenFirebaseAndroidAppApiKeyId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func flattenFirebaseAndroidAppEtag(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
return v
}
func expandFirebaseAndroidAppDisplayName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandFirebaseAndroidAppPackageName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandFirebaseAndroidAppSha1Hashes(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandFirebaseAndroidAppSha256Hashes(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandFirebaseAndroidAppApiKeyId(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}
func expandFirebaseAndroidAppEtag(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
return v, nil
}