diff --git a/pkg/kubectl/cmd/set/BUILD b/pkg/kubectl/cmd/set/BUILD index 2c8b4f59859..8f8c3948325 100644 --- a/pkg/kubectl/cmd/set/BUILD +++ b/pkg/kubectl/cmd/set/BUILD @@ -33,6 +33,7 @@ go_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/api/rbac/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", @@ -63,9 +64,7 @@ go_test( ], embed = [":go_default_library"], deps = [ - "//pkg/api/legacyscheme:go_default_library", "//pkg/api/testapi:go_default_library", - "//pkg/apis/rbac:go_default_library", "//pkg/kubectl/cmd/testing:go_default_library", "//pkg/kubectl/cmd/util:go_default_library", "//pkg/kubectl/genericclioptions:go_default_library", @@ -80,6 +79,7 @@ go_test( "//vendor/k8s.io/api/batch/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/rbac/v1: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/runtime/schema:go_default_library", diff --git a/pkg/kubectl/cmd/set/set_env.go b/pkg/kubectl/cmd/set/set_env.go index 75a2b73d298..4d0da5f6578 100644 --- a/pkg/kubectl/cmd/set/set_env.go +++ b/pkg/kubectl/cmd/set/set_env.go @@ -414,18 +414,17 @@ func (o *EnvOptions) RunEnv() error { } if o.Local || o.dryRun { - if err := o.PrintObj(patch.Info.Object, o.Out); err != nil { + if err := o.PrintObj(info.Object, o.Out); err != nil { return err } continue } - obj, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) + actual, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) if err != nil { allErrs = append(allErrs, fmt.Errorf("failed to patch env update to pod template: %v\n", err)) continue } - info.Refresh(obj, true) // make sure arguments to set or replace environment variables are set // before returning a successful message @@ -433,7 +432,7 @@ func (o *EnvOptions) RunEnv() error { return fmt.Errorf("at least one environment variable must be provided") } - if err := o.PrintObj(info.Object, o.Out); err != nil { + if err := o.PrintObj(actual, 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 f3431a8dd10..8563d6141ef 100644 --- a/pkg/kubectl/cmd/set/set_env_test.go +++ b/pkg/kubectl/cmd/set/set_env_test.go @@ -37,7 +37,6 @@ import ( "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,10 +49,9 @@ func TestSetEnvLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) return nil, nil @@ -66,8 +64,8 @@ func TestSetEnvLocal(t *testing.T) { streams, _, buf, bufErr := genericclioptions.NewTestIOStreams() opts := NewEnvOptions(streams) opts.PrintFlags = &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, } opts.FilenameOptions = resource.FilenameOptions{ @@ -93,10 +91,9 @@ func TestSetMultiResourcesEnvLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) return nil, nil @@ -109,8 +106,8 @@ func TestSetMultiResourcesEnvLocal(t *testing.T) { streams, _, buf, bufErr := genericclioptions.NewTestIOStreams() opts := NewEnvOptions(streams) opts.PrintFlags = &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, } opts.FilenameOptions = resource.FilenameOptions{ @@ -463,17 +460,15 @@ func TestSetEnvRemote(t *testing.T) { tf.ClientConfigVal = &restclient.Config{ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Version: ""}}} defer tf.Cleanup() - codec := scheme.Codecs.CodecForVersions(scheme.Codecs.LegacyCodec(groupVersion), scheme.Codecs.UniversalDecoder(groupVersion), groupVersion, groupVersion) - ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Namespace = "test" tf.Client = &fake.RESTClient{ GroupVersion: groupVersion, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { resourcePath := testapi.Default.ResourcePath(input.args[0]+"s", tf.Namespace, input.args[1]) switch p, m := req.URL.Path, req.Method; { case p == resourcePath && m == http.MethodGet: - return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, input.object)}, nil + return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(input.object)}, nil case p == resourcePath && m == http.MethodPatch: stream, err := req.GetBody() if err != nil { @@ -484,7 +479,7 @@ func TestSetEnvRemote(t *testing.T) { return nil, err } assert.Contains(t, string(bytes), `"value":`+`"`+"prod"+`"`, fmt.Sprintf("env not updated for %#v", input.object)) - return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, input.object)}, nil + return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(input.object)}, nil default: t.Errorf("%s: unexpected request: %s %#v\n%#v", "image", req.Method, req.URL, req) return nil, fmt.Errorf("unexpected request") @@ -497,8 +492,8 @@ func TestSetEnvRemote(t *testing.T) { streams := genericclioptions.NewTestIOStreamsDiscard() opts := NewEnvOptions(streams) opts.PrintFlags = &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, } opts.Local = false diff --git a/pkg/kubectl/cmd/set/set_image.go b/pkg/kubectl/cmd/set/set_image.go index 3f13167d87d..91c7fc4e1b0 100644 --- a/pkg/kubectl/cmd/set/set_image.go +++ b/pkg/kubectl/cmd/set/set_image.go @@ -275,21 +275,20 @@ func (o *SetImageOptions) Run() error { } if o.Local || o.DryRun { - if err := o.PrintObj(patch.Info.Object, o.Out); err != nil { + if err := o.PrintObj(info.Object, o.Out); err != nil { return err } continue } // patch the change - obj, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) + actual, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) if err != nil { allErrs = append(allErrs, fmt.Errorf("failed to patch image update to pod template: %v\n", err)) continue } - info.Refresh(obj, true) - if err := o.PrintObj(info.Object, o.Out); err != nil { + if err := o.PrintObj(actual, 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 d6cb422de00..a5f29d58f5f 100644 --- a/pkg/kubectl/cmd/set/set_image_test.go +++ b/pkg/kubectl/cmd/set/set_image_test.go @@ -25,7 +25,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - "k8s.io/kubernetes/pkg/api/legacyscheme" appsv1 "k8s.io/api/apps/v1" appsv1beta1 "k8s.io/api/apps/v1beta1" @@ -51,11 +50,9 @@ func TestImageLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} - tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) return nil, nil @@ -74,8 +71,8 @@ func TestImageLocal(t *testing.T) { opts := SetImageOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, @@ -101,8 +98,8 @@ func TestImageLocal(t *testing.T) { func TestSetImageValidation(t *testing.T) { printFlags := &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), } testCases := []struct { @@ -174,11 +171,9 @@ func TestSetMultiResourcesImageLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} - tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) return nil, nil @@ -197,8 +192,8 @@ func TestSetMultiResourcesImageLocal(t *testing.T) { opts := SetImageOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, @@ -554,17 +549,15 @@ func TestSetImageRemote(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - codec := scheme.Codecs.CodecForVersions(scheme.Codecs.LegacyCodec(groupVersion), scheme.Codecs.UniversalDecoder(groupVersion), groupVersion, groupVersion) - ns := serializer.DirectCodecFactory{CodecFactory: scheme.Codecs} tf.Namespace = "test" tf.Client = &fake.RESTClient{ GroupVersion: groupVersion, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { resourcePath := testapi.Default.ResourcePath(input.args[0]+"s", tf.Namespace, input.args[1]) switch p, m := req.URL.Path, req.Method; { case p == resourcePath && m == http.MethodGet: - return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, input.object)}, nil + return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(input.object)}, nil case p == resourcePath && m == http.MethodPatch: stream, err := req.GetBody() if err != nil { @@ -575,7 +568,7 @@ func TestSetImageRemote(t *testing.T) { return nil, err } assert.Contains(t, string(bytes), `"image":`+`"`+"thingy"+`"`, fmt.Sprintf("image not updated for %#v", input.object)) - return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, input.object)}, nil + return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(input.object)}, nil default: t.Errorf("%s: unexpected request: %s %#v\n%#v", "image", req.Method, req.URL, req) return nil, fmt.Errorf("unexpected request") @@ -591,8 +584,8 @@ func TestSetImageRemote(t *testing.T) { cmd.Flags().Set("output", outputFormat) opts := SetImageOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, diff --git a/pkg/kubectl/cmd/set/set_resources.go b/pkg/kubectl/cmd/set/set_resources.go index 686001f352a..0e5c24ae417 100644 --- a/pkg/kubectl/cmd/set/set_resources.go +++ b/pkg/kubectl/cmd/set/set_resources.go @@ -35,6 +35,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" ) @@ -173,7 +174,7 @@ func (o *SetResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, ar includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) builder := f.NewBuilder(). - WithScheme(legacyscheme.Scheme). + WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...). LocalParam(o.Local). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). @@ -222,9 +223,8 @@ func (o *SetResourcesOptions) Validate() error { func (o *SetResourcesOptions) 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 { containers, _ := selectContainers(spec.Containers, o.ContainerSelector) if len(containers) != 0 { @@ -260,7 +260,7 @@ func (o *SetResourcesOptions) 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 { @@ -277,20 +277,19 @@ func (o *SetResourcesOptions) 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(info.Object, o.Out); err != nil { return err } continue } - obj, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) + actual, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) if err != nil { allErrs = append(allErrs, fmt.Errorf("failed to patch limit update to pod template %v\n", err)) continue } - info.Refresh(obj, true) - if err := o.PrintObj(cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping), o.Out); err != nil { + if err := o.PrintObj(actual, o.Out); err != nil { return err } } diff --git a/pkg/kubectl/cmd/set/set_resources_test.go b/pkg/kubectl/cmd/set/set_resources_test.go index 8575f9528c7..e0e7ac7ba88 100644 --- a/pkg/kubectl/cmd/set/set_resources_test.go +++ b/pkg/kubectl/cmd/set/set_resources_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" @@ -49,11 +49,10 @@ import ( func TestResourcesLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := legacyscheme.Codecs tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) return nil, nil @@ -72,8 +71,8 @@ func TestResourcesLocal(t *testing.T) { opts := SetResourcesOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, @@ -104,11 +103,10 @@ func TestResourcesLocal(t *testing.T) { func TestSetMultiResourcesLimitsLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := legacyscheme.Codecs tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) return nil, nil @@ -127,8 +125,8 @@ func TestSetMultiResourcesLimitsLocal(t *testing.T) { opts := SetResourcesOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, @@ -471,17 +469,16 @@ func TestSetResourcesRemote(t *testing.T) { testapi.Default = testapi.Groups[input.testAPIGroup] tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - codec := scheme.Codecs.CodecForVersions(scheme.Codecs.LegacyCodec(groupVersion), scheme.Codecs.UniversalDecoder(groupVersion), groupVersion, groupVersion) - ns := legacyscheme.Codecs + tf.Namespace = "test" tf.Client = &fake.RESTClient{ GroupVersion: groupVersion, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { resourcePath := testapi.Default.ResourcePath(input.args[0]+"s", tf.Namespace, input.args[1]) switch p, m := req.URL.Path, req.Method; { case p == resourcePath && m == http.MethodGet: - return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, input.object)}, nil + return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(input.object)}, nil case p == resourcePath && m == http.MethodPatch: stream, err := req.GetBody() if err != nil { @@ -492,7 +489,7 @@ func TestSetResourcesRemote(t *testing.T) { return nil, err } assert.Contains(t, string(bytes), "200m", fmt.Sprintf("resources not updated for %#v", input.object)) - return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, input.object)}, nil + return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(input.object)}, nil default: t.Errorf("%s: unexpected request: %s %#v\n%#v", "resources", req.Method, req.URL, req) return nil, fmt.Errorf("unexpected request") @@ -508,8 +505,8 @@ func TestSetResourcesRemote(t *testing.T) { cmd.Flags().Set("output", outputFormat) opts := SetResourcesOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, diff --git a/pkg/kubectl/cmd/set/set_selector.go b/pkg/kubectl/cmd/set/set_selector.go index e30ea882520..bede6cc1ca1 100644 --- a/pkg/kubectl/cmd/set/set_selector.go +++ b/pkg/kubectl/cmd/set/set_selector.go @@ -34,6 +34,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" ) @@ -144,7 +145,7 @@ func (o *SetSelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, arg includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) o.builder = f.NewBuilder(). - WithScheme(legacyscheme.Scheme). + WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...). LocalParam(o.local). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). @@ -201,9 +202,7 @@ func (o *SetSelectorOptions) RunSelector() error { return r.Visit(func(info *resource.Info, err error) error { patch := &Patch{Info: info} - CalculatePatch(patch, cmdutil.InternalVersionJSONEncoder(), func(info *resource.Info) ([]byte, error) { - versioned := cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping) - patch.Info.Object = versioned + CalculatePatch(patch, scheme.DefaultJSONEncoder(), func(info *resource.Info) ([]byte, error) { selectErr := updateSelectorForObject(info.Object, *o.selector) if selectErr != nil { return nil, selectErr @@ -214,7 +213,7 @@ func (o *SetSelectorOptions) RunSelector() 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) }) if patch.Err != nil { @@ -224,13 +223,12 @@ func (o *SetSelectorOptions) RunSelector() error { return o.PrintObj(info.Object, o.Out) } - patched, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) + actual, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) if err != nil { return err } - info.Refresh(patched, true) - return o.PrintObj(cmdutil.AsDefaultVersionedOrOriginal(patch.Info.Object, info.Mapping), o.Out) + return o.PrintObj(actual, o.Out) }) } diff --git a/pkg/kubectl/cmd/set/set_selector_test.go b/pkg/kubectl/cmd/set/set_selector_test.go index dfcd28aae0f..9c014f0c32d 100644 --- a/pkg/kubectl/cmd/set/set_selector_test.go +++ b/pkg/kubectl/cmd/set/set_selector_test.go @@ -29,11 +29,12 @@ 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" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" + "k8s.io/kubernetes/pkg/kubectl/scheme" ) func TestUpdateSelectorForObjectTypes(t *testing.T) { @@ -319,10 +320,9 @@ func TestSelectorTest(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := legacyscheme.Codecs tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) return nil, nil diff --git a/pkg/kubectl/cmd/set/set_serviceaccount.go b/pkg/kubectl/cmd/set/set_serviceaccount.go index c38381006ee..114eb8db257 100644 --- a/pkg/kubectl/cmd/set/set_serviceaccount.go +++ b/pkg/kubectl/cmd/set/set_serviceaccount.go @@ -34,6 +34,7 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" ) @@ -152,7 +153,7 @@ func (o *SetServiceAccountOptions) Complete(f cmdutil.Factory, cmd *cobra.Comman resources := args[:len(args)-1] includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) builder := f.NewBuilder(). - WithScheme(legacyscheme.Scheme). + WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...). LocalParam(o.local). ContinueOnError(). NamespaceParam(cmdNamespace).DefaultNamespace(). @@ -174,7 +175,6 @@ func (o *SetServiceAccountOptions) Complete(f cmdutil.Factory, cmd *cobra.Comman func (o *SetServiceAccountOptions) Run() error { patchErrs := []error{} patchFn := func(info *resource.Info) ([]byte, error) { - info.Object = cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping) _, err := o.updatePodSpecForObject(info.Object, func(podSpec *v1.PodSpec) error { podSpec.ServiceAccountName = o.serviceAccountName return nil @@ -187,10 +187,10 @@ func (o *SetServiceAccountOptions) 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) } - patches := CalculatePatches(o.infos, cmdutil.InternalVersionJSONEncoder(), patchFn) + patches := CalculatePatches(o.infos, scheme.DefaultJSONEncoder(), patchFn) for _, patch := range patches { info := patch.Info if patch.Err != nil { @@ -198,19 +198,18 @@ func (o *SetServiceAccountOptions) Run() error { continue } 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(info.Object, o.Out); err != nil { return err } continue } - patched, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) + actual, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) if err != nil { patchErrs = append(patchErrs, fmt.Errorf("failed to patch ServiceAccountName %v", err)) continue } - info.Refresh(patched, true) - if err := o.PrintObj(cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping), o.Out); err != nil { + if err := o.PrintObj(actual, o.Out); err != nil { return err } } diff --git a/pkg/kubectl/cmd/set/set_serviceaccount_test.go b/pkg/kubectl/cmd/set/set_serviceaccount_test.go index 21d94d58fc9..c579cac3918 100644 --- a/pkg/kubectl/cmd/set/set_serviceaccount_test.go +++ b/pkg/kubectl/cmd/set/set_serviceaccount_test.go @@ -37,9 +37,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" @@ -91,8 +91,8 @@ func TestSetServiceAccountLocal(t *testing.T) { testapi.Default = testapi.Groups[input.apiGroup] saConfig := SetServiceAccountOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, @@ -115,10 +115,9 @@ func TestSetServiceAccountMultiLocal(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - ns := legacyscheme.Codecs tf.Client = &fake.RESTClient{ GroupVersion: schema.GroupVersion{Version: ""}, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { t.Fatalf("unexpected request: %s %#v\n%#v", req.Method, req.URL, req) return nil, nil @@ -135,8 +134,8 @@ func TestSetServiceAccountMultiLocal(t *testing.T) { cmd.Flags().Set("local", "true") opts := SetServiceAccountOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, @@ -342,17 +341,15 @@ func TestSetServiceAccountRemote(t *testing.T) { tf := cmdtesting.NewTestFactory() defer tf.Cleanup() - codec := scheme.Codecs.CodecForVersions(scheme.Codecs.LegacyCodec(groupVersion), scheme.Codecs.UniversalDecoder(groupVersion), groupVersion, groupVersion) - ns := legacyscheme.Codecs tf.Namespace = "test" tf.Client = &fake.RESTClient{ GroupVersion: groupVersion, - NegotiatedSerializer: ns, + NegotiatedSerializer: serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}, Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) { resourcePath := testapi.Default.ResourcePath(input.args[0]+"s", tf.Namespace, input.args[1]) switch p, m := req.URL.Path, req.Method; { case p == resourcePath && m == http.MethodGet: - return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, input.object)}, nil + return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(input.object)}, nil case p == resourcePath && m == http.MethodPatch: stream, err := req.GetBody() if err != nil { @@ -363,7 +360,7 @@ func TestSetServiceAccountRemote(t *testing.T) { return nil, err } assert.Contains(t, string(bytes), `"serviceAccountName":`+`"`+serviceAccount+`"`, fmt.Sprintf("serviceaccount not updated for %#v", input.object)) - return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, input.object)}, nil + return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(input.object)}, nil default: t.Errorf("%s: unexpected request: %s %#v\n%#v", "serviceaccount", req.Method, req.URL, req) return nil, fmt.Errorf("unexpected request") @@ -379,8 +376,8 @@ func TestSetServiceAccountRemote(t *testing.T) { cmd.Flags().Set("output", outputFormat) saConfig := SetServiceAccountOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, @@ -426,8 +423,8 @@ func TestServiceAccountValidation(t *testing.T) { saConfig := &SetServiceAccountOptions{ PrintFlags: &printers.PrintFlags{ - JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(legacyscheme.Scheme), - NamePrintFlags: printers.NewNamePrintFlags("", legacyscheme.Scheme), + JSONYamlPrintFlags: printers.NewJSONYamlPrintFlags(scheme.Scheme), + NamePrintFlags: printers.NewNamePrintFlags("", scheme.Scheme), OutputFormat: &outputFormat, }, @@ -439,8 +436,8 @@ func TestServiceAccountValidation(t *testing.T) { } } -func objBody(codec runtime.Codec, obj runtime.Object) io.ReadCloser { - return bytesBody([]byte(runtime.EncodeOrDie(codec, obj))) +func objBody(obj runtime.Object) io.ReadCloser { + return bytesBody([]byte(runtime.EncodeOrDie(scheme.DefaultJSONEncoder(), obj))) } func defaultHeader() http.Header { diff --git a/pkg/kubectl/cmd/set/set_subject.go b/pkg/kubectl/cmd/set/set_subject.go index 081a769426c..a833845174d 100644 --- a/pkg/kubectl/cmd/set/set_subject.go +++ b/pkg/kubectl/cmd/set/set_subject.go @@ -20,10 +20,9 @@ import ( "fmt" "strings" - "k8s.io/kubernetes/pkg/printers" - "github.com/spf13/cobra" + rbacv1 "k8s.io/api/rbac/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" @@ -34,7 +33,9 @@ import ( cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/genericclioptions" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" + "k8s.io/kubernetes/pkg/kubectl/scheme" "k8s.io/kubernetes/pkg/kubectl/util/i18n" + "k8s.io/kubernetes/pkg/printers" ) var ( @@ -52,7 +53,7 @@ var ( kubectl create rolebinding admin --role=admin --user=admin -o yaml --dry-run | kubectl set subject --local -f - --user=foo -o yaml`) ) -type updateSubjects func(existings []rbac.Subject, targets []rbac.Subject) (bool, []rbac.Subject) +type updateSubjects func(existings []rbacv1.Subject, targets []rbacv1.Subject) (bool, []rbacv1.Subject) // SubjectOptions is the start of the data required to perform the operation. As new fields are added, add them here instead of // referencing the cmd.Flags @@ -138,7 +139,7 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) builder := f.NewBuilder(). - WithScheme(legacyscheme.Scheme). + WithScheme(scheme.Scheme, scheme.Scheme.PrioritizedVersionsAllGroups()...). LocalParam(o.Local). ContinueOnError(). NamespaceParam(o.namespace).DefaultNamespace(). @@ -194,10 +195,10 @@ func (o *SubjectOptions) Validate() error { } func (o *SubjectOptions) Run(fn updateSubjects) error { - patches := CalculatePatches(o.Infos, cmdutil.InternalVersionJSONEncoder(), func(info *resource.Info) ([]byte, error) { - subjects := []rbac.Subject{} + patches := CalculatePatches(o.Infos, scheme.DefaultJSONEncoder(), func(info *resource.Info) ([]byte, error) { + subjects := []rbacv1.Subject{} for _, user := range sets.NewString(o.Users...).List() { - subject := rbac.Subject{ + subject := rbacv1.Subject{ Kind: rbac.UserKind, APIGroup: rbac.GroupName, Name: user, @@ -205,7 +206,7 @@ func (o *SubjectOptions) Run(fn updateSubjects) error { subjects = append(subjects, subject) } for _, group := range sets.NewString(o.Groups...).List() { - subject := rbac.Subject{ + subject := rbacv1.Subject{ Kind: rbac.GroupKind, APIGroup: rbac.GroupName, Name: group, @@ -219,7 +220,7 @@ func (o *SubjectOptions) Run(fn updateSubjects) error { if len(namespace) == 0 { namespace = o.namespace } - subject := rbac.Subject{ + subject := rbacv1.Subject{ Kind: rbac.ServiceAccountKind, Namespace: namespace, Name: name, @@ -230,7 +231,7 @@ func (o *SubjectOptions) Run(fn updateSubjects) error { transformed, err := updateSubjectForObject(info.Object, subjects, fn) if transformed && err == nil { // TODO: switch UpdatePodSpecForObject to work on v1.PodSpec - return runtime.Encode(cmdutil.InternalVersionJSONEncoder(), cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping)) + return runtime.Encode(scheme.DefaultJSONEncoder(), info.Object) } return nil, err }) @@ -256,26 +257,25 @@ func (o *SubjectOptions) Run(fn updateSubjects) error { continue } - obj, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) + actual, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) if err != nil { allErrs = append(allErrs, fmt.Errorf("failed to patch subjects to rolebinding: %v\n", err)) continue } - info.Refresh(obj, true) - return o.PrintObj(cmdutil.AsDefaultVersionedOrOriginal(info.Object, info.Mapping), o.Out) + return o.PrintObj(actual, o.Out) } return utilerrors.NewAggregate(allErrs) } //Note: the obj mutates in the function -func updateSubjectForObject(obj runtime.Object, subjects []rbac.Subject, fn updateSubjects) (bool, error) { +func updateSubjectForObject(obj runtime.Object, subjects []rbacv1.Subject, fn updateSubjects) (bool, error) { switch t := obj.(type) { - case *rbac.RoleBinding: + case *rbacv1.RoleBinding: transformed, result := fn(t.Subjects, subjects) t.Subjects = result return transformed, nil - case *rbac.ClusterRoleBinding: + case *rbacv1.ClusterRoleBinding: transformed, result := fn(t.Subjects, subjects) t.Subjects = result return transformed, nil @@ -284,7 +284,7 @@ func updateSubjectForObject(obj runtime.Object, subjects []rbac.Subject, fn upda } } -func addSubjects(existings []rbac.Subject, targets []rbac.Subject) (bool, []rbac.Subject) { +func addSubjects(existings []rbacv1.Subject, targets []rbacv1.Subject) (bool, []rbacv1.Subject) { transformed := false updated := existings for _, item := range targets { @@ -296,7 +296,7 @@ func addSubjects(existings []rbac.Subject, targets []rbac.Subject) (bool, []rbac return transformed, updated } -func contain(slice []rbac.Subject, item rbac.Subject) bool { +func contain(slice []rbacv1.Subject, item rbacv1.Subject) bool { for _, v := range slice { if v == item { return true diff --git a/pkg/kubectl/cmd/set/set_subject_test.go b/pkg/kubectl/cmd/set/set_subject_test.go index 03ee0ee8965..05c82082c83 100644 --- a/pkg/kubectl/cmd/set/set_subject_test.go +++ b/pkg/kubectl/cmd/set/set_subject_test.go @@ -20,9 +20,9 @@ import ( "reflect" "testing" + rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/kubernetes/pkg/apis/rbac" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" ) @@ -65,11 +65,11 @@ func TestValidate(t *testing.T) { options: &SubjectOptions{ Infos: []*resource.Info{ { - Object: &rbac.ClusterRoleBinding{ + Object: &rbacv1.ClusterRoleBinding{ ObjectMeta: metav1.ObjectMeta{ Name: "clusterrolebinding", }, - RoleRef: rbac.RoleRef{ + RoleRef: rbacv1.RoleRef{ APIGroup: "rbac.authorization.k8s.io", Kind: "ClusterRole", Name: "role", @@ -87,12 +87,12 @@ func TestValidate(t *testing.T) { options: &SubjectOptions{ Infos: []*resource.Info{ { - Object: &rbac.RoleBinding{ + Object: &rbacv1.RoleBinding{ ObjectMeta: metav1.ObjectMeta{ Name: "rolebinding", Namespace: "one", }, - RoleRef: rbac.RoleRef{ + RoleRef: rbacv1.RoleRef{ APIGroup: "rbac.authorization.k8s.io", Kind: "ClusterRole", Name: "role", @@ -123,13 +123,13 @@ func TestUpdateSubjectForObject(t *testing.T) { tests := []struct { Name string obj runtime.Object - subjects []rbac.Subject - expected []rbac.Subject + subjects []rbacv1.Subject + expected []rbacv1.Subject wantErr bool }{ { Name: "invalid object type", - obj: &rbac.Role{ + obj: &rbacv1.Role{ ObjectMeta: metav1.ObjectMeta{ Name: "role", Namespace: "one", @@ -139,12 +139,12 @@ func TestUpdateSubjectForObject(t *testing.T) { }, { Name: "add resource with users in rolebinding", - obj: &rbac.RoleBinding{ + obj: &rbacv1.RoleBinding{ ObjectMeta: metav1.ObjectMeta{ Name: "rolebinding", Namespace: "one", }, - Subjects: []rbac.Subject{ + Subjects: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "User", @@ -152,7 +152,7 @@ func TestUpdateSubjectForObject(t *testing.T) { }, }, }, - subjects: []rbac.Subject{ + subjects: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "User", @@ -164,7 +164,7 @@ func TestUpdateSubjectForObject(t *testing.T) { Name: "b", }, }, - expected: []rbac.Subject{ + expected: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "User", @@ -180,12 +180,12 @@ func TestUpdateSubjectForObject(t *testing.T) { }, { Name: "add resource with groups in rolebinding", - obj: &rbac.RoleBinding{ + obj: &rbacv1.RoleBinding{ ObjectMeta: metav1.ObjectMeta{ Name: "rolebinding", Namespace: "one", }, - Subjects: []rbac.Subject{ + Subjects: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "Group", @@ -193,7 +193,7 @@ func TestUpdateSubjectForObject(t *testing.T) { }, }, }, - subjects: []rbac.Subject{ + subjects: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "Group", @@ -205,7 +205,7 @@ func TestUpdateSubjectForObject(t *testing.T) { Name: "b", }, }, - expected: []rbac.Subject{ + expected: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "Group", @@ -221,12 +221,12 @@ func TestUpdateSubjectForObject(t *testing.T) { }, { Name: "add resource with serviceaccounts in rolebinding", - obj: &rbac.RoleBinding{ + obj: &rbacv1.RoleBinding{ ObjectMeta: metav1.ObjectMeta{ Name: "rolebinding", Namespace: "one", }, - Subjects: []rbac.Subject{ + Subjects: []rbacv1.Subject{ { Kind: "ServiceAccount", Namespace: "one", @@ -234,7 +234,7 @@ func TestUpdateSubjectForObject(t *testing.T) { }, }, }, - subjects: []rbac.Subject{ + subjects: []rbacv1.Subject{ { Kind: "ServiceAccount", Namespace: "one", @@ -246,7 +246,7 @@ func TestUpdateSubjectForObject(t *testing.T) { Name: "b", }, }, - expected: []rbac.Subject{ + expected: []rbacv1.Subject{ { Kind: "ServiceAccount", Namespace: "one", @@ -262,11 +262,11 @@ func TestUpdateSubjectForObject(t *testing.T) { }, { Name: "add resource with serviceaccounts in clusterrolebinding", - obj: &rbac.ClusterRoleBinding{ + obj: &rbacv1.ClusterRoleBinding{ ObjectMeta: metav1.ObjectMeta{ Name: "clusterrolebinding", }, - Subjects: []rbac.Subject{ + Subjects: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "User", @@ -279,14 +279,14 @@ func TestUpdateSubjectForObject(t *testing.T) { }, }, }, - subjects: []rbac.Subject{ + subjects: []rbacv1.Subject{ { Kind: "ServiceAccount", Namespace: "one", Name: "a", }, }, - expected: []rbac.Subject{ + expected: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "User", @@ -312,11 +312,11 @@ func TestUpdateSubjectForObject(t *testing.T) { } want := tt.expected - var got []rbac.Subject + var got []rbacv1.Subject switch t := tt.obj.(type) { - case *rbac.RoleBinding: + case *rbacv1.RoleBinding: got = t.Subjects - case *rbac.ClusterRoleBinding: + case *rbacv1.ClusterRoleBinding: got = t.Subjects } if !reflect.DeepEqual(got, want) { @@ -330,14 +330,14 @@ func TestUpdateSubjectForObject(t *testing.T) { func TestAddSubject(t *testing.T) { tests := []struct { Name string - existing []rbac.Subject - subjects []rbac.Subject - expected []rbac.Subject + existing []rbacv1.Subject + subjects []rbacv1.Subject + expected []rbacv1.Subject wantChange bool }{ { Name: "add resource with users", - existing: []rbac.Subject{ + existing: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "User", @@ -349,14 +349,14 @@ func TestAddSubject(t *testing.T) { Name: "b", }, }, - subjects: []rbac.Subject{ + subjects: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "User", Name: "a", }, }, - expected: []rbac.Subject{ + expected: []rbacv1.Subject{ { APIGroup: "rbac.authorization.k8s.io", Kind: "User", @@ -372,7 +372,7 @@ func TestAddSubject(t *testing.T) { }, { Name: "add resource with serviceaccounts", - existing: []rbac.Subject{ + existing: []rbacv1.Subject{ { Kind: "ServiceAccount", Namespace: "one", @@ -384,14 +384,14 @@ func TestAddSubject(t *testing.T) { Name: "b", }, }, - subjects: []rbac.Subject{ + subjects: []rbacv1.Subject{ { Kind: "ServiceAccount", Namespace: "two", Name: "a", }, }, - expected: []rbac.Subject{ + expected: []rbacv1.Subject{ { Kind: "ServiceAccount", Namespace: "one", @@ -413,7 +413,7 @@ func TestAddSubject(t *testing.T) { } for _, tt := range tests { changed := false - got := []rbac.Subject{} + got := []rbacv1.Subject{} if changed, got = addSubjects(tt.existing, tt.subjects); (changed != false) != tt.wantChange { t.Errorf("%q. addSubjects() changed = %v, wantChange = %v", tt.Name, changed, tt.wantChange) } diff --git a/pkg/kubectl/cmd/util/factory_client_access.go b/pkg/kubectl/cmd/util/factory_client_access.go index 86e587fb5a5..5850dc2ae65 100644 --- a/pkg/kubectl/cmd/util/factory_client_access.go +++ b/pkg/kubectl/cmd/util/factory_client_access.go @@ -193,7 +193,7 @@ func (f *ring0Factory) UpdatePodSpecForObject(obj runtime.Object, fn func(*v1.Po 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") + return false, fmt.Errorf("the object is not a pod or does not have a pod template: %T", t) } }