From 2c76c55bb996e3510185a9649e9131b280ab38d1 Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Mon, 12 Oct 2015 16:28:23 -0700 Subject: [PATCH] kubelet: move PodManager and MirrorClient to a subpackage This change moves pod_manager.go and mirror_client.go to a separate package. Also made necessary, minor changes to facilitate testing. --- pkg/kubelet/kubelet.go | 15 +++-- pkg/kubelet/kubelet_test.go | 7 +- .../fake_mirror_client.go} | 64 +++++-------------- .../{pod_manager.go => pod/manager.go} | 61 +++++++++--------- .../manager_test.go} | 13 ++-- pkg/kubelet/{ => pod}/mirror_client.go | 25 ++------ pkg/kubelet/pod/mirror_client_test.go | 54 ++++++++++++++++ pkg/kubelet/runonce_test.go | 4 +- pkg/kubelet/types/pod_update.go | 10 +++ pkg/kubelet/util.go | 7 +- 10 files changed, 140 insertions(+), 120 deletions(-) rename pkg/kubelet/{mirror_client_test.go => pod/fake_mirror_client.go} (55%) rename pkg/kubelet/{pod_manager.go => pod/manager.go} (80%) rename pkg/kubelet/{pod_manager_test.go => pod/manager_test.go} (91%) rename pkg/kubelet/{ => pod}/mirror_client.go (82%) create mode 100644 pkg/kubelet/pod/mirror_client_test.go diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index a3733cd62d1..f10bc983c07 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -52,6 +52,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/envvars" "k8s.io/kubernetes/pkg/kubelet/metrics" "k8s.io/kubernetes/pkg/kubelet/network" + kubepod "k8s.io/kubernetes/pkg/kubelet/pod" "k8s.io/kubernetes/pkg/kubelet/prober" "k8s.io/kubernetes/pkg/kubelet/rkt" "k8s.io/kubernetes/pkg/kubelet/status" @@ -393,7 +394,7 @@ func NewMainKubelet( klet.lastTimestampRuntimeUp = time.Now() klet.runner = klet.containerRuntime - klet.podManager = newBasicPodManager(klet.kubeClient) + klet.podManager = kubepod.NewBasicPodManager(kubepod.NewBasicMirrorClient(klet.kubeClient)) klet.prober = prober.New(klet.runner, containerRefManager, recorder) klet.probeManager = prober.NewManager( @@ -455,7 +456,7 @@ type Kubelet struct { // safe and should only be access by the main kubelet syncloop goroutine. sourcesSeen sets.String - podManager podManager + podManager kubepod.Manager // Needed to report events for containers belonging to deleted/modified pods. // Tracks references for reporting events @@ -1271,7 +1272,7 @@ func (kl *Kubelet) syncPod(pod *api.Pod, mirrorPod *api.Pod, runningPod kubecont // Before returning, regenerate status and store it in the cache. defer func() { - if isStaticPod(pod) && mirrorPod == nil { + if kubepod.IsStaticPod(pod) && mirrorPod == nil { // No need to cache the status because the mirror pod does not // exist yet. return @@ -1398,7 +1399,7 @@ func (kl *Kubelet) syncPod(pod *api.Pod, mirrorPod *api.Pod, runningPod kubecont } } - if isStaticPod(pod) { + if kubepod.IsStaticPod(pod) { if mirrorPod != nil && !kl.podManager.IsMirrorPodOf(mirrorPod, pod) { // The mirror pod is semantically different from the static pod. Remove // it. The mirror pod will get recreated later. @@ -2015,7 +2016,7 @@ func (kl *Kubelet) HandlePodAdditions(pods []*api.Pod) { sort.Sort(podsByCreationTime(pods)) for _, pod := range pods { kl.podManager.AddPod(pod) - if isMirrorPod(pod) { + if kubepod.IsMirrorPod(pod) { kl.handleMirrorPod(pod, start) continue } @@ -2040,7 +2041,7 @@ func (kl *Kubelet) HandlePodUpdates(pods []*api.Pod) { start := time.Now() for _, pod := range pods { kl.podManager.UpdatePod(pod) - if isMirrorPod(pod) { + if kubepod.IsMirrorPod(pod) { kl.handleMirrorPod(pod, start) continue } @@ -2055,7 +2056,7 @@ func (kl *Kubelet) HandlePodDeletions(pods []*api.Pod) { start := time.Now() for _, pod := range pods { kl.podManager.DeletePod(pod) - if isMirrorPod(pod) { + if kubepod.IsMirrorPod(pod) { kl.handleMirrorPod(pod, start) continue } diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 6fa4ba27ab3..d3d7940c7f3 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -45,6 +45,7 @@ import ( "k8s.io/kubernetes/pkg/kubelet/container" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/network" + kubepod "k8s.io/kubernetes/pkg/kubelet/pod" "k8s.io/kubernetes/pkg/kubelet/prober" "k8s.io/kubernetes/pkg/kubelet/status" kubetypes "k8s.io/kubernetes/pkg/kubelet/types" @@ -80,7 +81,7 @@ type TestKubelet struct { fakeRuntime *kubecontainer.FakeRuntime fakeCadvisor *cadvisor.Mock fakeKubeClient *testclient.Fake - fakeMirrorClient *fakeMirrorClient + fakeMirrorClient *kubepod.FakeMirrorClient } func newTestKubelet(t *testing.T) *TestKubelet { @@ -116,8 +117,8 @@ func newTestKubelet(t *testing.T) *TestKubelet { kubelet.daemonEndpoints = &api.NodeDaemonEndpoints{} mockCadvisor := &cadvisor.Mock{} kubelet.cadvisor = mockCadvisor - podManager, fakeMirrorClient := newFakePodManager() - kubelet.podManager = podManager + fakeMirrorClient := kubepod.NewFakeMirrorClient() + kubelet.podManager = kubepod.NewBasicPodManager(fakeMirrorClient) kubelet.containerRefManager = kubecontainer.NewRefManager() diskSpaceManager, err := newDiskSpaceManager(mockCadvisor, DiskSpacePolicy{}) if err != nil { diff --git a/pkg/kubelet/mirror_client_test.go b/pkg/kubelet/pod/fake_mirror_client.go similarity index 55% rename from pkg/kubelet/mirror_client_test.go rename to pkg/kubelet/pod/fake_mirror_client.go index 9c372d5b33d..5198f08a8b9 100644 --- a/pkg/kubelet/mirror_client_test.go +++ b/pkg/kubelet/pod/fake_mirror_client.go @@ -14,18 +14,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubelet +package pod import ( "sync" - "testing" "k8s.io/kubernetes/pkg/api" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/util/sets" ) -type fakeMirrorClient struct { +type FakeMirrorClient struct { mirrorPodLock sync.RWMutex // Note that a real mirror manager does not store the mirror pods in // itself. This fake manager does this to track calls. @@ -34,7 +33,15 @@ type fakeMirrorClient struct { deleteCounts map[string]int } -func (fmc *fakeMirrorClient) CreateMirrorPod(pod *api.Pod) error { +func NewFakeMirrorClient() *FakeMirrorClient { + m := FakeMirrorClient{} + m.mirrorPods = sets.NewString() + m.createCounts = make(map[string]int) + m.deleteCounts = make(map[string]int) + return &m +} + +func (fmc *FakeMirrorClient) CreateMirrorPod(pod *api.Pod) error { fmc.mirrorPodLock.Lock() defer fmc.mirrorPodLock.Unlock() podFullName := kubecontainer.GetPodFullName(pod) @@ -43,7 +50,7 @@ func (fmc *fakeMirrorClient) CreateMirrorPod(pod *api.Pod) error { return nil } -func (fmc *fakeMirrorClient) DeleteMirrorPod(podFullName string) error { +func (fmc *FakeMirrorClient) DeleteMirrorPod(podFullName string) error { fmc.mirrorPodLock.Lock() defer fmc.mirrorPodLock.Unlock() fmc.mirrorPods.Delete(podFullName) @@ -51,65 +58,26 @@ func (fmc *fakeMirrorClient) DeleteMirrorPod(podFullName string) error { return nil } -func newFakeMirrorClient() *fakeMirrorClient { - m := fakeMirrorClient{} - m.mirrorPods = sets.NewString() - m.createCounts = make(map[string]int) - m.deleteCounts = make(map[string]int) - return &m -} - -func (fmc *fakeMirrorClient) HasPod(podFullName string) bool { +func (fmc *FakeMirrorClient) HasPod(podFullName string) bool { fmc.mirrorPodLock.RLock() defer fmc.mirrorPodLock.RUnlock() return fmc.mirrorPods.Has(podFullName) } -func (fmc *fakeMirrorClient) NumOfPods() int { +func (fmc *FakeMirrorClient) NumOfPods() int { fmc.mirrorPodLock.RLock() defer fmc.mirrorPodLock.RUnlock() return fmc.mirrorPods.Len() } -func (fmc *fakeMirrorClient) GetPods() []string { +func (fmc *FakeMirrorClient) GetPods() []string { fmc.mirrorPodLock.RLock() defer fmc.mirrorPodLock.RUnlock() return fmc.mirrorPods.List() } -func (fmc *fakeMirrorClient) GetCounts(podFullName string) (int, int) { +func (fmc *FakeMirrorClient) GetCounts(podFullName string) (int, int) { fmc.mirrorPodLock.RLock() defer fmc.mirrorPodLock.RUnlock() return fmc.createCounts[podFullName], fmc.deleteCounts[podFullName] } - -func TestParsePodFullName(t *testing.T) { - type nameTuple struct { - Name string - Namespace string - } - successfulCases := map[string]nameTuple{ - "bar_foo": {Name: "bar", Namespace: "foo"}, - "bar.org_foo.com": {Name: "bar.org", Namespace: "foo.com"}, - "bar-bar_foo": {Name: "bar-bar", Namespace: "foo"}, - } - failedCases := []string{"barfoo", "bar_foo_foo", ""} - - for podFullName, expected := range successfulCases { - name, namespace, err := kubecontainer.ParsePodFullName(podFullName) - if err != nil { - t.Errorf("unexpected error when parsing the full name: %v", err) - continue - } - if name != expected.Name || namespace != expected.Namespace { - t.Errorf("expected name %q, namespace %q; got name %q, namespace %q", - expected.Name, expected.Namespace, name, namespace) - } - } - for _, podFullName := range failedCases { - _, _, err := kubecontainer.ParsePodFullName(podFullName) - if err == nil { - t.Errorf("expected error when parsing the full name, got none") - } - } -} diff --git a/pkg/kubelet/pod_manager.go b/pkg/kubelet/pod/manager.go similarity index 80% rename from pkg/kubelet/pod_manager.go rename to pkg/kubelet/pod/manager.go index 5fb6e6b63ad..8a6d9360aa5 100644 --- a/pkg/kubelet/pod_manager.go +++ b/pkg/kubelet/pod/manager.go @@ -14,13 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubelet +package pod import ( "sync" "k8s.io/kubernetes/pkg/api" - client "k8s.io/kubernetes/pkg/client/unversioned" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/types" ) @@ -40,7 +39,7 @@ import ( // When a static pod gets deleted, the associated orphaned mirror pod will // also be removed. -type podManager interface { +type Manager interface { GetPods() []*api.Pod GetPodByFullName(podFullName string) (*api.Pod, bool) GetPodByName(namespace, name string) (*api.Pod, bool) @@ -60,13 +59,13 @@ type podManager interface { DeleteOrphanedMirrorPods() TranslatePodUID(uid types.UID) types.UID IsMirrorPodOf(mirrorPod, pod *api.Pod) bool - mirrorClient + MirrorClient } -// All maps in basicPodManager should be set by calling UpdatePods(); +// All maps in basicManager should be set by calling UpdatePods(); // individual arrays/maps are not immutable and no other methods should attempt // to modify them. -type basicPodManager struct { +type basicManager struct { // Protects all internal maps. lock sync.RWMutex @@ -80,24 +79,24 @@ type basicPodManager struct { mirrorPodByFullName map[string]*api.Pod // A mirror pod client to create/delete mirror pods. - mirrorClient + MirrorClient } -func newBasicPodManager(apiserverClient client.Interface) *basicPodManager { - pm := &basicPodManager{} - pm.mirrorClient = newBasicMirrorClient(apiserverClient) +func NewBasicPodManager(client MirrorClient) Manager { + pm := &basicManager{} + pm.MirrorClient = client pm.SetPods(nil) return pm } // Set the internal pods based on the new pods. -func (pm *basicPodManager) SetPods(newPods []*api.Pod) { +func (pm *basicManager) SetPods(newPods []*api.Pod) { pm.lock.Lock() defer pm.lock.Unlock() pm.setPods(newPods) } -func (pm *basicPodManager) setPods(newPods []*api.Pod) { +func (pm *basicManager) setPods(newPods []*api.Pod) { podByUID := make(map[types.UID]*api.Pod) mirrorPodByUID := make(map[types.UID]*api.Pod) podByFullName := make(map[string]*api.Pod) @@ -105,7 +104,7 @@ func (pm *basicPodManager) setPods(newPods []*api.Pod) { for _, pod := range newPods { podFullName := kubecontainer.GetPodFullName(pod) - if isMirrorPod(pod) { + if IsMirrorPod(pod) { mirrorPodByUID[pod.UID] = pod mirrorPodByFullName[podFullName] = pod } else { @@ -120,15 +119,15 @@ func (pm *basicPodManager) setPods(newPods []*api.Pod) { pm.mirrorPodByFullName = mirrorPodByFullName } -func (pm *basicPodManager) AddPod(pod *api.Pod) { +func (pm *basicManager) AddPod(pod *api.Pod) { pm.UpdatePod(pod) } -func (pm *basicPodManager) UpdatePod(pod *api.Pod) { +func (pm *basicManager) UpdatePod(pod *api.Pod) { pm.lock.Lock() defer pm.lock.Unlock() podFullName := kubecontainer.GetPodFullName(pod) - if isMirrorPod(pod) { + if IsMirrorPod(pod) { pm.mirrorPodByUID[pod.UID] = pod pm.mirrorPodByFullName[podFullName] = pod } else { @@ -137,11 +136,11 @@ func (pm *basicPodManager) UpdatePod(pod *api.Pod) { } } -func (pm *basicPodManager) DeletePod(pod *api.Pod) { +func (pm *basicManager) DeletePod(pod *api.Pod) { pm.lock.Lock() defer pm.lock.Unlock() podFullName := kubecontainer.GetPodFullName(pod) - if isMirrorPod(pod) { + if IsMirrorPod(pod) { delete(pm.mirrorPodByUID, pod.UID) delete(pm.mirrorPodByFullName, podFullName) } else { @@ -151,14 +150,14 @@ func (pm *basicPodManager) DeletePod(pod *api.Pod) { } // GetPods returns the regular pods bound to the kubelet and their spec. -func (pm *basicPodManager) GetPods() []*api.Pod { +func (pm *basicManager) GetPods() []*api.Pod { pm.lock.RLock() defer pm.lock.RUnlock() return podsMapToPods(pm.podByUID) } // GetPodsAndMirrorPods returns the both regular and mirror pods. -func (pm *basicPodManager) GetPodsAndMirrorPods() ([]*api.Pod, []*api.Pod) { +func (pm *basicManager) GetPodsAndMirrorPods() ([]*api.Pod, []*api.Pod) { pm.lock.RLock() defer pm.lock.RUnlock() pods := podsMapToPods(pm.podByUID) @@ -167,20 +166,20 @@ func (pm *basicPodManager) GetPodsAndMirrorPods() ([]*api.Pod, []*api.Pod) { } // Returns all pods (including mirror pods). -func (pm *basicPodManager) getAllPods() []*api.Pod { +func (pm *basicManager) getAllPods() []*api.Pod { return append(podsMapToPods(pm.podByUID), podsMapToPods(pm.mirrorPodByUID)...) } // GetPodByName provides the (non-mirror) pod that matches namespace and name, // as well as whether the pod was found. -func (pm *basicPodManager) GetPodByName(namespace, name string) (*api.Pod, bool) { +func (pm *basicManager) GetPodByName(namespace, name string) (*api.Pod, bool) { podFullName := kubecontainer.BuildPodFullName(name, namespace) return pm.GetPodByFullName(podFullName) } // GetPodByName returns the (non-mirror) pod that matches full name, as well as // whether the pod was found. -func (pm *basicPodManager) GetPodByFullName(podFullName string) (*api.Pod, bool) { +func (pm *basicManager) GetPodByFullName(podFullName string) (*api.Pod, bool) { pm.lock.RLock() defer pm.lock.RUnlock() pod, ok := pm.podByFullName[podFullName] @@ -191,7 +190,7 @@ func (pm *basicPodManager) GetPodByFullName(podFullName string) (*api.Pod, bool) // Otherwise, return the original UID. All public-facing functions should // perform this translation for UIDs because user may provide a mirror pod UID, // which is not recognized by internal Kubelet functions. -func (pm *basicPodManager) TranslatePodUID(uid types.UID) types.UID { +func (pm *basicManager) TranslatePodUID(uid types.UID) types.UID { if uid == "" { return uid } @@ -207,7 +206,7 @@ func (pm *basicPodManager) TranslatePodUID(uid types.UID) types.UID { return uid } -func (pm *basicPodManager) getOrphanedMirrorPodNames() []string { +func (pm *basicManager) getOrphanedMirrorPodNames() []string { pm.lock.RLock() defer pm.lock.RUnlock() var podFullNames []string @@ -221,16 +220,16 @@ func (pm *basicPodManager) getOrphanedMirrorPodNames() []string { // Delete all mirror pods which do not have associated static pods. This method // sends deletion requets to the API server, but does NOT modify the internal -// pod storage in basicPodManager. -func (pm *basicPodManager) DeleteOrphanedMirrorPods() { +// pod storage in basicManager. +func (pm *basicManager) DeleteOrphanedMirrorPods() { podFullNames := pm.getOrphanedMirrorPodNames() for _, podFullName := range podFullNames { - pm.mirrorClient.DeleteMirrorPod(podFullName) + pm.MirrorClient.DeleteMirrorPod(podFullName) } } // Returns true if mirrorPod is a correct representation of pod; false otherwise. -func (pm *basicPodManager) IsMirrorPodOf(mirrorPod, pod *api.Pod) bool { +func (pm *basicManager) IsMirrorPodOf(mirrorPod, pod *api.Pod) bool { // Check name and namespace first. if pod.Name != mirrorPod.Name || pod.Namespace != mirrorPod.Namespace { return false @@ -246,14 +245,14 @@ func podsMapToPods(UIDMap map[types.UID]*api.Pod) []*api.Pod { return pods } -func (pm *basicPodManager) GetMirrorPodByPod(pod *api.Pod) (*api.Pod, bool) { +func (pm *basicManager) GetMirrorPodByPod(pod *api.Pod) (*api.Pod, bool) { pm.lock.RLock() defer pm.lock.RUnlock() mirrorPod, ok := pm.mirrorPodByFullName[kubecontainer.GetPodFullName(pod)] return mirrorPod, ok } -func (pm *basicPodManager) GetPodByMirrorPod(mirrorPod *api.Pod) (*api.Pod, bool) { +func (pm *basicManager) GetPodByMirrorPod(mirrorPod *api.Pod) (*api.Pod, bool) { pm.lock.RLock() defer pm.lock.RUnlock() pod, ok := pm.podByFullName[kubecontainer.GetPodFullName(mirrorPod)] diff --git a/pkg/kubelet/pod_manager_test.go b/pkg/kubelet/pod/manager_test.go similarity index 91% rename from pkg/kubelet/pod_manager_test.go rename to pkg/kubelet/pod/manager_test.go index 0234f924260..1dee50fef44 100644 --- a/pkg/kubelet/pod_manager_test.go +++ b/pkg/kubelet/pod/manager_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubelet +package pod import ( "reflect" @@ -25,11 +25,10 @@ import ( ) // Stub out mirror client for testing purpose. -func newFakePodManager() (*basicPodManager, *fakeMirrorClient) { - podManager := newBasicPodManager(nil) - fakeMirrorClient := newFakeMirrorClient() - podManager.mirrorClient = fakeMirrorClient - return podManager, fakeMirrorClient +func newTestManager() (*basicManager, *FakeMirrorClient) { + fakeMirrorClient := NewFakeMirrorClient() + manager := NewBasicPodManager(fakeMirrorClient).(*basicManager) + return manager, fakeMirrorClient } // Tests that pods/maps are properly set after the pod update, and the basic @@ -67,7 +66,7 @@ func TestGetSetPods(t *testing.T) { staticPod, } updates := append(expectedPods, mirrorPod) - podManager, _ := newFakePodManager() + podManager, _ := newTestManager() podManager.SetPods(updates) // Tests that all regular pods are recorded corrrectly. diff --git a/pkg/kubelet/mirror_client.go b/pkg/kubelet/pod/mirror_client.go similarity index 82% rename from pkg/kubelet/mirror_client.go rename to pkg/kubelet/pod/mirror_client.go index b679581aa2c..00adcdf44b4 100644 --- a/pkg/kubelet/mirror_client.go +++ b/pkg/kubelet/pod/mirror_client.go @@ -14,11 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubelet +package pod import ( - "fmt" - "github.com/golang/glog" "k8s.io/kubernetes/pkg/api" client "k8s.io/kubernetes/pkg/client/unversioned" @@ -27,8 +25,7 @@ import ( ) // Mirror client is used to create/delete a mirror pod. - -type mirrorClient interface { +type MirrorClient interface { CreateMirrorPod(*api.Pod) error DeleteMirrorPod(string) error } @@ -39,7 +36,7 @@ type basicMirrorClient struct { apiserverClient client.Interface } -func newBasicMirrorClient(apiserverClient client.Interface) *basicMirrorClient { +func NewBasicMirrorClient(apiserverClient client.Interface) MirrorClient { return &basicMirrorClient{apiserverClient: apiserverClient} } @@ -78,22 +75,12 @@ func (mc *basicMirrorClient) DeleteMirrorPod(podFullName string) error { return nil } -// Helper functions. -func getPodSource(pod *api.Pod) (string, error) { - if pod.Annotations != nil { - if source, ok := pod.Annotations[kubetypes.ConfigSourceAnnotationKey]; ok { - return source, nil - } - } - return "", fmt.Errorf("cannot get source of pod %q", pod.UID) -} - -func isStaticPod(pod *api.Pod) bool { - source, err := getPodSource(pod) +func IsStaticPod(pod *api.Pod) bool { + source, err := kubetypes.GetPodSource(pod) return err == nil && source != kubetypes.ApiserverSource } -func isMirrorPod(pod *api.Pod) bool { +func IsMirrorPod(pod *api.Pod) bool { if value, ok := pod.Annotations[kubetypes.ConfigMirrorAnnotationKey]; !ok { return false } else { diff --git a/pkg/kubelet/pod/mirror_client_test.go b/pkg/kubelet/pod/mirror_client_test.go new file mode 100644 index 00000000000..d8baa05f805 --- /dev/null +++ b/pkg/kubelet/pod/mirror_client_test.go @@ -0,0 +1,54 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package pod + +import ( + "testing" + + kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" +) + +func TestParsePodFullName(t *testing.T) { + type nameTuple struct { + Name string + Namespace string + } + successfulCases := map[string]nameTuple{ + "bar_foo": {Name: "bar", Namespace: "foo"}, + "bar.org_foo.com": {Name: "bar.org", Namespace: "foo.com"}, + "bar-bar_foo": {Name: "bar-bar", Namespace: "foo"}, + } + failedCases := []string{"barfoo", "bar_foo_foo", ""} + + for podFullName, expected := range successfulCases { + name, namespace, err := kubecontainer.ParsePodFullName(podFullName) + if err != nil { + t.Errorf("unexpected error when parsing the full name: %v", err) + continue + } + if name != expected.Name || namespace != expected.Namespace { + t.Errorf("expected name %q, namespace %q; got name %q, namespace %q", + expected.Name, expected.Namespace, name, namespace) + } + } + for _, podFullName := range failedCases { + _, _, err := kubecontainer.ParsePodFullName(podFullName) + if err == nil { + t.Errorf("expected error when parsing the full name, got none") + } + } +} diff --git a/pkg/kubelet/runonce_test.go b/pkg/kubelet/runonce_test.go index 6be1c2aae2a..37e25277c7c 100644 --- a/pkg/kubelet/runonce_test.go +++ b/pkg/kubelet/runonce_test.go @@ -26,14 +26,14 @@ import ( "k8s.io/kubernetes/pkg/kubelet/cadvisor" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/network" + kubepod "k8s.io/kubernetes/pkg/kubelet/pod" "k8s.io/kubernetes/pkg/kubelet/status" ) func TestRunOnce(t *testing.T) { cadvisor := &cadvisor.Mock{} cadvisor.On("MachineInfo").Return(&cadvisorApi.MachineInfo{}, nil) - - podManager, _ := newFakePodManager() + podManager := kubepod.NewBasicPodManager(kubepod.NewFakeMirrorClient()) diskSpaceManager, _ := newDiskSpaceManager(cadvisor, DiskSpacePolicy{}) fakeRuntime := &kubecontainer.FakeRuntime{} diff --git a/pkg/kubelet/types/pod_update.go b/pkg/kubelet/types/pod_update.go index 9ef8c9c1617..f3612ecc4d7 100644 --- a/pkg/kubelet/types/pod_update.go +++ b/pkg/kubelet/types/pod_update.go @@ -89,6 +89,16 @@ func GetValidatedSources(sources []string) ([]string, error) { return validated, nil } +// GetPodSource returns the source of the pod based on the annotation. +func GetPodSource(pod *api.Pod) (string, error) { + if pod.Annotations != nil { + if source, ok := pod.Annotations[ConfigSourceAnnotationKey]; ok { + return source, nil + } + } + return "", fmt.Errorf("cannot get source of pod %q", pod.UID) +} + // SyncPodType classifies pod updates, eg: create, update. type SyncPodType int diff --git a/pkg/kubelet/util.go b/pkg/kubelet/util.go index a470e1fe86e..21edd8f4f34 100644 --- a/pkg/kubelet/util.go +++ b/pkg/kubelet/util.go @@ -23,6 +23,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/capabilities" + kubetypes "k8s.io/kubernetes/pkg/kubelet/types" "k8s.io/kubernetes/pkg/securitycontext" ) @@ -82,7 +83,7 @@ func canRunPod(pod *api.Pod) error { // Determined whether the specified pod is allowed to use host networking func allowHostNetwork(pod *api.Pod) (bool, error) { - podSource, err := getPodSource(pod) + podSource, err := kubetypes.GetPodSource(pod) if err != nil { return false, err } @@ -96,7 +97,7 @@ func allowHostNetwork(pod *api.Pod) (bool, error) { // Determined whether the specified pod is allowed to use host networking func allowHostPID(pod *api.Pod) (bool, error) { - podSource, err := getPodSource(pod) + podSource, err := kubetypes.GetPodSource(pod) if err != nil { return false, err } @@ -110,7 +111,7 @@ func allowHostPID(pod *api.Pod) (bool, error) { // Determined whether the specified pod is allowed to use host ipc func allowHostIPC(pod *api.Pod) (bool, error) { - podSource, err := getPodSource(pod) + podSource, err := kubetypes.GetPodSource(pod) if err != nil { return false, err }