package com.sequenceiq.cloudbreak.core.bootstrap.service; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyList; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.test.util.ReflectionTestUtils; import com.sequenceiq.cloudbreak.TestUtil; import com.sequenceiq.cloudbreak.api.model.HostGroupAdjustmentJson; import com.sequenceiq.cloudbreak.cloud.scheduler.CancellationException; import com.sequenceiq.cloudbreak.core.CloudbreakException; import com.sequenceiq.cloudbreak.core.bootstrap.service.container.ClusterContainerRunner; import com.sequenceiq.cloudbreak.core.bootstrap.service.container.ContainerConstraintFactory; import com.sequenceiq.cloudbreak.core.bootstrap.service.container.ContainerOrchestratorResolver; import com.sequenceiq.cloudbreak.domain.Cluster; import com.sequenceiq.cloudbreak.domain.Container; import com.sequenceiq.cloudbreak.domain.InstanceMetaData; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.orchestrator.container.DockerContainer; import com.sequenceiq.cloudbreak.orchestrator.model.ContainerConstraint; import com.sequenceiq.cloudbreak.orchestrator.model.GatewayConfig; import com.sequenceiq.cloudbreak.repository.HostGroupRepository; import com.sequenceiq.cloudbreak.repository.InstanceMetaDataRepository; import com.sequenceiq.cloudbreak.repository.StackRepository; import com.sequenceiq.cloudbreak.service.TlsSecurityService; import com.sequenceiq.cloudbreak.service.cluster.ClusterService; import com.sequenceiq.cloudbreak.service.cluster.ContainerService; @RunWith(MockitoJUnitRunner.class) public class ClusterContainerRunnerTest { @Mock private StackRepository stackRepository; @Mock private ContainerOrchestratorResolver containerOrchestratorResolver; @Mock private TlsSecurityService tlsSecurityService; @Mock private ContainerService containerService; @Mock private InstanceMetaDataRepository instanceMetaDataRepository; @Mock private ClusterService clusterService; @Mock private HostGroupRepository hostGroupRepository; @Mock private MockContainerOrchestrator mockContainerOrchestrator; @Mock private CancelledMockContainerOrchestrator cancelledMockContainerOrchestrator; @Mock private FailedMockContainerOrchestrator failedMockContainerOrchestrator; @Mock private ContainerConfigService containerConfigService; @Mock private ContainerConstraintFactory constraintFactory; @InjectMocks private ClusterContainerRunner underTest; @Before public void setUp() { ReflectionTestUtils.setField(containerConfigService, "registratorDockerImageName", "sequence/testcont:0.1.1"); ReflectionTestUtils.setField(containerConfigService, "consulWatchPlugnDockerImageName", "sequence/testcont:0.1.1"); ReflectionTestUtils.setField(containerConfigService, "kerberosDockerImageName", "sequence/testcont:0.1.1"); ReflectionTestUtils.setField(containerConfigService, "logrotateDockerImageName", "sequence/testcont:0.1.1"); } @Test(expected = CloudbreakException.class) public void runNewNodesClusterContainersWhenContainerRunnerFailed() throws CloudbreakException { Stack stack = TestUtil.stack(); Cluster cluster = TestUtil.cluster(TestUtil.blueprint(), stack, 1L); stack.setCluster(cluster); HostGroupAdjustmentJson hostGroupAdjustment = new HostGroupAdjustmentJson(); hostGroupAdjustment.setHostGroup("agent"); when(containerOrchestratorResolver.get(anyString())).thenReturn(new FailedMockContainerOrchestrator()); when(clusterService.retrieveClusterByStackId(anyLong())).thenReturn(cluster); Set<Container> containers = new HashSet<>(); Container ambariServer = new Container(); ambariServer.setName("server"); ambariServer.setImage(DockerContainer.AMBARI_SERVER.getName()); ambariServer.setHost("hostname-1"); ambariServer.setContainerId("1"); Container ambariAgent = new Container(); ambariAgent.setName("agent"); ambariAgent.setImage(DockerContainer.AMBARI_AGENT.getName()); ambariAgent.setHost("hostname-2"); ambariAgent.setContainerId("1"); containers.add(ambariAgent); containers.add(ambariServer); when(containerService.findContainersInCluster(anyLong())).thenReturn(containers); when(hostGroupRepository.findHostGroupInClusterByName(anyLong(), anyString())).thenReturn(TestUtil.hostGroup()); when(stackRepository.findOneWithLists(anyLong())).thenReturn(stack); when(tlsSecurityService.buildGatewayConfig(anyLong(), any(InstanceMetaData.class), anyInt(), any(), any())) .thenReturn(new GatewayConfig("10.0.0.1", "198.0.0.1", "10.0.0.1", 8443, "/cert/1", false)); when(instanceMetaDataRepository.findAliveInstancesInInstanceGroup(anyLong())).thenReturn(new ArrayList<>()); when(containerService.save(anyList())).thenReturn(new ArrayList<>()); when(constraintFactory.getAmbariAgentConstraint(ambariServer.getHost(), null, stack.cloudPlatform(), TestUtil.hostGroup(), hostGroupAdjustment.getScalingAdjustment(), new ArrayList<>(), "")) .thenReturn(new ContainerConstraint.Builder().build()); underTest.addClusterContainers(stack.getId(), hostGroupAdjustment.getHostGroup(), hostGroupAdjustment.getScalingAdjustment()); } @Test(expected = CancellationException.class) public void runNewNodesClusterContainersWhenContainerRunnerCancelled() throws CloudbreakException { Stack stack = TestUtil.stack(); Cluster cluster = TestUtil.cluster(TestUtil.blueprint(), stack, 1L); stack.setCluster(cluster); HostGroupAdjustmentJson hostGroupAdjustment = new HostGroupAdjustmentJson(); hostGroupAdjustment.setHostGroup("agent"); when(containerOrchestratorResolver.get(anyString())).thenReturn(new CancelledMockContainerOrchestrator()); when(stackRepository.findOneWithLists(anyLong())).thenReturn(stack); when(tlsSecurityService.buildGatewayConfig(anyLong(), any(InstanceMetaData.class), anyInt(), any(), any())) .thenReturn(new GatewayConfig("10.0.0.1", "198.0.0.1", "10.0.0.1", 8443, "/cert/1", false)); when(clusterService.retrieveClusterByStackId(anyLong())).thenReturn(cluster); when(hostGroupRepository.findHostGroupInClusterByName(anyLong(), anyString())).thenReturn(TestUtil.hostGroup()); Set<Container> containers = new HashSet<>(); Container ambariServer = new Container(); ambariServer.setName("server"); ambariServer.setImage(DockerContainer.AMBARI_SERVER.getName()); ambariServer.setHost("hostname-1"); ambariServer.setContainerId("1"); Container ambariAgent = new Container(); ambariAgent.setName("agent"); ambariAgent.setImage(DockerContainer.AMBARI_AGENT.getName()); ambariAgent.setHost("hostname-2"); ambariAgent.setContainerId("1"); containers.add(ambariAgent); containers.add(ambariServer); when(containerService.findContainersInCluster(anyLong())).thenReturn(containers); underTest.addClusterContainers(stack.getId(), hostGroupAdjustment.getHostGroup(), hostGroupAdjustment.getScalingAdjustment()); } }