@@ -265,7 +265,7 @@ func (p *NginxProvisioner) provisionNginx(
265265 p .store .registerResourceInGatewayConfig (client .ObjectKeyFromObject (gateway ), obj )
266266 }
267267
268- // if agent configmap was updated, then we'll need to restart the deployment
268+ // if agent configmap was updated, then we'll need to restart the deployment/daemonset
269269 if agentConfigMapUpdated && ! deploymentCreated {
270270 updateCtx , cancel := context .WithTimeout (ctx , 30 * time .Second )
271271 defer cancel ()
@@ -286,7 +286,7 @@ func (p *NginxProvisioner) provisionNginx(
286286 }
287287
288288 p .cfg .Logger .V (1 ).Info (
289- "Restarting nginx deployment after agent configmap update" ,
289+ "Restarting nginx after agent configmap update" ,
290290 "name" , object .GetName (),
291291 "namespace" , object .GetNamespace (),
292292 )
@@ -296,7 +296,7 @@ func (p *NginxProvisioner) provisionNginx(
296296 object ,
297297 corev1 .EventTypeWarning ,
298298 "RestartFailed" ,
299- "Failed to restart nginx deployment after agent config update: %s" ,
299+ "Failed to restart nginx after agent config update: %s" ,
300300 err .Error (),
301301 )
302302 return err
@@ -361,11 +361,11 @@ func (p *NginxProvisioner) deprovisionNginx(ctx context.Context, gatewayNSName t
361361
362362 objects := p .buildNginxResourceObjectsForDeletion (deploymentNSName )
363363
364- createCtx , cancel := context .WithTimeout (ctx , 30 * time .Second )
364+ deleteCtx , cancel := context .WithTimeout (ctx , 30 * time .Second )
365365 defer cancel ()
366366
367367 for _ , obj := range objects {
368- if err := p .k8sClient .Delete (createCtx , obj ); err != nil && ! apierrors .IsNotFound (err ) {
368+ if err := p .k8sClient .Delete (deleteCtx , obj ); err != nil && ! apierrors .IsNotFound (err ) {
369369 p .cfg .EventRecorder .Eventf (
370370 obj ,
371371 corev1 .EventTypeWarning ,
@@ -384,6 +384,28 @@ func (p *NginxProvisioner) deprovisionNginx(ctx context.Context, gatewayNSName t
384384 return nil
385385}
386386
387+ func (p * NginxProvisioner ) deleteObject (ctx context.Context , obj client.Object ) error {
388+ if ! p .isLeader () {
389+ return nil
390+ }
391+
392+ deleteCtx , cancel := context .WithTimeout (ctx , 10 * time .Second )
393+ defer cancel ()
394+
395+ if err := p .k8sClient .Delete (deleteCtx , obj ); err != nil && ! apierrors .IsNotFound (err ) {
396+ p .cfg .EventRecorder .Eventf (
397+ obj ,
398+ corev1 .EventTypeWarning ,
399+ "DeleteFailed" ,
400+ "Failed to delete nginx resource: %s" ,
401+ err .Error (),
402+ )
403+ return err
404+ }
405+
406+ return nil
407+ }
408+
387409// isUserSecret determines if the provided secret name is a special user secret,
388410// for example an NGINX docker registry secret or NGINX Plus secret.
389411func (p * NginxProvisioner ) isUserSecret (name string ) bool {
@@ -404,25 +426,6 @@ func (p *NginxProvisioner) isUserSecret(name string) bool {
404426 return false
405427}
406428
407- func (p * NginxProvisioner ) deleteSecret (ctx context.Context , secretNSName types.NamespacedName ) error {
408- if ! p .isLeader () {
409- return nil
410- }
411-
412- secret := & corev1.Secret {
413- ObjectMeta : metav1.ObjectMeta {
414- Name : secretNSName .Name ,
415- Namespace : secretNSName .Namespace ,
416- },
417- }
418-
419- if err := p .k8sClient .Delete (ctx , secret ); err != nil && ! apierrors .IsNotFound (err ) {
420- return err
421- }
422-
423- return nil
424- }
425-
426429// RegisterGateway is called by the main event handler when a Gateway API resource event occurs
427430// and the graph is built. The provisioner updates the Gateway config in the store and then:
428431// - If it's a valid Gateway, create or update nginx resources associated with the Gateway, if necessary.
@@ -447,6 +450,20 @@ func (p *NginxProvisioner) RegisterGateway(
447450 p .cfg .Logger .Error (err , "error building some nginx resources" )
448451 }
449452
453+ // If NGINX deployment type switched between Deployment and DaemonSet, clean up the old one.
454+ nginxResources := p .store .getNginxResourcesForGateway (gatewayNSName )
455+ if nginxResources != nil {
456+ if needToDeleteDaemonSet (nginxResources ) {
457+ if err := p .deleteObject (ctx , & appsv1.DaemonSet {ObjectMeta : nginxResources .DaemonSet }); err != nil {
458+ p .cfg .Logger .Error (err , "error deleting nginx resource" )
459+ }
460+ } else if needToDeleteDeployment (nginxResources ) {
461+ if err := p .deleteObject (ctx , & appsv1.Deployment {ObjectMeta : nginxResources .Deployment }); err != nil {
462+ p .cfg .Logger .Error (err , "error deleting nginx resource" )
463+ }
464+ }
465+ }
466+
450467 if err := p .provisionNginx (ctx , resourceName , gateway .Source , objects ); err != nil {
451468 return fmt .Errorf ("error provisioning nginx resources: %w" , err )
452469 }
@@ -458,3 +475,31 @@ func (p *NginxProvisioner) RegisterGateway(
458475
459476 return nil
460477}
478+
479+ func needToDeleteDeployment (cfg * NginxResources ) bool {
480+ if cfg .Deployment .Name != "" {
481+ if cfg .Gateway != nil && cfg .Gateway .EffectiveNginxProxy != nil &&
482+ cfg .Gateway .EffectiveNginxProxy .Kubernetes != nil &&
483+ cfg .Gateway .EffectiveNginxProxy .Kubernetes .DaemonSet != nil {
484+ return true
485+ }
486+ }
487+
488+ return false
489+ }
490+
491+ func needToDeleteDaemonSet (cfg * NginxResources ) bool {
492+ if cfg .DaemonSet .Name != "" && cfg .Gateway != nil {
493+ if cfg .Gateway .EffectiveNginxProxy != nil &&
494+ cfg .Gateway .EffectiveNginxProxy .Kubernetes != nil &&
495+ cfg .Gateway .EffectiveNginxProxy .Kubernetes .Deployment != nil {
496+ return true
497+ } else if cfg .Gateway .EffectiveNginxProxy == nil ||
498+ cfg .Gateway .EffectiveNginxProxy .Kubernetes == nil ||
499+ cfg .Gateway .EffectiveNginxProxy .Kubernetes .DaemonSet == nil {
500+ return true
501+ }
502+ }
503+
504+ return false
505+ }
0 commit comments