diff --git a/.gitignore b/.gitignore index e021a935f..5d83082b0 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ Dockerfile.cross # Output of the go coverage tool, specifically when used with LiteIDE *.out +cover.html # Go workspace file go.work diff --git a/internal/controller/core/acl_controller_test.go b/internal/controller/core/acl_controller_test.go index dda2bd847..0b27e57f0 100644 --- a/internal/controller/core/acl_controller_test.go +++ b/internal/controller/core/acl_controller_test.go @@ -8,6 +8,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -79,6 +80,12 @@ var _ = Describe("AccessControlList Controller", func() { By("Cleanup the specific resource instance AccessControlList") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for AccessControlList to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.AccessControlList{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/banner_controller_test.go b/internal/controller/core/banner_controller_test.go index 0a944ce95..b3bf1a5bf 100644 --- a/internal/controller/core/banner_controller_test.go +++ b/internal/controller/core/banner_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -46,6 +47,12 @@ var _ = Describe("Banner Controller", func() { By("Cleanup the specific resource instance Banner") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for Banner to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.Banner{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/bgp_peer_controller_test.go b/internal/controller/core/bgp_peer_controller_test.go index df8588957..9ab3857ba 100644 --- a/internal/controller/core/bgp_peer_controller_test.go +++ b/internal/controller/core/bgp_peer_controller_test.go @@ -263,6 +263,14 @@ var _ = Describe("BGPPeer Controller", func() { Expect(k8sClient.Delete(ctx, bgppeer)).To(Succeed()) }) + By("Waiting for BGPPeer's condition to be fully consistent") + Eventually(func(g Gomega) { + resource := &v1alpha1.BGPPeer{} + g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(bgppeer), resource)).To(Succeed()) + g.Expect(resource.Status.Conditions).NotTo(BeEmpty()) + g.Expect(conditions.IsConfigured(resource)).To(BeFalse()) // checks ObservedGeneration too + }).Should(Succeed()) + By("Verifying the controller sets Interface not found status") Eventually(func(g Gomega) { resource := &v1alpha1.BGPPeer{} @@ -514,6 +522,14 @@ var _ = Describe("BGPPeer Controller", func() { }).Should(Succeed()) }) + By("Waiting for BGPPeer's condition to be fully consistent") + Eventually(func(g Gomega) { + resource := &v1alpha1.BGPPeer{} + g.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(bgppeer), resource)).To(Succeed()) + g.Expect(resource.Status.Conditions).NotTo(BeEmpty()) + g.Expect(conditions.IsConfigured(resource)).To(BeFalse()) // checks ObservedGeneration too + }).Should(Succeed()) + By("Verifying the controller sets Configured=False with appropriate reason") Eventually(func(g Gomega) { resource := &v1alpha1.BGPPeer{} diff --git a/internal/controller/core/certificate_controller_test.go b/internal/controller/core/certificate_controller_test.go index 8d345b18f..e881a92f9 100644 --- a/internal/controller/core/certificate_controller_test.go +++ b/internal/controller/core/certificate_controller_test.go @@ -17,6 +17,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -88,6 +89,12 @@ var _ = Describe("Certificate Controller", func() { By("Cleanup the specific resource instance Certificate") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for Certificate to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.Certificate{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/dhcprelay_controller_test.go b/internal/controller/core/dhcprelay_controller_test.go index e440f1b03..091358b1f 100644 --- a/internal/controller/core/dhcprelay_controller_test.go +++ b/internal/controller/core/dhcprelay_controller_test.go @@ -1075,12 +1075,20 @@ var _ = Describe("DHCPRelay Controller", func() { err = k8sClient.Get(ctx, interfaceKey, intf) if err == nil { Expect(k8sClient.Delete(ctx, intf)).To(Succeed()) + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, interfaceKey, &v1alpha1.Interface{}) + g.Expect(errors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) } By("Cleaning up the VLAN resource") err = k8sClient.Get(ctx, vlanKey, vlan) if err == nil { Expect(k8sClient.Delete(ctx, vlan)).To(Succeed()) + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, vlanKey, &v1alpha1.VLAN{}) + g.Expect(errors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) } By("Cleaning up the Device resource") diff --git a/internal/controller/core/dns_controller_test.go b/internal/controller/core/dns_controller_test.go index 13fa24508..3220e68b0 100644 --- a/internal/controller/core/dns_controller_test.go +++ b/internal/controller/core/dns_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -65,6 +66,12 @@ var _ = Describe("DNS Controller", func() { By("Cleanup the specific resource instance DNS") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for DNS to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.DNS{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/isis_controller_test.go b/internal/controller/core/isis_controller_test.go index 3331cf3eb..d5ca496b1 100644 --- a/internal/controller/core/isis_controller_test.go +++ b/internal/controller/core/isis_controller_test.go @@ -5,6 +5,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -66,6 +67,12 @@ var _ = Describe("ISIS Controller", func() { By("Cleanup the specific resource instance ISIS") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for ISIS to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.ISIS{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/lldp_controller_test.go b/internal/controller/core/lldp_controller_test.go index f47e833da..4596b6f75 100644 --- a/internal/controller/core/lldp_controller_test.go +++ b/internal/controller/core/lldp_controller_test.go @@ -406,6 +406,15 @@ var _ = Describe("LLDP Controller", func() { g.Expect(k8sClient.Update(ctx, device)).To(Succeed()) }).Should(Succeed()) + By("Waiting for LLDP to acknowledge the pause") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, resourceKey, lldp) + g.Expect(err).NotTo(HaveOccurred()) + cond := meta.FindStatusCondition(lldp.Status.Conditions, v1alpha1.PausedCondition) + g.Expect(cond).ToNot(BeNil()) + g.Expect(cond.Status).To(Equal(metav1.ConditionTrue)) + }).Should(Succeed()) + By("Updating LLDP AdminState to Down") Eventually(func(g Gomega) { err := k8sClient.Get(ctx, resourceKey, lldp) diff --git a/internal/controller/core/managementaccess_controller_test.go b/internal/controller/core/managementaccess_controller_test.go index bc52d7479..e2ba33d68 100644 --- a/internal/controller/core/managementaccess_controller_test.go +++ b/internal/controller/core/managementaccess_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -63,6 +64,12 @@ var _ = Describe("ManagementAccess Controller", func() { By("Cleanup the specific resource instance ManagementAccess") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for ManagementAccess to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.ManagementAccess{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/ntp_controller_test.go b/internal/controller/core/ntp_controller_test.go index c51dab2bb..5a6d937ac 100644 --- a/internal/controller/core/ntp_controller_test.go +++ b/internal/controller/core/ntp_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -66,6 +67,12 @@ var _ = Describe("NTP Controller", func() { By("Cleanup the specific resource instance NTP") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for NTP to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.NTP{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/ospf_controller_test.go b/internal/controller/core/ospf_controller_test.go index 183991695..b7c28aa9e 100644 --- a/internal/controller/core/ospf_controller_test.go +++ b/internal/controller/core/ospf_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -61,6 +62,12 @@ var _ = Describe("OSPF Controller", func() { By("Cleanup the specific resource instance OSPF") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for OSPF to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.OSPF{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/pim_controller_test.go b/internal/controller/core/pim_controller_test.go index 241796bf7..f9e74ccbc 100644 --- a/internal/controller/core/pim_controller_test.go +++ b/internal/controller/core/pim_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -59,6 +60,12 @@ var _ = Describe("PIM Controller", func() { By("Cleanup the specific resource instance PIM") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for PIM to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.PIM{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/prefixset_controller_test.go b/internal/controller/core/prefixset_controller_test.go index 5560d2af0..f238e8b2d 100644 --- a/internal/controller/core/prefixset_controller_test.go +++ b/internal/controller/core/prefixset_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -70,6 +71,12 @@ var _ = Describe("PrefixSet Controller", func() { By("Cleanup the specific resource instance PrefixSet") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for PrefixSet to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.PrefixSet{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/snmp_controller_test.go b/internal/controller/core/snmp_controller_test.go index 8a32f1f49..f68f8939e 100644 --- a/internal/controller/core/snmp_controller_test.go +++ b/internal/controller/core/snmp_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -77,6 +78,12 @@ var _ = Describe("SNMP Controller", func() { By("Cleanup the specific resource instance SNMP") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for SNMP to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.SNMP{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/suite_test.go b/internal/controller/core/suite_test.go index 78443d627..3afb96ba8 100644 --- a/internal/controller/core/suite_test.go +++ b/internal/controller/core/suite_test.go @@ -342,11 +342,12 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) err = (&EthernetSegmentReconciler{ - Client: k8sManager.GetClient(), - Scheme: k8sManager.GetScheme(), - Recorder: recorder, - Provider: prov, - Locker: testLocker, + Client: k8sManager.GetClient(), + Scheme: k8sManager.GetScheme(), + Recorder: recorder, + Provider: prov, + Locker: testLocker, + RequeueInterval: time.Second, }).SetupWithManager(ctx, k8sManager) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/syslog_controller_test.go b/internal/controller/core/syslog_controller_test.go index fc16816b0..c763424c1 100644 --- a/internal/controller/core/syslog_controller_test.go +++ b/internal/controller/core/syslog_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -72,6 +73,12 @@ var _ = Describe("Syslog Controller", func() { By("Cleanup the specific resource instance Syslog") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for Syslog to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.Syslog{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/user_controller_test.go b/internal/controller/core/user_controller_test.go index 308660ea1..f783c7a51 100644 --- a/internal/controller/core/user_controller_test.go +++ b/internal/controller/core/user_controller_test.go @@ -7,6 +7,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -82,6 +83,12 @@ var _ = Describe("User Controller", func() { By("Cleanup the specific resource instance User") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for User to be fully deleted") + Eventually(func(g Gomega) { + err := k8sClient.Get(ctx, key, &v1alpha1.User{}) + g.Expect(apierrors.IsNotFound(err)).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred()) diff --git a/internal/controller/core/vlan_controller_test.go b/internal/controller/core/vlan_controller_test.go index 51a078a48..cb1ade5c6 100644 --- a/internal/controller/core/vlan_controller_test.go +++ b/internal/controller/core/vlan_controller_test.go @@ -6,6 +6,7 @@ package core import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -62,6 +63,12 @@ var _ = Describe("VLAN Controller", func() { By("Cleanup the specific resource instance VLAN") Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + By("Waiting for the VLAN to be fully deleted") + Eventually(func(g Gomega) { + vlan := &v1alpha1.VLAN{} + g.Expect(apierrors.IsNotFound(k8sClient.Get(ctx, key, vlan))).To(BeTrue()) + }).Should(Succeed()) + resource = &v1alpha1.Device{} err = k8sClient.Get(ctx, key, resource) Expect(err).NotTo(HaveOccurred())