blob: 8795b153791ab5d95802cf501f169c20a48dd6d1 [file] [log] [blame]
/**
* 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.base;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.apache.aurora.gen.AssignedTask;
import org.apache.aurora.gen.Constraint;
import org.apache.aurora.gen.Container;
import org.apache.aurora.gen.Container._Fields;
import org.apache.aurora.gen.DockerContainer;
import org.apache.aurora.gen.DockerParameter;
import org.apache.aurora.gen.Identity;
import org.apache.aurora.gen.LimitConstraint;
import org.apache.aurora.gen.MesosFetcherURI;
import org.apache.aurora.gen.Metadata;
import org.apache.aurora.gen.PartitionPolicy;
import org.apache.aurora.gen.PercentageSlaPolicy;
import org.apache.aurora.gen.Resource;
import org.apache.aurora.gen.ScheduleStatus;
import org.apache.aurora.gen.ScheduledTask;
import org.apache.aurora.gen.SlaPolicy;
import org.apache.aurora.gen.TaskConfig;
import org.apache.aurora.gen.TaskConstraint;
import org.apache.aurora.gen.TaskEvent;
import org.apache.aurora.gen.ValueConstraint;
import org.apache.aurora.gen.apiConstants;
import org.apache.aurora.scheduler.TierInfo;
import org.apache.aurora.scheduler.TierManager;
import org.apache.aurora.scheduler.TierManager.TierManagerImpl.TierConfig;
import org.apache.aurora.scheduler.configuration.ConfigurationManager;
import org.apache.aurora.scheduler.configuration.ConfigurationManager.ConfigurationManagerSettings;
import org.apache.aurora.scheduler.configuration.executor.ExecutorConfig;
import org.apache.aurora.scheduler.configuration.executor.ExecutorSettings;
import org.apache.aurora.scheduler.filter.AttributeAggregate;
import org.apache.aurora.scheduler.filter.SchedulingFilter.ResourceRequest;
import org.apache.aurora.scheduler.storage.durability.ThriftBackfill;
import org.apache.aurora.scheduler.storage.entities.IJobKey;
import org.apache.aurora.scheduler.storage.entities.IScheduledTask;
import org.apache.aurora.scheduler.storage.entities.ITaskConfig;
import org.apache.mesos.v1.Protos;
import org.apache.mesos.v1.Protos.ExecutorID;
import org.apache.mesos.v1.Protos.ExecutorInfo;
/**
* Convenience methods for working with tasks.
*/
public final class TaskTestUtil {
public static final IJobKey JOB = JobKeys.from("role", "devel", "job");
public static final TierInfo REVOCABLE_TIER =
new TierInfo(true /* preemptible */, true /* revocable */);
public static final TierInfo DEV_TIER =
new TierInfo(true /* preemptible */, false /* revocable */);
public static final TierInfo PREFERRED_TIER =
new TierInfo(false /* preemptible */, false /* revocable */);
public static final String REVOCABLE_TIER_NAME = "tier-revocable";
public static final String PROD_TIER_NAME = "tier-prod";
public static final String DEV_TIER_NAME = "tier-dev";
public static final TierConfig TIER_CONFIG =
new TierConfig(DEV_TIER_NAME, ImmutableMap.of(
PROD_TIER_NAME, PREFERRED_TIER,
DEV_TIER_NAME, DEV_TIER,
REVOCABLE_TIER_NAME, REVOCABLE_TIER
));
public static final TierManager TIER_MANAGER = new TierManager.TierManagerImpl(TIER_CONFIG);
public static final ThriftBackfill THRIFT_BACKFILL = new ThriftBackfill(TIER_MANAGER);
public static final ConfigurationManagerSettings CONFIGURATION_MANAGER_SETTINGS =
new ConfigurationManagerSettings(
ImmutableSet.of(_Fields.MESOS),
false,
ImmutableList.of(),
true,
true,
true,
true,
2,
1800L,
ConfigurationManager.DEFAULT_ALLOWED_JOB_ENVIRONMENTS);
public static final ExecutorID EXECUTOR_ID = ExecutorID.newBuilder()
.setValue("PLACEHOLDER")
.build();
public static final ExecutorInfo EXECUTOR_INFO = ExecutorInfo.newBuilder()
.setExecutorId(EXECUTOR_ID)
.setName(apiConstants.AURORA_EXECUTOR_NAME)
.setCommand(Protos.CommandInfo.newBuilder().build()).build();
public static final ExecutorSettings EXECUTOR_SETTINGS = new ExecutorSettings(
ImmutableMap.<String, ExecutorConfig>builder()
.put(EXECUTOR_INFO.getName(), new ExecutorConfig(EXECUTOR_INFO, ImmutableList.of(), ""))
.build(),
false);
public static final ConfigurationManager CONFIGURATION_MANAGER =
new ConfigurationManager(CONFIGURATION_MANAGER_SETTINGS,
TIER_MANAGER,
THRIFT_BACKFILL,
EXECUTOR_SETTINGS);
private TaskTestUtil() {
// Utility class.
}
public static ITaskConfig makeConfig(IJobKey job) {
return makeConfig(job, true);
}
public static ITaskConfig makeConfig(IJobKey job, boolean prod) {
return makeConfig(job, prod, Optional.of(SlaPolicy.percentageSlaPolicy(
new PercentageSlaPolicy().setPercentage(95.0).setDurationSecs(1800))));
}
public static ITaskConfig makeConfig(IJobKey job, boolean prod, Optional<SlaPolicy> slaPolicy) {
return ITaskConfig.build(new TaskConfig()
.setJob(job.newBuilder())
.setOwner(new Identity().setUser(job.getRole() + "-user"))
.setIsService(true)
.setPriority(1)
.setMaxTaskFailures(-1)
.setProduction(prod)
.setTier(prod ? PROD_TIER_NAME : DEV_TIER_NAME)
.setPartitionPolicy(new PartitionPolicy().setDelaySecs(5).setReschedule(true))
.setSlaPolicy(slaPolicy.orElse(null))
.setConstraints(ImmutableSet.of(
new Constraint(
"valueConstraint",
TaskConstraint.value(
new ValueConstraint(true, ImmutableSet.of("value1", "value2")))),
new Constraint(
"limitConstraint",
TaskConstraint.limit(new LimitConstraint(5)))))
.setTaskLinks(ImmutableMap.of("http", "link", "admin", "otherLink"))
.setContactEmail("foo@bar.com")
.setMetadata(ImmutableSet.of(new Metadata("key", "value")))
.setMesosFetcherUris(ImmutableSet.of(
new MesosFetcherURI("pathA").setExtract(true).setCache(true),
new MesosFetcherURI("pathB").setExtract(true).setCache(true)))
.setExecutorConfig(new org.apache.aurora.gen.ExecutorConfig(
EXECUTOR_INFO.getName(),
"config"))
.setContainer(Container.docker(
new DockerContainer("imagename")
.setParameters(ImmutableList.of(
new DockerParameter("a", "b"),
new DockerParameter("c", "d")))))
.setResources(ImmutableSet.of(
Resource.numCpus(1.0),
Resource.ramMb(1024),
Resource.diskMb(1024),
Resource.namedPort("http"))));
}
public static IScheduledTask makeTask(String id, IJobKey job) {
return makeTask(id, makeConfig(job));
}
public static IScheduledTask makeTask(String id, IJobKey job, int instanceId) {
return makeTask(id, makeConfig(job), instanceId, Optional.empty());
}
public static IScheduledTask makeTask(String id, IJobKey job, int instanceId, boolean prod) {
return makeTask(id, makeConfig(job, prod), instanceId, Optional.empty());
}
public static IScheduledTask makeTask(String id, IJobKey job, int instanceId, String agentId) {
return makeTask(id, makeConfig(job), instanceId, Optional.of(agentId));
}
public static IScheduledTask makeTask(String id, ITaskConfig config) {
return makeTask(id, config, 2);
}
public static IScheduledTask makeTask(String id, ITaskConfig config, int instanceId) {
return makeTask(id, config, instanceId, Optional.empty());
}
public static IScheduledTask makeTask(
String id,
ITaskConfig config,
int instanceId,
Optional<String> agentId) {
AssignedTask assignedTask = new AssignedTask()
.setInstanceId(instanceId)
.setTaskId(id)
.setAssignedPorts(ImmutableMap.of("http", 1000))
.setTask(config.newBuilder());
if (agentId.isPresent()) {
assignedTask.setSlaveId(agentId.get());
}
return IScheduledTask.build(new ScheduledTask()
.setStatus(ScheduleStatus.ASSIGNED)
.setTaskEvents(ImmutableList.of(
new TaskEvent(100L, ScheduleStatus.PENDING)
.setMessage("message")
.setScheduler("scheduler"),
new TaskEvent(101L, ScheduleStatus.ASSIGNED)
.setMessage("message")
.setScheduler("scheduler2")))
.setAncestorId("ancestor")
.setFailureCount(3)
.setTimesPartitioned(2)
.setAssignedTask(assignedTask));
}
public static IScheduledTask addStateTransition(
IScheduledTask task,
ScheduleStatus status,
long timestamp) {
ScheduledTask builder = task.newBuilder();
builder.setStatus(status);
builder.addToTaskEvents(new TaskEvent()
.setTimestamp(timestamp)
.setStatus(status)
.setScheduler("scheduler"));
return IScheduledTask.build(builder);
}
public static String tierConfigFile() {
return "{\"default\": \"preemptible\","
+ "\"tiers\":{"
+ "\"preferred\": {\"revocable\": false, \"preemptible\": false},"
+ "\"preemptible\": {\"revocable\": false, \"preemptible\": true},"
+ "\"revocable\": {\"revocable\": true, \"preemptible\": true}"
+ "}}";
}
public static Map<String, TierInfo> tierInfos() {
return ImmutableMap.of(
"preferred", PREFERRED_TIER,
"preemptible", DEV_TIER,
"revocable", REVOCABLE_TIER);
}
public static Set<org.apache.aurora.gen.TierConfig> tierConfigs() {
return ImmutableSet.of(
new org.apache.aurora.gen.TierConfig("preferred", PREFERRED_TIER.toMap()),
new org.apache.aurora.gen.TierConfig("preemptible", DEV_TIER.toMap()),
new org.apache.aurora.gen.TierConfig("revocable", REVOCABLE_TIER.toMap())
);
}
public static ResourceRequest toResourceRequest(ITaskConfig task) {
return ResourceRequest.fromTask(
task,
EXECUTOR_SETTINGS,
AttributeAggregate.empty(),
TIER_MANAGER);
}
}