From bc02433cc5292c5272dc084db8044bb4c8140135 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Tue, 17 Mar 2020 17:41:59 -0400 Subject: Add docker file for all simulators Some CSITs may require multiple simulators. This adds a class that will start all of the simulators. A tarball is generated from which a docker image can be built. Added simulators for Topics: appc and appc-lcm. Fixed licenses in files in packages directory. Fixed per review comments: - add version to Dockerfile Issue-ID: POLICY-2434 Signed-off-by: Jim Hahn Change-Id: Id7aa9cb5a5874f7b4185273ab0d2c074198554ff --- .../simulators/ClassRestServerParametersTest.java | 48 ++++ .../onap/policy/models/simulators/MainTest.java | 256 +++++++++++++++++++++ .../models/simulators/SimulatorParametersTest.java | 47 ++++ .../simulators/TopicServerParametersTest.java | 48 ++++ .../src/test/resources/invalidSimParameters.json | 2 + .../src/test/resources/invalidTopicServer.json | 35 +++ .../src/test/resources/keystore-test | Bin 0 -> 3895 bytes .../src/test/resources/logback-test.xml | 49 ++++ .../src/test/resources/missingSink.json | 26 +++ .../src/test/resources/missingSource.json | 26 +++ .../src/test/resources/simParameters.json | 95 ++++++++ 11 files changed, 632 insertions(+) create mode 100644 models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/ClassRestServerParametersTest.java create mode 100644 models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/MainTest.java create mode 100644 models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/SimulatorParametersTest.java create mode 100644 models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/TopicServerParametersTest.java create mode 100644 models-sim/policy-models-simulators/src/test/resources/invalidSimParameters.json create mode 100644 models-sim/policy-models-simulators/src/test/resources/invalidTopicServer.json create mode 100644 models-sim/policy-models-simulators/src/test/resources/keystore-test create mode 100644 models-sim/policy-models-simulators/src/test/resources/logback-test.xml create mode 100644 models-sim/policy-models-simulators/src/test/resources/missingSink.json create mode 100644 models-sim/policy-models-simulators/src/test/resources/missingSource.json create mode 100644 models-sim/policy-models-simulators/src/test/resources/simParameters.json (limited to 'models-sim/policy-models-simulators/src/test') diff --git a/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/ClassRestServerParametersTest.java b/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/ClassRestServerParametersTest.java new file mode 100644 index 000000000..76637610c --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/ClassRestServerParametersTest.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.models.simulators; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.io.File; +import org.junit.Test; +import org.onap.policy.common.parameters.ValidationResult; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; + +public class ClassRestServerParametersTest { + + @Test + public void testValidateString() throws CoderException { + // some fields missing + ValidationResult result = new ClassRestServerParameters().validate("InvalidParams"); + assertFalse(result.isValid()); + assertNotNull(result.getResult()); + + // everything populated + SimulatorParameters simParams = new StandardCoder() + .decode(new File("src/test/resources/simParameters.json"), SimulatorParameters.class); + ClassRestServerParameters params = simParams.getRestServers().get(0); + assertNull(params.validate("ValidParams").getResult()); + } +} diff --git a/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/MainTest.java b/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/MainTest.java new file mode 100644 index 000000000..e9e8cbdec --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/MainTest.java @@ -0,0 +1,256 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.models.simulators; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.FileNotFoundException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import javax.ws.rs.core.Response; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams; +import org.onap.policy.common.endpoints.http.client.HttpClient; +import org.onap.policy.common.endpoints.http.client.HttpClientConfigException; +import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance; +import org.onap.policy.common.endpoints.http.server.HttpServletServer; +import org.onap.policy.common.endpoints.http.server.internal.JettyJerseyServer; +import org.onap.policy.common.utils.coder.Coder; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.network.NetworkUtil; + +public class MainTest { + private static final String PARAMETER_FILE = "simParameters.json"; + private static final String HOST = "localhost"; + private static final String EXPECTED_EXCEPTION = "expected exception"; + + private static Map savedValues; + + /** + * Saves system properties. + */ + @BeforeClass + public static void setUpBeforeClass() { + savedValues = new HashMap<>(); + + for (String prop : List.of(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME, + JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, + JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME, + JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME)) { + + savedValues.put(prop, System.getProperty(prop)); + } + + 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"); + } + + /** + * Restores system properties. + */ + @AfterClass + public static void tearDownAfterClass() { + for (Entry ent : savedValues.entrySet()) { + if (ent.getValue() == null) { + System.getProperties().remove(ent.getKey()); + } else { + System.setProperty(ent.getKey(), ent.getValue()); + } + } + } + + /** + * Shuts down the simulator instance. + */ + @After + public void tearDown() { + Main main = Main.getInstance(); + if (main != null && main.isAlive()) { + main.shutdown(); + } + } + + @Test + public void testConstructor() throws Exception { + assertThatIllegalArgumentException().isThrownBy(() -> new Main("invalidSimParameters.json")) + .withMessage("invalid simulator parameters"); + } + + /** + * Verifies that all of the simulators are brought up and that HTTPS works with at + * least one of them. + */ + @Test + public void testMain() throws Exception { + Main.main(new String[0]); + assertTrue(Main.getInstance() == null || !Main.getInstance().isAlive()); + + Main.main(new String[] {PARAMETER_FILE}); + + // don't need to wait long, because buildXxx() does the wait for us + for (int port = 6666; port <= 6670; ++port) { + assertTrue("simulator on port " + port, NetworkUtil.isTcpPortOpen(HOST, port, 1, 100)); + } + + // it's sufficient to verify that one of the simulators works + checkAai(); + } + + private void checkAai() throws HttpClientConfigException { + BusTopicParams params = BusTopicParams.builder().clientName("client").hostname(HOST).port(6666).useHttps(true) + .allowSelfSignedCerts(true).basePath("aai").build(); + HttpClient client = HttpClientFactoryInstance.getClientFactory().build(params); + + Response response = client.get("/v8/network/generic-vnfs/generic-vnf/my-vnf"); + assertEquals(200, response.getStatus()); + + String result = response.readEntity(String.class); + assertThat(result).contains("USUCP0PCOIL0110UJZZ01-vsrx"); + } + + /** + * Tests readParameters() when the file cannot be found. + */ + @Test + public void testReadParametersNoFile() { + assertThatIllegalArgumentException().isThrownBy(() -> new Main("missing-file.json")) + .withCauseInstanceOf(FileNotFoundException.class); + } + + /** + * Tests readParameters() when the json cannot be decoded. + */ + @Test + public void testReadParametersInvalidJson() throws CoderException { + Coder coder = mock(Coder.class); + when(coder.decode(any(String.class), any())).thenThrow(new CoderException(EXPECTED_EXCEPTION)); + + assertThatIllegalArgumentException().isThrownBy(() -> new Main(PARAMETER_FILE) { + @Override + protected Coder makeCoder() { + return coder; + } + }).withCauseInstanceOf(CoderException.class); + } + + /** + * Tests buildRestServer() when the server port is not open. + */ + @Test + public void testBuildRestServerNotOpen() { + HttpServletServer server = mock(HttpServletServer.class); + + Main main = new Main(PARAMETER_FILE) { + @Override + protected HttpServletServer makeServer(Properties props) { + return server; + } + + @Override + protected boolean isTcpPortOpen(String hostName, int port) throws InterruptedException { + return false; + } + }; + + assertThatThrownBy(main::start).hasCauseInstanceOf(IllegalStateException.class); + } + + /** + * Tests buildRestServer() when the port checker is interrupted. + */ + @Test + public void testBuildRestServerInterrupted() throws InterruptedException { + HttpServletServer server = mock(HttpServletServer.class); + + Main main = new Main(PARAMETER_FILE) { + @Override + protected HttpServletServer makeServer(Properties props) { + return server; + } + + @Override + protected boolean isTcpPortOpen(String hostName, int port) throws InterruptedException { + throw new InterruptedException(EXPECTED_EXCEPTION); + } + }; + + // run in another thread so we don't interrupt this thread + LinkedBlockingQueue queue = new LinkedBlockingQueue<>(); + Thread thread = new Thread(() -> { + try { + main.start(); + } catch (RuntimeException e) { + queue.add(e); + } + }); + + thread.setDaemon(true); + thread.start(); + + RuntimeException ex = queue.poll(5, TimeUnit.SECONDS); + assertNotNull(ex); + assertTrue(ex.getCause() instanceof IllegalStateException); + assertThat(ex.getCause()).hasMessageStartingWith("interrupted while building"); + } + + /** + * Tests buildTopicServer() when the provider class is invalid. + */ + @Test + public void testBuildTopicServerInvalidProvider() { + assertThatThrownBy(() -> new Main("invalidTopicServer.json").start()); + } + + /** + * Tests buildTopicServer() when the sink is missing. + */ + @Test + public void testBuildTopicServerNoSink() { + assertThatThrownBy(() -> new Main("missingSink.json").start()); + } + + /** + * Tests buildTopicServer() when the sink is missing. + */ + @Test + public void testBuildTopicServerNoSource() { + assertThatThrownBy(() -> new Main("missingSource.json").start()); + } +} diff --git a/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/SimulatorParametersTest.java b/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/SimulatorParametersTest.java new file mode 100644 index 000000000..5294ca483 --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/SimulatorParametersTest.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.models.simulators; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.io.File; +import org.junit.Test; +import org.onap.policy.common.parameters.BeanValidationResult; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; + +public class SimulatorParametersTest { + + @Test + public void testValidate() throws CoderException { + // some fields missing + BeanValidationResult result = new SimulatorParameters().validate("InvalidParams"); + assertFalse(result.isValid()); + assertNotNull(result.getResult()); + + // everything populated + SimulatorParameters params = new StandardCoder().decode(new File("src/test/resources/simParameters.json"), + SimulatorParameters.class); + assertNull(params.validate("ValidParams").getResult()); + } +} diff --git a/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/TopicServerParametersTest.java b/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/TopicServerParametersTest.java new file mode 100644 index 000000000..2d182d8fb --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/java/org/onap/policy/models/simulators/TopicServerParametersTest.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.models.simulators; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.io.File; +import org.junit.Test; +import org.onap.policy.common.parameters.ValidationResult; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; + +public class TopicServerParametersTest { + + @Test + public void testValidateString() throws CoderException { + // some fields missing + ValidationResult result = new TopicServerParameters().validate("InvalidParams"); + assertFalse(result.isValid()); + assertNotNull(result.getResult()); + + // everything populated + SimulatorParameters simParams = new StandardCoder() + .decode(new File("src/test/resources/simParameters.json"), SimulatorParameters.class); + TopicServerParameters params = simParams.getTopicServers().get(0); + assertNull(params.validate("ValidParams").getResult()); + } +} diff --git a/models-sim/policy-models-simulators/src/test/resources/invalidSimParameters.json b/models-sim/policy-models-simulators/src/test/resources/invalidSimParameters.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/resources/invalidSimParameters.json @@ -0,0 +1,2 @@ +{ +} diff --git a/models-sim/policy-models-simulators/src/test/resources/invalidTopicServer.json b/models-sim/policy-models-simulators/src/test/resources/invalidTopicServer.json new file mode 100644 index 000000000..b3d31f6b4 --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/resources/invalidTopicServer.json @@ -0,0 +1,35 @@ +{ + "dmaapProvider": { + "name": "DMaaP simulator", + "topicSweepSec": 300, + "restServerParameters": { + + } + }, + "topicSinks": [ + { + "topic": "APPC-LCM-READ", + "servers": ["localhost"], + "port": 3905, + "topicCommInfrastructure": "DMAAP", + "https": true + } + ], + "topicSources": [ + { + "topic": "APPC-LCM-WRITE", + "servers": ["localhost"], + "port": 3905, + "topicCommInfrastructure": "DMAAP", + "https": true + } + ], + "topicServers": [ + { + "name": "Invalid Topic simulator", + "providerClass": "org.onap.policy.simulators.InvalidTopicServer", + "sink": "APPC-LCM-READ", + "source": "APPC-LCM-WRITE" + } + ] +} diff --git a/models-sim/policy-models-simulators/src/test/resources/keystore-test b/models-sim/policy-models-simulators/src/test/resources/keystore-test new file mode 100644 index 000000000..5820e0f0c Binary files /dev/null and b/models-sim/policy-models-simulators/src/test/resources/keystore-test differ diff --git a/models-sim/policy-models-simulators/src/test/resources/logback-test.xml b/models-sim/policy-models-simulators/src/test/resources/logback-test.xml new file mode 100644 index 000000000..e599a94a8 --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/resources/logback-test.xml @@ -0,0 +1,49 @@ + + + + + Simulators + + + + + + %d %contextName [%t] %level %logger{36} - %msg%n + + + + + + + + + + + + + + + + diff --git a/models-sim/policy-models-simulators/src/test/resources/missingSink.json b/models-sim/policy-models-simulators/src/test/resources/missingSink.json new file mode 100644 index 000000000..e7d63e04f --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/resources/missingSink.json @@ -0,0 +1,26 @@ +{ + "dmaapProvider": { + "name": "DMaaP simulator", + "topicSweepSec": 300, + "restServerParameters": { + + } + }, + "topicSources": [ + { + "topic": "APPC-LCM-WRITE", + "servers": ["localhost"], + "port": 3905, + "topicCommInfrastructure": "DMAAP", + "https": true + } + ], + "topicServers": [ + { + "name": "APPC-LCM simulator", + "providerClass": "org.onap.policy.simulators.AppcLcmTopicServer", + "sink": "APPC-LCM-READ", + "source": "APPC-LCM-WRITE" + } + ] +} diff --git a/models-sim/policy-models-simulators/src/test/resources/missingSource.json b/models-sim/policy-models-simulators/src/test/resources/missingSource.json new file mode 100644 index 000000000..0f02e4095 --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/resources/missingSource.json @@ -0,0 +1,26 @@ +{ + "dmaapProvider": { + "name": "DMaaP simulator", + "topicSweepSec": 300, + "restServerParameters": { + + } + }, + "topicSinks": [ + { + "topic": "APPC-LCM-READ", + "servers": ["localhost"], + "port": 3905, + "topicCommInfrastructure": "DMAAP", + "https": true + } + ], + "topicServers": [ + { + "name": "APPC-LCM simulator", + "providerClass": "org.onap.policy.simulators.AppcLcmTopicServer", + "sink": "APPC-LCM-READ", + "source": "APPC-LCM-WRITE" + } + ] +} diff --git a/models-sim/policy-models-simulators/src/test/resources/simParameters.json b/models-sim/policy-models-simulators/src/test/resources/simParameters.json new file mode 100644 index 000000000..c7abb2973 --- /dev/null +++ b/models-sim/policy-models-simulators/src/test/resources/simParameters.json @@ -0,0 +1,95 @@ +{ + "dmaapProvider": { + "name": "DMaaP simulator", + "topicSweepSec": 300, + "restServerParameters": { + + } + }, + "restServers": [ + { + "name": "DMaaP simulator", + "providerClass": "org.onap.policy.models.sim.dmaap.rest.DmaapSimRestControllerV1", + "host": "localhost", + "port": 3905, + "https": true + }, + { + "name": "A&AI simulator", + "providerClass": "org.onap.policy.simulators.AaiSimulatorJaxRs", + "host": "localhost", + "port": 6666, + "https": true + }, + { + "name": "Guard simulator", + "providerClass": "org.onap.policy.simulators.GuardSimulatorJaxRs", + "host": "localhost", + "port": 6667, + "https": true + }, + { + "name": "SDNC simulator", + "providerClass": "org.onap.policy.simulators.SdncSimulatorJaxRs", + "host": "localhost", + "port": 6668, + "https": true + }, + { + "name": "SO simulator", + "providerClass": "org.onap.policy.simulators.SoSimulatorJaxRs", + "host": "localhost", + "port": 6669, + "https": true + }, + { + "name": "VFC simulator", + "providerClass": "org.onap.policy.simulators.VfcSimulatorJaxRs", + "host": "localhost", + "port": 6670, + "https": true + } + ], + "topicSinks": [ + { + "topic": "APPC-CL", + "servers": ["localhost"], + "topicCommInfrastructure": "DMAAP", + "useHttps": true + }, + { + "topic": "APPC-LCM-READ", + "servers": ["localhost"], + "topicCommInfrastructure": "DMAAP", + "useHttps": true + } + ], + "topicSources": [ + { + "topic": "APPC-CL", + "servers": ["localhost"], + "topicCommInfrastructure": "DMAAP", + "useHttps": true + }, + { + "topic": "APPC-LCM-WRITE", + "servers": ["localhost"], + "topicCommInfrastructure": "DMAAP", + "useHttps": true + } + ], + "topicServers": [ + { + "name": "APPC Legacy simulator", + "providerClass": "org.onap.policy.simulators.AppcLegacyTopicServer", + "sink": "APPC-CL", + "source": "APPC-CL" + }, + { + "name": "APPC-LCM simulator", + "providerClass": "org.onap.policy.simulators.AppcLcmTopicServer", + "sink": "APPC-LCM-READ", + "source": "APPC-LCM-WRITE" + } + ] +} -- cgit 1.2.3-korg