88 "os"
99 "os/exec"
1010 "sync"
11+ "time"
1112
1213 "go.uber.org/zap"
1314 networkingv1 "k8s.io/api/networking/v1"
@@ -16,6 +17,7 @@ import (
1617
1718 adctypes "github.com/api7/api7-ingress-controller/api/adc"
1819 "github.com/api7/api7-ingress-controller/api/v1alpha1"
20+ "github.com/api7/api7-ingress-controller/internal/controller/config"
1921 "github.com/api7/api7-ingress-controller/internal/controller/label"
2022 "github.com/api7/api7-ingress-controller/internal/provider"
2123 "github.com/api7/api7-ingress-controller/internal/provider/adc/translator"
@@ -38,6 +40,8 @@ type adcClient struct {
3840 configs map [provider.ResourceKind ]adcConfig
3941 // httproute/consumer/ingress/gateway -> gateway/ingressclass
4042 parentRefs map [provider.ResourceKind ][]provider.ResourceKind
43+
44+ syncTimeout time.Duration
4145}
4246
4347type Task struct {
@@ -50,9 +54,10 @@ type Task struct {
5054
5155func New () (provider.Provider , error ) {
5256 return & adcClient {
53- translator : & translator.Translator {},
54- configs : make (map [provider.ResourceKind ]adcConfig ),
55- parentRefs : make (map [provider.ResourceKind ][]provider.ResourceKind ),
57+ syncTimeout : config .ControllerConfig .ExecADCTimeout .Duration ,
58+ translator : & translator.Translator {},
59+ configs : make (map [provider.ResourceKind ]adcConfig ),
60+ parentRefs : make (map [provider.ResourceKind ][]provider.ResourceKind ),
5661 }, nil
5762}
5863
@@ -101,7 +106,7 @@ func (d *adcClient) Update(ctx context.Context, tctx *provider.TranslateContext,
101106
102107 // sync delete
103108 if len (deleteConfigs ) > 0 {
104- err = d .sync (Task {
109+ err = d .sync (ctx , Task {
105110 Name : obj .GetName (),
106111 Labels : label .GenLabel (obj ),
107112 ResourceTypes : resourceTypes ,
@@ -113,7 +118,7 @@ func (d *adcClient) Update(ctx context.Context, tctx *provider.TranslateContext,
113118 }
114119
115120 // sync update
116- err = d .sync (Task {
121+ err = d .sync (ctx , Task {
117122 Name : obj .GetName (),
118123 Labels : label .GenLabel (obj ),
119124 Resources : adctypes.Resources {
@@ -160,7 +165,7 @@ func (d *adcClient) Delete(ctx context.Context, obj client.Object) error {
160165
161166 configs := d .getConfigs (rk )
162167
163- err := d .sync (Task {
168+ err := d .sync (ctx , Task {
164169 Name : obj .GetName (),
165170 Labels : labels ,
166171 ResourceTypes : resourceTypes ,
@@ -174,7 +179,7 @@ func (d *adcClient) Delete(ctx context.Context, obj client.Object) error {
174179 return nil
175180}
176181
177- func (d * adcClient ) sync (task Task ) error {
182+ func (d * adcClient ) sync (ctx context. Context , task Task ) error {
178183 log .Debugw ("syncing resources" , zap .Any ("task" , task ))
179184
180185 if len (task .configs ) == 0 {
@@ -216,15 +221,17 @@ func (d *adcClient) sync(task Task) error {
216221
217222 log .Debugw ("syncing resources with multiple configs" , zap .Any ("configs" , task .configs ))
218223 for _ , config := range task .configs {
219- if err := d .execADC (config , args ); err != nil {
224+ if err := d .execADC (ctx , config , args ); err != nil {
220225 return err
221226 }
222227 }
223228
224229 return nil
225230}
226231
227- func (d * adcClient ) execADC (config adcConfig , args []string ) error {
232+ func (d * adcClient ) execADC (ctx context.Context , config adcConfig , args []string ) error {
233+ ctxWithTimeout , cancel := context .WithTimeout (ctx , d .syncTimeout )
234+ defer cancel ()
228235 // todo: use adc config
229236 serverAddr := d .ServerAddr
230237 if config .ServerAddr != "" {
@@ -244,7 +251,7 @@ func (d *adcClient) execADC(config adcConfig, args []string) error {
244251 }
245252
246253 var stdout , stderr bytes.Buffer
247- cmd := exec .Command ( "adc" , args ... )
254+ cmd := exec .CommandContext ( ctxWithTimeout , "adc" , args ... )
248255 cmd .Stdout = & stdout
249256 cmd .Stderr = & stderr
250257 cmd .Env = append (cmd .Env , os .Environ ()... )
0 commit comments