Skip to content

Commit

Permalink
Add cloudfunctions function IAM resources
Browse files Browse the repository at this point in the history
Signed-off-by: Modular Magician <[email protected]>
  • Loading branch information
emilymye authored and modular-magician committed Sep 10, 2019
1 parent 4f4cf19 commit c445265
Show file tree
Hide file tree
Showing 17 changed files with 668 additions and 100 deletions.
7 changes: 4 additions & 3 deletions google/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ type Config struct {
BigtableBasePath string
BinaryAuthorizationBasePath string
CloudBuildBasePath string
CloudFunctionsBasePath string
CloudSchedulerBasePath string
ComputeBasePath string
DataprocBasePath string
Expand Down Expand Up @@ -168,8 +169,7 @@ type Config struct {

clientBigQuery *bigquery.Service

CloudFunctionsBasePath string
clientCloudFunctions *cloudfunctions.Service
clientCloudFunctions *cloudfunctions.Service

CloudIoTBasePath string
clientCloudIoT *cloudiot.Service
Expand Down Expand Up @@ -203,6 +203,7 @@ var BigqueryDataTransferDefaultBasePath = "https://bigquerydatatransfer.googleap
var BigtableDefaultBasePath = "https://bigtableadmin.googleapis.com/v2/"
var BinaryAuthorizationDefaultBasePath = "https://binaryauthorization.googleapis.com/v1/"
var CloudBuildDefaultBasePath = "https://cloudbuild.googleapis.com/v1/"
var CloudFunctionsDefaultBasePath = "https://cloudfunctions.googleapis.com/v1/"
var CloudSchedulerDefaultBasePath = "https://cloudscheduler.googleapis.com/v1/"
var ComputeDefaultBasePath = "https://www.googleapis.com/compute/v1/"
var DataprocDefaultBasePath = "https://dataproc.googleapis.com/v1/"
Expand Down Expand Up @@ -665,6 +666,7 @@ func ConfigureBasePaths(c *Config) {
c.BigtableBasePath = BigtableDefaultBasePath
c.BinaryAuthorizationBasePath = BinaryAuthorizationDefaultBasePath
c.CloudBuildBasePath = CloudBuildDefaultBasePath
c.CloudFunctionsBasePath = CloudFunctionsDefaultBasePath
c.CloudSchedulerBasePath = CloudSchedulerDefaultBasePath
c.ComputeBasePath = ComputeDefaultBasePath
c.DataprocBasePath = DataprocDefaultBasePath
Expand Down Expand Up @@ -703,7 +705,6 @@ func ConfigureBasePaths(c *Config) {
c.ServiceNetworkingBasePath = ServiceNetworkingDefaultBasePath
c.ServiceUsageBasePath = ServiceUsageDefaultBasePath
c.BigQueryBasePath = BigQueryDefaultBasePath
c.CloudFunctionsBasePath = CloudFunctionsDefaultBasePath
c.CloudIoTBasePath = CloudIoTDefaultBasePath
c.StorageTransferBasePath = StorageTransferDefaultBasePath
c.BigtableAdminBasePath = BigtableAdminDefaultBasePath
Expand Down
5 changes: 1 addition & 4 deletions google/data_source_google_cloudfunctions_function_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@ func TestAccDataSourceGoogleCloudFunctionsFunction_basic(t *testing.T) {
funcDataNameHttp := "data.google_cloudfunctions_function.function_http"
functionName := fmt.Sprintf("tf-test-%s", acctest.RandString(10))
bucketName := fmt.Sprintf("tf-test-bucket-%d", acctest.RandInt())
zipFilePath, err := createZIPArchiveForIndexJs(testHTTPTriggerPath)
if err != nil {
t.Fatal(err.Error())
}
zipFilePath := createZIPArchiveForCloudFunctionSource(t, testHTTPTriggerPath)
defer os.Remove(zipFilePath) // clean up

resource.Test(t, resource.TestCase{
Expand Down
191 changes: 191 additions & 0 deletions google/iam_cloud_functions_cloud_function.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
// ----------------------------------------------------------------------------
//
// *** AUTO GENERATED CODE *** AUTO GENERATED CODE ***
//
// ----------------------------------------------------------------------------
//
// 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"

"github.com/hashicorp/errwrap"
"github.com/hashicorp/terraform/helper/schema"
"google.golang.org/api/cloudresourcemanager/v1"
)

var CloudFunctionsCloudFunctionIamSchema = map[string]*schema.Schema{
"project": {
Type: schema.TypeString,
Computed: true,
Optional: true,
ForceNew: true,
},
"region": {
Type: schema.TypeString,
Computed: true,
Optional: true,
ForceNew: true,
},
"cloud_function": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
DiffSuppressFunc: compareSelfLinkOrResourceName,
},
}

type CloudFunctionsCloudFunctionIamUpdater struct {
project string
region string
cloudFunction string
d *schema.ResourceData
Config *Config
}

func CloudFunctionsCloudFunctionIamUpdaterProducer(d *schema.ResourceData, config *Config) (ResourceIamUpdater, error) {
values := make(map[string]string)

project, err := getProject(d, config)
if err != nil {
return nil, err
}
values["project"] = project

region, err := getRegion(d, config)
if err != nil {
return nil, err
}
values["region"] = region

// We may have gotten either a long or short name, so attempt to parse long name if possible
m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<region>[^/]+)/functions/(?P<cloud_function>[^/]+)", "(?P<project>[^/]+)/(?P<region>[^/]+)/(?P<cloud_function>[^/]+)", "(?P<region>[^/]+)/(?P<cloud_function>[^/]+)", "(?P<cloud_function>[^/]+)"}, d, config, d.Get("cloud_function").(string))
if err != nil {
return nil, err
}

for k, v := range m {
values[k] = v
}

u := &CloudFunctionsCloudFunctionIamUpdater{
project: values["project"],
region: values["region"],
cloudFunction: values["cloud_function"],
d: d,
Config: config,
}

d.Set("project", u.project)
d.Set("region", u.region)
d.Set("cloud_function", u.GetResourceId())

d.SetId(u.GetResourceId())

return u, nil
}

func CloudFunctionsCloudFunctionIdParseFunc(d *schema.ResourceData, config *Config) error {
values := make(map[string]string)

project, err := getProject(d, config)
if err != nil {
return err
}
values["project"] = project

region, err := getRegion(d, config)
if err != nil {
return nil, err
}
values["region"] = region

m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<region>[^/]+)/functions/(?P<cloud_function>[^/]+)", "(?P<project>[^/]+)/(?P<region>[^/]+)/(?P<cloud_function>[^/]+)", "(?P<region>[^/]+)/(?P<cloud_function>[^/]+)", "(?P<cloud_function>[^/]+)"}, d, config, d.Id())
if err != nil {
return err
}

for k, v := range m {
values[k] = v
}

u := &CloudFunctionsCloudFunctionIamUpdater{
project: values["project"],
region: values["region"],
cloudFunction: values["cloud_function"],
d: d,
Config: config,
}
d.Set("cloud_function", u.GetResourceId())
d.SetId(u.GetResourceId())
return nil
}

func (u *CloudFunctionsCloudFunctionIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
url := u.qualifyCloudFunctionUrl("getIamPolicy")

project, err := getProject(u.d, u.Config)
if err != nil {
return nil, err
}

policy, err := sendRequest(u.Config, "GET", project, url, nil)
if err != nil {
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
}

out := &cloudresourcemanager.Policy{}
err = Convert(policy, out)
if err != nil {
return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
}

return out, nil
}

func (u *CloudFunctionsCloudFunctionIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
json, err := ConvertToMap(policy)
if err != nil {
return err
}

obj := make(map[string]interface{})
obj["policy"] = json

url := u.qualifyCloudFunctionUrl("setIamPolicy")

project, err := getProject(u.d, u.Config)
if err != nil {
return err
}

_, err = sendRequestWithTimeout(u.Config, "POST", project, url, obj, u.d.Timeout(schema.TimeoutCreate))
if err != nil {
return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
}

return nil
}

func (u *CloudFunctionsCloudFunctionIamUpdater) qualifyCloudFunctionUrl(methodIdentifier string) string {
return fmt.Sprintf("https://cloudfunctions.googleapis.com/v1/%s/%s", fmt.Sprintf("projects/%s/locations/%s/functions/%s", u.project, u.region, u.cloudFunction), methodIdentifier)
}

func (u *CloudFunctionsCloudFunctionIamUpdater) GetResourceId() string {
return fmt.Sprintf("%s/%s/%s", u.project, u.region, u.cloudFunction)
}

func (u *CloudFunctionsCloudFunctionIamUpdater) GetMutexKey() string {
return fmt.Sprintf("iam-cloudfunctions-cloudfunction-%s", u.GetResourceId())
}

func (u *CloudFunctionsCloudFunctionIamUpdater) DescribeResource() string {
return fmt.Sprintf("cloudfunctions cloudfunction %q", u.GetResourceId())
}
Loading

0 comments on commit c445265

Please sign in to comment.