From 59cbf0654d87419830c3bdcf84d54fa384d0de05 Mon Sep 17 00:00:00 2001 From: Nick Santos Date: Mon, 19 Jul 2021 11:20:43 -0400 Subject: [PATCH] controllers: fix an idempotency bug in the portforward manager (#4771) --- .../core/kubernetesdiscovery/portforwards.go | 2 +- .../kubernetesdiscovery/portforwards_test.go | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/internal/controllers/core/kubernetesdiscovery/portforwards.go b/internal/controllers/core/kubernetesdiscovery/portforwards.go index 35d5571360..726e071dbd 100644 --- a/internal/controllers/core/kubernetesdiscovery/portforwards.go +++ b/internal/controllers/core/kubernetesdiscovery/portforwards.go @@ -40,7 +40,7 @@ func (r *Reconciler) manageOwnedPortForwards(ctx context.Context, nn types.Names foundDesired = true // If this PortForward is already in the APIServer, make sure it's up-to-date. - if apicmp.DeepEqual(pf.Spec, existingPF) { + if apicmp.DeepEqual(pf.Spec, existingPF.Spec) { continue } diff --git a/internal/controllers/core/kubernetesdiscovery/portforwards_test.go b/internal/controllers/core/kubernetesdiscovery/portforwards_test.go index 8ca3442e29..f989d76739 100644 --- a/internal/controllers/core/kubernetesdiscovery/portforwards_test.go +++ b/internal/controllers/core/kubernetesdiscovery/portforwards_test.go @@ -59,6 +59,47 @@ func TestPortForwardCreateAndUpdate(t *testing.T) { assert.Equal(t, 4001, int(pf.Spec.Forwards[0].LocalPort)) } +func TestPortForwardIdempotent(t *testing.T) { + f := newFixture(t) + + pod := f.buildPod("pod-ns", "pod", nil, nil) + key := types.NamespacedName{Name: "kd"} + kd := &v1alpha1.KubernetesDiscovery{ + ObjectMeta: metav1.ObjectMeta{Name: "kd"}, + Spec: v1alpha1.KubernetesDiscoverySpec{ + Watches: []v1alpha1.KubernetesWatchRef{ + { + UID: string(pod.UID), + Namespace: pod.Namespace, + Name: pod.Name, + }, + }, + PortForwardTemplateSpec: &v1alpha1.PortForwardTemplateSpec{ + Forwards: []v1alpha1.Forward{ + v1alpha1.Forward{LocalPort: 4000, ContainerPort: 4000}, + }, + }, + }, + } + + f.Create(kd) + f.kClient.UpsertPod(pod) + f.requireObservedPods(key, ancestorMap{pod.UID: pod.UID}) + + // Simulate the reconcile (which would normally be invoked by the manager on status update). + f.MustReconcile(key) + + var pf1 v1alpha1.PortForward + f.MustGet(types.NamespacedName{Name: "kd-pod"}, &pf1) + + f.MustReconcile(key) + + var pf2 v1alpha1.PortForward + f.MustGet(types.NamespacedName{Name: "kd-pod"}, &pf2) + + assert.Equal(t, pf1.ObjectMeta, pf2.ObjectMeta) +} + func TestPortForwardCreateAndDelete(t *testing.T) { f := newFixture(t)