/*-
* -\-\-
* Helios Services
* --
* Copyright (C) 2016 - 2017 Spotify AB
* --
* 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 com.spotify.helios.master.resources;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.spotify.helios.common.descriptors.Deployment;
import com.spotify.helios.common.descriptors.Goal;
import com.spotify.helios.common.descriptors.HostStatus;
import com.spotify.helios.common.descriptors.Job;
import com.spotify.helios.common.descriptors.JobId;
import com.spotify.helios.master.MasterModel;
import com.spotify.helios.servicescommon.statistics.NoopMasterMetrics;
import java.util.Map;
import org.junit.Test;
public class JobsResourceTest {
private final MasterModel model = mock(MasterModel.class);
private final ImmutableSet<String> capabilities = ImmutableSet.of();
private final JobsResource resource =
new JobsResource(model, new NoopMasterMetrics(), capabilities);
@Test
public void testListJobs() throws Exception {
final ImmutableMap<JobId, Job> jobs = ImmutableMap.of(
JobId.parse("foobar:1"), Job.newBuilder().build(),
JobId.parse("foobar:2"), Job.newBuilder().build(),
JobId.parse("foobar:3"), Job.newBuilder().build()
);
when(model.getJobs()).thenReturn(jobs);
assertThat(resource.list("", ""), is(jobs));
}
@Test
public void testListJobsWithJobNameFilter() throws Exception {
final JobId jobId1 = JobId.parse("foobar:1");
final JobId jobId2 = JobId.parse("foobar:2");
final Job job1 = Job.newBuilder().build();
final Job job2 = Job.newBuilder().build();
final ImmutableMap<JobId, Job> jobs = ImmutableMap.of(
jobId1, job1,
jobId2, job2,
JobId.parse("blah:3"), Job.newBuilder().build(),
JobId.parse("buzz:3"), Job.newBuilder().build()
);
when(model.getJobs()).thenReturn(jobs);
assertThat(resource.list("foobar", ""), is(
ImmutableMap.of(
jobId1, job1,
jobId2, job2
)
));
}
@Test
public void testListJobsWithHostNameFilter() throws Exception {
// one host matches this name pattern
final String namePattern = "foo";
when(model.listHosts(namePattern)).thenReturn(ImmutableList.of("foobar.example.net"));
final JobId jobId1 = JobId.parse("foobar:1");
final JobId jobId2 = JobId.parse("foobat:2");
final Job job1 = Job.newBuilder().build();
final Job job2 = Job.newBuilder().build();
// and it has two jobs deployed to it
final HostStatus hostStatus = mockHostStatus(ImmutableMap.of(
jobId1, Deployment.of(jobId1, Goal.START),
jobId2, Deployment.of(jobId2, Goal.START)
));
when(model.getHostStatus("foobar.example.net")).thenReturn(hostStatus);
when(model.getJob(jobId1)).thenReturn(job1);
when(model.getJob(jobId2)).thenReturn(job2);
assertThat(resource.list("", namePattern), is(
ImmutableMap.of(
jobId1, job1,
jobId2, job2
)
));
}
@Test
public void testListJobsWithMultipleDeployments() throws Exception {
// two hosts match this name patterns
final String namePattern = "foo";
when(model.listHosts(namePattern))
.thenReturn(ImmutableList.of("foobar.example.net", "barfoo.example.net"));
final JobId jobId1 = JobId.parse("foobar:1");
final JobId jobId2 = JobId.parse("foobat:2");
final Job job1 = Job.newBuilder().build();
final Job job2 = Job.newBuilder().build();
// and they have two jobs deployed
final HostStatus hostStatus = mockHostStatus(ImmutableMap.of(
jobId1, Deployment.of(jobId1, Goal.START),
jobId2, Deployment.of(jobId2, Goal.START)
));
when(model.getHostStatus("foobar.example.net")).thenReturn(hostStatus);
when(model.getHostStatus("barfoo.example.net")).thenReturn(hostStatus);
when(model.getJob(jobId1)).thenReturn(job1);
when(model.getJob(jobId2)).thenReturn(job2);
assertThat(resource.list("", namePattern), is(
ImmutableMap.of(
jobId1, job1,
jobId2, job2
)
));
}
private static HostStatus mockHostStatus(Map<JobId, Deployment> jobs) {
final HostStatus hostStatus = mock(HostStatus.class);
when(hostStatus.getJobs()).thenReturn(jobs);
return hostStatus;
}
}