package com.sequenceiq.cloudbreak.service.blueprint; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.when; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import org.junit.Assert; 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.core.convert.ConversionService; import org.springframework.test.util.ReflectionTestUtils; import com.sequenceiq.cloudbreak.api.model.BlueprintRequest; import com.sequenceiq.cloudbreak.domain.Blueprint; import com.sequenceiq.cloudbreak.repository.BlueprintRepository; import com.sequenceiq.cloudbreak.service.ServiceTestUtils; import com.sequenceiq.cloudbreak.util.JsonUtil; @RunWith(MockitoJUnitRunner.class) public class BlueprintLoaderServiceTest { private static final String JSON = "{\"blueprint\":{\"Blueprints\":{\"blueprint_name\":\"hdp-etl-edw-tp\"," + "\"stack_name\":\"HDP\",\"stack_version\":\"2.5\"},\"configurations\":[{\"core-site\":{\"fs.trash.interval\":\"4320\"}},{\"hdfs-site\":" + "{\"dfs.namenode.safemode.threshold-pct\":\"0.99\"}},{\"hive-site\":{\"hive.exec.compress.output\":\"true\",\"hive.merge.mapfiles\"" + ":\"true\",\"hive.server2.tez.initialize.default.sessions\":\"true\"}},{\"mapred-site\":{\"mapreduce.job.reduce.slowstart.completedmaps\"" + ":\"0.7\",\"mapreduce.map.output.compress\":\"true\",\"mapreduce.output.fileoutputformat.compress\":\"true\"}},{\"yarn-site\"" + ":{\"yarn.acl.enable\":\"true\"}}],\"host_groups\":[{\"name\":\"master\",\"configurations\":[],\"components\":[{\"name\"" + ":\"APP_TIMELINE_SERVER\"},{\"name\":\"HCAT\"},{\"name\":\"HDFS_CLIENT\"},{\"name\":\"HISTORYSERVER\"},{\"name\":\"HIVE_CLIENT\"}" + ",{\"name\":\"HIVE_METASTORE\"},{\"name\":\"HIVE_SERVER\"},{\"name\":\"JOURNALNODE\"},{\"name\":\"LIVY_SERVER\"},{\"name\"" + ":\"MAPREDUCE2_CLIENT\"},{\"name\":\"METRICS_COLLECTOR\"},{\"name\":\"METRICS_GRAFANA\"},{\"name\":\"METRICS_MONITOR\"}," + "{\"name\":\"MYSQL_SERVER\"},{\"name\":\"NAMENODE\"},{\"name\":\"PIG\"},{\"name\":\"RESOURCEMANAGER\"},{\"name\":\"SECONDARY_NAMENODE\"}" + ",{\"name\":\"SPARK2_CLIENT\"},{\"name\":\"SPARK2_JOBHISTORYSERVER\"},{\"name\":\"SQOOP\"},{\"name\":\"TEZ_CLIENT\"}," + "{\"name\":\"WEBHCAT_SERVER\"},{\"name\":\"YARN_CLIENT\"},{\"name\":\"ZEPPELIN_MASTER\"},{\"name\":\"ZOOKEEPER_CLIENT\"}," + "{\"name\":\"ZOOKEEPER_SERVER\"}],\"cardinality\":\"1\"},{\"name\":\"worker\",\"configurations\":[],\"components\":[" + "{\"name\":\"DATANODE\"},{\"name\":\"METRICS_MONITOR\"},{\"name\":\"NODEMANAGER\"}],\"cardinality\":\"1+\"}]},\"inputs\": []}"; @InjectMocks private BlueprintLoaderService underTest; @Mock private ConversionService conversionService; @Mock private BlueprintRepository blueprintRepository; @Mock private BlueprintUtils blueprintUtils; @Before public void setUp() throws IOException { when(conversionService.convert(any(BlueprintRequest.class), any(Class.class))).thenAnswer(invocation -> { Object[] args = invocation.getArguments(); BlueprintRequest blueprintRequest = (BlueprintRequest) args[0]; return ServiceTestUtils.createBlueprint(blueprintRequest); }); when(blueprintRepository.findAllDefaultInAccount(anyString())).thenReturn(new HashSet<>()); when(blueprintUtils.convertStringToJsonNode(anyString())).thenReturn(JsonUtil.readTree(JSON)); when(blueprintUtils.isBlueprintNamePreConfigured(anyString(), any())).thenCallRealMethod(); } @Test public void threeDefaultBlueprintWithCorrectParameters() { ReflectionTestUtils.setField(underTest, "blueprintArray", Arrays.asList("test1=testloader", "test2=testloader", "test3=testloader")); Set<Blueprint> blueprints = underTest.loadBlueprints(ServiceTestUtils.cbUser()); Assert.assertEquals(3, blueprints.size()); } @Test public void twoDefaultBlueprintWithCorrectParameters() { ReflectionTestUtils.setField(underTest, "blueprintArray", Arrays.asList("test1=testloader", "test2=testloader")); Set<Blueprint> blueprints = underTest.loadBlueprints(ServiceTestUtils.cbUser()); Assert.assertEquals(2, blueprints.size()); } @Test public void threeDefaultBlueprintButOneIsIncorrect() throws IOException { ReflectionTestUtils.setField(underTest, "blueprintArray", Arrays.asList("test1=testloader", "test2=testloader", "incorrect")); when(blueprintUtils.readDefaultBlueprintFromFile(new String[]{"incorrect"})).thenThrow(new FileNotFoundException("not found")); Set<Blueprint> blueprints = underTest.loadBlueprints(ServiceTestUtils.cbUser()); Assert.assertEquals(2, blueprints.size()); } @Test public void threeDefaultBlueprintButEveryParamIsInCorrect() throws IOException { ReflectionTestUtils.setField(underTest, "blueprintArray", Arrays.asList("incorrect0", "incorrect1", "incorrect2")); when(blueprintUtils.readDefaultBlueprintFromFile(anyObject())).thenThrow(new FileNotFoundException("not found")); Set<Blueprint> blueprints = underTest.loadBlueprints(ServiceTestUtils.cbUser()); Assert.assertEquals(0, blueprints.size()); } @Test public void threeDefaultBlueprintButEveryParamIsJustFileName() { ReflectionTestUtils.setField(underTest, "blueprintArray", Arrays.asList("testloader", "testloader", "testloader")); Set<Blueprint> blueprints = underTest.loadBlueprints(ServiceTestUtils.cbUser()); Assert.assertEquals(3, blueprints.size()); } @Test public void launchDefaultBlueprintEveryParamIsCorrect() { ReflectionTestUtils.setField(underTest, "blueprintArray", Arrays.asList( "EDW-ETL: Apache Hive 1.2.1, Apache Spark 1.6=testloader", "Data Science: Apache Spark 1.6, Zeppelin=testloader", "EDW-ETL: Apache Hive 1.2.1, Apache Spark 1.6=testloader", "EDW-ETL: Apache Spark 2.0-preview, Apache Hive 2.0=testloader", "EDW-Analytics: Apache Hive 2.0 LLAP, Apache Zeppelin=testloader")); Set<Blueprint> blueprints = underTest.loadBlueprints(ServiceTestUtils.cbUser()); Assert.assertEquals(5, blueprints.size()); } }