Skip to content

Commit a2c5b35

Browse files
committed
add support for user project overrides
1 parent c31a687 commit a2c5b35

20 files changed

+143
-70
lines changed

templates/terraform/iam_policy.go.erb

+16-2
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,14 @@ func <%= resource_name -%>IdParseFunc(d *schema.ResourceData, config *Config) er
115115
func (u *<%= resource_name -%>IamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
116116
url := u.qualify<%= object.name -%>Url("getIamPolicy")
117117

118-
policy, err := sendRequest(u.Config, "GET", url, nil)
118+
<% if resource_params.include?('project') -%>
119+
project, err := getProject(u.d, u.Config)
120+
if err != nil {
121+
return nil, err
122+
}
123+
<% end -%>
124+
125+
policy, err := sendRequest(u.Config, "GET", <% if resource_params.include?('project') %>project<% else %>""<% end %>, url, nil)
119126
if err != nil {
120127
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
121128
}
@@ -140,7 +147,14 @@ func (u *<%= resource_name -%>IamUpdater) SetResourceIamPolicy(policy *cloudreso
140147

141148
url := u.qualify<%= object.name -%>Url("setIamPolicy")
142149

143-
_, err = sendRequestWithTimeout(u.Config, "POST", url, obj, u.d.Timeout(schema.TimeoutCreate))
150+
<% if resource_params.include?('project') -%>
151+
project, err := getProject(u.d, u.Config)
152+
if err != nil {
153+
return err
154+
}
155+
<% end -%>
156+
157+
_, err = sendRequestWithTimeout(u.Config, "POST", <% if resource_params.include?('project') %>project<% else %>""<% end %>, url, obj, u.d.Timeout(schema.TimeoutCreate))
144158
if err != nil {
145159
return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
146160
}

templates/terraform/operation.go.erb

+7-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import (
1111

1212
type <%= product_name -%>OperationWaiter struct {
1313
Config *Config
14+
<% if has_project -%>
15+
Project string
16+
<% end -%>
1417
CommonOperationWaiter
1518
}
1619

@@ -20,7 +23,7 @@ func (w *<%= product_name -%>OperationWaiter) QueryOp() (interface{}, error) {
2023
}
2124
// Returns the proper get.
2225
url := fmt.Sprintf("<%= [object.__product.base_url, async.operation.base_url].flatten.join.gsub('{{op_id}}', '%s') -%>", w.CommonOperationWaiter.Op.Name)
23-
return sendRequest(w.Config, "GET", url, nil)
26+
return sendRequest(w.Config, "GET", <% if has_project %>w.Project<% else %>""<% end %>, url, nil)
2427
}
2528

2629
func <%= product_name.camelize(:lower) -%>OperationWaitTime(config *Config, op map[string]interface{},<% if has_project -%> project,<% end -%> activity string, timeoutMinutes int) error {
@@ -30,6 +33,9 @@ func <%= product_name.camelize(:lower) -%>OperationWaitTime(config *Config, op m
3033
}
3134
w := &<%= product_name -%>OperationWaiter{
3235
Config: config,
36+
<% if has_project -%>
37+
Project: project,
38+
<% end -%>
3339
}
3440
if err := w.CommonOperationWaiter.SetOp(op); err != nil {
3541
return err

templates/terraform/post_create/labels.erb

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ if v, ok := d.GetOkExists("labels"); !isEmptyValue(reflect.ValueOf(v)) && (ok ||
2020
if err != nil {
2121
return err
2222
}
23-
res, err = sendRequest(config, "POST", url, obj)
23+
res, err = sendRequest(config, "POST", project, url, obj)
2424
if err != nil {
2525
return fmt.Errorf("Error adding labels to <%= resource_name -%> %q: %s", d.Id(), err)
2626
}

templates/terraform/pre_delete/detach_disk.erb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
readRes, err := sendRequest(config, "GET", url, nil)
1+
readRes, err := sendRequest(config, "GET", project, url, nil)
22
if err != nil {
33
return handleNotFoundError(err, d, fmt.Sprintf("ComputeDisk %q", d.Id()))
44
}

templates/terraform/pre_delete/detach_network.erb

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ if d.Get("networks.#").(int) > 0 {
88
return err
99
}
1010

11-
_, err = sendRequestWithTimeout(config, "PATCH", url, patched, d.Timeout(schema.TimeoutUpdate))
11+
_, err = sendRequestWithTimeout(config, "PATCH", project, url, patched, d.Timeout(schema.TimeoutUpdate))
1212
if err != nil {
1313
return fmt.Errorf("Error updating Policy %q: %s", d.Id(), err)
1414
}

templates/terraform/resource.erb

+34-35
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,13 @@ func resource<%= resource_name -%>Create(d *schema.ResourceData, meta interface{
160160
}
161161

162162
log.Printf("[DEBUG] Creating new <%= object.name -%>: %#v", obj)
163-
res, err := sendRequestWithTimeout(config, "<%= object.create_verb.to_s.upcase -%>", url, obj, d.Timeout(schema.TimeoutCreate))
163+
<% if has_project -%>
164+
project, err := getProject(d, config)
165+
if err != nil {
166+
return err
167+
}
168+
<% end -%>
169+
res, err := sendRequestWithTimeout(config, "<%= object.create_verb.to_s.upcase -%>", <% if has_project %>project<% else %>""<% end %>, url, obj, d.Timeout(schema.TimeoutCreate))
164170
if err != nil {
165171
return fmt.Errorf("Error creating <%= object.name -%>: %s", err)
166172
}
@@ -173,12 +179,6 @@ func resource<%= resource_name -%>Create(d *schema.ResourceData, meta interface{
173179
d.SetId(id)
174180

175181
<% if !object.async.nil? && object.async.allow?('create') -%>
176-
<% if has_project -%>
177-
project, err := getProject(d, config)
178-
if err != nil {
179-
return err
180-
}
181-
<% end -%>
182182
<% if object.autogen_async -%>
183183
waitErr := <%= client_name_camel -%>OperationWaitTime(
184184
config, res,<% if has_project -%> project, <% end -%> "Creating <%= object.name -%>",
@@ -217,7 +217,13 @@ func resource<%= resource_name -%>Read(d *schema.ResourceData, meta interface{})
217217
return err
218218
}
219219

220-
res, err := sendRequest(config, "<%= object.read_verb.to_s.upcase -%>", url, nil)
220+
<% if has_project -%>
221+
project, err := getProject(d, config)
222+
if err != nil {
223+
return err
224+
}
225+
<% end -%>
226+
res, err := sendRequest(config, "<%= object.read_verb.to_s.upcase -%>", <% if has_project %>project<% else %>""<% end %>, url, nil)
221227
if err != nil {
222228
return handleNotFoundError(err, d, fmt.Sprintf("<%= resource_name -%> %q", d.Id()))
223229
}
@@ -251,10 +257,6 @@ res, err := sendRequest(config, "<%= object.read_verb.to_s.upcase -%>", url, nil
251257
<% end -%>
252258

253259
<% if has_project -%>
254-
project, err := getProject(d, config)
255-
if err != nil {
256-
return err
257-
}
258260
if err := d.Set("project", project); err != nil {
259261
return fmt.Errorf("Error reading <%= object.name -%>: %s", err)
260262
}
@@ -301,6 +303,13 @@ res, err := sendRequest(config, "<%= object.read_verb.to_s.upcase -%>", url, nil
301303
func resource<%= resource_name -%>Update(d *schema.ResourceData, meta interface{}) error {
302304
config := meta.(*Config)
303305

306+
<% if has_project -%>
307+
project, err := getProject(d, config)
308+
if err != nil {
309+
return err
310+
}
311+
<% end -%>
312+
304313
<% if object.input -%>
305314
d.Partial(true)
306315

@@ -352,21 +361,15 @@ if <%= props.map { |prop| "d.HasChange(\"#{prop.name.underscore}\")" }.join ' ||
352361
return err
353362
}
354363
<% if object.async.nil? -%>
355-
_, err = sendRequestWithTimeout(config, "<%= key[:update_verb] -%>", url, obj, d.Timeout(schema.TimeoutUpdate))
364+
_, err = sendRequestWithTimeout(config, "<%= key[:update_verb] -%>", <% if has_project %>project<% else %>""<% end %>, url, obj, d.Timeout(schema.TimeoutUpdate))
356365
<% else -%>
357-
res, err := sendRequestWithTimeout(config, "<%= key[:update_verb] -%>", url, obj, d.Timeout(schema.TimeoutUpdate))
366+
res, err := sendRequestWithTimeout(config, "<%= key[:update_verb] -%>", <% if has_project %>project<% else %>""<% end %>, url, obj, d.Timeout(schema.TimeoutUpdate))
358367
<% end -%>
359368
if err != nil {
360369
return fmt.Errorf("Error updating <%= object.name -%> %q: %s", d.Id(), err)
361370
}
362371

363372
<% if !object.async.nil? && object.async.allow?('update') -%>
364-
<% if has_project -%>
365-
project, err := getProject(d, config)
366-
if err != nil {
367-
return err
368-
}
369-
<% end -%>
370373
<% if object.autogen_async -%>
371374

372375
err = <%= client_name_camel -%>OperationWaitTime(
@@ -446,22 +449,16 @@ if <%= props.map { |prop| "d.HasChange(\"#{prop.name.underscore}\")" }.join ' ||
446449
<%= lines(compile('templates/terraform/update_mask.erb')) if object.update_mask -%>
447450
<%= lines(compile(object.custom_code.pre_update)) if object.custom_code.pre_update -%>
448451
<% if object.async.nil? -%>
449-
_, err = sendRequestWithTimeout(config, "<%= object.update_verb -%>", url, obj, d.Timeout(schema.TimeoutUpdate))
452+
_, err = sendRequestWithTimeout(config, "<%= object.update_verb -%>", <% if has_project %>project<% else %>""<% end %>, url, obj, d.Timeout(schema.TimeoutUpdate))
450453
<% else -%>
451-
res, err := sendRequestWithTimeout(config, "<%= object.update_verb -%>", url, obj, d.Timeout(schema.TimeoutUpdate))
454+
res, err := sendRequestWithTimeout(config, "<%= object.update_verb -%>", <% if has_project %>project<% else %>""<% end %>, url, obj, d.Timeout(schema.TimeoutUpdate))
452455
<% end -%>
453456

454457
if err != nil {
455458
return fmt.Errorf("Error updating <%= object.name -%> %q: %s", d.Id(), err)
456459
}
457460

458461
<% if !object.async.nil? && object.async.allow?('update') -%>
459-
<% if has_project -%>
460-
project, err := getProject(d, config)
461-
if err != nil {
462-
return err
463-
}
464-
<% end -%>
465462
<% if object.autogen_async && object.async.allow?('update') -%>
466463

467464
err = <%= client_name_camel -%>OperationWaitTime(
@@ -496,6 +493,13 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{
496493
<% else -%>
497494
config := meta.(*Config)
498495

496+
<% if has_project -%>
497+
project, err := getProject(d, config)
498+
if err != nil {
499+
return err
500+
}
501+
<% end -%>
502+
499503
<% if object.mutex -%>
500504
lockName, err := replaceVars(d, config, "<%= object.mutex -%>")
501505
if err != nil {
@@ -514,18 +518,13 @@ func resource<%= resource_name -%>Delete(d *schema.ResourceData, meta interface{
514518
var obj map[string]interface{}
515519
<%= lines(compile(object.custom_code.pre_delete)) if object.custom_code.pre_delete -%>
516520
log.Printf("[DEBUG] Deleting <%= object.name -%> %q", d.Id())
517-
res, err := sendRequestWithTimeout(config, "<%= object.delete_verb.to_s.upcase -%>", url, obj, d.Timeout(schema.TimeoutDelete))
521+
522+
res, err := sendRequestWithTimeout(config, "<%= object.delete_verb.to_s.upcase -%>", <% if has_project %>project<% else %>""<% end %>, url, obj, d.Timeout(schema.TimeoutDelete))
518523
if err != nil {
519524
return handleNotFoundError(err, d, "<%= object.name -%>")
520525
}
521526

522527
<% if !object.async.nil? && object.async.allow?('delete') -%>
523-
<% if has_project -%>
524-
project, err := getProject(d, config)
525-
if err != nil {
526-
return err
527-
}
528-
<% end -%>
529528
<% if object.autogen_async && object.async.allow?('delete') -%>
530529

531530
err = <%= client_name_camel -%>OperationWaitTime(

templates/terraform/resource.html.markdown.erb

+6
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,9 @@ $ terraform import <% if object.min_version.name == 'beta' %>-provider=google-be
174174
175175
-> If you're importing a resource with beta features, make sure to include `-provider=google-beta`
176176
as an argument so that Terraform uses the correct provider to import your resource.
177+
178+
<% if object.base_url.include?("{{project}}")-%>
179+
## User Project Overrides
180+
181+
This resource supports [User Project Overrides](https://www.terraform.io/docs/providers/google/provider_reference.html#user_project_override).
182+
<% end -%>

templates/terraform/resource_iam.html.markdown.erb

+6
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,9 @@ $ terraform import <%= terraform_name -%>_member.editor "<%= object.id_format.gs
156156

157157
-> If you're importing a resource with beta features, make sure to include `-provider=google-beta`
158158
as an argument so that Terraform uses the correct provider to import your resource.
159+
160+
<% if object.base_url.include?("{{project}}")-%>
161+
## User Project Overrides
162+
163+
This resource supports [User Project Overrides](https://www.terraform.io/docs/providers/google/provider_reference.html#user_project_override).
164+
<% end -%>

third_party/terraform/data_sources/data_source_google_client_openid_userinfo.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func dataSourceGoogleClientOpenIDUserinfoRead(d *schema.ResourceData, meta inter
2424

2525
// See https://github.com/golang/oauth2/issues/306 for a recommendation to do this from a Go maintainer
2626
// URL retrieved from https://accounts.google.com/.well-known/openid-configuration
27-
res, err := sendRequest(config, "GET", "https://openidconnect.googleapis.com/v1/userinfo", nil)
27+
res, err := sendRequest(config, "GET", "", "https://openidconnect.googleapis.com/v1/userinfo", nil)
2828
if err != nil {
2929
return fmt.Errorf("error retrieving userinfo for your provider credentials; have you enabled the 'https://www.googleapis.com/auth/userinfo.email' scope? error: %s", err)
3030
}

third_party/terraform/data_sources/data_source_google_composer_image_versions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func dataSourceGoogleComposerImageVersionsRead(d *schema.ResourceData, meta inte
6161
return err
6262
}
6363

64-
versions, err := paginatedListRequest(url, config, flattenGoogleComposerImageVersions)
64+
versions, err := paginatedListRequest(project, url, config, flattenGoogleComposerImageVersions)
6565
if err != nil {
6666
return fmt.Errorf("Error listing Composer image versions: %s", err)
6767
}

third_party/terraform/data_sources/data_source_google_kms_crypto_key_version.go

+8-3
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,12 @@ func dataSourceGoogleKmsCryptoKeyVersionRead(d *schema.ResourceData, meta interf
6565
}
6666

6767
log.Printf("[DEBUG] Getting attributes for CryptoKeyVersion: %#v", url)
68-
res, err := sendRequest(config, "GET", url, nil)
68+
69+
cryptoKeyId, err := parseKmsCryptoKeyId(d.Get("crypto_key").(string), config)
70+
if err != nil {
71+
return err
72+
}
73+
res, err := sendRequest(config, "GET", cryptoKeyId.KeyRingId.Project, url, nil)
6974
if err != nil {
7075
return handleNotFoundError(err, d, fmt.Sprintf("KmsCryptoKeyVersion %q", d.Id()))
7176
}
@@ -89,7 +94,7 @@ func dataSourceGoogleKmsCryptoKeyVersionRead(d *schema.ResourceData, meta interf
8994
}
9095

9196
log.Printf("[DEBUG] Getting purpose of CryptoKey: %#v", url)
92-
res, err = sendRequest(config, "GET", url, nil)
97+
res, err = sendRequest(config, "GET", cryptoKeyId.KeyRingId.Project, url, nil)
9398
if err != nil {
9499
return handleNotFoundError(err, d, fmt.Sprintf("KmsCryptoKey %q", d.Id()))
95100
}
@@ -100,7 +105,7 @@ func dataSourceGoogleKmsCryptoKeyVersionRead(d *schema.ResourceData, meta interf
100105
return err
101106
}
102107
log.Printf("[DEBUG] Getting public key of CryptoKeyVersion: %#v", url)
103-
res, _ = sendRequest(config, "GET", url, nil)
108+
res, _ = sendRequest(config, "GET", cryptoKeyId.KeyRingId.Project, url, nil)
104109

105110
if err := d.Set("public_key", flattenKmsCryptoKeyVersionPublicKey(res, d)); err != nil {
106111
return fmt.Errorf("Error reading CryptoKeyVersion public key: %s", err)

third_party/terraform/data_sources/data_source_google_projects.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package google
22

33
import (
44
"fmt"
5+
56
"github.com/hashicorp/terraform/helper/schema"
67
)
78

@@ -44,7 +45,7 @@ func datasourceGoogleProjectsRead(d *schema.ResourceData, meta interface{}) erro
4445
return err
4546
}
4647

47-
res, err := sendRequest(config, "GET", url, nil)
48+
res, err := sendRequest(config, "GET", "", url, nil)
4849
if err != nil {
4950
return fmt.Errorf("Error retrieving projects: %s", err)
5051
}

third_party/terraform/data_sources/data_source_google_storage_bucket_object.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func dataSourceGoogleStorageBucketObjectRead(d *schema.ResourceData, meta interf
3535
// Using REST apis because the storage go client doesn't support folders
3636
url := fmt.Sprintf("https://www.googleapis.com/storage/v1/b/%s/o/%s", bucket, name)
3737

38-
res, err := sendRequest(config, "GET", url, nil)
38+
res, err := sendRequest(config, "GET", "", url, nil)
3939
if err != nil {
4040
return fmt.Errorf("Error retrieving storage bucket object: %s", err)
4141
}

third_party/terraform/data_sources/data_source_tpu_tensorflow_versions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func dataSourceTpuTensorFlowVersionsRead(d *schema.ResourceData, meta interface{
5050
return err
5151
}
5252

53-
versionsRaw, err := paginatedListRequest(url, config, flattenTpuTensorflowVersions)
53+
versionsRaw, err := paginatedListRequest(project, url, config, flattenTpuTensorflowVersions)
5454
if err != nil {
5555
return fmt.Errorf("Error listing TPU Tensorflow versions: %s", err)
5656
}

third_party/terraform/resources/resource_service_networking_connection.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,16 @@ func resourceServiceNetworkingConnectionDelete(d *schema.ResourceData, meta inte
177177
obj["name"] = peering
178178
url := fmt.Sprintf("%s%s/removePeering", config.ComputeBasePath, serviceNetworkingNetworkName)
179179

180-
res, err := sendRequestWithTimeout(config, "POST", url, obj, d.Timeout(schema.TimeoutUpdate))
180+
project, err := getProject(d, config)
181181
if err != nil {
182-
return handleNotFoundError(err, d, fmt.Sprintf("ServiceNetworkingConnection %q", d.Id()))
182+
return err
183183
}
184184

185-
project, err := getProject(d, config)
185+
res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutUpdate))
186186
if err != nil {
187-
return err
187+
return handleNotFoundError(err, d, fmt.Sprintf("ServiceNetworkingConnection %q", d.Id()))
188188
}
189+
189190
op := &compute.Operation{}
190191
err = Convert(res, op)
191192
if err != nil {

third_party/terraform/utils/config.go.erb

+8-7
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,14 @@ import (
6161
// Config is the configuration structure used to instantiate the Google
6262
// provider.
6363
type Config struct {
64-
Credentials string
65-
AccessToken string
66-
Project string
67-
Region string
68-
Zone string
69-
Scopes []string
70-
BatchingConfig *batchingConfig
64+
Credentials string
65+
AccessToken string
66+
Project string
67+
Region string
68+
Zone string
69+
Scopes []string
70+
BatchingConfig *batchingConfig
71+
UserProjectOverride bool
7172

7273
client *http.Client
7374
userAgent string

0 commit comments

Comments
 (0)