From a6473109f198df843a1e43b3ae6f38a8ea9000cd Mon Sep 17 00:00:00 2001 From: PiotrProkop Date: Wed, 27 Sep 2017 17:33:06 +0200 Subject: [PATCH] Fixing daemonset checking Pods in wrong namespace and small refactoring --- README.md | 2 +- dependencies/daemonset/daemonset.go | 7 +++-- dependencies/daemonset/daemonset_test.go | 40 ++++++++++++++++-------- mocks/daemonset.go | 15 ++++++--- mocks/pod.go | 7 ----- 5 files changed, 42 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 4d885db..22f230b 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Kubernetes-entrypoint introduces a wide variety of dependencies which can be use ## Latest features -Extending functionality of kubernetes-entrypoint by adding an ability to specify dependencies in different namespaces. The new format for writing dependencies is `namespace:name`. To ensure backward compatibility if the dependency name is without colon, it behaves just like in previous versions so it esumes that dependecies is running at the same namespace as kubernetes-entrypoint. This feature is not implemented for container, config and socket dependency because in such cases the different namespace is irrelevant. +Extending functionality of kubernetes-entrypoint by adding an ability to specify dependencies in different namespaces. The new format for writing dependencies is `namespace:name`. To ensure backward compatibility if the dependency name is without colon, it behaves just like in previous versions so it assumes that dependecies are running at the same namespace as kubernetes-entrypoint. This feature is not implemented for container, config and socket dependency because in such cases the different namespace is irrelevant. For instance: ` diff --git a/dependencies/daemonset/daemonset.go b/dependencies/daemonset/daemonset.go index 18d0f5d..65d62be 100644 --- a/dependencies/daemonset/daemonset.go +++ b/dependencies/daemonset/daemonset.go @@ -58,19 +58,20 @@ func (d Daemonset) IsResolved(entrypoint entry.EntrypointInterface) (bool, error label := labels.SelectorFromSet(daemonset.Spec.Selector.MatchLabels) opts := api.ListOptions{LabelSelector: label} - pods, err := entrypoint.Client().Pods(d.namespace).List(opts) + + daemonsetPods, err := entrypoint.Client().Pods(d.namespace).List(opts) if err != nil { return false, err } - myPod, err := entrypoint.Client().Pods(d.namespace).Get(d.podName) + myPod, err := entrypoint.Client().Pods(env.GetBaseNamespace()).Get(d.podName) if err != nil { return false, fmt.Errorf("Getting POD: %v failed : %v", myPodName, err) } myHost := myPod.Status.HostIP - for _, pod := range pods.Items { + for _, pod := range daemonsetPods.Items { if !isPodOnHost(&pod, myHost) { continue } diff --git a/dependencies/daemonset/daemonset_test.go b/dependencies/daemonset/daemonset_test.go index c79c756..01a97e1 100644 --- a/dependencies/daemonset/daemonset_test.go +++ b/dependencies/daemonset/daemonset_test.go @@ -13,7 +13,7 @@ import ( const ( podEnvVariableValue = "podlist" - daemonsetNamespace = "namespace1" + daemonsetNamespace = "test" ) var testEntrypoint entrypoint.EntrypointInterface @@ -37,7 +37,7 @@ var _ = Describe("Daemonset", func() { It(fmt.Sprintf("creates new daemonset with %s set and checks its name", PodNameEnvVar), func() { daemonset, err := NewDaemonset(mocks.SucceedingDaemonsetName, daemonsetNamespace) - Expect(daemonset).NotTo(Equal(nil)) + Expect(daemonset).NotTo(BeNil()) Expect(err).NotTo(HaveOccurred()) Expect(daemonset.name).To(Equal(mocks.SucceedingDaemonsetName)) @@ -48,7 +48,7 @@ var _ = Describe("Daemonset", func() { isResolved, err := daemonset.IsResolved(testEntrypoint) - Expect(isResolved).To(Equal(true)) + Expect(isResolved).To(BeTrue()) Expect(err).NotTo(HaveOccurred()) }) @@ -57,7 +57,7 @@ var _ = Describe("Daemonset", func() { isResolved, err := daemonset.IsResolved(testEntrypoint) - Expect(isResolved).To(Equal(false)) + Expect(isResolved).To(BeFalse()) Expect(err).To(HaveOccurred()) }) @@ -66,7 +66,7 @@ var _ = Describe("Daemonset", func() { isResolved, err := daemonset.IsResolved(testEntrypoint) - Expect(isResolved).To(Equal(false)) + Expect(isResolved).To(BeFalse()) Expect(err).To(HaveOccurred()) }) @@ -77,7 +77,7 @@ var _ = Describe("Daemonset", func() { isResolved, err := daemonset.IsResolved(testEntrypoint) - Expect(isResolved).To(Equal(false)) + Expect(isResolved).To(BeFalse()) Expect(err).To(HaveOccurred()) }) @@ -86,32 +86,46 @@ var _ = Describe("Daemonset", func() { isResolved, err := daemonset.IsResolved(testEntrypoint) - Expect(isResolved).To(Equal(false)) + Expect(isResolved).To(BeFalse()) Expect(err).To(HaveOccurred()) }) It("checks resolution of a correct daemonset namespace", func() { - daemonset, err := NewDaemonset(mocks.CorrectDaemonsetNamespace, daemonsetNamespace) + daemonset, err := NewDaemonset(mocks.CorrectNamespaceDaemonsetName, daemonsetNamespace) - Expect(daemonset).NotTo(Equal(nil)) + Expect(daemonset).NotTo(BeNil()) Expect(err).NotTo(HaveOccurred()) isResolved, err := daemonset.IsResolved(testEntrypoint) - Expect(isResolved).To(Equal(true)) + Expect(isResolved).To(BeTrue()) Expect(err).NotTo(HaveOccurred()) }) It("checks resolution of an incorrect daemonset namespace", func() { - daemonset, err := NewDaemonset(mocks.IncorrectDaemonsetNamespace, daemonsetNamespace) + daemonset, err := NewDaemonset(mocks.IncorrectNamespaceDaemonsetName, daemonsetNamespace) - Expect(daemonset).NotTo(Equal(nil)) + Expect(daemonset).NotTo(BeNil()) Expect(err).NotTo(HaveOccurred()) isResolved, err := daemonset.IsResolved(testEntrypoint) - Expect(isResolved).To(Equal(false)) + Expect(isResolved).To(BeFalse()) Expect(err).To(HaveOccurred()) }) + + It("resolve daemonset and entrypoint pod in different namespaces", func() { + daemonset, err := NewDaemonset(mocks.CorrectNamespaceDaemonsetName, mocks.CorrectDaemonsetNamespace) + Expect(err).NotTo(HaveOccurred()) + + err = os.Setenv(PodNameEnvVar, "shouldwork") + Expect(err).NotTo(HaveOccurred()) + + isResolved, err := daemonset.IsResolved(testEntrypoint) + + Expect(err).NotTo(HaveOccurred()) + Expect(isResolved).To(BeTrue()) + err = os.Unsetenv(PodNameEnvVar) + }) }) diff --git a/mocks/daemonset.go b/mocks/daemonset.go index 9b7c833..04d318d 100644 --- a/mocks/daemonset.go +++ b/mocks/daemonset.go @@ -14,11 +14,16 @@ type dClient struct { } const ( - SucceedingDaemonsetName = "DAEMONSET_SUCCEED" - FailingDaemonsetName = "DAEMONSET_FAIL" + SucceedingDaemonsetName = "DAEMONSET_SUCCEED" + FailingDaemonsetName = "DAEMONSET_FAIL" + CorrectNamespaceDaemonsetName = "CORRECT_DAEMONSET_NAMESPACE" + IncorrectNamespaceDaemonsetName = "INCORRECT_DAEMONSET_NAMESPACE" + CorrectDaemonsetNamespace = "CORRECT_DAEMONSET" IncorrectMatchLabelsDaemonsetName = "DAEMONSET_INCORRECT_MATCH_LABELS" NotReadyMatchLabelsDaemonsetName = "DAEMONSET_NOT_READY_MATCH_LABELS" + IncorrectMatchLabel = "INCORRECT" + NotReadyMatchLabel = "INCORRECT" ) func (d dClient) Get(name string) (*extensions.DaemonSet, error) { @@ -41,9 +46,9 @@ func (d dClient) Get(name string) (*extensions.DaemonSet, error) { }, } - if name == CorrectDaemonsetNamespace { - ds.ObjectMeta.Namespace = CorrectDaemonset - } else if name == IncorrectDaemonsetNamespace { + if name == CorrectNamespaceDaemonsetName { + ds.ObjectMeta.Namespace = CorrectDaemonsetNamespace + } else if name == IncorrectNamespaceDaemonsetName { return nil, fmt.Errorf("Mock daemonset didnt work") } diff --git a/mocks/pod.go b/mocks/pod.go index 4dc1f34..3dccdf7 100644 --- a/mocks/pod.go +++ b/mocks/pod.go @@ -19,13 +19,6 @@ type pClient struct { const ( PodNotPresent = "NOT_PRESENT" PodEnvVariableValue = "podlist" - - IncorrectMatchLabel = "INCORRECT" - NotReadyMatchLabel = "INCORRECT" - - CorrectDaemonsetNamespace = "CORRECT_DAEMONSET_NAMESPACE" - IncorrectDaemonsetNamespace = "INCORRECT_DAEMONSET_NAMESPACE" - CorrectDaemonset = "CORRECT_DAEMONSET" ) func (p pClient) Get(name string) (*v1.Pod, error) {