Skip to content

Commit

Permalink
Merge fe571c6 into backport/gh-18152-members-filter-dc/regularly-vast…
Browse files Browse the repository at this point in the history
…-tadpole
  • Loading branch information
hc-github-team-consul-core authored Jul 25, 2023
2 parents 5920865 + fe571c6 commit 1ea232d
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 0 deletions.
15 changes: 15 additions & 0 deletions agent/agent_endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -621,6 +621,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 @@ -274,6 +274,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 @@ -790,6 +792,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 @@ -155,6 +155,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 @@ -33,6 +33,7 @@ type cmd struct {
wan bool
statusFilter string
segment string
filter string
}

func New(ui cli.Ui) *cmd {
Expand All @@ -54,6 +55,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 @@ -83,6 +85,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

0 comments on commit 1ea232d

Please sign in to comment.