Skip to content

Commit c97795b

Browse files
Add support for GCS managed folders (#10786) (#7620)
[upstream:0836fbe77e64a07242c695326680a72bfe3861af] Signed-off-by: Modular Magician <[email protected]>
1 parent 43409a0 commit c97795b

8 files changed

+1588
-2
lines changed

.changelog/10786.txt

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
```release-note:new-resource
2+
`google_storage_managed_folder`
3+
```
4+
```release-note:new-resource
5+
`google_storage_managed_folder_iam`
6+
```

google-beta/provider/provider_mmv1_resources.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,7 @@ var handwrittenIAMDatasources = map[string]*schema.Resource{
455455
"google_kms_crypto_key_iam_policy": tpgiamresource.DataSourceIamPolicy(kms.IamKmsCryptoKeySchema, kms.NewKmsCryptoKeyIamUpdater),
456456
"google_spanner_instance_iam_policy": tpgiamresource.DataSourceIamPolicy(spanner.IamSpannerInstanceSchema, spanner.NewSpannerInstanceIamUpdater),
457457
"google_spanner_database_iam_policy": tpgiamresource.DataSourceIamPolicy(spanner.IamSpannerDatabaseSchema, spanner.NewSpannerDatabaseIamUpdater),
458+
"google_storage_managed_folder_iam_policy": tpgiamresource.DataSourceIamPolicy(storage.StorageManagedFolderIamSchema, storage.StorageManagedFolderIamUpdaterProducer),
458459
"google_organization_iam_policy": tpgiamresource.DataSourceIamPolicy(resourcemanager.IamOrganizationSchema, resourcemanager.NewOrganizationIamUpdater),
459460
"google_project_iam_policy": tpgiamresource.DataSourceIamPolicy(resourcemanager.IamProjectSchema, resourcemanager.NewProjectIamUpdater),
460461
"google_pubsub_subscription_iam_policy": tpgiamresource.DataSourceIamPolicy(pubsub.IamPubsubSubscriptionSchema, pubsub.NewPubsubSubscriptionIamUpdater),
@@ -463,9 +464,9 @@ var handwrittenIAMDatasources = map[string]*schema.Resource{
463464
}
464465

465466
// Resources
466-
// Generated resources: 485
467+
// Generated resources: 486
467468
// Generated IAM resources: 279
468-
// Total generated resources: 764
469+
// Total generated resources: 765
469470
var generatedResources = map[string]*schema.Resource{
470471
"google_folder_access_approval_settings": accessapproval.ResourceAccessApprovalFolderSettings(),
471472
"google_organization_access_approval_settings": accessapproval.ResourceAccessApprovalOrganizationSettings(),
@@ -1171,6 +1172,7 @@ var generatedResources = map[string]*schema.Resource{
11711172
"google_storage_bucket_access_control": storage.ResourceStorageBucketAccessControl(),
11721173
"google_storage_default_object_access_control": storage.ResourceStorageDefaultObjectAccessControl(),
11731174
"google_storage_hmac_key": storage.ResourceStorageHmacKey(),
1175+
"google_storage_managed_folder": storage.ResourceStorageManagedFolder(),
11741176
"google_storage_object_access_control": storage.ResourceStorageObjectAccessControl(),
11751177
"google_storage_insights_report_config": storageinsights.ResourceStorageInsightsReportConfig(),
11761178
"google_storage_transfer_agent_pool": storagetransfer.ResourceStorageTransferAgentPool(),
@@ -1373,6 +1375,9 @@ var handwrittenIAMResources = map[string]*schema.Resource{
13731375
"google_spanner_database_iam_binding": tpgiamresource.ResourceIamBinding(spanner.IamSpannerDatabaseSchema, spanner.NewSpannerDatabaseIamUpdater, spanner.SpannerDatabaseIdParseFunc),
13741376
"google_spanner_database_iam_member": tpgiamresource.ResourceIamMember(spanner.IamSpannerDatabaseSchema, spanner.NewSpannerDatabaseIamUpdater, spanner.SpannerDatabaseIdParseFunc),
13751377
"google_spanner_database_iam_policy": tpgiamresource.ResourceIamPolicy(spanner.IamSpannerDatabaseSchema, spanner.NewSpannerDatabaseIamUpdater, spanner.SpannerDatabaseIdParseFunc),
1378+
"google_storage_managed_folder_iam_binding": tpgiamresource.ResourceIamBinding(storage.StorageManagedFolderIamSchema, storage.StorageManagedFolderIamUpdaterProducer, storage.StorageManagedFolderIdParseFunc),
1379+
"google_storage_managed_folder_iam_member": tpgiamresource.ResourceIamMember(storage.StorageManagedFolderIamSchema, storage.StorageManagedFolderIamUpdaterProducer, storage.StorageManagedFolderIdParseFunc),
1380+
"google_storage_managed_folder_iam_policy": tpgiamresource.ResourceIamPolicy(storage.StorageManagedFolderIamSchema, storage.StorageManagedFolderIamUpdaterProducer, storage.StorageManagedFolderIdParseFunc),
13761381
"google_organization_iam_binding": tpgiamresource.ResourceIamBinding(resourcemanager.IamOrganizationSchema, resourcemanager.NewOrganizationIamUpdater, resourcemanager.OrgIdParseFunc),
13771382
"google_organization_iam_member": tpgiamresource.ResourceIamMember(resourcemanager.IamOrganizationSchema, resourcemanager.NewOrganizationIamUpdater, resourcemanager.OrgIdParseFunc),
13781383
"google_organization_iam_policy": tpgiamresource.ResourceIamPolicy(resourcemanager.IamOrganizationSchema, resourcemanager.NewOrganizationIamUpdater, resourcemanager.OrgIdParseFunc),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
package storage
4+
5+
import (
6+
"fmt"
7+
"net/url"
8+
9+
"github.com/hashicorp/errwrap"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
"google.golang.org/api/cloudresourcemanager/v1"
12+
13+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgiamresource"
14+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
15+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
16+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/verify"
17+
)
18+
19+
var StorageManagedFolderIamSchema = map[string]*schema.Schema{
20+
"bucket": {
21+
Type: schema.TypeString,
22+
Required: true,
23+
ForceNew: true,
24+
},
25+
"managed_folder": {
26+
Type: schema.TypeString,
27+
Required: true,
28+
ForceNew: true,
29+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
30+
ValidateFunc: verify.ValidateRegexp(`/$`),
31+
},
32+
}
33+
34+
type StorageManagedFolderIamUpdater struct {
35+
bucket string
36+
managedFolder string
37+
d tpgresource.TerraformResourceData
38+
Config *transport_tpg.Config
39+
}
40+
41+
func StorageManagedFolderIamUpdaterProducer(d tpgresource.TerraformResourceData, config *transport_tpg.Config) (tpgiamresource.ResourceIamUpdater, error) {
42+
values := make(map[string]string)
43+
44+
if v, ok := d.GetOk("bucket"); ok {
45+
values["bucket"] = v.(string)
46+
}
47+
48+
if v, ok := d.GetOk("managed_folder"); ok {
49+
values["managed_folder"] = v.(string)
50+
}
51+
52+
u := &StorageManagedFolderIamUpdater{
53+
bucket: values["bucket"],
54+
managedFolder: values["managed_folder"],
55+
d: d,
56+
Config: config,
57+
}
58+
59+
if err := d.Set("bucket", u.bucket); err != nil {
60+
return nil, fmt.Errorf("Error setting bucket: %s", err)
61+
}
62+
if err := d.Set("managed_folder", u.managedFolder); err != nil {
63+
return nil, fmt.Errorf("Error setting managed_folder: %s", err)
64+
}
65+
66+
return u, nil
67+
}
68+
69+
func StorageManagedFolderIdParseFunc(d *schema.ResourceData, config *transport_tpg.Config) error {
70+
values := make(map[string]string)
71+
72+
m, err := tpgresource.GetImportIdQualifiers([]string{"(?P<bucket>[^/]+)/managedFolders/(?P<managed_folder>.+)", "(?P<bucket>[^/]+)/(?P<managed_folder>.+)"}, d, config, d.Id())
73+
if err != nil {
74+
return err
75+
}
76+
77+
for k, v := range m {
78+
values[k] = v
79+
}
80+
81+
u := &StorageManagedFolderIamUpdater{
82+
bucket: values["bucket"],
83+
managedFolder: values["managed_folder"],
84+
d: d,
85+
Config: config,
86+
}
87+
if err := d.Set("bucket", u.bucket); err != nil {
88+
return fmt.Errorf("Error setting bucket: %s", err)
89+
}
90+
if err := d.Set("managed_folder", u.managedFolder); err != nil {
91+
return fmt.Errorf("Error setting managed_folder: %s", err)
92+
}
93+
d.SetId(u.GetResourceId())
94+
return nil
95+
}
96+
97+
func (u *StorageManagedFolderIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
98+
url, err := u.qualifyManagedFolderUrl("iam")
99+
if err != nil {
100+
return nil, err
101+
}
102+
103+
var obj map[string]interface{}
104+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"optionsRequestedPolicyVersion": fmt.Sprintf("%d", tpgiamresource.IamPolicyVersion)})
105+
if err != nil {
106+
return nil, err
107+
}
108+
109+
userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
110+
if err != nil {
111+
return nil, err
112+
}
113+
114+
policy, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
115+
Config: u.Config,
116+
Method: "GET",
117+
RawURL: url,
118+
UserAgent: userAgent,
119+
Body: obj,
120+
})
121+
if err != nil {
122+
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
123+
}
124+
125+
out := &cloudresourcemanager.Policy{}
126+
err = tpgresource.Convert(policy, out)
127+
if err != nil {
128+
return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
129+
}
130+
131+
return out, nil
132+
}
133+
134+
func (u *StorageManagedFolderIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
135+
json, err := tpgresource.ConvertToMap(policy)
136+
if err != nil {
137+
return err
138+
}
139+
140+
obj := json
141+
142+
url, err := u.qualifyManagedFolderUrl("iam")
143+
if err != nil {
144+
return err
145+
}
146+
147+
userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
148+
if err != nil {
149+
return err
150+
}
151+
152+
_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
153+
Config: u.Config,
154+
Method: "PUT",
155+
RawURL: url,
156+
UserAgent: userAgent,
157+
Body: obj,
158+
Timeout: u.d.Timeout(schema.TimeoutCreate),
159+
})
160+
if err != nil {
161+
return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
162+
}
163+
164+
return nil
165+
}
166+
167+
func (u *StorageManagedFolderIamUpdater) qualifyManagedFolderUrl(methodIdentifier string) (string, error) {
168+
urlTemplate := fmt.Sprintf("{{StorageBasePath}}b/%s/managedFolders/%s/%s", u.bucket, url.PathEscape(u.managedFolder), methodIdentifier)
169+
url, err := tpgresource.ReplaceVars(u.d, u.Config, urlTemplate)
170+
if err != nil {
171+
return "", err
172+
}
173+
return url, nil
174+
}
175+
176+
func (u *StorageManagedFolderIamUpdater) GetResourceId() string {
177+
return fmt.Sprintf("b/%s/managedFolders/%s", u.bucket, u.managedFolder)
178+
}
179+
180+
func (u *StorageManagedFolderIamUpdater) GetMutexKey() string {
181+
return fmt.Sprintf("iam-storage-managedfolder-%s", u.GetResourceId())
182+
}
183+
184+
func (u *StorageManagedFolderIamUpdater) DescribeResource() string {
185+
return fmt.Sprintf("storage managedfolder %q", u.GetResourceId())
186+
}

0 commit comments

Comments
 (0)