@@ -12,110 +12,65 @@ import (
12
12
13
13
// ApplyChanges applies a given set of changes in a given zone.
14
14
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
20
16
// 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 )... )
26
18
// 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 )))
32
21
// 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 )
34
25
if err != nil {
35
26
return err
36
27
}
37
28
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 )
67
30
}
68
31
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 (
74
34
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 ) )
78
38
79
- return nil
39
+ for _ , change := range endpoints {
40
+ tasks = append (tasks , changeTask {
41
+ action : action ,
42
+ change : change ,
43
+ })
80
44
}
81
45
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
85
47
}
86
48
87
49
// handleRRSetWithWorkers handles the given endpoints with workers to optimize speed.
88
50
func (d * StackitDNSProvider ) handleRRSetWithWorkers (
89
51
ctx context.Context ,
90
- endpoints []* endpoint. Endpoint ,
52
+ tasks []changeTask ,
91
53
zones []stackitdnsclient.Zone ,
92
- action string ,
93
54
) 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 ))
96
58
97
59
for i := 0 ; i < d .workers ; i ++ {
98
60
go d .changeWorker (ctx , workerChannel , errorChannel , zones )
99
61
}
100
62
101
- for _ , change := range endpoints {
102
- workerChannel <- changeTask {
103
- action : action ,
104
- change : change ,
105
- }
63
+ for _ , task := range tasks {
64
+ workerChannel <- task
106
65
}
107
66
108
- for i := 0 ; i < len (endpoints ); i ++ {
67
+ for i := 0 ; i < len (tasks ); i ++ {
109
68
err := <- errorChannel
110
69
if err != nil {
111
- close (workerChannel )
112
-
113
70
return err
114
71
}
115
72
}
116
73
117
- close (workerChannel )
118
-
119
74
return nil
120
75
}
121
76
@@ -127,17 +82,16 @@ func (d *StackitDNSProvider) changeWorker(
127
82
zones []stackitdnsclient.Zone ,
128
83
) {
129
84
for change := range changes {
85
+ var err error
130
86
switch change .action {
131
87
case CREATE :
132
- err := d .createRRSet (ctx , change .change , zones )
133
- errorChannel <- err
88
+ err = d .createRRSet (ctx , change .change , zones )
134
89
case UPDATE :
135
- err := d .updateRRSet (ctx , change .change , zones )
136
- errorChannel <- err
90
+ err = d .updateRRSet (ctx , change .change , zones )
137
91
case DELETE :
138
- err := d .deleteRRSet (ctx , change .change , zones )
139
- errorChannel <- err
92
+ err = d .deleteRRSet (ctx , change .change , zones )
140
93
}
94
+ errorChannel <- err
141
95
}
142
96
143
97
d .logger .Debug ("change worker finished" )
0 commit comments