diff --git a/pkg/kubectl/cmd/apply.go b/pkg/kubectl/cmd/apply.go index 12cfa204f7b..752b919d86b 100644 --- a/pkg/kubectl/cmd/apply.go +++ b/pkg/kubectl/cmd/apply.go @@ -591,7 +591,7 @@ type pruner struct { } func (p *pruner) prune(f cmdutil.Factory, namespace string, mapping *meta.RESTMapping, includeUninitialized bool) error { - objList, err := p.dynamicClient.Resource(mapping.GroupVersionKind.GroupVersion().WithResource(mapping.Resource)). + objList, err := p.dynamicClient.Resource(mapping.Resource). Namespace(namespace). List(metav1.ListOptions{ LabelSelector: p.labelSelector, @@ -647,7 +647,7 @@ func (p *pruner) delete(namespace, name string, mapping *meta.RESTMapping, scale func runDelete(namespace, name string, mapping *meta.RESTMapping, c dynamic.DynamicInterface, cascade bool, gracePeriod int, clientsetFunc func() (internalclientset.Interface, error), scaleClient scaleclient.ScalesGetter) error { if !cascade { - return c.Resource(mapping.GroupVersionKind.GroupVersion().WithResource(mapping.Resource)).Namespace(namespace).Delete(name, nil) + return c.Resource(mapping.Resource).Namespace(namespace).Delete(name, nil) } cs, err := clientsetFunc() if err != nil { @@ -658,7 +658,7 @@ func runDelete(namespace, name string, mapping *meta.RESTMapping, c dynamic.Dyna if _, ok := err.(*kubectl.NoSuchReaperError); !ok { return err } - return c.Resource(mapping.GroupVersionKind.GroupVersion().WithResource(mapping.Resource)).Namespace(namespace).Delete(name, nil) + return c.Resource(mapping.Resource).Namespace(namespace).Delete(name, nil) } var options *metav1.DeleteOptions if gracePeriod >= 0 { diff --git a/pkg/kubectl/cmd/create/create.go b/pkg/kubectl/cmd/create/create.go index 8506481abb2..14b3ba7152e 100644 --- a/pkg/kubectl/cmd/create/create.go +++ b/pkg/kubectl/cmd/create/create.go @@ -421,7 +421,7 @@ func RunCreateSubcommand(f cmdutil.Factory, options *CreateSubcommandOptions) er if mapping.Scope.Name() == meta.RESTScopeNameRoot { namespace = "" } - actualObject, err := dynamicClient.Resource(mapping.GroupVersionKind.GroupVersion().WithResource(mapping.Resource)).Namespace(namespace).Create(asUnstructured) + actualObject, err := dynamicClient.Resource(mapping.Resource).Namespace(namespace).Create(asUnstructured) if err != nil { return err } diff --git a/pkg/kubectl/cmd/expose.go b/pkg/kubectl/cmd/expose.go index 574e9f6c43e..59f7bb70abd 100644 --- a/pkg/kubectl/cmd/expose.go +++ b/pkg/kubectl/cmd/expose.go @@ -346,7 +346,7 @@ func (o *ExposeServiceOptions) RunExpose(cmd *cobra.Command, args []string) erro return err } // Serialize the object with the annotation applied. - actualObject, err := o.DynamicClient.Resource(objMapping.GroupVersionKind.GroupVersion().WithResource(objMapping.Resource)).Namespace(o.Namespace).Create(asUnstructured) + actualObject, err := o.DynamicClient.Resource(objMapping.Resource).Namespace(o.Namespace).Create(asUnstructured) if err != nil { return err } diff --git a/pkg/kubectl/cmd/set/BUILD b/pkg/kubectl/cmd/set/BUILD index 3e989609f6b..e07ab919d7f 100644 --- a/pkg/kubectl/cmd/set/BUILD +++ b/pkg/kubectl/cmd/set/BUILD @@ -27,12 +27,14 @@ go_library( "//pkg/kubectl/cmd/util/env:go_default_library", "//pkg/kubectl/genericclioptions:go_default_library", "//pkg/kubectl/resource:go_default_library", + "//pkg/kubectl/scheme:go_default_library", "//pkg/kubectl/util/i18n:go_default_library", "//pkg/printers:go_default_library", "//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/k8s.io/api/core/v1: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/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", @@ -81,6 +83,7 @@ go_test( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/rest/fake:go_default_library", ], diff --git a/pkg/kubectl/cmd/set/set_env.go b/pkg/kubectl/cmd/set/set_env.go index db9d56c9c05..3d94eb5df4c 100644 --- a/pkg/kubectl/cmd/set/set_env.go +++ b/pkg/kubectl/cmd/set/set_env.go @@ -30,12 +30,12 @@ import ( "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/client-go/kubernetes" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" envutil "k8s.io/kubernetes/pkg/kubectl/cmd/util/env" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/printers" ) @@ -241,7 +241,7 @@ func (o *EnvOptions) RunEnv() error { if len(o.From) != 0 { b := o.builder(). - WithScheme(legacyscheme.Scheme). + WithScheme(scheme.Scheme, scheme.Registry.RegisteredGroupVersions()...). LocalParam(o.Local). ContinueOnError(). NamespaceParam(o.namespace).DefaultNamespace(). @@ -261,11 +261,7 @@ func (o *EnvOptions) RunEnv() error { } for _, info := range infos { - versionedObject, err := legacyscheme.Scheme.ConvertToVersion(info.Object, info.Mapping.GroupVersionKind.GroupVersion()) - if err != nil { - return err - } - switch from := versionedObject.(type) { + switch from := info.Object.(type) { case *v1.Secret: for key := range from.Data { envVar := v1.EnvVar{ @@ -309,7 +305,7 @@ func (o *EnvOptions) RunEnv() error { } b := o.builder(). - WithScheme(legacyscheme.Scheme). + WithScheme(scheme.Scheme, scheme.Registry.RegisteredGroupVersions()...). LocalParam(o.Local). ContinueOnError(). NamespaceParam(o.namespace).DefaultNamespace(). @@ -326,8 +322,7 @@ func (o *EnvOptions) RunEnv() error { if err != nil { return err } - patches := CalculatePatches(infos, cmdutil.InternalVersionJSONEncoder(), func(info *resource.Info) ([]byte, error) { - info.Object = cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping) + patches := CalculatePatches(infos, scheme.DefaultJSONEncoder(), func(info *resource.Info) ([]byte, error) { _, err := o.updatePodSpecForObject(info.Object, func(spec *v1.PodSpec) error { resolutionErrorsEncountered := false containers, _ := selectContainers(spec.Containers, o.ContainerSelector) @@ -394,7 +389,7 @@ func (o *EnvOptions) RunEnv() error { }) if err == nil { - return runtime.Encode(cmdutil.InternalVersionJSONEncoder(), info.Object) + return runtime.Encode(scheme.DefaultJSONEncoder(), info.Object) } return nil, err }) @@ -418,7 +413,7 @@ func (o *EnvOptions) RunEnv() error { } if o.Local || o.dryRun { - if err := o.PrintObj(cmdutil.AsDefaultVersionedOrOriginal(patch.Info.Object, patch.Info.Mapping), o.Out); err != nil { + if err := o.PrintObj(patch.Info.Object, o.Out); err != nil { return err } continue @@ -437,7 +432,7 @@ func (o *EnvOptions) RunEnv() error { return fmt.Errorf("at least one environment variable must be provided") } - if err := o.PrintObj(cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping), o.Out); err != nil { + if err := o.PrintObj(info.Object, o.Out); err != nil { return err } } diff --git a/pkg/kubectl/cmd/set/set_env_test.go b/pkg/kubectl/cmd/set/set_env_test.go index b195250fb03..d2813387890 100644 --- a/pkg/kubectl/cmd/set/set_env_test.go +++ b/pkg/kubectl/cmd/set/set_env_test.go @@ -36,9 +36,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" restclient "k8s.io/client-go/rest" "k8s.io/client-go/rest/fake" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/testapi" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" @@ -50,7 +50,7 @@ func TestSetEnvLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := legacyscheme.Codecs + ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, NegotiatedSerializer: ns, @@ -93,7 +93,7 @@ func TestSetMultiResourcesEnvLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := legacyscheme.Codecs + ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, NegotiatedSerializer: ns, @@ -464,7 +464,7 @@ func TestSetEnvRemote(t *testing.T) { defer tf.Cleanup() codec := scheme.Codecs.CodecForVersions(scheme.Codecs.LegacyCodec(groupVersion), scheme.Codecs.UniversalDecoder(groupVersion), groupVersion, groupVersion) - ns := legacyscheme.Codecs + ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Namespace = "test" tf.Client = &fake.RESTClient{ GroupVersion: groupVersion, diff --git a/pkg/kubectl/cmd/set/set_image.go b/pkg/kubectl/cmd/set/set_image.go index 2e327351276..3fe294d981d 100644 --- a/pkg/kubectl/cmd/set/set_image.go +++ b/pkg/kubectl/cmd/set/set_image.go @@ -19,11 +19,9 @@ package set import ( "fmt" - "k8s.io/kubernetes/pkg/api/legacyscheme" - "k8s.io/kubernetes/pkg/printers" - "github.com/golang/glog" "github.com/spf13/cobra" + "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" @@ -32,7 +30,9 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" + "k8s.io/kubernetes/pkg/printers" ) // ImageOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of @@ -161,7 +161,7 @@ func (o *SetImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [ includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) builder := f.NewBuilder(). - WithScheme(legacyscheme.Scheme). + WithScheme(scheme.Scheme, scheme.Registry.RegisteredGroupVersions()...). LocalParam(o.Local). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). @@ -209,9 +209,8 @@ func (o *SetImageOptions) Validate() error { func (o *SetImageOptions) Run() error { allErrs := []error{} - patches := CalculatePatches(o.Infos, cmdutil.InternalVersionJSONEncoder(), func(info *resource.Info) ([]byte, error) { + patches := CalculatePatches(o.Infos, scheme.DefaultJSONEncoder(), func(info *resource.Info) ([]byte, error) { transformed := false - info.Object = cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping) _, err := o.UpdatePodSpecForObject(info.Object, func(spec *v1.PodSpec) error { for name, image := range o.ContainerImages { var ( @@ -259,7 +258,7 @@ func (o *SetImageOptions) Run() error { glog.V(4).Infof("error recording current command: %v", err) } - return runtime.Encode(cmdutil.InternalVersionJSONEncoder(), info.Object) + return runtime.Encode(scheme.DefaultJSONEncoder(), info.Object) }) for _, patch := range patches { @@ -275,7 +274,7 @@ func (o *SetImageOptions) Run() error { } if o.Local || o.DryRun { - if err := o.PrintObj(cmdutil.AsDefaultVersionedOrOriginal(patch.Info.Object, patch.Info.Mapping), o.Out); err != nil { + if err := o.PrintObj(patch.Info.Object, o.Out); err != nil { return err } continue @@ -289,7 +288,7 @@ func (o *SetImageOptions) Run() error { } info.Refresh(obj, true) - if err := o.PrintObj(cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping), o.Out); err != nil { + if err := o.PrintObj(info.Object, o.Out); err != nil { return err } } diff --git a/pkg/kubectl/cmd/set/set_image_test.go b/pkg/kubectl/cmd/set/set_image_test.go index 44e10871b07..0bb79a5b3de 100644 --- a/pkg/kubectl/cmd/set/set_image_test.go +++ b/pkg/kubectl/cmd/set/set_image_test.go @@ -24,9 +24,8 @@ import ( "strings" "testing" - "k8s.io/kubernetes/pkg/printers" - "github.com/stretchr/testify/assert" + appsv1 "k8s.io/api/apps/v1" appsv1beta1 "k8s.io/api/apps/v1beta1" appsv1beta2 "k8s.io/api/apps/v1beta2" @@ -36,21 +35,22 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" restclient "k8s.io/client-go/rest" "k8s.io/client-go/rest/fake" - "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/testapi" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/scheme" + "k8s.io/kubernetes/pkg/printers" ) func TestImageLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := legacyscheme.Codecs + ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, @@ -173,7 +173,7 @@ func TestSetMultiResourcesImageLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := legacyscheme.Codecs + ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, @@ -554,7 +554,7 @@ func TestSetImageRemote(t *testing.T) { defer tf.Cleanup() codec := scheme.Codecs.CodecForVersions(scheme.Codecs.LegacyCodec(groupVersion), scheme.Codecs.UniversalDecoder(groupVersion), groupVersion, groupVersion) - ns := legacyscheme.Codecs + ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Namespace = "test" tf.Client = &fake.RESTClient{ GroupVersion: groupVersion, diff --git a/pkg/kubectl/cmd/util/factory_client_access.go b/pkg/kubectl/cmd/util/factory_client_access.go index dfa09151eb2..a5a4dcd32dc 100644 --- a/pkg/kubectl/cmd/util/factory_client_access.go +++ b/pkg/kubectl/cmd/util/factory_client_access.go @@ -257,6 +257,7 @@ func (f *ring0Factory) UpdatePodSpecForObject(obj runtime.Object, fn func(*v1.Po t.Spec.Template = &v1.PodTemplateSpec{} } return true, fn(&t.Spec.Template.Spec) + // Deployment case *extensionsv1beta1.Deployment: return true, fn(&t.Spec.Template.Spec) @@ -266,6 +267,7 @@ func (f *ring0Factory) UpdatePodSpecForObject(obj runtime.Object, fn func(*v1.Po return true, fn(&t.Spec.Template.Spec) case *appsv1.Deployment: return true, fn(&t.Spec.Template.Spec) + // DaemonSet case *extensionsv1beta1.DaemonSet: return true, fn(&t.Spec.Template.Spec) @@ -273,6 +275,7 @@ func (f *ring0Factory) UpdatePodSpecForObject(obj runtime.Object, fn func(*v1.Po return true, fn(&t.Spec.Template.Spec) case *appsv1.DaemonSet: return true, fn(&t.Spec.Template.Spec) + // ReplicaSet case *extensionsv1beta1.ReplicaSet: return true, fn(&t.Spec.Template.Spec) @@ -280,6 +283,7 @@ func (f *ring0Factory) UpdatePodSpecForObject(obj runtime.Object, fn func(*v1.Po return true, fn(&t.Spec.Template.Spec) case *appsv1.ReplicaSet: return true, fn(&t.Spec.Template.Spec) + // StatefulSet case *appsv1beta1.StatefulSet: return true, fn(&t.Spec.Template.Spec) @@ -287,14 +291,17 @@ func (f *ring0Factory) UpdatePodSpecForObject(obj runtime.Object, fn func(*v1.Po return true, fn(&t.Spec.Template.Spec) case *appsv1.StatefulSet: return true, fn(&t.Spec.Template.Spec) + // Job case *batchv1.Job: return true, fn(&t.Spec.Template.Spec) + // CronJob case *batchv1beta1.CronJob: return true, fn(&t.Spec.JobTemplate.Spec.Template.Spec) case *batchv2alpha1.CronJob: return true, fn(&t.Spec.JobTemplate.Spec.Template.Spec) + default: return false, fmt.Errorf("the object is not a pod or does not have a pod template") } diff --git a/pkg/kubectl/cmd/util/factory_object_mapping.go b/pkg/kubectl/cmd/util/factory_object_mapping.go index ffbee1f2fee..14876e25d1c 100644 --- a/pkg/kubectl/cmd/util/factory_object_mapping.go +++ b/pkg/kubectl/cmd/util/factory_object_mapping.go @@ -27,7 +27,13 @@ import ( "sync" "time" + appsv1 "k8s.io/api/apps/v1" + appsv1beta1 "k8s.io/api/apps/v1beta1" + appsv1beta2 "k8s.io/api/apps/v1beta2" + batchv1 "k8s.io/api/batch/v1" "k8s.io/api/core/v1" + corev1 "k8s.io/api/core/v1" + extensionsv1beta1 "k8s.io/api/extensions/v1beta1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -38,6 +44,7 @@ import ( "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/batch" api "k8s.io/kubernetes/pkg/apis/core" + apiv1 "k8s.io/kubernetes/pkg/apis/core/v1" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/kubectl" @@ -198,6 +205,8 @@ func (f *ring1Factory) LogsForObject(object, options runtime.Object, timeout tim switch t := object.(type) { case *api.Pod: return clientset.Core().Pods(t.Namespace).GetLogs(t.Name, opts), nil + case *corev1.Pod: + return clientset.Core().Pods(t.Namespace).GetLogs(t.Name, opts), nil } namespace, selector, err := selectorsForObject(object) @@ -223,10 +232,31 @@ func selectorsForObject(object runtime.Object) (namespace string, selector label if err != nil { return "", nil, fmt.Errorf("invalid label selector: %v", err) } + case *extensionsv1beta1.ReplicaSet: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } + case *appsv1.ReplicaSet: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } + case *appsv1beta2.ReplicaSet: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } case *api.ReplicationController: namespace = t.Namespace selector = labels.SelectorFromSet(t.Spec.Selector) + case *corev1.ReplicationController: + namespace = t.Namespace + selector = labels.SelectorFromSet(t.Spec.Selector) case *apps.StatefulSet: namespace = t.Namespace @@ -234,6 +264,24 @@ func selectorsForObject(object runtime.Object) (namespace string, selector label if err != nil { return "", nil, fmt.Errorf("invalid label selector: %v", err) } + case *appsv1.StatefulSet: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } + case *appsv1beta1.StatefulSet: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } + case *appsv1beta2.StatefulSet: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } case *extensions.DaemonSet: namespace = t.Namespace @@ -241,6 +289,24 @@ func selectorsForObject(object runtime.Object) (namespace string, selector label if err != nil { return "", nil, fmt.Errorf("invalid label selector: %v", err) } + case *extensionsv1beta1.DaemonSet: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } + case *appsv1.DaemonSet: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } + case *appsv1beta2.DaemonSet: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } case *extensions.Deployment: namespace = t.Namespace @@ -248,6 +314,30 @@ func selectorsForObject(object runtime.Object) (namespace string, selector label if err != nil { return "", nil, fmt.Errorf("invalid label selector: %v", err) } + case *extensionsv1beta1.Deployment: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } + case *appsv1.Deployment: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } + case *appsv1beta1.Deployment: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } + case *appsv1beta2.Deployment: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } case *batch.Job: namespace = t.Namespace @@ -255,6 +345,12 @@ func selectorsForObject(object runtime.Object) (namespace string, selector label if err != nil { return "", nil, fmt.Errorf("invalid label selector: %v", err) } + case *batchv1.Job: + namespace = t.Namespace + selector, err = metav1.LabelSelectorAsSelector(t.Spec.Selector) + if err != nil { + return "", nil, fmt.Errorf("invalid label selector: %v", err) + } case *api.Service: namespace = t.Namespace @@ -262,6 +358,12 @@ func selectorsForObject(object runtime.Object) (namespace string, selector label return "", nil, fmt.Errorf("invalid service '%s': Service is defined without a selector", t.Name) } selector = labels.SelectorFromSet(t.Spec.Selector) + case *corev1.Service: + namespace = t.Namespace + if t.Spec.Selector == nil || len(t.Spec.Selector) == 0 { + return "", nil, fmt.Errorf("invalid service '%s': Service is defined without a selector", t.Name) + } + selector = labels.SelectorFromSet(t.Spec.Selector) default: return "", nil, fmt.Errorf("selector for %T not implemented", object) @@ -325,6 +427,11 @@ func (f *ring1Factory) AttachablePodForObject(object runtime.Object, timeout tim switch t := object.(type) { case *api.Pod: return t, nil + case *corev1.Pod: + internalPod := &api.Pod{} + err := apiv1.Convert_v1_Pod_To_core_Pod(t, internalPod, nil) + return internalPod, err + } namespace, selector, err := selectorsForObject(object) diff --git a/pkg/kubectl/resource/builder.go b/pkg/kubectl/resource/builder.go index f56fe6f03be..f41df2f7b10 100644 --- a/pkg/kubectl/resource/builder.go +++ b/pkg/kubectl/resource/builder.go @@ -64,7 +64,7 @@ type Builder struct { objectTyper runtime.ObjectTyper // codecFactory describes which codecs you want to use - codecFactory *serializer.CodecFactory + negotiatedSerializer runtime.NegotiatedSerializer // local indicates that we cannot make server calls local bool @@ -240,13 +240,19 @@ func (b *Builder) WithScheme(scheme *runtime.Scheme, decodingVersions ...schema. } b.objectTyper = scheme codecFactory := serializer.NewCodecFactory(scheme) - b.codecFactory = &codecFactory + negotiatedSerializer := runtime.NegotiatedSerializer(codecFactory) + // if you specified versions, you're specifying a desire for external types, which you don't want to round-trip through + // internal types + if len(decodingVersions) > 0 { + negotiatedSerializer = &serializer.DirectCodecFactory{CodecFactory: codecFactory} + } + b.negotiatedSerializer = negotiatedSerializer b.mapper = &mapper{ localFn: b.isLocal, restMapper: b.restMapper, clientFn: b.getClient, - decoder: b.codecFactory.UniversalDecoder(decodingVersions...), + decoder: codecFactory.UniversalDecoder(decodingVersions...), } return b @@ -827,8 +833,8 @@ func (b *Builder) getClient(gv schema.GroupVersion) (RESTClient, error) { return b.fakeClientFn(gv) } - if b.codecFactory != nil { - return b.clientConfigFn.clientForGroupVersion(gv, b.codecFactory) + if b.negotiatedSerializer != nil { + return b.clientConfigFn.clientForGroupVersion(gv, b.negotiatedSerializer) } return b.clientConfigFn.unstructuredClientForGroupVersion(gv)