Commit 790b90b9 authored by Adam Reese's avatar Adam Reese

fix(kube): prevent recreating pods without a selector

parent 318c6f77
......@@ -32,9 +32,10 @@ import (
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/v1"
apps "k8s.io/kubernetes/pkg/apis/apps/v1beta1"
"k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
batchinternal "k8s.io/kubernetes/pkg/apis/batch"
batch "k8s.io/kubernetes/pkg/apis/batch/v1"
extensionsinternal "k8s.io/kubernetes/pkg/apis/extensions"
extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
conditions "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
......@@ -401,25 +402,36 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object,
return err
}
if recreate {
client, _ := c.ClientSet()
return recreatePods(client, target.Namespace, extractSelector(currentObj))
target.Refresh(obj, true)
if !recreate {
return nil
}
selector, err := getSelectorFromObject(currentObj)
if err != nil {
return nil
}
return target.Refresh(obj, true)
client, _ := c.ClientSet()
return recreatePods(client, target.Namespace, selector)
}
func extractSelector(obj runtime.Object) map[string]string {
func getSelectorFromObject(obj runtime.Object) (map[string]string, error) {
switch typed := obj.(type) {
case *v1.ReplicationController:
return typed.Spec.Selector
case *v1beta1.DaemonSet:
return typed.Spec.Selector.MatchLabels
return typed.Spec.Selector, nil
case *extensions.ReplicaSet:
return typed.Spec.Selector.MatchLabels, nil
case *extensions.Deployment:
return typed.Spec.Selector.MatchLabels, nil
case *extensions.DaemonSet:
return typed.Spec.Selector.MatchLabels, nil
case *batch.Job:
return typed.Spec.Selector.MatchLabels, nil
case *apps.StatefulSet:
return typed.Spec.Selector.MatchLabels
case *v1beta1.ReplicaSet:
return typed.Spec.Selector.MatchLabels
return typed.Spec.Selector.MatchLabels, nil
default:
return nil
return nil, fmt.Errorf("Unsupported kind when getting selector: %v", obj)
}
}
......@@ -547,7 +559,7 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error {
return false, err
}
pods = append(pods, *pod)
case (*extensions.Deployment):
case (*extensionsinternal.Deployment):
// Get the RS children first
rs, err := client.ReplicaSets(value.Namespace).List(api.ListOptions{
FieldSelector: fields.Everything(),
......@@ -563,7 +575,7 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error {
}
pods = append(pods, list...)
}
case (*extensions.DaemonSet):
case (*extensionsinternal.DaemonSet):
list, err := getPods(client, value.Namespace, value.Spec.Selector.MatchLabels)
if err != nil {
return false, err
......@@ -575,7 +587,7 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error {
return false, err
}
pods = append(pods, list...)
case (*extensions.ReplicaSet):
case (*extensionsinternal.ReplicaSet):
list, err := getPods(client, value.Namespace, value.Spec.Selector.MatchLabels)
if err != nil {
return false, err
......@@ -603,15 +615,15 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error {
//
// This operates on an event returned from a watcher.
func waitForJob(e watch.Event, name string) (bool, error) {
o, ok := e.Object.(*batch.Job)
o, ok := e.Object.(*batchinternal.Job)
if !ok {
return true, fmt.Errorf("Expected %s to be a *batch.Job, got %T", name, e.Object)
}
for _, c := range o.Status.Conditions {
if c.Type == batch.JobComplete && c.Status == api.ConditionTrue {
if c.Type == batchinternal.JobComplete && c.Status == api.ConditionTrue {
return true, nil
} else if c.Type == batch.JobFailed && c.Status == api.ConditionTrue {
} else if c.Type == batchinternal.JobFailed && c.Status == api.ConditionTrue {
return true, fmt.Errorf("Job failed: %s", c.Reason)
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment