Skip to content

Commit af09665

Browse files
Add resources for Cloud Logging default settings (#9409) (#16800)
* Add folder and organization setting resources * Try GetTestOrgTargetFromEnv instead of GetTestOrgFromEnv. * Use correct organization for testing. * Remove key rotation to fix VCR test. * Don't specify fields matching default values. * Specify true instead of yes. * Use BootstrapKMSKeyInLocation instead of creating new keys. * Add missing quotes * Add additional examples to generate additional tests. * Remove unneeded resources from examples. * Simplify tests to be one full resource creation and one update. * Fix typo in test * Document and cleanup example. [upstream:5e89b3b459087978b89d3405bd4821d9af1436f3] Signed-off-by: Modular Magician <[email protected]>
1 parent 311cf8b commit af09665

9 files changed

+1187
-2
lines changed

.changelog/9409.txt

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

google/provider/provider_mmv1_resources.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -373,9 +373,9 @@ var handwrittenIAMDatasources = map[string]*schema.Resource{
373373
}
374374

375375
// Resources
376-
// Generated resources: 350
376+
// Generated resources: 352
377377
// Generated IAM resources: 219
378-
// Total generated resources: 569
378+
// Total generated resources: 571
379379
var generatedResources = map[string]*schema.Resource{
380380
"google_folder_access_approval_settings": accessapproval.ResourceAccessApprovalFolderSettings(),
381381
"google_organization_access_approval_settings": accessapproval.ResourceAccessApprovalOrganizationSettings(),
@@ -789,9 +789,11 @@ var generatedResources = map[string]*schema.Resource{
789789
"google_kms_key_ring": kms.ResourceKMSKeyRing(),
790790
"google_kms_key_ring_import_job": kms.ResourceKMSKeyRingImportJob(),
791791
"google_kms_secret_ciphertext": kms.ResourceKMSSecretCiphertext(),
792+
"google_logging_folder_settings": logging.ResourceLoggingFolderSettings(),
792793
"google_logging_linked_dataset": logging.ResourceLoggingLinkedDataset(),
793794
"google_logging_log_view": logging.ResourceLoggingLogView(),
794795
"google_logging_metric": logging.ResourceLoggingMetric(),
796+
"google_logging_organization_settings": logging.ResourceLoggingOrganizationSettings(),
795797
"google_looker_instance": looker.ResourceLookerInstance(),
796798
"google_memcache_instance": memcache.ResourceMemcacheInstance(),
797799
"google_migration_center_group": migrationcenter.ResourceMigrationCenterGroup(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
// ----------------------------------------------------------------------------
5+
//
6+
// *** AUTO GENERATED CODE *** Type: MMv1 ***
7+
//
8+
// ----------------------------------------------------------------------------
9+
//
10+
// This file is automatically generated by Magic Modules and manual
11+
// changes will be clobbered when the file is regenerated.
12+
//
13+
// Please read more about how to change this file in
14+
// .github/CONTRIBUTING.md.
15+
//
16+
// ----------------------------------------------------------------------------
17+
18+
package logging
19+
20+
import (
21+
"fmt"
22+
"log"
23+
"reflect"
24+
"time"
25+
26+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
27+
28+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
29+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
30+
)
31+
32+
func ResourceLoggingFolderSettings() *schema.Resource {
33+
return &schema.Resource{
34+
Create: resourceLoggingFolderSettingsCreate,
35+
Read: resourceLoggingFolderSettingsRead,
36+
Update: resourceLoggingFolderSettingsUpdate,
37+
Delete: resourceLoggingFolderSettingsDelete,
38+
39+
Importer: &schema.ResourceImporter{
40+
State: resourceLoggingFolderSettingsImport,
41+
},
42+
43+
Timeouts: &schema.ResourceTimeout{
44+
Create: schema.DefaultTimeout(20 * time.Minute),
45+
Update: schema.DefaultTimeout(20 * time.Minute),
46+
Delete: schema.DefaultTimeout(20 * time.Minute),
47+
},
48+
49+
Schema: map[string]*schema.Schema{
50+
"folder": {
51+
Type: schema.TypeString,
52+
Required: true,
53+
ForceNew: true,
54+
Description: `The folder for which to retrieve settings.`,
55+
},
56+
"disable_default_sink": {
57+
Type: schema.TypeBool,
58+
Computed: true,
59+
Optional: true,
60+
Description: `If set to true, the _Default sink in newly created projects and folders will created in a disabled state. This can be used to automatically disable log storage if there is already an aggregated sink configured in the hierarchy. The _Default sink can be re-enabled manually if needed.`,
61+
},
62+
"kms_key_name": {
63+
Type: schema.TypeString,
64+
Computed: true,
65+
Optional: true,
66+
Description: `The resource name for the configured Cloud KMS key.`,
67+
},
68+
"storage_location": {
69+
Type: schema.TypeString,
70+
Computed: true,
71+
Optional: true,
72+
Description: `The storage location that Cloud Logging will use to create new resources when a location is needed but not explicitly provided.`,
73+
},
74+
"kms_service_account_id": {
75+
Type: schema.TypeString,
76+
Computed: true,
77+
Description: `The service account that will be used by the Log Router to access your Cloud KMS key.`,
78+
},
79+
"logging_service_account_id": {
80+
Type: schema.TypeString,
81+
Computed: true,
82+
Description: `The service account for the given container. Sinks use this service account as their writerIdentity if no custom service account is provided.`,
83+
},
84+
"name": {
85+
Type: schema.TypeString,
86+
Computed: true,
87+
Description: `The resource name of the settings.`,
88+
},
89+
},
90+
UseJSONNumber: true,
91+
}
92+
}
93+
94+
func resourceLoggingFolderSettingsCreate(d *schema.ResourceData, meta interface{}) error {
95+
config := meta.(*transport_tpg.Config)
96+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
97+
if err != nil {
98+
return err
99+
}
100+
101+
obj := make(map[string]interface{})
102+
kmsKeyNameProp, err := expandLoggingFolderSettingsKmsKeyName(d.Get("kms_key_name"), d, config)
103+
if err != nil {
104+
return err
105+
} else if v, ok := d.GetOkExists("kms_key_name"); !tpgresource.IsEmptyValue(reflect.ValueOf(kmsKeyNameProp)) && (ok || !reflect.DeepEqual(v, kmsKeyNameProp)) {
106+
obj["kmsKeyName"] = kmsKeyNameProp
107+
}
108+
storageLocationProp, err := expandLoggingFolderSettingsStorageLocation(d.Get("storage_location"), d, config)
109+
if err != nil {
110+
return err
111+
} else if v, ok := d.GetOkExists("storage_location"); !tpgresource.IsEmptyValue(reflect.ValueOf(storageLocationProp)) && (ok || !reflect.DeepEqual(v, storageLocationProp)) {
112+
obj["storageLocation"] = storageLocationProp
113+
}
114+
disableDefaultSinkProp, err := expandLoggingFolderSettingsDisableDefaultSink(d.Get("disable_default_sink"), d, config)
115+
if err != nil {
116+
return err
117+
} else if v, ok := d.GetOkExists("disable_default_sink"); !tpgresource.IsEmptyValue(reflect.ValueOf(disableDefaultSinkProp)) && (ok || !reflect.DeepEqual(v, disableDefaultSinkProp)) {
118+
obj["disableDefaultSink"] = disableDefaultSinkProp
119+
}
120+
121+
url, err := tpgresource.ReplaceVars(d, config, "{{LoggingBasePath}}folders/{{folder}}/settings?updateMask=disableDefaultSink,storageLocation,kmsKeyName")
122+
if err != nil {
123+
return err
124+
}
125+
126+
log.Printf("[DEBUG] Creating new FolderSettings: %#v", obj)
127+
billingProject := ""
128+
129+
// err == nil indicates that the billing_project value was found
130+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
131+
billingProject = bp
132+
}
133+
134+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
135+
Config: config,
136+
Method: "PATCH",
137+
Project: billingProject,
138+
RawURL: url,
139+
UserAgent: userAgent,
140+
Body: obj,
141+
Timeout: d.Timeout(schema.TimeoutCreate),
142+
})
143+
if err != nil {
144+
return fmt.Errorf("Error creating FolderSettings: %s", err)
145+
}
146+
if err := d.Set("name", flattenLoggingFolderSettingsName(res["name"], d, config)); err != nil {
147+
return fmt.Errorf(`Error setting computed identity field "name": %s`, err)
148+
}
149+
150+
// Store the ID now
151+
id, err := tpgresource.ReplaceVars(d, config, "folders/{{folder}}/settings")
152+
if err != nil {
153+
return fmt.Errorf("Error constructing id: %s", err)
154+
}
155+
d.SetId(id)
156+
157+
log.Printf("[DEBUG] Finished creating FolderSettings %q: %#v", d.Id(), res)
158+
159+
return resourceLoggingFolderSettingsRead(d, meta)
160+
}
161+
162+
func resourceLoggingFolderSettingsRead(d *schema.ResourceData, meta interface{}) error {
163+
config := meta.(*transport_tpg.Config)
164+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
165+
if err != nil {
166+
return err
167+
}
168+
169+
url, err := tpgresource.ReplaceVars(d, config, "{{LoggingBasePath}}folders/{{folder}}/settings")
170+
if err != nil {
171+
return err
172+
}
173+
174+
billingProject := ""
175+
176+
// err == nil indicates that the billing_project value was found
177+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
178+
billingProject = bp
179+
}
180+
181+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
182+
Config: config,
183+
Method: "GET",
184+
Project: billingProject,
185+
RawURL: url,
186+
UserAgent: userAgent,
187+
})
188+
if err != nil {
189+
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("LoggingFolderSettings %q", d.Id()))
190+
}
191+
192+
if err := d.Set("name", flattenLoggingFolderSettingsName(res["name"], d, config)); err != nil {
193+
return fmt.Errorf("Error reading FolderSettings: %s", err)
194+
}
195+
if err := d.Set("kms_key_name", flattenLoggingFolderSettingsKmsKeyName(res["kmsKeyName"], d, config)); err != nil {
196+
return fmt.Errorf("Error reading FolderSettings: %s", err)
197+
}
198+
if err := d.Set("kms_service_account_id", flattenLoggingFolderSettingsKmsServiceAccountId(res["kmsServiceAccountId"], d, config)); err != nil {
199+
return fmt.Errorf("Error reading FolderSettings: %s", err)
200+
}
201+
if err := d.Set("storage_location", flattenLoggingFolderSettingsStorageLocation(res["storageLocation"], d, config)); err != nil {
202+
return fmt.Errorf("Error reading FolderSettings: %s", err)
203+
}
204+
if err := d.Set("disable_default_sink", flattenLoggingFolderSettingsDisableDefaultSink(res["disableDefaultSink"], d, config)); err != nil {
205+
return fmt.Errorf("Error reading FolderSettings: %s", err)
206+
}
207+
if err := d.Set("logging_service_account_id", flattenLoggingFolderSettingsLoggingServiceAccountId(res["loggingServiceAccountId"], d, config)); err != nil {
208+
return fmt.Errorf("Error reading FolderSettings: %s", err)
209+
}
210+
211+
return nil
212+
}
213+
214+
func resourceLoggingFolderSettingsUpdate(d *schema.ResourceData, meta interface{}) error {
215+
config := meta.(*transport_tpg.Config)
216+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
217+
if err != nil {
218+
return err
219+
}
220+
221+
billingProject := ""
222+
223+
obj := make(map[string]interface{})
224+
kmsKeyNameProp, err := expandLoggingFolderSettingsKmsKeyName(d.Get("kms_key_name"), d, config)
225+
if err != nil {
226+
return err
227+
} else if v, ok := d.GetOkExists("kms_key_name"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, kmsKeyNameProp)) {
228+
obj["kmsKeyName"] = kmsKeyNameProp
229+
}
230+
storageLocationProp, err := expandLoggingFolderSettingsStorageLocation(d.Get("storage_location"), d, config)
231+
if err != nil {
232+
return err
233+
} else if v, ok := d.GetOkExists("storage_location"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, storageLocationProp)) {
234+
obj["storageLocation"] = storageLocationProp
235+
}
236+
disableDefaultSinkProp, err := expandLoggingFolderSettingsDisableDefaultSink(d.Get("disable_default_sink"), d, config)
237+
if err != nil {
238+
return err
239+
} else if v, ok := d.GetOkExists("disable_default_sink"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, disableDefaultSinkProp)) {
240+
obj["disableDefaultSink"] = disableDefaultSinkProp
241+
}
242+
243+
url, err := tpgresource.ReplaceVars(d, config, "{{LoggingBasePath}}folders/{{folder}}/settings?updateMask=disableDefaultSink,storageLocation,kmsKeyName")
244+
if err != nil {
245+
return err
246+
}
247+
248+
log.Printf("[DEBUG] Updating FolderSettings %q: %#v", d.Id(), obj)
249+
250+
// err == nil indicates that the billing_project value was found
251+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
252+
billingProject = bp
253+
}
254+
255+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
256+
Config: config,
257+
Method: "PATCH",
258+
Project: billingProject,
259+
RawURL: url,
260+
UserAgent: userAgent,
261+
Body: obj,
262+
Timeout: d.Timeout(schema.TimeoutUpdate),
263+
})
264+
265+
if err != nil {
266+
return fmt.Errorf("Error updating FolderSettings %q: %s", d.Id(), err)
267+
} else {
268+
log.Printf("[DEBUG] Finished updating FolderSettings %q: %#v", d.Id(), res)
269+
}
270+
271+
return resourceLoggingFolderSettingsRead(d, meta)
272+
}
273+
274+
func resourceLoggingFolderSettingsDelete(d *schema.ResourceData, meta interface{}) error {
275+
log.Printf("[WARNING] Logging FolderSettings resources"+
276+
" cannot be deleted from Google Cloud. The resource %s will be removed from Terraform"+
277+
" state, but will still be present on Google Cloud.", d.Id())
278+
d.SetId("")
279+
280+
return nil
281+
}
282+
283+
func resourceLoggingFolderSettingsImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
284+
config := meta.(*transport_tpg.Config)
285+
if err := tpgresource.ParseImportId([]string{
286+
"^folders/(?P<folder>[^/]+)/settings$",
287+
"^(?P<folder>[^/]+)$",
288+
}, d, config); err != nil {
289+
return nil, err
290+
}
291+
292+
// Replace import id for the resource id
293+
id, err := tpgresource.ReplaceVars(d, config, "folders/{{folder}}/settings")
294+
if err != nil {
295+
return nil, fmt.Errorf("Error constructing id: %s", err)
296+
}
297+
d.SetId(id)
298+
299+
return []*schema.ResourceData{d}, nil
300+
}
301+
302+
func flattenLoggingFolderSettingsName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
303+
return v
304+
}
305+
306+
func flattenLoggingFolderSettingsKmsKeyName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
307+
return v
308+
}
309+
310+
func flattenLoggingFolderSettingsKmsServiceAccountId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
311+
return v
312+
}
313+
314+
func flattenLoggingFolderSettingsStorageLocation(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
315+
return v
316+
}
317+
318+
func flattenLoggingFolderSettingsDisableDefaultSink(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
319+
return v
320+
}
321+
322+
func flattenLoggingFolderSettingsLoggingServiceAccountId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
323+
return v
324+
}
325+
326+
func expandLoggingFolderSettingsKmsKeyName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
327+
return v, nil
328+
}
329+
330+
func expandLoggingFolderSettingsStorageLocation(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
331+
return v, nil
332+
}
333+
334+
func expandLoggingFolderSettingsDisableDefaultSink(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
335+
return v, nil
336+
}

0 commit comments

Comments
 (0)