|
|
|
@ -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 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|