All commands must declare Unstructured or Internal

Callers must take a dependency on one or the other set of conversions and default client behavior. Future changes may add a Versioned() type, but this is an accurate reflection of current code state.
parent 04ab96d2
...@@ -144,6 +144,7 @@ func (p *AttachOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn [ ...@@ -144,6 +144,7 @@ func (p *AttachOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, argsIn [
} }
builder := f.NewBuilder(). builder := f.NewBuilder().
Internal().
NamespaceParam(namespace).DefaultNamespace() NamespaceParam(namespace).DefaultNamespace()
switch len(argsIn) { switch len(argsIn) {
......
...@@ -94,11 +94,13 @@ func (o *ReconcileOptions) Complete(cmd *cobra.Command, f cmdutil.Factory, args ...@@ -94,11 +94,13 @@ func (o *ReconcileOptions) Complete(cmd *cobra.Command, f cmdutil.Factory, args
} }
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
Flatten(). Flatten().
Do() Do()
if err := r.Err(); err != nil { if err := r.Err(); err != nil {
return err return err
} }
......
...@@ -91,6 +91,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s ...@@ -91,6 +91,7 @@ func RunAutoscale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s
} }
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
......
...@@ -168,6 +168,7 @@ func (options *CertificateOptions) modifyCertificateCondition(f cmdutil.Factory, ...@@ -168,6 +168,7 @@ func (options *CertificateOptions) modifyCertificateCondition(f cmdutil.Factory,
return err return err
} }
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
ContinueOnError(). ContinueOnError().
FilenameParam(false, &options.FilenameOptions). FilenameParam(false, &options.FilenameOptions).
ResourceNames("certificatesigningrequest", options.csrNames...). ResourceNames("certificatesigningrequest", options.csrNames...).
......
...@@ -73,6 +73,7 @@ func RunClusterInfo(f cmdutil.Factory, out io.Writer, cmd *cobra.Command) error ...@@ -73,6 +73,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(). b := f.NewBuilder().
Internal().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
LabelSelectorParam("kubernetes.io/cluster-service=true"). LabelSelectorParam("kubernetes.io/cluster-service=true").
ResourceTypeOrNameArgs(false, []string{"services"}...). ResourceTypeOrNameArgs(false, []string{"services"}...).
......
...@@ -128,7 +128,9 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C ...@@ -128,7 +128,9 @@ func (o *ConvertOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.C
} }
// build the builder // build the builder
o.builder = f.NewBuilder().LocalParam(o.local) o.builder = f.NewBuilder().
Internal().
LocalParam(o.local)
if !o.local { if !o.local {
schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate")) schema, err := f.Validator(cmdutil.GetFlagBool(cmd, "validate"))
if err != nil { if err != nil {
......
...@@ -444,13 +444,15 @@ func TestClusterRoleValidate(t *testing.T) { ...@@ -444,13 +444,15 @@ func TestClusterRoleValidate(t *testing.T) {
} }
for name, test := range tests { for name, test := range tests {
test.clusterRoleOptions.Mapper, _ = f.Object() t.Run(name, func(t *testing.T) {
err := test.clusterRoleOptions.Validate() test.clusterRoleOptions.Mapper, _ = f.Object()
if test.expectErr && err == nil { err := test.clusterRoleOptions.Validate()
t.Errorf("%s: expect error happens, but validate passes.", name) if test.expectErr && err == nil {
} t.Errorf("%s: expect error happens, but validate passes.", name)
if !test.expectErr && err != nil { }
t.Errorf("%s: unexpected error: %v", name, err) if !test.expectErr && err != nil {
} t.Errorf("%s: unexpected error: %v", name, err)
}
})
} }
} }
...@@ -25,6 +25,7 @@ import ( ...@@ -25,6 +25,7 @@ import (
rbac "k8s.io/api/rbac/v1" rbac "k8s.io/api/rbac/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/diff"
"k8s.io/client-go/rest/fake" "k8s.io/client-go/rest/fake"
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing" cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
) )
...@@ -143,19 +144,21 @@ func TestCreateRole(t *testing.T) { ...@@ -143,19 +144,21 @@ func TestCreateRole(t *testing.T) {
} }
for name, test := range tests { for name, test := range tests {
buf := bytes.NewBuffer([]byte{}) t.Run(name, func(t *testing.T) {
cmd := NewCmdCreateRole(f, buf) buf := bytes.NewBuffer([]byte{})
cmd.Flags().Set("dry-run", "true") cmd := NewCmdCreateRole(f, buf)
cmd.Flags().Set("output", "object") cmd.Flags().Set("dry-run", "true")
cmd.Flags().Set("verb", test.verbs) cmd.Flags().Set("output", "object")
cmd.Flags().Set("resource", test.resources) cmd.Flags().Set("verb", test.verbs)
if test.resourceNames != "" { cmd.Flags().Set("resource", test.resources)
cmd.Flags().Set("resource-name", test.resourceNames) if test.resourceNames != "" {
} cmd.Flags().Set("resource-name", test.resourceNames)
cmd.Run(cmd, []string{roleName}) }
if !reflect.DeepEqual(test.expectedRole, printer.CachedRole) { cmd.Run(cmd, []string{roleName})
t.Errorf("%s:\nexpected:\n%#v\nsaw:\n%#v", name, test.expectedRole, printer.CachedRole) if !reflect.DeepEqual(test.expectedRole, printer.CachedRole) {
} t.Errorf("%s", diff.ObjectReflectDiff(test.expectedRole, printer.CachedRole))
}
})
} }
} }
......
...@@ -176,7 +176,8 @@ func RunDescribe(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, a ...@@ -176,7 +176,8 @@ func RunDescribe(f cmdutil.Factory, out, cmdErr io.Writer, cmd *cobra.Command, a
} }
func DescribeMatchingResources(f cmdutil.Factory, namespace, rsrc, prefix string, describerSettings *printers.DescriberSettings, out io.Writer, originalError error) error { func DescribeMatchingResources(f cmdutil.Factory, namespace, rsrc, prefix string, describerSettings *printers.DescriberSettings, out io.Writer, originalError error) error {
r := f.NewBuilder().Unstructured(). r := f.NewBuilder().
Unstructured().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
ResourceTypeOrNameArgs(true, rsrc). ResourceTypeOrNameArgs(true, rsrc).
SingleResourceType(). SingleResourceType().
......
...@@ -237,6 +237,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error { ...@@ -237,6 +237,7 @@ func (o *DrainOptions) SetupDrain(cmd *cobra.Command, args []string) error {
} }
builder := o.Factory.NewBuilder(). builder := o.Factory.NewBuilder().
Internal().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
ResourceNames("nodes", args...). ResourceNames("nodes", args...).
SingleResourceType(). SingleResourceType().
......
...@@ -127,6 +127,7 @@ func RunExpose(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []stri ...@@ -127,6 +127,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(). r := f.NewBuilder().
Internal().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
......
...@@ -193,6 +193,7 @@ func (o *LogsOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Comm ...@@ -193,6 +193,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(). builder := f.NewBuilder().
Internal().
NamespaceParam(o.Namespace).DefaultNamespace(). NamespaceParam(o.Namespace).DefaultNamespace().
SingleResourceType() SingleResourceType()
if o.ResourceArg != "" { if o.ResourceArg != "" {
......
...@@ -188,7 +188,8 @@ func forceReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s ...@@ -188,7 +188,8 @@ func forceReplace(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []s
} }
} }
r := f.NewBuilder().Unstructured(). r := f.NewBuilder().
Unstructured().
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
......
...@@ -201,6 +201,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args ...@@ -201,6 +201,7 @@ func RunRollingUpdate(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args
} }
request := f.NewBuilder(). request := f.NewBuilder().
Internal().
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}}).
......
...@@ -80,6 +80,7 @@ func RunHistory(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []str ...@@ -80,6 +80,7 @@ func RunHistory(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []str
} }
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -114,6 +114,7 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i ...@@ -114,6 +114,7 @@ func (o *PauseConfig) CompletePause(f cmdutil.Factory, cmd *cobra.Command, out i
} }
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -112,6 +112,7 @@ func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out ...@@ -112,6 +112,7 @@ func (o *ResumeConfig) CompleteResume(f cmdutil.Factory, cmd *cobra.Command, out
} }
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -83,6 +83,7 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri ...@@ -83,6 +83,7 @@ func RunStatus(f cmdutil.Factory, cmd *cobra.Command, out io.Writer, args []stri
} }
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -113,6 +113,7 @@ func (o *UndoOptions) CompleteUndo(f cmdutil.Factory, cmd *cobra.Command, out io ...@@ -113,6 +113,7 @@ func (o *UndoOptions) CompleteUndo(f cmdutil.Factory, cmd *cobra.Command, out io
} }
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, &o.FilenameOptions). FilenameParam(enforceNamespace, &o.FilenameOptions).
ResourceTypeOrNameArgs(true, args...). ResourceTypeOrNameArgs(true, args...).
......
...@@ -354,6 +354,7 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c ...@@ -354,6 +354,7 @@ func RunRun(f cmdutil.Factory, cmdIn io.Reader, cmdOut, cmdErr io.Writer, cmd *c
return err return err
} }
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace(). NamespaceParam(namespace).DefaultNamespace().
ResourceNames(obj.Mapping.Resource, name). ResourceNames(obj.Mapping.Resource, name).
......
...@@ -105,6 +105,7 @@ func RunScale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin ...@@ -105,6 +105,7 @@ func RunScale(f cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []strin
mapper, _ := f.Object() mapper, _ := f.Object()
r := f.NewBuilder(). r := f.NewBuilder().
Internal().
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
FilenameParam(enforceNamespace, options). FilenameParam(enforceNamespace, options).
......
...@@ -236,6 +236,7 @@ func (o *EnvOptions) RunEnv(f cmdutil.Factory) error { ...@@ -236,6 +236,7 @@ func (o *EnvOptions) RunEnv(f cmdutil.Factory) error {
if len(o.From) != 0 { if len(o.From) != 0 {
b := f.NewBuilder(). b := f.NewBuilder().
Internal().
LocalParam(o.Local). LocalParam(o.Local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
...@@ -303,6 +304,7 @@ func (o *EnvOptions) RunEnv(f cmdutil.Factory) error { ...@@ -303,6 +304,7 @@ func (o *EnvOptions) RunEnv(f cmdutil.Factory) error {
} }
b := f.NewBuilder(). b := f.NewBuilder().
Internal().
LocalParam(o.Local). LocalParam(o.Local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
......
...@@ -143,6 +143,7 @@ func (o *ImageOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args []st ...@@ -143,6 +143,7 @@ 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(). builder := f.NewBuilder().
Internal().
LocalParam(o.Local). LocalParam(o.Local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
......
...@@ -145,6 +145,7 @@ func (o *ResourcesOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args ...@@ -145,6 +145,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(). builder := f.NewBuilder().
Internal().
LocalParam(o.Local). LocalParam(o.Local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
......
...@@ -129,6 +129,7 @@ func (o *SelectorOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [ ...@@ -129,6 +129,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.builder = f.NewBuilder().
Internal().
LocalParam(o.local). LocalParam(o.local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
......
...@@ -130,6 +130,7 @@ func (saConfig *serviceAccountConfig) Complete(f cmdutil.Factory, cmd *cobra.Com ...@@ -130,6 +130,7 @@ func (saConfig *serviceAccountConfig) Complete(f cmdutil.Factory, cmd *cobra.Com
resources := args[:len(args)-1] resources := args[:len(args)-1]
includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false) includeUninitialized := cmdutil.ShouldIncludeUninitialized(cmd, false)
builder := f.NewBuilder(). builder := f.NewBuilder().
Internal().
LocalParam(saConfig.local). LocalParam(saConfig.local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
......
...@@ -126,6 +126,7 @@ func (o *SubjectOptions) Complete(f cmdutil.Factory, cmd *cobra.Command, args [] ...@@ -126,6 +126,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(). builder := f.NewBuilder().
Internal().
LocalParam(o.Local). LocalParam(o.Local).
ContinueOnError(). ContinueOnError().
NamespaceParam(cmdNamespace).DefaultNamespace(). NamespaceParam(cmdNamespace).DefaultNamespace().
......
...@@ -150,6 +150,7 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com ...@@ -150,6 +150,7 @@ func (o *TaintOptions) Complete(f cmdutil.Factory, out io.Writer, cmd *cobra.Com
return cmdutil.UsageErrorf(cmd, err.Error()) return cmdutil.UsageErrorf(cmd, err.Error())
} }
o.builder = f.NewBuilder(). o.builder = f.NewBuilder().
Internal().
ContinueOnError(). ContinueOnError().
NamespaceParam(namespace).DefaultNamespace() NamespaceParam(namespace).DefaultNamespace()
if o.selector != "" { if o.selector != "" {
......
...@@ -288,7 +288,7 @@ func (f *FakeFactory) Object() (meta.RESTMapper, runtime.ObjectTyper) { ...@@ -288,7 +288,7 @@ func (f *FakeFactory) Object() (meta.RESTMapper, runtime.ObjectTyper) {
} }
groupResources := testDynamicResources() groupResources := testDynamicResources()
mapper := discovery.NewRESTMapper(groupResources, meta.InterfacesForUnstructuredConversion(legacyscheme.Registry.InterfacesFor)) mapper := discovery.NewRESTMapper(groupResources, meta.InterfacesForUnstructuredConversion(legacyscheme.Registry.InterfacesFor))
typer := discovery.NewUnstructuredObjectTyper(groupResources) typer := discovery.NewUnstructuredObjectTyper(groupResources, legacyscheme.Scheme)
fakeDs := &fakeCachedDiscoveryClient{} fakeDs := &fakeCachedDiscoveryClient{}
expander := cmdutil.NewShortcutExpander(mapper, fakeDs) expander := cmdutil.NewShortcutExpander(mapper, fakeDs)
...@@ -624,8 +624,17 @@ func (f *fakeAPIFactory) Object() (meta.RESTMapper, runtime.ObjectTyper) { ...@@ -624,8 +624,17 @@ func (f *fakeAPIFactory) Object() (meta.RESTMapper, runtime.ObjectTyper) {
} }
}), }),
) )
// for backwards compatibility with existing tests, allow rest mappings from the scheme to show up
// TODO: make this opt-in?
mapper = meta.FirstHitRESTMapper{
MultiRESTMapper: meta.MultiRESTMapper{
mapper,
legacyscheme.Registry.RESTMapper(),
},
}
typer := discovery.NewUnstructuredObjectTyper(groupResources) // TODO: should probably be the external scheme
typer := discovery.NewUnstructuredObjectTyper(groupResources, legacyscheme.Scheme)
fakeDs := &fakeCachedDiscoveryClient{} fakeDs := &fakeCachedDiscoveryClient{}
expander := cmdutil.NewShortcutExpander(mapper, fakeDs) expander := cmdutil.NewShortcutExpander(mapper, fakeDs)
return expander, typer return expander, typer
...@@ -925,6 +934,8 @@ func testDynamicResources() []*discovery.APIGroupResources { ...@@ -925,6 +934,8 @@ func testDynamicResources() []*discovery.APIGroupResources {
{Name: "secrets", Namespaced: true, Kind: "Secret"}, {Name: "secrets", Namespaced: true, Kind: "Secret"},
{Name: "configmaps", Namespaced: true, Kind: "ConfigMap"}, {Name: "configmaps", Namespaced: true, Kind: "ConfigMap"},
{Name: "namespacedtype", Namespaced: true, Kind: "NamespacedType"}, {Name: "namespacedtype", Namespaced: true, Kind: "NamespacedType"},
{Name: "namespaces", Namespaced: false, Kind: "Namespace"},
{Name: "resourcequotas", Namespaced: true, Kind: "ResourceQuota"},
}, },
}, },
}, },
...@@ -939,6 +950,7 @@ func testDynamicResources() []*discovery.APIGroupResources { ...@@ -939,6 +950,7 @@ func testDynamicResources() []*discovery.APIGroupResources {
VersionedResources: map[string][]metav1.APIResource{ VersionedResources: map[string][]metav1.APIResource{
"v1beta1": { "v1beta1": {
{Name: "deployments", Namespaced: true, Kind: "Deployment"}, {Name: "deployments", Namespaced: true, Kind: "Deployment"},
{Name: "replicasets", Namespaced: true, Kind: "ReplicaSet"},
}, },
}, },
}, },
...@@ -955,12 +967,14 @@ func testDynamicResources() []*discovery.APIGroupResources { ...@@ -955,12 +967,14 @@ func testDynamicResources() []*discovery.APIGroupResources {
VersionedResources: map[string][]metav1.APIResource{ VersionedResources: map[string][]metav1.APIResource{
"v1beta1": { "v1beta1": {
{Name: "deployments", Namespaced: true, Kind: "Deployment"}, {Name: "deployments", Namespaced: true, Kind: "Deployment"},
{Name: "replicasets", Namespaced: true, Kind: "ReplicaSet"},
}, },
"v1beta2": { "v1beta2": {
{Name: "deployments", Namespaced: true, Kind: "Deployment"}, {Name: "deployments", Namespaced: true, Kind: "Deployment"},
}, },
"v1": { "v1": {
{Name: "deployments", Namespaced: true, Kind: "Deployment"}, {Name: "deployments", Namespaced: true, Kind: "Deployment"},
{Name: "replicasets", Namespaced: true, Kind: "ReplicaSet"},
}, },
}, },
}, },
...@@ -1003,6 +1017,24 @@ func testDynamicResources() []*discovery.APIGroupResources { ...@@ -1003,6 +1017,24 @@ func testDynamicResources() []*discovery.APIGroupResources {
}, },
{ {
Group: metav1.APIGroup{ Group: metav1.APIGroup{
Name: "rbac.authorization.k8s.io",
Versions: []metav1.GroupVersionForDiscovery{
{Version: "v1beta1"},
{Version: "v1"},
},
PreferredVersion: metav1.GroupVersionForDiscovery{Version: "v1"},
},
VersionedResources: map[string][]metav1.APIResource{
"v1": {
{Name: "clusterroles", Namespaced: false, Kind: "ClusterRole"},
},
"v1beta1": {
{Name: "clusterrolebindings", Namespaced: false, Kind: "ClusterRoleBinding"},
},
},
},
{
Group: metav1.APIGroup{
Name: "company.com", Name: "company.com",
Versions: []metav1.GroupVersionForDiscovery{ Versions: []metav1.GroupVersionForDiscovery{
{Version: "v1"}, {Version: "v1"},
......
...@@ -9,7 +9,6 @@ go_library( ...@@ -9,7 +9,6 @@ go_library(
srcs = [ srcs = [
"cached_discovery.go", "cached_discovery.go",
"clientcache.go", "clientcache.go",
"discovery.go",
"factory.go", "factory.go",
"factory_builder.go", "factory_builder.go",
"factory_client_access.go", "factory_client_access.go",
......
...@@ -108,7 +108,8 @@ func (o *EditOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args [] ...@@ -108,7 +108,8 @@ func (o *EditOptions) Complete(f cmdutil.Factory, out, errOut io.Writer, args []
return err return err
} }
mapper, _ := f.Object() mapper, _ := f.Object()
b := f.NewBuilder().Unstructured() b := f.NewBuilder().
Unstructured()
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()
......
...@@ -98,13 +98,13 @@ func (f *ring1Factory) objectLoader() (meta.RESTMapper, runtime.ObjectTyper, err ...@@ -98,13 +98,13 @@ func (f *ring1Factory) objectLoader() (meta.RESTMapper, runtime.ObjectTyper, err
interfaces := meta.InterfacesForUnstructuredConversion(legacyscheme.Registry.InterfacesFor) interfaces := meta.InterfacesForUnstructuredConversion(legacyscheme.Registry.InterfacesFor)
mapper := discovery.NewDeferredDiscoveryRESTMapper(discoveryClient, meta.VersionInterfacesFunc(interfaces)) mapper := discovery.NewDeferredDiscoveryRESTMapper(discoveryClient, meta.VersionInterfacesFunc(interfaces))
// TODO: should this also indicate it recognizes typed objects? // TODO: should this also indicate it recognizes typed objects?
typer := discovery.NewUnstructuredObjectTyper(groupResources) typer := discovery.NewUnstructuredObjectTyper(groupResources, legacyscheme.Scheme)
expander := NewShortcutExpander(mapper, discoveryClient) expander := NewShortcutExpander(mapper, discoveryClient)
return expander, typer, err return expander, typer, err
} }
func (f *ring1Factory) Object() (meta.RESTMapper, runtime.ObjectTyper) { func (f *ring1Factory) Object() (meta.RESTMapper, runtime.ObjectTyper) {
return NewLazyObjectLoader(f.objectLoader) return meta.NewLazyObjectLoader(f.objectLoader)
} }
func (f *ring1Factory) CategoryExpander() categories.CategoryExpander { func (f *ring1Factory) CategoryExpander() categories.CategoryExpander {
......
...@@ -43,10 +43,13 @@ const defaultHttpGetAttempts int = 3 ...@@ -43,10 +43,13 @@ const defaultHttpGetAttempts int = 3
// from the command line and converting them to a list of resources to iterate // from the command line and converting them to a list of resources to iterate
// over using the Visitor interface. // over using the Visitor interface.
type Builder struct { type Builder struct {
mapper *Mapper
unstructured *Mapper
categoryExpander categories.CategoryExpander categoryExpander categories.CategoryExpander
// mapper is set explicitly by resource builders
mapper *Mapper
internal *Mapper
unstructured *Mapper
errs []error errs []error
paths []Visitor paths []Visitor
...@@ -116,10 +119,12 @@ type resourceTuple struct { ...@@ -116,10 +119,12 @@ type resourceTuple struct {
Name string Name string
} }
// NewBuilder creates a builder that operates on generic objects. // NewBuilder creates a builder that operates on generic objects. At least one of
func NewBuilder(mapper, unstructured *Mapper, categoryExpander categories.CategoryExpander) *Builder { // internal or unstructured must be specified.
// TODO: Add versioned client (although versioned is still lossy)
func NewBuilder(internal, unstructured *Mapper, categoryExpander categories.CategoryExpander) *Builder {
return &Builder{ return &Builder{
mapper: mapper, internal: internal,
unstructured: unstructured, unstructured: unstructured,
categoryExpander: categoryExpander, categoryExpander: categoryExpander,
requireObject: true, requireObject: true,
...@@ -167,16 +172,41 @@ func (b *Builder) FilenameParam(enforceNamespace bool, filenameOptions *Filename ...@@ -167,16 +172,41 @@ func (b *Builder) FilenameParam(enforceNamespace bool, filenameOptions *Filename
} }
// Unstructured updates the builder so that it will request and send unstructured // Unstructured updates the builder so that it will request and send unstructured
// objects by default. Calling this method resets Local(). // objects. Unstructured objects preserve all fields sent by the server in a map format
// based on the object's JSON structure which means no data is lost when the client
// reads and then writes an object. Use this mode in preference to Internal unless you
// are working with Go types directly.
func (b *Builder) Unstructured() *Builder { func (b *Builder) Unstructured() *Builder {
if b.unstructured == nil { if b.unstructured == nil {
b.errs = append(b.errs, fmt.Errorf("no unstructured builder provided")) b.errs = append(b.errs, fmt.Errorf("no unstructured mapper provided"))
return b
}
if b.mapper != nil {
b.errs = append(b.errs, fmt.Errorf("another mapper was already selected, cannot use unstructured types"))
return b return b
} }
b.mapper = b.unstructured b.mapper = b.unstructured
return b return b
} }
// Internal updates the builder so that it will convert objects off the wire
// into the internal form if necessary. Using internal types is lossy - fields added
// to the server will not be seen by the client code and may result in failure. Only
// use this mode when working offline, or when generating patches to send to the server.
// Use Unstructured if you are reading an object and performing a POST or PUT.
func (b *Builder) Internal() *Builder {
if b.internal == nil {
b.errs = append(b.errs, fmt.Errorf("no internal mapper provided"))
return b
}
if b.mapper != nil {
b.errs = append(b.errs, fmt.Errorf("another mapper was already selected, cannot use internal types"))
return b
}
b.mapper = b.internal
return b
}
// LocalParam calls Local() if local is true. // LocalParam calls Local() if local is true.
func (b *Builder) LocalParam(local bool) *Builder { func (b *Builder) LocalParam(local bool) *Builder {
if local { if local {
......
...@@ -277,7 +277,7 @@ func newDefaultBuilderWith(client ClientMapper) *Builder { ...@@ -277,7 +277,7 @@ func newDefaultBuilderWith(client ClientMapper) *Builder {
}, },
nil, nil,
categories.LegacyCategoryExpander, categories.LegacyCategoryExpander,
) ).Internal()
} }
func TestPathBuilderAndVersionedObjectNotDefaulted(t *testing.T) { func TestPathBuilderAndVersionedObjectNotDefaulted(t *testing.T) {
...@@ -628,7 +628,7 @@ func TestMultipleResourceByTheSameName(t *testing.T) { ...@@ -628,7 +628,7 @@ func TestMultipleResourceByTheSameName(t *testing.T) {
func TestRequestModifier(t *testing.T) { func TestRequestModifier(t *testing.T) {
var got *rest.Request var got *rest.Request
b := NewBuilder(restmapper, categories.LegacyCategoryExpander, scheme.Scheme, fakeClientWith("test", t, nil), corev1Codec). b := newDefaultBuilderWith(fakeClientWith("test", t, nil)).
NamespaceParam("foo"). NamespaceParam("foo").
TransformRequests(func(req *rest.Request) { TransformRequests(func(req *rest.Request) {
got = req got = req
......
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