private static List<Range> aggregateRangesResource(Map<String, List<Protos.Resource>> resourceMap, String resourceName) { if (resourceMap.get(resourceName) == null) { return Collections.emptyList(); } return resourceMap.get(resourceName).stream() .flatMap(r -> r.getRanges().getRangeList().stream()) .map(r -> new Range((int) r.getBegin(), (int) r.getEnd())) .collect(Collectors.toList()); } }
/** * Gets a string representation of a range. */ public static String toString(Protos.Value.Range range) { checkNotNull(range); return String.format("%d-%d", range.getBegin(), range.getEnd()); } }
@VisibleForTesting SortedSet<Long> findPortsToUse(Offer offer, int maxCount) { SortedSet<Long> portsToUse = new TreeSet<Long>(); List<Value.Range> portRangesList = null; // Locate the port resource in the offer for (Resource resource : offer.getResourcesList()) { if (resource.getName().equals(PORT_RESOURCE_NAME)) { portRangesList = resource.getRanges().getRangeList(); break; } } LOGGER.fine("portRangesList=" + portRangesList); /** * We need to find maxCount ports to use. * We are provided a list of port ranges to use * We are assured by the offer check that we have enough ports to use */ // Check this port range for ports that we can use if (portRangesList != null) { for (Value.Range currentPortRange : portRangesList) { // Check each port until we reach the end of the current range long begin = currentPortRange.getBegin(); long end = currentPortRange.getEnd(); for (long candidatePort = begin; candidatePort <= end && portsToUse.size() < maxCount; candidatePort++) { portsToUse.add(candidatePort); } } } return portsToUse; }
Assert.assertTrue(portsResource.getRanges().getRangeList().get(0).getBegin() >= testPortBegin); Assert.assertTrue(portsResource.getRanges().getRangeList().get(0).getEnd() >= testPortEnd);
@SuppressWarnings("PMD.AvoidUsingHardCodedIP") @Test public void testReserveTaskNamedVIPPort() throws Exception { List<OfferRecommendation> recommendations = evaluator.evaluate( PodInstanceRequirementTestUtils.getVIPRequirement(80, 10000), OfferTestUtils.getCompleteOffers(ResourceTestUtils.getUnreservedPorts(10000, 10000))); Assert.assertEquals(6, recommendations.size()); Operation launchOperation = recommendations.get(4).getOperation().get(); Assert.assertFalse(recommendations.get(5).getOperation().isPresent()); TaskInfo taskInfo = launchOperation.getLaunchGroup().getTaskGroup().getTasks(0); Resource fulfilledPortResource = taskInfo.getResources(0); Assert.assertEquals(10000, fulfilledPortResource.getRanges().getRange(0).getBegin()); Assert.assertFalse(getResourceId(fulfilledPortResource).isEmpty()); DiscoveryInfo discoveryInfo = taskInfo.getDiscovery(); Assert.assertEquals(discoveryInfo.getName(), taskInfo.getName()); Assert.assertEquals(discoveryInfo.getVisibility(), DiscoveryInfo.Visibility.CLUSTER); Port discoveryPort = discoveryInfo.getPorts().getPorts(0); Assert.assertEquals(discoveryPort.getProtocol(), "tcp"); Assert.assertEquals(discoveryPort.getVisibility(), DiscoveryInfo.Visibility.EXTERNAL); Assert.assertEquals(discoveryPort.getNumber(), 10000); Label vipLabel = discoveryPort.getLabels().getLabels(0); Assert.assertTrue(vipLabel.getKey().startsWith("VIP_")); Assert.assertEquals(vipLabel.getValue(), TestConstants.VIP_NAME + "-10000:80"); Map<String, Protos.Environment.Variable> envvars = EnvUtils.toMap(taskInfo.getCommand().getEnvironment()); Assert.assertEquals(String.valueOf(10000), envvars.get(TestConstants.PORT_ENV_NAME + "_VIP_10000").getValue()); }
@SuppressWarnings("PMD.AvoidUsingHardCodedIP") @Test public void testReserveTaskDynamicVIPPort() throws Exception { List<OfferRecommendation> recommendations = evaluator.evaluate( PodInstanceRequirementTestUtils.getVIPRequirement(80, 0), OfferTestUtils.getCompleteOffers(ResourceTestUtils.getUnreservedPorts(10000, 10000))); Assert.assertEquals(6, recommendations.size()); Operation launchOperation = recommendations.get(4).getOperation().get(); Assert.assertFalse(recommendations.get(5).getOperation().isPresent()); TaskInfo taskInfo = launchOperation.getLaunchGroup().getTaskGroup().getTasks(0); Resource fulfilledPortResource = taskInfo.getResources(0); Assert.assertEquals(10000, fulfilledPortResource.getRanges().getRange(0).getBegin()); Assert.assertFalse(getResourceId(fulfilledPortResource).isEmpty()); DiscoveryInfo discoveryInfo = taskInfo.getDiscovery(); Assert.assertEquals(discoveryInfo.getName(), taskInfo.getName()); Assert.assertEquals(discoveryInfo.getVisibility(), DiscoveryInfo.Visibility.CLUSTER); Port discoveryPort = discoveryInfo.getPorts().getPorts(0); Assert.assertEquals(discoveryPort.getProtocol(), "tcp"); Assert.assertEquals(discoveryPort.getVisibility(), DiscoveryInfo.Visibility.EXTERNAL); Assert.assertEquals(discoveryPort.getNumber(), 10000); Label vipLabel = discoveryPort.getLabels().getLabels(0); Assert.assertTrue(vipLabel.getKey().startsWith("VIP_")); Assert.assertEquals(vipLabel.getValue(), TestConstants.VIP_NAME + "-0:80"); Map<String, Protos.Environment.Variable> envvars = EnvUtils.toMap(taskInfo.getCommand().getEnvironment()); Assert.assertEquals(String.valueOf(10000), envvars.get(TestConstants.PORT_ENV_NAME + "_VIP_0").getValue()); }
@Test public void testGetUpdateOfferRequirement() throws Exception { OfferRequirement requirement = provider.getNewOfferRequirement( CassandraTask.TYPE.CASSANDRA_DAEMON.name(), testTaskInfo); Protos.TaskInfo taskInfo = requirement.getTaskRequirements().iterator().next().getTaskInfo(); Assert.assertEquals(taskInfo.getName(), "test-daemon"); Assert.assertTrue(taskInfo.getTaskId().getValue().contains("test-daemon")); Assert.assertEquals("", taskInfo.getSlaveId().getValue()); List<Protos.Resource> resources = taskInfo.getResourcesList(); Assert.assertEquals(4, resources.size()); Protos.Resource cpusResource = resources.get(0); Assert.assertEquals("cpus", cpusResource.getName()); Assert.assertEquals(testCpus, cpusResource.getScalar().getValue(), 0.0); Protos.Resource memResource = resources.get(1); Assert.assertEquals("mem", memResource.getName()); Assert.assertEquals(testMem, memResource.getScalar().getValue(), 0.0); Protos.Resource diskResource = resources.get(2); Assert.assertEquals("disk", diskResource.getName()); Assert.assertEquals(testDisk, diskResource.getScalar().getValue(), 0.0); Protos.Resource portsResource = resources.get(3); Assert.assertEquals("ports", portsResource.getName()); Assert.assertTrue(portsResource.getRanges().getRangeList().get(0).getBegin() >= testPortBegin); Assert.assertTrue(portsResource.getRanges().getRangeList().get(0).getEnd() >= testPortBegin); }
private Iterator<Long> getPortMappingIterator(TaskInfo taskInfo) { List<Resource> list = taskInfo.getResourcesList(); List<Long> ports = new ArrayList<Long>(); for (Resource resource : list) { String name = resource.getName(); if ("ports".equals(name)) { Ranges ranges = resource.getRanges(); for (Range range : ranges.getRangeList()) { long startPort = range.getBegin(); long endPort = range.getEnd(); for (int i = 0; i <= endPort - startPort; i++) { ports.add(startPort + i); } } } } return ports.iterator(); }
@Test public void validPortResource() throws Exception { ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("valid-multiple-ports.yml").getFile()); DefaultServiceSpec serviceSpec = DefaultServiceSpec.newGenerator(file, SCHEDULER_CONFIG).build(); List<ResourceSpec> portsResources = serviceSpec.getPods().get(0).getTasks().get(0).getResourceSet() .getResources() .stream() .filter(r -> r.getName().equals("ports")) .collect(Collectors.toList()); Assert.assertEquals(2, portsResources.size()); Protos.Value.Ranges http = portsResources.get(0).getValue().getRanges(); Protos.Value.Ranges another = portsResources.get(1).getValue().getRanges(); Assert.assertEquals(1, http.getRangeCount()); Assert.assertEquals(1, another.getRangeCount()); Assert.assertEquals(8080, http.getRange(0).getBegin(), http.getRange(0).getEnd()); Assert.assertEquals(8088, another.getRange(0).getBegin(), another.getRange(0).getEnd()); }
/** * Create String representation of mesos protobuf Range type. */ private static String rangeToString(Range range) { String beginStr = String.valueOf(range.getBegin()); String endStr = String.valueOf(range.getEnd()); /* * A Range representing a single number still has both Range.begin * and Range.end populated, but they are set to the same value. * In that case we just return "N" instead of "N-N". */ if (range.getBegin() == range.getEnd()) { return beginStr; } else { return String.format("%s-%s", beginStr, endStr); } }
private static Interval rangeToInterval(Range range) { return Interval.of((int) range.getBegin(), (int) range.getEnd()); }
private List<Long> claimPorts(List<Value.Range> offeredPorts, int count) { List<Long> ports = new ArrayList<Long>(count); for (Value.Range range : offeredPorts) { long begin = range.getBegin(); while (ports.size() < count & range.getEnd() != begin) { ports.add(begin++); } if (ports.size() == count) { break; } } return ports; }
@JsonIgnore public long getPort() { return getValue().getRanges().getRange(0).getBegin(); }
@Test public void testMergingInternallyOverlappingRanges() { List<Range> r1 = Arrays.asList(getRange(1, 5)); List<Range> r2 = Arrays.asList(getRange(2, 4)); List<Range> mergedRanges = RangeUtils.mergeRanges(r1, r2); assertEquals(1, mergedRanges.size()); assertEquals(1, mergedRanges.get(0).getBegin()); assertEquals(5, mergedRanges.get(0).getEnd()); }
@Test public void testMergingNonOverlappingRanges() { List<Range> r1 = Arrays.asList(getRange(1, 3)); List<Range> r2 = Arrays.asList(getRange(5, 7)); List<Range> mergedRanges = RangeUtils.mergeRanges(r1, r2); assertEquals(2, mergedRanges.size()); assertEquals(1, mergedRanges.get(0).getBegin()); assertEquals(3, mergedRanges.get(0).getEnd()); assertEquals(5, mergedRanges.get(1).getBegin()); assertEquals(7, mergedRanges.get(1).getEnd()); }
@Test public void testMergingOverlappingRanges() { List<Range> r1 = Arrays.asList(getRange(1, 3)); List<Range> r2 = Arrays.asList(getRange(2, 4)); List<Range> mergedRanges = RangeUtils.mergeRanges(r1, r2); assertEquals(1, mergedRanges.size()); assertEquals(1, mergedRanges.get(0).getBegin()); assertEquals(4, mergedRanges.get(0).getEnd()); }
@Test public void testSubtractRanges() { List<Range> r1 = Arrays.asList(getRange(1, 3), getRange(5, 7)); List<Range> r2 = Arrays.asList(getRange(1, 3)); List<Range> difference = RangeUtils.subtractRanges(r1, r2); assertEquals(1, difference.size()); assertEquals(5, difference.get(0).getBegin()); assertEquals(7, difference.get(0).getEnd()); }
private static Set<Integer> getPortsInResource(Protos.Resource resource) { if (!resource.getName().equals(Constants.PORTS_RESOURCE_TYPE)) { return Collections.emptySet(); } return resource.getRanges().getRangeList().stream() .flatMap(r -> IntStream.rangeClosed((int) r.getBegin(), (int) r.getEnd()).boxed()) .filter(p -> p != 0) .collect(Collectors.toSet()); }
/** * Gets a stream of values from a range. */ public static LongStream rangeValues(Protos.Value.Range range) { checkNotNull(range); return LongStream.rangeClosed(range.getBegin(), range.getEnd()); }