func nodeInfo(si *mesos.SlaveInfo, ei *mesos.ExecutorInfo) NodeInfo { var executorCPU, executorMem float64 // get executor resources if ei != nil { for _, r := range ei.GetResources() { if r == nil || r.GetType() != mesos.Value_SCALAR { continue } switch r.GetName() { case "cpus": executorCPU += r.GetScalar().GetValue() case "mem": executorMem += r.GetScalar().GetValue() } } } // get resource capacity of the node ni := NodeInfo{} for _, r := range si.GetResources() { if r == nil || r.GetType() != mesos.Value_SCALAR { continue } switch r.GetName() { case "cpus": // We intentionally take the floor of executorCPU because cores are integers // and we would loose a complete cpu here if the value is <1. // TODO(sttts): switch to float64 when "Machine Allocables" are implemented ni.Cores += int(r.GetScalar().GetValue()) case "mem": ni.Mem += int64(r.GetScalar().GetValue()) * 1024 * 1024 } } // TODO(sttts): subtract executorCPU/Mem from static pod resources before subtracting them from the capacity ni.Cores -= int(executorCPU) ni.Mem -= int64(executorMem) * 1024 * 1024 return ni }