[ca] Factored out common functions in drain logic

This commit is contained in:
Piotr Szczesniak 2016-08-11 09:28:15 +02:00
parent 5825334e66
commit 7832013a3f
3 changed files with 42 additions and 27 deletions

View File

@ -70,7 +70,7 @@ candidateloop:
if fastCheck {
if nodeInfo, found := nodeNameToNodeInfo[node.Name]; found {
podsToRemove, err = FastGetPodsToMove(nodeInfo, false, *skipNodesWithSystemPods, *skipNodesWithLocalStorage, kube_api.Codecs.UniversalDecoder())
podsToRemove, err = FastGetPodsToMove(nodeInfo, false, *skipNodesWithSystemPods, *skipNodesWithLocalStorage)
if err != nil {
glog.V(2).Infof("%s: node %s cannot be removed: %v", evaluationType, node.Name, err)
continue candidateloop

View File

@ -32,33 +32,29 @@ import (
// along with their pods (no abandoned pods with dangling created-by annotation). Usefull for fast
// checks.
func FastGetPodsToMove(nodeInfo *schedulercache.NodeInfo, force bool,
skipNodesWithSystemPods bool, skipNodesWithLocalStorage bool, decoder runtime.Decoder) ([]*api.Pod, error) {
skipNodesWithSystemPods bool, skipNodesWithLocalStorage bool) ([]*api.Pod, error) {
pods := make([]*api.Pod, 0)
unreplicatedPodNames := []string{}
for _, pod := range nodeInfo.Pods() {
_, found := pod.ObjectMeta.Annotations[types.ConfigMirrorAnnotationKey]
if found {
// Skip mirror pod
if IsMirrorPod(pod) {
continue
}
replicated := false
daemonsetPod := false
creatorRef, found := pod.ObjectMeta.Annotations[controller.CreatedByAnnotation]
if found {
var sr api.SerializedReference
if err := runtime.DecodeInto(decoder, []byte(creatorRef), &sr); err != nil {
return []*api.Pod{}, err
}
if sr.Reference.Kind == "ReplicationController" {
replicated = true
} else if sr.Reference.Kind == "DaemonSet" {
daemonsetPod = true
} else if sr.Reference.Kind == "Job" {
replicated = true
} else if sr.Reference.Kind == "ReplicaSet" {
replicated = true
}
creatorKind, err := CreatorRefKind(pod)
if err != nil {
return []*api.Pod{}, err
}
if creatorKind == "ReplicationController" {
replicated = true
} else if creatorKind == "DaemonSet" {
daemonsetPod = true
} else if creatorKind == "Job" {
replicated = true
} else if creatorKind == "ReplicaSet" {
replicated = true
}
if !daemonsetPod && pod.Namespace == "kube-system" && skipNodesWithSystemPods {
@ -87,6 +83,25 @@ func FastGetPodsToMove(nodeInfo *schedulercache.NodeInfo, force bool,
return pods, nil
}
// CreatorRefKind returns the kind of the creator of the pod.
func CreatorRefKind(pod *api.Pod) (string, error) {
creatorRef, found := pod.ObjectMeta.Annotations[controller.CreatedByAnnotation]
if !found {
return "", nil
}
var sr api.SerializedReference
if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), []byte(creatorRef), &sr); err != nil {
return "", err
}
return sr.Reference.Kind, nil
}
// IsMirrorPod checks whether the pod is a mirror pod.
func IsMirrorPod(pod *api.Pod) bool {
_, found := pod.ObjectMeta.Annotations[types.ConfigMirrorAnnotationKey]
return found
}
func hasLocalStorage(pod *api.Pod) bool {
for _, volume := range pod.Spec.Volumes {
if isLocalVolume(&volume) {

View File

@ -35,7 +35,7 @@ func TestFastGetPodsToMove(t *testing.T) {
Namespace: "ns",
},
}
_, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod1), false, true, true, kube_api.Codecs.UniversalDecoder())
_, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod1), false, true, true)
assert.Error(t, err)
// Replicated pod
@ -48,7 +48,7 @@ func TestFastGetPodsToMove(t *testing.T) {
},
},
}
r2, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod2), false, true, true, kube_api.Codecs.UniversalDecoder())
r2, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod2), false, true, true)
assert.NoError(t, err)
assert.Equal(t, 1, len(r2))
assert.Equal(t, pod2, r2[0])
@ -63,7 +63,7 @@ func TestFastGetPodsToMove(t *testing.T) {
},
},
}
r3, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod3), false, true, true, kube_api.Codecs.UniversalDecoder())
r3, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod3), false, true, true)
assert.NoError(t, err)
assert.Equal(t, 0, len(r3))
@ -77,7 +77,7 @@ func TestFastGetPodsToMove(t *testing.T) {
},
},
}
r4, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod2, pod3, pod4), false, true, true, kube_api.Codecs.UniversalDecoder())
r4, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod2, pod3, pod4), false, true, true)
assert.NoError(t, err)
assert.Equal(t, 1, len(r4))
assert.Equal(t, pod2, r4[0])
@ -92,7 +92,7 @@ func TestFastGetPodsToMove(t *testing.T) {
},
},
}
_, err = FastGetPodsToMove(schedulercache.NewNodeInfo(pod5), false, true, true, kube_api.Codecs.UniversalDecoder())
_, err = FastGetPodsToMove(schedulercache.NewNodeInfo(pod5), false, true, true)
assert.Error(t, err)
// Local storage
@ -114,7 +114,7 @@ func TestFastGetPodsToMove(t *testing.T) {
},
},
}
_, err = FastGetPodsToMove(schedulercache.NewNodeInfo(pod6), false, true, true, kube_api.Codecs.UniversalDecoder())
_, err = FastGetPodsToMove(schedulercache.NewNodeInfo(pod6), false, true, true)
assert.Error(t, err)
// Non-local storage
@ -138,7 +138,7 @@ func TestFastGetPodsToMove(t *testing.T) {
},
},
}
r7, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod7), false, true, true, kube_api.Codecs.UniversalDecoder())
r7, err := FastGetPodsToMove(schedulercache.NewNodeInfo(pod7), false, true, true)
assert.NoError(t, err)
assert.Equal(t, 1, len(r7))
}