package com.sequenceiq.cloudbreak.converter; import static org.junit.Assert.assertEquals; import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anySet; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.IOException; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.springframework.core.convert.ConversionService; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.sequenceiq.ambari.client.AmbariClient; import com.sequenceiq.cloudbreak.TestUtil; import com.sequenceiq.cloudbreak.api.model.ClusterResponse; import com.sequenceiq.cloudbreak.api.model.ConfigStrategy; import com.sequenceiq.cloudbreak.api.model.RDSConfigJson; import com.sequenceiq.cloudbreak.api.model.RDSConfigRequest; import com.sequenceiq.cloudbreak.controller.validation.blueprint.BlueprintValidator; import com.sequenceiq.cloudbreak.controller.validation.blueprint.StackServiceComponentDescriptor; import com.sequenceiq.cloudbreak.controller.validation.blueprint.StackServiceComponentDescriptors; import com.sequenceiq.cloudbreak.core.CloudbreakException; import com.sequenceiq.cloudbreak.core.bootstrap.service.OrchestratorType; import com.sequenceiq.cloudbreak.core.bootstrap.service.OrchestratorTypeResolver; import com.sequenceiq.cloudbreak.domain.Blueprint; import com.sequenceiq.cloudbreak.domain.Cluster; import com.sequenceiq.cloudbreak.domain.HostGroup; import com.sequenceiq.cloudbreak.domain.InstanceGroup; import com.sequenceiq.cloudbreak.domain.InstanceMetaData; import com.sequenceiq.cloudbreak.domain.Orchestrator; import com.sequenceiq.cloudbreak.domain.RDSConfig; import com.sequenceiq.cloudbreak.domain.SssdConfig; import com.sequenceiq.cloudbreak.domain.Stack; import com.sequenceiq.cloudbreak.service.cluster.flow.AmbariViewProvider; import com.sequenceiq.cloudbreak.util.StackUtil; public class ClusterToJsonConverterTest extends AbstractEntityConverterTest<Cluster> { @InjectMocks private ClusterToJsonConverter underTest; @Mock private BlueprintValidator blueprintValidator; @Mock private StackServiceComponentDescriptors stackServiceComponentDescs; @Mock private ConversionService conversionService; @Mock private JsonNode jsonNode; @Mock private JsonNode nameJsonNode; @Mock private Iterator<JsonNode> mockIterator; @Mock private Map<String, HostGroup> hostGroupMap; @Mock private HostGroup hostGroup; @Mock private InstanceGroup instanceGroup; @Mock private InstanceMetaData instanceMetaData; @Mock private Iterator<JsonNode> mockComponentIterator; @Mock private AmbariViewProvider ambariViewProvider; @Mock private OrchestratorTypeResolver orchestratorTypeResolver; @Mock private StackUtil stackUtil; private StackServiceComponentDescriptor stackServiceComponentDescriptor; @Before public void setUp() throws CloudbreakException { underTest = new ClusterToJsonConverter(); MockitoAnnotations.initMocks(this); given(orchestratorTypeResolver.resolveType(any(Orchestrator.class))).willReturn(OrchestratorType.HOST); stackServiceComponentDescriptor = createStackServiceComponentDescriptor(); } @Test public void testConvert() throws IOException { // GIVEN mockAll(); getSource().setConfigStrategy(ConfigStrategy.NEVER_APPLY); given(stackServiceComponentDescs.get(anyString())).willReturn(stackServiceComponentDescriptor); given(stackUtil.extractAmbariIp(any(Stack.class))).willReturn("10.0.0.1"); // WHEN ClusterResponse result = underTest.convert(getSource()); // THEN assertEquals(1L, (long) result.getId()); assertAllFieldsNotNull(result, Lists.newArrayList("cluster", "ambariStackDetails", "rdsConfigId", "blueprintCustomProperties", "blueprint", "sssdConfig", "rdsConfigs", "ldapConfig", "exposedKnoxServices", "customContainers", "ambariRepoDetailsJson", "ambariDatabaseDetails")); } @Test public void testConvertWithoutUpSinceField() throws IOException { // GIVEN mockAll(); getSource().setUpSince(null); given(stackServiceComponentDescs.get(anyString())).willReturn(stackServiceComponentDescriptor); // WHEN ClusterResponse result = underTest.convert(getSource()); // THEN assertEquals(0L, (long) result.getMinutesUp()); } @Test public void testConvertWithoutMasterComponent() throws IOException { // GIVEN mockAll(); given(stackServiceComponentDescs.get(anyString())).willReturn(new StackServiceComponentDescriptor("dummy", "dummy", 1, 1)); // WHEN ClusterResponse result = underTest.convert(getSource()); // THEN assertEquals(1L, (long) result.getId()); } @Test public void testConvertWhenValidatorThrowException() throws IOException { // GIVEN given(blueprintValidator.getHostGroupNode(any(Blueprint.class))).willThrow(new IOException("error")); // WHEN underTest.convert(getSource()); // THEN verify(blueprintValidator, times(0)).createHostGroupMap(anySet()); } @Override public Cluster createSource() { Stack stack = TestUtil.stack(); Blueprint blueprint = TestUtil.blueprint(); SssdConfig config = TestUtil.sssdConfigs(1).iterator().next(); Cluster cluster = TestUtil.cluster(blueprint, config, stack, 1L); stack.setCluster(cluster); return cluster; } private void mockAll() throws IOException { when(ambariViewProvider.provideViewInformation(any(AmbariClient.class), any(Cluster.class))).thenAnswer(new Answer<Cluster>() { @Override public Cluster answer(InvocationOnMock invocation) throws Throwable { Object[] args = invocation.getArguments(); return (Cluster) args[1]; } }); given(ambariViewProvider.isViewDefinitionNotProvided(any(Cluster.class))).willReturn(false); given(blueprintValidator.getHostGroupNode(any(Blueprint.class))).willReturn(jsonNode); given(jsonNode.iterator()).willReturn(mockIterator); given(mockIterator.hasNext()).willReturn(true).willReturn(false); given(mockIterator.next()).willReturn(jsonNode); given(conversionService.convert(any(RDSConfig.class), eq(RDSConfigJson.class))).willReturn(new RDSConfigRequest()); given(blueprintValidator.getHostGroupName(jsonNode)).willReturn("slave_1"); given(blueprintValidator.createHostGroupMap(any(Set.class))).willReturn(hostGroupMap); given(hostGroupMap.get("slave_1")).willReturn(hostGroup); given(instanceGroup.getInstanceMetaData()).willReturn(Sets.newHashSet(instanceMetaData)); given(blueprintValidator.getComponentsNode(jsonNode)).willReturn(nameJsonNode); given(nameJsonNode.iterator()).willReturn(mockComponentIterator); given(mockComponentIterator.hasNext()).willReturn(true).willReturn(false); given(mockComponentIterator.next()).willReturn(nameJsonNode); given(nameJsonNode.get(anyString())).willReturn(nameJsonNode); given(nameJsonNode.asText()).willReturn("dummyName"); } private StackServiceComponentDescriptor createStackServiceComponentDescriptor() { return new StackServiceComponentDescriptor("ELASTIC_SEARCH", "MASTER", 1, 1); } }