mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 21:47:07 +00:00
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:
parent
94acd5a076
commit
c1802dc472
@ -72,7 +72,6 @@ go_library(
|
|||||||
"//pkg/api/legacyscheme:go_default_library",
|
"//pkg/api/legacyscheme:go_default_library",
|
||||||
"//pkg/api/validation:go_default_library",
|
"//pkg/api/validation:go_default_library",
|
||||||
"//pkg/apis/certificates:go_default_library",
|
"//pkg/apis/certificates:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
|
||||||
"//pkg/apis/rbac:go_default_library",
|
"//pkg/apis/rbac:go_default_library",
|
||||||
"//pkg/client/clientset_generated/internalclientset:go_default_library",
|
"//pkg/client/clientset_generated/internalclientset:go_default_library",
|
||||||
"//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library",
|
"//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library",
|
||||||
@ -116,6 +115,7 @@ go_library(
|
|||||||
"//vendor/k8s.io/api/batch/v1beta1:go_default_library",
|
"//vendor/k8s.io/api/batch/v1beta1:go_default_library",
|
||||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||||
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
|
"//vendor/k8s.io/api/extensions/v1beta1:go_default_library",
|
||||||
|
"//vendor/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
@ -139,6 +139,7 @@ go_library(
|
|||||||
"//vendor/k8s.io/apimachinery/pkg/version:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/version:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
|
||||||
"//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library",
|
"//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library",
|
||||||
|
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/rest:go_default_library",
|
"//vendor/k8s.io/client-go/rest:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/tools/clientcmd:go_default_library",
|
"//vendor/k8s.io/client-go/tools/clientcmd:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/tools/portforward:go_default_library",
|
"//vendor/k8s.io/client-go/tools/portforward:go_default_library",
|
||||||
@ -206,7 +207,6 @@ go_test(
|
|||||||
"//pkg/api/testing:go_default_library",
|
"//pkg/api/testing:go_default_library",
|
||||||
"//pkg/apis/batch:go_default_library",
|
"//pkg/apis/batch:go_default_library",
|
||||||
"//pkg/apis/extensions:go_default_library",
|
"//pkg/apis/extensions:go_default_library",
|
||||||
"//pkg/apis/policy:go_default_library",
|
|
||||||
"//pkg/apis/rbac:go_default_library",
|
"//pkg/apis/rbac:go_default_library",
|
||||||
"//pkg/kubectl:go_default_library",
|
"//pkg/kubectl:go_default_library",
|
||||||
"//pkg/kubectl/cmd/testing:go_default_library",
|
"//pkg/kubectl/cmd/testing:go_default_library",
|
||||||
@ -223,6 +223,7 @@ go_test(
|
|||||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||||
"//vendor/gopkg.in/yaml.v2:go_default_library",
|
"//vendor/gopkg.in/yaml.v2:go_default_library",
|
||||||
"//vendor/k8s.io/api/core/v1:go_default_library",
|
"//vendor/k8s.io/api/core/v1:go_default_library",
|
||||||
|
"//vendor/k8s.io/api/policy/v1beta1:go_default_library",
|
||||||
"//vendor/k8s.io/api/rbac/v1beta1:go_default_library",
|
"//vendor/k8s.io/api/rbac/v1beta1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
|
@ -28,6 +28,7 @@ import (
|
|||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
policyv1beta1 "k8s.io/api/policy/v1beta1"
|
||||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
"k8s.io/apimachinery/pkg/api/meta"
|
"k8s.io/apimachinery/pkg/api/meta"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@ -38,11 +39,9 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/strategicpatch"
|
"k8s.io/apimachinery/pkg/util/strategicpatch"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
|
"k8s.io/client-go/kubernetes"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/api"
|
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
|
|
||||||
"k8s.io/kubernetes/pkg/kubectl"
|
"k8s.io/kubernetes/pkg/kubectl"
|
||||||
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
"k8s.io/kubernetes/pkg/kubectl/cmd/templates"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
@ -51,7 +50,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type DrainOptions struct {
|
type DrainOptions struct {
|
||||||
client internalclientset.Interface
|
client kubernetes.Interface
|
||||||
restClient *restclient.RESTClient
|
restClient *restclient.RESTClient
|
||||||
Factory cmdutil.Factory
|
Factory cmdutil.Factory
|
||||||
Force bool
|
Force bool
|
||||||
@ -71,7 +70,7 @@ type DrainOptions struct {
|
|||||||
|
|
||||||
// Takes a pod and returns a bool indicating whether or not to operate on the
|
// Takes a pod and returns a bool indicating whether or not to operate on the
|
||||||
// pod, an optional warning message, and an optional fatal error.
|
// pod, an optional warning message, and an optional fatal error.
|
||||||
type podFilter func(api.Pod) (include bool, w *warning, f *fatal)
|
type podFilter func(corev1.Pod) (include bool, w *warning, f *fatal)
|
||||||
type warning struct {
|
type warning struct {
|
||||||
string
|
string
|
||||||
}
|
}
|
||||||
@ -220,7 +219,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
o.DryRun = cmdutil.GetFlagBool(cmd, "dry-run")
|
o.DryRun = cmdutil.GetFlagBool(cmd, "dry-run")
|
||||||
|
|
||||||
if o.client, err = o.Factory.ClientSet(); err != nil {
|
if o.client, err = o.Factory.KubernetesClientSet(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -339,12 +338,12 @@ func (o *DrainOptions) getController(namespace string, controllerRef *metav1.Own
|
|||||||
case "ReplicaSet":
|
case "ReplicaSet":
|
||||||
return o.client.Extensions().ReplicaSets(namespace).Get(controllerRef.Name, metav1.GetOptions{})
|
return o.client.Extensions().ReplicaSets(namespace).Get(controllerRef.Name, metav1.GetOptions{})
|
||||||
case "StatefulSet":
|
case "StatefulSet":
|
||||||
return o.client.Apps().StatefulSets(namespace).Get(controllerRef.Name, metav1.GetOptions{})
|
return o.client.AppsV1beta1().StatefulSets(namespace).Get(controllerRef.Name, metav1.GetOptions{})
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("Unknown controller kind %q", controllerRef.Kind)
|
return nil, fmt.Errorf("Unknown controller kind %q", controllerRef.Kind)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DrainOptions) getPodController(pod api.Pod) (*metav1.OwnerReference, error) {
|
func (o *DrainOptions) getPodController(pod corev1.Pod) (*metav1.OwnerReference, error) {
|
||||||
controllerRef := metav1.GetControllerOf(&pod)
|
controllerRef := metav1.GetControllerOf(&pod)
|
||||||
if controllerRef == nil {
|
if controllerRef == nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@ -362,9 +361,9 @@ func (o *DrainOptions) getPodController(pod api.Pod) (*metav1.OwnerReference, er
|
|||||||
return controllerRef, nil
|
return controllerRef, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DrainOptions) unreplicatedFilter(pod api.Pod) (bool, *warning, *fatal) {
|
func (o *DrainOptions) unreplicatedFilter(pod corev1.Pod) (bool, *warning, *fatal) {
|
||||||
// any finished pod can be removed
|
// any finished pod can be removed
|
||||||
if pod.Status.Phase == api.PodSucceeded || pod.Status.Phase == api.PodFailed {
|
if pod.Status.Phase == corev1.PodSucceeded || pod.Status.Phase == corev1.PodFailed {
|
||||||
return true, nil, nil
|
return true, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,7 +384,7 @@ func (o *DrainOptions) unreplicatedFilter(pod api.Pod) (bool, *warning, *fatal)
|
|||||||
return true, &warning{kUnmanagedWarning}, nil
|
return true, &warning{kUnmanagedWarning}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DrainOptions) daemonsetFilter(pod api.Pod) (bool, *warning, *fatal) {
|
func (o *DrainOptions) daemonsetFilter(pod corev1.Pod) (bool, *warning, *fatal) {
|
||||||
// Note that we return false in cases where the pod is DaemonSet managed,
|
// Note that we return false in cases where the pod is DaemonSet managed,
|
||||||
// regardless of flags. We never delete them, the only question is whether
|
// regardless of flags. We never delete them, the only question is whether
|
||||||
// their presence constitutes an error.
|
// their presence constitutes an error.
|
||||||
@ -413,14 +412,14 @@ func (o *DrainOptions) daemonsetFilter(pod api.Pod) (bool, *warning, *fatal) {
|
|||||||
return false, &warning{kDaemonsetWarning}, nil
|
return false, &warning{kDaemonsetWarning}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mirrorPodFilter(pod api.Pod) (bool, *warning, *fatal) {
|
func mirrorPodFilter(pod corev1.Pod) (bool, *warning, *fatal) {
|
||||||
if _, found := pod.ObjectMeta.Annotations[corev1.MirrorPodAnnotationKey]; found {
|
if _, found := pod.ObjectMeta.Annotations[corev1.MirrorPodAnnotationKey]; found {
|
||||||
return false, nil, nil
|
return false, nil, nil
|
||||||
}
|
}
|
||||||
return true, nil, nil
|
return true, nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasLocalStorage(pod api.Pod) bool {
|
func hasLocalStorage(pod corev1.Pod) bool {
|
||||||
for _, volume := range pod.Spec.Volumes {
|
for _, volume := range pod.Spec.Volumes {
|
||||||
if volume.EmptyDir != nil {
|
if volume.EmptyDir != nil {
|
||||||
return true
|
return true
|
||||||
@ -430,7 +429,7 @@ func hasLocalStorage(pod api.Pod) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DrainOptions) localStorageFilter(pod api.Pod) (bool, *warning, *fatal) {
|
func (o *DrainOptions) localStorageFilter(pod corev1.Pod) (bool, *warning, *fatal) {
|
||||||
if !hasLocalStorage(pod) {
|
if !hasLocalStorage(pod) {
|
||||||
return true, nil, nil
|
return true, nil, nil
|
||||||
}
|
}
|
||||||
@ -454,7 +453,7 @@ func (ps podStatuses) Message() string {
|
|||||||
|
|
||||||
// getPodsForDeletion receives resource info for a node, and returns all the pods from the given node that we
|
// getPodsForDeletion receives resource info for a node, and returns all the pods from the given node that we
|
||||||
// are planning on deleting. If there are any pods preventing us from deleting, we return that list in an error.
|
// are planning on deleting. If there are any pods preventing us from deleting, we return that list in an error.
|
||||||
func (o *DrainOptions) getPodsForDeletion(nodeInfo *resource.Info) (pods []api.Pod, err error) {
|
func (o *DrainOptions) getPodsForDeletion(nodeInfo *resource.Info) (pods []corev1.Pod, err error) {
|
||||||
podList, err := o.client.Core().Pods(metav1.NamespaceAll).List(metav1.ListOptions{
|
podList, err := o.client.Core().Pods(metav1.NamespaceAll).List(metav1.ListOptions{
|
||||||
FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": nodeInfo.Name}).String()})
|
FieldSelector: fields.SelectorFromSet(fields.Set{"spec.nodeName": nodeInfo.Name}).String()})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -483,7 +482,7 @@ func (o *DrainOptions) getPodsForDeletion(nodeInfo *resource.Info) (pods []api.P
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(fs) > 0 {
|
if len(fs) > 0 {
|
||||||
return []api.Pod{}, errors.New(fs.Message())
|
return []corev1.Pod{}, errors.New(fs.Message())
|
||||||
}
|
}
|
||||||
if len(ws) > 0 {
|
if len(ws) > 0 {
|
||||||
fmt.Fprintf(o.ErrOut, "WARNING: %s\n", ws.Message())
|
fmt.Fprintf(o.ErrOut, "WARNING: %s\n", ws.Message())
|
||||||
@ -491,7 +490,7 @@ func (o *DrainOptions) getPodsForDeletion(nodeInfo *resource.Info) (pods []api.P
|
|||||||
return pods, nil
|
return pods, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DrainOptions) deletePod(pod api.Pod) error {
|
func (o *DrainOptions) deletePod(pod corev1.Pod) error {
|
||||||
deleteOptions := &metav1.DeleteOptions{}
|
deleteOptions := &metav1.DeleteOptions{}
|
||||||
if o.GracePeriodSeconds >= 0 {
|
if o.GracePeriodSeconds >= 0 {
|
||||||
gracePeriodSeconds := int64(o.GracePeriodSeconds)
|
gracePeriodSeconds := int64(o.GracePeriodSeconds)
|
||||||
@ -500,13 +499,13 @@ func (o *DrainOptions) deletePod(pod api.Pod) error {
|
|||||||
return o.client.Core().Pods(pod.Namespace).Delete(pod.Name, deleteOptions)
|
return o.client.Core().Pods(pod.Namespace).Delete(pod.Name, deleteOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DrainOptions) evictPod(pod api.Pod, policyGroupVersion string) error {
|
func (o *DrainOptions) evictPod(pod corev1.Pod, policyGroupVersion string) error {
|
||||||
deleteOptions := &metav1.DeleteOptions{}
|
deleteOptions := &metav1.DeleteOptions{}
|
||||||
if o.GracePeriodSeconds >= 0 {
|
if o.GracePeriodSeconds >= 0 {
|
||||||
gracePeriodSeconds := int64(o.GracePeriodSeconds)
|
gracePeriodSeconds := int64(o.GracePeriodSeconds)
|
||||||
deleteOptions.GracePeriodSeconds = &gracePeriodSeconds
|
deleteOptions.GracePeriodSeconds = &gracePeriodSeconds
|
||||||
}
|
}
|
||||||
eviction := &policy.Eviction{
|
eviction := &policyv1beta1.Eviction{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
APIVersion: policyGroupVersion,
|
APIVersion: policyGroupVersion,
|
||||||
Kind: EvictionKind,
|
Kind: EvictionKind,
|
||||||
@ -522,7 +521,7 @@ func (o *DrainOptions) evictPod(pod api.Pod, policyGroupVersion string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// deleteOrEvictPods deletes or evicts the pods on the api server
|
// deleteOrEvictPods deletes or evicts the pods on the api server
|
||||||
func (o *DrainOptions) deleteOrEvictPods(pods []api.Pod) error {
|
func (o *DrainOptions) deleteOrEvictPods(pods []corev1.Pod) error {
|
||||||
if len(pods) == 0 {
|
if len(pods) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -532,7 +531,7 @@ func (o *DrainOptions) deleteOrEvictPods(pods []api.Pod) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
getPodFn := func(namespace, name string) (*api.Pod, error) {
|
getPodFn := func(namespace, name string) (*corev1.Pod, error) {
|
||||||
return o.client.Core().Pods(namespace).Get(name, metav1.GetOptions{})
|
return o.client.Core().Pods(namespace).Get(name, metav1.GetOptions{})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -543,12 +542,12 @@ func (o *DrainOptions) deleteOrEvictPods(pods []api.Pod) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DrainOptions) evictPods(pods []api.Pod, policyGroupVersion string, getPodFn func(namespace, name string) (*api.Pod, error)) error {
|
func (o *DrainOptions) evictPods(pods []corev1.Pod, policyGroupVersion string, getPodFn func(namespace, name string) (*corev1.Pod, error)) error {
|
||||||
doneCh := make(chan bool, len(pods))
|
doneCh := make(chan bool, len(pods))
|
||||||
errCh := make(chan error, 1)
|
errCh := make(chan error, 1)
|
||||||
|
|
||||||
for _, pod := range pods {
|
for _, pod := range pods {
|
||||||
go func(pod api.Pod, doneCh chan bool, errCh chan error) {
|
go func(pod corev1.Pod, doneCh chan bool, errCh chan error) {
|
||||||
var err error
|
var err error
|
||||||
for {
|
for {
|
||||||
err = o.evictPod(pod, policyGroupVersion)
|
err = o.evictPod(pod, policyGroupVersion)
|
||||||
@ -564,7 +563,7 @@ func (o *DrainOptions) evictPods(pods []api.Pod, policyGroupVersion string, getP
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
podArray := []api.Pod{pod}
|
podArray := []corev1.Pod{pod}
|
||||||
_, err = o.waitForDelete(podArray, kubectl.Interval, time.Duration(math.MaxInt64), true, getPodFn)
|
_, err = o.waitForDelete(podArray, kubectl.Interval, time.Duration(math.MaxInt64), true, getPodFn)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
doneCh <- true
|
doneCh <- true
|
||||||
@ -597,7 +596,7 @@ func (o *DrainOptions) evictPods(pods []api.Pod, policyGroupVersion string, getP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DrainOptions) deletePods(pods []api.Pod, getPodFn func(namespace, name string) (*api.Pod, error)) error {
|
func (o *DrainOptions) deletePods(pods []corev1.Pod, getPodFn func(namespace, name string) (*corev1.Pod, error)) error {
|
||||||
// 0 timeout means infinite, we use MaxInt64 to represent it.
|
// 0 timeout means infinite, we use MaxInt64 to represent it.
|
||||||
var globalTimeout time.Duration
|
var globalTimeout time.Duration
|
||||||
if o.Timeout == 0 {
|
if o.Timeout == 0 {
|
||||||
@ -615,7 +614,7 @@ func (o *DrainOptions) deletePods(pods []api.Pod, getPodFn func(namespace, name
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *DrainOptions) waitForDelete(pods []api.Pod, interval, timeout time.Duration, usingEviction bool, getPodFn func(string, string) (*api.Pod, error)) ([]api.Pod, error) {
|
func (o *DrainOptions) waitForDelete(pods []corev1.Pod, interval, timeout time.Duration, usingEviction bool, getPodFn func(string, string) (*corev1.Pod, error)) ([]corev1.Pod, error) {
|
||||||
var verbStr string
|
var verbStr string
|
||||||
if usingEviction {
|
if usingEviction {
|
||||||
verbStr = "evicted"
|
verbStr = "evicted"
|
||||||
@ -623,7 +622,7 @@ func (o *DrainOptions) waitForDelete(pods []api.Pod, interval, timeout time.Dura
|
|||||||
verbStr = "deleted"
|
verbStr = "deleted"
|
||||||
}
|
}
|
||||||
err := wait.PollImmediate(interval, timeout, func() (bool, error) {
|
err := wait.PollImmediate(interval, timeout, func() (bool, error) {
|
||||||
pendingPods := []api.Pod{}
|
pendingPods := []corev1.Pod{}
|
||||||
for i, pod := range pods {
|
for i, pod := range pods {
|
||||||
p, err := getPodFn(pod.Namespace, pod.Name)
|
p, err := getPodFn(pod.Namespace, pod.Name)
|
||||||
if apierrors.IsNotFound(err) || (p != nil && p.ObjectMeta.UID != pod.ObjectMeta.UID) {
|
if apierrors.IsNotFound(err) || (p != nil && p.ObjectMeta.UID != pod.ObjectMeta.UID) {
|
||||||
@ -646,7 +645,7 @@ func (o *DrainOptions) waitForDelete(pods []api.Pod, interval, timeout time.Dura
|
|||||||
|
|
||||||
// SupportEviction uses Discovery API to find out if the server support eviction subresource
|
// SupportEviction uses Discovery API to find out if the server support eviction subresource
|
||||||
// If support, it will return its groupVersion; Otherwise, it will return ""
|
// If support, it will return its groupVersion; Otherwise, it will return ""
|
||||||
func SupportEviction(clientset internalclientset.Interface) (string, error) {
|
func SupportEviction(clientset kubernetes.Interface) (string, error) {
|
||||||
discoveryClient := clientset.Discovery()
|
discoveryClient := clientset.Discovery()
|
||||||
groupList, err := discoveryClient.ServerGroups()
|
groupList, err := discoveryClient.ServerGroups()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -33,7 +33,8 @@ import (
|
|||||||
|
|
||||||
"github.com/spf13/cobra"
|
"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"
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
@ -48,7 +49,6 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/api/testapi"
|
"k8s.io/kubernetes/pkg/api/testapi"
|
||||||
"k8s.io/kubernetes/pkg/apis/batch"
|
"k8s.io/kubernetes/pkg/apis/batch"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"k8s.io/kubernetes/pkg/apis/extensions"
|
||||||
"k8s.io/kubernetes/pkg/apis/policy"
|
|
||||||
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
|
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
)
|
)
|
||||||
@ -58,22 +58,22 @@ const (
|
|||||||
DeleteMethod = "Delete"
|
DeleteMethod = "Delete"
|
||||||
)
|
)
|
||||||
|
|
||||||
var node *v1.Node
|
var node *corev1.Node
|
||||||
var cordoned_node *v1.Node
|
var cordoned_node *corev1.Node
|
||||||
|
|
||||||
func boolptr(b bool) *bool { return &b }
|
func boolptr(b bool) *bool { return &b }
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
// Create a node.
|
// Create a node.
|
||||||
node = &v1.Node{
|
node = &corev1.Node{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "node",
|
Name: "node",
|
||||||
CreationTimestamp: metav1.Time{Time: time.Now()},
|
CreationTimestamp: metav1.Time{Time: time.Now()},
|
||||||
},
|
},
|
||||||
Spec: v1.NodeSpec{
|
Spec: corev1.NodeSpec{
|
||||||
ExternalID: "node",
|
ExternalID: "node",
|
||||||
},
|
},
|
||||||
Status: v1.NodeStatus{},
|
Status: corev1.NodeStatus{},
|
||||||
}
|
}
|
||||||
|
|
||||||
// A copy of the same node, but cordoned.
|
// A copy of the same node, but cordoned.
|
||||||
@ -85,8 +85,8 @@ func TestMain(m *testing.M) {
|
|||||||
func TestCordon(t *testing.T) {
|
func TestCordon(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
description string
|
description string
|
||||||
node *v1.Node
|
node *corev1.Node
|
||||||
expected *v1.Node
|
expected *corev1.Node
|
||||||
cmd func(cmdutil.Factory, io.Writer) *cobra.Command
|
cmd func(cmdutil.Factory, io.Writer) *cobra.Command
|
||||||
arg string
|
arg string
|
||||||
expectFatal bool
|
expectFatal bool
|
||||||
@ -151,7 +151,7 @@ func TestCordon(t *testing.T) {
|
|||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
f, tf, codec, ns := cmdtesting.NewAPIFactory()
|
f, tf, codec, ns := cmdtesting.NewAPIFactory()
|
||||||
new_node := &v1.Node{}
|
new_node := &corev1.Node{}
|
||||||
updated := false
|
updated := false
|
||||||
tf.Client = &fake.RESTClient{
|
tf.Client = &fake.RESTClient{
|
||||||
GroupVersion: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion,
|
GroupVersion: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersion,
|
||||||
@ -173,7 +173,7 @@ func TestCordon(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("%s: unexpected error: %v", test.description, err)
|
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 {
|
if err != nil {
|
||||||
t.Fatalf("%s: unexpected error: %v", test.description, err)
|
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 := make(map[string]string)
|
||||||
rc_anno[api.CreatedByAnnotation] = refJson(t, &rc)
|
rc_anno[api.CreatedByAnnotation] = refJson(t, &rc)
|
||||||
|
|
||||||
rc_pod := api.Pod{
|
rc_pod := corev1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "bar",
|
Name: "bar",
|
||||||
Namespace: "default",
|
Namespace: "default",
|
||||||
@ -269,7 +269,7 @@ func TestDrain(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Spec: api.PodSpec{
|
Spec: corev1.PodSpec{
|
||||||
NodeName: "node",
|
NodeName: "node",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -289,7 +289,7 @@ func TestDrain(t *testing.T) {
|
|||||||
ds_anno := make(map[string]string)
|
ds_anno := make(map[string]string)
|
||||||
ds_anno[api.CreatedByAnnotation] = refJson(t, &ds)
|
ds_anno[api.CreatedByAnnotation] = refJson(t, &ds)
|
||||||
|
|
||||||
ds_pod := api.Pod{
|
ds_pod := corev1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "bar",
|
Name: "bar",
|
||||||
Namespace: "default",
|
Namespace: "default",
|
||||||
@ -307,7 +307,7 @@ func TestDrain(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Spec: api.PodSpec{
|
Spec: corev1.PodSpec{
|
||||||
NodeName: "node",
|
NodeName: "node",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -327,7 +327,7 @@ func TestDrain(t *testing.T) {
|
|||||||
missing_ds_anno := make(map[string]string)
|
missing_ds_anno := make(map[string]string)
|
||||||
missing_ds_anno[api.CreatedByAnnotation] = refJson(t, &missing_ds)
|
missing_ds_anno[api.CreatedByAnnotation] = refJson(t, &missing_ds)
|
||||||
|
|
||||||
orphaned_ds_pod := api.Pod{
|
orphaned_ds_pod := corev1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "bar",
|
Name: "bar",
|
||||||
Namespace: "default",
|
Namespace: "default",
|
||||||
@ -345,7 +345,7 @@ func TestDrain(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Spec: api.PodSpec{
|
Spec: corev1.PodSpec{
|
||||||
NodeName: "node",
|
NodeName: "node",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -362,7 +362,7 @@ func TestDrain(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
job_pod := api.Pod{
|
job_pod := corev1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "bar",
|
Name: "bar",
|
||||||
Namespace: "default",
|
Namespace: "default",
|
||||||
@ -398,7 +398,7 @@ func TestDrain(t *testing.T) {
|
|||||||
rs_anno := make(map[string]string)
|
rs_anno := make(map[string]string)
|
||||||
rs_anno[api.CreatedByAnnotation] = refJson(t, &rs)
|
rs_anno[api.CreatedByAnnotation] = refJson(t, &rs)
|
||||||
|
|
||||||
rs_pod := api.Pod{
|
rs_pod := corev1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "bar",
|
Name: "bar",
|
||||||
Namespace: "default",
|
Namespace: "default",
|
||||||
@ -416,36 +416,36 @@ func TestDrain(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Spec: api.PodSpec{
|
Spec: corev1.PodSpec{
|
||||||
NodeName: "node",
|
NodeName: "node",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
naked_pod := api.Pod{
|
naked_pod := corev1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "bar",
|
Name: "bar",
|
||||||
Namespace: "default",
|
Namespace: "default",
|
||||||
CreationTimestamp: metav1.Time{Time: time.Now()},
|
CreationTimestamp: metav1.Time{Time: time.Now()},
|
||||||
Labels: labels,
|
Labels: labels,
|
||||||
},
|
},
|
||||||
Spec: api.PodSpec{
|
Spec: corev1.PodSpec{
|
||||||
NodeName: "node",
|
NodeName: "node",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
emptydir_pod := api.Pod{
|
emptydir_pod := corev1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "bar",
|
Name: "bar",
|
||||||
Namespace: "default",
|
Namespace: "default",
|
||||||
CreationTimestamp: metav1.Time{Time: time.Now()},
|
CreationTimestamp: metav1.Time{Time: time.Now()},
|
||||||
Labels: labels,
|
Labels: labels,
|
||||||
},
|
},
|
||||||
Spec: api.PodSpec{
|
Spec: corev1.PodSpec{
|
||||||
NodeName: "node",
|
NodeName: "node",
|
||||||
Volumes: []api.Volume{
|
Volumes: []corev1.Volume{
|
||||||
{
|
{
|
||||||
Name: "scratch",
|
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 {
|
tests := []struct {
|
||||||
description string
|
description string
|
||||||
node *v1.Node
|
node *corev1.Node
|
||||||
expected *v1.Node
|
expected *corev1.Node
|
||||||
pods []api.Pod
|
pods []corev1.Pod
|
||||||
rcs []api.ReplicationController
|
rcs []api.ReplicationController
|
||||||
replicaSets []extensions.ReplicaSet
|
replicaSets []extensions.ReplicaSet
|
||||||
args []string
|
args []string
|
||||||
@ -466,7 +466,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "RC-managed pod",
|
description: "RC-managed pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{rc_pod},
|
pods: []corev1.Pod{rc_pod},
|
||||||
rcs: []api.ReplicationController{rc},
|
rcs: []api.ReplicationController{rc},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
@ -476,7 +476,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "DS-managed pod",
|
description: "DS-managed pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{ds_pod},
|
pods: []corev1.Pod{ds_pod},
|
||||||
rcs: []api.ReplicationController{rc},
|
rcs: []api.ReplicationController{rc},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: true,
|
expectFatal: true,
|
||||||
@ -486,7 +486,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "orphaned DS-managed pod",
|
description: "orphaned DS-managed pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{orphaned_ds_pod},
|
pods: []corev1.Pod{orphaned_ds_pod},
|
||||||
rcs: []api.ReplicationController{},
|
rcs: []api.ReplicationController{},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: true,
|
expectFatal: true,
|
||||||
@ -496,7 +496,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "orphaned DS-managed pod with --force",
|
description: "orphaned DS-managed pod with --force",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{orphaned_ds_pod},
|
pods: []corev1.Pod{orphaned_ds_pod},
|
||||||
rcs: []api.ReplicationController{},
|
rcs: []api.ReplicationController{},
|
||||||
args: []string{"node", "--force"},
|
args: []string{"node", "--force"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
@ -506,7 +506,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "DS-managed pod with --ignore-daemonsets",
|
description: "DS-managed pod with --ignore-daemonsets",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{ds_pod},
|
pods: []corev1.Pod{ds_pod},
|
||||||
rcs: []api.ReplicationController{rc},
|
rcs: []api.ReplicationController{rc},
|
||||||
args: []string{"node", "--ignore-daemonsets"},
|
args: []string{"node", "--ignore-daemonsets"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
@ -516,7 +516,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "Job-managed pod",
|
description: "Job-managed pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{job_pod},
|
pods: []corev1.Pod{job_pod},
|
||||||
rcs: []api.ReplicationController{rc},
|
rcs: []api.ReplicationController{rc},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
@ -526,7 +526,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "RS-managed pod",
|
description: "RS-managed pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{rs_pod},
|
pods: []corev1.Pod{rs_pod},
|
||||||
replicaSets: []extensions.ReplicaSet{rs},
|
replicaSets: []extensions.ReplicaSet{rs},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
@ -536,7 +536,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "naked pod",
|
description: "naked pod",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{naked_pod},
|
pods: []corev1.Pod{naked_pod},
|
||||||
rcs: []api.ReplicationController{},
|
rcs: []api.ReplicationController{},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: true,
|
expectFatal: true,
|
||||||
@ -546,7 +546,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "naked pod with --force",
|
description: "naked pod with --force",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{naked_pod},
|
pods: []corev1.Pod{naked_pod},
|
||||||
rcs: []api.ReplicationController{},
|
rcs: []api.ReplicationController{},
|
||||||
args: []string{"node", "--force"},
|
args: []string{"node", "--force"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
@ -556,7 +556,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "pod with EmptyDir",
|
description: "pod with EmptyDir",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{emptydir_pod},
|
pods: []corev1.Pod{emptydir_pod},
|
||||||
args: []string{"node", "--force"},
|
args: []string{"node", "--force"},
|
||||||
expectFatal: true,
|
expectFatal: true,
|
||||||
expectDelete: false,
|
expectDelete: false,
|
||||||
@ -565,7 +565,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "pod with EmptyDir and --delete-local-data",
|
description: "pod with EmptyDir and --delete-local-data",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{emptydir_pod},
|
pods: []corev1.Pod{emptydir_pod},
|
||||||
args: []string{"node", "--force", "--delete-local-data=true"},
|
args: []string{"node", "--force", "--delete-local-data=true"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
expectDelete: true,
|
expectDelete: true,
|
||||||
@ -574,7 +574,7 @@ func TestDrain(t *testing.T) {
|
|||||||
description: "empty node",
|
description: "empty node",
|
||||||
node: node,
|
node: node,
|
||||||
expected: cordoned_node,
|
expected: cordoned_node,
|
||||||
pods: []api.Pod{},
|
pods: []corev1.Pod{},
|
||||||
rcs: []api.ReplicationController{rc},
|
rcs: []api.ReplicationController{rc},
|
||||||
args: []string{"node"},
|
args: []string{"node"},
|
||||||
expectFatal: false,
|
expectFatal: false,
|
||||||
@ -592,7 +592,7 @@ func TestDrain(t *testing.T) {
|
|||||||
currMethod = DeleteMethod
|
currMethod = DeleteMethod
|
||||||
}
|
}
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
new_node := &v1.Node{}
|
new_node := &corev1.Node{}
|
||||||
deleted := false
|
deleted := false
|
||||||
evicted := false
|
evicted := false
|
||||||
f, tf, codec, ns := cmdtesting.NewAPIFactory()
|
f, tf, codec, ns := cmdtesting.NewAPIFactory()
|
||||||
@ -645,7 +645,7 @@ func TestDrain(t *testing.T) {
|
|||||||
case m.isFor("GET", "/namespaces/default/replicasets/rs"):
|
case m.isFor("GET", "/namespaces/default/replicasets/rs"):
|
||||||
return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(testapi.Extensions.Codec(), &test.replicaSets[0])}, nil
|
return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(testapi.Extensions.Codec(), &test.replicaSets[0])}, nil
|
||||||
case m.isFor("GET", "/namespaces/default/pods/bar"):
|
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"):
|
case m.isFor("GET", "/pods"):
|
||||||
values, err := url.ParseQuery(req.URL.RawQuery)
|
values, err := url.ParseQuery(req.URL.RawQuery)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -656,7 +656,7 @@ func TestDrain(t *testing.T) {
|
|||||||
if !reflect.DeepEqual(get_params, values) {
|
if !reflect.DeepEqual(get_params, values) {
|
||||||
t.Fatalf("%s: expected:\n%v\nsaw:\n%v\n", test.description, 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"):
|
case m.isFor("GET", "/replicationcontrollers"):
|
||||||
return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, &api.ReplicationControllerList{Items: test.rcs})}, nil
|
return &http.Response{StatusCode: 200, Header: defaultHeader(), Body: objBody(codec, &api.ReplicationControllerList{Items: test.rcs})}, nil
|
||||||
case m.isFor("PATCH", "/nodes/node"):
|
case m.isFor("PATCH", "/nodes/node"):
|
||||||
@ -669,7 +669,7 @@ func TestDrain(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("%s: unexpected error: %v", test.description, err)
|
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 {
|
if err != nil {
|
||||||
t.Fatalf("%s: unexpected error: %v", test.description, err)
|
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
|
return &http.Response{StatusCode: 204, Header: defaultHeader(), Body: objBody(codec, &test.pods[0])}, nil
|
||||||
case m.isFor("POST", "/namespaces/default/pods/bar/eviction"):
|
case m.isFor("POST", "/namespaces/default/pods/bar/eviction"):
|
||||||
evicted = true
|
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:
|
default:
|
||||||
t.Fatalf("%s: unexpected request: %v %#v\n%#v", test.description, req.Method, req.URL, req)
|
t.Fatalf("%s: unexpected request: %v %#v\n%#v", test.description, req.Method, req.URL, req)
|
||||||
return nil, nil
|
return nil, nil
|
||||||
@ -744,7 +744,7 @@ func TestDeletePods(t *testing.T) {
|
|||||||
expectPendingPods bool
|
expectPendingPods bool
|
||||||
expectError bool
|
expectError bool
|
||||||
expectedError *error
|
expectedError *error
|
||||||
getPodFn func(namespace, name string) (*api.Pod, error)
|
getPodFn func(namespace, name string) (*corev1.Pod, error)
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
description: "Wait for deleting to complete",
|
description: "Wait for deleting to complete",
|
||||||
@ -753,7 +753,7 @@ func TestDeletePods(t *testing.T) {
|
|||||||
expectPendingPods: false,
|
expectPendingPods: false,
|
||||||
expectError: false,
|
expectError: false,
|
||||||
expectedError: nil,
|
expectedError: nil,
|
||||||
getPodFn: func(namespace, name string) (*api.Pod, error) {
|
getPodFn: func(namespace, name string) (*corev1.Pod, error) {
|
||||||
oldPodMap, _ := createPods(false)
|
oldPodMap, _ := createPods(false)
|
||||||
newPodMap, _ := createPods(true)
|
newPodMap, _ := createPods(true)
|
||||||
if oldPod, found := oldPodMap[name]; found {
|
if oldPod, found := oldPodMap[name]; found {
|
||||||
@ -778,7 +778,7 @@ func TestDeletePods(t *testing.T) {
|
|||||||
expectPendingPods: true,
|
expectPendingPods: true,
|
||||||
expectError: true,
|
expectError: true,
|
||||||
expectedError: &wait.ErrWaitTimeout,
|
expectedError: &wait.ErrWaitTimeout,
|
||||||
getPodFn: func(namespace, name string) (*api.Pod, error) {
|
getPodFn: func(namespace, name string) (*corev1.Pod, error) {
|
||||||
oldPodMap, _ := createPods(false)
|
oldPodMap, _ := createPods(false)
|
||||||
if oldPod, found := oldPodMap[name]; found {
|
if oldPod, found := oldPodMap[name]; found {
|
||||||
return &oldPod, nil
|
return &oldPod, nil
|
||||||
@ -793,7 +793,7 @@ func TestDeletePods(t *testing.T) {
|
|||||||
expectPendingPods: true,
|
expectPendingPods: true,
|
||||||
expectError: true,
|
expectError: true,
|
||||||
expectedError: nil,
|
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")
|
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) {
|
func createPods(ifCreateNewPods bool) (map[string]corev1.Pod, []corev1.Pod) {
|
||||||
podMap := make(map[string]api.Pod)
|
podMap := make(map[string]corev1.Pod)
|
||||||
podSlice := []api.Pod{}
|
podSlice := []corev1.Pod{}
|
||||||
for i := 0; i < 8; i++ {
|
for i := 0; i < 8; i++ {
|
||||||
var uid types.UID
|
var uid types.UID
|
||||||
if ifCreateNewPods {
|
if ifCreateNewPods {
|
||||||
@ -838,7 +838,7 @@ func createPods(ifCreateNewPods bool) (map[string]api.Pod, []api.Pod) {
|
|||||||
} else {
|
} else {
|
||||||
uid = types.UID(strconv.Itoa(i) + strconv.Itoa(i))
|
uid = types.UID(strconv.Itoa(i) + strconv.Itoa(i))
|
||||||
}
|
}
|
||||||
pod := api.Pod{
|
pod := corev1.Pod{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "pod" + strconv.Itoa(i),
|
Name: "pod" + strconv.Itoa(i),
|
||||||
Namespace: "default",
|
Namespace: "default",
|
||||||
|
Loading…
Reference in New Issue
Block a user