/
resource_severity.go
147 lines (134 loc) · 3.87 KB
/
resource_severity.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
package provider
import (
"context"
"fmt"
"net/url"
"reflect"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
var severitySchema = map[string]*schema.Schema{
"id": {
Description: "The ID of this Severity.",
Type: schema.TypeString,
Computed: true,
},
"name": {
Description: "The name of this Severity.",
Type: schema.TypeString,
Required: true,
},
"sms": {
Description: "Whether to send SMS when a new incident is created.",
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"call": {
Description: "Whether to call when a new incident is created.",
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"email": {
Description: "Whether to send email when a new incident is created.",
Type: schema.TypeBool,
Optional: true,
Default: true,
},
"push": {
Description: "Whether to send push notification when a new incident is created.",
Type: schema.TypeBool,
Optional: true,
Default: true,
},
}
func newSeverityResource() *schema.Resource {
return &schema.Resource{
CreateContext: severityCreate,
ReadContext: severityRead,
UpdateContext: severityUpdate,
DeleteContext: severityDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Description: "https://betterstack.com/docs/uptime/api/list-all-severities/",
Schema: severitySchema,
}
}
type severity struct {
Id *int `json:"id,omitempty"`
Name *string `json:"name,omitempty"`
SMS *bool `json:"sms,omitempty"`
Call *bool `json:"call,omitempty"`
Email *bool `json:"email,omitempty"`
Push *bool `json:"push,omitempty"`
}
type severityHTTPResponse struct {
Data struct {
ID string `json:"id"`
Attributes severity `json:"attributes"`
} `json:"data"`
}
func severityRef(in *severity) []struct {
k string
v interface{}
} {
// TODO: if reflect.TypeOf(in).NumField() != len([]struct)
return []struct {
k string
v interface{}
}{
{k: "name", v: &in.Name},
{k: "sms", v: &in.SMS},
{k: "call", v: &in.Call},
{k: "email", v: &in.Email},
{k: "push", v: &in.Push},
}
}
func severityCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var in severity
for _, e := range severityRef(&in) {
load(d, e.k, e.v)
}
var out severityHTTPResponse
if err := resourceCreate(ctx, meta, "/api/v2/urgencies", &in, &out); err != nil {
return err
}
d.SetId(out.Data.ID)
return severityCopyAttrs(d, &out.Data.Attributes)
}
func severityRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var out severityHTTPResponse
if err, ok := resourceRead(ctx, meta, fmt.Sprintf("/api/v2/urgencies/%s", url.PathEscape(d.Id())), &out); err != nil {
return err
} else if !ok {
d.SetId("") // Force "create" on 404.
return nil
}
return severityCopyAttrs(d, &out.Data.Attributes)
}
func severityCopyAttrs(d *schema.ResourceData, in *severity) diag.Diagnostics {
var derr diag.Diagnostics
for _, e := range severityRef(in) {
if err := d.Set(e.k, reflect.Indirect(reflect.ValueOf(e.v)).Interface()); err != nil {
derr = append(derr, diag.FromErr(err)[0])
}
}
return derr
}
func severityUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
var in severity
var out severityHTTPResponse
for _, e := range severityRef(&in) {
load(d, e.k, e.v)
}
if err := resourceUpdate(ctx, meta, fmt.Sprintf("/api/v2/urgencies/%s", url.PathEscape(d.Id())), &in, &out); err != nil {
return err
}
d.SetId(out.Data.ID)
return severityCopyAttrs(d, &out.Data.Attributes)
}
func severityDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
return resourceDelete(ctx, meta, fmt.Sprintf("/api/v2/urgencies/%s", url.PathEscape(d.Id())))
}