package com.sequenceiq.cloudbreak.service.stack.repair; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.HashMap; import java.util.Map; 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 com.sequenceiq.cloudbreak.api.model.InstanceGroupType; import com.sequenceiq.cloudbreak.core.CloudbreakSecuritySetupException; import com.sequenceiq.cloudbreak.domain.Cluster; import com.sequenceiq.cloudbreak.domain.InstanceGroup; import com.sequenceiq.cloudbreak.domain.InstanceMetaData; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.repository.InstanceMetaDataRepository; import com.sequenceiq.cloudbreak.service.cluster.ClusterService; @RunWith(MockitoJUnitRunner.class) public class CandidateUnhealthyInstancesSelectorTest { @Mock private ClusterService clusterService; @Mock private InstanceMetaDataRepository instanceMetaDataRepository; @InjectMocks private CandidateUnhealthyInstanceSelector undertest; private Stack stack; private Cluster cluster; @Before public void setUp() { stack = mock(Stack.class); when(stack.getId()).thenReturn(1L); cluster = mock(Cluster.class); when(stack.getCluster()).thenReturn(cluster); when(cluster.getId()).thenReturn(2L); } @Test public void shouldSelectInstancesWithUnknownStatus() throws CloudbreakSecuritySetupException { Map<String, String> hostStatuses = new HashMap<>(); hostStatuses.put("ip-10-0-0-1.ec2.internal", "HEALTHY"); hostStatuses.put("ip-10-0-0-2.ec2.internal", "UNKNOWN"); hostStatuses.put("ip-10-0-0-3.ec2.internal", "HEALTHY"); hostStatuses.put("ip-10-0-0-4.ec2.internal", "UNKNOWN"); when(clusterService.getHostStatuses(stack.getId())).thenReturn(hostStatuses); InstanceGroup slaveGroup = setupInstanceGroup(InstanceGroupType.CORE); InstanceMetaData imd1 = setupInstanceMetaData(stack.getId(), "ip-10-0-0-2.ec2.internal", slaveGroup); InstanceMetaData imd2 = setupInstanceMetaData(stack.getId(), "ip-10-0-0-4.ec2.internal", slaveGroup); Set<InstanceMetaData> candidateUnhealthyInstances = undertest.selectCandidateUnhealthyInstances(stack); assertEquals(2, candidateUnhealthyInstances.size()); assertTrue(candidateUnhealthyInstances.contains(imd1)); assertTrue(candidateUnhealthyInstances.contains(imd2)); } @Test public void shouldReturnEmptyListIfAllInstancesHealthy() throws CloudbreakSecuritySetupException { Map<String, String> hostStatuses = new HashMap<>(); hostStatuses.put("ip-10-0-0-1.ec2.internal", "HEALTHY"); hostStatuses.put("ip-10-0-0-3.ec2.internal", "HEALTHY"); when(clusterService.getHostStatuses(stack.getId())).thenReturn(hostStatuses); Set<InstanceMetaData> candidateUnhealthyInstances = undertest.selectCandidateUnhealthyInstances(stack); assertTrue(candidateUnhealthyInstances.isEmpty()); } @Test public void shouldRemoveNonCoreGroupNodes() throws CloudbreakSecuritySetupException { Map<String, String> hostStatuses = new HashMap<>(); hostStatuses.put("ip-10-0-0-1.ec2.internal", "HEALTHY"); hostStatuses.put("ip-10-0-0-2.ec2.internal", "UNKNOWN"); hostStatuses.put("ip-10-0-0-3.ec2.internal", "UNKNOWN"); hostStatuses.put("ip-10-0-0-4.ec2.internal", "UNKNOWN"); when(clusterService.getHostStatuses(stack.getId())).thenReturn(hostStatuses); InstanceGroup slaveGroup = setupInstanceGroup(InstanceGroupType.CORE); InstanceGroup gatewayGroup = setupInstanceGroup(InstanceGroupType.GATEWAY); InstanceMetaData imd1 = setupInstanceMetaData(stack.getId(), "ip-10-0-0-2.ec2.internal", slaveGroup); InstanceMetaData imd2 = setupInstanceMetaData(stack.getId(), "ip-10-0-0-4.ec2.internal", slaveGroup); setupInstanceMetaData(stack.getId(), "ip-10-0-0-3.ec2.internal", gatewayGroup); Set<InstanceMetaData> candidateUnhealthyInstances = undertest.selectCandidateUnhealthyInstances(stack); assertEquals(2, candidateUnhealthyInstances.size()); assertTrue(candidateUnhealthyInstances.contains(imd1)); assertTrue(candidateUnhealthyInstances.contains(imd2)); } private InstanceGroup setupInstanceGroup(InstanceGroupType instanceGroupType) { InstanceGroup slaveGroup = mock(InstanceGroup.class); when(slaveGroup.getInstanceGroupType()).thenReturn(instanceGroupType); return slaveGroup; } private InstanceMetaData setupInstanceMetaData(Long stackId, String privateIp, InstanceGroup group) { InstanceMetaData imd1 = mock(InstanceMetaData.class); when(imd1.getInstanceGroup()).thenReturn(group); when(instanceMetaDataRepository.findHostInStack(stackId, privateIp)).thenReturn(imd1); return imd1; } }