Skip to content

Commit 83f72a3

Browse files
combine rrset changes into one large operation
This ensures that all intended changes are executed even if one of the operations fails.
1 parent 0d0c616 commit 83f72a3

File tree

1 file changed

+31
-77
lines changed

1 file changed

+31
-77
lines changed

internal/stackitprovider/apply_changes.go

Lines changed: 31 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -12,110 +12,65 @@ import (
1212

1313
// ApplyChanges applies a given set of changes in a given zone.
1414
func (d *StackitDNSProvider) ApplyChanges(ctx context.Context, changes *plan.Changes) error {
15-
zones, err := d.zoneFetcherClient.zones(ctx)
16-
if err != nil {
17-
return err
18-
}
19-
15+
var tasks []changeTask
2016
// create rr set. POST /v1/projects/{projectId}/zones/{zoneId}/rrsets
21-
err = d.createRRSets(ctx, zones, changes.Create)
22-
if err != nil {
23-
return err
24-
}
25-
17+
tasks = append(tasks, d.buildRRSetTasks(changes.Create, CREATE)...)
2618
// update rr set. PATCH /v1/projects/{projectId}/zones/{zoneId}/rrsets/{rrSetId}
27-
err = d.updateRRSets(ctx, zones, changes.UpdateNew)
28-
if err != nil {
29-
return err
30-
}
31-
19+
tasks = append(tasks, d.buildRRSetTasks(changes.UpdateNew, UPDATE)...)
20+
d.logger.Info("records to delete", zap.String("records", fmt.Sprintf("%v", changes.Delete)))
3221
// delete rr set. DELETE /v1/projects/{projectId}/zones/{zoneId}/rrsets/{rrSetId}
33-
err = d.deleteRRSets(ctx, zones, changes.Delete)
22+
tasks = append(tasks, d.buildRRSetTasks(changes.Delete, DELETE)...)
23+
24+
zones, err := d.zoneFetcherClient.zones(ctx)
3425
if err != nil {
3526
return err
3627
}
3728

38-
return nil
39-
}
40-
41-
// createRRSets creates new record sets in the stackitprovider for the given endpoints that are in the
42-
// creation field.
43-
func (d *StackitDNSProvider) createRRSets(
44-
ctx context.Context,
45-
zones []stackitdnsclient.Zone,
46-
endpoints []*endpoint.Endpoint,
47-
) error {
48-
if len(endpoints) == 0 {
49-
return nil
50-
}
51-
52-
return d.handleRRSetWithWorkers(ctx, endpoints, zones, CREATE)
53-
}
54-
55-
// updateRRSets patches (overrides) contents in the record sets in the stackitprovider for the given
56-
// endpoints that are in the update new field.
57-
func (d *StackitDNSProvider) updateRRSets(
58-
ctx context.Context,
59-
zones []stackitdnsclient.Zone,
60-
endpoints []*endpoint.Endpoint,
61-
) error {
62-
if len(endpoints) == 0 {
63-
return nil
64-
}
65-
66-
return d.handleRRSetWithWorkers(ctx, endpoints, zones, UPDATE)
29+
return d.handleRRSetWithWorkers(ctx, tasks, zones)
6730
}
6831

69-
// deleteRRSets deletes record sets in the stackitprovider for the given endpoints that are in the
70-
// deletion field.
71-
func (d *StackitDNSProvider) deleteRRSets(
72-
ctx context.Context,
73-
zones []stackitdnsclient.Zone,
32+
// handleRRSetWithWorkers handles the given endpoints with workers to optimize speed.
33+
func (d *StackitDNSProvider) buildRRSetTasks(
7434
endpoints []*endpoint.Endpoint,
75-
) error {
76-
if len(endpoints) == 0 {
77-
d.logger.Debug("no endpoints to delete")
35+
action string,
36+
) []changeTask {
37+
tasks := make([]changeTask, 0, len(endpoints))
7838

79-
return nil
39+
for _, change := range endpoints {
40+
tasks = append(tasks, changeTask{
41+
action: action,
42+
change: change,
43+
})
8044
}
8145

82-
d.logger.Info("records to delete", zap.String("records", fmt.Sprintf("%v", endpoints)))
83-
84-
return d.handleRRSetWithWorkers(ctx, endpoints, zones, DELETE)
46+
return tasks
8547
}
8648

8749
// handleRRSetWithWorkers handles the given endpoints with workers to optimize speed.
8850
func (d *StackitDNSProvider) handleRRSetWithWorkers(
8951
ctx context.Context,
90-
endpoints []*endpoint.Endpoint,
52+
tasks []changeTask,
9153
zones []stackitdnsclient.Zone,
92-
action string,
9354
) error {
94-
workerChannel := make(chan changeTask, len(endpoints))
95-
errorChannel := make(chan error, len(endpoints))
55+
workerChannel := make(chan changeTask, len(tasks))
56+
defer close(workerChannel)
57+
errorChannel := make(chan error, len(tasks))
9658

9759
for i := 0; i < d.workers; i++ {
9860
go d.changeWorker(ctx, workerChannel, errorChannel, zones)
9961
}
10062

101-
for _, change := range endpoints {
102-
workerChannel <- changeTask{
103-
action: action,
104-
change: change,
105-
}
63+
for _, task := range tasks {
64+
workerChannel <- task
10665
}
10766

108-
for i := 0; i < len(endpoints); i++ {
67+
for i := 0; i < len(tasks); i++ {
10968
err := <-errorChannel
11069
if err != nil {
111-
close(workerChannel)
112-
11370
return err
11471
}
11572
}
11673

117-
close(workerChannel)
118-
11974
return nil
12075
}
12176

@@ -127,17 +82,16 @@ func (d *StackitDNSProvider) changeWorker(
12782
zones []stackitdnsclient.Zone,
12883
) {
12984
for change := range changes {
85+
var err error
13086
switch change.action {
13187
case CREATE:
132-
err := d.createRRSet(ctx, change.change, zones)
133-
errorChannel <- err
88+
err = d.createRRSet(ctx, change.change, zones)
13489
case UPDATE:
135-
err := d.updateRRSet(ctx, change.change, zones)
136-
errorChannel <- err
90+
err = d.updateRRSet(ctx, change.change, zones)
13791
case DELETE:
138-
err := d.deleteRRSet(ctx, change.change, zones)
139-
errorChannel <- err
92+
err = d.deleteRRSet(ctx, change.change, zones)
14093
}
94+
errorChannel <- err
14195
}
14296

14397
d.logger.Debug("change worker finished")

0 commit comments

Comments
 (0)