func (tl *TeamMaster) findServers(dc *resource.DataCenter, req *resource.AllocationRequest) (ret []resource.Allocation) { // sort racks by unallocated resources var racks []*resource.Rack for _, rack := range dc.GetRacks() { racks = append(racks, rack) } sort.Sort(ByAvailableResources(racks)) requests := make([]*resource.ComputeRequest, 0, len(req.Requests)) for i := range req.Requests { requests = append(requests, &req.Requests[i]) } sort.Sort(ByRequestedResources(requests)) for _, rack := range racks { allocated, requests := tl.allocateServersOnRack(dc, rack, requests) ret = append(ret, allocated...) if len(requests) == 0 { break } } return }
func (tl *TeamMaster) allocateServersOnRack(dc *resource.DataCenter, rack *resource.Rack, requests []*resource.ComputeRequest) ( allocated []resource.Allocation, remainingRequests []*resource.ComputeRequest) { var j = -1 for _, agent := range rack.Agents { if j >= len(requests) { break } available := agent.Resource.Minus(agent.Allocated) hasAllocation := true for available.GreaterThanZero() && hasAllocation && j < len(requests) { hasAllocation = false j++ if j >= len(requests) { break } request := requests[j] // fmt.Printf("available %v, requested %v\n", available, request.ComputeResource) if available.Covers(request.ComputeResource) { allocated = append(allocated, resource.Allocation{ Location: agent.Location, Allocated: request.ComputeResource, }) agent.Allocated = agent.Allocated.Plus(request.ComputeResource) rack.Allocated = rack.Allocated.Plus(request.ComputeResource) dc.Allocated = dc.Allocated.Plus(request.ComputeResource) tl.MasterResource.Topology.Allocated = tl.MasterResource.Topology.Allocated.Plus(request.ComputeResource) available = available.Minus(request.ComputeResource) hasAllocation = true } else { remainingRequests = append(remainingRequests, request) } } } return }