-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Initial commit * Adding google_cloudfunction_function resource * Some FMT updates * Working Cloud Function Create/Delete/Get Create is limited to gs:// source now. * Fixed tests import * Terraform now is able to apply and destroy function * Fully working Basic test * Added: 1. Allowed region check 2. readTimeout helper * Found better solution for conflicting values * Adding description * Adding full basic test * dded Update functionality * Made few more optional params * Added test for Labels * Added update tests * Added storage_* members and made function source deploy from storage bucket object * Adding comments * Adding tests for PubSub * Adding tests for Bucket * Adding Data provider * Fixing bug which allowed to miss error * Amending Operation retrieval * Fixing vet errors and vendoring cloudfunctions/v1 * Fixing according to comments * Fixing according to comments round #2 * Fixing tabs to space * Fixing tabs to space and some comments #3 * Re-done update to include labels in one update with others * Adding back default values. In case of such scenario, when user creates function with some values for "timeout" or "available_memory_mb", and then disables those attributes. Terraform plan then gives: No changes. Infrastructure is up-to-date. This is an error. By adding const we would avoid this error. * Fixed MixedCase and more tabs
- Loading branch information
1 parent
03cec5e
commit f07c332
Showing
13 changed files
with
4,990 additions
and
0 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,70 @@ | ||
package google | ||
|
||
import ( | ||
"fmt" | ||
"log" | ||
"time" | ||
|
||
"github.com/hashicorp/terraform/helper/resource" | ||
"google.golang.org/api/cloudfunctions/v1" | ||
) | ||
|
||
type CloudFunctionsOperationWaiter struct { | ||
Service *cloudfunctions.Service | ||
Op *cloudfunctions.Operation | ||
} | ||
|
||
func (w *CloudFunctionsOperationWaiter) RefreshFunc() resource.StateRefreshFunc { | ||
return func() (interface{}, string, error) { | ||
op, err := w.Service.Operations.Get(w.Op.Name).Do() | ||
|
||
if err != nil { | ||
return nil, "", err | ||
} | ||
|
||
status := "PENDING" | ||
if op.Done == true { | ||
status = "DONE" | ||
} | ||
|
||
log.Printf("[DEBUG] Got %q when asking for operation %q", status, w.Op.Name) | ||
return op, status, nil | ||
} | ||
} | ||
|
||
func (w *CloudFunctionsOperationWaiter) Conf() *resource.StateChangeConf { | ||
return &resource.StateChangeConf{ | ||
Pending: []string{"PENDING"}, | ||
Target: []string{"DONE"}, | ||
Refresh: w.RefreshFunc(), | ||
} | ||
} | ||
|
||
func cloudFunctionsOperationWait(client *cloudfunctions.Service, | ||
op *cloudfunctions.Operation, activity string) error { | ||
return cloudFunctionsOperationWaitTime(client, op, activity, 4) | ||
} | ||
|
||
func cloudFunctionsOperationWaitTime(client *cloudfunctions.Service, op *cloudfunctions.Operation, | ||
activity string, timeoutMin int) error { | ||
w := &CloudFunctionsOperationWaiter{ | ||
Service: client, | ||
Op: op, | ||
} | ||
|
||
state := w.Conf() | ||
state.Delay = 10 * time.Second | ||
state.Timeout = time.Duration(timeoutMin) * time.Minute | ||
state.MinTimeout = 2 * time.Second | ||
opRaw, err := state.WaitForState() | ||
if err != nil { | ||
return fmt.Errorf("Error waiting for %s: %s", activity, err) | ||
} | ||
|
||
resultOp := opRaw.(*cloudfunctions.Operation) | ||
if resultOp.Error != nil { | ||
return fmt.Errorf(resultOp.Error.Message) | ||
} | ||
|
||
return nil | ||
} |
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,45 @@ | ||
package google | ||
|
||
import ( | ||
"github.com/hashicorp/terraform/helper/schema" | ||
) | ||
|
||
func dataSourceGoogleCloudFunctionsFunction() *schema.Resource { | ||
// Generate datasource schema from resource | ||
dsSchema := datasourceSchemaFromResourceSchema(resourceCloudFunctionsFunction().Schema) | ||
|
||
// Set 'Required' schema elements | ||
addRequiredFieldsToSchema(dsSchema, "name") | ||
|
||
// Set 'Optional' schema elements | ||
addOptionalFieldsToSchema(dsSchema, "project", "region") | ||
|
||
return &schema.Resource{ | ||
Read: dataSourceGoogleCloudFunctionsFunctionRead, | ||
Schema: dsSchema, | ||
} | ||
} | ||
|
||
func dataSourceGoogleCloudFunctionsFunctionRead(d *schema.ResourceData, meta interface{}) error { | ||
config := meta.(*Config) | ||
|
||
project, err := getProject(d, config) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
region, err := getRegion(d, config) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
cloudFuncId := &cloudFunctionId{ | ||
Project: project, | ||
Region: region, | ||
Name: d.Get("name").(string), | ||
} | ||
|
||
d.SetId(cloudFuncId.terraformId()) | ||
|
||
return resourceCloudFunctionsRead(d, meta) | ||
} |
154 changes: 154 additions & 0 deletions
154
google/data_source_google_cloudfunctions_function_test.go
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,154 @@ | ||
package google | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
"testing" | ||
|
||
"github.com/hashicorp/terraform/helper/acctest" | ||
"github.com/hashicorp/terraform/helper/resource" | ||
"github.com/hashicorp/terraform/terraform" | ||
) | ||
|
||
func TestAccDataSourceGoogleCloudFunctionsFunction_basic(t *testing.T) { | ||
t.Parallel() | ||
|
||
funcDataNameHttp := "data.google_cloudfunctions_function.function_http" | ||
funcDataNamePubSub := "data.google_cloudfunctions_function.function_pubsub" | ||
funcDataNameBucket := "data.google_cloudfunctions_function.function_bucket" | ||
functionName := fmt.Sprintf("tf-test-%s", acctest.RandString(10)) | ||
bucketName := fmt.Sprintf("tf-test-bucket-%d", acctest.RandInt()) | ||
topicName := fmt.Sprintf("tf-test-sub-%s", acctest.RandString(10)) | ||
zipFilePath, err := createZIPArchiveForIndexJs(testHTTPTriggerPath) | ||
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: testAccDataSourceGoogleCloudFunctionsFunctionConfig(functionName, | ||
bucketName, zipFilePath, topicName), | ||
Check: resource.ComposeTestCheckFunc( | ||
testAccDataSourceGoogleCloudFunctionsFunctionCheck(funcDataNameHttp, | ||
"google_cloudfunctions_function.function_http"), | ||
testAccDataSourceGoogleCloudFunctionsFunctionCheck(funcDataNamePubSub, | ||
"google_cloudfunctions_function.function_pubsub"), | ||
testAccDataSourceGoogleCloudFunctionsFunctionCheck(funcDataNameBucket, | ||
"google_cloudfunctions_function.function_bucket"), | ||
), | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
func testAccDataSourceGoogleCloudFunctionsFunctionCheck(dataSourceName string, resourceName string) resource.TestCheckFunc { | ||
return func(s *terraform.State) error { | ||
ds, ok := s.RootModule().Resources[dataSourceName] | ||
if !ok { | ||
return fmt.Errorf("root module has no resource called %s", dataSourceName) | ||
} | ||
|
||
rs, ok := s.RootModule().Resources[resourceName] | ||
if !ok { | ||
return fmt.Errorf("can't find %s in state", resourceName) | ||
} | ||
|
||
dsAttr := ds.Primary.Attributes | ||
rsAttr := rs.Primary.Attributes | ||
|
||
cloudFuncAttrToCheck := []string{ | ||
"name", | ||
"region", | ||
"description", | ||
"available_memory_mb", | ||
"timeout", | ||
"storage_bucket", | ||
"storage_object", | ||
"entry_point", | ||
"trigger_http", | ||
"trigger_bucket", | ||
"trigger_topic", | ||
} | ||
|
||
for _, attr := range cloudFuncAttrToCheck { | ||
if dsAttr[attr] != rsAttr[attr] { | ||
return fmt.Errorf( | ||
"%s is %s; want %s", | ||
attr, | ||
dsAttr[attr], | ||
rsAttr[attr], | ||
) | ||
} | ||
} | ||
|
||
return nil | ||
} | ||
} | ||
|
||
func testAccDataSourceGoogleCloudFunctionsFunctionConfig(functionName string, | ||
bucketName string, zipFilePath string, topicName 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_http" { | ||
name = "%s-http" | ||
description = "test function" | ||
available_memory_mb = 128 | ||
source_archive_bucket = "${google_storage_bucket.bucket.name}" | ||
source_archive_object = "${google_storage_bucket_object.archive.name}" | ||
trigger_http = true | ||
timeout = 61 | ||
entry_point = "helloGET" | ||
} | ||
resource "google_cloudfunctions_function" "function_bucket" { | ||
name = "%s-bucket" | ||
available_memory_mb = 128 | ||
source_archive_bucket = "${google_storage_bucket.bucket.name}" | ||
source_archive_object = "${google_storage_bucket_object.archive.name}" | ||
trigger_bucket = "${google_storage_bucket.bucket.name}" | ||
timeout = 61 | ||
entry_point = "helloGET" | ||
} | ||
resource "google_pubsub_topic" "sub" { | ||
name = "%s" | ||
} | ||
resource "google_cloudfunctions_function" "function_pubsub" { | ||
name = "%s-pubsub" | ||
available_memory_mb = 128 | ||
source_archive_bucket = "${google_storage_bucket.bucket.name}" | ||
source_archive_object = "${google_storage_bucket_object.archive.name}" | ||
trigger_topic = "${google_pubsub_topic.sub.name}" | ||
timeout = 61 | ||
entry_point = "helloGET" | ||
} | ||
data "google_cloudfunctions_function" "function_http" { | ||
name = "${google_cloudfunctions_function.function_http.name}" | ||
} | ||
data "google_cloudfunctions_function" "function_bucket" { | ||
name = "${google_cloudfunctions_function.function_bucket.name}" | ||
} | ||
data "google_cloudfunctions_function" "function_pubsub" { | ||
name = "${google_cloudfunctions_function.function_pubsub.name}" | ||
} | ||
`, bucketName, zipFilePath, functionName, functionName, | ||
topicName, functionName) | ||
} |
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
Oops, something went wrong.