fix --local flag for `kubectl set` commands

parent 0cb3cb25
...@@ -1848,6 +1848,24 @@ run_recursive_resources_tests() { ...@@ -1848,6 +1848,24 @@ run_recursive_resources_tests() {
kube::test::get_object_assert pods "{{range.items}}{{${labels_field}.status}}:{{end}}" 'replaced:replaced:' kube::test::get_object_assert pods "{{range.items}}{{${labels_field}.status}}:{{end}}" 'replaced:replaced:'
kube::test::if_has_string "${output_message}" 'error validating data: kind not set' kube::test::if_has_string "${output_message}" 'error validating data: kind not set'
### Convert deployment YAML file locally without affecting the live deployment.
# Pre-condition: no deployments exist
kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" ''
# Command
# Create a deployment (revision 1)
kubectl create -f hack/testdata/deployment-revision1.yaml "${kube_flags[@]}"
kube::test::get_object_assert deployment "{{range.items}}{{$id_field}}:{{end}}" 'nginx:'
kube::test::get_object_assert deployment "{{range.items}}{{$deployment_image_field}}:{{end}}" "${IMAGE_DEPLOYMENT_R1}:"
# Command
output_message=$(kubectl convert --local -f hack/testdata/deployment-revision1.yaml --output-version=apps/v1beta1 -o go-template='{{ .apiVersion }}' "${kube_flags[@]}")
echo $output_message
# Post-condition: apiVersion is still extensions/v1beta1 in the live deployment, but command output is the new value
kube::test::get_object_assert 'deployment nginx' "{{ .apiVersion }}" 'extensions/v1beta1'
kube::test::if_has_string "${output_message}" "apps/v1beta1"
# Clean up
kubectl delete deployment nginx "${kube_flags[@]}"
## Convert multiple busybox PODs recursively from directory of YAML files ## Convert multiple busybox PODs recursively from directory of YAML files
# Pre-condition: busybox0 & busybox1 PODs exist # Pre-condition: busybox0 & busybox1 PODs exist
kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'busybox0:busybox1:' kube::test::get_object_assert pods "{{range.items}}{{$id_field}}:{{end}}" 'busybox0:busybox1:'
......
...@@ -27,7 +27,6 @@ import ( ...@@ -27,7 +27,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/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/json" "k8s.io/apimachinery/pkg/util/json"
...@@ -186,11 +185,12 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro ...@@ -186,11 +185,12 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro
changeCause := f.Command(cmd, false) changeCause := f.Command(cmd, false)
mapper, typer, err := f.UnstructuredObject() builder, err := f.NewUnstructuredBuilder(!o.local)
if err != nil { if err != nil {
return err return err
} }
b := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme).
b := builder.
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
...@@ -223,10 +223,13 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro ...@@ -223,10 +223,13 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro
} }
var outputObj runtime.Object var outputObj runtime.Object
obj, err := cmdutil.MaybeConvertObject(info.Object, info.Mapping.GroupVersionKind.GroupVersion(), info.Mapping) var obj runtime.Object
obj, err = cmdutil.MaybeConvertObject(info.Object, info.Mapping.GroupVersionKind.GroupVersion(), info.Mapping)
if err != nil { if err != nil {
return err return err
} }
if o.dryrun || o.local { if o.dryrun || o.local {
if err := o.updateAnnotations(obj); err != nil { if err := o.updateAnnotations(obj); err != nil {
return err return err
...@@ -271,8 +274,18 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro ...@@ -271,8 +274,18 @@ func (o AnnotateOptions) RunAnnotate(f cmdutil.Factory, cmd *cobra.Command) erro
return err return err
} }
} }
if o.outputFormat != "" {
return f.PrintObject(cmd, mapper, outputObj, o.out) var mapper meta.RESTMapper
if o.local {
mapper, _ = f.Object()
} else {
mapper, _, err = f.UnstructuredObject()
if err != nil {
return err
}
}
if len(o.outputFormat) > 0 {
return f.PrintObject(cmd, o.local, mapper, outputObj, o.out)
} }
cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, o.dryrun, "annotated") cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, o.dryrun, "annotated")
return nil return nil
......
...@@ -29,7 +29,6 @@ import ( ...@@ -29,7 +29,6 @@ import (
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"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"
...@@ -193,7 +192,7 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti ...@@ -193,7 +192,7 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti
return err return err
} }
mapper, typer, err := f.UnstructuredObject() mapper, _, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
...@@ -205,7 +204,12 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti ...@@ -205,7 +204,12 @@ func RunApply(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opti
} }
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). builder, err := f.NewUnstructuredBuilder(true)
if err != nil {
return err
}
r := builder.
Schema(schema). Schema(schema).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
......
...@@ -27,7 +27,6 @@ import ( ...@@ -27,7 +27,6 @@ import (
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
apijson "k8s.io/apimachinery/pkg/util/json" apijson "k8s.io/apimachinery/pkg/util/json"
...@@ -127,13 +126,18 @@ func (o *SetLastAppliedOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) ...@@ -127,13 +126,18 @@ 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 {
r := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). builder, err := f.NewUnstructuredBuilder(true)
if err != nil {
return err
}
r := builder.
NamespaceParam(o.Namespace).DefaultNamespace(). NamespaceParam(o.Namespace).DefaultNamespace().
FilenameParam(o.EnforceNamespace, &o.FilenameOptions). FilenameParam(o.EnforceNamespace, &o.FilenameOptions).
Latest(). Latest().
Flatten(). Flatten().
Do() Do()
err := r.Err() err = r.Err()
if err != nil { if err != nil {
return err return err
} }
......
...@@ -24,7 +24,6 @@ import ( ...@@ -24,7 +24,6 @@ import (
"github.com/ghodss/yaml" "github.com/ghodss/yaml"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"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"
...@@ -83,17 +82,17 @@ func NewCmdApplyViewLastApplied(f cmdutil.Factory, out, err io.Writer) *cobra.Co ...@@ -83,17 +82,17 @@ func NewCmdApplyViewLastApplied(f cmdutil.Factory, out, err io.Writer) *cobra.Co
} }
func (o *ViewLastAppliedOptions) Complete(f cmdutil.Factory, args []string) error { func (o *ViewLastAppliedOptions) Complete(f cmdutil.Factory, args []string) error {
mapper, typer, err := f.UnstructuredObject() cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
if err != nil { if err != nil {
return err return err
} }
cmdNamespace, enforceNamespace, err := f.DefaultNamespace() builder, err := f.NewUnstructuredBuilder(true)
if err != nil { if err != nil {
return err return err
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). r := builder.
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(enforceNamespace, args...). ResourceTypeOrNameArgs(enforceNamespace, args...).
......
...@@ -34,7 +34,6 @@ import ( ...@@ -34,7 +34,6 @@ import (
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
"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/resource"
"k8s.io/kubernetes/pkg/util/i18n" "k8s.io/kubernetes/pkg/util/i18n"
) )
...@@ -144,8 +143,7 @@ func (p *AttachOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn [ ...@@ -144,8 +143,7 @@ func (p *AttachOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn [
return cmdutil.UsageError(cmd, err.Error()) return cmdutil.UsageError(cmd, err.Error())
} }
mapper, typer := f.Object() builder := f.NewBuilder(true).
builder := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)).
NamespaceParam(namespace).DefaultNamespace() NamespaceParam(namespace).DefaultNamespace()
switch len(argsIn) { switch len(argsIn) {
......
...@@ -91,7 +91,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s ...@@ -91,7 +91,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s
} }
mapper, typer := f.Object() mapper, typer := f.Object()
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
...@@ -162,7 +162,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s ...@@ -162,7 +162,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s
object = hpa.Object object = hpa.Object
} }
if cmdutil.GetDryRunFlag(cmd) { if cmdutil.GetDryRunFlag(cmd) {
return f.PrintObject(cmd, mapper, object, out) return f.PrintObject(cmd, false, mapper, object, out)
} }
if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), hpa, f.JSONEncoder()); err != nil { if err := kubectl.CreateOrUpdateAnnotation(cmdutil.GetFlagBool(cmd, cmdutil.ApplyAnnotationsFlag), hpa, f.JSONEncoder()); err != nil {
...@@ -176,7 +176,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s ...@@ -176,7 +176,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s
count++ count++
if len(cmdutil.GetFlagString(cmd, "output")) > 0 { if len(cmdutil.GetFlagString(cmd, "output")) > 0 {
return f.PrintObject(cmd, mapper, object, out) return f.PrintObject(cmd, false, mapper, object, out)
} }
cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, cmdutil.GetDryRunFlag(cmd), "autoscaled") cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, cmdutil.GetDryRunFlag(cmd), "autoscaled")
......
...@@ -162,12 +162,12 @@ func (options *CertificateOptions) RunCertificateDeny(f cmdutil.Factory, out io. ...@@ -162,12 +162,12 @@ func (options *CertificateOptions) RunCertificateDeny(f cmdutil.Factory, out io.
func (options *CertificateOptions) modifyCertificateCondition(f cmdutil.Factory, out io.Writer, modify func(csr *certificates.CertificateSigningRequest) (*certificates.CertificateSigningRequest, string)) error { func (options *CertificateOptions) modifyCertificateCondition(f cmdutil.Factory, out io.Writer, modify func(csr *certificates.CertificateSigningRequest) (*certificates.CertificateSigningRequest, string)) error {
var found int var found int
mapper, typer := f.Object() mapper, _ := f.Object()
c, err := f.ClientSet() c, err := f.ClientSet()
if err != nil { if err != nil {
return err return err
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
ContinueOnError(). ContinueOnError().
FilenameParam(false, &options.FilenameOptions). FilenameParam(false, &options.FilenameOptions).
ResourceNames("certificatesigningrequest", options.csrNames...). ResourceNames("certificatesigningrequest", options.csrNames...).
......
...@@ -65,14 +65,13 @@ func RunClusterInfo(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error ...@@ -65,14 +65,13 @@ func RunClusterInfo(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error
} }
printService(out, "Kubernetes master", client.Host) printService(out, "Kubernetes master", client.Host)
mapper, typer := f.Object()
cmdNamespace := cmdutil.GetFlagString(cmd, "namespace") cmdNamespace := cmdutil.GetFlagString(cmd, "namespace")
if cmdNamespace == "" { if cmdNamespace == "" {
cmdNamespace = metav1.NamespaceSystem cmdNamespace = metav1.NamespaceSystem
} }
// TODO use generalized labels once they are implemented (#341) // TODO use generalized labels once they are implemented (#341)
b := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). b := f.NewBuilder(true).
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"}...).
......
...@@ -197,7 +197,7 @@ func Example_printReplicationControllerWithNamespace() { ...@@ -197,7 +197,7 @@ func Example_printReplicationControllerWithNamespace() {
}, },
} }
mapper, _ := f.Object() mapper, _ := f.Object()
err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) err := f.PrintObject(cmd, false, mapper, ctrl, os.Stdout)
if err != nil { if err != nil {
fmt.Printf("Unexpected error: %v", err) fmt.Printf("Unexpected error: %v", err)
} }
...@@ -252,7 +252,7 @@ func Example_printMultiContainersReplicationControllerWithWide() { ...@@ -252,7 +252,7 @@ func Example_printMultiContainersReplicationControllerWithWide() {
}, },
} }
mapper, _ := f.Object() mapper, _ := f.Object()
err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) err := f.PrintObject(cmd, false, mapper, ctrl, os.Stdout)
if err != nil { if err != nil {
fmt.Printf("Unexpected error: %v", err) fmt.Printf("Unexpected error: %v", err)
} }
...@@ -306,7 +306,7 @@ func Example_printReplicationController() { ...@@ -306,7 +306,7 @@ func Example_printReplicationController() {
}, },
} }
mapper, _ := f.Object() mapper, _ := f.Object()
err := f.PrintObject(cmd, mapper, ctrl, os.Stdout) err := f.PrintObject(cmd, false, mapper, ctrl, os.Stdout)
if err != nil { if err != nil {
fmt.Printf("Unexpected error: %v", err) fmt.Printf("Unexpected error: %v", err)
} }
...@@ -349,7 +349,7 @@ func Example_printPodWithWideFormat() { ...@@ -349,7 +349,7 @@ func Example_printPodWithWideFormat() {
}, },
} }
mapper, _ := f.Object() mapper, _ := f.Object()
err := f.PrintObject(cmd, mapper, pod, os.Stdout) err := f.PrintObject(cmd, false, mapper, pod, os.Stdout)
if err != nil { if err != nil {
fmt.Printf("Unexpected error: %v", err) fmt.Printf("Unexpected error: %v", err)
} }
...@@ -395,7 +395,7 @@ func Example_printPodWithShowLabels() { ...@@ -395,7 +395,7 @@ func Example_printPodWithShowLabels() {
}, },
} }
mapper, _ := f.Object() mapper, _ := f.Object()
err := f.PrintObject(cmd, mapper, pod, os.Stdout) err := f.PrintObject(cmd, false, mapper, pod, os.Stdout)
if err != nil { if err != nil {
fmt.Printf("Unexpected error: %v", err) fmt.Printf("Unexpected error: %v", err)
} }
...@@ -519,7 +519,7 @@ func Example_printPodHideTerminated() { ...@@ -519,7 +519,7 @@ func Example_printPodHideTerminated() {
} }
for _, pod := range filteredPodList { for _, pod := range filteredPodList {
mapper, _ := f.Object() mapper, _ := f.Object()
err := f.PrintObject(cmd, mapper, pod, os.Stdout) err := f.PrintObject(cmd, false, mapper, pod, os.Stdout)
if err != nil { if err != nil {
fmt.Printf("Unexpected error: %v", err) fmt.Printf("Unexpected error: %v", err)
} }
...@@ -547,7 +547,7 @@ func Example_printPodShowAll() { ...@@ -547,7 +547,7 @@ func Example_printPodShowAll() {
cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr) cmd := NewCmdRun(f, os.Stdin, os.Stdout, os.Stderr)
podList := newAllPhasePodList() podList := newAllPhasePodList()
mapper, _ := f.Object() mapper, _ := f.Object()
err := f.PrintObject(cmd, mapper, podList, os.Stdout) err := f.PrintObject(cmd, false, mapper, podList, os.Stdout)
if err != nil { if err != nil {
fmt.Printf("Unexpected error: %v", err) fmt.Printf("Unexpected error: %v", err)
} }
...@@ -622,7 +622,7 @@ func Example_printServiceWithNamespacesAndLabels() { ...@@ -622,7 +622,7 @@ func Example_printServiceWithNamespacesAndLabels() {
ld := strings.NewLineDelimiter(os.Stdout, "|") ld := strings.NewLineDelimiter(os.Stdout, "|")
defer ld.Flush() defer ld.Flush()
mapper, _ := f.Object() mapper, _ := f.Object()
err := f.PrintObject(cmd, mapper, svc, ld) err := f.PrintObject(cmd, false, mapper, svc, ld)
if err != nil { if err != nil {
fmt.Printf("Unexpected error: %v", err) fmt.Printf("Unexpected error: %v", err)
} }
......
...@@ -19,7 +19,6 @@ package cmd ...@@ -19,7 +19,6 @@ package cmd
import ( import (
"fmt" "fmt"
"io" "io"
"os"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
...@@ -127,14 +126,8 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C ...@@ -127,14 +126,8 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C
} }
// build the builder // build the builder
mapper, typer := f.Object() o.builder = f.NewBuilder(!o.local)
clientMapper := resource.ClientMapperFunc(f.ClientForMapping) if !o.local {
if o.local {
fmt.Fprintln(os.Stderr, "running in local mode...")
o.builder = resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.DisabledClientForMapping{ClientMapper: clientMapper}, f.Decoder(true))
} else {
o.builder = resource.NewBuilder(mapper, f.CategoryExpander(), typer, clientMapper, f.Decoder(true))
schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir")) schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"), cmdutil.GetFlagString(cmd, "schema-cache-dir"))
if err != nil { if err != nil {
return err return err
...@@ -164,7 +157,7 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C ...@@ -164,7 +157,7 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C
cmd.Flags().Set("output", outputFormat) cmd.Flags().Set("output", outputFormat)
} }
o.encoder = f.JSONEncoder() o.encoder = f.JSONEncoder()
o.printer, err = f.PrinterForCommand(cmd, nil, printers.PrintOptions{}) o.printer, err = f.PrinterForCommand(cmd, o.local, nil, printers.PrintOptions{})
if err != nil { if err != nil {
return err return err
} }
......
...@@ -23,7 +23,6 @@ import ( ...@@ -23,7 +23,6 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
"k8s.io/kubernetes/pkg/kubectl/cmd/templates" "k8s.io/kubernetes/pkg/kubectl/cmd/templates"
...@@ -125,11 +124,17 @@ func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opt ...@@ -125,11 +124,17 @@ func RunCreate(f cmdutil.Factory, cmd *cobra.Command, out, errOut io.Writer, opt
return err return err
} }
mapper, typer, err := f.UnstructuredObject() mapper, _, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme).
builder, err := f.NewUnstructuredBuilder(true)
if err != nil {
return err
}
r := builder.
Schema(schema). Schema(schema).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
...@@ -290,5 +295,5 @@ func RunCreateSubcommand(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, o ...@@ -290,5 +295,5 @@ func RunCreateSubcommand(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, o
return nil return nil
} }
return f.PrintObject(cmd, mapper, obj, out) return f.PrintObject(cmd, false, mapper, obj, out)
} }
...@@ -199,7 +199,7 @@ func (c *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args ...@@ -199,7 +199,7 @@ func (c *CreateRoleOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args
} }
c.PrintObject = func(obj runtime.Object) error { c.PrintObject = func(obj runtime.Object) error {
return f.PrintObject(cmd, c.Mapper, obj, c.Out) return f.PrintObject(cmd, false, c.Mapper, obj, c.Out)
} }
clientSet, err := f.ClientSet() clientSet, err := f.ClientSet()
......
...@@ -26,7 +26,6 @@ import ( ...@@ -26,7 +26,6 @@ import (
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"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/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/kubernetes/pkg/kubectl" "k8s.io/kubernetes/pkg/kubectl"
"k8s.io/kubernetes/pkg/kubectl/cmd/templates" "k8s.io/kubernetes/pkg/kubectl/cmd/templates"
...@@ -170,12 +169,18 @@ func (o *DeleteOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args ...@@ -170,12 +169,18 @@ func (o *DeleteOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args
} }
// Set up client based support. // Set up client based support.
mapper, typer, err := f.UnstructuredObject() mapper, _, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
builder, err := f.NewUnstructuredBuilder(true)
if err != nil {
return err
}
o.Mapper = mapper o.Mapper = mapper
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). r := builder.
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
......
...@@ -115,11 +115,12 @@ func RunDescribe(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, a ...@@ -115,11 +115,12 @@ func RunDescribe(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, a
return cmdutil.UsageError(cmd, "Required resource not specified.") return cmdutil.UsageError(cmd, "Required resource not specified.")
} }
mapper, typer, err := f.UnstructuredObject() builder, err := f.NewUnstructuredBuilder(true)
if err != nil { if err != nil {
return err return err
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme).
r := builder.
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces).
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
......
...@@ -215,7 +215,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { ...@@ -215,7 +215,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error {
return err return err
} }
r := o.Factory.NewBuilder(). r := o.Factory.NewBuilder(true).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
ResourceNames("node", args[0]). ResourceNames("node", args[0]).
Do() Do()
......
...@@ -127,7 +127,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri ...@@ -127,7 +127,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri
} }
mapper, typer := f.Object() mapper, typer := f.Object()
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
...@@ -255,7 +255,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri ...@@ -255,7 +255,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri
info.Refresh(object, true) info.Refresh(object, true)
if cmdutil.GetDryRunFlag(cmd) { if cmdutil.GetDryRunFlag(cmd) {
if len(cmdutil.GetFlagString(cmd, "output")) > 0 { if len(cmdutil.GetFlagString(cmd, "output")) > 0 {
return f.PrintObject(cmd, mapper, object, out) return f.PrintObject(cmd, false, mapper, object, out)
} }
cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, true, "exposed") cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, true, "exposed")
return nil return nil
...@@ -271,7 +271,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri ...@@ -271,7 +271,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri
} }
if len(cmdutil.GetFlagString(cmd, "output")) > 0 { if len(cmdutil.GetFlagString(cmd, "output")) > 0 {
return f.PrintObject(cmd, mapper, object, out) return f.PrintObject(cmd, false, mapper, object, out)
} }
cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, false, "exposed") cmdutil.PrintSuccess(mapper, false, out, info.Mapping.Resource, info.Name, false, "exposed")
......
...@@ -168,10 +168,11 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ ...@@ -168,10 +168,11 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
selector := cmdutil.GetFlagString(cmd, "selector") selector := cmdutil.GetFlagString(cmd, "selector")
allNamespaces := cmdutil.GetFlagBool(cmd, "all-namespaces") allNamespaces := cmdutil.GetFlagBool(cmd, "all-namespaces")
showKind := cmdutil.GetFlagBool(cmd, "show-kind") showKind := cmdutil.GetFlagBool(cmd, "show-kind")
mapper, typer, err := f.UnstructuredObject() builder, err := f.NewUnstructuredBuilder(true)
if err != nil { if err != nil {
return err return err
} }
cmdNamespace, enforceNamespace, err := f.DefaultNamespace() cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
if err != nil { if err != nil {
return err return err
...@@ -201,7 +202,12 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ ...@@ -201,7 +202,12 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
// handle watch separately since we cannot watch multiple resource types // handle watch separately since we cannot watch multiple resource types
isWatch, isWatchOnly := cmdutil.GetFlagBool(cmd, "watch"), cmdutil.GetFlagBool(cmd, "watch-only") isWatch, isWatchOnly := cmdutil.GetFlagBool(cmd, "watch"), cmdutil.GetFlagBool(cmd, "watch-only")
if isWatch || isWatchOnly { if isWatch || isWatchOnly {
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). builder, err := f.NewUnstructuredBuilder(true)
if err != nil {
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).
...@@ -210,7 +216,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ ...@@ -210,7 +216,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
SingleResourceType(). SingleResourceType().
Latest(). Latest().
Do() Do()
err := r.Err() err = r.Err()
if err != nil { if err != nil {
return err return err
} }
...@@ -226,7 +232,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ ...@@ -226,7 +232,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
} }
info := infos[0] info := infos[0]
mapping := info.ResourceMapping() mapping := info.ResourceMapping()
printer, err := f.PrinterForMapping(cmd, nil, mapping, allNamespaces) printer, err := f.PrinterForMapping(cmd, false, nil, mapping, allNamespaces)
if err != nil { if err != nil {
return err return err
} }
...@@ -291,7 +297,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ ...@@ -291,7 +297,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
return nil return nil
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). r := builder.
NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces). NamespaceParam(cmdNamespace).DefaultNamespace().AllNamespaces(allNamespaces).
FilenameParam(enforceNamespace, &options.FilenameOptions). FilenameParam(enforceNamespace, &options.FilenameOptions).
SelectorParam(selector). SelectorParam(selector).
...@@ -306,7 +312,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ ...@@ -306,7 +312,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
return err return err
} }
printer, err := f.PrinterForCommand(cmd, nil, printers.PrintOptions{}) printer, err := f.PrinterForCommand(cmd, false, nil, printers.PrintOptions{})
if err != nil { if err != nil {
return err return err
} }
...@@ -455,7 +461,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [ ...@@ -455,7 +461,7 @@ func RunGet(f cmdutil.Factory, out, errOut io.Writer, cmd *cobra.Command, args [
outputOpts, _ = outputOptsForMappingFromOpenAPI(f, cmdutil.GetOpenAPICacheDir(cmd), mapping) outputOpts, _ = outputOptsForMappingFromOpenAPI(f, cmdutil.GetOpenAPICacheDir(cmd), mapping)
} }
printer, err = f.PrinterForMapping(cmd, outputOpts, mapping, allNamespaces) printer, err = f.PrinterForMapping(cmd, false, outputOpts, mapping, allNamespaces)
if err != nil { if err != nil {
if !errs.Has(err.Error()) { if !errs.Has(err.Error()) {
errs.Insert(err.Error()) errs.Insert(err.Error())
......
...@@ -28,7 +28,6 @@ import ( ...@@ -28,7 +28,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/types" "k8s.io/apimachinery/pkg/types"
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
...@@ -181,11 +180,12 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error { ...@@ -181,11 +180,12 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error {
changeCause := f.Command(cmd, false) changeCause := f.Command(cmd, false)
mapper, typer, err := f.UnstructuredObject() builder, err := f.NewUnstructuredBuilder(!o.local)
if err != nil { if err != nil {
return err return err
} }
b := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme).
b := builder.
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
...@@ -220,6 +220,7 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error { ...@@ -220,6 +220,7 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error {
if err != nil { if err != nil {
return err return err
} }
dataChangeMsg = "labeled"
outputObj = info.Object outputObj = info.Object
} else { } else {
obj := info.Object obj := info.Object
...@@ -275,8 +276,18 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error { ...@@ -275,8 +276,18 @@ func (o *LabelOptions) RunLabel(f cmdutil.Factory, cmd *cobra.Command) error {
return err return err
} }
} }
var mapper meta.RESTMapper
if o.local {
mapper, _ = f.Object()
} else {
mapper, _, err = f.UnstructuredObject()
if err != nil {
return err
}
}
if o.outputFormat != "" { if o.outputFormat != "" {
return f.PrintObject(cmd, mapper, outputObj, o.out) return f.PrintObject(cmd, o.local, mapper, outputObj, o.out)
} }
cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, o.dryrun, dataChangeMsg) cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, o.dryrun, dataChangeMsg)
return nil return nil
......
...@@ -32,7 +32,6 @@ import ( ...@@ -32,7 +32,6 @@ import (
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
"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/resource"
"k8s.io/kubernetes/pkg/kubectl/util" "k8s.io/kubernetes/pkg/kubectl/util"
"k8s.io/kubernetes/pkg/util/i18n" "k8s.io/kubernetes/pkg/util/i18n"
) )
...@@ -75,10 +74,9 @@ type LogsOptions struct { ...@@ -75,10 +74,9 @@ type LogsOptions struct {
ResourceArg string ResourceArg string
Options runtime.Object Options runtime.Object
Mapper meta.RESTMapper Mapper meta.RESTMapper
Typer runtime.ObjectTyper Typer runtime.ObjectTyper
ClientMapper resource.ClientMapper Decoder runtime.Decoder
Decoder runtime.Decoder
Object runtime.Object Object runtime.Object
GetPodTimeout time.Duration GetPodTimeout time.Duration
...@@ -181,7 +179,6 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm ...@@ -181,7 +179,6 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm
} }
o.Options = logOptions o.Options = logOptions
o.LogsForObject = f.LogsForObject o.LogsForObject = f.LogsForObject
o.ClientMapper = resource.ClientMapperFunc(f.ClientForMapping)
o.Out = out o.Out = out
if len(selector) != 0 { if len(selector) != 0 {
...@@ -196,10 +193,8 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm ...@@ -196,10 +193,8 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm
} }
} }
mapper, typer := f.Object()
decoder := f.Decoder(true)
if o.Object == nil { if o.Object == nil {
builder := resource.NewBuilder(mapper, f.CategoryExpander(), typer, o.ClientMapper, decoder). builder := f.NewBuilder(true).
NamespaceParam(o.Namespace).DefaultNamespace(). NamespaceParam(o.Namespace).DefaultNamespace().
SingleResourceType() SingleResourceType()
if o.ResourceArg != "" { if o.ResourceArg != "" {
......
...@@ -149,11 +149,14 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin ...@@ -149,11 +149,14 @@ 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)
} }
mapper, typer, err := f.UnstructuredObject() // TODO: fix --local to work with thirdpartyresources without making use of the discovery client.
// https://github.com/kubernetes/kubernetes/issues/46722
builder, err := f.NewUnstructuredBuilder(true)
if err != nil { if err != nil {
return err return err
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme).
r := builder.
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &options.FilenameOptions). FilenameParam(enforceNamespace, &options.FilenameOptions).
...@@ -220,6 +223,10 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin ...@@ -220,6 +223,10 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin
if len(options.OutputFormat) > 0 && options.OutputFormat != "name" { if len(options.OutputFormat) > 0 && options.OutputFormat != "name" {
return cmdutil.PrintResourceInfoForCommand(cmd, info, f, out) return cmdutil.PrintResourceInfoForCommand(cmd, info, f, out)
} }
mapper, _, err := f.UnstructuredObject()
if err != nil {
return err
}
cmdutil.PrintSuccess(mapper, options.OutputFormat == "name", out, info.Mapping.Resource, info.Name, false, dataChangedMsg) cmdutil.PrintSuccess(mapper, options.OutputFormat == "name", out, info.Mapping.Resource, info.Name, false, dataChangedMsg)
return nil return nil
} }
...@@ -230,14 +237,17 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin ...@@ -230,14 +237,17 @@ func RunPatch(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin
if err != nil { if err != nil {
return err return err
} }
originalPatchedObjJS, err := getPatchedJSON(patchType, originalObjJS, patchBytes, mapping.GroupVersionKind, api.Scheme) originalPatchedObjJS, err := getPatchedJSON(patchType, originalObjJS, patchBytes, mapping.GroupVersionKind, api.Scheme)
if err != nil { if err != nil {
return err return err
} }
targetObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, originalPatchedObjJS) targetObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, originalPatchedObjJS)
if err != nil { if err != nil {
return err return err
} }
// TODO: if we ever want to go generic, this allows a clean -o yaml without trying to print columns or anything // TODO: if we ever want to go generic, this allows a clean -o yaml without trying to print columns or anything
// rawExtension := &runtime.Unknown{ // rawExtension := &runtime.Unknown{
// Raw: originalPatchedObjJS, // Raw: originalPatchedObjJS,
......
...@@ -120,11 +120,17 @@ func RunReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []str ...@@ -120,11 +120,17 @@ 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, typer, err := f.UnstructuredObject() mapper, _, err := f.UnstructuredObject()
if err != nil { if err != nil {
return err return err
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme).
builder, err := f.NewUnstructuredBuilder(true)
if err != nil {
return err
}
r := builder.
Schema(schema). Schema(schema).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
...@@ -244,7 +250,12 @@ func forceReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s ...@@ -244,7 +250,12 @@ func forceReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s
}) })
}) })
r = resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme). builder, err := f.NewUnstructuredBuilder(true)
if err != nil {
return err
}
r = builder.
Schema(schema). Schema(schema).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
......
...@@ -199,7 +199,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args ...@@ -199,7 +199,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args
return err return err
} }
request := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). request := f.NewBuilder(true).
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}}).
...@@ -328,10 +328,10 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args ...@@ -328,10 +328,10 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args
oldRcData.WriteString(oldRc.Name) oldRcData.WriteString(oldRc.Name)
newRcData.WriteString(newRc.Name) newRcData.WriteString(newRc.Name)
} else { } else {
if err := f.PrintObject(cmd, mapper, oldRc, oldRcData); err != nil { if err := f.PrintObject(cmd, false, mapper, oldRc, oldRcData); err != nil {
return err return err
} }
if err := f.PrintObject(cmd, mapper, newRc, newRcData); err != nil { if err := f.PrintObject(cmd, false, mapper, newRc, newRcData); err != nil {
return err return err
} }
} }
...@@ -376,7 +376,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args ...@@ -376,7 +376,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args
return err return err
} }
if outputFormat != "" { if outputFormat != "" {
return f.PrintObject(cmd, mapper, newRc, out) return f.PrintObject(cmd, false, mapper, newRc, out)
} }
cmdutil.PrintSuccess(mapper, false, out, "replicationcontrollers", oldName, dryrun, message) cmdutil.PrintSuccess(mapper, false, out, "replicationcontrollers", oldName, dryrun, message)
return nil return nil
......
...@@ -74,14 +74,12 @@ func RunHistory(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []str ...@@ -74,14 +74,12 @@ func RunHistory(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []str
return fmt.Errorf("revision must be a positive integer: %v", revision) return fmt.Errorf("revision must be a positive integer: %v", revision)
} }
mapper, typer := f.Object()
cmdNamespace, enforceNamespace, err := f.DefaultNamespace() cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
if err != nil { if err != nil {
return err return err
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -111,7 +111,7 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i ...@@ -111,7 +111,7 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i
return err return err
} }
r := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -109,7 +109,7 @@ func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out ...@@ -109,7 +109,7 @@ func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out
return err return err
} }
r := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -77,14 +77,12 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri ...@@ -77,14 +77,12 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri
return cmdutil.UsageError(cmd, "Required resource not specified.") return cmdutil.UsageError(cmd, "Required resource not specified.")
} }
mapper, typer := f.Object()
cmdNamespace, enforceNamespace, err := f.DefaultNamespace() cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
if err != nil { if err != nil {
return err return err
} }
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -110,7 +110,7 @@ func (o *UndoOptions) CompleteUndo(f cmdutil.Factory, cmd *cobra.Command, out io ...@@ -110,7 +110,7 @@ func (o *UndoOptions) CompleteUndo(f cmdutil.Factory, cmd *cobra.Command, out io
return err return err
} }
r := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -331,8 +331,7 @@ func Run(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cobr ...@@ -331,8 +331,7 @@ func Run(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cobr
if err != nil { if err != nil {
return err return err
} }
_, typer := f.Object() r := f.NewBuilder(true).
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)).
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
ResourceNames(mapping.Resource, name). ResourceNames(mapping.Resource, name).
...@@ -379,7 +378,7 @@ func Run(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cobr ...@@ -379,7 +378,7 @@ func Run(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *cobr
outputFormat := cmdutil.GetFlagString(cmd, "output") outputFormat := cmdutil.GetFlagString(cmd, "output")
if outputFormat != "" || cmdutil.GetDryRunFlag(cmd) { if outputFormat != "" || cmdutil.GetDryRunFlag(cmd) {
return f.PrintObject(cmd, mapper, obj, cmdOut) return f.PrintObject(cmd, false, mapper, obj, cmdOut)
} }
cmdutil.PrintSuccess(mapper, false, cmdOut, mapping.Resource, args[0], cmdutil.GetDryRunFlag(cmd), "created") cmdutil.PrintSuccess(mapper, false, cmdOut, mapping.Resource, args[0], cmdutil.GetDryRunFlag(cmd), "created")
return nil return nil
...@@ -556,7 +555,7 @@ func generateService(f cmdutil.Factory, cmd *cobra.Command, args []string, servi ...@@ -556,7 +555,7 @@ func generateService(f cmdutil.Factory, cmd *cobra.Command, args []string, servi
} }
if cmdutil.GetFlagString(cmd, "output") != "" || cmdutil.GetDryRunFlag(cmd) { if cmdutil.GetFlagString(cmd, "output") != "" || cmdutil.GetDryRunFlag(cmd) {
err := f.PrintObject(cmd, mapper, obj, out) err := f.PrintObject(cmd, false, mapper, obj, out)
if err != nil { if err != nil {
return err return err
} }
......
...@@ -98,8 +98,8 @@ func RunScale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin ...@@ -98,8 +98,8 @@ func RunScale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin
return err return err
} }
mapper, typer := f.Object() mapper, _ := f.Object()
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
......
...@@ -54,7 +54,7 @@ type ImageOptions struct { ...@@ -54,7 +54,7 @@ type ImageOptions struct {
Cmd *cobra.Command Cmd *cobra.Command
ResolveImage func(in string) (string, error) ResolveImage func(in string) (string, error)
PrintObject func(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error PrintObject func(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error
UpdatePodSpecForObject func(obj runtime.Object, fn func(*api.PodSpec) error) (bool, error) UpdatePodSpecForObject func(obj runtime.Object, fn func(*api.PodSpec) error) (bool, error)
Resources []string Resources []string
ContainerImages map[string]string ContainerImages map[string]string
...@@ -137,7 +137,7 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st ...@@ -137,7 +137,7 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st
return err return err
} }
builder := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). builder := f.NewBuilder(!o.Local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
...@@ -227,7 +227,7 @@ func (o *ImageOptions) Run() error { ...@@ -227,7 +227,7 @@ func (o *ImageOptions) Run() error {
} }
if o.PrintObject != nil && (o.Local || o.DryRun) { if o.PrintObject != nil && (o.Local || o.DryRun) {
return o.PrintObject(o.Cmd, o.Mapper, info.Object, o.Out) return o.PrintObject(o.Cmd, o.Local, o.Mapper, info.Object, o.Out)
} }
// patch the change // patch the change
...@@ -250,7 +250,7 @@ func (o *ImageOptions) Run() error { ...@@ -250,7 +250,7 @@ func (o *ImageOptions) Run() error {
info.Refresh(obj, true) info.Refresh(obj, true)
if len(o.Output) > 0 { if len(o.Output) > 0 {
return o.PrintObject(o.Cmd, o.Mapper, obj, o.Out) return o.PrintObject(o.Cmd, o.Local, o.Mapper, obj, o.Out)
} }
cmdutil.PrintSuccess(o.Mapper, o.ShortOutput, o.Out, info.Mapping.Resource, info.Name, o.DryRun, "image updated") cmdutil.PrintSuccess(o.Mapper, o.ShortOutput, o.Out, info.Mapping.Resource, info.Name, o.DryRun, "image updated")
} }
......
...@@ -81,7 +81,7 @@ type ResourcesOptions struct { ...@@ -81,7 +81,7 @@ type ResourcesOptions struct {
Requests string Requests string
ResourceRequirements api.ResourceRequirements ResourceRequirements api.ResourceRequirements
PrintObject func(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error PrintObject func(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error
UpdatePodSpecForObject func(obj runtime.Object, fn func(*api.PodSpec) error) (bool, error) UpdatePodSpecForObject func(obj runtime.Object, fn func(*api.PodSpec) error) (bool, error)
Resources []string Resources []string
} }
...@@ -141,12 +141,13 @@ func (o *ResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args ...@@ -141,12 +141,13 @@ func (o *ResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args
return err return err
} }
builder := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). builder := f.NewBuilder(!o.Local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
//FilenameParam(enforceNamespace, o.Filenames...). //FilenameParam(enforceNamespace, o.Filenames...).
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
Flatten() Flatten()
if !o.Local { if !o.Local {
builder = builder. builder = builder.
SelectorParam(o.Selector). SelectorParam(o.Selector).
...@@ -223,7 +224,7 @@ func (o *ResourcesOptions) Run() error { ...@@ -223,7 +224,7 @@ func (o *ResourcesOptions) Run() error {
} }
if o.Local || cmdutil.GetDryRunFlag(o.Cmd) { if o.Local || cmdutil.GetDryRunFlag(o.Cmd) {
return o.PrintObject(o.Cmd, o.Mapper, info.Object, o.Out) return o.PrintObject(o.Cmd, o.Local, o.Mapper, info.Object, 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)
......
...@@ -117,14 +117,20 @@ func (o *SelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [ ...@@ -117,14 +117,20 @@ func (o *SelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [
o.mapper = mapper o.mapper = mapper
o.encoder = f.JSONEncoder() o.encoder = f.JSONEncoder()
o.builder = f.NewBuilder(). o.builder = f.NewBuilder(!o.local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.fileOptions). FilenameParam(enforceNamespace, &o.fileOptions).
Flatten() Flatten()
if !o.local {
o.builder = o.builder.
ResourceTypeOrNameArgs(o.all, o.resources...).
Latest()
}
o.PrintObject = func(obj runtime.Object) error { o.PrintObject = func(obj runtime.Object) error {
return f.PrintObject(cmd, mapper, obj, o.out) return f.PrintObject(cmd, o.local, mapper, obj, o.out)
} }
o.ClientForMapping = func(mapping *meta.RESTMapping) (resource.RESTClient, error) { o.ClientForMapping = func(mapping *meta.RESTMapping) (resource.RESTClient, error) {
return f.ClientForMapping(mapping) return f.ClientForMapping(mapping)
...@@ -147,10 +153,6 @@ func (o *SelectorOptions) Validate() error { ...@@ -147,10 +153,6 @@ func (o *SelectorOptions) Validate() error {
// RunSelector executes the command. // RunSelector executes the command.
func (o *SelectorOptions) RunSelector() error { func (o *SelectorOptions) RunSelector() error {
if !o.local {
o.builder = o.builder.ResourceTypeOrNameArgs(o.all, o.resources...).
Latest()
}
r := o.builder.Do() r := o.builder.Do()
err := r.Err() err := r.Err()
if err != nil { if err != nil {
......
...@@ -115,7 +115,7 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] ...@@ -115,7 +115,7 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []
o.ShortOutput = cmdutil.GetFlagString(cmd, "output") == "name" o.ShortOutput = cmdutil.GetFlagString(cmd, "output") == "name"
o.DryRun = cmdutil.GetDryRunFlag(cmd) o.DryRun = cmdutil.GetDryRunFlag(cmd)
o.PrintObject = func(mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { o.PrintObject = func(mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error {
return f.PrintObject(cmd, mapper, obj, out) return f.PrintObject(cmd, o.Local, mapper, obj, out)
} }
cmdNamespace, enforceNamespace, err := f.DefaultNamespace() cmdNamespace, enforceNamespace, err := f.DefaultNamespace()
...@@ -123,11 +123,12 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] ...@@ -123,11 +123,12 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []
return err return err
} }
builder := resource.NewBuilder(o.Mapper, f.CategoryExpander(), o.Typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). builder := f.NewBuilder(!o.Local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
Flatten() Flatten()
if !o.Local { if !o.Local {
builder = builder. builder = builder.
SelectorParam(o.Selector). SelectorParam(o.Selector).
......
...@@ -83,8 +83,8 @@ func RunStop(f cmdutil.Factory, cmd *cobra.Command, args []string, out io.Writer ...@@ -83,8 +83,8 @@ func RunStop(f cmdutil.Factory, cmd *cobra.Command, args []string, out io.Writer
return err return err
} }
mapper, typer := f.Object() mapper, _ := f.Object()
r := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)). r := f.NewBuilder(true).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
ResourceTypeOrNameArgs(false, args...). ResourceTypeOrNameArgs(false, args...).
......
...@@ -246,8 +246,7 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com ...@@ -246,8 +246,7 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com
if o.taintsToAdd, o.taintsToRemove, err = parseTaints(taintArgs); err != nil { if o.taintsToAdd, o.taintsToRemove, err = parseTaints(taintArgs); err != nil {
return cmdutil.UsageError(cmd, err.Error()) return cmdutil.UsageError(cmd, err.Error())
} }
mapper, typer := f.Object() o.builder = f.NewBuilder(true).
o.builder = resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.ClientForMapping), f.Decoder(true)).
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace() NamespaceParam(namespace).DefaultNamespace()
if o.selector != "" { if o.selector != "" {
...@@ -373,7 +372,7 @@ func (o TaintOptions) RunTaint() error { ...@@ -373,7 +372,7 @@ func (o TaintOptions) RunTaint() error {
mapper, _ := o.f.Object() mapper, _ := o.f.Object()
outputFormat := cmdutil.GetFlagString(o.cmd, "output") outputFormat := cmdutil.GetFlagString(o.cmd, "output")
if outputFormat != "" { if outputFormat != "" {
return o.f.PrintObject(o.cmd, mapper, outputObj, o.out) return o.f.PrintObject(o.cmd, false, mapper, outputObj, o.out)
} }
cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, false, operation) cmdutil.PrintSuccess(mapper, false, o.out, info.Mapping.Resource, info.Name, false, operation)
......
...@@ -29,6 +29,7 @@ go_library( ...@@ -29,6 +29,7 @@ go_library(
"//vendor/github.com/spf13/pflag:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured: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/runtime/serializer:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
......
...@@ -29,6 +29,7 @@ import ( ...@@ -29,6 +29,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/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"
...@@ -337,7 +338,7 @@ func (f *FakeFactory) Describer(*meta.RESTMapping) (printers.Describer, error) { ...@@ -337,7 +338,7 @@ func (f *FakeFactory) Describer(*meta.RESTMapping) (printers.Describer, error) {
return f.tf.Describer, f.tf.Err return f.tf.Describer, f.tf.Err
} }
func (f *FakeFactory) PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) { func (f *FakeFactory) PrinterForCommand(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) {
return f.tf.Printer, f.tf.Err return f.tf.Printer, f.tf.Err
} }
...@@ -457,18 +458,31 @@ func (f *FakeFactory) BindFlags(flags *pflag.FlagSet) { ...@@ -457,18 +458,31 @@ func (f *FakeFactory) BindFlags(flags *pflag.FlagSet) {
func (f *FakeFactory) BindExternalFlags(flags *pflag.FlagSet) { func (f *FakeFactory) BindExternalFlags(flags *pflag.FlagSet) {
} }
func (f *FakeFactory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { func (f *FakeFactory) PrintObject(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error {
return nil return nil
} }
func (f *FakeFactory) PrinterForMapping(cmd *cobra.Command, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) { func (f *FakeFactory) PrinterForMapping(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) {
return f.tf.Printer, f.tf.Err return f.tf.Printer, f.tf.Err
} }
func (f *FakeFactory) NewBuilder() *resource.Builder { func (f *FakeFactory) NewBuilder(allowRemoteCalls bool) *resource.Builder {
return nil return nil
} }
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 {
return &printers.PrintOptions{} return &printers.PrintOptions{}
} }
...@@ -618,7 +632,7 @@ func (f *fakeAPIFactory) UnstructuredClientForMapping(m *meta.RESTMapping) (reso ...@@ -618,7 +632,7 @@ func (f *fakeAPIFactory) UnstructuredClientForMapping(m *meta.RESTMapping) (reso
return f.tf.UnstructuredClient, f.tf.Err return f.tf.UnstructuredClient, f.tf.Err
} }
func (f *fakeAPIFactory) PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) { func (f *fakeAPIFactory) PrinterForCommand(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) {
return f.tf.Printer, f.tf.Err return f.tf.Printer, f.tf.Err
} }
...@@ -681,7 +695,7 @@ func (f *fakeAPIFactory) Generators(cmdName string) map[string]kubectl.Generator ...@@ -681,7 +695,7 @@ func (f *fakeAPIFactory) Generators(cmdName string) map[string]kubectl.Generator
return cmdutil.DefaultGenerators(cmdName) return cmdutil.DefaultGenerators(cmdName)
} }
func (f *fakeAPIFactory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { func (f *fakeAPIFactory) PrintObject(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error {
gvks, _, err := api.Scheme.ObjectKinds(obj) gvks, _, err := api.Scheme.ObjectKinds(obj)
if err != nil { if err != nil {
return err return err
...@@ -692,23 +706,36 @@ func (f *fakeAPIFactory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, ...@@ -692,23 +706,36 @@ func (f *fakeAPIFactory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper,
return err return err
} }
printer, err := f.PrinterForMapping(cmd, nil, mapping, false) printer, err := f.PrinterForMapping(cmd, isLocal, nil, mapping, false)
if err != nil { if err != nil {
return err return err
} }
return printer.PrintObj(obj, out) return printer.PrintObj(obj, out)
} }
func (f *fakeAPIFactory) PrinterForMapping(cmd *cobra.Command, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) { func (f *fakeAPIFactory) PrinterForMapping(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) {
return f.tf.Printer, f.tf.Err return f.tf.Printer, f.tf.Err
} }
func (f *fakeAPIFactory) NewBuilder() *resource.Builder { func (f *fakeAPIFactory) NewBuilder(allowRemoteCalls bool) *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{}
} }
......
...@@ -104,7 +104,11 @@ func (o *EditOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args [] ...@@ -104,7 +104,11 @@ func (o *EditOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args []
if err != nil { if err != nil {
return err return err
} }
b := resource.NewBuilder(mapper, f.CategoryExpander(), typer, resource.ClientMapperFunc(f.UnstructuredClientForMapping), unstructured.UnstructuredJSONScheme)
b, err := f.NewUnstructuredBuilder(true)
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()
......
...@@ -233,16 +233,18 @@ type BuilderFactory interface { ...@@ -233,16 +233,18 @@ type BuilderFactory interface {
// are declared on the command (see AddPrinterFlags). Returns a printer, or an error if a printer // are declared on the command (see AddPrinterFlags). Returns a printer, or an error if a printer
// could not be found. // could not be found.
// TODO: Break the dependency on cmd here. // TODO: Break the dependency on cmd here.
PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) PrinterForCommand(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error)
// PrinterForMapping returns a printer suitable for displaying the provided resource type. // PrinterForMapping returns a printer suitable for displaying the provided resource type.
// Requires that printer flags have been added to cmd (see AddPrinterFlags). // Requires that printer flags have been added to cmd (see AddPrinterFlags).
// Returns a printer, true if the printer is generic (is not internal), or // Returns a printer, true if the printer is generic (is not internal), or
// an error if a printer could not be found. // an error if a printer could not be found.
PrinterForMapping(cmd *cobra.Command, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) PrinterForMapping(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error)
// 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, 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() *resource.Builder NewBuilder(allowRemoteCalls bool) *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.
......
...@@ -28,6 +28,7 @@ import ( ...@@ -28,6 +28,7 @@ import (
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/kubectl/plugins" "k8s.io/kubernetes/pkg/kubectl/plugins"
"k8s.io/kubernetes/pkg/kubectl/resource" "k8s.io/kubernetes/pkg/kubectl/resource"
"k8s.io/kubernetes/pkg/printers" "k8s.io/kubernetes/pkg/printers"
...@@ -48,10 +49,19 @@ func NewBuilderFactory(clientAccessFactory ClientAccessFactory, objectMappingFac ...@@ -48,10 +49,19 @@ func NewBuilderFactory(clientAccessFactory ClientAccessFactory, objectMappingFac
return f return f
} }
func (f *ring2Factory) PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) { func (f *ring2Factory) PrinterForCommand(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, options printers.PrintOptions) (printers.ResourcePrinter, error) {
mapper, typer, err := f.objectMappingFactory.UnstructuredObject() var mapper meta.RESTMapper
if err != nil { var typer runtime.ObjectTyper
return nil, err var err error
if isLocal {
mapper = api.Registry.RESTMapper()
typer = api.Scheme
} else {
mapper, typer, err = f.objectMappingFactory.UnstructuredObject()
if err != nil {
return nil, err
}
} }
// TODO: used by the custom column implementation and the name implementation, break this dependency // TODO: used by the custom column implementation and the name implementation, break this dependency
decoders := []runtime.Decoder{f.clientAccessFactory.Decoder(true), unstructured.UnstructuredJSONScheme} decoders := []runtime.Decoder{f.clientAccessFactory.Decoder(true), unstructured.UnstructuredJSONScheme}
...@@ -59,7 +69,7 @@ func (f *ring2Factory) PrinterForCommand(cmd *cobra.Command, outputOpts *printer ...@@ -59,7 +69,7 @@ func (f *ring2Factory) PrinterForCommand(cmd *cobra.Command, outputOpts *printer
return PrinterForCommand(cmd, outputOpts, mapper, typer, encoder, decoders, options) return PrinterForCommand(cmd, outputOpts, mapper, typer, encoder, decoders, options)
} }
func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) { func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, isLocal bool, outputOpts *printers.OutputOptions, mapping *meta.RESTMapping, withNamespace bool) (printers.ResourcePrinter, error) {
// Some callers do not have "label-columns" so we can't use the GetFlagStringSlice() helper // Some callers do not have "label-columns" so we can't use the GetFlagStringSlice() helper
columnLabel, err := cmd.Flags().GetStringSlice("label-columns") columnLabel, err := cmd.Flags().GetStringSlice("label-columns")
if err != nil { if err != nil {
...@@ -76,7 +86,7 @@ func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, outputOpts *printer ...@@ -76,7 +86,7 @@ func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, outputOpts *printer
ColumnLabels: columnLabel, ColumnLabels: columnLabel,
} }
printer, err := f.PrinterForCommand(cmd, outputOpts, options) printer, err := f.PrinterForCommand(cmd, isLocal, outputOpts, options)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -108,7 +118,7 @@ func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, outputOpts *printer ...@@ -108,7 +118,7 @@ func (f *ring2Factory) PrinterForMapping(cmd *cobra.Command, outputOpts *printer
return printer, nil return printer, nil
} }
func (f *ring2Factory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error { func (f *ring2Factory) PrintObject(cmd *cobra.Command, isLocal bool, mapper meta.RESTMapper, obj runtime.Object, out io.Writer) error {
// try to get a typed object // try to get a typed object
_, typer := f.objectMappingFactory.Object() _, typer := f.objectMappingFactory.Object()
gvks, _, err := typer.ObjectKinds(obj) gvks, _, err := typer.ObjectKinds(obj)
...@@ -132,18 +142,46 @@ func (f *ring2Factory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, o ...@@ -132,18 +142,46 @@ func (f *ring2Factory) PrintObject(cmd *cobra.Command, mapper meta.RESTMapper, o
return err return err
} }
printer, err := f.PrinterForMapping(cmd, nil, mapping, false) printer, err := f.PrinterForMapping(cmd, isLocal, nil, mapping, false)
if err != nil { if err != nil {
return err return err
} }
return printer.PrintObj(obj, out) return printer.PrintObj(obj, out)
} }
func (f *ring2Factory) NewBuilder() *resource.Builder { // NewBuilder returns a new resource builder.
// Receives a bool flag and avoids remote calls if set to false
func (f *ring2Factory) NewBuilder(allowRemoteCalls bool) *resource.Builder {
var clientMapper resource.ClientMapper
clientMapperFunc := resource.ClientMapperFunc(f.objectMappingFactory.ClientForMapping)
mapper, typer := f.objectMappingFactory.Object() mapper, typer := f.objectMappingFactory.Object()
categoryExpander := f.objectMappingFactory.CategoryExpander() categoryExpander := f.objectMappingFactory.CategoryExpander()
return resource.NewBuilder(mapper, categoryExpander, typer, resource.ClientMapperFunc(f.objectMappingFactory.ClientForMapping), f.clientAccessFactory.Decoder(true)) if allowRemoteCalls {
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.
......
...@@ -129,12 +129,12 @@ func PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, m ...@@ -129,12 +129,12 @@ func PrinterForCommand(cmd *cobra.Command, outputOpts *printers.OutputOptions, m
// object passed is non-generic, it attempts to print the object using a HumanReadablePrinter. // object passed is non-generic, it attempts to print the object using a HumanReadablePrinter.
// Requires that printer flags have been added to cmd (see AddPrinterFlags). // Requires that printer flags have been added to cmd (see AddPrinterFlags).
func PrintResourceInfoForCommand(cmd *cobra.Command, info *resource.Info, f Factory, out io.Writer) error { func PrintResourceInfoForCommand(cmd *cobra.Command, info *resource.Info, f Factory, out io.Writer) error {
printer, err := f.PrinterForCommand(cmd, nil, printers.PrintOptions{}) printer, err := f.PrinterForCommand(cmd, false, nil, printers.PrintOptions{})
if err != nil { if err != nil {
return err return err
} }
if !printer.IsGeneric() { if !printer.IsGeneric() {
printer, err = f.PrinterForMapping(cmd, nil, nil, false) printer, err = f.PrinterForMapping(cmd, false, nil, nil, false)
if err != nil { if err != nil {
return err return err
} }
......
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