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; }
Ranges.Builder rangesBldr = Ranges.newBuilder();
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(); }
.setName("ports") .setType(Protos.Value.Type.RANGES) .setRanges(Protos.Value.Ranges.newBuilder() .addRange(Protos.Value.Range.newBuilder() .setBegin(31000)
Ranges.Builder rangesBldr = Ranges.newBuilder();
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(); }
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; }
@Test public void testGetPortByIndex() throws Exception{ taskResources = new Resources(1, 1, 4, 0); final Protos.Resource portsResource = Protos.Resource.newBuilder() .setName("ports") .setType(Protos.Value.Type.RANGES) .setRanges(Protos.Value.Ranges.newBuilder() .addRange( Protos.Value.Range.newBuilder() .setBegin(31003) .setEnd(31006).build()) .build()).build(); final SingularityRequest request = new SingularityRequestBuilder("test", RequestType.WORKER).build(); final SingularityDeploy deploy = new SingularityDeployBuilder("test", "1") .setCommand(Optional.of("/bin/echo")) .setArguments(Optional.of(Collections.singletonList("wat"))) .build(); final SingularityTaskRequest taskRequest = new SingularityTaskRequest(request, deploy, pendingTask); final SingularityMesosTaskHolder task = builder.buildTask(offerHolder, Collections.singletonList(portsResource), taskRequest, taskResources, executorResources); assertEquals(31005L, task.getTask().getPortByIndex(2).get().longValue()); }
public static Resource buildPortRanges(String... ranges) { Resource.Builder resources = Resource.newBuilder() .setType(Type.RANGES) .setName(MesosUtils.PORTS); Ranges.Builder rangesBuilder = Ranges.newBuilder(); for (String range : ranges) { String[] split = range.split("\\:"); rangesBuilder.addRange( Range.newBuilder() .setBegin(Long.parseLong(split[0])) .setEnd(Long.parseLong(split[1]))); } resources.setRanges(rangesBuilder); return resources.build(); }
private static Resource newRange(String name, long begin, long end) { return Resource.newBuilder().setName(name).setType(Type.RANGES).setRanges(Ranges.newBuilder().addRange(Range.newBuilder().setBegin(begin).setEnd(end).build()).build()).build(); }
.setName("ports") .setType(Protos.Value.Type.RANGES) .setRanges(Protos.Value.Ranges.newBuilder() .addRange(Protos.Value.Range.newBuilder() .setBegin(31000)
@Test public void testGetPortByIndex() throws Exception{ taskResources = new Resources(1, 1, 4, 0); final Protos.Resource portsResource = Protos.Resource.newBuilder() .setName("ports") .setType(Protos.Value.Type.RANGES) .setRanges(Protos.Value.Ranges.newBuilder() .addRange( Protos.Value.Range.newBuilder() .setBegin(31003) .setEnd(31006).build()) .build()).build(); final SingularityRequest request = new SingularityRequestBuilder("test", RequestType.WORKER).build(); final SingularityDeploy deploy = new SingularityDeployBuilder("test", "1") .setCommand(Optional.of("/bin/echo")) .setArguments(Optional.of(Collections.singletonList("wat"))) .build(); final SingularityTaskRequest taskRequest = new SingularityTaskRequest(request, deploy, pendingTask); final SingularityMesosTaskHolder task = builder.buildTask(offerHolder, Collections.singletonList(portsResource), taskRequest, taskResources, executorResources); assertEquals(31005L, task.getTask().getPortByIndex(2).get().longValue()); }
public static Resource buildPortRanges(String... ranges) { Resource.Builder resources = Resource.newBuilder() .setType(Type.RANGES) .setName(MesosUtils.PORTS); Ranges.Builder rangesBuilder = Ranges.newBuilder(); for (String range : ranges) { String[] split = range.split("\\:"); rangesBuilder.addRange( Range.newBuilder() .setBegin(Long.parseLong(split[0])) .setEnd(Long.parseLong(split[1]))); } resources.setRanges(rangesBuilder); return resources.build(); }
private static Resource newRange(String name, long begin, long end) { return Resource.newBuilder().setName(name).setType(Type.RANGES).setRanges(Ranges.newBuilder().addRange(Range.newBuilder().setBegin(begin).setEnd(end).build()).build()).build(); }