Search in sources :

Example 1 with Range

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;
}
Also used : Resource(org.apache.mesos.v1.Protos.Resource)

Example 2 with Range

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;
}
Also used : Resource(org.apache.mesos.v1.Protos.Resource) ArrayList(java.util.ArrayList)

Example 3 with Range

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();
}
Also used : Ranges(org.apache.mesos.v1.Protos.Value.Ranges) Range(org.apache.mesos.v1.Protos.Value.Range)

Example 4 with Range

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;
}
Also used : Range(org.apache.mesos.v1.Protos.Value.Range)

Example 5 with Range

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();
}
Also used : Ranges(org.apache.mesos.v1.Protos.Value.Ranges) Random(java.util.Random) ArrayList(java.util.ArrayList) Range(org.apache.mesos.v1.Protos.Value.Range)

Aggregations

Range (org.apache.mesos.v1.Protos.Value.Range)4 Ranges (org.apache.mesos.v1.Protos.Value.Ranges)3 ArrayList (java.util.ArrayList)2 Resource (org.apache.mesos.v1.Protos.Resource)2 Random (java.util.Random)1