@@ -265,7 +265,7 @@ func (p *NginxProvisioner) provisionNginx(
265
265
p .store .registerResourceInGatewayConfig (client .ObjectKeyFromObject (gateway ), obj )
266
266
}
267
267
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
269
269
if agentConfigMapUpdated && ! deploymentCreated {
270
270
updateCtx , cancel := context .WithTimeout (ctx , 30 * time .Second )
271
271
defer cancel ()
@@ -286,7 +286,7 @@ func (p *NginxProvisioner) provisionNginx(
286
286
}
287
287
288
288
p .cfg .Logger .V (1 ).Info (
289
- "Restarting nginx deployment after agent configmap update" ,
289
+ "Restarting nginx after agent configmap update" ,
290
290
"name" , object .GetName (),
291
291
"namespace" , object .GetNamespace (),
292
292
)
@@ -296,7 +296,7 @@ func (p *NginxProvisioner) provisionNginx(
296
296
object ,
297
297
corev1 .EventTypeWarning ,
298
298
"RestartFailed" ,
299
- "Failed to restart nginx deployment after agent config update: %s" ,
299
+ "Failed to restart nginx after agent config update: %s" ,
300
300
err .Error (),
301
301
)
302
302
return err
@@ -361,11 +361,11 @@ func (p *NginxProvisioner) deprovisionNginx(ctx context.Context, gatewayNSName t
361
361
362
362
objects := p .buildNginxResourceObjectsForDeletion (deploymentNSName )
363
363
364
- createCtx , cancel := context .WithTimeout (ctx , 30 * time .Second )
364
+ deleteCtx , cancel := context .WithTimeout (ctx , 30 * time .Second )
365
365
defer cancel ()
366
366
367
367
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 ) {
369
369
p .cfg .EventRecorder .Eventf (
370
370
obj ,
371
371
corev1 .EventTypeWarning ,
@@ -384,6 +384,28 @@ func (p *NginxProvisioner) deprovisionNginx(ctx context.Context, gatewayNSName t
384
384
return nil
385
385
}
386
386
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
+
387
409
// isUserSecret determines if the provided secret name is a special user secret,
388
410
// for example an NGINX docker registry secret or NGINX Plus secret.
389
411
func (p * NginxProvisioner ) isUserSecret (name string ) bool {
@@ -404,25 +426,6 @@ func (p *NginxProvisioner) isUserSecret(name string) bool {
404
426
return false
405
427
}
406
428
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
-
426
429
// RegisterGateway is called by the main event handler when a Gateway API resource event occurs
427
430
// and the graph is built. The provisioner updates the Gateway config in the store and then:
428
431
// - 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(
447
450
p .cfg .Logger .Error (err , "error building some nginx resources" )
448
451
}
449
452
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
+
450
467
if err := p .provisionNginx (ctx , resourceName , gateway .Source , objects ); err != nil {
451
468
return fmt .Errorf ("error provisioning nginx resources: %w" , err )
452
469
}
@@ -458,3 +475,31 @@ func (p *NginxProvisioner) RegisterGateway(
458
475
459
476
return nil
460
477
}
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