package com.sequenceiq.cloudbreak.service.cluster.flow.status;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.BDDMockito;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import com.sequenceiq.ambari.client.AmbariClient;
import com.sequenceiq.cloudbreak.api.model.Status;
public class AmbariClusterStatusFactoryTest {
private static final String TEST_BLUEPRINT = "blueprint";
private static final String TEST_COMP1 = "comp1";
private static final String TEST_COMP2 = "comp2";
private static final String TEST_COMP3 = "comp3";
private static final String TEST_COMP4 = "comp4";
private static final String TEST_COMP5 = "comp5";
private static final String TEST_CLIENT_COMP = "clientcomp";
private AmbariClusterStatusFactory underTest;
@Mock
private AmbariClient ambariClient;
@Before
public void setUp() {
underTest = new AmbariClusterStatusFactory();
MockitoAnnotations.initMocks(this);
}
@Test
public void testCreateClusterStatusShouldReturnAmbariServerNotRunningStatusWhenAmbariServerIsNotRunning() {
// GIVEN
BDDMockito.given(ambariClient.healthCheck()).willThrow(new RuntimeException());
// WHEN
ClusterStatus actualResult = underTest.createClusterStatus(ambariClient, TEST_BLUEPRINT);
// THEN
Assert.assertEquals(ClusterStatus.AMBARISERVER_NOT_RUNNING, actualResult);
}
@Test
public void testCreateClusterStatusShouldReturnPendingStatusWhenThereAreInProgressOperations() {
// GIVEN
BDDMockito.given(ambariClient.healthCheck()).willReturn("RUNNING");
BDDMockito.given(ambariClient.getRequests("IN_PROGRESS", "PENDING")).willReturn(Collections.singletonMap("IN_PROGRESS",
Collections.singletonList(1)));
// WHEN
ClusterStatus actualResult = underTest.createClusterStatus(ambariClient, TEST_BLUEPRINT);
// THEN
Assert.assertEquals(ClusterStatus.PENDING, actualResult);
}
@Test
public void testCreateClusterStatusShouldReturnAmbariRunningStatusWhenNoBlueprintGiven() {
// GIVEN
BDDMockito.given(ambariClient.healthCheck()).willReturn("RUNNING");
// WHEN
ClusterStatus actualResult = underTest.createClusterStatus(ambariClient, null);
// THEN
Assert.assertEquals(ClusterStatus.AMBARISERVER_RUNNING, actualResult);
Assert.assertEquals(Status.AVAILABLE, actualResult.getStackStatus());
Assert.assertNull(actualResult.getClusterStatus());
}
@Test
public void testCreateClusterStatusShouldReturnAvailabelStackWithStoppedClusterWhenAllServerComponentsAreInstalled() {
// GIVEN
BDDMockito.given(ambariClient.healthCheck()).willReturn("RUNNING");
BDDMockito.given(ambariClient.getComponentsCategory(TEST_BLUEPRINT)).willReturn(createComponentCategories());
BDDMockito.given(ambariClient.getHostComponentsStates()).willReturn(createHostComponentsStates("INSTALLED"));
// WHEN
ClusterStatus actualResult = underTest.createClusterStatus(ambariClient, TEST_BLUEPRINT);
// THEN
Assert.assertEquals(ClusterStatus.INSTALLED, actualResult);
Assert.assertEquals(Status.AVAILABLE, actualResult.getStackStatus());
Assert.assertEquals(Status.STOPPED, actualResult.getClusterStatus());
}
@Test
public void testCreateClusterStatusShouldReturnAvailableClusterWhenAllServerComponentsAreStarted() {
// GIVEN
BDDMockito.given(ambariClient.healthCheck()).willReturn("RUNNING");
BDDMockito.given(ambariClient.getComponentsCategory(TEST_BLUEPRINT)).willReturn(createComponentCategories());
BDDMockito.given(ambariClient.getHostComponentsStates()).willReturn(createHostComponentsStates("STARTED"));
// WHEN
ClusterStatus actualResult = underTest.createClusterStatus(ambariClient, TEST_BLUEPRINT);
// THEN
Assert.assertEquals(ClusterStatus.STARTED, actualResult);
Assert.assertEquals(Status.AVAILABLE, actualResult.getStackStatus());
Assert.assertEquals(Status.AVAILABLE, actualResult.getClusterStatus());
}
@Test
public void testCreateClusterStatusShouldReturnInstallingStatusWhenOneServerComponentIsBeingInstalled() {
// GIVEN
BDDMockito.given(ambariClient.healthCheck()).willReturn("RUNNING");
BDDMockito.given(ambariClient.getComponentsCategory(TEST_BLUEPRINT)).willReturn(createComponentCategories());
BDDMockito.given(ambariClient.getHostComponentsStates()).willReturn(createInstallingHostComponentsStates());
// WHEN
ClusterStatus actualResult = underTest.createClusterStatus(ambariClient, TEST_BLUEPRINT);
// THEN
Assert.assertEquals(ClusterStatus.INSTALLING, actualResult);
}
@Test
public void testCreateClusterStatusShouldReturnAmbiguousWhenThereAreStartedAndInstalledComps() {
// GIVEN
BDDMockito.given(ambariClient.healthCheck()).willReturn("RUNNING");
BDDMockito.given(ambariClient.getComponentsCategory(TEST_BLUEPRINT)).willReturn(createComponentCategories());
BDDMockito.given(ambariClient.getHostComponentsStates()).willReturn(createInstalledAndStartedHostComponentsStates());
// WHEN
ClusterStatus actualResult = underTest.createClusterStatus(ambariClient, TEST_BLUEPRINT);
// THEN
Assert.assertEquals(ClusterStatus.AMBIGUOUS, actualResult);
}
@Test
public void testCreateClusterStatusShouldReturnAmbiguousStatusWhenThereAreCompsInUnsupportedStates() {
// GIVEN
BDDMockito.given(ambariClient.healthCheck()).willReturn("RUNNING");
BDDMockito.given(ambariClient.getComponentsCategory(TEST_BLUEPRINT)).willReturn(createComponentCategories());
BDDMockito.given(ambariClient.getHostComponentsStates()).willReturn(createHostComponentsStates("Unsupported"));
// WHEN
ClusterStatus actualResult = underTest.createClusterStatus(ambariClient, TEST_BLUEPRINT);
// THEN
Assert.assertEquals(ClusterStatus.AMBIGUOUS, actualResult);
}
@Test
public void testCreateClusterStatusShouldReturnUnknownWhenAmbariThrowsException() {
// GIVEN
BDDMockito.given(ambariClient.healthCheck()).willReturn("RUNNING");
BDDMockito.given(ambariClient.getComponentsCategory(Mockito.anyList())).willThrow(new RuntimeException());
// WHEN
ClusterStatus actualResult = underTest.createClusterStatus(ambariClient, TEST_BLUEPRINT);
// THEN
Assert.assertEquals(ClusterStatus.UNKNOWN, actualResult);
}
private Map<String, String> createComponentCategories() {
Map<String, String> categoryMap = new HashMap<>();
categoryMap.put(TEST_COMP1, "MASTER");
categoryMap.put(TEST_COMP2, "MASTER");
categoryMap.put(TEST_COMP3, "SLAVE");
categoryMap.put(TEST_COMP4, "SLAVE");
categoryMap.put(TEST_COMP5, "SLAVE");
categoryMap.put(TEST_CLIENT_COMP, "CLIENT");
return categoryMap;
}
private Map<String, Map<String, String>> createHostComponentsStates(String state) {
Map<String, Map<String, String>> result = new HashMap<>();
Map<String, String> host1ComponentsStates = new HashMap<>();
host1ComponentsStates.put(TEST_COMP1, state);
host1ComponentsStates.put(TEST_COMP2, state);
result.put("host1", host1ComponentsStates);
Map<String, String> host2ComponentsStates = new HashMap<>();
host2ComponentsStates.put(TEST_COMP3, state);
host2ComponentsStates.put(TEST_COMP4, state);
host2ComponentsStates.put(TEST_COMP5, state);
host2ComponentsStates.put(TEST_CLIENT_COMP, "NotImportant");
result.put("host2", host2ComponentsStates);
return result;
}
private Map<String, Map<String, String>> createInstallingHostComponentsStates() {
Map<String, Map<String, String>> result = new HashMap<>();
Map<String, String> host1ComponentsStates = new HashMap<>();
host1ComponentsStates.put(TEST_COMP1, "INSTALLED");
host1ComponentsStates.put(TEST_COMP2, "INSTALLING");
result.put("host1", host1ComponentsStates);
Map<String, String> host2ComponentsStates = new HashMap<>();
host2ComponentsStates.put(TEST_COMP3, "INSTALL_FAILED");
host2ComponentsStates.put(TEST_COMP4, "STARTING");
host2ComponentsStates.put(TEST_COMP5, "STARTED");
host2ComponentsStates.put(TEST_CLIENT_COMP, "NotImportant");
result.put("host2", host2ComponentsStates);
return result;
}
private Map<String, Map<String, String>> createInstalledAndStartedHostComponentsStates() {
Map<String, Map<String, String>> result = new HashMap<>();
Map<String, String> host1ComponentsStates = new HashMap<>();
host1ComponentsStates.put(TEST_COMP1, "INSTALLED");
host1ComponentsStates.put(TEST_COMP2, "STARTED");
result.put("host1", host1ComponentsStates);
Map<String, String> host2ComponentsStates = new HashMap<>();
host2ComponentsStates.put(TEST_COMP3, "INSTALLED");
host2ComponentsStates.put(TEST_COMP4, "STARTED");
host2ComponentsStates.put(TEST_COMP5, "STARTED");
host2ComponentsStates.put(TEST_CLIENT_COMP, "NotImportant");
result.put("host2", host2ComponentsStates);
return result;
}
}