update UINodes and UINodeInfo response with consul-version info added as NodeMeta, fetched from serf members

pull/17754/head
Vijay Srinivas 1 year ago committed by Vijay
parent a60b36394d
commit 931fdfc7ec

@ -220,6 +220,9 @@ const (
// WildcardSpecifier is the string which should be used for specifying a wildcard // WildcardSpecifier is the string which should be used for specifying a wildcard
// The exact semantics of the wildcard is left up to the code where its used. // The exact semantics of the wildcard is left up to the code where its used.
WildcardSpecifier = "*" WildcardSpecifier = "*"
// MetaConsulVersion is the node metadata key used to store the node's consul version
MetaConsulVersion = "consul-version"
) )
var allowedConsulMetaKeysForMeshGateway = map[string]struct{}{MetaWANFederationKey: {}} var allowedConsulMetaKeysForMeshGateway = map[string]struct{}{MetaWANFederationKey: {}}

@ -13,9 +13,12 @@ import (
"strings" "strings"
"github.com/hashicorp/go-hclog" "github.com/hashicorp/go-hclog"
"github.com/hashicorp/serf/serf"
"github.com/hashicorp/consul/acl" "github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/agent/config" "github.com/hashicorp/consul/agent/config"
"github.com/hashicorp/consul/agent/consul"
"github.com/hashicorp/consul/agent/metadata"
"github.com/hashicorp/consul/agent/structs" "github.com/hashicorp/consul/agent/structs"
"github.com/hashicorp/consul/api" "github.com/hashicorp/consul/api"
"github.com/hashicorp/consul/logging" "github.com/hashicorp/consul/logging"
@ -110,7 +113,18 @@ RPC:
return nil, err return nil, err
} }
// Get version info for all serf members into a map of key-address,value-version.
// This logic of calling 'AgentMembersMapAddrVer()' and inserting version info in this func
// can be discarded in future releases ( may be after 3 or 4 minor releases),
// when all the nodes are registered with consul-version in nodemeta.
var err error
mapAddrVer, err := AgentMembersMapAddrVer(s, req)
if err != nil {
return nil, err
}
// Use empty list instead of nil // Use empty list instead of nil
// Also check if consul-version exists in Meta, else add it
for _, info := range out.Dump { for _, info := range out.Dump {
if info.Services == nil { if info.Services == nil {
info.Services = make([]*structs.NodeService, 0) info.Services = make([]*structs.NodeService, 0)
@ -118,12 +132,21 @@ RPC:
if info.Checks == nil { if info.Checks == nil {
info.Checks = make([]*structs.HealthCheck, 0) info.Checks = make([]*structs.HealthCheck, 0)
} }
// Check if Node Meta - 'consul-version' already exists by virtue of adding
// 'consul-version' during node registration itself.
// If not, get it from mapAddrVer.
if _, ok := info.Meta[structs.MetaConsulVersion]; !ok {
if _, okver := mapAddrVer[info.Address]; okver {
info.Meta[structs.MetaConsulVersion] = mapAddrVer[info.Address]
}
}
} }
if out.Dump == nil { if out.Dump == nil {
out.Dump = make(structs.NodeDump, 0) out.Dump = make(structs.NodeDump, 0)
} }
// Use empty list instead of nil // Use empty list instead of nil
// Also check if consul-version exists in Meta, else add it
for _, info := range out.ImportedDump { for _, info := range out.ImportedDump {
if info.Services == nil { if info.Services == nil {
info.Services = make([]*structs.NodeService, 0) info.Services = make([]*structs.NodeService, 0)
@ -131,11 +154,57 @@ RPC:
if info.Checks == nil { if info.Checks == nil {
info.Checks = make([]*structs.HealthCheck, 0) info.Checks = make([]*structs.HealthCheck, 0)
} }
// Check if Node Meta - 'consul-version' already exists by virtue of adding
// 'consul-version' during node registration itself.
// If not, get it from mapAddrVer.
if _, ok := info.Meta[structs.MetaConsulVersion]; !ok {
if _, okver := mapAddrVer[info.Address]; okver {
info.Meta[structs.MetaConsulVersion] = mapAddrVer[info.Address]
}
}
} }
return append(out.Dump, out.ImportedDump...), nil return append(out.Dump, out.ImportedDump...), nil
} }
// AgentMembersMapAddrVer is used to get version info from all serf members into a
// map of key-address,value-version.
func AgentMembersMapAddrVer(s *HTTPHandlers, req *http.Request) (map[string]string, error) {
var members []serf.Member
//Get WAN Members
wanMembers := s.agent.WANMembers()
//Get LAN Members
//Get the request partition and default to that of the agent.
entMeta := s.agent.AgentEnterpriseMeta()
if err := s.parseEntMetaPartition(req, entMeta); err != nil {
return nil, err
}
filter := consul.LANMemberFilter{
Partition: entMeta.PartitionOrDefault(),
}
filter.AllSegments = true
lanMembers, err := s.agent.delegate.LANMembers(filter)
if err != nil {
return nil, err
}
//aggregate members
members = append(wanMembers, lanMembers...)
//create a map with key as IPv4 address and value as consul-version
mapAddrVer := make(map[string]string, len(members))
for i := range members {
buildVersion, err := metadata.Build(&members[i])
if err == nil {
mapAddrVer[members[i].Addr.String()] = buildVersion.String()
}
}
return mapAddrVer, nil
}
// UINodeInfo is used to get info on a single node in a given datacenter. We return a // UINodeInfo is used to get info on a single node in a given datacenter. We return a
// NodeInfo which provides overview information for the node // NodeInfo which provides overview information for the node
func (s *HTTPHandlers) UINodeInfo(resp http.ResponseWriter, req *http.Request) (interface{}, error) { func (s *HTTPHandlers) UINodeInfo(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
@ -172,6 +241,16 @@ RPC:
return nil, err return nil, err
} }
// Get version info for all serf members into a map of key-address,value-version.
// This logic of calling 'AgentMembersMapAddrVer()' and inserting version info in this func
// can be discarded in future releases ( may be after 3 or 4 minor releases),
// when all the nodes are registered with consul-version in nodemeta.
var err error
mapAddrVer, err := AgentMembersMapAddrVer(s, req)
if err != nil {
return nil, err
}
// Return only the first entry // Return only the first entry
if len(out.Dump) > 0 { if len(out.Dump) > 0 {
info := out.Dump[0] info := out.Dump[0]
@ -181,6 +260,14 @@ RPC:
if info.Checks == nil { if info.Checks == nil {
info.Checks = make([]*structs.HealthCheck, 0) info.Checks = make([]*structs.HealthCheck, 0)
} }
// Check if Node Meta - 'consul-version' already exists by virtue of adding
// 'consul-version' during node registration itself.
// If not, get it from mapAddrVer.
if _, ok := info.Meta[structs.MetaConsulVersion]; !ok {
if _, okver := mapAddrVer[info.Address]; okver {
info.Meta[structs.MetaConsulVersion] = mapAddrVer[info.Address]
}
}
return info, nil return info, nil
} }

Loading…
Cancel
Save