use of org.apache.mesos.v1.Protos.Value.Range in project Singularity by HubSpot.
the class MesosUtils method subtractResources.
public static List<Resource> subtractResources(List<Resource> resources, List<Resource> subtract) {
List<Resource> remaining = Lists.newArrayListWithCapacity(resources.size());
for (Resource resource : resources) {
Optional<Resource> matched = getMatchingResource(resource, subtract);
if (!matched.isPresent()) {
remaining.add(resource.toBuilder().clone().build());
} else {
Resource.Builder resourceBuilder = resource.toBuilder().clone();
if (resource.hasScalar()) {
resourceBuilder.setScalar(resource.toBuilder().getScalarBuilder().setValue(resource.getScalar().getValue() - matched.get().getScalar().getValue()).build());
} else if (resource.hasRanges()) {
resourceBuilder.setRanges(subtractRanges(resource.getRanges(), matched.get().getRanges()));
} else {
throw new IllegalStateException(String.format("Can't subtract non-scalar or range resources %s", formatForLogging(resource)));
}
remaining.add(resourceBuilder.build());
}
}
return remaining;
}
use of org.apache.mesos.v1.Protos.Value.Range in project Singularity by HubSpot.
the class MesosUtils method combineResources.
public static List<Resource> combineResources(List<List<Resource>> resourcesList) {
List<Resource> resources = new ArrayList<>();
for (List<Resource> resourcesToAdd : resourcesList) {
for (Resource resource : resourcesToAdd) {
Optional<Resource> matched = getMatchingResource(resource, resources);
if (!matched.isPresent()) {
resources.add(resource);
} else {
int index = resources.indexOf(matched.get());
Resource.Builder resourceBuilder = resource.toBuilder().clone();
if (resource.hasScalar()) {
resourceBuilder.setScalar(resource.toBuilder().getScalarBuilder().setValue(resource.getScalar().getValue() + matched.get().getScalar().getValue()).build());
resources.set(index, resourceBuilder.build());
} else if (resource.hasRanges()) {
Ranges.Builder newRanges = Ranges.newBuilder();
resource.getRanges().getRangeList().forEach(newRanges::addRange);
matched.get().getRanges().getRangeList().forEach(newRanges::addRange);
resourceBuilder.setRanges(newRanges);
resources.set(index, resourceBuilder.build());
} else {
throw new IllegalStateException(String.format("Can't subtract non-scalar or range resources %s", formatForLogging(resource)));
}
}
}
}
return resources;
}
use of org.apache.mesos.v1.Protos.Value.Range in project Singularity by HubSpot.
the class MesosUtils method subtractRanges.
private static Ranges subtractRanges(Ranges ranges, Ranges toSubtract) {
Ranges.Builder newRanges = Ranges.newBuilder();
List<Range> sortedRanges = Lists.newArrayList(ranges.getRangeList());
Collections.sort(sortedRanges, RANGE_COMPARATOR);
List<Range> subtractRanges = Lists.newArrayList(toSubtract.getRangeList());
Collections.sort(subtractRanges, RANGE_COMPARATOR);
int s = 0;
for (Range range : ranges.getRangeList()) {
Range.Builder currentRange = range.toBuilder();
for (int i = s; i < subtractRanges.size(); i++) {
Range matchedRange = subtractRanges.get(i);
if (matchedRange.getBegin() < currentRange.getBegin() || matchedRange.getEnd() > currentRange.getEnd()) {
s = i;
break;
}
currentRange.setEnd(matchedRange.getBegin() - 1);
if (currentRange.getEnd() >= currentRange.getBegin()) {
newRanges.addRange(currentRange.build());
}
currentRange = Range.newBuilder();
currentRange.setBegin(matchedRange.getEnd() + 1);
currentRange.setEnd(range.getEnd());
}
if (currentRange.getEnd() >= currentRange.getBegin()) {
newRanges.addRange(currentRange.build());
}
}
return newRanges.build();
}
use of org.apache.mesos.v1.Protos.Value.Range in project Singularity by HubSpot.
the class MesosUtils method getPorts.
public static long[] getPorts(Resource portsResource, int numPorts) {
long[] ports = new long[numPorts];
if (numPorts == 0) {
return ports;
}
int idx = 0;
for (Range r : portsResource.getRanges().getRangeList()) {
for (long port = r.getBegin(); port <= r.getEnd(); port++) {
ports[idx++] = port;
if (idx >= numPorts) {
return ports;
}
}
}
return ports;
}
use of org.apache.mesos.v1.Protos.Value.Range in project Singularity by HubSpot.
the class MesosUtils method getPortsResource.
public static Resource getPortsResource(int numPorts, List<Resource> resources, List<Long> otherRequestedPorts) {
List<Long> requestedPorts = new ArrayList<>(otherRequestedPorts);
Ranges ranges = getRanges(resources, PORTS);
Preconditions.checkState(ranges.getRangeCount() > 0, "Ports %s should have existed in resources %s", PORTS, formatForLogging(resources));
Ranges.Builder rangesBldr = Ranges.newBuilder();
int portsSoFar = 0;
List<Range> offerRangeList = Lists.newArrayList(ranges.getRangeList());
Random random = new Random();
Collections.shuffle(offerRangeList, random);
if (numPorts > 0) {
for (Range range : offerRangeList) {
long rangeStartSelection = Math.max(range.getBegin(), range.getEnd() - (numPorts - portsSoFar + 1));
if (rangeStartSelection != range.getBegin()) {
int rangeDelta = (int) (rangeStartSelection - range.getBegin()) + 1;
rangeStartSelection = random.nextInt(rangeDelta) + range.getBegin();
}
long rangeEndSelection = Math.min(range.getEnd(), rangeStartSelection + (numPorts - portsSoFar - 1));
rangesBldr.addRange(Range.newBuilder().setBegin(rangeStartSelection).setEnd(rangeEndSelection));
portsSoFar += (rangeEndSelection - rangeStartSelection) + 1;
List<Long> toRemove = new ArrayList<>();
for (long port : requestedPorts) {
if (rangeStartSelection >= port && rangeEndSelection <= port) {
toRemove.add(port);
portsSoFar--;
}
}
requestedPorts.removeAll(toRemove);
if (portsSoFar == numPorts) {
break;
}
}
}
for (long port : requestedPorts) {
rangesBldr.addRange(Range.newBuilder().setBegin(port).setEnd(port).build());
}
return Resource.newBuilder().setType(Type.RANGES).setName(PORTS).setRanges(rangesBldr).build();
}