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 stream of values from a collection of range resources. */ public static LongStream rangeValues(Collection<Protos.Resource> resources) { checkNotNull(resources); return resources.stream() .filter(Protos.Resource::hasRanges) .flatMap(r -> r.getRanges().getRangeList().stream()) .flatMapToLong(Utils::rangeValues); }
List<Protos.Value.Range> remainingRanges = new ArrayList<>(available.getRanges().getRangeList()); for (ListIterator<Protos.Value.Range> j = remainingRanges.listIterator(); j.hasNext();) { if (amount <= 0) { LOG.debug("Taking {} from {}", Utils.toString(taken.getRanges()), Utils.toString(available));
private Optional<ResourceLabels> findMatchingPortSpec( Protos.Resource taskResource, Collection<ResourceSpec> resourceSpecs) Protos.Value.Ranges ranges = taskResource.getRanges(); boolean hasMultiplePorts = ranges.getRangeCount() != 1 || ranges.getRange(0).getEnd() - ranges.getRange(0).getBegin() != 0;
Protos.Resource resource = recommendation.getOperation().get().getReserve().getResources(0); Assert.assertEquals( 10000, resource.getRanges().getRange(0).getBegin(), resource.getRanges().getRange(0).getEnd()); Protos.TaskInfo.Builder taskBuilder = podInfoBuilder.getTaskBuilders().stream().findFirst().get(); boolean portInTaskEnv = false;
Protos.Resource resource = recommendation.getOperation().get().getReserve().getResources(0); Assert.assertEquals( 10000, resource.getRanges().getRange(0).getBegin(), resource.getRanges().getRange(0).getEnd()); Protos.TaskInfo.Builder taskBuilder = podInfoBuilder.getTaskBuilders().stream().findFirst().get(); boolean portInTaskEnv = false;
break; case PORTS: for (Protos.Value.Range range : r.getRanges().getRangeList()) { ResourceEntries.RangeResourceEntry rangeResourceEntry = new ResourceEntries.RangeResourceEntry(reservationType, range.getBegin(), range.getEnd()); availableResources.get(resourceType).add(rangeResourceEntry, reservationType);
break; case RANGES: value = rangesToString(r.getRanges()); break; case SET:
@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; }
@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); }
@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()); }
@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()); }
private void parseOffer(Offer offer) { // Pull out the cpus, memory, disk, and 2 ports from the offer. for (Resource resource : offer.getResourcesList()) { if (resource.getName().equals("cpus") && resource.getType() == Value.Type.SCALAR) { cpus = resource.getScalar().getValue(); cpuRole = resource.getRole(); } else if (resource.getName().equals("mem") && resource.getType() == Value.Type.SCALAR) { mem = resource.getScalar().getValue(); memRole = resource.getRole(); } else if (resource.getName().equals("disk") && resource.getType() == Value.Type.SCALAR) { disk = resource.getScalar().getValue(); diskRole = resource.getRole(); } else if (resource.getName().equals("ports") && resource.getType() == Value.Type.RANGES) { portRole = resource.getRole(); ports = resource.getRanges().getRangeList(); } } }
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(); }
public static Value getValue(Resource resource) { Type type = resource.getType(); Value.Builder builder = Value.newBuilder(); builder.setType(type); switch (type) { case SCALAR: return builder.setScalar(resource.getScalar()).build(); case RANGES: return builder.setRanges(resource.getRanges()).build(); case SET: return builder.setSet(resource.getSet()).build(); default: throw new IllegalArgumentException(String.format("Unsupported value type %s in resource %s", type, TextFormat.shortDebugString(resource))); } }
@Override public TaskProposal createProposal(OfferEvaluation offerEvaluation) { return new TaskProposal( offerEvaluation.getOffer(), taskInfoFactory.create( offerEvaluation.getTaskId(), offerEvaluation.getOffer(), offerEvaluation.getResources().stream().filter(resource -> resource.getType() != Protos.Value.Type.RANGES || !resource.getRanges().getRangeList().isEmpty()).collect(Collectors.toList()), new ExecutionParameters( offerEvaluation.getEnvironmentVariables(), offerEvaluation.getPortMappings(), offerEvaluation.getVolumeMappings() ) ) ); } }
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 string representation of a resource. */ public static String toString(Protos.Resource resource) { checkNotNull(resource); if (resource.hasScalar()) { return String.format("%s(%s):%.1f", resource.getName(), resource.getRole(), resource.getScalar().getValue()); } if (resource.hasRanges()) { return String.format("%s(%s):%s", resource.getName(), resource.getRole(), toString(resource.getRanges())); } return resource.toString(); }