Update kubectl drain command to use policy V1Beta1 instead of unversioned API

Signed-off-by: Ferran Rodenas <frodenas@gmail.com>
This commit is contained in:
Ferran Rodenas
2017-10-23 12:25:13 +02:00
parent 94acd5a076
commit c1802dc472
3 changed files with 84 additions and 84 deletions

View File

@@ -33,7 +33,8 @@ import (
"github.com/spf13/cobra"
"k8s.io/api/core/v1"
corev1 "k8s.io/api/core/v1"
policyv1beta1 "k8s.io/api/policy/v1beta1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
@@ -48,7 +49,6 @@ import (
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/apis/policy"
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
)
@@ -58,22 +58,22 @@ const (
DeleteMethod = "Delete"
)
var node *v1.Node
var cordoned_node *v1.Node
var node *corev1.Node
var cordoned_node *corev1.Node
func boolptr(b bool) *bool { return &b }
func TestMain(m *testing.M) {
// Create a node.
node = &v1.Node{
node = &corev1.Node{
ObjectMeta: metav1.ObjectMeta{
Name: "node",
CreationTimestamp: metav1.Time{Time: time.Now()},
},
Spec: v1.NodeSpec{
Spec: corev1.NodeSpec{
ExternalID: "node",
},
Status: v1.NodeStatus{},
Status: corev1.NodeStatus{},
}
// A copy of the same node, but cordoned.
@@ -85,8 +85,8 @@ func TestMain(m *testing.M) {
func TestCordon(t *testing.T) {
tests := []struct {
description string
node *v1.Node
expected *v1.Node
node *corev1.Node
expected *corev1.Node
cmd func(cmdutil.Factory, io.Writer) *cobra.Command
arg string
expectFatal bool
@@ -151,7 +151,7 @@ func TestCordon(t *testing.T) {
for _, test := range tests {
f, tf, codec, ns := cmdtesting.NewAPIFactory()
new_node := &v1.Node{}
new_node := &corev1.Node{}
updated := false
tf.Client = &fake.RESTClient{
GroupVersion: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion,
@@ -173,7 +173,7 @@ func TestCordon(t *testing.T) {
if err != nil {
t.Fatalf("%s: unexpected error: %v", test.description, err)
}
appliedPatch, err := strategicpatch.StrategicMergePatch(oldJSON, data, &v1.Node{})
appliedPatch, err := strategicpatch.StrategicMergePatch(oldJSON, data, &corev1.Node{})
if err != nil {
t.Fatalf("%s: unexpected error: %v", test.description, err)
}
@@ -250,7 +250,7 @@ func TestDrain(t *testing.T) {
rc_anno := make(map[string]string)
rc_anno[api.CreatedByAnnotation] = refJson(t, &rc)
rc_pod := api.Pod{
rc_pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "bar",
Namespace: "default",
@@ -269,7 +269,7 @@ func TestDrain(t *testing.T) {
},
},
},
Spec: api.PodSpec{
Spec: corev1.PodSpec{
NodeName: "node",
},
}
@@ -289,7 +289,7 @@ func TestDrain(t *testing.T) {
ds_anno := make(map[string]string)
ds_anno[api.CreatedByAnnotation] = refJson(t, &ds)
ds_pod := api.Pod{
ds_pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "bar",
Namespace: "default",
@@ -307,7 +307,7 @@ func TestDrain(t *testing.T) {
},
},
},
Spec: api.PodSpec{
Spec: corev1.PodSpec{
NodeName: "node",
},
}
@@ -327,7 +327,7 @@ func TestDrain(t *testing.T) {
missing_ds_anno := make(map[string]string)
missing_ds_anno[api.CreatedByAnnotation] = refJson(t, &missing_ds)
orphaned_ds_pod := api.Pod{
orphaned_ds_pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "bar",
Namespace: "default",
@@ -345,7 +345,7 @@ func TestDrain(t *testing.T) {
},
},
},
Spec: api.PodSpec{
Spec: corev1.PodSpec{
NodeName: "node",
},
}
@@ -362,7 +362,7 @@ func TestDrain(t *testing.T) {
},
}
job_pod := api.Pod{
job_pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "bar",
Namespace: "default",
@@ -398,7 +398,7 @@ func TestDrain(t *testing.T) {
rs_anno := make(map[string]string)
rs_anno[api.CreatedByAnnotation] = refJson(t, &rs)
rs_pod := api.Pod{
rs_pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "bar",
Namespace: "default",
@@ -416,36 +416,36 @@ func TestDrain(t *testing.T) {
},
},
},
Spec: api.PodSpec{
Spec: corev1.PodSpec{
NodeName: "node",
},
}
naked_pod := api.Pod{
naked_pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "bar",
Namespace: "default",
CreationTimestamp: metav1.Time{Time: time.Now()},
Labels: labels,
},
Spec: api.PodSpec{
Spec: corev1.PodSpec{
NodeName: "node",
},
}
emptydir_pod := api.Pod{
emptydir_pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "bar",
Namespace: "default",
CreationTimestamp: metav1.Time{Time: time.Now()},
Labels: labels,
},
Spec: api.PodSpec{
Spec: corev1.PodSpec{
NodeName: "node",
Volumes: []api.Volume{
Volumes: []corev1.Volume{
{
Name: "scratch",
VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{Medium: ""}},
VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{Medium: ""}},
},
},
},
@@ -453,9 +453,9 @@ func TestDrain(t *testing.T) {
tests := []struct {
description string
node *v1.Node
expected *v1.Node
pods []api.Pod
node *corev1.Node
expected *corev1.Node
pods []corev1.Pod
rcs []api.ReplicationController
replicaSets []extensions.ReplicaSet
args []string
@@ -466,7 +466,7 @@ func TestDrain(t *testing.T) {
description: "RC-managed pod",
node: node,
expected: cordoned_node,
pods: []api.Pod{rc_pod},
pods: []corev1.Pod{rc_pod},
rcs: []api.ReplicationController{rc},
args: []string{"node"},
expectFatal: false,
@@ -476,7 +476,7 @@ func TestDrain(t *testing.T) {
description: "DS-managed pod",
node: node,
expected: cordoned_node,
pods: []api.Pod{ds_pod},
pods: []corev1.Pod{ds_pod},
rcs: []api.ReplicationController{rc},
args: []string{"node"},
expectFatal: true,
@@ -486,7 +486,7 @@ func TestDrain(t *testing.T) {
description: "orphaned DS-managed pod",
node: node,
expected: cordoned_node,
pods: []api.Pod{orphaned_ds_pod},
pods: []corev1.Pod{orphaned_ds_pod},
rcs: []api.ReplicationController{},
args: []string{"node"},
expectFatal: true,
@@ -496,7 +496,7 @@ func TestDrain(t *testing.T) {
description: "orphaned DS-managed pod with --force",
node: node,
expected: cordoned_node,
pods: []api.Pod{orphaned_ds_pod},
pods: []corev1.Pod{orphaned_ds_pod},
rcs: []api.ReplicationController{},
args: []string{"node", "--force"},
expectFatal: false,
@@ -506,7 +506,7 @@ func TestDrain(t *testing.T) {
description: "DS-managed pod with --ignore-daemonsets",
node: node,
expected: cordoned_node,
pods: []api.Pod{ds_pod},
pods: []corev1.Pod{ds_pod},
rcs: []api.ReplicationController{rc},
args: []string{"node", "--ignore-daemonsets"},
expectFatal: false,
@@ -516,7 +516,7 @@ func TestDrain(t *testing.T) {
description: "Job-managed pod",
node: node,
expected: cordoned_node,
pods: []api.Pod{job_pod},
pods: []corev1.Pod{job_pod},
rcs: []api.ReplicationController{rc},
args: []string{"node"},
expectFatal: false,
@@ -526,7 +526,7 @@ func TestDrain(t *testing.T) {
description: "RS-managed pod",
node: node,
expected: cordoned_node,
pods: []api.Pod{rs_pod},
pods: []corev1.Pod{rs_pod},
replicaSets: []extensions.ReplicaSet{rs},
args: []string{"node"},
expectFatal: false,
@@ -536,7 +536,7 @@ func TestDrain(t *testing.T) {
description: "naked pod",
node: node,
expected: cordoned_node,
pods: []api.Pod{naked_pod},
pods: []corev1.Pod{naked_pod},
rcs: []api.ReplicationController{},
args: []string{"node"},
expectFatal: true,
@@ -546,7 +546,7 @@ func TestDrain(t *testing.T) {
description: "naked pod with --force",
node: node,
expected: cordoned_node,
pods: []api.Pod{naked_pod},
pods: []corev1.Pod{naked_pod},
rcs: []api.ReplicationController{},
args: []string{"node", "--force"},
expectFatal: false,
@@ -556,7 +556,7 @@ func TestDrain(t *testing.T) {
description: "pod with EmptyDir",
node: node,
expected: cordoned_node,
pods: []api.Pod{emptydir_pod},
pods: []corev1.Pod{emptydir_pod},
args: []string{"node", "--force"},
expectFatal: true,
expectDelete: false,
@@ -565,7 +565,7 @@ func TestDrain(t *testing.T) {
description: "pod with EmptyDir and --delete-local-data",
node: node,
expected: cordoned_node,
pods: []api.Pod{emptydir_pod},
pods: []corev1.Pod{emptydir_pod},
args: []string{"node", "--force", "--delete-local-data=true"},
expectFatal: false,
expectDelete: true,
@@ -574,7 +574,7 @@ func TestDrain(t *testing.T) {
description: "empty node",
node: node,
expected: cordoned_node,
pods: []api.Pod{},
pods: []corev1.Pod{},
rcs: []api.ReplicationController{rc},
args: []string{"node"},
expectFatal: false,
@@ -592,7 +592,7 @@ func TestDrain(t *testing.T) {
currMethod = DeleteMethod
}
for _, test := range tests {
new_node := &v1.Node{}
new_node := &corev1.Node{}
deleted := false
evicted := false
f, tf, codec, ns := cmdtesting.NewAPIFactory()
@@ -645,7 +645,7 @@ func TestDrain(t *testing.T) {
case m.isFor("GET", "/namespaces/default/replicasets/rs"):
return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(testapi.Extensions.Codec(), &test.replicaSets[0])}, nil
case m.isFor("GET", "/namespaces/default/pods/bar"):
return &http.Response{StatusCode: 404, Header: defaultHeader(), Body: objBody(codec, &api.Pod{})}, nil
return &http.Response{StatusCode: 404, Header: defaultHeader(), Body: objBody(codec, &corev1.Pod{})}, nil
case m.isFor("GET", "/pods"):
values, err := url.ParseQuery(req.URL.RawQuery)
if err != nil {
@@ -656,7 +656,7 @@ func TestDrain(t *testing.T) {
if !reflect.DeepEqual(get_params, values) {
t.Fatalf("%s: expected:\n%v\nsaw:\n%v\n", test.description, get_params, values)
}
return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, &api.PodList{Items: test.pods})}, nil
return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, &corev1.PodList{Items: test.pods})}, nil
case m.isFor("GET", "/replicationcontrollers"):
return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, &api.ReplicationControllerList{Items: test.rcs})}, nil
case m.isFor("PATCH", "/nodes/node"):
@@ -669,7 +669,7 @@ func TestDrain(t *testing.T) {
if err != nil {
t.Fatalf("%s: unexpected error: %v", test.description, err)
}
appliedPatch, err := strategicpatch.StrategicMergePatch(oldJSON, data, &v1.Node{})
appliedPatch, err := strategicpatch.StrategicMergePatch(oldJSON, data, &corev1.Node{})
if err != nil {
t.Fatalf("%s: unexpected error: %v", test.description, err)
}
@@ -685,7 +685,7 @@ func TestDrain(t *testing.T) {
return &http.Response{StatusCode: 204, Header: defaultHeader(), Body: objBody(codec, &test.pods[0])}, nil
case m.isFor("POST", "/namespaces/default/pods/bar/eviction"):
evicted = true
return &http.Response{StatusCode: 201, Header: defaultHeader(), Body: policyObjBody(&policy.Eviction{})}, nil
return &http.Response{StatusCode: 201, Header: defaultHeader(), Body: policyObjBody(&policyv1beta1.Eviction{})}, nil
default:
t.Fatalf("%s: unexpected request: %v %#v\n%#v", test.description, req.Method, req.URL, req)
return nil, nil
@@ -744,7 +744,7 @@ func TestDeletePods(t *testing.T) {
expectPendingPods bool
expectError bool
expectedError *error
getPodFn func(namespace, name string) (*api.Pod, error)
getPodFn func(namespace, name string) (*corev1.Pod, error)
}{
{
description: "Wait for deleting to complete",
@@ -753,7 +753,7 @@ func TestDeletePods(t *testing.T) {
expectPendingPods: false,
expectError: false,
expectedError: nil,
getPodFn: func(namespace, name string) (*api.Pod, error) {
getPodFn: func(namespace, name string) (*corev1.Pod, error) {
oldPodMap, _ := createPods(false)
newPodMap, _ := createPods(true)
if oldPod, found := oldPodMap[name]; found {
@@ -778,7 +778,7 @@ func TestDeletePods(t *testing.T) {
expectPendingPods: true,
expectError: true,
expectedError: &wait.ErrWaitTimeout,
getPodFn: func(namespace, name string) (*api.Pod, error) {
getPodFn: func(namespace, name string) (*corev1.Pod, error) {
oldPodMap, _ := createPods(false)
if oldPod, found := oldPodMap[name]; found {
return &oldPod, nil
@@ -793,7 +793,7 @@ func TestDeletePods(t *testing.T) {
expectPendingPods: true,
expectError: true,
expectedError: nil,
getPodFn: func(namespace, name string) (*api.Pod, error) {
getPodFn: func(namespace, name string) (*corev1.Pod, error) {
return nil, errors.New("This is a random error for testing")
},
},
@@ -828,9 +828,9 @@ func TestDeletePods(t *testing.T) {
}
}
func createPods(ifCreateNewPods bool) (map[string]api.Pod, []api.Pod) {
podMap := make(map[string]api.Pod)
podSlice := []api.Pod{}
func createPods(ifCreateNewPods bool) (map[string]corev1.Pod, []corev1.Pod) {
podMap := make(map[string]corev1.Pod)
podSlice := []corev1.Pod{}
for i := 0; i < 8; i++ {
var uid types.UID
if ifCreateNewPods {
@@ -838,7 +838,7 @@ func createPods(ifCreateNewPods bool) (map[string]api.Pod, []api.Pod) {
} else {
uid = types.UID(strconv.Itoa(i) + strconv.Itoa(i))
}
pod := api.Pod{
pod := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "pod" + strconv.Itoa(i),
Namespace: "default",