|
|
|
@ -13,9 +13,12 @@ import (
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"github.com/hashicorp/go-hclog"
|
|
|
|
|
"github.com/hashicorp/serf/serf"
|
|
|
|
|
|
|
|
|
|
"github.com/hashicorp/consul/acl"
|
|
|
|
|
"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/api"
|
|
|
|
|
"github.com/hashicorp/consul/logging"
|
|
|
|
@ -110,7 +113,18 @@ RPC:
|
|
|
|
|
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
|
|
|
|
|
// Also check if consul-version exists in Meta, else add it
|
|
|
|
|
for _, info := range out.Dump {
|
|
|
|
|
if info.Services == nil {
|
|
|
|
|
info.Services = make([]*structs.NodeService, 0)
|
|
|
|
@ -118,12 +132,21 @@ RPC:
|
|
|
|
|
if info.Checks == nil {
|
|
|
|
|
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 {
|
|
|
|
|
out.Dump = make(structs.NodeDump, 0)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Use empty list instead of nil
|
|
|
|
|
// Also check if consul-version exists in Meta, else add it
|
|
|
|
|
for _, info := range out.ImportedDump {
|
|
|
|
|
if info.Services == nil {
|
|
|
|
|
info.Services = make([]*structs.NodeService, 0)
|
|
|
|
@ -131,11 +154,57 @@ RPC:
|
|
|
|
|
if info.Checks == nil {
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
// NodeInfo which provides overview information for the node
|
|
|
|
|
func (s *HTTPHandlers) UINodeInfo(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
|
|
|
|
@ -172,6 +241,16 @@ RPC:
|
|
|
|
|
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
|
|
|
|
|
if len(out.Dump) > 0 {
|
|
|
|
|
info := out.Dump[0]
|
|
|
|
@ -181,6 +260,14 @@ RPC:
|
|
|
|
|
if info.Checks == nil {
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|