Unverified Commit d2b2c330 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #63244 from soltysh/finish_printflags

Automatic merge from submit-queue (batch tested with PRs 60890, 63244, 60741, 63254). 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>. Finish wiring PrintFlags **What this PR does / why we need it**: This is rebased version of #63055, I don't want to wait for @juanvallejo to return and to unblock myself, and him for next week. I've rebased his PR and will push it forward. /assign @deads2k since you "broke" us 😉 **Release note**: ```release-note NONE ```
parents bbcd21e0 f432ebe2
...@@ -273,9 +273,9 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob ...@@ -273,9 +273,9 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob
{ {
Message: "Deploy Commands:", Message: "Deploy Commands:",
Commands: []*cobra.Command{ Commands: []*cobra.Command{
rollout.NewCmdRollout(f, out, err), rollout.NewCmdRollout(f, ioStreams),
NewCmdRollingUpdate(f, out), NewCmdRollingUpdate(f, ioStreams),
NewCmdScale(f, out, err), NewCmdScale(f, ioStreams),
NewCmdAutoscale(f, ioStreams), NewCmdAutoscale(f, ioStreams),
}, },
}, },
...@@ -288,7 +288,7 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob ...@@ -288,7 +288,7 @@ func NewKubectlCommand(f cmdutil.Factory, in io.Reader, out, err io.Writer) *cob
NewCmdCordon(f, ioStreams), NewCmdCordon(f, ioStreams),
NewCmdUncordon(f, ioStreams), NewCmdUncordon(f, ioStreams),
NewCmdDrain(f, ioStreams), NewCmdDrain(f, ioStreams),
NewCmdTaint(f, out), NewCmdTaint(f, ioStreams),
}, },
}, },
{ {
......
...@@ -17,10 +17,10 @@ limitations under the License. ...@@ -17,10 +17,10 @@ limitations under the License.
package cmd package cmd
import ( import (
"bytes"
"testing" "testing"
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
) )
func TestValidateArgs(t *testing.T) { func TestValidateArgs(t *testing.T) {
...@@ -74,8 +74,7 @@ func TestValidateArgs(t *testing.T) { ...@@ -74,8 +74,7 @@ func TestValidateArgs(t *testing.T) {
}, },
} }
for _, test := range tests { for _, test := range tests {
out := &bytes.Buffer{} cmd := NewCmdRollingUpdate(f, genericclioptions.NewTestIOStreamsDiscard())
cmd := NewCmdRollingUpdate(f, out)
if test.flags != nil { if test.flags != nil {
for key, val := range test.flags { for key, val := range test.flags {
......
...@@ -24,8 +24,10 @@ go_library( ...@@ -24,8 +24,10 @@ go_library(
"//pkg/kubectl/cmd/set:go_default_library", "//pkg/kubectl/cmd/set:go_default_library",
"//pkg/kubectl/cmd/templates:go_default_library", "//pkg/kubectl/cmd/templates: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/resource:go_default_library", "//pkg/kubectl/resource:go_default_library",
"//pkg/kubectl/util/i18n:go_default_library", "//pkg/kubectl/util/i18n:go_default_library",
"//pkg/printers:go_default_library",
"//pkg/util/interrupt:go_default_library", "//pkg/util/interrupt:go_default_library",
"//vendor/github.com/renstrom/dedent:go_default_library", "//vendor/github.com/renstrom/dedent:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library",
...@@ -59,6 +61,7 @@ go_test( ...@@ -59,6 +61,7 @@ go_test(
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions:go_default_library",
"//pkg/kubectl/cmd/testing:go_default_library", "//pkg/kubectl/cmd/testing:go_default_library",
"//pkg/kubectl/genericclioptions:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
......
...@@ -17,12 +17,12 @@ limitations under the License. ...@@ -17,12 +17,12 @@ limitations under the License.
package rollout package rollout
import ( import (
"io"
"github.com/renstrom/dedent" "github.com/renstrom/dedent"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"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,22 +46,21 @@ var ( ...@@ -46,22 +46,21 @@ var (
`) `)
) )
func NewCmdRollout(f cmdutil.Factory, out, errOut io.Writer) *cobra.Command { func NewCmdRollout(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "rollout SUBCOMMAND", Use: "rollout SUBCOMMAND",
DisableFlagsInUseLine: true, DisableFlagsInUseLine: true,
Short: i18n.T("Manage the rollout of a resource"), Short: i18n.T("Manage the rollout of a resource"),
Long: rollout_long, Long: rollout_long,
Example: rollout_example, Example: rollout_example,
Run: cmdutil.DefaultSubCommandRun(errOut), Run: cmdutil.DefaultSubCommandRun(streams.Out),
} }
// subcommands // subcommands
cmd.AddCommand(NewCmdRolloutHistory(f, out)) cmd.AddCommand(NewCmdRolloutHistory(f, streams.Out))
cmd.AddCommand(NewCmdRolloutPause(f, out)) cmd.AddCommand(NewCmdRolloutPause(f, streams))
cmd.AddCommand(NewCmdRolloutResume(f, out)) cmd.AddCommand(NewCmdRolloutResume(f, streams))
cmd.AddCommand(NewCmdRolloutUndo(f, out)) cmd.AddCommand(NewCmdRolloutUndo(f, streams.Out))
cmd.AddCommand(NewCmdRolloutStatus(f, out)) cmd.AddCommand(NewCmdRolloutStatus(f, streams))
return cmd return cmd
} }
...@@ -18,7 +18,6 @@ package rollout ...@@ -18,7 +18,6 @@ package rollout
import ( import (
"fmt" "fmt"
"io"
"github.com/spf13/cobra" "github.com/spf13/cobra"
...@@ -30,20 +29,24 @@ import ( ...@@ -30,20 +29,24 @@ import (
"k8s.io/kubernetes/pkg/kubectl/cmd/set" "k8s.io/kubernetes/pkg/kubectl/cmd/set"
"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"
"k8s.io/kubernetes/pkg/printers"
) )
// PauseConfig is the start of the data required to perform the operation. As new fields are added, add them here instead of // PauseConfig 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 PauseConfig struct { type PauseConfig struct {
resource.FilenameOptions resource.FilenameOptions
PrintFlags *printers.PrintFlags
ToPrinter func(string) (printers.ResourcePrinterFunc, error)
Pauser func(info *resource.Info) ([]byte, error) Pauser func(info *resource.Info) ([]byte, error)
Mapper meta.RESTMapper Mapper meta.RESTMapper
Infos []*resource.Info Infos []*resource.Info
Out io.Writer genericclioptions.IOStreams
} }
var ( var (
...@@ -61,8 +64,11 @@ var ( ...@@ -61,8 +64,11 @@ var (
kubectl rollout pause deployment/nginx`) kubectl rollout pause deployment/nginx`)
) )
func NewCmdRolloutPause(f cmdutil.Factory, out io.Writer) *cobra.Command { func NewCmdRolloutPause(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
options := &PauseConfig{} o := &PauseConfig{
PrintFlags: printers.NewPrintFlags("paused"),
IOStreams: streams,
}
validArgs := []string{"deployment"} validArgs := []string{"deployment"}
argAliases := kubectl.ResourceAliases(validArgs) argAliases := kubectl.ResourceAliases(validArgs)
...@@ -75,11 +81,11 @@ func NewCmdRolloutPause(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -75,11 +81,11 @@ func NewCmdRolloutPause(f cmdutil.Factory, out io.Writer) *cobra.Command {
Example: pause_example, Example: pause_example,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
allErrs := []error{} allErrs := []error{}
err := options.CompletePause(f, cmd, out, args) err := o.CompletePause(f, cmd, args)
if err != nil { if err != nil {
allErrs = append(allErrs, err) allErrs = append(allErrs, err)
} }
err = options.RunPause() err = o.RunPause()
if err != nil { if err != nil {
allErrs = append(allErrs, err) allErrs = append(allErrs, err)
} }
...@@ -90,11 +96,11 @@ func NewCmdRolloutPause(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -90,11 +96,11 @@ func NewCmdRolloutPause(f cmdutil.Factory, out io.Writer) *cobra.Command {
} }
usage := "identifying the resource to get from a server." usage := "identifying the resource to get from a server."
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage) cmdutil.AddFilenameOptionFlags(cmd, &o.FilenameOptions, usage)
return cmd return cmd
} }
func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []string) error { func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, args []string) error {
if len(args) == 0 && cmdutil.IsFilenameSliceEmpty(o.Filenames) { if len(args) == 0 && cmdutil.IsFilenameSliceEmpty(o.Filenames) {
return cmdutil.UsageErrorf(cmd, "%s", cmd.Use) return cmdutil.UsageErrorf(cmd, "%s", cmd.Use)
} }
...@@ -102,7 +108,6 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i ...@@ -102,7 +108,6 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i
o.Mapper = f.RESTMapper() o.Mapper = f.RESTMapper()
o.Pauser = f.Pauser o.Pauser = f.Pauser
o.Out = out
cmdNamespace, enforceNamespace, err := f.DefaultNamespace() cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
if err != nil { if err != nil {
...@@ -123,6 +128,16 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i ...@@ -123,6 +128,16 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i
return err return err
} }
o.ToPrinter = func(operation string) (printers.ResourcePrinterFunc, error) {
o.PrintFlags.NamePrintFlags.Operation = operation
printer, err := o.PrintFlags.ToPrinter()
if err != nil {
return nil, err
}
return printer.PrintObj, nil
}
o.Infos, err = r.Infos() o.Infos, err = r.Infos()
if err != nil { if err != nil {
return err return err
...@@ -140,7 +155,12 @@ func (o PauseConfig) RunPause() error { ...@@ -140,7 +155,12 @@ func (o PauseConfig) RunPause() error {
} }
if string(patch.Patch) == "{}" || len(patch.Patch) == 0 { if string(patch.Patch) == "{}" || len(patch.Patch) == 0 {
cmdutil.PrintSuccess(false, o.Out, info.Object, false, "already paused") printer, err := o.ToPrinter("already paused")
if err != nil {
allErrs = append(allErrs, err)
continue
}
printer.PrintObj(info.AsVersioned(legacyscheme.Scheme), o.Out)
continue continue
} }
...@@ -151,7 +171,12 @@ func (o PauseConfig) RunPause() error { ...@@ -151,7 +171,12 @@ func (o PauseConfig) RunPause() error {
} }
info.Refresh(obj, true) info.Refresh(obj, true)
cmdutil.PrintSuccess(false, o.Out, info.Object, false, "paused") printer, err := o.ToPrinter("paused")
if err != nil {
allErrs = append(allErrs, err)
continue
}
printer.PrintObj(info.AsVersioned(legacyscheme.Scheme), o.Out)
} }
return utilerrors.NewAggregate(allErrs) return utilerrors.NewAggregate(allErrs)
......
...@@ -31,6 +31,7 @@ import ( ...@@ -31,6 +31,7 @@ import (
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
extensions "k8s.io/kubernetes/pkg/apis/extensions" extensions "k8s.io/kubernetes/pkg/apis/extensions"
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
"k8s.io/kubernetes/pkg/kubectl/genericclioptions"
) )
var rolloutPauseGroupVersionEncoder = schema.GroupVersion{Group: "extensions", Version: "v1beta1"} var rolloutPauseGroupVersionEncoder = schema.GroupVersion{Group: "extensions", Version: "v1beta1"}
...@@ -62,11 +63,11 @@ func TestRolloutPause(t *testing.T) { ...@@ -62,11 +63,11 @@ func TestRolloutPause(t *testing.T) {
} }
tf.Namespace = "test" tf.Namespace = "test"
buf := bytes.NewBuffer([]byte{}) streams, _, buf, _ := genericclioptions.NewTestIOStreams()
cmd := NewCmdRolloutPause(tf, buf) cmd := NewCmdRolloutPause(tf, streams)
cmd.Run(cmd, []string{deploymentName}) cmd.Run(cmd, []string{deploymentName})
expectedOutput := "deployment.apps \"" + deploymentName + "\" paused\n" expectedOutput := "deployment.extensions/" + deploymentName + " paused\n"
if buf.String() != expectedOutput { if buf.String() != expectedOutput {
t.Errorf("expected output: %s, but got: %s", expectedOutput, buf.String()) t.Errorf("expected output: %s, but got: %s", expectedOutput, buf.String())
} }
......
...@@ -18,7 +18,6 @@ package rollout ...@@ -18,7 +18,6 @@ package rollout
import ( import (
"fmt" "fmt"
"io"
"github.com/spf13/cobra" "github.com/spf13/cobra"
...@@ -30,20 +29,24 @@ import ( ...@@ -30,20 +29,24 @@ import (
"k8s.io/kubernetes/pkg/kubectl/cmd/set" "k8s.io/kubernetes/pkg/kubectl/cmd/set"
"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"
"k8s.io/kubernetes/pkg/printers"
) )
// ResumeConfig is the start of the data required to perform the operation. As new fields are added, add them here instead of // ResumeConfig 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 ResumeConfig struct { type ResumeConfig struct {
resource.FilenameOptions resource.FilenameOptions
PrintFlags *printers.PrintFlags
ToPrinter func(string) (printers.ResourcePrinterFunc, error)
Resumer func(object *resource.Info) ([]byte, error) Resumer func(object *resource.Info) ([]byte, error)
Mapper meta.RESTMapper Mapper meta.RESTMapper
Infos []*resource.Info Infos []*resource.Info
Out io.Writer genericclioptions.IOStreams
} }
var ( var (
...@@ -59,8 +62,11 @@ var ( ...@@ -59,8 +62,11 @@ var (
kubectl rollout resume deployment/nginx`) kubectl rollout resume deployment/nginx`)
) )
func NewCmdRolloutResume(f cmdutil.Factory, out io.Writer) *cobra.Command { func NewCmdRolloutResume(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
options := &ResumeConfig{} o := &ResumeConfig{
PrintFlags: printers.NewPrintFlags("resumed"),
IOStreams: streams,
}
validArgs := []string{"deployment"} validArgs := []string{"deployment"}
argAliases := kubectl.ResourceAliases(validArgs) argAliases := kubectl.ResourceAliases(validArgs)
...@@ -73,11 +79,11 @@ func NewCmdRolloutResume(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -73,11 +79,11 @@ func NewCmdRolloutResume(f cmdutil.Factory, out io.Writer) *cobra.Command {
Example: resume_example, Example: resume_example,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
allErrs := []error{} allErrs := []error{}
err := options.CompleteResume(f, cmd, out, args) err := o.CompleteResume(f, cmd, args)
if err != nil { if err != nil {
allErrs = append(allErrs, err) allErrs = append(allErrs, err)
} }
err = options.RunResume() err = o.RunResume()
if err != nil { if err != nil {
allErrs = append(allErrs, err) allErrs = append(allErrs, err)
} }
...@@ -88,11 +94,11 @@ func NewCmdRolloutResume(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -88,11 +94,11 @@ func NewCmdRolloutResume(f cmdutil.Factory, out io.Writer) *cobra.Command {
} }
usage := "identifying the resource to get from a server." usage := "identifying the resource to get from a server."
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage) cmdutil.AddFilenameOptionFlags(cmd, &o.FilenameOptions, usage)
return cmd return cmd
} }
func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []string) error { func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, args []string) error {
if len(args) == 0 && cmdutil.IsFilenameSliceEmpty(o.Filenames) { if len(args) == 0 && cmdutil.IsFilenameSliceEmpty(o.Filenames) {
return cmdutil.UsageErrorf(cmd, "%s", cmd.Use) return cmdutil.UsageErrorf(cmd, "%s", cmd.Use)
} }
...@@ -100,13 +106,22 @@ func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out ...@@ -100,13 +106,22 @@ func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out
o.Mapper = f.RESTMapper() o.Mapper = f.RESTMapper()
o.Resumer = f.Resumer o.Resumer = f.Resumer
o.Out = out
cmdNamespace, enforceNamespace, err := f.DefaultNamespace() cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
if err != nil { if err != nil {
return err return err
} }
o.ToPrinter = func(operation string) (printers.ResourcePrinterFunc, error) {
o.PrintFlags.NamePrintFlags.Operation = operation
printer, err := o.PrintFlags.ToPrinter()
if err != nil {
return nil, err
}
return printer.PrintObj, nil
}
r := f.NewBuilder(). r := f.NewBuilder().
Internal(legacyscheme.Scheme). Internal(legacyscheme.Scheme).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
...@@ -145,9 +160,13 @@ func (o ResumeConfig) RunResume() error { ...@@ -145,9 +160,13 @@ func (o ResumeConfig) RunResume() error {
} }
if string(patch.Patch) == "{}" || len(patch.Patch) == 0 { if string(patch.Patch) == "{}" || len(patch.Patch) == 0 {
cmdutil.PrintSuccess(false, o.Out, info.Object, false, "already resumed") printer, err := o.ToPrinter("already resumed")
if err != nil {
allErrs = append(allErrs, err)
continue continue
} }
printer.PrintObj(info.AsVersioned(legacyscheme.Scheme), o.Out)
}
obj, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch) obj, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.StrategicMergePatchType, patch.Patch)
if err != nil { if err != nil {
...@@ -156,7 +175,12 @@ func (o ResumeConfig) RunResume() error { ...@@ -156,7 +175,12 @@ func (o ResumeConfig) RunResume() error {
} }
info.Refresh(obj, true) info.Refresh(obj, true)
cmdutil.PrintSuccess(false, o.Out, info.Object, false, "resumed") printer, err := o.ToPrinter("resumed")
if err != nil {
allErrs = append(allErrs, err)
continue
}
printer.PrintObj(info.AsVersioned(legacyscheme.Scheme), o.Out)
} }
return utilerrors.NewAggregate(allErrs) return utilerrors.NewAggregate(allErrs)
......
...@@ -18,7 +18,6 @@ package rollout ...@@ -18,7 +18,6 @@ package rollout
import ( import (
"fmt" "fmt"
"io"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
...@@ -26,6 +25,7 @@ import ( ...@@ -26,6 +25,7 @@ import (
"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"
"k8s.io/kubernetes/pkg/util/interrupt" "k8s.io/kubernetes/pkg/util/interrupt"
...@@ -49,8 +49,32 @@ var ( ...@@ -49,8 +49,32 @@ var (
kubectl rollout status deployment/nginx`) kubectl rollout status deployment/nginx`)
) )
func NewCmdRolloutStatus(f cmdutil.Factory, out io.Writer) *cobra.Command { type RolloutStatusOptions struct {
options := &resource.FilenameOptions{} FilenameOptions *resource.FilenameOptions
genericclioptions.IOStreams
Namespace string
EnforceNamespace bool
BuilderArgs []string
Watch bool
Revision int64
StatusViewer func(*meta.RESTMapping) (kubectl.StatusViewer, error)
Builder *resource.Builder
}
func NewRolloutStatusOptions(streams genericclioptions.IOStreams) *RolloutStatusOptions {
return &RolloutStatusOptions{
FilenameOptions: &resource.FilenameOptions{},
IOStreams: streams,
Watch: true,
}
}
func NewCmdRolloutStatus(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
o := NewRolloutStatusOptions(streams)
validArgs := []string{"deployment", "daemonset", "statefulset"} validArgs := []string{"deployment", "daemonset", "statefulset"}
argAliases := kubectl.ResourceAliases(validArgs) argAliases := kubectl.ResourceAliases(validArgs)
...@@ -62,38 +86,52 @@ func NewCmdRolloutStatus(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -62,38 +86,52 @@ func NewCmdRolloutStatus(f cmdutil.Factory, out io.Writer) *cobra.Command {
Long: status_long, Long: status_long,
Example: status_example, Example: status_example,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
cmdutil.CheckErr(RunStatus(f, cmd, out, args, options)) cmdutil.CheckErr(o.Complete(f, args))
cmdutil.CheckErr(o.Validate(cmd, args))
cmdutil.CheckErr(o.Run())
}, },
ValidArgs: validArgs, ValidArgs: validArgs,
ArgAliases: argAliases, ArgAliases: argAliases,
} }
usage := "identifying the resource to get from a server." usage := "identifying the resource to get from a server."
cmdutil.AddFilenameOptionFlags(cmd, options, usage) cmdutil.AddFilenameOptionFlags(cmd, o.FilenameOptions, usage)
cmd.Flags().BoolP("watch", "w", true, "Watch the status of the rollout until it's done.") cmd.Flags().BoolVarP(&o.Watch, "watch", "w", o.Watch, "Watch the status of the rollout until it's done.")
cmd.Flags().Int64("revision", 0, "Pin to a specific revision for showing its status. Defaults to 0 (last revision).") cmd.Flags().Int64Var(&o.Revision, "revision", o.Revision, "Pin to a specific revision for showing its status. Defaults to 0 (last revision).")
return cmd return cmd
} }
func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []string, options *resource.FilenameOptions) error { func (o *RolloutStatusOptions) Complete(f cmdutil.Factory, args []string) error {
if len(args) == 0 && cmdutil.IsFilenameSliceEmpty(options.Filenames) { o.Builder = f.NewBuilder()
return cmdutil.UsageErrorf(cmd, "Required resource not specified.")
}
cmdNamespace, enforceNamespace, err := f.DefaultNamespace() var err error
o.Namespace, o.EnforceNamespace, err = f.DefaultNamespace()
if err != nil { if err != nil {
return err return err
} }
r := f.NewBuilder(). o.BuilderArgs = args
o.StatusViewer = f.StatusViewer
return nil
}
func (o *RolloutStatusOptions) Validate(cmd *cobra.Command, args []string) error {
if len(args) == 0 && cmdutil.IsFilenameSliceEmpty(o.FilenameOptions.Filenames) {
return cmdutil.UsageErrorf(cmd, "Required resource not specified.")
}
return nil
}
func (o *RolloutStatusOptions) Run() error {
r := o.Builder.
Internal(legacyscheme.Scheme). Internal(legacyscheme.Scheme).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(o.Namespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(o.EnforceNamespace, o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, o.BuilderArgs...).
SingleResourceType(). SingleResourceType().
Latest(). Latest().
Do() Do()
err = r.Err() err := r.Err()
if err != nil { if err != nil {
return err return err
} }
...@@ -117,12 +155,12 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri ...@@ -117,12 +155,12 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri
return err return err
} }
statusViewer, err := f.StatusViewer(mapping) statusViewer, err := o.StatusViewer(mapping)
if err != nil { if err != nil {
return err return err
} }
revision := cmdutil.GetFlagInt64(cmd, "revision") revision := o.Revision
if revision < 0 { if revision < 0 {
return fmt.Errorf("revision must be a positive integer: %v", revision) return fmt.Errorf("revision must be a positive integer: %v", revision)
} }
...@@ -132,12 +170,12 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri ...@@ -132,12 +170,12 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri
if err != nil { if err != nil {
return err return err
} }
fmt.Fprintf(out, "%s", status) fmt.Fprintf(o.Out, "%s", status)
if done { if done {
return nil return nil
} }
shouldWatch := cmdutil.GetFlagBool(cmd, "watch") shouldWatch := o.Watch
if !shouldWatch { if !shouldWatch {
return nil return nil
} }
...@@ -157,7 +195,7 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri ...@@ -157,7 +195,7 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri
if err != nil { if err != nil {
return false, err return false, err
} }
fmt.Fprintf(out, "%s", status) fmt.Fprintf(o.Out, "%s", status)
// Quit waiting if the rollout is done // Quit waiting if the rollout is done
if done { if done {
return true, nil return true, nil
......
...@@ -27,6 +27,7 @@ import ( ...@@ -27,6 +27,7 @@ import (
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"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"
"k8s.io/kubernetes/pkg/printers"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
...@@ -36,6 +37,9 @@ import ( ...@@ -36,6 +37,9 @@ import (
type UndoOptions struct { type UndoOptions struct {
resource.FilenameOptions resource.FilenameOptions
PrintFlags *printers.PrintFlags
ToPrinter func(string) (printers.ResourcePrinterFunc, error)
Rollbackers []kubectl.Rollbacker Rollbackers []kubectl.Rollbacker
Mapper meta.RESTMapper Mapper meta.RESTMapper
Infos []*resource.Info Infos []*resource.Info
...@@ -61,7 +65,9 @@ var ( ...@@ -61,7 +65,9 @@ var (
) )
func NewCmdRolloutUndo(f cmdutil.Factory, out io.Writer) *cobra.Command { func NewCmdRolloutUndo(f cmdutil.Factory, out io.Writer) *cobra.Command {
options := &UndoOptions{} o := &UndoOptions{
PrintFlags: printers.NewPrintFlags(""),
}
validArgs := []string{"deployment", "daemonset", "statefulset"} validArgs := []string{"deployment", "daemonset", "statefulset"}
argAliases := kubectl.ResourceAliases(validArgs) argAliases := kubectl.ResourceAliases(validArgs)
...@@ -74,11 +80,11 @@ func NewCmdRolloutUndo(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -74,11 +80,11 @@ func NewCmdRolloutUndo(f cmdutil.Factory, out io.Writer) *cobra.Command {
Example: undo_example, Example: undo_example,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
allErrs := []error{} allErrs := []error{}
err := options.CompleteUndo(f, cmd, out, args) err := o.CompleteUndo(f, cmd, out, args)
if err != nil { if err != nil {
allErrs = append(allErrs, err) allErrs = append(allErrs, err)
} }
err = options.RunUndo() err = o.RunUndo()
if err != nil { if err != nil {
allErrs = append(allErrs, err) allErrs = append(allErrs, err)
} }
...@@ -90,7 +96,7 @@ func NewCmdRolloutUndo(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -90,7 +96,7 @@ func NewCmdRolloutUndo(f cmdutil.Factory, out io.Writer) *cobra.Command {
cmd.Flags().Int64("to-revision", 0, "The revision to rollback to. Default to 0 (last revision).") cmd.Flags().Int64("to-revision", 0, "The revision to rollback to. Default to 0 (last revision).")
usage := "identifying the resource to get from a server." usage := "identifying the resource to get from a server."
cmdutil.AddFilenameOptionFlags(cmd, &options.FilenameOptions, usage) cmdutil.AddFilenameOptionFlags(cmd, &o.FilenameOptions, usage)
cmdutil.AddDryRunFlag(cmd) cmdutil.AddDryRunFlag(cmd)
return cmd return cmd
} }
...@@ -110,6 +116,19 @@ func (o *UndoOptions) CompleteUndo(f cmdutil.Factory, cmd *cobra.Command, out io ...@@ -110,6 +116,19 @@ func (o *UndoOptions) CompleteUndo(f cmdutil.Factory, cmd *cobra.Command, out io
return err return err
} }
o.ToPrinter = func(operation string) (printers.ResourcePrinterFunc, error) {
o.PrintFlags.NamePrintFlags.Operation = operation
if o.DryRun {
o.PrintFlags.Complete("%s (dry run)")
}
printer, err := o.PrintFlags.ToPrinter()
if err != nil {
return nil, err
}
return printer.PrintObj, nil
}
r := f.NewBuilder(). r := f.NewBuilder().
Internal(legacyscheme.Scheme). Internal(legacyscheme.Scheme).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
...@@ -147,7 +166,12 @@ func (o *UndoOptions) RunUndo() error { ...@@ -147,7 +166,12 @@ func (o *UndoOptions) RunUndo() error {
allErrs = append(allErrs, cmdutil.AddSourceToErr("undoing", info.Source, err)) allErrs = append(allErrs, cmdutil.AddSourceToErr("undoing", info.Source, err))
continue continue
} }
cmdutil.PrintSuccess(false, o.Out, info.Object, false, result) printer, err := o.ToPrinter(result)
if err != nil {
allErrs = append(allErrs, err)
continue
}
printer.PrintObj(info.AsVersioned(legacyscheme.Scheme), o.Out)
} }
return utilerrors.NewAggregate(allErrs) return utilerrors.NewAggregate(allErrs)
} }
...@@ -18,7 +18,6 @@ package cmd ...@@ -18,7 +18,6 @@ package cmd
import ( import (
"fmt" "fmt"
"io"
"strings" "strings"
"encoding/json" "encoding/json"
...@@ -26,6 +25,7 @@ import ( ...@@ -26,6 +25,7 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/strategicpatch"
...@@ -34,13 +34,18 @@ import ( ...@@ -34,13 +34,18 @@ import (
"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"
"k8s.io/kubernetes/pkg/printers"
taintutils "k8s.io/kubernetes/pkg/util/taints" taintutils "k8s.io/kubernetes/pkg/util/taints"
) )
// TaintOptions have the data required to perform the taint operation // TaintOptions have the data required to perform the taint operation
type TaintOptions struct { type TaintOptions struct {
PrintFlags *printers.PrintFlags
ToPrinter func(string) (printers.ResourcePrinterFunc, error)
resources []string resources []string
taintsToAdd []v1.Taint taintsToAdd []v1.Taint
taintsToRemove []v1.Taint taintsToRemove []v1.Taint
...@@ -48,9 +53,10 @@ type TaintOptions struct { ...@@ -48,9 +53,10 @@ type TaintOptions struct {
selector string selector string
overwrite bool overwrite bool
all bool all bool
f cmdutil.Factory
out io.Writer ClientForMapping func(*meta.RESTMapping) (resource.RESTClient, error)
cmd *cobra.Command
genericclioptions.IOStreams
} }
var ( var (
...@@ -79,8 +85,11 @@ var ( ...@@ -79,8 +85,11 @@ var (
kubectl taint node -l myLabel=X dedicated=foo:PreferNoSchedule`)) kubectl taint node -l myLabel=X dedicated=foo:PreferNoSchedule`))
) )
func NewCmdTaint(f cmdutil.Factory, out io.Writer) *cobra.Command { func NewCmdTaint(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
options := &TaintOptions{} options := &TaintOptions{
PrintFlags: printers.NewPrintFlags("tainted"),
IOStreams: streams,
}
validArgs := []string{"node"} validArgs := []string{"node"}
argAliases := kubectl.ResourceAliases(validArgs) argAliases := kubectl.ResourceAliases(validArgs)
...@@ -92,7 +101,7 @@ func NewCmdTaint(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -92,7 +101,7 @@ func NewCmdTaint(f cmdutil.Factory, out io.Writer) *cobra.Command {
Long: fmt.Sprintf(taintLong, validation.DNS1123SubdomainMaxLength, validation.LabelValueMaxLength), Long: fmt.Sprintf(taintLong, validation.DNS1123SubdomainMaxLength, validation.LabelValueMaxLength),
Example: taintExample, Example: taintExample,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
if err := options.Complete(f, out, cmd, args); err != nil { if err := options.Complete(f, cmd, args); err != nil {
cmdutil.CheckErr(err) cmdutil.CheckErr(err)
} }
if err := options.Validate(); err != nil { if err := options.Validate(); err != nil {
...@@ -105,9 +114,10 @@ func NewCmdTaint(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -105,9 +114,10 @@ func NewCmdTaint(f cmdutil.Factory, out io.Writer) *cobra.Command {
ValidArgs: validArgs, ValidArgs: validArgs,
ArgAliases: argAliases, ArgAliases: argAliases,
} }
cmdutil.AddValidateFlags(cmd)
cmdutil.AddPrinterFlags(cmd) options.PrintFlags.AddFlags(cmd)
cmdutil.AddValidateFlags(cmd)
cmd.Flags().StringVarP(&options.selector, "selector", "l", options.selector, "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)") cmd.Flags().StringVarP(&options.selector, "selector", "l", options.selector, "Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)")
cmd.Flags().BoolVar(&options.overwrite, "overwrite", options.overwrite, "If true, allow taints to be overwritten, otherwise reject taint updates that overwrite existing taints.") cmd.Flags().BoolVar(&options.overwrite, "overwrite", options.overwrite, "If true, allow taints to be overwritten, otherwise reject taint updates that overwrite existing taints.")
cmd.Flags().BoolVar(&options.all, "all", options.all, "Select all nodes in the cluster") cmd.Flags().BoolVar(&options.all, "all", options.all, "Select all nodes in the cluster")
...@@ -115,7 +125,7 @@ func NewCmdTaint(f cmdutil.Factory, out io.Writer) *cobra.Command { ...@@ -115,7 +125,7 @@ func NewCmdTaint(f cmdutil.Factory, out io.Writer) *cobra.Command {
} }
// Complete adapts from the command line args and factory to the data required. // Complete adapts from the command line args and factory to the data required.
func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string) (err error) { func (o *TaintOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []string) (err error) {
namespace, _, err := f.DefaultNamespace() namespace, _, err := f.DefaultNamespace()
if err != nil { if err != nil {
return err return err
...@@ -140,6 +150,16 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com ...@@ -140,6 +150,16 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com
} }
} }
o.ToPrinter = func(operation string) (printers.ResourcePrinterFunc, error) {
o.PrintFlags.NamePrintFlags.Operation = operation
printer, err := o.PrintFlags.ToPrinter()
if err != nil {
return nil, err
}
return printer.PrintObj, nil
}
if len(o.resources) < 1 { if len(o.resources) < 1 {
return fmt.Errorf("one or more resources must be specified as <resource> <name>") return fmt.Errorf("one or more resources must be specified as <resource> <name>")
} }
...@@ -166,9 +186,8 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com ...@@ -166,9 +186,8 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com
o.builder = o.builder.LabelSelectorParam(o.selector). o.builder = o.builder.LabelSelectorParam(o.selector).
Flatten(). Flatten().
Latest() Latest()
o.f = f
o.out = out o.ClientForMapping = f.ClientForMapping
o.cmd = cmd
return nil return nil
} }
...@@ -258,7 +277,7 @@ func (o TaintOptions) RunTaint() error { ...@@ -258,7 +277,7 @@ func (o TaintOptions) RunTaint() error {
} }
mapping := info.ResourceMapping() mapping := info.ResourceMapping()
client, err := o.f.ClientForMapping(mapping) client, err := o.ClientForMapping(mapping)
if err != nil { if err != nil {
return err return err
} }
...@@ -274,13 +293,11 @@ func (o TaintOptions) RunTaint() error { ...@@ -274,13 +293,11 @@ func (o TaintOptions) RunTaint() error {
return err return err
} }
outputFormat := cmdutil.GetFlagString(o.cmd, "output") printer, err := o.ToPrinter(operation)
if outputFormat != "" { if err != nil {
return cmdutil.PrintObject(o.cmd, outputObj, o.out) return err
} }
return printer.PrintObj(outputObj, o.Out)
cmdutil.PrintSuccess(false, o.out, info.Object, false, operation)
return nil
}) })
} }
......
...@@ -17,7 +17,6 @@ limitations under the License. ...@@ -17,7 +17,6 @@ limitations under the License.
package cmd package cmd
import ( import (
"bytes"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"reflect" "reflect"
...@@ -32,6 +31,7 @@ import ( ...@@ -32,6 +31,7 @@ import (
"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"
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"
) )
...@@ -302,8 +302,7 @@ func TestTaint(t *testing.T) { ...@@ -302,8 +302,7 @@ func TestTaint(t *testing.T) {
} }
tf.ClientConfigVal = defaultClientConfig() tf.ClientConfigVal = defaultClientConfig()
buf := bytes.NewBuffer([]byte{}) cmd := NewCmdTaint(tf, genericclioptions.NewTestIOStreamsDiscard())
cmd := NewCmdTaint(tf, buf)
saw_fatal := false saw_fatal := false
func() { func() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment