enable recursive processing in kubectl rollout

This commit is contained in:
Mike Metral
2016-05-03 16:41:43 -07:00
parent 7e7465e2d4
commit 30f21fd431
5 changed files with 185 additions and 77 deletions

View File

@@ -17,7 +17,6 @@ limitations under the License.
package rollout
import (
"fmt"
"io"
"k8s.io/kubernetes/pkg/api/meta"
@@ -25,6 +24,7 @@ import (
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
"k8s.io/kubernetes/pkg/kubectl/resource"
"k8s.io/kubernetes/pkg/runtime"
utilerrors "k8s.io/kubernetes/pkg/util/errors"
"github.com/spf13/cobra"
)
@@ -32,11 +32,11 @@ import (
// UndoOptions 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()
type UndoOptions struct {
Rollbacker kubectl.Rollbacker
Mapper meta.RESTMapper
Typer runtime.ObjectTyper
Info *resource.Info
ToRevision int64
Rollbackers []kubectl.Rollbacker
Mapper meta.RESTMapper
Typer runtime.ObjectTyper
Infos []*resource.Info
ToRevision int64
Out io.Writer
Filenames []string
@@ -53,7 +53,7 @@ kubectl rollout undo deployment/abc --to-revision=3`
)
func NewCmdRolloutUndo(f *cmdutil.Factory, out io.Writer) *cobra.Command {
options := &UndoOptions{}
opts := &UndoOptions{}
cmd := &cobra.Command{
Use: "undo (TYPE NAME | TYPE/NAME) [flags]",
@@ -61,15 +61,23 @@ func NewCmdRolloutUndo(f *cmdutil.Factory, out io.Writer) *cobra.Command {
Long: undo_long,
Example: undo_example,
Run: func(cmd *cobra.Command, args []string) {
cmdutil.CheckErr(options.CompleteUndo(f, cmd, out, args))
cmdutil.CheckErr(options.RunUndo())
allErrs := []error{}
err := opts.CompleteUndo(f, cmd, out, args)
if err != nil {
allErrs = append(allErrs, err)
}
err = opts.RunUndo()
if err != nil {
allErrs = append(allErrs, err)
}
cmdutil.CheckErr(utilerrors.Flatten(utilerrors.NewAggregate(allErrs)))
},
}
cmd.Flags().Int64("to-revision", 0, "The revision to rollback to. Default to 0 (last revision).")
usage := "Filename, directory, or URL to a file identifying the resource to get from a server."
kubectl.AddJsonFilenameFlag(cmd, &options.Filenames, usage)
cmdutil.AddRecursiveFlag(cmd, &options.Recursive)
kubectl.AddJsonFilenameFlag(cmd, &opts.Filenames, usage)
cmdutil.AddRecursiveFlag(cmd, &opts.Recursive)
return cmd
}
@@ -87,31 +95,43 @@ func (o *UndoOptions) CompleteUndo(f *cmdutil.Factory, cmd *cobra.Command, out i
return err
}
infos, err := resource.NewBuilder(o.Mapper, o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)).
r := resource.NewBuilder(o.Mapper, o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)).
NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, o.Recursive, o.Filenames...).
ResourceTypeOrNameArgs(true, args...).
ContinueOnError().
Latest().
Flatten().
Do().
Infos()
Do()
err = r.Err()
if err != nil {
return err
}
if len(infos) != 1 {
return fmt.Errorf("rollout undo is only supported on individual resources - %d resources were found", len(infos))
}
o.Info = infos[0]
o.Rollbacker, err = f.Rollbacker(o.Info.ResourceMapping())
err = r.Visit(func(info *resource.Info, err error) error {
if err != nil {
return err
}
rollbacker, err := f.Rollbacker(info.ResourceMapping())
if err != nil {
return err
}
o.Infos = append(o.Infos, info)
o.Rollbackers = append(o.Rollbackers, rollbacker)
return nil
})
return err
}
func (o *UndoOptions) RunUndo() error {
result, err := o.Rollbacker.Rollback(o.Info.Namespace, o.Info.Name, nil, o.ToRevision, o.Info.Object)
if err != nil {
return err
allErrs := []error{}
for ix, info := range o.Infos {
result, err := o.Rollbackers[ix].Rollback(info.Namespace, info.Name, nil, o.ToRevision, info.Object)
if err != nil {
allErrs = append(allErrs, cmdutil.AddSourceToErr("undoing", info.Source, err))
continue
}
cmdutil.PrintSuccess(o.Mapper, false, o.Out, info.Mapping.Resource, info.Name, result)
}
cmdutil.PrintSuccess(o.Mapper, false, o.Out, o.Info.Mapping.Resource, o.Info.Name, result)
return nil
return utilerrors.NewAggregate(allErrs)
}