From e4b680930dfa85b8c8f6e0aa598893934c7f9c72 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 26 Sep 2025 16:10:36 -0700 Subject: [PATCH] added new health over to include maintenance status to be used with rpk health --- .golangci.yaml | 2 +- rpadmin/api_cluster.go | 23 +++++++++++++++++++++++ rpadmin/go.mod | 8 ++++---- rpadmin/go.sum | 8 ++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/.golangci.yaml b/.golangci.yaml index 7aabd848..0d17b5f3 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -56,7 +56,7 @@ linters: - rowserrcheck - sqlclosecheck - stylecheck - - tenv + - usetesting - typecheck - unconvert - unparam diff --git a/rpadmin/api_cluster.go b/rpadmin/api_cluster.go index 82fe2efe..0e52960e 100644 --- a/rpadmin/api_cluster.go +++ b/rpadmin/api_cluster.go @@ -20,6 +20,7 @@ type ClusterHealthOverview struct { UnhealthyReasons []string `json:"unhealthy_reasons"` ControllerID int `json:"controller_id"` AllNodes []int `json:"all_nodes"` + NodesInMaintenance []int `json:"nodes_in_maintenance_mode"` NodesDown []int `json:"nodes_down"` NodesInRecoveryMode []int `json:"nodes_in_recovery_mode,omitempty"` // This is nil if not-supported or no nodes in recovery mode. LeaderlessPartitions []string `json:"leaderless_partitions"` @@ -98,6 +99,28 @@ func (a *AdminAPI) GetHealthOverview(ctx context.Context) (ClusterHealthOverview return response, a.sendAny(ctx, http.MethodGet, "/v1/cluster/health_overview", nil, &response) } +// GetHealthOverviewWithMaintenance gets the cluster health overview with nodes, if any, in maintenance. +func (a *AdminAPI) GetHealthOverviewWithMaintenance(ctx context.Context) (ClusterHealthOverview, error) { + var response ClusterHealthOverview + if err := a.sendAny(ctx, http.MethodGet, "/v1/cluster/health_overview", nil, &response); err != nil { + return ClusterHealthOverview{}, err + } + + brokers, err := a.Brokers(ctx) + if err != nil { + return ClusterHealthOverview{}, err + } + + var nodesInMaintenance []int + for _, broker := range brokers { + if broker.Maintenance != nil && broker.Maintenance.Draining { + nodesInMaintenance = append(nodesInMaintenance, broker.NodeID) + } + } + response.NodesInMaintenance = nodesInMaintenance + return response, nil +} + // GetPartitionStatus gets the cluster partition status. func (a *AdminAPI) GetPartitionStatus(ctx context.Context) (PartitionBalancerStatus, error) { var response PartitionBalancerStatus diff --git a/rpadmin/go.mod b/rpadmin/go.mod index b2958947..f7b6f4f4 100644 --- a/rpadmin/go.mod +++ b/rpadmin/go.mod @@ -5,8 +5,8 @@ go 1.24.0 toolchain go1.24.3 require ( - buf.build/gen/go/redpandadata/core/connectrpc/go v1.18.1-20250903131725-492a4ada6956.1 - connectrpc.com/connect v1.18.1 + buf.build/gen/go/redpandadata/core/connectrpc/go v1.19.0-20250923163359-5b43f5e8819f.1 + connectrpc.com/connect v1.19.0 github.com/foxcpp/go-mockdns v1.1.0 github.com/hashicorp/go-multierror v1.1.1 github.com/redpanda-data/common-go/net v0.1.0 @@ -16,7 +16,7 @@ require ( ) require ( - buf.build/gen/go/redpandadata/core/protocolbuffers/go v1.36.9-20250903131725-492a4ada6956.1 // indirect + buf.build/gen/go/redpandadata/core/protocolbuffers/go v1.36.9-20250923163359-5b43f5e8819f.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/miekg/dns v1.1.57 // indirect @@ -26,7 +26,7 @@ require ( golang.org/x/net v0.37.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/tools v0.15.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250922171735-9219d122eba9 // indirect google.golang.org/protobuf v1.36.9 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/rpadmin/go.sum b/rpadmin/go.sum index d989dca4..b8aba40d 100644 --- a/rpadmin/go.sum +++ b/rpadmin/go.sum @@ -1,9 +1,15 @@ buf.build/gen/go/redpandadata/core/connectrpc/go v1.18.1-20250903131725-492a4ada6956.1 h1:ILKCJnvuZt7dVvSrrg96EYHZw+daqVTCj0Wgm+dM1do= buf.build/gen/go/redpandadata/core/connectrpc/go v1.18.1-20250903131725-492a4ada6956.1/go.mod h1:kc2N3jlUqEZrUEit1SEEgJrFQ14kk4uIzGHd5Wu5tMI= +buf.build/gen/go/redpandadata/core/connectrpc/go v1.19.0-20250923163359-5b43f5e8819f.1 h1:tKDypogy6/2SnmdEyRakETCMX2gMuEhmVD9geGvqf1M= +buf.build/gen/go/redpandadata/core/connectrpc/go v1.19.0-20250923163359-5b43f5e8819f.1/go.mod h1:3xyFIFzXTnLuQRHPmVJqLYgv9cP2GOLTuhIpZ5kOXZk= buf.build/gen/go/redpandadata/core/protocolbuffers/go v1.36.9-20250903131725-492a4ada6956.1 h1:wpCXTU52u2r1XLPsEScI2yZJ5xbxURTJrugu+RflQgE= buf.build/gen/go/redpandadata/core/protocolbuffers/go v1.36.9-20250903131725-492a4ada6956.1/go.mod h1:oupF1xcfwydaQw7rI2idmWZZG7lF/hTF9V6EWSc/UCg= +buf.build/gen/go/redpandadata/core/protocolbuffers/go v1.36.9-20250923163359-5b43f5e8819f.1 h1:ftQcNtjB8fvgJId4qF9r7icaG023XU3sl1QIt6yYKEU= +buf.build/gen/go/redpandadata/core/protocolbuffers/go v1.36.9-20250923163359-5b43f5e8819f.1/go.mod h1:oupF1xcfwydaQw7rI2idmWZZG7lF/hTF9V6EWSc/UCg= connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw= connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= +connectrpc.com/connect v1.19.0 h1:LuqUbq01PqbtL0o7vn0WMRXzR2nNsiINe5zfcJ24pJM= +connectrpc.com/connect v1.19.0/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= @@ -97,6 +103,8 @@ golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 h1:d8Nakh1G+ur7+P3GcMjpRDEkoLUcLW2iU92XVqR+XMQ= google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090/go.mod h1:U8EXRNSd8sUYyDfs/It7KVWodQr+Hf9xtxyxWudSwEw= +google.golang.org/genproto/googleapis/api v0.0.0-20250922171735-9219d122eba9 h1:jm6v6kMRpTYKxBRrDkYAitNJegUeO1Mf3Kt80obv0gg= +google.golang.org/genproto/googleapis/api v0.0.0-20250922171735-9219d122eba9/go.mod h1:LmwNphe5Afor5V3R5BppOULHOnt2mCIf+NxMd4XiygE= google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=