return Resource.newBuilder() .setType(Type.RANGES) .setName(PORTS)
private static boolean hasRequiredRole(Resource r, Optional<String> requiredRole) { if (requiredRole.isPresent() && hasRole(r)) { // required role with a resource with role return requiredRole.get().equals(r.getRole()); } else if (requiredRole.isPresent() && !hasRole(r)) { // required role with a resource for any role return false; } else if (!requiredRole.isPresent() && hasRole(r)) { // no required role but resource with role return false; } else if (!requiredRole.isPresent() && !hasRole(r)) { // no required role and resource for any role return true; } else { return false; } }
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; }
final Resource mem = memList.get(i); if (desiredRole.equals(cpus.getRole()) && desiredRole.equals(mem.getRole())) { double availableCpu = cpus.getScalar().getValue(); double availableMem = mem.getScalar().getValue(); final double cpusPerTask = state.getCpusPerTask(); final double memMbPerTask = state.getMemMbPerTask(); availableMem -= memMbPerTask; final String taskId = String.format("task-%d-%d", offerCount, state.getTotalTaskCounter().incrementAndGet()); tasks.add(sleepTask(agentId, taskId, cpus.getRole(), cpusPerTask, mem.getRole(), memMbPerTask));
.setAgentId(org.apache.mesos.v1.Protos.AgentID.newBuilder().setValue(agentId)) .setFrameworkId(org.apache.mesos.v1.Protos.FrameworkID.newBuilder().setValue(frameworkId)) .addResources(org.apache.mesos.v1.Protos.Resource.newBuilder() .setName("cpus") .setRole("*") .setType(org.apache.mesos.v1.Protos.Value.Type.SCALAR) .setScalar(org.apache.mesos.v1.Protos.Value.Scalar.newBuilder().setValue(cpus))) .addResources(org.apache.mesos.v1.Protos.Resource.newBuilder() .setName("mem") .setRole("*") .setType(org.apache.mesos.v1.Protos.Value.Type.SCALAR) .setScalar(org.apache.mesos.v1.Protos.Value.Scalar.newBuilder().setValue(mem))) .addResources(org.apache.mesos.v1.Protos.Resource.newBuilder() .setName("disk") .setRole("*")
.setAgentId(org.apache.mesos.v1.Protos.AgentID.newBuilder().setValue(agentId)) .setFrameworkId(org.apache.mesos.v1.Protos.FrameworkID.newBuilder().setValue(frameworkId)) .addResources(org.apache.mesos.v1.Protos.Resource.newBuilder() .setName("cpus") .setRole("*") .setType(org.apache.mesos.v1.Protos.Value.Type.SCALAR) .setScalar(org.apache.mesos.v1.Protos.Value.Scalar.newBuilder().setValue(cpus))) .addResources(org.apache.mesos.v1.Protos.Resource.newBuilder() .setName("mem") .setRole("*") .setType(org.apache.mesos.v1.Protos.Value.Type.SCALAR) .setScalar(org.apache.mesos.v1.Protos.Value.Scalar.newBuilder().setValue(mem))) .addResources(org.apache.mesos.v1.Protos.Resource.newBuilder() .setName("disk") .setRole("*")
return Resource.newBuilder() .setType(Type.RANGES) .setName(PORTS)
taskResources = new Resources(1, 1, 1, 0); final Protos.Resource portsResource = Protos.Resource.newBuilder() .setName("ports") .setType(Protos.Value.Type.RANGES)
.setValue("env | sort && sleep $SLEEP_SECONDS") .addResources(Resource.newBuilder() .setName("cpus") .setRole(cpusRole) .setType(Value.Type.SCALAR) .setScalar(Value.Scalar.newBuilder().setValue(cpus))) .addResources(Resource.newBuilder() .setName("mem") .setRole(memRole)
Resource.Builder cpusResource = Resource.newBuilder().setType(Type.SCALAR).setName(MesosUtils.CPUS).setScalar(Scalar.newBuilder().setValue(cpus)); Resource.Builder memoryResources = Resource.newBuilder().setType(Type.SCALAR).setName(MesosUtils.MEMORY).setScalar(Scalar.newBuilder().setValue(memory)); Resource.Builder diskResources = Resource.newBuilder().setType(Type.SCALAR).setName(MesosUtils.DISK).setScalar(Scalar.newBuilder().setValue(disk)); if(role.isPresent()) { cpusResource = cpusResource.setRole(role.get());
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()); }
@Test public void testResourceAddition() { List<List<Resource>> toAdd = ImmutableList.of( ImmutableList.of( Resource.newBuilder().setType(Type.SCALAR).setName(MesosUtils.CPUS).setScalar(Scalar.newBuilder().setValue(1)).build(), Resource.newBuilder().setType(Type.SCALAR).setName(MesosUtils.MEMORY).setScalar(Scalar.newBuilder().setValue(1024)).build() ), ImmutableList.of( Resource.newBuilder().setType(Type.SCALAR).setName(MesosUtils.CPUS).setScalar(Scalar.newBuilder().setValue(2)).build(), Resource.newBuilder().setType(Type.SCALAR).setName(MesosUtils.MEMORY).setScalar(Scalar.newBuilder().setValue(1024)).build() ), ImmutableList.of( Resource.newBuilder().setType(Type.SCALAR).setName(MesosUtils.CPUS).setScalar(Scalar.newBuilder().setValue(3)).build(), Resource.newBuilder().setType(Type.SCALAR).setName(MesosUtils.MEMORY).setScalar(Scalar.newBuilder().setValue(1024)).build() ) ); List<Resource> combined = MesosUtils.combineResources(toAdd); Assert.assertEquals(6, MesosUtils.getNumCpus(combined, Optional.absent()), 0.1); Assert.assertEquals(3072, MesosUtils.getMemory(combined, Optional.absent()), 0.1); }
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; }
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; }
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 boolean hasRequiredRole(Resource r, Optional<String> requiredRole) { if (requiredRole.isPresent() && hasRole(r)) { // required role with a resource with role return requiredRole.get().equals(r.getRole()); } else if (requiredRole.isPresent() && !hasRole(r)) { // required role with a resource for any role return false; } else if (!requiredRole.isPresent() && hasRole(r)) { // no required role but resource with role return false; } else if (!requiredRole.isPresent() && !hasRole(r)) { // no required role and resource for any role return true; } else { return false; } }
/** * <pre> * The guarantee that these resources are allocatable for the above role. * NOTE: `guarantee.role` should not specify any role except '*', * because quota does not reserve specific resources. * </pre> * * <code>repeated .mesos.v1.Resource guarantee = 3;</code> */ public org.apache.mesos.v1.Protos.Resource.Builder addGuaranteeBuilder( int index) { return getGuaranteeFieldBuilder().addBuilder( index, org.apache.mesos.v1.Protos.Resource.getDefaultInstance()); } /**
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(); }