forked from cloudflare/cloudflare-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnotifications.go
448 lines (393 loc) · 15.1 KB
/
notifications.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
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
package cloudflare
import (
"context"
"encoding/json"
"fmt"
"net/http"
"net/url"
"strconv"
"time"
)
// NotificationMechanismData holds a single public facing mechanism data
// integation.
type NotificationMechanismData struct {
Name string `json:"name"`
ID string `json:"id"`
}
// NotificationMechanismIntegrations is a list of all the integrations of a
// certain mechanism type e.g. all email integrations.
type NotificationMechanismIntegrations []NotificationMechanismData
// NotificationPolicy represents the notification policy created along with
// the destinations.
type NotificationPolicy struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Enabled bool `json:"enabled"`
AlertType string `json:"alert_type"`
Mechanisms map[string]NotificationMechanismIntegrations `json:"mechanisms"`
Created time.Time `json:"created"`
Modified time.Time `json:"modified"`
Conditions map[string]interface{} `json:"conditions"`
Filters map[string][]string `json:"filters"`
}
// NotificationPoliciesResponse holds the response for listing all
// notification policies for an account.
type NotificationPoliciesResponse struct {
Response
ResultInfo
Result []NotificationPolicy
}
// NotificationPolicyResponse holds the response type when a single policy
// is retrieved.
type NotificationPolicyResponse struct {
Response
Result NotificationPolicy
}
// NotificationWebhookIntegration describes the webhook information along
// with its status.
type NotificationWebhookIntegration struct {
ID string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
URL string `json:"url"`
CreatedAt time.Time `json:"created_at"`
LastSuccess *time.Time `json:"last_success"`
LastFailure *time.Time `json:"last_failure"`
}
// NotificationWebhookResponse describes a single webhook retrieved.
type NotificationWebhookResponse struct {
Response
ResultInfo
Result NotificationWebhookIntegration
}
// NotificationWebhooksResponse describes a list of webhooks retrieved.
type NotificationWebhooksResponse struct {
Response
ResultInfo
Result []NotificationWebhookIntegration
}
// NotificationUpsertWebhooks describes a valid webhook request.
type NotificationUpsertWebhooks struct {
Name string `json:"name"`
URL string `json:"url"`
Secret string `json:"secret"`
}
// NotificationPagerDutyResource describes a PagerDuty integration.
type NotificationPagerDutyResource struct {
ID string `json:"id"`
Name string `json:"name"`
}
// NotificationPagerDutyResponse describes the PagerDuty integration
// retrieved.
type NotificationPagerDutyResponse struct {
Response
ResultInfo
Result NotificationPagerDutyResource
}
// NotificationResource describes the id of an inserted/updated/deleted
// resource.
type NotificationResource struct {
ID string
}
// SaveResponse is returned when a resource is inserted/updated/deleted.
type SaveResponse struct {
Response
Result NotificationResource
}
// NotificationMechanismMetaData represents the state of the delivery
// mechanism.
type NotificationMechanismMetaData struct {
Eligible bool `json:"eligible"`
Ready bool `json:"ready"`
Type string `json:"type"`
}
// NotificationMechanisms are the different possible delivery mechanisms.
type NotificationMechanisms struct {
Email NotificationMechanismMetaData `json:"email"`
PagerDuty NotificationMechanismMetaData `json:"pagerduty"`
Webhooks NotificationMechanismMetaData `json:"webhooks,omitempty"`
}
// NotificationEligibilityResponse describes the eligible mechanisms that
// can be configured for a notification.
type NotificationEligibilityResponse struct {
Response
Result NotificationMechanisms
}
// NotificationsGroupedByProduct are grouped by products.
type NotificationsGroupedByProduct map[string][]NotificationAlertWithDescription
// NotificationAlertWithDescription represents the alert/notification
// available.
type NotificationAlertWithDescription struct {
DisplayName string `json:"display_name"`
Type string `json:"type"`
Description string `json:"description"`
}
// NotificationAvailableAlertsResponse describes the available
// alerts/notifications grouped by products.
type NotificationAvailableAlertsResponse struct {
Response
Result NotificationsGroupedByProduct
}
// NotificationHistory describes the history
// of notifications sent for an account.
type NotificationHistory struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
AlertBody string `json:"alert_body"`
AlertType string `json:"alert_type"`
Mechanism string `json:"mechanism"`
MechanismType string `json:"mechanism_type"`
Sent time.Time `json:"sent"`
}
// NotificationHistoryResponse describes the notification history
// response for an account for a specific time period.
type NotificationHistoryResponse struct {
Response
ResultInfo `json:"result_info"`
Result []NotificationHistory
}
// ListNotificationPolicies will return the notification policies
// created by a user for a specific account.
//
// API Reference: https://api.cloudflare.com/#notification-policies-properties
func (api *API) ListNotificationPolicies(ctx context.Context, accountID string) (NotificationPoliciesResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/policies", accountID)
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return NotificationPoliciesResponse{}, err
}
var r NotificationPoliciesResponse
err = json.Unmarshal(res, &r)
if err != nil {
return r, err
}
return r, nil
}
// GetNotificationPolicy returns a specific created by a user, given the account
// id and the policy id.
//
// API Reference: https://api.cloudflare.com/#notification-policies-properties
func (api *API) GetNotificationPolicy(ctx context.Context, accountID, policyID string) (NotificationPolicyResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/policies/%s", accountID, policyID)
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return NotificationPolicyResponse{}, err
}
var r NotificationPolicyResponse
err = json.Unmarshal(res, &r)
if err != nil {
return r, err
}
return r, nil
}
// CreateNotificationPolicy creates a notification policy for an account.
//
// API Reference: https://api.cloudflare.com/#notification-policies-create-notification-policy
func (api *API) CreateNotificationPolicy(ctx context.Context, accountID string, policy NotificationPolicy) (SaveResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/policies", accountID)
res, err := api.makeRequestContext(ctx, http.MethodPost, baseURL, policy)
if err != nil {
return SaveResponse{}, err
}
return unmarshalNotificationSaveResponse(res)
}
// UpdateNotificationPolicy updates a notification policy, given the
// account id and the policy id and returns the policy id.
//
// API Reference: https://api.cloudflare.com/#notification-policies-update-notification-policy
func (api *API) UpdateNotificationPolicy(ctx context.Context, accountID string, policy *NotificationPolicy) (SaveResponse, error) {
if policy == nil {
return SaveResponse{}, fmt.Errorf("policy cannot be nil")
}
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/policies/%s", accountID, policy.ID)
res, err := api.makeRequestContext(ctx, http.MethodPut, baseURL, policy)
if err != nil {
return SaveResponse{}, err
}
return unmarshalNotificationSaveResponse(res)
}
// DeleteNotificationPolicy deletes a notification policy for an account.
//
// API Reference: https://api.cloudflare.com/#notification-policies-delete-notification-policy
func (api *API) DeleteNotificationPolicy(ctx context.Context, accountID, policyID string) (SaveResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/policies/%s", accountID, policyID)
res, err := api.makeRequestContext(ctx, http.MethodDelete, baseURL, nil)
if err != nil {
return SaveResponse{}, err
}
return unmarshalNotificationSaveResponse(res)
}
// ListNotificationWebhooks will return the webhook destinations configured
// for an account.
//
// API Reference: https://api.cloudflare.com/#notification-webhooks-list-webhooks
func (api *API) ListNotificationWebhooks(ctx context.Context, accountID string) (NotificationWebhooksResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/destinations/webhooks", accountID)
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return NotificationWebhooksResponse{}, err
}
var r NotificationWebhooksResponse
err = json.Unmarshal(res, &r)
if err != nil {
return r, err
}
return r, nil
}
// CreateNotificationWebhooks will help connect a webhooks destination.
// A test message will be sent to the webhooks endpoint during creation.
// If added successfully, the webhooks can be setup as a destination mechanism
// while creating policies.
//
// Notifications will be posted to this URL.
//
// API Reference: https://api.cloudflare.com/#notification-webhooks-create-webhook
func (api *API) CreateNotificationWebhooks(ctx context.Context, accountID string, webhooks *NotificationUpsertWebhooks) (SaveResponse, error) {
if webhooks == nil {
return SaveResponse{}, fmt.Errorf("webhooks cannot be nil")
}
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/destinations/webhooks", accountID)
res, err := api.makeRequestContext(ctx, http.MethodPost, baseURL, webhooks)
if err != nil {
return SaveResponse{}, err
}
return unmarshalNotificationSaveResponse(res)
}
// GetNotificationWebhooks will return a specific webhook destination,
// given the account and webhooks ids.
//
// API Reference: https://api.cloudflare.com/#notification-webhooks-get-webhook
func (api *API) GetNotificationWebhooks(ctx context.Context, accountID, webhookID string) (NotificationWebhookResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/destinations/webhooks/%s", accountID, webhookID)
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return NotificationWebhookResponse{}, err
}
var r NotificationWebhookResponse
err = json.Unmarshal(res, &r)
if err != nil {
return r, err
}
return r, nil
}
// UpdateNotificationWebhooks will update a particular webhook's name,
// given the account and webhooks ids.
//
// The webhook url and secret cannot be updated.
//
// API Reference: https://api.cloudflare.com/#notification-webhooks-update-webhook
func (api *API) UpdateNotificationWebhooks(ctx context.Context, accountID, webhookID string, webhooks *NotificationUpsertWebhooks) (SaveResponse, error) {
if webhooks == nil {
return SaveResponse{}, fmt.Errorf("webhooks cannot be nil")
}
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/destinations/webhooks/%s", accountID, webhookID)
res, err := api.makeRequestContext(ctx, http.MethodPut, baseURL, webhooks)
if err != nil {
return SaveResponse{}, err
}
return unmarshalNotificationSaveResponse(res)
}
// DeleteNotificationWebhooks will delete a webhook, given the account and
// webhooks ids. Deleting the webhooks will remove it from any connected
// notification policies.
//
// API Reference: https://api.cloudflare.com/#notification-webhooks-delete-webhook
func (api *API) DeleteNotificationWebhooks(ctx context.Context, accountID, webhookID string) (SaveResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/destinations/webhooks/%s", accountID, webhookID)
res, err := api.makeRequestContext(ctx, http.MethodDelete, baseURL, nil)
if err != nil {
return SaveResponse{}, err
}
return unmarshalNotificationSaveResponse(res)
}
// ListPagerDutyNotificationDestinations will return the pagerduty
// destinations configured for an account.
//
// API Reference: https://api.cloudflare.com/#notification-destinations-with-pagerduty-list-pagerduty-services
func (api *API) ListPagerDutyNotificationDestinations(ctx context.Context, accountID string) (NotificationPagerDutyResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/destinations/pagerduty", accountID)
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return NotificationPagerDutyResponse{}, err
}
var r NotificationPagerDutyResponse
err = json.Unmarshal(res, &r)
if err != nil {
return r, err
}
return r, nil
}
// GetEligibleNotificationDestinations will return the types of
// destinations an account is eligible to configure.
//
// API Reference: https://api.cloudflare.com/#notification-mechanism-eligibility-properties
func (api *API) GetEligibleNotificationDestinations(ctx context.Context, accountID string) (NotificationEligibilityResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/destinations/eligible", accountID)
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return NotificationEligibilityResponse{}, err
}
var r NotificationEligibilityResponse
err = json.Unmarshal(res, &r)
if err != nil {
return r, err
}
return r, nil
}
// GetAvailableNotificationTypes will return the alert types available for
// a given account.
//
// API Reference: https://api.cloudflare.com/#notification-mechanism-eligibility-properties
func (api *API) GetAvailableNotificationTypes(ctx context.Context, accountID string) (NotificationAvailableAlertsResponse, error) {
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/available_alerts", accountID)
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return NotificationAvailableAlertsResponse{}, err
}
var r NotificationAvailableAlertsResponse
err = json.Unmarshal(res, &r)
if err != nil {
return r, err
}
return r, nil
}
// ListNotificationHistory will return the history of alerts sent for
// a given account. The time period varies based on zone plan.
// Free, Biz, Pro = 30 days
// Ent = 90 days
//
// API Reference: https://api.cloudflare.com/#notification-history-list-history
func (api *API) ListNotificationHistory(ctx context.Context, accountID string, pageOpts PaginationOptions) ([]NotificationHistory, ResultInfo, error) {
v := url.Values{}
if pageOpts.PerPage > 0 {
v.Set("per_page", strconv.Itoa(pageOpts.PerPage))
}
if pageOpts.Page > 0 {
v.Set("page", strconv.Itoa(pageOpts.Page))
}
baseURL := fmt.Sprintf("/accounts/%s/alerting/v3/history", accountID)
if len(v) > 0 {
baseURL = fmt.Sprintf("%s?%s", baseURL, v.Encode())
}
res, err := api.makeRequestContext(ctx, http.MethodGet, baseURL, nil)
if err != nil {
return []NotificationHistory{}, ResultInfo{}, err
}
var r NotificationHistoryResponse
err = json.Unmarshal(res, &r)
if err != nil {
return []NotificationHistory{}, ResultInfo{}, err
}
return r.Result, r.ResultInfo, nil
}
// unmarshal will unmarshal bytes and return a SaveResponse.
func unmarshalNotificationSaveResponse(res []byte) (SaveResponse, error) {
var r SaveResponse
err := json.Unmarshal(res, &r)
if err != nil {
return r, err
}
return r, nil
}