in pkg/hostmgr/hostsvc/handler.go [69:155]
func (m *serviceHandler) QueryHosts(
ctx context.Context,
request *host_svc.QueryHostsRequest,
) (*host_svc.QueryHostsResponse, error) {
m.metrics.QueryHostsAPI.Inc(1)
// Add request.HostStates to a set to remove duplicates
hostStateSet := stringset.New()
for _, state := range request.GetHostStates() {
hostStateSet.Add(state.String())
}
if request.HostStates == nil || len(request.HostStates) == 0 {
for _, state := range hpb.HostState_name {
hostStateSet.Add(state)
}
}
var hostInfos []*hpb.HostInfo
drainingHostsInfo, err := m.drainer.GetAllDrainingHostInfos()
if err != nil {
return nil, err
}
drainedHostsInfo, err := m.drainer.GetAllDrainedHostInfos()
if err != nil {
return nil, err
}
downHostsInfo, err := m.drainer.GetAllDownHostInfos()
if err != nil {
return nil, err
}
for _, hostState := range hostStateSet.ToSlice() {
switch hostState {
case hpb.HostState_HOST_STATE_UP.String():
upHosts, err := host.BuildHostInfoForRegisteredAgents()
if err != nil {
m.metrics.QueryHostsFail.Inc(1)
return nil, yarpcerrors.InternalErrorf(err.Error())
}
// Remove draining / drained / down hosts from the result.
// This is needed because AgentMap is updated every 15s
// and might not have the up to date information.
for _, hostInfo := range drainingHostsInfo {
delete(upHosts, hostInfo.GetHostname())
}
for _, hostInfo := range drainedHostsInfo {
delete(upHosts, hostInfo.GetHostname())
}
for _, hostInfo := range downHostsInfo {
delete(upHosts, hostInfo.GetHostname())
}
for _, hostInfo := range upHosts {
hostInfos = append(hostInfos, hostInfo)
}
case hpb.HostState_HOST_STATE_DRAINING.String():
for _, hostInfo := range drainingHostsInfo {
hostInfos = append(hostInfos, hostInfo)
}
case hpb.HostState_HOST_STATE_DRAINED.String():
for _, hostInfo := range drainedHostsInfo {
hostInfos = append(hostInfos, hostInfo)
}
case hpb.HostState_HOST_STATE_DOWN.String():
for _, hostInfo := range downHostsInfo {
hostInfos = append(hostInfos, hostInfo)
}
}
}
if m.hostPoolManager != nil {
for _, h := range hostInfos {
p, err := m.hostPoolManager.GetPoolByHostname(h.GetHostname())
if err == nil {
h.CurrentPool = p.ID()
}
d, err := m.hostPoolManager.GetDesiredPool(h.GetHostname())
if err == nil {
h.DesiredPool = d
}
}
}
m.metrics.QueryHostsSuccess.Inc(1)
return &host_svc.QueryHostsResponse{
HostInfos: hostInfos,
}, nil
}