From b41f82c13328ff6416cb83434436d5a674d487fc Mon Sep 17 00:00:00 2001 From: jhh Date: Mon, 18 Nov 2019 13:28:12 -0600 Subject: use case junit tests added vcpe support added scale out support addressed some review comments added vfw support Issue-ID: POLICY-2249 Signed-off-by: jhh Change-Id: I245f8fc8d520cd2511080c9aee61bf7a0c0a1499 Signed-off-by: jhh --- controlloop/common/controller-usecases/pom.xml | 12 + .../org/onap/policy/controlloop/UsecasesBase.java | 484 +++++++++++++++++++++ .../java/org/onap/policy/controlloop/VcpeTest.java | 172 ++++++++ .../java/org/onap/policy/controlloop/VfwTest.java | 171 ++++++++ .../java/org/onap/policy/controlloop/VlbTest.java | 143 ++++++ .../resources/config/controlloop-system.properties | 21 + .../config/controlloop.properties.environment | 54 +++ .../config/usecases-controller.properties | 73 ++++ .../src/test/resources/usecases.pom | 30 ++ .../src/test/resources/vcpe/tosca-vcpe.json | 9 + .../src/test/resources/vcpe/vcpe.appc.success.json | 22 + .../src/test/resources/vcpe/vcpe.onset.json | 16 + .../src/test/resources/vfw/tosca-vfw.json | 9 + .../src/test/resources/vfw/vfw.appc.success.json | 17 + .../src/test/resources/vfw/vfw.onset.json | 17 + .../src/test/resources/vlb/tosca-vlb.json | 9 + .../src/test/resources/vlb/vlb.onset.json | 16 + 17 files changed, 1275 insertions(+) create mode 100644 controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/UsecasesBase.java create mode 100644 controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VcpeTest.java create mode 100644 controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VfwTest.java create mode 100644 controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VlbTest.java create mode 100644 controlloop/common/controller-usecases/src/test/resources/config/controlloop-system.properties create mode 100644 controlloop/common/controller-usecases/src/test/resources/config/controlloop.properties.environment create mode 100644 controlloop/common/controller-usecases/src/test/resources/config/usecases-controller.properties create mode 100644 controlloop/common/controller-usecases/src/test/resources/usecases.pom create mode 100644 controlloop/common/controller-usecases/src/test/resources/vcpe/tosca-vcpe.json create mode 100644 controlloop/common/controller-usecases/src/test/resources/vcpe/vcpe.appc.success.json create mode 100644 controlloop/common/controller-usecases/src/test/resources/vcpe/vcpe.onset.json create mode 100644 controlloop/common/controller-usecases/src/test/resources/vfw/tosca-vfw.json create mode 100644 controlloop/common/controller-usecases/src/test/resources/vfw/vfw.appc.success.json create mode 100644 controlloop/common/controller-usecases/src/test/resources/vfw/vfw.onset.json create mode 100644 controlloop/common/controller-usecases/src/test/resources/vlb/tosca-vlb.json create mode 100644 controlloop/common/controller-usecases/src/test/resources/vlb/vlb.onset.json (limited to 'controlloop') diff --git a/controlloop/common/controller-usecases/pom.xml b/controlloop/common/controller-usecases/pom.xml index 10d7425ce..3c299334b 100644 --- a/controlloop/common/controller-usecases/pom.xml +++ b/controlloop/common/controller-usecases/pom.xml @@ -189,6 +189,18 @@ junit test + + org.onap.policy.models.policy-models-interactions + simulators + ${policy.models.version} + test + + + org.awaitility + awaitility + 4.0.1 + test + diff --git a/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/UsecasesBase.java b/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/UsecasesBase.java new file mode 100644 index 000000000..4fe354dc6 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/UsecasesBase.java @@ -0,0 +1,484 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 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.controlloop; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.LinkedList; +import java.util.Properties; +import java.util.Queue; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import lombok.Getter; +import org.kie.api.event.rule.AfterMatchFiredEvent; +import org.kie.api.event.rule.BeforeMatchFiredEvent; +import org.kie.api.event.rule.DefaultAgendaEventListener; +import org.kie.api.event.rule.DefaultRuleRuntimeEventListener; +import org.kie.api.event.rule.MatchCancelledEvent; +import org.kie.api.event.rule.MatchCreatedEvent; +import org.kie.api.event.rule.ObjectDeletedEvent; +import org.kie.api.event.rule.ObjectInsertedEvent; +import org.kie.api.event.rule.ObjectUpdatedEvent; +import org.kie.api.event.rule.RuleRuntimeEventListener; +import org.kie.api.runtime.KieSession; +import org.onap.policy.common.endpoints.event.comm.Topic; +import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; +import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager; +import org.onap.policy.common.endpoints.event.comm.TopicListener; +import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.common.utils.coder.StandardCoder; +import org.onap.policy.controlloop.params.ControlLoopParams; +import org.onap.policy.drools.persistence.SystemPersistence; +import org.onap.policy.drools.persistence.SystemPersistenceConstants; +import org.onap.policy.drools.protocol.coders.EventProtocolCoderConstants; +import org.onap.policy.drools.system.PolicyController; +import org.onap.policy.drools.system.PolicyControllerConstants; +import org.onap.policy.drools.system.PolicyEngine; +import org.onap.policy.drools.system.PolicyEngineConstants; +import org.onap.policy.drools.util.KieUtils; +import org.onap.policy.drools.utils.PropertyUtil; +import org.onap.policy.drools.utils.logging.LoggerUtil; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; +import org.onap.policy.simulators.Util; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Use Cases Tests Framework. + */ +public abstract class UsecasesBase { + + private static final Logger logger = LoggerFactory.getLogger(UsecasesBase.class); + + /** + * PDP-D Engine. + */ + protected static final PolicyEngine pdpD = PolicyEngineConstants.getManager(); + + /** + * PDP-D Configuration Repository. + */ + protected static final SystemPersistence repo = SystemPersistenceConstants.getManager(); + + /** + * Usecases controller and session name. + */ + protected static final String USECASES = "usecases"; + + /** + * Usecases controller. + */ + protected static PolicyController usecases; + + /* + * Canonical Topic Names. + */ + protected static final String DCAE_TOPIC = "DCAE_TOPIC"; + protected static final String APPC_LCM_WRITE_TOPIC = "APPC-LCM-WRITE"; + protected static final String POLICY_CL_MGT_TOPIC = "POLICY-CL-MGT"; + protected static final String APPC_LCM_READ_TOPIC = "APPC-LCM-READ"; + protected static final String APPC_CL_TOPIC = "APPC-CL"; + + /** + * Sets up overall logging. + */ + protected static void setupLogging() { + LoggerUtil.setLevel(LoggerUtil.ROOT_LOGGER, "WARN"); + LoggerUtil.setLevel("org.eclipse.jetty", "WARN"); + LoggerUtil.setLevel("org.onap.policy.controlloop", "INFO"); + LoggerUtil.setLevel("network", "INFO"); + } + + /** + * Sets up Drools Logging for events of interest. + */ + protected static void setupDroolsLogging() { + KieSession session = + PolicyControllerConstants.getFactory().get(USECASES) + .getDrools().getContainer() .getPolicySession(USECASES).getKieSession(); + + session.addEventListener(new RuleListenerLogger()); + session.addEventListener(new AgendaListenerLogger()); + } + + /** + * Sets up Simulators for use case testing. + */ + protected static void setupSimulators() throws InterruptedException { + Util.buildAaiSim(); + Util.buildSoSim(); + Util.buildVfcSim(); + Util.buildGuardSim(); + Util.buildSdncSim(); + } + + /** + * Returns the runtime Control Loop Parameters associated with a Tosca Policy. + */ + protected ControlLoopParams clParameters(ToscaPolicy policy) { + return usecases + .getDrools() + .facts(USECASES, ControlLoopParams.class).stream() + .filter((params) -> params.getControlLoopYaml() == policy.getProperties().get("content")) + .findFirst() + .get(); + } + + + /** + * Installs a given policy. + */ + protected ToscaPolicy setupPolicy(String policyPath) throws IOException, CoderException, InterruptedException { + String rawPolicy = new String(Files.readAllBytes(Paths.get(policyPath))); + ToscaPolicy policy = new StandardCoder().decode(rawPolicy, ToscaPolicy.class); + + final KieObjectExpectedCallback policyTracker = new KieObjectInsertedExpectedCallback<>(policy); + final KieObjectExpectedCallback paramsTracker = new KieClassInsertedExpectedCallback<>(ControlLoopParams.class); + + usecases.getDrools().offer(policy); + + assertTrue(policyTracker.isNotified()); + assertTrue(paramsTracker.isNotified()); + + assertEquals(1, + usecases + .getDrools() + .facts(USECASES, ToscaPolicy.class).stream() + .filter((anotherPolicy) -> anotherPolicy == policy) + .count()); + + assertEquals(1, + usecases + .getDrools() + .facts(USECASES, ControlLoopParams.class).stream() + .filter((params) -> params.getControlLoopYaml() == policy.getProperties().get("content")) + .count()); + + return policy; + } + + /** + * Deletes a policy. + */ + protected void deletePolicy(ToscaPolicy policy) throws InterruptedException { + ControlLoopParams clParams = clParameters(policy); + assertNotNull(clParams); + + final KieObjectExpectedCallback policyTracker = new KieObjectDeletedExpectedCallback<>(policy); + final KieObjectExpectedCallback clParamsTracker = new KieObjectDeletedExpectedCallback<>(clParams); + + usecases.getDrools().delete(USECASES, policy); + assertTrue(policyTracker.isNotified()); + assertTrue(clParamsTracker.isNotified()); + + assertEquals(0, + usecases + .getDrools() + .facts(USECASES, ToscaPolicy.class).stream() + .filter((anotherPolicy) -> anotherPolicy == policy) + .count()); + + assertEquals(0, + usecases + .getDrools() + .facts(USECASES, ControlLoopParams.class).stream() + .filter((params) -> params.getControlLoopYaml() == policy.getProperties().get("content")) + .count()); + } + + /** + * Prepare a PDP-D to test the Use Cases. + */ + protected static void preparePdpD() throws IOException, InterruptedException, CoderException { + KieUtils.installArtifact( + Paths.get("src/main/resources/META-INF/kmodule.xml").toFile(), + Paths.get("src/test/resources/usecases.pom").toFile(), + "src/main/resources/onap.policies.controlloop.Operational/org/onap/policy/controlloop/", + Collections.singletonList(Paths.get("src/main/resources/usecases.drl").toFile())); + + repo.setConfigurationDir("src/test/resources/config"); + PropertyUtil.setSystemProperties(repo.getSystemProperties("controlloop")); + pdpD.setEnvironment(repo.getEnvironmentProperties("controlloop.properties")); + pdpD.configure(new Properties()); + + usecases = pdpD.createPolicyController(USECASES, repo.getControllerProperties(USECASES)); + pdpD.start(); + + setupDroolsLogging(); + } + + /** + * Stop PDP-D. + */ + protected static void stopPdpD() { + PolicyControllerConstants.getFactory().shutdown(USECASES); + pdpD.stop(); + } + + /** + * Stop Simulators. + */ + protected static void stopSimulators() { + HttpServletServerFactoryInstance.getServerFactory().destroy(); + } + + /** + * Creates a Topic Sink Callback tracker. + */ + protected TopicCallback createTopicSinkCallback(String topicName, Class clazz) { + return new TopicCallback(TopicEndpointManager.getManager().getNoopTopicSink(topicName), clazz); + } + + /** + * Creates a Topic Source Callback tracker. + */ + protected TopicCallback createTopicSourceCallback(String topicName, Class clazz) { + return new TopicCallback(TopicEndpointManager.getManager().getNoopTopicSource(topicName), clazz); + } + + /** + * Injects a message on a Topic Source. + */ + protected void injectOnTopic(String topicName, Path onsetPath) throws IOException { + TopicEndpointManager + .getManager() + .getNoopTopicSource(topicName) + .offer(new String(Files.readAllBytes(onsetPath))); + } + + /** + * Waits for LOCK acquisition and getting a Permit from PDP-X to proceed. + */ + protected void waitForLockAndPermit(ToscaPolicy policy, TopicCallback policyClMgt) { + String policyName = policy.getIdentifier().getName(); + + await().until(() -> !policyClMgt.getMessages().isEmpty()); + assertEquals(ControlLoopNotificationType.ACTIVE, policyClMgt.getMessages().peek().getNotification()); + assertEquals(policyName + ".EVENT", policyClMgt.getMessages().remove().getPolicyName()); + + await().until(() -> !policyClMgt.getMessages().isEmpty()); + assertEquals(ControlLoopNotificationType.OPERATION, + policyClMgt.getMessages().peek().getNotification()); + assertEquals(policyName + ".EVENT.MANAGER.OPERATION.LOCKED.GUARD_NOT_YET_QUERIED", + policyClMgt.getMessages().remove().getPolicyName()); + + await().until(() -> !policyClMgt.getMessages().isEmpty()); + assertEquals(ControlLoopNotificationType.OPERATION, + policyClMgt.getMessages().peek().getNotification()); + assertEquals(policyName + ".GUARD.RESPONSE", + policyClMgt.getMessages().remove().getPolicyName()); + + await().until(() -> !policyClMgt.getMessages().isEmpty()); + assertEquals(ControlLoopNotificationType.OPERATION, + policyClMgt.getMessages().peek().getNotification()); + assertEquals(policyName + ".EVENT.MANAGER.OPERATION.LOCKED.GUARD_PERMITTED", + policyClMgt.getMessages().remove().getPolicyName()); + } + + /** + * Waits for a FINAL SUCCESS transaction notification. + */ + protected void waitForFinalSuccess(ToscaPolicy policy, TopicCallback policyClMgt) { + await().until(() -> !policyClMgt.getMessages().isEmpty()); + assertEquals(ControlLoopNotificationType.FINAL_SUCCESS, policyClMgt.getMessages().peek().getNotification()); + assertEquals(policy.getIdentifier().getName() + ".EVENT.MANAGER", + policyClMgt.getMessages().remove().getPolicyName()); + } + + /** + * Logs Modifications to Working Memory. + */ + static class RuleListenerLogger implements RuleRuntimeEventListener { + @Override + public void objectInserted(ObjectInsertedEvent event) { + String ruleName = (event.getRule() != null) ? event.getRule().getName() : "null"; + logger.info("RULE {}: inserted {}", ruleName, event.getObject()); + } + + @Override + public void objectUpdated(ObjectUpdatedEvent event) { + String ruleName = (event.getRule() != null) ? event.getRule().getName() : "null"; + logger.info("RULE {}: updated {}", ruleName, event.getObject()); + + } + + @Override + public void objectDeleted(ObjectDeletedEvent event) { + String ruleName = (event.getRule() != null) ? event.getRule().getName() : "null"; + logger.info("RULE {}: deleted {}", ruleName, event.getOldObject()); + } + } + + /** + * Logs Rule Matches. + */ + static class AgendaListenerLogger extends DefaultAgendaEventListener { + @Override + public void matchCreated(MatchCreatedEvent event) { + logger.info("RULE {}: match created", event.getMatch().getRule().getName()); + } + + @Override + public void matchCancelled(MatchCancelledEvent event) { + logger.info("RULE {}: match cancelled", event.getMatch().getRule().getName()); + } + + @Override + public void beforeMatchFired(BeforeMatchFiredEvent event) { + logger.info("RULE {}: before match fired", event.getMatch().getRule().getName()); + } + + @Override + public void afterMatchFired(AfterMatchFiredEvent event) { + logger.info("RULE {}: after match fired", event.getMatch().getRule().getName()); + } + } + + /** + * Base Class to track Working Memory updates for objects of type T. + */ + abstract class KieObjectExpectedCallback extends DefaultRuleRuntimeEventListener { + protected T subject; + + protected CountDownLatch countDownLatch = new CountDownLatch(1); + + public KieObjectExpectedCallback(T affected) { + subject = affected; + register(); + } + + public boolean isNotified() throws InterruptedException { + return countDownLatch.await(9L, TimeUnit.SECONDS); + } + + protected void callbacked() { + unregister(); + countDownLatch.countDown(); + } + + public KieObjectExpectedCallback register() { + usecases.getDrools() + .getContainer().getPolicySession(USECASES).getKieSession() + .addEventListener(this); + return this; + } + + public KieObjectExpectedCallback unregister() { + usecases.getDrools() + .getContainer().getPolicySession(USECASES).getKieSession() + .removeEventListener(this); + return this; + } + } + + /** + * Tracks inserts in Working Memory for an object of type T. + */ + class KieObjectInsertedExpectedCallback extends KieObjectExpectedCallback { + public KieObjectInsertedExpectedCallback(T affected) { + super(affected); + } + + @Override + public void objectInserted(ObjectInsertedEvent event) { + if (subject == event.getObject()) { + callbacked(); + } + } + } + + /** + * Tracks deletes in Working Memory of an object of type T. + */ + class KieObjectDeletedExpectedCallback extends KieObjectExpectedCallback { + public KieObjectDeletedExpectedCallback(T affected) { + super(affected); + } + + @Override + public void objectDeleted(ObjectDeletedEvent event) { + if (subject == event.getOldObject()) { + callbacked(); + } + } + } + + /** + * Tracks inserts in Working Memory for any object of class T. + */ + class KieClassInsertedExpectedCallback extends KieObjectInsertedExpectedCallback { + public KieClassInsertedExpectedCallback(Class affected) { + super(affected); + } + + public void objectInserted(ObjectInsertedEvent event) { + if (subject == event.getObject().getClass()) { + callbacked(); + } + } + } + + /** + * Tracks callbacks from topics. + */ + class TopicCallback implements TopicListener { + protected final Topic topic; + protected final Class expectedClass; + + @Getter + protected Queue messages = new LinkedList<>(); + + public TopicCallback(Topic topic, Class expectedClass) { + this.topic = topic; + this.expectedClass = expectedClass; + this.topic.register(this); + } + + public TopicCallback register() { + this.topic.register(this); + return this; + } + + public TopicCallback unregister() { + this.topic.unregister(this); + return this; + } + + @Override + public void onTopicEvent(CommInfrastructure comm, String topic, String event) { + try { + messages.add((T) EventProtocolCoderConstants.getManager().decode( + usecases.getDrools().getGroupId(), usecases.getDrools().getArtifactId(), topic, event)); + } catch (Exception e) { + logger.warn("invalid mapping in topic {} for event {}", topic, event, e); + } + } + } +} diff --git a/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VcpeTest.java b/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VcpeTest.java new file mode 100644 index 000000000..b5aae715b --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VcpeTest.java @@ -0,0 +1,172 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 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.controlloop; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.nio.file.Paths; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.policy.appclcm.AppcLcmDmaapWrapper; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; + +/** + * VCPE Use Case Tests. + */ +public class VcpeTest extends UsecasesBase { + + /** + * VCPE Tosca Policy File. + */ + private static final String TOSCA_POLICY_VCPE = "src/test/resources/vcpe/tosca-vcpe.json"; + + /* + * VCPE Use case Messages. + */ + private static final String APPC_SUCCESS = "src/test/resources/vcpe/vcpe.appc.success.json"; + private static final String ONSET = "src/test/resources/vcpe/vcpe.onset.json"; + + /* + * Topic trackers used by the VCPE use case. + */ + private TopicCallback policyClMgt; + private TopicCallback appcLcmRead; + private TopicCallback appcLcmWrite; + + /* + * VCPE Tosca Policy. + */ + private ToscaPolicy policy; + + /** + * Prepare PDP-D Framework for testing. + */ + @BeforeClass + public static void prepareResouces() throws InterruptedException, CoderException, IOException { + setupLogging(); + preparePdpD(); + setupSimulators(); + } + + /** + * Take down the resources used by the test framework. + */ + @AfterClass + public static void takeDownResources() { + stopPdpD(); + stopSimulators(); + } + + /** + * Sunny day scenario for the VCPE use case. + */ + @Test + public void sunnyDay() throws IOException { + + /* Inject an ONSET event over the DCAE topic */ + injectOnTopic(DCAE_TOPIC, Paths.get(ONSET)); + + /* Wait to acquire a LOCK and a PDP-X PERMIT */ + waitForLockAndPermit(policy, policyClMgt); + + /* --- VCPE Operation Execution --- */ + + /* Ensure that an APPC RESTART request was sent in response to the matching ONSET */ + await().until(() -> !appcLcmRead.getMessages().isEmpty()); + assertEquals("restart", appcLcmRead.getMessages().remove().getRpcName()); + + /* Inject a 400 APPC Response Return over the APPC topic */ + injectOnTopic(APPC_LCM_WRITE_TOPIC, Paths.get(APPC_SUCCESS)); + + /* Ensure that RESTART response is received */ + await().until(() -> !appcLcmWrite.getMessages().isEmpty()); + assertEquals("restart", appcLcmWrite.getMessages().peek().getRpcName()); + assertEquals(400, appcLcmWrite.getMessages().remove().getBody().getOutput().getStatus().getCode()); + + /* --- VCPE Operation Completed --- */ + + /* Ensure that the VCPE RESTART Operation is successfully completed */ + await().until(() -> !policyClMgt.getMessages().isEmpty()); + assertEquals(ControlLoopNotificationType.OPERATION_SUCCESS, policyClMgt.getMessages().peek().getNotification()); + assertEquals(policy.getIdentifier().getName() + ".APPC.LCM.RESPONSE", + policyClMgt.getMessages().remove().getPolicyName()); + + /* --- VCPE Transaction Completed --- */ + waitForFinalSuccess(policy, policyClMgt); + } + + /** + * Observe Topics. + */ + @Before + public void topicsRegistration() { + policyClMgt = createTopicSinkCallback(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class); + appcLcmRead = createTopicSinkCallback(APPC_LCM_READ_TOPIC, AppcLcmDmaapWrapper.class); + appcLcmWrite = createTopicSourceCallback(APPC_LCM_WRITE_TOPIC, AppcLcmDmaapWrapper.class); + } + + /** + * Unregister Topic Callbacks. + */ + @After + public void topicsUnregistration() { + if (policyClMgt != null) { + policyClMgt.unregister(); + } + + if (appcLcmRead != null) { + appcLcmRead.unregister(); + } + + if (appcLcmWrite != null) { + appcLcmWrite.unregister(); + } + } + + /** + * Install Policy. + */ + @Before + public void installPolicy() throws IOException, CoderException, InterruptedException { + assertEquals(0, usecases.getDrools().factCount(USECASES)); + policy = setupPolicy(TOSCA_POLICY_VCPE); + assertEquals(2, usecases.getDrools().factCount(USECASES)); + } + + /** + * Uninstall Policy. + */ + @After + public void uninstallPolicy() throws InterruptedException { + assertEquals(2, usecases.getDrools().factCount(USECASES)); + if (policy != null) { + deletePolicy(policy); + } + assertEquals(0, usecases.getDrools().factCount(USECASES)); + } + +} diff --git a/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VfwTest.java b/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VfwTest.java new file mode 100644 index 000000000..202bd3008 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VfwTest.java @@ -0,0 +1,171 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 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.controlloop; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.nio.file.Paths; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.onap.policy.appc.Request; +import org.onap.policy.appc.Response; +import org.onap.policy.common.utils.coder.CoderException; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; + +/** + * VFW Use Case Tests. + */ +public class VfwTest extends UsecasesBase { + + /** + * VFW Tosca Policy File. + */ + private static final String TOSCA_POLICY_VFW = "src/test/resources/vfw/tosca-vfw.json"; + + /* + * VFW Use case Messages. + */ + private static final String APPC_SUCCESS = "src/test/resources/vfw/vfw.appc.success.json"; + private static final String ONSET = "src/test/resources/vfw/vfw.onset.json"; + + /* + * Topic trackers used by the VFW use case. + */ + private TopicCallback policyClMgt; + private TopicCallback appcClSource; + private TopicCallback appcClSink; + + /* + * VFW Tosca Policy. + */ + private ToscaPolicy policy; + + /** + * Prepare PDP-D Framework for testing. + */ + @BeforeClass + public static void prepareResouces() throws InterruptedException, CoderException, IOException { + setupLogging(); + preparePdpD(); + setupSimulators(); + } + + /** + * Take down the resources used by the test framework. + */ + @AfterClass + public static void takeDownResources() { + stopPdpD(); + stopSimulators(); + } + + /** + * Sunny day scenario for the VFW use case. + */ + @Test + public void sunnyDay() throws IOException { + + /* Inject an ONSET event over the DCAE topic */ + injectOnTopic(DCAE_TOPIC, Paths.get(ONSET)); + + /* Wait to acquire a LOCK and a PDP-X PERMIT */ + waitForLockAndPermit(policy, policyClMgt); + + /* --- VFW Operation Execution --- */ + + /* Ensure that an APPC RESTART request was sent in response to the matching ONSET */ + await().until(() -> !appcClSink.getMessages().isEmpty()); + assertEquals("ModifyConfig", appcClSink.getMessages().remove().getAction()); + + /* Inject a 400 APPC Response Return over the APPC topic */ + injectOnTopic(APPC_CL_TOPIC, Paths.get(APPC_SUCCESS)); + + /* Ensure that RESTART response is received */ + await().until(() -> !appcClSource.getMessages().isEmpty()); + assertEquals("SUCCESS", appcClSource.getMessages().remove().getStatus().getValue()); + + /* --- VFW Operation Completed --- */ + + /* Ensure that the VFW RESTART Operation is successfully completed */ + await().until(() -> !policyClMgt.getMessages().isEmpty()); + assertEquals(ControlLoopNotificationType.OPERATION_SUCCESS, + policyClMgt.getMessages().remove().getNotification()); + + /* --- VFW Transaction Completed --- */ + waitForFinalSuccess(policy, policyClMgt); + } + + /** + * Observe Topics. + */ + @Before + public void topicsRegistration() { + policyClMgt = createTopicSinkCallback(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class); + appcClSink = createTopicSinkCallback(APPC_CL_TOPIC, Request.class); + appcClSource = createTopicSourceCallback(APPC_CL_TOPIC, Response.class); + } + + /** + * Unregister Topic Callbacks. + */ + @After + public void topicsUnregistration() { + if (policyClMgt != null) { + policyClMgt.unregister(); + } + + if (appcClSource != null) { + appcClSource.unregister(); + } + + if (appcClSink != null) { + appcClSink.unregister(); + } + } + + /** + * Install Policy. + */ + @Before + public void installPolicy() throws IOException, CoderException, InterruptedException { + assertEquals(0, usecases.getDrools().factCount(USECASES)); + policy = setupPolicy(TOSCA_POLICY_VFW); + assertEquals(2, usecases.getDrools().factCount(USECASES)); + } + + /** + * Uninstall Policy. + */ + @After + public void uninstallPolicy() throws InterruptedException { + assertEquals(2, usecases.getDrools().factCount(USECASES)); + if (policy != null) { + deletePolicy(policy); + } + assertEquals(0, usecases.getDrools().factCount(USECASES)); + } + +} diff --git a/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VlbTest.java b/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VlbTest.java new file mode 100644 index 000000000..e577fab9b --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/java/org/onap/policy/controlloop/VlbTest.java @@ -0,0 +1,143 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2019 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.controlloop; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.nio.file.Paths; +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.utils.coder.CoderException; +import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; + +/** + * VLB Use Case Tests. + */ +public class VlbTest extends UsecasesBase { + + /** + * VLB Tosca Policy File. + */ + private static final String TOSCA_POLICY_VLB = "src/test/resources/vlb/tosca-vlb.json"; + + /* + * VLB Use case Messages. + */ + private static final String ONSET = "src/test/resources/vlb/vlb.onset.json"; + + /* + * Topic trackers used by the VLB use case. + */ + private TopicCallback policyClMgt; + + /* + * VLB Tosca Policy. + */ + private ToscaPolicy policy; + + /** + * Prepare PDP-D Framework for testing. + */ + @BeforeClass + public static void prepareResouces() throws InterruptedException, CoderException, IOException { + setupLogging(); + preparePdpD(); + setupSimulators(); + } + + /** + * Take down the resources used by the test framework. + */ + @AfterClass + public static void takeDownResources() { + stopPdpD(); + stopSimulators(); + } + + /** + * Sunny day scenario for the VCPE use case. + */ + @Test + public void sunnyDay() throws IOException { + + /* Inject an ONSET event over the DCAE topic */ + injectOnTopic(DCAE_TOPIC, Paths.get(ONSET)); + + /* Wait to acquire a LOCK and a PDP-X PERMIT */ + waitForLockAndPermit(policy, policyClMgt); + + /* Ensure that the VLB SO Operation was successfully completed */ + + await().until(() -> !policyClMgt.getMessages().isEmpty()); + assertEquals(ControlLoopNotificationType.OPERATION_SUCCESS, policyClMgt.getMessages().peek().getNotification()); + assertEquals(policy.getIdentifier().getName() + ".SO.RESPONSE", + policyClMgt.getMessages().remove().getPolicyName()); + + /* --- VLB Transaction Completed --- */ + waitForFinalSuccess(policy, policyClMgt); + } + + /** + * Observe Topics. + */ + @Before + public void topicsRegistration() { + policyClMgt = createTopicSinkCallback(POLICY_CL_MGT_TOPIC, VirtualControlLoopNotification.class); + } + + /** + * Unregister Topic Callbacks. + */ + @After + public void topicsUnregistration() { + if (policyClMgt != null) { + policyClMgt.unregister(); + } + } + + /** + * Install Policy. + */ + @Before + public void installPolicy() throws IOException, CoderException, InterruptedException { + assertEquals(0, usecases.getDrools().factCount(USECASES)); + policy = setupPolicy(TOSCA_POLICY_VLB); + assertEquals(2, usecases.getDrools().factCount(USECASES)); + } + + /** + * Uninstall Policy. + */ + @After + public void uninstallPolicy() throws InterruptedException { + assertEquals(2, usecases.getDrools().factCount(USECASES)); + if (policy != null) { + deletePolicy(policy); + } + assertEquals(0, usecases.getDrools().factCount(USECASES)); + } + +} diff --git a/controlloop/common/controller-usecases/src/test/resources/config/controlloop-system.properties b/controlloop/common/controller-usecases/src/test/resources/config/controlloop-system.properties new file mode 100644 index 000000000..ff6658526 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/config/controlloop-system.properties @@ -0,0 +1,21 @@ +# +# ============LICENSE_START======================================================= +# ONAP +# ================================================================================ +# Copyright (C) 2019 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========================================================= +# + +OperationsHistoryPU=OperationsHistoryPUTest \ No newline at end of file diff --git a/controlloop/common/controller-usecases/src/test/resources/config/controlloop.properties.environment b/controlloop/common/controller-usecases/src/test/resources/config/controlloop.properties.environment new file mode 100644 index 000000000..f5d1c5d83 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/config/controlloop.properties.environment @@ -0,0 +1,54 @@ +# +# ============LICENSE_START======================================================= +# ONAP +# ================================================================================ +# Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. +# Modifications Copyright (C) 2019 Bell Canada. +# ================================================================================ +# 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========================================================= +# + +sql.db.host= +sql.db.username= +sql.db.password= + +aai.url=http://localhost:6666 +aai.username=AAI +aai.password=AAI + +so.url=http://localhost:6667 +so.username=SO +so.password=SO + +vfc.url=http://localhost:6668/api/nslcm/v1 +vfc.username=VFC +vfc.password=VFC + +pdpx.host=localhost +pdpx.username=pdpx +pdpx.password=pdpx + +guard.url=http://localhost:6669/policy/pdpx/v1/decision +guard.jdbc.url=jdbc:mariadb://localhost:3306/operationshistory +guard.disabled=true + +sdnc.url=sdnc +sdnc.username=sdnc +sdnc.password=sdnc + +cds.grpcHost=localhost +cds.grpcPort=7878 +cds.grpcUsername=grpc-username +cds.grpcPassword=grpc-password +cds.grpcTimeout=10 \ No newline at end of file diff --git a/controlloop/common/controller-usecases/src/test/resources/config/usecases-controller.properties b/controlloop/common/controller-usecases/src/test/resources/config/usecases-controller.properties new file mode 100644 index 000000000..07a97b9b4 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/config/usecases-controller.properties @@ -0,0 +1,73 @@ +# +# ============LICENSE_START======================================================= +# ONAP +# ================================================================================ +# Copyright (C) 2019 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========================================================= +# + +controller.name=usecases + +rules.groupId=org.onap.policy.controlloop +rules.artifactId=usecases +rules.version=1.0.0 + +noop.source.topics=DCAE_TOPIC,APPC-CL,APPC-LCM-WRITE,SDNR-CL-RSP,POLICY-CL-MGT,APPC-LCM-READ,SDNR-CL,DCAE_CL_RSP + +noop.source.topics.DCAE_TOPIC.events=org.onap.policy.controlloop.VirtualControlLoopEvent +noop.source.topics.DCAE_TOPIC.events.org.onap.policy.controlloop.VirtualControlLoopEvent.filter=[?($.closedLoopEventStatus)] +noop.source.topics.DCAE_TOPIC.events.custom.gson=org.onap.policy.controlloop.util.Serialization,gson + +noop.source.topics.APPC-CL.events=org.onap.policy.appc.Response,org.onap.policy.appc.Request +noop.source.topics.APPC-CL.events.org.onap.policy.appc.Response.filter=[?($.CommonHeader && $.Status)] +noop.source.topics.APPC-CL.events.org.onap.policy.appc.Request.filter=[?($.CommonHeader && $.Action)] +noop.source.topics.APPC-CL.events.custom.gson=org.onap.policy.appc.util.Serialization,gsonPretty + +noop.source.topics.APPC-LCM-WRITE.events=org.onap.policy.appclcm.AppcLcmDmaapWrapper +noop.source.topics.APPC-LCM-WRITE.events.org.onap.policy.appclcm.AppcLcmDmaapWrapper.filter=[?($.type == 'response')] +noop.source.topics.APPC-LCM-WRITE.events.custom.gson=org.onap.policy.appclcm.util.Serialization,gson + +noop.source.topics.SDNR-CL-RSP.events=org.onap.policy.sdnr.PciResponseWrapper +noop.source.topics.SDNR-CL-RSP.events.org.onap.policy.sdnr.PciResponseWrapper.filter=[?($.type == 'response')] +noop.source.topics.SDNR-CL-RSP.events.custom.gson=org.onap.policy.sdnr.util.Serialization,gson + +noop.source.topics.POLICY-CL-MGT.events=org.onap.policy.controlloop.VirtualControlLoopNotification +noop.source.topics.POLICY-CL-MGT.events.custom.gson=org.onap.policy.controlloop.util.Serialization,gsonPretty + +noop.source.topics.APPC-LCM-READ.events=org.onap.policy.appclcm.AppcLcmDmaapWrapper +noop.source.topics.APPC-LCM-READ.events.custom.gson=org.onap.policy.appclcm.util.Serialization,gson + +noop.source.topics.SDNR-CL.events=org.onap.policy.sdnr.PciRequestWrapper +noop.source.topics.SDNR-CL.events.custom.gson=org.onap.policy.sdnr.util.Serialization,gson + +noop.source.topics.DCAE_CL_RSP.events=org.onap.policy.controlloop.ControlLoopResponse +noop.source.topics.DCAE_CL_RSP.events.custom.gson=org.onap.policy.controlloop.util.Serialization,gsonPretty + +noop.sink.topics=APPC-CL,APPC-LCM-READ,POLICY-CL-MGT,SDNR-CL,DCAE_CL_RSP + +noop.sink.topics.APPC-CL.events=org.onap.policy.appc.Request +noop.sink.topics.APPC-CL.events.custom.gson=org.onap.policy.appc.util.Serialization,gsonPretty + +noop.sink.topics.APPC-LCM-READ.events=org.onap.policy.appclcm.AppcLcmDmaapWrapper +noop.sink.topics.APPC-LCM-READ.events.custom.gson=org.onap.policy.appclcm.util.Serialization,gson + +noop.sink.topics.POLICY-CL-MGT.events=org.onap.policy.controlloop.VirtualControlLoopNotification +noop.sink.topics.POLICY-CL-MGT.events.custom.gson=org.onap.policy.controlloop.util.Serialization,gsonPretty + +noop.sink.topics.SDNR-CL.events=org.onap.policy.sdnr.PciRequestWrapper +noop.sink.topics.SDNR-CL.events.custom.gson=org.onap.policy.sdnr.util.Serialization,gson + +noop.sink.topics.DCAE_CL_RSP.events=org.onap.policy.controlloop.ControlLoopResponse +noop.sink.topics.DCAE_CL_RSP.events.custom.gson=org.onap.policy.controlloop.util.Serialization,gsonPretty diff --git a/controlloop/common/controller-usecases/src/test/resources/usecases.pom b/controlloop/common/controller-usecases/src/test/resources/usecases.pom new file mode 100644 index 000000000..aebbf3e68 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/usecases.pom @@ -0,0 +1,30 @@ + + + + + + 4.0.0 + + org.onap.policy.controlloop + usecases + 1.0.0 + \ No newline at end of file diff --git a/controlloop/common/controller-usecases/src/test/resources/vcpe/tosca-vcpe.json b/controlloop/common/controller-usecases/src/test/resources/vcpe/tosca-vcpe.json new file mode 100644 index 000000000..f42c07da9 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/vcpe/tosca-vcpe.json @@ -0,0 +1,9 @@ +{ + "type": "onap.policies.controlloop.Operational", + "type_version": "1.0.0", + "properties": { + "content": "controlLoop%3A%0A%20%20version%3A%202.0.0%0A%20%20controlLoopName%3A%20ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e%0A%20%20trigger_policy%3A%20unique-policy-id-1-restart%0A%20%20timeout%3A%203600%0A%20%20abatement%3A%20false%0A%20%0Apolicies%3A%0A%20%20-%20id%3A%20unique-policy-id-1-restart%0A%20%20%20%20name%3A%20Restart%20the%20VM%0A%20%20%20%20description%3A%0A%20%20%20%20actor%3A%20APPC%0A%20%20%20%20recipe%3A%20Restart%0A%20%20%20%20target%3A%0A%20%20%20%20%20%20type%3A%20VM%0A%20%20%20%20retry%3A%203%0A%20%20%20%20timeout%3A%201200%0A%20%20%20%20success%3A%20final_success%0A%20%20%20%20failure%3A%20final_failure%0A%20%20%20%20failure_timeout%3A%20final_failure_timeout%0A%20%20%20%20failure_retries%3A%20final_failure_retries%0A%20%20%20%20failure_exception%3A%20final_failure_exception%0A%20%20%20%20failure_guard%3A%20final_failure_guard" + }, + "name": "vcpe", + "version": "1.0.0" +} \ No newline at end of file diff --git a/controlloop/common/controller-usecases/src/test/resources/vcpe/vcpe.appc.success.json b/controlloop/common/controller-usecases/src/test/resources/vcpe/vcpe.appc.success.json new file mode 100644 index 000000000..b221b6b24 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/vcpe/vcpe.appc.success.json @@ -0,0 +1,22 @@ +{ + "body": { + "output": { + "common-header": { + "timestamp": "2017-08-25T21:06:23.037Z", + "api-ver": "5.00", + "originator-id": "664be3d2-6c12-4f4b-a3e7-c349acced200", + "request-id": "664be3d2-6c12-4f4b-a3e7-c349acced200", + "sub-request-id": "1", + "flags": {} + }, + "status": { + "code": 400, + "message": "Restart Successful" + } + } + }, + "version": "2.0", + "rpc-name": "restart", + "correlation-id": "664be3d2-6c12-4f4b-a3e7-c349acced200-1", + "type": "response" +} diff --git a/controlloop/common/controller-usecases/src/test/resources/vcpe/vcpe.onset.json b/controlloop/common/controller-usecases/src/test/resources/vcpe/vcpe.onset.json new file mode 100644 index 000000000..d08ee47cd --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/vcpe/vcpe.onset.json @@ -0,0 +1,16 @@ +{ + "closedLoopControlName": "ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e", + "closedLoopAlarmStart": 1463679805324, + "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca", + "closedLoopEventStatus": "ONSET", + "requestID": "664be3d2-6c12-4f4b-a3e7-c349acced200", + "target_type": "VNF", + "target": "generic-vnf.vnf-id", + "AAI": { + "vserver.is-closed-loop-disabled": "false", + "vserver.prov-status": "ACTIVE", + "generic-vnf.vnf-id": "vCPE_Infrastructure_vGMUX_demo_app" + }, + "from": "DCAE", + "version": "1.0.2" +} \ No newline at end of file diff --git a/controlloop/common/controller-usecases/src/test/resources/vfw/tosca-vfw.json b/controlloop/common/controller-usecases/src/test/resources/vfw/tosca-vfw.json new file mode 100644 index 000000000..5d1e35277 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/vfw/tosca-vfw.json @@ -0,0 +1,9 @@ +{ + "type": "onap.policies.controlloop.Operational", + "type_version": "1.0.0", + "properties": { + "content": "controlLoop%3A%0A%20%20version%3A%202.0.0%0A%20%20controlLoopName%3A%20ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a%0A%20%20services%3A%0A%20%20%20%20-%20serviceInvariantUUID%3A%20f6937c86-584c-47ae-ad29-8d41d6f0cc7c%0A%20%20%20%20%20%20serviceUUID%3A%207be584e2-0bb2-4126-adaf-ced2c77ca0b3%0A%20%20%20%20%20%20serviceName%3A%20Service_Ete_Name7ba1fbde-6187-464a-a62d-d9dd25bdf4e8%0A%20%20trigger_policy%3A%20unique-policy-id-1-modifyConfig%0A%20%20timeout%3A%2060%0A%20%20abatement%3A%20false%0A%20%0Apolicies%3A%0A%20%20-%20id%3A%20unique-policy-id-1-modifyConfig%0A%20%20%20%20name%3A%20modify%20packet%20gen%20config%0A%20%20%20%20description%3A%0A%20%20%20%20actor%3A%20APPC%0A%20%20%20%20recipe%3A%20ModifyConfig%0A%20%20%20%20target%3A%0A%20%20%20%20%20%20resourceID%3A%20bbb3cefd-01c8-413c-9bdd-2b92f9ca3d38%0A%20%20%20%20%20%20type%3A%20VNF%0A%20%20%20%20retry%3A%200%0A%20%20%20%20timeout%3A%2030%0A%20%20%20%20success%3A%20final_success%0A%20%20%20%20failure%3A%20final_failure%0A%20%20%20%20failure_timeout%3A%20final_failure_timeout%0A%20%20%20%20failure_retries%3A%20final_failure_retries%0A%20%20%20%20failure_exception%3A%20final_failure_exception%0A%20%20%20%20failure_guard%3A%20final_failure_guard" + }, + "name": "vfw", + "version": "1.0.0" +} \ No newline at end of file diff --git a/controlloop/common/controller-usecases/src/test/resources/vfw/vfw.appc.success.json b/controlloop/common/controller-usecases/src/test/resources/vfw/vfw.appc.success.json new file mode 100644 index 000000000..618b70537 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/vfw/vfw.appc.success.json @@ -0,0 +1,17 @@ +{ + "CommonHeader": { + "TimeStamp": 1506051879001, + "APIver": "1.01", + "RequestID": "c7c6a4aa-bb61-4a15-b831-ba1472dd4a65", + "SubRequestID": "1", + "RequestTrack": [], + "Flags": [] + }, + "Status": { + "Code": 400, + "Value": "SUCCESS" + }, + "Payload": { + "generic-vnf.vnf-id": "jimmy-test-vnf2" + } +} \ No newline at end of file diff --git a/controlloop/common/controller-usecases/src/test/resources/vfw/vfw.onset.json b/controlloop/common/controller-usecases/src/test/resources/vfw/vfw.onset.json new file mode 100644 index 000000000..7782867a1 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/vfw/vfw.onset.json @@ -0,0 +1,17 @@ +{ + "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a", + "closedLoopAlarmStart": 1463679805324, + "closedLoopEventClient": "microservice.stringmatcher", + "closedLoopEventStatus": "ONSET", + "requestID": "c7c6a4aa-bb61-4a15-b831-ba1472dd4a65", + "target_type": "VNF", + "target": "generic-vnf.vnf-name", + "AAI": { + "vserver.is-closed-loop-disabled": "false", + "vserver.prov-status": "ACTIVE", + "generic-vnf.vnf-name": "fw0002vm002fw002", + "vserver.vserver-name": "OzVServer" + }, + "from": "DCAE", + "version": "1.0.2" +} diff --git a/controlloop/common/controller-usecases/src/test/resources/vlb/tosca-vlb.json b/controlloop/common/controller-usecases/src/test/resources/vlb/tosca-vlb.json new file mode 100644 index 000000000..5147d9922 --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/vlb/tosca-vlb.json @@ -0,0 +1,9 @@ +{ + "type": "onap.policies.controlloop.Operational", + "type_version": "1.0.0", + "properties": { + "content": "controlLoop%3A%0A%20%20version%3A%202.0.0%0A%20%20controlLoopName%3A%20ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3%0A%20%20services%3A%0A%20%20%20%20-%20serviceName%3A%20d4738992-6497-4dca-9db9%0A%20%20%20%20%20%20serviceInvariantUUID%3A%20dc112d6e-7e73-4777-9c6f-1a7fb5fd1b6f%0A%20%20%20%20%20%20serviceUUID%3A%202eea06c6-e1d3-4c3a-b9c4-478c506eeedf%0A%20%20trigger_policy%3A%20unique-policy-id-1-scale-up%0A%20%20timeout%3A%2060%0A%0Apolicies%3A%0A%20%20-%20id%3A%20unique-policy-id-1-scale-up%0A%20%20%20%20name%3A%20Create%20a%20new%20VF%20Module%0A%20%20%20%20description%3A%0A%20%20%20%20actor%3A%20SO%0A%20%20%20%20recipe%3A%20VF%20Module%20Create%0A%20%20%20%20target%3A%0A%20%20%20%20%20%20type%3A%20VFMODULE%0A%20%20%20%20%20%20modelInvariantId%3A%20e6130d03-56f1-4b0a-9a1d-e1b2ebc30e0e%0A%20%20%20%20%20%20modelVersionId%3A%2094b18b1d-cc91-4f43-911a-e6348665f292%0A%20%20%20%20%20%20modelName%3A%20VfwclVfwsnkBbefb8ce2bde..base_vfw..module-0%0A%20%20%20%20%20%20modelVersion%3A%201%0A%20%20%20%20%20%20modelCustomizationId%3A%2047958575-138f-452a-8c8d-d89b595f8164%0A%20%20%20%20payload%3A%0A%20%20%20%20%20%20requestParameters%3A%20%27%7B%22usePreload%22%3Atrue%2C%22userParams%22%3A%5B%5D%7D%27%0A%20%20%20%20%20%20configurationParameters%3A%20%27%5B%7B%22ip-addr%22%3A%22%24.vf-module-topology.vf-module-parameters.param%5B9%5D%22%2C%22oam-ip-addr%22%3A%22%24.vf-module-topology.vf-module-parameters.param%5B16%5D%22%2C%22enabled%22%3A%22%24.vf-module-topology.vf-module-parameters.param%5B23%5D%22%7D%5D%27%0A%20%20%20%20retry%3A%200%0A%20%20%20%20timeout%3A%2030%0A%20%20%20%20success%3A%20final_success%0A%20%20%20%20failure%3A%20final_failure%0A%20%20%20%20failure_timeout%3A%20final_failure_timeout%0A%20%20%20%20failure_retries%3A%20final_failure_retries%0A%20%20%20%20failure_exception%3A%20final_failure_exception%0A%20%20%20%20failure_guard%3A%20final_failure_guard%0A" + }, + "name": "vlb", + "version": "1.0.0" +} \ No newline at end of file diff --git a/controlloop/common/controller-usecases/src/test/resources/vlb/vlb.onset.json b/controlloop/common/controller-usecases/src/test/resources/vlb/vlb.onset.json new file mode 100644 index 000000000..3360c0abb --- /dev/null +++ b/controlloop/common/controller-usecases/src/test/resources/vlb/vlb.onset.json @@ -0,0 +1,16 @@ +{ + "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3", + "closedLoopAlarmStart": 1484677482204798, + "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca", + "closedLoopEventStatus": "ONSET", + "requestID": "e4f95e0c-a013-4530-8e59-c5c5f9e539b6", + "target_type": "VNF", + "target": "vserver.vserver-name", + "AAI": { + "vserver.is-closed-loop-disabled": "false", + "vserver.prov-status": "ACTIVE", + "vserver.vserver-name": "OzVServer" + }, + "from": "DCAE", + "version": "1.0.2" +} \ No newline at end of file -- cgit 1.2.3-korg