Skip to content

Commit db89660

Browse files
committed
Clean up HPA when necessary
1 parent 4454d49 commit db89660

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

internal/controller/provisioner/provisioner.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"golang.org/x/text/cases"
1313
"golang.org/x/text/language"
1414
appsv1 "k8s.io/api/apps/v1"
15+
autoscalingv2 "k8s.io/api/autoscaling/v2"
1516
corev1 "k8s.io/api/core/v1"
1617
apierrors "k8s.io/apimachinery/pkg/api/errors"
1718
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -487,6 +488,7 @@ func (p *NginxProvisioner) RegisterGateway(
487488
}
488489

489490
// If NGINX deployment type switched between Deployment and DaemonSet, clean up the old one.
491+
// If HPA was disabled, remove it.
490492
nginxResources := p.store.getNginxResourcesForGateway(gatewayNSName)
491493
if nginxResources != nil {
492494
if needToDeleteDaemonSet(nginxResources) {
@@ -498,6 +500,12 @@ func (p *NginxProvisioner) RegisterGateway(
498500
p.cfg.Logger.Error(err, "error deleting nginx resource")
499501
}
500502
}
503+
504+
if needToDeleteHPA(nginxResources) {
505+
if err := p.deleteObject(ctx, &autoscalingv2.HorizontalPodAutoscaler{ObjectMeta: nginxResources.HPA}); err != nil {
506+
p.cfg.Logger.Error(err, "error deleting nginx resource")
507+
}
508+
}
501509
}
502510

503511
if err := p.provisionNginx(ctx, resourceName, gateway.Source, objects); err != nil {
@@ -539,3 +547,18 @@ func needToDeleteDaemonSet(cfg *NginxResources) bool {
539547

540548
return false
541549
}
550+
551+
func needToDeleteHPA(cfg *NginxResources) bool {
552+
if cfg.HPA.Name != "" && cfg.Gateway != nil {
553+
if cfg.Gateway.EffectiveNginxProxy != nil &&
554+
cfg.Gateway.EffectiveNginxProxy.Kubernetes != nil &&
555+
!isAutoscalingEnabled(cfg.Gateway.EffectiveNginxProxy.Kubernetes.Deployment) {
556+
return true
557+
} else if cfg.Gateway.EffectiveNginxProxy == nil ||
558+
cfg.Gateway.EffectiveNginxProxy.Kubernetes == nil {
559+
return true
560+
}
561+
}
562+
563+
return false
564+
}

internal/controller/provisioner/provisioner_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,54 @@ func TestRegisterGateway_CleansUpOldDeploymentOrDaemonSet(t *testing.T) {
422422
g.Expect(err).ToNot(HaveOccurred())
423423
}
424424

425+
func TestRegisterGateway_CleansUpOldHPA(t *testing.T) {
426+
t.Parallel()
427+
g := NewWithT(t)
428+
429+
// Setup: Gateway previously referenced an HPA, but now does not
430+
// Previous state: HPA exists and is tracked
431+
oldHPA := &autoscalingv2.HorizontalPodAutoscaler{
432+
ObjectMeta: metav1.ObjectMeta{
433+
Name: "gw-nginx",
434+
Namespace: "default",
435+
},
436+
}
437+
gateway := &graph.Gateway{
438+
Source: &gatewayv1.Gateway{
439+
ObjectMeta: metav1.ObjectMeta{
440+
Name: "gw",
441+
Namespace: "default",
442+
},
443+
},
444+
Valid: true,
445+
EffectiveNginxProxy: &graph.EffectiveNginxProxy{
446+
Kubernetes: &ngfAPIv1alpha2.KubernetesSpec{
447+
Deployment: &ngfAPIv1alpha2.DeploymentSpec{
448+
Autoscaling: &ngfAPIv1alpha2.HPASpec{
449+
Enable: false,
450+
},
451+
},
452+
},
453+
},
454+
}
455+
456+
provisioner, fakeClient, _ := defaultNginxProvisioner(gateway.Source, oldHPA)
457+
provisioner.store.nginxResources[types.NamespacedName{Name: "gw", Namespace: "default"}] = &NginxResources{
458+
HPA: oldHPA.ObjectMeta,
459+
}
460+
461+
// Simulate update: EffectiveNginxProxy no longer references HPA
462+
g.Expect(provisioner.RegisterGateway(t.Context(), gateway, "gw-nginx")).To(Succeed())
463+
464+
// HPA should be deleted
465+
hpaErr := fakeClient.Get(
466+
t.Context(),
467+
types.NamespacedName{Name: "gw-nginx", Namespace: "default"},
468+
&autoscalingv2.HorizontalPodAutoscaler{},
469+
)
470+
g.Expect(hpaErr).To(HaveOccurred())
471+
}
472+
425473
func TestNonLeaderProvisioner(t *testing.T) {
426474
t.Parallel()
427475
g := NewWithT(t)

0 commit comments

Comments
 (0)