Merge pull request #62880 from deads2k/cli-35-io
Automatic merge from submit-queue (batch tested with PRs 61324, 62880, 62765). 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>. provide standard iostream struct for commands Commands usually need some kind of iostream. For consistency, delegation, and testability this pull introduces a standard struct to embed in every set of command options. It also starts the plumbing so that the benefits of standardization for all three of those cases become clear. @kubernetes/sig-cli-maintainers @soltysh @juanvallejo ```release-note NONE ```
This commit is contained in:
		| @@ -19,7 +19,6 @@ package cmd | |||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	jsonpatch "github.com/evanphx/json-patch" | 	jsonpatch "github.com/evanphx/json-patch" | ||||||
| 	"github.com/golang/glog" | 	"github.com/golang/glog" | ||||||
| @@ -60,8 +59,7 @@ type AnnotateOptions struct { | |||||||
| 	removeAnnotations []string | 	removeAnnotations []string | ||||||
| 	Recorder          genericclioptions.Recorder | 	Recorder          genericclioptions.Recorder | ||||||
|  |  | ||||||
| 	// Common share fields | 	genericclioptions.IOStreams | ||||||
| 	out io.Writer |  | ||||||
| } | } | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -99,17 +97,17 @@ var ( | |||||||
|     kubectl annotate pods foo description-`)) |     kubectl annotate pods foo description-`)) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func NewAnnotateOptions(out io.Writer) *AnnotateOptions { | func NewAnnotateOptions(ioStreams genericclioptions.IOStreams) *AnnotateOptions { | ||||||
| 	return &AnnotateOptions{ | 	return &AnnotateOptions{ | ||||||
| 		out:         out, |  | ||||||
| 		RecordFlags: genericclioptions.NewRecordFlags(), | 		RecordFlags: genericclioptions.NewRecordFlags(), | ||||||
|  |  | ||||||
| 		Recorder:  genericclioptions.NoopRecorder{}, | 		Recorder:  genericclioptions.NoopRecorder{}, | ||||||
|  | 		IOStreams: ioStreams, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewCmdAnnotate(f cmdutil.Factory, out io.Writer) *cobra.Command { | func NewCmdAnnotate(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	o := NewAnnotateOptions(out) | 	o := NewAnnotateOptions(ioStreams) | ||||||
| 	validArgs := cmdutil.ValidArgList(f) | 	validArgs := cmdutil.ValidArgList(f) | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| @@ -283,9 +281,9 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if len(o.outputFormat) > 0 { | 		if len(o.outputFormat) > 0 { | ||||||
| 			return cmdutil.PrintObject(cmd, outputObj, o.out) | 			return cmdutil.PrintObject(cmd, outputObj, o.Out) | ||||||
| 		} | 		} | ||||||
| 		cmdutil.PrintSuccess(false, o.out, info.Object, o.dryrun, "annotated") | 		cmdutil.PrintSuccess(false, o.Out, info.Object, o.dryrun, "annotated") | ||||||
| 		return nil | 		return nil | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package cmd | package cmd | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"strings" | 	"strings" | ||||||
| @@ -30,6 +29,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -424,14 +424,14 @@ func TestAnnotateErrors(t *testing.T) { | |||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			tf.ClientConfigVal = defaultClientConfig() | 			tf.ClientConfigVal = defaultClientConfig() | ||||||
|  |  | ||||||
| 			buf := bytes.NewBuffer([]byte{}) | 			iostreams, _, bufOut, bufErr := genericclioptions.NewTestIOStreams() | ||||||
| 			cmd := NewCmdAnnotate(tf, buf) | 			cmd := NewCmdAnnotate(tf, iostreams) | ||||||
| 			cmd.SetOutput(buf) | 			cmd.SetOutput(bufOut) | ||||||
|  |  | ||||||
| 			for k, v := range testCase.flags { | 			for k, v := range testCase.flags { | ||||||
| 				cmd.Flags().Set(k, v) | 				cmd.Flags().Set(k, v) | ||||||
| 			} | 			} | ||||||
| 			options := NewAnnotateOptions(buf) | 			options := NewAnnotateOptions(iostreams) | ||||||
| 			err := options.Complete(tf, cmd, testCase.args) | 			err := options.Complete(tf, cmd, testCase.args) | ||||||
| 			if err == nil { | 			if err == nil { | ||||||
| 				err = options.Validate() | 				err = options.Validate() | ||||||
| @@ -440,8 +440,11 @@ func TestAnnotateErrors(t *testing.T) { | |||||||
| 				t.Errorf("%s: unexpected error: %v", k, err) | 				t.Errorf("%s: unexpected error: %v", k, err) | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 			if buf.Len() > 0 { | 			if bufOut.Len() > 0 { | ||||||
| 				t.Errorf("buffer should be empty: %s", string(buf.Bytes())) | 				t.Errorf("buffer should be empty: %s", string(bufOut.Bytes())) | ||||||
|  | 			} | ||||||
|  | 			if bufErr.Len() > 0 { | ||||||
|  | 				t.Errorf("buffer should be empty: %s", string(bufErr.Bytes())) | ||||||
| 			} | 			} | ||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| @@ -485,10 +488,10 @@ func TestAnnotateObject(t *testing.T) { | |||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	tf.ClientConfigVal = defaultClientConfig() | 	tf.ClientConfigVal = defaultClientConfig() | ||||||
|  |  | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	iostreams, _, bufOut, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdAnnotate(tf, buf) | 	cmd := NewCmdAnnotate(tf, iostreams) | ||||||
| 	cmd.SetOutput(buf) | 	cmd.SetOutput(bufOut) | ||||||
| 	options := NewAnnotateOptions(buf) | 	options := NewAnnotateOptions(iostreams) | ||||||
| 	args := []string{"pods/foo", "a=b", "c-"} | 	args := []string{"pods/foo", "a=b", "c-"} | ||||||
| 	if err := options.Complete(tf, cmd, args); err != nil { | 	if err := options.Complete(tf, cmd, args); err != nil { | ||||||
| 		t.Fatalf("unexpected error: %v", err) | 		t.Fatalf("unexpected error: %v", err) | ||||||
| @@ -539,10 +542,10 @@ func TestAnnotateObjectFromFile(t *testing.T) { | |||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	tf.ClientConfigVal = defaultClientConfig() | 	tf.ClientConfigVal = defaultClientConfig() | ||||||
|  |  | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	iostreams, _, bufOut, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdAnnotate(tf, buf) | 	cmd := NewCmdAnnotate(tf, iostreams) | ||||||
| 	cmd.SetOutput(buf) | 	cmd.SetOutput(bufOut) | ||||||
| 	options := NewAnnotateOptions(buf) | 	options := NewAnnotateOptions(iostreams) | ||||||
| 	options.Filenames = []string{"../../../test/e2e/testing-manifests/statefulset/cassandra/controller.yaml"} | 	options.Filenames = []string{"../../../test/e2e/testing-manifests/statefulset/cassandra/controller.yaml"} | ||||||
| 	args := []string{"a=b", "c-"} | 	args := []string{"a=b", "c-"} | ||||||
| 	if err := options.Complete(tf, cmd, args); err != nil { | 	if err := options.Complete(tf, cmd, args); err != nil { | ||||||
| @@ -571,9 +574,9 @@ func TestAnnotateLocal(t *testing.T) { | |||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	tf.ClientConfigVal = defaultClientConfig() | 	tf.ClientConfigVal = defaultClientConfig() | ||||||
|  |  | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	iostreams, _, _, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdAnnotate(tf, buf) | 	cmd := NewCmdAnnotate(tf, iostreams) | ||||||
| 	options := NewAnnotateOptions(buf) | 	options := NewAnnotateOptions(iostreams) | ||||||
| 	options.local = true | 	options.local = true | ||||||
| 	options.Filenames = []string{"../../../test/e2e/testing-manifests/statefulset/cassandra/controller.yaml"} | 	options.Filenames = []string{"../../../test/e2e/testing-manifests/statefulset/cassandra/controller.yaml"} | ||||||
| 	args := []string{"a=b"} | 	args := []string{"a=b"} | ||||||
| @@ -627,10 +630,10 @@ func TestAnnotateMultipleObjects(t *testing.T) { | |||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	tf.ClientConfigVal = defaultClientConfig() | 	tf.ClientConfigVal = defaultClientConfig() | ||||||
|  |  | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	iostreams, _, _, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdAnnotate(tf, buf) | 	cmd := NewCmdAnnotate(tf, iostreams) | ||||||
| 	cmd.SetOutput(buf) | 	cmd.SetOutput(iostreams.Out) | ||||||
| 	options := NewAnnotateOptions(buf) | 	options := NewAnnotateOptions(iostreams) | ||||||
| 	options.all = true | 	options.all = true | ||||||
| 	args := []string{"pods", "a=b", "c-"} | 	args := []string{"pods", "a=b", "c-"} | ||||||
| 	if err := options.Complete(tf, cmd, args); err != nil { | 	if err := options.Complete(tf, cmd, args); err != nil { | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ import ( | |||||||
| 	"k8s.io/apimachinery/pkg/util/sets" | 	"k8s.io/apimachinery/pkg/util/sets" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/printers" | 	"k8s.io/kubernetes/pkg/printers" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -53,12 +54,12 @@ var ( | |||||||
| // ApiResourcesOptions is the start of the data required to perform the operation.  As new fields are added, add them here instead of | // ApiResourcesOptions 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() | // referencing the cmd.Flags() | ||||||
| type ApiResourcesOptions struct { | type ApiResourcesOptions struct { | ||||||
| 	out io.Writer |  | ||||||
|  |  | ||||||
| 	Output     string | 	Output     string | ||||||
| 	APIGroup   string | 	APIGroup   string | ||||||
| 	Namespaced bool | 	Namespaced bool | ||||||
| 	NoHeaders  bool | 	NoHeaders  bool | ||||||
|  |  | ||||||
|  | 	genericclioptions.IOStreams | ||||||
| } | } | ||||||
|  |  | ||||||
| // groupResource contains the APIGroup and APIResource | // groupResource contains the APIGroup and APIResource | ||||||
| @@ -67,10 +68,14 @@ type groupResource struct { | |||||||
| 	APIResource metav1.APIResource | 	APIResource metav1.APIResource | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewCmdApiResources(f cmdutil.Factory, out io.Writer) *cobra.Command { | func NewAPIResourceOptions(ioStreams genericclioptions.IOStreams) *ApiResourcesOptions { | ||||||
| 	options := &ApiResourcesOptions{ | 	return &ApiResourcesOptions{ | ||||||
| 		out: out, | 		IOStreams: ioStreams, | ||||||
| 	} | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewCmdApiResources(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
|  | 	o := NewAPIResourceOptions(ioStreams) | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use:     "api-resources", | 		Use:     "api-resources", | ||||||
| @@ -78,15 +83,15 @@ func NewCmdApiResources(f cmdutil.Factory, out io.Writer) *cobra.Command { | |||||||
| 		Long:    "Print the supported API resources on the server", | 		Long:    "Print the supported API resources on the server", | ||||||
| 		Example: apiresources_example, | 		Example: apiresources_example, | ||||||
| 		Run: func(cmd *cobra.Command, args []string) { | 		Run: func(cmd *cobra.Command, args []string) { | ||||||
| 			cmdutil.CheckErr(options.Complete(cmd)) | 			cmdutil.CheckErr(o.Complete(cmd)) | ||||||
| 			cmdutil.CheckErr(options.Validate(cmd)) | 			cmdutil.CheckErr(o.Validate(cmd)) | ||||||
| 			cmdutil.CheckErr(options.RunApiResources(cmd, f)) | 			cmdutil.CheckErr(o.RunApiResources(cmd, f)) | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	cmdutil.AddOutputFlags(cmd) | 	cmdutil.AddOutputFlags(cmd) | ||||||
| 	cmdutil.AddNoHeadersFlags(cmd) | 	cmdutil.AddNoHeadersFlags(cmd) | ||||||
| 	cmd.Flags().StringVar(&options.APIGroup, "api-group", "", "The API group to use when talking to the server.") | 	cmd.Flags().StringVar(&o.APIGroup, "api-group", "", "The API group to use when talking to the server.") | ||||||
| 	cmd.Flags().BoolVar(&options.Namespaced, "namespaced", true, "Namespaced indicates if a resource is namespaced or not.") | 	cmd.Flags().BoolVar(&o.Namespaced, "namespaced", true, "Namespaced indicates if a resource is namespaced or not.") | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -110,7 +115,7 @@ func (o *ApiResourcesOptions) Validate(cmd *cobra.Command) error { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (o *ApiResourcesOptions) RunApiResources(cmd *cobra.Command, f cmdutil.Factory) error { | func (o *ApiResourcesOptions) RunApiResources(cmd *cobra.Command, f cmdutil.Factory) error { | ||||||
| 	w := printers.GetNewTabWriter(o.out) | 	w := printers.GetNewTabWriter(o.Out) | ||||||
| 	defer w.Flush() | 	defer w.Flush() | ||||||
|  |  | ||||||
| 	discoveryclient, err := f.DiscoveryClient() | 	discoveryclient, err := f.DiscoveryClient() | ||||||
|   | |||||||
| @@ -73,8 +73,7 @@ type ApplyOptions struct { | |||||||
| 	OpenApiPatch   bool | 	OpenApiPatch   bool | ||||||
| 	PruneWhitelist []string | 	PruneWhitelist []string | ||||||
|  |  | ||||||
| 	Out    io.Writer | 	genericclioptions.IOStreams | ||||||
| 	ErrOut io.Writer |  | ||||||
| } | } | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| @@ -113,7 +112,7 @@ var ( | |||||||
| 	warningNoLastAppliedConfigAnnotation = "Warning: %[1]s apply should be used on resource created by either %[1]s create --save-config or %[1]s apply\n" | 	warningNoLastAppliedConfigAnnotation = "Warning: %[1]s apply should be used on resource created by either %[1]s create --save-config or %[1]s apply\n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func NewApplyOptions(out, errout io.Writer) *ApplyOptions { | func NewApplyOptions(ioStreams genericclioptions.IOStreams) *ApplyOptions { | ||||||
| 	return &ApplyOptions{ | 	return &ApplyOptions{ | ||||||
| 		RecordFlags: genericclioptions.NewRecordFlags(), | 		RecordFlags: genericclioptions.NewRecordFlags(), | ||||||
| 		DeleteFlags: NewDeleteFlags("that contains the configuration to apply"), | 		DeleteFlags: NewDeleteFlags("that contains the configuration to apply"), | ||||||
| @@ -124,13 +123,12 @@ func NewApplyOptions(out, errout io.Writer) *ApplyOptions { | |||||||
|  |  | ||||||
| 		Recorder: genericclioptions.NoopRecorder{}, | 		Recorder: genericclioptions.NoopRecorder{}, | ||||||
|  |  | ||||||
| 		Out:    out, | 		IOStreams: ioStreams, | ||||||
| 		ErrOut: errout, |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewCmdApply(baseName string, f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { | func NewCmdApply(baseName string, f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	o := NewApplyOptions(out, errOut) | 	o := NewApplyOptions(ioStreams) | ||||||
|  |  | ||||||
| 	// Store baseName for use in printing warnings / messages involving the base command name. | 	// Store baseName for use in printing warnings / messages involving the base command name. | ||||||
| 	// This is useful for downstream command that wrap this one. | 	// This is useful for downstream command that wrap this one. | ||||||
| @@ -167,9 +165,9 @@ func NewCmdApply(baseName string, f cmdutil.Factory, out, errOut io.Writer) *cob | |||||||
| 	cmdutil.AddIncludeUninitializedFlag(cmd) | 	cmdutil.AddIncludeUninitializedFlag(cmd) | ||||||
|  |  | ||||||
| 	// apply subcommands | 	// apply subcommands | ||||||
| 	cmd.AddCommand(NewCmdApplyViewLastApplied(f, out, errOut)) | 	cmd.AddCommand(NewCmdApplyViewLastApplied(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdApplySetLastApplied(f, out, errOut)) | 	cmd.AddCommand(NewCmdApplySetLastApplied(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdApplyEditLastApplied(f, out, errOut)) | 	cmd.AddCommand(NewCmdApplyEditLastApplied(f, ioStreams)) | ||||||
|  |  | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,14 +17,13 @@ limitations under the License. | |||||||
| package cmd | package cmd | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -57,8 +56,8 @@ var ( | |||||||
| 		kubectl apply edit-last-applied -f deploy.yaml -o json`) | 		kubectl apply edit-last-applied -f deploy.yaml -o json`) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func NewCmdApplyEditLastApplied(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { | func NewCmdApplyEditLastApplied(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	o := editor.NewEditOptions(editor.ApplyEditMode, out, errOut) | 	o := editor.NewEditOptions(editor.ApplyEditMode, ioStreams) | ||||||
|  |  | ||||||
| 	validArgs := cmdutil.ValidArgList(f) | 	validArgs := cmdutil.ValidArgList(f) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -35,6 +35,7 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/resource" | 	"k8s.io/kubernetes/pkg/kubectl/resource" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| @@ -55,8 +56,7 @@ type SetLastAppliedOptions struct { | |||||||
| 	PatchBufferList  []PatchBuffer | 	PatchBufferList  []PatchBuffer | ||||||
| 	Factory          cmdutil.Factory | 	Factory          cmdutil.Factory | ||||||
|  |  | ||||||
| 	Out    io.Writer | 	genericclioptions.IOStreams | ||||||
| 	ErrOut io.Writer |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type PatchBuffer struct { | type PatchBuffer struct { | ||||||
| @@ -82,15 +82,14 @@ var ( | |||||||
| 		`)) | 		`)) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func NewSetLastAppliedOptions(out, errout io.Writer) *SetLastAppliedOptions { | func NewSetLastAppliedOptions(ioStreams genericclioptions.IOStreams) *SetLastAppliedOptions { | ||||||
| 	return &SetLastAppliedOptions{ | 	return &SetLastAppliedOptions{ | ||||||
| 		Out:    out, | 		IOStreams: ioStreams, | ||||||
| 		ErrOut: errout, |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewCmdApplySetLastApplied(f cmdutil.Factory, out, errout io.Writer) *cobra.Command { | func NewCmdApplySetLastApplied(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := NewSetLastAppliedOptions(out, errout) | 	options := NewSetLastAppliedOptions(ioStreams) | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use: "set-last-applied -f FILENAME", | 		Use: "set-last-applied -f FILENAME", | ||||||
| 		DisableFlagsInUseLine: true, | 		DisableFlagsInUseLine: true, | ||||||
|   | |||||||
| @@ -51,6 +51,7 @@ import ( | |||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/util/openapi" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -70,13 +71,10 @@ var ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestApplyExtraArgsFail(t *testing.T) { | func TestApplyExtraArgsFail(t *testing.T) { | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 	errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	f := cmdtesting.NewTestFactory() | 	f := cmdtesting.NewTestFactory() | ||||||
| 	defer f.Cleanup() | 	defer f.Cleanup() | ||||||
|  |  | ||||||
| 	c := NewCmdApply("kubectl", f, buf, errBuf) | 	c := NewCmdApply("kubectl", f, genericclioptions.NewTestIOStreamsDiscard()) | ||||||
| 	if validateApplyArgs(c, []string{"rc"}) == nil { | 	if validateApplyArgs(c, []string{"rc"}) == nil { | ||||||
| 		t.Fatalf("unexpected non-error") | 		t.Fatalf("unexpected non-error") | ||||||
| 	} | 	} | ||||||
| @@ -298,10 +296,9 @@ func TestRunApplyPrintsValidObjectList(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	tf.ClientConfigVal = defaultClientConfig() | 	tf.ClientConfigVal = defaultClientConfig() | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 	errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 	cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 	cmd.Flags().Set("filename", filenameCM) | 	cmd.Flags().Set("filename", filenameCM) | ||||||
| 	cmd.Flags().Set("output", "json") | 	cmd.Flags().Set("output", "json") | ||||||
| 	cmd.Flags().Set("dry-run", "true") | 	cmd.Flags().Set("dry-run", "true") | ||||||
| @@ -426,7 +423,6 @@ func TestRunApplyViewLastApplied(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			tf.ClientConfigVal = defaultClientConfig() | 			tf.ClientConfigVal = defaultClientConfig() | ||||||
| 			buf, errBuf := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			cmdutil.BehaviorOnFatal(func(str string, code int) { | 			cmdutil.BehaviorOnFatal(func(str string, code int) { | ||||||
| 				if str != test.expectedErr { | 				if str != test.expectedErr { | ||||||
| @@ -434,7 +430,8 @@ func TestRunApplyViewLastApplied(t *testing.T) { | |||||||
| 				} | 				} | ||||||
| 			}) | 			}) | ||||||
|  |  | ||||||
| 			cmd := NewCmdApplyViewLastApplied(tf, buf, errBuf) | 			ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 			cmd := NewCmdApplyViewLastApplied(tf, ioStreams) | ||||||
| 			if test.filePath != "" { | 			if test.filePath != "" { | ||||||
| 				cmd.Flags().Set("filename", test.filePath) | 				cmd.Flags().Set("filename", test.filePath) | ||||||
| 			} | 			} | ||||||
| @@ -479,10 +476,9 @@ func TestApplyObjectWithoutAnnotation(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	tf.ClientConfigVal = defaultClientConfig() | 	tf.ClientConfigVal = defaultClientConfig() | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 	errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 	ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
|  | 	cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 	cmd.Flags().Set("filename", filenameRC) | 	cmd.Flags().Set("filename", filenameRC) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Run(cmd, []string{}) | 	cmd.Run(cmd, []string{}) | ||||||
| @@ -527,10 +523,9 @@ func TestApplyObject(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 			tf.OpenAPISchemaFunc = fn | 			tf.OpenAPISchemaFunc = fn | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 			errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 			ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
|  | 			cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 			cmd.Flags().Set("filename", filenameRC) | 			cmd.Flags().Set("filename", filenameRC) | ||||||
| 			cmd.Flags().Set("output", "name") | 			cmd.Flags().Set("output", "name") | ||||||
| 			cmd.Run(cmd, []string{}) | 			cmd.Run(cmd, []string{}) | ||||||
| @@ -592,10 +587,9 @@ func TestApplyObjectOutput(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 			tf.OpenAPISchemaFunc = fn | 			tf.OpenAPISchemaFunc = fn | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 			errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 			ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
|  | 			cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 			cmd.Flags().Set("filename", filenameRC) | 			cmd.Flags().Set("filename", filenameRC) | ||||||
| 			cmd.Flags().Set("output", "yaml") | 			cmd.Flags().Set("output", "yaml") | ||||||
| 			cmd.Run(cmd, []string{}) | 			cmd.Run(cmd, []string{}) | ||||||
| @@ -654,10 +648,9 @@ func TestApplyRetry(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 			tf.OpenAPISchemaFunc = fn | 			tf.OpenAPISchemaFunc = fn | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 			errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 			ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
|  | 			cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 			cmd.Flags().Set("filename", filenameRC) | 			cmd.Flags().Set("filename", filenameRC) | ||||||
| 			cmd.Flags().Set("output", "name") | 			cmd.Flags().Set("output", "name") | ||||||
| 			cmd.Run(cmd, []string{}) | 			cmd.Run(cmd, []string{}) | ||||||
| @@ -704,10 +697,9 @@ func TestApplyNonExistObject(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 	errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 	cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 	cmd.Flags().Set("filename", filenameRC) | 	cmd.Flags().Set("filename", filenameRC) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Run(cmd, []string{}) | 	cmd.Run(cmd, []string{}) | ||||||
| @@ -759,10 +751,8 @@ func TestApplyEmptyPatch(t *testing.T) { | |||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
|  |  | ||||||
| 	// 1. apply non exist object | 	// 1. apply non exist object | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	errBuf := bytes.NewBuffer([]byte{}) | 	cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
|  |  | ||||||
| 	cmd := NewCmdApply("kubectl", tf, buf, errBuf) |  | ||||||
| 	cmd.Flags().Set("filename", filenameRC) | 	cmd.Flags().Set("filename", filenameRC) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Run(cmd, []string{}) | 	cmd.Run(cmd, []string{}) | ||||||
| @@ -776,10 +766,8 @@ func TestApplyEmptyPatch(t *testing.T) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// 2. test apply already exist object, will not send empty patch request | 	// 2. test apply already exist object, will not send empty patch request | ||||||
| 	buf = bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ = genericclioptions.NewTestIOStreams() | ||||||
| 	errBuf = bytes.NewBuffer([]byte{}) | 	cmd = NewCmdApply("kubectl", tf, ioStreams) | ||||||
|  |  | ||||||
| 	cmd = NewCmdApply("kubectl", tf, buf, errBuf) |  | ||||||
| 	cmd.Flags().Set("filename", filenameRC) | 	cmd.Flags().Set("filename", filenameRC) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Run(cmd, []string{}) | 	cmd.Run(cmd, []string{}) | ||||||
| @@ -835,10 +823,9 @@ func testApplyMultipleObjects(t *testing.T, asList bool) { | |||||||
| 			} | 			} | ||||||
| 			tf.OpenAPISchemaFunc = fn | 			tf.OpenAPISchemaFunc = fn | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 			errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 			ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
|  | 			cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 			if asList { | 			if asList { | ||||||
| 				cmd.Flags().Set("filename", filenameRCSVC) | 				cmd.Flags().Set("filename", filenameRCSVC) | ||||||
| 			} else { | 			} else { | ||||||
| @@ -936,10 +923,9 @@ func TestApplyNULLPreservation(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 			tf.OpenAPISchemaFunc = fn | 			tf.OpenAPISchemaFunc = fn | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 			errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 			ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
|  | 			cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 			cmd.Flags().Set("filename", filenameDeployObjClientside) | 			cmd.Flags().Set("filename", filenameDeployObjClientside) | ||||||
| 			cmd.Flags().Set("output", "name") | 			cmd.Flags().Set("output", "name") | ||||||
|  |  | ||||||
| @@ -1003,10 +989,9 @@ func TestUnstructuredApply(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 			tf.OpenAPISchemaFunc = fn | 			tf.OpenAPISchemaFunc = fn | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 			errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 			ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
|  | 			cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 			cmd.Flags().Set("filename", filenameWidgetClientside) | 			cmd.Flags().Set("filename", filenameWidgetClientside) | ||||||
| 			cmd.Flags().Set("output", "name") | 			cmd.Flags().Set("output", "name") | ||||||
| 			cmd.Run(cmd, []string{}) | 			cmd.Run(cmd, []string{}) | ||||||
| @@ -1097,10 +1082,9 @@ func TestUnstructuredIdempotentApply(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 			tf.OpenAPISchemaFunc = fn | 			tf.OpenAPISchemaFunc = fn | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 			errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			cmd := NewCmdApply("kubectl", tf, buf, errBuf) | 			ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
|  | 			cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
| 			cmd.Flags().Set("filename", filenameWidgetClientside) | 			cmd.Flags().Set("filename", filenameWidgetClientside) | ||||||
| 			cmd.Flags().Set("output", "name") | 			cmd.Flags().Set("output", "name") | ||||||
| 			cmd.Run(cmd, []string{}) | 			cmd.Run(cmd, []string{}) | ||||||
| @@ -1203,7 +1187,6 @@ func TestRunApplySetLastApplied(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
| 			tf.ClientConfigVal = defaultClientConfig() | 			tf.ClientConfigVal = defaultClientConfig() | ||||||
| 			buf, errBuf := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			cmdutil.BehaviorOnFatal(func(str string, code int) { | 			cmdutil.BehaviorOnFatal(func(str string, code int) { | ||||||
| 				if str != test.expectedErr { | 				if str != test.expectedErr { | ||||||
| @@ -1211,7 +1194,8 @@ func TestRunApplySetLastApplied(t *testing.T) { | |||||||
| 				} | 				} | ||||||
| 			}) | 			}) | ||||||
|  |  | ||||||
| 			cmd := NewCmdApplySetLastApplied(tf, buf, errBuf) | 			ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 			cmd := NewCmdApplySetLastApplied(tf, ioStreams) | ||||||
| 			cmd.Flags().Set("filename", test.filePath) | 			cmd.Flags().Set("filename", test.filePath) | ||||||
| 			cmd.Flags().Set("output", test.output) | 			cmd.Flags().Set("output", test.output) | ||||||
| 			cmd.Run(cmd, []string{}) | 			cmd.Run(cmd, []string{}) | ||||||
| @@ -1382,10 +1366,8 @@ func TestForceApply(t *testing.T) { | |||||||
| 			tf.ClientConfigVal = &restclient.Config{} | 			tf.ClientConfigVal = &restclient.Config{} | ||||||
| 			tf.Namespace = "test" | 			tf.Namespace = "test" | ||||||
|  |  | ||||||
| 			buf := bytes.NewBuffer([]byte{}) | 			ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
| 			errBuf := bytes.NewBuffer([]byte{}) | 			cmd := NewCmdApply("kubectl", tf, ioStreams) | ||||||
|  |  | ||||||
| 			cmd := NewCmdApply("kubectl", tf, buf, errBuf) |  | ||||||
| 			cmd.Flags().Set("filename", filenameRC) | 			cmd.Flags().Set("filename", filenameRC) | ||||||
| 			cmd.Flags().Set("output", "name") | 			cmd.Flags().Set("output", "name") | ||||||
| 			cmd.Flags().Set("force", "true") | 			cmd.Flags().Set("force", "true") | ||||||
|   | |||||||
| @@ -20,13 +20,13 @@ import ( | |||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/ghodss/yaml" | 	"github.com/ghodss/yaml" | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	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/resource" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
| @@ -38,8 +38,8 @@ type ViewLastAppliedOptions struct { | |||||||
| 	OutputFormat                 string | 	OutputFormat                 string | ||||||
| 	All                          bool | 	All                          bool | ||||||
| 	Factory                      cmdutil.Factory | 	Factory                      cmdutil.Factory | ||||||
| 	Out                          io.Writer |  | ||||||
| 	ErrOut                       io.Writer | 	genericclioptions.IOStreams | ||||||
| } | } | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -57,16 +57,16 @@ var ( | |||||||
| 		kubectl apply view-last-applied -f deploy.yaml -o json`)) | 		kubectl apply view-last-applied -f deploy.yaml -o json`)) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func NewViewLastAppliedOptions(out, err io.Writer) *ViewLastAppliedOptions { | func NewViewLastAppliedOptions(ioStreams genericclioptions.IOStreams) *ViewLastAppliedOptions { | ||||||
| 	return &ViewLastAppliedOptions{ | 	return &ViewLastAppliedOptions{ | ||||||
| 		Out:          out, |  | ||||||
| 		ErrOut:       err, |  | ||||||
| 		OutputFormat: "yaml", | 		OutputFormat: "yaml", | ||||||
|  |  | ||||||
|  | 		IOStreams: ioStreams, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewCmdApplyViewLastApplied(f cmdutil.Factory, out, err io.Writer) *cobra.Command { | func NewCmdApplyViewLastApplied(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := NewViewLastAppliedOptions(out, err) | 	options := NewViewLastAppliedOptions(ioStreams) | ||||||
| 	validArgs := cmdutil.ValidArgList(f) | 	validArgs := cmdutil.ValidArgList(f) | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| @@ -246,11 +247,13 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob | |||||||
| 	// From this point and forward we get warnings on flags that contain "_" separators | 	// From this point and forward we get warnings on flags that contain "_" separators | ||||||
| 	cmds.SetGlobalNormalizationFunc(flag.WarnWordSepNormalizeFunc) | 	cmds.SetGlobalNormalizationFunc(flag.WarnWordSepNormalizeFunc) | ||||||
|  |  | ||||||
|  | 	ioStreams := genericclioptions.IOStreams{In: in, Out: out, ErrOut: err} | ||||||
|  |  | ||||||
| 	groups := templates.CommandGroups{ | 	groups := templates.CommandGroups{ | ||||||
| 		{ | 		{ | ||||||
| 			Message: "Basic Commands (Beginner):", | 			Message: "Basic Commands (Beginner):", | ||||||
| 			Commands: []*cobra.Command{ | 			Commands: []*cobra.Command{ | ||||||
| 				create.NewCmdCreate(f, out, err), | 				create.NewCmdCreate(f, ioStreams), | ||||||
| 				NewCmdExposeService(f, out), | 				NewCmdExposeService(f, out), | ||||||
| 				NewCmdRun(f, in, out, err), | 				NewCmdRun(f, in, out, err), | ||||||
| 				set.NewCmdSet(f, in, out, err), | 				set.NewCmdSet(f, in, out, err), | ||||||
| @@ -262,7 +265,7 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob | |||||||
| 			Commands: []*cobra.Command{ | 			Commands: []*cobra.Command{ | ||||||
| 				resource.NewCmdGet(f, out, err), | 				resource.NewCmdGet(f, out, err), | ||||||
| 				NewCmdExplain(f, out, err), | 				NewCmdExplain(f, out, err), | ||||||
| 				NewCmdEdit(f, out, err), | 				NewCmdEdit(f, ioStreams), | ||||||
| 				NewCmdDelete(f, out, err), | 				NewCmdDelete(f, out, err), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| @@ -303,7 +306,7 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob | |||||||
| 		{ | 		{ | ||||||
| 			Message: "Advanced Commands:", | 			Message: "Advanced Commands:", | ||||||
| 			Commands: []*cobra.Command{ | 			Commands: []*cobra.Command{ | ||||||
| 				NewCmdApply("kubectl", f, out, err), | 				NewCmdApply("kubectl", f, ioStreams), | ||||||
| 				NewCmdPatch(f, out), | 				NewCmdPatch(f, out), | ||||||
| 				NewCmdReplace(f, out, err), | 				NewCmdReplace(f, out, err), | ||||||
| 				NewCmdConvert(f, out), | 				NewCmdConvert(f, out), | ||||||
| @@ -313,7 +316,7 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob | |||||||
| 			Message: "Settings Commands:", | 			Message: "Settings Commands:", | ||||||
| 			Commands: []*cobra.Command{ | 			Commands: []*cobra.Command{ | ||||||
| 				NewCmdLabel(f, out, err), | 				NewCmdLabel(f, out, err), | ||||||
| 				NewCmdAnnotate(f, out), | 				NewCmdAnnotate(f, ioStreams), | ||||||
| 				NewCmdCompletion(out, ""), | 				NewCmdCompletion(out, ""), | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| @@ -347,7 +350,7 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob | |||||||
| 	cmds.AddCommand(NewCmdPlugin(f, in, out, err)) | 	cmds.AddCommand(NewCmdPlugin(f, in, out, err)) | ||||||
| 	cmds.AddCommand(NewCmdVersion(f, out)) | 	cmds.AddCommand(NewCmdVersion(f, out)) | ||||||
| 	cmds.AddCommand(NewCmdApiVersions(f, out)) | 	cmds.AddCommand(NewCmdApiVersions(f, out)) | ||||||
| 	cmds.AddCommand(NewCmdApiResources(f, out)) | 	cmds.AddCommand(NewCmdApiResources(f, ioStreams)) | ||||||
| 	cmds.AddCommand(NewCmdOptions(out)) | 	cmds.AddCommand(NewCmdOptions(out)) | ||||||
|  |  | ||||||
| 	return cmds | 	return cmds | ||||||
|   | |||||||
| @@ -77,6 +77,7 @@ go_test( | |||||||
|         "//pkg/kubectl:go_default_library", |         "//pkg/kubectl:go_default_library", | ||||||
|         "//pkg/kubectl/cmd/testing:go_default_library", |         "//pkg/kubectl/cmd/testing:go_default_library", | ||||||
|         "//pkg/kubectl/cmd/util:go_default_library", |         "//pkg/kubectl/cmd/util:go_default_library", | ||||||
|  |         "//pkg/kubectl/genericclioptions:go_default_library", | ||||||
|         "//pkg/kubectl/scheme:go_default_library", |         "//pkg/kubectl/scheme:go_default_library", | ||||||
|         "//vendor/github.com/stretchr/testify/assert:go_default_library", |         "//vendor/github.com/stretchr/testify/assert:go_default_library", | ||||||
|         "//vendor/k8s.io/api/batch/v1:go_default_library", |         "//vendor/k8s.io/api/batch/v1:go_default_library", | ||||||
|   | |||||||
| @@ -50,11 +50,11 @@ type CreateOptions struct { | |||||||
| 	Selector         string | 	Selector         string | ||||||
| 	EditBeforeCreate bool | 	EditBeforeCreate bool | ||||||
| 	Raw              string | 	Raw              string | ||||||
| 	Out              io.Writer |  | ||||||
| 	ErrOut           io.Writer |  | ||||||
|  |  | ||||||
| 	Recorder genericclioptions.Recorder | 	Recorder genericclioptions.Recorder | ||||||
| 	PrintObj func(obj kruntime.Object) error | 	PrintObj func(obj kruntime.Object) error | ||||||
|  |  | ||||||
|  | 	genericclioptions.IOStreams | ||||||
| } | } | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -74,20 +74,19 @@ var ( | |||||||
| 		kubectl create -f docker-registry.yaml --edit -o json`)) | 		kubectl create -f docker-registry.yaml --edit -o json`)) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func NewCreateOptions(out, errOut io.Writer) *CreateOptions { | func NewCreateOptions(ioStreams genericclioptions.IOStreams) *CreateOptions { | ||||||
| 	return &CreateOptions{ | 	return &CreateOptions{ | ||||||
| 		PrintFlags:  NewPrintFlags("created"), | 		PrintFlags:  NewPrintFlags("created"), | ||||||
| 		RecordFlags: genericclioptions.NewRecordFlags(), | 		RecordFlags: genericclioptions.NewRecordFlags(), | ||||||
|  |  | ||||||
| 		Recorder: genericclioptions.NoopRecorder{}, | 		Recorder: genericclioptions.NoopRecorder{}, | ||||||
|  |  | ||||||
| 		Out:    out, | 		IOStreams: ioStreams, | ||||||
| 		ErrOut: errOut, |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewCmdCreate(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { | func NewCmdCreate(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	o := NewCreateOptions(out, errOut) | 	o := NewCreateOptions(ioStreams) | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use: "create -f FILENAME", | 		Use: "create -f FILENAME", | ||||||
| @@ -97,7 +96,7 @@ func NewCmdCreate(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { | |||||||
| 		Example: createExample, | 		Example: createExample, | ||||||
| 		Run: func(cmd *cobra.Command, args []string) { | 		Run: func(cmd *cobra.Command, args []string) { | ||||||
| 			if cmdutil.IsFilenameSliceEmpty(o.FilenameOptions.Filenames) { | 			if cmdutil.IsFilenameSliceEmpty(o.FilenameOptions.Filenames) { | ||||||
| 				defaultRunFunc := cmdutil.DefaultSubCommandRun(errOut) | 				defaultRunFunc := cmdutil.DefaultSubCommandRun(ioStreams.ErrOut) | ||||||
| 				defaultRunFunc(cmd, args) | 				defaultRunFunc(cmd, args) | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| @@ -125,20 +124,20 @@ func NewCmdCreate(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { | |||||||
| 	o.PrintFlags.AddFlags(cmd) | 	o.PrintFlags.AddFlags(cmd) | ||||||
|  |  | ||||||
| 	// create subcommands | 	// create subcommands | ||||||
| 	cmd.AddCommand(NewCmdCreateNamespace(f, out)) | 	cmd.AddCommand(NewCmdCreateNamespace(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateQuota(f, out)) | 	cmd.AddCommand(NewCmdCreateQuota(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateSecret(f, out, errOut)) | 	cmd.AddCommand(NewCmdCreateSecret(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateConfigMap(f, out)) | 	cmd.AddCommand(NewCmdCreateConfigMap(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateServiceAccount(f, out)) | 	cmd.AddCommand(NewCmdCreateServiceAccount(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateService(f, out, errOut)) | 	cmd.AddCommand(NewCmdCreateService(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateDeployment(f, out, errOut)) | 	cmd.AddCommand(NewCmdCreateDeployment(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateClusterRole(f, out)) | 	cmd.AddCommand(NewCmdCreateClusterRole(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateClusterRoleBinding(f, out)) | 	cmd.AddCommand(NewCmdCreateClusterRoleBinding(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateRole(f, out)) | 	cmd.AddCommand(NewCmdCreateRole(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateRoleBinding(f, out)) | 	cmd.AddCommand(NewCmdCreateRoleBinding(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreatePodDisruptionBudget(f, out)) | 	cmd.AddCommand(NewCmdCreatePodDisruptionBudget(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreatePriorityClass(f, out)) | 	cmd.AddCommand(NewCmdCreatePriorityClass(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateJob(f, out)) | 	cmd.AddCommand(NewCmdCreateJob(f, ioStreams)) | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -207,7 +206,7 @@ func (o *CreateOptions) RunCreate(f cmdutil.Factory, cmd *cobra.Command) error { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if o.EditBeforeCreate { | 	if o.EditBeforeCreate { | ||||||
| 		return RunEditOnCreate(f, o.RecordFlags, o.Out, o.ErrOut, cmd, &o.FilenameOptions) | 		return RunEditOnCreate(f, o.RecordFlags, o.IOStreams, cmd, &o.FilenameOptions) | ||||||
| 	} | 	} | ||||||
| 	schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) | 	schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -292,8 +291,8 @@ func (o *CreateOptions) raw(f cmdutil.Factory) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func RunEditOnCreate(f cmdutil.Factory, recordFlags *genericclioptions.RecordFlags, out, errOut io.Writer, cmd *cobra.Command, options *resource.FilenameOptions) error { | func RunEditOnCreate(f cmdutil.Factory, recordFlags *genericclioptions.RecordFlags, ioStreams genericclioptions.IOStreams, cmd *cobra.Command, options *resource.FilenameOptions) error { | ||||||
| 	editOptions := editor.NewEditOptions(editor.EditBeforeCreateMode, out, errOut) | 	editOptions := editor.NewEditOptions(editor.EditBeforeCreateMode, ioStreams) | ||||||
| 	editOptions.FilenameOptions = *options | 	editOptions.FilenameOptions = *options | ||||||
| 	editOptions.ValidateOptions = cmdutil.ValidateOptions{ | 	editOptions.ValidateOptions = cmdutil.ValidateOptions{ | ||||||
| 		EnableValidation: cmdutil.GetFlagBool(cmd, "validate"), | 		EnableValidation: cmdutil.GetFlagBool(cmd, "validate"), | ||||||
| @@ -341,8 +340,14 @@ type CreateSubcommandOptions struct { | |||||||
|  |  | ||||||
| 	PrintObj func(obj kruntime.Object) error | 	PrintObj func(obj kruntime.Object) error | ||||||
|  |  | ||||||
| 	CmdOut io.Writer | 	genericclioptions.IOStreams | ||||||
| 	CmdErr io.Writer | } | ||||||
|  |  | ||||||
|  | func NewCreateSubcommandOptions(ioStreams genericclioptions.IOStreams) *CreateSubcommandOptions { | ||||||
|  | 	return &CreateSubcommandOptions{ | ||||||
|  | 		PrintFlags: NewPrintFlags("created"), | ||||||
|  | 		IOStreams:  ioStreams, | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (o *CreateSubcommandOptions) Complete(cmd *cobra.Command, args []string, generator kubectl.StructuredGenerator) error { | func (o *CreateSubcommandOptions) Complete(cmd *cobra.Command, args []string, generator kubectl.StructuredGenerator) error { | ||||||
| @@ -365,7 +370,7 @@ func (o *CreateSubcommandOptions) Complete(cmd *cobra.Command, args []string, ge | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	o.PrintObj = func(obj kruntime.Object) error { | 	o.PrintObj = func(obj kruntime.Object) error { | ||||||
| 		return printer.PrintObj(obj, o.CmdOut) | 		return printer.PrintObj(obj, o.Out) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
|   | |||||||
| @@ -18,7 +18,6 @@ package create | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" |  | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
| @@ -26,6 +25,7 @@ import ( | |||||||
| 	rbacv1 "k8s.io/api/rbac/v1" | 	rbacv1 "k8s.io/api/rbac/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -59,12 +59,9 @@ type CreateClusterRoleOptions struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // ClusterRole is a command to ease creating ClusterRoles. | // ClusterRole is a command to ease creating ClusterRoles. | ||||||
| func NewCmdCreateClusterRole(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateClusterRole(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	c := &CreateClusterRoleOptions{ | 	c := &CreateClusterRoleOptions{ | ||||||
| 		CreateRoleOptions: &CreateRoleOptions{ | 		CreateRoleOptions: NewCreateRoleOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			Out:        cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use: "clusterrole NAME --verb=verb --resource=resource.group [--resource-name=resourcename] [--dry-run]", | 		Use: "clusterrole NAME --verb=verb --resource=resource.group [--resource-name=resourcename] [--dry-run]", | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	rbac "k8s.io/api/rbac/v1" | 	rbac "k8s.io/api/rbac/v1" | ||||||
| @@ -29,6 +28,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -133,8 +133,8 @@ func TestCreateClusterRole(t *testing.T) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for name, test := range tests { | 	for name, test := range tests { | ||||||
| 		buf := bytes.NewBuffer([]byte{}) | 		ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 		cmd := NewCmdCreateClusterRole(tf, buf) | 		cmd := NewCmdCreateClusterRole(tf, ioStreams) | ||||||
| 		cmd.Flags().Set("dry-run", "true") | 		cmd.Flags().Set("dry-run", "true") | ||||||
| 		cmd.Flags().Set("output", "yaml") | 		cmd.Flags().Set("output", "yaml") | ||||||
| 		cmd.Flags().Set("verb", test.verbs) | 		cmd.Flags().Set("verb", test.verbs) | ||||||
|   | |||||||
| @@ -17,13 +17,12 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -41,12 +40,9 @@ type ClusterRoleBindingOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // ClusterRoleBinding is a command to ease creating ClusterRoleBindings. | // ClusterRoleBinding is a command to ease creating ClusterRoleBindings. | ||||||
| func NewCmdCreateClusterRoleBinding(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateClusterRoleBinding(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &ClusterRoleBindingOpts{ | 	options := &ClusterRoleBindingOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestCreateClusterRoleBinding(t *testing.T) { | func TestCreateClusterRoleBinding(t *testing.T) { | ||||||
| @@ -111,8 +112,8 @@ func TestCreateClusterRoleBinding(t *testing.T) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	expectedOutput := "clusterrolebinding.rbac.authorization.k8s.io/" + expectBinding.Name + "\n" | 	expectedOutput := "clusterrolebinding.rbac.authorization.k8s.io/" + expectBinding.Name + "\n" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdCreateClusterRoleBinding(tf, buf) | 	cmd := NewCmdCreateClusterRoleBinding(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("clusterrole", "fake-clusterrole") | 	cmd.Flags().Set("clusterrole", "fake-clusterrole") | ||||||
| 	cmd.Flags().Set("user", "fake-user") | 	cmd.Flags().Set("user", "fake-user") | ||||||
| 	cmd.Flags().Set("group", "fake-group") | 	cmd.Flags().Set("group", "fake-group") | ||||||
|   | |||||||
| @@ -17,13 +17,12 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -62,12 +61,9 @@ type ConfigMapOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // ConfigMap is a command to ease creating ConfigMaps. | // ConfigMap is a command to ease creating ConfigMaps. | ||||||
| func NewCmdCreateConfigMap(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateConfigMap(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &ConfigMapOpts{ | 	options := &ConfigMapOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -29,6 +29,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -55,8 +56,8 @@ func TestCreateConfigMap(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdCreateConfigMap(tf, buf) | 	cmd := NewCmdCreateConfigMap(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Run(cmd, []string{configMap.Name}) | 	cmd.Run(cmd, []string{configMap.Name}) | ||||||
| 	expectedOutput := "configmap/" + configMap.Name + "\n" | 	expectedOutput := "configmap/" + configMap.Name + "\n" | ||||||
|   | |||||||
| @@ -17,13 +17,12 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -43,13 +42,9 @@ type DeploymentOpts struct { | |||||||
| // NewCmdCreateDeployment is a macro command to create a new deployment. | // NewCmdCreateDeployment is a macro command to create a new deployment. | ||||||
| // This command is better known to users as `kubectl create deployment`. | // This command is better known to users as `kubectl create deployment`. | ||||||
| // Note that this command overlaps significantly with the `kubectl run` command. | // Note that this command overlaps significantly with the `kubectl run` command. | ||||||
| func NewCmdCreateDeployment(f cmdutil.Factory, cmdOut, cmdErr io.Writer) *cobra.Command { | func NewCmdCreateDeployment(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &DeploymentOpts{ | 	options := &DeploymentOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 			CmdErr:     cmdErr, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| @@ -131,12 +126,12 @@ func (o *DeploymentOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] | |||||||
|  |  | ||||||
| 	if len(generatorName) == 0 { | 	if len(generatorName) == 0 { | ||||||
| 		generatorName = cmdutil.DeploymentBasicAppsV1GeneratorName | 		generatorName = cmdutil.DeploymentBasicAppsV1GeneratorName | ||||||
| 		generatorNameTemp, err := cmdutil.FallbackGeneratorNameIfNecessary(generatorName, clientset.Discovery(), o.CreateSubcommandOptions.CmdErr) | 		generatorNameTemp, err := cmdutil.FallbackGeneratorNameIfNecessary(generatorName, clientset.Discovery(), o.CreateSubcommandOptions.ErrOut) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		if generatorNameTemp != generatorName { | 		if generatorNameTemp != generatorName { | ||||||
| 			cmdutil.Warning(o.CreateSubcommandOptions.CmdErr, generatorName, generatorNameTemp) | 			cmdutil.Warning(o.CreateSubcommandOptions.ErrOut, generatorName, generatorNameTemp) | ||||||
| 		} else { | 		} else { | ||||||
| 			generatorName = generatorNameTemp | 			generatorName = generatorNameTemp | ||||||
| 		} | 		} | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func Test_generatorFromName(t *testing.T) { | func Test_generatorFromName(t *testing.T) { | ||||||
| @@ -104,9 +105,9 @@ func TestCreateDeployment(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| 	tf.ClientConfigVal = &restclient.Config{} | 	tf.ClientConfigVal = &restclient.Config{} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	cmd := NewCmdCreateDeployment(tf, buf, buf) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 	cmd := NewCmdCreateDeployment(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("dry-run", "true") | 	cmd.Flags().Set("dry-run", "true") | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Flags().Set("image", "hollywood/jonny.depp:v2") | 	cmd.Flags().Set("image", "hollywood/jonny.depp:v2") | ||||||
| @@ -136,16 +137,14 @@ func TestCreateDeploymentNoImage(t *testing.T) { | |||||||
| 	tf.ClientConfigVal = &restclient.Config{} | 	tf.ClientConfigVal = &restclient.Config{} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
|  |  | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams := genericclioptions.NewTestIOStreamsDiscard() | ||||||
| 	errBuff := bytes.NewBuffer([]byte{}) | 	cmd := NewCmdCreateDeployment(tf, ioStreams) | ||||||
| 	cmd := NewCmdCreateDeployment(tf, buf, errBuff) |  | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	options := &DeploymentOpts{ | 	options := &DeploymentOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: &CreateSubcommandOptions{ | ||||||
| 			PrintFlags: NewPrintFlags("created"), | 			PrintFlags: NewPrintFlags("created"), | ||||||
| 			CmdOut:     buf, |  | ||||||
| 			CmdErr:     errBuff, |  | ||||||
| 			DryRun:     true, | 			DryRun:     true, | ||||||
|  | 			IOStreams:  ioStreams, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,7 +18,6 @@ package create | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| @@ -29,6 +28,7 @@ import ( | |||||||
| 	clientbatchv1 "k8s.io/client-go/kubernetes/typed/batch/v1" | 	clientbatchv1 "k8s.io/client-go/kubernetes/typed/batch/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	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/resource" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
| @@ -53,30 +53,36 @@ type CreateJobOptions struct { | |||||||
| 	Namespace    string | 	Namespace    string | ||||||
| 	OutputFormat string | 	OutputFormat string | ||||||
| 	Client       clientbatchv1.BatchV1Interface | 	Client       clientbatchv1.BatchV1Interface | ||||||
| 	Out          io.Writer |  | ||||||
| 	DryRun       bool | 	DryRun       bool | ||||||
| 	Builder      *resource.Builder | 	Builder      *resource.Builder | ||||||
| 	Cmd          *cobra.Command | 	Cmd          *cobra.Command | ||||||
|  |  | ||||||
|  | 	genericclioptions.IOStreams | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewCreateJobOptions(ioStreams genericclioptions.IOStreams) *CreateJobOptions { | ||||||
|  | 	return &CreateJobOptions{ | ||||||
|  | 		PrintFlags: NewPrintFlags("created"), | ||||||
|  | 		IOStreams:  ioStreams, | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateJob is a command to ease creating Jobs from CronJobs. | // NewCmdCreateJob is a command to ease creating Jobs from CronJobs. | ||||||
| func NewCmdCreateJob(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateJob(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	c := &CreateJobOptions{ | 	o := NewCreateJobOptions(ioStreams) | ||||||
| 		PrintFlags: NewPrintFlags("created"), |  | ||||||
| 		Out:        cmdOut, |  | ||||||
| 	} |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use:     "job NAME [--from=CRONJOB]", | 		Use:     "job NAME [--from=CRONJOB]", | ||||||
| 		Short:   jobLong, | 		Short:   jobLong, | ||||||
| 		Long:    jobLong, | 		Long:    jobLong, | ||||||
| 		Example: jobExample, | 		Example: jobExample, | ||||||
| 		Run: func(cmd *cobra.Command, args []string) { | 		Run: func(cmd *cobra.Command, args []string) { | ||||||
| 			cmdutil.CheckErr(c.Complete(f, cmd, args)) | 			cmdutil.CheckErr(o.Complete(f, cmd, args)) | ||||||
| 			cmdutil.CheckErr(c.RunCreateJob()) | 			cmdutil.CheckErr(o.RunCreateJob()) | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	c.PrintFlags.AddFlags(cmd) | 	o.PrintFlags.AddFlags(cmd) | ||||||
|  |  | ||||||
| 	cmdutil.AddApplyAnnotationFlags(cmd) | 	cmdutil.AddApplyAnnotationFlags(cmd) | ||||||
| 	cmdutil.AddValidateFlags(cmd) | 	cmdutil.AddValidateFlags(cmd) | ||||||
| @@ -86,14 +92,14 @@ func NewCmdCreateJob(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | |||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *CreateJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string) (err error) { | func (o *CreateJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string) (err error) { | ||||||
| 	if len(args) == 0 { | 	if len(args) == 0 { | ||||||
| 		return cmdutil.UsageErrorf(cmd, "NAME is required") | 		return cmdutil.UsageErrorf(cmd, "NAME is required") | ||||||
| 	} | 	} | ||||||
| 	c.Name = args[0] | 	o.Name = args[0] | ||||||
|  |  | ||||||
| 	c.From = cmdutil.GetFlagString(cmd, "from") | 	o.From = cmdutil.GetFlagString(cmd, "from") | ||||||
| 	c.Namespace, _, err = f.DefaultNamespace() | 	o.Namespace, _, err = f.DefaultNamespace() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| @@ -102,32 +108,32 @@ func (c *CreateJobOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	c.Client = clientset.BatchV1() | 	o.Client = clientset.BatchV1() | ||||||
| 	c.Builder = f.NewBuilder() | 	o.Builder = f.NewBuilder() | ||||||
| 	c.DryRun = cmdutil.GetDryRunFlag(cmd) | 	o.DryRun = cmdutil.GetDryRunFlag(cmd) | ||||||
| 	c.Cmd = cmd | 	o.Cmd = cmd | ||||||
| 	c.OutputFormat = cmdutil.GetFlagString(cmd, "output") | 	o.OutputFormat = cmdutil.GetFlagString(cmd, "output") | ||||||
|  |  | ||||||
| 	if c.DryRun { | 	if o.DryRun { | ||||||
| 		c.PrintFlags.Complete("%s (dry run)") | 		o.PrintFlags.Complete("%s (dry run)") | ||||||
| 	} | 	} | ||||||
| 	printer, err := c.PrintFlags.ToPrinter() | 	printer, err := o.PrintFlags.ToPrinter() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	c.PrintObj = func(obj runtime.Object) error { | 	o.PrintObj = func(obj runtime.Object) error { | ||||||
| 		return printer.PrintObj(obj, c.Out) | 		return printer.PrintObj(obj, o.Out) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *CreateJobOptions) RunCreateJob() error { | func (o *CreateJobOptions) RunCreateJob() error { | ||||||
| 	infos, err := c.Builder. | 	infos, err := o.Builder. | ||||||
| 		Unstructured(). | 		Unstructured(). | ||||||
| 		NamespaceParam(c.Namespace).DefaultNamespace(). | 		NamespaceParam(o.Namespace).DefaultNamespace(). | ||||||
| 		ResourceTypeOrNameArgs(false, c.From). | 		ResourceTypeOrNameArgs(false, o.From). | ||||||
| 		Flatten(). | 		Flatten(). | ||||||
| 		Latest(). | 		Latest(). | ||||||
| 		Do(). | 		Do(). | ||||||
| @@ -143,10 +149,10 @@ func (c *CreateJobOptions) RunCreateJob() error { | |||||||
| 		return fmt.Errorf("from must be an existing cronjob") | 		return fmt.Errorf("from must be an existing cronjob") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return c.createJob(cronJob) | 	return o.createJob(cronJob) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *CreateJobOptions) createJob(cronJob *batchv1beta1.CronJob) error { | func (o *CreateJobOptions) createJob(cronJob *batchv1beta1.CronJob) error { | ||||||
| 	annotations := make(map[string]string) | 	annotations := make(map[string]string) | ||||||
| 	annotations["cronjob.kubernetes.io/instantiate"] = "manual" | 	annotations["cronjob.kubernetes.io/instantiate"] = "manual" | ||||||
| 	for k, v := range cronJob.Spec.JobTemplate.Annotations { | 	for k, v := range cronJob.Spec.JobTemplate.Annotations { | ||||||
| @@ -154,21 +160,21 @@ func (c *CreateJobOptions) createJob(cronJob *batchv1beta1.CronJob) error { | |||||||
| 	} | 	} | ||||||
| 	job := &batchv1.Job{ | 	job := &batchv1.Job{ | ||||||
| 		ObjectMeta: metav1.ObjectMeta{ | 		ObjectMeta: metav1.ObjectMeta{ | ||||||
| 			Name:        c.Name, | 			Name:        o.Name, | ||||||
| 			Namespace:   c.Namespace, | 			Namespace:   o.Namespace, | ||||||
| 			Annotations: annotations, | 			Annotations: annotations, | ||||||
| 			Labels:      cronJob.Spec.JobTemplate.Labels, | 			Labels:      cronJob.Spec.JobTemplate.Labels, | ||||||
| 		}, | 		}, | ||||||
| 		Spec: cronJob.Spec.JobTemplate.Spec, | 		Spec: cronJob.Spec.JobTemplate.Spec, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if !c.DryRun { | 	if !o.DryRun { | ||||||
| 		var err error | 		var err error | ||||||
| 		job, err = c.Client.Jobs(c.Namespace).Create(job) | 		job, err = o.Client.Jobs(o.Namespace).Create(job) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return fmt.Errorf("failed to create job: %v", err) | 			return fmt.Errorf("failed to create job: %v", err) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return c.PrintObj(job) | 	return o.PrintObj(job) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	batchv1 "k8s.io/api/batch/v1" | 	batchv1 "k8s.io/api/batch/v1" | ||||||
| @@ -28,6 +27,7 @@ import ( | |||||||
| 	fake "k8s.io/client-go/kubernetes/fake" | 	fake "k8s.io/client-go/kubernetes/fake" | ||||||
| 	clienttesting "k8s.io/client-go/testing" | 	clienttesting "k8s.io/client-go/testing" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestCreateJobFromCronJob(t *testing.T) { | func TestCreateJobFromCronJob(t *testing.T) { | ||||||
| @@ -86,14 +86,13 @@ func TestCreateJobFromCronJob(t *testing.T) { | |||||||
|  |  | ||||||
| 	printFlags := NewPrintFlags("created") | 	printFlags := NewPrintFlags("created") | ||||||
|  |  | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmdOptions := &CreateJobOptions{ | 	cmdOptions := &CreateJobOptions{ | ||||||
| 		PrintFlags: printFlags, | 		PrintFlags: printFlags, | ||||||
| 		Name:       testJobName, | 		Name:       testJobName, | ||||||
| 		Namespace:  testNamespaceName, | 		Namespace:  testNamespaceName, | ||||||
| 		Client:     clientset.BatchV1(), | 		Client:     clientset.BatchV1(), | ||||||
| 		Out:        buf, | 		Cmd:        NewCmdCreateJob(f, ioStreams), | ||||||
| 		Cmd:        NewCmdCreateJob(f, buf), |  | ||||||
| 		PrintObj: func(obj runtime.Object) error { | 		PrintObj: func(obj runtime.Object) error { | ||||||
| 			p, err := printFlags.ToPrinter() | 			p, err := printFlags.ToPrinter() | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| @@ -102,6 +101,7 @@ func TestCreateJobFromCronJob(t *testing.T) { | |||||||
|  |  | ||||||
| 			return p.PrintObj(obj, buf) | 			return p.PrintObj(obj, buf) | ||||||
| 		}, | 		}, | ||||||
|  | 		IOStreams: ioStreams, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := cmdOptions.createJob(cronJob) | 	err := cmdOptions.createJob(cronJob) | ||||||
|   | |||||||
| @@ -17,13 +17,12 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -41,12 +40,9 @@ type NamespaceOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateNamespace is a macro command to create a new namespace | // NewCmdCreateNamespace is a macro command to create a new namespace | ||||||
| func NewCmdCreateNamespace(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateNamespace(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &NamespaceOpts{ | 	options := &NamespaceOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| @@ -26,6 +25,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -51,8 +51,8 @@ func TestCreateNamespace(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdCreateNamespace(tf, buf) | 	cmd := NewCmdCreateNamespace(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Run(cmd, []string{namespaceObject.Name}) | 	cmd.Run(cmd, []string{namespaceObject.Name}) | ||||||
| 	expectedOutput := "namespace/" + namespaceObject.Name + "\n" | 	expectedOutput := "namespace/" + namespaceObject.Name + "\n" | ||||||
|   | |||||||
| @@ -17,13 +17,12 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -46,12 +45,9 @@ type PodDisruptionBudgetOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreatePodDisruptionBudget is a macro command to create a new pod disruption budget. | // NewCmdCreatePodDisruptionBudget is a macro command to create a new pod disruption budget. | ||||||
| func NewCmdCreatePodDisruptionBudget(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreatePodDisruptionBudget(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &PodDisruptionBudgetOpts{ | 	options := &PodDisruptionBudgetOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -27,6 +27,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestCreatePdb(t *testing.T) { | func TestCreatePdb(t *testing.T) { | ||||||
| @@ -48,11 +49,11 @@ func TestCreatePdb(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| 	tf.ClientConfigVal = &restclient.Config{} | 	tf.ClientConfigVal = &restclient.Config{} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	outputFormat := "name" | 	outputFormat := "name" | ||||||
|  |  | ||||||
| 	cmd := NewCmdCreatePodDisruptionBudget(tf, buf) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 	cmd := NewCmdCreatePodDisruptionBudget(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("min-available", "1") | 	cmd.Flags().Set("min-available", "1") | ||||||
| 	cmd.Flags().Set("selector", "app=rails") | 	cmd.Flags().Set("selector", "app=rails") | ||||||
| 	cmd.Flags().Set("dry-run", "true") | 	cmd.Flags().Set("dry-run", "true") | ||||||
| @@ -64,8 +65,8 @@ func TestCreatePdb(t *testing.T) { | |||||||
| 	options := &PodDisruptionBudgetOpts{ | 	options := &PodDisruptionBudgetOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: &CreateSubcommandOptions{ | ||||||
| 			PrintFlags: printFlags, | 			PrintFlags: printFlags, | ||||||
| 			CmdOut:     buf, |  | ||||||
| 			Name:       pdbName, | 			Name:       pdbName, | ||||||
|  | 			IOStreams:  ioStreams, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	err := options.Complete(cmd, []string{pdbName}) | 	err := options.Complete(cmd, []string{pdbName}) | ||||||
|   | |||||||
| @@ -17,13 +17,12 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -44,12 +43,9 @@ type PriorityClassOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreatePriorityClass is a macro command to create a new priorityClass. | // NewCmdCreatePriorityClass is a macro command to create a new priorityClass. | ||||||
| func NewCmdCreatePriorityClass(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreatePriorityClass(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &PriorityClassOpts{ | 	options := &PriorityClassOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -27,6 +27,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestCreatePriorityClass(t *testing.T) { | func TestCreatePriorityClass(t *testing.T) { | ||||||
| @@ -47,11 +48,11 @@ func TestCreatePriorityClass(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.ClientConfigVal = &restclient.Config{} | 	tf.ClientConfigVal = &restclient.Config{} | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	outputFormat := "name" | 	outputFormat := "name" | ||||||
|  |  | ||||||
| 	cmd := NewCmdCreatePriorityClass(tf, buf) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 	cmd := NewCmdCreatePriorityClass(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("value", "1000") | 	cmd.Flags().Set("value", "1000") | ||||||
| 	cmd.Flags().Set("global-default", "true") | 	cmd.Flags().Set("global-default", "true") | ||||||
| 	cmd.Flags().Set("description", "my priority") | 	cmd.Flags().Set("description", "my priority") | ||||||
| @@ -64,8 +65,8 @@ func TestCreatePriorityClass(t *testing.T) { | |||||||
| 	options := &PriorityClassOpts{ | 	options := &PriorityClassOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: &CreateSubcommandOptions{ | ||||||
| 			PrintFlags: printFlags, | 			PrintFlags: printFlags, | ||||||
| 			CmdOut:     buf, |  | ||||||
| 			Name:       pcName, | 			Name:       pcName, | ||||||
|  | 			IOStreams:  ioStreams, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	err := options.Complete(cmd, []string{pcName}) | 	err := options.Complete(cmd, []string{pcName}) | ||||||
|   | |||||||
| @@ -17,13 +17,12 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -44,12 +43,9 @@ type QuotaOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateQuota is a macro command to create a new quota | // NewCmdCreateQuota is a macro command to create a new quota | ||||||
| func NewCmdCreateQuota(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateQuota(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &QuotaOpts{ | 	options := &QuotaOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| @@ -26,6 +25,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -75,8 +75,8 @@ func TestCreateQuota(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	for name, test := range tests { | 	for name, test := range tests { | ||||||
| 		buf := bytes.NewBuffer([]byte{}) | 		ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 		cmd := NewCmdCreateQuota(tf, buf) | 		cmd := NewCmdCreateQuota(tf, ioStreams) | ||||||
| 		cmd.Flags().Parse(test.flags) | 		cmd.Flags().Parse(test.flags) | ||||||
| 		cmd.Flags().Set("output", "name") | 		cmd.Flags().Set("output", "name") | ||||||
| 		cmd.Run(cmd, []string{resourceQuotaObject.Name}) | 		cmd.Run(cmd, []string{resourceQuotaObject.Name}) | ||||||
|   | |||||||
| @@ -18,7 +18,6 @@ package create | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" |  | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
| @@ -31,6 +30,7 @@ import ( | |||||||
| 	clientgorbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" | 	clientgorbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -112,17 +112,23 @@ type CreateRoleOptions struct { | |||||||
| 	Namespace    string | 	Namespace    string | ||||||
| 	Client       clientgorbacv1.RbacV1Interface | 	Client       clientgorbacv1.RbacV1Interface | ||||||
| 	Mapper       meta.RESTMapper | 	Mapper       meta.RESTMapper | ||||||
| 	Out          io.Writer |  | ||||||
| 	PrintObj     func(obj runtime.Object) error | 	PrintObj     func(obj runtime.Object) error | ||||||
|  |  | ||||||
|  | 	genericclioptions.IOStreams | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewCreateRoleOptions(ioStreams genericclioptions.IOStreams) *CreateRoleOptions { | ||||||
|  | 	return &CreateRoleOptions{ | ||||||
|  | 		PrintFlags: NewPrintFlags("created"), | ||||||
|  |  | ||||||
|  | 		IOStreams: ioStreams, | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Role is a command to ease creating Roles. | // Role is a command to ease creating Roles. | ||||||
| func NewCmdCreateRole(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateRole(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	c := &CreateRoleOptions{ | 	o := NewCreateRoleOptions(ioStreams) | ||||||
| 		PrintFlags: NewPrintFlags("created"), |  | ||||||
|  |  | ||||||
| 		Out: cmdOut, |  | ||||||
| 	} |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use: "role NAME --verb=verb --resource=resource.group/subresource [--resource-name=resourcename] [--dry-run]", | 		Use: "role NAME --verb=verb --resource=resource.group/subresource [--resource-name=resourcename] [--dry-run]", | ||||||
| 		DisableFlagsInUseLine: true, | 		DisableFlagsInUseLine: true, | ||||||
| @@ -130,34 +136,34 @@ func NewCmdCreateRole(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | |||||||
| 		Long:    roleLong, | 		Long:    roleLong, | ||||||
| 		Example: roleExample, | 		Example: roleExample, | ||||||
| 		Run: func(cmd *cobra.Command, args []string) { | 		Run: func(cmd *cobra.Command, args []string) { | ||||||
| 			cmdutil.CheckErr(c.Complete(f, cmd, args)) | 			cmdutil.CheckErr(o.Complete(f, cmd, args)) | ||||||
| 			cmdutil.CheckErr(c.Validate()) | 			cmdutil.CheckErr(o.Validate()) | ||||||
| 			cmdutil.CheckErr(c.RunCreateRole()) | 			cmdutil.CheckErr(o.RunCreateRole()) | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	c.PrintFlags.AddFlags(cmd) | 	o.PrintFlags.AddFlags(cmd) | ||||||
|  |  | ||||||
| 	cmdutil.AddApplyAnnotationFlags(cmd) | 	cmdutil.AddApplyAnnotationFlags(cmd) | ||||||
| 	cmdutil.AddValidateFlags(cmd) | 	cmdutil.AddValidateFlags(cmd) | ||||||
| 	cmdutil.AddDryRunFlag(cmd) | 	cmdutil.AddDryRunFlag(cmd) | ||||||
| 	cmd.Flags().StringSliceVar(&c.Verbs, "verb", c.Verbs, "Verb that applies to the resources contained in the rule") | 	cmd.Flags().StringSliceVar(&o.Verbs, "verb", o.Verbs, "Verb that applies to the resources contained in the rule") | ||||||
| 	cmd.Flags().StringSlice("resource", []string{}, "Resource that the rule applies to") | 	cmd.Flags().StringSlice("resource", []string{}, "Resource that the rule applies to") | ||||||
| 	cmd.Flags().StringArrayVar(&c.ResourceNames, "resource-name", c.ResourceNames, "Resource in the white list that the rule applies to, repeat this flag for multiple items") | 	cmd.Flags().StringArrayVar(&o.ResourceNames, "resource-name", o.ResourceNames, "Resource in the white list that the rule applies to, repeat this flag for multiple items") | ||||||
|  |  | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string) error { | func (o *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string) error { | ||||||
| 	name, err := NameFromCommandArgs(cmd, args) | 	name, err := NameFromCommandArgs(cmd, args) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	c.Name = name | 	o.Name = name | ||||||
|  |  | ||||||
| 	// Remove duplicate verbs. | 	// Remove duplicate verbs. | ||||||
| 	verbs := []string{} | 	verbs := []string{} | ||||||
| 	for _, v := range c.Verbs { | 	for _, v := range o.Verbs { | ||||||
| 		// VerbAll respresents all kinds of verbs. | 		// VerbAll respresents all kinds of verbs. | ||||||
| 		if v == "*" { | 		if v == "*" { | ||||||
| 			verbs = []string{"*"} | 			verbs = []string{"*"} | ||||||
| @@ -167,7 +173,7 @@ func (c *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args | |||||||
| 			verbs = append(verbs, v) | 			verbs = append(verbs, v) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	c.Verbs = verbs | 	o.Verbs = verbs | ||||||
|  |  | ||||||
| 	// Support resource.group pattern. If no API Group specified, use "" as core API Group. | 	// Support resource.group pattern. If no API Group specified, use "" as core API Group. | ||||||
| 	// e.g. --resource=pods,deployments.extensions | 	// e.g. --resource=pods,deployments.extensions | ||||||
| @@ -186,36 +192,36 @@ func (c *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args | |||||||
| 		} | 		} | ||||||
| 		resource.Resource = parts[0] | 		resource.Resource = parts[0] | ||||||
|  |  | ||||||
| 		c.Resources = append(c.Resources, *resource) | 		o.Resources = append(o.Resources, *resource) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Remove duplicate resource names. | 	// Remove duplicate resource names. | ||||||
| 	resourceNames := []string{} | 	resourceNames := []string{} | ||||||
| 	for _, n := range c.ResourceNames { | 	for _, n := range o.ResourceNames { | ||||||
| 		if !arrayContains(resourceNames, n) { | 		if !arrayContains(resourceNames, n) { | ||||||
| 			resourceNames = append(resourceNames, n) | 			resourceNames = append(resourceNames, n) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	c.ResourceNames = resourceNames | 	o.ResourceNames = resourceNames | ||||||
|  |  | ||||||
| 	// Complete other options for Run. | 	// Complete other options for Run. | ||||||
| 	c.Mapper, _ = f.Object() | 	o.Mapper, _ = f.Object() | ||||||
|  |  | ||||||
| 	c.DryRun = cmdutil.GetDryRunFlag(cmd) | 	o.DryRun = cmdutil.GetDryRunFlag(cmd) | ||||||
| 	c.OutputFormat = cmdutil.GetFlagString(cmd, "output") | 	o.OutputFormat = cmdutil.GetFlagString(cmd, "output") | ||||||
|  |  | ||||||
| 	if c.DryRun { | 	if o.DryRun { | ||||||
| 		c.PrintFlags.Complete("%s (dry run)") | 		o.PrintFlags.Complete("%s (dry run)") | ||||||
| 	} | 	} | ||||||
| 	printer, err := c.PrintFlags.ToPrinter() | 	printer, err := o.PrintFlags.ToPrinter() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	c.PrintObj = func(obj runtime.Object) error { | 	o.PrintObj = func(obj runtime.Object) error { | ||||||
| 		return printer.PrintObj(obj, c.Out) | 		return printer.PrintObj(obj, o.Out) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	c.Namespace, _, err = f.DefaultNamespace() | 	o.Namespace, _, err = f.DefaultNamespace() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| @@ -224,48 +230,48 @@ func (c *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	c.Client = clientset.RbacV1() | 	o.Client = clientset.RbacV1() | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *CreateRoleOptions) Validate() error { | func (o *CreateRoleOptions) Validate() error { | ||||||
| 	if c.Name == "" { | 	if o.Name == "" { | ||||||
| 		return fmt.Errorf("name must be specified") | 		return fmt.Errorf("name must be specified") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// validate verbs. | 	// validate verbs. | ||||||
| 	if len(c.Verbs) == 0 { | 	if len(o.Verbs) == 0 { | ||||||
| 		return fmt.Errorf("at least one verb must be specified") | 		return fmt.Errorf("at least one verb must be specified") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for _, v := range c.Verbs { | 	for _, v := range o.Verbs { | ||||||
| 		if !arrayContains(validResourceVerbs, v) { | 		if !arrayContains(validResourceVerbs, v) { | ||||||
| 			return fmt.Errorf("invalid verb: '%s'", v) | 			return fmt.Errorf("invalid verb: '%s'", v) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// validate resources. | 	// validate resources. | ||||||
| 	if len(c.Resources) == 0 { | 	if len(o.Resources) == 0 { | ||||||
| 		return fmt.Errorf("at least one resource must be specified") | 		return fmt.Errorf("at least one resource must be specified") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return c.validateResource() | 	return o.validateResource() | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *CreateRoleOptions) validateResource() error { | func (o *CreateRoleOptions) validateResource() error { | ||||||
| 	for _, r := range c.Resources { | 	for _, r := range o.Resources { | ||||||
| 		if len(r.Resource) == 0 { | 		if len(r.Resource) == 0 { | ||||||
| 			return fmt.Errorf("resource must be specified if apiGroup/subresource specified") | 			return fmt.Errorf("resource must be specified if apiGroup/subresource specified") | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		resource := schema.GroupVersionResource{Resource: r.Resource, Group: r.Group} | 		resource := schema.GroupVersionResource{Resource: r.Resource, Group: r.Group} | ||||||
| 		groupVersionResource, err := c.Mapper.ResourceFor(schema.GroupVersionResource{Resource: r.Resource, Group: r.Group}) | 		groupVersionResource, err := o.Mapper.ResourceFor(schema.GroupVersionResource{Resource: r.Resource, Group: r.Group}) | ||||||
| 		if err == nil { | 		if err == nil { | ||||||
| 			resource = groupVersionResource | 			resource = groupVersionResource | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		for _, v := range c.Verbs { | 		for _, v := range o.Verbs { | ||||||
| 			if groupResources, ok := specialVerbs[v]; ok { | 			if groupResources, ok := specialVerbs[v]; ok { | ||||||
| 				match := false | 				match := false | ||||||
| 				for _, extra := range groupResources { | 				for _, extra := range groupResources { | ||||||
| @@ -288,24 +294,24 @@ func (c *CreateRoleOptions) validateResource() error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *CreateRoleOptions) RunCreateRole() error { | func (o *CreateRoleOptions) RunCreateRole() error { | ||||||
| 	role := &rbacv1.Role{} | 	role := &rbacv1.Role{} | ||||||
| 	role.Name = c.Name | 	role.Name = o.Name | ||||||
| 	rules, err := generateResourcePolicyRules(c.Mapper, c.Verbs, c.Resources, c.ResourceNames, []string{}) | 	rules, err := generateResourcePolicyRules(o.Mapper, o.Verbs, o.Resources, o.ResourceNames, []string{}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	role.Rules = rules | 	role.Rules = rules | ||||||
|  |  | ||||||
| 	// Create role. | 	// Create role. | ||||||
| 	if !c.DryRun { | 	if !o.DryRun { | ||||||
| 		role, err = c.Client.Roles(c.Namespace).Create(role) | 		role, err = o.Client.Roles(o.Namespace).Create(role) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return c.PrintObj(role) | 	return o.PrintObj(role) | ||||||
| } | } | ||||||
|  |  | ||||||
| func arrayContains(s []string, e string) bool { | func arrayContains(s []string, e string) bool { | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| @@ -29,6 +28,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestCreateRole(t *testing.T) { | func TestCreateRole(t *testing.T) { | ||||||
| @@ -129,8 +129,8 @@ func TestCreateRole(t *testing.T) { | |||||||
|  |  | ||||||
| 	for name, test := range tests { | 	for name, test := range tests { | ||||||
| 		t.Run(name, func(t *testing.T) { | 		t.Run(name, func(t *testing.T) { | ||||||
| 			buf := bytes.NewBuffer([]byte{}) | 			ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 			cmd := NewCmdCreateRole(tf, buf) | 			cmd := NewCmdCreateRole(tf, ioStreams) | ||||||
| 			cmd.Flags().Set("dry-run", "true") | 			cmd.Flags().Set("dry-run", "true") | ||||||
| 			cmd.Flags().Set("output", "yaml") | 			cmd.Flags().Set("output", "yaml") | ||||||
| 			cmd.Flags().Set("verb", test.verbs) | 			cmd.Flags().Set("verb", test.verbs) | ||||||
| @@ -360,8 +360,7 @@ func TestComplete(t *testing.T) { | |||||||
| 	tf.Client = &fake.RESTClient{} | 	tf.Client = &fake.RESTClient{} | ||||||
| 	tf.ClientConfigVal = defaultClientConfig() | 	tf.ClientConfigVal = defaultClientConfig() | ||||||
|  |  | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	cmd := NewCmdCreateRole(tf, genericclioptions.NewTestIOStreamsDiscard()) | ||||||
| 	cmd := NewCmdCreateRole(tf, buf) |  | ||||||
| 	cmd.Flags().Set("resource", "pods,deployments.extensions") | 	cmd.Flags().Set("resource", "pods,deployments.extensions") | ||||||
|  |  | ||||||
| 	tests := map[string]struct { | 	tests := map[string]struct { | ||||||
|   | |||||||
| @@ -17,13 +17,12 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -41,12 +40,9 @@ type RoleBindingOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // RoleBinding is a command to ease creating RoleBindings. | // RoleBinding is a command to ease creating RoleBindings. | ||||||
| func NewCmdCreateRoleBinding(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateRoleBinding(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &RoleBindingOpts{ | 	options := &RoleBindingOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var groupVersion = schema.GroupVersion{Group: "rbac.authorization.k8s.io", Version: "v1"} | var groupVersion = schema.GroupVersion{Group: "rbac.authorization.k8s.io", Version: "v1"} | ||||||
| @@ -112,8 +113,7 @@ func TestCreateRoleBinding(t *testing.T) { | |||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	cmd := NewCmdCreateRoleBinding(tf, genericclioptions.NewTestIOStreamsDiscard()) | ||||||
| 	cmd := NewCmdCreateRoleBinding(tf, buf) |  | ||||||
| 	cmd.Flags().Set("role", "fake-role") | 	cmd.Flags().Set("role", "fake-role") | ||||||
| 	cmd.Flags().Set("user", "fake-user") | 	cmd.Flags().Set("user", "fake-user") | ||||||
| 	cmd.Flags().Set("group", "fake-group") | 	cmd.Flags().Set("group", "fake-group") | ||||||
|   | |||||||
| @@ -17,27 +17,26 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // NewCmdCreateSecret groups subcommands to create various types of secrets | // NewCmdCreateSecret groups subcommands to create various types of secrets | ||||||
| func NewCmdCreateSecret(f cmdutil.Factory, cmdOut, errOut io.Writer) *cobra.Command { | func NewCmdCreateSecret(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use:   "secret", | 		Use:   "secret", | ||||||
| 		Short: i18n.T("Create a secret using specified subcommand"), | 		Short: i18n.T("Create a secret using specified subcommand"), | ||||||
| 		Long:  "Create a secret using specified subcommand.", | 		Long:  "Create a secret using specified subcommand.", | ||||||
| 		Run:   cmdutil.DefaultSubCommandRun(errOut), | 		Run:   cmdutil.DefaultSubCommandRun(ioStreams.ErrOut), | ||||||
| 	} | 	} | ||||||
| 	cmd.AddCommand(NewCmdCreateSecretDockerRegistry(f, cmdOut)) | 	cmd.AddCommand(NewCmdCreateSecretDockerRegistry(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateSecretTLS(f, cmdOut)) | 	cmd.AddCommand(NewCmdCreateSecretTLS(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateSecretGeneric(f, cmdOut)) | 	cmd.AddCommand(NewCmdCreateSecretGeneric(f, ioStreams)) | ||||||
|  |  | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
| @@ -78,12 +77,9 @@ type SecretGenericOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateSecretGeneric is a command to create generic secrets from files, directories, or literal values | // NewCmdCreateSecretGeneric is a command to create generic secrets from files, directories, or literal values | ||||||
| func NewCmdCreateSecretGeneric(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateSecretGeneric(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &SecretGenericOpts{ | 	options := &SecretGenericOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| @@ -166,12 +162,9 @@ type SecretDockerRegistryOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateSecretDockerRegistry is a macro command for creating secrets to work with Docker registries | // NewCmdCreateSecretDockerRegistry is a macro command for creating secrets to work with Docker registries | ||||||
| func NewCmdCreateSecretDockerRegistry(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateSecretDockerRegistry(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &SecretDockerRegistryOpts{ | 	options := &SecretDockerRegistryOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| @@ -260,12 +253,9 @@ type SecretTLSOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateSecretTLS is a macro command for creating secrets to work with Docker registries | // NewCmdCreateSecretTLS is a macro command for creating secrets to work with Docker registries | ||||||
| func NewCmdCreateSecretTLS(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateSecretTLS(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &SecretTLSOpts{ | 	options := &SecretTLSOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| @@ -26,6 +25,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -57,8 +57,8 @@ func TestCreateSecretGeneric(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdCreateSecretGeneric(tf, buf) | 	cmd := NewCmdCreateSecretGeneric(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Flags().Set("from-literal", "password=includes,comma") | 	cmd.Flags().Set("from-literal", "password=includes,comma") | ||||||
| 	cmd.Flags().Set("from-literal", "username=test_user") | 	cmd.Flags().Set("from-literal", "username=test_user") | ||||||
| @@ -90,8 +90,8 @@ func TestCreateSecretDockerRegistry(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdCreateSecretDockerRegistry(tf, buf) | 	cmd := NewCmdCreateSecretDockerRegistry(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("docker-username", "test-user") | 	cmd.Flags().Set("docker-username", "test-user") | ||||||
| 	cmd.Flags().Set("docker-password", "test-pass") | 	cmd.Flags().Set("docker-password", "test-pass") | ||||||
| 	cmd.Flags().Set("docker-email", "test-email") | 	cmd.Flags().Set("docker-email", "test-email") | ||||||
|   | |||||||
| @@ -17,30 +17,29 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/api/core/v1" | 	"k8s.io/api/core/v1" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // NewCmdCreateService is a macro command to create a new service | // NewCmdCreateService is a macro command to create a new service | ||||||
| func NewCmdCreateService(f cmdutil.Factory, cmdOut, errOut io.Writer) *cobra.Command { | func NewCmdCreateService(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use:     "service", | 		Use:     "service", | ||||||
| 		Aliases: []string{"svc"}, | 		Aliases: []string{"svc"}, | ||||||
| 		Short:   i18n.T("Create a service using specified subcommand."), | 		Short:   i18n.T("Create a service using specified subcommand."), | ||||||
| 		Long:    "Create a service using specified subcommand.", | 		Long:    "Create a service using specified subcommand.", | ||||||
| 		Run:     cmdutil.DefaultSubCommandRun(errOut), | 		Run:     cmdutil.DefaultSubCommandRun(ioStreams.ErrOut), | ||||||
| 	} | 	} | ||||||
| 	cmd.AddCommand(NewCmdCreateServiceClusterIP(f, cmdOut)) | 	cmd.AddCommand(NewCmdCreateServiceClusterIP(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateServiceNodePort(f, cmdOut)) | 	cmd.AddCommand(NewCmdCreateServiceNodePort(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateServiceLoadBalancer(f, cmdOut)) | 	cmd.AddCommand(NewCmdCreateServiceLoadBalancer(f, ioStreams)) | ||||||
| 	cmd.AddCommand(NewCmdCreateServiceExternalName(f, cmdOut)) | 	cmd.AddCommand(NewCmdCreateServiceExternalName(f, ioStreams)) | ||||||
|  |  | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
| @@ -66,12 +65,9 @@ type ServiceClusterIPOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateServiceClusterIP is a command to create a ClusterIP service | // NewCmdCreateServiceClusterIP is a command to create a ClusterIP service | ||||||
| func NewCmdCreateServiceClusterIP(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateServiceClusterIP(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &ServiceClusterIPOpts{ | 	options := &ServiceClusterIPOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| @@ -141,12 +137,9 @@ type ServiceNodePortOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateServiceNodePort is a macro command for creating a NodePort service | // NewCmdCreateServiceNodePort is a macro command for creating a NodePort service | ||||||
| func NewCmdCreateServiceNodePort(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateServiceNodePort(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &ServiceNodePortOpts{ | 	options := &ServiceNodePortOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| @@ -213,12 +206,9 @@ type ServiceLoadBalancerOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateServiceLoadBalancer is a macro command for creating a LoadBalancer service | // NewCmdCreateServiceLoadBalancer is a macro command for creating a LoadBalancer service | ||||||
| func NewCmdCreateServiceLoadBalancer(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateServiceLoadBalancer(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &ServiceLoadBalancerOpts{ | 	options := &ServiceLoadBalancerOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| @@ -287,12 +277,9 @@ type ServiceExternalNameOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateServiceExternalName is a macro command for creating an ExternalName service | // NewCmdCreateServiceExternalName is a macro command for creating an ExternalName service | ||||||
| func NewCmdCreateServiceExternalName(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateServiceExternalName(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &ServiceExternalNameOpts{ | 	options := &ServiceExternalNameOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| @@ -26,6 +25,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -52,8 +52,8 @@ func TestCreateService(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdCreateServiceClusterIP(tf, buf) | 	cmd := NewCmdCreateServiceClusterIP(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Flags().Set("tcp", "8080:8000") | 	cmd.Flags().Set("tcp", "8080:8000") | ||||||
| 	cmd.Run(cmd, []string{service.Name}) | 	cmd.Run(cmd, []string{service.Name}) | ||||||
| @@ -86,8 +86,8 @@ func TestCreateServiceNodePort(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdCreateServiceNodePort(tf, buf) | 	cmd := NewCmdCreateServiceNodePort(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Flags().Set("tcp", "30000:8000") | 	cmd.Flags().Set("tcp", "30000:8000") | ||||||
| 	cmd.Run(cmd, []string{service.Name}) | 	cmd.Run(cmd, []string{service.Name}) | ||||||
| @@ -120,8 +120,8 @@ func TestCreateServiceExternalName(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdCreateServiceExternalName(tf, buf) | 	cmd := NewCmdCreateServiceExternalName(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Flags().Set("external-name", "name") | 	cmd.Flags().Set("external-name", "name") | ||||||
| 	cmd.Run(cmd, []string{service.Name}) | 	cmd.Run(cmd, []string{service.Name}) | ||||||
|   | |||||||
| @@ -17,13 +17,12 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl" | 	"k8s.io/kubernetes/pkg/kubectl" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -41,12 +40,9 @@ type ServiceAccountOpts struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| // NewCmdCreateServiceAccount is a macro command to create a new service account | // NewCmdCreateServiceAccount is a macro command to create a new service account | ||||||
| func NewCmdCreateServiceAccount(f cmdutil.Factory, cmdOut io.Writer) *cobra.Command { | func NewCmdCreateServiceAccount(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	options := &ServiceAccountOpts{ | 	options := &ServiceAccountOpts{ | ||||||
| 		CreateSubcommandOptions: &CreateSubcommandOptions{ | 		CreateSubcommandOptions: NewCreateSubcommandOptions(ioStreams), | ||||||
| 			PrintFlags: NewPrintFlags("created"), |  | ||||||
| 			CmdOut:     cmdOut, |  | ||||||
| 		}, |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| @@ -26,6 +25,7 @@ import ( | |||||||
| 	"k8s.io/client-go/rest/fake" | 	"k8s.io/client-go/rest/fake" | ||||||
| 	"k8s.io/kubernetes/pkg/api/legacyscheme" | 	"k8s.io/kubernetes/pkg/api/legacyscheme" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -52,8 +52,8 @@ func TestCreateServiceAccount(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
| 	cmd := NewCmdCreateServiceAccount(tf, buf) | 	cmd := NewCmdCreateServiceAccount(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Run(cmd, []string{serviceAccountObject.Name}) | 	cmd.Run(cmd, []string{serviceAccountObject.Name}) | ||||||
| 	expectedOutput := "serviceaccount/" + serviceAccountObject.Name + "\n" | 	expectedOutput := "serviceaccount/" + serviceAccountObject.Name + "\n" | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ limitations under the License. | |||||||
| package create | package create | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"bytes" |  | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| @@ -30,18 +29,17 @@ import ( | |||||||
| 	api "k8s.io/kubernetes/pkg/apis/core" | 	api "k8s.io/kubernetes/pkg/apis/core" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/scheme" | 	"k8s.io/kubernetes/pkg/kubectl/scheme" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestExtraArgsFail(t *testing.T) { | func TestExtraArgsFail(t *testing.T) { | ||||||
| 	initTestErrorHandler(t) | 	initTestErrorHandler(t) | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 	errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	f := cmdtesting.NewTestFactory() | 	f := cmdtesting.NewTestFactory() | ||||||
| 	defer f.Cleanup() | 	defer f.Cleanup() | ||||||
|  |  | ||||||
| 	c := NewCmdCreate(f, buf, errBuf) | 	c := NewCmdCreate(f, genericclioptions.NewTestIOStreamsDiscard()) | ||||||
| 	options := CreateOptions{} | 	options := CreateOptions{} | ||||||
| 	if options.ValidateArgs(c, []string{"rc"}) == nil { | 	if options.ValidateArgs(c, []string{"rc"}) == nil { | ||||||
| 		t.Errorf("unexpected non-error") | 		t.Errorf("unexpected non-error") | ||||||
| @@ -72,10 +70,9 @@ func TestCreateObject(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 	errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	cmd := NewCmdCreate(tf, buf, errBuf) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 	cmd := NewCmdCreate(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("filename", "../../../../examples/guestbook/legacy/redis-master-controller.yaml") | 	cmd.Flags().Set("filename", "../../../../examples/guestbook/legacy/redis-master-controller.yaml") | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Run(cmd, []string{}) | 	cmd.Run(cmd, []string{}) | ||||||
| @@ -111,10 +108,9 @@ func TestCreateMultipleObject(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 	errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	cmd := NewCmdCreate(tf, buf, errBuf) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 	cmd := NewCmdCreate(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("filename", "../../../../examples/guestbook/legacy/redis-master-controller.yaml") | 	cmd.Flags().Set("filename", "../../../../examples/guestbook/legacy/redis-master-controller.yaml") | ||||||
| 	cmd.Flags().Set("filename", "../../../../examples/guestbook/frontend-service.yaml") | 	cmd.Flags().Set("filename", "../../../../examples/guestbook/frontend-service.yaml") | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| @@ -150,10 +146,9 @@ func TestCreateDirectory(t *testing.T) { | |||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| 	tf.Namespace = "test" | 	tf.Namespace = "test" | ||||||
| 	buf := bytes.NewBuffer([]byte{}) |  | ||||||
| 	errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 	cmd := NewCmdCreate(tf, buf, errBuf) | 	ioStreams, _, buf, _ := genericclioptions.NewTestIOStreams() | ||||||
|  | 	cmd := NewCmdCreate(tf, ioStreams) | ||||||
| 	cmd.Flags().Set("filename", "../../../../examples/guestbook/legacy") | 	cmd.Flags().Set("filename", "../../../../examples/guestbook/legacy") | ||||||
| 	cmd.Flags().Set("output", "name") | 	cmd.Flags().Set("output", "name") | ||||||
| 	cmd.Run(cmd, []string{}) | 	cmd.Run(cmd, []string{}) | ||||||
|   | |||||||
| @@ -18,7 +18,6 @@ package cmd | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" |  | ||||||
|  |  | ||||||
| 	"github.com/spf13/cobra" | 	"github.com/spf13/cobra" | ||||||
|  |  | ||||||
| @@ -26,6 +25,7 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/templates" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/util/editor" | ||||||
|  | 	"k8s.io/kubernetes/pkg/kubectl/genericclioptions" | ||||||
| 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | 	"k8s.io/kubernetes/pkg/kubectl/util/i18n" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -68,8 +68,8 @@ var ( | |||||||
| 		kubectl edit deployment/mydeployment -o yaml --save-config`)) | 		kubectl edit deployment/mydeployment -o yaml --save-config`)) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func NewCmdEdit(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { | func NewCmdEdit(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { | ||||||
| 	o := editor.NewEditOptions(editor.NormalEditMode, out, errOut) | 	o := editor.NewEditOptions(editor.NormalEditMode, ioStreams) | ||||||
| 	o.ValidateOptions = cmdutil.ValidateOptions{EnableValidation: true} | 	o.ValidateOptions = cmdutil.ValidateOptions{EnableValidation: true} | ||||||
|  |  | ||||||
| 	validArgs := cmdutil.ValidArgList(f) | 	validArgs := cmdutil.ValidArgList(f) | ||||||
|   | |||||||
| @@ -39,6 +39,7 @@ import ( | |||||||
| 	"k8s.io/kubernetes/pkg/kubectl/cmd/create" | 	"k8s.io/kubernetes/pkg/kubectl/cmd/create" | ||||||
| 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | 	cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" | ||||||
| 	cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" | 	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/resource" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -229,18 +230,17 @@ func TestEdit(t *testing.T) { | |||||||
| 			} | 			} | ||||||
| 			tf.ClientConfigVal = defaultClientConfig() | 			tf.ClientConfigVal = defaultClientConfig() | ||||||
| 			tf.CommandVal = "edit test cmd invocation" | 			tf.CommandVal = "edit test cmd invocation" | ||||||
| 			buf := bytes.NewBuffer([]byte{}) | 			ioStreams, _, buf, errBuf := genericclioptions.NewTestIOStreams() | ||||||
| 			errBuf := bytes.NewBuffer([]byte{}) |  | ||||||
|  |  | ||||||
| 			var cmd *cobra.Command | 			var cmd *cobra.Command | ||||||
| 			switch testcase.Mode { | 			switch testcase.Mode { | ||||||
| 			case "edit": | 			case "edit": | ||||||
| 				cmd = NewCmdEdit(tf, buf, errBuf) | 				cmd = NewCmdEdit(tf, ioStreams) | ||||||
| 			case "create": | 			case "create": | ||||||
| 				cmd = create.NewCmdCreate(tf, buf, errBuf) | 				cmd = create.NewCmdCreate(tf, ioStreams) | ||||||
| 				cmd.Flags().Set("edit", "true") | 				cmd.Flags().Set("edit", "true") | ||||||
| 			case "edit-last-applied": | 			case "edit-last-applied": | ||||||
| 				cmd = NewCmdApplyEditLastApplied(tf, buf, errBuf) | 				cmd = NewCmdApplyEditLastApplied(tf, ioStreams) | ||||||
| 			default: | 			default: | ||||||
| 				t.Fatalf("%s: unexpected mode %s", name, testcase.Mode) | 				t.Fatalf("%s: unexpected mode %s", name, testcase.Mode) | ||||||
| 			} | 			} | ||||||
|   | |||||||
| @@ -72,8 +72,7 @@ type EditOptions struct { | |||||||
| 	ApplyAnnotation bool | 	ApplyAnnotation bool | ||||||
| 	ChangeCause     string | 	ChangeCause     string | ||||||
|  |  | ||||||
| 	Out    io.Writer | 	genericclioptions.IOStreams | ||||||
| 	ErrOut io.Writer |  | ||||||
|  |  | ||||||
| 	Recorder            genericclioptions.Recorder | 	Recorder            genericclioptions.Recorder | ||||||
| 	f                   cmdutil.Factory | 	f                   cmdutil.Factory | ||||||
| @@ -81,7 +80,7 @@ type EditOptions struct { | |||||||
| 	updatedResultGetter func(data []byte) *resource.Result | 	updatedResultGetter func(data []byte) *resource.Result | ||||||
| } | } | ||||||
|  |  | ||||||
| func NewEditOptions(editMode EditMode, out, errOut io.Writer) *EditOptions { | func NewEditOptions(editMode EditMode, ioStreams genericclioptions.IOStreams) *EditOptions { | ||||||
| 	return &EditOptions{ | 	return &EditOptions{ | ||||||
| 		RecordFlags: genericclioptions.NewRecordFlags(), | 		RecordFlags: genericclioptions.NewRecordFlags(), | ||||||
|  |  | ||||||
| @@ -92,8 +91,7 @@ func NewEditOptions(editMode EditMode, out, errOut io.Writer) *EditOptions { | |||||||
|  |  | ||||||
| 		Recorder: genericclioptions.NoopRecorder{}, | 		Recorder: genericclioptions.NoopRecorder{}, | ||||||
|  |  | ||||||
| 		Out:    out, | 		IOStreams: ioStreams, | ||||||
| 		ErrOut: errOut, |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ go_library( | |||||||
|     name = "go_default_library", |     name = "go_default_library", | ||||||
|     srcs = [ |     srcs = [ | ||||||
|         "doc.go", |         "doc.go", | ||||||
|  |         "io_options.go", | ||||||
|         "record_flags.go", |         "record_flags.go", | ||||||
|     ], |     ], | ||||||
|     importpath = "k8s.io/kubernetes/pkg/kubectl/genericclioptions", |     importpath = "k8s.io/kubernetes/pkg/kubectl/genericclioptions", | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								pkg/kubectl/genericclioptions/io_options.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								pkg/kubectl/genericclioptions/io_options.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | /* | ||||||
|  | Copyright 2018 The Kubernetes Authors. | ||||||
|  |  | ||||||
|  | Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | you may not use this file except in compliance with the License. | ||||||
|  | You may obtain a copy of the License at | ||||||
|  |  | ||||||
|  |     http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  | ||||||
|  | Unless required by applicable law or agreed to in writing, software | ||||||
|  | distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | See the License for the specific language governing permissions and | ||||||
|  | limitations under the License. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | package genericclioptions | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"io" | ||||||
|  | 	"io/ioutil" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // IOStreams provides the standard names for iostreams.  This is useful for embedding and for unit testing. | ||||||
|  | // Inconsistent and different names make it hard to read and review code | ||||||
|  | type IOStreams struct { | ||||||
|  | 	// In think, os.Stdin | ||||||
|  | 	In io.Reader | ||||||
|  | 	// Out think, os.Stdout | ||||||
|  | 	Out io.Writer | ||||||
|  | 	// ErrOut think, os.Stderr | ||||||
|  | 	ErrOut io.Writer | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewTestIOStreams returns a valid IOStreams and in, out, errout buffers for unit tests | ||||||
|  | func NewTestIOStreams() (IOStreams, *bytes.Buffer, *bytes.Buffer, *bytes.Buffer) { | ||||||
|  | 	in := &bytes.Buffer{} | ||||||
|  | 	out := &bytes.Buffer{} | ||||||
|  | 	errOut := &bytes.Buffer{} | ||||||
|  |  | ||||||
|  | 	return IOStreams{ | ||||||
|  | 		In:     in, | ||||||
|  | 		Out:    out, | ||||||
|  | 		ErrOut: errOut, | ||||||
|  | 	}, in, out, errOut | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewTestIOStreamsDiscard returns a valid IOStreams that just discards | ||||||
|  | func NewTestIOStreamsDiscard() IOStreams { | ||||||
|  | 	in := &bytes.Buffer{} | ||||||
|  | 	return IOStreams{ | ||||||
|  | 		In:     in, | ||||||
|  | 		Out:    ioutil.Discard, | ||||||
|  | 		ErrOut: ioutil.Discard, | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Kubernetes Submit Queue
					Kubernetes Submit Queue