add Local and Unstructured builder attributes

Moves DisabledClientMapperForMapping wrapper to new Local attribute.
Removes Factory#NewUnstructuredBuilder in favor of new Unstructured
builder attribute.
pull/6/head
juanvallejo 2017-08-02 16:23:07 -04:00
parent c10f4f78bc
commit 90d76adb4b
No known key found for this signature in database
GPG Key ID: 7D2C958002D6448D
39 changed files with 143 additions and 157 deletions

View File

@ -186,13 +186,8 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro
changeCause := f.Command(cmd, false) changeCause := f.Command(cmd, false)
builder, err := f.NewUnstructuredBuilder(!o.local)
if err != nil {
return err
}
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false)
b := builder. b := f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
@ -200,10 +195,22 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro
Flatten() Flatten()
if !o.local { if !o.local {
// call this method here, as it requires an api call
// and will cause the command to fail when there is
// no connection to a server
mapper, typer, err := f.UnstructuredObject()
if err != nil {
return err
}
b = b.SelectorParam(o.selector). b = b.SelectorParam(o.selector).
Unstructured(f.UnstructuredClientForMapping, mapper, typer).
ResourceTypeOrNameArgs(o.all, o.resources...). ResourceTypeOrNameArgs(o.all, o.resources...).
Latest() Latest()
} else {
b = b.Local(f.ClientForMapping)
} }
r := b.Do() r := b.Do()
if err := r.Err(); err != nil { if err := r.Err(); err != nil {
return err return err

View File

@ -198,7 +198,7 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti
return err return err
} }
mapper, _, err := f.UnstructuredObject() mapper, typer, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
@ -210,16 +210,11 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti
} }
} }
builder, err := f.NewUnstructuredBuilder(true)
if err != nil {
return err
}
// include the uninitialized objects by default if --prune is true // include the uninitialized objects by default if --prune is true
// unless explicitly set --include-uninitialized=false // unless explicitly set --include-uninitialized=false
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, options.Prune) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, options.Prune)
r := f.NewBuilder().
r := builder. Unstructured(f.UnstructuredClientForMapping, mapper, typer).
Schema(schema). Schema(schema).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().

View File

@ -122,12 +122,13 @@ func (o *SetLastAppliedOptions) Complete(f cmdutil.Factory, cmd *cobra.Command)
} }
func (o *SetLastAppliedOptions) Validate(f cmdutil.Factory, cmd *cobra.Command) error { func (o *SetLastAppliedOptions) Validate(f cmdutil.Factory, cmd *cobra.Command) error {
builder, err := f.NewUnstructuredBuilder(true) mapper, typer, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
r := builder. r := f.NewBuilder().
Unstructured(f.UnstructuredClientForMapping, mapper, typer).
NamespaceParam(o.Namespace).DefaultNamespace(). NamespaceParam(o.Namespace).DefaultNamespace().
FilenameParam(o.EnforceNamespace, &o.FilenameOptions). FilenameParam(o.EnforceNamespace, &o.FilenameOptions).
Latest(). Latest().

View File

@ -87,12 +87,13 @@ func (o *ViewLastAppliedOptions) Complete(f cmdutil.Factory, args []string) erro
return err return err
} }
builder, err := f.NewUnstructuredBuilder(true) mapper, typer, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
r := builder. r := f.NewBuilder().
Unstructured(f.UnstructuredClientForMapping, mapper, typer).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(enforceNamespace, args...). ResourceTypeOrNameArgs(enforceNamespace, args...).

View File

@ -142,7 +142,7 @@ func (p *AttachOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn [
return cmdutil.UsageErrorf(cmd, err.Error()) return cmdutil.UsageErrorf(cmd, err.Error())
} }
builder := f.NewBuilder(true). builder := f.NewBuilder().
NamespaceParam(namespace).DefaultNamespace() NamespaceParam(namespace).DefaultNamespace()
switch len(argsIn) { switch len(argsIn) {

View File

@ -92,7 +92,7 @@ func (o *ReconcileOptions) Complete(cmd *cobra.Command, f cmdutil.Factory, args
if err != nil { if err != nil {
return err return err
} }
o.ResourceBuilder = f.NewBuilder(true). o.ResourceBuilder = f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).

View File

@ -90,8 +90,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s
return err return err
} }
mapper, typer := f.Object() r := f.NewBuilder().
r := f.NewBuilder(true).
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
@ -145,6 +144,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s
return err return err
} }
mapper, typer := f.Object()
resourceMapper := &resource.Mapper{ resourceMapper := &resource.Mapper{
ObjectTyper: typer, ObjectTyper: typer,
RESTMapper: mapper, RESTMapper: mapper,

View File

@ -167,7 +167,7 @@ func (options *CertificateOptions) modifyCertificateCondition(f cmdutil.Factory,
if err != nil { if err != nil {
return err return err
} }
r := f.NewBuilder(true). r := f.NewBuilder().
ContinueOnError(). ContinueOnError().
FilenameParam(false, &options.FilenameOptions). FilenameParam(false, &options.FilenameOptions).
ResourceNames("certificatesigningrequest", options.csrNames...). ResourceNames("certificatesigningrequest", options.csrNames...).

View File

@ -71,7 +71,7 @@ func RunClusterInfo(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error
} }
// TODO use generalized labels once they are implemented (#341) // TODO use generalized labels once they are implemented (#341)
b := f.NewBuilder(true). b := f.NewBuilder().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
SelectorParam("kubernetes.io/cluster-service=true"). SelectorParam("kubernetes.io/cluster-service=true").
ResourceTypeOrNameArgs(false, []string{"services"}...). ResourceTypeOrNameArgs(false, []string{"services"}...).

View File

@ -126,14 +126,17 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C
} }
// build the builder // build the builder
o.builder = f.NewBuilder(!o.local) o.builder = f.NewBuilder()
if !o.local { if !o.local {
schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagBool(cmd, "openapi-validation"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagBool(cmd, "openapi-validation"), cmdutil.GetFlagString(cmd, "schema-cache-dir"))
if err != nil { if err != nil {
return err return err
} }
o.builder = o.builder.Schema(schema) o.builder = o.builder.Schema(schema)
} else {
o.builder = o.builder.Local(f.ClientForMapping)
} }
cmdNamespace, _, err := f.DefaultNamespace() cmdNamespace, _, err := f.DefaultNamespace()
if err != nil { if err != nil {
return err return err

View File

@ -125,17 +125,13 @@ func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opt
return err return err
} }
mapper, _, err := f.UnstructuredObject() mapper, typer, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
builder, err := f.NewUnstructuredBuilder(true) r := f.NewBuilder().
if err != nil { Unstructured(f.UnstructuredClientForMapping, mapper, typer).
return err
}
r := builder.
Schema(schema). Schema(schema).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().

View File

@ -170,19 +170,15 @@ func (o *DeleteOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args
} }
// Set up client based support. // Set up client based support.
mapper, _, err := f.UnstructuredObject() mapper, typer, err := f.UnstructuredObject()
if err != nil {
return err
}
builder, err := f.NewUnstructuredBuilder(true)
if err != nil { if err != nil {
return err return err
} }
o.Mapper = mapper o.Mapper = mapper
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false)
r := builder. r := f.NewBuilder().
Unstructured(f.UnstructuredClientForMapping, mapper, typer).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).

View File

@ -117,7 +117,7 @@ func RunDescribe(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, a
return cmdutil.UsageErrorf(cmd, "Required resource not specified.") return cmdutil.UsageErrorf(cmd, "Required resource not specified.")
} }
builder, err := f.NewUnstructuredBuilder(true) mapper, typer, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
@ -125,8 +125,8 @@ func RunDescribe(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, a
// include the uninitialized objects by default // include the uninitialized objects by default
// unless user explicitly set --include-uninitialized=false // unless user explicitly set --include-uninitialized=false
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, true) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, true)
r := f.NewBuilder().
r := builder. Unstructured(f.UnstructuredClientForMapping, mapper, typer).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces).
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).

View File

@ -20,11 +20,12 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"k8s.io/apimachinery/pkg/util/json"
"math" "math"
"strings" "strings"
"time" "time"
"k8s.io/apimachinery/pkg/util/json"
"github.com/jonboulle/clockwork" "github.com/jonboulle/clockwork"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -217,7 +218,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error {
return err return err
} }
r := o.Factory.NewBuilder(true). r := o.Factory.NewBuilder().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
ResourceNames("node", args[0]). ResourceNames("node", args[0]).
Do() Do()

View File

@ -126,7 +126,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri
} }
mapper, typer := f.Object() mapper, typer := f.Object()
r := f.NewBuilder(true). r := f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).

View File

@ -166,14 +166,16 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
return nil return nil
} }
selector := cmdutil.GetFlagString(cmd, "selector") mapper, typer, err := f.UnstructuredObject()
allNamespaces := cmdutil.GetFlagBool(cmd, "all-namespaces")
showKind := cmdutil.GetFlagBool(cmd, "show-kind")
builder, err := f.NewUnstructuredBuilder(true)
if err != nil { if err != nil {
return err return err
} }
selector := cmdutil.GetFlagString(cmd, "selector")
allNamespaces := cmdutil.GetFlagBool(cmd, "all-namespaces")
showKind := cmdutil.GetFlagBool(cmd, "show-kind")
builder := f.NewBuilder().Unstructured(f.UnstructuredClientForMapping, mapper, typer)
cmdNamespace, enforceNamespace, err := f.DefaultNamespace() cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
if err != nil { if err != nil {
return err return err
@ -212,12 +214,8 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
includeUninitialized = cmdutil.ShouldIncludeUninitialized(cmd, includeUninitialized) includeUninitialized = cmdutil.ShouldIncludeUninitialized(cmd, includeUninitialized)
if isWatch || isWatchOnly { if isWatch || isWatchOnly {
builder, err := f.NewUnstructuredBuilder(true) r := f.NewBuilder().
if err != nil { Unstructured(f.UnstructuredClientForMapping, mapper, typer).
return err
}
r := builder.
NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces).
FilenameParam(enforceNamespace, &options.FilenameOptions). FilenameParam(enforceNamespace, &options.FilenameOptions).
SelectorParam(selector). SelectorParam(selector).

View File

@ -181,13 +181,8 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error {
changeCause := f.Command(cmd, false) changeCause := f.Command(cmd, false)
builder, err := f.NewUnstructuredBuilder(!o.local)
if err != nil {
return err
}
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false)
b := builder. b := f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
@ -195,10 +190,22 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error {
Flatten() Flatten()
if !o.local { if !o.local {
// call this method here, as it requires an api call
// and will cause the command to fail when there is
// no connection to a server
mapper, typer, err := f.UnstructuredObject()
if err != nil {
return err
}
b = b.SelectorParam(o.selector). b = b.SelectorParam(o.selector).
Unstructured(f.UnstructuredClientForMapping, mapper, typer).
ResourceTypeOrNameArgs(o.all, o.resources...). ResourceTypeOrNameArgs(o.all, o.resources...).
Latest() Latest()
} else {
b = b.Local(f.ClientForMapping)
} }
one := false one := false
r := b.Do().IntoSingleItemImplied(&one) r := b.Do().IntoSingleItemImplied(&one)
if err := r.Err(); err != nil { if err := r.Err(); err != nil {

View File

@ -192,7 +192,7 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm
} }
if o.Object == nil { if o.Object == nil {
builder := f.NewBuilder(true). builder := f.NewBuilder().
NamespaceParam(o.Namespace).DefaultNamespace(). NamespaceParam(o.Namespace).DefaultNamespace().
SingleResourceType() SingleResourceType()
if o.ResourceArg != "" { if o.ResourceArg != "" {

View File

@ -150,14 +150,13 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin
return fmt.Errorf("unable to parse %q: %v", patch, err) return fmt.Errorf("unable to parse %q: %v", patch, err)
} }
// TODO: fix --local to work with customresources without making use of the discovery client. mapper, typer, err := f.UnstructuredObject()
// https://github.com/kubernetes/kubernetes/issues/46722
builder, err := f.NewUnstructuredBuilder(true)
if err != nil { if err != nil {
return err return err
} }
r := builder. r := f.NewBuilder().
Unstructured(f.UnstructuredClientForMapping, mapper, typer).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &options.FilenameOptions). FilenameParam(enforceNamespace, &options.FilenameOptions).

View File

@ -120,17 +120,13 @@ func RunReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str
return fmt.Errorf("--timeout must have --force specified") return fmt.Errorf("--timeout must have --force specified")
} }
mapper, _, err := f.UnstructuredObject() mapper, typer, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
builder, err := f.NewUnstructuredBuilder(true) r := f.NewBuilder().
if err != nil { Unstructured(f.UnstructuredClientForMapping, mapper, typer).
return err
}
r := builder.
Schema(schema). Schema(schema).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
@ -250,12 +246,8 @@ func forceReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s
}) })
}) })
builder, err := f.NewUnstructuredBuilder(true) r = f.NewBuilder().
if err != nil { Unstructured(f.UnstructuredClientForMapping, mapper, typer).
return err
}
r = builder.
Schema(schema). Schema(schema).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().

View File

@ -199,7 +199,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args
return err return err
} }
request := f.NewBuilder(true). request := f.NewBuilder().
Schema(schema). Schema(schema).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &resource.FilenameOptions{Recursive: false, Filenames: []string{filename}}). FilenameParam(enforceNamespace, &resource.FilenameOptions{Recursive: false, Filenames: []string{filename}}).

View File

@ -79,7 +79,7 @@ func RunHistory(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []str
return err return err
} }
r := f.NewBuilder(true). r := f.NewBuilder().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).

View File

@ -111,7 +111,7 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i
return err return err
} }
r := f.NewBuilder(true). r := f.NewBuilder().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).

View File

@ -109,7 +109,7 @@ func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out
return err return err
} }
r := f.NewBuilder(true). r := f.NewBuilder().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).

View File

@ -82,7 +82,7 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri
return err return err
} }
r := f.NewBuilder(true). r := f.NewBuilder().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).

View File

@ -110,7 +110,7 @@ func (o *UndoOptions) CompleteUndo(f cmdutil.Factory, cmd *cobra.Command, out io
return err return err
} }
r := f.NewBuilder(true). r := f.NewBuilder().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).

View File

@ -352,7 +352,7 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c
if err != nil { if err != nil {
return err return err
} }
r := f.NewBuilder(true). r := f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
ResourceNames(obj.Mapping.Resource, name). ResourceNames(obj.Mapping.Resource, name).

View File

@ -99,7 +99,7 @@ func RunScale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin
} }
mapper, _ := f.Object() mapper, _ := f.Object()
r := f.NewBuilder(true). r := f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).

View File

@ -139,12 +139,13 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st
} }
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false)
builder := f.NewBuilder(!o.Local). builder := f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
IncludeUninitialized(includeUninitialized). IncludeUninitialized(includeUninitialized).
Flatten() Flatten()
if !o.Local { if !o.Local {
builder = builder. builder = builder.
SelectorParam(o.Selector). SelectorParam(o.Selector).
@ -157,6 +158,8 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st
if len(o.Resources) > 0 { if len(o.Resources) > 0 {
return resource.LocalResourceError return resource.LocalResourceError
} }
builder = builder.Local(f.ClientForMapping)
} }
o.Infos, err = builder.Do().Infos() o.Infos, err = builder.Do().Infos()

View File

@ -143,7 +143,7 @@ func (o *ResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args
} }
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false)
builder := f.NewBuilder(!o.Local). builder := f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
@ -162,6 +162,8 @@ func (o *ResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args
if len(args) > 0 { if len(args) > 0 {
return resource.LocalResourceError return resource.LocalResourceError
} }
builder = builder.Local(f.ClientForMapping)
} }
o.Infos, err = builder.Do().Infos() o.Infos, err = builder.Do().Infos()

View File

@ -123,7 +123,7 @@ func (o *SelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [
} }
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false)
o.builder = f.NewBuilder(!o.local). o.builder = f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.fileOptions). FilenameParam(enforceNamespace, &o.fileOptions).
@ -141,6 +141,8 @@ func (o *SelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [
if len(o.resources) > 0 { if len(o.resources) > 0 {
return resource.LocalResourceError return resource.LocalResourceError
} }
o.builder = o.builder.Local(f.ClientForMapping)
} }
o.PrintObject = func(obj runtime.Object) error { o.PrintObject = func(obj runtime.Object) error {

View File

@ -126,7 +126,7 @@ func (saConfig *serviceAccountConfig) Complete(f cmdutil.Factory, cmd *cobra.Com
saConfig.serviceAccountName = args[len(args)-1] saConfig.serviceAccountName = args[len(args)-1]
resources := args[:len(args)-1] resources := args[:len(args)-1]
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false)
builder := f.NewBuilder(!saConfig.local).ContinueOnError(). builder := f.NewBuilder().ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &saConfig.fileNameOptions). FilenameParam(enforceNamespace, &saConfig.fileNameOptions).
IncludeUninitialized(includeUninitialized). IncludeUninitialized(includeUninitialized).
@ -134,6 +134,8 @@ func (saConfig *serviceAccountConfig) Complete(f cmdutil.Factory, cmd *cobra.Com
if !saConfig.local { if !saConfig.local {
builder.ResourceTypeOrNameArgs(saConfig.all, resources...). builder.ResourceTypeOrNameArgs(saConfig.all, resources...).
Latest() Latest()
} else {
builder = builder.Local(f.ClientForMapping)
} }
saConfig.infos, err = builder.Do().Infos() saConfig.infos, err = builder.Do().Infos()
if err != nil { if err != nil {

View File

@ -125,7 +125,7 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []
} }
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false)
builder := f.NewBuilder(!o.Local). builder := f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
@ -144,6 +144,8 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []
if len(args) > 0 { if len(args) > 0 {
return resource.LocalResourceError return resource.LocalResourceError
} }
builder = builder.Local(f.ClientForMapping)
} }
o.Infos, err = builder.Do().Infos() o.Infos, err = builder.Do().Infos()

View File

@ -148,7 +148,7 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com
if o.taintsToAdd, o.taintsToRemove, err = taintutils.ParseTaints(taintArgs); err != nil { if o.taintsToAdd, o.taintsToRemove, err = taintutils.ParseTaints(taintArgs); err != nil {
return cmdutil.UsageErrorf(cmd, err.Error()) return cmdutil.UsageErrorf(cmd, err.Error())
} }
o.builder = f.NewBuilder(true). o.builder = f.NewBuilder().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace() NamespaceParam(namespace).DefaultNamespace()
if o.selector != "" { if o.selector != "" {

View File

@ -29,7 +29,6 @@ import (
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/runtime/serializer"
@ -484,21 +483,9 @@ func (f *FakeFactory) PrinterForMapping(cmd *cobra.Command, isLocal bool, output
return f.tf.Printer, f.tf.Err return f.tf.Printer, f.tf.Err
} }
func (f *FakeFactory) NewBuilder(allowRemoteCalls bool) *resource.Builder { func (f *FakeFactory) NewBuilder() *resource.Builder {
return nil mapper, typer := f.Object()
} return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true))
func (f *FakeFactory) NewUnstructuredBuilder(allowRemoteCalls bool) (*resource.Builder, error) {
if !allowRemoteCalls {
return f.NewBuilder(allowRemoteCalls), nil
}
mapper, typer, err := f.UnstructuredObject()
if err != nil {
return nil, err
}
return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme), nil
} }
func (f *FakeFactory) DefaultResourceFilterOptions(cmd *cobra.Command, withNamespace bool) *printers.PrintOptions { func (f *FakeFactory) DefaultResourceFilterOptions(cmd *cobra.Command, withNamespace bool) *printers.PrintOptions {
@ -769,25 +756,11 @@ func (f *fakeAPIFactory) PrinterForMapping(cmd *cobra.Command, isLocal bool, out
return f.tf.Printer, f.tf.Err return f.tf.Printer, f.tf.Err
} }
func (f *fakeAPIFactory) NewBuilder(allowRemoteCalls bool) *resource.Builder { func (f *fakeAPIFactory) NewBuilder() *resource.Builder {
mapper, typer := f.Object() mapper, typer := f.Object()
return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)) return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true))
} }
func (f *fakeAPIFactory) NewUnstructuredBuilder(allowRemoteCalls bool) (*resource.Builder, error) {
if !allowRemoteCalls {
return f.NewBuilder(allowRemoteCalls), nil
}
mapper, typer, err := f.UnstructuredObject()
if err != nil {
return nil, err
}
return resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme), nil
}
func (f *fakeAPIFactory) SuggestedPodTemplateResources() []schema.GroupResource { func (f *fakeAPIFactory) SuggestedPodTemplateResources() []schema.GroupResource {
return []schema.GroupResource{} return []schema.GroupResource{}
} }

View File

@ -111,10 +111,7 @@ func (o *EditOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args []
return err return err
} }
b, err := f.NewUnstructuredBuilder(true) b := f.NewBuilder().Unstructured(f.UnstructuredClientForMapping, mapper, typer)
if err != nil {
return err
}
if o.EditMode == NormalEditMode || o.EditMode == ApplyEditMode { if o.EditMode == NormalEditMode || o.EditMode == ApplyEditMode {
// when do normal edit or apply edit we need to always retrieve the latest resource from server // when do normal edit or apply edit we need to always retrieve the latest resource from server
b = b.ResourceTypeOrNameArgs(true, args...).Latest() b = b.ResourceTypeOrNameArgs(true, args...).Latest()

View File

@ -256,9 +256,7 @@ type BuilderFactory interface {
// PrintObject prints an api object given command line flags to modify the output format // PrintObject prints an api object given command line flags to modify the output format
PrintObject(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error PrintObject(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error
// One stop shopping for a Builder // One stop shopping for a Builder
NewBuilder(allowRemoteCalls bool) *resource.Builder NewBuilder() *resource.Builder
// Resource builder for working with unstructured objects
NewUnstructuredBuilder(allowRemoteCalls bool) (*resource.Builder, error)
// PluginLoader provides the implementation to be used to load cli plugins. // PluginLoader provides the implementation to be used to load cli plugins.
PluginLoader() plugins.PluginLoader PluginLoader() plugins.PluginLoader
// PluginRunner provides the implementation to be used to run cli plugins. // PluginRunner provides the implementation to be used to run cli plugins.

View File

@ -140,37 +140,13 @@ func (f *ring2Factory) PrintObject(cmd *cobra.Command, isLocal bool, mapper meta
// NewBuilder returns a new resource builder. // NewBuilder returns a new resource builder.
// Receives a bool flag and avoids remote calls if set to false // Receives a bool flag and avoids remote calls if set to false
func (f *ring2Factory) NewBuilder(allowRemoteCalls bool) *resource.Builder { func (f *ring2Factory) NewBuilder() *resource.Builder {
var clientMapper resource.ClientMapper
clientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.ClientForMapping) clientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.ClientForMapping)
mapper, typer := f.objectMappingFactory.Object() mapper, typer := f.objectMappingFactory.Object()
categoryExpander := f.objectMappingFactory.CategoryExpander() categoryExpander := f.objectMappingFactory.CategoryExpander()
if allowRemoteCalls { return resource.NewBuilder(mapper, categoryExpander, typer, clientMapperFunc, f.clientAccessFactory.Decoder(true))
clientMapper = clientMapperFunc
} else {
clientMapper = resource.DisabledClientForMapping{ClientMapper: clientMapperFunc}
}
return resource.NewBuilder(mapper, categoryExpander, typer, clientMapper, f.clientAccessFactory.Decoder(true))
}
func (f *ring2Factory) NewUnstructuredBuilder(allowRemoteCalls bool) (*resource.Builder, error) {
if !allowRemoteCalls {
return f.NewBuilder(allowRemoteCalls), nil
}
clientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.UnstructuredClientForMapping)
mapper, typer, err := f.objectMappingFactory.UnstructuredObject()
if err != nil {
return nil, err
}
categoryExpander := f.objectMappingFactory.CategoryExpander()
return resource.NewBuilder(mapper, categoryExpander, typer, clientMapperFunc, unstructured.UnstructuredJSONScheme), nil
} }
// PluginLoader loads plugins from a path set by the KUBECTL_PLUGINS_PATH env var. // PluginLoader loads plugins from a path set by the KUBECTL_PLUGINS_PATH env var.

View File

@ -26,6 +26,7 @@ import (
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
@ -67,6 +68,9 @@ type Builder struct {
defaultNamespace bool defaultNamespace bool
requireNamespace bool requireNamespace bool
isLocal bool
isUnstructured bool
flatten bool flatten bool
latest bool latest bool
@ -82,6 +86,8 @@ type Builder struct {
schema validation.Schema schema validation.Schema
} }
var LocalUnstructuredBuilderError = fmt.Errorf("Unstructured objects cannot be handled with a local builder - Local and Unstructured attributes cannot be used in conjunction")
var missingResourceError = fmt.Errorf(`You must provide one or more resources by argument or filename. var missingResourceError = fmt.Errorf(`You must provide one or more resources by argument or filename.
Example resource specifications include: Example resource specifications include:
'-f rsrc.yaml' '-f rsrc.yaml'
@ -161,6 +167,35 @@ func (b *Builder) FilenameParam(enforceNamespace bool, filenameOptions *Filename
return b return b
} }
// Local wraps the builder's clientMapper in a DisabledClientMapperForMapping
func (b *Builder) Local(mapperFunc ClientMapperFunc) *Builder {
if b.isUnstructured {
b.errs = append(b.errs, LocalUnstructuredBuilderError)
return b
}
b.isLocal = true
b.mapper.ClientMapper = DisabledClientForMapping{ClientMapper: ClientMapperFunc(mapperFunc)}
return b
}
// Unstructured updates the builder's ClientMapper, RESTMapper,
// ObjectTyper, and codec for working with unstructured api objects
func (b *Builder) Unstructured(mapperFunc ClientMapperFunc, mapper meta.RESTMapper, typer runtime.ObjectTyper) *Builder {
if b.isLocal {
b.errs = append(b.errs, LocalUnstructuredBuilderError)
return b
}
b.isUnstructured = true
b.mapper.RESTMapper = mapper
b.mapper.ObjectTyper = typer
b.mapper.Decoder = unstructured.UnstructuredJSONScheme
b.mapper.ClientMapper = ClientMapperFunc(mapperFunc)
return b
}
// URL accepts a number of URLs directly. // URL accepts a number of URLs directly.
func (b *Builder) URL(httpAttemptCount int, urls ...*url.URL) *Builder { func (b *Builder) URL(httpAttemptCount int, urls ...*url.URL) *Builder {
for _, u := range urls { for _, u := range urls {