add resource builder flags

This commit is contained in:
David Eads 2018-05-29 10:46:54 -04:00
parent 8ad67d3437
commit 9c5bdd4b5c
4 changed files with 92 additions and 21 deletions

View File

@ -53,9 +53,12 @@ type WaitFlags struct {
// NewWaitFlags returns a default WaitFlags // NewWaitFlags returns a default WaitFlags
func NewWaitFlags(restClientGetter genericclioptions.RESTClientGetter, streams genericclioptions.IOStreams) *WaitFlags { func NewWaitFlags(restClientGetter genericclioptions.RESTClientGetter, streams genericclioptions.IOStreams) *WaitFlags {
return &WaitFlags{ return &WaitFlags{
RESTClientGetter: restClientGetter, RESTClientGetter: restClientGetter,
PrintFlags: genericclioptions.NewPrintFlags("condition met"), PrintFlags: genericclioptions.NewPrintFlags("condition met"),
ResourceBuilderFlags: genericclioptions.NewResourceBuilderFlags(), ResourceBuilderFlags: genericclioptions.NewResourceBuilderFlags().
WithLabelSelector("").
WithAllNamespaces(false).
WithLatest(),
Timeout: 30 * time.Second, Timeout: 30 * time.Second,

View File

@ -219,7 +219,7 @@ func TestWaitForDeletion(t *testing.T) {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
fakeClient := test.fakeClient() fakeClient := test.fakeClient()
o := &WaitOptions{ o := &WaitOptions{
ResourceFinder: genericclioptions.NewSimpleResourceFinder(test.info), ResourceFinder: genericclioptions.NewSimpleFakeResourceFinder(test.info),
DynamicClient: fakeClient, DynamicClient: fakeClient,
Timeout: test.timeout, Timeout: test.timeout,
@ -451,7 +451,7 @@ func TestWaitForCondition(t *testing.T) {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
fakeClient := test.fakeClient() fakeClient := test.fakeClient()
o := &WaitOptions{ o := &WaitOptions{
ResourceFinder: genericclioptions.NewSimpleResourceFinder(test.info), ResourceFinder: genericclioptions.NewSimpleFakeResourceFinder(test.info),
DynamicClient: fakeClient, DynamicClient: fakeClient,
Timeout: test.timeout, Timeout: test.timeout,

View File

@ -18,6 +18,7 @@ package genericclioptions
import ( import (
"github.com/spf13/pflag" "github.com/spf13/pflag"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource" "k8s.io/kubernetes/pkg/kubectl/genericclioptions/resource"
) )
@ -29,8 +30,11 @@ type ResourceBuilderFlags struct {
LabelSelector *string LabelSelector *string
FieldSelector *string FieldSelector *string
AllNamespaces *bool AllNamespaces *bool
All *bool
Local *bool
All bool Scheme *runtime.Scheme
Latest bool
} }
// NewResourceBuilderFlags returns a default ResourceBuilderFlags // NewResourceBuilderFlags returns a default ResourceBuilderFlags
@ -43,17 +47,54 @@ func NewResourceBuilderFlags() *ResourceBuilderFlags {
Filenames: &filenames, Filenames: &filenames,
Recursive: boolPtr(true), Recursive: boolPtr(true),
}, },
LabelSelector: strPtr(""),
AllNamespaces: boolPtr(false),
} }
} }
func (o *ResourceBuilderFlags) WithFile(recurse bool, files ...string) *ResourceBuilderFlags {
o.FileNameFlags = &FileNameFlags{
Usage: "identifying the resource.",
Filenames: &files,
Recursive: boolPtr(recurse),
}
return o
}
func (o *ResourceBuilderFlags) WithLabelSelector(selector string) *ResourceBuilderFlags {
o.LabelSelector = &selector
return o
}
func (o *ResourceBuilderFlags) WithFieldSelector(selector string) *ResourceBuilderFlags { func (o *ResourceBuilderFlags) WithFieldSelector(selector string) *ResourceBuilderFlags {
o.FieldSelector = &selector o.FieldSelector = &selector
return o return o
} }
func (o *ResourceBuilderFlags) WithAllNamespaces(defaultVal bool) *ResourceBuilderFlags {
o.AllNamespaces = &defaultVal
return o
}
func (o *ResourceBuilderFlags) WithAll(defaultVal bool) *ResourceBuilderFlags {
o.All = &defaultVal
return o
}
func (o *ResourceBuilderFlags) WithLocal(defaultVal bool) *ResourceBuilderFlags {
o.Local = &defaultVal
return o
}
func (o *ResourceBuilderFlags) WithScheme(scheme *runtime.Scheme) *ResourceBuilderFlags {
o.Scheme = scheme
return o
}
func (o *ResourceBuilderFlags) WithLatest() *ResourceBuilderFlags {
o.Latest = true
return o
}
// AddFlags registers flags for finding resources // AddFlags registers flags for finding resources
func (o *ResourceBuilderFlags) AddFlags(flagset *pflag.FlagSet) { func (o *ResourceBuilderFlags) AddFlags(flagset *pflag.FlagSet) {
o.FileNameFlags.AddFlags(flagset) o.FileNameFlags.AddFlags(flagset)
@ -67,6 +108,12 @@ func (o *ResourceBuilderFlags) AddFlags(flagset *pflag.FlagSet) {
if o.AllNamespaces != nil { if o.AllNamespaces != nil {
flagset.BoolVar(o.AllNamespaces, "all-namespaces", *o.AllNamespaces, "If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.") flagset.BoolVar(o.AllNamespaces, "all-namespaces", *o.AllNamespaces, "If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.")
} }
if o.All != nil {
flagset.BoolVar(o.All, "all", *o.All, "Select all resources in the namespace of the specified resource types")
}
if o.Local != nil {
flagset.BoolVar(o.Local, "local", *o.Local, "If true, annotation will NOT contact api-server but run locally.")
}
} }
// ToBuilder gives you back a resource finder to visit resources that are located // ToBuilder gives you back a resource finder to visit resources that are located
@ -74,24 +121,45 @@ func (o *ResourceBuilderFlags) ToBuilder(restClientGetter RESTClientGetter, reso
namespace, enforceNamespace, namespaceErr := restClientGetter.ToRawKubeConfigLoader().Namespace() namespace, enforceNamespace, namespaceErr := restClientGetter.ToRawKubeConfigLoader().Namespace()
builder := resource.NewBuilder(restClientGetter). builder := resource.NewBuilder(restClientGetter).
Unstructured(). NamespaceParam(namespace).DefaultNamespace()
NamespaceParam(namespace).DefaultNamespace().
ResourceTypeOrNameArgs(o.All, resources...) if o.Scheme != nil {
builder.WithScheme(o.Scheme, o.Scheme.PrioritizedVersionsAllGroups()...)
} else {
builder.Unstructured()
}
if o.FileNameFlags != nil { if o.FileNameFlags != nil {
opts := o.FileNameFlags.ToOptions() opts := o.FileNameFlags.ToOptions()
builder = builder.FilenameParam(enforceNamespace, &opts) builder.FilenameParam(enforceNamespace, &opts)
} }
if o.LabelSelector != nil {
builder = builder.LabelSelectorParam(*o.LabelSelector) if o.Local == nil || !*o.Local {
} // resource type/name tuples only work non-local
if o.FieldSelector != nil { if o.All != nil {
builder = builder.FieldSelectorParam(*o.FieldSelector) builder.ResourceTypeOrNameArgs(*o.All, resources...)
} else {
builder.ResourceTypeOrNameArgs(false, resources...)
}
// label selectors only work non-local (for now)
if o.LabelSelector != nil {
builder.LabelSelectorParam(*o.LabelSelector)
}
// field selectors only work non-local (forever)
if o.FieldSelector != nil {
builder.FieldSelectorParam(*o.FieldSelector)
}
// latest only works non-local (forever)
if o.Latest {
builder.Latest()
}
} else {
builder.Local()
} }
return &ResourceFindBuilderWrapper{ return &ResourceFindBuilderWrapper{
builder: builder. builder: builder.
Latest(). Flatten(). // I think we're going to recommend this everywhere
Flatten().
AddError(namespaceErr), AddError(namespaceErr),
} }
} }

View File

@ -21,7 +21,7 @@ import (
) )
// NewSimpleResourceFinder builds a super simple ResourceFinder that just iterates over the objects you provided // NewSimpleResourceFinder builds a super simple ResourceFinder that just iterates over the objects you provided
func NewSimpleResourceFinder(infos ...*resource.Info) ResourceFinder { func NewSimpleFakeResourceFinder(infos ...*resource.Info) ResourceFinder {
return &fakeResourceFinder{ return &fakeResourceFinder{
Infos: infos, Infos: infos,
} }