Create archetype for Beijing Release 87/38087/2
authorDaniel Cruz <dc443y@att.com>
Fri, 23 Mar 2018 13:04:17 +0000 (08:04 -0500)
committerDaniel Cruz <dc443y@att.com>
Fri, 23 Mar 2018 17:28:27 +0000 (12:28 -0500)
This new archetype is a proof of concept for removing
template expansion from the BRMSGW. The idea is to have
a ueb or dmaap topic that the BRMSGW uses to send params
json and then the pdp-d will deserialize it into a
ControlLoopParams object. The rules engine will then
insert that fact in to the working memory which will be
used for rules matching between onset events and
corresponding policies.

Issue-ID: POLICY-692
Change-Id: I4237221c2216dab16160e79a8f2fdcab6571e1eb
Signed-off-by: Daniel Cruz <dc443y@att.com>
23 files changed:
controlloop/common/model-impl/events/src/main/java/org/onap/policy/controlloop/params/ControlLoopParams.java [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/pom.xml [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/META-INF/maven/archetype-metadata.xml [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/pom.xml [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/VoLTE.yaml [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/__artifactId__-controller.properties [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/__artifactId__-controller.rest.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/appc.lcm.success.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/appc.legacy.success.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/brmsgw.params.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vcpe.abatement.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vcpe.onset.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vdns.onset.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vfw.onset.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.volte.onset.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/so.success.json [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/vCPE.yaml [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/vDNS.yaml [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/vFW.yaml [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/resources/META-INF/kmodule.xml [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl [new file with mode: 0644]
controlloop/templates/archetype-cl-beijing/src/test/resources/projects/basic/archetype.properties [new file with mode: 0644]
controlloop/templates/pom.xml

diff --git a/controlloop/common/model-impl/events/src/main/java/org/onap/policy/controlloop/params/ControlLoopParams.java b/controlloop/common/model-impl/events/src/main/java/org/onap/policy/controlloop/params/ControlLoopParams.java
new file mode 100644 (file)
index 0000000..d62dc02
--- /dev/null
@@ -0,0 +1,87 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * AppcLcmActorServiceProvider
+ * ================================================================================
+ * 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.controlloop.params;
+
+import java.io.Serializable;
+
+public class ControlLoopParams implements Serializable {
+
+    private static final long serialVersionUID = 970755684770982776L;
+    
+    private String closedLoopControlName;
+    private String controlLoopYaml;
+    private String policyName;
+    private String policyScope;
+    private String policyVersion;
+
+    public ControlLoopParams() {
+        super();
+    }
+
+    public ControlLoopParams(ControlLoopParams params) {
+        this.closedLoopControlName = params.closedLoopControlName;
+        this.controlLoopYaml = params.controlLoopYaml;
+        this.policyName = params.policyName;
+        this.policyScope = params.policyScope;
+        this.policyVersion = params.policyVersion;
+    }
+
+    public String getClosedLoopControlName() {
+        return closedLoopControlName;
+    }
+
+    public void setClosedLoopControlName(String closedLoopControlName) {
+        this.closedLoopControlName = closedLoopControlName;
+    }
+
+    public String getControlLoopYaml() {
+        return controlLoopYaml;
+    }
+
+    public void setControlLoopYaml(String controlLoopYaml) {
+        this.controlLoopYaml = controlLoopYaml;
+    }
+
+    public String getPolicyName() {
+        return policyName;
+    }
+
+    public void setPolicyName(String policyName) {
+        this.policyName = policyName;
+    }
+
+    public String getPolicyScope() {
+        return policyScope;
+    }
+
+    public void setPolicyScope(String policyScope) {
+        this.policyScope = policyScope;
+    }
+
+    public String getPolicyVersion() {
+        return policyVersion;
+    }
+
+    public void setPolicyVersion(String policyVersion) {
+        this.policyVersion = policyVersion;
+    }
+
+}
diff --git a/controlloop/templates/archetype-cl-beijing/pom.xml b/controlloop/templates/archetype-cl-beijing/pom.xml
new file mode 100644 (file)
index 0000000..a7ad772
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  ONAP
+  ================================================================================
+  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=========================================================
+  -->
+
+<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>
+  <packaging>maven-archetype</packaging>
+
+  <parent>
+    <groupId>org.onap.policy.drools-applications.controlloop.templates</groupId>
+    <artifactId>templates</artifactId>
+    <version>1.2.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>archetype-cl-beijing</artifactId>
+
+  <name>${project.artifactId}</name>
+  <description>Archetype to generate a yaml based control loop for ONAP Beijing release</description>
+
+  <build>
+    <extensions>
+      <extension>
+       <groupId>org.apache.maven.archetype</groupId>
+       <artifactId>archetype-packaging</artifactId>
+       <version>3.0.1</version>
+      </extension>
+    </extensions>
+
+    <pluginManagement>
+      <plugins>
+       <plugin>
+         <artifactId>maven-archetype-plugin</artifactId>
+         <version>3.0.1</version>
+       </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+</project>
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/META-INF/maven/archetype-metadata.xml b/controlloop/templates/archetype-cl-beijing/src/main/resources/META-INF/maven/archetype-metadata.xml
new file mode 100644 (file)
index 0000000..85ede2a
--- /dev/null
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  archetype-closed-loop-demo-rules
+  ================================================================================
+  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=========================================================
+  -->
+
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd" 
+    name="closed-loop-rules"
+    xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    
+ <requiredProperties>
+     <requiredProperty key="closedLoopControlName">
+       <defaultValue>ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e</defaultValue>
+     </requiredProperty>
+     <requiredProperty key="controlLoopYaml">
+               <defaultValue>controlLoop%3A%0A++version%3A+2.0.0%0A++controlLoopName%3A+ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e%0A++trigger_policy%3A+unique-policy-id-1-restart%0A++timeout%3A+3600%0A+%0Apolicies%3A%0A+%0A++-+id%3A+unique-policy-id-1-restart%0A++++name%3A+Restart+the+VM%0A++++description%3A%0A++++actor%3A+APPC%0A++++recipe%3A+Restart%0A++++target%3A%0A++++++type%3A+VM%0A++++retry%3A+3%0A++++timeout%3A+1200%0A++++success%3A+final_success%0A++++failure%3A+final_failure%0A++++failure_timeout%3A+final_failure_timeout%0A++++failure_retries%3A+final_failure_retries%0A++++failure_exception%3A+final_failure_exception%0A++++failure_guard%3A</defaultValue>
+     </requiredProperty>
+     <requiredProperty key="policyName">
+       <defaultValue>DCAE.Config_tca-hi-lo</defaultValue>
+     </requiredProperty>
+     <requiredProperty key="policyScope">
+       <defaultValue>DCAE</defaultValue>
+     </requiredProperty>     
+     <requiredProperty key="policyVersion">
+       <defaultValue>1.1.1</defaultValue>
+     </requiredProperty>
+     <requiredProperty key="dmaapServers">
+       <defaultValue>vm1.mr.simpledemo.openecomp.org</defaultValue>
+     </requiredProperty>
+     <requiredProperty key="brmsgwTopic">
+       <defaultValue>BRMSGW-POLICY</defaultValue>
+     </requiredProperty>
+     <requiredProperty key="dcaeTopic">
+       <defaultValue>unauthenticated.DCAE_CL_OUTPUT</defaultValue>
+     </requiredProperty>
+     <requiredProperty key="dcaeServers">
+               <defaultValue>vm1.mr.simpledemo.openecomp.org</defaultValue>
+     </requiredProperty>
+     <requiredProperty key="dependenciesVersion">
+       <defaultValue>1.1.1</defaultValue>
+     </requiredProperty>
+  </requiredProperties>
+      
+  <fileSets>
+    <fileSet filtered="true" encoding="UTF-8">
+      <directory>src/main/resources</directory>
+      <includes>
+        <include>**/*.xml</include>
+      </includes>
+    </fileSet>
+    <fileSet filtered="true" encoding="UTF-8">
+      <directory>src/main/resources</directory>
+      <includes>
+        <include>**/*.drl</include>
+      </includes>
+    </fileSet>    
+    <fileSet filtered="true" encoding="UTF-8">
+      <directory>src/main/config</directory>
+      <includes>
+        <include>**/*.properties</include>
+        <include>**/*.json</include>
+      </includes>
+    </fileSet>
+  </fileSets>
+</archetype-descriptor>
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/pom.xml b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/pom.xml
new file mode 100644 (file)
index 0000000..fae94ae
--- /dev/null
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  ONAP
+  ================================================================================
+  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=========================================================
+  -->
+
+<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>
+
+  <groupId>${groupId}</groupId>
+  <artifactId>${artifactId}</artifactId>
+  <version>${version}</version>
+  <packaging>kjar</packaging>
+
+  <name>${artifactId}</name>
+  <description>Control Loop Beijing Release Rules</description>
+
+  <properties>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <maven.compiler.target>1.8</maven.compiler.target>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+       <groupId>org.kie</groupId>
+       <artifactId>kie-maven-plugin</artifactId>
+       <version>6.5.0.Final</version>
+       <extensions>true</extensions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.model-impl</groupId>
+      <artifactId>events</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.model-impl</groupId>
+      <artifactId>appc</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.model-impl</groupId>
+      <artifactId>appclcm</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.model-impl</groupId>
+      <artifactId>vfc</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.model-impl</groupId>
+      <artifactId>so</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>      
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.model-impl</groupId>
+      <artifactId>aai</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.model-impl</groupId>
+      <artifactId>sdc</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.model-impl</groupId>
+      <artifactId>trafficgenerator</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
+      <artifactId>eventmanager</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>                      
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
+      <artifactId>guard</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.actors</groupId>
+      <artifactId>actorServiceProvider</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.actors</groupId>
+      <artifactId>actor.appc</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.actors</groupId>
+      <artifactId>actor.appclcm</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.actors</groupId>
+      <artifactId>actor.so</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common.actors</groupId>
+      <artifactId>actor.vfc</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-applications.controlloop.common</groupId>
+      <artifactId>policy-yaml</artifactId>
+      <version>${dependenciesVersion}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.att.research.xacml</groupId>
+      <artifactId>xacml-pdp</artifactId>
+      <version>1.0.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.onap.policy.drools-pdp</groupId>
+      <artifactId>policy-management</artifactId>
+      <version>${dependenciesVersion}</version>
+      <scope>provided</scope>
+      <optional>true</optional>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/VoLTE.yaml b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/VoLTE.yaml
new file mode 100644 (file)
index 0000000..5e3a18e
--- /dev/null
@@ -0,0 +1,24 @@
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ${closedLoopControlName}
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 3600
+  abatement: false
+
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart the VM
+    description:
+    actor: VFC
+    recipe: Restart
+    target:
+      type: VM
+    retry: 3
+    timeout: 1200
+    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/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/__artifactId__-controller.properties b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/__artifactId__-controller.properties
new file mode 100644 (file)
index 0000000..345086b
--- /dev/null
@@ -0,0 +1,74 @@
+###
+# ============LICENSE_START=======================================================
+# archetype-closed-loop-demo-rules
+# ================================================================================
+# 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=========================================================
+###
+
+controller.name=${artifactId}
+
+ueb.source.topics=${brmsgwTopic},${dcaeTopic},APPC-CL,APPC-LCM-WRITE
+
+ueb.source.topics.${brmsgwTopic}.servers=${dcaeServers}
+ueb.source.topics.${brmsgwTopic}.apiKey=
+ueb.source.topics.${brmsgwTopic}.apiSecret=
+ueb.source.topics.${brmsgwTopic}.events=org.onap.policy.controlloop.params.ControlLoopParams
+ueb.source.topics.${brmsgwTopic}.events.org.onap.policy.controlloop.params.ControlLoopParams.filter=closedLoopControlName=.*,controlLoopYaml=.*
+
+ueb.source.topics.${dcaeTopic}.servers=${dcaeServers}
+ueb.source.topics.${dcaeTopic}.apiKey=
+ueb.source.topics.${dcaeTopic}.apiSecret=
+ueb.source.topics.${dcaeTopic}.events=org.onap.policy.controlloop.VirtualControlLoopEvent
+ueb.source.topics.${dcaeTopic}.events.org.onap.policy.controlloop.VirtualControlLoopEvent.filter=closedLoopEventStatus=.*
+ueb.source.topics.${dcaeTopic}.events.custom.gson=org.onap.policy.controlloop.util.Serialization,gson
+
+ueb.source.topics.APPC-CL.servers=${dmaapServers}
+ueb.source.topics.APPC-CL.apiKey=
+ueb.source.topics.APPC-CL.apiSecret=
+ueb.source.topics.APPC-CL.events=org.onap.policy.appc.Response
+ueb.source.topics.APPC-CL.events.org.onap.policy.appc.Response.filter=CommonHeader\=.*,Status\=.*
+ueb.source.topics.APPC-CL.events.custom.gson=org.onap.policy.appc.util.Serialization,gsonPretty
+
+ueb.source.topics.APPC-LCM-WRITE.servers=${dmaapServers}
+ueb.source.topics.APPC-LCM-WRITE.apiKey=
+ueb.source.topics.APPC-LCM-WRITE.apiSecret=
+ueb.source.topics.APPC-LCM-WRITE.events=org.onap.policy.appclcm.LCMResponseWrapper
+ueb.source.topics.APPC-LCM-WRITE.events.org.onap.policy.appclcm.LCMResponseWrapper.filter=type\=response
+ueb.source.topics.APPC-LCM-WRITE.events.custom.gson=org.onap.policy.appclcm.util.Serialization,gson
+
+noop.sink.topics=APPC-CL,APPC-LCM-READ,POLICY-CL-MGT
+
+noop.sink.topics.APPC-CL.servers=${dmaapServers}
+noop.sink.topics.APPC-CL.apiKey=
+noop.sink.topics.APPC-CL.apiSecret=
+noop.sink.topics.APPC-CL.events=org.onap.policy.appc.Request
+noop.sink.topics.APPC-CL.events.custom.gson=org.onap.policy.appc.util.Serialization,gsonPretty
+
+noop.sink.topics.APPC-LCM-READ.servers=${dmaapServers}
+noop.sink.topics.APPC-LCM-READ.apiKey=
+noop.sink.topics.APPC-LCM-READ.apiSecret=
+noop.sink.topics.APPC-LCM-READ.events=org.onap.policy.appclcm.LCMRequestWrapper
+noop.sink.topics.APPC-LCM-READ.events.custom.gson=org.onap.policy.appclcm.util.Serialization,gson
+
+noop.sink.topics.POLICY-CL-MGT.servers=${dmaapServers}
+noop.sink.topics.POLICY-CL-MGT.apiKey=
+noop.sink.topics.POLICY-CL-MGT.apiSecret=
+noop.sink.topics.POLICY-CL-MGT.events=org.onap.policy.controlloop.VirtualControlLoopNotification
+noop.sink.topics.POLICY-CL-MGT.events.custom.gson=org.onap.policy.controlloop.util.Serialization,gsonPretty
+
+rules.groupId=${groupId}
+rules.artifactId=${artifactId}
+rules.version=${version}
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/__artifactId__-controller.rest.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/__artifactId__-controller.rest.json
new file mode 100644 (file)
index 0000000..48d48de
--- /dev/null
@@ -0,0 +1,38 @@
+{
+       "controller.name": "${artifactId}",
+       
+       "ueb.source.topics": "${dcaeTopic},APPC-CL,APPC-LCM-WRITE",
+
+       "ueb.source.topics.${dcaeTopic}.servers": "${dcaeServers}",
+       "ueb.source.topics.${dcaeTopic}.events": "org.onap.policy.controlloop.VirtualControlLoopEvent",
+       "ueb.source.topics.${dcaeTopic}.events.org.onap.policy.controlloop.VirtualControlLoopEvent.filter": "closedLoopEventStatus=.*",
+       "ueb.source.topics.${dcaeTopic}.events.custom.gson": "org.onap.policy.controlloop.util.Serialization,gson",
+       
+       "ueb.source.topics.APPC-CL.servers": "${dmaapServers}",
+       "ueb.source.topics.APPC-CL.events": "org.onap.policy.appc.Response",
+       "ueb.source.topics.APPC-CL.events.org.onap.policy.appclcm.LCMResponseWrapper.filter": "CommonHeader=.*,Status=.*",
+       "ueb.source.topics.APPC-CL.events.custom.gson": "org.onap.policy.appc.util.Serialization,gsonPretty",
+       
+       "ueb.source.topics.APPC-LCM-WRITE.servers": "${dmaapServers}",
+       "ueb.source.topics.APPC-LCM-WRITE.events": "org.onap.policy.appclcm.LCMResponseWrapper",
+       "ueb.source.topics.APPC-LCM-WRITE.events.org.onap.policy.appclcm.LCMResponseWrapper.filter": "type=response",
+       "ueb.source.topics.APPC-LCM-WRITE.events.custom.gson": "org.onap.policy.appclcm.util.Serialization,gson",
+       
+       "noop.sink.topics": "APPC-CL,APPC-LCM-READ,POLICY-CL-MGT",
+
+       "noop.sink.topics.APPC-CL.servers": "${dmaapServers}",
+       "noop.sink.topics.APPC-CL.events": "org.onap.policy.appc.Request",
+       "noop.sink.topics.APPC-CL.events.custom.gson": "org.onap.policy.appc.util.Serialization,gsonPretty",
+       
+       "noop.sink.topics.APPC-LCM-READ.servers": "${dmaapServers}",
+       "noop.sink.topics.APPC-LCM-READ.events": "org.onap.policy.appclcm.LCMRequestWrapper",
+       "noop.sink.topics.APPC-LCM-READ.events.custom.gson": "org.onap.policy.appclcm.util.Serialization,gson",
+       
+       "noop.sink.topics.POLICY-CL-MGT.servers": "${dmaapServers}",
+       "noop.sink.topics.POLICY-CL-MGT.events": "org.onap.policy.controlloop.VirtualControlLoopNotification",
+       "noop.sink.topics.POLICY-CL-MGT.events.custom.gson": "org.onap.policy.controlloop.util.Serialization,gson",
+       
+       "rules.groupId": "${groupId}",
+       "rules.artifactId": "${artifactId}",
+       "rules.version": "${version}"
+}
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/appc.lcm.success.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/appc.lcm.success.json
new file mode 100644 (file)
index 0000000..9856850
--- /dev/null
@@ -0,0 +1,22 @@
+{ 
+  "body": { 
+    "output": { 
+      "common-header": { 
+        "timestamp": "2017-08-25T21:06:23.037Z", 
+        "api-ver": "5.00", 
+        "originator-id": "664be3d2-6c12-4f4b-a3e7-c349acced200", 
+        "request-id": "664be3d2-6c12-4f4b-a3e7-c349acced200", 
+        "sub-request-id": "1", 
+        "flags": {} 
+      }, 
+      "status": { 
+        "code": 400, 
+        "message": "Restart Successful" 
+      } 
+    } 
+  }, 
+  "version": "2.0", 
+  "rpc-name": "restart", 
+  "correlation-id": "664be3d2-6c12-4f4b-a3e7-c349acced200-1", 
+  "type": "response" 
+}
\ No newline at end of file
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/appc.legacy.success.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/appc.legacy.success.json
new file mode 100644 (file)
index 0000000..2c6570d
--- /dev/null
@@ -0,0 +1,41 @@
+{
+  "CommonHeader": {
+    "TimeStamp": 1506051879001,
+    "APIver": "1.01",
+    "RequestID": "c7c6a4aa-bb61-4a15-b831-ba1472dd4a65",
+    "SubRequestID": "1",
+    "RequestTrack": [],
+    "Flags": []
+  },
+  "Status": {
+    "Code": 400,
+    "Value": "SUCCESS"
+  },
+  "Payload": {
+    "generic-vnf.vnf-id": "jimmy-test-vnf2",
+    "pg-streams": {
+      "pg-stream": [
+        {
+          "id": "fw_udp1",
+          "is-enabled": "true"
+        },
+        {
+          "id": "fw_udp2",
+          "is-enabled": "true"
+        },
+        {
+          "id": "fw_udp3",
+          "is-enabled": "true"
+        },
+        {
+          "id": "fw_udp4",
+          "is-enabled": "true"
+        },
+        {
+          "id": "fw_udp5",
+          "is-enabled": "true"
+        }
+      ]
+    }
+  }
+}
\ No newline at end of file
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/brmsgw.params.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/brmsgw.params.json
new file mode 100644 (file)
index 0000000..9e19361
--- /dev/null
@@ -0,0 +1,7 @@
+{
+       "closedLoopControlName": "${closedLoopControlName}",
+       "controlLoopYaml": "${controlLoopYaml}",
+       "policyName": "${policyName}",
+       "policyScope": "${policyScope}",
+       "policyVersion": "${policyVersion}"
+}
\ No newline at end of file
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vcpe.abatement.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vcpe.abatement.json
new file mode 100644 (file)
index 0000000..7294511
--- /dev/null
@@ -0,0 +1,16 @@
+{
+  "closedLoopControlName": "${closedLoopControlName}",
+  "closedLoopAlarmStart": 1463679805324,
+  "closedLoopAlarmEnd": 1463699805324,
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "closedLoopEventStatus": "ABATED",
+  "requestID": "664be3d2-6c12-4f4b-a3e7-c349acced200",
+  "target_type": "VNF",
+  "target": "generic-vnf.vnf-id",
+  "AAI": {
+    "vserver.is-closed-loop-disabled": "false",
+    "generic-vnf.vnf-id": "vCPE_Infrastructure_vGMUX_demo_app"
+  },
+  "from": "DCAE",
+  "version": "1.0.2"
+}
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vcpe.onset.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vcpe.onset.json
new file mode 100644 (file)
index 0000000..feb15c1
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "closedLoopControlName": "${closedLoopControlName}",
+  "closedLoopAlarmStart": 1463679805324,
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "closedLoopEventStatus": "ONSET",
+  "requestID": "664be3d2-6c12-4f4b-a3e7-c349acced200",
+  "target_type": "VNF",
+  "target": "generic-vnf.vnf-id",
+  "AAI": {
+    "vserver.is-closed-loop-disabled": "false",
+    "generic-vnf.vnf-id": "vCPE_Infrastructure_vGMUX_demo_app"
+  },
+  "from": "DCAE",
+  "version": "1.0.2"
+}
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vdns.onset.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vdns.onset.json
new file mode 100644 (file)
index 0000000..4868c58
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "closedLoopControlName": "${closedLoopControlName}",
+  "closedLoopAlarmStart": 1484677482204798,
+  "closedLoopEventClient": "DCAE_INSTANCE_ID.dcae-tca",
+  "closedLoopEventStatus": "ONSET",
+  "requestID": "e4f95e0c-a013-4530-8e59-c5c5f9e539b6",
+  "target_type": "VNF",
+  "target": "vserver.vserver-name",
+  "AAI": {
+    "vserver.is-closed-loop-disabled": "false",
+    "vserver.vserver-name": "dfw1lb01lb01"
+  },   
+  "from": "DCAE",
+  "version": "1.0.2"
+}
\ No newline at end of file
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vfw.onset.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.vfw.onset.json
new file mode 100644 (file)
index 0000000..140e9c2
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "closedLoopControlName": "${closedLoopControlName}",
+  "closedLoopAlarmStart": 1463679805324,
+  "closedLoopEventClient": "microservice.stringmatcher",
+  "closedLoopEventStatus": "ONSET",
+  "requestID": "c7c6a4aa-bb61-4a15-b831-ba1472dd4a65",
+  "target_type": "VNF",
+  "target": "generic-vnf.vnf-id",
+  "AAI": {
+    "vserver.is-closed-loop-disabled": "false",
+    "generic-vnf.vnf-id": "fw0002vm002fw002"
+  },
+  "from": "DCAE",
+  "version": "1.0.2"
+}
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.volte.onset.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/dcae.volte.onset.json
new file mode 100644 (file)
index 0000000..1519129
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "closedLoopControlName": "${closedLoopControlName}",
+       "closedLoopAlarmStart": 1484677482204798,
+    "closedLoopEventClient": "DCAE.HolmesInstance",
+    "closedLoopEventStatus": "ONSET",
+    "requestID": "97964e10-686e-4790-8c45-bdfa61df770f",
+    "target_type": "VM",
+    "target": "vserver.vserver-name",
+    "AAI": {
+       "vserver.is-closed-loop-disabled": "false",
+        "vserver.vserver-name": "dfw1lb01lb01",
+        "service-instance.service-instance-id" : "vserver-name-16102016-aai3255-data-11-1",
+        "generic-vnf.vnf-id" : "vnf-id-16102016-aai3255-data-11-1",
+        "generic-vnf.vnf-name" : "vnf-name-16102016-aai3255-data-11-1"
+    },
+    "from": "DCAE",
+    "version": "1.0.2"
+}
\ No newline at end of file
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/so.success.json b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/so.success.json
new file mode 100644 (file)
index 0000000..8f3387e
--- /dev/null
@@ -0,0 +1,7 @@
+{
+  "requestReferences": {
+    "instanceId": "ff305d54-75b4-ff1b-bdb2-eb6b9e5460ff",
+    "requestId": "e4f95e0c-a013-4530-8e59-c5c5f9e539b6"
+  },
+  "httpResponseCode": 200
+}
\ No newline at end of file
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/vCPE.yaml b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/vCPE.yaml
new file mode 100644 (file)
index 0000000..abe02c6
--- /dev/null
@@ -0,0 +1,23 @@
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ${closedLoopControlName}
+  trigger_policy: unique-policy-id-1-restart
+  timeout: 3600
+  abatement: true
+policies:
+  - id: unique-policy-id-1-restart
+    name: Restart the VM
+    description:
+    actor: APPC
+    recipe: Restart
+    target:
+      type: VM
+    retry: 3
+    timeout: 1200
+    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/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/vDNS.yaml b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/vDNS.yaml
new file mode 100644 (file)
index 0000000..274ed33
--- /dev/null
@@ -0,0 +1,23 @@
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ${closedLoopControlName}
+  trigger_policy: unique-policy-id-1-scale-up
+  timeout: 3600
+  abatement: false
+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: 3
+    timeout: 1200
+    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/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/vFW.yaml b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/config/vFW.yaml
new file mode 100644 (file)
index 0000000..37f5fa8
--- /dev/null
@@ -0,0 +1,24 @@
+controlLoop:
+  version: 2.0.0
+  controlLoopName: ${closedLoopControlName}
+  trigger_policy: unique-policy-id-1-modifyConfig
+  timeout: 3600
+  abatement: false
+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: 2
+    timeout: 1200
+    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/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/resources/META-INF/kmodule.xml b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/resources/META-INF/kmodule.xml
new file mode 100644 (file)
index 0000000..0e6660e
--- /dev/null
@@ -0,0 +1,29 @@
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  archetype-closed-loop-demo-rules
+  ================================================================================
+  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=========================================================
+  -->
+
+<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
+    <kbase name="rules">
+        <ksession name="beijing"/>
+    </kbase>
+</kmodule>
diff --git a/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl b/controlloop/templates/archetype-cl-beijing/src/main/resources/archetype-resources/src/main/resources/__closedLoopControlName__.drl
new file mode 100644 (file)
index 0000000..cb0a716
--- /dev/null
@@ -0,0 +1,1239 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * 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.controlloop;
+
+import org.onap.policy.controlloop.params.ControlLoopParams;
+import org.onap.policy.controlloop.VirtualControlLoopEvent;
+import org.onap.policy.controlloop.VirtualControlLoopNotification;
+import org.onap.policy.controlloop.ControlLoopEventStatus;
+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.NEW_EVENT_STATUS;
+import org.onap.policy.controlloop.eventmanager.ControlLoopOperationManager;
+import org.onap.policy.controlloop.actor.so.SOActorServiceProvider;
+import org.onap.policy.aai.util.AAIException;
+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.SORequestStatus;
+import org.onap.policy.so.SORequestDetails;
+import org.onap.policy.so.SOModelInfo;
+import org.onap.policy.so.SOCloudConfiguration;
+import org.onap.policy.so.SORequestInfo;
+import org.onap.policy.so.SORequestParameters;
+import org.onap.policy.so.SORelatedInstanceListElement;
+import org.onap.policy.so.SORelatedInstance;
+import org.onap.policy.so.SOResponse;
+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.PolicyGuardXacmlHelper;
+
+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;
+
+/*
+ * 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 ControlLoopParams object into working memory from the BRMSGW. 
+*
+*/
+rule "INSERT.PARAMS"
+    when
+        $params : ControlLoopParams()
+    then
+    
+    insert($params);
+
+    // 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(), $params.getPolicyName() + "." + 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 "EVENT"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName )
+        not ( ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestID == $event.getRequestID() ) )
+    then
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    logger.info("{}: {}", $clName, $params.getPolicyName() + "." + 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($params.getPolicyName() + "." + drools.getRule().getName());
+            notification.setPolicyScope($params.getPolicyScope());
+            notification.setPolicyVersion($params.getPolicyVersion());
+            
+            //
+            // 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($clName, $event.getRequestID());
+            //
+            // 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($params.getPolicyName() + "." + drools.getRule().getName());
+            notification.setPolicyScope($params.getPolicyScope());
+            notification.setPolicyVersion($params.getPolicyVersion());
+            //
+            // 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("{}: {}", $clName, $params.getPolicyName() + "." + drools.getRule().getName(), e);
+        
+        VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
+        notification.setNotification(ControlLoopNotificationType.REJECTED);
+        notification.setMessage("Exception occurred: " + e.getMessage());
+        notification.setPolicyName($params.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope($params.getPolicyScope());
+        notification.setPolicyVersion($params.getPolicyVersion());
+        //
+        //
+        //
+        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 "EVENT.MANAGER"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName )
+        $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={}", 
+                $clName, $params.getPolicyName() + "." + drools.getRule().getName(),
+                $event, $manager, $clTimer);
+    
+    try {
+           //
+           // Check which event this is.
+           //
+           ControlLoopEventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event);
+           //
+           // Check what kind of event this is
+           //
+           if (eventStatus == NEW_EVENT_STATUS.SUBSEQUENT_ONSET) {
+               //
+               // We don't care about subsequent onsets
+               //
+               logger.info("{}: {}: subsequent onset", 
+                           $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+               retract($event);
+               return;
+           }
+           if (eventStatus == NEW_EVENT_STATUS.SYNTAX_ERROR) {
+               //
+               // Ignore any bad syntax events
+               //
+               logger.warn("{}: {}: syntax error", 
+                           $clName, $params.getPolicyName() + "." + 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 != NEW_EVENT_STATUS.FIRST_ONSET) {
+               logger.warn("{}: {}: no first onset", 
+                           $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+               retract($event);
+           }
+           
+           logger.debug("{}: {}: target={}", $clName, 
+                        $params.getPolicyName() + "." + 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) {
+            //
+            // Its final, but are we waiting for abatement?
+            //
+            if ($manager.getNumAbatements() > 0) {
+                logger.info("{}: {}: abatement received for {}.  Closing the control loop", 
+                            $clName, $params.getPolicyName() + "." + drools.getRule().getName(), 
+                            $event.getRequestID());
+                notification.setFrom("policy");
+                notification.setPolicyName($params.getPolicyName() + "." + drools.getRule().getName());
+                notification.setPolicyScope($params.getPolicyScope());
+                notification.setPolicyVersion($params.getPolicyVersion());
+                //
+                // In this case, we are done
+                //
+                PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
+                //
+                // Unlock the target
+                //
+                TargetLock lock = $manager.unlockCurrentOperation();
+                if (lock != null) {
+                    logger.debug("{}: {}: retracting lock=", $clName, 
+                                 $params.getPolicyName() + "." + drools.getRule().getName(), lock);
+                    retract(lock);
+                }
+                //
+                // Retract everything from memory
+                //
+                logger.info("{}: {}: retracting onset, manager, and timer", 
+                            $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+                
+                retract($manager.getOnsetEvent());
+                retract($manager);
+                retract($clTimer);
+                //
+                // 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) {
+                  logger.info("{}: {}: waiting for abatement ..", 
+                              $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+                } else {
+                  logger.info("{}: {}: no abatement expect for {}.  Closing the control loop", 
+                              $clName, $params.getPolicyName() + "." + drools.getRule().getName(), 
+                              $event.getRequestID());
+                  
+                  notification.setFrom("policy");
+                  notification.setPolicyName($params.getPolicyName() + "." + drools.getRule().getName());
+                  notification.setPolicyScope($params.getPolicyScope());
+                  notification.setPolicyVersion($params.getPolicyVersion());
+                  
+                  //
+                  // In this case, we are done
+                  //
+                  PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
+                  //
+                  // Unlock the target
+                  //
+                  TargetLock lock = $manager.unlockCurrentOperation();
+                  if (lock != null) {
+                      logger.debug("{}: {}: retracting lock=", $clName, 
+                                  $params.getPolicyName() + "." + drools.getRule().getName(), lock);
+                      retract(lock);
+                  }
+                  //
+                  // Retract everything from memory
+                  //
+                  logger.info("{}: {}: retracting onset, manager, and timer", 
+                              $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+                  
+                  retract($manager.getOnsetEvent());
+                  retract($manager);
+                  retract($clTimer);
+                }
+            }
+        } 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={}", 
+                            $clName, $params.getPolicyName() + "." + 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($params.getPolicyName() + "." + drools.getRule().getName());
+                notification.setPolicyScope($params.getPolicyScope());
+                notification.setPolicyVersion($params.getPolicyVersion());
+      
+                       PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);                      
+               
+               retract($event);
+               retract($manager);
+               retract($clTimer);
+              }
+              logger.info("{}: {}: starting operation={}", 
+                          $clName, $params.getPolicyName() + "." + drools.getRule().getName(), 
+                          operation);
+            } else {
+                //
+                // Probably waiting for abatement
+                //
+              logger.info("{}: {}: no operation, probably waiting for abatement", 
+                          $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+            }
+        }
+    } catch (Exception e) {
+       logger.warn("{}: {}: unexpected", 
+                  $clName, 
+                  $params.getPolicyName() + "." + drools.getRule().getName(), e);
+
+       VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
+           notification.setNotification(ControlLoopNotificationType.FINAL_FAILURE);
+           notification.setMessage(e.getMessage());
+           notification.setFrom("policy");
+           notification.setPolicyName($params.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope($params.getPolicyScope());
+        notification.setPolicyVersion($params.getPolicyVersion());
+  
+               PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);                      
+               
+        retract($event);
+        retract($manager);
+        retract($clTimer);
+    }
+        
+end
+
+/*
+*
+* Guard Permitted, let's send request to the actor.
+*
+*/
+rule "EVENT.MANAGER.OPERATION.LOCKED.GUARD_PERMITTED"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName )
+        $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={}", 
+                $clName, $params.getPolicyName() + "." + drools.getRule().getName(),
+                $event, $manager, $operation, $lock);    
+
+    Object request = null;
+    boolean caughtException = false;
+    try {
+        request = $operation.startOperation($event);
+    }
+    catch (ControlLoopException e) {
+        String msg = e.getMessage();
+        logger.warn("{}: {}: operation={}:  AAI failure: {}", 
+                    $clName, $params.getPolicyName() + "." + drools.getRule().getName(),
+                    $operation, msg, e);
+        $operation.setOperationHasException(msg);
+        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)};
+    }
+    else if (request != null) {
+      logger.debug("{}: {}: starting operation ..", 
+                   $clName, $params.getPolicyName() + "." + 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($params.getPolicyName() + "." + drools.getRule().getName());
+      notification.setPolicyScope($params.getPolicyScope());
+      notification.setPolicyVersion($params.getPolicyVersion());
+      
+      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 recieved 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 
+                  SOActorServiceProvider.sendRequest($event.getRequestID().toString(), drools.getWorkingMemory(), request);                        
+              }
+              break;
+          case "VFC":
+              if (request instanceof VFCRequest) {
+                  // Start VFC thread
+                  Thread t = new Thread(new VFCManager(drools.getWorkingMemory(), (VFCRequest)request));
+                  t.start();
+              }          
+              break;
+      }
+    } else {
+      //
+      // What happens if its null?
+      //
+               logger.warn("{}: {}: unexpected null operation request", 
+                  $clName, 
+                  $params.getPolicyName() + "." + 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)};
+               }
+
+    }
+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 "EVENT.MANAGER.OPERATION.LOCKED.GUARD_NOT_YET_QUERIED"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName )
+        $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={}", 
+                $clName, $params.getPolicyName() + "." + 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($params.getPolicyName() + "." + drools.getRule().getName());
+    notification.setPolicyScope($params.getPolicyScope());
+    notification.setPolicyVersion($params.getPolicyVersion());
+    
+    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.
+    // 
+    // In order to use REST XACML, provide a URL instead of "" as a second argument 
+    // to the CallGuardTask() and set the first argument to null 
+    // (instead of XacmlPdpEngine).
+    //
+    
+    // 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 org.onap.policy.guard.CallGuardTask(
+                                                        drools.getWorkingMemory(),
+                                                        $event.getClosedLoopControlName(),
+                                                        $operation.policy.getActor().toString(),
+                                                        $operation.policy.getRecipe(),
+                                                        $operation.getTargetEntity(),
+                                                        $event.getRequestID().toString()
+                                                        ));
+        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 "GUARD.RESPONSE"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName, 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={}", 
+                 $clName, $params.getPolicyName() + "." + 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($params.getPolicyName() + "." + drools.getRule().getName());
+    notification.setPolicyScope($params.getPolicyScope());
+    notification.setPolicyVersion($params.getPolicyVersion());
+    
+    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 "APPC.RESPONSE"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName, 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("{}: {}", $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+    logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={} response={}", 
+                 $clName, $params.getPolicyName() + "." + 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={}", 
+                    $clName, $params.getPolicyName() + "." + 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($params.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope($params.getPolicyScope());
+        notification.setPolicyVersion($params.getPolicyVersion());
+        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 "APPC.RESPONSE.CLEANUP"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $response : Response($id : getCommonHeader().RequestID )
+        not ( VirtualControlLoopEvent( requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) 
+    then
+
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    logger.info("{}: {}", $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+    logger.debug("{}: {}: orphan appc response={}", 
+                $clName, $params.getPolicyName() + "." + 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 "APPC.LCM.RESPONSE"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName, 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("{}: {}", $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+    logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={} response={}", 
+                $clName, $params.getPolicyName() + "." + 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={}", 
+                  $clName, $params.getPolicyName() + "." + 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($params.getPolicyName() + "." + drools.getRule().getName());
+      notification.setPolicyScope($params.getPolicyScope());
+      notification.setPolicyVersion($params.getPolicyVersion());
+      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 "APPC.LCM.RESPONSE.CLEANUP"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $response : LCMResponseWrapper($id : getBody().getCommonHeader().getRequestId )
+        not ( VirtualControlLoopEvent( requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) 
+    then
+    
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    logger.info("{}: {}", $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+    logger.debug("{}: {}: orphan appc response={}", 
+                $clName, $params.getPolicyName() + "." + drools.getRule().getName(), $id);
+    //
+    // Retract it
+    //
+    retract($response);
+end
+
+/*
+*
+* This rule responds to SO Response Events
+*
+*/
+rule "SO.RESPONSE"
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName, closedLoopEventStatus == ControlLoopEventStatus.ONSET )
+        $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName() )
+        $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("{}: {}", $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+    logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={} response={}", 
+                $clName, $params.getPolicyName() + "." + 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={}", 
+                    $clName, $params.getPolicyName() + "." + drools.getRule().getName(),
+                    policyResult);
+      
+        //
+        // This Operation has completed, construct a notification showing our results
+        //
+        VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
+        notification.setFrom("policy");
+        notification.setPolicyName($params.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope($params.getPolicyScope());
+        notification.setPolicyVersion($params.getPolicyVersion());
+        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 "VFC.RESPONSE"
+       when
+               $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName, closedLoopEventStatus == ControlLoopEventStatus.ONSET )
+               $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName() )
+               $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("{}: {}", $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+       logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={} response={}", 
+                       $clName, $params.getPolicyName() + "." + 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($params.getPolicyName() + "." + drools.getRule().getName());
+            notification.setPolicyScope($params.getPolicyScope());
+            notification.setPolicyVersion($params.getPolicyVersion());
+                       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 "EVENT.MANAGER.OPERATION.TIMEOUT"
+    timer (expr: $to )
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName )
+        $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("{}: {}", $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+    logger.debug("{}: {}: event={} manager={} operation={} lock={} opTimer={}", 
+                $clName, $params.getPolicyName() + "." + 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($params.getPolicyName() + "." + drools.getRule().getName());
+    notification.setPolicyScope($params.getPolicyScope());
+    notification.setPolicyVersion($params.getPolicyVersion());
+    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 "EVENT.MANAGER.TIMEOUT"
+    timer (expr: $to )
+    when
+        $params : ControlLoopParams( $clName : getClosedLoopControlName() )
+        $event : VirtualControlLoopEvent( closedLoopControlName == $clName )
+        $manager : ControlLoopEventManager( closedLoopControlName == $event.getClosedLoopControlName(), requestID == $event.getRequestID() )
+        $clTimer : ControlLoopTimer ( closedLoopControlName == $event.getClosedLoopControlName(), requestID == $event.getRequestID().toString(), $to : getDelay() )
+        $operations : LinkedList()
+                        from collect( ControlLoopOperationManager( onset.closedLoopControlName == $event.getClosedLoopControlName(), onset.getRequestID() == $event.getRequestID() ) )
+        $opTimers : LinkedList()
+                        from collect( OperationTimer( closedLoopControlName == $event.getClosedLoopControlName(), requestID == $event.getRequestID().toString() ) )
+        $locks : LinkedList()
+                        from collect( TargetLock (requestID == $event.getRequestID()) )
+    then
+    
+    Logger logger = LoggerFactory.getLogger(drools.getRule().getPackage());
+    logger.info("{}: {}", $clName, $params.getPolicyName() + "." + drools.getRule().getName());
+
+    if ($operations == null) {
+      logger.debug("{}: {}: event={} manager={} clTimer={} operations=0", 
+                  $clName, $params.getPolicyName() + "." + drools.getRule().getName(),
+                  $event, $manager, $clTimer);
+    } else {
+      logger.debug("{}: {}: event={} manager={} clTimer={} operations={}", 
+                  $clName, $params.getPolicyName() + "." + drools.getRule().getName(),
+                  $event, $manager, $clTimer, $operations.size());
+    }
+    //
+    // Tell the Event Manager it has timed out
+    //
+    VirtualControlLoopNotification notification = $manager.setControlLoopTimedOut();
+    if (notification != null) {
+        notification.setFrom("policy");
+        notification.setPolicyName($params.getPolicyName() + "." + drools.getRule().getName());
+        notification.setPolicyScope($params.getPolicyScope());
+        notification.setPolicyVersion($params.getPolicyVersion());
+        //
+        // Let interested parties know
+        //
+        PolicyEngine.manager.deliver("POLICY-CL-MGT", notification);
+    }
+    //
+    // Retract EVERYTHING
+    //
+    retract($event);
+    retract($manager);
+    retract($clTimer);
+    if ($operations != null && $operations.size() > 0) {
+        Iterator<ControlLoopOperationManager> iter = $operations.iterator();
+        while (iter.hasNext()) {
+            ControlLoopOperationManager manager = iter.next();
+            retract(manager);
+        }
+    }
+    if ($opTimers != null && $opTimers.size() > 0) {
+        Iterator<OperationTimer> iter = $opTimers.iterator();
+        while (iter.hasNext()) {
+            OperationTimer opTimer = iter.next();
+            retract(opTimer);
+        }
+    }
+    if ($locks != null && $locks.size() > 0) {
+        Iterator<TargetLock> iter = $locks.iterator();
+        while (iter.hasNext()) {
+            TargetLock lock = iter.next();
+            //
+            // Ensure we release the lock
+            //
+            PolicyGuard.unlockTarget(lock);
+            //
+            //
+            //
+            retract(lock);
+        }
+    }
+end
+
+/*
+*
+* This rule will clean up any rogue onsets where there is no 
+* ControlLoopParams object corresponding to the onset event.
+*
+*/
+rule "EVENT.CLEANUP"
+    when
+        $event : VirtualControlLoopEvent( $clName: closedLoopControlName )
+        not ( ControlLoopParams( 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
\ No newline at end of file
diff --git a/controlloop/templates/archetype-cl-beijing/src/test/resources/projects/basic/archetype.properties b/controlloop/templates/archetype-cl-beijing/src/test/resources/projects/basic/archetype.properties
new file mode 100644 (file)
index 0000000..8cc10c9
--- /dev/null
@@ -0,0 +1,43 @@
+###
+# ============LICENSE_START=======================================================
+# archetype-closed-loop-demo-rules
+# ================================================================================
+# Copyright (C) 2017 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=========================================================
+###
+
+groupId=org.onap.policy.demo.drools
+artifactId=amsterdam
+version=1.1.0-SNAPSHOT
+package=org.onap.policy.demo.drools
+closedLoopControlName=ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e
+controlLoopYaml=controlLoop%3A%0A++version%3A+2.0.0%0A++controlLoopName%3A+ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e%0A++trigger_policy%3A+unique-policy-id-1-restart%0A++timeout%3A+3600%0A++abatement%3A+true%0A+%0Apolicies%3A%0A++-+id%3A+unique-policy-id-1-restart%0A++++name%3A+Restart+the+VM%0A++++description%3A%0A++++actor%3A+APPC%0A++++recipe%3A+Restart%0A++++target%3A%0A++++++type%3A+VM%0A++++retry%3A+3%0A++++timeout%3A+1200%0A++++success%3A+final_success%0A++++failure%3A+final_failure%0A++++failure_timeout%3A+final_failure_timeout%0A++++failure_retries%3A+final_failure_retries%0A++++failure_exception%3A+final_failure_exception%0A++++failure_guard%3A+final_failure_guard%0A
+policyScope=service=test;resource=FRWL;type=configuration
+policyName=FirewallDemo
+policyVersion=v1.0
+dmaapServers=server1,server2,server3
+appcTopic=APPC-CL
+notificationTopic=POLICY-CL-MGT
+dcaeTopic=DCAE-CL-EVENT
+dcaeServers=server1,server2,server3
+dependenciesVersion=1.0.0-SNAPSHOT
+aaiURL=http://localhost:8080/TestREST/Test
+aaiUsername=policy
+aaiPassword=policy
+aaiNamedQueryUUID=d925ed73-8231-4d02-9545-db4e101fffff
+aaiPatternMatch=false
+soURL=http://localhost:8080/TestREST/Test
+soUsername=policy
+soPassword=policy
index 71541ab..9850738 100644 (file)
@@ -35,6 +35,7 @@
   <modules>
     <module>template.demo</module>
     <module>archetype-cl-amsterdam</module>
+    <module>archetype-cl-beijing</module>
   </modules>