[ca] Factored out common functions in drain logic
This commit is contained in:
parent
5825334e66
commit
7832013a3f
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue