You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by ma...@apache.org on 2016/05/16 19:21:54 UTC
aurora git commit: Removing Resources and ResourceSlot classes.
Repository: aurora
Updated Branches:
refs/heads/master 5699c959f -> 8c900e585
Removing Resources and ResourceSlot classes.
Reviewed at https://reviews.apache.org/r/47325/
Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/8c900e58
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/8c900e58
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/8c900e58
Branch: refs/heads/master
Commit: 8c900e5850469784c084567369d8577441f2b2a6
Parents: 5699c95
Author: Maxim Khutornenko <ma...@apache.org>
Authored: Mon May 16 12:21:40 2016 -0700
Committer: Maxim Khutornenko <ma...@apache.org>
Committed: Mon May 16 12:21:40 2016 -0700
----------------------------------------------------------------------
.../org/apache/aurora/benchmark/Offers.java | 37 ++-
.../apache/aurora/scheduler/base/Numbers.java | 9 +
.../scheduler/mesos/MesosTaskFactory.java | 9 +-
.../scheduler/mesos/TestExecutorSettings.java | 6 +-
.../scheduler/resources/AcceptedOffer.java | 2 +-
.../resources/MesosResourceConverter.java | 6 +-
.../aurora/scheduler/resources/ResourceBag.java | 18 --
.../scheduler/resources/ResourceManager.java | 9 +
.../scheduler/resources/ResourceSlot.java | 275 -------------------
.../aurora/scheduler/resources/Resources.java | 110 --------
.../aurora/scheduler/app/SchedulerIT.java | 18 +-
.../mesos/MesosTaskFactoryImplTest.java | 38 +--
.../aurora/scheduler/mesos/TaskExecutors.java | 16 +-
.../preemptor/PreemptionVictimFilterTest.java | 18 +-
.../resources/MesosResourceConverterTest.java | 4 +-
.../scheduler/resources/ResourceSlotTest.java | 137 ---------
.../scheduler/resources/ResourceTestUtil.java | 18 ++
.../scheduler/resources/ResourcesTest.java | 76 -----
18 files changed, 136 insertions(+), 670 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/jmh/java/org/apache/aurora/benchmark/Offers.java
----------------------------------------------------------------------
diff --git a/src/jmh/java/org/apache/aurora/benchmark/Offers.java b/src/jmh/java/org/apache/aurora/benchmark/Offers.java
index c22b791..1dabe15 100644
--- a/src/jmh/java/org/apache/aurora/benchmark/Offers.java
+++ b/src/jmh/java/org/apache/aurora/benchmark/Offers.java
@@ -14,18 +14,25 @@
package org.apache.aurora.benchmark;
import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
import org.apache.aurora.common.quantity.Amount;
import org.apache.aurora.common.quantity.Data;
import org.apache.aurora.scheduler.HostOffer;
+import org.apache.aurora.scheduler.base.Numbers;
import org.apache.aurora.scheduler.offers.OfferManager;
-import org.apache.aurora.scheduler.resources.ResourceSlot;
+import org.apache.aurora.scheduler.resources.ResourceType;
import org.apache.aurora.scheduler.storage.entities.IHostAttributes;
import org.apache.mesos.Protos;
-import static org.apache.aurora.scheduler.base.TaskTestUtil.DEV_TIER;
+import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
+import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
+import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
+import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
/**
* Offer factory.
@@ -90,8 +97,13 @@ final class Offers {
int id = 0;
for (IHostAttributes attributes : hostAttributes) {
Protos.Offer offer = Protos.Offer.newBuilder()
- .addAllResources(new ResourceSlot(cpu, ram, disk, ports)
- .toResourceList(DEV_TIER))
+ .addAllResources(ImmutableSet.of(
+ makeScalar(CPUS, cpu),
+ makeScalar(RAM_MB, ram.getValue()),
+ makeScalar(DISK_MB, disk.getValue()),
+ makeRange(
+ PORTS,
+ IntStream.range(1, ports).boxed().collect(Collectors.toSet()))))
.setId(Protos.OfferID.newBuilder().setValue(String.format(OFFER_ID_FORMAT, id++)))
.setFrameworkId(Protos.FrameworkID.newBuilder().setValue(FRAMEWORK_ID))
.setSlaveId(Protos.SlaveID.newBuilder().setValue(attributes.getSlaveId()))
@@ -103,5 +115,22 @@ final class Offers {
return offers.build();
}
+
+ private static Protos.Resource makeScalar(ResourceType type, double value) {
+ return Protos.Resource.newBuilder()
+ .setType(Protos.Value.Type.SCALAR)
+ .setName(type.getMesosName())
+ .setScalar(Protos.Value.Scalar.newBuilder().setValue(value).build())
+ .build();
+ }
+
+ private static Protos.Resource makeRange(ResourceType type, Iterable<Integer> values) {
+ return Protos.Resource.newBuilder()
+ .setType(Protos.Value.Type.RANGES)
+ .setName(type.getMesosName())
+ .setRanges(Protos.Value.Ranges.newBuilder().addAllRange(
+ Iterables.transform(Numbers.toRanges(values), Numbers.RANGE_TRANSFORM)))
+ .build();
+ }
}
}
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/main/java/org/apache/aurora/scheduler/base/Numbers.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/base/Numbers.java b/src/main/java/org/apache/aurora/scheduler/base/Numbers.java
index e84070c..1b278e2 100644
--- a/src/main/java/org/apache/aurora/scheduler/base/Numbers.java
+++ b/src/main/java/org/apache/aurora/scheduler/base/Numbers.java
@@ -16,6 +16,7 @@ package org.apache.aurora.scheduler.base;
import java.util.Set;
import com.google.common.base.Function;
+import com.google.common.collect.ContiguousSet;
import com.google.common.collect.DiscreteDomain;
import com.google.common.collect.ImmutableRangeSet;
import com.google.common.collect.ImmutableSet;
@@ -41,6 +42,14 @@ public final class Numbers {
.setEnd(input.upperEndpoint())
.build();
+ /**
+ * Convert {@link org.apache.mesos.Protos.Value.Range} to set of integers.
+ */
+ public static final Function<org.apache.mesos.Protos.Value.Range, Set<Integer>> RANGE_TO_MEMBERS =
+ range -> ContiguousSet.create(
+ Range.closed((int) range.getBegin(), (int) range.getEnd()),
+ DiscreteDomain.integers());
+
private Numbers() {
// Utility class.
}
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java b/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java
index cbe2721..3b01801 100644
--- a/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java
+++ b/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java
@@ -33,8 +33,7 @@ import org.apache.aurora.scheduler.base.SchedulerException;
import org.apache.aurora.scheduler.base.Tasks;
import org.apache.aurora.scheduler.configuration.executor.ExecutorSettings;
import org.apache.aurora.scheduler.resources.AcceptedOffer;
-import org.apache.aurora.scheduler.resources.ResourceSlot;
-import org.apache.aurora.scheduler.resources.Resources;
+import org.apache.aurora.scheduler.resources.ResourceManager;
import org.apache.aurora.scheduler.storage.entities.IAppcImage;
import org.apache.aurora.scheduler.storage.entities.IAssignedTask;
import org.apache.aurora.scheduler.storage.entities.IDockerContainer;
@@ -150,7 +149,7 @@ public interface MesosTaskFactory {
task,
executorSettings.getExecutorOverhead(),
tierManager.getTier(task.getTask()));
- } catch (Resources.InsufficientResourcesException e) {
+ } catch (ResourceManager.InsufficientResourcesException e) {
throw new SchedulerException(e);
}
Iterable<Resource> resources = acceptedOffer.getTaskResources();
@@ -198,10 +197,8 @@ public interface MesosTaskFactory {
if (taskBuilder.hasExecutor()) {
taskBuilder.setData(ByteString.copyFrom(serializeTask(task)));
- return ResourceSlot.matchResourceTypes(taskBuilder.build());
- } else {
- return taskBuilder.build();
}
+ return taskBuilder.build();
}
private Optional<ContainerInfo.Builder> configureTaskForImage(IMesosContainer mesosContainer) {
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/main/java/org/apache/aurora/scheduler/mesos/TestExecutorSettings.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/mesos/TestExecutorSettings.java b/src/main/java/org/apache/aurora/scheduler/mesos/TestExecutorSettings.java
index 46973b8..1dfa97e 100644
--- a/src/main/java/org/apache/aurora/scheduler/mesos/TestExecutorSettings.java
+++ b/src/main/java/org/apache/aurora/scheduler/mesos/TestExecutorSettings.java
@@ -15,11 +15,9 @@ package org.apache.aurora.scheduler.mesos;
import com.google.common.collect.ImmutableList;
-import org.apache.aurora.scheduler.base.TaskTestUtil;
import org.apache.aurora.scheduler.configuration.executor.ExecutorConfig;
import org.apache.aurora.scheduler.configuration.executor.ExecutorSettings;
import org.apache.aurora.scheduler.configuration.executor.Executors;
-import org.apache.aurora.scheduler.resources.ResourceSlot;
import org.apache.aurora.scheduler.resources.ResourceType;
import org.apache.mesos.Protos.CommandInfo;
import org.apache.mesos.Protos.CommandInfo.URI;
@@ -70,10 +68,10 @@ public final class TestExecutorSettings {
THERMOS_CONFIG,
false /* populate discovery info */);
- public static ExecutorSettings thermosOnlyWithOverhead(ResourceSlot overhead) {
+ public static ExecutorSettings thermosOnlyWithOverhead(Iterable<Resource> resources) {
ExecutorConfig config = THERMOS_EXECUTOR.getExecutorConfig();
ExecutorInfo.Builder executor = config.getExecutor().toBuilder();
- executor.clearResources().addAllResources(overhead.toResourceList(TaskTestUtil.DEV_TIER));
+ executor.clearResources().addAllResources(resources);
return new ExecutorSettings(
new ExecutorConfig(executor.build(), config.getVolumeMounts()),
false /* populate discovery info */);
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java b/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java
index b28acd5..c100e80 100644
--- a/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java
+++ b/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java
@@ -63,7 +63,7 @@ public final class AcceptedOffer {
Offer offer,
IAssignedTask task,
ResourceBag executorOverhead,
- TierInfo tierInfo) throws Resources.InsufficientResourcesException {
+ TierInfo tierInfo) throws ResourceManager.InsufficientResourcesException {
ImmutableList.Builder<Resource> taskResources = ImmutableList.builder();
ImmutableList.Builder<Resource> executorResources = ImmutableList.builder();
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/main/java/org/apache/aurora/scheduler/resources/MesosResourceConverter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/resources/MesosResourceConverter.java b/src/main/java/org/apache/aurora/scheduler/resources/MesosResourceConverter.java
index 25d56b4..3123506 100644
--- a/src/main/java/org/apache/aurora/scheduler/resources/MesosResourceConverter.java
+++ b/src/main/java/org/apache/aurora/scheduler/resources/MesosResourceConverter.java
@@ -104,7 +104,7 @@ public interface MesosResourceConverter {
// NOTE: this will not happen as long as Veto logic from TaskAssigner.maybeAssign is
// consistent.
// Maybe we should consider implementing resource veto with this class to ensure that.
- throw new Resources.InsufficientResourcesException(
+ throw new ResourceManager.InsufficientResourcesException(
"Insufficient resource when allocating from offer");
}
return result.build();
@@ -132,7 +132,7 @@ public interface MesosResourceConverter {
ImmutableList.Builder<Resource> result = ImmutableList.builder();
for (Resource.Builder r : offerResources) {
Set<Integer> fromResource = Sets.newHashSet(Iterables.concat(
- Iterables.transform(r.getRanges().getRangeList(), Resources.RANGE_TO_MEMBERS)));
+ Iterables.transform(r.getRanges().getRangeList(), Numbers.RANGE_TO_MEMBERS)));
Set<Integer> available = Sets.newHashSet(Sets.intersection(leftOver, fromResource));
if (available.isEmpty()) {
continue;
@@ -156,7 +156,7 @@ public interface MesosResourceConverter {
// NOTE: this will not happen as long as Veto logic from TaskAssigner.maybeAssign is
// consistent.
// Maybe we should consider implementing resource veto with this class to ensure that.
- throw new Resources.InsufficientResourcesException(
+ throw new ResourceManager.InsufficientResourcesException(
"Insufficient resource for range type when allocating from offer");
}
return result.build();
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/main/java/org/apache/aurora/scheduler/resources/ResourceBag.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/resources/ResourceBag.java b/src/main/java/org/apache/aurora/scheduler/resources/ResourceBag.java
index 390654b..3cff946 100644
--- a/src/main/java/org/apache/aurora/scheduler/resources/ResourceBag.java
+++ b/src/main/java/org/apache/aurora/scheduler/resources/ResourceBag.java
@@ -22,14 +22,10 @@ import java.util.stream.Stream;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;
-import org.apache.aurora.common.quantity.Amount;
-import org.apache.aurora.common.quantity.Data;
-
import static java.util.stream.Collectors.toMap;
import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
-import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
/**
@@ -177,20 +173,6 @@ public class ResourceBag {
.collect(toMap(Map.Entry::getKey, Map.Entry::getValue)));
}
- /**
- * Temporary bridge between bag and slot to facilitate migration.
- *
- * TODO(maxim): remove together with ResourceSlot.
- * @return ResourceSlot.
- */
- public ResourceSlot toSlot() {
- return new ResourceSlot(
- valueOf(CPUS),
- Amount.of(valueOf(RAM_MB).longValue(), Data.MB),
- Amount.of(valueOf(DISK_MB).longValue(), Data.MB),
- valueOf(PORTS).intValue());
- }
-
private ResourceBag binaryOp(ResourceBag other, BinaryOperator<Double> operator) {
ImmutableMap.Builder<ResourceType, Double> builder = ImmutableMap.builder();
for (Map.Entry<ResourceType, Double> entry : resourceVectors.entrySet()) {
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java b/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java
index cc1d758..caacc58 100644
--- a/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java
+++ b/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java
@@ -280,4 +280,13 @@ public final class ResourceManager {
.reduce(REDUCE_VALUES)
.orElse(0.0))));
}
+
+ /**
+ * Thrown when there are insufficient resources to satisfy a request.
+ */
+ public static class InsufficientResourcesException extends RuntimeException {
+ InsufficientResourcesException(String message) {
+ super(message);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/main/java/org/apache/aurora/scheduler/resources/ResourceSlot.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/resources/ResourceSlot.java b/src/main/java/org/apache/aurora/scheduler/resources/ResourceSlot.java
deleted file mode 100644
index 81a3bf8..0000000
--- a/src/main/java/org/apache/aurora/scheduler/resources/ResourceSlot.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.aurora.scheduler.resources;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Consumer;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-
-import org.apache.aurora.common.quantity.Amount;
-import org.apache.aurora.common.quantity.Data;
-import org.apache.aurora.scheduler.TierInfo;
-import org.apache.aurora.scheduler.base.Numbers;
-import org.apache.aurora.scheduler.storage.entities.ITaskConfig;
-import org.apache.mesos.Protos;
-import org.apache.mesos.Protos.ExecutorInfo;
-import org.apache.mesos.Protos.Resource;
-import org.apache.mesos.Protos.Resource.Builder;
-import org.apache.mesos.Protos.TaskInfo;
-
-import static java.util.Objects.requireNonNull;
-
-import static org.apache.aurora.common.quantity.Data.BYTES;
-import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
-import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
-import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
-import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
-
-/**
- * Represents a single task/host aggregate resource vector unaware of any Mesos resource traits.
- */
-public final class ResourceSlot {
-
- private final double numCpus;
- private final Amount<Long, Data> disk;
- private final Amount<Long, Data> ram;
- private final int numPorts;
-
- /**
- * Empty ResourceSlot value.
- */
- public static final ResourceSlot NONE =
- new ResourceSlot(0, Amount.of(0L, Data.BITS), Amount.of(0L, Data.BITS), 0);
-
- public ResourceSlot(
- double numCpus,
- Amount<Long, Data> ram,
- Amount<Long, Data> disk,
- int numPorts) {
-
- this.numCpus = numCpus;
- this.ram = requireNonNull(ram);
- this.disk = requireNonNull(disk);
- this.numPorts = numPorts;
- }
-
- /**
- * Extracts the resources required from a task.
- *
- * @param task Task to get resources from.
- * @return The resources required by the task.
- */
- public static ResourceSlot from(ITaskConfig task) {
- requireNonNull(task);
- return new ResourceSlot(
- task.getNumCpus(),
- Amount.of(task.getRamMb(), Data.MB),
- Amount.of(task.getDiskMb(), Data.MB),
- Iterables.size(ResourceManager.getTaskResources(task, PORTS)));
- }
-
- /**
- * Ensures that the revocable setting on the executor and task CPU resources match.
- *
- * @param task Task to check for resource type alignment.
- * @return A possibly-modified task, with aligned CPU resource types.
- */
- public static TaskInfo matchResourceTypes(TaskInfo task) {
- TaskInfo.Builder taskBuilder = task.toBuilder();
-
- Optional<Resource> revocableTaskCpu = taskBuilder.getResourcesList().stream()
- .filter(r -> r.getName().equals(CPUS.getMesosName()))
- .filter(Resource::hasRevocable)
- .findFirst();
- ExecutorInfo.Builder executorBuilder = taskBuilder.getExecutorBuilder();
-
- Consumer<Builder> matchRevocable = builder -> {
- if (revocableTaskCpu.isPresent()) {
- builder.setRevocable(revocableTaskCpu.get().getRevocable());
- } else {
- builder.clearRevocable();
- }
- };
-
- executorBuilder.getResourcesBuilderList().stream()
- .filter(r -> r.getName().equals(CPUS.getMesosName()))
- .forEach(matchRevocable);
-
- return taskBuilder.build();
- }
-
- /**
- * Convenience method for adapting to Mesos resources without applying a port range.
- *
- * @param tierInfo Task tier info.
- * @return Mesos resources.
- */
- public List<Protos.Resource> toResourceList(TierInfo tierInfo) {
- return ImmutableList.<Protos.Resource>builder()
- .add(makeMesosResource(CPUS, numCpus, tierInfo.isRevocable()))
- .add(makeMesosResource(DISK_MB, disk.as(Data.MB), false))
- .add(makeMesosResource(RAM_MB, ram.as(Data.MB), false))
- .build();
- }
-
- /**
- * Creates a mesos resource of integer ranges.
- *
- * @param resourceType Resource type.
- * @param values Values to translate into ranges.
- * @return A new mesos ranges resource.
- */
- @VisibleForTesting
- public static Protos.Resource makeMesosRangeResource(
- ResourceType resourceType,
- Set<Integer> values) {
-
- return Protos.Resource.newBuilder()
- .setName(resourceType.getMesosName())
- .setType(Protos.Value.Type.RANGES)
- .setRanges(Protos.Value.Ranges.newBuilder()
- .addAllRange(Iterables.transform(Numbers.toRanges(values), Numbers.RANGE_TRANSFORM)))
- .build();
- }
-
- /**
- * Creates a scalar mesos resource.
- *
- * @param resourceType Resource type.
- * @param value Value for the resource.
- * @param revocable Flag indicating if this resource is revocable.
- * @return A mesos resource.
- */
- @VisibleForTesting
- static Protos.Resource makeMesosResource(
- ResourceType resourceType,
- double value,
- boolean revocable) {
-
- Protos.Resource.Builder builder = Protos.Resource.newBuilder()
- .setName(resourceType.getMesosName())
- .setType(Protos.Value.Type.SCALAR)
- .setScalar(Protos.Value.Scalar.newBuilder().setValue(value));
-
- if (revocable) {
- builder.setRevocable(Protos.Resource.RevocableInfo.newBuilder());
- }
-
- return builder.build();
- }
-
- /**
- * Number of CPUs.
- *
- * @return CPUs.
- */
- public double getNumCpus() {
- return numCpus;
- }
-
- /**
- * Disk amount.
- *
- * @return Disk.
- */
- public Amount<Long, Data> getDisk() {
- return disk;
- }
-
- /**
- * RAM amount.
- *
- * @return RAM.
- */
- public Amount<Long, Data> getRam() {
- return ram;
- }
-
- /**
- * Number of ports.
- *
- * @return Port count.
- */
- public int getNumPorts() {
- return numPorts;
- }
-
- @Override
- public boolean equals(Object o) {
- if (!(o instanceof ResourceSlot)) {
- return false;
- }
-
- ResourceSlot other = (ResourceSlot) o;
- return Objects.equals(numCpus, other.numCpus)
- && Objects.equals(ram, other.ram)
- && Objects.equals(disk, other.disk)
- && Objects.equals(numPorts, other.numPorts);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(numCpus, ram, disk, numPorts);
- }
-
- /**
- * Sums up all resources in {@code slots}.
- *
- * @param slots Resource slots to sum up.
- * @return Sum of all resource slots.
- */
- public static ResourceSlot sum(Iterable<ResourceSlot> slots) {
- ResourceSlot sum = NONE;
-
- for (ResourceSlot r : slots) {
- sum = sum.add(r);
- }
-
- return sum;
- }
-
- /**
- * Adds {@code other}.
- *
- * @param other Resource slot to add.
- * @return Result.
- */
- public ResourceSlot add(ResourceSlot other) {
- return new ResourceSlot(
- getNumCpus() + other.getNumCpus(),
- Amount.of(getRam().as(BYTES) + other.getRam().as(BYTES), BYTES),
- Amount.of(getDisk().as(BYTES) + other.getDisk().as(BYTES), BYTES),
- getNumPorts() + other.getNumPorts());
- }
-
- /**
- * Subtracts {@code other}.
- *
- * @param other Resource slot to subtract.
- * @return Result.
- */
- public ResourceSlot subtract(ResourceSlot other) {
- return new ResourceSlot(
- getNumCpus() - other.getNumCpus(),
- Amount.of(getRam().as(BYTES) - other.getRam().as(BYTES), BYTES),
- Amount.of(getDisk().as(BYTES) - other.getDisk().as(BYTES), BYTES),
- getNumPorts() - other.getNumPorts());
- }
-}
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/main/java/org/apache/aurora/scheduler/resources/Resources.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/resources/Resources.java b/src/main/java/org/apache/aurora/scheduler/resources/Resources.java
deleted file mode 100644
index 2ced8dd..0000000
--- a/src/main/java/org/apache/aurora/scheduler/resources/Resources.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.aurora.scheduler.resources;
-
-import java.util.Set;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ContiguousSet;
-import com.google.common.collect.DiscreteDomain;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-
-import org.apache.aurora.common.quantity.Amount;
-import org.apache.aurora.common.quantity.Data;
-import org.apache.aurora.scheduler.TierInfo;
-import org.apache.mesos.Protos.Offer;
-import org.apache.mesos.Protos.Resource;
-import org.apache.mesos.Protos.Value.Range;
-
-import static java.util.Objects.requireNonNull;
-
-import static org.apache.aurora.scheduler.resources.ResourceManager.NON_REVOCABLE;
-import static org.apache.aurora.scheduler.resources.ResourceManager.REVOCABLE;
-import static org.apache.aurora.scheduler.resources.ResourceManager.quantityOfMesosResource;
-import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
-import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
-import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
-import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
-
-/**
- * A container for multiple Mesos resource vectors.
- */
-public final class Resources {
- /**
- * Convert range to set of integers.
- */
- public static final Function<Range, Set<Integer>> RANGE_TO_MEMBERS =
- range -> ContiguousSet.create(
- com.google.common.collect.Range.closed((int) range.getBegin(), (int) range.getEnd()),
- DiscreteDomain.integers());
-
- private final Iterable<Resource> mesosResources;
-
- private Resources(Iterable<Resource> mesosResources) {
- this.mesosResources = ImmutableList.copyOf(mesosResources);
- }
-
- /**
- * Extracts the resources available in a slave offer.
- *
- * @param offer Offer to get resources from.
- * @return The resources available in the offer.
- */
- public static Resources from(Offer offer) {
- return new Resources(requireNonNull(offer.getResourcesList()));
- }
-
- /**
- * Filters resources by the provided {@code predicate}.
- *
- * @param predicate Predicate filter.
- * @return A new {@code Resources} object containing only filtered Mesos resources.
- */
- public Resources filter(Predicate<Resource> predicate) {
- return new Resources(Iterables.filter(mesosResources, predicate));
- }
-
- /**
- * Filters resources using the provided {@code tierInfo} instance.
- *
- * @param tierInfo Tier info.
- * @return A new {@code Resources} object containing only filtered Mesos resources.
- */
- public Resources filter(TierInfo tierInfo) {
- return filter(tierInfo.isRevocable() ? REVOCABLE : NON_REVOCABLE);
- }
-
- /**
- * Gets generalized aggregated resource view.
- *
- * @return {@code ResourceSlot} instance.
- */
- public ResourceSlot slot() {
- return new ResourceSlot(quantityOfMesosResource(mesosResources, CPUS),
- Amount.of(quantityOfMesosResource(mesosResources, RAM_MB).longValue(), Data.MB),
- Amount.of(quantityOfMesosResource(mesosResources, DISK_MB).longValue(), Data.MB),
- quantityOfMesosResource(mesosResources, PORTS).intValue());
- }
-
- /**
- * Thrown when there are insufficient resources to satisfy a request.
- */
- public static class InsufficientResourcesException extends RuntimeException {
- InsufficientResourcesException(String message) {
- super(message);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java b/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java
index 1e9e1ae..8c8c793 100644
--- a/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java
+++ b/src/test/java/org/apache/aurora/scheduler/app/SchedulerIT.java
@@ -16,6 +16,7 @@ package org.apache.aurora.scheduler.app;
import java.io.File;
import java.net.InetSocketAddress;
import java.util.Arrays;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -41,8 +42,6 @@ import com.google.inject.Module;
import org.apache.aurora.GuavaUtils;
import org.apache.aurora.codec.ThriftBinaryCodec.CodingException;
import org.apache.aurora.common.application.Lifecycle;
-import org.apache.aurora.common.quantity.Amount;
-import org.apache.aurora.common.quantity.Data;
import org.apache.aurora.common.stats.Stats;
import org.apache.aurora.common.zookeeper.Credentials;
import org.apache.aurora.common.zookeeper.ServerSetImpl;
@@ -73,7 +72,6 @@ import org.apache.aurora.scheduler.log.Log.Stream;
import org.apache.aurora.scheduler.mesos.DriverFactory;
import org.apache.aurora.scheduler.mesos.DriverSettings;
import org.apache.aurora.scheduler.mesos.TestExecutorSettings;
-import org.apache.aurora.scheduler.resources.ResourceSlot;
import org.apache.aurora.scheduler.storage.backup.BackupModule;
import org.apache.aurora.scheduler.storage.entities.IHostAttributes;
import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
@@ -83,6 +81,7 @@ import org.apache.aurora.scheduler.storage.log.LogStorageModule;
import org.apache.aurora.scheduler.storage.log.SnapshotStoreImpl;
import org.apache.aurora.scheduler.storage.log.testing.LogOpMatcher;
import org.apache.aurora.scheduler.storage.log.testing.LogOpMatcher.StreamMatcher;
+import org.apache.mesos.Protos;
import org.apache.mesos.Protos.FrameworkID;
import org.apache.mesos.Protos.MasterInfo;
import org.apache.mesos.Protos.Status;
@@ -99,6 +98,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.apache.aurora.common.testing.easymock.EasyMockTest.createCapture;
+import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosScalar;
+import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
+import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
import static org.apache.mesos.Protos.FrameworkInfo;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.createControl;
@@ -184,13 +186,11 @@ public class SchedulerIT extends BaseZooKeeperClientTest {
bind(DriverFactory.class).toInstance(driverFactory);
bind(DriverSettings.class).toInstance(SETTINGS);
bind(Log.class).toInstance(log);
- ResourceSlot executorOverhead = new ResourceSlot(
- 0.1,
- Amount.of(1L, Data.MB),
- Amount.of(0L, Data.MB),
- 0);
+ Set<Protos.Resource> overhead = ImmutableSet.of(
+ mesosScalar(CPUS, 0.1),
+ mesosScalar(RAM_MB, 1));
bind(ExecutorSettings.class)
- .toInstance(TestExecutorSettings.thermosOnlyWithOverhead(executorOverhead));
+ .toInstance(TestExecutorSettings.thermosOnlyWithOverhead(overhead));
install(new BackupModule(backupDir, SnapshotStoreImpl.class));
bind(IServerInfo.class).toInstance(
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java b/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java
index b2dd7ad..58785bf 100644
--- a/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java
@@ -13,6 +13,7 @@
*/
package org.apache.aurora.scheduler.mesos;
+import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -70,8 +71,10 @@ import static org.apache.aurora.scheduler.mesos.TestExecutorSettings.THERMOS_CON
import static org.apache.aurora.scheduler.mesos.TestExecutorSettings.THERMOS_EXECUTOR;
import static org.apache.aurora.scheduler.resources.ResourceManager.bagFromMesosResources;
import static org.apache.aurora.scheduler.resources.ResourceManager.bagFromResources;
-import static org.apache.aurora.scheduler.resources.ResourceSlot.makeMesosRangeResource;
+import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosRange;
+import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosScalarFromBag;
import static org.apache.aurora.scheduler.resources.ResourceTestUtil.resetPorts;
+import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -116,19 +119,15 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
.setFrameworkId(Protos.FrameworkID.newBuilder().setValue("framework-id"))
.setSlaveId(SLAVE)
.setHostname("slave-hostname")
- .addAllResources(
- bagFromResources(TASK_CONFIG.getResources()).add(THERMOS_EXECUTOR.getExecutorOverhead())
- .toSlot()
- .toResourceList(DEV_TIER))
- .addResources(makeMesosRangeResource(ResourceType.PORTS, ImmutableSet.of(80)))
+ .addAllResources(mesosScalarFromBag(bagFromResources(
+ TASK_CONFIG.getResources()).add(THERMOS_EXECUTOR.getExecutorOverhead())))
+ .addResources(mesosRange(PORTS, 80))
.build();
private static final Offer OFFER_SOME_OVERHEAD_EXECUTOR = OFFER_THERMOS_EXECUTOR.toBuilder()
.clearResources()
- .addAllResources(bagFromResources(TASK_CONFIG.getResources())
- .add(SOME_OVERHEAD_EXECUTOR.getExecutorOverhead())
- .toSlot()
- .toResourceList(DEV_TIER))
- .addResources(makeMesosRangeResource(ResourceType.PORTS, ImmutableSet.of(80)))
+ .addAllResources(mesosScalarFromBag(bagFromResources(
+ TASK_CONFIG.getResources()).add(SOME_OVERHEAD_EXECUTOR.getExecutorOverhead())))
+ .addResources(mesosRange(PORTS, 80))
.build();
private static final String CLUSTER_NAME = "cluster_name";
@@ -191,12 +190,19 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
expect(tierManager.getTier(TASK_CONFIG)).andReturn(REVOCABLE_TIER);
taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
- Resource revocableCPU = OFFER_THERMOS_EXECUTOR.getResources(0).toBuilder()
- .setRevocable(Resource.RevocableInfo.getDefaultInstance())
- .build();
+ List<Resource> revocable = OFFER_THERMOS_EXECUTOR.getResourcesList().stream()
+ .map(r -> {
+ ResourceType type = ResourceType.fromResource(r);
+ if (type.isMesosRevocable()) {
+ r = r.toBuilder().setRevocable(Resource.RevocableInfo.getDefaultInstance()).build();
+ }
+ return r;
+ })
+ .collect(Collectors.toList());
+
Offer withRevocable = OFFER_THERMOS_EXECUTOR.toBuilder()
- .removeResources(0)
- .addResources(0, revocableCPU)
+ .clearResources()
+ .addAllResources(revocable)
.build();
control.replay();
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/test/java/org/apache/aurora/scheduler/mesos/TaskExecutors.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/mesos/TaskExecutors.java b/src/test/java/org/apache/aurora/scheduler/mesos/TaskExecutors.java
index 651cfa7..0ab4659 100644
--- a/src/test/java/org/apache/aurora/scheduler/mesos/TaskExecutors.java
+++ b/src/test/java/org/apache/aurora/scheduler/mesos/TaskExecutors.java
@@ -13,10 +13,13 @@
*/
package org.apache.aurora.scheduler.mesos;
-import org.apache.aurora.common.quantity.Amount;
-import org.apache.aurora.common.quantity.Data;
+import com.google.common.collect.ImmutableSet;
+
import org.apache.aurora.scheduler.configuration.executor.ExecutorSettings;
-import org.apache.aurora.scheduler.resources.ResourceSlot;
+
+import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosScalar;
+import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
+import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
/**
* Utility class to contain constants related to setting up executor settings.
@@ -28,9 +31,10 @@ public final class TaskExecutors {
}
public static final ExecutorSettings NO_OVERHEAD_EXECUTOR =
- TestExecutorSettings.thermosOnlyWithOverhead(ResourceSlot.NONE);
+ TestExecutorSettings.thermosOnlyWithOverhead(ImmutableSet.of());
public static final ExecutorSettings SOME_OVERHEAD_EXECUTOR =
- TestExecutorSettings.thermosOnlyWithOverhead(
- new ResourceSlot(0.01, Amount.of(256L, Data.MB), Amount.of(0L, Data.MB), 0));
+ TestExecutorSettings.thermosOnlyWithOverhead(ImmutableSet.of(
+ mesosScalar(CPUS, 0.01),
+ mesosScalar(RAM_MB, 256)));
}
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/test/java/org/apache/aurora/scheduler/preemptor/PreemptionVictimFilterTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/preemptor/PreemptionVictimFilterTest.java b/src/test/java/org/apache/aurora/scheduler/preemptor/PreemptionVictimFilterTest.java
index 99a980a..88beda7 100644
--- a/src/test/java/org/apache/aurora/scheduler/preemptor/PreemptionVictimFilterTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/preemptor/PreemptionVictimFilterTest.java
@@ -15,6 +15,7 @@ package org.apache.aurora.scheduler.preemptor;
import java.util.List;
import java.util.Set;
+import java.util.stream.IntStream;
import com.google.common.base.Optional;
import com.google.common.collect.FluentIterable;
@@ -41,7 +42,6 @@ import org.apache.aurora.scheduler.filter.SchedulingFilter.Veto;
import org.apache.aurora.scheduler.filter.SchedulingFilterImpl;
import org.apache.aurora.scheduler.mesos.TaskExecutors;
import org.apache.aurora.scheduler.resources.ResourceBag;
-import org.apache.aurora.scheduler.resources.ResourceSlot;
import org.apache.aurora.scheduler.resources.ResourceTestUtil;
import org.apache.aurora.scheduler.resources.ResourceType;
import org.apache.aurora.scheduler.stats.CachedCounters;
@@ -56,6 +56,8 @@ import org.easymock.IExpectationSetters;
import org.junit.Before;
import org.junit.Test;
+import static java.util.stream.Collectors.toSet;
+
import static org.apache.aurora.gen.MaintenanceMode.NONE;
import static org.apache.aurora.gen.ScheduleStatus.RUNNING;
import static org.apache.aurora.scheduler.base.TaskTestUtil.DEV_TIER;
@@ -65,7 +67,11 @@ import static org.apache.aurora.scheduler.filter.AttributeAggregate.EMPTY;
import static org.apache.aurora.scheduler.preemptor.PreemptionVictimFilter.PreemptionVictimFilterImpl.ORDER;
import static org.apache.aurora.scheduler.preemptor.PreemptorMetrics.MISSING_ATTRIBUTES_NAME;
import static org.apache.aurora.scheduler.resources.ResourceTestUtil.bag;
+import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosRange;
+import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosScalar;
import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
+import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
+import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
import static org.apache.mesos.Protos.Offer;
import static org.apache.mesos.Protos.Resource;
@@ -560,8 +566,14 @@ public class PreemptionVictimFilterTest extends EasyMockTest {
int numPorts,
boolean revocable) {
- List<Resource> resources =
- new ResourceSlot(cpu, ram, disk, numPorts).toResourceList(DEV_TIER);
+ List<Resource> resources = ImmutableList.of(
+ mesosScalar(CPUS, cpu),
+ mesosScalar(RAM_MB, ram.getValue()),
+ mesosScalar(DISK_MB, disk.getValue()),
+ mesosRange(
+ PORTS,
+ Optional.absent(),
+ IntStream.range(1, numPorts).boxed().collect(toSet())));
if (revocable) {
resources = ImmutableList.<Resource>builder()
.addAll(FluentIterable.from(resources)
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/test/java/org/apache/aurora/scheduler/resources/MesosResourceConverterTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/resources/MesosResourceConverterTest.java b/src/test/java/org/apache/aurora/scheduler/resources/MesosResourceConverterTest.java
index a8c93f9..2f67ef4 100644
--- a/src/test/java/org/apache/aurora/scheduler/resources/MesosResourceConverterTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/resources/MesosResourceConverterTest.java
@@ -83,7 +83,7 @@ public class MesosResourceConverterTest {
assertEquals(expected, actual);
}
- @Test(expected = Resources.InsufficientResourcesException.class)
+ @Test(expected = ResourceManager.InsufficientResourcesException.class)
public void testAllocateRangeInsufficent() {
RANGES.toMesosResource(
ImmutableSet.of(mesosRange(PORTS, Optional.absent(), 80, 81, 90, 91, 92).toBuilder()),
@@ -121,7 +121,7 @@ public class MesosResourceConverterTest {
assertEquals(expected, actual);
}
- @Test(expected = Resources.InsufficientResourcesException.class)
+ @Test(expected = ResourceManager.InsufficientResourcesException.class)
public void testAllocateScalarInsufficent() {
SCALAR.toMesosResource(
ImmutableSet.of(mesosScalar(RAM_MB, 32.0).toBuilder()),
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/test/java/org/apache/aurora/scheduler/resources/ResourceSlotTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/resources/ResourceSlotTest.java b/src/test/java/org/apache/aurora/scheduler/resources/ResourceSlotTest.java
deleted file mode 100644
index 1f1cb18..0000000
--- a/src/test/java/org/apache/aurora/scheduler/resources/ResourceSlotTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.aurora.scheduler.resources;
-
-import java.util.Set;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-
-import org.apache.aurora.common.collections.Pair;
-import org.apache.aurora.common.quantity.Amount;
-import org.apache.aurora.common.quantity.Data;
-import org.apache.aurora.gen.TaskConfig;
-import org.apache.aurora.scheduler.storage.entities.ITaskConfig;
-import org.apache.mesos.Protos;
-import org.junit.Test;
-
-import static org.apache.aurora.scheduler.base.TaskTestUtil.DEV_TIER;
-import static org.apache.aurora.scheduler.base.TaskTestUtil.REVOCABLE_TIER;
-import static org.apache.aurora.scheduler.resources.ResourceSlot.makeMesosRangeResource;
-import static org.apache.aurora.scheduler.resources.ResourceSlot.makeMesosResource;
-import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
-import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
-import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
-import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-public class ResourceSlotTest {
-
- private static final ResourceSlot NEGATIVE_ONE =
- new ResourceSlot(-1.0, Amount.of(-1L, Data.MB), Amount.of(-1L, Data.MB), -1);
- private static final ResourceSlot ONE =
- new ResourceSlot(1.0, Amount.of(1L, Data.MB), Amount.of(1L, Data.MB), 1);
- private static final ResourceSlot TWO =
- new ResourceSlot(2.0, Amount.of(2L, Data.MB), Amount.of(2L, Data.MB), 2);
- private static final ResourceSlot THREE =
- new ResourceSlot(3.0, Amount.of(3L, Data.MB), Amount.of(3L, Data.MB), 3);
- private static final ITaskConfig TASK = ITaskConfig.build(new TaskConfig()
- .setNumCpus(1.0)
- .setRamMb(1024)
- .setDiskMb(2048)
- .setRequestedPorts(ImmutableSet.of("http", "debug")));
-
- @Test
- public void testSubtract() {
- assertEquals(ONE, TWO.subtract(ONE));
- assertEquals(TWO, THREE.subtract(ONE));
- assertEquals(NEGATIVE_ONE, ONE.subtract(TWO));
- assertEquals(NEGATIVE_ONE, TWO.subtract(THREE));
- }
-
- @Test
- public void testToResourceListNoRevoca() {
- ResourceSlot resources = ResourceSlot.from(TASK);
- assertEquals(
- ImmutableSet.of(
- makeMesosResource(CPUS, TASK.getNumCpus(), false),
- makeMesosResource(RAM_MB, TASK.getRamMb(), false),
- makeMesosResource(DISK_MB, TASK.getDiskMb(), false)),
- ImmutableSet.copyOf(resources.toResourceList(DEV_TIER)));
- }
-
- @Test
- public void testToResourceListRevocable() {
- ResourceSlot resources = ResourceSlot.from(TASK);
- assertEquals(
- ImmutableSet.of(
- makeMesosResource(CPUS, TASK.getNumCpus(), true),
- makeMesosResource(RAM_MB, TASK.getRamMb(), false),
- makeMesosResource(DISK_MB, TASK.getDiskMb(), false)),
- ImmutableSet.copyOf(resources.toResourceList(REVOCABLE_TIER)));
- }
-
- @Test
- public void testToResourceListNoPorts() {
- ResourceSlot resources = ResourceSlot.from(TASK);
- assertEquals(
- ImmutableSet.of(
- makeMesosResource(CPUS, TASK.getNumCpus(), true),
- makeMesosResource(RAM_MB, TASK.getRamMb(), false),
- makeMesosResource(DISK_MB, TASK.getDiskMb(), false)),
- ImmutableSet.copyOf(resources.toResourceList(REVOCABLE_TIER)));
- }
-
- @Test
- public void testRangeResourceEmpty() {
- expectRanges(ImmutableSet.of(), ImmutableSet.of());
- }
-
- @Test
- public void testRangeResourceOneEntry() {
- expectRanges(ImmutableSet.of(Pair.of(5L, 5L)), ImmutableSet.of(5));
- expectRanges(ImmutableSet.of(Pair.of(0L, 0L)), ImmutableSet.of(0));
- }
-
- @Test
- public void testRangeResourceNonContiguous() {
- expectRanges(ImmutableSet.of(Pair.of(1L, 1L), Pair.of(3L, 3L), Pair.of(5L, 5L)),
- ImmutableSet.of(5, 1, 3));
- }
-
- @Test
- public void testRangeResourceContiguous() {
- expectRanges(ImmutableSet.of(Pair.of(1L, 2L), Pair.of(4L, 5L), Pair.of(7L, 9L)),
- ImmutableSet.of(8, 2, 4, 5, 7, 9, 1));
- }
-
- @Test
- public void testEqualsBadType() {
- ResourceSlot resources = ResourceSlot.from(TASK);
- assertNotEquals(resources, "Hello");
- assertNotEquals(resources, null);
- }
-
- private void expectRanges(Set<Pair<Long, Long>> expected, Set<Integer> values) {
- Protos.Resource resource = makeMesosRangeResource(PORTS, values);
- assertEquals(Protos.Value.Type.RANGES, resource.getType());
- assertEquals(PORTS.getMesosName(), resource.getName());
-
- Set<Pair<Long, Long>> actual = ImmutableSet.copyOf(Iterables.transform(
- resource.getRanges().getRangeList(),
- range -> Pair.of(range.getBegin(), range.getEnd())));
- assertEquals(expected, actual);
- }
-}
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java b/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java
index be7bd32..7dc8c17 100644
--- a/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java
+++ b/src/test/java/org/apache/aurora/scheduler/resources/ResourceTestUtil.java
@@ -15,6 +15,7 @@ package org.apache.aurora.scheduler.resources;
import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableSet;
@@ -114,6 +115,23 @@ public final class ResourceTestUtil {
.build();
}
+ public static Protos.Resource mesosRange(
+ ResourceType type,
+ Optional<String> role,
+ Iterable<Integer> values) {
+
+ return resourceBuilder(type, role, false)
+ .setRanges(Protos.Value.Ranges.newBuilder().addAllRange(
+ Iterables.transform(Numbers.toRanges(values), Numbers.RANGE_TRANSFORM)))
+ .build();
+ }
+
+ public static Iterable<Protos.Resource> mesosScalarFromBag(ResourceBag bag) {
+ return bag.streamResourceVectors()
+ .map(entry -> mesosScalar(entry.getKey(), entry.getValue()))
+ .collect(Collectors.toSet());
+ }
+
public static Protos.Offer offer(Protos.Resource... resources) {
return Protos.Offer.newBuilder()
.setId(Protos.OfferID.newBuilder().setValue("offer-id"))
http://git-wip-us.apache.org/repos/asf/aurora/blob/8c900e58/src/test/java/org/apache/aurora/scheduler/resources/ResourcesTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/resources/ResourcesTest.java b/src/test/java/org/apache/aurora/scheduler/resources/ResourcesTest.java
deleted file mode 100644
index 716769f..0000000
--- a/src/test/java/org/apache/aurora/scheduler/resources/ResourcesTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.aurora.scheduler.resources;
-
-import org.apache.aurora.common.quantity.Amount;
-import org.apache.mesos.Protos;
-import org.junit.Test;
-
-import static org.apache.aurora.common.quantity.Data.MB;
-import static org.apache.aurora.scheduler.base.TaskTestUtil.DEV_TIER;
-import static org.apache.aurora.scheduler.base.TaskTestUtil.REVOCABLE_TIER;
-import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosRange;
-import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosScalar;
-import static org.apache.aurora.scheduler.resources.ResourceTestUtil.offer;
-import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
-import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
-import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
-import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
-import static org.junit.Assert.assertEquals;
-
-public class ResourcesTest {
- @Test
- public void testGetSlot() {
- Protos.Offer offer = offer(
- mesosScalar(CPUS, 8.0, false),
- mesosScalar(RAM_MB, 1024, false),
- mesosScalar(DISK_MB, 2048, false),
- mesosRange(PORTS, 1, 2, 3));
-
- ResourceSlot expected = new ResourceSlot(8.0, Amount.of(1024L, MB), Amount.of(2048L, MB), 3);
- assertEquals(expected, Resources.from(offer).slot());
- }
-
- @Test
- public void testMissingResourcesHandledGracefully() {
- assertEquals(ResourceSlot.NONE, Resources.from(offer()).slot());
- }
-
- @Test
- public void testFilter() {
- Protos.Offer offer = offer(
- mesosScalar(CPUS, 8.0, true),
- mesosScalar(RAM_MB, 1024, false));
-
- assertEquals(
- new ResourceSlot(8.0, Amount.of(1024L, MB), Amount.of(0L, MB), 0),
- Resources.from(offer).filter(ResourceManager.REVOCABLE).slot());
- }
-
- @Test
- public void testFilterByTier() {
- Protos.Offer offer = offer(
- mesosScalar(CPUS, 8.0, true),
- mesosScalar(CPUS, 8.0, false),
- mesosScalar(RAM_MB, 1024, false));
-
- assertEquals(
- new ResourceSlot(8.0, Amount.of(1024L, MB), Amount.of(0L, MB), 0),
- Resources.from(offer).filter(REVOCABLE_TIER).slot());
-
- assertEquals(
- new ResourceSlot(8.0, Amount.of(1024L, MB), Amount.of(0L, MB), 0),
- Resources.from(offer).filter(DEV_TIER).slot());
- }
-}