Skip to content

Commit 710aabc

Browse files
Merge branch 'master' into feature/new-alerts
2 parents 552073d + 9574864 commit 710aabc

11 files changed

Lines changed: 175 additions & 52 deletions

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
## 2.7.0 (August 20, 2025)
1+
## 2.7.0 (September 5, 2025)
22
ENHANCEMENTS
33
* Adds support for new Alerts
4+
* Deprecating the `notify.billing` permission
45

56
## 2.6.5 (June 07, 2025)
67
ENHANCEMENTS

go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/terraform-providers/terraform-provider-ns1
22

3-
go 1.19
3+
go 1.24
44

55
require (
66
github.com/fatih/structs v1.1.0
@@ -50,10 +50,10 @@ require (
5050
github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect
5151
github.com/vmihailenco/tagparser v0.1.2 // indirect
5252
github.com/zclconf/go-cty v1.12.1 // indirect
53-
golang.org/x/crypto v0.21.0 // indirect
54-
golang.org/x/net v0.23.0 // indirect
55-
golang.org/x/sys v0.20.0 // indirect
56-
golang.org/x/text v0.14.0 // indirect
53+
golang.org/x/crypto v0.36.0 // indirect
54+
golang.org/x/net v0.38.0 // indirect
55+
golang.org/x/sys v0.31.0 // indirect
56+
golang.org/x/text v0.23.0 // indirect
5757
google.golang.org/appengine v1.6.7 // indirect
5858
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
5959
google.golang.org/grpc v1.56.3 // indirect

go.sum

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU
1212
github.com/apparentlymart/go-cidr v1.1.0 h1:2mAhrMoF+nhXqxTzSZMUzDHkLjmIHC+Zzn4tdgBZjnU=
1313
github.com/apparentlymart/go-cidr v1.1.0/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
1414
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0 h1:MzVXffFUye+ZcSR6opIgz9Co7WcDx6ZcY+RjfFHoA0I=
15+
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
1516
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
1617
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
1718
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
@@ -39,6 +40,7 @@ github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6
3940
github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4=
4041
github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc=
4142
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
43+
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
4244
github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
4345
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
4446
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -106,6 +108,7 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl
106108
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
107109
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
108110
github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE=
111+
github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74=
109112
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck=
110113
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
111114
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -118,6 +121,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
118121
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
119122
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
120123
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
124+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
121125
github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
122126
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
123127
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
@@ -150,6 +154,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
150154
github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4=
151155
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
152156
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
157+
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
153158
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
154159
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
155160
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -186,8 +191,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
186191
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
187192
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
188193
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
189-
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
190-
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
194+
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
195+
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
191196
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
192197
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
193198
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -198,8 +203,8 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL
198203
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
199204
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
200205
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
201-
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
202-
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
206+
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
207+
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
203208
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
204209
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
205210
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -220,16 +225,17 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc
220225
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
221226
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
222227
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
223-
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
224-
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
228+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
229+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
225230
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
226-
golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
231+
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
232+
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
227233
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
228234
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
229235
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
230236
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
231-
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
232-
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
237+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
238+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
233239
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
234240
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
235241
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
@@ -251,8 +257,6 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8
251257
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
252258
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
253259
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
254-
gopkg.in/ns1/ns1-go.v2 v2.14.3 h1:Yn72GgB6AA9I4602AsLMtbC1ZKT5EUrKiG+IPS+Ovr0=
255-
gopkg.in/ns1/ns1-go.v2 v2.14.3/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc=
256260
gopkg.in/ns1/ns1-go.v2 v2.14.4 h1:77eP71rZ24I+9k1gITgjJXRyJzzmflA9oPUkYPB/wyc=
257261
gopkg.in/ns1/ns1-go.v2 v2.14.4/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc=
258262
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=

ns1/examples/alert.tf

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,37 @@
1-
resource "ns1_alert" "example" {
1+
resource "ns1_alert" "example_zone_alert" {
22
#required
3-
name = "Example Alert"
3+
name = "Example Zone Alert"
44
type = "zone"
55
subtype = "transfer_failed"
66

77
#optional
88
notification_lists = []
9-
zone_names = []
9+
zone_names = ["a.b.c.com","myzone"]
1010
record_ids = []
1111
}
1212

13-
resource "ns1_alert_sso" "example" {
13+
resource "ns1_alert_sso" "example_saml_alert" {
1414
#required
1515
name = "Example Alert"
1616
type = "account"
1717
subtype = "saml_certificate_expired"
1818
notification_lists = []
1919
}
2020

21-
resource "ns1_alert_redirect" "example" {
21+
resource "ns1_alert_redirect" "example_redirect_alert" {
2222
#required
2323
name = "Example Alert"
2424
type = "redirects"
2525
subtype = "certificate_renewal_failed"
2626
notification_lists = []
27-
}
27+
}
28+
29+
resource "ns1_alert" "example_usage_alert" {
30+
#required
31+
name = "Example Usage Alert"
32+
type = "account"
33+
subtype = "record_usage"
34+
data {
35+
alert_at_percent = 80
36+
}
37+
}

ns1/resource_alert.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ns1
22

33
import (
4+
"encoding/json"
45
"log"
56

67
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -73,6 +74,18 @@ func alertResource() *schema.Resource {
7374
},
7475
ConflictsWith: []string{"zone_names"},
7576
},
77+
"data": {
78+
Type: schema.TypeSet,
79+
Optional: true,
80+
Elem: &schema.Resource{
81+
Schema: map[string]*schema.Schema{
82+
"alert_at_percent": {
83+
Type: schema.TypeInt,
84+
Optional: true,
85+
},
86+
},
87+
},
88+
},
7689
},
7790
Create: AlertConfigCreate,
7891
Read: AlertConfigRead,
@@ -94,6 +107,14 @@ func alertToResourceData(d *schema.ResourceData, alert *alerting.Alert) error {
94107
d.Set("notification_lists", alert.NotifierListIds)
95108
d.Set("zone_names", alert.ZoneNames)
96109
d.Set("record_ids", alert.RecordIds)
110+
if alert.Data != nil {
111+
params := map[string]any{}
112+
err := json.Unmarshal(alert.Data, &params)
113+
if err != nil {
114+
return err
115+
}
116+
d.Set("data", []any{params})
117+
}
97118
return nil
98119
}
99120

@@ -158,6 +179,25 @@ func resourceDataToAlert(d *schema.ResourceData) (*alerting.Alert, error) {
158179
} else {
159180
alert.RecordIds = []string{}
160181
}
182+
if v, ok := d.GetOk("data"); ok {
183+
params := map[string]any{}
184+
if data, ok := v.(*schema.Set); ok {
185+
for _, p := range data.List() {
186+
if setting, ok := p.(map[string]any); ok {
187+
for k, v := range setting {
188+
params[k] = v
189+
}
190+
}
191+
}
192+
}
193+
jsonData, err := json.Marshal(params)
194+
if err != nil {
195+
return nil, err
196+
}
197+
alert.Data = jsonData
198+
} else {
199+
alert.Data = []byte("{}")
200+
}
161201
return &alert, nil
162202
}
163203

ns1/resource_alert_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"log"
66
"reflect"
7+
"regexp"
78
"sort"
89
"strings"
910
"testing"
@@ -17,6 +18,7 @@ import (
1718
)
1819

1920
// Creating basic DNS alert
21+
// NOTE: You would need the `manage_zones` permission to create this alert type. Otherwise this test will fail!
2022
func TestAccAlert_basic(t *testing.T) {
2123
var (
2224
alert = alerting.Alert{}
@@ -100,6 +102,46 @@ func TestAccAlert_Redirect(t *testing.T) {
100102
})
101103
}
102104

105+
func TestAccAlert_RecordUsage(t *testing.T) {
106+
var (
107+
alert = alerting.Alert{}
108+
alertName = fmt.Sprintf("terraform-test-alert-%s", acctest.RandStringFromCharSet(15, acctest.CharSetAlphaNum))
109+
)
110+
111+
resource.Test(t, resource.TestCase{
112+
PreCheck: func() { testAccPreCheck(t) },
113+
Providers: testAccProviders,
114+
CheckDestroy: testAccCheckAlertDestroy,
115+
Steps: []resource.TestStep{
116+
{Config: testRecordUsageAlert(alertName, 10),
117+
Check: resource.ComposeTestCheckFunc(
118+
testAccCheckAlertExists("ns1_alert.it", &alert),
119+
testAccCheckAlertName(&alert, alertName),
120+
testAccCheckAlertType(&alert, "account"),
121+
testAccCheckAlertSubtype(&alert, "record_usage"),
122+
testAccCheckAlertData(&alert, `{"alert_at_percent":10}`),
123+
)},
124+
{Config: testRecordUsageAlert(alertName, 101),
125+
ExpectError: regexp.MustCompile("Please correct the following field: data.alert_at_percent"),
126+
ExpectNonEmptyPlan: true,
127+
},
128+
{Config: testRecordUsageAlert(alertName, 50),
129+
Check: resource.ComposeTestCheckFunc(
130+
testAccCheckAlertExists("ns1_alert.it", &alert),
131+
testAccCheckAlertName(&alert, alertName),
132+
testAccCheckAlertType(&alert, "account"),
133+
testAccCheckAlertSubtype(&alert, "record_usage"),
134+
testAccCheckAlertData(&alert, `{"alert_at_percent":50}`),
135+
)},
136+
{
137+
ResourceName: "ns1_alert.it",
138+
ImportState: true,
139+
ImportStateVerify: true,
140+
},
141+
},
142+
})
143+
}
144+
103145
func TestAccAlert_links(t *testing.T) {
104146
var (
105147
alert = alerting.Alert{}
@@ -257,6 +299,18 @@ func testRedirectAlertBasic(alertName string) string {
257299
}`, alertName)
258300
}
259301

302+
func testRecordUsageAlert(alertName string, threshold int) string {
303+
return fmt.Sprintf(`resource "ns1_alert" "it" {
304+
name = "%s"
305+
type = "account"
306+
subtype = "record_usage"
307+
notification_lists = []
308+
data {
309+
alert_at_percent = %d
310+
}
311+
}`, alertName, threshold)
312+
}
313+
260314
func testAccAlertBasic(alertName string) string {
261315
return fmt.Sprintf(`resource "ns1_alert" "it" {
262316
name = "%s"
@@ -379,6 +433,16 @@ func testAccCheckAlertSubtype(alert *alerting.Alert, expected string) resource.T
379433
}
380434
}
381435

436+
func testAccCheckAlertData(alert *alerting.Alert, expected string) resource.TestCheckFunc {
437+
return func(s *terraform.State) error {
438+
data := string(alert.Data)
439+
if data != expected {
440+
return fmt.Errorf("alert.Data: got: %s want: %s", data, expected)
441+
}
442+
return nil
443+
}
444+
}
445+
382446
func testAccCheckAlertZoneNames(alert *alerting.Alert, expected []string) resource.TestCheckFunc {
383447
return func(s *terraform.State) error {
384448
actualSorted := alert.ZoneNames

ns1/resource_user.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ func userResource() *schema.Resource {
3030
Required: true,
3131
},
3232
"notify": {
33-
Type: schema.TypeMap,
34-
Optional: true,
35-
Elem: schema.TypeBool,
33+
Deprecated: "This field is deprecated and will be removed in a future release; create account usage alerts instead.",
34+
Type: schema.TypeMap,
35+
Optional: true,
36+
Computed: true,
37+
Elem: schema.TypeBool,
3638
},
3739
"teams": {
3840
Type: schema.TypeList,
@@ -76,9 +78,6 @@ func userToResourceData(d *schema.ResourceData, u *account.User) error {
7678
d.Set("name", u.Name)
7779
d.Set("email", u.Email)
7880
d.Set("teams", u.TeamIDs)
79-
notify := make(map[string]bool)
80-
notify["billing"] = u.Notify.Billing
81-
d.Set("notify", notify)
8281
d.Set("ip_whitelist", u.IPWhitelist)
8382
d.Set("ip_whitelist_strict", u.IPWhitelistStrict)
8483
permissionsToResourceData(d, u.Permissions)
@@ -98,10 +97,6 @@ func resourceDataToUser(u *account.User, d *schema.ResourceData) error {
9897
} else {
9998
u.TeamIDs = make([]string, 0)
10099
}
101-
if v, ok := d.GetOk("notify"); ok {
102-
notifyRaw := v.(map[string]interface{})
103-
u.Notify.Billing = notifyRaw["billing"].(bool)
104-
}
105100

106101
if v, ok := d.GetOk("ip_whitelist"); ok {
107102
ipWhitelistRaw := v.(*schema.Set)

0 commit comments

Comments
 (0)