diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 5924479a8..b9419cd96 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -34,7 +34,6 @@ import ( apps "k8s.io/kubernetes/pkg/apis/apps/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" @@ -408,7 +407,15 @@ func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, return nil } - selector, err := getSelectorFromObject(currentObj) + versioned, err := c.AsVersionedObject(target.Object) + if runtime.IsNotRegisteredError(err) { + return nil + } + if err != nil { + return err + } + + selector, err := getSelectorFromObject(versioned) if err != nil { return nil } @@ -536,6 +543,17 @@ func getPods(client *internalclientset.Clientset, namespace string, selector map return list.Items, err } +// AsVersionedObject converts a runtime.object to a versioned object. +func (c *Client) AsVersionedObject(obj runtime.Object) (runtime.Object, error) { + json, err := runtime.Encode(runtime.UnstructuredJSONScheme, obj) + if err != nil { + return nil, err + } + versions := &runtime.VersionedObjects{} + err = runtime.DecodeInto(c.Decoder(true), json, versions) + return versions.First(), err +} + // waitForResources polls to get the current status of all pods, PVCs, and Services // until all are ready or a timeout is reached func (c *Client) waitForResources(timeout time.Duration, created Result) error { @@ -546,20 +564,24 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { services := []api.Service{} pvc := []api.PersistentVolumeClaim{} for _, v := range created { - switch value := v.Object.(type) { - case (*api.ReplicationController): + obj, err := c.AsVersionedObject(v.Object) + if err != nil && !runtime.IsNotRegisteredError(err) { + return false, err + } + switch value := obj.(type) { + case (*v1.ReplicationController): list, err := getPods(client, value.Namespace, value.Spec.Selector) if err != nil { return false, err } pods = append(pods, list...) - case (*api.Pod): + case (*v1.Pod): pod, err := client.Pods(value.Namespace).Get(value.Name) if err != nil { return false, err } pods = append(pods, *pod) - case (*extensionsinternal.Deployment): + case (*extensions.Deployment): // Get the RS children first rs, err := client.ReplicaSets(value.Namespace).List(api.ListOptions{ FieldSelector: fields.Everything(), @@ -575,7 +597,7 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { } pods = append(pods, list...) } - case (*extensionsinternal.DaemonSet): + case (*extensions.DaemonSet): list, err := getPods(client, value.Namespace, value.Spec.Selector.MatchLabels) if err != nil { return false, err @@ -587,19 +609,19 @@ func (c *Client) waitForResources(timeout time.Duration, created Result) error { return false, err } pods = append(pods, list...) - case (*extensionsinternal.ReplicaSet): + case (*extensions.ReplicaSet): list, err := getPods(client, value.Namespace, value.Spec.Selector.MatchLabels) if err != nil { return false, err } pods = append(pods, list...) - case (*api.PersistentVolumeClaim): + case (*v1.PersistentVolumeClaim): claim, err := client.PersistentVolumeClaims(value.Namespace).Get(value.Name) if err != nil { return false, err } pvc = append(pvc, *claim) - case (*api.Service): + case (*v1.Service): svc, err := client.Services(value.Namespace).Get(value.Name) if err != nil { return false, err