VAULT-11830: Expand NodeStatusReporter with new fields (#18302)

* expand NodeStatusReporter with new fields

* only call IsRaftVoter if using raft storage

* add changelog entry

* fix listeners

* return LogLevel as enum

* update github.com/hashicorp/vault/vault/hcp_link/proto

* add changelog entry

* bump github.com/hashicorp/vault/vault/hcp_link/proto

* go mod tidy
This commit is contained in:
Chris Capurso 2023-01-06 20:53:09 -05:00 committed by GitHub
parent bb0c92afe7
commit 25d0afae23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 93 additions and 30 deletions

3
changelog/18302.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:improvement
hcp/status: Expand node-level status information
```

10
go.sum
View File

@ -1171,16 +1171,6 @@ github.com/hashicorp/vault-plugin-secrets-terraform v0.6.0/go.mod h1:GzYAJYytgbN
github.com/hashicorp/vault-testing-stepwise v0.1.1/go.mod h1:3vUYn6D0ZadvstNO3YQQlIcp7u1a19MdoOC0NQ0yaOE=
github.com/hashicorp/vault-testing-stepwise v0.1.2 h1:3obC/ziAPGnsz2IQxr5e4Ayb7tu7WL6pm6mmZ5gwhhs=
github.com/hashicorp/vault-testing-stepwise v0.1.2/go.mod h1:TeU6B+5NqxUjto+Zey+QQEH1iywuHn0ciHZNYh4q3uI=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20221209165735-a2eed407e08d h1:U692VbDl6ww5GQsNFClJVFJDaPeuqtDt1Mwqf21KYek=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20221209165735-a2eed407e08d/go.mod h1:a2crHoMWwY6aiL8GWT8hYj7vKD64uX0EdRPbnsHF5wU=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20221213220056-b0613b59f419 h1:yl6f//YTaTTGKJwyOpRe7v1DDPrzP+NErwgnef6qx7A=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20221213220056-b0613b59f419/go.mod h1:a2crHoMWwY6aiL8GWT8hYj7vKD64uX0EdRPbnsHF5wU=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20230103211812-c28545e74f94 h1:Rx4Q2/mOPqJuanzwZYttDkWjdibPv3UpvsvKmOkl6h4=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20230103211812-c28545e74f94/go.mod h1:a2crHoMWwY6aiL8GWT8hYj7vKD64uX0EdRPbnsHF5wU=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20230105183308-048241517ffb h1:PgXcBszV61BvxD0wZzm4QCz9btgTWX74NO4be6S2afU=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20230105183308-048241517ffb/go.mod h1:a2crHoMWwY6aiL8GWT8hYj7vKD64uX0EdRPbnsHF5wU=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20230106184443-96cfe11e7051 h1:cMQoRbIUMhbM0NsmP6hH3S3ZmAPVgic3g3L8Z55rXCI=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20230106184443-96cfe11e7051/go.mod h1:a2crHoMWwY6aiL8GWT8hYj7vKD64uX0EdRPbnsHF5wU=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20230106203127-9eaf26716342 h1:9cMwZnaAV/lKs8EZsvBF00wPt350wD3sg/xqWGeN4gM=
github.com/hashicorp/vault/vault/hcp_link/proto v0.0.0-20230106203127-9eaf26716342/go.mod h1:a2crHoMWwY6aiL8GWT8hYj7vKD64uX0EdRPbnsHF5wU=
github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 h1:O/pT5C1Q3mVXMyuqg7yuAWUg/jMZR1/0QTzTRdNR6Uw=

View File

@ -3082,6 +3082,11 @@ func (c *Core) LogFormat() string {
return conf.(*server.Config).LogFormat
}
// LogLevel returns the log level provided by level provided by config, CLI flag, or env
func (c *Core) LogLevel() string {
return c.logLevel
}
// MetricsHelper returns the global metrics helper which allows external
// packages to access Vault's internal metrics.
func (c *Core) MetricsHelper() *metricsutil.MetricsHelper {
@ -3707,6 +3712,39 @@ func (c *Core) GetHCPLinkStatus() (string, string) {
return status, resourceID
}
// ListenerAddresses provides a slice of configured listener addresses
func (c *Core) ListenerAddresses() ([]string, error) {
addresses := make([]string, 0)
conf := c.rawConfig.Load()
if conf == nil {
return nil, fmt.Errorf("failed to load core raw config")
}
listeners := conf.(*server.Config).Listeners
if listeners == nil {
return nil, fmt.Errorf("no listener configured")
}
for _, listener := range listeners {
addresses = append(addresses, listener.Address)
}
return addresses, nil
}
// IsRaftVoter specifies whether the node is a raft voter which is
// always false if raft storage is not in use.
func (c *Core) IsRaftVoter() bool {
raftInfo := c.raftInfo.Load().(*raftInformation)
if raftInfo == nil {
return false
}
return !raftInfo.nonVoter
}
func (c *Core) HAEnabled() bool {
return c.ha != nil && c.ha.HAEnabled()
}

View File

@ -4,8 +4,11 @@ import (
"context"
"github.com/hashicorp/hcp-link/pkg/nodestatus"
"github.com/hashicorp/vault/helper/logging"
"github.com/hashicorp/vault/vault/hcp_link/internal"
"github.com/hashicorp/vault/vault/hcp_link/proto/node_status"
"github.com/shirou/gopsutil/v3/host"
"google.golang.org/protobuf/types/known/timestamppb"
)
var (
@ -26,29 +29,53 @@ func (c *NodeStatusReporter) GetNodeStatus(ctx context.Context) (nodestatus.Node
}
replState := c.NodeStatusGetter.ReplicationState()
hostInfo, err := host.InfoWithContext(ctx)
if err != nil {
return status, err
}
listenerAddresses, err := c.NodeStatusGetter.ListenerAddresses()
if err != nil {
return status, err
}
logLevel, err := logging.ParseLogLevel(c.NodeStatusGetter.LogLevel())
if err != nil {
return status, err
}
raftStatus := &node_status.RaftStatus{}
if sealStatus.StorageType == "raft" {
raftStatus.IsVoter = c.NodeStatusGetter.IsRaftVoter()
}
protoRes := &node_status.LinkedClusterNodeStatusResponse{
Type: sealStatus.Type,
Initialized: sealStatus.Initialized,
Sealed: sealStatus.Sealed,
T: int64(sealStatus.T),
N: int64(sealStatus.N),
Progress: int64(sealStatus.Progress),
Nonce: sealStatus.Nonce,
Version: sealStatus.Version,
BuildDate: sealStatus.BuildDate,
Migration: sealStatus.Migration,
ClusterID: sealStatus.ClusterID,
ClusterName: sealStatus.ClusterName,
RecoverySeal: sealStatus.RecoverySeal,
StorageType: sealStatus.StorageType,
ReplicationState: replState.StateStrings(),
Type: sealStatus.Type,
Initialized: sealStatus.Initialized,
Sealed: sealStatus.Sealed,
T: int64(sealStatus.T),
N: int64(sealStatus.N),
Progress: int64(sealStatus.Progress),
Nonce: sealStatus.Nonce,
Version: sealStatus.Version,
BuildDate: sealStatus.BuildDate,
Migration: sealStatus.Migration,
ClusterID: sealStatus.ClusterID,
ClusterName: sealStatus.ClusterName,
RecoverySeal: sealStatus.RecoverySeal,
StorageType: sealStatus.StorageType,
ReplicationState: replState.StateStrings(),
Hostname: hostInfo.Hostname,
ListenerAddresses: listenerAddresses,
OperatingSystem: hostInfo.OS,
OperatingSystemVersion: hostInfo.PlatformVersion,
LogLevel: node_status.LogLevel(logLevel),
ActiveTime: timestamppb.New(c.NodeStatusGetter.ActiveTime()),
RaftStatus: raftStatus,
}
ns := nodestatus.NodeStatus{
StatusVersion: uint32(Version),
Status: protoRes,
}
status.StatusVersion = uint32(Version)
status.Status = protoRes
return ns, nil
return status, nil
}

View File

@ -2,6 +2,7 @@ package internal
import (
"context"
"time"
"github.com/hashicorp/vault/helper/namespace"
"github.com/hashicorp/vault/physical/raft"
@ -11,7 +12,11 @@ import (
)
type WrappedCoreNodeStatus interface {
ActiveTime() time.Time
GetSealStatus(ctx context.Context) (*vault.SealStatusResponse, error)
IsRaftVoter() bool
ListenerAddresses() ([]string, error)
LogLevel() string
ReplicationState() consts.ReplicationState
}