mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 22:17:14 +00:00
Merge pull request #105736 from deejross/drain-output-ffix
kubectl drain node output should say node was drained not evicted
This commit is contained in:
commit
3fb98823c4
@ -297,17 +297,18 @@ func (o *DrainCmdOptions) RunDrain() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
printObj, err := o.ToPrinter("drained")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
drainedNodes := sets.NewString()
|
drainedNodes := sets.NewString()
|
||||||
var fatal error
|
var fatal error
|
||||||
|
|
||||||
for _, info := range o.nodeInfos {
|
for _, info := range o.nodeInfos {
|
||||||
if err := o.deleteOrEvictPodsSimple(info); err == nil {
|
if err := o.deleteOrEvictPodsSimple(info); err == nil {
|
||||||
drainedNodes.Insert(info.Name)
|
drainedNodes.Insert(info.Name)
|
||||||
|
|
||||||
|
printObj, err := o.ToPrinter("drained")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
printObj(info.Object, o.Out)
|
printObj(info.Object, o.Out)
|
||||||
} else {
|
} else {
|
||||||
if o.drainer.IgnoreErrors && len(o.nodeInfos) > 1 {
|
if o.drainer.IgnoreErrors && len(o.nodeInfos) > 1 {
|
||||||
|
@ -546,16 +546,18 @@ func TestDrain(t *testing.T) {
|
|||||||
expectWarning string
|
expectWarning string
|
||||||
expectFatal bool
|
expectFatal bool
|
||||||
expectDelete bool
|
expectDelete bool
|
||||||
|
expectOutputToContain string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
description: "RC-managed pod",
|
description: "RC-managed pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{rcPod},
|
pods: []corev1.Pod{rcPod},
|
||||||
rcs: []corev1.ReplicationController{rc},
|
rcs: []corev1.ReplicationController{rc},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "DS-managed pod",
|
description: "DS-managed pod",
|
||||||
@ -568,14 +570,15 @@ func TestDrain(t *testing.T) {
|
|||||||
expectDelete: false,
|
expectDelete: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "DS-managed terminated pod",
|
description: "DS-managed terminated pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{dsTerminatedPod},
|
pods: []corev1.Pod{dsTerminatedPod},
|
||||||
rcs: []corev1.ReplicationController{rc},
|
rcs: []corev1.ReplicationController{rc},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "orphaned DS-managed pod",
|
description: "orphaned DS-managed pod",
|
||||||
@ -588,76 +591,83 @@ func TestDrain(t *testing.T) {
|
|||||||
expectDelete: false,
|
expectDelete: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "orphaned DS-managed pod with --force",
|
description: "orphaned DS-managed pod with --force",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{orphanedDsPod},
|
pods: []corev1.Pod{orphanedDsPod},
|
||||||
rcs: []corev1.ReplicationController{},
|
rcs: []corev1.ReplicationController{},
|
||||||
args: []string{"node", "--force"},
|
args: []string{"node", "--force"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
expectWarning: "WARNING: deleting Pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet: default/bar",
|
expectWarning: "WARNING: deleting Pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet: default/bar",
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "DS-managed pod with --ignore-daemonsets",
|
description: "DS-managed pod with --ignore-daemonsets",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{dsPod},
|
pods: []corev1.Pod{dsPod},
|
||||||
rcs: []corev1.ReplicationController{rc},
|
rcs: []corev1.ReplicationController{rc},
|
||||||
args: []string{"node", "--ignore-daemonsets"},
|
args: []string{"node", "--ignore-daemonsets"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: false,
|
expectDelete: false,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "DS-managed pod with emptyDir with --ignore-daemonsets",
|
description: "DS-managed pod with emptyDir with --ignore-daemonsets",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{dsPodWithEmptyDir},
|
pods: []corev1.Pod{dsPodWithEmptyDir},
|
||||||
rcs: []corev1.ReplicationController{rc},
|
rcs: []corev1.ReplicationController{rc},
|
||||||
args: []string{"node", "--ignore-daemonsets"},
|
args: []string{"node", "--ignore-daemonsets"},
|
||||||
expectWarning: "WARNING: ignoring DaemonSet-managed Pods: default/bar",
|
expectWarning: "WARNING: ignoring DaemonSet-managed Pods: default/bar",
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: false,
|
expectDelete: false,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Job-managed pod with local storage",
|
description: "Job-managed pod with local storage",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{jobPod},
|
pods: []corev1.Pod{jobPod},
|
||||||
rcs: []corev1.ReplicationController{rc},
|
rcs: []corev1.ReplicationController{rc},
|
||||||
args: []string{"node", "--force", "--delete-emptydir-data=true"},
|
args: []string{"node", "--force", "--delete-emptydir-data=true"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Ensure compatibility for --delete-local-data until fully deprecated",
|
description: "Ensure compatibility for --delete-local-data until fully deprecated",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{jobPod},
|
pods: []corev1.Pod{jobPod},
|
||||||
rcs: []corev1.ReplicationController{rc},
|
rcs: []corev1.ReplicationController{rc},
|
||||||
args: []string{"node", "--force", "--delete-local-data=true"},
|
args: []string{"node", "--force", "--delete-local-data=true"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Job-managed terminated pod",
|
description: "Job-managed terminated pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{terminatedJobPodWithLocalStorage},
|
pods: []corev1.Pod{terminatedJobPodWithLocalStorage},
|
||||||
rcs: []corev1.ReplicationController{rc},
|
rcs: []corev1.ReplicationController{rc},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "RS-managed pod",
|
description: "RS-managed pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{rsPod},
|
pods: []corev1.Pod{rsPod},
|
||||||
replicaSets: []appsv1.ReplicaSet{rs},
|
replicaSets: []appsv1.ReplicaSet{rs},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "naked pod",
|
description: "naked pod",
|
||||||
@ -670,14 +680,15 @@ func TestDrain(t *testing.T) {
|
|||||||
expectDelete: false,
|
expectDelete: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "naked pod with --force",
|
description: "naked pod with --force",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{nakedPod},
|
pods: []corev1.Pod{nakedPod},
|
||||||
rcs: []corev1.ReplicationController{},
|
rcs: []corev1.ReplicationController{},
|
||||||
args: []string{"node", "--force"},
|
args: []string{"node", "--force"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "pod with EmptyDir",
|
description: "pod with EmptyDir",
|
||||||
@ -689,33 +700,36 @@ func TestDrain(t *testing.T) {
|
|||||||
expectDelete: false,
|
expectDelete: false,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "terminated pod with emptyDir",
|
description: "terminated pod with emptyDir",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{emptydirTerminatedPod},
|
pods: []corev1.Pod{emptydirTerminatedPod},
|
||||||
rcs: []corev1.ReplicationController{rc},
|
rcs: []corev1.ReplicationController{rc},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "pod with EmptyDir and --delete-emptydir-data",
|
description: "pod with EmptyDir and --delete-emptydir-data",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{emptydirPod},
|
pods: []corev1.Pod{emptydirPod},
|
||||||
args: []string{"node", "--force", "--delete-emptydir-data=true"},
|
args: []string{"node", "--force", "--delete-emptydir-data=true"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "empty node",
|
description: "empty node",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordonedNode,
|
expected: cordonedNode,
|
||||||
pods: []corev1.Pod{},
|
pods: []corev1.Pod{},
|
||||||
rcs: []corev1.ReplicationController{rc},
|
rcs: []corev1.ReplicationController{rc},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: false,
|
expectDelete: false,
|
||||||
|
expectOutputToContain: "node/node drained",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "fail to list pods",
|
description: "fail to list pods",
|
||||||
@ -859,7 +873,7 @@ func TestDrain(t *testing.T) {
|
|||||||
}
|
}
|
||||||
tf.ClientConfigVal = cmdtesting.DefaultClientConfig()
|
tf.ClientConfigVal = cmdtesting.DefaultClientConfig()
|
||||||
|
|
||||||
ioStreams, _, _, errBuf := genericclioptions.NewTestIOStreams()
|
ioStreams, _, outBuf, errBuf := genericclioptions.NewTestIOStreams()
|
||||||
cmd := NewCmdDrain(tf, ioStreams)
|
cmd := NewCmdDrain(tf, ioStreams)
|
||||||
|
|
||||||
var recovered interface{}
|
var recovered interface{}
|
||||||
@ -925,6 +939,13 @@ func TestDrain(t *testing.T) {
|
|||||||
t.Fatalf("%s: actual warning message did not match expected warning message.\n Expecting:\n%v\n Got:\n%v", test.description, e, a)
|
t.Fatalf("%s: actual warning message did not match expected warning message.\n Expecting:\n%v\n Got:\n%v", test.description, e, a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(test.expectOutputToContain) > 0 {
|
||||||
|
out := outBuf.String()
|
||||||
|
if !strings.Contains(out, test.expectOutputToContain) {
|
||||||
|
t.Fatalf("%s: expected output to contain: %s\nGot:\n%s", test.description, test.expectOutputToContain, out)
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user