mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-01 15:58:37 +00:00
add resource builder flags
This commit is contained in:
parent
8ad67d3437
commit
9c5bdd4b5c
@ -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,
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
|
||||||
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user