Skip to content

Commit 193f796

Browse files
hemantadilgoogle-labs-jules[bot]zli82016
authored
Add google_logging_folder_sink to TGC tfplan2cai converter (#15553)
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: Zhenhua Li <[email protected]>
1 parent 90858aa commit 193f796

File tree

5 files changed

+298
-0
lines changed

5 files changed

+298
-0
lines changed

mmv1/provider/terraform_tgc.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ func (tgc TerraformGoogleConversion) CopyCommonFiles(outputFolder string, genera
435435
"converters/google/resources/services/logging/logging_billing_account_bucket_config.go": "third_party/tgc/services/logging/logging_billing_account_bucket_config.go",
436436
"converters/google/resources/services/appengine/appengine_standard_version.go": "third_party/tgc/services/appengine/appengine_standard_version.go",
437437
"converters/google/resources/services/logging/logging_project_sink.go": "third_party/tgc/services/logging/logging_project_sink.go",
438+
"converters/google/resources/services/logging/logging_folder_sink.go": "third_party/tgc/services/logging/logging_folder_sink.go",
438439
"converters/google/resources/services/logging/logging_organization_sink.go": "third_party/tgc/services/logging/logging_organization_sink.go",
439440
}
440441
tgc.CopyFileList(outputFolder, resourceConverters)

mmv1/third_party/tgc/resource_converters.go.tmpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ func ResourceConverters() map[string][]cai.ResourceConverter {
194194
"google_logging_project_bucket_config": {logging.ResourceConverterLogProjectBucket()},
195195
"google_logging_billing_account_bucket_config": {logging.ResourceConverterLogBillingAccountBucket()},
196196
"google_logging_project_sink": {logging.ResourceConverterLogProjectSink()},
197+
"google_logging_folder_sink": {logging.ResourceConverterLogFolderSink()},
197198
"google_logging_organization_sink": {logging.ResourceConverterLogOrganizationSink()},
198199
"google_cloud_tasks_queue": {cloudtasks.ResourceConverterCloudTasksQueue()},
199200
"google_pubsub_topic": {pubsub.ResourceConverterPubsubTopic()},
Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
package logging
2+
3+
import (
4+
"reflect"
5+
6+
"github.com/GoogleCloudPlatform/terraform-google-conversion/v7/tfplan2cai/converters/google/resources/cai"
7+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
8+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
9+
)
10+
11+
const LogSinkAssetType string = "logging.googleapis.com/LogSink"
12+
13+
func ResourceConverterLogFolderSink() cai.ResourceConverter {
14+
return cai.ResourceConverter{
15+
AssetType: LogSinkAssetType,
16+
Convert: GetLogFolderSinkCaiObject,
17+
}
18+
}
19+
20+
func GetLogFolderSinkCaiObject(d tpgresource.TerraformResourceData, config *transport_tpg.Config) ([]cai.Asset, error) {
21+
name, err := cai.AssetName(d, config, "//logging.googleapis.com/folders/{{folder}}/sinks/{{name}}")
22+
if err != nil {
23+
return []cai.Asset{}, err
24+
}
25+
if obj, err := GetLogFolderSinkApiObject(d, config); err == nil {
26+
return []cai.Asset{{
27+
Name: name,
28+
Type: LogSinkAssetType,
29+
Resource: &cai.AssetResource{
30+
Version: "v2",
31+
DiscoveryDocumentURI: "https://logging.googleapis.com/$discovery/rest",
32+
DiscoveryName: "LogSink",
33+
Data: obj,
34+
},
35+
}}, nil
36+
} else {
37+
return []cai.Asset{}, err
38+
}
39+
}
40+
41+
func GetLogFolderSinkApiObject(d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]interface{}, error) {
42+
obj := make(map[string]interface{})
43+
nameProp, err := expandLogFolderSinkName(d.Get("name"), d, config)
44+
if err != nil {
45+
return nil, err
46+
} else if v, ok := d.GetOkExists("name"); !tpgresource.IsEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) {
47+
obj["name"] = nameProp
48+
}
49+
50+
destinationProp, err := expandLogFolderSinkDestination(d.Get("destination"), d, config)
51+
if err != nil {
52+
return nil, err
53+
} else if v, ok := d.GetOkExists("destination"); !tpgresource.IsEmptyValue(reflect.ValueOf(destinationProp)) && (ok || !reflect.DeepEqual(v, destinationProp)) {
54+
obj["destination"] = destinationProp
55+
}
56+
57+
filterProp, err := expandLogFolderSinkFilter(d.Get("filter"), d, config)
58+
if err != nil {
59+
return nil, err
60+
} else if v, ok := d.GetOkExists("filter"); !tpgresource.IsEmptyValue(reflect.ValueOf(filterProp)) && (ok || !reflect.DeepEqual(v, filterProp)) {
61+
obj["filter"] = filterProp
62+
}
63+
64+
descriptionProp, err := expandLogFolderSinkDescription(d.Get("description"), d, config)
65+
if err != nil {
66+
return nil, err
67+
} else if v, ok := d.GetOkExists("description"); !tpgresource.IsEmptyValue(reflect.ValueOf(descriptionProp)) && (ok || !reflect.DeepEqual(v, descriptionProp)) {
68+
obj["description"] = descriptionProp
69+
}
70+
71+
disabledProp, err := expandLogFolderSinkDisabled(d.Get("disabled"), d, config)
72+
if err != nil {
73+
return nil, err
74+
} else if v, ok := d.GetOkExists("disabled"); !tpgresource.IsEmptyValue(reflect.ValueOf(disabledProp)) && (ok || !reflect.DeepEqual(v, disabledProp)) {
75+
obj["disabled"] = disabledProp
76+
}
77+
78+
exclusionsProp, err := expandLogFolderSinkExclusions(d.Get("exclusions"), d, config)
79+
if err != nil {
80+
return nil, err
81+
} else if v, ok := d.GetOkExists("exclusions"); !tpgresource.IsEmptyValue(reflect.ValueOf(exclusionsProp)) && (ok || !reflect.DeepEqual(v, exclusionsProp)) {
82+
obj["exclusions"] = exclusionsProp
83+
}
84+
85+
includeChildrenProp, err := expandLogFolderSinkIncludeChildren(d.Get("include_children"), d, config)
86+
if err != nil {
87+
return nil, err
88+
} else if v, ok := d.GetOkExists("include_children"); !tpgresource.IsEmptyValue(reflect.ValueOf(includeChildrenProp)) && (ok || !reflect.DeepEqual(v, includeChildrenProp)) {
89+
obj["includeChildren"] = includeChildrenProp
90+
}
91+
92+
bigqueryOptionsProp, err := expandLogFolderSinkBigqueryOptions(d.Get("bigquery_options"), d, config)
93+
if err != nil {
94+
return nil, err
95+
} else if v, ok := d.GetOkExists("bigquery_options"); !tpgresource.IsEmptyValue(reflect.ValueOf(bigqueryOptionsProp)) && (ok || !reflect.DeepEqual(v, bigqueryOptionsProp)) {
96+
obj["bigqueryOptions"] = bigqueryOptionsProp
97+
}
98+
99+
return obj, nil
100+
}
101+
102+
func expandLogFolderSinkName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
103+
return v, nil
104+
}
105+
106+
func expandLogFolderSinkDestination(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
107+
return v, nil
108+
}
109+
110+
func expandLogFolderSinkFilter(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
111+
return v, nil
112+
}
113+
114+
func expandLogFolderSinkDescription(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
115+
return v, nil
116+
}
117+
118+
func expandLogFolderSinkDisabled(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
119+
return v, nil
120+
}
121+
122+
func expandLogFolderSinkExclusions(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
123+
l, ok := v.([]interface{})
124+
if !ok {
125+
return nil, nil
126+
}
127+
128+
req := make([]interface{}, 0, len(l))
129+
for _, raw := range l {
130+
if raw == nil {
131+
continue
132+
}
133+
original := raw.(map[string]interface{})
134+
transformed := make(map[string]interface{})
135+
136+
transformedName, err := expandLogFolderSinkExclusionsName(original["name"], d, config)
137+
if err != nil {
138+
return nil, err
139+
} else if val := reflect.ValueOf(transformedName); val.IsValid() && !tpgresource.IsEmptyValue(val) {
140+
transformed["name"] = transformedName
141+
}
142+
143+
transformedDescription, err := expandLogFolderSinkExclusionsDescription(original["description"], d, config)
144+
if err != nil {
145+
return nil, err
146+
} else if val := reflect.ValueOf(transformedDescription); val.IsValid() && !tpgresource.IsEmptyValue(val) {
147+
transformed["description"] = transformedDescription
148+
}
149+
150+
transformedFilter, err := expandLogFolderSinkExclusionsFilter(original["filter"], d, config)
151+
if err != nil {
152+
return nil, err
153+
} else if val := reflect.ValueOf(transformedFilter); val.IsValid() && !tpgresource.IsEmptyValue(val) {
154+
transformed["filter"] = transformedFilter
155+
}
156+
157+
transformedDisabled, err := expandLogFolderSinkExclusionsDisabled(original["disabled"], d, config)
158+
if err != nil {
159+
return nil, err
160+
} else if val := reflect.ValueOf(transformedDisabled); val.IsValid() && !tpgresource.IsEmptyValue(val) {
161+
transformed["disabled"] = transformedDisabled
162+
}
163+
164+
req = append(req, transformed)
165+
}
166+
return req, nil
167+
}
168+
169+
func expandLogFolderSinkExclusionsName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
170+
return v, nil
171+
}
172+
173+
func expandLogFolderSinkExclusionsDescription(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
174+
return v, nil
175+
}
176+
177+
func expandLogFolderSinkExclusionsFilter(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
178+
return v, nil
179+
}
180+
181+
func expandLogFolderSinkExclusionsDisabled(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
182+
return v, nil
183+
}
184+
185+
func expandLogFolderSinkIncludeChildren(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
186+
return v, nil
187+
}
188+
189+
func expandLogFolderSinkBigqueryOptions(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
190+
l := v.([]interface{})
191+
if len(l) == 0 || l[0] == nil {
192+
return nil, nil
193+
}
194+
raw := l[0]
195+
original := raw.(map[string]interface{})
196+
transformed := make(map[string]interface{})
197+
198+
transformedUsePartitionedTables, err := expandLogFolderSinkBigqueryOptionsUsePartitionedTables(original["use_partitioned_tables"], d, config)
199+
if err != nil {
200+
return nil, err
201+
} else if val := reflect.ValueOf(transformedUsePartitionedTables); val.IsValid() && !tpgresource.IsEmptyValue(val) {
202+
transformed["usePartitionedTables"] = transformedUsePartitionedTables
203+
}
204+
205+
return transformed, nil
206+
}
207+
208+
func expandLogFolderSinkBigqueryOptionsUsePartitionedTables(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
209+
return v, nil
210+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
[{
2+
"name": "//logging.googleapis.com/folders/{{.FolderID}}/sinks/tf-test-sink",
3+
"asset_type": "logging.googleapis.com/LogSink",
4+
"ancestry_path": "{{.Ancestry}}",
5+
"resource": {
6+
"version": "v2",
7+
"discovery_document_uri": "https://logging.googleapis.com/$discovery/rest",
8+
"discovery_name": "LogSink",
9+
"parent": "//cloudresourcemanager.googleapis.com/folders/{{.FolderID}}",
10+
"data": {
11+
"name": "tf-test-sink",
12+
"destination": "storage.googleapis.com/tf-test-bucket-{{.Project.Number}}",
13+
"filter": "severity >= ERROR",
14+
"includeChildren": true,
15+
"exclusions": [{
16+
"name": "exclude-gce-activity",
17+
"description": "Exclude GCE activity logs.",
18+
"filter": "logName:\"logs/compute.googleapis.com%2Factivity_log\""
19+
}],
20+
"bigqueryOptions": {
21+
"usePartitionedTables": true
22+
}
23+
}
24+
}
25+
},
26+
{
27+
"name": "//storage.googleapis.com/tf-test-bucket-{{.Project.Number}}",
28+
"asset_type": "storage.googleapis.com/Bucket",
29+
"ancestry_path": "{{.Ancestry}}/project/{{.Provider.project}}",
30+
"resource": {
31+
"version": "v2",
32+
"discovery_document_uri": "https://www.googleapis.com/discovery/v1/apis/storage/v1/rest",
33+
"discovery_name": "Bucket",
34+
"parent": "//cloudresourcemanager.googleapis.com/projects/{{.Provider.project}}",
35+
"data": {
36+
"iamConfiguration": {
37+
"uniformBucketLevelAccess": {
38+
"enabled": false
39+
}
40+
},
41+
"lifecycle": {
42+
"rule": []
43+
},
44+
"location": "US",
45+
"name": "tf-test-bucket-{{.Project.Number}}",
46+
"project": "{{.Provider.project}}",
47+
"storageClass": "STANDARD"
48+
}
49+
}
50+
}]
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
terraform {
2+
required_providers {
3+
google = {
4+
source = "hashicorp/google"
5+
version = ">= 4.54.0"
6+
}
7+
}
8+
}
9+
10+
provider "google" {
11+
project = "{{.Provider.project}}"
12+
}
13+
14+
resource "google_storage_bucket" "test_bucket" {
15+
name = "tf-test-bucket-{{.Project.Number}}"
16+
location = "US"
17+
project = "{{.Provider.project}}"
18+
}
19+
20+
resource "google_logging_folder_sink" "test_sink" {
21+
name = "tf-test-sink"
22+
folder = "folders/{{.FolderID}}"
23+
destination = "storage.googleapis.com/${google_storage_bucket.test_bucket.name}"
24+
filter = "severity >= ERROR"
25+
include_children = true
26+
27+
exclusions {
28+
name = "exclude-gce-activity"
29+
description = "Exclude GCE activity logs."
30+
filter = "logName:\"logs/compute.googleapis.com%2Factivity_log\""
31+
}
32+
33+
bigquery_options {
34+
use_partitioned_tables = true
35+
}
36+
}

0 commit comments

Comments
 (0)