77 "errors"
88 "os"
99 "os/exec"
10+ "slices"
1011 "sync"
1112
1213 "go.uber.org/zap"
@@ -147,36 +148,50 @@ func (d *adcClient) Update(ctx context.Context, tctx *provider.TranslateContext,
147148 err error
148149 )
149150
151+ rk := ResourceKind {
152+ Kind : obj .GetObjectKind ().GroupVersionKind ().Kind ,
153+ Namespace : obj .GetNamespace (),
154+ Name : obj .GetName (),
155+ }
150156 switch t := obj .(type ) {
151157 case * gatewayv1.HTTPRoute :
152- result , err = d .translator .TranslateHTTPRoute (tctx , t .DeepCopy ())
158+ if result , err = d .translator .TranslateHTTPRoute (tctx , t .DeepCopy ()); err != nil {
159+ return err
160+ }
153161 resourceTypes = append (resourceTypes , "service" )
162+ // delete http route if old configs diff with new configs exist
163+ if err = d .DeleteHTTPRoute (ctx , tctx , t .DeepCopy ()); err != nil {
164+ return err
165+ }
154166 case * gatewayv1.Gateway :
155- result , err = d .translator .TranslateGateway (tctx , t .DeepCopy ())
167+ if result , err = d .translator .TranslateGateway (tctx , t .DeepCopy ()); err != nil {
168+ return err
169+ }
156170 resourceTypes = append (resourceTypes , "global_rule" , "ssl" , "plugin_metadata" )
171+ if err = d .updateConfigs (rk , tctx ); err != nil {
172+ return err
173+ }
157174 case * networkingv1.Ingress :
158- result , err = d .translator .TranslateIngress (tctx , t .DeepCopy ())
175+ if result , err = d .translator .TranslateIngress (tctx , t .DeepCopy ()); err != nil {
176+ return err
177+ }
159178 resourceTypes = append (resourceTypes , "service" , "ssl" )
179+ if err = d .updateConfigs (rk , tctx ); err != nil {
180+ return err
181+ }
160182 case * v1alpha1.Consumer :
161- result , err = d .translator .TranslateConsumerV1alpha1 (tctx , t .DeepCopy ())
183+ if result , err = d .translator .TranslateConsumerV1alpha1 (tctx , t .DeepCopy ()); err != nil {
184+ return err
185+ }
162186 resourceTypes = append (resourceTypes , "consumer" )
163- }
164- if err != nil {
165- return err
187+ if err = d . updateConfigs ( rk , tctx ); err != nil {
188+ return err
189+ }
166190 }
167191 if result == nil {
168192 return nil
169193 }
170194
171- // update adc configs
172- rk := ResourceKind {
173- Kind : obj .GetObjectKind ().GroupVersionKind ().Kind ,
174- Namespace : obj .GetNamespace (),
175- Name : obj .GetName (),
176- }
177- if err := d .updateConfigs (rk , tctx ); err != nil {
178- return err
179- }
180195 configs := d .getConfigs (rk )
181196
182197 return d .sync (Task {
@@ -194,6 +209,48 @@ func (d *adcClient) Update(ctx context.Context, tctx *provider.TranslateContext,
194209 })
195210}
196211
212+ func (d * adcClient ) DeleteHTTPRoute (ctx context.Context , tctx * provider.TranslateContext , obj client.Object ) error {
213+ // diff adc configs
214+ rk := ResourceKind {
215+ Kind : obj .GetObjectKind ().GroupVersionKind ().Kind ,
216+ Namespace : obj .GetNamespace (),
217+ Name : obj .GetName (),
218+ }
219+
220+ oldConfigs := d .getConfigs (rk )
221+ err := d .updateConfigs (rk , tctx )
222+ if err != nil {
223+ return err
224+ }
225+ newConfigs := d .getConfigs (rk )
226+
227+ // diff old configs and new configs
228+ var deleteConfigs []adcConfig
229+ for _ , config := range oldConfigs {
230+ if ! slices .ContainsFunc (newConfigs , func (c adcConfig ) bool {
231+ return c .ServerAddr == config .ServerAddr && c .Token == config .Token
232+ }) {
233+ deleteConfigs = append (deleteConfigs , config )
234+ }
235+ }
236+
237+ if len (deleteConfigs ) > 0 {
238+ log .Debugw ("http route delete configs" , zap .Any ("configs" , deleteConfigs ))
239+ // sync old delete
240+ err = d .sync (Task {
241+ Name : obj .GetName (),
242+ Labels : label .GenLabel (obj ),
243+ ResourceTypes : []string {"service" },
244+ configs : deleteConfigs ,
245+ })
246+ if err != nil {
247+ return err
248+ }
249+ }
250+
251+ return nil
252+ }
253+
197254func (d * adcClient ) Delete (ctx context.Context , obj client.Object ) error {
198255 log .Debugw ("deleting object" , zap .Any ("object" , obj ))
199256
0 commit comments