Fixing daemonset checking Pods in wrong namespace and small refactoring

This commit is contained in:
PiotrProkop 2017-09-27 17:33:06 +02:00
parent 2590d0c013
commit a6473109f1
5 changed files with 42 additions and 29 deletions

View File

@ -28,7 +28,7 @@ Kubernetes-entrypoint introduces a wide variety of dependencies which can be use
## Latest features ## 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: For instance:
` `

View File

@ -58,19 +58,20 @@ func (d Daemonset) IsResolved(entrypoint entry.EntrypointInterface) (bool, error
label := labels.SelectorFromSet(daemonset.Spec.Selector.MatchLabels) label := labels.SelectorFromSet(daemonset.Spec.Selector.MatchLabels)
opts := api.ListOptions{LabelSelector: label} 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 { if err != nil {
return false, err 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 { if err != nil {
return false, fmt.Errorf("Getting POD: %v failed : %v", myPodName, err) return false, fmt.Errorf("Getting POD: %v failed : %v", myPodName, err)
} }
myHost := myPod.Status.HostIP myHost := myPod.Status.HostIP
for _, pod := range pods.Items { for _, pod := range daemonsetPods.Items {
if !isPodOnHost(&pod, myHost) { if !isPodOnHost(&pod, myHost) {
continue continue
} }

View File

@ -13,7 +13,7 @@ import (
const ( const (
podEnvVariableValue = "podlist" podEnvVariableValue = "podlist"
daemonsetNamespace = "namespace1" daemonsetNamespace = "test"
) )
var testEntrypoint entrypoint.EntrypointInterface 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() { It(fmt.Sprintf("creates new daemonset with %s set and checks its name", PodNameEnvVar), func() {
daemonset, err := NewDaemonset(mocks.SucceedingDaemonsetName, daemonsetNamespace) daemonset, err := NewDaemonset(mocks.SucceedingDaemonsetName, daemonsetNamespace)
Expect(daemonset).NotTo(Equal(nil)) Expect(daemonset).NotTo(BeNil())
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
Expect(daemonset.name).To(Equal(mocks.SucceedingDaemonsetName)) Expect(daemonset.name).To(Equal(mocks.SucceedingDaemonsetName))
@ -48,7 +48,7 @@ var _ = Describe("Daemonset", func() {
isResolved, err := daemonset.IsResolved(testEntrypoint) isResolved, err := daemonset.IsResolved(testEntrypoint)
Expect(isResolved).To(Equal(true)) Expect(isResolved).To(BeTrue())
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
@ -57,7 +57,7 @@ var _ = Describe("Daemonset", func() {
isResolved, err := daemonset.IsResolved(testEntrypoint) isResolved, err := daemonset.IsResolved(testEntrypoint)
Expect(isResolved).To(Equal(false)) Expect(isResolved).To(BeFalse())
Expect(err).To(HaveOccurred()) Expect(err).To(HaveOccurred())
}) })
@ -66,7 +66,7 @@ var _ = Describe("Daemonset", func() {
isResolved, err := daemonset.IsResolved(testEntrypoint) isResolved, err := daemonset.IsResolved(testEntrypoint)
Expect(isResolved).To(Equal(false)) Expect(isResolved).To(BeFalse())
Expect(err).To(HaveOccurred()) Expect(err).To(HaveOccurred())
}) })
@ -77,7 +77,7 @@ var _ = Describe("Daemonset", func() {
isResolved, err := daemonset.IsResolved(testEntrypoint) isResolved, err := daemonset.IsResolved(testEntrypoint)
Expect(isResolved).To(Equal(false)) Expect(isResolved).To(BeFalse())
Expect(err).To(HaveOccurred()) Expect(err).To(HaveOccurred())
}) })
@ -86,32 +86,46 @@ var _ = Describe("Daemonset", func() {
isResolved, err := daemonset.IsResolved(testEntrypoint) isResolved, err := daemonset.IsResolved(testEntrypoint)
Expect(isResolved).To(Equal(false)) Expect(isResolved).To(BeFalse())
Expect(err).To(HaveOccurred()) Expect(err).To(HaveOccurred())
}) })
It("checks resolution of a correct daemonset namespace", func() { 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()) Expect(err).NotTo(HaveOccurred())
isResolved, err := daemonset.IsResolved(testEntrypoint) isResolved, err := daemonset.IsResolved(testEntrypoint)
Expect(isResolved).To(Equal(true)) Expect(isResolved).To(BeTrue())
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
}) })
It("checks resolution of an incorrect daemonset namespace", func() { 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()) Expect(err).NotTo(HaveOccurred())
isResolved, err := daemonset.IsResolved(testEntrypoint) isResolved, err := daemonset.IsResolved(testEntrypoint)
Expect(isResolved).To(Equal(false)) Expect(isResolved).To(BeFalse())
Expect(err).To(HaveOccurred()) 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)
})
}) })

View File

@ -14,11 +14,16 @@ type dClient struct {
} }
const ( const (
SucceedingDaemonsetName = "DAEMONSET_SUCCEED" SucceedingDaemonsetName = "DAEMONSET_SUCCEED"
FailingDaemonsetName = "DAEMONSET_FAIL" FailingDaemonsetName = "DAEMONSET_FAIL"
CorrectNamespaceDaemonsetName = "CORRECT_DAEMONSET_NAMESPACE"
IncorrectNamespaceDaemonsetName = "INCORRECT_DAEMONSET_NAMESPACE"
CorrectDaemonsetNamespace = "CORRECT_DAEMONSET"
IncorrectMatchLabelsDaemonsetName = "DAEMONSET_INCORRECT_MATCH_LABELS" IncorrectMatchLabelsDaemonsetName = "DAEMONSET_INCORRECT_MATCH_LABELS"
NotReadyMatchLabelsDaemonsetName = "DAEMONSET_NOT_READY_MATCH_LABELS" NotReadyMatchLabelsDaemonsetName = "DAEMONSET_NOT_READY_MATCH_LABELS"
IncorrectMatchLabel = "INCORRECT"
NotReadyMatchLabel = "INCORRECT"
) )
func (d dClient) Get(name string) (*extensions.DaemonSet, error) { 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 { if name == CorrectNamespaceDaemonsetName {
ds.ObjectMeta.Namespace = CorrectDaemonset ds.ObjectMeta.Namespace = CorrectDaemonsetNamespace
} else if name == IncorrectDaemonsetNamespace { } else if name == IncorrectNamespaceDaemonsetName {
return nil, fmt.Errorf("Mock daemonset didnt work") return nil, fmt.Errorf("Mock daemonset didnt work")
} }

View File

@ -19,13 +19,6 @@ type pClient struct {
const ( const (
PodNotPresent = "NOT_PRESENT" PodNotPresent = "NOT_PRESENT"
PodEnvVariableValue = "podlist" 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) { func (p pClient) Get(name string) (*v1.Pod, error) {