forked from fastly/go-fastly
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bigquery.go
326 lines (266 loc) · 7.47 KB
/
bigquery.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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
package fastly
import (
"fmt"
"net/url"
)
// BigQuery represents a BigQuery logging response from the Fastly API.
type BigQuery struct {
ServiceID string `mapstructure:"service_id"`
Name string `mapstructure:"name"`
Format string `mapstructure:"format"`
User string `mapstructure:"user"`
ProjectID string `mapstructure:"project_id"`
Dataset string `mapstructure:"dataset"`
Table string `mapstructure:"table"`
Template string `mapstructure:"template_suffix"`
SecretKey string `mapstructure:"secret_key"`
CreatedAt string `mapstructure:"created_at"`
UpdatedAt string `mapstructure:"updated_at"`
DeletedAt string `mapstructure:"deleted_at"`
ResponseCondition string `mapstructure:"response_condition"`
Placement string `mapstructure:"placement"`
}
// GetBigQueryInput is used as input to the GetBigQuery function.
type GetBigQueryInput struct {
// Service is the ID of the service. Version is the specific configuration
// version. Both fields are required.
Service string
Version int
}
// GetBigQuery lists all BigQuerys associated with a service version.
func (c *Client) GetBigQuery(i *GetBigQueryInput) ([]*BigQuery, error) {
if i.Service == "" {
return nil, ErrMissingService
}
if i.Version == 0 {
return nil, ErrMissingVersion
}
path := fmt.Sprintf("/service/%s/version/%d/logging/bigquery", i.Service, i.Version)
resp, err := c.Get(path, nil)
if err != nil {
return nil, err
}
var bs []*BigQuery
if err := decodeJSON(&bs, resp.Body); err != nil {
return nil, err
}
return bs, nil
}
// CreateBigQueryInput is used as input to the CreateBigQuery function.
type CreateBigQueryInput struct {
// All fields other than format are required.
// Service is the ID of the service.
Service string
//Version is the specific configuration version.
Version int
// Name is the name if your bigquery logging endpoint.
Name string
// Project ID your GCP project ID.
ProjectID string
// Dataset is your BigQuery dataset.
Dataset string
// Table is your BigQuery table.
Table string
// Template is your BigQuery template suffix.
Template string
// User is the user with access to write to your BigQuery dataset.
User string
// Secret key is the user's secret key.
SecretKey string
// Format is the log formatting desired for your BigQuery dataset.
// Optional.
Format string
// ResponseCondition allows you to attach a response condition to your BigQuery logging endpoint.
// Optional.
ResponseCondition string
// Placement is the log placement desired for your BigQuery logging endpoint.
// Optional.
Placement string
}
// CreateBigQuery creates a new Fastly BigQuery logging endpoint.
func (c *Client) CreateBigQuery(i *CreateBigQueryInput) (*BigQuery, error) {
if i.Service == "" {
return nil, ErrMissingService
}
if i.Version == 0 {
return nil, ErrMissingVersion
}
if i.Name == "" {
return nil, ErrMissingName
}
if i.ProjectID == "" {
return nil, ErrMissingProjectID
}
if i.Dataset == "" {
return nil, ErrMissingDataset
}
if i.Table == "" {
return nil, ErrMissingTable
}
if i.User == "" {
return nil, ErrMissingUser
}
if i.SecretKey == "" {
return nil, ErrMissingSecretKey
}
params := make(map[string]string)
params["name"] = i.Name
params["project_id"] = i.ProjectID
params["dataset"] = i.Dataset
params["table"] = i.Table
params["user"] = i.User
params["secret_key"] = i.SecretKey
if i.Format != "" {
params["format"] = i.Format
}
if i.ResponseCondition != "" {
params["response_condition"] = i.ResponseCondition
}
if i.Template != "" {
params["template_suffix"] = i.Template
}
if i.Placement != "" {
params["placement"] = i.Placement
}
path := fmt.Sprintf("/service/%s/version/%d/logging/bigquery", i.Service, i.Version)
resp, err := c.PostForm(path, i, &RequestOptions{
Params: params,
})
if err != nil {
return nil, err
}
var b *BigQuery
if err := decodeJSON(&b, resp.Body); err != nil {
return nil, err
}
return b, nil
}
// UpdateBigQueryInput is used as input to the UpdateBigQuery function.
type UpdateBigQueryInput struct {
// Service is the ID of the service.
// This field is required.
Service string
//Version is the specific configuration version.
// This field is required.
Version int
// Name is the old name if your bigquery logging endpoint.
// Used to identify the correct BigQuery logging endpoint if there
// is a name change.
// This field is required.
Name string
// NewName is the new name of your BigQuery logging endpoint.
// This field is required.
NewName string
// Project ID your GCP project ID.
ProjectID string
// Dataset is your BigQuery dataset.
Dataset string
// Table is your BigQuery table.
Table string
// Template is your BigQuery template suffix.
Template string
// User is the user with access to write to your BigQuery dataset.
User string
// Secret key is the user's secret key.
SecretKey string
// Format is the log formatting desired for your BigQuery dataset.
// Optional.
Format string
// ResponseCondition allows you to attach a response condition to your BigQuery logging endpoint.
// Optional.
ResponseCondition string
// Placement is the log placement desired for your BigQuery logging endpoint.
// Optional.
Placement string
}
// UpdateBigQuery updates a BigQuery logging endpoint.
func (c *Client) UpdateBigQuery(i *UpdateBigQueryInput) (*BigQuery, error) {
if i.Service == "" {
return nil, ErrMissingService
}
if i.Version == 0 {
return nil, ErrMissingVersion
}
if i.Name == "" {
return nil, ErrMissingName
}
if i.NewName == "" {
return nil, ErrMissingNewName
}
params := make(map[string]string)
params["name"] = i.NewName
if i.ProjectID != "" {
params["project_id"] = i.ProjectID
}
if i.Dataset != "" {
params["dataset"] = i.Dataset
}
if i.Table != "" {
params["table"] = i.Table
}
if i.Template != "" {
params["template_suffix"] = i.Template
}
if i.User != "" {
params["user"] = i.User
}
if i.SecretKey != "" {
params["secret_key"] = i.SecretKey
}
if i.Format != "" {
params["format"] = i.Format
}
if i.ResponseCondition != "" {
params["response_condition"] = i.ResponseCondition
}
if i.Placement != "" {
params["placement"] = i.Placement
}
path := fmt.Sprintf("/service/%s/version/%d/logging/bigquery/%s", i.Service, i.Version, url.PathEscape(i.Name))
resp, err := c.PutForm(path, i, &RequestOptions{
Params: params,
})
if err != nil {
return nil, err
}
var b *BigQuery
if err := decodeJSON(&b, resp.Body); err != nil {
return nil, err
}
return b, nil
}
// DeleteBigQueryInput is the input parameter to DeleteBigQuery.
// All fields are required.
type DeleteBigQueryInput struct {
// Service is the ID of the service.
Service string
// Version is the specific configuration.
Version int
// Name is the name of the BigQuery logging endpoint to delete.
Name string
}
// DeleteBigQuery deletes the given BigQuery logging endpoint.
func (c *Client) DeleteBigQuery(i *DeleteBigQueryInput) error {
if i.Service == "" {
return ErrMissingService
}
if i.Version == 0 {
return ErrMissingVersion
}
if i.Name == "" {
return ErrMissingName
}
path := fmt.Sprintf("/service/%s/version/%d/logging/bigquery/%s", i.Service, i.Version, url.PathEscape(i.Name))
resp, err := c.Delete(path, nil)
if err != nil {
return err
}
var r *statusResp
if err := decodeJSON(&r, resp.Body); err != nil {
return err
}
if !r.Ok() {
return fmt.Errorf("Not Ok")
}
return nil
}