@@ -12,110 +12,65 @@ import (
1212
1313// ApplyChanges applies a given set of changes in a given zone.
1414func (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.
8850func (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