Skip to content

Commit 386ac51

Browse files
committed
feat(resources): add label selector support to commands which retrieve resources
This adds support for label selectors to the `get` `get-meta` and `fetch` commands, allowing users to filter resources based on labels. The label selector can be specified using the `-l` or `--selector` flag, following the format used in Kubernetes (e.g., `-l key=value,other=value`). This enhancement improves the usability of these commands by enabling more targeted retrieval of resources based on their labels.
1 parent eea492a commit 386ac51

File tree

5 files changed

+24
-9
lines changed

5 files changed

+24
-9
lines changed

cmd/grafanactl/resources/fetch.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type fetchRequest struct {
1515
StopOnError bool
1616
ExcludeManaged bool
1717
ExpectSingleTarget bool
18+
LabelSelector string
1819
Processors []remote.Processor
1920
}
2021

@@ -50,6 +51,12 @@ func fetchResources(ctx context.Context, opts fetchRequest, args []string) (*fet
5051
return nil, err
5152
}
5253

54+
if opts.LabelSelector != "" {
55+
for i := range filters {
56+
filters[i].LabelSelector = opts.LabelSelector
57+
}
58+
}
59+
5360
pull, err := remote.NewDefaultPuller(ctx, opts.Config)
5461
if err != nil {
5562
return nil, err

cmd/grafanactl/resources/get.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ import (
2020
)
2121

2222
type getOpts struct {
23-
IO cmdio.Options
24-
OnError OnErrorMode
23+
IO cmdio.Options
24+
OnError OnErrorMode
25+
LabelSelector string
2526
}
2627

2728
func (opts *getOpts) setup(flags *pflag.FlagSet) {
@@ -31,6 +32,8 @@ func (opts *getOpts) setup(flags *pflag.FlagSet) {
3132
opts.IO.RegisterCustomCodec("wide", &tableCodec{wide: true})
3233
opts.IO.DefaultFormat("text")
3334

35+
flags.StringVarP(&opts.LabelSelector, "selector", "l", "", "Filter resources by label selector (e.g. -l key=value,other=value)")
36+
3437
// Bind all the flags
3538
opts.IO.BindFlags(flags)
3639
}
@@ -98,8 +101,9 @@ func getCmd(configOpts *cmdconfig.Options) *cobra.Command {
98101
}
99102

100103
res, err := fetchResources(ctx, fetchRequest{
101-
Config: cfg,
102-
StopOnError: opts.OnError.StopOnError(),
104+
Config: cfg,
105+
StopOnError: opts.OnError.StopOnError(),
106+
LabelSelector: opts.LabelSelector,
103107
}, args)
104108
if err != nil {
105109
return err

cmd/grafanactl/resources/get_meta.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,17 @@ import (
2323
)
2424

2525
type getMetaOpts struct {
26-
IO cmdio.Options
26+
IO cmdio.Options
27+
LabelSelector string
2728
}
2829

2930
func (opts *getMetaOpts) setup(flags *pflag.FlagSet) {
3031
opts.IO.RegisterCustomCodec("text", &partialMetaTableCodec{wide: false})
3132
opts.IO.RegisterCustomCodec("wide", &partialMetaTableCodec{wide: true})
3233
opts.IO.DefaultFormat("text")
3334

35+
flags.StringVarP(&opts.LabelSelector, "selector", "l", "", "Filter resources by label selector (e.g. -l key=value,other=value)")
36+
3437
opts.IO.BindFlags(flags)
3538
}
3639

internal/resources/filter.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,10 @@ func (t FilterType) String() string {
4141
// Unlike Selector, filters use the Descriptor to identify the resource type,
4242
// which fully defines the target API resource.
4343
type Filter struct {
44-
Type FilterType
45-
Descriptor Descriptor
46-
ResourceUIDs []string
44+
Type FilterType
45+
Descriptor Descriptor
46+
ResourceUIDs []string
47+
LabelSelector string
4748
}
4849

4950
func (f Filter) String() string {

internal/resources/remote/puller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func (p *Puller) Pull(ctx context.Context, req PullRequest) (*OperationSummary,
111111
errg.Go(func() error {
112112
switch filt.Type {
113113
case resources.FilterTypeAll:
114-
res, err := p.client.List(ctx, filt.Descriptor, metav1.ListOptions{})
114+
res, err := p.client.List(ctx, filt.Descriptor, metav1.ListOptions{LabelSelector: filt.LabelSelector})
115115
if err != nil {
116116
if req.StopOnError {
117117
return err

0 commit comments

Comments
 (0)