Merge pull request #45579 from shiywang/refactor-visit-patch

Automatic merge from submit-queue (batch tested with PRs 45515, 45579)

Refactor functions in editoptions.go to use less arguments

Fixes https://github.com/kubernetes/kubernetes/issues/45521
/assign @mengqiy 
will rebase pr https://github.com/kubernetes/kubernetes/pull/42256 after this get merged
pull/6/head
Kubernetes Submit Queue 2017-05-10 23:20:42 -07:00 committed by GitHub
commit 947db16df7
1 changed files with 18 additions and 21 deletions

View File

@ -59,6 +59,7 @@ type EditOptions struct {
Mapper meta.RESTMapper Mapper meta.RESTMapper
ResourceMapper *resource.Mapper ResourceMapper *resource.Mapper
OriginalResult *resource.Result OriginalResult *resource.Result
Encoder runtime.Encoder
EditMode EditMode EditMode EditMode
@ -129,7 +130,7 @@ func (o *EditOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args []
o.Mapper = mapper o.Mapper = mapper
o.CmdNamespace = cmdNamespace o.CmdNamespace = cmdNamespace
o.Encoder = f.JSONEncoder()
o.f = f o.f = f
// Set up writer // Set up writer
@ -145,7 +146,6 @@ func (o *EditOptions) Validate() error {
} }
func (o *EditOptions) Run() error { func (o *EditOptions) Run() error {
encoder := o.f.JSONEncoder()
edit := NewDefaultEditor(o.f.EditorEnvs()) edit := NewDefaultEditor(o.f.EditorEnvs())
// editFn is invoked for each edit session (once with a list for normal edit, once for each individual resource in a edit-on-create invocation) // editFn is invoked for each edit session (once with a list for normal edit, once for each individual resource in a edit-on-create invocation)
editFn := func(infos []*resource.Info) error { editFn := func(infos []*resource.Info) error {
@ -273,15 +273,15 @@ func (o *EditOptions) Run() error {
} }
// iterate through all items to apply annotations // iterate through all items to apply annotations
if err := visitAnnotation(o.ApplyAnnotation, o.Record, o.ChangeCause, updatedVisitor, encoder); err != nil { if err := o.visitAnnotation(updatedVisitor); err != nil {
return preservedFile(err, file, o.ErrOut) return preservedFile(err, file, o.ErrOut)
} }
switch o.EditMode { switch o.EditMode {
case NormalEditMode: case NormalEditMode:
err = visitToPatch(infos, updatedVisitor, o.Mapper, encoder, o.Out, o.ErrOut, &results) err = o.visitToPatch(infos, updatedVisitor, &results)
case EditBeforeCreateMode: case EditBeforeCreateMode:
err = visitToCreate(updatedVisitor, o.Mapper, o.Out) err = o.visitToCreate(updatedVisitor)
default: default:
err = fmt.Errorf("unsupported edit mode %q", o.EditMode) err = fmt.Errorf("unsupported edit mode %q", o.EditMode)
} }
@ -360,12 +360,9 @@ func getPrinter(format string) *editPrinterOptions {
} }
} }
func visitToPatch( func (o *EditOptions) visitToPatch(
originalInfos []*resource.Info, originalInfos []*resource.Info,
patchVisitor resource.Visitor, patchVisitor resource.Visitor,
mapper meta.RESTMapper,
encoder runtime.Encoder,
out, errOut io.Writer,
results *editResults, results *editResults,
) error { ) error {
err := patchVisitor.Visit(func(info *resource.Info, incomingErr error) error { err := patchVisitor.Visit(func(info *resource.Info, incomingErr error) error {
@ -389,11 +386,11 @@ func visitToPatch(
return fmt.Errorf("no original object found for %#v", info.Object) return fmt.Errorf("no original object found for %#v", info.Object)
} }
originalSerialization, err := runtime.Encode(encoder, originalInfo.Object) originalSerialization, err := runtime.Encode(o.Encoder, originalInfo.Object)
if err != nil { if err != nil {
return err return err
} }
editedSerialization, err := runtime.Encode(encoder, info.Object) editedSerialization, err := runtime.Encode(o.Encoder, info.Object)
if err != nil { if err != nil {
return err return err
} }
@ -411,7 +408,7 @@ func visitToPatch(
if reflect.DeepEqual(originalJS, editedJS) { if reflect.DeepEqual(originalJS, editedJS) {
// no edit, so just skip it. // no edit, so just skip it.
cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, false, "skipped") cmdutil.PrintSuccess(o.Mapper, false, o.Out, info.Mapping.Resource, info.Name, false, "skipped")
return nil return nil
} }
@ -457,38 +454,38 @@ func visitToPatch(
patched, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, patchType, patch) patched, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, patchType, patch)
if err != nil { if err != nil {
fmt.Fprintln(errOut, results.addError(err, info)) fmt.Fprintln(o.ErrOut, results.addError(err, info))
return nil return nil
} }
info.Refresh(patched, true) info.Refresh(patched, true)
cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, false, "edited") cmdutil.PrintSuccess(o.Mapper, false, o.Out, info.Mapping.Resource, info.Name, false, "edited")
return nil return nil
}) })
return err return err
} }
func visitToCreate(createVisitor resource.Visitor, mapper meta.RESTMapper, out io.Writer) error { func (o *EditOptions) visitToCreate(createVisitor resource.Visitor) error {
err := createVisitor.Visit(func(info *resource.Info, incomingErr error) error { err := createVisitor.Visit(func(info *resource.Info, incomingErr error) error {
if err := resource.CreateAndRefresh(info); err != nil { if err := resource.CreateAndRefresh(info); err != nil {
return err return err
} }
cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, false, "created") cmdutil.PrintSuccess(o.Mapper, false, o.Out, info.Mapping.Resource, info.Name, false, "created")
return nil return nil
}) })
return err return err
} }
func visitAnnotation(applyAnnotation, record bool, changeCause string, annotationVisitor resource.Visitor, encoder runtime.Encoder) error { func (o *EditOptions) visitAnnotation(annotationVisitor resource.Visitor) error {
// iterate through all items to apply annotations // iterate through all items to apply annotations
err := annotationVisitor.Visit(func(info *resource.Info, incomingErr error) error { err := annotationVisitor.Visit(func(info *resource.Info, incomingErr error) error {
// put configuration annotation in "updates" // put configuration annotation in "updates"
if applyAnnotation { if o.ApplyAnnotation {
if err := kubectl.CreateOrUpdateAnnotation(true, info, encoder); err != nil { if err := kubectl.CreateOrUpdateAnnotation(true, info, o.Encoder); err != nil {
return err return err
} }
} }
if record || cmdutil.ContainsChangeCause(info) { if o.Record || cmdutil.ContainsChangeCause(info) {
if err := cmdutil.RecordChangeCause(info.Object, changeCause); err != nil { if err := cmdutil.RecordChangeCause(info.Object, o.ChangeCause); err != nil {
return err return err
} }
} }