/* # Licensed Materials - Property of IBM # Copyright IBM Corp. 2015 */ package com.ibm.streamsx.topology.test.distributed; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.ibm.streamsx.topology.Topology; import com.ibm.streamsx.topology.context.StreamsContext; import com.ibm.streamsx.topology.context.StreamsContext.Type; import com.ibm.streamsx.topology.context.StreamsContextFactory; import com.ibm.streamsx.topology.jobconfig.JobConfig; import com.ibm.streamsx.topology.test.TestTopology; /** * Test submission using JobConfig API */ public class JobConfigOverlaysFileTest extends TestTopology { private File sab; private File jcos; /** * Runs these tests when in standalone so they are run * for the default top-leve; test target. The JCO * is for distributed use only, but here we just * create a bundle and never execute it. */ @Before public void checkIsStandalone() { checkMinimumVersion("JobConfigOverlays", 4, 2); assumeTrue(SC_OK); assumeTrue(getTesterType() == StreamsContext.Type.STANDALONE_TESTER); } @After public void cleanup() { if (sab != null) sab.delete(); if (jcos != null) jcos.delete(); } @SuppressWarnings("unchecked") private StreamsContext<File> bundler() { return (StreamsContext<File>) StreamsContextFactory.getStreamsContext(Type.BUNDLE); } /** * Assert the returned sab is as expected. * @param sab * @param namespace * @param name * @return * @throws IOException */ private JsonObject assertSabGetJcos(Topology topology) throws IOException { assertNotNull(sab); assertTrue(sab.getName().endsWith(".sab")); assertTrue(sab.exists()); assertTrue(sab.isFile()); String sabName = "com.ibm.streamsx.topology.test." + topology.getName() + ".sab"; assertEquals(sabName, sab.getName()); String jconame = sab.getName().replace(".sab", "_JobConfig.json"); jcos = new File(sab.getParentFile(), jconame); assertTrue(jcos.exists()); assertTrue(jcos.isFile()); String jcosstr = new String(Files.readAllBytes(jcos.toPath()), StandardCharsets.UTF_8); JsonParser parser = new JsonParser(); JsonObject jcos = parser.parse(jcosstr).getAsJsonObject(); assertTrue(jcos.has("jobConfigOverlays")); assertTrue(jcos.get("jobConfigOverlays").isJsonArray()); assertEquals(1, jcos.get("jobConfigOverlays").getAsJsonArray().size()); assertTrue(jcos.get("jobConfigOverlays").getAsJsonArray().get(0).isJsonObject()); System.err.println("DDDD:" + jcos); return jcos; } private static JsonObject jobConfigOverlay(JsonObject jcos) { assertTrue(jcos.has("jobConfigOverlays")); return jcos.get("jobConfigOverlays").getAsJsonArray().get(0).getAsJsonObject(); } /** * Vanilla deployment when nothing special in the * topology exists. */ static void assertDefaultDeployment(JsonObject jcos) { JsonObject jco = jobConfigOverlay(jcos); assertTrue(jco.has("deploymentConfig")); assertTrue(jco.get("deploymentConfig").isJsonObject()); JsonObject deployConfig = jco.get("deploymentConfig").getAsJsonObject(); assertEquals(1, deployConfig.entrySet().size()); assertMissing(deployConfig, "fusionScheme"); assertTrue(deployConfig.has("parallelRegionConfig")); assertTrue(deployConfig.get("parallelRegionConfig").isJsonObject()); JsonObject parallelRegionConfig = deployConfig.get("parallelRegionConfig").getAsJsonObject(); assertTrue(parallelRegionConfig.has("fusionType")); assertTrue(parallelRegionConfig.get("fusionType").isJsonPrimitive()); assertEquals("channelIsolation", parallelRegionConfig.get("fusionType").getAsString()); assertMissing(jco, "operatorConfigs"); } // "deploymentConfig":{"fusionScheme":"legacy"}}] static void assertLegacyDeployment(JsonObject jcos) { JsonObject jco = jobConfigOverlay(jcos); assertTrue(jco.has("deploymentConfig")); assertTrue(jco.get("deploymentConfig").isJsonObject()); JsonObject deployConfig = jco.get("deploymentConfig").getAsJsonObject(); assertEquals(1, deployConfig.entrySet().size()); assertTrue(deployConfig.has("fusionScheme")); assertTrue(deployConfig.get("fusionScheme").isJsonPrimitive()); assertEquals("legacy", deployConfig.get("fusionScheme").getAsString()); assertMissing(jco, "operatorConfigs"); } static void assertMissing(JsonObject obj, String property) { assertFalse(obj.has(property)); } static void assertJsonString(JsonObject obj, String property, String expected) { assertTrue(obj.has(property)); assertTrue(obj.get(property).isJsonPrimitive()); assertEquals(expected, obj.get(property).getAsString()); } static void assertJsonBoolean(JsonObject obj, String property, boolean expected) { assertTrue(obj.has(property)); assertTrue(obj.get(property).isJsonPrimitive()); assertEquals(expected, obj.get(property).getAsBoolean()); } @Test public void testNoConfig() throws Exception { // Just a simple graph, which won't be executed. Topology topology = newTopology("testNoConfig"); topology.constants(Collections.emptyList()); sab = bundler().submit(topology).get(); JsonObject jcos = assertSabGetJcos(topology); assertDefaultDeployment(jcos); JsonObject jco = jobConfigOverlay(jcos); assertMissing(jco, "jobConfig"); assertMissing(jco, "operatorConfigs"); assertMissing(jco, "configInstructions"); } @Test public void testWithIsolate() throws Exception { // Just a simple graph, which won't be executed. Topology topology = newTopology("testNoConfig"); topology.constants(Collections.emptyList()).isolate().sink(tuple -> {}); sab = bundler().submit(topology).get(); JsonObject jcos = assertSabGetJcos(topology); assertLegacyDeployment(jcos); JsonObject jco = jobConfigOverlay(jcos); assertMissing(jco, "jobConfig"); assertMissing(jco, "operatorConfigs"); assertMissing(jco, "configInstructions"); } @Test public void testStandalone() throws Exception { // Just a simple graph, which won't be executed. Topology topology = newTopology("testNoConfig"); topology.constants(Collections.emptyList()); @SuppressWarnings("unchecked") StreamsContext<File> sb = (StreamsContext<File>) StreamsContextFactory.getStreamsContext(Type.STANDALONE_BUNDLE); sab = sb.submit(topology).get(); String jconame = sab.getName().replace(".sab", "_JobConfig.json"); jcos = new File(sab.getParentFile(), jconame); assertFalse(jcos.exists()); } @Test public void testJobNameGroup() throws Exception { // Just a simple graph, which won't be executed. Topology topology = newTopology("testJobNameGroup"); topology.constants(Collections.emptyList()); Map<String, Object> cfg = new HashMap<>(); { JobConfig jc = new JobConfig(); jc.addToConfig(cfg); jc.setJobName("JN432"); jc.setJobGroup("JG436"); } sab = bundler().submit(topology, cfg).get(); JsonObject jcos = assertSabGetJcos(topology); assertDefaultDeployment(jcos); JsonObject jco = jobConfigOverlay(jcos); assertMissing(jco, "operatorConfigs"); assertMissing(jco, "configInstructions"); assertTrue(jco.has("jobConfig")); assertTrue(jco.get("jobConfig").isJsonObject()); JsonObject jc = jco.get("jobConfig").getAsJsonObject(); assertJsonString(jc, "jobName", "JN432"); assertJsonString(jc, "jobGroup", "JG436"); assertEquals(2, jc.entrySet().size()); } @Test public void testJobConfigOther() throws Exception { // Just a simple graph, which won't be executed. Topology topology = newTopology("testJobConfigOther"); topology.constants(Collections.emptyList()); Map<String, Object> cfg = new HashMap<>(); { JobConfig jc = new JobConfig(); jc.addToConfig(cfg); jc.setDataDirectory("/tmp/abc"); jc.setPreloadApplicationBundles(true); jc.setTracing(Level.INFO); assertEquals("info", jc.getStreamsTracing()); } sab = bundler().submit(topology, cfg).get(); JsonObject jcos = assertSabGetJcos(topology); assertDefaultDeployment(jcos); JsonObject jco = jobConfigOverlay(jcos); assertMissing(jco, "operatorConfigs"); assertMissing(jco, "configInstructions"); assertTrue(jco.has("jobConfig")); assertTrue(jco.get("jobConfig").isJsonObject()); JsonObject jc = jco.get("jobConfig").getAsJsonObject(); assertMissing(jc, "jobName"); assertMissing(jc, "jobGroup"); assertJsonString(jc, "dataDirectory", "/tmp/abc"); assertJsonBoolean(jc, "preloadApplicationBundles", true); assertJsonString(jc, "tracing", "info"); assertEquals(3, jc.entrySet().size()); } }