Merge pull request #63803 from deads2k/cli-58-set-versioned

Automatic merge from submit-queue (batch tested with PRs 63272, 63782, 63715, 63811, 63803). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

switch to versioned objects only for set

Only used versioned types in the `kubectl set` commands.  This has long been the goal and we finally make it so here.

@liggitt @soltysh as promised in earlier pulls when I asked you to go with it while I unwound the debt.  This frees the entire package.



```release-note
NONE
```
pull/8/head
Kubernetes Submit Queue 2018-05-15 05:08:20 -07:00 committed by GitHub
commit d2952c0b2e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 139 additions and 163 deletions

View File

@ -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",

View File

@ -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
}
}

View File

@ -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

View File

@ -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
}
}

View File

@ -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,
},

View File

@ -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
}
}

View File

@ -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,
},

View File

@ -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)
})
}

View File

@ -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

View File

@ -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
}
}

View File

@ -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 {

View File

@ -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

View File

@ -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)
}

View File

@ -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)
}
}