forked from GoogleCloudPlatform/magic-modules
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresource_logging_project_sink.go
159 lines (133 loc) · 4.71 KB
/
resource_logging_project_sink.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package google
import (
"context"
"errors"
"fmt"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const nonUniqueWriterAccount = "serviceAccount:[email protected]"
func resourceLoggingProjectSink() *schema.Resource {
schm := &schema.Resource{
Create: resourceLoggingProjectSinkCreate,
Read: resourceLoggingProjectSinkRead,
Delete: resourceLoggingProjectSinkDelete,
Update: resourceLoggingProjectSinkUpdate,
Schema: resourceLoggingSinkSchema(),
CustomizeDiff: resourceLoggingProjectSinkCustomizeDiff,
Importer: &schema.ResourceImporter{
State: resourceLoggingSinkImportState("project"),
},
UseJSONNumber: true,
}
schm.Schema["project"] = &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
Description: `The ID of the project to create the sink in. If omitted, the project associated with the provider is used.`,
}
schm.Schema["unique_writer_identity"] = &schema.Schema{
Type: schema.TypeBool,
Optional: true,
Default: false,
ForceNew: true,
Description: `Whether or not to create a unique identity associated with this sink. If false (the default), then the writer_identity used is serviceAccount:[email protected]. If true, then a unique service account is created and used for this sink. If you wish to publish logs across projects, you must set unique_writer_identity to true.`,
}
return schm
}
func resourceLoggingProjectSinkCreate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
userAgent, err := generateUserAgentString(d, config.userAgent)
if err != nil {
return err
}
project, err := getProject(d, config)
if err != nil {
return err
}
id, sink := expandResourceLoggingSink(d, "projects", project)
uniqueWriterIdentity := d.Get("unique_writer_identity").(bool)
_, err = config.NewLoggingClient(userAgent).Projects.Sinks.Create(id.parent(), sink).UniqueWriterIdentity(uniqueWriterIdentity).Do()
if err != nil {
return err
}
d.SetId(id.canonicalId())
return resourceLoggingProjectSinkRead(d, meta)
}
// if bigquery_options is set unique_writer_identity must be true
func resourceLoggingProjectSinkCustomizeDiff(ctx context.Context, d *schema.ResourceDiff, meta interface{}) error {
// separate func to allow unit testing
return resourceLoggingProjectSinkCustomizeDiffFunc(d)
}
func resourceLoggingProjectSinkCustomizeDiffFunc(diff TerraformResourceDiff) error {
if !diff.HasChange("bigquery_options.#") {
return nil
}
bigqueryOptions := diff.Get("bigquery_options.#").(int)
if bigqueryOptions > 0 {
uwi := diff.Get("unique_writer_identity")
if !uwi.(bool) {
return errors.New("unique_writer_identity must be true when bigquery_options is supplied")
}
}
return nil
}
func resourceLoggingProjectSinkRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
userAgent, err := generateUserAgentString(d, config.userAgent)
if err != nil {
return err
}
project, err := getProject(d, config)
if err != nil {
return err
}
sink, err := config.NewLoggingClient(userAgent).Projects.Sinks.Get(d.Id()).Do()
if err != nil {
return handleNotFoundError(err, d, fmt.Sprintf("Project Logging Sink %s", d.Get("name").(string)))
}
if err := d.Set("project", project); err != nil {
return fmt.Errorf("Error setting project: %s", err)
}
if err := flattenResourceLoggingSink(d, sink); err != nil {
return err
}
if sink.WriterIdentity != nonUniqueWriterAccount {
if err := d.Set("unique_writer_identity", true); err != nil {
return fmt.Errorf("Error setting unique_writer_identity: %s", err)
}
} else {
if err := d.Set("unique_writer_identity", false); err != nil {
return fmt.Errorf("Error setting unique_writer_identity: %s", err)
}
}
return nil
}
func resourceLoggingProjectSinkUpdate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
userAgent, err := generateUserAgentString(d, config.userAgent)
if err != nil {
return err
}
sink, updateMask := expandResourceLoggingSinkForUpdate(d)
uniqueWriterIdentity := d.Get("unique_writer_identity").(bool)
_, err = config.NewLoggingClient(userAgent).Projects.Sinks.Patch(d.Id(), sink).
UpdateMask(updateMask).UniqueWriterIdentity(uniqueWriterIdentity).Do()
if err != nil {
return err
}
return resourceLoggingProjectSinkRead(d, meta)
}
func resourceLoggingProjectSinkDelete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
userAgent, err := generateUserAgentString(d, config.userAgent)
if err != nil {
return err
}
_, err = config.NewLoggingClient(userAgent).Projects.Sinks.Delete(d.Id()).Do()
if err != nil {
return err
}
d.SetId("")
return nil
}