use of com.netflix.titus.api.jobmanager.model.job.ext.BatchJobExt in project titus-control-plane by Netflix.
the class JobCustomConfigurationValidatorTest method testCustomBatchJobSizeValidation.
@Test(timeout = TEST_TIMEOUT_MS)
public void testCustomBatchJobSizeValidation() {
JobDescriptor<BatchJobExt> jobDescriptor = JobFunctions.changeBatchJobSize(oneTaskBatchJobDescriptor().toBuilder().withApplicationName("a1").build(), 2);
DefaultSettableConfig config = titusStackResource.getMaster().getConfig();
config.setProperty(CUSTOM_JOB_CONFIGURATION_ROOT + ".a1.pattern", ".*");
config.setProperty(CUSTOM_JOB_CONFIGURATION_ROOT + ".a1.maxBatchJobSize", "1");
try {
client.createJob(toGrpcJobDescriptor(jobDescriptor));
Assert.fail("Expected to fail due to validation error");
} catch (StatusRuntimeException e) {
assertThat(e.getStatus().getCode()).isEqualTo(Status.Code.INVALID_ARGUMENT);
}
}
use of com.netflix.titus.api.jobmanager.model.job.ext.BatchJobExt in project titus-control-plane by Netflix.
the class DefaultTaintTolerationFactoryTest method newGpuJob.
private Job<BatchJobExt> newGpuJob() {
Job<BatchJobExt> template = JobGenerator.oneBatchJob();
JobDescriptor<BatchJobExt> jobDescriptor = template.getJobDescriptor();
Container container = jobDescriptor.getContainer();
return template.toBuilder().withJobDescriptor(jobDescriptor.toBuilder().withContainer(container.toBuilder().withContainerResources(container.getContainerResources().toBuilder().withGpu(1).build()).build()).build()).build();
}
use of com.netflix.titus.api.jobmanager.model.job.ext.BatchJobExt in project titus-control-plane by Netflix.
the class V1SpecPodFactoryTest method podHasSidecarAnnotations.
@Test
public void podHasSidecarAnnotations() {
Job<BatchJobExt> job = JobGenerator.oneBatchJob();
BatchJobTask task = JobGenerator.oneBatchTask();
String json_args = "{\"foo\":true,\"bar\":3.0}";
List<PlatformSidecar> platformSidecars = Arrays.asList(new PlatformSidecar("mysidecar", "stable", json_args));
job = job.toBuilder().withJobDescriptor(job.getJobDescriptor().toBuilder().withPlatformSidecars(platformSidecars).build()).build();
when(podAffinityFactory.buildV1Affinity(job, task)).thenReturn(Pair.of(new V1Affinity(), new HashMap<>()));
V1Pod pod = podFactory.buildV1Pod(job, task);
Map<String, String> annotations = pod.getMetadata().getAnnotations();
String expectedSidecarAnnotation = "mysidecar" + KubeConstants.PLATFORM_SIDECAR_SUFFIX;
assertThat(annotations.get(expectedSidecarAnnotation)).isEqualTo("true");
String expectedChannelAnnotation = "mysidecar" + KubeConstants.PLATFORM_SIDECAR_CHANNEL_SUFFIX;
assertThat(annotations.get(expectedChannelAnnotation)).isEqualTo("stable");
String expectedArgsAnnotation = "mysidecar" + KubeConstants.PLATFORM_SIDECAR_ARGS_SUFFIX;
assertThat(annotations.get(expectedArgsAnnotation)).isEqualTo(json_args);
}
use of com.netflix.titus.api.jobmanager.model.job.ext.BatchJobExt in project titus-control-plane by Netflix.
the class V1SpecPodFactoryTest method testEFSMountsHandlesDuplicateVolumes.
@Test
public void testEFSMountsHandlesDuplicateVolumes() {
Job<BatchJobExt> job = JobGenerator.oneBatchJob();
BatchJobTask task = JobGenerator.oneBatchTask();
EfsMount newEfsMount = new EfsMount("1.2.3.4", "/mountpoint", EfsMount.MountPerm.RO, "/relative");
EfsMount newEfsMount2 = new EfsMount("1.2.3.4", "/mountpoint2", EfsMount.MountPerm.RO, "/relative");
EfsMount newEfsMount3 = new EfsMount("1.2.3.4", "/mountpoint3", EfsMount.MountPerm.RW, "/relative");
Container newContainer = job.getJobDescriptor().getContainer();
ContainerResources newContainerResources = newContainer.getContainerResources();
Container newContainerWithEFS = newContainer.toBuilder().withContainerResources(newContainerResources.newBuilder().withEfsMounts(Arrays.asList(newEfsMount, newEfsMount2, newEfsMount3)).build()).build();
job = job.toBuilder().withJobDescriptor(job.getJobDescriptor().toBuilder().withContainer(newContainerWithEFS).build()).build();
when(podAffinityFactory.buildV1Affinity(job, task)).thenReturn(Pair.of(new V1Affinity(), new HashMap<>()));
V1Pod pod = podFactory.buildV1Pod(job, task);
// Part 1: There should only be *one* EFS volume to share
List<V1Volume> volumes = pod.getSpec().getVolumes();
// one for nfs, one for shm
assertThat(volumes.size()).isEqualTo(2);
V1Volume v1NFSVolume = volumes.get(0);
assertThat(v1NFSVolume.getName()).isEqualTo("1-2-3-4-relative-vol");
assertThat(v1NFSVolume.getNfs().getServer()).isEqualTo("1.2.3.4");
assertThat(v1NFSVolume.getNfs().getPath()).isEqualTo("/relative");
// All NFS volumes that are generated like this should be RW, and
// delegating the actual RO/RW state to the volume *mount*.
assertThat(v1NFSVolume.getNfs().getReadOnly()).isEqualTo(false);
// Part 2: there should be *3* volume mounts, all sharing the volume
List<V1VolumeMount> vms = pod.getSpec().getContainers().get(0).getVolumeMounts();
// 3 for nfs, one for shm
assertThat(vms.size()).isEqualTo(4);
V1VolumeMount v1NFSvm1 = vms.get(0);
assertThat(v1NFSvm1.getName()).isEqualTo("1-2-3-4-relative-vol");
assertThat(v1NFSvm1.getMountPath()).isEqualTo("/mountpoint");
assertThat(v1NFSvm1.getReadOnly()).isTrue();
V1VolumeMount v1NFSvm2 = vms.get(1);
assertThat(v1NFSvm2.getName()).isEqualTo("1-2-3-4-relative-vol");
assertThat(v1NFSvm2.getMountPath()).isEqualTo("/mountpoint2");
assertThat(v1NFSvm2.getReadOnly()).isTrue();
V1VolumeMount v1NFSvm3 = vms.get(2);
assertThat(v1NFSvm3.getName()).isEqualTo("1-2-3-4-relative-vol");
assertThat(v1NFSvm3.getMountPath()).isEqualTo("/mountpoint3");
assertThat(v1NFSvm3.getReadOnly()).isFalse();
}
use of com.netflix.titus.api.jobmanager.model.job.ext.BatchJobExt in project titus-control-plane by Netflix.
the class V1SpecPodFactoryTest method testEFSMountsGetTransformedSafely.
@Test
public void testEFSMountsGetTransformedSafely() {
Job<BatchJobExt> job = JobGenerator.oneBatchJob();
BatchJobTask task = JobGenerator.oneBatchTask();
EfsMount newEfsMount = new EfsMount("1.2.3.4", "/mountpoint", EfsMount.MountPerm.RO, "/relative/");
Container newContainer = job.getJobDescriptor().getContainer();
ContainerResources newContainerResources = newContainer.getContainerResources();
Container newContainerWithEFS = newContainer.toBuilder().withContainerResources(newContainerResources.newBuilder().withEfsMounts(Collections.singletonList(newEfsMount)).build()).build();
job = job.toBuilder().withJobDescriptor(job.getJobDescriptor().toBuilder().withContainer(newContainerWithEFS).build()).build();
when(podAffinityFactory.buildV1Affinity(job, task)).thenReturn(Pair.of(new V1Affinity(), new HashMap<>()));
V1Pod pod = podFactory.buildV1Pod(job, task);
// Part 1: the volume section needs to be well-formed
List<V1Volume> volumes = pod.getSpec().getVolumes();
// one for nfs, one for shm
assertThat(volumes.size()).isEqualTo(2);
V1Volume v1NFSVolume = volumes.get(0);
assertThat(v1NFSVolume.getName()).isEqualTo("1-2-3-4-relative--vol");
assertThat(v1NFSVolume.getNfs().getServer()).isEqualTo("1.2.3.4");
assertThat(v1NFSVolume.getNfs().getPath()).isEqualTo("/relative/");
assertThat(v1NFSVolume.getNfs().getReadOnly()).isEqualTo(false);
// Part 2: the volume mount section needs to applied to the first container in the podspec
List<V1VolumeMount> vms = pod.getSpec().getContainers().get(0).getVolumeMounts();
// one for nfs, one for shm
assertThat(vms.size()).isEqualTo(2);
V1VolumeMount v1NFSvm = vms.get(0);
assertThat(v1NFSvm.getName()).isEqualTo("1-2-3-4-relative--vol");
assertThat(v1NFSvm.getMountPath()).isEqualTo("/mountpoint");
assertThat(v1NFSvm.getReadOnly()).isEqualTo(true);
}
Aggregations