From c445d7865f1ded1c62f720abb70382b2963fff57 Mon Sep 17 00:00:00 2001 From: dc443y Date: Fri, 21 Jan 2022 14:43:18 -0600 Subject: [PATCH] Add configurable port and authentication to DMaaP simulator Issue-ID: POLICY-3890 Signed-off-by: dc443y Change-Id: Idbeb3590a767e51aa0058a7a45d56a61e81301cb --- .../main/java/org/onap/policy/simulators/Util.java | 19 +++- .../simulators/dmaap/AuthDmaapParameters.json | 11 ++ .../onap/policy/simulators/DmaapSimulatorTest.java | 111 +++++++++++++++++++-- .../src/test/resources/keystore-test | Bin 0 -> 3895 bytes .../policy/simulators/dmaap/TopicParameters.json | 23 +++++ .../sim/dmaap/parameters/RestServerParameters.java | 12 +++ 6 files changed, 163 insertions(+), 13 deletions(-) create mode 100644 models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/dmaap/AuthDmaapParameters.json create mode 100644 models-interactions/model-simulators/src/test/resources/keystore-test diff --git a/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/Util.java b/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/Util.java index 24fd7ece5..155107bbd 100644 --- a/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/Util.java +++ b/models-interactions/model-simulators/src/main/java/org/onap/policy/simulators/Util.java @@ -156,19 +156,30 @@ public final class Util { } /** - * Build a DMaaP simulator. + * Builds an unauthenticated HTTP DMaaP simulator. * * @return the simulator * @throws InterruptedException if a thread is interrupted */ public static HttpServletServer buildDmaapSim() throws InterruptedException { - var json = ResourceUtils.getResourceAsString("org/onap/policy/simulators/dmaap/DmaapParameters.json"); + return buildDmaapSim("org/onap/policy/simulators/dmaap/DmaapParameters.json"); + } + + /** + * Build a DMaaP simulator from a properties file. + * + * @param resourceName the name of the properties file + * @return the simulator + * @throws InterruptedException if a thread is interrupted + */ + public static HttpServletServer buildDmaapSim(String resourceName) throws InterruptedException { + var json = ResourceUtils.getResourceAsString(resourceName); DmaapSimParameterGroup params = null; try { params = new StandardCoder().decode(json, DmaapSimParameterGroup.class); } catch (CoderException ce) { throw new ParameterRuntimeException( - CANNOT_PROCESS_PARAMETERS + "org/onap/policy/simulators/dmaap/DmaapParameters.json", ce); + CANNOT_PROCESS_PARAMETERS + resourceName, ce); } DmaapSimProvider.setInstance(new DmaapSimProvider(params)); @@ -177,8 +188,6 @@ public final class Util { final String svcpfx = PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + params.getRestServerParameters().getName(); - props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, - Integer.toString(DMAAPSIM_SERVER_PORT)); props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true"); HttpServletServer testServer = HttpServletServerFactoryInstance.getServerFactory().build(props).get(0); diff --git a/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/dmaap/AuthDmaapParameters.json b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/dmaap/AuthDmaapParameters.json new file mode 100644 index 000000000..0ef03169a --- /dev/null +++ b/models-interactions/model-simulators/src/main/resources/org/onap/policy/simulators/dmaap/AuthDmaapParameters.json @@ -0,0 +1,11 @@ +{ + "name": "AuthDMaapSim", + "topicSweepSec": 300, + "restServerParameters": { + "host": "0.0.0.0", + "port": 3903, + "useHttps": true, + "userName": "my-username", + "password": "my-password" + } +} diff --git a/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/DmaapSimulatorTest.java b/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/DmaapSimulatorTest.java index 19c399db8..197c25f6c 100644 --- a/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/DmaapSimulatorTest.java +++ b/models-interactions/model-simulators/src/test/java/org/onap/policy/simulators/DmaapSimulatorTest.java @@ -24,24 +24,30 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.File; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.util.HashMap; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager; import org.onap.policy.common.endpoints.event.comm.bus.DmaapTopicSink; import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance; +import org.onap.policy.common.endpoints.http.server.internal.JettyJerseyServer; import org.onap.policy.common.endpoints.parameters.TopicParameterGroup; import org.onap.policy.common.utils.coder.StandardCoder; public class DmaapSimulatorTest { private static final int MAX_WAIT_SEC = 5; private static final String TOPIC = "MY-TOPIC"; + private static final String AUTH_TOPIC = "MY-AUTH-TOPIC"; + private static final String AUTH_PORT = "3903"; + + private static final HashMap savedValuesMap = new HashMap<>(); /** * Messages from the topic are placed here by the endpoint. @@ -61,11 +67,14 @@ public class DmaapSimulatorTest { @Before public void setUp() throws Exception { assertNotNull(Util.buildDmaapSim()); + setSystemProperties(); + assertNotNull(Util.buildDmaapSim("org/onap/policy/simulators/dmaap/AuthDmaapParameters.json")); - String topicJson = new String(Files.readAllBytes( - new File("src/test/resources/org/onap/policy/simulators/dmaap/TopicParameters.json").toPath()), - StandardCharsets.UTF_8); - topicJson = topicJson.replace("${port}", String.valueOf(Util.DMAAPSIM_SERVER_PORT)); + String topicJson = Files.readString( + new File("src/test/resources/org/onap/policy/simulators/dmaap/TopicParameters.json").toPath()); + topicJson = topicJson + .replace("${port}", String.valueOf(Util.DMAAPSIM_SERVER_PORT)) + .replace("${authPort}", AUTH_PORT); TopicParameterGroup topicConfig = new StandardCoder().decode(topicJson, TopicParameterGroup.class); @@ -75,6 +84,11 @@ public class DmaapSimulatorTest { queue = new LinkedBlockingQueue<>(); } + @AfterClass + public static void tearDownAfterClass() { + clearSystemProperties(); + } + @After public void tearDown() { TopicEndpointManager.getManager().shutdown(); @@ -83,15 +97,96 @@ public class DmaapSimulatorTest { @Test public void test() throws InterruptedException { - TopicEndpointManager.getManager().getDmaapTopicSource(TOPIC) - .register((infra, topic, event) -> queue.add(event)); + // test basic DMaaP simulator (default port, http, no auth) + sendAndPoll(TOPIC); + // test custom DMaaP simulator (custom port, https, basic auth) + sendAndPoll(AUTH_TOPIC); + } + + /** + * Sets up keystore and truststore for https test server. + */ + private static void setSystemProperties() { + String keyStoreSystemProperty = System.getProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME); + if (keyStoreSystemProperty != null) { + savedValuesMap.put(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, keyStoreSystemProperty); + } + + String keyStorePasswordSystemProperty = + System.getProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME); + if (keyStorePasswordSystemProperty != null) { + savedValuesMap.put(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME, + keyStorePasswordSystemProperty); + } + + String trustStoreSystemProperty = System.getProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME); + if (trustStoreSystemProperty != null) { + savedValuesMap.put(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME, trustStoreSystemProperty); + } - DmaapTopicSink sink = TopicEndpointManager.getManager().getDmaapTopicSink(TOPIC); + String trustStorePasswordSystemProperty = + System.getProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME); + if (trustStorePasswordSystemProperty != null) { + savedValuesMap.put(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME, + trustStorePasswordSystemProperty); + } + + System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, "src/test/resources/keystore-test"); + System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME, "kstest"); + + System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME, "src/test/resources/keystore-test"); + System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME, "kstest"); + } + + /** + * Clears the keystore/truststore properties. + */ + private static void clearSystemProperties() { + if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME)) { + System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, + savedValuesMap.get(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME)); + savedValuesMap.remove(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME); + } else { + System.clearProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME); + } + + if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME)) { + System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME, + savedValuesMap.get(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME)); + savedValuesMap.remove(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME); + } else { + System.clearProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME); + } + + if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME)) { + System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME, + savedValuesMap.get(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME)); + savedValuesMap.remove(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME); + } else { + System.clearProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME); + } + + if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME)) { + System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME, + savedValuesMap.get(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME)); + savedValuesMap.remove(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME); + } else { + System.clearProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME); + } + } + + private void sendAndPoll(String topicName) throws InterruptedException { + TopicEndpointManager.getManager().getDmaapTopicSource(topicName) + .register((infra, topic, event) -> queue.add(event)); + + DmaapTopicSink sink = TopicEndpointManager.getManager().getDmaapTopicSink(topicName); assertThat(queue.poll(1, TimeUnit.SECONDS)).isNull(); + sink.send("hello"); assertEquals("hello", queue.poll(MAX_WAIT_SEC, TimeUnit.SECONDS)); sink.send("world"); assertEquals("world", queue.poll(MAX_WAIT_SEC, TimeUnit.SECONDS)); } + } diff --git a/models-interactions/model-simulators/src/test/resources/keystore-test b/models-interactions/model-simulators/src/test/resources/keystore-test new file mode 100644 index 0000000000000000000000000000000000000000..5820e0f0ce4be85553e170fa63d2669b757b44fa GIT binary patch literal 3895 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 TB{{+@Z#{s98>97~Dxv-bP#hX; literal 0 HcmV?d00001 diff --git a/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/dmaap/TopicParameters.json b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/dmaap/TopicParameters.json index ba1f4806f..03531918b 100644 --- a/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/dmaap/TopicParameters.json +++ b/models-interactions/model-simulators/src/test/resources/org/onap/policy/simulators/dmaap/TopicParameters.json @@ -7,6 +7,18 @@ ], "topicCommInfrastructure": "dmaap", "fetchTimeout": 100 + }, + { + "topic": "MY-AUTH-TOPIC", + "servers": [ + "localhost:${authPort}" + ], + "topicCommInfrastructure": "dmaap", + "fetchTimeout": 100, + "useHttps": true, + "allowSelfSignedCerts": true, + "userName": "my-username", + "password": "my-password" } ], "topicSinks": [ @@ -16,6 +28,17 @@ "localhost:${port}" ], "topicCommInfrastructure": "dmaap" + }, + { + "topic": "MY-AUTH-TOPIC", + "servers": [ + "localhost:${authPort}" + ], + "topicCommInfrastructure": "dmaap", + "useHttps": true, + "allowSelfSignedCerts": true, + "userName": "my-username", + "password": "my-password" } ] } \ No newline at end of file diff --git a/models-sim/models-sim-dmaap/src/main/java/org/onap/policy/models/sim/dmaap/parameters/RestServerParameters.java b/models-sim/models-sim-dmaap/src/main/java/org/onap/policy/models/sim/dmaap/parameters/RestServerParameters.java index 8414d0718..04d914c1a 100644 --- a/models-sim/models-sim-dmaap/src/main/java/org/onap/policy/models/sim/dmaap/parameters/RestServerParameters.java +++ b/models-sim/models-sim-dmaap/src/main/java/org/onap/policy/models/sim/dmaap/parameters/RestServerParameters.java @@ -45,6 +45,12 @@ public class RestServerParameters extends ParameterGroupImpl { @Min(value = 1) private int port; + private String userName; + + private String password; + + private boolean useHttps; + public RestServerParameters() { super(RestServerParameters.class.getSimpleName()); } @@ -69,6 +75,12 @@ public class RestServerParameters extends ParameterGroupImpl { DmaapSimRestControllerV1.class.getName()); props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "false"); props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_SWAGGER_SUFFIX, "false"); + props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX, Boolean.toString(isUseHttps())); + + if (getUserName() != null && getPassword() != null) { + props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_USERNAME_SUFFIX, getUserName()); + props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_PASSWORD_SUFFIX, getPassword()); + } props.setProperty(svcpfx + PolicyEndPointProperties.PROPERTY_HTTP_SERIALIZATION_PROVIDER, String.join(",", CambriaMessageBodyHandler.class.getName(), -- 2.16.6