-
Notifications
You must be signed in to change notification settings - Fork 264
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Cloud Run and Cloud Functions integration with Firebase Hosting hashi…
…corp/terraform-provider-google#12955 (#7213) (#5229) Signed-off-by: Modular Magician <magic-modules@google.com>
- Loading branch information
1 parent
da289eb
commit 11012ed
Showing
8 changed files
with
1,799 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
```release-note:new-resource | ||
google_firebase_hosting_version | ||
google_firebase_hosting_release | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,267 @@ | ||
// ---------------------------------------------------------------------------- | ||
// | ||
// *** 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 google | ||
|
||
import ( | ||
"fmt" | ||
"log" | ||
"reflect" | ||
"time" | ||
|
||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" | ||
) | ||
|
||
func resourceFirebaseHostingRelease() *schema.Resource { | ||
return &schema.Resource{ | ||
Create: resourceFirebaseHostingReleaseCreate, | ||
Read: resourceFirebaseHostingReleaseRead, | ||
Delete: resourceFirebaseHostingReleaseDelete, | ||
|
||
Importer: &schema.ResourceImporter{ | ||
State: resourceFirebaseHostingReleaseImport, | ||
}, | ||
|
||
Timeouts: &schema.ResourceTimeout{ | ||
Create: schema.DefaultTimeout(20 * time.Minute), | ||
Delete: schema.DefaultTimeout(20 * time.Minute), | ||
}, | ||
|
||
Schema: map[string]*schema.Schema{ | ||
"site_id": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
Description: `Required. The ID of the site to which the release belongs.`, | ||
}, | ||
"channel_id": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
Description: `The ID of the channel to which the release belongs. If not provided, the release will | ||
belong to the default "live" channel`, | ||
Default: "live", | ||
}, | ||
"message": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
Description: `The deploy description when the release was created. The value can be up to 512 characters.`, | ||
}, | ||
"type": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
Optional: true, | ||
ForceNew: true, | ||
ValidateFunc: validateEnum([]string{"DEPLOY", "ROLLBACK", "SITE_DISABLE", ""}), | ||
Description: `The type of the release; indicates what happened to the content of the site. There is no need to specify | ||
'DEPLOY' or 'ROLLBACK' type if a 'version_name' is provided. | ||
DEPLOY: A version was uploaded to Firebase Hosting and released. Output only. | ||
ROLLBACK: The release points back to a previously deployed version. Output only. | ||
SITE_DISABLE: The release prevents the site from serving content. Firebase Hosting acts as if the site never existed Possible values: ["DEPLOY", "ROLLBACK", "SITE_DISABLE"]`, | ||
}, | ||
"version_name": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
ForceNew: true, | ||
DiffSuppressFunc: compareSelfLinkOrResourceName, | ||
Description: `The unique identifier for a version, in the format: sites/SITE_ID/versions/VERSION_ID. | ||
The content of the version specified will be actively displayed on the appropriate URL. | ||
The Version must belong to the same site as in the 'site_id'. | ||
This parameter must be empty if the 'type' of the release is 'SITE_DISABLE'.`, | ||
}, | ||
"name": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
Description: `The unique identifier for the release, in either of the following formats: | ||
sites/SITE_ID/releases/RELEASE_ID | ||
sites/SITE_ID/channels/CHANNEL_ID/releases/RELEASE_ID`, | ||
}, | ||
"release_id": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
Description: `The unique identifier for the Release.`, | ||
}, | ||
}, | ||
UseJSONNumber: true, | ||
} | ||
} | ||
|
||
func resourceFirebaseHostingReleaseCreate(d *schema.ResourceData, meta interface{}) error { | ||
config := meta.(*Config) | ||
userAgent, err := generateUserAgentString(d, config.userAgent) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
obj := make(map[string]interface{}) | ||
typeProp, err := expandFirebaseHostingReleaseType(d.Get("type"), d, config) | ||
if err != nil { | ||
return err | ||
} else if v, ok := d.GetOkExists("type"); !isEmptyValue(reflect.ValueOf(typeProp)) && (ok || !reflect.DeepEqual(v, typeProp)) { | ||
obj["type"] = typeProp | ||
} | ||
messageProp, err := expandFirebaseHostingReleaseMessage(d.Get("message"), d, config) | ||
if err != nil { | ||
return err | ||
} else if v, ok := d.GetOkExists("message"); !isEmptyValue(reflect.ValueOf(messageProp)) && (ok || !reflect.DeepEqual(v, messageProp)) { | ||
obj["message"] = messageProp | ||
} | ||
|
||
url, err := replaceVars(d, config, "{{FirebaseHostingBasePath}}sites/{{site_id}}/channels/{{channel_id}}/releases?versionName={{version_name}}") | ||
if err != nil { | ||
return err | ||
} | ||
|
||
log.Printf("[DEBUG] Creating new Release: %#v", obj) | ||
billingProject := "" | ||
|
||
// err == nil indicates that the billing_project value was found | ||
if bp, err := getBillingProject(d, config); err == nil { | ||
billingProject = bp | ||
} | ||
|
||
res, err := sendRequestWithTimeout(config, "POST", billingProject, url, userAgent, obj, d.Timeout(schema.TimeoutCreate)) | ||
if err != nil { | ||
return fmt.Errorf("Error creating Release: %s", err) | ||
} | ||
if err := d.Set("name", flattenFirebaseHostingReleaseName(res["name"], d, config)); err != nil { | ||
return fmt.Errorf(`Error setting computed identity field "name": %s`, err) | ||
} | ||
|
||
// Store the ID now | ||
id, err := replaceVars(d, config, "sites/{{site_id}}/channels/{{channel_id}}/releases/{{release_id}}") | ||
if err != nil { | ||
return fmt.Errorf("Error constructing id: %s", err) | ||
} | ||
d.SetId(id) | ||
|
||
// Store the name as ID | ||
d.SetId(res["name"].(string)) | ||
|
||
if err = d.Set("release_id", GetResourceNameFromSelfLink(res["name"].(string))); err != nil { | ||
return fmt.Errorf("Error setting release_id: %s", err) | ||
} | ||
|
||
log.Printf("[DEBUG] Finished creating Release %q: %#v", d.Id(), res) | ||
|
||
return resourceFirebaseHostingReleaseRead(d, meta) | ||
} | ||
|
||
func resourceFirebaseHostingReleaseRead(d *schema.ResourceData, meta interface{}) error { | ||
config := meta.(*Config) | ||
userAgent, err := generateUserAgentString(d, config.userAgent) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
url, err := replaceVars(d, config, "{{FirebaseHostingBasePath}}sites/{{site_id}}/channels/{{channel_id}}/releases/{{release_id}}") | ||
if err != nil { | ||
return err | ||
} | ||
|
||
billingProject := "" | ||
|
||
// err == nil indicates that the billing_project value was found | ||
if bp, err := getBillingProject(d, config); err == nil { | ||
billingProject = bp | ||
} | ||
|
||
res, err := sendRequest(config, "GET", billingProject, url, userAgent, nil) | ||
if err != nil { | ||
return handleNotFoundError(err, d, fmt.Sprintf("FirebaseHostingRelease %q", d.Id())) | ||
} | ||
|
||
res, err = resourceFirebaseHostingReleaseDecoder(d, meta, res) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
if res == nil { | ||
// Decoding the object has resulted in it being gone. It may be marked deleted | ||
log.Printf("[DEBUG] Removing FirebaseHostingRelease because it no longer exists.") | ||
d.SetId("") | ||
return nil | ||
} | ||
|
||
if err := d.Set("name", flattenFirebaseHostingReleaseName(res["name"], d, config)); err != nil { | ||
return fmt.Errorf("Error reading Release: %s", err) | ||
} | ||
if err := d.Set("type", flattenFirebaseHostingReleaseType(res["type"], d, config)); err != nil { | ||
return fmt.Errorf("Error reading Release: %s", err) | ||
} | ||
if err := d.Set("message", flattenFirebaseHostingReleaseMessage(res["message"], d, config)); err != nil { | ||
return fmt.Errorf("Error reading Release: %s", err) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func resourceFirebaseHostingReleaseDelete(d *schema.ResourceData, meta interface{}) error { | ||
log.Printf("[WARNING] FirebaseHosting Release resources"+ | ||
" cannot be deleted from Google Cloud. The resource %s will be removed from Terraform"+ | ||
" state, but will still be present on Google Cloud.", d.Id()) | ||
d.SetId("") | ||
|
||
return nil | ||
} | ||
|
||
func resourceFirebaseHostingReleaseImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { | ||
config := meta.(*Config) | ||
if err := parseImportId([]string{ | ||
"sites/(?P<site_id>[^/]+)/channels/(?P<channel_id>[^/]+)/releases/(?P<release_id>[^/]+)", | ||
"sites/(?P<site_id>[^/]+)/releases/(?P<release_id>[^/]+)", | ||
"(?P<site_id>[^/]+)/(?P<channel_id>[^/]+)/(?P<release_id>[^/]+)", | ||
"(?P<site_id>[^/]+)/(?P<release_id>[^/]+)", | ||
}, d, config); err != nil { | ||
return nil, err | ||
} | ||
|
||
// Replace import id for the resource id | ||
id, err := replaceVars(d, config, "sites/{{site_id}}/channels/{{channel_id}}/releases/{{release_id}}") | ||
if err != nil { | ||
return nil, fmt.Errorf("Error constructing id: %s", err) | ||
} | ||
d.SetId(id) | ||
|
||
return []*schema.ResourceData{d}, nil | ||
} | ||
|
||
func flattenFirebaseHostingReleaseName(v interface{}, d *schema.ResourceData, config *Config) interface{} { | ||
return v | ||
} | ||
|
||
func flattenFirebaseHostingReleaseType(v interface{}, d *schema.ResourceData, config *Config) interface{} { | ||
return v | ||
} | ||
|
||
func flattenFirebaseHostingReleaseMessage(v interface{}, d *schema.ResourceData, config *Config) interface{} { | ||
return v | ||
} | ||
|
||
func expandFirebaseHostingReleaseType(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { | ||
return v, nil | ||
} | ||
|
||
func expandFirebaseHostingReleaseMessage(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { | ||
return v, nil | ||
} | ||
|
||
func resourceFirebaseHostingReleaseDecoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) { | ||
if err := d.Set("release_id", GetResourceNameFromSelfLink(res["name"].(string))); err != nil { | ||
return nil, err | ||
} | ||
|
||
return res, nil | ||
} |
Oops, something went wrong.