mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-07-05 17:52:38 +00:00
support firestore cloud function triggers (#2480)
* support firestore cloud function triggers * document firestore trigger specifics
This commit is contained in:
parent
c293447436
commit
7dd80d7102
|
@ -535,6 +535,10 @@ func expandEventTrigger(configured []interface{}, project string) *cloudfunction
|
||||||
shape = "projects/%s/buckets/%s"
|
shape = "projects/%s/buckets/%s"
|
||||||
case strings.HasPrefix(eventType, "providers/cloud.pubsub/eventTypes/"):
|
case strings.HasPrefix(eventType, "providers/cloud.pubsub/eventTypes/"):
|
||||||
shape = "projects/%s/topics/%s"
|
shape = "projects/%s/topics/%s"
|
||||||
|
case strings.HasPrefix(eventType, "providers/cloud.firestore/eventTypes/"):
|
||||||
|
// Firestore doesn't not yet support multiple databases, so "(default)" is assumed.
|
||||||
|
// https://cloud.google.com/functions/docs/calling/cloud-firestore#deploying_your_function
|
||||||
|
shape = "projects/%s/databases/(default)/documents/%s"
|
||||||
}
|
}
|
||||||
|
|
||||||
return &cloudfunctions.EventTrigger{
|
return &cloudfunctions.EventTrigger{
|
||||||
|
@ -550,9 +554,28 @@ func flattenEventTrigger(eventTrigger *cloudfunctions.EventTrigger) []map[string
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resource := ""
|
||||||
|
switch {
|
||||||
|
case strings.HasPrefix(eventTrigger.EventType, "google.storage.object."):
|
||||||
|
resource = GetResourceNameFromSelfLink(eventTrigger.Resource)
|
||||||
|
case strings.HasPrefix(eventTrigger.EventType, "google.pubsub.topic."):
|
||||||
|
resource = GetResourceNameFromSelfLink(eventTrigger.Resource)
|
||||||
|
// Legacy style triggers
|
||||||
|
case strings.HasPrefix(eventTrigger.EventType, "providers/cloud.storage/eventTypes/"):
|
||||||
|
resource = GetResourceNameFromSelfLink(eventTrigger.Resource)
|
||||||
|
case strings.HasPrefix(eventTrigger.EventType, "providers/cloud.pubsub/eventTypes/"):
|
||||||
|
resource = GetResourceNameFromSelfLink(eventTrigger.Resource)
|
||||||
|
case strings.HasPrefix(eventTrigger.EventType, "providers/cloud.firestore/eventTypes/"):
|
||||||
|
// Simply taking the substring after the last "/" is not sufficient for firestore as resources may have slashes.
|
||||||
|
// For the eventTrigger.Resource "projects/my-project/databases/(default)/documents/messages/{messageId}" we extract
|
||||||
|
// the resource "messages/{messageId}" by taking the everything after the 5th "/"
|
||||||
|
parts := strings.SplitN(eventTrigger.Resource, "/", 6)
|
||||||
|
resource = parts[len(parts)-1]
|
||||||
|
}
|
||||||
|
|
||||||
result = append(result, map[string]interface{}{
|
result = append(result, map[string]interface{}{
|
||||||
"event_type": eventTrigger.EventType,
|
"event_type": eventTrigger.EventType,
|
||||||
"resource": GetResourceNameFromSelfLink(eventTrigger.Resource),
|
"resource": resource,
|
||||||
"failure_policy": flattenFailurePolicy(eventTrigger.FailurePolicy),
|
"failure_policy": flattenFailurePolicy(eventTrigger.FailurePolicy),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ const testHTTPTriggerPath = "./test-fixtures/cloudfunctions/http_trigger.js"
|
||||||
const testHTTPTriggerUpdatePath = "./test-fixtures/cloudfunctions/http_trigger_update.js"
|
const testHTTPTriggerUpdatePath = "./test-fixtures/cloudfunctions/http_trigger_update.js"
|
||||||
const testPubSubTriggerPath = "./test-fixtures/cloudfunctions/pubsub_trigger.js"
|
const testPubSubTriggerPath = "./test-fixtures/cloudfunctions/pubsub_trigger.js"
|
||||||
const testBucketTriggerPath = "./test-fixtures/cloudfunctions/bucket_trigger.js"
|
const testBucketTriggerPath = "./test-fixtures/cloudfunctions/bucket_trigger.js"
|
||||||
|
const testFirestoreTriggerPath = "./test-fixtures/cloudfunctions/firestore_trigger.js"
|
||||||
|
|
||||||
func TestAccCloudFunctionsFunction_basic(t *testing.T) {
|
func TestAccCloudFunctionsFunction_basic(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
@ -205,6 +206,34 @@ func TestAccCloudFunctionsFunction_bucket(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAccCloudFunctionsFunction_firestore(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
funcResourceName := "google_cloudfunctions_function.function"
|
||||||
|
functionName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
|
||||||
|
bucketName := fmt.Sprintf("tf-test-bucket-%d", acctest.RandInt())
|
||||||
|
zipFilePath, err := createZIPArchiveForIndexJs(testFirestoreTriggerPath)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err.Error())
|
||||||
|
}
|
||||||
|
defer os.Remove(zipFilePath) // clean up
|
||||||
|
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
CheckDestroy: testAccCheckCloudFunctionsFunctionDestroy,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
{
|
||||||
|
Config: testAccCloudFunctionsFunction_firestore(functionName, bucketName, zipFilePath),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ResourceName: funcResourceName,
|
||||||
|
ImportState: true,
|
||||||
|
ImportStateVerify: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func testAccCheckCloudFunctionsFunctionDestroy(s *terraform.State) error {
|
func testAccCheckCloudFunctionsFunctionDestroy(s *terraform.State) error {
|
||||||
config := testAccProvider.Meta().(*Config)
|
config := testAccProvider.Meta().(*Config)
|
||||||
|
|
||||||
|
@ -508,3 +537,30 @@ resource "google_cloudfunctions_function" "function" {
|
||||||
}
|
}
|
||||||
}`, bucketName, zipFilePath, functionName)
|
}`, bucketName, zipFilePath, functionName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testAccCloudFunctionsFunction_firestore(functionName string, bucketName string,
|
||||||
|
zipFilePath string) string {
|
||||||
|
return fmt.Sprintf(`
|
||||||
|
resource "google_storage_bucket" "bucket" {
|
||||||
|
name = "%s"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "google_storage_bucket_object" "archive" {
|
||||||
|
name = "index.zip"
|
||||||
|
bucket = "${google_storage_bucket.bucket.name}"
|
||||||
|
source = "%s"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "google_cloudfunctions_function" "function" {
|
||||||
|
name = "%s"
|
||||||
|
available_memory_mb = 128
|
||||||
|
source_archive_bucket = "${google_storage_bucket.bucket.name}"
|
||||||
|
source_archive_object = "${google_storage_bucket_object.archive.name}"
|
||||||
|
timeout = 61
|
||||||
|
entry_point = "helloFirestore"
|
||||||
|
event_trigger {
|
||||||
|
event_type = "providers/cloud.firestore/eventTypes/document.write"
|
||||||
|
resource = "messages/{messageId}"
|
||||||
|
}
|
||||||
|
}`, bucketName, zipFilePath, functionName)
|
||||||
|
}
|
||||||
|
|
13
google/test-fixtures/cloudfunctions/firestore_trigger.js
Normal file
13
google/test-fixtures/cloudfunctions/firestore_trigger.js
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
/**
|
||||||
|
* Background Cloud Function to be triggered by Firestore.
|
||||||
|
*
|
||||||
|
* @param {object} event The Cloud Functions event.
|
||||||
|
* @param {function} callback The callback function.
|
||||||
|
*/
|
||||||
|
exports.helloFirestore = function (event, callback) {
|
||||||
|
const messageId = event.params.messageId;
|
||||||
|
|
||||||
|
console.log(`Received message ${messageId}`);
|
||||||
|
|
||||||
|
callback();
|
||||||
|
};
|
|
@ -78,9 +78,9 @@ The `event_trigger` block supports:
|
||||||
|
|
||||||
* `event_type` - (Required) The type of event to observe. For example: `"google.storage.object.finalize"`.
|
* `event_type` - (Required) The type of event to observe. For example: `"google.storage.object.finalize"`.
|
||||||
See the documentation on [calling Cloud Functions](https://cloud.google.com/functions/docs/calling/) for a full reference.
|
See the documentation on [calling Cloud Functions](https://cloud.google.com/functions/docs/calling/) for a full reference.
|
||||||
Only Cloud Storage and Cloud Pub/Sub triggers are supported at this time.
|
Cloud Storage, Cloud Pub/Sub and Cloud Firestore triggers are supported at this time.
|
||||||
Legacy Cloud Storage and Cloud Pub/Sub triggers are also supported, such as `"providers/cloud.storage/eventTypes/object.change"`
|
Legacy triggers are supported, such as `"providers/cloud.storage/eventTypes/object.change"`,
|
||||||
and `"providers/cloud.pubsub/eventTypes/topic.publish"`.
|
`"providers/cloud.pubsub/eventTypes/topic.publish"` and `"providers/cloud.firestore/eventTypes/document.create"`.
|
||||||
|
|
||||||
* `resource` - (Required) Required. The name of the resource from which to observe events, for example, `"myBucket"`
|
* `resource` - (Required) Required. The name of the resource from which to observe events, for example, `"myBucket"`
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user