Skip to content

Commit

Permalink
Backport of member cli: add -filter expression to flags into release/…
Browse files Browse the repository at this point in the history
…1.15.x (#18279)

member cli: add -filter expression to flags
  • Loading branch information
huikang committed Jul 25, 2023
1 parent 3fc1368 commit e9615bf
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .changelog/18223.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:feature
cli: `consul members` command uses `-filter` expression to filter members based on bexpr.
```
15 changes: 15 additions & 0 deletions agent/agent_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,21 @@ func (s *HTTPHandlers) AgentMembers(resp http.ResponseWriter, req *http.Request)
}
}

// filter the members by parsed filter expression
var filterExpression string
s.parseFilter(req, &filterExpression)
if filterExpression != "" {
filter, err := bexpr.CreateFilter(filterExpression, nil, members)
if err != nil {
return nil, err
}
raw, err := filter.Execute(members)
if err != nil {
return nil, err
}
members = raw.([]serf.Member)
}

total := len(members)
if err := s.agent.filterMembers(token, &members); err != nil {
return nil, err
Expand Down
6 changes: 6 additions & 0 deletions api/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,8 @@ type MembersOpts struct {
// Segment is the LAN segment to show members for. Setting this to the
// AllSegments value above will show members in all segments.
Segment string

Filter string
}

// AgentServiceRegistration is used to register a new service
Expand Down Expand Up @@ -767,6 +769,10 @@ func (a *Agent) MembersOpts(opts MembersOpts) ([]*AgentMember, error) {
r.params.Set("wan", "1")
}

if opts.Filter != "" {
r.params.Set("filter", opts.Filter)
}

_, resp, err := a.c.doRequest(r)
if err != nil {
return nil, err
Expand Down
10 changes: 10 additions & 0 deletions api/agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,16 @@ func TestAPI_AgentMembersOpts(t *testing.T) {
if len(members) != 2 {
t.Fatalf("bad: %v", members)
}

members, err = agent.MembersOpts(MembersOpts{
WAN: true,
Filter: `Tags["dc"] == dc2`,
})
if err != nil {
t.Fatalf("err: %v", err)
}

require.Equal(t, 1, len(members))
}

func TestAPI_AgentMembers(t *testing.T) {
Expand Down
3 changes: 3 additions & 0 deletions command/members/members.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ type cmd struct {
wan bool
statusFilter string
segment string
filter string
}

func New(ui cli.Ui) *cmd {
Expand All @@ -51,6 +52,7 @@ func (c *cmd) init() {
c.flags.StringVar(&c.segment, "segment", consulapi.AllSegments,
"(Enterprise-only) If provided, output is filtered to only nodes in"+
"the given segment.")
c.flags.StringVar(&c.filter, "filter", "", "Filter to use with the request")

c.http = &flags.HTTPFlags{}
flags.Merge(c.flags, c.http.ClientFlags())
Expand Down Expand Up @@ -80,6 +82,7 @@ func (c *cmd) Run(args []string) int {
opts := consulapi.MembersOpts{
Segment: c.segment,
WAN: c.wan,
Filter: c.filter,
}
members, err := client.Agent().MembersOpts(opts)
if err != nil {
Expand Down
6 changes: 6 additions & 0 deletions website/content/commands/members.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ Usage: `consul members [options]`
in the WAN gossip pool. These are generally all the server nodes in
each datacenter.

- `-filter=<filter>` - Expression to use for filtering the results,
e.g., `-filter='Tags["dc"] == dc2'`.
See the [`/catalog/nodes` API documentation](/consul/api-docs/catalog#filtering) for a
description of what is filterable.


#### Enterprise Options

@include 'http_api_partition_options.mdx'
Expand Down

0 comments on commit e9615bf

Please sign in to comment.