package com.sequenceiq.cloudbreak.orchestrator.swarm; import static com.sequenceiq.cloudbreak.orchestrator.swarm.DockerClientUtil.createContainer; import static com.sequenceiq.cloudbreak.orchestrator.swarm.DockerClientUtil.startContainer; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.NotFoundException; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.command.RemoveContainerCmd; import com.github.dockerjava.api.command.StartContainerCmd; import com.sequenceiq.cloudbreak.orchestrator.exception.CloudbreakOrchestratorFailedException; @RunWith(MockitoJUnitRunner.class) public class DockerClientUtilTest { @Mock private DockerClient client; @Mock private InspectContainerResponse inspectContainerResponse; @Mock private CreateContainerResponse createContainerResponse; @Mock private InspectContainerCmd inspectContainerCmd; @Mock private RemoveContainerCmd removeContainerCmd; @Mock private CreateContainerCmd createContainerCmd; @Mock private StartContainerCmd startContainerCmd; @Mock private InspectContainerResponse.ContainerState containerState; @Before public void before() { reset(client); reset(createContainerCmd); reset(inspectContainerResponse); reset(removeContainerCmd); reset(inspectContainerCmd); reset(containerState); reset(startContainerCmd); reset(createContainerResponse); } @Test public void removeContainerIExistWhenInspectReturnWithNull() { when(client.inspectContainerCmd(anyString())).thenReturn(inspectContainerCmd); when(inspectContainerCmd.exec()).thenReturn(null); when(createContainerCmd.getName()).thenReturn("ambari-server"); createContainer(client, createContainerCmd, "vm1"); verify(client, times(1)).inspectContainerCmd(anyString()); verify(client, times(0)).removeContainerCmd(anyString()); } @Test public void removeContainerIExistWhenInspectDropNotFoundException() { when(client.inspectContainerCmd(anyString())).thenThrow(new NotFoundException("notfound")); when(createContainerCmd.getName()).thenReturn("ambari-server"); createContainer(client, createContainerCmd, "vm1"); verify(client, times(1)).inspectContainerCmd(anyString()); verify(client, times(0)).removeContainerCmd(anyString()); } @Test(expected = IllegalArgumentException.class) public void removeContainerIExistWhenInspectDropActualException() { when(client.inspectContainerCmd(anyString())).thenThrow(new IllegalArgumentException("illegal argument")); when(createContainerCmd.getName()).thenReturn("ambari-server"); createContainer(client, createContainerCmd, "vm1"); } @Test public void removeContainerIExistWhenInspectReturnWithValueThenRemoveContainer() { when(client.inspectContainerCmd(anyString())).thenReturn(inspectContainerCmd); when(inspectContainerCmd.exec()).thenReturn(inspectContainerResponse); when(inspectContainerResponse.getId()).thenReturn("xx666xx"); InspectContainerResponse.ContainerState state = mock(InspectContainerResponse.ContainerState.class); when(inspectContainerResponse.getState()).thenReturn(state); when(state.isRunning()).thenReturn(false); when(client.removeContainerCmd(anyString())).thenReturn(removeContainerCmd); when(removeContainerCmd.withForce(anyBoolean())).thenReturn(removeContainerCmd); when(removeContainerCmd.exec()).thenReturn(null); when(createContainerCmd.getName()).thenReturn("ambari-server"); createContainer(client, createContainerCmd, "vm1"); verify(client, times(1)).inspectContainerCmd(anyString()); verify(client, times(1)).removeContainerCmd(anyString()); } @Test public void startContainerWhenEverythingWorksFine() throws Exception { when(inspectContainerResponse.getState()).thenReturn(containerState); when(containerState.isRunning()).thenReturn(true); when(inspectContainerCmd.exec()).thenReturn(inspectContainerResponse); when(client.inspectContainerCmd(anyString())).thenReturn(inspectContainerCmd); when(client.startContainerCmd(anyString())).thenReturn(startContainerCmd); startContainer(client, "OK"); verify(startContainerCmd, times(1)).exec(); } @Test(expected = CloudbreakOrchestratorFailedException.class) public void startContainerButContainerNotStarted() throws Exception { when(inspectContainerResponse.getState()).thenReturn(containerState); when(containerState.isRunning()).thenReturn(false); when(inspectContainerCmd.exec()).thenReturn(inspectContainerResponse); when(client.inspectContainerCmd(anyString())).thenReturn(inspectContainerCmd); when(client.startContainerCmd(anyString())).thenReturn(startContainerCmd); startContainer(client, "OK"); } @Test public void createContainerWhenEverythingWorksFine() { when(createContainerResponse.getId()).thenReturn("xxx666xxx"); when(client.inspectContainerCmd(anyString())).thenReturn(inspectContainerCmd); when(inspectContainerCmd.exec()).thenReturn(inspectContainerResponse); when(createContainerCmd.exec()).thenReturn(createContainerResponse); createContainer(client, createContainerCmd, "vm12"); //No exception } }