aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--controlloop/templates/pom.xml5
-rw-r--r--controlloop/templates/template.demo.clc/README.md6
-rw-r--r--controlloop/templates/template.demo.clc/pom.xml228
-rw-r--r--controlloop/templates/template.demo.clc/src/main/java/org/onap/policy/guard/CallGuardTaskEmbedded.java166
-rw-r--r--controlloop/templates/template.demo.clc/src/main/java/org/onap/policy/guard/PolicyGuardXacmlHelperEmbedded.java514
-rw-r--r--controlloop/templates/template.demo.clc/src/main/resources/__closedLoopControlName__.drl1440
-rw-r--r--controlloop/templates/template.demo.clc/src/main/resources/coordination/prototype/firstBlocksSecond.xml64
-rw-r--r--controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopCoordinationTest.java554
-rw-r--r--controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopEventCleanupTest.java374
-rw-r--r--controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopParamsCleanupTest.java231
-rw-r--r--controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/SupportUtil.java435
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/META-INF/persistence.xml43
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/coordination/synthetic_control_loop_one_blocks_synthetic_control_loop_two.yaml20
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/properties/prototype/xacml_guard_clc.properties47
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test-B.yaml41
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test.yaml41
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test2.yaml45
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test-B.yaml35
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test.yaml35
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test2.yaml39
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_SyntheticOne.yaml43
-rw-r--r--controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_SyntheticTwo.yaml43
22 files changed, 2 insertions, 4447 deletions
diff --git a/controlloop/templates/pom.xml b/controlloop/templates/pom.xml
index b40f1287b..01e1fb932 100644
--- a/controlloop/templates/pom.xml
+++ b/controlloop/templates/pom.xml
@@ -7,9 +7,9 @@
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.
@@ -33,7 +33,6 @@
<modules>
<module>template.demo</module>
- <module>template.demo.clc</module>
<module>archetype-cl-amsterdam</module>
<module>archetype-cl-usecases</module>
</modules>
diff --git a/controlloop/templates/template.demo.clc/README.md b/controlloop/templates/template.demo.clc/README.md
deleted file mode 100644
index b20161931..000000000
--- a/controlloop/templates/template.demo.clc/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Copyright 2018 AT&T Intellectual Property. All rights reserved.
-This file is licensed under the CREATIVE COMMONS ATTRIBUTION 4.0 INTERNATIONAL LICENSE
-Full license text at https://creativecommons.org/licenses/by/4.0/legalcode
-
-This is the ongoing implementation of template demonstrating use of control loop coordination facility.
-
diff --git a/controlloop/templates/template.demo.clc/pom.xml b/controlloop/templates/template.demo.clc/pom.xml
deleted file mode 100644
index 203d41027..000000000
--- a/controlloop/templates/template.demo.clc/pom.xml
+++ /dev/null
@@ -1,228 +0,0 @@
-<!--
- ============LICENSE_START=======================================================
- drools-applications Control Loop Drools Templates
- ================================================================================
- Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
- Modifications Copyright (C) 2019 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.
- ============LICENSE_END=========================================================
- -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.onap.policy.drools-applications.controlloop.templates</groupId>
- <artifactId>templates</artifactId>
- <version>1.4.0-SNAPSHOT</version>
- </parent>
-
- <artifactId>template.demo.clc</artifactId>
-
- <dependencies>
- <dependency>
- <groupId>com.google.code.gson</groupId>
- <artifactId>gson</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.persistence</groupId>
- <artifactId>org.eclipse.persistence.jpa</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.5</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-core</artifactId>
- <version>6.5.0.Final</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-compiler</artifactId>
- <version>6.5.0.Final</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>appc</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>sdnr</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>appclcm</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>so</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>trafficgenerator</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>vfc</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>sdnc</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>events</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
- <artifactId>database</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
- <artifactId>guard</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
- <artifactId>coordination</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>aai</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-impl</groupId>
- <artifactId>sdc</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions</groupId>
- <artifactId>model-yaml</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
- <artifactId>eventmanager</artifactId>
- <version>${project.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.persistence</groupId>
- <artifactId>javax.persistence</artifactId>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-actors</groupId>
- <artifactId>actorServiceProvider</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-actors</groupId>
- <artifactId>actor.appc</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-actors</groupId>
- <artifactId>actor.sdnr</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-actors</groupId>
- <artifactId>actor.appclcm</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-actors</groupId>
- <artifactId>actor.so</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-actors</groupId>
- <artifactId>actor.vfc</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions.model-actors</groupId>
- <artifactId>actor.sdnc</artifactId>
- <version>${policy.models.version}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.common</groupId>
- <artifactId>policy-endpoints</artifactId>
- <version>${version.policy.common}</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.models.policy-models-interactions</groupId>
- <artifactId>simulators</artifactId>
- <version>${policy.models.version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.onap.policy.drools-pdp</groupId>
- <artifactId>policy-management</artifactId>
- <version>${version.policy.drools-pdp}</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
-</project>
diff --git a/controlloop/templates/template.demo.clc/src/main/java/org/onap/policy/guard/CallGuardTaskEmbedded.java b/controlloop/templates/template.demo.clc/src/main/java/org/onap/policy/guard/CallGuardTaskEmbedded.java
deleted file mode 100644
index 1c4cada61..000000000
--- a/controlloop/templates/template.demo.clc/src/main/java/org/onap/policy/guard/CallGuardTaskEmbedded.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * guard
- * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.guard;
-
-import com.att.research.xacml.api.DataTypeException;
-import com.att.research.xacml.std.annotations.RequestParser;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
-import java.util.function.Supplier;
-import org.drools.core.WorkingMemory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CallGuardTaskEmbedded implements Runnable {
-
- private static final Logger logger = LoggerFactory.getLogger(CallGuardTaskEmbedded.class);
-
- /**
- * Actor/recipe pairs whose guard requests need a VF Module count. Each element is of
- * the form "&lt;actor&gt;:&lt;recipe&gt;".
- */
- private static final Set<String> NEEDS_VF_COUNT = new HashSet<>();
-
- /**
- * Actor/recipe pairs whose guard requests need the VF Module count to be incremented
- * (i.e., because a module is being added). Each element is of the form
- * "&lt;actor&gt;:&lt;recipe&gt;".
- */
- private static final Set<String> INCR_VF_COUNT = new HashSet<>();
-
- static {
- INCR_VF_COUNT.add("SO:VF Module Create");
- NEEDS_VF_COUNT.addAll(INCR_VF_COUNT);
- }
-
- private WorkingMemory workingMemory;
- private String clname;
- private String actor;
- private String recipe;
- private String target;
- private String requestId;
- private Integer vfCount;
-
- /**
- * Populated once the response has been determined, which may happen during the
- * constructor or later, during {@link #run()}.
- */
- private PolicyGuardResponse guardResponse;
-
- /**
- * Guard url is grabbed from PolicyEngine.manager properties
- */
- public CallGuardTaskEmbedded(WorkingMemory wm, String cl, String act, String rec,
- String tar, String reqId, Supplier<Integer> vfcnt) {
- workingMemory = wm;
- clname = cl;
- actor = act;
- recipe = rec;
- requestId = reqId;
- target = tar;
-
- vfCount = null;
-
- String key = act + ":" + rec;
-
- if (NEEDS_VF_COUNT.contains(key)) {
- // this actor/recipe needs the count - get it
- if ((vfCount = vfcnt.get()) == null) {
- /*
- * The count is missing - create an artificial Deny, which will be
- * inserted into working memory when "run()" is called.
- */
- guardResponse = new PolicyGuardResponse(Util.DENY, UUID.fromString(requestId), recipe);
- logger.error("CallEmbeddedGuardTask.run missing VF Module count; requestId={}", requestId);
- return;
- }
-
- if (INCR_VF_COUNT.contains(key)) {
- // this actor/recipe needs the count to be incremented
- ++vfCount;
- }
- }
- }
-
- @Override
- public void run() {
- if (guardResponse != null) {
- // already have a response - just insert it
- workingMemory.insert(guardResponse);
- return;
- }
-
- final long startTime = System.nanoTime();
- com.att.research.xacml.api.Request request = null;
-
- PolicyGuardXacmlRequestAttributes xacmlReq =
- new PolicyGuardXacmlRequestAttributes(clname, actor, recipe, target, requestId, vfCount);
-
- try {
- request = RequestParser.parseRequest(xacmlReq);
- } catch (IllegalArgumentException | IllegalAccessException | DataTypeException e) {
- logger.error("CallEmbeddedGuardTask.run threw: {}", e);
- }
-
-
- logger.debug("\n********** XACML REQUEST START ********");
- logger.debug("{}", request);
- logger.debug("********** XACML REQUEST END ********\n");
-
- String guardDecision = null;
-
- //
- // Make guard request
- //
- guardDecision = new PolicyGuardXacmlHelperEmbedded().callPdp(xacmlReq);
-
- logger.debug("\n********** XACML RESPONSE START ********");
- logger.debug("{}", guardDecision);
- logger.debug("********** XACML RESPONSE END ********\n");
-
- //
- // Check if the restful call was unsuccessful or property doesn't exist
- //
- if (guardDecision == null) {
- logger.error("********** XACML FAILED TO CONNECT ********");
- guardDecision = Util.INDETERMINATE;
- }
-
- guardResponse = new PolicyGuardResponse(guardDecision, UUID.fromString(this.requestId), this.recipe);
-
-
- //
- // Create an artificial Guard response in case we didn't get a clear Permit or Deny
- //
- if ("Indeterminate".equals(guardResponse.getResult())) {
- guardResponse.setOperation(recipe);
- guardResponse.setRequestId(UUID.fromString(requestId));
- }
-
- long estimatedTime = System.nanoTime() - startTime;
- logger.debug("\n\n============ Guard inserted with decision {} !!! =========== time took: {} mili sec \n\n",
- guardResponse.getResult(), (double) estimatedTime / 1000 / 1000);
- workingMemory.insert(guardResponse);
-
- }
-
-}
diff --git a/controlloop/templates/template.demo.clc/src/main/java/org/onap/policy/guard/PolicyGuardXacmlHelperEmbedded.java b/controlloop/templates/template.demo.clc/src/main/java/org/onap/policy/guard/PolicyGuardXacmlHelperEmbedded.java
deleted file mode 100644
index e0cd2c9c4..000000000
--- a/controlloop/templates/template.demo.clc/src/main/java/org/onap/policy/guard/PolicyGuardXacmlHelperEmbedded.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * guard
- * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2019 Samsung Electronics Co., Ltd.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.guard;
-
-import com.att.research.xacml.api.Attribute;
-import com.att.research.xacml.api.AttributeCategory;
-import com.att.research.xacml.api.AttributeValue;
-import com.att.research.xacml.api.Result;
-import com.att.research.xacml.api.pdp.PDPEngine;
-import com.att.research.xacml.std.annotations.RequestParser;
-import com.att.research.xacmlatt.pdp.ATTPDPEngineFactory;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Serializable;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Base64;
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.UUID;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.http.entity.ContentType;
-import org.json.JSONObject;
-import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
-import org.onap.policy.common.endpoints.utils.NetLoggerUtil;
-import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
-import org.onap.policy.database.operationshistory.Dbao;
-import org.onap.policy.drools.system.PolicyEngine;
-import org.onap.policy.guard.PolicyGuardResponse;
-import org.onap.policy.guard.PolicyGuardXacmlRequestAttributes;
-import org.onap.policy.guard.Util;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-public class PolicyGuardXacmlHelperEmbedded {
- private static final Logger logger = LoggerFactory.getLogger(PolicyGuardXacmlHelperEmbedded.class);
-
- private String propfile;
- private UrlEntry[] restUrls = null;
- private int restUrlIndex = 0;
-
- // REST timeout, initialized from 'pdpx.timeout' property
- private int timeout = 20000;
-
- public PolicyGuardXacmlHelperEmbedded() {
- init(PolicyEngine.manager.getEnvironment());
- }
-
- // initialized from 'pdpx.url' property --
- // Each entry in 'restUrls' contains a destination URL, and an optional
- // 'Authorization' header entry. 'restUrlIndex' indicates the next
- // entry to try -- after each failure, the index is advanced to the
- // next entry (wrapping to the beginning, if needed).
- private static class UrlEntry implements Serializable {
- private static final long serialVersionUID = -8859237552195400518L;
-
- URL restUrl;
- String authorization = null;
- String clientAuth = null;
- String environment = null;
- }
-
- /**
- * Call PDP.
- *
- * @param xacmlReq the XACML request
- * @return the response
- */
- public String callPdp(PolicyGuardXacmlRequestAttributes xacmlReq) {
- //
- // Send it to the PDP
- //
- String response = null;
-
- if ( propfile != null ) {
- logger.debug("callEmbeddedPdp");
- return callEmbeddedPdp(xacmlReq);
- }
- //
- // Build the json request
- //
- JSONObject attributes = new JSONObject();
- attributes.put("actor", xacmlReq.getActorId());
- attributes.put("recipe", xacmlReq.getOperationId());
- attributes.put("target", xacmlReq.getTargetId());
- if (xacmlReq.getClnameId() != null) {
- attributes.put("clname", xacmlReq.getClnameId());
- }
- if (xacmlReq.getVfCount() != null) {
- attributes.put("vfCount", xacmlReq.getVfCount());
- }
- JSONObject jsonReq = new JSONObject();
- jsonReq.put("decisionAttributes", attributes);
- jsonReq.put("onapName", "PDPD");
-
-
- try {
- //
- // Call RESTful PDP
- //
- UrlEntry urlEntry = restUrls[restUrlIndex];
- String jsonRequestString = jsonReq.toString();
- NetLoggerUtil.log(EventType.OUT, CommInfrastructure.REST, urlEntry.restUrl.toString(), jsonRequestString);
- response = callRestfulPdp(new ByteArrayInputStream(jsonReq.toString().getBytes()), urlEntry.restUrl,
- urlEntry.authorization, urlEntry.clientAuth, urlEntry.environment);
- NetLoggerUtil.log(EventType.IN, CommInfrastructure.REST, urlEntry.restUrl.toString(), response);
- } catch (Exception e) {
- logger.error("Error in sending RESTful request", e);
- }
-
- return response;
- }
-
- /**
- * This makes an HTTP POST call to a running PDP RESTful servlet to get a decision.
- *
- * @param is the InputStream
- * @param authorization the Authorization
- * @param clientauth the ClientAuth
- * @param environment the Environment
- * @return response from guard which contains "Permit" or "Deny"
- */
- private String callRestfulPdp(InputStream is, URL restUrl, String authorization, String clientauth,
- String environment) {
- HttpURLConnection connection = null;
-
- try {
- //
- // Open up the connection
- //
- connection = (HttpURLConnection) restUrl.openConnection();
- connection.setRequestProperty("Content-Type", "application/json");
- //
- // Setup our method and headers
- //
- connection.setRequestProperty("Accept", "application/json");
- if (authorization != null) {
- connection.setRequestProperty("Authorization", authorization);
- }
- if (clientauth != null) {
- connection.setRequestProperty("ClientAuth", clientauth);
- }
- if (environment != null) {
- connection.setRequestProperty("Environment", environment);
- }
- connection.setConnectTimeout(timeout);
- connection.setReadTimeout(timeout);
- connection.setRequestMethod("POST");
- connection.setUseCaches(false);
- //
- // Adding this in. It seems the HttpUrlConnection class does NOT
- // properly forward our headers for POST re-direction. It does so
- // for a GET re-direction.
- //
- // So we need to handle this ourselves.
- //
- connection.setInstanceFollowRedirects(false);
- connection.setDoOutput(true);
- connection.setDoInput(true);
- //
- // Send the request
- //
- try (OutputStream os = connection.getOutputStream()) {
- IOUtils.copy(is, os);
- }
-
- //
- // Do the connect
- //
- connection.connect();
-
- if (connection.getResponseCode() != 200) {
- logger.error("{} {}", connection.getResponseCode(), connection.getResponseMessage());
- return Util.INDETERMINATE;
- }
- } catch (Exception e) {
- logger.error("Exception in 'PolicyGuardEmbeddedHelper.callRESTfulPDP'", e);
- return Util.INDETERMINATE;
- }
-
- //
- // Read the response
- //
- try {
- ContentType contentType = ContentType.parse(connection.getContentType());
-
- if (contentType.getMimeType().equalsIgnoreCase(ContentType.APPLICATION_JSON.getMimeType())) {
- InputStream inputStream = connection.getInputStream();
- int contentLength = connection.getContentLength();
-
- return readResponseFromStream(inputStream, contentLength);
- } else {
- logger.error("unknown content-type: {}", contentType);
- return Util.INDETERMINATE;
- }
-
- } catch (Exception e) {
- String message = "Parsing Content-Type: " + connection.getContentType();
- logger.error(message, e);
- return Util.INDETERMINATE;
- }
- }
-
- /**
- * Call embedded PDP.
- *
- * @param xacmlReq the XACML request
- * @return the response
- */
- public String callEmbeddedPdp(PolicyGuardXacmlRequestAttributes xacmlReq) {
- com.att.research.xacml.api.Response response = null;
- Properties props = new Properties();
- //
- // Get properties
- //
- try ( InputStream is = new FileInputStream(propfile);
- InputStreamReader isr = new InputStreamReader(is);
- BufferedReader br = new BufferedReader(isr) ) {
- props.load(br);
- } catch (Exception e) {
- logger.error("Unable to load properties file {}", propfile, e);
- }
- //
- // Create embedded PDPEngine
- //
- PDPEngine xacmlPdpEngine;
- try {
- xacmlPdpEngine = ATTPDPEngineFactory.newInstance().newEngine(props);
- } catch (Exception e) {
- logger.error("callEmbeddedPdpEngine failed to create new PDPEngine", e);
- return null;
- }
- logger.debug("embedded Engine created");
- //
- // Embedded call to PDP
- //
- long timeStart = System.currentTimeMillis();
- if (xacmlReq.getVfCount() == null ) {
- xacmlReq.setVfCount(1);
- }
- try {
- response = xacmlPdpEngine.decide(RequestParser.parseRequest(xacmlReq));
- } catch (Exception e) {
- logger.error("callEmbeddedPdpEngine failed on decide", e);
- }
- long timeEnd = System.currentTimeMillis();
- logger.debug("Elapsed Time: {} ms", (timeEnd - timeStart));
- //
- // Convert response to string
- //
- logger.debug("converting response to string");
- PolicyGuardResponse pgr = parseXacmlPdpResponse(response);
- logger.debug("parsed XacmlPdpResponse {}", pgr);
- String decision = pgr.getResult();
- logger.debug("decision={}",decision);
- return decision;
- }
-
- /**
- * Parse XACML PDP response.
- *
- * @param xacmlResponse the XACML response
- * @return the PolicyGuardResponse
- */
- public static PolicyGuardResponse parseXacmlPdpResponse(com.att.research.xacml.api.Response xacmlResponse) {
- if (xacmlResponse == null) {
- //
- // In case the actual XACML response was null, create an empty
- // response object with decision "Indeterminate"
- //
- return new PolicyGuardResponse("Indeterminate", null, "");
- }
-
- Iterator<Result> itRes = xacmlResponse.getResults().iterator();
-
- Result res = itRes.next();
- String decisionFromXacmlResponse = res.getDecision().toString();
- Iterator<AttributeCategory> itAttrCat = res.getAttributes().iterator();
- UUID reqIdFromXacmlResponse = null;
- String operationFromXacmlResponse = "";
-
- while (itAttrCat.hasNext()) {
- Iterator<Attribute> itAttr = itAttrCat.next().getAttributes().iterator();
- while (itAttr.hasNext()) {
- Attribute currentAttr = itAttr.next();
- String attributeId = currentAttr.getAttributeId().stringValue();
- if ("urn:org:onap:guard:request:request-id".equals(attributeId)) {
- Iterator<AttributeValue<?>> itValues = currentAttr.getValues().iterator();
- reqIdFromXacmlResponse = UUID.fromString(itValues.next().getValue().toString());
- }
- if ("urn:org:onap:guard:operation:operation-id".equals(attributeId)) {
- Iterator<AttributeValue<?>> itValues = currentAttr.getValues().iterator();
- operationFromXacmlResponse = itValues.next().getValue().toString();
- }
- }
- }
-
- return new PolicyGuardResponse(decisionFromXacmlResponse, reqIdFromXacmlResponse, operationFromXacmlResponse);
-
- }
-
- private void init(Properties properties) {
- propfile = properties.getProperty("prop.guard.propfile");
-
- // used to store error messages
- StringBuilder sb = new StringBuilder();
-
- // fetch these parameters, if they exist
- String timeoutString = properties.getProperty("pdpx.timeout");
- String disabledString = properties.getProperty("guard.disabled");
-
- if (disabledString != null && Boolean.parseBoolean(disabledString)) {
- return;
- }
-
- ArrayList<UrlEntry> entries = initEntries(properties, sb);
-
- if (entries.isEmpty()) {
- sb.append("'pdpx.*' -- no URLs specified, ");
- } else {
- restUrls = entries.toArray(new UrlEntry[0]);
- }
-
- if (timeoutString != null) {
- try {
- // decode optional 'pdpx.timeout' parameter
- timeout = Integer.valueOf(timeoutString);
- } catch (NumberFormatException e) {
- sb.append("'pdpx.timeout': " + e + ", ");
- logger.trace(e.getLocalizedMessage());
- }
- }
-
-
- // if there are any errors, update 'errorMessage' & disable guard
- // queries
- if (sb.length() != 0) {
- // remove the terminating ", ", and extract resulting error message
- sb.setLength(sb.length() - 2);
- String errorMessage = sb.toString();
- logger.error("Initialization failure: {}", errorMessage);
- }
- }
-
- private ArrayList<UrlEntry> initEntries(Properties properties, StringBuilder sb) {
- // now, see which numeric entries (1-9) exist
- ArrayList<UrlEntry> entries = new ArrayList<>();
-
- for (int index = 0; index < 10; index += 1) {
- String urlPrefix = "guard.";
- if (index != 0) {
- urlPrefix = urlPrefix + index + ".";
- }
-
- // see if the associated URL exists
- String restUrllist = properties.getProperty(urlPrefix + "url");
- if (nullOrEmpty(restUrllist)) {
- // no entry for this index
- continue;
- }
-
- // support a list of entries separated by semicolons. Each entry
- // can be:
- // URL
- // URL,user
- // URL,user,password
- for (String restUrl : restUrllist.split("\\s*;\\s*")) {
- UrlEntry entry = initRestUrl(properties, sb, restUrl);
- // include this URLEntry in the list
- if (entry != null) {
- entries.add(entry);
- }
- }
- }
-
- return entries;
- }
-
- private UrlEntry initRestUrl(Properties properties, StringBuilder sb, String restUrl) {
- String urlPrefix = "guard.";
- String pdpxPrefix = "pdpx.";
-
- String[] segments = restUrl.split("\\s*,\\s*");
- String user = null;
- String password = null;
-
- if (segments.length >= 2) {
- // user id is provided
- restUrl = segments[0];
- user = segments[1];
- if (segments.length >= 3) {
- // password is also provided
- password = segments[2];
- }
- }
-
- // URL does exist -- create the entry
- UrlEntry urlEntry = new UrlEntry();
- try {
- urlEntry.restUrl = new URL(restUrl);
- } catch (java.net.MalformedURLException e) {
- // if we don't have a URL,
- // don't bother with the rest on this one
- sb.append("'").append(urlPrefix).append("url' '").append(restUrl).append("': ").append(e).append(",");
- return null;
- }
-
- if (nullOrEmpty(user)) {
- // user id was not provided on '*.url' line --
- // extract it from a separate property
- user = properties.getProperty(pdpxPrefix + "username", properties.getProperty("pdpx.username"));
- }
- if (nullOrEmpty(password)) {
- // password was not provided on '*.url' line --
- // extract it from a separate property
- password = properties.getProperty(pdpxPrefix + "password", properties.getProperty("pdpx.password"));
- }
-
- // see if 'user' and 'password' entries both exist
- if (!nullOrEmpty(user) && !nullOrEmpty(password)) {
- urlEntry.authorization = "Basic " + Base64.getEncoder().encodeToString((user + ":" + password).getBytes());
- }
-
- // see if 'client.user' and 'client.password' entries both exist
- String clientUser =
- properties.getProperty(pdpxPrefix + "client.username", properties.getProperty("pdpx.client.username"));
- String clientPassword =
- properties.getProperty(pdpxPrefix + "client.password", properties.getProperty("pdpx.client.password"));
- if (!nullOrEmpty(clientUser) && !nullOrEmpty(clientPassword)) {
- urlEntry.clientAuth =
- "Basic " + Base64.getEncoder().encodeToString((clientUser + ":" + clientPassword).getBytes());
- }
-
- // see if there is an 'environment' entry
- String environment =
- properties.getProperty(pdpxPrefix + "environment", properties.getProperty("pdpx.environment"));
- if (!nullOrEmpty(environment)) {
- urlEntry.environment = environment;
- }
-
- return urlEntry;
- }
-
- /**
- * Check if a string is null or an empty string.
- *
- * @param value the string to be tested
- * @return 'true' if the string is 'null' or has a length of 0, 'false' otherwise
- */
- private static boolean nullOrEmpty(String value) {
- return (value == null || value.isEmpty());
- }
-
- private static String readResponseFromStream(InputStream inputStream, int contentLength) throws IOException {
- // if content length is -1, response is chunked, and
- // TCP connection will be dropped at the end
- byte[] buf = new byte[contentLength < 0 ? 1024 : contentLength];
-
- int offset = 0;
- do {
- int size = inputStream.read(buf, offset, buf.length - offset);
- if (size < 0) {
- // In a chunked response a dropped connection is expected, but not if the response
- // is not chunked
- if (contentLength > 0) {
- logger.error("partial input stream");
- }
- break;
- }
- offset += size;
- }
- while (offset != contentLength);
-
- String response = new String(buf, 0, offset);
-
- //
- // Connection may have failed or not been 200 OK, return Indeterminate
- //
- if (response.isEmpty()) {
- return Util.INDETERMINATE;
- }
-
- return new JSONObject(response).getString("decision");
-
- }
-}
diff --git a/controlloop/templates/template.demo.clc/src/main/resources/__closedLoopControlName__.drl b/controlloop/templates/template.demo.clc/src/main/resources/__closedLoopControlName__.drl
deleted file mode 100644
index 1d8e6c511..000000000
--- a/controlloop/templates/template.demo.clc/src/main/resources/__closedLoopControlName__.drl
+++ /dev/null
@@ -1,1440 +0,0 @@
-/*
- * ============LICENSE_START=======================================================
- * ONAP
- * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.controlloop;
-
-import org.onap.policy.controlloop.VirtualControlLoopEvent;
-import org.onap.policy.controlloop.VirtualControlLoopNotification;
-import org.onap.policy.controlloop.ControlLoopEventStatus;
-import org.onap.policy.controlloop.ControlLoopException;
-import org.onap.policy.controlloop.ControlLoopNotificationType;
-import org.onap.policy.controlloop.ControlLoopLogger;
-import org.onap.policy.controlloop.policy.PolicyResult;
-import org.onap.policy.controlloop.policy.ControlLoopPolicy;
-import org.onap.policy.controlloop.policy.Policy;
-import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager;
-import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager.NewEventStatus;
-import org.onap.policy.controlloop.eventmanager.ControlLoopOperationManager;
-import org.onap.policy.controlloop.actor.so.SoActorServiceProvider;
-import org.onap.policy.aai.AaiNqResponseWrapper;
-import org.onap.policy.appc.Request;
-import org.onap.policy.appc.Response;
-import org.onap.policy.appc.CommonHeader;
-import org.onap.policy.appclcm.LcmRequestWrapper;
-import org.onap.policy.appclcm.LcmResponseWrapper;
-import org.onap.policy.appclcm.LcmRequest;
-import org.onap.policy.appclcm.LcmResponse;
-import org.onap.policy.appclcm.LcmCommonHeader;
-import org.onap.policy.vfc.VfcRequest;
-import org.onap.policy.vfc.VfcResponse;
-import org.onap.policy.vfc.VfcManager;
-import org.onap.policy.so.SoManager;
-import org.onap.policy.so.SoRequest;
-import org.onap.policy.so.SoResponseWrapper;
-import org.onap.policy.guard.PolicyGuard;
-import org.onap.policy.guard.PolicyGuard.LockResult;
-import org.onap.policy.guard.TargetLock;
-import org.onap.policy.guard.GuardResult;
-import org.onap.policy.guard.PolicyGuardRequest;
-import org.onap.policy.guard.PolicyGuardResponse;
-import org.onap.policy.guard.PolicyGuardXacmlRequestAttributes;
-import org.onap.policy.guard.CallGuardTaskEmbedded;
-
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-
-import org.slf4j.LoggerFactory;
-import org.slf4j.Logger;
-
-import java.time.Instant;
-import java.util.LinkedList;
-import java.util.Iterator;
-
-import org.onap.policy.drools.system.PolicyEngine;
-
-/*
- * This structure mimics the Params structure.
- * Its only purpose is to allow management of
- * rules by the PAP component..
- * It has no use at runtime since the rules go by
- * Params for matching purposes.
- */
-declare PapParams
- closedLoopControlName : String
- controlLoopYaml : String
-end
-
-/*
- * Control Loop Identity
- */
-declare Params
- closedLoopControlName : String
- controlLoopYaml : String
-end
-
-/*
- * Used to trigger clean up Params that no longer have associated rules.
- */
-declare ParamsInitCleaner
- closedLoopControlName : String // only used when logging
-end
-
-/*
- * Used to clean up Params that no longer have associated rules.
- */
-declare ParamsCleaner
- closedLoopControlName : String
- controlLoopYaml : String
-end
-
-
-/*
- * Operation Timer
- */
-declare OperationTimer
- closedLoopControlName : String
- requestId : String
- delay : String
-end
-
-/*
- * Control Loop Timer
- */
-declare ControlLoopTimer
- closedLoopControlName : String
- requestId : String
- delay : String
-end
-
-/*
-*
-* Called to insert the parameters into working memory for this Closed Loop policy. This is called
-* once each time a closed loop is added or its YAML is updated.
-* This has a higher salience so we can ensure that the Params is created before we have a chance to
-* discard any events.
-*
-*/
-rule "${policyName}.SETUP"
- salience 1
- when
- not( Params( getClosedLoopControlName() == "${closedLoopControlName}", getControlLoopYaml() == "${controlLoopYaml}" ) )
- then
-
- Params params = new Params();
- params.setClosedLoopControlName("${closedLoopControlName}");
- params.setControlLoopYaml("${controlLoopYaml}");
- insert(params);
-
- ParamsInitCleaner initCleaner = new ParamsInitCleaner();
- initCleaner.setClosedLoopControlName("${closedLoopControlName}");
- insert(initCleaner);
-
- // Note: globals have bad behavior when persistence is used,
- // hence explicitly getting the logger vs using a global
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {} : YAML=[{}]", params.getClosedLoopControlName(), drools.getRule().getName(), params.getControlLoopYaml());
-end
-
-/*
-*
-* This rule responds to DCAE Events where there is no manager yet. Either it is
-* the first ONSET, or a subsequent badly formed Event (i.e. Syntax error, or is-closed-loop-disabled)
-*
-*/
-rule "${policyName}.EVENT"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() )
- not ( ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() ) )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName());
-
- try {
-
- //
- // Check the event, because we need it to not be null when
- // we create the ControlLoopEventManager. The ControlLoopEventManager
- // will do extra syntax checking as well check if the closed loop is disabled.
- //
- if ($event.getRequestId() == null) {
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setNotification(ControlLoopNotificationType.REJECTED);
- notification.setFrom("policy");
- notification.setMessage("Missing requestId");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
-
- //
- // Let interested parties know
- //
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
-
- //
- // Retract it from memory
- //
- retract($event);
- } else if ($event.getClosedLoopEventStatus() != ControlLoopEventStatus.ONSET) {
- throw new ControlLoopException($event.getClosedLoopEventStatus() + " received with no prior onset");
- } else {
- //
- // Create an EventManager
- //
- ControlLoopEventManager manager = new ControlLoopEventManager($params.getClosedLoopControlName(), $event.getRequestId());
- //
- // Disable target locking
- //
- manager.setUseTargetLock(false);
- //
- // Determine if EventManager can actively process the event (i.e. syntax, is_closed_loop_disabled checks etc.)
- //
- VirtualControlLoopNotification notification = manager.activate($params.getControlLoopYaml(), $event);
- notification.setFrom("pdp-0001-controller=controlloop"); // Engine.getInstanceName()
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- //
- // Are we actively pursuing this event?
- //
- if (notification.getNotification() == ControlLoopNotificationType.ACTIVE) {
- //
- // Insert Event Manager into memory, this will now kick off processing.
- //
- insert(manager);
- //
- // Let interested parties know
- //
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- //
- // Setup the Overall Control Loop timer
- //
- ControlLoopTimer clTimer = new ControlLoopTimer();
- clTimer.setClosedLoopControlName($event.getClosedLoopControlName());
- clTimer.setRequestId($event.getRequestId().toString());
- clTimer.setDelay(manager.getControlLoopTimeout(1500) + "s");
- //
- // Insert it
- //
- insert(clTimer);
- } else {
- //
- // Let interested parties know
- //
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- //
- // Retract it from memory
- //
- retract($event);
- }
-
- //
- // Now that the manager is inserted into Drools working memory, we'll wait for
- // another rule to fire in order to continue processing. This way we can also
- // then screen for additional ONSET and ABATED events for this RequestId.
- //
- }
- } catch (Exception e) {
- logger.warn("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName(), e);
-
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setNotification(ControlLoopNotificationType.REJECTED);
- notification.setMessage("Exception occurred: " + e.getMessage());
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- //
- //
- //
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- //
- // Retract the event
- //
- retract($event);
- }
-end
-
-/*
-*
-* This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager
-* is now created. We can start processing the yaml specification via the Event Manager.
-*
-*/
-rule "${policyName}.EVENT.MANAGER"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $clTimer : ControlLoopTimer ( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId().toString() )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}: event={} manager={} clTimer={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event, $manager, $clTimer);
-
- try {
- //
- // Check which event this is.
- //
- ControlLoopEventManager.NewEventStatus eventStatus = $manager.onNewEvent($event);
- //
- // Check what kind of event this is
- //
- if (eventStatus == NewEventStatus.SUBSEQUENT_ONSET) {
- //
- // We don't care about subsequent onsets
- //
- logger.info("{}: {}: subsequent onset",
- $params.getClosedLoopControlName(), drools.getRule().getName());
- retract($event);
- return;
- }
- if (eventStatus == NewEventStatus.SYNTAX_ERROR) {
- //
- // Ignore any bad syntax events
- //
- logger.warn("{}: {}: syntax error",
- $params.getClosedLoopControlName(), drools.getRule().getName());
- retract($event);
- return;
- }
- //
- // We only want the initial ONSET event in memory,
- // all the other events need to be retracted to support
- // cleanup and avoid the other rules being fired for this event.
- //
- if (eventStatus != NewEventStatus.FIRST_ONSET) {
- logger.warn("{}: {}: not first onset",
- $params.getClosedLoopControlName(), drools.getRule().getName());
- retract($event);
- }
-
- logger.debug("{}: {}: target={}", $params.getClosedLoopControlName(),
- drools.getRule().getName(), $event.getTarget());
- //
- // Now start seeing if we need to process this event
- //
-
- //
- // Check if this is a Final Event
- //
- VirtualControlLoopNotification notification = $manager.isControlLoopFinal();
-
- if (notification != null) {
- //
- // Set common notification fields
- //
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- //
- // Its final, but are we waiting for abatement?
- //
- if ($manager.getNumAbatements() > 0) {
- //
- // We have received an abatement and are done
- //
- logger.info("{}: {}: abatement received for {}. Closing the control loop",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event.getRequestId());
- //
- // Set notification message
- //
- notification.setMessage("Abatement received. Closing the control loop.");
- //
- /// DB Write---end event processing for this RequestId()
- //
- $manager.commitAbatement("Event Abated","Closed");
- //
- // Unlock the target
- //
- TargetLock lock = $manager.unlockCurrentOperation();
- if (lock != null) {
- logger.debug("{}: {}: retracting lock=", $params.getClosedLoopControlName(),
- drools.getRule().getName(), lock);
- retract(lock);
- }
- //
- // Retract everything from memory
- //
- logger.info("{}: {}: retracting onset, manager, and timer",
- $params.getClosedLoopControlName(), drools.getRule().getName());
-
- retract($manager.getOnsetEvent());
-
- // don't retract manager, etc. - a clean-up rule will do that
- //
- // TODO - what if we get subsequent Events for this RequestId?
- // By default, it will all start over again. May be confusing for Ruby.
- // Or, we could track this and then subsequently ignore the events
- //
- } else {
- //
- // Check whether we need to wait for abatement
- //
- if ($manager.getProcessor().getControlLoop().getAbatement() == true && notification.getNotification() == ControlLoopNotificationType.FINAL_SUCCESS) {
- //
- // We will wait
- //
- logger.info("{}: {}: waiting for abatement ..",
- $params.getClosedLoopControlName(), drools.getRule().getName());
- //
- // Set notification message
- //
- notification.setMessage("Waiting for abatement");
- } else {
- //
- // We are done
- //
- logger.info("{}: {}: no abatement expected for {}. Closing the control loop",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event.getRequestId());
- //
- // Set notification message
- //
- notification.setMessage("No abatement expected. Closing the control loop.");
- //
- // Unlock the target
- //
- TargetLock lock = $manager.unlockCurrentOperation();
- if (lock != null) {
- logger.debug("{}: {}: retracting lock=", $params.getClosedLoopControlName(),
- drools.getRule().getName(), lock);
- retract(lock);
- }
- //
- // Retract everything from memory
- //
- logger.info("{}: {}: retracting onset, manager, and timer",
- $params.getClosedLoopControlName(), drools.getRule().getName());
-
- retract($manager.getOnsetEvent());
-
- // don't retract manager, etc. - a clean-up rule will do that
- }
- }
- //
- // Send the notification
- //
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- } else {
- //
- // NOT final, so let's ask for the next operation
- //
- ControlLoopOperationManager operation = $manager.processControlLoop();
- if (operation != null) {
- //
- // Let's ask for a lock right away
- //
- LockResult<GuardResult, TargetLock> result = $manager.lockCurrentOperation();
- logger.info("{}: {}: guard lock acquired={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- result.getB());
- if (result.getA().equals(GuardResult.LOCK_ACQUIRED)) {
- //
- // insert the operation into memory
- //
- insert(operation);
-
- //
- // insert operation timeout object
- //
- OperationTimer opTimer = new OperationTimer();
- opTimer.setClosedLoopControlName($event.getClosedLoopControlName());
- opTimer.setRequestId($event.getRequestId().toString());
- opTimer.setDelay(operation.getOperationTimeout().toString() + "s");
- insert(opTimer);
-
- //
- // Insert lock into memory
- //
- insert(result.getB());
- }
- else {
- logger.debug("The target resource {} is already processing",
- $event.getAai().get($event.getTarget()));
- notification = new VirtualControlLoopNotification($event);
- notification.setNotification(ControlLoopNotificationType.REJECTED);
- notification.setMessage("The target " + $event.getAai().get($event.getTarget()) + " is already locked");
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
-
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
-
- retract($event);
-
- // don't retract manager, etc. - a clean-up rule will do that
-
- if(result.getB() != null) {
- retract(result.getB());
- }
- }
- logger.info("{}: {}: starting operation={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- operation);
- } else {
- //
- // Probably waiting for abatement
- //
- logger.info("{}: {}: no operation, probably waiting for abatement",
- $params.getClosedLoopControlName(), drools.getRule().getName());
- }
- }
- } catch (Exception e) {
- logger.warn("{}: {}: unexpected",
- $params.getClosedLoopControlName(),
- drools.getRule().getName(), e);
-
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setNotification(ControlLoopNotificationType.FINAL_FAILURE);
- notification.setMessage(e.getMessage());
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
-
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
-
- retract($event);
-
- // don't retract manager, etc. - a clean-up rule will do that
- }
-
-end
-
-/*
-*
-* Guard Permitted, let's send request to the actor.
-*
-*/
-rule "${policyName}.EVENT.MANAGER.OPERATION.LOCKED.GUARD_PERMITTED"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.getClosedLoopControlName(), onset.getRequestId() == $event.getRequestId(), "Permit".equalsIgnoreCase(getGuardApprovalStatus()) )
- $lock : TargetLock (requestId == $event.getRequestId())
- $opTimer : OperationTimer( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId().toString() )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}: event={} manager={} operation={} lock={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event, $manager, $operation, $lock);
-
- Object request = null;
- boolean caughtException = false;
-
- try {
- request = $operation.startOperation($event);
-
- if (request != null) {
- logger.debug("{}: {}: starting operation ..",
- $params.getClosedLoopControlName(), drools.getRule().getName());
- //
- // Tell interested parties we are performing this Operation
- //
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setNotification(ControlLoopNotificationType.OPERATION);
- notification.setMessage($operation.getOperationMessage());
- notification.setHistory($operation.getHistory());
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
-
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
-
- switch ($operation.policy.getActor()){
-
- case "APPC":
-
- if (request instanceof Request) {
- PolicyEngine.manager.deliver("APPC-CL", request);
- }
- else if (request instanceof LcmRequestWrapper) {
- PolicyEngine.manager.deliver("APPC-LCM-READ", request);
- }
- break;
- case "SO":
- // at this point the AAI named query request should have already been made, the response received
- // and used in the construction of the SO Request which is stored in operationRequest
-
- if(request instanceof SoRequest) {
- // Call SO. The response will be inserted into memory once it's received
- class mySoCallback implements SoManager.SoCallback {
- public void onSoResponseWrapper(SoResponseWrapper wrapper) {
- drools.getWorkingMemory().insert(wrapper);
- }
- }
- SoActorServiceProvider.sendRequest($event.getRequestId().toString(),
- new mySoCallback(),
- request,
- PolicyEngine.manager.getEnvironmentProperty("so.url"),
- PolicyEngine.manager.getEnvironmentProperty("so.username"),
- PolicyEngine.manager.getEnvironmentProperty("so.password")); }
- break;
- case "VFC":
- if (request instanceof VfcRequest) {
- // Start VFC thread
- class myVfcCallback implements VfcManager.VfcCallback {
- public void onResponse(VfcResponse responseError) {
- drools.getWorkingMemory().insert(responseError);
- }
- };
- // Start VFC thread
- Thread t = new Thread(new VfcManager(new myVfcCallback(),
- (VfcRequest)request,
- PolicyEngine.manager.getEnvironmentProperty("vfc.url"),
- PolicyEngine.manager.getEnvironmentProperty("vfc.username"),
- PolicyEngine.manager.getEnvironmentProperty("vfc.password")));
- t.start();
- }
- break;
- }
- } else {
- //
- // What happens if its null?
- //
- logger.warn("{}: {}: unexpected null operation request",
- $params.getClosedLoopControlName(),
- drools.getRule().getName());
- if ("SO".equals($operation.policy.getActor())) {
- retract($opTimer);
- retract($operation);
- modify($manager) {finishOperation($operation)};
- }
- else if ("vfc".equalsIgnoreCase($operation.policy.getActor())) {
- retract($opTimer);
- retract($operation);
- modify($manager) {finishOperation($operation)};
- }
- }
-
- } catch (Exception e) {
- String msg = e.getMessage();
- logger.warn("{}: {}: operation={}: AAI failure: {}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $operation, msg, e);
- $operation.setOperationHasException(msg);
-
- if(request != null) {
- //
- // Create a notification for it ("DB Write - end operation")
- //
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- notification.setNotification(ControlLoopNotificationType.OPERATION_FAILURE);
- notification.setMessage($operation.getOperationHistory());
- notification.setHistory($operation.getHistory());
-
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- }
-
- retract($opTimer);
- retract($operation);
- caughtException = true;
- }
-
- // Having the modify statement in the catch clause doesn't work for whatever reason
- if (caughtException) {
- modify($manager) {finishOperation($operation)};
- }
-end
-
-
-/*
-*
-* We were able to acquire a lock so now let's ask Xacml Guard whether
-* we are allowed to proceed with the request to the actor.
-*
-*/
-rule "${policyName}.EVENT.MANAGER.OPERATION.LOCKED.GUARD_NOT_YET_QUERIED"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.getClosedLoopControlName(), onset.getRequestId() == $event.getRequestId(), getGuardApprovalStatus() == "NONE" )
- $lock : TargetLock (requestId == $event.getRequestId())
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}: event={} manager={} operation={} lock={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event, $manager, $operation, $lock);
-
- //
- // Sending notification that we are about to query Guard ("DB write - start operation")
- //
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setNotification(ControlLoopNotificationType.OPERATION);
- notification.setMessage("Sending guard query for " + $operation.policy.getActor() + " " + $operation.policy.getRecipe());
- notification.setHistory($operation.getHistory());
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
-
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
-
- //
- // Now send Guard Request to XACML Guard. In order to bypass the call to Guard,
- // just change guardEnabled to false.
- //
- //
-
- // NOTE: The environment properties uses "guard.disabled" but the boolean is guardEnabled
- boolean guardEnabled = "false".equalsIgnoreCase(PolicyEngine.manager.getEnvironmentProperty("guard.disabled"));
-
- if(guardEnabled){
-
- Thread t = new Thread(new CallGuardTaskEmbedded(
- drools.getWorkingMemory(),
- $event.getClosedLoopControlName(),
- $operation.policy.getActor().toString(),
- $operation.policy.getRecipe(),
- $operation.getTargetEntity(),
- $event.getRequestId().toString(),
- () -> {
- AaiNqResponseWrapper resp = $manager.getNqVserverFromAai();
- return(resp == null ? null : resp.countVfModules());
- }));
- t.start();
- }
- else{
- insert(new PolicyGuardResponse("Permit", $event.getRequestId(), $operation.policy.getRecipe()));
- }
-
-end
-
-//
-// This rule will be triggered when a thread talking to the XACML Guard inserts a
-// guardResponse object into the working memory
-//
-rule "${policyName}.GUARD.RESPONSE"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.getClosedLoopControlName(), onset.getRequestId() == $event.getRequestId() )
- $lock : TargetLock (requestId == $event.getRequestId())
- $opTimer : OperationTimer( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId().toString() )
- $guardResponse : PolicyGuardResponse(requestId == $event.getRequestId(), $operation.policy.recipe == operation)
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}: event={} manager={} operation={} lock={} opTimer={} guardResponse={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event, $manager, $operation, $lock, $opTimer, $guardResponse);
-
-
- //we will permit the operation if there was no Guard for it
- if("Indeterminate".equalsIgnoreCase($guardResponse.getResult())){
- $guardResponse.setResult("Permit");
- }
-
- //
- // This notification has Guard result in "message". ("DB write - end operation in case of Guard Deny")
- //
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setNotification(ControlLoopNotificationType.OPERATION);
- notification.setMessage("Guard result for " + $operation.policy.getActor() + " " + $operation.policy.getRecipe() + " is " + $guardResponse.getResult());
- notification.setHistory($operation.getHistory());
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
-
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
-
- if("Permit".equalsIgnoreCase($guardResponse.getResult())){
-
- modify($operation){setGuardApprovalStatus($guardResponse.getResult())};
- }
- else {
- //This is the Deny case
- $operation.startOperation($event);
- $operation.setOperationHasGuardDeny();
- retract($opTimer);
- retract($operation);
- modify($manager) {finishOperation($operation)};
- }
-
- retract($guardResponse);
-
-end
-
-/*
-*
-* This rule responds to APPC Response Events
-*
-* I would have like to be consistent and write the Response like this:
-* $response : Response( CommonHeader.RequestId == $onset.getRequestId() )
-*
-* However, no compile error was given. But a runtime error was given. I think
-* because drools is confused between the classname CommonHeader vs the property CommonHeader.
-*
-*/
-rule "${policyName}.APPC.RESPONSE"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.getClosedLoopControlName(), onset.getRequestId() == $event.getRequestId() )
- $opTimer : OperationTimer( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId().toString() )
- $lock : TargetLock (requestId == $event.getRequestId())
- $response : Response( getCommonHeader().RequestId == $event.getRequestId() )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName());
- logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={} response={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event, $manager, $operation, $lock, $opTimer, $response);
- //
- // Get the result of the operation
- //
- PolicyResult policyResult = $operation.onResponse($response);
- if (policyResult != null) {
- logger.debug("{}: {}: operation finished - result={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- policyResult);
- //
- // This Operation has completed, construct a notification showing our results. (DB write - end operation)
- //
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- notification.setMessage($operation.getOperationHistory());
- notification.setHistory($operation.getHistory());
- if (policyResult.equals(PolicyResult.SUCCESS)) {
- notification.setNotification(ControlLoopNotificationType.OPERATION_SUCCESS);
- //
- // Let interested parties know
- //
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- } else {
- notification.setNotification(ControlLoopNotificationType.OPERATION_FAILURE);
- //
- // Let interested parties know
- //
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- }
- //
- // Ensure the operation is complete
- //
- if ($operation.isOperationComplete() == true) {
- //
- // It is complete, remove it from memory
- //
- retract($operation);
- //
- // We must also retract the timer object
- // NOTE: We could write a Rule to do this
- //
- retract($opTimer);
- //
- // Complete the operation
- //
- modify($manager) {finishOperation($operation)};
- } else {
- //
- // Just doing this will kick off the LOCKED rule again
- //
- modify($operation) {};
- }
- } else {
- //
- // Its not finished yet (i.e. expecting more Response objects)
- //
- // Or possibly it is a leftover response that we timed the request out previously
- //
- }
- //
- // We are going to retract these objects from memory
- //
- retract($response);
-end
-
-/*
-*
-* The problem with Responses is that they don't have a controlLoopControlName
-* field in them, so the only way to attach them is via RequestId. If we have multiple
-* control loop .drl's loaded in the same container, we need to be sure the cleanup
-* rules don't remove Responses for other control loops.
-*
-*/
-rule "${policyName}.APPC.RESPONSE.CLEANUP"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $response : Response($id : getCommonHeader().RequestId )
- not ( VirtualControlLoopEvent( requestId == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName());
- logger.debug("{}: {}: orphan appc response={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(), $id);
-
- //
- // Retract it
- //
- retract($response);
-end
-
-/*
-*
-* This rule responds to APPC Response Events using the new LCM interface provided by appc
-*
-*/
-rule "${policyName}.APPC.LCM.RESPONSE"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.getClosedLoopControlName(), onset.getRequestId() == $event.getRequestId() )
- $opTimer : OperationTimer( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId().toString() )
- $lock : TargetLock (requestId == $event.getRequestId())
- $response : LcmResponseWrapper( getBody().getCommonHeader().getRequestId() == $event.getRequestId() )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName());
- logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={} response={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event, $manager, $operation, $lock, $operation, $opTimer, $response);
-
- //
- // Get the result of the operation
- //
- PolicyResult policyResult = $operation.onResponse($response);
- if (policyResult != null) {
- logger.debug("{}: {}: operation finished - result={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- policyResult);
-
- //
- // This Operation has completed, construct a notification showing our results. (DB write - end operation)
- //
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- notification.setMessage($operation.getOperationHistory());
- notification.setHistory($operation.getHistory());
- if (policyResult.equals(PolicyResult.SUCCESS)) {
- notification.setNotification(ControlLoopNotificationType.OPERATION_SUCCESS);
- } else {
- notification.setNotification(ControlLoopNotificationType.OPERATION_FAILURE);
- }
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- //
- // Ensure the operation is complete
- //
- if ($operation.isOperationComplete() == true) {
- //
- // It is complete, remove it from memory
- //
- retract($operation);
- //
- // We must also retract the timer object
- // NOTE: We could write a Rule to do this
- //
- retract($opTimer);
- //
- // Complete the operation
- //
- modify($manager) {finishOperation($operation)};
- } else {
- //
- // Just doing this will kick off the LOCKED rule again
- //
- modify($operation) {};
- }
- } else {
- //
- // Its not finished yet (i.e. expecting more Response objects)
- //
- // Or possibly it is a leftover response that we timed the request out previously
- //
- }
- //
- // We are going to retract these objects from memory
- //
- retract($response);
-end
-
-/*
-*
-* Clean Up any lingering LCM reponses
-*
-*/
-rule "${policyName}.APPC.LCM.RESPONSE.CLEANUP"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $response : LcmResponseWrapper($id : getBody().getCommonHeader().getRequestId )
- not ( VirtualControlLoopEvent( requestId == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName());
- logger.debug("{}: {}: orphan appc response={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(), $id);
- //
- // Retract it
- //
- retract($response);
-end
-
-/*
-*
-* This rule responds to SO Response Events
-*
-*/
-rule "${policyName}.SO.RESPONSE"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.getClosedLoopControlName(), onset.getRequestId() == $event.getRequestId() )
- $opTimer : OperationTimer( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId().toString() )
- $lock : TargetLock (requestId == $event.getRequestId())
- $response : SoResponseWrapper(requestId.toString() == $event.getRequestId().toString() )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName());
- logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={} response={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event, $manager, $operation, $lock, $operation, $opTimer, $response);
-
- // Get the result of the operation
- //
- PolicyResult policyResult = $operation.onResponse($response);
- if (policyResult != null) {
- logger.debug("{}: {}: operation finished - result={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- policyResult);
-
- //
- // This Operation has completed, construct a notification showing our results
- //
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- notification.setMessage($operation.getOperationHistory());
- notification.setHistory($operation.getHistory());
- if (policyResult.equals(PolicyResult.SUCCESS)) {
- notification.setNotification(ControlLoopNotificationType.OPERATION_SUCCESS);
- } else {
- notification.setNotification(ControlLoopNotificationType.OPERATION_FAILURE);
-
- }
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- //
- // Ensure the operation is complete
- //
- if ($operation.isOperationComplete() == true) {
- //
- // It is complete, remove it from memory
- //
- retract($operation);
- //
- // We must also retract the timer object
- // NOTE: We could write a Rule to do this
- //
- retract($opTimer);
- //
- // Complete the operation
- //
- modify($manager) {finishOperation($operation)};
- } else {
- //
- // Just doing this will kick off the LOCKED rule again
- //
- modify($operation) {};
- }
- } else {
- //
- // Its not finished yet (i.e. expecting more Response objects)
- //
- // Or possibly it is a leftover response that we timed the request out previously
- //
- }
- //
- // We are going to retract these objects from memory
- //
- retract($response);
-
-end
-
-/*
-*
-* This rule responds to VFC Response Events
-*
-*/
-rule "${policyName}.VFC.RESPONSE"
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.getClosedLoopControlName(), onset.getRequestId() == $event.getRequestId() )
- $opTimer : OperationTimer( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId().toString() )
- $lock : TargetLock (requestId == $event.getRequestId())
- $response : VfcResponse( requestId.toString() == $event.getRequestId().toString() )
- then
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName());
- logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={} response={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event, $manager, $operation, $lock, $operation, $opTimer, $response);
-
- // Get the result of the operation
- //
- PolicyResult policyResult = $operation.onResponse($response);
- if (policyResult != null) {
- //
- // This Operation has completed, construct a notification showing our results
- //
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- notification.setMessage($operation.getOperationHistory());
- notification.setHistory($operation.getHistory());
- //
- // Ensure the operation is complete
- //
- if ($operation.isOperationComplete() == true) {
- //
- // It is complete, remove it from memory
- //
- retract($operation);
- //
- // We must also retract the timer object
- // NOTE: We could write a Rule to do this
- //
- retract($opTimer);
- //
- // Complete the operation
- //
- modify($manager) {finishOperation($operation)};
- } else {
- //
- // Just doing this will kick off the LOCKED rule again
- //
- modify($operation) {};
- }
- } else {
- //
- // Its not finished yet (i.e. expecting more Response objects)
- //
- // Or possibly it is a leftover response that we timed the request out previously
- //
- }
- //
- // We are going to retract these objects from memory
- //
- retract($response);
-
-end
-
-/*
-*
-* This is the timer that manages the timeout for an individual operation.
-*
-*/
-rule "${policyName}.EVENT.MANAGER.OPERATION.TIMEOUT"
- timer (expr: $to )
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $operation : ControlLoopOperationManager( onset.closedLoopControlName == $event.getClosedLoopControlName(), onset.getRequestId() == $event.getRequestId() )
- $opTimer : OperationTimer( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId().toString(), $to : getDelay() )
- $lock : TargetLock (requestId == $event.getRequestId())
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName());
- logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event, $manager, $operation, $lock, $operation, $opTimer);
-
- //
- // Tell it its timed out
- //
- $operation.setOperationHasTimedOut();
- //
- // Create a notification for it ("DB Write - end operation")
- //
- VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- notification.setNotification(ControlLoopNotificationType.OPERATION_FAILURE);
- notification.setMessage($operation.getOperationHistory());
- notification.setHistory($operation.getHistory());
- //
- // Let interested parties know
- //
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- //
- // Get rid of the timer
- //
- retract($opTimer);
- //
- // Ensure the operation is complete
- //
- if ($operation.isOperationComplete() == true) {
- //
- // It is complete, remove it from memory
- //
- retract($operation);
- //
- // Complete the operation
- //
- modify($manager) {finishOperation($operation)};
- } else {
- //
- // Just doing this will kick off the LOCKED rule again
- //
- modify($operation) {};
- }
-end
-
-/*
-*
-* This is the timer that manages the overall control loop timeout.
-*
-*/
-rule "${policyName}.EVENT.MANAGER.TIMEOUT"
- timer (expr: $to )
- when
- $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
- $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName() )
- $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId() )
- $clTimer : ControlLoopTimer ( closedLoopControlName == $event.getClosedLoopControlName(), requestId == $event.getRequestId().toString(), $to : getDelay() )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $params.getClosedLoopControlName(), drools.getRule().getName());
-
- logger.debug("{}: {}: event={}",
- $params.getClosedLoopControlName(), drools.getRule().getName(),
- $event);
- //
- // Tell the Event Manager it has timed out
- //
- VirtualControlLoopNotification notification = $manager.setControlLoopTimedOut();
- if (notification != null) {
- notification.setFrom("policy");
- notification.setPolicyName(drools.getRule().getName());
- notification.setPolicyScope("${policyScope}");
- notification.setPolicyVersion("${policyVersion}");
- //
- // Let interested parties know
- //
- PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
- }
- //
- // Retract the event
- //
- retract($event);
-end
-
-/*
-*
-* This rule cleans up the manager and other objects after an event has
-* been retracted.
-*
-*/
-rule "${policyName}.EVENT.MANAGER.CLEANUP"
- when
- $manager : ControlLoopEventManager( $clName : getClosedLoopControlName(), $requestId : getRequestId() )
- $clTimer : ControlLoopTimer ( closedLoopControlName == $clName, requestId == $requestId.toString() )
- $operations : LinkedList()
- from collect( ControlLoopOperationManager( onset.closedLoopControlName == $clName, onset.getRequestId() == $requestId ) )
- $opTimers : LinkedList()
- from collect( OperationTimer( closedLoopControlName == $clName, requestId == $requestId.toString() ) )
- $locks : LinkedList()
- from collect( TargetLock (requestId == $requestId) )
- not( VirtualControlLoopEvent( closedLoopControlName == $clName, requestId == $requestId ) )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $clName, drools.getRule().getName());
-
- logger.debug("{}: {}: manager={} clTimer={} operations={}",
- $clName, drools.getRule().getName(),
- $manager, $clTimer, $operations.size());
-
- //
- // Retract EVERYTHING
- //
- retract($manager);
- retract($clTimer);
-
- for(Object manager: $operations) {
- retract((ControlLoopOperationManager) manager);
- }
- for(Object opTimer: $opTimers) {
- retract((OperationTimer) opTimer);
- }
- for(Object lock: $locks) {
- TargetLock tgt = (TargetLock) lock;
- //
- // Ensure we release the lock
- //
- PolicyGuard.unlockTarget(tgt);
- retract(tgt);
- }
-end
-
-/*
-*
-* This rule will clean up any rogue onsets where there is no
-* ControlLoopParams object corresponding to the onset event.
-*
-*/
-rule "${policyName}.EVENT.CLEANUP"
- when
- $event : VirtualControlLoopEvent( $clName: closedLoopControlName )
- not ( Params( getClosedLoopControlName() == $clName) )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $clName, drools.getRule().getName());
- logger.debug("{}: {}: orphan onset event={}",
- $clName, drools.getRule().getName(), $event);
-
- retract($event);
-end
-
-/*
-* Creates a cleaner for every Params object.
-* This has a higher salience so that it is fired before PARAMS.FINISHED in ANY policy.
-*/
-rule "${policyName}.PARAMS.CLEANING"
- salience 2
- when
- $params: Params( )
- ParamsInitCleaner( )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {} : YAML=[{}]", $params.getClosedLoopControlName(), drools.getRule().getName(),
- $params.getControlLoopYaml());
-
- ParamsCleaner cleaner = new ParamsCleaner();
- cleaner.setClosedLoopControlName($params.getClosedLoopControlName());
- cleaner.setControlLoopYaml($params.getControlLoopYaml());
- insert(cleaner);
-end
-
-/*
-* Finished creating cleaner objects, so remove the trigger.
-* This has a higher salience so that it is fired before processing any events.
-*/
-rule "${policyName}.PARAMS.FINISHED"
- salience 1
- when
- $initCleaner: ParamsInitCleaner( )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {}", $initCleaner.getClosedLoopControlName(), drools.getRule().getName());
-
- retract($initCleaner);
-end
-
-/*
-* Identifies Params objects that are still active, removing their associated cleaners.
-* This should only leave one active Params object for each policy.
-* This has a higher salience so that it is fired before PARAMS.DELETE in ANY policy.
-*/
-rule "${policyName}.PARAMS.ACTIVE"
- salience 3
- when
- $params: Params( getClosedLoopControlName() == "${closedLoopControlName}",
- getControlLoopYaml() == "${controlLoopYaml}" )
- $cleaner: ParamsCleaner( getClosedLoopControlName() == "${closedLoopControlName}",
- getControlLoopYaml() == "${controlLoopYaml}" )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {} : YAML=[{}]", $params.getClosedLoopControlName(), drools.getRule().getName(),
- $params.getControlLoopYaml());
-
- retract($cleaner);
-end
-
-/*
-* Delete Params objects that are not active (i.e., those that still have an associated
-* cleaner object).
-* This has a higher salience so that it is fired before PARAMS.CLEANED in ANY policy.
-*/
-rule "${policyName}.PARAMS.DELETE"
- salience 2
- when
- $params: Params( )
- $cleaner: ParamsCleaner( getClosedLoopControlName() == $params.getClosedLoopControlName(),
- getControlLoopYaml() == $params.getControlLoopYaml() )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {} : YAML=[{}]", $params.getClosedLoopControlName(), drools.getRule().getName(),
- $params.getControlLoopYaml());
-
- retract($params);
-end
-
-/*
-* Finished clean-up, so delete the cleaner objects.
-* This has a higher salience so that it is fired before processing any events.
-*/
-rule "${policyName}.PARAMS.CLEANED"
- salience 1
- when
- $cleaner: ParamsCleaner( )
- then
-
- Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
- logger.info("{}: {} : YAML=[{}]", $cleaner.getClosedLoopControlName(), drools.getRule().getName(),
- $cleaner.getControlLoopYaml());
-
- retract($cleaner);
-end
diff --git a/controlloop/templates/template.demo.clc/src/main/resources/coordination/prototype/firstBlocksSecond.xml b/controlloop/templates/template.demo.clc/src/main/resources/coordination/prototype/firstBlocksSecond.xml
deleted file mode 100644
index 0610ba9fc..000000000
--- a/controlloop/templates/template.demo.clc/src/main/resources/coordination/prototype/firstBlocksSecond.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
- ============LICENSE_START=======================================================
- drools-applications
- ================================================================================
- Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
- ================================================================================
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ============LICENSE_END=========================================================
- -->
-
-<!--
-# PIP Engine Definition
-#
-xacml.pip.engines=get-operation-outcome
-get-operation-outcome.classname=org.onap.policy.database.operationshistory.GetOperationOutcomePip
-get-operation-outcome.issuer=urn:org:onap:xacml:guard:get-operation-outcome"
--->
-
-<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="urn:com:att:xacml:policy:id:son:guard:UNIQUE_ID" Version="1" RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-unless-deny">
- <Description>Policy for first_blocks_second coordination (if first running and second requests to run, deny second).</Description>
- <Target>
- <AnyOf>
- <AllOf>
- <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-regexp-match">
- <!-- value to be autofilled by yaml from a xacml template -->
- <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">CONTROL_LOOP_TWO</AttributeValue>
- <AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="urn:org:onap:guard:clname:clname-id" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false"/>
- </Match>
- </AllOf>
- </AnyOf>
- </Target>
-
- <Rule RuleId="urn:com:att:xacml:rule:id:1" Effect="Deny">
- <Description>First Is Running</Description>
- <Condition>
- <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
- <VariableReference VariableId="clc_status"/>
- <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">Success</AttributeValue>
- </Apply>
- </Condition>
- </Rule>
-
- <VariableDefinition VariableId="clc_status">
- <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
- <!-- to be autofilled by yaml from a xacml template -->
- <AttributeDesignator Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
- AttributeId="urn:org:onap:guard:operation:operation-outcome"
- DataType="http://www.w3.org/2001/XMLSchema#string"
- Issuer="urn:org:onap:xacml:guard:get-operation-outcome:clname:CONTROL_LOOP_ONE"
- MustBePresent="false"/>
- </Apply>
- </VariableDefinition>
-</Policy>
diff --git a/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopCoordinationTest.java b/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopCoordinationTest.java
deleted file mode 100644
index ee5eceba9..000000000
--- a/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopCoordinationTest.java
+++ /dev/null
@@ -1,554 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * demo
- * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.template.demo.clc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import com.google.gson.Gson;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.lang.StringBuilder;
-import java.net.URLEncoder;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.time.Instant;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Properties;
-import java.util.UUID;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import org.kie.api.runtime.KieSession;
-import org.kie.api.runtime.rule.FactHandle;
-
-import org.onap.policy.appclcm.LcmRequest;
-import org.onap.policy.appclcm.LcmRequestWrapper;
-import org.onap.policy.appclcm.LcmResponse;
-import org.onap.policy.appclcm.LcmResponseWrapper;
-import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
-import org.onap.policy.common.endpoints.event.comm.TopicEndpoint;
-import org.onap.policy.common.endpoints.event.comm.TopicListener;
-import org.onap.policy.common.endpoints.event.comm.TopicSink;
-import org.onap.policy.common.endpoints.http.server.HttpServletServer;
-import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
-import org.onap.policy.controlloop.ControlLoopEventStatus;
-import org.onap.policy.controlloop.ControlLoopNotificationType;
-import org.onap.policy.controlloop.ControlLoopTargetType;
-import org.onap.policy.controlloop.VirtualControlLoopEvent;
-import org.onap.policy.controlloop.VirtualControlLoopNotification;
-import org.onap.policy.controlloop.policy.ControlLoopPolicy;
-import org.onap.policy.coordination.CoordinationDirective;
-import org.onap.policy.coordination.Util;
-import org.onap.policy.drools.protocol.coders.EventProtocolCoder;
-import org.onap.policy.drools.protocol.coders.EventProtocolParams;
-import org.onap.policy.drools.protocol.coders.JsonProtocolFilter;
-import org.onap.policy.drools.system.PolicyController;
-import org.onap.policy.drools.system.PolicyEngine;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ControlLoopCoordinationTest implements TopicListener {
-
- private static final Logger logger = LoggerFactory.getLogger(ControlLoopCoordinationTest.class);
-
- private static List<? extends TopicSink> noopTopics;
-
- private static KieSession kieSession1;
- private static KieSession kieSession2;
- private static StringBuilder controlLoopOneName = new StringBuilder();
- private static StringBuilder controlLoopTwoName = new StringBuilder();
- private static String expectedDecision;
-
- static {
- /* Set environment properties */
- SupportUtil.setAaiProps();
- SupportUtil.setGuardPropsEmbedded();
- SupportUtil.setPuProp();
- }
-
- /**
- * Setup simulator.
- *
- * @throws IOException when thrown by buildAaiSim
- */
- @BeforeClass
- public static void setUpSimulator() throws Exception {
- PolicyEngine.manager.configure(new Properties());
- assertTrue(PolicyEngine.manager.start());
- Properties noopSinkProperties = new Properties();
- noopSinkProperties.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, "APPC-LCM-READ,POLICY-CL-MGT");
- noopSinkProperties.put("noop.sink.topics.APPC-LCM-READ.events", "org.onap.policy.appclcm.LcmRequestWrapper");
- noopSinkProperties.put("noop.sink.topics.APPC-LCM-READ.events.custom.gson",
- "org.onap.policy.appclcm.util.Serialization,gson");
- noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events",
- "org.onap.policy.controlloop.VirtualControlLoopNotification");
- noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events.custom.gson",
- "org.onap.policy.controlloop.util.Serialization,gsonPretty");
- noopTopics = TopicEndpoint.manager.addTopicSinks(noopSinkProperties);
-
- EventProtocolCoder.manager.addEncoder(EventProtocolParams.builder()
- .groupId("junit.groupId")
- .artifactId("junit.artifactId")
- .topic("POLICY-CL-MGT")
- .eventClass("org.onap.policy.controlloop.VirtualControlLoopNotification")
- .protocolFilter(new JsonProtocolFilter())
- .modelClassLoaderHash(1111));
- EventProtocolCoder.manager.addEncoder(EventProtocolParams.builder()
- .groupId("junit.groupId")
- .artifactId("junit.artifactId")
- .topic("APPC-LCM-READ")
- .eventClass("org.onap.policy.appclcm.LcmRequestWrapper")
- .protocolFilter(new JsonProtocolFilter())
- .modelClassLoaderHash(1111));
- SupportUtil.buildAaiSim();
- /*
- * Apply the coordination directive
- */
- final String coordinationDir = "src/test/resources/coordination";
- final String coordinationProtoDir = "src/main/resources/coordination/prototype";
- final String coordinationDirectiveName = "synthetic_control_loop_one_blocks_synthetic_control_loop_two";
- final String propertiesDir = "src/test/resources/properties";
- final String propertiesProtoDir = "src/test/resources/properties/prototype";
- final String xacmlDir = "src/test/resources/xacml";
- final String yamlDir = "src/test/resources/yaml";
-
- String coordinationDirectiveFile = coordinationDir + File.separator + coordinationDirectiveName + ".yaml";
- /*
- * Load the coordination directive from the Yaml encoding
- */
- CoordinationDirective cd = Util.loadCoordinationDirectiveFromFile(coordinationDirectiveFile);
- logger.info("CoordinationDirective={}", cd.toString());
- /*
- * Generate the Xacml policy from the coordination directive
- */
- String xacmlPolicy = Util.generateXacmlFromCoordinationDirective(cd, coordinationProtoDir);
- /*
- * Create directory for Xacml output file, if necessary
- */
- Files.createDirectories(Paths.get(xacmlDir));
- /*
- * Write Xacml policy to file
- */
- String xacmlFilename = xacmlDir + File.separator
- + cd.getCoordinationFunction()
- + cd.getControlLoop(0)
- + cd.getControlLoop(1)
- + ".xml";
- File xacmlFile = new File(xacmlFilename);
- PrintWriter xacmlFileWriter = new PrintWriter(xacmlFile);
- xacmlFileWriter.println(xacmlPolicy);
- xacmlFileWriter.flush();
- /*
- * Remove Xacml file after test
- */
- xacmlFile.deleteOnExit();
- /*
- * Insert the Xacml policy file into the PDP
- */
- SupportUtil.insertXacmlPolicy(xacmlFilename, propertiesProtoDir, propertiesDir);
- /*
- * Start the kie sessions
- */
- kieSession1 = startSession(
- controlLoopOneName,
- "src/main/resources/__closedLoopControlName__.drl",
- yamlDir + "/policy_ControlLoop_SyntheticOne.yaml",
- "service=ServiceDemo;resource=Res1Demo;type=operational",
- "SyntheticControlLoopOnePolicy",
- "org.onap.closed_loop.ServiceDemo:VNFS:1.0.0");
- kieSession2 = startSession(
- controlLoopTwoName,
- "src/main/resources/__closedLoopControlName__.drl",
- yamlDir + "/policy_ControlLoop_SyntheticTwo.yaml",
- "service=ServiceDemo;resource=Res1Demo;type=operational",
- "SyntheticControlLoopTwoPolicy",
- "org.onap.closed_loop.ServiceDemo:VNFS:1.0.0");
- }
-
- /**
- * Tear down simulator.
- */
- @AfterClass
- public static void tearDownSimulator() {
- /*
- * Gracefully shut down the kie session
- */
- kieSession1.dispose();
- kieSession2.dispose();
-
- PolicyEngine.manager.stop();
- HttpServletServer.factory.destroy();
- PolicyController.factory.shutdown();
- TopicEndpoint.manager.shutdown();
- }
-
- /**
- * Set expected decision.
- *
- * @param ed the expected decision ("PERMIT" or "DENY")
- */
- public void expectedDecisionIs(String ed) {
- expectedDecision = ed;
- logger.info("Expected decision is {}", ed);
- }
-
- /**
- * This method is used to simulate event messages from DCAE
- * that start the control loop (onset message) or end the
- * control loop (abatement message).
- *
- * @param controlLoopName the control loop name
- * @param requestId the requestId for this event
- * @param status could be onset or abated
- * @param target the target name
- * @param kieSession the kieSession to which this event is being sent
- */
- protected void sendEvent(String controlLoopName,
- UUID requestId,
- ControlLoopEventStatus status,
- String target,
- KieSession kieSession) {
- logger.debug("sendEvent controlLoopName={}", controlLoopName);
- VirtualControlLoopEvent event = new VirtualControlLoopEvent();
- event.setClosedLoopControlName(controlLoopName);
- event.setRequestId(requestId);
- event.setTarget("generic-vnf.vnf-name");
- event.setTargetType(ControlLoopTargetType.VNF);
- event.setClosedLoopAlarmStart(Instant.now());
- event.setAai(new HashMap<>());
- event.getAai().put("generic-vnf.vnf-name", target);
- event.setClosedLoopEventStatus(status);
-
- Gson gson = new Gson();
- String json = gson.toJson(event);
- logger.debug("sendEvent {}", json);
-
- kieSession.insert(event);
- }
-
-
- /**
- * Simulate an event by inserting into kieSession and firing rules as needed.
- *
- * @param cles the ControlLoopEventStatus
- * @param rid the request ID
- * @param controlLoopName the control loop name
- * @param kieSession the kieSession to which this event is being sent
- * @param expectedDecision the expected decision
- */
- protected void simulateEvent(ControlLoopEventStatus cles,
- UUID rid,
- String controlLoopName,
- String target,
- KieSession kieSession,
- String expectedDecision) {
- //
- // if onset, set expected decision
- //
- if (cles == ControlLoopEventStatus.ONSET) {
- expectedDecisionIs(expectedDecision);
- }
- //
- // simulate sending event
- //
- sendEvent(controlLoopName, rid, cles, target, kieSession);
- kieSession.fireUntilHalt();
- //
- // get dump of database entries and log
- //
- List<?> entries = SupportUtil.dumpDb();
- assertNotNull(entries);
- logger.debug("dumpDB, {} entries", entries.size());
- for (Object entry : entries) {
- logger.debug("{}", entry);
- }
- //
- // we are done
- //
- logger.info("simulateEvent: done");
- }
-
- /**
- * Simulate an onset event.
- *
- * @param rid the request ID
- * @param controlLoopName the control loop name
- * @param kieSession the kieSession to which this event is being sent
- * @param expectedDecision the expected decision
- */
- public void simulateOnset(UUID rid,
- String controlLoopName,
- String target,
- KieSession kieSession,
- String expectedDecision) {
- simulateEvent(ControlLoopEventStatus.ONSET, rid, controlLoopName, target, kieSession, expectedDecision);
- }
-
- /**
- * Simulate an abated event.
- *
- * @param rid the request ID
- * @param controlLoopName the control loop name
- * @param kieSession the kieSession to which this event is being sent
- */
- public void simulateAbatement(UUID rid,
- String controlLoopName,
- String target,
- KieSession kieSession) {
- simulateEvent(ControlLoopEventStatus.ABATED, rid, controlLoopName, target, kieSession, null);
- }
-
- /**
- * This method will start a kie session and instantiate the Policy Engine.
- *
- * @param droolsTemplate the DRL rules file
- * @param yamlFile the yaml file containing the policies
- * @param policyScope scope for policy
- * @param policyName name of the policy
- * @param policyVersion version of the policy
- * @return the kieSession to be used to insert facts
- * @throws IOException throws IO exception
- */
- private static KieSession startSession(StringBuilder controlLoopName,
- String droolsTemplate,
- String yamlFile,
- String policyScope,
- String policyName,
- String policyVersion) throws IOException {
-
- /*
- * Load policies from yaml
- */
- SupportUtil.Pair<ControlLoopPolicy, String> pair = SupportUtil.loadYaml(yamlFile);
- assertNotNull(pair);
- assertNotNull(pair.first);
- assertNotNull(pair.first.getControlLoop());
- assertNotNull(pair.first.getControlLoop().getControlLoopName());
- assertTrue(!pair.first.getControlLoop().getControlLoopName().isEmpty());
-
- controlLoopName.append(pair.first.getControlLoop().getControlLoopName());
- String yamlContents = pair.second;
-
- /*
- * Construct a kie session
- */
- final KieSession kieSession = SupportUtil.buildContainer(droolsTemplate,
- controlLoopName.toString(),
- policyScope,
- policyName,
- policyVersion,
- URLEncoder.encode(yamlContents, "UTF-8"));
-
- /*
- * Retrieve the Policy Engine
- */
-
- logger.debug("============");
- logger.debug(URLEncoder.encode(yamlContents, "UTF-8"));
- logger.debug("============");
-
- return kieSession;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.onap.policy.drools.PolicyEngineListener#newEventNotification(java.lang.String)
- */
- @Override
- public void onTopicEvent(CommInfrastructure commType, String topic, String event) {
- /*
- * Pull the object that was sent out to DMAAP and make sure it is a ControlLoopNoticiation
- * of type active
- */
- Object obj = null;
- if ("POLICY-CL-MGT".equals(topic)) {
- obj = org.onap.policy.controlloop.util.Serialization.gsonJunit.fromJson(event,
- org.onap.policy.controlloop.VirtualControlLoopNotification.class);
- } else if ("APPC-LCM-READ".equals(topic)) {
- obj = org.onap.policy.appclcm.util.Serialization.gsonJunit.fromJson(event,
- org.onap.policy.appclcm.LcmRequestWrapper.class);
- }
- assertNotNull(obj);
- if (obj instanceof VirtualControlLoopNotification) {
- VirtualControlLoopNotification notification = (VirtualControlLoopNotification) obj;
- String policyName = notification.getPolicyName();
- if (policyName.endsWith("EVENT")) {
- logger.debug("Rule Fired: " + notification.getPolicyName());
- assertTrue(ControlLoopNotificationType.ACTIVE.equals(notification.getNotification()));
- } else if (policyName.endsWith("GUARD_NOT_YET_QUERIED")) {
- logger.debug("Rule Fired: " + notification.getPolicyName());
- assertTrue(ControlLoopNotificationType.OPERATION.equals(notification.getNotification()));
- assertNotNull(notification.getMessage());
- assertTrue(notification.getMessage().startsWith("Sending guard query"));
- } else if (policyName.endsWith("GUARD.RESPONSE")) {
- logger.debug("Rule Fired: " + notification.getPolicyName());
- assertTrue(ControlLoopNotificationType.OPERATION.equals(notification.getNotification()));
- assertNotNull(notification.getMessage());
- // THESE ARE THE MOST CRITICAL ASSERTS
- // TEST IF GUARD.RESPONSE IS CORRECT
- logger.debug("Testing whether decision was {} as expected", expectedDecision);
- assertTrue(notification.getMessage().toUpperCase().endsWith(expectedDecision));
- } else if (policyName.endsWith("GUARD_PERMITTED")) {
- logger.debug("Rule Fired: " + notification.getPolicyName());
- assertEquals(ControlLoopNotificationType.OPERATION,notification.getNotification());
- assertNotNull(notification.getMessage());
- assertTrue(notification.getMessage().startsWith("actor=APPC"));
- } else if (policyName.endsWith("OPERATION.TIMEOUT")) {
- logger.debug("Rule Fired: " + notification.getPolicyName());
- kieSession1.halt();
- kieSession2.halt();
- logger.debug("The operation timed out");
- fail("Operation Timed Out");
- } else if (policyName.endsWith("APPC.LCM.RESPONSE")) {
- logger.debug("Rule Fired: " + notification.getPolicyName());
- assertTrue(ControlLoopNotificationType.OPERATION_SUCCESS.equals(notification.getNotification()));
- assertNotNull(notification.getMessage());
- assertTrue(notification.getMessage().startsWith("actor=APPC"));
- } else if (policyName.endsWith("EVENT.MANAGER")) {
- logger.debug("Rule Fired: " + notification.getPolicyName());
- if (notification.getMessage().endsWith("Closing the control loop.")
- || notification.getMessage().equals("Waiting for abatement")) {
- if (policyName.startsWith(controlLoopOneName.toString())) {
- logger.debug("Halting kieSession1");
- kieSession1.halt();
- } else if (policyName.startsWith(controlLoopTwoName.toString())) {
- logger.debug("Halting kieSession2");
- kieSession2.halt();
- } else {
- fail("Unknown ControlLoop");
- }
- }
- } else if (policyName.endsWith("EVENT.MANAGER.TIMEOUT")) {
- logger.debug("Rule Fired: " + notification.getPolicyName());
- kieSession1.halt();
- kieSession2.halt();
- logger.debug("The control loop timed out");
- fail("Control Loop Timed Out");
- }
- } else if (obj instanceof LcmRequestWrapper) {
- /*
- * The request should be of type LCMRequestWrapper and the subrequestid should be 1
- */
- LcmRequestWrapper dmaapRequest = (LcmRequestWrapper) obj;
- LcmRequest appcRequest = dmaapRequest.getBody();
- assertEquals(appcRequest.getCommonHeader().getSubRequestId(),"1");
-
- logger.debug("\n============ APPC received the request!!! ===========\n");
-
- /*
- * Simulate a success response from APPC and insert the response into the working memory
- */
- LcmResponseWrapper dmaapResponse = new LcmResponseWrapper();
- LcmResponse appcResponse = new LcmResponse(appcRequest);
- appcResponse.getStatus().setCode(400);
- appcResponse.getStatus().setMessage("AppC success");
- dmaapResponse.setBody(appcResponse);
- kieSession1.insert(dmaapResponse);
- kieSession2.insert(dmaapResponse);
- }
- }
-
- /**
- * This method will dump all the facts in the working memory.
- *
- * @param kieSession the session containing the facts
- */
- public void dumpFacts(KieSession kieSession) {
- logger.debug("Fact Count: {}", kieSession.getFactCount());
- for (FactHandle handle : kieSession.getFactHandles()) {
- logger.debug("FACT: {}", handle);
- }
- }
-
- /**
- * Test that SyntheticControlLoopOne blocks SyntheticControlLoopTwo
- * is enforced correctly.
- */
- @Test
- public void testSyntheticControlLoopOneBlocksSyntheticControlLoopTwo() throws InterruptedException {
- logger.info("Beginning testSyntheticControlLoopOneBlocksSyntheticControlLoopTwo");
- /*
- * Allows the PolicyEngine to callback to this object to
- * notify that there is an event ready to be pulled
- * from the queue
- */
- for (TopicSink sink : noopTopics) {
- assertTrue(sink.start());
- sink.register(this);
- }
-
- /*
- * Create unique requestIds
- */
- final UUID requestId1 = UUID.randomUUID();
- final UUID requestId2 = UUID.randomUUID();
- final UUID requestId3 = UUID.randomUUID();
- final UUID requestId4 = UUID.randomUUID();
- final UUID requestId5 = UUID.randomUUID();
- final String cl1 = controlLoopOneName.toString();
- final String cl2 = controlLoopTwoName.toString();
- final String t1 = "TARGET_1";
- final String t2 = "TARGET_2";
-
- logger.info("@@@@@@@@@@ cl2 ONSET t1 (Success) @@@@@@@@@@");
- simulateOnset(requestId1, cl2, t1, kieSession2,"PERMIT");
-
- logger.info("@@@@@@@@@@ cl1 ONSET t1 @@@@@@@@@@");
- simulateOnset(requestId2, cl1, t1, kieSession1,"PERMIT");
-
- logger.info("@@@@@@@@@@ cl2 ABATED t1 @@@@@@@@@@");
- simulateAbatement(requestId1, cl2, t1, kieSession2);
-
- logger.info("@@@@@@@@@@ cl2 ONSET t1 (Fail) @@@@@@@@@@");
- simulateOnset(requestId3, cl2, t1, kieSession2,"DENY");
-
- logger.info("@@@@@@@@@@ cl2 ONSET t2 (Success) @@@@@@@@@@");
- simulateOnset(requestId4, cl2, t2, kieSession2,"PERMIT");
-
- logger.info("@@@@@@@@@@ cl2 ABATED t2 @@@@@@@@@@");
- simulateAbatement(requestId4, cl2, t2, kieSession2);
-
- logger.info("@@@@@@@@@@ cl1 ABATED t1 @@@@@@@@@@");
- simulateAbatement(requestId2, cl1, t1, kieSession1);
-
- logger.info("@@@@@@@@@@ cl2 ONSET t1 (Success) @@@@@@@@@@");
- simulateOnset(requestId5, cl2, t1, kieSession2,"PERMIT");
-
- logger.info("@@@@@@@@@@ cl2 ABATED t1 @@@@@@@@@@");
- simulateAbatement(requestId5, cl2, t1, kieSession2);
-
- /*
- * Print what's left in memory
- */
- dumpFacts(kieSession1);
- dumpFacts(kieSession2);
- }
-}
diff --git a/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopEventCleanupTest.java b/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopEventCleanupTest.java
deleted file mode 100644
index 605732c31..000000000
--- a/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopEventCleanupTest.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * demo
- * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.template.demo.clc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.time.Instant;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
-import java.util.UUID;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.kie.api.runtime.KieSession;
-import org.onap.policy.common.endpoints.event.comm.TopicEndpoint;
-import org.onap.policy.common.endpoints.event.comm.TopicSink;
-import org.onap.policy.common.endpoints.http.server.HttpServletServer;
-import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
-import org.onap.policy.controlloop.ControlLoopEventStatus;
-import org.onap.policy.controlloop.VirtualControlLoopEvent;
-import org.onap.policy.controlloop.eventmanager.ControlLoopEventManager;
-import org.onap.policy.controlloop.policy.ControlLoopPolicy;
-import org.onap.policy.drools.protocol.coders.EventProtocolCoder;
-import org.onap.policy.drools.protocol.coders.EventProtocolParams;
-import org.onap.policy.drools.protocol.coders.JsonProtocolFilter;
-import org.onap.policy.drools.system.PolicyController;
-import org.onap.policy.drools.system.PolicyEngine;
-import org.onap.policy.drools.utils.logging.LoggerUtil;
-import org.onap.policy.template.demo.clc.SupportUtil.Pair;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Verifies that event objects are cleaned up when rules are updated. This loads
- * <b>two</b> copies of the rule set into a single policy to ensure that the two copies
- * interact appropriately with each other's event objects.
- */
-public class ControlLoopEventCleanupTest {
- private static final Logger logger = LoggerFactory.getLogger(ControlLoopEventCleanupTest.class);
-
- /**
- * Number of objects per control loop, including the Params object.
- */
- private static int CL_OBJECTS = 7;
-
- private static final String YAML = "src/test/resources/yaml/policy_ControlLoop_EventCleanup-test.yaml";
-
- /**
- * YAML to be used when the first rule set is updated.
- */
- private static final String YAML2 = "src/test/resources/yaml/policy_ControlLoop_EventCleanup-test2.yaml";
-
- private static final String POLICY_VERSION = "v2.0";
-
- private static final String POLICY_NAME = "CL_CleanupTest";
-
- private static final String POLICY_SCOPE = "type=operational";
-
- private static final String CONTROL_LOOP_NAME = "ControlLoop-Event-Cleanup-Test";
-
- private static final String DROOLS_TEMPLATE = "src/main/resources/__closedLoopControlName__.drl";
-
- // values specific to the second copy of the rules
-
- private static final String YAML_B = "src/test/resources/yaml/policy_ControlLoop_EventCleanup-test-B.yaml";
- private static final String POLICY_NAME_B = "CL_CleanupTest_B";
- private static final String CONTROL_LOOP_NAME_B = "ControlLoop-Event-Cleanup-Test-B";
-
- private static final String GUARD_DISABLED = "guard.disabled";
-
- private static String saveGuardFlag;
-
- private static KieSession kieSession;
- private static SupportUtil.RuleSpec[] specifications;
-
- /**
- * Setup the simulator.
- */
- @BeforeClass
- public static void setUpSimulator() {
- LoggerUtil.setLevel(LoggerUtil.ROOT_LOGGER, "INFO");
-
- saveGuardFlag = PolicyEngine.manager.getEnvironmentProperty(GUARD_DISABLED);
- PolicyEngine.manager.getEnvironment().setProperty(GUARD_DISABLED, "true");
-
- SupportUtil.setAaiProps();
-
- PolicyEngine.manager.configure(new Properties());
- assertTrue(PolicyEngine.manager.start());
- Properties noopSinkProperties = new Properties();
- noopSinkProperties.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, "APPC-CL,POLICY-CL-MGT");
- noopSinkProperties.put("noop.sink.topics.APPC-CL.events", "org.onap.policy.appc.Response");
- noopSinkProperties.put("noop.sink.topics.APPC-CL.events.custom.gson",
- "org.onap.policy.appc.util.Serialization,gsonPretty");
- noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events",
- "org.onap.policy.controlloop.VirtualControlLoopNotification");
- noopSinkProperties.put("noop.sink.topics.POLICY-CL-MGT.events.custom.gson",
- "org.onap.policy.controlloop.util.Serialization,gsonPretty");
- final List<TopicSink> noopTopics = TopicEndpoint.manager.addTopicSinks(noopSinkProperties);
-
- EventProtocolCoder.manager.addEncoder(EventProtocolParams.builder()
- .groupId("junit.groupId")
- .artifactId("junit.artifactId")
- .topic("POLICY-CL-MGT")
- .eventClass("org.onap.policy.controlloop.VirtualControlLoopNotification")
- .protocolFilter(new JsonProtocolFilter())
- .modelClassLoaderHash(1111));
- EventProtocolCoder.manager.addEncoder(EventProtocolParams.builder()
- .groupId("junit.groupId")
- .artifactId("junit.artifactId")
- .topic("APPC-CL")
- .eventClass("org.onap.policy.appc.Request")
- .protocolFilter(new JsonProtocolFilter())
- .modelClassLoaderHash(1111));
-
- try {
- SupportUtil.buildAaiSim();
-
- } catch (Exception e) {
- logger.error("Could not create simulator", e);
- fail("Could not create simulator");
- }
-
- for (TopicSink sink : noopTopics) {
- assertTrue(sink.start());
- }
-
- try {
- specifications = new SupportUtil.RuleSpec[2];
-
- specifications[0] = new SupportUtil.RuleSpec(DROOLS_TEMPLATE, CONTROL_LOOP_NAME, POLICY_SCOPE, POLICY_NAME,
- POLICY_VERSION, loadYaml(YAML));
-
- specifications[1] = new SupportUtil.RuleSpec(DROOLS_TEMPLATE, CONTROL_LOOP_NAME_B, POLICY_SCOPE,
- POLICY_NAME_B, POLICY_VERSION, loadYaml(YAML_B));
-
- kieSession = SupportUtil.buildContainer(POLICY_VERSION, specifications);
-
- } catch (IOException e) {
- logger.error("Could not create kieSession", e);
- fail("Could not create kieSession");
- }
- }
-
- /**
- * Tear down.
- */
- @AfterClass
- public static void tearDown() {
- kieSession.dispose();
-
- PolicyEngine.manager.stop();
- HttpServletServer.factory.destroy();
- PolicyController.factory.shutdown();
- TopicEndpoint.manager.shutdown();
-
- if (saveGuardFlag == null) {
- PolicyEngine.manager.getEnvironment().remove(GUARD_DISABLED);
-
- } else {
- PolicyEngine.manager.getEnvironment().setProperty(GUARD_DISABLED, saveGuardFlag);
- }
- }
-
- @Test
- public void test() throws IOException {
-
- /*
- * Let rules create Params objects.
- */
- kieSession.fireAllRules();
-
- injectEvent(CONTROL_LOOP_NAME);
- injectEvent(CONTROL_LOOP_NAME_B);
-
- kieSession.fireAllRules();
- List<Object> facts = getSessionObjects();
-
- // should have events for both control loops
- assertEquals(2 * CL_OBJECTS, facts.size());
- assertTrue(hasEvent(facts, CONTROL_LOOP_NAME));
- assertTrue(hasEvent(facts, CONTROL_LOOP_NAME_B));
-
- logger.info("UPDATING VERSION TO v3.0");
- updatePolicy(YAML2, "v3.0");
-
- /*
- * Let rules update Params objects. The Params for the first set of rules should
- * now be deleted and replaced with a new one, while the Params for the second set
- * should be unchanged.
- */
- kieSession.fireAllRules();
- facts = getSessionObjects();
-
- // should only have event for second control loop + 1 Params for first control loop
- assertEquals(CL_OBJECTS + 1, facts.size());
- assertTrue(hasEvent(facts, CONTROL_LOOP_NAME_B));
-
- // add event for first control loop again
- injectEvent(CONTROL_LOOP_NAME);
- kieSession.fireAllRules();
-
- logger.info("UPDATING VERSION TO v4.0");
- updatePolicy(YAML, "v4.0");
-
- /*
- * Let rules update Params objects. The Params for the first set of rules should
- * now be deleted and replaced with a new one, while the Params for the second set
- * should be unchanged.
- */
- kieSession.fireAllRules();
- facts = getSessionObjects();
-
- // should only have event for second control loop + 1 Params for first control loop
- assertEquals(CL_OBJECTS + 1, facts.size());
- assertTrue(hasEvent(facts, CONTROL_LOOP_NAME_B));
-
- // add event for first control loop again
- injectEvent(CONTROL_LOOP_NAME);
- kieSession.fireAllRules();
-
- logger.info("UPDATING VERSION TO v4.0 (i.e., unchanged)");
- updatePolicy(YAML, "v4.0");
-
- /*
- * Let rules update Params objects. As the version (and YAML) are unchanged for
- * either rule set, both Params objects should be unchanged.
- */
- kieSession.fireAllRules();
- facts = getSessionObjects();
-
- // should have events for both control loops
- assertEquals(2 * CL_OBJECTS, facts.size());
- assertTrue(hasEvent(facts, CONTROL_LOOP_NAME));
- assertTrue(hasEvent(facts, CONTROL_LOOP_NAME_B));
-
- /*
- * Now we'll delete the first rule set. That won't actually have any immediate
- * effect, so then we'll update the second rule set, which should trigger a
- * clean-up of both.
- */
- SupportUtil.RuleSpec[] specs = new SupportUtil.RuleSpec[1];
- specs[0] = specifications[1];
-
- logger.info("UPDATING VERSION TO v5.0 - DELETED RULE SET");
- SupportUtil.updateContainer("v5.0", specs);
-
- specs[0] = new SupportUtil.RuleSpec(DROOLS_TEMPLATE, CONTROL_LOOP_NAME_B, POLICY_SCOPE, POLICY_NAME_B,
- POLICY_VERSION, loadYaml(YAML));
-
- logger.info("UPDATING VERSION TO v6.0 - UPDATED SECOND RULE SET");
- SupportUtil.updateContainer("v6.0", specs);
-
- kieSession.fireAllRules();
- facts = getSessionObjects();
-
- // only 1 Params should remain, for second rule set, but events should be gone
- assertEquals(1, facts.size());
- assertTrue(facts.stream().anyMatch(obj -> obj.toString().startsWith("Params( ")));
- }
-
- /**
- * Updates the policy, changing the YAML associated with the first rule set.
- *
- * @param yamlFile name of the YAML file
- * @param policyVersion policy version
- * @throws IOException if an error occurs
- */
- private static void updatePolicy(String yamlFile, String policyVersion) throws IOException {
-
- specifications[0] = new SupportUtil.RuleSpec(DROOLS_TEMPLATE, CONTROL_LOOP_NAME, POLICY_SCOPE, POLICY_NAME,
- policyVersion, loadYaml(yamlFile));
-
- /*
- * Update the policy within the container.
- */
- SupportUtil.updateContainer(policyVersion, specifications);
- }
-
- /**
- * Loads a YAML file and URL-encodes it.
- *
- * @param yamlFile name of the YAML file
- * @return the contents of the specified file, URL-encoded
- * @throws UnsupportedEncodingException if an error occurs
- */
- private static String loadYaml(String yamlFile) throws UnsupportedEncodingException {
- Pair<ControlLoopPolicy, String> pair = SupportUtil.loadYaml(yamlFile);
- assertNotNull(pair);
- assertNotNull(pair.first);
- assertNotNull(pair.first.getControlLoop());
- assertNotNull(pair.first.getControlLoop().getControlLoopName());
- assertTrue(pair.first.getControlLoop().getControlLoopName().length() > 0);
-
- return URLEncoder.encode(pair.second, "UTF-8");
- }
-
- /**
- * Gets the session objects.
- *
- * @return the session objects
- */
- private static List<Object> getSessionObjects() {
- // sort the objects so we know the order
- LinkedList<Object> lst = new LinkedList<>(kieSession.getObjects());
- lst.sort((left, right) -> left.toString().compareTo(right.toString()));
-
- lst.forEach(obj -> logger.info("obj={}", obj));
-
- return lst;
- }
-
- /**
- * Injects an ONSET event into the rule engine.
- *
- * @param controlLoopName the control loop name
- */
- private void injectEvent(String controlLoopName) {
- VirtualControlLoopEvent event = new VirtualControlLoopEvent();
-
- event.setClosedLoopControlName(controlLoopName);
-
- UUID reqid = UUID.randomUUID();
- event.setRequestId(reqid);
-
- event.setTarget("generic-vnf.vnf-id");
- event.setClosedLoopAlarmStart(Instant.now());
- event.setAai(new HashMap<>());
- event.getAai().put("generic-vnf.vnf-id", "vnf-" + reqid.toString());
- event.getAai().put(ControlLoopEventManager.GENERIC_VNF_IS_CLOSED_LOOP_DISABLED, "false");
- event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
-
- kieSession.insert(event);
- }
-
- /**
- * Determines if the facts contain an event for the given control loop.
- *
- * @param facts session facts to be checked
- * @param controlLoopName name of the control loop of interest
- * @return {@code true} if the facts contain an event for the given control loop,
- * {@code false} otherwise
- */
- private boolean hasEvent(List<Object> facts, String controlLoopName) {
- return (facts.stream().anyMatch(obj -> obj instanceof VirtualControlLoopEvent
- && controlLoopName.equals(((VirtualControlLoopEvent) obj).getClosedLoopControlName())));
- }
-}
diff --git a/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopParamsCleanupTest.java b/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopParamsCleanupTest.java
deleted file mode 100644
index e0696abff..000000000
--- a/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/ControlLoopParamsCleanupTest.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * demo
- * ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.template.demo.clc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.kie.api.runtime.KieSession;
-import org.onap.policy.controlloop.policy.ControlLoopPolicy;
-import org.onap.policy.drools.utils.logging.LoggerUtil;
-import org.onap.policy.template.demo.clc.SupportUtil.Pair;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Verifies that Params objects are cleaned up when rules are updated. This loads
- * <b>two</b> copies of the rule set into a single policy to ensure that the two copies
- * interact appropriately with each other's Params objects.
- */
-public class ControlLoopParamsCleanupTest {
- private static final Logger logger = LoggerFactory.getLogger(ControlLoopParamsCleanupTest.class);
-
- private static final String YAML = "src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test.yaml";
-
- /**
- * YAML to be used when the first rule set is updated.
- */
- private static final String YAML2 = "src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test2.yaml";
-
- private static final String POLICY_VERSION = "v2.0";
-
- private static final String POLICY_NAME = "CL_CleanupTest";
-
- private static final String POLICY_SCOPE = "type=operational";
-
- private static final String CONTROL_LOOP_NAME = "ControlLoop-Params-Cleanup-Test";
-
- private static final String DROOLS_TEMPLATE = "src/main/resources/__closedLoopControlName__.drl";
-
- // values specific to the second copy of the rules
-
- private static final String YAML_B = "src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test-B.yaml";
- private static final String POLICY_NAME_B = "CL_CleanupTest_B";
- private static final String CONTROL_LOOP_NAME_B = "ControlLoop-Params-Cleanup-Test-B";
-
- private static KieSession kieSession;
- private static SupportUtil.RuleSpec[] specifications;
-
- /**
- * Setup the simulator.
- */
- @BeforeClass
- public static void setUpSimulator() {
- LoggerUtil.setLevel(LoggerUtil.ROOT_LOGGER, "INFO");
-
- try {
- specifications = new SupportUtil.RuleSpec[2];
-
- specifications[0] = new SupportUtil.RuleSpec(DROOLS_TEMPLATE, CONTROL_LOOP_NAME, POLICY_SCOPE, POLICY_NAME,
- POLICY_VERSION, loadYaml(YAML));
-
- specifications[1] = new SupportUtil.RuleSpec(DROOLS_TEMPLATE, CONTROL_LOOP_NAME_B, POLICY_SCOPE,
- POLICY_NAME_B, POLICY_VERSION, loadYaml(YAML_B));
-
- kieSession = SupportUtil.buildContainer(POLICY_VERSION, specifications);
-
- } catch (IOException e) {
- logger.error("Could not create kieSession", e);
- fail("Could not create kieSession");
- }
- }
-
- /**
- * Tear down.
- */
- @AfterClass
- public static void tearDown() {
- kieSession.dispose();
- }
-
- @Test
- public void test() throws IOException {
-
- /*
- * Let rules create Params objects. There should be one object for each set of
- * rules.
- */
- kieSession.fireAllRules();
- List<Object> facts = getSessionObjects();
- assertEquals(specifications.length, facts.size());
- Iterator<Object> iter = facts.iterator();
-
- final Object fact1 = iter.next();
- assertTrue(fact1.toString().contains(loadYaml(YAML)));
-
- final Object fact1b = iter.next();
- assertTrue(fact1b.toString().contains(loadYaml(YAML_B)));
-
- logger.info("UPDATING VERSION TO v3.0");
- updatePolicy(YAML2, "v3.0");
-
- /*
- * Let rules update Params objects. The Params for the first set of rules should
- * now be deleted and replaced with a new one, while the Params for the second set
- * should be unchanged.
- */
- kieSession.fireAllRules();
- facts = getSessionObjects();
- assertEquals(specifications.length, facts.size());
- iter = facts.iterator();
-
- final Object fact2 = iter.next();
- assertTrue(fact2 != fact1);
- assertTrue(fact2 != fact1b);
- assertTrue(fact2.toString().contains(loadYaml(YAML2)));
-
- assertTrue(iter.next() == fact1b);
-
- logger.info("UPDATING VERSION TO v4.0");
- updatePolicy(YAML, "v4.0");
-
- /*
- * Let rules update Params objects. The Params for the first set of rules should
- * now be deleted and replaced with a new one, while the Params for the second set
- * should be unchanged.
- */
- kieSession.fireAllRules();
- facts = getSessionObjects();
- assertEquals(specifications.length, facts.size());
- iter = facts.iterator();
-
- final Object fact3 = iter.next();
- assertTrue(fact3.toString().contains(loadYaml(YAML)));
- assertTrue(fact3 != fact2);
- assertTrue(fact3 != fact1b);
-
- assertTrue(iter.next() == fact1b);
-
- logger.info("UPDATING VERSION TO v4.0 (i.e., unchanged)");
- updatePolicy(YAML, "v4.0");
-
- /*
- * Let rules update Params objects. As the version (and YAML) are unchanged for
- * either rule set, both Params objects should be unchanged.
- */
- kieSession.fireAllRules();
- facts = getSessionObjects();
- assertEquals(specifications.length, facts.size());
- iter = facts.iterator();
- assertTrue(iter.next() == fact3);
- assertTrue(iter.next() == fact1b);
- }
-
- /**
- * Updates the policy, changing the YAML associated with the first rule set.
- *
- * @param yamlFile name of the YAML file
- * @param policyVersion policy version
- * @throws IOException if an error occurs
- */
- private static void updatePolicy(String yamlFile, String policyVersion) throws IOException {
-
- specifications[0] = new SupportUtil.RuleSpec(DROOLS_TEMPLATE, CONTROL_LOOP_NAME, POLICY_SCOPE, POLICY_NAME,
- policyVersion, loadYaml(yamlFile));
-
- /*
- * Update the policy within the container.
- */
- SupportUtil.updateContainer(policyVersion, specifications);
- }
-
- /**
- * Loads a YAML file and URL-encodes it.
- *
- * @param yamlFile name of the YAML file
- * @return the contents of the specified file, URL-encoded
- * @throws UnsupportedEncodingException if an error occurs
- */
- private static String loadYaml(String yamlFile) throws UnsupportedEncodingException {
- Pair<ControlLoopPolicy, String> pair = SupportUtil.loadYaml(yamlFile);
- assertNotNull(pair);
- assertNotNull(pair.first);
- assertNotNull(pair.first.getControlLoop());
- assertNotNull(pair.first.getControlLoop().getControlLoopName());
- assertTrue(pair.first.getControlLoop().getControlLoopName().length() > 0);
-
- return URLEncoder.encode(pair.second, "UTF-8");
- }
-
- /**
- * Gets the session objects.
- *
- * @return the session objects
- */
- private static List<Object> getSessionObjects() {
- // sort the objects so we know the order
- LinkedList<Object> lst = new LinkedList<>(kieSession.getObjects());
- lst.sort((left, right) -> left.toString().compareTo(right.toString()));
-
- return lst;
- }
-}
diff --git a/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/SupportUtil.java b/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/SupportUtil.java
deleted file mode 100644
index 8a8dd894a..000000000
--- a/controlloop/templates/template.demo.clc/src/test/java/org/onap/policy/template/demo/clc/SupportUtil.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * demo
- * ================================================================================
- * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.template.demo.clc;
-
-import static org.junit.Assert.fail;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Stream;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-import javax.persistence.Query;
-import org.apache.commons.io.IOUtils;
-import org.kie.api.KieServices;
-import org.kie.api.builder.KieBuilder;
-import org.kie.api.builder.KieFileSystem;
-import org.kie.api.builder.Message;
-import org.kie.api.builder.ReleaseId;
-import org.kie.api.builder.Results;
-import org.kie.api.runtime.KieContainer;
-import org.kie.api.runtime.KieSession;
-import org.onap.policy.common.endpoints.http.server.HttpServletServer;
-import org.onap.policy.controlloop.policy.ControlLoopPolicy;
-import org.onap.policy.controlloop.policy.guard.ControlLoopGuard;
-import org.onap.policy.controlloop.policy.guard.ControlLoopGuard;
-import org.onap.policy.coordination.CoordinationDirective;
-import org.onap.policy.drools.system.PolicyEngine;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-
-
-public final class SupportUtil {
-
- private static final String OPSHISTPUPROP = "OperationsHistoryPU";
- private static final Logger logger = LoggerFactory.getLogger(SupportUtil.class);
-
- // values from the last call to buildContainer()
-
- private static KieServices kieServices;
- private static KieContainer keyContainer;
-
- public static class Pair<A, B> {
- public final A first;
- public final B second;
-
- public Pair(A first, B second) {
- this.first = first;
- this.second = second;
- }
- }
-
- /**
- * Load YAML.
- *
- * @param testFile test file to load
- * @return the Pair of a policy and the yaml contents
- */
- public static Pair<ControlLoopPolicy, String> loadYaml(String testFile) {
- try (InputStream is = new FileInputStream(new File(testFile))) {
- String contents = IOUtils.toString(is, StandardCharsets.UTF_8);
- //
- // Read the yaml into our Java Object
- //
- Yaml yaml = new Yaml(new Constructor(ControlLoopPolicy.class));
- Object obj = yaml.load(contents);
-
- logger.debug(contents);
-
- return new Pair<ControlLoopPolicy, String>((ControlLoopPolicy) obj, contents);
- } catch (IOException e) {
- logger.error("Error while loading YAML", e);
- fail(e.getLocalizedMessage());
- }
- return null;
- }
-
- /**
- * Load the YAML guard policy.
- *
- * @param testFile the test file to load
- * @return return the guard object
- */
- public static ControlLoopGuard loadYamlGuard(String testFile) {
- try (InputStream is = new FileInputStream(new File(testFile))) {
- String contents = IOUtils.toString(is, StandardCharsets.UTF_8);
- //
- // Read the yaml into our Java Object
- //
- Yaml yaml = new Yaml(new Constructor(ControlLoopGuard.class));
- Object obj = yaml.load(contents);
- return (ControlLoopGuard) obj;
- } catch (IOException e) {
- logger.error("Error while loading YAML guard", e);
- fail(e.getLocalizedMessage());
- }
- return null;
- }
-
- /**
- * Insert the Xacml policy into the PDP.
- * Achieved by configuring the properties file to load the Xacml policy and required PIP(s).
- *
- * @param xacmlFile the Xacml policy file's path
- * @param propProtoDir the directory containing Xacml implementation prototypes
- * @param propDir the directory to which the Xacml rule should be output
- */
- public static void insertXacmlPolicy(String xacmlFile,
- String propProtoDir,
- String propDir) {
- String propName = "xacml_guard_clc";
- String propProtoFile = propProtoDir + File.separator + propName + ".properties";
- String propFilename = propDir + File.separator + propName + ".properties";
-
- String addXacmlFileToRoot = "# Policies to load\n"
- + "xacml.rootPolicies=p1\n"
- + "p1.file=" + xacmlFile + "\n";
-
- File propFile = new File(propFilename);
- try (Stream<String> stream = Files.lines(Paths.get(propProtoFile));
- PrintWriter output = new PrintWriter(propFile)) {
- /*
- * Remove file after test
- */
- propFile.deleteOnExit();
- /*
- * Copy the property prototype
- */
- stream.forEach(output::println);
- /*
- * Add the Xacml policy to the set of root policies
- */
- output.println(addXacmlFileToRoot);
- /*
- * Obtain PIP Engine definitions from Xacml policy
- * and insert into property file.
- */
- try (BufferedReader br = new BufferedReader(new FileReader(xacmlFile))) {
- boolean select = false;
- for (String line; (line = br.readLine()) != null; ) {
- if (line.contains("PIP Engine Definition")) {
- select = true;
- }
- if (line.contains("-->")) {
- select = false;
- }
- if (select) {
- output.println(line);
- }
- }
- }
- } catch (Exception e) {
- logger.error("Error when trying to create test propery file", e);
- fail(e.getMessage());
- }
- }
-
- public static HttpServletServer buildAaiSim() throws InterruptedException, IOException {
- return org.onap.policy.simulators.Util.buildAaiSim();
- }
-
- /**
- * Build a container containing a single set of rules.
- *
- * @param droolsTemplate template
- * @param closedLoopControlName control loop id
- * @param policyScope policy scope
- * @param policyName policy name
- * @param policyVersion policy version
- * @param yamlSpecification incoming yaml specification
- * @return the Kie session
- * @throws IOException if the container cannot be built
- */
- public static KieSession buildContainer(String droolsTemplate, String closedLoopControlName, String policyScope,
- String policyName, String policyVersion, String yamlSpecification) throws IOException {
-
- RuleSpec spec = new RuleSpec(droolsTemplate, closedLoopControlName, policyScope, policyName, policyVersion,
- yamlSpecification);
-
- return buildContainer(policyVersion, new RuleSpec[] {spec});
- }
-
- /**
- * Build a container containing all of the specified rules.
- *
- * @param policyVersion policy version
- * @param specifications rule specifications
- * @return the Kie session
- * @throws IOException if the container cannot be built
- */
- public static KieSession buildContainer(String policyVersion, RuleSpec[] specifications) throws IOException {
- //
- // Get our Drools Kie factory
- //
- kieServices = KieServices.Factory.get();
-
- ReleaseId releaseId = buildPolicy(policyVersion, specifications);
- logger.debug(releaseId.toString());
-
- //
- // Create our kie Session and container
- //
- keyContainer = kieServices.newKieContainer(releaseId);
-
- return keyContainer.newKieSession();
- }
-
- /**
- * Update the container with new rules.
- *
- * @param policyVersion new policy version
- * @param specifications new rule specifications
- * @throws IOException if the container cannot be built
- */
- public static void updateContainer(String policyVersion, RuleSpec[] specifications) throws IOException {
- ReleaseId releaseId = buildPolicy(policyVersion, specifications);
- logger.debug(releaseId.toString());
-
- keyContainer.updateToVersion(releaseId);
- }
-
- /**
- * Build the Policy so it can be loaded into a KIE container.
- *
- * @param policyVersion policy version
- * @param specifications rule specifications
- * @return the release
- * @throws IOException if the container cannot be built
- */
- private static ReleaseId buildPolicy(String policyVersion, RuleSpec[] specifications) throws IOException {
- //
- // Generate our drools rule from our template
- //
- KieFileSystem kfs = kieServices.newKieFileSystem();
- ReleaseId releaseId = kieServices.getRepository().getDefaultReleaseId();
- releaseId = kieServices.newReleaseId(releaseId.getGroupId(), releaseId.getArtifactId(), policyVersion);
-
- kfs.generateAndWritePomXML(releaseId);
-
- for (RuleSpec spec : specifications) {
- String drlContents = spec.generateRules();
- kfs.write("src/main/resources/" + spec.policyName + ".drl",
- kieServices.getResources().newByteArrayResource(drlContents.getBytes()));
- }
-
- //
- // Compile the rule
- //
- KieBuilder builder = kieServices.newKieBuilder(kfs).buildAll();
- Results results = builder.getResults();
- if (results.hasMessages(Message.Level.ERROR)) {
- for (Message msg : results.getMessages()) {
- logger.error(msg.toString());
- }
- throw new RuntimeException("Drools Rule has Errors");
- }
- for (Message msg : results.getMessages()) {
- logger.debug(msg.toString());
- }
-
- return releaseId;
- }
-
- /**
- * Set the A&AI properties.
- */
- public static void setAaiProps() {
- PolicyEngine.manager.setEnvironmentProperty("aai.url", "http://localhost:6666");
- PolicyEngine.manager.setEnvironmentProperty("aai.username", "AAI");
- PolicyEngine.manager.setEnvironmentProperty("aai.password", "AAI");
- }
-
- /**
- * Set the Guard properties to use embedded XACML PDPEngine.
- */
- public static void setGuardPropsEmbedded() {
- /*
- * Guard PDP-x connection Properties. No URL specified -> use embedded PDPEngine.
- */
- PolicyEngine.manager.setEnvironmentProperty("prop.guard.propfile",
- "src/test/resources/properties/xacml_guard_clc.properties");
- PolicyEngine.manager.setEnvironmentProperty(org.onap.policy.guard.Util.PROP_GUARD_USER, "python");
- PolicyEngine.manager.setEnvironmentProperty(org.onap.policy.guard.Util.PROP_GUARD_PASS, "test");
- PolicyEngine.manager.setEnvironmentProperty(org.onap.policy.guard.Util.PROP_GUARD_CLIENT_USER, "python");
- PolicyEngine.manager.setEnvironmentProperty(org.onap.policy.guard.Util.PROP_GUARD_CLIENT_PASS, "test");
- PolicyEngine.manager.setEnvironmentProperty(org.onap.policy.guard.Util.PROP_GUARD_ENV, "TEST");
- PolicyEngine.manager.setEnvironmentProperty(org.onap.policy.guard.Util.PROP_GUARD_DISABLED, "false");
- }
-
- /**
- * Set the operation history properties.
- */
- public static void setPuProp() {
- System.setProperty(OPSHISTPUPROP, "OperationsHistoryPUTest");
- }
-
- /**
- * Dump the contents of the History database.
- *
- * @return a list of the database entries
- */
- public static List<?> dumpDb() {
- //
- // Connect to in-mem db
- //
- EntityManagerFactory emf = Persistence.createEntityManagerFactory("OperationsHistoryPUTest");
- EntityManager em = emf.createEntityManager();
- //
- // Create query
- //
- String sql = "select * from operationshistory";
- Query nq = em.createNativeQuery(sql);
- List<?> results = null;
- //
- // Execute query
- //
- try {
- results = nq.getResultList();
- } catch (Exception ex) {
- logger.error("getStatusFromDB threw: ", ex);
- //
- // Clean up and return null
- //
- em.close();
- emf.close();
- return null;
- }
- //
- // Clean up and return results
- //
- em.close();
- emf.close();
- return results;
- }
-
- /**
- * Rule specification.
- */
- public static class RuleSpec {
- private String droolsTemplate;
- private String closedLoopControlName;
- private String policyScope;
- private String policyName;
- private String policyVersion;
- private String yamlSpecification;
-
- /**
- * Constructs the object.
- *
- * @param droolsTemplate template
- * @param closedLoopControlName control loop id
- * @param policyScope policy scope
- * @param policyName policy name
- * @param policyVersion policy version
- * @param yamlSpecification incoming yaml specification
- */
- public RuleSpec(String droolsTemplate, String closedLoopControlName, String policyScope, String policyName,
- String policyVersion, String yamlSpecification) {
-
- this.droolsTemplate = droolsTemplate;
- this.closedLoopControlName = closedLoopControlName;
- this.policyScope = policyScope;
- this.policyName = policyName;
- this.policyVersion = policyVersion;
- this.yamlSpecification = yamlSpecification;
- }
-
- /**
- * Generates the rules by reading the template and making variable substitutions.
- *
- * @return the rules
- * @throws IOException if an error occurs
- */
- private String generateRules() throws IOException {
- Path rule = Paths.get(droolsTemplate);
- String ruleTemplate = new String(Files.readAllBytes(rule));
-
- Pattern pattern = Pattern.compile("\\$\\{closedLoopControlName\\}");
- Matcher matcher = pattern.matcher(ruleTemplate);
- ruleTemplate = matcher.replaceAll(closedLoopControlName);
-
- pattern = Pattern.compile("\\$\\{policyScope\\}");
- matcher = pattern.matcher(ruleTemplate);
- ruleTemplate = matcher.replaceAll(policyScope);
-
- pattern = Pattern.compile("\\$\\{policyName\\}");
- matcher = pattern.matcher(ruleTemplate);
- ruleTemplate = matcher.replaceAll(policyName);
-
- pattern = Pattern.compile("\\$\\{policyVersion\\}");
- matcher = pattern.matcher(ruleTemplate);
- ruleTemplate = matcher.replaceAll(policyVersion);
-
- pattern = Pattern.compile("\\$\\{controlLoopYaml\\}");
- matcher = pattern.matcher(ruleTemplate);
- ruleTemplate = matcher.replaceAll(yamlSpecification);
-
- return ruleTemplate;
- }
- }
-}
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/META-INF/persistence.xml b/controlloop/templates/template.demo.clc/src/test/resources/META-INF/persistence.xml
deleted file mode 100644
index e1aa93f51..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ============LICENSE_START=======================================================
- drools-applications
- ================================================================================
- Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
- ================================================================================
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ============LICENSE_END=========================================================
- -->
-<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0">
-
- <!-- In-mem DB for junit -->
- <persistence-unit name="OperationsHistoryPUTest"
- transaction-type="RESOURCE_LOCAL">
- <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
-
- <class>org.onap.policy.database.operationshistory.Dbao</class>
-
- <properties>
- <property name="eclipselink.ddl-generation" value="create-tables" />
- <property name="eclipselink.logging.level" value="FINE" />
- <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
- <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
- <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:testdb;DATABASE_TO_UPPER=FALSE" />
- <property name="javax.persistence.jdbc.user" value="policy" />
- <property name="javax.persistence.jdbc.password" value="P01icY" />
- <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
- <property name="javax.persistence.schema-generation.create-source" value="metadata"/>
- </properties>
- </persistence-unit>
-
-</persistence>
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/coordination/synthetic_control_loop_one_blocks_synthetic_control_loop_two.yaml b/controlloop/templates/template.demo.clc/src/test/resources/coordination/synthetic_control_loop_one_blocks_synthetic_control_loop_two.yaml
deleted file mode 100644
index 7b69c3a0c..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/coordination/synthetic_control_loop_one_blocks_synthetic_control_loop_two.yaml
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright 2019 AT&T Intellectual Property. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-!!org.onap.policy.coordination.CoordinationDirective
-
-controlLoop:
-- SyntheticControlLoopOne
-- SyntheticControlLoopTwo
-coordinationFunction: firstBlocksSecond \ No newline at end of file
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/properties/prototype/xacml_guard_clc.properties b/controlloop/templates/template.demo.clc/src/test/resources/properties/prototype/xacml_guard_clc.properties
deleted file mode 100644
index fa9568b5c..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/properties/prototype/xacml_guard_clc.properties
+++ /dev/null
@@ -1,47 +0,0 @@
-###
-# ============LICENSE_START=======================================================
-# ONAP
-# ================================================================================
-# Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
-# ================================================================================
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ============LICENSE_END=========================================================
-###
-#
-#
-# Standard API Factories
-#
-xacml.dataTypeFactory=com.att.research.xacml.std.StdDataTypeFactory
-xacml.pdpEngineFactory=com.att.research.xacmlatt.pdp.ATTPDPEngineFactory
-xacml.pepEngineFactory=com.att.research.xacml.std.pep.StdEngineFactory
-xacml.pipFinderFactory=com.att.research.xacml.std.pip.StdPIPFinderFactory
-xacml.traceEngineFactory=com.att.research.xacml.std.trace.LoggingTraceEngineFactory
-#
-# AT&T PDP Implementation Factories
-#
-xacml.att.evaluationContextFactory=com.att.research.xacmlatt.pdp.std.StdEvaluationContextFactory
-xacml.att.combiningAlgorithmFactory=com.att.research.xacmlatt.pdp.std.StdCombiningAlgorithmFactory
-xacml.att.functionDefinitionFactory=com.att.research.xacmlatt.pdp.std.StdFunctionDefinitionFactory
-xacml.att.policyFinderFactory=com.att.research.xacmlatt.pdp.std.StdPolicyFinderFactory
-
-
-#
-# NOTE: If you are testing against a RESTful PDP, then the PDP must be configured with the
-# policies and PIP configuration as defined below. Otherwise, this is the configuration that
-# the embedded PDP uses.
-#
-
-# In case we have multiple applicable Guard policies, we will deny if any of them denies.
-xacml.att.policyFinderFactory.combineRootPolicies=urn:oasis:names:tc:xacml:3.0:policy-combining-algorithm:permit-unless-deny
-
-get-operation-outcome.persistenceunit=OperationsHistoryPUTest \ No newline at end of file
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test-B.yaml b/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test-B.yaml
deleted file mode 100644
index 498ef766e..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test-B.yaml
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2018 AT&T Intellectual Property. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-controlLoop:
- version: 2.0.0
- controlLoopName: ControlLoop-Event-Cleanup-Test-B
- services:
- - serviceInvariantUUID: 5cfe6f4a-41bc-4247-8674-ebd4b98e35cc
- serviceUUID: 0f40bba5-986e-4b3c-803f-ddd1b7b25f24
- serviceName: 57e66ea7-0ed6-45c7-970f
- trigger_policy: unique-policy-id-1-modifyConfig
- timeout: 60
- abatement: true
-
-policies:
- - id: unique-policy-id-1-modifyConfig
- name: modify packet gen config
- description:
- actor: APPC
- recipe: ModifyConfig
- target:
- resourceID: Eace933104d443b496b8.nodes.heat.vpg
- type: VNF
- retry: 0
- timeout: 30
- success: final_success
- failure: final_failure
- failure_timeout: final_failure_timeout
- failure_retries: final_failure_retries
- failure_exception: final_failure_exception
- failure_guard: final_failure_guard \ No newline at end of file
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test.yaml b/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test.yaml
deleted file mode 100644
index a19b0ef6b..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test.yaml
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2018 AT&T Intellectual Property. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-controlLoop:
- version: 2.0.0
- controlLoopName: ControlLoop-Event-Cleanup-Test
- services:
- - serviceInvariantUUID: 5cfe6f4a-41bc-4247-8674-ebd4b98e35cc
- serviceUUID: 0f40bba5-986e-4b3c-803f-ddd1b7b25f24
- serviceName: 57e66ea7-0ed6-45c7-970f
- trigger_policy: unique-policy-id-1-modifyConfig
- timeout: 60
- abatement: true
-
-policies:
- - id: unique-policy-id-1-modifyConfig
- name: modify packet gen config
- description:
- actor: APPC
- recipe: ModifyConfig
- target:
- resourceID: Eace933104d443b496b8.nodes.heat.vpg
- type: VNF
- retry: 0
- timeout: 30
- success: final_success
- failure: final_failure
- failure_timeout: final_failure_timeout
- failure_retries: final_failure_retries
- failure_exception: final_failure_exception
- failure_guard: final_failure_guard \ No newline at end of file
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test2.yaml b/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test2.yaml
deleted file mode 100644
index 57062a47a..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_EventCleanup-test2.yaml
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright 2018 AT&T Intellectual Property. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#
-# This YAML must be slightly different from test.yaml.
-#
-controlLoop:
- version: 3.0.0
- controlLoopName: ControlLoop-Event-Cleanup-Test
- services:
- - serviceInvariantUUID: 5cfe6f4a-41bc-4247-8674-ebd4b98e35cc
- serviceUUID: 0f40bba5-986e-4b3c-803f-ddd1b7b25f24
- serviceName: 57e66ea7-0ed6-45c7-970f
- trigger_policy: unique-policy-id-1-modifyConfig
- timeout: 60
- abatement: true
-
-policies:
- - id: unique-policy-id-1-modifyConfig
- name: modify packet gen config
- description:
- actor: APPC
- recipe: ModifyConfig
- target:
- resourceID: Eace933104d443b496b8.nodes.heat.vpg
- type: VNF
- retry: 0
- timeout: 30
- success: final_success
- failure: final_failure
- failure_timeout: final_failure_timeout
- failure_retries: final_failure_retries
- failure_exception: final_failure_exception
- failure_guard: final_failure_guard \ No newline at end of file
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test-B.yaml b/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test-B.yaml
deleted file mode 100644
index e19cb498e..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test-B.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2018 AT&T Intellectual Property. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-controlLoop:
- version: 2.0.0
- controlLoopName: ControlLoop-Params-Cleanup-Test-B
- trigger_policy: unique-policy-id-1-scale-up
- timeout: 60
-
-policies:
- - id: unique-policy-id-1-scale-up
- name: Create a new VF Module
- description:
- actor: SO
- recipe: VF Module Create
- target:
- type: VNF
- retry: 0
- timeout: 30
- success: final_success
- failure: final_failure
- failure_timeout: final_failure_timeout
- failure_retries: final_failure_retries
- failure_exception: final_failure_exception
- failure_guard: final_failure_guard
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test.yaml b/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test.yaml
deleted file mode 100644
index 6d89d58c4..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
-# Copyright 2018 AT&T Intellectual Property. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-controlLoop:
- version: 2.0.0
- controlLoopName: ControlLoop-Params-Cleanup-Test
- trigger_policy: unique-policy-id-1-scale-up
- timeout: 60
-
-policies:
- - id: unique-policy-id-1-scale-up
- name: Create a new VF Module
- description:
- actor: SO
- recipe: VF Module Create
- target:
- type: VNF
- retry: 0
- timeout: 30
- success: final_success
- failure: final_failure
- failure_timeout: final_failure_timeout
- failure_retries: final_failure_retries
- failure_exception: final_failure_exception
- failure_guard: final_failure_guard
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test2.yaml b/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test2.yaml
deleted file mode 100644
index 358bbfbea..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_ParamsCleanup-test2.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright 2018 AT&T Intellectual Property. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-#
-# This YAML must be slightly different from test.yaml.
-#
-controlLoop:
- version: 3.0.0
- controlLoopName: ControlLoop-Params-Cleanup-Test
- trigger_policy: unique-policy-id-1-scale-up
- timeout: 60
-
-policies:
- - id: unique-policy-id-1-scale-up
- name: Create a new VF Module
- description:
- actor: SO
- recipe: VF Module Create
- target:
- type: VNF
- retry: 0
- timeout: 30
- success: final_success
- failure: final_failure
- failure_timeout: final_failure_timeout
- failure_retries: final_failure_retries
- failure_exception: final_failure_exception
- failure_guard: final_failure_guard
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_SyntheticOne.yaml b/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_SyntheticOne.yaml
deleted file mode 100644
index 2a74843a0..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_SyntheticOne.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2018 AT&T Intellectual Property. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-controlLoop:
- version: 2.0.0
- controlLoopName: SyntheticControlLoopOne
- services:
- - serviceName: ServiceSimple
- resources:
- - resourceName: res1
- resourceType: VFC
- - resourceName: res2
- resourceType: VFC
- trigger_policy: unique-policy-id-1
- timeout: 2500
- abatement: true
-
-policies:
- - id: unique-policy-id-1
- name: SyntheticControlLoopOnePolicy
- description:
- actor: APPC
- recipe: action_one
- target:
- type: VNF
- retry: 3
- timeout: 200
- success: final_success
- failure: final_failure
- failure_timeout: final_failure_timeout
- failure_retries: final_failure_retries
- failure_guard: final_failure_guard
- failure_exception: final_failure_exception
diff --git a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_SyntheticTwo.yaml b/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_SyntheticTwo.yaml
deleted file mode 100644
index 12e1bdf2b..000000000
--- a/controlloop/templates/template.demo.clc/src/test/resources/yaml/policy_ControlLoop_SyntheticTwo.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright 2018 AT&T Intellectual Property. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-controlLoop:
- version: 2.0.0
- controlLoopName: SyntheticControlLoopTwo
- services:
- - serviceName: ServiceSimple
- resources:
- - resourceName: res1
- resourceType: VFC
- - resourceName: res2
- resourceType: VFC
- trigger_policy: unique-policy-id-1
- timeout: 2500
- abatement: true
-
-policies:
- - id: unique-policy-id-1
- name: SyntheticControlLoopTwoPolicy
- description:
- actor: APPC
- recipe: action_two
- target:
- type: VNF
- retry: 3
- timeout: 200
- success: final_success
- failure: final_failure
- failure_timeout: final_failure_timeout
- failure_retries: final_failure_retries
- failure_guard: final_failure_guard
- failure_exception: final_failure_exception