Add participant for policy-framework 55/120155/3
authorSirisha_Manchikanti <sirisha.manchikanti@est.tech>
Thu, 1 Apr 2021 07:59:30 +0000 (08:59 +0100)
committerSirisha_Manchikanti <sirisha.manchikanti@est.tech>
Wed, 7 Apr 2021 20:18:35 +0000 (21:18 +0100)
This commit adds a Participant for policy-framework, calls APIs
createPolicies and createPolicyTypes for creating policies and
policy-types in policy-framework when a controlLoopUpdate message is
recieved.

Issue-ID: POLICY-3038
Signed-off-by: Sirisha_Manchikanti <sirisha.manchikanti@est.tech>
Change-Id: I5ec795bbdd8684e4f6e8c65da1c340b35e7edf68

66 files changed:
tosca-controlloop/common/src/main/java/org/onap/policy/clamp/controlloop/common/startstop/CommonCommandLineArguments.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/pom.xml
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/ControlLoopElementHandler.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyHandler.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyProvider.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameterHandler.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameters.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/Main.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyActivator.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyCommandLineArguments.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/resources/META-INF/persistence.xml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/resources/config/PolicyParticipantConfig.json [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/resources/version.txt [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/TestPolicyHandler.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/CommonTestData.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameterHandler.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameters.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestMain.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestParticipantPolicyActivator.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/utils/TestListenerUtils.java [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/InvalidParameters.json [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/MinimumParametersH2.json [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/NoParameters.json [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestCLParams.json [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParameters.json [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParametersStd.json [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/Unreadable.json [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/logback-test.xml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/pmsh/PMSubscriptionHandling.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policies/vCPE.policies.optimization.input.tosca.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Match.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Naming.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Optimization.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.Common.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Filter.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.MinMax.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.Common.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Apex.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Drools.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-mapper.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-subscription-handler.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.tcagen2.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Apex.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Drools.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Xacml.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Resource.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Service.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.DistancePolicy.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.HpaPolicy.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.PciPolicy.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.Vim_fit.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.VnfPolicy.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.QueryPolicy.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/utils/servicetemplates/pm_control_loop_tosca.yaml [new file with mode: 0644]
tosca-controlloop/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ControlLoopElementListener.java [new file with mode: 0644]
tosca-controlloop/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ParticipantIntermediaryApi.java
tosca-controlloop/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/impl/ParticipantIntermediaryApiImpl.java
tosca-controlloop/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/handler/ControlLoopHandler.java

diff --git a/tosca-controlloop/common/src/main/java/org/onap/policy/clamp/controlloop/common/startstop/CommonCommandLineArguments.java b/tosca-controlloop/common/src/main/java/org/onap/policy/clamp/controlloop/common/startstop/CommonCommandLineArguments.java
new file mode 100644 (file)
index 0000000..3ef3d4c
--- /dev/null
@@ -0,0 +1,142 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.common.startstop;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URL;
+import javax.ws.rs.core.Response;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+
+/**
+ * This class reads and handles command line parameters.
+ *
+ */
+public class CommonCommandLineArguments {
+    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
+    private static final int HELP_LINE_LENGTH = 120;
+
+    /**
+     * Construct the options for the policy participant.
+     */
+    public CommonCommandLineArguments(final Options options) {
+        //@formatter:off
+        options.addOption(Option.builder("h")
+                .longOpt("help")
+                .desc("outputs the usage of this command")
+                .required(false)
+                .type(Boolean.class)
+                .build());
+        options.addOption(Option.builder("v")
+                .longOpt("version")
+                .desc("outputs the version of policy participant")
+                .required(false)
+                .type(Boolean.class)
+                .build());
+        options.addOption(Option.builder("c")
+                .longOpt("config-file")
+                .desc("the full path to the configuration file to use, "
+                        + "the configuration file must be a Json file containing the "
+                        + "policy participant parameters")
+                .hasArg()
+                .argName("CONFIG_FILE")
+                .required(false)
+                .type(String.class)
+                .build());
+        //@formatter:on
+    }
+
+    /**
+     * Validate the command line options.
+     *
+     * @throws ControlLoopException on command argument validation errors
+     */
+    public void validate(final String configurationFilePath) throws ControlLoopException {
+        validateReadableFile("policy participant configuration", configurationFilePath);
+    }
+
+    /**
+     * Print version information for policy participant.
+     *
+     * @return the version string
+     */
+    public String version() {
+        return ResourceUtils.getResourceAsString("version.txt");
+    }
+
+    /**
+     * Print help information for policy participant.
+     *
+     * @param mainClassName the main class name
+     * @return the help string
+     */
+    public String help(final String mainClassName, final Options options) {
+        final HelpFormatter helpFormatter = new HelpFormatter();
+        final StringWriter stringWriter = new StringWriter();
+        final PrintWriter printWriter = new PrintWriter(stringWriter);
+
+        helpFormatter.printHelp(printWriter, HELP_LINE_LENGTH, mainClassName + " [options...]", "options", options, 0,
+                0, "");
+
+        return stringWriter.toString();
+    }
+
+    /**
+     * Validate readable file.
+     *
+     * @param fileTag the file tag
+     * @param fileName the file name
+     * @throws ControlLoopException on the file name passed as a parameter
+     */
+    private void validateReadableFile(final String fileTag, final String fileName) throws ControlLoopException {
+        if (StringUtils.isEmpty(fileName)) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + " file was not specified as an argument");
+        }
+
+        // The file name refers to a resource on the local file system
+        final URL fileUrl = ResourceUtils.getUrl4Resource(fileName);
+        if (fileUrl == null) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
+        }
+
+        final File theFile = new File(fileUrl.getPath());
+        if (!theFile.exists()) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" does not exist");
+        }
+        if (!theFile.isFile()) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is not a normal file");
+        }
+        if (!theFile.canRead()) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    fileTag + FILE_MESSAGE_PREAMBLE + fileName + "\" is ureadable");
+        }
+    }
+}
index a86bcc3..27bb6cf 100644 (file)
     <artifactId>participant-impl-policy</artifactId>
     <name>${project.artifactId}</name>
     <description>Policy participant, that allows Policy to partake in control loops</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.policy.clamp.controlloop</groupId>
+            <artifactId>participant-intermediary</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
 </project>
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/ControlLoopElementHandler.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/ControlLoopElementHandler.java
new file mode 100644 (file)
index 0000000..86f2817
--- /dev/null
@@ -0,0 +1,70 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.handler;
+
+import java.util.List;
+import java.util.UUID;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.pdp.concepts.PdpStatistics;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * This class handles implementation of controlLoopElement updates.
+ */
+public class ControlLoopElementHandler implements ControlLoopElementListener {
+
+    /**
+     * Callback method to handle a control loop element state change.
+     *
+     * @param controlLoopElementId the ID of the control loop element
+     * @param currentState the current state of the control loop element
+     * @param newState the state to which the control loop element is changing to
+    */
+    @Override
+    public void controlLoopElementStateChange(UUID controlLoopElementId, ControlLoopState currentState,
+            ControlLoopOrderedState newState) {
+    }
+
+    /**
+     * Callback method to handle an update on a control loop element.
+     *
+     * @param element the information on the control loop element
+     * @param controlLoopDefinition toscaServiceTemplate
+     * @throws PfModelException in case of an exception
+     */
+    @Override
+    public void controlLoopElementUpdate(ControlLoopElement element,
+            ToscaServiceTemplate controlLoopDefinition) throws PfModelException {
+        if (controlLoopDefinition.getPolicyTypes() != null) {
+            PolicyHandler.getInstance().getDatabaseProvider().createPolicyTypes(controlLoopDefinition);
+        }
+        if (controlLoopDefinition.getToscaTopologyTemplate().getPolicies() != null) {
+            PolicyHandler.getInstance().getDatabaseProvider().createPolicies(controlLoopDefinition);
+        }
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyHandler.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyHandler.java
new file mode 100644 (file)
index 0000000..20f392f
--- /dev/null
@@ -0,0 +1,120 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.handler;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.handler.ControlLoopHandler;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.endpoints.event.comm.TopicSink;
+import org.onap.policy.common.endpoints.listeners.MessageTypeDispatcher;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.provider.PolicyModelsProvider;
+import org.onap.policy.models.provider.PolicyModelsProviderFactory;
+
+/**
+ * This class handles policy of participants and control loop elements.
+ *
+ * <p/>It is effectively a singleton that is started at system start.
+ */
+public class PolicyHandler extends ControlLoopHandler {
+
+    private final ParticipantIntermediaryParameters participantParameters;
+    private final ParticipantPolicyParameters policyParameters;
+
+    @Getter
+    private PolicyProvider policyProvider;
+    @Getter
+    private PolicyModelsProvider databaseProvider;
+
+    /**
+     * Create a handler.
+     *
+     * @param parameters the parameters for access to the database
+     * @throws PfModelException in case of an exception
+     */
+    public PolicyHandler(ParticipantPolicyParameters parameters) throws PfModelException {
+        super(parameters.getDatabaseProviderParameters());
+        participantParameters = parameters.getIntermediaryParameters();
+        policyParameters = parameters;
+    }
+
+    public static PolicyHandler getInstance() {
+        return Registry.get(PolicyHandler.class.getName());
+    }
+
+    @Override
+    public Set<Class<?>> getProviderClasses() {
+        return null;
+    }
+
+    @Override
+    public void startAndRegisterListeners(MessageTypeDispatcher msgDispatcher) {
+        // No topic communication on this handler
+    }
+
+    @Override
+    public void startAndRegisterPublishers(List<TopicSink> topicSinks) {
+        // No topic communication on this handler
+    }
+
+    @Override
+    public void stopAndUnregisterPublishers() {
+        // No topic communication on this handler
+    }
+
+    @Override
+    public void stopAndUnregisterListeners(MessageTypeDispatcher msgDispatcher) {
+        // No topic communication on this handler
+    }
+
+    @Override
+    public void startProviders() {
+        try {
+            policyProvider = new PolicyProvider(participantParameters);
+            databaseProvider = new PolicyModelsProviderFactory().createPolicyModelsProvider(
+                                         policyParameters.getDatabaseProviderParameters());
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "Start providers failed ", e);
+        }
+    }
+
+    @Override
+    public void stopProviders() {
+        try {
+            policyProvider.close();
+        } catch (IOException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "Stop providers failed ", e);
+        }
+
+        try {
+            databaseProvider.close();
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "Stop providers failed ", e);
+        }
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyProvider.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/PolicyProvider.java
new file mode 100644 (file)
index 0000000..92cf79e
--- /dev/null
@@ -0,0 +1,62 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.handler;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.List;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryFactory;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+
+/**
+ * Provider class for policy participant.
+ */
+public class PolicyProvider implements Closeable {
+    @Getter
+    private final ParticipantIntermediaryApi intermediaryApi;
+
+    private final ControlLoopElementHandler controlLoopElementHandler;
+
+    /**
+     * Create a policy participant provider.
+     *
+     * @throws ControlLoopRuntimeException on errors creating the provider
+     */
+    public PolicyProvider(ParticipantIntermediaryParameters participantParameters)
+                     throws ControlLoopRuntimeException {
+        intermediaryApi = new ParticipantIntermediaryFactory().createApiImplementation();
+        intermediaryApi.init(participantParameters);
+        controlLoopElementHandler = new ControlLoopElementHandler();
+        intermediaryApi.registerControlLoopElementListener(controlLoopElementHandler);
+    }
+
+    @Override
+    public void close() throws IOException {
+        intermediaryApi.close();
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameterHandler.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameterHandler.java
new file mode 100644 (file)
index 0000000..8de3a5b
--- /dev/null
@@ -0,0 +1,79 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.parameters;
+
+import java.io.File;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.participant.policy.main.startstop.ParticipantPolicyCommandLineArguments;
+import org.onap.policy.common.parameters.GroupValidationResult;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+
+/**
+ * This class handles reading, parsing and validating of policy participant parameters from JSON files.
+ */
+public class ParticipantPolicyParameterHandler {
+
+    private static final Coder CODER = new StandardCoder();
+
+    /**
+     * Read the parameters from the parameter file.
+     *
+     * @param arguments the arguments passed to policy
+     * @return the parameters read from the configuration file
+     * @throws ControlLoopException on parameter exceptions
+     */
+    public ParticipantPolicyParameters getParameters(final ParticipantPolicyCommandLineArguments arguments)
+            throws ControlLoopException {
+        ParticipantPolicyParameters parameters = null;
+
+        // Read the parameters
+        try {
+            // Read the parameters from JSON
+            File file = new File(arguments.getFullConfigurationFilePath());
+            parameters = CODER.decode(file, ParticipantPolicyParameters.class);
+        } catch (final CoderException e) {
+            final String errorMessage = "error reading parameters from \"" + arguments.getConfigurationFilePath()
+                    + "\"\n" + "(" + e.getClass().getSimpleName() + ")";
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, errorMessage, e);
+        }
+
+        // The JSON processing returns null if there is an empty file
+        if (parameters == null) {
+            final String errorMessage = "no parameters found in \"" + arguments.getConfigurationFilePath() + "\"";
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, errorMessage);
+        }
+
+        // validate the parameters
+        final GroupValidationResult validationResult = parameters.validate();
+        if (!validationResult.isValid()) {
+            String returnMessage =
+                    "validation error(s) on parameters from \"" + arguments.getConfigurationFilePath() + "\"\n";
+            returnMessage += validationResult.getResult();
+
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE, returnMessage);
+        }
+
+        return parameters;
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameters.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/ParticipantPolicyParameters.java
new file mode 100644 (file)
index 0000000..13d89fa
--- /dev/null
@@ -0,0 +1,49 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.parameters;
+
+import javax.validation.constraints.NotBlank;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.common.parameters.ParameterGroupImpl;
+import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.models.provider.PolicyModelsProviderParameters;
+
+/**
+ * Class to hold all parameters needed for the policy participant.
+ *
+ */
+@NotNull
+@NotBlank
+@Getter
+public class ParticipantPolicyParameters extends ParameterGroupImpl {
+    private ParticipantIntermediaryParameters intermediaryParameters;
+    private PolicyModelsProviderParameters databaseProviderParameters;
+
+    /**
+     * Create the policy participant parameter group.
+     *
+     * @param name the parameter group name
+     */
+    public ParticipantPolicyParameters(final String name) {
+        super(name);
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/Main.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/Main.java
new file mode 100644 (file)
index 0000000..9a6bfdf
--- /dev/null
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.startstop;
+
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameterHandler;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.utils.resources.MessageConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class initiates Policy Participant.
+ */
+public class Main {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
+
+    private ParticipantPolicyActivator activator;
+
+    @Getter
+    private ParticipantPolicyParameters parameterGroup;
+
+    /**
+     * Instantiates policy participant.
+     *
+     * @param args the command line arguments
+     */
+    public Main(final String[] args) {
+        final String argumentString = Arrays.toString(args);
+        LOGGER.info("Starting the control loop participant service with arguments - {}", argumentString);
+
+        // Check the arguments
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        try {
+            // The arguments return a string if there is a message to print and we should exit
+            final String argumentMessage = arguments.parse(args);
+            if (argumentMessage != null) {
+                LOGGER.info(argumentMessage);
+                return;
+            }
+            // Validate that the arguments are sane
+            arguments.validate();
+
+            // Read the parameters
+            parameterGroup = new ParticipantPolicyParameterHandler().getParameters(arguments);
+
+            // Now, create the activator for the service
+            activator = new ParticipantPolicyActivator(parameterGroup);
+
+            // Start the activator
+            activator.start();
+        } catch (Exception exp) {
+            throw new ControlLoopRuntimeException(Response.Status.BAD_REQUEST,
+                String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP), exp);
+        }
+
+        // Add a shutdown hook to shut everything down in an orderly manner
+        Runtime.getRuntime().addShutdownHook(new ClRuntimeShutdownHookClass());
+        String successMsg = String.format(MessageConstants.START_SUCCESS_MSG, MessageConstants.POLICY_CLAMP);
+        LOGGER.info(successMsg);
+    }
+
+    /**
+     * Check if main is running.
+     */
+    public boolean isRunning() {
+        return activator != null && activator.isAlive();
+    }
+
+    /**
+     * Shut down Execution.
+     *
+     * @throws ControlLoopException on shutdown errors
+     */
+    public void shutdown() throws ControlLoopException {
+        // clear the parameterGroup variable
+        parameterGroup = null;
+
+        // clear the cl participant activator
+        if (activator != null) {
+            activator.stop();
+        }
+    }
+
+    /**
+     * The Class ClRuntimeShutdownHookClass terminates the policy participant
+     * when its run method is called.
+     */
+    private class ClRuntimeShutdownHookClass extends Thread {
+        /*
+         * (non-Javadoc)
+         *
+         * @see java.lang.Runnable#run()
+         */
+        @Override
+        public void run() {
+            try {
+                // Shutdown the control loop participant service and wait for everything to stop
+                shutdown();
+            } catch (final RuntimeException | ControlLoopException e) {
+                LOGGER.warn("error occured during shut down of the policy participant", e);
+            }
+        }
+    }
+
+    /**
+     * The main method.
+     *
+     * @param args the arguments
+     */
+    public static void main(final String[] args) {      // NOSONAR
+        /*
+         * NOTE: arguments are validated by the constructor, thus sonar is disabled.
+         */
+
+        new Main(args);
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyActivator.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyActivator.java
new file mode 100644 (file)
index 0000000..760f826
--- /dev/null
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.startstop;
+
+import java.util.concurrent.atomic.AtomicReference;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.participant.policy.main.handler.PolicyHandler;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.utils.services.ServiceManagerContainer;
+
+/**
+ * This class activates the policy participant.
+ *
+ */
+public class ParticipantPolicyActivator extends ServiceManagerContainer {
+    @Getter
+    private final ParticipantPolicyParameters parameters;
+
+    /**
+     * Instantiate the activator for the policy participant.
+     *
+     * @param parameters the parameters for the policy participant
+     */
+    public ParticipantPolicyActivator(final ParticipantPolicyParameters parameters) {
+        this.parameters = parameters;
+
+        final AtomicReference<PolicyHandler> policyHandler = new AtomicReference<>();
+
+        // @formatter:off
+        addAction("Policy Handler",
+            () -> policyHandler.set(new PolicyHandler(parameters)),
+            () -> policyHandler.get().close());
+
+        addAction("Policy Providers",
+            () -> policyHandler.get().startProviders(),
+            () -> policyHandler.get().stopProviders());
+        // @formatter:on
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyCommandLineArguments.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/ParticipantPolicyCommandLineArguments.java
new file mode 100644 (file)
index 0000000..af7a189
--- /dev/null
@@ -0,0 +1,145 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.startstop;
+
+import java.util.Arrays;
+import javax.ws.rs.core.Response;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.clamp.controlloop.common.startstop.CommonCommandLineArguments;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+
+/**
+ * This class reads and handles command line parameters for the policy participant.
+ *
+ */
+public class ParticipantPolicyCommandLineArguments {
+    private static final String FILE_MESSAGE_PREAMBLE = " file \"";
+    private static final int HELP_LINE_LENGTH = 120;
+
+    private final Options options;
+    private final CommonCommandLineArguments commonCommandLineArguments;
+
+    @Getter()
+    @Setter()
+    private String configurationFilePath = null;
+
+    /**
+     * Construct the options for the policy participant.
+     */
+    public ParticipantPolicyCommandLineArguments() {
+        options = new Options();
+        commonCommandLineArguments = new CommonCommandLineArguments(options);
+    }
+
+    /**
+     * Construct the options for the CLI editor and parse in the given arguments.
+     *
+     * @param args The command line arguments
+     */
+    public ParticipantPolicyCommandLineArguments(final String[] args) {
+        // Set up the options with the default constructor
+        this();
+
+        // Parse the arguments
+        try {
+            parse(args);
+        } catch (final ControlLoopException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "parse error on policy participant parameters", e);
+        }
+    }
+
+    /**
+     * Parse the command line options.
+     *
+     * @param args The command line arguments
+     * @return a string with a message for help and version, or null if there is no message
+     * @throws ControlLoopException on command argument errors
+     */
+    public String parse(final String[] args) throws ControlLoopException {
+        // Clear all our arguments
+        setConfigurationFilePath(null);
+        CommandLine commandLine = null;
+        try {
+            commandLine = new DefaultParser().parse(options, args);
+        } catch (final ParseException e) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "invalid command line arguments specified : " + e.getMessage());
+        }
+
+        // Arguments left over after Commons CLI does its stuff
+        final String[] remainingArgs = commandLine.getArgs();
+
+        if (remainingArgs.length > 0) {
+            throw new ControlLoopException(Response.Status.NOT_ACCEPTABLE,
+                    "too many command line arguments specified : " + Arrays.toString(args));
+        }
+
+        if (commandLine.hasOption('h')) {
+            return commonCommandLineArguments.help(Main.class.getName(), options);
+        }
+
+        if (commandLine.hasOption('v')) {
+            return commonCommandLineArguments.version();
+        }
+
+        if (commandLine.hasOption('c')) {
+            setConfigurationFilePath(commandLine.getOptionValue('c'));
+        }
+
+        return null;
+    }
+
+    /**
+     * Validate the command line options.
+     *
+     * @throws ControlLoopException on command argument validation errors
+     */
+    public void validate() throws ControlLoopException {
+        commonCommandLineArguments.validate(configurationFilePath);
+    }
+
+    /**
+     * Gets the full expanded configuration file path.
+     *
+     * @return the configuration file path
+     */
+    public String getFullConfigurationFilePath() {
+        return ResourceUtils.getFilePath4Resource(getConfigurationFilePath());
+    }
+
+    /**
+     * Check set configuration file path.
+     *
+     * @return true, if check set configuration file path
+     */
+    public boolean checkSetConfigurationFilePath() {
+        return !StringUtils.isEmpty(configurationFilePath);
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/resources/META-INF/persistence.xml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/resources/META-INF/persistence.xml
new file mode 100644 (file)
index 0000000..46db712
--- /dev/null
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2021 Nordix Foundation.
+  ================================================================================
+  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.
+
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
+    <persistence-unit name="ToscaConceptTest" transaction-type="RESOURCE_LOCAL">
+        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+
+        <class>org.onap.policy.models.base.PfConceptKey</class>
+        <class>org.onap.policy.models.dao.converters.CDataConditioner</class>
+        <class>org.onap.policy.models.dao.converters.Uuid2String</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignments</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaDataTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTemplates</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaNodeTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaParameter</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicies</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicy</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaPolicyTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaProperty</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipType</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRelationshipTypes</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirement</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaRequirements</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTopologyTemplate</class>
+        <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaTrigger</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoop</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaControlLoopElement</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipant</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics</class>
+        <class>org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics</class>
+        <properties>
+            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
+            <property name="eclipselink.ddl-generation.output-mode" value="database" />
+            <property name="eclipselink.logging.level" value="INFO" />
+
+            <!-- property name="eclipselink.logging.level" value="ALL" />
+            <property name="eclipselink.logging.level.jpa" value="ALL" />
+            <property name="eclipselink.logging.level.ddl" value="ALL" />
+            <property name="eclipselink.logging.level.connection" value="ALL" />
+            <property name="eclipselink.logging.level.sql" value="ALL" />
+            <property name="eclipselink.logging.level.transaction" value="ALL" />
+            <property name="eclipselink.logging.level.sequencing" value="ALL" />
+            <property name="eclipselink.logging.level.server" value="ALL" />
+            <property name="eclipselink.logging.level.query" value="ALL" />
+            <property name="eclipselink.logging.level.properties" value="ALL" /-->
+        </properties>
+        <shared-cache-mode>NONE</shared-cache-mode>
+    </persistence-unit>
+</persistence>
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/resources/config/PolicyParticipantConfig.json b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/resources/config/PolicyParticipantConfig.json
new file mode 100644 (file)
index 0000000..2a3a1f1
--- /dev/null
@@ -0,0 +1,28 @@
+{
+    "name":"ParticipantParameterGroup",
+    "participantStatusParameters":{
+        "timeIntervalMs":10000,
+        "description":"Participant Status",
+        "participantId":{
+            "name": "PolicyParticipant0",
+            "version":"1.0.0"
+        },
+        "participantDefinition":{
+            "name": "org.onap.policy.controlloop.PolicyControlLoopParticipant",
+            "version":"2.3.1"
+        }
+    },
+    "topicParameterGroup": {
+        "topicSources" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }],
+        "topicSinks" : [{
+            "topic" : "POLICY-CLRUNTIME-PARTICIPANT",
+            "servers" : [ "127.0.0.1:3904" ],
+            "topicCommInfrastructure" : "dmaap"
+        }]
+    }
+}
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/resources/version.txt b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/main/resources/version.txt
new file mode 100644 (file)
index 0000000..dbd6758
--- /dev/null
@@ -0,0 +1,4 @@
+ONAP Tosca defined control loop Participant
+Version: ${project.version}
+Built (UTC): ${maven.build.timestamp}
+ONAP https://wiki.onap.org
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/TestPolicyHandler.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/handler/TestPolicyHandler.java
new file mode 100644 (file)
index 0000000..d965302
--- /dev/null
@@ -0,0 +1,95 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.handler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.ControlLoopConstants;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.participant.intermediary.comm.ControlLoopUpdateListener;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.policy.main.startstop.Main;
+import org.onap.policy.clamp.controlloop.participant.policy.main.startstop.ParticipantPolicyActivator;
+import org.onap.policy.clamp.controlloop.participant.policy.main.utils.TestListenerUtils;
+import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
+import org.onap.policy.common.utils.services.Registry;
+
+public class TestPolicyHandler {
+
+    private static ControlLoopUpdateListener clUpdateListener;
+    private static ParticipantControlLoopUpdate participantControlLoopUpdateMsg;
+    private static final String PARTICIPANTS_ENDPOINT = "participants";
+    private static final String ELEMENTS_ENDPOINT = "elements";
+    private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
+    private static final String TOPIC = "my-topic";
+    static CommonTestData commonTestData = new CommonTestData();
+
+    /**
+     * Setup before class, instantiate Main.
+     *
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws Exception {
+        Registry.newRegistry();
+        final String[] configParameters = {"-c", "src/test/resources/parameters/TestParameters.json"};
+        Main main = new Main(configParameters);
+        assertTrue(main.isRunning());
+        TestListenerUtils.initParticipantHandler();
+
+        clUpdateListener = new ControlLoopUpdateListener(
+                PolicyHandler.getInstance()
+                .getPolicyProvider()
+                .getIntermediaryApi()
+                .getParticipantHandler());
+        participantControlLoopUpdateMsg =
+                TestListenerUtils.createControlLoopUpdateMsg("src/test/resources/utils/servicetemplates");
+        participantControlLoopUpdateMsg.getControlLoop().setOrderedState(ControlLoopOrderedState.PASSIVE);
+    }
+
+    @Test
+    public void testUpdatePolicies() throws Exception {
+        // Add policy_types to the toscaServiceTemplate
+        TestListenerUtils.addPolicyTypesToToscaServiceTemplate(
+                        participantControlLoopUpdateMsg.getControlLoopDefinition());
+
+        // Add policies to the toscaServiceTemplate
+        TestListenerUtils.addPoliciesToToscaServiceTemplate(participantControlLoopUpdateMsg.getControlLoopDefinition());
+
+        // Verify that the ToscaServicetemplate has policy_types
+        assertNotNull(participantControlLoopUpdateMsg.getControlLoopDefinition().getPolicyTypes());
+
+        // Verify that the ToscaServicetemplate has policies
+        assertNotNull(participantControlLoopUpdateMsg.getControlLoopDefinition()
+                .getToscaTopologyTemplate().getPolicies());
+
+        clUpdateListener.onTopicEvent(INFRA, TOPIC, null, participantControlLoopUpdateMsg);
+
+        // Verify the result of GET participants with what is stored
+        assertEquals("org.onap.PM_Policy",
+                TestListenerUtils.getParticipantHandler().getParticipantId().getName());
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/CommonTestData.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/CommonTestData.java
new file mode 100644 (file)
index 0000000..e3d7e3a
--- /dev/null
@@ -0,0 +1,221 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.parameters;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import javax.ws.rs.core.Response;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.common.endpoints.parameters.TopicParameters;
+import org.onap.policy.common.parameters.ParameterGroup;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+
+/**
+ * Class to hold/create all parameters for test cases.
+ */
+public class CommonTestData {
+    public static final String PARTICIPANT_GROUP_NAME = "ControlLoopParticipantGroup";
+    public static final String DESCRIPTION = "Participant description";
+    public static final long TIME_INTERVAL = 2000;
+    public static final List<TopicParameters> TOPIC_PARAMS = Arrays.asList(getTopicParams());
+
+    public static final Coder coder = new StandardCoder();
+
+    /**
+     * Converts the contents of a map to a parameter class.
+     *
+     * @param source property map
+     * @param clazz class of object to be created from the map
+     * @return a new object represented by the map
+     */
+    public <T extends ParameterGroup> T toObject(final Map<String, Object> source, final Class<T> clazz) {
+        try {
+            return coder.convert(source, clazz);
+        } catch (final CoderException e) {
+            throw new RuntimeException("cannot create " + clazz.getName() + " from map", e);
+        }
+    }
+
+    /**
+     * Returns a property map for a ParticipantPolicyParameters map for test cases.
+     *
+     * @param name name of the parameters
+     *
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getParticipantPolicyParametersMap(final String name) {
+        final Map<String, Object> map = new TreeMap<>();
+
+        map.put("name", name);
+        map.put("intermediaryParameters", getIntermediaryParametersMap(false));
+        map.put("databaseProviderParameters", getDatabaseProviderParametersMap(false));
+        return map;
+    }
+
+    /**
+     * Returns a property map for a databaseProviderParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getDatabaseProviderParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("name", "PolicyProviderParameterGroup");
+            map.put("implementation", "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl");
+            map.put("databaseDriver", "org.h2.Driver");
+            map.put("databaseUrl", "jdbc:h2:mem:testdb");
+            map.put("databaseUser", "policy");
+            map.put("databasePassword", "P01icY");
+            map.put("persistenceUnit", "ToscaConceptTest");
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a intermediaryParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getIntermediaryParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("name", "Participant parameters");
+            map.put("reportingTimeInterval", TIME_INTERVAL);
+            map.put("description", DESCRIPTION);
+            map.put("participantId", getParticipantId());
+            map.put("participantType", getParticipantId());
+            map.put("clampControlLoopTopics", getTopicParametersMap(false));
+        }
+
+        return map;
+    }
+
+    /**
+     * Returns a property map for a TopicParameters map for test cases.
+     *
+     * @param isEmpty boolean value to represent that object created should be empty or not
+     * @return a property map suitable for constructing an object
+     */
+    public Map<String, Object> getTopicParametersMap(final boolean isEmpty) {
+        final Map<String, Object> map = new TreeMap<>();
+        if (!isEmpty) {
+            map.put("topicSources", TOPIC_PARAMS);
+            map.put("topicSinks", TOPIC_PARAMS);
+        }
+        return map;
+    }
+
+    /**
+     * Returns topic parameters for test cases.
+     *
+     * @return topic parameters
+     */
+    public static TopicParameters getTopicParams() {
+        final TopicParameters topicParams = new TopicParameters();
+        topicParams.setTopic("POLICY-CLRUNTIME-PARTICIPANT");
+        topicParams.setTopicCommInfrastructure("dmaap");
+        topicParams.setServers(Arrays.asList("localhost"));
+        return topicParams;
+    }
+
+    /**
+     * Returns participantId for test cases.
+     *
+     * @return participant Id
+     */
+    public static ToscaConceptIdentifier getParticipantId() {
+        final ToscaConceptIdentifier participantId = new ToscaConceptIdentifier("org.onap.PM_Policy", "0.0.0");
+        return participantId;
+    }
+
+    /**
+     * Gets the standard participant parameters.
+     *
+     * @param port port to be inserted into the parameters
+     * @return the standard participant parameters
+     */
+    public ParticipantPolicyParameters getParticipantPolicyParameters(int port) {
+        try {
+            return coder.decode(getParticipantPolicyParametersAsString(port), ParticipantPolicyParameters.class);
+
+        } catch (CoderException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "cannot read participant parameters", e);
+        }
+    }
+
+    /**
+     * Gets the standard participant parameters, as a String.
+     *
+     * @param port port to be inserted into the parameters
+     * @return the standard participant parameters
+     */
+    public static String getParticipantPolicyParametersAsString(int port) {
+
+        try {
+            File file = new File(getParamFile());
+            String json = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
+
+            json = json.replace("${port}", String.valueOf(port));
+            json = json.replace("${dbName}", "jdbc:h2:mem:testdb");
+
+            return json;
+
+        } catch (IOException e) {
+            throw new ControlLoopRuntimeException(Response.Status.NOT_ACCEPTABLE,
+                    "cannot read participant parameters", e);
+
+        }
+    }
+
+    /**
+     * Gets the full path to the parameter file, which may vary depending on whether or
+     * not this is an end-to-end test.
+     *
+     * @return the parameter file name
+     */
+    private static String getParamFile() {
+        String paramFile = "src/test/resources/parameters/TestParametersStd.json";
+        return paramFile;
+    }
+
+    /**
+     * Nulls out a field within a JSON string.
+     * @param json JSON string
+     * @param field field to be nulled out
+     * @return a new JSON string with the field nulled out
+     */
+    public String nullifyField(String json, String field) {
+        return json.replace(field + "\"", field + "\":null, \"" + field + "Xxx\"");
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameterHandler.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameterHandler.java
new file mode 100644 (file)
index 0000000..dd62dbf
--- /dev/null
@@ -0,0 +1,98 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.parameters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.FileNotFoundException;
+import org.apache.commons.io.DirectoryWalker.CancelException;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
+import org.onap.policy.clamp.controlloop.participant.policy.main.startstop.ParticipantPolicyCommandLineArguments;
+import org.onap.policy.common.utils.coder.CoderException;
+
+public class TestParticipantPolicyParameterHandler {
+
+    @Test
+    public void testParameterHandlerNoParameterFile() throws ControlLoopException {
+        final String[] emptyArgumentString = { "-c", "src/test/resources/parameters/NoParametersFile.json" };
+
+        final ParticipantPolicyCommandLineArguments emptyArguments = new ParticipantPolicyCommandLineArguments();
+        emptyArguments.parse(emptyArgumentString);
+
+        assertThatThrownBy(() -> new ParticipantPolicyParameterHandler().getParameters(emptyArguments))
+            .hasCauseInstanceOf(CoderException.class)
+            .hasRootCauseInstanceOf(FileNotFoundException.class);
+    }
+
+    @Test
+    public void testParameterHandlerInvalidParameters() throws ControlLoopException {
+        final String[] invalidArgumentString = { "-c", "src/test/resources/parameters/InvalidParameters.json" };
+
+        final ParticipantPolicyCommandLineArguments invalidArguments =
+                new ParticipantPolicyCommandLineArguments();
+        invalidArguments.parse(invalidArgumentString);
+
+        assertThatThrownBy(() -> new ParticipantPolicyParameterHandler().getParameters(invalidArguments))
+            .hasMessageStartingWith("error reading parameters from")
+            .hasCauseInstanceOf(CoderException.class);
+    }
+
+    @Test
+    public void testParticipantPolicyParameters() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-c", "src/test/resources/parameters/TestParameters.json" };
+
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        arguments.parse(participantConfigParameters);
+
+        final ParticipantPolicyParameters parGroup = new ParticipantPolicyParameterHandler()
+                .getParameters(arguments);
+        assertTrue(arguments.checkSetConfigurationFilePath());
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, parGroup.getName());
+    }
+
+    @Test
+    public void testParticipantVersion() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-v" };
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        final String version = arguments.parse(participantConfigParameters);
+        assertThat(arguments.parse(participantConfigParameters)).startsWith(
+                        "ONAP Tosca defined control loop Participant");
+    }
+
+    @Test
+    public void testParticipantHelp() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-h" };
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        assertThat(arguments.parse(participantConfigParameters)).startsWith("usage:");
+    }
+
+    @Test
+    public void testParticipantInvalidOption() throws ControlLoopException {
+        final String[] participantConfigParameters = { "-d" };
+        final ParticipantPolicyCommandLineArguments arguments = new ParticipantPolicyCommandLineArguments();
+        assertThatThrownBy(() -> arguments.parse(participantConfigParameters))
+            .hasMessageStartingWith("invalid command line arguments specified");
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameters.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/parameters/TestParticipantPolicyParameters.java
new file mode 100644 (file)
index 0000000..4998444
--- /dev/null
@@ -0,0 +1,112 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.parameters;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.util.Map;
+import org.junit.Test;
+import org.onap.policy.common.parameters.GroupValidationResult;
+
+public class TestParticipantPolicyParameters {
+    CommonTestData commonTestData = new CommonTestData();
+
+    @Test
+    public void testParticipantPolicyParameters_Named() {
+        final ParticipantPolicyParameters participantParameters = new ParticipantPolicyParameters("my-name");
+        assertEquals("my-name", participantParameters.getName());
+    }
+
+    @Test
+    public void testParticipantPolicyParameters() {
+        final ParticipantPolicyParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantPolicyParameters.class);
+        assertThat(participantParameters.validate().isValid()).isTrue();
+    }
+
+    @Test
+    public void testParticipantPolicyParameters_NullName() {
+        final ParticipantPolicyParameters participantParameters = commonTestData
+                .toObject(commonTestData.getParticipantPolicyParametersMap(null),
+                        ParticipantPolicyParameters.class);
+        final GroupValidationResult validationResult = participantParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals(null, participantParameters.getName());
+        assertThat(validationResult.getResult()).contains("is null");
+    }
+
+    @Test
+    public void testParticipantPolicyParameters_EmptyName() {
+        final ParticipantPolicyParameters participantParameters = commonTestData
+                .toObject(commonTestData.getParticipantPolicyParametersMap(""),
+                                ParticipantPolicyParameters.class);
+        final GroupValidationResult validationResult = participantParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertEquals("", participantParameters.getName());
+        assertThat(validationResult.getResult()).contains(
+                "field \"name\" type \"java.lang.String\" value \"\" INVALID, " + "must be a non-blank string");
+    }
+
+    @Test
+    public void testParticipantPolicyParameters_SetName() {
+        final ParticipantPolicyParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantPolicyParameters.class);
+        participantParameters.setName("ParticipantNewGroup");
+        assertThat(participantParameters.validate().isValid()).isTrue();
+        assertEquals("ParticipantNewGroup", participantParameters.getName());
+    }
+
+    @Test
+    public void testParticipantPolicyParameters_EmptyParticipantIntermediaryParameters() {
+        final Map<String, Object> map =
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME);
+        map.replace("intermediaryParameters", commonTestData.getIntermediaryParametersMap(true));
+        final ParticipantPolicyParameters participantParameters =
+                commonTestData.toObject(map, ParticipantPolicyParameters.class);
+        final GroupValidationResult validationResult = participantParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertThat(validationResult.getResult()).contains(
+                        "\"org.onap.policy.clamp.controlloop.participant.policy.main.parameters."
+                        + "ParticipantPolicyParameters\""
+                        + " INVALID, parameter group has status INVALID");
+    }
+
+    @Test
+    public void testParticipantPolicyParametersp_EmptyTopicParameters() {
+        final Map<String, Object> map =
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME);
+        final Map<String, Object> intermediaryParametersMap = commonTestData.getIntermediaryParametersMap(false);
+        intermediaryParametersMap.put("clampControlLoopTopics", commonTestData.getTopicParametersMap(true));
+        map.replace("intermediaryParameters", intermediaryParametersMap);
+
+        final ParticipantPolicyParameters participantParameters =
+                commonTestData.toObject(map, ParticipantPolicyParameters.class);
+        final GroupValidationResult validationResult = participantParameters.validate();
+        assertFalse(validationResult.isValid());
+        assertThat(validationResult.getResult())
+                .contains("\"org.onap.policy.common.endpoints.parameters.TopicParameterGroup\" INVALID, "
+                        + "parameter group has status INVALID");
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestMain.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestMain.java
new file mode 100644 (file)
index 0000000..f77b678
--- /dev/null
@@ -0,0 +1,143 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.common.ControlLoopConstants;
+import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
+import org.onap.policy.common.utils.resources.MessageConstants;
+import org.onap.policy.common.utils.services.Registry;
+
+public class TestMain {
+
+    /**
+     * Set up.
+     */
+    @BeforeClass
+    public static void setUp() {
+        Registry.newRegistry();
+    }
+
+    /**
+     * Shuts "main" down.
+     *
+     * @throws Exception if an error occurs
+     */
+    @AfterClass
+    public static void tearDown() throws Exception {
+        // shut down activator
+        final ParticipantPolicyActivator activator =
+            Registry.getOrDefault(ControlLoopConstants.REG_CLRUNTIME_ACTIVATOR,
+                            ParticipantPolicyActivator.class, null);
+        if (activator != null && activator.isAlive()) {
+            activator.shutdown();
+        }
+    }
+
+    @Test
+    public void testMain_Help() {
+        final String[] configParameters = {"-h"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Version() {
+        final String[] configParameters = {"-v"};
+        Main main = new Main(configParameters);
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_Valid() {
+        final String[] configParameters = {"-c", "src/test/resources/parameters/TestParameters.json"};
+        Main main = new Main(configParameters);
+        assertTrue(main.isRunning());
+
+        assertThatCode(() -> main.shutdown()).doesNotThrowAnyException();
+
+        assertFalse(main.isRunning());
+    }
+
+    @Test
+    public void testMain_NoParameter() {
+        assertThatConfigParameterThrownException(new String[] {});
+    }
+
+    @Test
+    public void testMain_FilePathNotDefined() {
+        assertThatConfigParameterThrownException(new String[] {"-c"});
+    }
+
+    @Test
+    public void testMain_TooManyCommand() {
+        assertThatConfigParameterThrownException(new String[] {"-h", "d"});
+    }
+
+    @Test
+    public void testMain_WrongParameter() {
+        assertThatConfigParameterThrownException(new String[] {"-d"});
+    }
+
+    private void assertThatConfigParameterThrownException(final String[] configParameters) {
+        assertThatThrownBy(() -> Main.main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP));
+    }
+
+    @Test
+    public void testParticipant_NoFileWithThisName() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoFileWithThisName.json");
+    }
+
+    @Test
+    public void testParticipant_NotValidFile() {
+        assertThatConfigFileThrownException("src/test/resources/parameters");
+    }
+
+    @Test
+    public void testParticipant_NoParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/NoParameters.json");
+    }
+
+    @Test
+    public void testParticipant_InvalidParameters() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/InvalidParameters.json");
+    }
+
+    @Test
+    public void testParticipant_WrongJsonFormat() {
+        assertThatConfigFileThrownException("src/test/resources/parameters/Unreadable.json");
+    }
+
+    private void assertThatConfigFileThrownException(final String configFilePath) {
+        final String[] configParameters = new String[] {"-c", configFilePath};
+        assertThatThrownBy(() -> new Main(configParameters)).isInstanceOf(ControlLoopRuntimeException.class)
+                .hasMessage(String.format(MessageConstants.START_FAILURE_MSG, MessageConstants.POLICY_CLAMP));
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestParticipantPolicyActivator.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/startstop/TestParticipantPolicyActivator.java
new file mode 100644 (file)
index 0000000..afb0f6c
--- /dev/null
@@ -0,0 +1,88 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.startstop;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameterHandler;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.utils.services.Registry;
+
+public class TestParticipantPolicyActivator {
+
+    private static ParticipantPolicyActivator activator;
+
+    /**
+     * Initializes an activator.
+     *
+     * @throws Exception if an error occurs
+     */
+    @BeforeClass
+    public static void setUp() throws Exception {
+        Registry.newRegistry();
+        final String[] participantConfigParameters = { "-c", "src/test/resources/parameters/TestParameters.json"};
+        final ParticipantPolicyCommandLineArguments arguments =
+                new ParticipantPolicyCommandLineArguments(participantConfigParameters);
+        final ParticipantPolicyParameters parGroup =
+                new ParticipantPolicyParameterHandler().getParameters(arguments);
+        activator = new ParticipantPolicyActivator(parGroup);
+    }
+
+    /**
+     * Method for cleanup after each test.
+     *
+     * @throws Exception if an error occurs
+     */
+    @AfterClass
+    public static void teardown() throws Exception {
+        // shut down activator
+        if (activator != null && activator.isAlive()) {
+            activator.shutdown();
+        }
+    }
+
+    @Test
+    public void testParticipantActivator() {
+        activator.start();
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameters().isValid());
+        assertEquals(CommonTestData.PARTICIPANT_GROUP_NAME, activator.getParameters().getName());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.start());
+        assertTrue(activator.isAlive());
+        assertTrue(activator.getParameters().isValid());
+
+        activator.shutdown();
+        assertFalse(activator.isAlive());
+
+        // repeat - should throw an exception
+        assertThatIllegalStateException().isThrownBy(() -> activator.shutdown());
+        assertFalse(activator.isAlive());
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/utils/TestListenerUtils.java b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/java/org/onap/policy/clamp/controlloop/participant/policy/main/utils/TestListenerUtils.java
new file mode 100644 (file)
index 0000000..9d5b874
--- /dev/null
@@ -0,0 +1,346 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.policy.main.utils;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import lombok.Getter;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopStateChange;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantHealthCheck;
+import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantStateChange;
+import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
+import org.onap.policy.clamp.controlloop.participant.policy.main.handler.PolicyProvider;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.CommonTestData;
+import org.onap.policy.clamp.controlloop.participant.policy.main.parameters.ParticipantPolicyParameters;
+import org.onap.policy.common.utils.coder.Coder;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.YamlJsonTranslator;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestListenerUtils {
+
+    private static final YamlJsonTranslator yamlTranslator = new YamlJsonTranslator();
+    private static final Coder CODER = new StandardCoder();
+    static CommonTestData commonTestData = new CommonTestData();
+    private static final Logger LOGGER = LoggerFactory.getLogger(TestListenerUtils.class);
+
+    @Getter
+    private static ParticipantHandler participantHandler;
+
+    private TestListenerUtils() {}
+
+    /**
+     * Initializes participantHandler.
+     */
+    public static void initParticipantHandler() {
+
+        final ParticipantPolicyParameters participantParameters = commonTestData.toObject(
+                commonTestData.getParticipantPolicyParametersMap(CommonTestData.PARTICIPANT_GROUP_NAME),
+                ParticipantPolicyParameters.class);
+
+        PolicyProvider policyProvider =
+                new PolicyProvider(participantParameters.getIntermediaryParameters());
+
+        participantHandler = policyProvider.getIntermediaryApi().getParticipantHandler();
+    }
+
+    /**
+     * Method to create a controlLoop from a yaml file.
+     *
+     * @return ControlLoop controlloop
+     */
+    public static ControlLoop createControlLoop() {
+        ControlLoop controlLoop = new ControlLoop();
+        List<ControlLoopElement> elements = new ArrayList<>();
+        ToscaServiceTemplate toscaServiceTemplate = testControlLoopRead("src/test/resources/utils/servicetemplates");
+        Map<String, ToscaNodeTemplate> nodeTemplatesMap =
+                toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
+        for (Map.Entry<String, ToscaNodeTemplate> toscaInputEntry : nodeTemplatesMap.entrySet()) {
+            ControlLoopElement clElement = new ControlLoopElement();
+            clElement.setId(UUID.randomUUID());
+
+            ToscaConceptIdentifier clElementParticipantId = new ToscaConceptIdentifier();
+            clElementParticipantId.setName(toscaInputEntry.getKey());
+            clElementParticipantId.setVersion(toscaInputEntry.getValue().getVersion());
+            clElement.setParticipantId(clElementParticipantId);
+
+            clElement.setDefinition(clElementParticipantId);
+            clElement.setState(ControlLoopState.UNINITIALISED);
+            clElement.setDescription(toscaInputEntry.getValue().getDescription());
+            clElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+            elements.add(clElement);
+        }
+        controlLoop.setElements(elements);
+        controlLoop.setName("PMSHInstance0");
+        controlLoop.setVersion("1.0.0");
+
+        ToscaConceptIdentifier definition = new ToscaConceptIdentifier();
+        definition.setName("PMSHInstance0");
+        definition.setVersion("1.0.0");
+        controlLoop.setDefinition(definition);
+
+        return controlLoop;
+    }
+
+    /**
+     * Method to create ParticipantStateChange message from the arguments passed.
+     *
+     * @param participantState participant State
+     *
+     * @return ParticipantStateChange message
+     */
+    public static ParticipantStateChange createParticipantStateChangeMsg(final ParticipantState participantState) {
+        final ParticipantStateChange participantStateChangeMsg = new ParticipantStateChange();
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("org.onap.PM_Policy");
+        participantId.setVersion("0.0.0");
+
+        participantStateChangeMsg.setParticipantId(participantId);
+        participantStateChangeMsg.setTimestamp(Instant.now());
+        participantStateChangeMsg.setState(participantState);
+
+        return participantStateChangeMsg;
+    }
+
+    /**
+     * Method to create ControlLoopStateChange message from the arguments passed.
+     *
+     * @param controlLoopOrderedState controlLoopOrderedState
+     *
+     * @return ParticipantControlLoopStateChange message
+     */
+    public static ParticipantControlLoopStateChange createControlLoopStateChangeMsg(
+            final ControlLoopOrderedState controlLoopOrderedState) {
+        final ParticipantControlLoopStateChange participantClStateChangeMsg = new ParticipantControlLoopStateChange();
+
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
+        controlLoopId.setName("PMSHInstance0");
+        controlLoopId.setVersion("1.0.0");
+
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("org.onap.PM_Policy");
+        participantId.setVersion("0.0.0");
+
+        participantClStateChangeMsg.setControlLoopId(controlLoopId);
+        participantClStateChangeMsg.setParticipantId(participantId);
+        participantClStateChangeMsg.setTimestamp(Instant.now());
+        participantClStateChangeMsg.setOrderedState(controlLoopOrderedState);
+
+        return participantClStateChangeMsg;
+    }
+
+    /**
+     * Method to create ControlLoopUpdateMsg.
+     *
+     * @return ParticipantControlLoopUpdate message
+     */
+    public static ParticipantControlLoopUpdate createControlLoopUpdateMsg(final String inputDirPath) {
+        final ParticipantControlLoopUpdate clUpdateMsg = new ParticipantControlLoopUpdate();
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
+        controlLoopId.setName("PMSHInstance0");
+        controlLoopId.setVersion("1.0.0");
+
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("org.onap.PM_Policy");
+        participantId.setVersion("0.0.0");
+
+        clUpdateMsg.setControlLoopId(controlLoopId);
+        clUpdateMsg.setParticipantId(participantId);
+
+        ControlLoop controlLoop = new ControlLoop();
+        List<ControlLoopElement> elements = new ArrayList<>();
+        ToscaServiceTemplate toscaServiceTemplate = testControlLoopRead(inputDirPath);
+        Map<String, ToscaNodeTemplate> nodeTemplatesMap =
+                toscaServiceTemplate.getToscaTopologyTemplate().getNodeTemplates();
+        for (Map.Entry<String, ToscaNodeTemplate> toscaInputEntry : nodeTemplatesMap.entrySet()) {
+            ControlLoopElement clElement = new ControlLoopElement();
+            clElement.setId(UUID.randomUUID());
+
+            ToscaConceptIdentifier clElementParticipantId = new ToscaConceptIdentifier();
+            clElementParticipantId.setName(toscaInputEntry.getKey());
+            clElementParticipantId.setVersion(toscaInputEntry.getValue().getVersion());
+            clElement.setParticipantId(clElementParticipantId);
+
+            clElement.setDefinition(clElementParticipantId);
+            clElement.setState(ControlLoopState.UNINITIALISED);
+            clElement.setDescription(toscaInputEntry.getValue().getDescription());
+            clElement.setOrderedState(ControlLoopOrderedState.UNINITIALISED);
+            elements.add(clElement);
+        }
+        controlLoop.setElements(elements);
+        controlLoop.setName("PMSHInstance0");
+        controlLoop.setVersion("1.0.0");
+        controlLoop.setDefinition(controlLoopId);
+        clUpdateMsg.setControlLoop(controlLoop);
+        clUpdateMsg.setControlLoopDefinition(toscaServiceTemplate);
+
+        return clUpdateMsg;
+    }
+
+    /**
+     * Method to create ParticipantHealthCheck message.
+     *
+     * @return ParticipantHealthCheck message
+     */
+    public static ParticipantHealthCheck createParticipantHealthCheckMsg() {
+        ToscaConceptIdentifier participantId = new ToscaConceptIdentifier();
+        participantId.setName("org.onap.PM_Policy");
+        participantId.setVersion("0.0.0");
+
+        ToscaConceptIdentifier controlLoopId = new ToscaConceptIdentifier();
+        controlLoopId.setName("PMSHInstance0");
+        controlLoopId.setVersion("1.0.0");
+
+        final ParticipantHealthCheck participantHealthCheckMsg = new ParticipantHealthCheck();
+        participantHealthCheckMsg.setParticipantId(participantId);
+        participantHealthCheckMsg.setControlLoopId(controlLoopId);
+        participantHealthCheckMsg.setTimestamp(Instant.now());
+        participantHealthCheckMsg.setState(ParticipantState.PASSIVE);
+
+        return participantHealthCheckMsg;
+    }
+
+    /**
+     * Method to create ParticipantControlLoopUpdate using the arguments passed.
+     *
+     * @param jsonFilePath the path of the controlloop content
+     *
+     * @return ParticipantControlLoopUpdate message
+     * @throws CoderException exception while reading the file to object
+     */
+    public static ParticipantControlLoopUpdate createParticipantClUpdateMsgFromJson(String jsonFilePath)
+            throws CoderException {
+        ParticipantControlLoopUpdate participantControlLoopUpdateMsg =
+                CODER.decode(new File(jsonFilePath), ParticipantControlLoopUpdate.class);
+        return participantControlLoopUpdateMsg;
+    }
+
+    private static ToscaServiceTemplate testControlLoopRead(final String inputDirPath) {
+        Set<String> controlLoopDirectoryContents =
+                ResourceUtils.getDirectoryContents(inputDirPath);
+
+        boolean atLeastOneControlLoopTested = false;
+        ToscaServiceTemplate toscaServiceTemplate = null;
+
+        for (String controlLoopFilePath : controlLoopDirectoryContents) {
+            if (!controlLoopFilePath.endsWith(".yaml")) {
+                continue;
+            }
+            atLeastOneControlLoopTested = true;
+            toscaServiceTemplate = testControlLoopYamlSerialization(controlLoopFilePath);
+        }
+
+        assertTrue(atLeastOneControlLoopTested);
+        return toscaServiceTemplate;
+    }
+
+    /**
+     * Method to add polcies to the toscaServiceTemplate.
+     *
+     * @param toscaServiceTemplate to add policies
+     */
+    public static void addPolicyTypesToToscaServiceTemplate(
+            ToscaServiceTemplate toscaServiceTemplate) {
+        Set<String> policyTypeDirectoryContents = ResourceUtils.getDirectoryContents("policytypes");
+
+        for (String policyTypeFilePath : policyTypeDirectoryContents) {
+            String policyTypeString = ResourceUtils.getResourceAsString(policyTypeFilePath);
+
+            ToscaServiceTemplate foundPolicyTypeSt =
+                yamlTranslator.fromYaml(policyTypeString, ToscaServiceTemplate.class);
+
+            toscaServiceTemplate.setDerivedFrom(foundPolicyTypeSt.getDerivedFrom());
+            toscaServiceTemplate.setDescription(foundPolicyTypeSt.getDescription());
+            toscaServiceTemplate.setMetadata(foundPolicyTypeSt.getMetadata());
+            toscaServiceTemplate.setName(foundPolicyTypeSt.getName());
+            toscaServiceTemplate.setToscaDefinitionsVersion(foundPolicyTypeSt.getToscaDefinitionsVersion());
+            toscaServiceTemplate.setVersion(foundPolicyTypeSt.getVersion());
+
+            if (foundPolicyTypeSt.getDataTypes() != null) {
+                if (toscaServiceTemplate.getDataTypes() == null) {
+                    toscaServiceTemplate.setDataTypes(foundPolicyTypeSt.getDataTypes());
+                } else {
+                    toscaServiceTemplate.getDataTypes().putAll(foundPolicyTypeSt.getDataTypes());
+                }
+            }
+
+            if (toscaServiceTemplate.getPolicyTypes() == null) {
+                toscaServiceTemplate.setPolicyTypes(foundPolicyTypeSt.getPolicyTypes());
+            } else {
+                toscaServiceTemplate.getPolicyTypes().putAll(foundPolicyTypeSt.getPolicyTypes());
+            }
+        }
+    }
+
+    /**
+     * Method to add polcies to the toscaServiceTemplate.
+     *
+     * @param toscaServiceTemplate to add policies
+     */
+    public static void addPoliciesToToscaServiceTemplate(ToscaServiceTemplate toscaServiceTemplate) {
+        Set<String> policiesDirectoryContents = ResourceUtils.getDirectoryContents("policies");
+
+        for (String policiesFilePath : policiesDirectoryContents) {
+            String policiesString = ResourceUtils.getResourceAsString(policiesFilePath);
+
+            ToscaServiceTemplate foundPoliciesSt =
+                yamlTranslator.fromYaml(policiesString, ToscaServiceTemplate.class);
+            toscaServiceTemplate.getToscaTopologyTemplate().setPolicies(
+                    foundPoliciesSt.getToscaTopologyTemplate().getPolicies());
+        }
+    }
+
+    private static ToscaServiceTemplate testControlLoopYamlSerialization(String controlLoopFilePath) {
+        try {
+            String controlLoopString = ResourceUtils.getResourceAsString(controlLoopFilePath);
+            if (controlLoopString == null) {
+                throw new FileNotFoundException(controlLoopFilePath);
+            }
+
+            ToscaServiceTemplate serviceTemplate = yamlTranslator.fromYaml(
+                        controlLoopString, ToscaServiceTemplate.class);
+            return serviceTemplate;
+        } catch (FileNotFoundException e) {
+            LOGGER.error("cannot find YAML file", controlLoopFilePath);
+            throw new IllegalArgumentException(e);
+        }
+    }
+}
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/InvalidParameters.json b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/InvalidParameters.json
new file mode 100644 (file)
index 0000000..57ffcbd
--- /dev/null
@@ -0,0 +1,4 @@
+{
+  "name": "
+}
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/MinimumParametersH2.json b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/MinimumParametersH2.json
new file mode 100644 (file)
index 0000000..caca6cf
--- /dev/null
@@ -0,0 +1,54 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantId": {
+            "name": "org.onap.PM_Policy",
+            "version": "0.0.0"
+        },
+        "participantType": {
+            "name": "org.onap.PM_Policy",
+            "version": "0.0.0"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/NoParameters.json b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/NoParameters.json
new file mode 100644 (file)
index 0000000..bfd870e
--- /dev/null
@@ -0,0 +1,3 @@
+{
+}
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestCLParams.json b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestCLParams.json
new file mode 100644 (file)
index 0000000..a890af7
--- /dev/null
@@ -0,0 +1,161 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+node_types:
+  org.onap.policy.clamp.controlloop.Participant:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+  org.onap.policy.clamp.controlloop.ControlLoopElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      participant_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.ControlLoop:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      elements:
+        type: list
+        required: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+  org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      dcae_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      policy_type_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.CDSControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      cds_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+topology_template:
+  node_templates:
+    org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.MonitoringPolicyControlLoopParticipant:
+      version: 2.3.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.OperationalPolicyControlLoopParticipant:
+      version: 3.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant:
+      version: 2.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.domain.pmsh.PMSH_DCAEMicroservice:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant
+          version: 2.3.4
+        dcae_blueprint_id:
+          name: org.onap.dcae.blueprints.PMSHBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the monitoring policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.MonitoringPolicyControlLoopParticipant
+          version: 2.3.1
+        policy_type_id:
+          name: onap.policies.monitoring.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyTypeControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.OperationalPolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.operational.pm-subscription-handler
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for CDS for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_Id:
+          name: org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant
+          version: 3.2.1
+        cds_blueprint_id:
+          name: org.onap.ccsdk.cds.PMSHCdsBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSHControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        elements:
+        - name: org.onap.domain.pmsh.PMSH_DCAEMicroservice
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement
+          version: 1.2.3
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParameters.json b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParameters.json
new file mode 100644 (file)
index 0000000..caca6cf
--- /dev/null
@@ -0,0 +1,54 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantId": {
+            "name": "org.onap.PM_Policy",
+            "version": "0.0.0"
+        },
+        "participantType": {
+            "name": "org.onap.PM_Policy",
+            "version": "0.0.0"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParametersStd.json b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/TestParametersStd.json
new file mode 100644 (file)
index 0000000..caca6cf
--- /dev/null
@@ -0,0 +1,54 @@
+{
+    "name": "ControlLoopParticipantGroup",
+    "intermediaryParameters": {
+        "name": "Participant parameters",
+        "reportingTimeInterval": 120000,
+        "description": "Participant Description",
+        "participantId": {
+            "name": "org.onap.PM_Policy",
+            "version": "0.0.0"
+        },
+        "participantType": {
+            "name": "org.onap.PM_Policy",
+            "version": "0.0.0"
+        },
+        "clampControlLoopTopics": {
+            "topicSources": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap",
+                    "fetchTimeout": 15000
+                }
+            ],
+            "topicSinks": [
+                {
+                    "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                },
+                {
+                    "topic": "POLICY-NOTIFICATION",
+                    "servers": [
+                        "localhost"
+                    ],
+                    "topicCommInfrastructure": "dmaap"
+                }
+            ]
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    }
+}
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/Unreadable.json b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/Unreadable.json
new file mode 100644 (file)
index 0000000..35b5e5f
--- /dev/null
@@ -0,0 +1,72 @@
+{
+    "name": "ControlLoopRuntimeGroup",
+    "participantParameters": {
+        "heartBeatMs": 120000,
+        "updateParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        },
+        "stateChangeParameters": {
+            "maxRetryCount": 1,
+            "maxWaitMs": 30000
+        }
+    },
+    "databaseProviderParameters": {
+        "name": "PolicyProviderParameterGroup",
+        "implementation": "org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl",
+        "databaseDriver": "org.h2.Driver",
+        "databaseUrl": "jdbc:h2:mem:testdb",
+        "databaseUser": "policy",
+        "databasePassword": "P01icY",
+        "persistenceUnit": "ToscaConceptTest"
+    },
+    "topicParameterGroup": {
+        "topicSources": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap",
+                "fetchTimeout": 15000
+            }
+        ],
+        "topicSinks": [
+            {
+                "topic": "POLICY-CLRUNTIME-PARTICIPANT",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            },
+            {
+                "topic": "POLICY-NOTIFICATION",
+                "servers": [
+                    "localhost"
+                ],
+                "topicCommInfrastructure": "dmaap"
+            }
+        ]
+    },
+    "healthCheckRestClientParameters": [
+        {
+            "clientName": "api",
+            "hostname": "policy-api",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "policy/api/v1/healthcheck"
+        },
+        {
+            "clientName": "distribution",
+            "hostname": "policy-distribution",
+            "port": 6969,
+            "userName": "healthcheck",
+            "password": "zb!XztG34",
+            "useHttps": true,
+            "basePath": "healthcheck"
+        }
+    ]
+}
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/logback-test.xml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/parameters/logback-test.xml
new file mode 100644 (file)
index 0000000..324a920
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2021 Nordix Foundation.
+  ================================================================================
+  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.
+
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<configuration>
+
+    <contextName>Participant</contextName>
+    <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
+    <property name="LOG_DIR" value="${java.io.tmpdir}/clamp_logging/" />
+
+    <!-- USE FOR STD OUT ONLY -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <Pattern>%d %contextName [%t] %level %logger{36} - %msg%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="STDOUT" />
+    </root>
+
+    <logger name="org.onap.policy.clamp.controlloop.runtime" level="trace" additivity="false">
+        <appender-ref ref="STDOUT" />
+    </logger>
+</configuration>
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/pmsh/PMSubscriptionHandling.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/pmsh/PMSubscriptionHandling.yaml
new file mode 100644 (file)
index 0000000..c15d116
--- /dev/null
@@ -0,0 +1,3274 @@
+# ============LICENSE_START=======================================================
+# Copyright (C) 2021 Nordix Foundation.
+# ================================================================================
+# 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.
+#
+# SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+tosca_definitions_version: tosca_simple_yaml_1_3
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+  org.onap.datatypes.policy.clamp.controlloop.DCAEMicroserviceControlLoopElementConsulInfo:
+    name: org.onap.datatypes.policy.clamp.controlloop.DCAEMicroserviceControlLoopElementConsulInfo
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    properties:
+      consulUrl:
+        name: consulUrl
+        type: string
+        typeVersion: 0.0.0
+        description: Consul url for this entry
+        required: true
+      consul_body:
+        name: consulBody
+        type: string
+        typeVersion: 0.0.0
+        description: Body of Consul entry
+        required: true
+  onap.datatypes.monitoring.managedObjectDNsBasic:
+    constraints: []
+    properties:
+      DN:
+        name: DN
+        type: string
+        typeVersion: 0.0.0
+        description: Managed object distinguished name
+        required: true
+        constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.managedObjectDNsBasic
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.managedObjectDNsBasics:
+    constraints: []
+    properties:
+      managedObjectDNsBasic:
+        name: managedObjectDNsBasic
+        type: map
+        typeVersion: 0.0.0
+        description: Managed object distinguished name object
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.managedObjectDNsBasic
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.managedObjectDNsBasics
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.measurementGroup:
+    constraints: []
+    properties:
+      measurementTypes:
+        name: measurementTypes
+        type: list
+        typeVersion: 0.0.0
+        description: List of measurement types
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementTypes
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      managedObjectDNsBasic:
+        name: managedObjectDNsBasic
+        type: list
+        typeVersion: 0.0.0
+        description: List of managed object distinguished names
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.managedObjectDNsBasics
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.measurementGroup
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.measurementGroups:
+    constraints: []
+    properties:
+      measurementGroup:
+        name: measurementGroup
+        type: map
+        typeVersion: 0.0.0
+        description: Measurement Group
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementGroup
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.measurementGroups
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.measurementType:
+    constraints: []
+    properties:
+      measurementType:
+        name: measurementType
+        type: string
+        typeVersion: 0.0.0
+        description: Measurement type
+        required: true
+        constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.measurementType
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.measurementTypes:
+    constraints: []
+    properties:
+      measurementType:
+        name: measurementType
+        type: map
+        typeVersion: 0.0.0
+        description: Measurement type object
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementType
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.measurementTypes
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.nfFilter:
+    constraints: []
+    properties:
+      modelNames:
+        name: modelNames
+        type: list
+        typeVersion: 0.0.0
+        description: List of model names
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      modelInvariantIDs:
+        name: modelInvariantIDs
+        type: list
+        typeVersion: 0.0.0
+        description: List of model invariant IDs
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      modelVersionIDs:
+        name: modelVersionIDs
+        type: list
+        typeVersion: 0.0.0
+        description: List of model version IDs
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      nfNames:
+        name: nfNames
+        type: list
+        typeVersion: 0.0.0
+        description: List of network functions
+        required: true
+        constraints: []
+        entry_schema:
+          type: string
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.nfFilter
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+  onap.datatypes.monitoring.subscription:
+    constraints: []
+    properties:
+      measurementGroups:
+        name: measurementGroups
+        type: list
+        typeVersion: 0.0.0
+        description: Measurement Groups
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.measurementGroups
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+      fileBasedGP:
+        name: fileBasedGP
+        type: integer
+        typeVersion: 0.0.0
+        description: File based granularity period
+        required: true
+        constraints: []
+        metadata: {}
+      fileLocation:
+        name: fileLocation
+        type: string
+        typeVersion: 0.0.0
+        description: ROP file location
+        required: true
+        constraints: []
+        metadata: {}
+      subscriptionName:
+        name: subscriptionName
+        type: string
+        typeVersion: 0.0.0
+        description: Name of the subscription
+        required: true
+        constraints: []
+        metadata: {}
+      administrativeState:
+        name: administrativeState
+        type: string
+        typeVersion: 0.0.0
+        description: State of the subscription
+        required: true
+        constraints:
+        - valid_values:
+          - LOCKED
+          - UNLOCKED
+        metadata: {}
+      nfFilter:
+        name: nfFilter
+        type: map
+        typeVersion: 0.0.0
+        description: Network function filter
+        required: true
+        constraints: []
+        entry_schema:
+          type: onap.datatypes.monitoring.nfFilter
+          typeVersion: 0.0.0
+          constraints: []
+        metadata: {}
+    name: onap.datatypes.monitoring.subscription
+    version: 0.0.0
+    derived_from: tosca.datatypes.Root
+    metadata: {}
+policy_types:
+  onap.policies.Monitoring:
+    derived_from: tosca.policies.Root
+    description: a base policy type for all policies that govern monitoring provisioning
+    version: 1.0.0
+    name: onap.policies.Monitoring
+  onap.policies.monitoring.dcae-pm-subscription-handler:
+    properties:
+      pmsh_policy:
+        name: pmsh_policy
+        type: onap.datatypes.monitoring.subscription
+        typeVersion: 0.0.0
+        description: PMSH Policy JSON
+        required: false
+        constraints: []
+        metadata: {}
+    name: onap.policies.monitoring.dcae-pm-subscription-handler
+    version: 1.0.0
+    derived_from: onap.policies.Monitoring
+    metadata: {}
+  onap.policies.controlloop.operational.common.Apex:
+    derived_from: onap.policies.controlloop.operational.Common
+    type_version: 1.0.0
+    version: 1.0.0
+    name: onap.policies.controlloop.operational.common.Apex
+    description: Operational policies for Apex PDP
+    properties:
+        engineServiceParameters:
+            type: string
+            description: The engine parameters like name, instanceCount, policy implementation, parameters etc.
+            required: true
+        eventInputParameters:
+            type: string
+            description: The event input parameters.
+            required: true
+        eventOutputParameters:
+            type: string
+            description: The event output parameters.
+            required: true
+        javaProperties:
+            type: string
+            description: Name/value pairs of properties to be set for APEX if needed.
+            required: false
+node_types:
+  org.onap.policy.clamp.controlloop.Participant:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+  org.onap.policy.clamp.controlloop.ControlLoopElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      participant_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+  org.onap.policy.clamp.controlloop.ControlLoop:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        requred: false
+      elements:
+        type: list
+        required: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+  org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      dcae_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: false
+      dcae_blueprint:
+        type: onap.dcae.cloudify_blueprint
+        requred: false
+      consul_info:
+        type: list
+        required: false
+        entry_schema:
+          type: org.onap.datatypes.policy.clamp.controlloop.DCAEMicroserviceControlLoopElementConsulInfo
+  org.onap.policy.clamp.controlloop.PolicyControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      policy_type_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+      policy_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: false
+  org.onap.policy.clamp.controlloop.CDSControlLoopElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.controlloop.ControlLoopElement
+    properties:
+      cds_blueprint_id:
+        type: onap.datatypes.ToscaConceptIdentifier
+        requred: true
+topology_template:
+  inputs:
+    pmsh_monitoring_policy:
+      type: onap.datatypes.ToscaConceptIdentifier
+      description: The ID of the PMSH monitoring policy to use
+      default:
+        name: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+        version: 1.0.0
+    pmsh_operational_policy:
+      type: onap.datatypes.ToscaConceptIdentifier
+      description: The ID of the PMSH operational policy to use
+      default:
+        name: operational.apex.pmcontrol
+        version: 1.0.0
+  node_templates:
+    org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.policy.controlloop.PolicyControlLoopParticipant:
+      version: 2.3.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant:
+      version: 2.2.1
+      type: org.onap.policy.clamp.controlloop.Participant
+      type_version: 1.0.1
+      description: Participant for DCAE microservices
+      properties:
+        provider: ONAP
+    org.onap.domain.pmsh.PMSH_DCAEMicroservice:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.DCAEMicroserviceControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the DCAE microservice for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.dcae.controlloop.DCAEMicroserviceControlLoopParticipant
+          version: 2.3.4
+        dcae_blueprint:
+          tosca_definitions_version: cloudify_dsl_1_3
+          imports:
+          - https://www.getcloudify.org/spec/cloudify/4.5.5/types.yaml
+          - plugin:k8splugin?version=3.7.0
+          - plugin:pgaas?version=1.3.0
+          - plugin:clamppolicyplugin?version=1.1.0
+          inputs:
+            tag_version:
+              type: string
+              description: Docker image to be used
+              default: nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.pmsh:1.1.2
+            replicas:
+              type: integer
+              description: Number of instances
+              default: 1
+            operational_policy_name:
+              type: string
+              default: operational.apex.pmcontrol
+            control_loop_name:
+              type: string
+              default: pmsh-control-loop
+            pmsh_publish_topic_name:
+              type: string
+              default: unauthenticated.DCAE_CL_OUTPUT
+            policy_feedback_topic_name:
+              type: string
+              default: unauthenticated.PMSH_CL_INPUT
+            aai_notification_topic_name:
+              type: string
+              default: AAI-EVENT
+            publisher_client_role:
+              type: string
+              description: Client role to request secure access to topic
+              default: org.onap.dcae.pmPublisher
+            subscriber_client_role:
+              type: string
+              description: Client role to request secure access to topic
+              default: org.onap.dcae.pmSubscriber
+            dcae_location:
+              type: string
+              description: DCAE location for the subscriber, used to set up routing
+              default: san-francisco
+            cpu_limit:
+              type: string
+              default: 1000m
+            cpu_request:
+              type: string
+              default: 1000m
+            memory_limit:
+              type: string
+              default: 1024Mi
+            memory_request:
+              type: string
+              default: 1024Mi
+            pgaas_cluster_name:
+              type: string
+              default: dcae-pg-primary.onap
+            enable_tls:
+              type: boolean
+              default: true
+            protocol:
+              type: string
+              description: PMSH protocol. If enable_tls is false, set to http
+              default: https
+            policy_model_id:
+              type: string
+              default: onap.policies.monitoring.dcae-pm-subscription-handler
+            policy_id:
+              type: string
+              default: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+          node_templates:
+            pgaasvm:
+              type: dcae.nodes.pgaas.database
+              properties:
+                writerfqdn:
+                  get_input: pgaas_cluster_name
+                name: pmsh
+            pmsh:
+              type: dcae.nodes.ContainerizedServiceComponentUsingDmaap
+              interfaces:
+                cloudify.interfaces.lifecycle:
+                  create:
+                    inputs:
+                      ports:
+                      - '8443:0'
+                      envs:
+                        PMSH_PG_URL:
+                          get_attribute:
+                          - pgaasvm
+                          - admin
+                          - host
+                        PMSH_PG_PASSWORD:
+                          get_attribute:
+                          - pgaasvm
+                          - admin
+                          - password
+                        PMSH_PG_USERNAME:
+                          get_attribute:
+                          - pgaasvm
+                          - admin
+                          - user
+                        PMSH_DB_NAME:
+                          get_attribute:
+                          - pgaasvm
+                          - admin
+                          - database
+              relationships:
+              - target: pmsh-policy
+                type: cloudify.relationships.depends_on
+              properties:
+                service_component_type: dcae-pmsh
+                service_component_name_override: dcae-pmsh
+                application_config:
+                  enable_tls:
+                    get_input: enable_tls
+                  aaf_identity: dcae@dcae.onap.org
+                  aaf_password: demo123456!
+                  operational_policy_name:
+                    get_input: operational_policy_name
+                  control_loop_name:
+                    get_input: control_loop_name
+                  cert_path: /opt/app/pmsh/etc/certs/cert.pem
+                  key_path: /opt/app/pmsh/etc/certs/key.pem
+                  ca_cert_path: /opt/app/pmsh/etc/certs/cacert.pem
+                  streams_publishes:
+                    policy_pm_publisher:
+                      type: message_router
+                      dmaap_info:
+                        topic_url:
+                          concat:
+                          - http://message-router:3904/events/
+                          - get_input: pmsh_publish_topic_name
+                  streams_subscribes:
+                    policy_pm_subscriber:
+                      type: message_router
+                      dmaap_info:
+                        topic_url:
+                          concat:
+                          - http://message-router:3904/events/
+                          - get_input: policy_feedback_topic_name
+                    aai_subscriber:
+                      type: message_router
+                      dmaap_info:
+                        topic_url:
+                          concat:
+                          - http://message-router:3904/events/
+                          - get_input: aai_notification_topic_name
+                resource_config:
+                  limits:
+                    cpu:
+                      get_input: cpu_limit
+                    memory:
+                      get_input: memory_limit
+                  requests:
+                    cpu:
+                      get_input: cpu_request
+                    memory:
+                      get_input: memory_request
+                docker_config:
+                  healthcheck:
+                    endpoint: /healthcheck
+                    interval: 15s
+                    timeout: 1s
+                    type:
+                      get_input: protocol
+                image:
+                  get_input: tag_version
+                replicas:
+                  get_input: replicas
+                log_info:
+                  log_directory: /var/log/ONAP/dcaegen2/services/pmsh
+                tls_info:
+                  cert_directory: /opt/app/pmsh/etc/certs
+                  use_tls:
+                    get_input: enable_tls
+            pmsh-policy:
+              type: clamp.nodes.policy
+              properties:
+                policy_model_id:
+                  get_input: policy_model_id
+                policy_id:
+                  get_input: policy_id
+        consul_info:
+        - consulUrl: http://consul:31321/v1/kv/dcae-pmsh:policy
+          consulBody:
+            subscription:
+              subscriptionName: subscriptiona
+              administrativeState: UNLOCKED
+              fileBasedGP: 15
+              fileLocation: /pm/pm.xml
+              nfFilter:
+                nfNames:
+                - ^pnf1.*
+                modelInvariantIDs:
+                - 5845y423-g654-6fju-po78-8n53154532k6
+                - 7129e420-d396-4efb-af02-6b83499b12f8
+                modelVersionIDs:
+                - e80a6ae3-cafd-4d24-850d-e14c084a5ca9
+              measurementGroups:
+              - measurementGroup:
+                  measurementTypes:
+                  - measurementType: countera
+                  - measurementType: counterb
+                  managedObjectDNsBasic:
+                  - DN: dna
+                  - DN: dnb
+              - measurementGroup:
+                  measurementTypes:
+                  - measurementType: counterc
+                  - measurementType: counterd
+                  managedObjectDNsBasic:
+                  - DN: dnc
+                  - DN: dnd
+    org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the monitoring policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.3.1
+        policy_type_id:
+          name: onap.policies.monitoring.pm-subscription-handler
+          version: 1.0.0
+        policy_id:
+          get_input: pmsh_monitoring_policy
+    org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.PolicyControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for the operational policy for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_id:
+          name: org.onap.policy.controlloop.PolicyControlLoopParticipant
+          version: 2.2.1
+        policy_type_id:
+          name: onap.policies.operational.pm-subscription-handler
+          version: 1.0.0
+        policy_id:
+          get_input: pmsh_operational_policy
+    org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.CDSControlLoopElement
+      type_version: 1.0.0
+      description: Control loop element for CDS for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        participant_Id:
+          name: org.onap.ccsdk.cds.controlloop.CdsControlLoopParticipant
+          version: 3.2.1
+        cds_blueprint_id:
+          name: org.onap.ccsdk.cds.PMSHCdsBlueprint
+          version: 1.0.0
+    org.onap.domain.pmsh.PMSHControlLoopDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.controlloop.ControlLoop
+      type_version: 1.0.0
+      description: Control loop for Performance Management Subscription Handling
+      properties:
+        provider: Ericsson
+        elements:
+        - name: org.onap.domain.pmsh.PMSH_DCAEMicroservice
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_MonitoringPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_OperationalPolicyControlLoopElement
+          version: 1.2.3
+        - name: org.onap.domain.pmsh.PMSH_CDS_ControlLoopElement
+          version: 1.2.3
+  policies:
+  - MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test:
+      type: onap.policies.monitoring.dcae-pm-subscription-handler
+      type_version: 1.0.0
+      name: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+      version: 1.0.0
+      metadata:
+        policy-id: MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test
+        policy-version: 1.0.0
+      properties:
+        pmsh_policy:
+          fileBasedGP: 15
+          fileLocation: /pm/pm.xml
+          subscriptionName: subscriptiona
+          administrativeState: UNLOCKED
+          nfFilter:
+            onap.datatypes.monitoring.nfFilter:
+              modelVersionIDs:
+              - e80a6ae3-cafd-4d24-850d-e14c084a5ca9
+              modelInvariantIDs:
+              - 5845y423-g654-6fju-po78-8n53154532k6
+              - 7129e420-d396-4efb-af02-6b83499b12f8
+              modelNames: []
+              nfNames:
+              - '"^pnf1.*"'
+          measurementGroups:
+          - measurementGroup:
+              onap.datatypes.monitoring.measurementGroup:
+                measurementTypes:
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: countera
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: counterb
+                managedObjectDNsBasic:
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dna
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dnb
+          - measurementGroup:
+              onap.datatypes.monitoring.measurementGroup:
+                measurementTypes:
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: counterc
+                - measurementType:
+                    onap.datatypes.monitoring.measurementType:
+                      measurementType: counterd
+                managedObjectDNsBasic:
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dnc
+                - managedObjectDNsBasic:
+                    onap.datatypes.monitoring.managedObjectDNsBasic:
+                      DN: dnd
+  - operational.apex.pmcontrol:
+      type: onap.policies.controlloop.operational.Common.Apex
+      type_version: 1.0.0
+      version: 1.0.0
+      metadata:
+        policy-id: operational.apex.pmcontrol
+        policy-version: 1
+      properties:
+        engineServiceParameters:
+          name: MyApexEngine
+          version: 0.0.1
+          id: 45
+          instanceCount: 2
+          deploymentPort: 12561
+          policy_type_impl:
+            apexPolicyModel:
+              key:
+                name: PMControlPolicy
+                version: 0.0.1
+              keyInformation:
+                key:
+                  name: PMControlPolicy_KeyInfo
+                  version: 0.0.1
+                keyInfoMap:
+                  entry:
+                  - key:
+                      name: CDSActionIdentifiersType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSActionIdentifiersType
+                        version: 0.0.1
+                      UUID: 6e5fa19b-14df-37e3-a4ae-8c537e861a82
+                      description: Generated description for concept referred to by key "CDSActionIdentifiersType:0.0.1"
+                  - key:
+                      name: CDSCreateResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseEvent
+                        version: 0.0.1
+                      UUID: 14b29e38-ac75-3273-aa4e-8583c0aa7dad
+                      description: Generated description for concept referred to by key "CDSCreateResponseEvent:0.0.1"
+                  - key:
+                      name: CDSCreateResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponsePayloadType
+                        version: 0.0.1
+                      UUID: 04573f8f-e772-30a5-b1d9-d7318d4a1e13
+                      description: Generated description for concept referred to by key "CDSCreateResponsePayloadType:0.0.1"
+                  - key:
+                      name: CDSCreateResponsePolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponsePolicy
+                        version: 0.0.1
+                      UUID: e126c965-fc09-3bfe-8f55-70f380a4a49c
+                      description: Generated description for concept referred to by key "CDSCreateResponsePolicy:0.0.1"
+                  - key:
+                      name: CDSCreateResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseTask
+                        version: 0.0.1
+                      UUID: 6165ee82-afd2-3aab-a517-f00b3f2461d2
+                      description: Generated description for concept referred to by key "CDSCreateResponseTask:0.0.1"
+                  - key:
+                      name: CDSCreateSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionPayloadType
+                        version: 0.0.1
+                      UUID: 8350ac5e-c157-38b9-9614-a0f93a830e60
+                      description: Generated description for concept referred to by key "CDSCreateSubscriptionPayloadType:0.0.1"
+                  - key:
+                      name: CDSCreateSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionRequestEvent
+                        version: 0.0.1
+                      UUID: cfa325ba-226b-3a31-9183-ec43e2b6e9a2
+                      description: Generated description for concept referred to by key "CDSCreateSubscriptionRequestEvent:0.0.1"
+                  - key:
+                      name: CDSDeleteResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseEvent
+                        version: 0.0.1
+                      UUID: 8be9c0fa-7437-3841-aff2-b3cec6ae3bd8
+                      description: Generated description for concept referred to by key "CDSDeleteResponseEvent:0.0.1"
+                  - key:
+                      name: CDSDeleteResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponsePayloadType
+                        version: 0.0.1
+                      UUID: 3fbfe0c9-152e-34d3-a504-09cd13c058d0
+                      description: Generated description for concept referred to by key "CDSDeleteResponsePayloadType:0.0.1"
+                  - key:
+                      name: CDSDeleteResponsePolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponsePolicy
+                        version: 0.0.1
+                      UUID: a780251c-edd5-3132-b865-04313246b43c
+                      description: Generated description for concept referred to by key "CDSDeleteResponsePolicy:0.0.1"
+                  - key:
+                      name: CDSDeleteResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseTask
+                        version: 0.0.1
+                      UUID: afce4555-3aa3-3521-a7d8-ee8cdf0d3efc
+                      description: Generated description for concept referred to by key "CDSDeleteResponseTask:0.0.1"
+                  - key:
+                      name: CDSDeleteSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionPayloadType
+                        version: 0.0.1
+                      UUID: 12658406-9147-3c9d-a38c-5ad5e30b092b
+                      description: Generated description for concept referred to by key "CDSDeleteSubscriptionPayloadType:0.0.1"
+                  - key:
+                      name: CDSDeleteSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionRequestEvent
+                        version: 0.0.1
+                      UUID: 24380c95-9289-36e6-8cbf-0edefa15ccd9
+                      description: Generated description for concept referred to by key "CDSDeleteSubscriptionRequestEvent:0.0.1"
+                  - key:
+                      name: CDSRequestCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSRequestCommonHeaderType
+                        version: 0.0.1
+                      UUID: 35590ac0-062c-39f1-8786-b4ff716e30b1
+                      description: Generated description for concept referred to by key "CDSRequestCommonHeaderType:0.0.1"
+                  - key:
+                      name: CDSResponseCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseCommonHeaderType
+                        version: 0.0.1
+                      UUID: dd7e1805-885a-350b-aaf9-ed541321ae3c
+                      description: Generated description for concept referred to by key "CDSResponseCommonHeaderType:0.0.1"
+                  - key:
+                      name: CDSResponseStatusEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusEvent
+                        version: 0.0.1
+                      UUID: 7986e21b-32f7-302e-9554-31f21b673493
+                      description: Generated description for concept referred to by key "CDSResponseStatusEvent:0.0.1"
+                  - key:
+                      name: CDSResponseStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusType
+                        version: 0.0.1
+                      UUID: 92b8a2cf-344e-3ce1-8cc0-2b7d3cb695fa
+                      description: Generated description for concept referred to by key "CDSResponseStatusType:0.0.1"
+                  - key:
+                      name: CreateSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadEvent
+                        version: 0.0.1
+                      UUID: 92162397-1a8e-3a3f-a469-d2af7700af4a
+                      description: Generated description for concept referred to by key "CreateSubscriptionPayloadEvent:0.0.1"
+                  - key:
+                      name: CreateSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadTask
+                        version: 0.0.1
+                      UUID: bc0c69f0-52ed-38ea-b468-ae4a6fd1730d
+                      description: Generated description for concept referred to by key "CreateSubscriptionPayloadTask:0.0.1"
+                  - key:
+                      name: CreateSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionRequestTask
+                        version: 0.0.1
+                      UUID: 89cb75e9-f06c-30d3-b4ff-698d45f63869
+                      description: Generated description for concept referred to by key "CreateSubscriptionRequestTask:0.0.1"
+                  - key:
+                      name: DeleteSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadEvent
+                        version: 0.0.1
+                      UUID: 994fa441-04ab-33bb-832d-1cd12ab5d074
+                      description: Generated description for concept referred to by key "DeleteSubscriptionPayloadEvent:0.0.1"
+                  - key:
+                      name: DeleteSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadTask
+                        version: 0.0.1
+                      UUID: 0f519117-5fea-3e4b-941f-8f778100465f
+                      description: Generated description for concept referred to by key "DeleteSubscriptionPayloadTask:0.0.1"
+                  - key:
+                      name: DeleteSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionRequestTask
+                        version: 0.0.1
+                      UUID: acb772fe-d442-39e3-98f9-b1080caf4150
+                      description: Generated description for concept referred to by key "DeleteSubscriptionRequestTask:0.0.1"
+                  - key:
+                      name: MRResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: MRResponseEvent
+                        version: 0.0.1
+                      UUID: 13c747a3-6bae-3bcf-9c80-b152e01dc194
+                      description: Generated description for concept referred to by key "MRResponseEvent:0.0.1"
+                  - key:
+                      name: PMControlPolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy
+                        version: 0.0.1
+                      UUID: acf1e55c-7bc5-3bd5-975a-0ca54afcd8a4
+                      description: Generated description for concept referred to by key "PMControlPolicy:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Albums
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Albums
+                        version: 0.0.1
+                      UUID: b38ad204-c2c8-32f4-9b5a-dda0aeb0145b
+                      description: Generated description for concept referred to by key "PMControlPolicy_Albums:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Events
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Events
+                        version: 0.0.1
+                      UUID: be3871a0-c42a-3113-a066-82d192840eca
+                      description: Generated description for concept referred to by key "PMControlPolicy_Events:0.0.1"
+                  - key:
+                      name: PMControlPolicy_KeyInfo
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_KeyInfo
+                        version: 0.0.1
+                      UUID: ced37634-28a4-3178-b7f6-2980794927b0
+                      description: Generated description for concept referred to by key "PMControlPolicy_KeyInfo:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Policies
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Policies
+                        version: 0.0.1
+                      UUID: be3d180d-ef9c-3a75-8e9c-84271a038bed
+                      description: Generated description for concept referred to by key "PMControlPolicy_Policies:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Schemas
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Schemas
+                        version: 0.0.1
+                      UUID: e61973f1-189c-39e5-82f6-0d3afe298a20
+                      description: Generated description for concept referred to by key "PMControlPolicy_Schemas:0.0.1"
+                  - key:
+                      name: PMControlPolicy_Tasks
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMControlPolicy_Tasks
+                        version: 0.0.1
+                      UUID: 5658adb3-2962-30a3-a241-fae75bb8eb4a
+                      description: Generated description for concept referred to by key "PMControlPolicy_Tasks:0.0.1"
+                  - key:
+                      name: PMSubscriptionAlbum
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      UUID: c2bd6f0d-6854-317a-9be2-97c08338428c
+                      description: Generated description for concept referred to by key "PMSubscriptionAlbum:0.0.1"
+                  - key:
+                      name: PMSubscriptionOutputEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionOutputEvent
+                        version: 0.0.1
+                      UUID: 992b7819-9f69-3aa0-bb0f-6e45ea15ce05
+                      description: Generated description for concept referred to by key "PMSubscriptionOutputEvent:0.0.1"
+                  - key:
+                      name: PMSubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionType
+                        version: 0.0.1
+                      UUID: 73c1c397-4fc3-357f-93b6-a8ad707fbaae
+                      description: Generated description for concept referred to by key "PMSubscriptionType:0.0.1"
+                  - key:
+                      name: ReceiveEventPolicy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: ReceiveEventPolicy
+                        version: 0.0.1
+                      UUID: 568b7345-9de1-36d3-b6a3-9b857e6809a1
+                      description: Generated description for concept referred to by key "ReceiveEventPolicy:0.0.1"
+                  - key:
+                      name: ReceiveSubscriptionTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: ReceiveSubscriptionTask
+                        version: 0.0.1
+                      UUID: f596afc8-100c-35eb-92c8-352355ea457d
+                      description: Generated description for concept referred to by key "ReceiveSubscriptionTask:0.0.1"
+                  - key:
+                      name: SimpleIntType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleIntType
+                        version: 0.0.1
+                      UUID: 153791fd-ae0a-36a7-88a5-309a7936415d
+                      description: Generated description for concept referred to by key "SimpleIntType:0.0.1"
+                  - key:
+                      name: SimpleStringType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleStringType
+                        version: 0.0.1
+                      UUID: 8a4957cf-9493-3a76-8c22-a208e23259af
+                      description: Generated description for concept referred to by key "SimpleStringType:0.0.1"
+                  - key:
+                      name: SubscriptionStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionStatusType
+                        version: 0.0.1
+                      UUID: 597643b1-9db1-31ce-85d0-e1c63c43b30b
+                      description: Generated description for concept referred to by key "SubscriptionStatusType:0.0.1"
+                  - key:
+                      name: SubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionType
+                        version: 0.0.1
+                      UUID: 184547bb-7d64-3cb2-a273-d7185102c5ce
+                      description: Generated description for concept referred to by key "SubscriptionType:0.0.1"
+                  - key:
+                      name: UUIDType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: UUIDType
+                        version: 0.0.1
+                      UUID: 6a8cc68e-dfc8-3403-9c6d-071c886b319c
+                      description: Generated description for concept referred to by key "UUIDType:0.0.1"
+                  - key:
+                      name: pmsh-operational-policy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: pmsh-operational-policy
+                        version: 0.0.1
+                      UUID: fdf2c9ff-6422-3ea6-b6b6-49b12116265d
+                      description: Generated description for concept referred to by key "pmsh-operational-policy:0.0.1"
+              policies:
+                key:
+                  name: PMControlPolicy_Policies
+                  version: 0.0.1
+                policyMap:
+                  entry:
+                  - key:
+                      name: CDSCreateResponsePolicy
+                      version: 0.0.1
+                    value:
+                      policyKey:
+                        name: CDSCreateResponsePolicy
+                        version: 0.0.1
+                      template: Freestyle
+                      state:
+                        entry:
+                        - key: CDSCreateResponseState
+                          value:
+                            stateKey:
+                              parentKeyName: CDSCreateResponsePolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CDSCreateResponseState
+                            trigger:
+                              name: CDSCreateResponseEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: ResponseOutput
+                                value:
+                                  key:
+                                    parentKeyName: CDSCreateResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSCreateResponseState
+                                    localName: ResponseOutput
+                                  outgoingEvent:
+                                    name: CDSResponseStatusEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference: []
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CDSCreateResponseTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CDSCreateResponseTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: CDSCreateResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSCreateResponseState
+                                    localName: CDSCreateResponsePolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: CDSCreateResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSCreateResponseState
+                                    localName: ResponseOutput
+                      firstState: CDSCreateResponseState
+                  - key:
+                      name: CDSDeleteResponsePolicy
+                      version: 0.0.1
+                    value:
+                      policyKey:
+                        name: CDSDeleteResponsePolicy
+                        version: 0.0.1
+                      template: Freestyle
+                      state:
+                        entry:
+                        - key: CDSDeleteResponseState
+                          value:
+                            stateKey:
+                              parentKeyName: CDSDeleteResponsePolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CDSDeleteResponseState
+                            trigger:
+                              name: CDSDeleteResponseEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: ResponseOutput
+                                value:
+                                  key:
+                                    parentKeyName: CDSDeleteResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSDeleteResponseState
+                                    localName: ResponseOutput
+                                  outgoingEvent:
+                                    name: CDSResponseStatusEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference: []
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CDSDeleteResponseTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CDSDeleteResponseTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: CDSDeleteResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSDeleteResponseState
+                                    localName: CDSDeleteResponsePolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: CDSDeleteResponsePolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CDSDeleteResponseState
+                                    localName: ResponseOutput
+                      firstState: CDSDeleteResponseState
+                  - key:
+                      name: ReceiveEventPolicy
+                      version: 0.0.1
+                    value:
+                      policyKey:
+                        name: ReceiveEventPolicy
+                        version: 0.0.1
+                      template: Freestyle
+                      state:
+                        entry:
+                        - key: CreateOrDeleteState
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CreateOrDeleteState
+                            trigger:
+                              name: PMSubscriptionOutputEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: CreateSubscriptionPayload
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: CreateSubscriptionPayload
+                                  outgoingEvent:
+                                    name: CreateSubscriptionPayloadEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: CreateSubscription
+                              - key: DeleteSubscriptionPayload
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: DeleteSubscriptionPayload
+                                  outgoingEvent:
+                                    name: DeleteSubscriptionPayloadEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: DeleteSubscription
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: TaskSelectionLogic
+                              logicFlavour: JAVASCRIPT
+                              logic: |-
+                                /*
+                                 * ============LICENSE_START=======================================================
+                                 *  Copyright (C) 2020 Nordix. 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.
+                                 *
+                                 * SPDX-License-Identifier: Apache-2.0
+                                 * ============LICENSE_END=========================================================
+                                 */
+                                executor.logger.info(executor.subject.id);
+                                var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+                                var changeType = pmSubscriptionInfo.get("changeType").toString()
+                                executor.logger.info("Change Type is " + changeType)
+                                if ("CREATE".equals(changeType)) {
+                                    executor.logger.info("Choosing to create a subscription")
+                                    executor.subject.getTaskKey("CreateSubscriptionPayloadTask").copyTo(executor.selectedTask);
+                                }
+                                else if ("DELETE".equals(changeType)) {
+                                    executor.logger.info("Choosing to delete a subscription")
+                                    executor.subject.getTaskKey("DeleteSubscriptionPayloadTask").copyTo(executor.selectedTask);
+                                }
+                                //var returnValue = executor.isTrue;
+                                true;
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CreateSubscriptionPayloadTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CreateSubscriptionPayloadTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: CreateSubscriptionPayload
+                              - key:
+                                  name: DeleteSubscriptionPayloadTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateOrDeleteState
+                                    localName: DeleteSubscriptionPayload
+                        - key: CreateSubscription
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: CreateSubscription
+                            trigger:
+                              name: CreateSubscriptionPayloadEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: IssueCreateSubscriptionRequestOutput
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateSubscription
+                                    localName: IssueCreateSubscriptionRequestOutput
+                                  outgoingEvent:
+                                    name: CDSCreateSubscriptionRequestEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: CreateSubscriptionRequestTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: CreateSubscriptionRequestTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateSubscription
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: CreateSubscription
+                                    localName: IssueCreateSubscriptionRequestOutput
+                        - key: DeleteSubscription
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: DeleteSubscription
+                            trigger:
+                              name: DeleteSubscriptionPayloadEvent
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: IssueDeleteSubscriptionRequestOutput
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: DeleteSubscription
+                                    localName: IssueDeleteSubscriptionRequestOutput
+                                  outgoingEvent:
+                                    name: CDSDeleteSubscriptionRequestEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: 'NULL'
+                                    parentKeyVersion: 0.0.0
+                                    parentLocalName: 'NULL'
+                                    localName: 'NULL'
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: DeleteSubscriptionRequestTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: DeleteSubscriptionRequestTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: DeleteSubscription
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: DeleteSubscription
+                                    localName: IssueDeleteSubscriptionRequestOutput
+                        - key: ReceiveSubscriptionState
+                          value:
+                            stateKey:
+                              parentKeyName: ReceiveEventPolicy
+                              parentKeyVersion: 0.0.1
+                              parentLocalName: 'NULL'
+                              localName: ReceiveSubscriptionState
+                            trigger:
+                              name: pmsh-operational-policy
+                              version: 0.0.1
+                            stateOutputs:
+                              entry:
+                              - key: ReceivePMSubscriptionOutput
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: ReceiveSubscriptionState
+                                    localName: ReceivePMSubscriptionOutput
+                                  outgoingEvent:
+                                    name: PMSubscriptionOutputEvent
+                                    version: 0.0.1
+                                  nextState:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: 'NULL'
+                                    localName: CreateOrDeleteState
+                            contextAlbumReference:
+                            - name: PMSubscriptionAlbum
+                              version: 0.0.1
+                            taskSelectionLogic:
+                              key: 'NULL'
+                              logicFlavour: UNDEFINED
+                              logic: ''
+                            stateFinalizerLogicMap:
+                              entry: []
+                            defaultTask:
+                              name: ReceiveSubscriptionTask
+                              version: 0.0.1
+                            taskReferences:
+                              entry:
+                              - key:
+                                  name: ReceiveSubscriptionTask
+                                  version: 0.0.1
+                                value:
+                                  key:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: ReceiveSubscriptionState
+                                    localName: ReceiveEventPolicy
+                                  outputType: DIRECT
+                                  output:
+                                    parentKeyName: ReceiveEventPolicy
+                                    parentKeyVersion: 0.0.1
+                                    parentLocalName: ReceiveSubscriptionState
+                                    localName: ReceivePMSubscriptionOutput
+                      firstState: ReceiveSubscriptionState
+              tasks:
+                key:
+                  name: PMControlPolicy_Tasks
+                  version: 0.0.1
+                taskMap:
+                  entry:
+                  - key:
+                      name: CDSCreateResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: SubscriptionStatusType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. 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.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+                          executor.logger.info(executor.subject.id);
+                          var commonHeader = executor.inFields.get("commonHeader")
+                          var response = executor.inFields.get("payload")
+                          var albumID = commonHeader.get("requestId")
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(albumID.toString());
+                          var responseStatus = executor.subject.getOutFieldSchemaHelper("status").createNewInstance();
+                          responseStatus.put("subscriptionName", pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          responseStatus.put("nfName", pmSubscriptionInfo.get("nfName"))
+                          responseStatus.put("changeType", pmSubscriptionInfo.get("changeType"))
+                          var status = response.get(pmSubscriptionInfo.get("changeType").toLowerCase() + "_DasH_subscription_DasH_response").get("odl_DasH_response").get("status")
+                          executor.logger.info("RESPONSE STATUS = " + status)
+                          if(status == "success") {
+                              responseStatus.put("message", "success")
+                          } else {
+                              responseStatus.put("message", "failed")
+                          }
+                          executor.outFields.put("status", responseStatus)
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: CDSDeleteResponseTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: SubscriptionStatusType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. 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.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+                          executor.logger.info(executor.subject.id);
+                          var commonHeader = executor.inFields.get("commonHeader")
+                          var response = executor.inFields.get("payload")
+                          var albumID = commonHeader.get("requestId")
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(albumID.toString());
+                          var responseStatus = executor.subject.getOutFieldSchemaHelper("status").createNewInstance();
+                          responseStatus.put("subscriptionName", pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          responseStatus.put("nfName", pmSubscriptionInfo.get("nfName"))
+                          responseStatus.put("changeType", pmSubscriptionInfo.get("changeType"))
+                          var status = response.get(pmSubscriptionInfo.get("changeType").toLowerCase() + "_DasH_subscription_DasH_response").get("odl_DasH_response").get("status")
+                          executor.logger.info("RESPONSE STATUS = " + status)
+                          if(status == "success") {
+                              responseStatus.put("message", "success")
+                          } else {
+                              responseStatus.put("message", "failed")
+                          }
+                          executor.outFields.put("status", responseStatus)
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: CreateSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. 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.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+                          executor.logger.info(executor.subject.id);
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+                          var payloadProperties = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance(changeType + "_DasH_subscription_DasH_properties_record");
+                          payloadProperties.put("nfName",  pmSubscriptionInfo.get("nfName"))
+                          payloadProperties.put("subscriptionName",  pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          payloadProperties.put("administrativeState", pmSubscriptionInfo.get("subscription").get("administrativeState"))
+                          payloadProperties.put("fileBasedGP",  pmSubscriptionInfo.get("subscription").get("fileBasedGP").toString())
+                          payloadProperties.put("fileLocation", pmSubscriptionInfo.get("subscription").get("fileLocation"))
+                          payloadProperties.put("measurementGroups", pmSubscriptionInfo.get("subscription").get("measurementGroups"))
+                          var payloadEntry = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance("CDSRequestPayloadEntry");
+                          payloadEntry.put(changeType + "_DasH_subscription_DasH_properties", payloadProperties)
+                          var payload = executor.subject.getOutFieldSchemaHelper("payload").createNewInstance();
+                          payload.put(changeType + "_DasH_subscription_DasH_request", payloadEntry);
+                          executor.outFields.put("albumID", executor.inFields.get("albumID"))
+                          executor.outFields.put("payload", payload);
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: CreateSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionRequestTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. 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.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+                          executor.logger.info(executor.subject.id);
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+                          var blueprintName = pmSubscriptionInfo.get("blueprintName").toLowerCase()
+                          var blueprintVersion = pmSubscriptionInfo.get("blueprintVersion").toLowerCase()
+                          var payload = executor.inFields.get("payload")
+                          var actionName = changeType + "-subscription"
+                          var commonHeader = executor.subject.getOutFieldSchemaHelper("commonHeader").createNewInstance();
+                          commonHeader.put("originatorId", "sdnc");
+                          commonHeader.put("requestId", executor.inFields.get("albumID").toString());
+                          commonHeader.put("subRequestId", "sub-123456-1000");
+                          var actionIdentifiers = executor.subject.getOutFieldSchemaHelper("actionIdentifiers").createNewInstance();
+                          actionIdentifiers.put("actionName", actionName);
+                          actionIdentifiers.put("blueprintName", blueprintName);
+                          actionIdentifiers.put("blueprintVersion", blueprintVersion);
+                          actionIdentifiers.put("mode", "sync");
+                          executor.outFields.put("commonHeader", commonHeader);
+                          executor.outFields.put("actionIdentifiers", actionIdentifiers);
+                          executor.outFields.put("payload", payload);
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: DeleteSubscriptionPayloadTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. 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.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+                          executor.logger.info(executor.subject.id);
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+                          var payloadProperties = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance(changeType + "_DasH_subscription_DasH_properties_record");
+                          payloadProperties.put("nfName",  pmSubscriptionInfo.get("nfName"))
+                          payloadProperties.put("subscriptionName",  pmSubscriptionInfo.get("subscription").get("subscriptionName"))
+                          payloadProperties.put("administrativeState", pmSubscriptionInfo.get("subscription").get("administrativeState"))
+                          payloadProperties.put("fileBasedGP",  pmSubscriptionInfo.get("subscription").get("fileBasedGP").toString())
+                          payloadProperties.put("fileLocation", pmSubscriptionInfo.get("subscription").get("fileLocation"))
+                          payloadProperties.put("measurementGroups", pmSubscriptionInfo.get("subscription").get("measurementGroups"))
+                          var payloadEntry = executor.subject.getOutFieldSchemaHelper("payload").createNewSubInstance("CDSRequestPayloadEntry");
+                          payloadEntry.put(changeType + "_DasH_subscription_DasH_properties", payloadProperties)
+                          var payload = executor.subject.getOutFieldSchemaHelper("payload").createNewInstance();
+                          payload.put(changeType + "_DasH_subscription_DasH_request", payloadEntry);
+                          executor.outFields.put("albumID", executor.inFields.get("albumID"))
+                          executor.outFields.put("payload", payload);
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: DeleteSubscriptionRequestTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionRequestTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. 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.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+                          executor.logger.info(executor.subject.id);
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").get(executor.inFields.get("albumID").toString())
+                          var changeType = pmSubscriptionInfo.get("changeType").toLowerCase()
+                          var blueprintName = pmSubscriptionInfo.get("blueprintName").toLowerCase()
+                          var blueprintVersion = pmSubscriptionInfo.get("blueprintVersion").toLowerCase()
+                          var payload = executor.inFields.get("payload")
+                          var actionName = changeType + "-subscription"
+                          var commonHeader = executor.subject.getOutFieldSchemaHelper("commonHeader").createNewInstance();
+                          commonHeader.put("originatorId", "sdnc");
+                          commonHeader.put("requestId", executor.inFields.get("albumID").toString());
+                          commonHeader.put("subRequestId", "sub-123456-1000");
+                          var actionIdentifiers = executor.subject.getOutFieldSchemaHelper("actionIdentifiers").createNewInstance();
+                          actionIdentifiers.put("actionName", actionName);
+                          actionIdentifiers.put("blueprintName", blueprintName);
+                          actionIdentifiers.put("blueprintVersion", blueprintVersion);
+                          actionIdentifiers.put("mode", "sync");
+                          executor.outFields.put("commonHeader", commonHeader);
+                          executor.outFields.put("actionIdentifiers", actionIdentifiers);
+                          executor.outFields.put("payload", payload);
+                          //var returnValue = executor.isTrue;
+                          true;
+                  - key:
+                      name: ReceiveSubscriptionTask
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: ReceiveSubscriptionTask
+                        version: 0.0.1
+                      inputFields:
+                        entry:
+                        - key: blueprintName
+                          value:
+                            key: blueprintName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: blueprintVersion
+                          value:
+                            key: blueprintVersion
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: changeType
+                          value:
+                            key: changeType
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: closedLoopControlName
+                          value:
+                            key: closedLoopControlName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: nfName
+                          value:
+                            key: nfName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: policyName
+                          value:
+                            key: policyName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: subscription
+                          value:
+                            key: subscription
+                            fieldSchemaKey:
+                              name: SubscriptionType
+                              version: 0.0.1
+                            optional: false
+                      outputFields:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                      taskParameters:
+                        entry: []
+                      contextAlbumReference:
+                      - name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      taskLogic:
+                        key: TaskLogic
+                        logicFlavour: JAVASCRIPT
+                        logic: |-
+                          /*
+                           * ============LICENSE_START=======================================================
+                           *  Copyright (C) 2020 Nordix. 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.
+                           *
+                           * SPDX-License-Identifier: Apache-2.0
+                           * ============LICENSE_END=========================================================
+                           */
+                          var uuidType = java.util.UUID;
+                          executor.logger.info(executor.subject.id);
+                          //albumID will be used to fetch info from our album later
+                          var albumID = uuidType.randomUUID();
+                          var pmSubscriptionInfo = executor.getContextAlbum("PMSubscriptionAlbum").getSchemaHelper().createNewInstance();
+                          var returnValue = true;
+                          if(executor.inFields.get("policyName") != null) {
+                              executor.logger.info("nfName in receive sub event " + executor.inFields.get("nfName"));
+                              var changeType = executor.inFields.get("changeType")
+                              var nfName = executor.inFields.get("nfName")
+                              var policyName = executor.inFields.get("policyName")
+                              var closedLoopControlName = executor.inFields.get("closedLoopControlName")
+                              var subscription = executor.inFields.get("subscription")
+                              var blueprintName = executor.inFields.get("blueprintName")
+                              var blueprintVersion = executor.inFields.get("blueprintVersion")
+                              pmSubscriptionInfo.put("nfName", executor.inFields.get("nfName"));
+                              pmSubscriptionInfo.put("changeType", executor.inFields.get("changeType"))
+                              pmSubscriptionInfo.put("policyName", executor.inFields.get("policyName"))
+                              pmSubscriptionInfo.put("closedLoopControlName", executor.inFields.get("closedLoopControlName"))
+                              pmSubscriptionInfo.put("subscription", subscription)
+                              pmSubscriptionInfo.put("blueprintName", blueprintName)
+                              pmSubscriptionInfo.put("blueprintVersion", blueprintVersion)
+                              executor.getContextAlbum("PMSubscriptionAlbum").put(albumID.toString(), pmSubscriptionInfo);
+                              executor.outFields.put("albumID", albumID)
+                          } else {
+                              executor.message = "Received invalid event"
+                              returnValue = false;
+                          }
+                          returnValue;
+              events:
+                key:
+                  name: PMControlPolicy_Events
+                  version: 0.0.1
+                eventMap:
+                  entry:
+                  - key:
+                      name: CDSCreateResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponseEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: CDS
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSCreateSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionRequestEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSDeleteResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponseEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: CDS
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSResponseCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteResponsePayloadType
+                              version: 0.0.1
+                            optional: false
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: CDSResponseStatusType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSDeleteSubscriptionRequestEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionRequestEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: actionIdentifiers
+                          value:
+                            key: actionIdentifiers
+                            fieldSchemaKey:
+                              name: CDSActionIdentifiersType
+                              version: 0.0.1
+                            optional: false
+                        - key: commonHeader
+                          value:
+                            key: commonHeader
+                            fieldSchemaKey:
+                              name: CDSRequestCommonHeaderType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CDSResponseStatusEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: DCAE
+                      parameter:
+                        entry:
+                        - key: status
+                          value:
+                            key: status
+                            fieldSchemaKey:
+                              name: SubscriptionStatusType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: CreateSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CreateSubscriptionPayloadEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSCreateSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: DeleteSubscriptionPayloadEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: DeleteSubscriptionPayloadEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                        - key: payload
+                          value:
+                            key: payload
+                            fieldSchemaKey:
+                              name: CDSDeleteSubscriptionPayloadType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: MRResponseEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: MRResponseEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: DCAE
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: count
+                          value:
+                            key: count
+                            fieldSchemaKey:
+                              name: SimpleIntType
+                              version: 0.0.1
+                            optional: false
+                        - key: serverTimeMs
+                          value:
+                            key: serverTimeMs
+                            fieldSchemaKey:
+                              name: SimpleIntType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: PMSubscriptionOutputEvent
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionOutputEvent
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: APEX
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: albumID
+                          value:
+                            key: albumID
+                            fieldSchemaKey:
+                              name: UUIDType
+                              version: 0.0.1
+                            optional: false
+                  - key:
+                      name: pmsh-operational-policy
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: pmsh-operational-policy
+                        version: 0.0.1
+                      nameSpace: org.onap.policy.apex.onap.pmcontrol
+                      source: DCAE
+                      target: APEX
+                      parameter:
+                        entry:
+                        - key: blueprintName
+                          value:
+                            key: blueprintName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: blueprintVersion
+                          value:
+                            key: blueprintVersion
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: changeType
+                          value:
+                            key: changeType
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: closedLoopControlName
+                          value:
+                            key: closedLoopControlName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: nfName
+                          value:
+                            key: nfName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: policyName
+                          value:
+                            key: policyName
+                            fieldSchemaKey:
+                              name: SimpleStringType
+                              version: 0.0.1
+                            optional: false
+                        - key: subscription
+                          value:
+                            key: subscription
+                            fieldSchemaKey:
+                              name: SubscriptionType
+                              version: 0.0.1
+                            optional: false
+              albums:
+                key:
+                  name: PMControlPolicy_Albums
+                  version: 0.0.1
+                albums:
+                  entry:
+                  - key:
+                      name: PMSubscriptionAlbum
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionAlbum
+                        version: 0.0.1
+                      scope: policy
+                      isWritable: true
+                      itemSchema:
+                        name: PMSubscriptionType
+                        version: 0.0.1
+              schemas:
+                key:
+                  name: PMControlPolicy_Schemas
+                  version: 0.0.1
+                schemas:
+                  entry:
+                  - key:
+                      name: CDSActionIdentifiersType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSActionIdentifiersType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ActionIdentifiers_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "actionName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "blueprintName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "blueprintVersion",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "mode",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: CDSCreateResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateResponsePayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "name": "CreateResponsePayloadEntry",
+                          "type": "record",
+                          "namespace": "org.onap.policy.apex.onap.helloworld",
+                          "fields": [
+                            {
+                              "name": "create_DasH_subscription_DasH_response",
+                              "type": {
+                                "name": "create_DasH_subscription_DasH_response",
+                                "type": "record",
+                                "fields": [
+                                  {
+                                    "name": "odl_DasH_response",
+                                    "type": {
+                                      "name": "odl_DasH_response",
+                                      "type": "record",
+                                      "fields": [
+                                          {
+                                            "name": "status",
+                                            "type": "string"
+                                          }
+                                      ]
+                                    }
+                                  }
+                                ]
+                              }
+                            }
+                          ]
+                        }
+                  - key:
+                      name: CDSCreateSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSCreateSubscriptionPayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "type": "map",
+                          "values": {
+                            "type": "record",
+                            "name": "CDSRequestPayloadEntry",
+                            "fields": [
+                              {
+                                "name": "create_DasH_subscription_DasH_properties",
+                                "type": {
+                                  "name": "create_DasH_subscription_DasH_properties_record",
+                                  "type": "record",
+                                  "fields": [
+                                    {
+                                      "name": "nfName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "subscriptionName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "administrativeState",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileBasedGP",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileLocation",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "measurementGroups",
+                                      "type": {
+                                        "type": "array",
+                                        "items": {
+                                          "name": "measurementGroups_record",
+                                          "type": "record",
+                                          "fields": [
+                                            {
+                                              "name": "measurementGroup",
+                                              "type": {
+                                                "name": "measurementGroup",
+                                                "type": "record",
+                                                "fields": [
+                                                  {
+                                                    "name": "measurementTypes",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "measurementTypes_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "measurementType",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  },
+                                                  {
+                                                    "name": "managedObjectDNsBasic",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "managedObjectDNsBasic_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "DN",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  }
+                                                ]
+                                              }
+                                            }
+                                          ]
+                                        }
+                                      }
+                                    }
+                                  ]
+                                }
+                              }
+                            ]
+                          }
+                        }
+                  - key:
+                      name: CDSDeleteResponsePayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteResponsePayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "name": "DeleteResponsePayloadEntry",
+                          "type": "record",
+                          "namespace": "com.acme.avro",
+                          "fields": [
+                            {
+                              "name": "delete_DasH_subscription_DasH_response",
+                              "type": {
+                                "name": "delete_DasH_subscription_DasH_response",
+                                "type": "record",
+                                "fields": [
+                                  {
+                                    "name": "odl_DasH_response",
+                                    "type": {
+                                      "name": "odl_DasH_response",
+                                      "type": "record",
+                                      "fields": [
+                                          {
+                                            "name": "status",
+                                            "type": "string"
+                                          }
+                                      ]
+                                    }
+                                  }
+                                ]
+                              }
+                            }
+                          ]
+                        }
+                  - key:
+                      name: CDSDeleteSubscriptionPayloadType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSDeleteSubscriptionPayloadType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                          "type": "map",
+                          "values": {
+                            "type": "record",
+                            "name": "CDSRequestPayloadEntry",
+                            "fields": [
+                              {
+                                "name": "delete_DasH_subscription_DasH_properties",
+                                "type": {
+                                  "name": "delete_DasH_subscription_DasH_properties_record",
+                                  "type": "record",
+                                  "fields": [
+                                    {
+                                      "name": "nfName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "subscriptionName",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "administrativeState",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileBasedGP",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "fileLocation",
+                                      "type": "string"
+                                    },
+                                    {
+                                      "name": "measurementGroups",
+                                      "type": {
+                                        "type": "array",
+                                        "items": {
+                                          "name": "measurementGroups_record",
+                                          "type": "record",
+                                          "fields": [
+                                            {
+                                              "name": "measurementGroup",
+                                              "type": {
+                                                "name": "measurementGroup",
+                                                "type": "record",
+                                                "fields": [
+                                                  {
+                                                    "name": "measurementTypes",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "measurementTypes_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "measurementType",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  },
+                                                  {
+                                                    "name": "managedObjectDNsBasic",
+                                                    "type": {
+                                                      "type": "array",
+                                                      "items": {
+                                                        "name": "managedObjectDNsBasic_record",
+                                                        "type": "record",
+                                                        "fields": [
+                                                          {
+                                                            "name": "DN",
+                                                            "type": "string"
+                                                          }
+                                                        ]
+                                                      }
+                                                    }
+                                                  }
+                                                ]
+                                              }
+                                            }
+                                          ]
+                                        }
+                                      }
+                                    }
+                                  ]
+                                }
+                              }
+                            ]
+                          }
+                        }
+                  - key:
+                      name: CDSRequestCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSRequestCommonHeaderType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "RequestCommonHeader_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "originatorId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "requestId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "subRequestId",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: CDSResponseCommonHeaderType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseCommonHeaderType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ResponseCommonHeader_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "originatorId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "requestId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "subRequestId",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "timestamp",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "flags",
+                                    "type": ["null", "string"]
+                                }
+                            ]
+                        }
+                  - key:
+                      name: CDSResponseStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: CDSResponseStatusType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ResponseStatus_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "code",
+                                    "type": "int"
+                                },
+                                {
+                                    "name": "eventType",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "timestamp",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "message",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: PMSubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: PMSubscriptionType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: "{\n\t\"name\": \"PMSubscription\",\n\t\"type\": \"record\",\n\t\"namespace\": \"\
+                        org.onap.policy.apex.onap.pmcontrol\",\n\t\"fields\": [\n        {\n            \"name\": \"nfName\"\
+                        ,\n            \"type\": \"string\"\n        },\n\t    {\n\t\t\t\"name\": \"changeType\",\n\t\t\t\"\
+                        type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"closedLoopControlName\",\n\t\t\t\"type\": \"\
+                        string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"policyName\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\
+                        {\n\t\t    \"name\": \"blueprintName\",\n\t\t    \"type\": \"string\"\n\t\t},\n\t\t{\n\t\t    \"name\"\
+                        : \"blueprintVersion\",\n\t\t    \"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"subscription\"\
+                        ,\n\t\t\t\"type\": {\n\t\t\t\t\"name\": \"subscription\",\n\t\t\t\t\"type\": \"record\",\n\t\t\t\t\
+                        \"fields\": [{\n\t\t\t\t\t\t\"name\": \"subscriptionName\",\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\
+                        \t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"administrativeState\",\n\t\t\t\t\t\t\"type\": \"string\"\
+                        \n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"fileBasedGP\",\n\t\t\t\t\t\t\"type\": \"int\"\
+                        \n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"fileLocation\",\n\t\t\t\t\t\t\"type\": \"string\"\
+                        \n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"measurementGroups\",\n\t\t\t\t\t\t\"type\": {\n\
+                        \t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\"name\": \"Measurement_Groups_Type\"\
+                        ,\n\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\"name\"\
+                        : \"measurementGroup\",\n\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\"name\": \"Measurement_Group_Type\"\
+                        ,\n\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\
+                        \t\t\t\t\"name\": \"measurementTypes\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\
+                        \t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"\
+                        name\": \"Measurement_Types_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\
+                        \t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"measurementType\",\n\t\
+                        \t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\
+                        \t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\
+                        \t\t\t\t\t\t\t\t\"name\": \"managedObjectDNsBasic\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\
+                        \t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\
+                        \t\t\t\t\t\"name\": \"Managed_Object_Dns_Basic_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\"\
+                        ,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"DN\",\n\t\
+                        \t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\
+                        \t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\
+                        \t\t\t\t}\n\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\
+                        \t}\n\t]\n}"
+                  - key:
+                      name: SimpleIntType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleIntType
+                        version: 0.0.1
+                      schemaFlavour: Java
+                      schemaDefinition: java.lang.Integer
+                  - key:
+                      name: SimpleStringType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SimpleStringType
+                        version: 0.0.1
+                      schemaFlavour: Java
+                      schemaDefinition: java.lang.String
+                  - key:
+                      name: SubscriptionStatusType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionStatusType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: |-
+                        {
+                            "type": "record",
+                            "name": "ActivateSubscriptionStatus_Type",
+                            "namespace": "org.onap.policy.apex.onap.helloworld",
+                            "fields": [
+                                {
+                                    "name": "subscriptionName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "nfName",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "changeType",
+                                    "type": "string"
+                                },
+                                {
+                                    "name": "message",
+                                    "type": "string"
+                                }
+                            ]
+                        }
+                  - key:
+                      name: SubscriptionType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: SubscriptionType
+                        version: 0.0.1
+                      schemaFlavour: Avro
+                      schemaDefinition: "{\n\t\"name\": \"subscription\",\n\t\"type\": \"record\",\n\t\"fields\": [{\n\t\t\
+                        \t\"name\": \"subscriptionName\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"administrativeState\"\
+                        ,\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fileBasedGP\",\n\t\t\t\"type\": \"\
+                        int\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"fileLocation\",\n\t\t\t\"type\": \"string\"\n\t\t},\n\t\t\
+                        {\n\t\t\t\"name\": \"measurementGroups\",\n\t\t\t\"type\": {\n\t\t\t\t\"type\": \"array\",\n\t\t\t\
+                        \t\"items\": {\n\t\t\t\t\t\"name\": \"Measurement_Groups_Type\",\n\t\t\t\t\t\"type\": \"record\",\n\
+                        \t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\"name\": \"measurementGroup\",\n\t\t\t\t\t\t\"type\": {\n\t\
+                        \t\t\t\t\t\t\"name\": \"Measurement_Group_Type\",\n\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\
+                        \t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\"name\": \"measurementTypes\",\n\t\t\t\t\t\t\t\t\t\"type\"\
+                        : {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\t\t\
+                        \t\t\"name\": \"Measurement_Types_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\"type\": \"record\",\n\t\t\t\t\t\
+                        \t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"measurementType\",\n\t\t\t\t\t\t\t\
+                        \t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\
+                        }\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"name\": \"managedObjectDNsBasic\",\n\
+                        \t\t\t\t\t\t\t\t\t\"type\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\t\t\t\t\"items\"\
+                        : {\n\t\t\t\t\t\t\t\t\t\t\t\"name\": \"Managed_Object_Dns_Basic_Type\",\n\t\t\t\t\t\t\t\t\t\t\t\"\
+                        type\": \"record\",\n\t\t\t\t\t\t\t\t\t\t\t\"fields\": [{\n\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"DN\"\
+                        ,\n\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t\t\t}\n\
+                        \t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\
+                        \t\t}\n\t\t}\n\t]\n}"
+                  - key:
+                      name: UUIDType
+                      version: 0.0.1
+                    value:
+                      key:
+                        name: UUIDType
+                        version: 0.0.1
+                      schemaFlavour: Java
+                      schemaDefinition: java.util.UUID
+          engineParameters:
+            executorParameters:
+              JAVASCRIPT:
+                parameterClassName: org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters
+            contextParameters:
+              parameterClassName: org.onap.policy.apex.context.parameters.ContextParameters
+              schemaParameters:
+                Avro:
+                  parameterClassName: org.onap.policy.apex.plugins.context.schema.avro.AvroSchemaHelperParameters
+                Java:
+                  parameterClassName: org.onap.policy.apex.context.impl.schema.java.JavaSchemaHelperParameters
+                  jsonAdapters:
+                    Instant:
+                      adaptedClass: java.time.Instant
+                      adaptorClass: org.onap.policy.controlloop.util.Serialization$GsonInstantAdapter
+        eventInputParameters:
+          DCAEConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTCLIENT
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restclient.RestClientCarrierTechnologyParameters
+              parameters:
+                consumerPollTime: '50'
+                url: https://message-router:3905/events/unauthenticated.DCAE_CL_OUTPUT/cg1/sg1
+            eventProtocolParameters:
+              eventProtocol: JSON
+              parameters:
+                nameAlias: policyName
+            eventName: pmsh-operational-policy
+            eventNameFilter: pmsh-operational-policy
+          CDSRequestConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+              parameters:
+                url: http://10.10.10.184:30254/api/v1/execution-service/process
+                httpMethod: POST
+                restRequestTimeout: 2000
+                httpHeaders:
+                - - Authorization
+                  - Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventName: CDSCreateResponseEvent
+            eventNameFilter: CDSCreateResponseEvent
+            requestorMode: true
+            requestorPeer: CDSRequestProducer
+            requestorTimeout: 500
+          CDSDeleteRequestConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+              parameters:
+                url: http://10.10.10.184:30254/api/v1/execution-service/process
+                httpMethod: POST
+                restRequestTimeout: 2000
+                httpHeaders:
+                - - Authorization
+                  - Basic Y2NzZGthcHBzOmNjc2RrYXBwcw==
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventName: CDSDeleteResponseEvent
+            eventNameFilter: CDSDeleteResponseEvent
+            requestorMode: true
+            requestorPeer: CDSDeleteRequestProducer
+            requestorTimeout: 500
+          CDSReplyConsumer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+              parameters:
+                url: https://message-router:3905/events/unauthenticated.PMSH_CL_INPUT
+                httpMethod: POST
+                restRequestTimeout: 2000
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventName: MRResponseEvent
+            eventNameFilter: MRResponseEvent
+            requestorMode: true
+            requestorPeer: CDSReplyProducer
+            requestorTimeout: 500
+        eventOutputParameters:
+          logOutputter:
+            carrierTechnologyParameters:
+              carrierTechnology: FILE
+              parameters:
+                fileName: /tmp/outputevents.log
+            eventProtocolParameters:
+              eventProtocol: JSON
+          StdOutOutputter:
+            carrierTechnologyParameters:
+              carrierTechnology: FILE
+              parameters:
+                standardIo: true
+            eventProtocolParameters:
+              eventProtocol: JSON
+          CDSRequestProducer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventNameFilter: CDSCreateSubscriptionRequestEvent
+            requestorMode: true
+            requestorPeer: CDSRequestConsumer
+            requestorTimeout: 500
+          CDSDeleteRequestProducer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventNameFilter: CDSDeleteSubscriptionRequestEvent
+            requestorMode: true
+            requestorPeer: CDSDeleteRequestConsumer
+            requestorTimeout: 500
+          CDSReplyProducer:
+            carrierTechnologyParameters:
+              carrierTechnology: RESTREQUESTOR
+              parameterClassName: org.onap.policy.apex.plugins.event.carrier.restrequestor.RestRequestorCarrierTechnologyParameters
+            eventProtocolParameters:
+              eventProtocol: JSON
+            eventNameFilter: CDSResponseStatusEvent
+            requestorMode: true
+            requestorPeer: CDSReplyConsumer
+            requestorTimeout: 500
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policies/vCPE.policies.optimization.input.tosca.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policies/vCPE.policies.optimization.input.tosca.yaml
new file mode 100644 (file)
index 0000000..126e8e6
--- /dev/null
@@ -0,0 +1,348 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+topology_template:
+  policies:
+    -
+        OSDF_CASABLANCA.Affinity_Default:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_Default
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_Default
+                policy-version: 1
+            properties:
+                scope: []
+                services: []
+                resources: []
+                geography: []
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: same
+                    category: complex
+    -
+        OSDF_CASABLANCA.Affinity_Default_US:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_Default_US
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_Default_US
+                policy-version: 1
+            properties:
+                scope: []
+                services: []
+                resources: []
+                geography: [US]
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: same
+                    category: complex
+    -
+        OSDF_CASABLANCA.Affinity_Default_vCPE_US_0:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_Default_vCPE_US_0
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_Default_vCPE_US_0
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                resources: []
+                geography: [US]
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: different
+                    category: complex
+    -
+        OSDF_CASABLANCA.Affinity_vCPE_US_Gold_1:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_vCPE_US_Gold_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_vCPE_1
+                policy-version: 1
+            properties:
+                scope: [gold]
+                services: [vCPE]
+                resources: [vGMuxInfra, vG]
+                geography: [US, INTERNATIONAL]
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: same
+                    category: availabilityZone
+    -
+        OSDF_CASABLANCA.Affinity_vCPE_US_Platinum_1:
+            type: onap.policies.optimization.resource.AffinityPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Affinity_vCPE_US_Platinum_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.Affinity_vCPE_1
+                policy-version: 1
+            properties:
+                scope: [platinum]
+                services: [vCPE]
+                resources: [vGMuxInfra, vG]
+                geography: [US, INTERNATIONAL]
+                identity: affinity_vCPE
+                applicableResources: any
+                affinityProperties:
+                    qualifier: different
+                    category: availabilityZone
+    -
+        OSDF_CASABLANCA.Capacity_vG_1:
+            type: onap.policies.optimization.resource.Vim_fit
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Capacity_vG_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.Capacity_vG_1
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                resources: [vG]
+                geography: [US, INTERNATIONAL]
+                identity: capacity_vG
+                applicableResources: any
+                capacityProperty:
+                   controller: multicloud
+                   request: "{\"vCPU\": 10, \"Memory\": {\"quantity\": {\"get_param\": \"REQUIRED_MEM\"}, \"unit\": \"GB\"}, \"Storage\": {\"quantity\": {\"get_param\": \"REQUIRED_DISK\"}, \"unit\": \"GB\"}}"
+    -
+        OSDF_CASABLANCA.Capacity_vG_2:
+            type: onap.policies.optimization.resource.Vim_fit
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Capacity_vG_2
+            metadata:
+                policy-id: OSDF_CASABLANCA.Capacity_vG_2
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                resources: [vG]
+                geography: [US, INTERNATIONAL]
+                identity: capacity_vG
+                applicableResources: any
+                capacityProperty:
+                   controller: multicloud
+                   request: "{\"vCPU\": 15, \"Memory\": {\"quantity\": {\"get_param\": \"REQUIRED_MEM\"}, \"unit\": \"MB\"}, \"Storage\": {\"quantity\": {\"get_param\": \"REQUIRED_DISK\"}, \"unit\": \"GB\"}}"
+    -
+        OSDF_CASABLANCA.Distance_vG_1:
+            type: onap.policies.optimization.resource.DistancePolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.Distance_vG_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.Distance_vG_1
+                policy-version: 1
+            properties:
+                scope: [platinum]
+                services: [vCPE]
+                resources: [vG]
+                geography: [US, INTERNATIONAL]
+                identity: distance-vG
+                applicableResources: any
+                distanceProperties:
+                    locationInfo: customer_loc
+                    distance:
+                        value: 1500
+                        operator: "<"
+                        unit: km
+    -
+        OSDF_CASABLANCA.hpa_policy_Default:
+            type: onap.policies.optimization.resource.HpaPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.hpa_policy_Default
+            metadata:
+                policy-id: OSDF_CASABLANCA.hpa_policy_Default
+                policy-version: 1
+            properties:
+                scope: []
+                services: []
+                resources: []
+                geography: []
+                identity: hpa-vG
+                flavorFeatures:
+                    -
+                         id: vg_1
+                         type: vnfc
+                         directives:
+                             -    type: flavor_directives
+                                  attributes:
+                                      -    attribute_name: flavor_label_vm_01
+                                           attribute_value: ""
+                         flavorProperties:
+                             -
+                                  hpa-feature: basicCapabilities
+                                  mandatory: True
+                                  architecture: generic
+                                  directives: []
+                                  hpa-feature-attributes:
+                                      -    hpa-attribute-key: numVirtualCpu
+                                           hpa-attribute-value: 8
+                                           operator: ['>=']
+                                           unit: ""
+                                      -    hpa-attribute-key: virtualMemSize
+                                           hpa-attribute-value: 6
+                                           operator: ['<=']
+                                           unit: ""
+                             -
+                                  hpa-feature: ovsDpdk
+                                  mandatory: False
+                                  architecture: generic
+                                  directives: []
+                                  hpa-feature-attributes:
+                                      -    hpa-attribute-key: dataProcessingAccelerationLibrary
+                                           hpa-attribute-value: ovsDpdk_version
+                                           operator: [=]
+                                           unit: ""
+    -
+        OSDF_CASABLANCA.hpa_policy_vG_1:
+            type: onap.policies.optimization.resource.HpaPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.hpa_policy_vG_1
+            metadata:
+                policy-id: OSDF_CASABLANCA.hpa_policy_vG_1
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE, vOtherService]
+                resources: [vG]
+                geography: []
+                identity: hpa-vG
+                flavorFeatures:
+                    -
+                         id: vg_1
+                         type: vnfc
+                         directives:
+                             -    type: flavor_directives
+                                  attributes:
+                                      -    attribute_name: flavor_label_vm_01
+                                           attribute_value: ""
+                         flavorProperties:
+                             -
+                                  hpa-feature: basicCapabilities
+                                  mandatory: True
+                                  architecture: generic
+                                  directives: []
+                                  hpa-feature-attributes:
+                                      -    hpa-attribute-key: numVirtualCpu
+                                           hpa-attribute-value: 6
+                                           operator: ['>=']
+                                           unit: ""
+                                      -    hpa-attribute-key: virtualMemSize
+                                           hpa-attribute-value: 4
+                                           operator: ['<=']
+                                           unit: ""
+                             -
+                                  hpa-feature: ovsDpdk
+                                  mandatory: False
+                                  architecture: generic
+                                  directives: []
+                                  hpa-feature-attributes:
+                                      -    hpa-attribute-key: dataProcessingAccelerationLibrary
+                                           hpa-attribute-value: ovsDpdk_version
+                                           operator: [=]
+                                           unit: ""
+    -
+        OSDF_CASABLANCA.queryPolicy_vCPE:
+            type: onap.policies.optimization.service.QueryPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.queryPolicy_vCPE
+            metadata:
+                policy-id: OSDF_CASABLANCA.queryPolicy_vCPE
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                geography: [US, INTERNATIONAL]
+                identity: vCPE_Query_Policy
+                queryProperties:
+                    -
+                        attribute: locationId
+                        attribute_location: customerLocation
+                        value: ""
+                    -
+                        attribute: id
+                        attribute_location: "vpnInfo.vpnId"
+                        value: ""
+                    -
+                        attribute: upstreamBW
+                        attribute_location: "vpnInfo.upstreamBW"
+                        value: ""
+                    -
+                        attribute: customerLatitude
+                        attribute_location: customerLatitude
+                        value: 1.1
+                    - 
+                        attribute: customerLongitude
+                        attribute_location: customerLongitude
+                        value: 2.2
+    -
+        OSDF_CASABLANCA.SubscriberPolicy_v1:
+            type: onap.policies.optimization.service.SubscriberPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.SubscriberPolicy_v1
+            metadata:
+                policy-id: OSDF_CASABLANCA.SubscriberPolicy_v1
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                identity: subscriber_vCPE
+                subscriberProperties:
+                    subscriberName: [subscriber_x, subscriber_y]
+                    subscriberRole: [platinum]
+                    provStatus: [CAPPED]
+    -
+        OSDF_CASABLANCA.SubscriberPolicy_v2:
+            type: onap.policies.optimization.service.SubscriberPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.SubscriberPolicy_v2
+            metadata:
+                policy-id: OSDF_CASABLANCA.SubscriberPolicy_v2
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                identity: subscriber_vCPE
+                subscriberProperties:
+                    subscriberName: [subscriber_a, subscriber_b]
+                    subscriberRole: [gold]
+                    provStatus: [CAPPED]
+    -
+        OSDF_CASABLANCA.vnfPolicy_vG:
+            type: onap.policies.optimization.resource.VnfPolicy
+            version: 1.0.0
+            type_version: 1.0.0
+            name: OSDF_CASABLANCA.vnfPolicy_vG
+            metadata:
+                policy-id: OSDF_CASABLANCA.vnfPolicy_vG
+                policy-version: 1
+            properties:
+                scope: []
+                services: [vCPE]
+                resources: [vG]
+                geography: [US, INTERNATIONAL]
+                identity: vnf_vG
+                applicableResources: any
+                vnfProperties:
+                    -
+                        inventoryProvider: aai
+                        serviceType: ""
+                        inventoryType: cloudRegionId
+                        customerId: ""
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Match.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Match.yaml
new file mode 100644 (file)
index 0000000..88b8705
--- /dev/null
@@ -0,0 +1,8 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Match:
+        derived_from: tosca.policies.Root
+        version: 1.0.0
+        name: onap.policies.Match
+        description: Base Policy Type for matchable Policies
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Naming.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Naming.yaml
new file mode 100644 (file)
index 0000000..bde730c
--- /dev/null
@@ -0,0 +1,102 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Naming:
+        derived_from: tosca.policies.Root
+        version: 1.0.0
+        name: onap.policies.Naming
+        description: Virtual policy node for naming
+        properties:
+            policy-instance-name:
+                type: string
+            naming-models:
+                type: list
+                entry_schema:
+                    type: policy.data.naming-model-entity
+data_types:
+    policy.data.naming-model-entity:
+        derived_from: tosca.datatypes.Root
+        properties:
+            nfRole:
+                type: string
+                required: false
+                metadata:
+                    matchable: true
+            naming-type:
+                type: string
+                required: true
+                metadata:
+                    matchable: true
+            naming-recipe:
+                type: string
+                required: true
+            name-operation:
+                type: string
+                required: false
+            naming-properties:
+                type: list
+                required: true
+                entry_schema:
+                    type: policy.data.naming-property
+    policy.data.naming-property:
+        derived_from: tosca.datatypes.Root
+        properties:
+            property-name:
+                type: string
+                required: true
+                metadata:
+                    matchable: true
+            property-value:
+                type: string
+                required: false
+            property-operation:
+                type: string
+                required: false
+            source-system:
+                type: string
+                required: false
+            source-endpoint:
+                type: string
+                required: false
+            increment-sequence:
+                type: policy.data.increment-sequence
+                required: false
+    policy.data.increment-sequence:
+        derived_from: tosca.datatypes.Root
+        properties:
+            scope:
+                type: list
+                required: true
+                entry_schema:
+                    type: string
+                    constraints:
+                    -   valid_values:
+                        - CLOUD_REGION_ID
+                        - LOCATION_CLLI
+                        - VNF
+                        - VM
+                        - VFMODULE
+                        - PRECEEDING
+                        - TRAILING
+                        - ENTIRETY
+            sequence-type:
+                type: string
+                require: true
+                entry_schema:
+                    type: string
+                    constraints:
+                    -   valid_values:
+                        - numeric
+                        - alpha-numeric
+            start-value:
+                type: string
+                required: true
+            max:
+                type: string
+                required: false
+            increment:
+                type: string
+                required: true
+            length:
+                type: string
+                required: true
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Optimization.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.Optimization.yaml
new file mode 100644 (file)
index 0000000..7fe0e59
--- /dev/null
@@ -0,0 +1,33 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Optimization:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Optimization
+      description: The base policy type for all policies that govern optimization
+      properties:
+         scope:
+            description: Scope for the policy - could be for a specific release.
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+         geography:
+            description: One or more geographic regions
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - US
+                  - International
+         identity:
+            description: Used internally for identification
+            type: string
+            required: true
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.Common.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.Common.yaml
new file mode 100644 (file)
index 0000000..3dc9792
--- /dev/null
@@ -0,0 +1,28 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.guard.Common:
+        derived_from: tosca.policies.Root
+        version: 1.0.0
+        name: onap.policies.controlloop.guard.Common
+        description: |
+            This is the base Policy Type for Guard policies that guard the execution of Operational
+            Policies.
+        properties:
+            actor:
+                type: string
+                description: Specifies the Actor the guard applies to.
+                required: true
+            operation:
+                type: string
+                description: Specified the operation that the actor is performing the guard applies to.
+                required: true
+            timeRange:
+                type: tosca.datatypes.TimeInterval
+                description: |
+                    An optional range of time during the day the guard policy is valid for.
+                required: false
+            id:
+                type: string
+                description: The Control Loop id this applies to.
+                required: false
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Blacklist.yaml
new file mode 100644 (file)
index 0000000..f2b67e1
--- /dev/null
@@ -0,0 +1,16 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.guard.common.Blacklist:
+        derived_from: onap.policies.controlloop.guard.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.guard.common.Blacklist
+        description: Supports blacklist of entity id's from performing control loop actions on.
+        properties:
+            blacklist:
+                type: list
+                description: List of entity id's not allowed to have control loop operations on.
+                required: true
+                entry_schema:
+                    type: string
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Filter.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.Filter.yaml
new file mode 100644 (file)
index 0000000..ea8e92a
--- /dev/null
@@ -0,0 +1,66 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.controlloop.guard.common.Filter:
+      derived_from: onap.policies.controlloop.guard.Common
+      type_version: 1.0.0
+      version: 1.0.0
+      name: onap.policies.controlloop.guard.common.Filter
+      description: Supports filtering of A&AI entities such as vnf-id, type, service, geographic region, etc.
+      properties:
+         algorithm:
+            type: string
+            description: Designates the precendence of blacklist vs whitelist
+            required: true
+            default: blacklist-overrides
+            constraints:
+            - valid_values: ["blacklist-overrides", "whitelist-overrides"]
+         filters:
+            type: list
+            description: List of filters to be applied.
+            required: true
+            entry_schema:
+               type: onap.datatypes.guard.filter
+data_types:
+   onap.datatypes.guard.filter:
+      derived_from: tosca.nodes.Root
+      properties:
+         field:
+            type: string
+            description: Name of the field to perform the filter on using the A&AI <node>.<property> syntax.
+            required: true
+            constraints:
+               - valid_values:
+                  - generic-vnf.vnf-name
+                  - generic-vnf.vnf-id
+                  - generic-vnf.vnf-type
+                  - generic-vnf.nf-naming-code
+                  - vserver.vserver-id
+                  - cloud-region.cloud-region-id
+         filter:
+            type: string
+            description: The filter value itself. For example, "RegionOne" "vFWCL*"
+            required: true
+         function:
+            type: string
+            description: The function applied to the filter.
+            required: true
+            constraints:
+               - valid_values:
+                  - string-equal
+                  - string-equal-ignore-case
+                  - string-regexp-match
+                  - string-contains
+                  - string-greater-than
+                  - string-greater-than-or-equal
+                  - string-less-than
+                  - string-less-than-or-equal
+                  - string-starts-with
+                  - string-ends-with
+         blacklist:
+            type: boolean
+            description: |
+               Indicates if the filter should be treated as a blacklist (true)
+               or whitelist (false).
+            required: true
+            default: true
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter.yaml
new file mode 100644 (file)
index 0000000..3e31ec2
--- /dev/null
@@ -0,0 +1,26 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.guard.common.FrequencyLimiter:
+        derived_from: onap.policies.controlloop.guard.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.guard.common.FrequencyLimiter
+        description: Supports limiting the frequency of actions being taken by a Actor.
+        properties:
+            timeWindow:
+                type: integer
+                description: The time window to count the actions against.
+                required: true
+            timeUnits:
+                type: string
+                description: The units of time the window is counting.
+                required: true
+                constraints:
+                - valid_values: ["second", "minute", "hour", "day", "week", "month", "year"]
+            limit:
+                type: integer
+                description: The limit
+                required: true
+                constraints:
+                -   greater_than: 0
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.MinMax.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.common.MinMax.yaml
new file mode 100644 (file)
index 0000000..8f93572
--- /dev/null
@@ -0,0 +1,24 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.guard.common.MinMax:
+        derived_from: onap.policies.controlloop.guard.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.guard.common.MinMax
+        description: |
+            Supports Min/Max number of entity for scaling operations. Although min and max fields are marked as not
+            required, you need to have at least one or the other.
+        properties:
+            target:
+                type: string
+                required: true
+                description: The target entity that has scaling restricted
+            min:
+                type: integer
+                required: false
+                description: The minimum instances of this entity
+            max:
+                type: integer
+                required: false
+                description: The maximum instances of this entity
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.guard.coordination.FirstBlocksSecond.yaml
new file mode 100644 (file)
index 0000000..eaeee60
--- /dev/null
@@ -0,0 +1,27 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.controlloop.Guard:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.controlloop.Guard
+      description: Guard Policies for Control Loop Operational Policies
+   onap.policies.controlloop.guard.Coordination:
+      derived_from: onap.policies.controlloop.Guard
+      version: 1.0.0
+      name: onap.policies.controlloop.guard.Coordination
+      description: Guard Policies for Control Loop Coordination
+   onap.policies.controlloop.guard.coordination.FirstBlocksSecond:
+      derived_from: onap.policies.controlloop.guard.Coordination
+      version: 1.0.0
+      name: onap.policies.controlloop.guard.coordination.FirstBlocksSecond
+      description: Supports one Control Loop blocking another
+      properties:
+         controlLoop:
+            type: list
+            description: Specific Control Loops to which to apply this guard
+            required: true
+            constraint:
+               length: 2
+            entry_schema:
+               type: string
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.Common.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.Common.yaml
new file mode 100644 (file)
index 0000000..9b3b057
--- /dev/null
@@ -0,0 +1,143 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.operational.Common:
+        derived_from: tosca.policies.Root
+        version: 1.0.0
+        name: onap.policies.controlloop.operational.Common
+        description: |
+            Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant
+            Policy Types. This does NOT support the legacy Policy YAML policy type.
+        properties:
+            id:
+                type: string
+                description: The unique control loop id.
+                required: true
+            timeout:
+                type: integer
+                description: |
+                    Overall timeout for executing all the operations. This timeout should equal or exceed the total
+                    timeout for each operation listed.
+                required: true
+            abatement:
+                type: boolean
+                description: Whether an abatement event message will be expected for the control loop from DCAE.
+                required: true
+                default: false
+            trigger:
+                type: string
+                description: Initial operation to execute upon receiving an Onset event message for the Control Loop.
+                required: true
+            operations:
+                type: list
+                description: List of operations to be performed when Control Loop is triggered.
+                required: true
+                entry_schema:
+                    type: onap.datatype.controlloop.Operation
+
+data_types:
+    onap.datatype.controlloop.Target:
+        derived_from: tosca.datatypes.Root
+        description: Definition for a entity in A&AI to perform a control loop operation on
+        properties:
+            targetType:
+                type: string
+                description: Category for the target type
+                required: true
+                constraints:
+                - valid_values: [VNF, VM, VFMODULE, PNF]
+            entityIds:
+                type: map
+                description: |
+                    Map of values that identify the resource. If none are provided, it is assumed that the
+                    entity that generated the ONSET event will be the target.
+                required: false
+                metadata:
+                    clamp_possible_values: ClampExecution:CSAR_RESOURCES
+                entry_schema:
+                    type: string
+
+    onap.datatype.controlloop.Actor:
+        derived_from: tosca.datatypes.Root
+        description: An actor/operation/target definition
+        properties:
+            actor:
+                type: string
+                description: The actor performing the operation.
+                required: true
+                metadata:
+                    clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor
+            operation:
+                type: string
+                description: The operation the actor is performing.
+                metadata:
+                    clamp_possible_values: Dictionary:DefaultOperations,ClampExecution:CDS/operation
+                required: true
+            target:
+                type: onap.datatype.controlloop.Target
+                description: The resource the operation should be performed on.
+                required: true
+            payload:
+                type: map
+                description: Name/value pairs of payload information passed by Policy to the actor
+                required: false
+                metadata:
+                    clamp_possible_values: ClampExecution:CDS/payload
+                entry_schema:
+                    type: string
+
+    onap.datatype.controlloop.Operation:
+        derived_from: tosca.datatypes.Root
+        description: An operation supported by an actor
+        properties:
+            id:
+                type: string
+                description: Unique identifier for the operation
+                required: true
+            description:
+                type: string
+                description: A user-friendly description of the intent for the operation
+                required: false
+            operation:
+                type: onap.datatype.controlloop.Actor
+                description: The definition of the operation to be performed.
+                required: true
+            timeout:
+                type: integer
+                description: The amount of time for the actor to perform the operation.
+                required: true
+            retries:
+                type: integer
+                description: The number of retries the actor should attempt to perform the operation.
+                required: true
+                default: 0
+            success:
+                type: string
+                description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.
+                required: false
+                default: final_success
+            failure:
+                type: string
+                description: Points to the operation to invoke on Actor operation failure.
+                required: false
+                default: final_failure
+            failure_timeout:
+                type: string
+                description: Points to the operation to invoke when the time out for the operation occurs.
+                required: false
+                default: final_failure_timeout
+            failure_retries:
+                type: string
+                description: Points to the operation to invoke when the current operation has exceeded its max retries.
+                required: false
+                default: final_failure_retries
+            failure_exception:
+                type: string
+                description: Points to the operation to invoke when the current operation causes an exception.
+                required: false
+                default: final_failure_exception
+            failure_guard:
+                type: string
+                description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.
+                required: false
+                default: final_failure_guard
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Apex.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Apex.yaml
new file mode 100644 (file)
index 0000000..a0c5b24
--- /dev/null
@@ -0,0 +1,26 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.operational.common.Apex:
+        derived_from: onap.policies.controlloop.operational.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.operational.common.Apex
+        description: Operational policies for Apex PDP
+        properties:
+            engineServiceParameters:
+                type: string
+                description: The engine parameters like name, instanceCount, policy implementation, parameters etc.
+                required: true
+            eventInputParameters:
+                type: string
+                description: The event input parameters.
+                required: true
+            eventOutputParameters:
+                type: string
+                description: The event output parameters.
+                required: true
+            javaProperties:
+                type: string
+                description: Name/value pairs of properties to be set for APEX if needed.
+                required: false
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Drools.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.controlloop.operational.common.Drools.yaml
new file mode 100644 (file)
index 0000000..69d73db
--- /dev/null
@@ -0,0 +1,14 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.controlloop.operational.common.Drools:
+        derived_from: onap.policies.controlloop.operational.Common
+        type_version: 1.0.0
+        version: 1.0.0
+        name: onap.policies.controlloop.operational.common.Drools
+        description: Operational policies for Drools PDP
+        properties:
+            controllerName:
+                type: string
+                description: Drools controller properties
+                required: false
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-mapper.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-mapper.yaml
new file mode 100644 (file)
index 0000000..c50392e
--- /dev/null
@@ -0,0 +1,50 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.dcae-pm-mapper:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      properties:
+         pm-mapper-filter:
+            type: map
+            description: PM mapper filter on measInfo, measInfoId, measType, instanceId
+            entry_schema:
+               type: onap.datatypes.monitoring.pm-mapper-filter
+data_types:
+   onap.datatypes.monitoring.pm-mapper-filter:
+      derived_from: tosca.datatypes.Root
+      properties:
+         filters:
+            type: list
+            description: Filter configuration
+            #default: []
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.filters
+   onap.datatypes.monitoring.filters:
+      derived_from: tosca.datatypes.Root
+      properties:
+         pmDefVsn:
+            type: string
+            description: PM Dictionary version
+            required: true
+         nfType:
+            type: string
+            description: NF type
+            required: true
+         vendor:
+            type: string
+            description: Vendor name
+            required: true
+         measTypes:
+            type: list
+            description: Measurement types to collect
+            #default: []
+            required: true
+            entry_schema:
+               type: string
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-subscription-handler.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-pm-subscription-handler.yaml
new file mode 100644 (file)
index 0000000..8ac9b74
--- /dev/null
@@ -0,0 +1,132 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.dcae-pm-subscription-handler:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      properties:
+         subscription:
+            type: map
+            description: PM Subscription Handler Subscription
+            entry_schema:
+               type: onap.datatypes.monitoring.subscription
+data_types:
+   onap.datatypes.monitoring.subscription:
+      derived_from: tosca.datatypes.Root
+      properties:
+         subscriptionName:
+            type: string
+            description: Name of the subscription
+            required: true
+         administrativeState:
+            type: string
+            description: State of the subscription
+            required: true
+            constraints:
+            -  valid_values:
+               - LOCKED
+               - UNLOCKED
+         fileBasedGP:
+            type: integer
+            description: File based granularity period
+            required: true
+         fileLocation:
+            type: string
+            description: ROP file location
+            required: true
+         nfTypeModelInvariantId:
+            type: string
+            description: Network function invariant ID
+            required: true
+         nfFilter:
+            type: map
+            description: Network function filter
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.nfFilter
+         measurementGroups:
+            type: list
+            description: Measurement Groups
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementGroups
+   onap.datatypes.monitoring.nfFilter:
+      derived_from: tosca.datatypes.Root
+      properties:
+         nfNames:
+            type: list
+            description: List of network functions
+            required: true
+            #default: []
+            entry_schema:
+               type: string
+         swVersions:
+            type: list
+            description: List of software versions
+            required: true
+            #default: []
+            entry_schema:
+               type: string
+   onap.datatypes.monitoring.measurementGroups:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementGroup:
+            type: map
+            description: Measurement Group
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementGroup
+   onap.datatypes.monitoring.measurementGroup:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementTypes:
+            type: list
+            description: List of measurement types
+            required: true
+            #default: []
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementTypes
+         managedObjectDNsBasic:
+            type: list
+            description: List of managed object distinguished names
+            required: true
+            #default: []
+            entry_schema:
+               type: onap.datatypes.monitoring.managedObjectDNsBasics
+   onap.datatypes.monitoring.measurementTypes:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementType:
+            type: map
+            description: Measurement type object
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementType
+   onap.datatypes.monitoring.measurementType:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementType:
+            type: string
+            description: Measurement type
+            required: true
+   onap.datatypes.monitoring.managedObjectDNsBasics:
+      derived_from: tosca.datatypes.Root
+      properties:
+         managedObjectDNsBasic:
+            type: map
+            description: Managed object distinguished name object
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.managedObjectDNsBasic
+   onap.datatypes.monitoring.managedObjectDNsBasic:
+      derived_from: tosca.datatypes.Root
+      properties:
+         DN:
+            type: string
+            description: Managed object distinguished name
+            required: true
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcae-restconfcollector.yaml
new file mode 100644 (file)
index 0000000..58e60e9
--- /dev/null
@@ -0,0 +1,128 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.dcae-restconfcollector:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      properties:
+         rcc_policy:
+            type: list
+            description: RCC Policy JSON
+            entry_schema:
+               type: onap.datatypes.monitoring.rcc_policy
+data_types:
+   onap.datatypes.monitoring.rcc_policy:
+      derived_from: tosca.datatypes.Root
+      properties:
+         controller_name:
+            type: string
+            description: Name of controller
+            required: true
+         controller_restapiUrl:
+            type: string
+            description: Controller's ip and port
+            required: true
+         controller_restapiUser:
+            type: string
+            description: Controller's username
+            required: true
+         controller_restapiPassword:
+            type: string
+            description: Controller's password
+            required: true
+         controller_accessTokenUrl:
+            type: string
+            description: URL to get access token
+            required: true
+         controller_accessTokenFile:
+            type: string
+            description: Access token file path
+            required: true
+         controller_accessTokenMethod:
+            type: string
+            description: Access token method POST/GET/PUT etc
+            required: true
+            constraints:
+            -  valid_values:
+               - post
+               - get
+               - put
+         controller_subsMethod:
+            type: string
+            description: Subscription method POST/GET/PUT etc
+            required: true
+            default: post
+            constraints:
+            -  valid_values:
+               - post
+               - get
+               - put
+         controller_subscriptionUrl:
+            type: string
+            description: URL to establish subscription
+            required: true
+         controller_disableSsl:
+            type: boolean
+            description: Option to disable ssl
+            required: true
+            default: true
+         event_details:
+            type: list
+            description: event details
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.rcc_event_details
+   onap.datatypes.monitoring.rcc_event_details:
+      derived_from: tosca.datatypes.Root
+      properties:
+         event_name:
+            type: string
+            description: event name
+            required: true
+         event_description:
+            type: string
+            description: description of event
+            required: false
+         event_sseventUrlEmbed:
+            type: boolean
+            description: Whether SSE url is embedded in subscription response
+            required: true
+            default: true
+         event_sseventsField:
+            type: string
+            description: Field name to access SSE url in subscription response
+            required: true
+         event_sseventsUrl:
+            type: string
+            description: Explicit SSE url
+            required: true
+         event_subscriptionTemplate:
+            type: string
+            description: Subscription template file path
+            required: true
+         event_unSubscriptionTemplate:
+            type: string
+            description: Unsubscription template file path
+            required: false
+         event_ruleId:
+            type: integer
+            description: Rule Id
+            required: false
+         modifyData:
+            type: boolean
+            description: Whether to modify the received SSE event
+            required: true
+            default: false
+         modifyMethod:
+            type: string
+            description: The java method name to modify data
+            required: false
+         userData:
+            type: string
+            description: The user specific data
+            required: false
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml
new file mode 100644 (file)
index 0000000..408e8cd
--- /dev/null
@@ -0,0 +1,19 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      description: a base policy type for all policies that govern monitoring provisioning
+      version: 1.0.0
+      name: onap.policies.Monitoring
+   onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      name: onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server
+      properties:
+         buscontroller_feed_publishing_endpoint:
+            type: string
+            description: DMAAP Bus Controller feed endpoint
+         datafile.policy:
+            type: string
+            description: datafile Policy JSON as string
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.tcagen2.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.monitoring.tcagen2.yaml
new file mode 100644 (file)
index 0000000..04026b3
--- /dev/null
@@ -0,0 +1,161 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.tcagen2:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      name: onap.policies.monitoring.tcagen2
+      properties:
+         tca.policy:
+            type: onap.datatypes.monitoring.tca_policy
+            description: TCA Policy JSON
+            required: true
+data_types:
+   onap.datatypes.monitoring.metricsPerEventName:
+      derived_from: tosca.datatypes.Root
+      properties:
+         controlLoopSchemaType:
+            type: string
+            required: true
+            description: Specifies Control Loop Schema Type for the event Name e.g. VNF, VM
+            constraints:
+            -  valid_values:
+               - VM
+               - VNF
+         eventName:
+            type: string
+            required: true
+            description: Event name to which thresholds need to be applied
+         policyName:
+            type: string
+            required: true
+            description: TCA Policy Scope Name
+         policyScope:
+            type: string
+            required: true
+            description: TCA Policy Scope
+         policyVersion:
+            type: string
+            required: true
+            description: TCA Policy Scope Version
+         thresholds:
+            type: list
+            required: true
+            description: Thresholds associated with eventName
+            entry_schema:
+               type: onap.datatypes.monitoring.thresholds
+   onap.datatypes.monitoring.tca_policy:
+      derived_from: tosca.datatypes.Root
+      properties:
+         domain:
+            type: string
+            required: true
+            description: Domain name to which TCA needs to be applied
+            default: measurementsForVfScaling
+            constraints:
+            -  equal: measurementsForVfScaling
+         metricsPerEventName:
+            type: list
+            required: true
+            description: Contains eventName and threshold details that need to be applied to given eventName
+            entry_schema:
+               type: onap.datatypes.monitoring.metricsPerEventName
+   onap.datatypes.monitoring.thresholds:
+      derived_from: tosca.datatypes.Root
+      properties:
+         closedLoopControlName:
+            type: string
+            required: true
+            description: Closed Loop Control Name associated with the threshold
+         closedLoopEventStatus:
+            type: string
+            required: true
+            description: Closed Loop Event Status of the threshold
+            constraints:
+            -  valid_values:
+               - ONSET
+               - ABATED
+         direction:
+            type: string
+            required: true
+            description: Direction of the threshold
+            constraints:
+            -  valid_values:
+               - LESS
+               - LESS_OR_EQUAL
+               - GREATER
+               - GREATER_OR_EQUAL
+               - EQUAL
+         fieldPath:
+            type: string
+            required: true
+            description: Json field Path as per CEF message which needs to be analyzed for TCA
+            constraints:
+            -  valid_values:
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsDelta
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsAccumulated
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuIdle
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageInterrupt
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageNice
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSoftIrq
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSteal
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSystem
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuWait
+               - $.event.measurementsForVfScalingFields.cpuUsageArray[*].percentUsage
+               - $.event.measurementsForVfScalingFields.meanRequestLatency
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryBuffered
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryCached
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryConfigured
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryFree
+               - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryUsed
+               - $.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value
+         severity:
+            type: string
+            required: true
+            description: Threshold Event Severity
+            constraints:
+            -  valid_values:
+               - CRITICAL
+               - MAJOR
+               - MINOR
+               - WARNING
+               - NORMAL
+         thresholdValue:
+            type: integer
+            required: true
+            description: Threshold value for the field Path inside CEF message
+         version:
+            type: string
+            required: true
+            description: Version number associated with the threshold
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Apex.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Apex.yaml
new file mode 100644 (file)
index 0000000..d2a7632
--- /dev/null
@@ -0,0 +1,203 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Native:
+        derived_from: tosca.policies.Root
+        description: a base policy type for all native PDP policies
+        version: 1.0.0
+        name: onap.policies.Native
+    onap.policies.native.Apex:
+        derived_from: onap.policies.Native
+        description: a policy type for native apex policies
+        version: 1.0.0
+        name: onap.policies.native.Apex
+        properties:
+            engine_service:
+                type: onap.datatypes.native.apex.EngineService
+                description: APEX Engine Service Parameters
+            inputs:
+                type: map
+                description: Inputs for handling events coming into the APEX engine
+                entry_schema:
+                    type: onap.datatypes.native.apex.EventHandler
+            outputs:
+                type: map
+                description: Outputs for handling events going out of the APEX engine
+                entry_schema:
+                    type: onap.datatypes.native.apex.EventHandler
+            environment:
+                type: list
+                description: Envioronmental parameters for the APEX engine
+                entry_schema:
+                    type: onap.datatypes.native.apex.Environment
+
+data_types:
+    onap.datatypes.native.apex.EngineService:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                description: Specifies the engine name
+                required: false
+                default: "ApexEngineService"
+            version:
+                type: string
+                description: Specifies the engine version in double dotted format
+                required: false
+                default: "1.0.0"
+            id:
+                type: integer
+                description: Specifies the engine id
+                required: true
+            instance_count:
+                type: integer
+                description: Specifies the number of engine threads that should be run
+                required: true
+            deployment_port:
+                type: integer
+                description: Specifies the port to connect to for engine administration
+                required: false
+                default: 1
+            policy_model_file_name:
+                type: string
+                description: The name of the file from which to read the APEX policy model
+                required: false
+            policy_type_impl:
+                type: string
+                description: The policy type implementation from which to read the APEX policy model
+                required: false
+            periodic_event_period:
+                type: string
+                description: The time interval in milliseconds for the periodic scanning event, 0 means don't scan
+                required: false
+            engine:
+                type: onap.datatypes.native.apex.engineservice.Engine
+                description: The parameters for all engines in the APEX engine service
+                required: true
+    onap.datatypes.native.apex.EventHandler:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                description: Specifies the event handler name, if not specified this is set to the key name
+                required: false
+            carrier_technology:
+                type: onap.datatypes.native.apex.CarrierTechnology
+                description: Specifies the carrier technology of the event handler (such as REST/Web Socket/Kafka)
+                required: true
+            event_protocol:
+                type: onap.datatypes.native.apex.EventProtocol
+                description: Specifies the event protocol of events for the event handler (such as Yaml/JSON/XML/POJO)
+                required: true
+            event_name:
+                type: string
+                description: Specifies the event name for events on this event handler, if not specified, the event name is read from or written to the event being received or sent
+                required: false
+            event_name_filter:
+                type: string
+                description: Specifies a filter as a regular expression, events that do not match the filter are dropped, the default is to let all events through
+                required: false
+            synchronous_mode:
+                type: boolean
+                description: Specifies the event handler is syncronous (receive event and send response)
+                required: false
+                default: false
+            synchronous_peer:
+                type: string
+                description: The peer event handler (output for input or input for output) of this event handler in synchronous mode, this parameter is mandatory if the event handler is in synchronous mode
+                required: false
+            synchronous_timeout:
+                type: integer
+                description: The timeout in milliseconds for responses to be issued by APEX torequests, this parameter is mandatory if the event handler is in synchronous mode
+                required: false
+            requestor_mode:
+                type: boolean
+                description: Specifies the event handler is in requestor mode (send event and wait for response mode)
+                required: false
+                default: false
+            requestor_peer:
+                type: string
+                description: The peer event handler (output for input or input for output) of this event handler in requestor mode, this parameter is mandatory if the event handler is in requestor mode
+                required: false
+            requestor_timeout:
+                type: integer
+                description: The timeout in milliseconds for wait for responses to requests, this parameter is mandatory if the event handler is in requestor mode
+                required: false
+    onap.datatypes.native.apex.CarrierTechnology:
+        derived_from: tosca.datatypes.Root
+        properties:
+            label:
+                type: string
+                description: The label (name) of the carrier technology (such as REST, Kafka, WebSocket)
+                required: true
+            plugin_parameter_class_name:
+                type: string
+                description: The class name of the class that overrides default handling of event input or output for this carrier technology, defaults to the supplied input or output class
+                required: false
+    onap.datatypes.native.apex.EventProtocol:
+        derived_from: tosca.datatypes.Root
+        properties:
+            label:
+                type: string
+                description: The label (name) of the event protocol (such as Yaml, JSON, XML, or POJO)
+                required: true
+            event_protocol_plugin_class:
+                type: string
+                description: The class name of the class that overrides default handling of the event protocol for this carrier technology, defaults to the supplied event protocol class
+                required: false
+    onap.datatypes.native.apex.Environment:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                description: The name of the environment variable
+                required: true
+            value:
+                type: string
+                description: The value of the environment variable
+                required: true
+    onap.datatypes.native.apex.engineservice.Engine:
+        derived_from: tosca.datatypes.Root
+        properties:
+            context:
+                type: onap.datatypes.native.apex.engineservice.engine.Context
+                description: The properties for handling context in APEX engines, defaults to using Java maps for context
+                required: false
+            executors:
+                type: map
+                description: The plugins for policy executors used in engines such as javascript, MVEL, Jython
+                required: true
+                entry_schema:
+                    description: The plugin class path for this policy executor
+                    type: string
+    onap.datatypes.native.apex.engineservice.engine.Context:
+        derived_from: tosca.datatypes.Root
+        properties:
+            distributor:
+                type: onap.datatypes.native.apex.Plugin
+                description: The plugin to be used for distributing context between APEX PDPs at runtime
+                required: false
+            schemas:
+                type: map
+                description: The plugins for context schemas available in APEX PDPs such as Java and Avro
+                required: false
+                entry_schema:
+                    type: onap.datatypes.native.apex.Plugin
+            locking:
+                type: onap.datatypes.native.apex.Plugin
+                description: The plugin to be used for locking context in and between APEX PDPs at runtime
+                required: false
+            persistence:
+                type: onap.datatypes.native.apex.Plugin
+                description: The plugin to be used for persisting context for APEX PDPs at runtime
+                required: false
+    onap.datatypes.native.apex.Plugin:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                description: The name of the executor such as Javascript, Jython or MVEL
+                required: true
+            plugin_class_name:
+                type: string
+                description: The class path of the plugin class for this executor
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Drools.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Drools.yaml
new file mode 100644 (file)
index 0000000..0ae96db
--- /dev/null
@@ -0,0 +1,118 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Native:
+        derived_from: tosca.policies.Root
+        description: a base policy type for all native PDP policies
+        version: 1.0.0
+        name: onap.policies.Native
+    onap.policies.native.Drools:
+        derived_from: onap.policies.Native
+        description: a base policy type for all native PDP policies
+        version: 1.0.0
+        name: onap.policies.native.Drools
+    onap.policies.native.drools.Controller:
+        derived_from: onap.policies.native.Drools
+        description: a policy type for a drools controller configuration
+        version: 1.0.0
+        name: onap.policies.native.drools.Controller
+        properties:
+            controllerName:
+                type: string
+                required: true
+                description: the drools controller name
+            sourceTopics:
+                type: list
+                required: false
+                description: source topics and applicable events
+                entry_schema:
+                    type: onap.datatypes.dmaap.topic
+            sinkTopics:
+                type: list
+                required: false
+                description: sink topics and applicable events
+                entry_schema:
+                    type: onap.datatypes.dmaap.topic
+            customConfig:
+                type: map
+                required: false
+                description: any use case specific configurations relevant to the drools controller
+                entry_schema:
+                    type: string
+    onap.policies.native.drools.Artifact:
+        derived_from: onap.policies.native.Drools
+        description: a policy type for native drools artifact policies
+        version: 1.0.0
+        name: onap.policies.native.drools.Artifact
+        properties:
+            rulesArtifact:
+                type: onap.datatypes.native.rules_artifact
+                required: true
+                description: the GAV information of the maven artifact
+            controller:
+                type: onap.datatypes.drools.controller.relation
+                required: true
+                description: the drools controller to which the current native policy is assigned
+
+data_types:
+    onap.datatypes.dmaap.topic:
+        derived_from: tosca.datatypes.Root
+        properties:
+            topicName:
+                type: string
+                required: true
+                description: the dmaap topic name
+            events:
+                type: list
+                required: true
+                description: events used by this topic
+                entry_schema:
+                    type: onap.datatypes.dmaap.events
+    onap.datatypes.dmaap.events:
+        derived_from: tosca.datatypes.Root
+        properties:
+            eventClass:
+                type: string
+                required: true
+                description: the event canonical class for serialization
+            eventFilter:
+                type: string
+                required: false
+                description: the JSONPath based condition to filter out the events to serialize
+            customSerialization:
+                type: onap.datatypes.dmaap.custom_serialization
+                required: false
+                description:  overrides the default serialization/deserialization mechanisms with custom ones
+    onap.datatypes.dmaap.custom_serialization:
+        derived_from: tosca.datatypes.Root
+        properties:
+            customSerializerClass:
+                type: string
+                required: true
+                description: the class that contains the JSON parser serializer/deserializer.
+            jsonParser:
+                type: string
+                required: true
+                description: static field in customSerialized class with the json parser (currently only gson supported)
+    onap.datatypes.native.rules_artifact:
+        derived_from: tosca.datatypes.Root
+        properties:
+            groupId:
+                type: string
+                required: true
+                description: the groupId of the maven artifact
+            artifactId:
+                type: string
+                required: true
+                description: the artifactId of the maven artifact
+            version:
+                type: string
+                required: true
+                description: the version of the maven artifact
+    onap.datatypes.drools.controller.relation:
+        derived_from: tosca.datatypes.Root
+        properties:
+            name:
+                type: string
+                required: true
+                description: the name of drools controller policy
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Xacml.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.native.Xacml.yaml
new file mode 100644 (file)
index 0000000..eb25cdb
--- /dev/null
@@ -0,0 +1,20 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.Native:
+        derived_from: tosca.policies.Root
+        description: a base policy type for all native PDP policies
+        version: 1.0.0
+        name: onap.policies.Native
+    onap.policies.native.Xacml:
+        derived_from: onap.policies.Native
+        description: a policy type for native xacml policies
+        version: 1.0.0
+        name: onap.policies.native.Xacml
+        properties:
+            policy:
+                type: string
+                required: true
+                description: The XML XACML 3.0 PolicySet or Policy
+                metadata:
+                    encoding: Base64
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Resource.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Resource.yaml
new file mode 100644 (file)
index 0000000..6b3a246
--- /dev/null
@@ -0,0 +1,25 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.Resource:
+      derived_from: onap.policies.Optimization
+      version: 1.0.0
+      name: onap.policies.optimization.Resource
+      description: The base policy type for all policies that govern optimization for a Resource in a Service.
+      properties:
+         services:
+            description: One or more services that the policy applies to.
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+         resources:
+            description: One or more VNF resources that the policy applies to.
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Service.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.Service.yaml
new file mode 100644 (file)
index 0000000..8b37a67
--- /dev/null
@@ -0,0 +1,17 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.Service:
+      derived_from: onap.policies.Optimization
+      version: 1.0.0
+      name: onap.policies.optimization.Service
+      description: The base policy type for all policies that govern optimization for a Service.
+      properties:
+         services:
+            description: One or more services that the policy applies to.
+            type: list
+            metadata:
+               matchable: true
+            required: true
+            entry_schema:
+               type: string
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.AffinityPolicy.yaml
new file mode 100644 (file)
index 0000000..bb6adb0
--- /dev/null
@@ -0,0 +1,33 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.AffinityPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.AffinityPolicy
+      properties:
+         applicableResources:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - any
+                  - all
+         affinityProperties:
+            type: policy.data.affinityProperties_properties
+            required: true
+data_types:
+   policy.data.affinityProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         qualifier:
+            type: string
+            constraints:
+            -  valid_values:
+               - same
+               - different
+         category:
+            type: string
+            required: true
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.DistancePolicy.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.DistancePolicy.yaml
new file mode 100644 (file)
index 0000000..f41dcfd
--- /dev/null
@@ -0,0 +1,58 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.DistancePolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.DistancePolicy
+      properties:
+         applicableResources:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - any
+                  - all
+         distanceProperties:
+            type: policy.data.distanceProperties_properties
+            required: true
+data_types:
+   policy.data.distanceProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         locationInfo:
+            type: string
+            required: true
+         distance:
+            type: policy.data.distance_properties
+            required: true
+            entry_schema:
+               type: policy.data.distance_properties
+   policy.data.distance_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         value:
+            type: string
+            required: true
+         operator:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - <
+                  - <=
+                  - '>'
+                  - '>='
+                  - =
+         unit:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - km
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.HpaPolicy.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.HpaPolicy.yaml
new file mode 100644 (file)
index 0000000..dfe3077
--- /dev/null
@@ -0,0 +1,105 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.HpaPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.HpaPolicy
+      properties:
+         flavorFeatures:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.flavorFeatures_properties
+data_types:
+   policy.data.flavorFeatures_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         id:
+            type: string
+            required: true
+         type:
+            type: string
+            required: true
+         directives:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.directives_properties
+         flavorProperties:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.flavorProperties_properties
+   policy.data.directives_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         type:
+            type: string
+         attributes:
+            type: list
+            entry_schema:
+               type: policy.data.directives_attributes_properties
+   policy.data.directives_attributes_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         attribute_name:
+            type: string
+         attribute_value:
+            type: string
+   policy.data.flavorProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         hpa-feature:
+            type: string
+            required: true
+         mandatory:
+            type: string
+            required: true
+         score:
+            type: string
+            required: false
+         architecture:
+            type: string
+            required: true
+         hpa-version:
+            type: string
+            required: true
+         directives:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.directives_properties
+         hpa-feature-attributes:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.hpa-feature-attributes_properties
+   policy.data.hpa-feature-attributes_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         hpa-attribute-key:
+            type: string
+            required: true
+         hpa-attribute-value:
+            type: string
+            required: true
+         operator:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - <
+                  - <=
+                  - '>'
+                  - '>='
+                  - =
+                  - '!='
+                  - any
+                  - all
+                  - subset
+         unit:
+            type: string
+            required: false
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.OptimizationPolicy.yaml
new file mode 100644 (file)
index 0000000..b0f77d6
--- /dev/null
@@ -0,0 +1,68 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.OptimizationPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.OptimizationPolicy
+      properties:
+         objective:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - minimize
+                  - maximize
+         objectiveParameter:
+            type: policy.data.objectiveParameter_properties
+            required: true
+data_types:
+   policy.data.objectiveParameter_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         parameterAttributes:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.parameterAttributes_properties
+         operator:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - '*'
+                  - +
+                  - '-'
+                  - /
+                  - '%'
+   policy.data.parameterAttributes_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         resources:
+            type: string
+            required: true
+         customerLocationInfo:
+            type: string
+            required: true
+         parameter:
+            type: string
+            required: true
+         weight:
+            type: string
+            required: true
+         operator:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - '*'
+                  - +
+                  - '-'
+                  - /
+                  - '%'
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.PciPolicy.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.PciPolicy.yaml
new file mode 100644 (file)
index 0000000..e636582
--- /dev/null
@@ -0,0 +1,32 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.PciPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.PciPolicy
+      properties:
+         pciProperties:
+            type: list
+            required: false
+            entry_schema:
+               type: policy.data.pciProperties_properties
+data_types:
+   policy.data.pciProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         algoCategory:
+            type: string
+            required: false
+         pciOptmizationAlgoName:
+            type: string
+            required: false
+         pciOptimizationNwConstraint:
+            type: string
+            required: false
+         pciOptimizationPriority:
+            type: string
+            required: false
+         pciOptimizationTimeConstraint:
+            type: string
+            required: false
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.Vim_fit.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.Vim_fit.yaml
new file mode 100644 (file)
index 0000000..cb387dd
--- /dev/null
@@ -0,0 +1,30 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.Vim_fit:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.Vim_fit
+      properties:
+         applicableResources:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - any
+                  - all
+         capacityProperties:
+            type: policy.data.capacityProperties_properties
+            required: true
+data_types:
+   policy.data.capacityProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         controller:
+            type: string
+            required: true
+         request:
+            type: string
+            required: true
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.VnfPolicy.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.resource.VnfPolicy.yaml
new file mode 100644 (file)
index 0000000..30b8b72
--- /dev/null
@@ -0,0 +1,46 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.resource.VnfPolicy:
+      derived_from: onap.policies.optimization.Resource
+      version: 1.0.0
+      name: onap.policies.optimization.resource.VnfPolicy
+      properties:
+         applicableResources:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - any
+                  - all
+         vnfProperties:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.vnfProperties_properties
+data_types:
+   policy.data.vnfProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         inventoryProvider:
+            type: string
+            required: true
+         serviceType:
+            type: string
+            required: true
+         inventoryType:
+            type: list
+            required: true
+            entry_schema:
+               type: string
+               constraints:
+               -  valid_values:
+                  - serviceInstanceId
+                  - vnfName
+                  - cloudRegionId
+                  - vimId
+         customerId:
+            type: string
+            required: true
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.QueryPolicy.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.QueryPolicy.yaml
new file mode 100644 (file)
index 0000000..2ff263b
--- /dev/null
@@ -0,0 +1,26 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+   onap.policies.optimization.service.QueryPolicy:
+      derived_from: onap.policies.optimization.Service
+      version: 1.0.0
+      name: onap.policies.optimization.service.QueryPolicy
+      properties:
+         queryProperties:
+            type: list
+            required: true
+            entry_schema:
+               type: policy.data.queryProperties_properties
+data_types:
+   policy.data.queryProperties_properties:
+      derived_from: tosca.nodes.Root
+      properties:
+         attribute:
+            type: string
+            required: true
+         value:
+            type: string
+            required: true
+         attribute_location:
+            type: string
+            required: true
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/policytypes/onap.policies.optimization.service.SubscriberPolicy.yaml
new file mode 100644 (file)
index 0000000..81dea2c
--- /dev/null
@@ -0,0 +1,36 @@
+tosca_definitions_version: tosca_simple_yaml_1_1_0
+policy_types:
+    onap.policies.optimization.service.SubscriberPolicy:
+        derived_from: onap.policies.optimization.Service
+        version: 1.0.0
+        name: onap.policies.optimization.service.SubscriberPolicy
+        properties:
+            subscriberProperties:
+                type: policy.data.subscriberProperties_properties
+                required: true
+data_types:
+    policy.data.subscriberProperties_properties:
+        derived_from: tosca.nodes.Root
+        properties:
+            subscriberName:
+                type: list
+                required: true
+                metadata:
+                    contextProvider: true
+                entry_schema:
+                    type: string
+            subscriberRole:
+                type: list
+                required: true
+                metadata:
+                    contextMatchable: scope
+                entry_schema:
+                    type: string
+            provStatus:
+                type: list
+                required: true
+                metadata:
+                    contextAttribute: true
+                entry_schema:
+                    type: string
+
diff --git a/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/utils/servicetemplates/pm_control_loop_tosca.yaml b/tosca-controlloop/participant/participant-impl/participant-impl-policy/src/test/resources/utils/servicetemplates/pm_control_loop_tosca.yaml
new file mode 100644 (file)
index 0000000..7d92a08
--- /dev/null
@@ -0,0 +1,614 @@
+tosca_definitions_version: tosca_simple_yaml_1_3
+policy_types:
+   onap.policies.Monitoring:
+      derived_from: tosca.policies.Root
+      version: 1.0.0
+      name: onap.policies.Monitoring
+      description: a base policy type for all policies that govern monitoring provisioning
+   onap.policies.monitoring.dcae-pm-subscription-handler:
+      derived_from: onap.policies.Monitoring
+      version: 1.0.0
+      properties:
+         subscription:
+            type: map
+            description: PM Subscription Handler Subscription
+            entry_schema:
+               type: onap.datatypes.monitoring.subscription
+data_types:
+   onap.datatypes.monitoring.subscription:
+      derived_from: tosca.datatypes.Root
+      properties:
+         subscriptionName:
+            type: string
+            description: Name of the subscription
+            required: true
+         administrativeState:
+            type: string
+            description: State of the subscription
+            required: true
+            constraints:
+            -  valid_values:
+               - LOCKED
+               - UNLOCKED
+         fileBasedGP:
+            type: integer
+            description: File based granularity period
+            required: true
+         fileLocation:
+            type: string
+            description: ROP file location
+            required: true
+         nfTypeModelInvariantId:
+            type: string
+            description: Network function invariant ID
+            required: true
+         nfFilter:
+            type: map
+            description: Network function filter
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.nfFilter
+         measurementGroups:
+            type: list
+            description: Measurement Groups
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementGroups
+   onap.datatypes.monitoring.nfFilter:
+      derived_from: tosca.datatypes.Root
+      properties:
+         nfNames:
+            type: list
+            description: List of network functions
+            required: true
+            #default: []
+            entry_schema:
+               type: string
+         swVersions:
+            type: list
+            description: List of software versions
+            required: true
+            #default: []
+            entry_schema:
+               type: string
+   onap.datatypes.monitoring.measurementGroups:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementGroup:
+            type: map
+            description: Measurement Group
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementGroup
+   onap.datatypes.monitoring.measurementGroup:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementTypes:
+            type: list
+            description: List of measurement types
+            required: true
+            #default: []
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementTypes
+         managedObjectDNsBasic:
+            type: list
+            description: List of managed object distinguished names
+            required: true
+            #default: []
+            entry_schema:
+               type: onap.datatypes.monitoring.managedObjectDNsBasics
+   onap.datatypes.monitoring.measurementTypes:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementType:
+            type: map
+            description: Measurement type object
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.measurementType
+   onap.datatypes.monitoring.measurementType:
+      derived_from: tosca.datatypes.Root
+      properties:
+         measurementType:
+            type: string
+            description: Measurement type
+            required: true
+   onap.datatypes.monitoring.managedObjectDNsBasics:
+      derived_from: tosca.datatypes.Root
+      properties:
+         managedObjectDNsBasic:
+            type: map
+            description: Managed object distinguished name object
+            required: true
+            entry_schema:
+               type: onap.datatypes.monitoring.managedObjectDNsBasic
+   onap.datatypes.monitoring.managedObjectDNsBasic:
+      derived_from: tosca.datatypes.Root
+      properties:
+         DN:
+            type: string
+            description: Managed object distinguished name
+            required: true
+capability_types:
+  org.onap.EventProducer:
+    properties:
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+      event_format:
+        type: string
+        required: true
+      event_format_version:
+        type: string
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+  org.onap.EventConsumer:
+    properties:
+      responding_capability:
+        type: string
+        required: false
+      carrier_protocol_type:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - DMAAP_message_router
+          - SOMETHING_ELSE
+          - REST
+      data_format:
+        type: string
+        required: true
+        constraints:
+        - valid_values:
+          - JSON
+          - YAML
+          - JMS
+          - all valid values should be added here
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, LinkUp, VnfConfigured,
+          etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: false
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key may be generated
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+    version: 0.0.1
+    derived_from: tosca.capabilities.Root
+node_types:
+  org.onap.DynamicConfig:
+    properties:
+      application_name:
+        type: string
+        description: Value used to tie the config to an application ? should we be
+          using a relationship here instead?
+        required: true
+      application_version:
+        type: string
+        required: true
+      application_provider:
+        type: string
+        required: false
+      data_types:
+        type: object
+        required: false
+      schema:
+        type: object
+        required: false
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.APP:
+    properties:
+      application_name:
+        type: string
+        description: Human readable name for the application Product
+        required: false
+      provider:
+        type: string
+        description: Provider of the application and of the descriptor
+        required: true
+      application_version:
+        type: string
+        description: Software version of the application
+        required: true
+      blueprint_id:
+        type: string
+        description: A reference to the app blueprint
+        required: false
+      monitoring_policy:
+        type: string
+        description: A reference to the monitoring policy
+        required: false
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        type: string
+        type_version: 0.0.0
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        type: string
+        type_version: 0.0.0
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+  org.onap.EventRelay:
+    properties:
+      event_format:
+        type: string
+        description: 'examples for event_format: Ves_specification, etc.'
+        required: true
+      event_format_version:
+        type: string
+        description: 'examples for event_format_version: 5.28.4, 7.30.1, etc.'
+        required: true
+      config_keys:
+        type: list
+        required: false
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - all valid values should be added here
+            - if not specified, events of any config key is relayed
+            - 'examples for config_key: ves-measurement, ves-syslog, tca_handle_out,
+              etc.'
+      supported_carrier_protocols:
+        type: map
+        description: 'A map describing supported carrier protocols and translations.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { REST: REST, DMAAP: REST, DMAAP: DMAAP}'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - DMAAP_message_router
+            - SOMETHING_ELSE
+            - REST
+            - all valid values should be added here
+      supported_data_formats:
+        type: map
+        description: 'Is a map describing supported data formats and translation.
+          The tuples define what protocol combinations are supported on the producer
+          and consumer side: e.g. { JSON: JSON, JMS: JSON, YAML:YAML }'
+        required: true
+        key_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+        entry_schema:
+          type: string
+          constraints:
+          - valid_values:
+            - JSON
+            - JMS
+            - YAML
+            - etc
+            - all valid values should be added here
+    requirements:
+    - receive:
+        capability: org.onap.EventProducer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        type: string
+        type_version: 0.0.0
+        version: 0.0.0
+    - send:
+        capability: org.onap.EventConsumer
+        relationship: org.onap.PropagateEvent
+        occurrences:
+        - 0.0
+        - UNBOUNDED
+        type: string
+        type_version: 0.0.0
+        version: 0.0.0
+    version: 0.0.1
+    derived_from: tosca.nodes.Root
+relationship_types:
+  org.onap.PropagateEvent:
+    properties:
+      config_keys:
+        type: list
+        description: The relationship type used on requirements to org.onap.EventProducer
+          and org.onap.EventConsumer capabilities. Filters events by specific config_keys
+          to be transferred by this relationship. That is, any event with a specific
+          config_key found in the list is transferred. If list is not defined or is
+          empty, events with all config_keys are transferred.
+        required: false
+        entry_schema:
+          type: string
+    version: 0.0.1
+    derived_from: tosca.relationships.Root
+topology_template:
+  inputs:
+    pm_subscription_topic:
+      type: string
+    pm_subscription_response_topic:
+      type: string
+    pm_subscription_handler_blueprint_id:
+      type: string
+    pm_subscription_operational_policy_id:
+      type: string
+    pm_subscription_cds_blueprint_id:
+      type: string
+    enable_tls:
+      type: string
+  node_templates:
+    org.onap.PM_Subscription_Handler:
+      type: org.onap.APP
+      type_version: 0.0.0
+      properties:
+        application_name: PM Subscription Handler
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_handler_blueprint_id
+          description: Is this a reference to the DCAE Cloudify Blueprint that is
+            already stored(or will be stored before CL configuration & instatiation)
+            in DCAE Inventory?
+        artifact_config:
+          enable_tls:
+            get_input: enable_tls
+          pmsh_publish_topic_name:
+            get_input: pm_subscription_topic
+      capabilities:
+        pm-subscription-event-publisher:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-format
+            event_format_version: 1.0.0
+          attributes:
+            type: org.onap.EventProducer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+        pm-subscription-event-receiver:
+          properties:
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+            relationships:
+            - type: tosca.relationships.DependsOn
+            - description: any ideas on a better realtionship ? or is it better to
+                just use the root realtionship ?
+            - target: org.onap.PM_Monitoring_Policy
+          attributes:
+            type: org.onap.EventConsumer
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_Monitoring_Policy:
+      type: org.onap.DynamicConfig
+      type_version: 0.0.0
+      properties:
+        application_name: PM Subscription Handler
+        application_version: 1.0.0
+        provider: Ericsson
+        data_types:
+          measurementType:
+            type: string
+          DN:
+            type: string
+          nfFilter:
+            properties:
+              nfNames:
+                type: list
+                entry_schema: string
+              modelInvariantIDs:
+                type: list
+                entry_schema:
+                  type: string
+              modelVersionIDs:
+                type: list
+                entry_schema:
+                  type: string
+          measurementGroup:
+            properties:
+              masurementTypes:
+                type: list
+                entry_schema:
+                  type: measurementType
+              managedObjectDNsBasic:
+                type: list
+                entry_schema:
+                  type: DN
+        schema:
+          subscription:
+            subscriptionName:
+              type: string
+              required: true
+            administrativeState:
+              type: string
+              required: true
+            filebasedGP:
+              type: integer
+              required: true
+            fileLocation:
+              type: string
+              required: true
+            nfFilter:
+              type: nfFilter
+            measurementGroups:
+              type: list
+              entry_schema:
+                type: measurementGroup
+      version: 0.0.0
+      description: Should I be showing a dependency between PM Subscription Handler
+        and the PM Monitoring Policy
+    org.onap.PM_Policy:
+      type: org.onap.APP
+      type_version: 0.0.0
+      properties:
+        application_name: PM Subscription Operational Policy
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_operational_policy_id
+        artifact_config: NOT_DEFINED
+      requirements:
+      - receive_0:
+          capability: pm-subscription-event-publisher
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_topic
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      - send_0:
+          capability: cds-rest-receive
+          node: org.onap.CDS
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      - receive_1:
+          capability: cds-rest-response
+          node: org.onap.CDS
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      - send_1:
+          capability: pm-subscription-event-receiver
+          node: org.onap.PM_Subscription_Handler
+          relationship: NOT_DEFINED
+          properties:
+            config_keys:
+            - topic_name:
+                get_input: pm_subscription_response_topic
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      capabilities:
+        pm-subscription-response-event-publisher:
+          properties:
+            type: org.onap.EventProducer
+            carrier_protocol_type: DMAAP_message_router
+            data_format: JSON
+            event_format: pm-subscription-event-response-format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.PM_CDS_Blueprint:
+      type: org.onap.APP
+      type_version: 0.0.0
+      properties:
+        application_name: PM Subscription CDS Blueprint
+        provider: Ericsson
+        application_version: 1.0.0
+        artifact_id:
+          get_input: pm_subscription_cds_blueprint_id
+      capabilities:
+        cds-rest-receive:
+          properties:
+            type: org.onap.EventConsumer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_format
+            event_format_version: 1.0.0
+            responding_capability: cds-rest-response
+          occurrences:
+          - 0.0
+          - UNBOUNDED
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+        cds-rest-response:
+          properties:
+            type: org.onap.EventProducer
+            protocol_type: REST
+            data_format: JSON
+            event_format: cds_action_response_format
+            event_format_version: 1.0.0
+          occurrences:
+          - 0.0
+          type: string
+          type_version: 0.0.0
+          version: 0.0.0
+      version: 0.0.0
+    org.onap.controlloop0:
+      type: org.onap.APP
+      type_version: 0.0.0
+      properties:
+        application_name: Test Control Loop
+        provider: Ericsson
+        application_version: 1.0.0
+        status: NOT_DEPLOYED
+      version: 0.0.0
+version: 0.0.0
+
diff --git a/tosca-controlloop/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ControlLoopElementListener.java b/tosca-controlloop/participant/participant-intermediary/src/main/java/org/onap/policy/clamp/controlloop/participant/intermediary/api/ControlLoopElementListener.java
new file mode 100644 (file)
index 0000000..ff24d6a
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.clamp.controlloop.participant.intermediary.api;
+
+import java.util.UUID;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
+import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
+
+/**
+ * This interface is implemented by participant implementations to receive updates on control loop elements.
+ */
+public interface ControlLoopElementListener {
+    /**
+     * Handle a control loop element state change.
+     *
+     * @param controlLoopElementId the ID of the control loop element
+     * @param currentState the current state of the control loop element
+     * @param newState the state to which the control loop element is changing to
+     */
+    public void controlLoopElementStateChange(UUID controlLoopElementId, ControlLoopState currentState,
+            ControlLoopOrderedState newState);
+
+    /**
+     * Handle an update on a control loop element.
+     *
+     * @param element the information on the control loop element
+     * @param controlLoopDefinition toscaServiceTemplate
+     * @throws PfModelException in case of a model exception
+     */
+    public void controlLoopElementUpdate(ControlLoopElement element,
+            ToscaServiceTemplate controlLoopDefinition) throws PfModelException;
+}
index 7ea8b4f..defb1cf 100644 (file)
@@ -50,6 +50,13 @@ public interface ParticipantIntermediaryApi {
      */
     void close();
 
+    /**
+     * Register a listener for control loop elements that are mediated by the intermediary.
+     *
+     * @param controlLoopElementListener The control loop element listener to register
+     */
+    void registerControlLoopElementListener(ControlLoopElementListener controlLoopElementListener);
+
     /**
      * Get participants loops from the intermediary API.
      *
index 9e49486..0702868 100644 (file)
@@ -31,6 +31,7 @@ import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.Participant;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantState;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
 import org.onap.policy.clamp.controlloop.participant.intermediary.api.ParticipantIntermediaryApi;
 import org.onap.policy.clamp.controlloop.participant.intermediary.handler.IntermediaryActivator;
 import org.onap.policy.clamp.controlloop.participant.intermediary.handler.ParticipantHandler;
@@ -57,6 +58,12 @@ public class ParticipantIntermediaryApiImpl implements ParticipantIntermediaryAp
         activator.shutdown();
     }
 
+    @Override
+    public void registerControlLoopElementListener(ControlLoopElementListener controlLoopElementListener) {
+        activator.getParticipantHandler().getControlLoopHandler()
+                .registerControlLoopElementListener(controlLoopElementListener);
+    }
+
     @Override
     public List<Participant> getParticipants(String name, String version) {
         return List.of(activator.getParticipantHandler().getParticipant(name, version));
index f27be96..6f8bfff 100644 (file)
@@ -23,8 +23,10 @@ package org.onap.policy.clamp.controlloop.participant.intermediary.handler;
 import java.io.Closeable;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import lombok.Getter;
 import org.apache.commons.collections4.CollectionUtils;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics;
 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
@@ -36,8 +38,10 @@ import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.Parti
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantControlLoopUpdate;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseDetails;
 import org.onap.policy.clamp.controlloop.models.messages.dmaap.participant.ParticipantResponseStatus;
+import org.onap.policy.clamp.controlloop.participant.intermediary.api.ControlLoopElementListener;
 import org.onap.policy.clamp.controlloop.participant.intermediary.comm.MessageSender;
 import org.onap.policy.clamp.controlloop.participant.intermediary.parameters.ParticipantIntermediaryParameters;
+import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,6 +58,9 @@ public class ControlLoopHandler implements Closeable {
     private final Map<ToscaConceptIdentifier, ControlLoop> controlLoopMap = new LinkedHashMap<>();
     private final Map<UUID, ControlLoopElement> elementsOnThisParticipant = new LinkedHashMap<>();
 
+    @Getter
+    private List<ControlLoopElementListener> listeners = new ArrayList<>();
+
     public ControlLoopHandler() {
     }
 
@@ -73,6 +80,10 @@ public class ControlLoopHandler implements Closeable {
         // No explicit action on this class
     }
 
+    public void registerControlLoopElementListener(ControlLoopElementListener listener) {
+        listeners.add(listener);
+    }
+
     /**
      * Handle a control loop element state change message.
      *
@@ -207,6 +218,14 @@ public class ControlLoopHandler implements Closeable {
             elementsOnThisParticipant.put(element.getId(), element);
         }
 
+        for (ControlLoopElementListener clElementListener : listeners) {
+            try {
+                clElementListener.controlLoopElementUpdate(null, updateMsg.getControlLoopDefinition());
+            } catch (PfModelException e) {
+                LOGGER.debug("Control loop element update failed {}", updateMsg.getControlLoopId());
+            }
+        }
+
         response.setResponseStatus(ParticipantResponseStatus.SUCCESS);
         response.setResponseMessage(
                 "Control loop " + updateMsg.getControlLoopId() + " defined on participant " + participantId);