Skip to content

Commit fb8979d

Browse files
authored
Alerting: Resource-level write locking for resources backed by UA config file (#602)
* Resource-level locking for resources backed by UA config file * Regenerate docs * Regenerate docs
1 parent 8738156 commit fb8979d

File tree

7 files changed

+44
-8
lines changed

7 files changed

+44
-8
lines changed

docs/resources/notification_policy.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ resource "grafana_mute_timing" "a_mute_timing" {
2929
intervals {
3030
weekdays = ["monday"]
3131
}
32-
33-
depends_on = [
34-
grafana_contact_point.a_contact_point
35-
]
3632
}
3733
3834

examples/resources/grafana_notification_policy/resource.tf

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ resource "grafana_mute_timing" "a_mute_timing" {
1313
intervals {
1414
weekdays = ["monday"]
1515
}
16-
17-
depends_on = [
18-
grafana_contact_point.a_contact_point
19-
]
2016
}
2117

2218

grafana/provider.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"os"
1111
"regexp"
1212
"strings"
13+
"sync"
1314

1415
"github.com/hashicorp/go-cleanhttp"
1516
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
@@ -258,6 +259,8 @@ type client struct {
258259
mlapi *mlapi.Client
259260

260261
onCallAPI *onCallAPI.Client
262+
263+
alertingMutex sync.Mutex
261264
}
262265

263266
func configure(version string, p *schema.Provider) func(context.Context, *schema.ResourceData) (interface{}, diag.Diagnostics) {

grafana/resource_alerting_contact_point.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,14 @@ func readContactPoint(ctx context.Context, data *schema.ResourceData, meta inter
9999
}
100100

101101
func createContactPoint(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
102+
lock := &meta.(*client).alertingMutex
102103
client := meta.(*client).gapi
103104

104105
ps := unpackContactPoints(data)
105106
uids := make([]string, 0, len(ps))
107+
108+
lock.Lock()
109+
defer lock.Unlock()
106110
for i := range ps {
107111
uid, err := client.NewContactPoint(&ps[i])
108112
if err != nil {
@@ -116,13 +120,16 @@ func createContactPoint(ctx context.Context, data *schema.ResourceData, meta int
116120
}
117121

118122
func updateContactPoint(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
123+
lock := &meta.(*client).alertingMutex
119124
client := meta.(*client).gapi
120125

121126
existingUIDs := unpackUIDs(data.Id())
122127
ps := unpackContactPoints(data)
123128

124129
unprocessedUIDs := toUIDSet(existingUIDs)
125130
newUIDs := make([]string, 0, len(ps))
131+
lock.Lock()
132+
defer lock.Unlock()
126133
for i := range ps {
127134
delete(unprocessedUIDs, ps[i].UID)
128135
err := client.UpdateContactPoint(&ps[i])
@@ -154,9 +161,13 @@ func updateContactPoint(ctx context.Context, data *schema.ResourceData, meta int
154161
}
155162

156163
func deleteContactPoint(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
164+
lock := &meta.(*client).alertingMutex
157165
client := meta.(*client).gapi
158166

159167
uids := unpackUIDs(data.Id())
168+
169+
lock.Lock()
170+
defer lock.Unlock()
160171
for _, uid := range uids {
161172
if err := client.DeleteContactPoint(uid); err != nil {
162173
return diag.FromErr(err)

grafana/resource_alerting_message_template.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,13 @@ func readMessageTemplate(ctx context.Context, data *schema.ResourceData, meta in
6262
}
6363

6464
func createMessageTemplate(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
65+
lock := &meta.(*client).alertingMutex
6566
client := meta.(*client).gapi
6667
name := data.Get("name").(string)
6768
content := data.Get("template").(string)
6869

70+
lock.Lock()
71+
defer lock.Unlock()
6972
if err := client.SetMessageTemplate(name, content); err != nil {
7073
return diag.FromErr(err)
7174
}
@@ -75,10 +78,13 @@ func createMessageTemplate(ctx context.Context, data *schema.ResourceData, meta
7578
}
7679

7780
func updateMessageTemplate(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
81+
lock := &meta.(*client).alertingMutex
7882
client := meta.(*client).gapi
7983
name := data.Get("name").(string)
8084
content := data.Get("template").(string)
8185

86+
lock.Lock()
87+
defer lock.Unlock()
8288
if err := client.SetMessageTemplate(name, content); err != nil {
8389
return diag.FromErr(err)
8490
}
@@ -87,11 +93,15 @@ func updateMessageTemplate(ctx context.Context, data *schema.ResourceData, meta
8793
}
8894

8995
func deleteMessageTemplate(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
96+
lock := &meta.(*client).alertingMutex
9097
client := meta.(*client).gapi
9198
name := data.Id()
9299

100+
lock.Lock()
101+
defer lock.Unlock()
93102
if err := client.DeleteMessageTemplate(name); err != nil {
94103
return diag.FromErr(err)
95104
}
105+
96106
return diag.Diagnostics{}
97107
}

grafana/resource_alerting_mute_timing.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,13 @@ func readMuteTiming(ctx context.Context, data *schema.ResourceData, meta interfa
127127
}
128128

129129
func createMuteTiming(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
130+
lock := &meta.(*client).alertingMutex
130131
client := meta.(*client).gapi
131132

132133
mt := unpackMuteTiming(data)
134+
135+
lock.Lock()
136+
defer lock.Unlock()
133137
if err := client.NewMuteTiming(&mt); err != nil {
134138
return diag.FromErr(err)
135139
}
@@ -139,20 +143,26 @@ func createMuteTiming(ctx context.Context, data *schema.ResourceData, meta inter
139143
}
140144

141145
func updateMuteTiming(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
146+
lock := &meta.(*client).alertingMutex
142147
client := meta.(*client).gapi
143148

144149
mt := unpackMuteTiming(data)
145150

151+
lock.Lock()
152+
defer lock.Unlock()
146153
if err := client.UpdateMuteTiming(&mt); err != nil {
147154
return diag.FromErr(err)
148155
}
149156
return readMuteTiming(ctx, data, meta)
150157
}
151158

152159
func deleteMuteTiming(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
160+
lock := &meta.(*client).alertingMutex
153161
client := meta.(*client).gapi
154162
name := data.Id()
155163

164+
lock.Lock()
165+
defer lock.Unlock()
156166
if err := client.DeleteMuteTiming(name); err != nil {
157167
return diag.FromErr(err)
158168
}

grafana/resource_alerting_notification_policy.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,16 @@ func readNotificationPolicy(ctx context.Context, data *schema.ResourceData, meta
174174
}
175175

176176
func createNotificationPolicy(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
177+
lock := &meta.(*client).alertingMutex
177178
client := meta.(*client).gapi
178179

179180
npt, err := unpackNotifPolicy(data)
180181
if err != nil {
181182
return diag.FromErr(err)
182183
}
183184

185+
lock.Lock()
186+
defer lock.Unlock()
184187
if err := client.SetNotificationPolicyTree(&npt); err != nil {
185188
return diag.FromErr(err)
186189
}
@@ -190,13 +193,16 @@ func createNotificationPolicy(ctx context.Context, data *schema.ResourceData, me
190193
}
191194

192195
func updateNotificationPolicy(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
196+
lock := &meta.(*client).alertingMutex
193197
client := meta.(*client).gapi
194198

195199
npt, err := unpackNotifPolicy(data)
196200
if err != nil {
197201
return diag.FromErr(err)
198202
}
199203

204+
lock.Lock()
205+
defer lock.Unlock()
200206
if err := client.SetNotificationPolicyTree(&npt); err != nil {
201207
return diag.FromErr(err)
202208
}
@@ -205,11 +211,15 @@ func updateNotificationPolicy(ctx context.Context, data *schema.ResourceData, me
205211
}
206212

207213
func deleteNotificationPolicy(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
214+
lock := &meta.(*client).alertingMutex
208215
client := meta.(*client).gapi
209216

217+
lock.Lock()
218+
defer lock.Unlock()
210219
if err := client.ResetNotificationPolicyTree(); err != nil {
211220
return diag.FromErr(err)
212221
}
222+
213223
return diag.Diagnostics{}
214224
}
215225

0 commit comments

Comments
 (0)