/*-
* -\-\-
* Helios Services
* --
* Copyright (C) 2016 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.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.spotify.helios.common.descriptors.DeploymentGroup;
import com.spotify.helios.common.descriptors.HostSelector;
import com.spotify.helios.common.descriptors.JobId;
import com.spotify.helios.common.descriptors.RolloutOptions;
import com.spotify.helios.common.protocol.CreateDeploymentGroupResponse;
import com.spotify.helios.common.protocol.RemoveDeploymentGroupResponse;
import com.spotify.helios.common.protocol.RollingUpdateRequest;
import com.spotify.helios.common.protocol.RollingUpdateResponse;
import com.spotify.helios.master.DeploymentGroupDoesNotExistException;
import com.spotify.helios.master.DeploymentGroupExistsException;
import com.spotify.helios.master.JobDoesNotExistException;
import com.spotify.helios.master.MasterModel;
import javax.ws.rs.core.Response;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class DeploymentGroupResourceTest {
private static final HostSelector ROLE_SELECTOR = HostSelector.parse("role=my_role");
private static final HostSelector FOO_SELECTOR = HostSelector.parse("foo=bar");
private static final HostSelector BAZ_SELECTOR = HostSelector.parse("baz=qux");
@Mock
private MasterModel model;
private DeploymentGroupResource resource;
@Before
public void before() {
resource = new DeploymentGroupResource(model);
}
@Test
public void testGetNonExistingDeploymentGroup() throws Exception {
when(model.getDeploymentGroup(anyString())).thenThrow(
new DeploymentGroupDoesNotExistException(""));
final Response response = resource.getDeploymentGroup("foobar");
assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus());
}
@Test
public void testGetDeploymentGroup() throws Exception {
final JobId jobId = JobId.newBuilder()
.setName("my_job")
.setVersion("0.2")
.setHash("1234")
.build();
final DeploymentGroup dg = DeploymentGroup.newBuilder()
.setName("foo")
.setHostSelectors(ImmutableList.of(ROLE_SELECTOR, FOO_SELECTOR))
.setJobId(jobId)
.build();
when(model.getDeploymentGroup("foo")).thenReturn(dg);
final Response response = resource.getDeploymentGroup("foo");
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
assertEquals(dg, response.getEntity());
}
@Test
public void testCreateNewDeploymentGroup() {
final Response response = resource.createDeploymentGroup(mock(DeploymentGroup.class));
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
assertEquals(new CreateDeploymentGroupResponse(
CreateDeploymentGroupResponse.Status.CREATED), response.getEntity());
}
@Test
public void testCreateExistingSameDeploymentGroup() throws Exception {
final DeploymentGroup dg = mock(DeploymentGroup.class);
when(dg.getName()).thenReturn("foo");
when(dg.getHostSelectors()).thenReturn(Lists.newArrayList(FOO_SELECTOR));
doThrow(new DeploymentGroupExistsException("")).when(model).addDeploymentGroup(dg);
when(model.getDeploymentGroup("foo")).thenReturn(dg);
final Response response = resource.createDeploymentGroup(dg);
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
assertEquals(new CreateDeploymentGroupResponse(
CreateDeploymentGroupResponse.Status.NOT_MODIFIED), response.getEntity());
}
@Test
public void testCreateExistingConflictingDeploymentGroup() throws Exception {
final DeploymentGroup dg = mock(DeploymentGroup.class);
when(dg.getName()).thenReturn("foo");
when(dg.getHostSelectors()).thenReturn(Lists.newArrayList(FOO_SELECTOR));
doThrow(new DeploymentGroupExistsException("")).when(model).addDeploymentGroup(dg);
final DeploymentGroup existing = mock(DeploymentGroup.class);
when(existing.getHostSelectors()).thenReturn(Lists.newArrayList(BAZ_SELECTOR));
when(model.getDeploymentGroup("foo")).thenReturn(existing);
final Response response = resource.createDeploymentGroup(dg);
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
assertEquals(new CreateDeploymentGroupResponse(
CreateDeploymentGroupResponse.Status.CONFLICT), response.getEntity());
}
@Test
public void testRemoveDeploymentGroup() throws Exception {
final Response response = resource.removeDeploymentGroup("foo");
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
assertEquals(new RemoveDeploymentGroupResponse(
RemoveDeploymentGroupResponse.Status.REMOVED), response.getEntity());
}
@Test
public void testRemoveNonExistingDeploymentGroup() throws Exception {
doThrow(new DeploymentGroupDoesNotExistException("")).when(model)
.removeDeploymentGroup(anyString());
final Response response = resource.removeDeploymentGroup("foo");
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
assertEquals(new RemoveDeploymentGroupResponse(
RemoveDeploymentGroupResponse.Status.DEPLOYMENT_GROUP_NOT_FOUND), response.getEntity());
}
@Test
public void testRollingUpdateDeploymentGroupDoesNotExist() throws Exception {
doThrow(new DeploymentGroupDoesNotExistException("")).when(model).rollingUpdate(
any(DeploymentGroup.class), any(JobId.class), any(RolloutOptions.class));
final Response response = resource.rollingUpdate(
"foo", new RollingUpdateRequest(new JobId("foo", "0.3", "1234"),
RolloutOptions.newBuilder().build()));
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
assertEquals(new RollingUpdateResponse(RollingUpdateResponse.Status.DEPLOYMENT_GROUP_NOT_FOUND),
response.getEntity());
}
@Test
public void testRollingUpdateJobDoesNotExist() throws Exception {
doThrow(new JobDoesNotExistException("")).when(model).rollingUpdate(
any(DeploymentGroup.class), any(JobId.class), any(RolloutOptions.class));
final Response response = resource.rollingUpdate(
"foo", new RollingUpdateRequest(new JobId("foo", "0.3", "1234"),
RolloutOptions.newBuilder().build()));
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
assertEquals(new RollingUpdateResponse(RollingUpdateResponse.Status.JOB_NOT_FOUND),
response.getEntity());
}
}