From 49898dee144de74a943bf620ffd8d250e6f5f00f Mon Sep 17 00:00:00 2001 From: Pamela Dragosh Date: Tue, 14 Mar 2017 18:15:32 -0400 Subject: cherry-pick release-1.0.0 changes Change-Id: Ibaac4da670cc8c800582aaffbb8a42c60d00e6f9 Signed-off-by: Pamela Dragosh --- .../base/src/files/install/mysql/data/161000_upgrade_script.sql | 8 ++++---- packages/base/src/files/install/servers/brmsgw/config.properties | 2 +- .../repository/com/Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml | 6 +++--- .../repository/com/Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml | 6 +++--- .../Config/com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt | 2 +- .../Config/com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) mode change 100644 => 100755 packages/base/src/files/install/mysql/data/161000_upgrade_script.sql mode change 100644 => 100755 packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml mode change 100644 => 100755 packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml mode change 100644 => 100755 packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt mode change 100644 => 100755 packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt (limited to 'packages') diff --git a/packages/base/src/files/install/mysql/data/161000_upgrade_script.sql b/packages/base/src/files/install/mysql/data/161000_upgrade_script.sql old mode 100644 new mode 100755 index 45effa503..ba887f214 --- a/packages/base/src/files/install/mysql/data/161000_upgrade_script.sql +++ b/packages/base/src/files/install/mysql/data/161000_upgrade_script.sql @@ -6429,15 +6429,15 @@ INSERT INTO `microservicelocation` VALUES (1,'SampleServiceLocation','demo'); INSERT INTO `risktype` VALUES (1,'demo','2016-12-29 20:20:48','demo','SampleRiskType','demo','2016-12-29 20:20:48'); -INSERT INTO `policyentity` VALUES (3152,'doACPolicyPut','2017-03-03 17:16:27',0,'BRMSParamvFWDemoPolicy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:','doACPolicyPut','2017-03-03 17:16:27','\n\n BRMSParamvFWDemoPolicy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:\n \n \n \n \n com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml\n \n \n \n \n \n DROOLS\n \n \n \n BRMS_PARAM_RULE\n \n \n \n SampleRiskType\n \n \n \n 1\n \n \n \n False\n \n \n \n NA\n \n \n \n \n \n \n \n \n \n \n ACCESS\n \n \n \n Config\n \n \n \n \n \n \n \n \n Configuration\n \n \n $URL/Config/com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt\n \n \n com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml\n \n \n 1\n \n \n DROOLS\n \n \n BRMS_PARAM_RULE\n \n \n vFW\n \n \n SampleRiskType\n \n \n 1\n \n \n False\n \n \n NA\n \n \n \n \n\n','Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml',0,'com',1,NULL,3151),(3154,'doACPolicyPut','2017-03-03 17:20:01',0,'vLB Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:','doACPolicyPut','2017-03-03 17:20:01','\n\n vLB Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:\n \n \n \n \n com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml\n \n \n \n \n \n DROOLS\n \n \n \n BRMS_PARAM_RULE\n \n \n \n SampleRiskType\n \n \n \n 1\n \n \n \n False\n \n \n \n NA\n \n \n \n \n \n \n \n \n \n \n ACCESS\n \n \n \n Config\n \n \n \n \n \n \n \n \n Configuration\n \n \n $URL/Config/com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt\n \n \n com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml\n \n \n 1\n \n \n DROOLS\n \n \n BRMS_PARAM_RULE\n \n \n vDNS\n \n \n SampleRiskType\n \n \n 1\n \n \n False\n \n \n NA\n \n \n \n \n\n','Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml',0,'com',1,NULL,3153); +INSERT INTO `brmsparamtemplate` VALUES (2,'ControlLoopDemo__closedLoopControlName','ControlLoopDemo__closedLoopControlName','\r\n\r\n/*-\n * ============LICENSE_START=======================================================\n * archetype-closed-loop-demo-rules\n * ================================================================================\n * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============LICENSE_END=========================================================\n */\n\npackage org.openecomp.policy.controlloop;\n\nimport java.util.List;\nimport java.util.LinkedList;\nimport java.util.Map;\nimport java.util.HashMap;\nimport java.util.UUID;\n\nimport org.openecomp.policy.controlloop.VirtualControlLoopEvent;\nimport org.openecomp.policy.controlloop.ControlLoopEventStatus;\nimport org.openecomp.policy.controlloop.VirtualControlLoopNotification;\nimport org.openecomp.policy.controlloop.ControlLoopNotificationType;\nimport org.openecomp.policy.controlloop.ControlLoopOperation;\nimport org.openecomp.policy.controlloop.ControlLoopOperationWrapper;\nimport org.openecomp.policy.template.demo.ControlLoopException;\n\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199CloudRegion;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperties;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperty;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199GenericVNF;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InstanceFilters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItem;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItems;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Manager;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199NamedQuery;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199QueryParameters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Request;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199RequestWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Response;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ResponseWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ServiceInstance;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Tenant;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VfModule;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VServer;\nimport org.openecomp.policy.aai.util.Serialization;\n\nimport org.openecomp.policy.appc.CommonHeader;\nimport org.openecomp.policy.appc.Request;\nimport org.openecomp.policy.appc.Response;\nimport org.openecomp.policy.appc.ResponseCode;\nimport org.openecomp.policy.appc.ResponseStatus;\nimport org.openecomp.policy.appc.ResponseValue;\n\nimport org.openecomp.policy.template.demo.EventManager;\nimport org.openecomp.policy.vnf.trafficgenerator.PGRequest;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStream;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStreams;\n\nimport org.openecomp.policy.mso.MSOManager;\nimport org.openecomp.policy.mso.MSORequest;\nimport org.openecomp.policy.mso.MSORequestStatus;\nimport org.openecomp.policy.mso.MSORequestDetails;\nimport org.openecomp.policy.mso.MSOModelInfo;\nimport org.openecomp.policy.mso.MSOCloudConfiguration;\nimport org.openecomp.policy.mso.MSORequestInfo;\nimport org.openecomp.policy.mso.MSORequestParameters;\nimport org.openecomp.policy.mso.MSORelatedInstanceListElement;\nimport org.openecomp.policy.mso.MSORelatedInstance;\nimport org.openecomp.policy.mso.MSOResponse;\n\nimport org.openecomp.policy.drools.system.PolicyEngine;\n\n//\n// These parameters are required to build the runtime policy\n//\ndeclare Params\n closedLoopControlName : String\n actor : String\n aaiURL : String\n aaiUsername : String\n aaiPassword : String\n msoURL : String\n msoUsername : String\n msoPassword : String\n aaiNamedQueryUUID : String\n aaiPatternMatch : int \n notificationTopic : String\n appcTopic : String\nend\n\n/*\n*\n* Called once and only once to insert the parameters into working memory for this Closed Loop policy.\n* (Comment SETUP rule out for the first ECOMP opensource release since policy BRMS_GW already puts a Params fact in there)\n*\n*\n*rule \"${policyName}.SETUP\"\n* when\n* then\n* System.out.println(\"rule SETUP is triggered.\");\n* Params params = new Params();\n* params.setClosedLoopControlName(\"${closedLoopControlName}\");\n* params.setActor(\"${actor}\");\n* params.setAaiURL(\"${aaiURL}\");\n* params.setAaiUsername(\"${aaiUsername}\");\n* params.setAaiPassword(\"${aaiPassword}\");\n* params.setMsoURL(\"${msoURL}\");\n* params.setMsoUsername(\"${msoUsername}\");\n* params.setMsoPassword(\"${msoPassword}\");\n* params.setAaiNamedQueryUUID(\"${aaiNamedQueryUUID}\");\n* params.setAaiPatternMatch(${aaiPatternMatch});\n* params.setNotificationTopic(\"${notificationTopic}\");\n* params.setAppcTopic(\"${appcTopic}\");\n* //\n* // This stays in memory as long as the rule is alive and running\n* //\n* insert(params);\n*end\n*/\n/*\n*\n* This rule responds to DCAE Events\n*\n*/\nrule \"${policyName}.EVENT\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n not ( EventManager( closedLoopControlName == $event.closedLoopControlName ))\n then\n System.out.println(\"rule EVENT is triggered.\");\n try {\n // \n // Check the requestID in the event to make sure it is not null before we create the EventManager. \n // The EventManager will do extra syntax checking as well check if the closed loop is disabled/\n //\n if ($event.requestID == null) {\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.from = \"policy\";\n notification.message = \"Missing requestID from DCAE event\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n System.out.println(\"Event with requestID=null has been retracted.\");\n } else {\n //\n // Create an EventManager\n //\n EventManager manager = new EventManager($params.getClosedLoopControlName(), $event.requestID, $event.target);\n //\n // Determine if EventManager can actively process the event (i.e. syntax)\n //\n VirtualControlLoopNotification notification = manager.activate($event);\n notification.from = \"policy\"; \n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n //\n // Are we actively pursuing this event?\n //\n if (notification.notification == ControlLoopNotificationType.ACTIVE) {\n //\n // Insert Event Manager into memory, this will now kick off processing.\n //\n insert(manager);\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n } \n } else {\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n }\n //\n // Now that the manager is inserted into Drools working memory, we\'ll wait for\n // another rule to fire in order to continue processing. This way we can also\n // then screen for additional ONSET and ABATED events for this same RequestIDs \n // and for different RequestIDs but with the same closedLoopControlName and target.\n //\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n //\n //\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract the event\n //\n retract($event);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager\n* is created. We can start the operations for this closed loop.\n*\n*/\nrule \"${policyName}.EVENT.MANAGER\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName, controlLoopResult == null)\n then\n System.out.println(\"rule EVENT.MANAGER is triggered.\");\n //\n // Check which event this is.\n //\n EventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event);\n //\n // We only want the initial ONSET event in memory,\n // all the other events need to be retracted to support\n // cleanup and avoid the other rules being fired for this event.\n //\n if (eventStatus != EventManager.NEW_EVENT_STATUS.FIRST_ONSET) {\n System.out.println(\"Retracting \"+eventStatus+\" Event.\");\n retract($event);\n return;\n }\n //\n // Now the event in memory is first onset event\n //\n try {\n //\n // Pull the known AAI field from the Event\n //\n // generic-vnf is needed for vFirewall case\n // vserver-name is needed for vLoadBalancer case\n //\n String genericVNF = $event.AAI.get(\"generic-vnf.vnf-id\");\n String vserver = $event.AAI.get(\"vserver.vserver-name\");\n //\n // Check if we are implementing a simple pattern match.\n //\n if ($params.getAaiPatternMatch() == 1) {\n //\n // Yes\n //\n //Basic naming characteristics:\n //VF Name (9 char)+VM name (13 char total)+VFC (19 char total)\n //Example: \n //VF Name (9 characters): cscf0001v\n //VM Name(13 characters): cscf0001vm001\n //VFC name(19 characters): cscf0001vm001cfg001\n //\n // zdfw1fwl01fwl02 or zdfw1fwl01fwl01 \n // replaced with\n // zdfw1fwl01pgn02 or zdfw1fwl01pgn01\n //\n int index = genericVNF.lastIndexOf(\"fwl\");\n if (index == -1) {\n System.err.println(\"The generic-vnf.vnf-id from DCAE Event is not valid.\");\n } else {\n genericVNF = genericVNF.substring(0, index) + \"pgn\" + genericVNF.substring(index+\"fwl\".length());\n }\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n //\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n //\n } else {\n //\n // create AAI named-query request with UUID started with \"F199\"\n //\n AAINQF199Request aainqf199request = new AAINQF199Request();\n AAINQF199QueryParameters aainqf199queryparam = new AAINQF199QueryParameters();\n AAINQF199NamedQuery aainqf199namedquery = new AAINQF199NamedQuery();\n AAINQF199InstanceFilters aainqf199instancefilter = new AAINQF199InstanceFilters();\n //\n // queryParameters\n //\n aainqf199namedquery.namedQueryUUID = UUID.fromString($params.getAaiNamedQueryUUID()); \n aainqf199queryparam.namedQuery = aainqf199namedquery;\n aainqf199request.queryParameters = aainqf199queryparam;\n //\n // instanceFilters\n //\n Map aainqf199instancefiltermap = new HashMap();\n Map aainqf199instancefiltermapitem = new HashMap();\n aainqf199instancefiltermapitem.put(\"vserver-name\", vserver); \n aainqf199instancefiltermap.put(\"vserver\", aainqf199instancefiltermapitem);\n aainqf199instancefilter.instanceFilter.add(aainqf199instancefiltermap);\n aainqf199request.instanceFilters = aainqf199instancefilter;\n //\n // print aainqf199request for debug\n //\n System.out.println(\"AAI Request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(aainqf199request));\n //\n // Create AAINQF199RequestWrapper\n //\n AAINQF199RequestWrapper aainqf199RequestWrapper = new AAINQF199RequestWrapper($event.requestID, aainqf199request);\n //\n // insert aainqf199request into memory\n //\n insert(aainqf199RequestWrapper);\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled, an Event Manager\n* is created, AAI Manager and AAI Request are ready in memory. We can start sending query to AAI and then wait for response.\n*\n*/\nrule \"${policyName}.EVENT.MANAGER.AAINQF199REQUEST\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199REQUEST is triggered.\");\n //\n // send the request\n //\n AAINQF199Response aainqf199response = AAINQF199Manager.postQuery($params.getAaiURL(), $params.getAaiUsername(), $params.getAaiPassword(),\n $aainqf199RequestWrapper.aainqf199request, $event.requestID);\n //\n // Check AAI response\n //\n if (aainqf199response == null) {\n System.err.println(\"Failed to get AAI response\");\n //\n // Fail and retract everything\n //\n retract($event);\n retract($manager);\n retract($aainqf199RequestWrapper);\n } else {\n //\n // Create AAINQF199ResponseWrapper\n //\n AAINQF199ResponseWrapper aainqf199ResponseWrapper = new AAINQF199ResponseWrapper($event.requestID, aainqf199response);\n //\n // insert aainqf199ResponseWrapper to memeory\n //\n insert(aainqf199ResponseWrapper);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid AAI response. We can start sending request to APPC or MSO now.\n*\n*/\nrule \"${policyName}.EVENT.MANAGER.AAINQF199RESPONSE\"\n when \n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n $aainqf199ResponseWrapper : AAINQF199ResponseWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199RESPONSE is triggered.\");\n //\n // Extract related fields out of AAINQF199RESPONSE\n //\n String vnfItemVnfId, vnfItemVnfType, vnfItemPersonaModelId, vnfItemPersonaModelVersion, vnfItemModelName, \n vnfItemModelVersion, vnfItemModelNameVersionId, serviceItemServiceInstanceId, serviceItemPersonaModelId,\n serviceItemModelName, serviceItemModelType, serviceItemModelVersion, serviceItemModelNameVersionId,\n vfModuleItemVfModuleName, vfModuleItemPersonaModelId, vfModuleItemPersonaModelVersion, vfModuleItemModelName, \n vfModuleItemModelNameVersionId, tenantItemTenantId, cloudRegionItemCloudRegionId;\n try {\n //\n // vnfItem\n //\n vnfItemVnfId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfID;\n vnfItemVnfType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfType;\n vnfItemVnfType = vnfItemVnfType.substring(vnfItemVnfType.lastIndexOf(\"/\")+1);\n vnfItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelId;\n vnfItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelVersion;\n vnfItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n vnfItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(2).propertyValue;\n vnfItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // serviceItem\n //\n serviceItemServiceInstanceId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.serviceInstanceID;\n serviceItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelId;\n serviceItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n serviceItemModelType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(1).propertyValue;\n serviceItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelVersion;\n serviceItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // Find the index for base vf module and non-base vf module\n //\n int baseIndex = -1;\n int nonBaseIndex = -1;\n List inventoryItems = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems;\n for (AAINQF199InventoryResponseItem m : inventoryItems) {\n if (m.vfModule != null && m.vfModule.isBaseVfModule == true) {\n baseIndex = inventoryItems.indexOf(m);\n } else if (m.vfModule != null && m.vfModule.isBaseVfModule == false && m.vfModule.orchestrationStatus == null) {\n nonBaseIndex = inventoryItems.indexOf(m);\n }\n //\n if (baseIndex != -1 && nonBaseIndex != -1) {\n break;\n }\n }\n //\n // Report the error if either base vf module or non-base vf module is not found\n //\n if (baseIndex == -1 || nonBaseIndex == -1) {\n System.err.println(\"Either base or non-base vf module is not found from AAI response.\");\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // This comes from the base module\n //\n vfModuleItemVfModuleName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(baseIndex).vfModule.vfModuleName;\n vfModuleItemVfModuleName = vfModuleItemVfModuleName.replace(\"Vfmodule\", \"vDNS\");\n //\n // vfModuleItem - NOT the base module\n //\n vfModuleItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelId;\n vfModuleItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelVersion;\n vfModuleItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(0).propertyValue;\n vfModuleItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(4).propertyValue;\n //\n // tenantItem\n //\n tenantItemTenantId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).tenant.tenantId;\n //\n // cloudRegionItem\n //\n cloudRegionItemCloudRegionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).items.inventoryResponseItems.get(0).cloudRegion.cloudRegionId;\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n notification.message = \"Invalid named-query response from AAI\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n } \n //\n // Extracted fields should not be null\n //\n if ((vnfItemVnfId == null) || (vnfItemVnfType == null) ||\n (vnfItemPersonaModelId == null) || (vnfItemModelName == null) ||\n (vnfItemModelVersion == null) || (vnfItemModelNameVersionId == null) ||\n (serviceItemServiceInstanceId == null) || (serviceItemModelName == null) ||\n (serviceItemModelType == null) || (serviceItemModelVersion == null) ||\n (serviceItemModelNameVersionId == null) || (vfModuleItemVfModuleName == null) ||\n (vfModuleItemPersonaModelId == null) || (vfModuleItemPersonaModelVersion == null) ||\n (vfModuleItemModelName == null) || (vfModuleItemModelNameVersionId == null) ||\n (tenantItemTenantId == null) || (cloudRegionItemCloudRegionId == null)) {\n //\n System.err.println(\"some fields are missing from AAI response.\");\n //\n // Fail and retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // We don\'t need them any more\n //\n retract($aainqf199ResponseWrapper);\n retract($aainqf199RequestWrapper); \n //\n // check the actor of this closed loop\n //\n switch ($params.getActor()) {\n case \"APPC\":\n {\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n // Hardcode genericVNF for now since AAI has not been ready for vFirewall demo case\n //\n String genericVNF = \"zdfw1fwl01pgn02\";\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n }\n break;\n case \"MSO\":\n {\n //\n // Construct an operation\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"createModuleInstance\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // Construct an MSO request\n //\n MSORequest request = new MSORequest();\n request.requestDetails = new MSORequestDetails();\n request.requestDetails.modelInfo = new MSOModelInfo();\n request.requestDetails.cloudConfiguration = new MSOCloudConfiguration();\n request.requestDetails.requestInfo = new MSORequestInfo();\n request.requestDetails.requestParameters = new MSORequestParameters();\n request.requestDetails.requestParameters.userParams = null;\n //\n // cloudConfiguration\n //\n request.requestDetails.cloudConfiguration.lcpCloudRegionId = cloudRegionItemCloudRegionId;\n request.requestDetails.cloudConfiguration.tenantId = tenantItemTenantId;\n //\n // modelInfo\n //\n request.requestDetails.modelInfo.modelType = \"vfModule\";\n request.requestDetails.modelInfo.modelInvariantId = vfModuleItemPersonaModelId;\n request.requestDetails.modelInfo.modelNameVersionId = vfModuleItemModelNameVersionId;\n request.requestDetails.modelInfo.modelName = vfModuleItemModelName;\n request.requestDetails.modelInfo.modelVersion = vfModuleItemPersonaModelVersion;\n //\n // requestInfo\n //\n request.requestDetails.requestInfo.instanceName = vfModuleItemVfModuleName;\n request.requestDetails.requestInfo.source = \"POLICY\";\n request.requestDetails.requestInfo.suppressRollback = false;\n //\n // relatedInstanceList\n //\n MSORelatedInstanceListElement relatedInstanceListElement1 = new MSORelatedInstanceListElement();\n MSORelatedInstanceListElement relatedInstanceListElement2 = new MSORelatedInstanceListElement();\n relatedInstanceListElement1.relatedInstance = new MSORelatedInstance();\n relatedInstanceListElement2.relatedInstance = new MSORelatedInstance();\n //\n relatedInstanceListElement1.relatedInstance.instanceId = serviceItemServiceInstanceId;\n relatedInstanceListElement1.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement1.relatedInstance.modelInfo.modelType = \"service\";\n relatedInstanceListElement1.relatedInstance.modelInfo.modelInvariantId = serviceItemPersonaModelId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelNameVersionId = serviceItemModelNameVersionId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelName = serviceItemModelName;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelVersion = serviceItemModelVersion;\n //\n relatedInstanceListElement2.relatedInstance.instanceId = vnfItemVnfId;\n relatedInstanceListElement2.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement2.relatedInstance.modelInfo.modelType = \"vnf\";\n relatedInstanceListElement2.relatedInstance.modelInfo.modelInvariantId = vnfItemPersonaModelId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelNameVersionId = vnfItemModelNameVersionId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelName = vnfItemModelName;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelVersion = vnfItemModelVersion;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelCustomizationName = vnfItemVnfType;\n // \n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement1);\n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement2);\n //\n // print MSO request for debug\n //\n System.out.println(\"MSO request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n //\n //\n //\n if (request != null) {\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Concatenate serviceItemServiceInstanceId and vnfItemVnfId to msoURL\n //\n String MSOUrl = $params.getMsoURL() + \"/serviceInstances/v2/\" + serviceItemServiceInstanceId + \"/vnfs/\" + vnfItemVnfId + \"/vfModules\";\n //\n // Call MSO\n //\n MSOResponse response = MSOManager.createModuleInstance(MSOUrl, $params.getMsoURL(), $params.getMsoUsername(), $params.getMsoPassword(), request);\n //\n if (response != null) {\n //\n // Assign requestId\n //\n request.requestId = $event.requestID.toString(); \n response.request.requestId = $event.requestID.toString();\n //\n // Insert facts\n //\n insert(operationWrapper);\n insert(request);\n insert(response);\n } else {\n //\n // MSO request not even accepted\n //\n notification.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n notification.history.add(operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($event);\n retract($manager);\n }\n } else {\n System.err.println(\"constructed MSO request is invalid.\");\n }\n }\n break; \n } \nend\n \n/*\n*\n* This rule responds to APPC Response Events\n*\n*/\nrule \"${policyName}.APPC.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : Request( getCommonHeader().RequestID == $event.requestID )\n $response : Response( getCommonHeader().RequestID == $event.requestID ) \n then\n System.out.println(\"rule APPC.RESPONSE is triggered.\");\n if ($response.Status == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n } \n //\n // Get the Response Code\n //\n ResponseCode code = ResponseCode.toResponseCode($response.Status.Code);\n if (code == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n }\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // Ok, let\'s figure out what APP-C\'s response is\n //\n switch (code) {\n case ACCEPT:\n $operationWrapper.operation.outcome = \"PROCESSING\";\n break;\n case ERROR:\n case REJECT:\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n break;\n case SUCCESS:\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n break;\n case FAILURE:\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n break;\n }\n if ($operationWrapper.operation.outcome.equals(\"SUCCESS\")) {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else if ($operationWrapper.operation.outcome.equals(\"PROCESSING\")) {\n retract($response);\n } else {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \n\n/*\n*\n* This rule is used to clean up APPC response\n*\n*/ \nrule \"${policyName}.APPC.RESPONSE.CLEANUP\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $response : Response($id : getCommonHeader().RequestID )\n not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) \n then\n System.out.println(\"rule APPC.RESPONSE.CLEANUP is triggered.\");\n retract($response);\nend\n\n/*\n*\n* This rule responds to MSO Response Events\n*\n*/\nrule \"${policyName}.MSO.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : MSORequest( requestId == $event.requestID.toString() )\n $response : MSOResponse( request.requestId == $event.requestID.toString() ) \n then\n System.out.println(\"rule MSO.RESPONSE is triggered.\");\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // The operation can either be succeeded or failed\n // \n if($response.request.requestStatus.requestState.equals(\"COMPLETE\")) {\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else {\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend ','2017-03-14 19:55:47','demo'); INSERT INTO `policyentity` VALUES (3156,'doACPolicyPut','2017-03-03 17:26:24',0,'Micro Service vFirewall Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:','doACPolicyPut','2017-03-03 17:26:24','\n\n Micro Service vFirewall Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:\n \n \n \n \n com.Config_MS_vFirewall.1.xml\n \n \n \n \n \n DCAE\n \n \n \n SampleConfigName\n \n \n \n TcaMetrics-v1.0.0.5\n \n \n \n /services/cdap-tca-hi-lo/instances/demo/configuration/metricsPerFunctionalRole/vFirewall\n \n \n \n SampleServiceLocation\n \n \n \n SampleRiskType\n \n \n \n 1\n \n \n \n False\n \n \n \n NA\n \n \n \n \n \n \n \n \n \n \n ACCESS\n \n \n \n Config\n \n \n \n \n \n \n \n \n Configuration\n \n \n $URL/Config/com.Config_MS_vFirewall.1.json\n \n \n com.Config_MS_vFirewall.1.xml\n \n \n 1\n \n \n DCAE\n \n \n SampleConfigName\n \n \n TcaMetrics-v1.0.0.5\n \n \n /services/cdap-tca-hi-lo/instances/demo/configuration/metricsPerFunctionalRole/vFirewall\n \n \n SampleServiceLocation\n \n \n 1\n \n \n SampleRiskType\n \n \n 1\n \n \n 1\n \n \n NA\n \n \n \n \n\n','Config_MS_vFirewall.1.xml',0,'com',1,NULL,3155),(3158,'doACPolicyPut','2017-03-03 17:28:10',0,'Micro Service vLoadBalancer Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:','doACPolicyPut','2017-03-03 17:28:10','\n\n Micro Service vLoadBalancer Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:\n \n \n \n \n com.Config_MS_vLoadBalancer.1.xml\n \n \n \n \n \n DCAE\n \n \n \n SampleConfigName\n \n \n \n TcaMetrics-v1.0.0.5\n \n \n \n /services/cdap-tca-hi-lo/instances/demo/configuration/metricsPerFunctionalRole/vLoadBalancer\n \n \n \n SampleServiceLocation\n \n \n \n SampleRiskType\n \n \n \n 1\n \n \n \n False\n \n \n \n NA\n \n \n \n \n \n \n \n \n \n \n ACCESS\n \n \n \n Config\n \n \n \n \n \n \n \n \n Configuration\n \n \n $URL/Config/com.Config_MS_vLoadBalancer.1.json\n \n \n com.Config_MS_vLoadBalancer.1.xml\n \n \n 1\n \n \n DCAE\n \n \n SampleConfigName\n \n \n TcaMetrics-v1.0.0.5\n \n \n /services/cdap-tca-hi-lo/instances/demo/configuration/metricsPerFunctionalRole/vLoadBalancer\n \n \n SampleServiceLocation\n \n \n 1\n \n \n SampleRiskType\n \n \n 1\n \n \n 1\n \n \n NA\n \n \n \n \n\n','Config_MS_vLoadBalancer.1.xml',0,'com',1,NULL,3157); -INSERT INTO `configurationdataentity` VALUES (3151,'/* Autogenerated Code Please Don\'t change/remove this comment section. This is for the UI purpose. \n <$%BRMSParamTemplate=ControlLoopDemo__closedLoopControlName%$> \n */ \n\r\n\r\n/*-\n * ============LICENSE_START=======================================================\n * archetype-closed-loop-demo-rules\n * ================================================================================\n * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============LICENSE_END=========================================================\n */\n\npackage org.openecomp.policy.controlloop;\n\nimport java.util.List;\nimport java.util.LinkedList;\nimport java.util.Map;\nimport java.util.HashMap;\nimport java.util.UUID;\n\nimport org.openecomp.policy.controlloop.VirtualControlLoopEvent;\nimport org.openecomp.policy.controlloop.ControlLoopEventStatus;\nimport org.openecomp.policy.controlloop.VirtualControlLoopNotification;\nimport org.openecomp.policy.controlloop.ControlLoopNotificationType;\nimport org.openecomp.policy.controlloop.ControlLoopOperation;\nimport org.openecomp.policy.controlloop.ControlLoopOperationWrapper;\nimport org.openecomp.policy.template.demo.ControlLoopException;\n\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199CloudRegion;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperties;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperty;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199GenericVNF;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InstanceFilters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItem;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItems;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Manager;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199NamedQuery;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199QueryParameters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Request;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199RequestWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Response;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ResponseWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ServiceInstance;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Tenant;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VfModule;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VServer;\nimport org.openecomp.policy.aai.util.Serialization;\n\nimport org.openecomp.policy.appc.CommonHeader;\nimport org.openecomp.policy.appc.Request;\nimport org.openecomp.policy.appc.Response;\nimport org.openecomp.policy.appc.ResponseCode;\nimport org.openecomp.policy.appc.ResponseStatus;\nimport org.openecomp.policy.appc.ResponseValue;\n\nimport org.openecomp.policy.template.demo.EventManager;\nimport org.openecomp.policy.vnf.trafficgenerator.PGRequest;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStream;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStreams;\n\nimport org.openecomp.policy.mso.MSOManager;\nimport org.openecomp.policy.mso.MSORequest;\nimport org.openecomp.policy.mso.MSORequestStatus;\nimport org.openecomp.policy.mso.MSORequestDetails;\nimport org.openecomp.policy.mso.MSOModelInfo;\nimport org.openecomp.policy.mso.MSOCloudConfiguration;\nimport org.openecomp.policy.mso.MSORequestInfo;\nimport org.openecomp.policy.mso.MSORequestParameters;\nimport org.openecomp.policy.mso.MSORelatedInstanceListElement;\nimport org.openecomp.policy.mso.MSORelatedInstance;\nimport org.openecomp.policy.mso.MSOResponse;\n\nimport org.openecomp.policy.drools.system.PolicyEngine;\n\n//\n// These parameters are required to build the runtime policy\n//\ndeclare Params\n closedLoopControlName : String\n actor : String\n aaiURL : String\n aaiUsername : String\n aaiPassword : String\n msoURL : String\n msoUsername : String\n msoPassword : String\n aaiNamedQueryUUID : String\n aaiPatternMatch : int \n notificationTopic : String\n appcTopic : String\nend\n\n/*\n*\n* Called once and only once to insert the parameters into working memory for this Closed Loop policy.\n* (Comment SETUP rule out for the first ECOMP opensource release since policy BRMS_GW already puts a Params fact in there)\n*\n*\n*rule \"BRMSParamvFWDemoPolicy.SETUP\"\n* when\n* then\n* System.out.println(\"rule SETUP is triggered.\");\n* Params params = new Params();\n* params.setClosedLoopControlName(\"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\");\n* params.setActor(\"APPC\");\n* params.setAaiURL(\"null\");\n* params.setAaiUsername(\"null\");\n* params.setAaiPassword(\"null\");\n* params.setMsoURL(\"null\");\n* params.setMsoUsername(\"null\");\n* params.setMsoPassword(\"null\");\n* params.setAaiNamedQueryUUID(\"null\");\n* params.setAaiPatternMatch(1);\n* params.setNotificationTopic(\"POLICY-CL-MGT\");\n* params.setAppcTopic(\"APPC-CL\");\n* //\n* // This stays in memory as long as the rule is alive and running\n* //\n* insert(params);\n*end\n*/\n/*\n*\n* This rule responds to DCAE Events\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.EVENT\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n not ( EventManager( closedLoopControlName == $event.closedLoopControlName ))\n then\n System.out.println(\"rule EVENT is triggered.\");\n try {\n // \n // Check the requestID in the event to make sure it is not null before we create the EventManager. \n // The EventManager will do extra syntax checking as well check if the closed loop is disabled/\n //\n if ($event.requestID == null) {\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.from = \"policy\";\n notification.message = \"Missing requestID from DCAE event\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n System.out.println(\"Event with requestID=null has been retracted.\");\n } else {\n //\n // Create an EventManager\n //\n EventManager manager = new EventManager($params.getClosedLoopControlName(), $event.requestID, $event.target);\n //\n // Determine if EventManager can actively process the event (i.e. syntax)\n //\n VirtualControlLoopNotification notification = manager.activate($event);\n notification.from = \"policy\"; \n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n // Are we actively pursuing this event?\n //\n if (notification.notification == ControlLoopNotificationType.ACTIVE) {\n //\n // Insert Event Manager into memory, this will now kick off processing.\n //\n insert(manager);\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n } \n } else {\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n }\n //\n // Now that the manager is inserted into Drools working memory, we\'ll wait for\n // another rule to fire in order to continue processing. This way we can also\n // then screen for additional ONSET and ABATED events for this same RequestIDs \n // and for different RequestIDs but with the same closedLoopControlName and target.\n //\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n //\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract the event\n //\n retract($event);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager\n* is created. We can start the operations for this closed loop.\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.EVENT.MANAGER\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName, controlLoopResult == null)\n then\n System.out.println(\"rule EVENT.MANAGER is triggered.\");\n //\n // Check which event this is.\n //\n EventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event);\n //\n // We only want the initial ONSET event in memory,\n // all the other events need to be retracted to support\n // cleanup and avoid the other rules being fired for this event.\n //\n if (eventStatus != EventManager.NEW_EVENT_STATUS.FIRST_ONSET) {\n System.out.println(\"Retracting \"+eventStatus+\" Event.\");\n retract($event);\n return;\n }\n //\n // Now the event in memory is first onset event\n //\n try {\n //\n // Pull the known AAI field from the Event\n //\n // generic-vnf is needed for vFirewall case\n // vserver-name is needed for vLoadBalancer case\n //\n String genericVNF = $event.AAI.get(\"generic-vnf.vnf-id\");\n String vserver = $event.AAI.get(\"vserver.vserver-name\");\n //\n // Check if we are implementing a simple pattern match.\n //\n if ($params.getAaiPatternMatch() == 1) {\n //\n // Yes\n //\n //Basic naming characteristics:\n //VF Name (9 char)+VM name (13 char total)+VFC (19 char total)\n //Example: \n //VF Name (9 characters): cscf0001v\n //VM Name(13 characters): cscf0001vm001\n //VFC name(19 characters): cscf0001vm001cfg001\n //\n // zdfw1fwl01fwl02 or zdfw1fwl01fwl01 \n // replaced with\n // zdfw1fwl01pgn02 or zdfw1fwl01pgn01\n //\n int index = genericVNF.lastIndexOf(\"fwl\");\n if (index == -1) {\n System.err.println(\"The generic-vnf.vnf-id from DCAE Event is not valid.\");\n } else {\n genericVNF = genericVNF.substring(0, index) + \"pgn\" + genericVNF.substring(index+\"fwl\".length());\n }\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n //\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n //\n } else {\n //\n // create AAI named-query request with UUID started with \"F199\"\n //\n AAINQF199Request aainqf199request = new AAINQF199Request();\n AAINQF199QueryParameters aainqf199queryparam = new AAINQF199QueryParameters();\n AAINQF199NamedQuery aainqf199namedquery = new AAINQF199NamedQuery();\n AAINQF199InstanceFilters aainqf199instancefilter = new AAINQF199InstanceFilters();\n //\n // queryParameters\n //\n aainqf199namedquery.namedQueryUUID = UUID.fromString($params.getAaiNamedQueryUUID()); \n aainqf199queryparam.namedQuery = aainqf199namedquery;\n aainqf199request.queryParameters = aainqf199queryparam;\n //\n // instanceFilters\n //\n Map aainqf199instancefiltermap = new HashMap();\n Map aainqf199instancefiltermapitem = new HashMap();\n aainqf199instancefiltermapitem.put(\"vserver-name\", vserver); \n aainqf199instancefiltermap.put(\"vserver\", aainqf199instancefiltermapitem);\n aainqf199instancefilter.instanceFilter.add(aainqf199instancefiltermap);\n aainqf199request.instanceFilters = aainqf199instancefilter;\n //\n // print aainqf199request for debug\n //\n System.out.println(\"AAI Request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(aainqf199request));\n //\n // Create AAINQF199RequestWrapper\n //\n AAINQF199RequestWrapper aainqf199RequestWrapper = new AAINQF199RequestWrapper($event.requestID, aainqf199request);\n //\n // insert aainqf199request into memory\n //\n insert(aainqf199RequestWrapper);\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled, an Event Manager\n* is created, AAI Manager and AAI Request are ready in memory. We can start sending query to AAI and then wait for response.\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.EVENT.MANAGER.AAINQF199REQUEST\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199REQUEST is triggered.\");\n //\n // send the request\n //\n AAINQF199Response aainqf199response = AAINQF199Manager.postQuery($params.getAaiURL(), $params.getAaiUsername(), $params.getAaiPassword(),\n $aainqf199RequestWrapper.aainqf199request, $event.requestID);\n //\n // Check AAI response\n //\n if (aainqf199response == null) {\n System.err.println(\"Failed to get AAI response\");\n //\n // Fail and retract everything\n //\n retract($event);\n retract($manager);\n retract($aainqf199RequestWrapper);\n } else {\n //\n // Create AAINQF199ResponseWrapper\n //\n AAINQF199ResponseWrapper aainqf199ResponseWrapper = new AAINQF199ResponseWrapper($event.requestID, aainqf199response);\n //\n // insert aainqf199ResponseWrapper to memeory\n //\n insert(aainqf199ResponseWrapper);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid AAI response. We can start sending request to APPC or MSO now.\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.EVENT.MANAGER.AAINQF199RESPONSE\"\n when \n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n $aainqf199ResponseWrapper : AAINQF199ResponseWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199RESPONSE is triggered.\");\n //\n // Extract related fields out of AAINQF199RESPONSE\n //\n String vnfItemVnfId, vnfItemVnfType, vnfItemPersonaModelId, vnfItemPersonaModelVersion, vnfItemModelName, \n vnfItemModelVersion, vnfItemModelNameVersionId, serviceItemServiceInstanceId, serviceItemPersonaModelId,\n serviceItemModelName, serviceItemModelType, serviceItemModelVersion, serviceItemModelNameVersionId,\n vfModuleItemVfModuleName, vfModuleItemPersonaModelId, vfModuleItemPersonaModelVersion, vfModuleItemModelName, \n vfModuleItemModelNameVersionId, tenantItemTenantId, cloudRegionItemCloudRegionId;\n try {\n //\n // vnfItem\n //\n vnfItemVnfId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfID;\n vnfItemVnfType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfType;\n vnfItemVnfType = vnfItemVnfType.substring(vnfItemVnfType.lastIndexOf(\"/\")+1);\n vnfItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelId;\n vnfItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelVersion;\n vnfItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n vnfItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(2).propertyValue;\n vnfItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // serviceItem\n //\n serviceItemServiceInstanceId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.serviceInstanceID;\n serviceItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelId;\n serviceItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n serviceItemModelType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(1).propertyValue;\n serviceItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelVersion;\n serviceItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // Find the index for base vf module and non-base vf module\n //\n int baseIndex = -1;\n int nonBaseIndex = -1;\n List inventoryItems = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems;\n for (AAINQF199InventoryResponseItem m : inventoryItems) {\n if (m.vfModule != null && m.vfModule.isBaseVfModule == true) {\n baseIndex = inventoryItems.indexOf(m);\n } else if (m.vfModule != null && m.vfModule.isBaseVfModule == false && m.vfModule.orchestrationStatus == null) {\n nonBaseIndex = inventoryItems.indexOf(m);\n }\n //\n if (baseIndex != -1 && nonBaseIndex != -1) {\n break;\n }\n }\n //\n // Report the error if either base vf module or non-base vf module is not found\n //\n if (baseIndex == -1 || nonBaseIndex == -1) {\n System.err.println(\"Either base or non-base vf module is not found from AAI response.\");\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // This comes from the base module\n //\n vfModuleItemVfModuleName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(baseIndex).vfModule.vfModuleName;\n vfModuleItemVfModuleName = vfModuleItemVfModuleName.replace(\"Vfmodule\", \"vDNS\");\n //\n // vfModuleItem - NOT the base module\n //\n vfModuleItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelId;\n vfModuleItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelVersion;\n vfModuleItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(0).propertyValue;\n vfModuleItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(4).propertyValue;\n //\n // tenantItem\n //\n tenantItemTenantId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).tenant.tenantId;\n //\n // cloudRegionItem\n //\n cloudRegionItemCloudRegionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).items.inventoryResponseItems.get(0).cloudRegion.cloudRegionId;\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n notification.message = \"Invalid named-query response from AAI\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n } \n //\n // Extracted fields should not be null\n //\n if ((vnfItemVnfId == null) || (vnfItemVnfType == null) ||\n (vnfItemPersonaModelId == null) || (vnfItemModelName == null) ||\n (vnfItemModelVersion == null) || (vnfItemModelNameVersionId == null) ||\n (serviceItemServiceInstanceId == null) || (serviceItemModelName == null) ||\n (serviceItemModelType == null) || (serviceItemModelVersion == null) ||\n (serviceItemModelNameVersionId == null) || (vfModuleItemVfModuleName == null) ||\n (vfModuleItemPersonaModelId == null) || (vfModuleItemPersonaModelVersion == null) ||\n (vfModuleItemModelName == null) || (vfModuleItemModelNameVersionId == null) ||\n (tenantItemTenantId == null) || (cloudRegionItemCloudRegionId == null)) {\n //\n System.err.println(\"some fields are missing from AAI response.\");\n //\n // Fail and retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // We don\'t need them any more\n //\n retract($aainqf199ResponseWrapper);\n retract($aainqf199RequestWrapper); \n //\n // check the actor of this closed loop\n //\n switch ($params.getActor()) {\n case \"APPC\":\n {\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n // Hardcode genericVNF for now since AAI has not been ready for vFirewall demo case\n //\n String genericVNF = \"zdfw1fwl01pgn02\";\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n }\n break;\n case \"MSO\":\n {\n //\n // Construct an operation\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"createModuleInstance\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // Construct an MSO request\n //\n MSORequest request = new MSORequest();\n request.requestDetails = new MSORequestDetails();\n request.requestDetails.modelInfo = new MSOModelInfo();\n request.requestDetails.cloudConfiguration = new MSOCloudConfiguration();\n request.requestDetails.requestInfo = new MSORequestInfo();\n request.requestDetails.requestParameters = new MSORequestParameters();\n request.requestDetails.requestParameters.userParams = null;\n //\n // cloudConfiguration\n //\n request.requestDetails.cloudConfiguration.lcpCloudRegionId = cloudRegionItemCloudRegionId;\n request.requestDetails.cloudConfiguration.tenantId = tenantItemTenantId;\n //\n // modelInfo\n //\n request.requestDetails.modelInfo.modelType = \"vfModule\";\n request.requestDetails.modelInfo.modelInvariantId = vfModuleItemPersonaModelId;\n request.requestDetails.modelInfo.modelNameVersionId = vfModuleItemModelNameVersionId;\n request.requestDetails.modelInfo.modelName = vfModuleItemModelName;\n request.requestDetails.modelInfo.modelVersion = vfModuleItemPersonaModelVersion;\n //\n // requestInfo\n //\n request.requestDetails.requestInfo.instanceName = vfModuleItemVfModuleName;\n request.requestDetails.requestInfo.source = \"POLICY\";\n request.requestDetails.requestInfo.suppressRollback = false;\n //\n // relatedInstanceList\n //\n MSORelatedInstanceListElement relatedInstanceListElement1 = new MSORelatedInstanceListElement();\n MSORelatedInstanceListElement relatedInstanceListElement2 = new MSORelatedInstanceListElement();\n relatedInstanceListElement1.relatedInstance = new MSORelatedInstance();\n relatedInstanceListElement2.relatedInstance = new MSORelatedInstance();\n //\n relatedInstanceListElement1.relatedInstance.instanceId = serviceItemServiceInstanceId;\n relatedInstanceListElement1.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement1.relatedInstance.modelInfo.modelType = \"service\";\n relatedInstanceListElement1.relatedInstance.modelInfo.modelInvariantId = serviceItemPersonaModelId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelNameVersionId = serviceItemModelNameVersionId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelName = serviceItemModelName;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelVersion = serviceItemModelVersion;\n //\n relatedInstanceListElement2.relatedInstance.instanceId = vnfItemVnfId;\n relatedInstanceListElement2.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement2.relatedInstance.modelInfo.modelType = \"vnf\";\n relatedInstanceListElement2.relatedInstance.modelInfo.modelInvariantId = vnfItemPersonaModelId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelNameVersionId = vnfItemModelNameVersionId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelName = vnfItemModelName;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelVersion = vnfItemModelVersion;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelCustomizationName = vnfItemVnfType;\n // \n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement1);\n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement2);\n //\n // print MSO request for debug\n //\n System.out.println(\"MSO request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n //\n //\n //\n if (request != null) {\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Concatenate serviceItemServiceInstanceId and vnfItemVnfId to msoURL\n //\n String MSOUrl = $params.getMsoURL() + \"/serviceInstances/v2/\" + serviceItemServiceInstanceId + \"/vnfs/\" + vnfItemVnfId + \"/vfModules\";\n //\n // Call MSO\n //\n MSOResponse response = MSOManager.createModuleInstance(MSOUrl, $params.getMsoURL(), $params.getMsoUsername(), $params.getMsoPassword(), request);\n //\n if (response != null) {\n //\n // Assign requestId\n //\n request.requestId = $event.requestID.toString(); \n response.request.requestId = $event.requestID.toString();\n //\n // Insert facts\n //\n insert(operationWrapper);\n insert(request);\n insert(response);\n } else {\n //\n // MSO request not even accepted\n //\n notification.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n notification.history.add(operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($event);\n retract($manager);\n }\n } else {\n System.err.println(\"constructed MSO request is invalid.\");\n }\n }\n break; \n } \nend\n \n/*\n*\n* This rule responds to APPC Response Events\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.APPC.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : Request( getCommonHeader().RequestID == $event.requestID )\n $response : Response( getCommonHeader().RequestID == $event.requestID ) \n then\n System.out.println(\"rule APPC.RESPONSE is triggered.\");\n if ($response.Status == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n } \n //\n // Get the Response Code\n //\n ResponseCode code = ResponseCode.toResponseCode($response.Status.Code);\n if (code == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n }\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // Ok, let\'s figure out what APP-C\'s response is\n //\n switch (code) {\n case ACCEPT:\n $operationWrapper.operation.outcome = \"PROCESSING\";\n break;\n case ERROR:\n case REJECT:\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n break;\n case SUCCESS:\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n break;\n case FAILURE:\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n break;\n }\n if ($operationWrapper.operation.outcome.equals(\"SUCCESS\")) {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else if ($operationWrapper.operation.outcome.equals(\"PROCESSING\")) {\n retract($response);\n } else {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \n\n/*\n*\n* This rule is used to clean up APPC response\n*\n*/ \nrule \"BRMSParamvFWDemoPolicy.APPC.RESPONSE.CLEANUP\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $response : Response($id : getCommonHeader().RequestID )\n not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) \n then\n System.out.println(\"rule APPC.RESPONSE.CLEANUP is triggered.\");\n retract($response);\nend\n\n/*\n*\n* This rule responds to MSO Response Events\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.MSO.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : MSORequest( requestId == $event.requestID.toString() )\n $response : MSOResponse( request.requestId == $event.requestID.toString() ) \n then\n System.out.println(\"rule MSO.RESPONSE is triggered.\");\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // The operation can either be succeeded or failed\n // \n if($response.request.requestStatus.requestState.equals(\"Completed\")) {\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else {\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \nrule \"Params\" \n salience 1000 \n when\n then\n Params params = new Params();\n params.setAaiPatternMatch(1);\n params.setAppcTopic(\"APPC-CL\");\n params.setAaiURL(\"null\");\n params.setMsoPassword(\"null\");\n params.setClosedLoopControlName(\"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\");\n params.setMsoURL(\"null\");\n params.setAaiUsername(\"null\");\n params.setActor(\"APPC\");\n params.setMsoUsername(\"null\");\n params.setAaiNamedQueryUUID(\"null\");\n params.setAaiPassword(\"null\");\n params.setNotificationTopic(\"POLICY-CL-MGT\");\n insert(params);\nend\r\n','OTHER','com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt','doACPolicyPut','2017-03-03 17:16:27',0,'','doACPolicyPut','2017-03-03 17:16:27',1),(3153,'/* Autogenerated Code Please Don\'t change/remove this comment section. This is for the UI purpose. \n <$%BRMSParamTemplate=ControlLoopDemo__closedLoopControlName%$> \n */ \n\r\n\r\n/*-\n * ============LICENSE_START=======================================================\n * archetype-closed-loop-demo-rules\n * ================================================================================\n * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============LICENSE_END=========================================================\n */\n\npackage org.openecomp.policy.controlloop;\n\nimport java.util.List;\nimport java.util.LinkedList;\nimport java.util.Map;\nimport java.util.HashMap;\nimport java.util.UUID;\n\nimport org.openecomp.policy.controlloop.VirtualControlLoopEvent;\nimport org.openecomp.policy.controlloop.ControlLoopEventStatus;\nimport org.openecomp.policy.controlloop.VirtualControlLoopNotification;\nimport org.openecomp.policy.controlloop.ControlLoopNotificationType;\nimport org.openecomp.policy.controlloop.ControlLoopOperation;\nimport org.openecomp.policy.controlloop.ControlLoopOperationWrapper;\nimport org.openecomp.policy.template.demo.ControlLoopException;\n\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199CloudRegion;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperties;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperty;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199GenericVNF;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InstanceFilters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItem;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItems;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Manager;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199NamedQuery;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199QueryParameters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Request;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199RequestWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Response;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ResponseWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ServiceInstance;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Tenant;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VfModule;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VServer;\nimport org.openecomp.policy.aai.util.Serialization;\n\nimport org.openecomp.policy.appc.CommonHeader;\nimport org.openecomp.policy.appc.Request;\nimport org.openecomp.policy.appc.Response;\nimport org.openecomp.policy.appc.ResponseCode;\nimport org.openecomp.policy.appc.ResponseStatus;\nimport org.openecomp.policy.appc.ResponseValue;\n\nimport org.openecomp.policy.template.demo.EventManager;\nimport org.openecomp.policy.vnf.trafficgenerator.PGRequest;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStream;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStreams;\n\nimport org.openecomp.policy.mso.MSOManager;\nimport org.openecomp.policy.mso.MSORequest;\nimport org.openecomp.policy.mso.MSORequestStatus;\nimport org.openecomp.policy.mso.MSORequestDetails;\nimport org.openecomp.policy.mso.MSOModelInfo;\nimport org.openecomp.policy.mso.MSOCloudConfiguration;\nimport org.openecomp.policy.mso.MSORequestInfo;\nimport org.openecomp.policy.mso.MSORequestParameters;\nimport org.openecomp.policy.mso.MSORelatedInstanceListElement;\nimport org.openecomp.policy.mso.MSORelatedInstance;\nimport org.openecomp.policy.mso.MSOResponse;\n\nimport org.openecomp.policy.drools.system.PolicyEngine;\n\n//\n// These parameters are required to build the runtime policy\n//\ndeclare Params\n closedLoopControlName : String\n actor : String\n aaiURL : String\n aaiUsername : String\n aaiPassword : String\n msoURL : String\n msoUsername : String\n msoPassword : String\n aaiNamedQueryUUID : String\n aaiPatternMatch : int \n notificationTopic : String\n appcTopic : String\nend\n\n/*\n*\n* Called once and only once to insert the parameters into working memory for this Closed Loop policy.\n* (Comment SETUP rule out for the first ECOMP opensource release since policy BRMS_GW already puts a Params fact in there)\n*\n*\n*rule \"BRMSParamvLBDemoPolicy.SETUP\"\n* when\n* then\n* System.out.println(\"rule SETUP is triggered.\");\n* Params params = new Params();\n* params.setClosedLoopControlName(\"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\");\n* params.setActor(\"MSO\");\n* params.setAaiURL(\"https://aai.api.simpledemo.openecomp.org:8443\");\n* params.setAaiUsername(\"POLICY\");\n* params.setAaiPassword(\"POLICY\");\n* params.setMsoURL(\"http://vm1.mso.simpledemo.openecomp.org:8080/ecomp/mso/infra\");\n* params.setMsoUsername(\"InfraPortalClient\");\n* params.setMsoPassword(\"password1$\");\n* params.setAaiNamedQueryUUID(\"f199cb88-5e69-4b1f-93e0-6f257877d066\");\n* params.setAaiPatternMatch(0);\n* params.setNotificationTopic(\"POLICY-CL-MGT\");\n* params.setAppcTopic(\"APPC-CL\");\n* //\n* // This stays in memory as long as the rule is alive and running\n* //\n* insert(params);\n*end\n*/\n/*\n*\n* This rule responds to DCAE Events\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.EVENT\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n not ( EventManager( closedLoopControlName == $event.closedLoopControlName ))\n then\n System.out.println(\"rule EVENT is triggered.\");\n try {\n // \n // Check the requestID in the event to make sure it is not null before we create the EventManager. \n // The EventManager will do extra syntax checking as well check if the closed loop is disabled/\n //\n if ($event.requestID == null) {\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.from = \"policy\";\n notification.message = \"Missing requestID from DCAE event\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n System.out.println(\"Event with requestID=null has been retracted.\");\n } else {\n //\n // Create an EventManager\n //\n EventManager manager = new EventManager($params.getClosedLoopControlName(), $event.requestID, $event.target);\n //\n // Determine if EventManager can actively process the event (i.e. syntax)\n //\n VirtualControlLoopNotification notification = manager.activate($event);\n notification.from = \"policy\"; \n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n // Are we actively pursuing this event?\n //\n if (notification.notification == ControlLoopNotificationType.ACTIVE) {\n //\n // Insert Event Manager into memory, this will now kick off processing.\n //\n insert(manager);\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n } \n } else {\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n }\n //\n // Now that the manager is inserted into Drools working memory, we\'ll wait for\n // another rule to fire in order to continue processing. This way we can also\n // then screen for additional ONSET and ABATED events for this same RequestIDs \n // and for different RequestIDs but with the same closedLoopControlName and target.\n //\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n //\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract the event\n //\n retract($event);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager\n* is created. We can start the operations for this closed loop.\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.EVENT.MANAGER\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName, controlLoopResult == null)\n then\n System.out.println(\"rule EVENT.MANAGER is triggered.\");\n //\n // Check which event this is.\n //\n EventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event);\n //\n // We only want the initial ONSET event in memory,\n // all the other events need to be retracted to support\n // cleanup and avoid the other rules being fired for this event.\n //\n if (eventStatus != EventManager.NEW_EVENT_STATUS.FIRST_ONSET) {\n System.out.println(\"Retracting \"+eventStatus+\" Event.\");\n retract($event);\n return;\n }\n //\n // Now the event in memory is first onset event\n //\n try {\n //\n // Pull the known AAI field from the Event\n //\n // generic-vnf is needed for vFirewall case\n // vserver-name is needed for vLoadBalancer case\n //\n String genericVNF = $event.AAI.get(\"generic-vnf.vnf-id\");\n String vserver = $event.AAI.get(\"vserver.vserver-name\");\n //\n // Check if we are implementing a simple pattern match.\n //\n if ($params.getAaiPatternMatch() == 1) {\n //\n // Yes\n //\n //Basic naming characteristics:\n //VF Name (9 char)+VM name (13 char total)+VFC (19 char total)\n //Example: \n //VF Name (9 characters): cscf0001v\n //VM Name(13 characters): cscf0001vm001\n //VFC name(19 characters): cscf0001vm001cfg001\n //\n // zdfw1fwl01fwl02 or zdfw1fwl01fwl01 \n // replaced with\n // zdfw1fwl01pgn02 or zdfw1fwl01pgn01\n //\n int index = genericVNF.lastIndexOf(\"fwl\");\n if (index == -1) {\n System.err.println(\"The generic-vnf.vnf-id from DCAE Event is not valid.\");\n } else {\n genericVNF = genericVNF.substring(0, index) + \"pgn\" + genericVNF.substring(index+\"fwl\".length());\n }\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n //\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n //\n } else {\n //\n // create AAI named-query request with UUID started with \"F199\"\n //\n AAINQF199Request aainqf199request = new AAINQF199Request();\n AAINQF199QueryParameters aainqf199queryparam = new AAINQF199QueryParameters();\n AAINQF199NamedQuery aainqf199namedquery = new AAINQF199NamedQuery();\n AAINQF199InstanceFilters aainqf199instancefilter = new AAINQF199InstanceFilters();\n //\n // queryParameters\n //\n aainqf199namedquery.namedQueryUUID = UUID.fromString($params.getAaiNamedQueryUUID()); \n aainqf199queryparam.namedQuery = aainqf199namedquery;\n aainqf199request.queryParameters = aainqf199queryparam;\n //\n // instanceFilters\n //\n Map aainqf199instancefiltermap = new HashMap();\n Map aainqf199instancefiltermapitem = new HashMap();\n aainqf199instancefiltermapitem.put(\"vserver-name\", vserver); \n aainqf199instancefiltermap.put(\"vserver\", aainqf199instancefiltermapitem);\n aainqf199instancefilter.instanceFilter.add(aainqf199instancefiltermap);\n aainqf199request.instanceFilters = aainqf199instancefilter;\n //\n // print aainqf199request for debug\n //\n System.out.println(\"AAI Request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(aainqf199request));\n //\n // Create AAINQF199RequestWrapper\n //\n AAINQF199RequestWrapper aainqf199RequestWrapper = new AAINQF199RequestWrapper($event.requestID, aainqf199request);\n //\n // insert aainqf199request into memory\n //\n insert(aainqf199RequestWrapper);\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled, an Event Manager\n* is created, AAI Manager and AAI Request are ready in memory. We can start sending query to AAI and then wait for response.\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.EVENT.MANAGER.AAINQF199REQUEST\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199REQUEST is triggered.\");\n //\n // send the request\n //\n AAINQF199Response aainqf199response = AAINQF199Manager.postQuery($params.getAaiURL(), $params.getAaiUsername(), $params.getAaiPassword(),\n $aainqf199RequestWrapper.aainqf199request, $event.requestID);\n //\n // Check AAI response\n //\n if (aainqf199response == null) {\n System.err.println(\"Failed to get AAI response\");\n //\n // Fail and retract everything\n //\n retract($event);\n retract($manager);\n retract($aainqf199RequestWrapper);\n } else {\n //\n // Create AAINQF199ResponseWrapper\n //\n AAINQF199ResponseWrapper aainqf199ResponseWrapper = new AAINQF199ResponseWrapper($event.requestID, aainqf199response);\n //\n // insert aainqf199ResponseWrapper to memeory\n //\n insert(aainqf199ResponseWrapper);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid AAI response. We can start sending request to APPC or MSO now.\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.EVENT.MANAGER.AAINQF199RESPONSE\"\n when \n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n $aainqf199ResponseWrapper : AAINQF199ResponseWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199RESPONSE is triggered.\");\n //\n // Extract related fields out of AAINQF199RESPONSE\n //\n String vnfItemVnfId, vnfItemVnfType, vnfItemPersonaModelId, vnfItemPersonaModelVersion, vnfItemModelName, \n vnfItemModelVersion, vnfItemModelNameVersionId, serviceItemServiceInstanceId, serviceItemPersonaModelId,\n serviceItemModelName, serviceItemModelType, serviceItemModelVersion, serviceItemModelNameVersionId,\n vfModuleItemVfModuleName, vfModuleItemPersonaModelId, vfModuleItemPersonaModelVersion, vfModuleItemModelName, \n vfModuleItemModelNameVersionId, tenantItemTenantId, cloudRegionItemCloudRegionId;\n try {\n //\n // vnfItem\n //\n vnfItemVnfId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfID;\n vnfItemVnfType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfType;\n vnfItemVnfType = vnfItemVnfType.substring(vnfItemVnfType.lastIndexOf(\"/\")+1);\n vnfItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelId;\n vnfItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelVersion;\n vnfItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n vnfItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(2).propertyValue;\n vnfItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // serviceItem\n //\n serviceItemServiceInstanceId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.serviceInstanceID;\n serviceItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelId;\n serviceItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n serviceItemModelType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(1).propertyValue;\n serviceItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelVersion;\n serviceItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // Find the index for base vf module and non-base vf module\n //\n int baseIndex = -1;\n int nonBaseIndex = -1;\n List inventoryItems = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems;\n for (AAINQF199InventoryResponseItem m : inventoryItems) {\n if (m.vfModule != null && m.vfModule.isBaseVfModule == true) {\n baseIndex = inventoryItems.indexOf(m);\n } else if (m.vfModule != null && m.vfModule.isBaseVfModule == false && m.vfModule.orchestrationStatus == null) {\n nonBaseIndex = inventoryItems.indexOf(m);\n }\n //\n if (baseIndex != -1 && nonBaseIndex != -1) {\n break;\n }\n }\n //\n // Report the error if either base vf module or non-base vf module is not found\n //\n if (baseIndex == -1 || nonBaseIndex == -1) {\n System.err.println(\"Either base or non-base vf module is not found from AAI response.\");\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // This comes from the base module\n //\n vfModuleItemVfModuleName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(baseIndex).vfModule.vfModuleName;\n vfModuleItemVfModuleName = vfModuleItemVfModuleName.replace(\"Vfmodule\", \"vDNS\");\n //\n // vfModuleItem - NOT the base module\n //\n vfModuleItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelId;\n vfModuleItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelVersion;\n vfModuleItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(0).propertyValue;\n vfModuleItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(4).propertyValue;\n //\n // tenantItem\n //\n tenantItemTenantId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).tenant.tenantId;\n //\n // cloudRegionItem\n //\n cloudRegionItemCloudRegionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).items.inventoryResponseItems.get(0).cloudRegion.cloudRegionId;\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n notification.message = \"Invalid named-query response from AAI\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n } \n //\n // Extracted fields should not be null\n //\n if ((vnfItemVnfId == null) || (vnfItemVnfType == null) ||\n (vnfItemPersonaModelId == null) || (vnfItemModelName == null) ||\n (vnfItemModelVersion == null) || (vnfItemModelNameVersionId == null) ||\n (serviceItemServiceInstanceId == null) || (serviceItemModelName == null) ||\n (serviceItemModelType == null) || (serviceItemModelVersion == null) ||\n (serviceItemModelNameVersionId == null) || (vfModuleItemVfModuleName == null) ||\n (vfModuleItemPersonaModelId == null) || (vfModuleItemPersonaModelVersion == null) ||\n (vfModuleItemModelName == null) || (vfModuleItemModelNameVersionId == null) ||\n (tenantItemTenantId == null) || (cloudRegionItemCloudRegionId == null)) {\n //\n System.err.println(\"some fields are missing from AAI response.\");\n //\n // Fail and retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // We don\'t need them any more\n //\n retract($aainqf199ResponseWrapper);\n retract($aainqf199RequestWrapper); \n //\n // check the actor of this closed loop\n //\n switch ($params.getActor()) {\n case \"APPC\":\n {\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n // Hardcode genericVNF for now since AAI has not been ready for vFirewall demo case\n //\n String genericVNF = \"zdfw1fwl01pgn02\";\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n }\n break;\n case \"MSO\":\n {\n //\n // Construct an operation\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"createModuleInstance\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // Construct an MSO request\n //\n MSORequest request = new MSORequest();\n request.requestDetails = new MSORequestDetails();\n request.requestDetails.modelInfo = new MSOModelInfo();\n request.requestDetails.cloudConfiguration = new MSOCloudConfiguration();\n request.requestDetails.requestInfo = new MSORequestInfo();\n request.requestDetails.requestParameters = new MSORequestParameters();\n request.requestDetails.requestParameters.userParams = null;\n //\n // cloudConfiguration\n //\n request.requestDetails.cloudConfiguration.lcpCloudRegionId = cloudRegionItemCloudRegionId;\n request.requestDetails.cloudConfiguration.tenantId = tenantItemTenantId;\n //\n // modelInfo\n //\n request.requestDetails.modelInfo.modelType = \"vfModule\";\n request.requestDetails.modelInfo.modelInvariantId = vfModuleItemPersonaModelId;\n request.requestDetails.modelInfo.modelNameVersionId = vfModuleItemModelNameVersionId;\n request.requestDetails.modelInfo.modelName = vfModuleItemModelName;\n request.requestDetails.modelInfo.modelVersion = vfModuleItemPersonaModelVersion;\n //\n // requestInfo\n //\n request.requestDetails.requestInfo.instanceName = vfModuleItemVfModuleName;\n request.requestDetails.requestInfo.source = \"POLICY\";\n request.requestDetails.requestInfo.suppressRollback = false;\n //\n // relatedInstanceList\n //\n MSORelatedInstanceListElement relatedInstanceListElement1 = new MSORelatedInstanceListElement();\n MSORelatedInstanceListElement relatedInstanceListElement2 = new MSORelatedInstanceListElement();\n relatedInstanceListElement1.relatedInstance = new MSORelatedInstance();\n relatedInstanceListElement2.relatedInstance = new MSORelatedInstance();\n //\n relatedInstanceListElement1.relatedInstance.instanceId = serviceItemServiceInstanceId;\n relatedInstanceListElement1.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement1.relatedInstance.modelInfo.modelType = \"service\";\n relatedInstanceListElement1.relatedInstance.modelInfo.modelInvariantId = serviceItemPersonaModelId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelNameVersionId = serviceItemModelNameVersionId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelName = serviceItemModelName;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelVersion = serviceItemModelVersion;\n //\n relatedInstanceListElement2.relatedInstance.instanceId = vnfItemVnfId;\n relatedInstanceListElement2.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement2.relatedInstance.modelInfo.modelType = \"vnf\";\n relatedInstanceListElement2.relatedInstance.modelInfo.modelInvariantId = vnfItemPersonaModelId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelNameVersionId = vnfItemModelNameVersionId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelName = vnfItemModelName;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelVersion = vnfItemModelVersion;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelCustomizationName = vnfItemVnfType;\n // \n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement1);\n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement2);\n //\n // print MSO request for debug\n //\n System.out.println(\"MSO request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n //\n //\n //\n if (request != null) {\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Concatenate serviceItemServiceInstanceId and vnfItemVnfId to msoURL\n //\n String MSOUrl = $params.getMsoURL() + \"/serviceInstances/v2/\" + serviceItemServiceInstanceId + \"/vnfs/\" + vnfItemVnfId + \"/vfModules\";\n //\n // Call MSO\n //\n MSOResponse response = MSOManager.createModuleInstance(MSOUrl, $params.getMsoURL(), $params.getMsoUsername(), $params.getMsoPassword(), request);\n //\n if (response != null) {\n //\n // Assign requestId\n //\n request.requestId = $event.requestID.toString(); \n response.request.requestId = $event.requestID.toString();\n //\n // Insert facts\n //\n insert(operationWrapper);\n insert(request);\n insert(response);\n } else {\n //\n // MSO request not even accepted\n //\n notification.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n notification.history.add(operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($event);\n retract($manager);\n }\n } else {\n System.err.println(\"constructed MSO request is invalid.\");\n }\n }\n break; \n } \nend\n \n/*\n*\n* This rule responds to APPC Response Events\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.APPC.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : Request( getCommonHeader().RequestID == $event.requestID )\n $response : Response( getCommonHeader().RequestID == $event.requestID ) \n then\n System.out.println(\"rule APPC.RESPONSE is triggered.\");\n if ($response.Status == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n } \n //\n // Get the Response Code\n //\n ResponseCode code = ResponseCode.toResponseCode($response.Status.Code);\n if (code == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n }\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // Ok, let\'s figure out what APP-C\'s response is\n //\n switch (code) {\n case ACCEPT:\n $operationWrapper.operation.outcome = \"PROCESSING\";\n break;\n case ERROR:\n case REJECT:\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n break;\n case SUCCESS:\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n break;\n case FAILURE:\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n break;\n }\n if ($operationWrapper.operation.outcome.equals(\"SUCCESS\")) {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else if ($operationWrapper.operation.outcome.equals(\"PROCESSING\")) {\n retract($response);\n } else {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \n\n/*\n*\n* This rule is used to clean up APPC response\n*\n*/ \nrule \"BRMSParamvLBDemoPolicy.APPC.RESPONSE.CLEANUP\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $response : Response($id : getCommonHeader().RequestID )\n not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) \n then\n System.out.println(\"rule APPC.RESPONSE.CLEANUP is triggered.\");\n retract($response);\nend\n\n/*\n*\n* This rule responds to MSO Response Events\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.MSO.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : MSORequest( requestId == $event.requestID.toString() )\n $response : MSOResponse( request.requestId == $event.requestID.toString() ) \n then\n System.out.println(\"rule MSO.RESPONSE is triggered.\");\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // The operation can either be succeeded or failed\n // \n if($response.request.requestStatus.requestState.equals(\"Completed\")) {\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else {\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \nrule \"Params\" \n salience 1000 \n when\n then\n Params params = new Params();\n params.setAaiPatternMatch(0);\n params.setAppcTopic(\"APPC-CL\");\n params.setAaiURL(\"https://aai.api.simpledemo.openecomp.org:8443\");\n params.setMsoPassword(\"password1$\");\n params.setClosedLoopControlName(\"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\");\n params.setAaiUsername(\"POLICY\");\n params.setMsoURL(\"http://vm1.mso.simpledemo.openecomp.org:8080/ecomp/mso/infra\");\n params.setActor(\"MSO\");\n params.setMsoUsername(\"InfraPortalClient\");\n params.setAaiNamedQueryUUID(\"f199cb88-5e69-4b1f-93e0-6f257877d066\");\n params.setAaiPassword(\"POLICY\");\n params.setNotificationTopic(\"POLICY-CL-MGT\");\n insert(params);\nend\r\n','OTHER','com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt','doACPolicyPut','2017-03-03 17:20:01',0,'','doACPolicyPut','2017-03-03 17:20:01',1); - INSERT INTO `configurationdataentity` VALUES (3155,'{\"service\":\"TcaMetrics\",\"location\":\"SampleServiceLocation\",\"uuid\":\"/services/cdap-tca-hi-lo/instances/demo/configuration/metricsPerFunctionalRole/vFirewall\",\"policyName\":\"vFirewall\",\"description\":\"Micro Service vFirewall Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:\",\"configName\":\"SampleConfigName\",\"templateVersion\":\"OpenSource.version.1\",\"version\":\"1.0.0.5\",\"priority\":\"1\",\"policyScope\":\"resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop\",\"content\":{\"thresholds\":[{\"severity\":\"MAJOR\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.vNicUsageArray[*].packetsIn\",\"thresholdValue\":\"300\",\"closedLoopControlName\":\"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\",\"version\":\"1.0.2\",\"direction\":\"LESS_OR_EQUAL\"},{\"severity\":\"CRITICAL\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.vNicUsageArray[*].packetsIn\",\"thresholdValue\":\"700\",\"closedLoopControlName\":\"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\",\"version\":\"1.0.2\",\"direction\":\"GREATER_OR_EQUAL\"}],\"functionalRole\":\"vFirewall\",\"name\":\"0\"}}\r\n','JSON','com.Config_MS_vFirewall.1.json','doACPolicyPut','2017-03-03 17:26:24',0,'','doACPolicyPut','2017-03-03 17:26:24',1),(3157,'{\"service\":\"TcaMetrics\",\"location\":\"SampleServiceLocation\",\"uuid\":\"/services/cdap-tca-hi-lo/instances/demo/configuration/metricsPerFunctionalRole/vLoadBalancer\",\"policyName\":\"vLoadBalancer\",\"description\":\"Micro Service vLoadBalancer Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:\",\"configName\":\"SampleConfigName\",\"templateVersion\":\"OpenSource.version.1\",\"version\":\"1.0.0.5\",\"priority\":\"1\",\"policyScope\":\"resource=SampleResource,service=SampleService,type=SampleType,closedLoopControlName=SampleClosedLoop\",\"content\":{\"thresholds\":[{\"severity\":\"MAJOR\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.vNicUsageArray[*].packetsIn\",\"thresholdValue\":\"200\",\"closedLoopControlName\":\"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\",\"version\":\"1.0.2\",\"direction\":\"GREATER_OR_EQUAL\"}],\"functionalRole\":\"vLoadBalancer\",\"name\":\"0\"}}\r\n','JSON','com.Config_MS_vLoadBalancer.1.json','doACPolicyPut','2017-03-03 17:28:10',0,'','doACPolicyPut','2017-03-03 17:28:10',1); -INSERT INTO `brmsparamtemplate` VALUES (1,'ControlLoopDemo__closedLoopControlName','ControlLoopDemo__closedLoopControlName','\r\n\r\n/*-\n * ============LICENSE_START=======================================================\n * archetype-closed-loop-demo-rules\n * ================================================================================\n * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============LICENSE_END=========================================================\n */\n\npackage org.openecomp.policy.controlloop;\n\nimport java.util.List;\nimport java.util.LinkedList;\nimport java.util.Map;\nimport java.util.HashMap;\nimport java.util.UUID;\n\nimport org.openecomp.policy.controlloop.VirtualControlLoopEvent;\nimport org.openecomp.policy.controlloop.ControlLoopEventStatus;\nimport org.openecomp.policy.controlloop.VirtualControlLoopNotification;\nimport org.openecomp.policy.controlloop.ControlLoopNotificationType;\nimport org.openecomp.policy.controlloop.ControlLoopOperation;\nimport org.openecomp.policy.controlloop.ControlLoopOperationWrapper;\nimport org.openecomp.policy.template.demo.ControlLoopException;\n\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199CloudRegion;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperties;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperty;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199GenericVNF;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InstanceFilters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItem;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItems;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Manager;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199NamedQuery;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199QueryParameters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Request;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199RequestWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Response;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ResponseWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ServiceInstance;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Tenant;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VfModule;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VServer;\nimport org.openecomp.policy.aai.util.Serialization;\n\nimport org.openecomp.policy.appc.CommonHeader;\nimport org.openecomp.policy.appc.Request;\nimport org.openecomp.policy.appc.Response;\nimport org.openecomp.policy.appc.ResponseCode;\nimport org.openecomp.policy.appc.ResponseStatus;\nimport org.openecomp.policy.appc.ResponseValue;\n\nimport org.openecomp.policy.template.demo.EventManager;\nimport org.openecomp.policy.vnf.trafficgenerator.PGRequest;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStream;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStreams;\n\nimport org.openecomp.policy.mso.MSOManager;\nimport org.openecomp.policy.mso.MSORequest;\nimport org.openecomp.policy.mso.MSORequestStatus;\nimport org.openecomp.policy.mso.MSORequestDetails;\nimport org.openecomp.policy.mso.MSOModelInfo;\nimport org.openecomp.policy.mso.MSOCloudConfiguration;\nimport org.openecomp.policy.mso.MSORequestInfo;\nimport org.openecomp.policy.mso.MSORequestParameters;\nimport org.openecomp.policy.mso.MSORelatedInstanceListElement;\nimport org.openecomp.policy.mso.MSORelatedInstance;\nimport org.openecomp.policy.mso.MSOResponse;\n\nimport org.openecomp.policy.drools.system.PolicyEngine;\n\n//\n// These parameters are required to build the runtime policy\n//\ndeclare Params\n closedLoopControlName : String\n actor : String\n aaiURL : String\n aaiUsername : String\n aaiPassword : String\n msoURL : String\n msoUsername : String\n msoPassword : String\n aaiNamedQueryUUID : String\n aaiPatternMatch : int \n notificationTopic : String\n appcTopic : String\nend\n\n/*\n*\n* Called once and only once to insert the parameters into working memory for this Closed Loop policy.\n* (Comment SETUP rule out for the first ECOMP opensource release since policy BRMS_GW already puts a Params fact in there)\n*\n*\n*rule \"${policyName}.SETUP\"\n* when\n* then\n* System.out.println(\"rule SETUP is triggered.\");\n* Params params = new Params();\n* params.setClosedLoopControlName(\"${closedLoopControlName}\");\n* params.setActor(\"${actor}\");\n* params.setAaiURL(\"${aaiURL}\");\n* params.setAaiUsername(\"${aaiUsername}\");\n* params.setAaiPassword(\"${aaiPassword}\");\n* params.setMsoURL(\"${msoURL}\");\n* params.setMsoUsername(\"${msoUsername}\");\n* params.setMsoPassword(\"${msoPassword}\");\n* params.setAaiNamedQueryUUID(\"${aaiNamedQueryUUID}\");\n* params.setAaiPatternMatch(${aaiPatternMatch});\n* params.setNotificationTopic(\"${notificationTopic}\");\n* params.setAppcTopic(\"${appcTopic}\");\n* //\n* // This stays in memory as long as the rule is alive and running\n* //\n* insert(params);\n*end\n*/\n/*\n*\n* This rule responds to DCAE Events\n*\n*/\nrule \"${policyName}.EVENT\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n not ( EventManager( closedLoopControlName == $event.closedLoopControlName ))\n then\n System.out.println(\"rule EVENT is triggered.\");\n try {\n // \n // Check the requestID in the event to make sure it is not null before we create the EventManager. \n // The EventManager will do extra syntax checking as well check if the closed loop is disabled/\n //\n if ($event.requestID == null) {\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.from = \"policy\";\n notification.message = \"Missing requestID from DCAE event\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n System.out.println(\"Event with requestID=null has been retracted.\");\n } else {\n //\n // Create an EventManager\n //\n EventManager manager = new EventManager($params.getClosedLoopControlName(), $event.requestID, $event.target);\n //\n // Determine if EventManager can actively process the event (i.e. syntax)\n //\n VirtualControlLoopNotification notification = manager.activate($event);\n notification.from = \"policy\"; \n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n //\n // Are we actively pursuing this event?\n //\n if (notification.notification == ControlLoopNotificationType.ACTIVE) {\n //\n // Insert Event Manager into memory, this will now kick off processing.\n //\n insert(manager);\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n } \n } else {\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n }\n //\n // Now that the manager is inserted into Drools working memory, we\'ll wait for\n // another rule to fire in order to continue processing. This way we can also\n // then screen for additional ONSET and ABATED events for this same RequestIDs \n // and for different RequestIDs but with the same closedLoopControlName and target.\n //\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n //\n //\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract the event\n //\n retract($event);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager\n* is created. We can start the operations for this closed loop.\n*\n*/\nrule \"${policyName}.EVENT.MANAGER\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName, controlLoopResult == null)\n then\n System.out.println(\"rule EVENT.MANAGER is triggered.\");\n //\n // Check which event this is.\n //\n EventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event);\n //\n // We only want the initial ONSET event in memory,\n // all the other events need to be retracted to support\n // cleanup and avoid the other rules being fired for this event.\n //\n if (eventStatus != EventManager.NEW_EVENT_STATUS.FIRST_ONSET) {\n System.out.println(\"Retracting \"+eventStatus+\" Event.\");\n retract($event);\n return;\n }\n //\n // Now the event in memory is first onset event\n //\n try {\n //\n // Pull the known AAI field from the Event\n //\n // generic-vnf is needed for vFirewall case\n // vserver-name is needed for vLoadBalancer case\n //\n String genericVNF = $event.AAI.get(\"generic-vnf.vnf-id\");\n String vserver = $event.AAI.get(\"vserver.vserver-name\");\n //\n // Check if we are implementing a simple pattern match.\n //\n if ($params.getAaiPatternMatch() == 1) {\n //\n // Yes\n //\n //Basic naming characteristics:\n //VF Name (9 char)+VM name (13 char total)+VFC (19 char total)\n //Example: \n //VF Name (9 characters): cscf0001v\n //VM Name(13 characters): cscf0001vm001\n //VFC name(19 characters): cscf0001vm001cfg001\n //\n // zdfw1fwl01fwl02 or zdfw1fwl01fwl01 \n // replaced with\n // zdfw1fwl01pgn02 or zdfw1fwl01pgn01\n //\n int index = genericVNF.lastIndexOf(\"fwl\");\n if (index == -1) {\n System.err.println(\"The generic-vnf.vnf-id from DCAE Event is not valid.\");\n } else {\n genericVNF = genericVNF.substring(0, index) + \"pgn\" + genericVNF.substring(index+\"fwl\".length());\n }\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n //\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n //\n } else {\n //\n // create AAI named-query request with UUID started with \"F199\"\n //\n AAINQF199Request aainqf199request = new AAINQF199Request();\n AAINQF199QueryParameters aainqf199queryparam = new AAINQF199QueryParameters();\n AAINQF199NamedQuery aainqf199namedquery = new AAINQF199NamedQuery();\n AAINQF199InstanceFilters aainqf199instancefilter = new AAINQF199InstanceFilters();\n //\n // queryParameters\n //\n aainqf199namedquery.namedQueryUUID = UUID.fromString($params.getAaiNamedQueryUUID()); \n aainqf199queryparam.namedQuery = aainqf199namedquery;\n aainqf199request.queryParameters = aainqf199queryparam;\n //\n // instanceFilters\n //\n Map aainqf199instancefiltermap = new HashMap();\n Map aainqf199instancefiltermapitem = new HashMap();\n aainqf199instancefiltermapitem.put(\"vserver-name\", vserver); \n aainqf199instancefiltermap.put(\"vserver\", aainqf199instancefiltermapitem);\n aainqf199instancefilter.instanceFilter.add(aainqf199instancefiltermap);\n aainqf199request.instanceFilters = aainqf199instancefilter;\n //\n // print aainqf199request for debug\n //\n System.out.println(\"AAI Request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(aainqf199request));\n //\n // Create AAINQF199RequestWrapper\n //\n AAINQF199RequestWrapper aainqf199RequestWrapper = new AAINQF199RequestWrapper($event.requestID, aainqf199request);\n //\n // insert aainqf199request into memory\n //\n insert(aainqf199RequestWrapper);\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled, an Event Manager\n* is created, AAI Manager and AAI Request are ready in memory. We can start sending query to AAI and then wait for response.\n*\n*/\nrule \"${policyName}.EVENT.MANAGER.AAINQF199REQUEST\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199REQUEST is triggered.\");\n //\n // send the request\n //\n AAINQF199Response aainqf199response = AAINQF199Manager.postQuery($params.getAaiURL(), $params.getAaiUsername(), $params.getAaiPassword(),\n $aainqf199RequestWrapper.aainqf199request, $event.requestID);\n //\n // Check AAI response\n //\n if (aainqf199response == null) {\n System.err.println(\"Failed to get AAI response\");\n //\n // Fail and retract everything\n //\n retract($event);\n retract($manager);\n retract($aainqf199RequestWrapper);\n } else {\n //\n // Create AAINQF199ResponseWrapper\n //\n AAINQF199ResponseWrapper aainqf199ResponseWrapper = new AAINQF199ResponseWrapper($event.requestID, aainqf199response);\n //\n // insert aainqf199ResponseWrapper to memeory\n //\n insert(aainqf199ResponseWrapper);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid AAI response. We can start sending request to APPC or MSO now.\n*\n*/\nrule \"${policyName}.EVENT.MANAGER.AAINQF199RESPONSE\"\n when \n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n $aainqf199ResponseWrapper : AAINQF199ResponseWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199RESPONSE is triggered.\");\n //\n // Extract related fields out of AAINQF199RESPONSE\n //\n String vnfItemVnfId, vnfItemVnfType, vnfItemPersonaModelId, vnfItemPersonaModelVersion, vnfItemModelName, \n vnfItemModelVersion, vnfItemModelNameVersionId, serviceItemServiceInstanceId, serviceItemPersonaModelId,\n serviceItemModelName, serviceItemModelType, serviceItemModelVersion, serviceItemModelNameVersionId,\n vfModuleItemVfModuleName, vfModuleItemPersonaModelId, vfModuleItemPersonaModelVersion, vfModuleItemModelName, \n vfModuleItemModelNameVersionId, tenantItemTenantId, cloudRegionItemCloudRegionId;\n try {\n //\n // vnfItem\n //\n vnfItemVnfId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfID;\n vnfItemVnfType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfType;\n vnfItemVnfType = vnfItemVnfType.substring(vnfItemVnfType.lastIndexOf(\"/\")+1);\n vnfItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelId;\n vnfItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelVersion;\n vnfItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n vnfItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(2).propertyValue;\n vnfItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // serviceItem\n //\n serviceItemServiceInstanceId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.serviceInstanceID;\n serviceItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelId;\n serviceItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n serviceItemModelType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(1).propertyValue;\n serviceItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelVersion;\n serviceItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // Find the index for base vf module and non-base vf module\n //\n int baseIndex = -1;\n int nonBaseIndex = -1;\n List inventoryItems = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems;\n for (AAINQF199InventoryResponseItem m : inventoryItems) {\n if (m.vfModule != null && m.vfModule.isBaseVfModule == true) {\n baseIndex = inventoryItems.indexOf(m);\n } else if (m.vfModule != null && m.vfModule.isBaseVfModule == false && m.vfModule.orchestrationStatus == null) {\n nonBaseIndex = inventoryItems.indexOf(m);\n }\n //\n if (baseIndex != -1 && nonBaseIndex != -1) {\n break;\n }\n }\n //\n // Report the error if either base vf module or non-base vf module is not found\n //\n if (baseIndex == -1 || nonBaseIndex == -1) {\n System.err.println(\"Either base or non-base vf module is not found from AAI response.\");\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // This comes from the base module\n //\n vfModuleItemVfModuleName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(baseIndex).vfModule.vfModuleName;\n vfModuleItemVfModuleName = vfModuleItemVfModuleName.replace(\"Vfmodule\", \"vDNS\");\n //\n // vfModuleItem - NOT the base module\n //\n vfModuleItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelId;\n vfModuleItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelVersion;\n vfModuleItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(0).propertyValue;\n vfModuleItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(4).propertyValue;\n //\n // tenantItem\n //\n tenantItemTenantId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).tenant.tenantId;\n //\n // cloudRegionItem\n //\n cloudRegionItemCloudRegionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).items.inventoryResponseItems.get(0).cloudRegion.cloudRegionId;\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n notification.message = \"Invalid named-query response from AAI\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n } \n //\n // Extracted fields should not be null\n //\n if ((vnfItemVnfId == null) || (vnfItemVnfType == null) ||\n (vnfItemPersonaModelId == null) || (vnfItemModelName == null) ||\n (vnfItemModelVersion == null) || (vnfItemModelNameVersionId == null) ||\n (serviceItemServiceInstanceId == null) || (serviceItemModelName == null) ||\n (serviceItemModelType == null) || (serviceItemModelVersion == null) ||\n (serviceItemModelNameVersionId == null) || (vfModuleItemVfModuleName == null) ||\n (vfModuleItemPersonaModelId == null) || (vfModuleItemPersonaModelVersion == null) ||\n (vfModuleItemModelName == null) || (vfModuleItemModelNameVersionId == null) ||\n (tenantItemTenantId == null) || (cloudRegionItemCloudRegionId == null)) {\n //\n System.err.println(\"some fields are missing from AAI response.\");\n //\n // Fail and retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // We don\'t need them any more\n //\n retract($aainqf199ResponseWrapper);\n retract($aainqf199RequestWrapper); \n //\n // check the actor of this closed loop\n //\n switch ($params.getActor()) {\n case \"APPC\":\n {\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n // Hardcode genericVNF for now since AAI has not been ready for vFirewall demo case\n //\n String genericVNF = \"zdfw1fwl01pgn02\";\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n }\n break;\n case \"MSO\":\n {\n //\n // Construct an operation\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"createModuleInstance\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // Construct an MSO request\n //\n MSORequest request = new MSORequest();\n request.requestDetails = new MSORequestDetails();\n request.requestDetails.modelInfo = new MSOModelInfo();\n request.requestDetails.cloudConfiguration = new MSOCloudConfiguration();\n request.requestDetails.requestInfo = new MSORequestInfo();\n request.requestDetails.requestParameters = new MSORequestParameters();\n request.requestDetails.requestParameters.userParams = null;\n //\n // cloudConfiguration\n //\n request.requestDetails.cloudConfiguration.lcpCloudRegionId = cloudRegionItemCloudRegionId;\n request.requestDetails.cloudConfiguration.tenantId = tenantItemTenantId;\n //\n // modelInfo\n //\n request.requestDetails.modelInfo.modelType = \"vfModule\";\n request.requestDetails.modelInfo.modelInvariantId = vfModuleItemPersonaModelId;\n request.requestDetails.modelInfo.modelNameVersionId = vfModuleItemModelNameVersionId;\n request.requestDetails.modelInfo.modelName = vfModuleItemModelName;\n request.requestDetails.modelInfo.modelVersion = vfModuleItemPersonaModelVersion;\n //\n // requestInfo\n //\n request.requestDetails.requestInfo.instanceName = vfModuleItemVfModuleName;\n request.requestDetails.requestInfo.source = \"POLICY\";\n request.requestDetails.requestInfo.suppressRollback = false;\n //\n // relatedInstanceList\n //\n MSORelatedInstanceListElement relatedInstanceListElement1 = new MSORelatedInstanceListElement();\n MSORelatedInstanceListElement relatedInstanceListElement2 = new MSORelatedInstanceListElement();\n relatedInstanceListElement1.relatedInstance = new MSORelatedInstance();\n relatedInstanceListElement2.relatedInstance = new MSORelatedInstance();\n //\n relatedInstanceListElement1.relatedInstance.instanceId = serviceItemServiceInstanceId;\n relatedInstanceListElement1.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement1.relatedInstance.modelInfo.modelType = \"service\";\n relatedInstanceListElement1.relatedInstance.modelInfo.modelInvariantId = serviceItemPersonaModelId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelNameVersionId = serviceItemModelNameVersionId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelName = serviceItemModelName;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelVersion = serviceItemModelVersion;\n //\n relatedInstanceListElement2.relatedInstance.instanceId = vnfItemVnfId;\n relatedInstanceListElement2.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement2.relatedInstance.modelInfo.modelType = \"vnf\";\n relatedInstanceListElement2.relatedInstance.modelInfo.modelInvariantId = vnfItemPersonaModelId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelNameVersionId = vnfItemModelNameVersionId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelName = vnfItemModelName;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelVersion = vnfItemModelVersion;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelCustomizationName = vnfItemVnfType;\n // \n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement1);\n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement2);\n //\n // print MSO request for debug\n //\n System.out.println(\"MSO request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n //\n //\n //\n if (request != null) {\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Concatenate serviceItemServiceInstanceId and vnfItemVnfId to msoURL\n //\n String MSOUrl = $params.getMsoURL() + \"/serviceInstances/v2/\" + serviceItemServiceInstanceId + \"/vnfs/\" + vnfItemVnfId + \"/vfModules\";\n //\n // Call MSO\n //\n MSOResponse response = MSOManager.createModuleInstance(MSOUrl, $params.getMsoURL(), $params.getMsoUsername(), $params.getMsoPassword(), request);\n //\n if (response != null) {\n //\n // Assign requestId\n //\n request.requestId = $event.requestID.toString(); \n response.request.requestId = $event.requestID.toString();\n //\n // Insert facts\n //\n insert(operationWrapper);\n insert(request);\n insert(response);\n } else {\n //\n // MSO request not even accepted\n //\n notification.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n notification.history.add(operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($event);\n retract($manager);\n }\n } else {\n System.err.println(\"constructed MSO request is invalid.\");\n }\n }\n break; \n } \nend\n \n/*\n*\n* This rule responds to APPC Response Events\n*\n*/\nrule \"${policyName}.APPC.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : Request( getCommonHeader().RequestID == $event.requestID )\n $response : Response( getCommonHeader().RequestID == $event.requestID ) \n then\n System.out.println(\"rule APPC.RESPONSE is triggered.\");\n if ($response.Status == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n } \n //\n // Get the Response Code\n //\n ResponseCode code = ResponseCode.toResponseCode($response.Status.Code);\n if (code == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n }\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // Ok, let\'s figure out what APP-C\'s response is\n //\n switch (code) {\n case ACCEPT:\n $operationWrapper.operation.outcome = \"PROCESSING\";\n break;\n case ERROR:\n case REJECT:\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n break;\n case SUCCESS:\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n break;\n case FAILURE:\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n break;\n }\n if ($operationWrapper.operation.outcome.equals(\"SUCCESS\")) {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else if ($operationWrapper.operation.outcome.equals(\"PROCESSING\")) {\n retract($response);\n } else {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \n\n/*\n*\n* This rule is used to clean up APPC response\n*\n*/ \nrule \"${policyName}.APPC.RESPONSE.CLEANUP\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $response : Response($id : getCommonHeader().RequestID )\n not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) \n then\n System.out.println(\"rule APPC.RESPONSE.CLEANUP is triggered.\");\n retract($response);\nend\n\n/*\n*\n* This rule responds to MSO Response Events\n*\n*/\nrule \"${policyName}.MSO.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"${closedLoopControlName}\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : MSORequest( requestId == $event.requestID.toString() )\n $response : MSOResponse( request.requestId == $event.requestID.toString() ) \n then\n System.out.println(\"rule MSO.RESPONSE is triggered.\");\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"${policyScope}\";\n notification.policyVersion = \"${policyVersion}\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // The operation can either be succeeded or failed\n // \n if($response.request.requestStatus.requestState.equals(\"Completed\")) {\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else {\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend ','2017-03-03 17:11:30','demo'); +INSERT INTO `configurationdataentity` VALUES (3201,'/* Autogenerated Code Please Don\'t change/remove this comment section. This is for the UI purpose. \n <$%BRMSParamTemplate=ControlLoopDemo__closedLoopControlName%$> \n */ \n\r\n\r\n/*-\n * ============LICENSE_START=======================================================\n * archetype-closed-loop-demo-rules\n * ================================================================================\n * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============LICENSE_END=========================================================\n */\n\npackage org.openecomp.policy.controlloop;\n\nimport java.util.List;\nimport java.util.LinkedList;\nimport java.util.Map;\nimport java.util.HashMap;\nimport java.util.UUID;\n\nimport org.openecomp.policy.controlloop.VirtualControlLoopEvent;\nimport org.openecomp.policy.controlloop.ControlLoopEventStatus;\nimport org.openecomp.policy.controlloop.VirtualControlLoopNotification;\nimport org.openecomp.policy.controlloop.ControlLoopNotificationType;\nimport org.openecomp.policy.controlloop.ControlLoopOperation;\nimport org.openecomp.policy.controlloop.ControlLoopOperationWrapper;\nimport org.openecomp.policy.template.demo.ControlLoopException;\n\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199CloudRegion;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperties;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperty;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199GenericVNF;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InstanceFilters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItem;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItems;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Manager;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199NamedQuery;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199QueryParameters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Request;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199RequestWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Response;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ResponseWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ServiceInstance;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Tenant;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VfModule;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VServer;\nimport org.openecomp.policy.aai.util.Serialization;\n\nimport org.openecomp.policy.appc.CommonHeader;\nimport org.openecomp.policy.appc.Request;\nimport org.openecomp.policy.appc.Response;\nimport org.openecomp.policy.appc.ResponseCode;\nimport org.openecomp.policy.appc.ResponseStatus;\nimport org.openecomp.policy.appc.ResponseValue;\n\nimport org.openecomp.policy.template.demo.EventManager;\nimport org.openecomp.policy.vnf.trafficgenerator.PGRequest;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStream;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStreams;\n\nimport org.openecomp.policy.mso.MSOManager;\nimport org.openecomp.policy.mso.MSORequest;\nimport org.openecomp.policy.mso.MSORequestStatus;\nimport org.openecomp.policy.mso.MSORequestDetails;\nimport org.openecomp.policy.mso.MSOModelInfo;\nimport org.openecomp.policy.mso.MSOCloudConfiguration;\nimport org.openecomp.policy.mso.MSORequestInfo;\nimport org.openecomp.policy.mso.MSORequestParameters;\nimport org.openecomp.policy.mso.MSORelatedInstanceListElement;\nimport org.openecomp.policy.mso.MSORelatedInstance;\nimport org.openecomp.policy.mso.MSOResponse;\n\nimport org.openecomp.policy.drools.system.PolicyEngine;\n\n//\n// These parameters are required to build the runtime policy\n//\ndeclare Params\n closedLoopControlName : String\n actor : String\n aaiURL : String\n aaiUsername : String\n aaiPassword : String\n msoURL : String\n msoUsername : String\n msoPassword : String\n aaiNamedQueryUUID : String\n aaiPatternMatch : int \n notificationTopic : String\n appcTopic : String\nend\n\n/*\n*\n* Called once and only once to insert the parameters into working memory for this Closed Loop policy.\n* (Comment SETUP rule out for the first ECOMP opensource release since policy BRMS_GW already puts a Params fact in there)\n*\n*\n*rule \"BRMSParamvFWDemoPolicy.SETUP\"\n* when\n* then\n* System.out.println(\"rule SETUP is triggered.\");\n* Params params = new Params();\n* params.setClosedLoopControlName(\"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\");\n* params.setActor(\"APPC\");\n* params.setAaiURL(\"null\");\n* params.setAaiUsername(\"null\");\n* params.setAaiPassword(\"null\");\n* params.setMsoURL(\"null\");\n* params.setMsoUsername(\"null\");\n* params.setMsoPassword(\"null\");\n* params.setAaiNamedQueryUUID(\"null\");\n* params.setAaiPatternMatch(1);\n* params.setNotificationTopic(\"POLICY-CL-MGT\");\n* params.setAppcTopic(\"APPC-CL\");\n* //\n* // This stays in memory as long as the rule is alive and running\n* //\n* insert(params);\n*end\n*/\n/*\n*\n* This rule responds to DCAE Events\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.EVENT\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n not ( EventManager( closedLoopControlName == $event.closedLoopControlName ))\n then\n System.out.println(\"rule EVENT is triggered.\");\n try {\n // \n // Check the requestID in the event to make sure it is not null before we create the EventManager. \n // The EventManager will do extra syntax checking as well check if the closed loop is disabled/\n //\n if ($event.requestID == null) {\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.from = \"policy\";\n notification.message = \"Missing requestID from DCAE event\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n System.out.println(\"Event with requestID=null has been retracted.\");\n } else {\n //\n // Create an EventManager\n //\n EventManager manager = new EventManager($params.getClosedLoopControlName(), $event.requestID, $event.target);\n //\n // Determine if EventManager can actively process the event (i.e. syntax)\n //\n VirtualControlLoopNotification notification = manager.activate($event);\n notification.from = \"policy\"; \n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n // Are we actively pursuing this event?\n //\n if (notification.notification == ControlLoopNotificationType.ACTIVE) {\n //\n // Insert Event Manager into memory, this will now kick off processing.\n //\n insert(manager);\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n } \n } else {\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n }\n //\n // Now that the manager is inserted into Drools working memory, we\'ll wait for\n // another rule to fire in order to continue processing. This way we can also\n // then screen for additional ONSET and ABATED events for this same RequestIDs \n // and for different RequestIDs but with the same closedLoopControlName and target.\n //\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n //\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract the event\n //\n retract($event);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager\n* is created. We can start the operations for this closed loop.\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.EVENT.MANAGER\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName, controlLoopResult == null)\n then\n System.out.println(\"rule EVENT.MANAGER is triggered.\");\n //\n // Check which event this is.\n //\n EventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event);\n //\n // We only want the initial ONSET event in memory,\n // all the other events need to be retracted to support\n // cleanup and avoid the other rules being fired for this event.\n //\n if (eventStatus != EventManager.NEW_EVENT_STATUS.FIRST_ONSET) {\n System.out.println(\"Retracting \"+eventStatus+\" Event.\");\n retract($event);\n return;\n }\n //\n // Now the event in memory is first onset event\n //\n try {\n //\n // Pull the known AAI field from the Event\n //\n // generic-vnf is needed for vFirewall case\n // vserver-name is needed for vLoadBalancer case\n //\n String genericVNF = $event.AAI.get(\"generic-vnf.vnf-id\");\n String vserver = $event.AAI.get(\"vserver.vserver-name\");\n //\n // Check if we are implementing a simple pattern match.\n //\n if ($params.getAaiPatternMatch() == 1) {\n //\n // Yes\n //\n //Basic naming characteristics:\n //VF Name (9 char)+VM name (13 char total)+VFC (19 char total)\n //Example: \n //VF Name (9 characters): cscf0001v\n //VM Name(13 characters): cscf0001vm001\n //VFC name(19 characters): cscf0001vm001cfg001\n //\n // zdfw1fwl01fwl02 or zdfw1fwl01fwl01 \n // replaced with\n // zdfw1fwl01pgn02 or zdfw1fwl01pgn01\n //\n int index = genericVNF.lastIndexOf(\"fwl\");\n if (index == -1) {\n System.err.println(\"The generic-vnf.vnf-id from DCAE Event is not valid.\");\n } else {\n genericVNF = genericVNF.substring(0, index) + \"pgn\" + genericVNF.substring(index+\"fwl\".length());\n }\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n //\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n //\n } else {\n //\n // create AAI named-query request with UUID started with \"F199\"\n //\n AAINQF199Request aainqf199request = new AAINQF199Request();\n AAINQF199QueryParameters aainqf199queryparam = new AAINQF199QueryParameters();\n AAINQF199NamedQuery aainqf199namedquery = new AAINQF199NamedQuery();\n AAINQF199InstanceFilters aainqf199instancefilter = new AAINQF199InstanceFilters();\n //\n // queryParameters\n //\n aainqf199namedquery.namedQueryUUID = UUID.fromString($params.getAaiNamedQueryUUID()); \n aainqf199queryparam.namedQuery = aainqf199namedquery;\n aainqf199request.queryParameters = aainqf199queryparam;\n //\n // instanceFilters\n //\n Map aainqf199instancefiltermap = new HashMap();\n Map aainqf199instancefiltermapitem = new HashMap();\n aainqf199instancefiltermapitem.put(\"vserver-name\", vserver); \n aainqf199instancefiltermap.put(\"vserver\", aainqf199instancefiltermapitem);\n aainqf199instancefilter.instanceFilter.add(aainqf199instancefiltermap);\n aainqf199request.instanceFilters = aainqf199instancefilter;\n //\n // print aainqf199request for debug\n //\n System.out.println(\"AAI Request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(aainqf199request));\n //\n // Create AAINQF199RequestWrapper\n //\n AAINQF199RequestWrapper aainqf199RequestWrapper = new AAINQF199RequestWrapper($event.requestID, aainqf199request);\n //\n // insert aainqf199request into memory\n //\n insert(aainqf199RequestWrapper);\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled, an Event Manager\n* is created, AAI Manager and AAI Request are ready in memory. We can start sending query to AAI and then wait for response.\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.EVENT.MANAGER.AAINQF199REQUEST\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199REQUEST is triggered.\");\n //\n // send the request\n //\n AAINQF199Response aainqf199response = AAINQF199Manager.postQuery($params.getAaiURL(), $params.getAaiUsername(), $params.getAaiPassword(),\n $aainqf199RequestWrapper.aainqf199request, $event.requestID);\n //\n // Check AAI response\n //\n if (aainqf199response == null) {\n System.err.println(\"Failed to get AAI response\");\n //\n // Fail and retract everything\n //\n retract($event);\n retract($manager);\n retract($aainqf199RequestWrapper);\n } else {\n //\n // Create AAINQF199ResponseWrapper\n //\n AAINQF199ResponseWrapper aainqf199ResponseWrapper = new AAINQF199ResponseWrapper($event.requestID, aainqf199response);\n //\n // insert aainqf199ResponseWrapper to memeory\n //\n insert(aainqf199ResponseWrapper);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid AAI response. We can start sending request to APPC or MSO now.\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.EVENT.MANAGER.AAINQF199RESPONSE\"\n when \n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n $aainqf199ResponseWrapper : AAINQF199ResponseWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199RESPONSE is triggered.\");\n //\n // Extract related fields out of AAINQF199RESPONSE\n //\n String vnfItemVnfId, vnfItemVnfType, vnfItemPersonaModelId, vnfItemPersonaModelVersion, vnfItemModelName, \n vnfItemModelVersion, vnfItemModelNameVersionId, serviceItemServiceInstanceId, serviceItemPersonaModelId,\n serviceItemModelName, serviceItemModelType, serviceItemModelVersion, serviceItemModelNameVersionId,\n vfModuleItemVfModuleName, vfModuleItemPersonaModelId, vfModuleItemPersonaModelVersion, vfModuleItemModelName, \n vfModuleItemModelNameVersionId, tenantItemTenantId, cloudRegionItemCloudRegionId;\n try {\n //\n // vnfItem\n //\n vnfItemVnfId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfID;\n vnfItemVnfType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfType;\n vnfItemVnfType = vnfItemVnfType.substring(vnfItemVnfType.lastIndexOf(\"/\")+1);\n vnfItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelId;\n vnfItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelVersion;\n vnfItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n vnfItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(2).propertyValue;\n vnfItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // serviceItem\n //\n serviceItemServiceInstanceId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.serviceInstanceID;\n serviceItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelId;\n serviceItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n serviceItemModelType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(1).propertyValue;\n serviceItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelVersion;\n serviceItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // Find the index for base vf module and non-base vf module\n //\n int baseIndex = -1;\n int nonBaseIndex = -1;\n List inventoryItems = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems;\n for (AAINQF199InventoryResponseItem m : inventoryItems) {\n if (m.vfModule != null && m.vfModule.isBaseVfModule == true) {\n baseIndex = inventoryItems.indexOf(m);\n } else if (m.vfModule != null && m.vfModule.isBaseVfModule == false && m.vfModule.orchestrationStatus == null) {\n nonBaseIndex = inventoryItems.indexOf(m);\n }\n //\n if (baseIndex != -1 && nonBaseIndex != -1) {\n break;\n }\n }\n //\n // Report the error if either base vf module or non-base vf module is not found\n //\n if (baseIndex == -1 || nonBaseIndex == -1) {\n System.err.println(\"Either base or non-base vf module is not found from AAI response.\");\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // This comes from the base module\n //\n vfModuleItemVfModuleName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(baseIndex).vfModule.vfModuleName;\n vfModuleItemVfModuleName = vfModuleItemVfModuleName.replace(\"Vfmodule\", \"vDNS\");\n //\n // vfModuleItem - NOT the base module\n //\n vfModuleItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelId;\n vfModuleItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelVersion;\n vfModuleItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(0).propertyValue;\n vfModuleItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(4).propertyValue;\n //\n // tenantItem\n //\n tenantItemTenantId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).tenant.tenantId;\n //\n // cloudRegionItem\n //\n cloudRegionItemCloudRegionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).items.inventoryResponseItems.get(0).cloudRegion.cloudRegionId;\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n notification.message = \"Invalid named-query response from AAI\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n } \n //\n // Extracted fields should not be null\n //\n if ((vnfItemVnfId == null) || (vnfItemVnfType == null) ||\n (vnfItemPersonaModelId == null) || (vnfItemModelName == null) ||\n (vnfItemModelVersion == null) || (vnfItemModelNameVersionId == null) ||\n (serviceItemServiceInstanceId == null) || (serviceItemModelName == null) ||\n (serviceItemModelType == null) || (serviceItemModelVersion == null) ||\n (serviceItemModelNameVersionId == null) || (vfModuleItemVfModuleName == null) ||\n (vfModuleItemPersonaModelId == null) || (vfModuleItemPersonaModelVersion == null) ||\n (vfModuleItemModelName == null) || (vfModuleItemModelNameVersionId == null) ||\n (tenantItemTenantId == null) || (cloudRegionItemCloudRegionId == null)) {\n //\n System.err.println(\"some fields are missing from AAI response.\");\n //\n // Fail and retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // We don\'t need them any more\n //\n retract($aainqf199ResponseWrapper);\n retract($aainqf199RequestWrapper); \n //\n // check the actor of this closed loop\n //\n switch ($params.getActor()) {\n case \"APPC\":\n {\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n // Hardcode genericVNF for now since AAI has not been ready for vFirewall demo case\n //\n String genericVNF = \"zdfw1fwl01pgn02\";\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n }\n break;\n case \"MSO\":\n {\n //\n // Construct an operation\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"createModuleInstance\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // Construct an MSO request\n //\n MSORequest request = new MSORequest();\n request.requestDetails = new MSORequestDetails();\n request.requestDetails.modelInfo = new MSOModelInfo();\n request.requestDetails.cloudConfiguration = new MSOCloudConfiguration();\n request.requestDetails.requestInfo = new MSORequestInfo();\n request.requestDetails.requestParameters = new MSORequestParameters();\n request.requestDetails.requestParameters.userParams = null;\n //\n // cloudConfiguration\n //\n request.requestDetails.cloudConfiguration.lcpCloudRegionId = cloudRegionItemCloudRegionId;\n request.requestDetails.cloudConfiguration.tenantId = tenantItemTenantId;\n //\n // modelInfo\n //\n request.requestDetails.modelInfo.modelType = \"vfModule\";\n request.requestDetails.modelInfo.modelInvariantId = vfModuleItemPersonaModelId;\n request.requestDetails.modelInfo.modelNameVersionId = vfModuleItemModelNameVersionId;\n request.requestDetails.modelInfo.modelName = vfModuleItemModelName;\n request.requestDetails.modelInfo.modelVersion = vfModuleItemPersonaModelVersion;\n //\n // requestInfo\n //\n request.requestDetails.requestInfo.instanceName = vfModuleItemVfModuleName;\n request.requestDetails.requestInfo.source = \"POLICY\";\n request.requestDetails.requestInfo.suppressRollback = false;\n //\n // relatedInstanceList\n //\n MSORelatedInstanceListElement relatedInstanceListElement1 = new MSORelatedInstanceListElement();\n MSORelatedInstanceListElement relatedInstanceListElement2 = new MSORelatedInstanceListElement();\n relatedInstanceListElement1.relatedInstance = new MSORelatedInstance();\n relatedInstanceListElement2.relatedInstance = new MSORelatedInstance();\n //\n relatedInstanceListElement1.relatedInstance.instanceId = serviceItemServiceInstanceId;\n relatedInstanceListElement1.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement1.relatedInstance.modelInfo.modelType = \"service\";\n relatedInstanceListElement1.relatedInstance.modelInfo.modelInvariantId = serviceItemPersonaModelId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelNameVersionId = serviceItemModelNameVersionId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelName = serviceItemModelName;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelVersion = serviceItemModelVersion;\n //\n relatedInstanceListElement2.relatedInstance.instanceId = vnfItemVnfId;\n relatedInstanceListElement2.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement2.relatedInstance.modelInfo.modelType = \"vnf\";\n relatedInstanceListElement2.relatedInstance.modelInfo.modelInvariantId = vnfItemPersonaModelId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelNameVersionId = vnfItemModelNameVersionId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelName = vnfItemModelName;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelVersion = vnfItemModelVersion;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelCustomizationName = vnfItemVnfType;\n // \n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement1);\n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement2);\n //\n // print MSO request for debug\n //\n System.out.println(\"MSO request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n //\n //\n //\n if (request != null) {\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Concatenate serviceItemServiceInstanceId and vnfItemVnfId to msoURL\n //\n String MSOUrl = $params.getMsoURL() + \"/serviceInstances/v2/\" + serviceItemServiceInstanceId + \"/vnfs/\" + vnfItemVnfId + \"/vfModules\";\n //\n // Call MSO\n //\n MSOResponse response = MSOManager.createModuleInstance(MSOUrl, $params.getMsoURL(), $params.getMsoUsername(), $params.getMsoPassword(), request);\n //\n if (response != null) {\n //\n // Assign requestId\n //\n request.requestId = $event.requestID.toString(); \n response.request.requestId = $event.requestID.toString();\n //\n // Insert facts\n //\n insert(operationWrapper);\n insert(request);\n insert(response);\n } else {\n //\n // MSO request not even accepted\n //\n notification.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n notification.history.add(operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($event);\n retract($manager);\n }\n } else {\n System.err.println(\"constructed MSO request is invalid.\");\n }\n }\n break; \n } \nend\n \n/*\n*\n* This rule responds to APPC Response Events\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.APPC.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : Request( getCommonHeader().RequestID == $event.requestID )\n $response : Response( getCommonHeader().RequestID == $event.requestID ) \n then\n System.out.println(\"rule APPC.RESPONSE is triggered.\");\n if ($response.Status == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n } \n //\n // Get the Response Code\n //\n ResponseCode code = ResponseCode.toResponseCode($response.Status.Code);\n if (code == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n }\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // Ok, let\'s figure out what APP-C\'s response is\n //\n switch (code) {\n case ACCEPT:\n $operationWrapper.operation.outcome = \"PROCESSING\";\n break;\n case ERROR:\n case REJECT:\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n break;\n case SUCCESS:\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n break;\n case FAILURE:\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n break;\n }\n if ($operationWrapper.operation.outcome.equals(\"SUCCESS\")) {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else if ($operationWrapper.operation.outcome.equals(\"PROCESSING\")) {\n retract($response);\n } else {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \n\n/*\n*\n* This rule is used to clean up APPC response\n*\n*/ \nrule \"BRMSParamvFWDemoPolicy.APPC.RESPONSE.CLEANUP\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $response : Response($id : getCommonHeader().RequestID )\n not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) \n then\n System.out.println(\"rule APPC.RESPONSE.CLEANUP is triggered.\");\n retract($response);\nend\n\n/*\n*\n* This rule responds to MSO Response Events\n*\n*/\nrule \"BRMSParamvFWDemoPolicy.MSO.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : MSORequest( requestId == $event.requestID.toString() )\n $response : MSOResponse( request.requestId == $event.requestID.toString() ) \n then\n System.out.println(\"rule MSO.RESPONSE is triggered.\");\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // The operation can either be succeeded or failed\n // \n if($response.request.requestStatus.requestState.equals(\"COMPLETE\")) {\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else {\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \nrule \"Params\" \n salience 1000 \n when\n then\n Params params = new Params();\n params.setAaiPatternMatch(1);\n params.setAppcTopic(\"APPC-CL\");\n params.setAaiURL(\"null\");\n params.setMsoPassword(\"null\");\n params.setClosedLoopControlName(\"CL-FRWL-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\");\n params.setMsoURL(\"null\");\n params.setAaiUsername(\"null\");\n params.setActor(\"APPC\");\n params.setMsoUsername(\"null\");\n params.setAaiNamedQueryUUID(\"null\");\n params.setAaiPassword(\"null\");\n params.setNotificationTopic(\"POLICY-CL-MGT\");\n insert(params);\nend\r\n','OTHER','com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt','doACPolicyPut','2017-03-14 19:58:19',0,'','doACPolicyPut','2017-03-14 19:58:19',1),(3203,'/* Autogenerated Code Please Don\'t change/remove this comment section. This is for the UI purpose. \n <$%BRMSParamTemplate=ControlLoopDemo__closedLoopControlName%$> \n */ \n\r\n\r\n/*-\n * ============LICENSE_START=======================================================\n * archetype-closed-loop-demo-rules\n * ================================================================================\n * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\n * ================================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * \n * http://www.apache.org/licenses/LICENSE-2.0\n * \n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============LICENSE_END=========================================================\n */\n\npackage org.openecomp.policy.controlloop;\n\nimport java.util.List;\nimport java.util.LinkedList;\nimport java.util.Map;\nimport java.util.HashMap;\nimport java.util.UUID;\n\nimport org.openecomp.policy.controlloop.VirtualControlLoopEvent;\nimport org.openecomp.policy.controlloop.ControlLoopEventStatus;\nimport org.openecomp.policy.controlloop.VirtualControlLoopNotification;\nimport org.openecomp.policy.controlloop.ControlLoopNotificationType;\nimport org.openecomp.policy.controlloop.ControlLoopOperation;\nimport org.openecomp.policy.controlloop.ControlLoopOperationWrapper;\nimport org.openecomp.policy.template.demo.ControlLoopException;\n\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199CloudRegion;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperties;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperty;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199GenericVNF;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InstanceFilters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItem;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItems;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Manager;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199NamedQuery;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199QueryParameters;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Request;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199RequestWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Response;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ResponseWrapper;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199ServiceInstance;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199Tenant;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VfModule;\nimport org.openecomp.policy.aai.AAINQF199.AAINQF199VServer;\nimport org.openecomp.policy.aai.util.Serialization;\n\nimport org.openecomp.policy.appc.CommonHeader;\nimport org.openecomp.policy.appc.Request;\nimport org.openecomp.policy.appc.Response;\nimport org.openecomp.policy.appc.ResponseCode;\nimport org.openecomp.policy.appc.ResponseStatus;\nimport org.openecomp.policy.appc.ResponseValue;\n\nimport org.openecomp.policy.template.demo.EventManager;\nimport org.openecomp.policy.vnf.trafficgenerator.PGRequest;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStream;\nimport org.openecomp.policy.vnf.trafficgenerator.PGStreams;\n\nimport org.openecomp.policy.mso.MSOManager;\nimport org.openecomp.policy.mso.MSORequest;\nimport org.openecomp.policy.mso.MSORequestStatus;\nimport org.openecomp.policy.mso.MSORequestDetails;\nimport org.openecomp.policy.mso.MSOModelInfo;\nimport org.openecomp.policy.mso.MSOCloudConfiguration;\nimport org.openecomp.policy.mso.MSORequestInfo;\nimport org.openecomp.policy.mso.MSORequestParameters;\nimport org.openecomp.policy.mso.MSORelatedInstanceListElement;\nimport org.openecomp.policy.mso.MSORelatedInstance;\nimport org.openecomp.policy.mso.MSOResponse;\n\nimport org.openecomp.policy.drools.system.PolicyEngine;\n\n//\n// These parameters are required to build the runtime policy\n//\ndeclare Params\n closedLoopControlName : String\n actor : String\n aaiURL : String\n aaiUsername : String\n aaiPassword : String\n msoURL : String\n msoUsername : String\n msoPassword : String\n aaiNamedQueryUUID : String\n aaiPatternMatch : int \n notificationTopic : String\n appcTopic : String\nend\n\n/*\n*\n* Called once and only once to insert the parameters into working memory for this Closed Loop policy.\n* (Comment SETUP rule out for the first ECOMP opensource release since policy BRMS_GW already puts a Params fact in there)\n*\n*\n*rule \"BRMSParamvLBDemoPolicy.SETUP\"\n* when\n* then\n* System.out.println(\"rule SETUP is triggered.\");\n* Params params = new Params();\n* params.setClosedLoopControlName(\"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\");\n* params.setActor(\"MSO\");\n* params.setAaiURL(\"https://aai.api.simpledemo.openecomp.org:8443\");\n* params.setAaiUsername(\"POLICY\");\n* params.setAaiPassword(\"POLICY\");\n* params.setMsoURL(\"http://vm1.mso.simpledemo.openecomp.org:8080/ecomp/mso/infra\");\n* params.setMsoUsername(\"InfraPortalClient\");\n* params.setMsoPassword(\"password1$\");\n* params.setAaiNamedQueryUUID(\"f199cb88-5e69-4b1f-93e0-6f257877d066\");\n* params.setAaiPatternMatch(0);\n* params.setNotificationTopic(\"POLICY-CL-MGT\");\n* params.setAppcTopic(\"APPC-CL\");\n* //\n* // This stays in memory as long as the rule is alive and running\n* //\n* insert(params);\n*end\n*/\n/*\n*\n* This rule responds to DCAE Events\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.EVENT\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n not ( EventManager( closedLoopControlName == $event.closedLoopControlName ))\n then\n System.out.println(\"rule EVENT is triggered.\");\n try {\n // \n // Check the requestID in the event to make sure it is not null before we create the EventManager. \n // The EventManager will do extra syntax checking as well check if the closed loop is disabled/\n //\n if ($event.requestID == null) {\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.from = \"policy\";\n notification.message = \"Missing requestID from DCAE event\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n System.out.println(\"Event with requestID=null has been retracted.\");\n } else {\n //\n // Create an EventManager\n //\n EventManager manager = new EventManager($params.getClosedLoopControlName(), $event.requestID, $event.target);\n //\n // Determine if EventManager can actively process the event (i.e. syntax)\n //\n VirtualControlLoopNotification notification = manager.activate($event);\n notification.from = \"policy\"; \n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n // Are we actively pursuing this event?\n //\n if (notification.notification == ControlLoopNotificationType.ACTIVE) {\n //\n // Insert Event Manager into memory, this will now kick off processing.\n //\n insert(manager);\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n } \n } else {\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver notification: \" + notification);\n }\n //\n // Retract it from memory\n //\n retract($event);\n }\n //\n // Now that the manager is inserted into Drools working memory, we\'ll wait for\n // another rule to fire in order to continue processing. This way we can also\n // then screen for additional ONSET and ABATED events for this same RequestIDs \n // and for different RequestIDs but with the same closedLoopControlName and target.\n //\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n //\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract the event\n //\n retract($event);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager\n* is created. We can start the operations for this closed loop.\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.EVENT.MANAGER\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName, controlLoopResult == null)\n then\n System.out.println(\"rule EVENT.MANAGER is triggered.\");\n //\n // Check which event this is.\n //\n EventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event);\n //\n // We only want the initial ONSET event in memory,\n // all the other events need to be retracted to support\n // cleanup and avoid the other rules being fired for this event.\n //\n if (eventStatus != EventManager.NEW_EVENT_STATUS.FIRST_ONSET) {\n System.out.println(\"Retracting \"+eventStatus+\" Event.\");\n retract($event);\n return;\n }\n //\n // Now the event in memory is first onset event\n //\n try {\n //\n // Pull the known AAI field from the Event\n //\n // generic-vnf is needed for vFirewall case\n // vserver-name is needed for vLoadBalancer case\n //\n String genericVNF = $event.AAI.get(\"generic-vnf.vnf-id\");\n String vserver = $event.AAI.get(\"vserver.vserver-name\");\n //\n // Check if we are implementing a simple pattern match.\n //\n if ($params.getAaiPatternMatch() == 1) {\n //\n // Yes\n //\n //Basic naming characteristics:\n //VF Name (9 char)+VM name (13 char total)+VFC (19 char total)\n //Example: \n //VF Name (9 characters): cscf0001v\n //VM Name(13 characters): cscf0001vm001\n //VFC name(19 characters): cscf0001vm001cfg001\n //\n // zdfw1fwl01fwl02 or zdfw1fwl01fwl01 \n // replaced with\n // zdfw1fwl01pgn02 or zdfw1fwl01pgn01\n //\n int index = genericVNF.lastIndexOf(\"fwl\");\n if (index == -1) {\n System.err.println(\"The generic-vnf.vnf-id from DCAE Event is not valid.\");\n } else {\n genericVNF = genericVNF.substring(0, index) + \"pgn\" + genericVNF.substring(index+\"fwl\".length());\n }\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n //\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n //\n } else {\n //\n // create AAI named-query request with UUID started with \"F199\"\n //\n AAINQF199Request aainqf199request = new AAINQF199Request();\n AAINQF199QueryParameters aainqf199queryparam = new AAINQF199QueryParameters();\n AAINQF199NamedQuery aainqf199namedquery = new AAINQF199NamedQuery();\n AAINQF199InstanceFilters aainqf199instancefilter = new AAINQF199InstanceFilters();\n //\n // queryParameters\n //\n aainqf199namedquery.namedQueryUUID = UUID.fromString($params.getAaiNamedQueryUUID()); \n aainqf199queryparam.namedQuery = aainqf199namedquery;\n aainqf199request.queryParameters = aainqf199queryparam;\n //\n // instanceFilters\n //\n Map aainqf199instancefiltermap = new HashMap();\n Map aainqf199instancefiltermapitem = new HashMap();\n aainqf199instancefiltermapitem.put(\"vserver-name\", vserver); \n aainqf199instancefiltermap.put(\"vserver\", aainqf199instancefiltermapitem);\n aainqf199instancefilter.instanceFilter.add(aainqf199instancefiltermap);\n aainqf199request.instanceFilters = aainqf199instancefilter;\n //\n // print aainqf199request for debug\n //\n System.out.println(\"AAI Request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(aainqf199request));\n //\n // Create AAINQF199RequestWrapper\n //\n AAINQF199RequestWrapper aainqf199RequestWrapper = new AAINQF199RequestWrapper($event.requestID, aainqf199request);\n //\n // insert aainqf199request into memory\n //\n insert(aainqf199RequestWrapper);\n }\n //\n } catch (Exception e) {\n e.printStackTrace();\n }\nend\n\n/*\n*\n* This rule happens when we got a valid ONSET, closed loop is enabled, an Event Manager\n* is created, AAI Manager and AAI Request are ready in memory. We can start sending query to AAI and then wait for response.\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.EVENT.MANAGER.AAINQF199REQUEST\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199REQUEST is triggered.\");\n //\n // send the request\n //\n AAINQF199Response aainqf199response = AAINQF199Manager.postQuery($params.getAaiURL(), $params.getAaiUsername(), $params.getAaiPassword(),\n $aainqf199RequestWrapper.aainqf199request, $event.requestID);\n //\n // Check AAI response\n //\n if (aainqf199response == null) {\n System.err.println(\"Failed to get AAI response\");\n //\n // Fail and retract everything\n //\n retract($event);\n retract($manager);\n retract($aainqf199RequestWrapper);\n } else {\n //\n // Create AAINQF199ResponseWrapper\n //\n AAINQF199ResponseWrapper aainqf199ResponseWrapper = new AAINQF199ResponseWrapper($event.requestID, aainqf199response);\n //\n // insert aainqf199ResponseWrapper to memeory\n //\n insert(aainqf199ResponseWrapper);\n }\nend\n\n/*\n*\n* This rule happens when we got a valid AAI response. We can start sending request to APPC or MSO now.\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.EVENT.MANAGER.AAINQF199RESPONSE\"\n when \n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)\n $aainqf199ResponseWrapper : AAINQF199ResponseWrapper(requestID == $event.requestID)\n then\n System.out.println(\"rule EVENT.MANAGER.AAINQF199RESPONSE is triggered.\");\n //\n // Extract related fields out of AAINQF199RESPONSE\n //\n String vnfItemVnfId, vnfItemVnfType, vnfItemPersonaModelId, vnfItemPersonaModelVersion, vnfItemModelName, \n vnfItemModelVersion, vnfItemModelNameVersionId, serviceItemServiceInstanceId, serviceItemPersonaModelId,\n serviceItemModelName, serviceItemModelType, serviceItemModelVersion, serviceItemModelNameVersionId,\n vfModuleItemVfModuleName, vfModuleItemPersonaModelId, vfModuleItemPersonaModelVersion, vfModuleItemModelName, \n vfModuleItemModelNameVersionId, tenantItemTenantId, cloudRegionItemCloudRegionId;\n try {\n //\n // vnfItem\n //\n vnfItemVnfId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfID;\n vnfItemVnfType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfType;\n vnfItemVnfType = vnfItemVnfType.substring(vnfItemVnfType.lastIndexOf(\"/\")+1);\n vnfItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelId;\n vnfItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelVersion;\n vnfItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n vnfItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(2).propertyValue;\n vnfItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // serviceItem\n //\n serviceItemServiceInstanceId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.serviceInstanceID;\n serviceItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelId;\n serviceItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;\n serviceItemModelType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(1).propertyValue;\n serviceItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelVersion;\n serviceItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;\n //\n // Find the index for base vf module and non-base vf module\n //\n int baseIndex = -1;\n int nonBaseIndex = -1;\n List inventoryItems = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems;\n for (AAINQF199InventoryResponseItem m : inventoryItems) {\n if (m.vfModule != null && m.vfModule.isBaseVfModule == true) {\n baseIndex = inventoryItems.indexOf(m);\n } else if (m.vfModule != null && m.vfModule.isBaseVfModule == false && m.vfModule.orchestrationStatus == null) {\n nonBaseIndex = inventoryItems.indexOf(m);\n }\n //\n if (baseIndex != -1 && nonBaseIndex != -1) {\n break;\n }\n }\n //\n // Report the error if either base vf module or non-base vf module is not found\n //\n if (baseIndex == -1 || nonBaseIndex == -1) {\n System.err.println(\"Either base or non-base vf module is not found from AAI response.\");\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // This comes from the base module\n //\n vfModuleItemVfModuleName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(baseIndex).vfModule.vfModuleName;\n vfModuleItemVfModuleName = vfModuleItemVfModuleName.replace(\"Vfmodule\", \"vDNS\");\n //\n // vfModuleItem - NOT the base module\n //\n vfModuleItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelId;\n vfModuleItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelVersion;\n vfModuleItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(0).propertyValue;\n vfModuleItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(4).propertyValue;\n //\n // tenantItem\n //\n tenantItemTenantId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).tenant.tenantId;\n //\n // cloudRegionItem\n //\n cloudRegionItemCloudRegionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).items.inventoryResponseItems.get(0).cloudRegion.cloudRegionId;\n //\n } catch (Exception e) {\n e.printStackTrace();\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.REJECTED;\n notification.message = \"Exception occurred \" + e.getMessage();\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n notification.message = \"Invalid named-query response from AAI\";\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e1) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e1.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n } \n //\n // Extracted fields should not be null\n //\n if ((vnfItemVnfId == null) || (vnfItemVnfType == null) ||\n (vnfItemPersonaModelId == null) || (vnfItemModelName == null) ||\n (vnfItemModelVersion == null) || (vnfItemModelNameVersionId == null) ||\n (serviceItemServiceInstanceId == null) || (serviceItemModelName == null) ||\n (serviceItemModelType == null) || (serviceItemModelVersion == null) ||\n (serviceItemModelNameVersionId == null) || (vfModuleItemVfModuleName == null) ||\n (vfModuleItemPersonaModelId == null) || (vfModuleItemPersonaModelVersion == null) ||\n (vfModuleItemModelName == null) || (vfModuleItemModelNameVersionId == null) ||\n (tenantItemTenantId == null) || (cloudRegionItemCloudRegionId == null)) {\n //\n System.err.println(\"some fields are missing from AAI response.\");\n //\n // Fail and retract everything\n //\n retract($aainqf199RequestWrapper);\n retract($aainqf199ResponseWrapper);\n retract($manager);\n retract($event);\n return;\n }\n //\n // We don\'t need them any more\n //\n retract($aainqf199ResponseWrapper);\n retract($aainqf199RequestWrapper); \n //\n // check the actor of this closed loop\n //\n switch ($params.getActor()) {\n case \"APPC\":\n {\n //\n // Construct an APPC request\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"ModifyConfig\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // insert operationWrapper into memory\n //\n insert(operationWrapper);\n //\n Request request = new Request();\n request.CommonHeader = new CommonHeader();\n request.CommonHeader.RequestID = $event.requestID;\n request.Action = operation.operation;\n request.Payload = new HashMap();\n //\n // Fill in the payload\n // Hardcode genericVNF for now since AAI has not been ready for vFirewall demo case\n //\n String genericVNF = \"zdfw1fwl01pgn02\";\n request.Payload.put(\"generic-vnf.vnf-id\", genericVNF);\n //\n PGRequest pgRequest = new PGRequest();\n pgRequest.pgStreams = new PGStreams();\n \n PGStream pgStream;\n for(int i = 0; i < 5; i++){\n pgStream = new PGStream();\n pgStream.streamId = \"fw_udp\"+(i+1);\n pgStream.isEnabled = \"true\";\n pgRequest.pgStreams.pgStream.add(pgStream);\n }\n request.Payload.put(\"pg-streams\", pgRequest.pgStreams);\n \n if (request != null) {\n //\n // Insert request into memory\n //\n insert(request);\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n // message and history ??\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Now send the operation request\n //\n if (request instanceof Request) {\n try {\n System.out.println(\"APPC request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n PolicyEngine.manager.deliver($params.getAppcTopic(), request);\n } catch (Exception e) {\n e.printStackTrace();\n System.out.println(\"Can\'t deliver request: \" + request);\n }\n }\n } else {\n //\n // what happens if it is null\n //\n }\n }\n break;\n case \"MSO\":\n {\n //\n // Construct an operation\n //\n ControlLoopOperation operation = new ControlLoopOperation();\n operation.actor = $params.getActor();\n operation.operation = \"createModuleInstance\";\n operation.target = $event.target;\n //\n // Create operationWrapper\n //\n ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);\n //\n // Construct an MSO request\n //\n MSORequest request = new MSORequest();\n request.requestDetails = new MSORequestDetails();\n request.requestDetails.modelInfo = new MSOModelInfo();\n request.requestDetails.cloudConfiguration = new MSOCloudConfiguration();\n request.requestDetails.requestInfo = new MSORequestInfo();\n request.requestDetails.requestParameters = new MSORequestParameters();\n request.requestDetails.requestParameters.userParams = null;\n //\n // cloudConfiguration\n //\n request.requestDetails.cloudConfiguration.lcpCloudRegionId = cloudRegionItemCloudRegionId;\n request.requestDetails.cloudConfiguration.tenantId = tenantItemTenantId;\n //\n // modelInfo\n //\n request.requestDetails.modelInfo.modelType = \"vfModule\";\n request.requestDetails.modelInfo.modelInvariantId = vfModuleItemPersonaModelId;\n request.requestDetails.modelInfo.modelNameVersionId = vfModuleItemModelNameVersionId;\n request.requestDetails.modelInfo.modelName = vfModuleItemModelName;\n request.requestDetails.modelInfo.modelVersion = vfModuleItemPersonaModelVersion;\n //\n // requestInfo\n //\n request.requestDetails.requestInfo.instanceName = vfModuleItemVfModuleName;\n request.requestDetails.requestInfo.source = \"POLICY\";\n request.requestDetails.requestInfo.suppressRollback = false;\n //\n // relatedInstanceList\n //\n MSORelatedInstanceListElement relatedInstanceListElement1 = new MSORelatedInstanceListElement();\n MSORelatedInstanceListElement relatedInstanceListElement2 = new MSORelatedInstanceListElement();\n relatedInstanceListElement1.relatedInstance = new MSORelatedInstance();\n relatedInstanceListElement2.relatedInstance = new MSORelatedInstance();\n //\n relatedInstanceListElement1.relatedInstance.instanceId = serviceItemServiceInstanceId;\n relatedInstanceListElement1.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement1.relatedInstance.modelInfo.modelType = \"service\";\n relatedInstanceListElement1.relatedInstance.modelInfo.modelInvariantId = serviceItemPersonaModelId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelNameVersionId = serviceItemModelNameVersionId;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelName = serviceItemModelName;\n relatedInstanceListElement1.relatedInstance.modelInfo.modelVersion = serviceItemModelVersion;\n //\n relatedInstanceListElement2.relatedInstance.instanceId = vnfItemVnfId;\n relatedInstanceListElement2.relatedInstance.modelInfo = new MSOModelInfo();\n relatedInstanceListElement2.relatedInstance.modelInfo.modelType = \"vnf\";\n relatedInstanceListElement2.relatedInstance.modelInfo.modelInvariantId = vnfItemPersonaModelId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelNameVersionId = vnfItemModelNameVersionId;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelName = vnfItemModelName;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelVersion = vnfItemModelVersion;\n relatedInstanceListElement2.relatedInstance.modelInfo.modelCustomizationName = vnfItemVnfType;\n // \n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement1);\n request.requestDetails.relatedInstanceList.add(relatedInstanceListElement2);\n //\n // print MSO request for debug\n //\n System.out.println(\"MSO request sent:\");\n System.out.println(Serialization.gsonPretty.toJson(request));\n //\n //\n //\n if (request != null) {\n //\n // Tell interested parties we are performing this Operation\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.notification = ControlLoopNotificationType.OPERATION;\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Concatenate serviceItemServiceInstanceId and vnfItemVnfId to msoURL\n //\n String MSOUrl = $params.getMsoURL() + \"/serviceInstances/v2/\" + serviceItemServiceInstanceId + \"/vnfs/\" + vnfItemVnfId + \"/vfModules\";\n //\n // Call MSO\n //\n MSOResponse response = MSOManager.createModuleInstance(MSOUrl, $params.getMsoURL(), $params.getMsoUsername(), $params.getMsoPassword(), request);\n //\n if (response != null) {\n //\n // Assign requestId\n //\n request.requestId = $event.requestID.toString(); \n response.request.requestId = $event.requestID.toString();\n //\n // Insert facts\n //\n insert(operationWrapper);\n insert(request);\n insert(response);\n } else {\n //\n // MSO request not even accepted\n //\n notification.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.message = operationWrapper.operation.toMessage();\n operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n notification.history.add(operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // Retract everything\n //\n retract($event);\n retract($manager);\n }\n } else {\n System.err.println(\"constructed MSO request is invalid.\");\n }\n }\n break; \n } \nend\n \n/*\n*\n* This rule responds to APPC Response Events\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.APPC.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : Request( getCommonHeader().RequestID == $event.requestID )\n $response : Response( getCommonHeader().RequestID == $event.requestID ) \n then\n System.out.println(\"rule APPC.RESPONSE is triggered.\");\n if ($response.Status == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n } \n //\n // Get the Response Code\n //\n ResponseCode code = ResponseCode.toResponseCode($response.Status.Code);\n if (code == null) {\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n }\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // Ok, let\'s figure out what APP-C\'s response is\n //\n switch (code) {\n case ACCEPT:\n $operationWrapper.operation.outcome = \"PROCESSING\";\n break;\n case ERROR:\n case REJECT:\n $operationWrapper.operation.outcome = \"FAILURE_EXCEPTION\";\n $manager.setControlLoopResult(\"FAILURE_EXCEPTION\");\n break;\n case SUCCESS:\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n break;\n case FAILURE:\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n break;\n }\n if ($operationWrapper.operation.outcome.equals(\"SUCCESS\")) {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else if ($operationWrapper.operation.outcome.equals(\"PROCESSING\")) {\n retract($response);\n } else {\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \n\n/*\n*\n* This rule is used to clean up APPC response\n*\n*/ \nrule \"BRMSParamvLBDemoPolicy.APPC.RESPONSE.CLEANUP\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $response : Response($id : getCommonHeader().RequestID )\n not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) \n then\n System.out.println(\"rule APPC.RESPONSE.CLEANUP is triggered.\");\n retract($response);\nend\n\n/*\n*\n* This rule responds to MSO Response Events\n*\n*/\nrule \"BRMSParamvLBDemoPolicy.MSO.RESPONSE\"\n when\n $params : Params( getClosedLoopControlName() == \"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\" )\n $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )\n $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )\n $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )\n $request : MSORequest( requestId == $event.requestID.toString() )\n $response : MSOResponse( request.requestId == $event.requestID.toString() ) \n then\n System.out.println(\"rule MSO.RESPONSE is triggered.\");\n //\n // Construct notification\n //\n VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);\n notification.from = \"policy\";\n notification.policyName = drools.getRule().getName();\n notification.policyScope = \"com\";\n notification.policyVersion = \"1\";\n notification.message = $operationWrapper.operation.toMessage();\n $operationWrapper.operation.message = $operationWrapper.operation.toMessage();\n //\n // The operation can either be succeeded or failed\n // \n if($response.request.requestStatus.requestState.equals(\"COMPLETE\")) {\n $operationWrapper.operation.outcome = \"SUCCESS\";\n $manager.setControlLoopResult(\"SUCCESS\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n } else {\n $operationWrapper.operation.outcome = \"FAILURE\";\n $manager.setControlLoopResult(\"FAILURE\");\n notification.history.add($operationWrapper.operation);\n notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n notification.notification = ControlLoopNotificationType.FINAL_FAILURE;\n //\n // Let interested parties know\n //\n try {\n System.out.println(Serialization.gsonPretty.toJson(notification));\n PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);\n } catch (Exception e) {\n System.out.println(\"Can\'t deliver notification: \" + notification);\n e.printStackTrace();\n }\n //\n // We are going to retract these objects from memory\n //\n System.out.println(\"Retracting everything\");\n retract($operationWrapper);\n retract($request);\n retract($response);\n retract($event);\n retract($manager);\n }\n \nend \nrule \"Params\" \n salience 1000 \n when\n then\n Params params = new Params();\n params.setAaiPatternMatch(0);\n params.setAppcTopic(\"APPC-CL\");\n params.setAaiURL(\"https://aai.api.simpledemo.openecomp.org:8443\");\n params.setMsoPassword(\"password1$\");\n params.setClosedLoopControlName(\"CL-DNS-LOW-TRAFFIC-SIG-d925ed73-8231-4d02-9545-db4e101f88f8\");\n params.setAaiUsername(\"POLICY\");\n params.setMsoURL(\"http://vm1.mso.simpledemo.openecomp.org:8080/ecomp/mso/infra\");\n params.setActor(\"MSO\");\n params.setMsoUsername(\"InfraPortalClient\");\n params.setAaiNamedQueryUUID(\"f199cb88-5e69-4b1f-93e0-6f257877d066\");\n params.setAaiPassword(\"POLICY\");\n params.setNotificationTopic(\"POLICY-CL-MGT\");\n insert(params);\nend\r\n','OTHER','com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt','doACPolicyPut','2017-03-14 20:00:56',0,'','doACPolicyPut','2017-03-14 20:00:56',1); + +INSERT INTO `policyentity` VALUES (3202,'doACPolicyPut','2017-03-14 19:58:19',0,'BRMSParam vFW Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:','doACPolicyPut','2017-03-14 19:58:19','\n\n BRMSParam vFW Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:\n \n \n \n \n com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml\n \n \n \n \n \n DROOLS\n \n \n \n BRMS_PARAM_RULE\n \n \n \n SampleRiskType\n \n \n \n 1\n \n \n \n False\n \n \n \n NA\n \n \n \n \n \n \n \n \n \n \n ACCESS\n \n \n \n Config\n \n \n \n \n \n \n \n \n Configuration\n \n \n $URL/Config/com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt\n \n \n com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml\n \n \n 1\n \n \n DROOLS\n \n \n BRMS_PARAM_RULE\n \n \n vFW\n \n \n SampleRiskType\n \n \n 1\n \n \n False\n \n \n NA\n \n \n \n \n\n','Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml',0,'com',1,NULL,3201),(3204,'doACPolicyPut','2017-03-14 20:00:56',0,'BRMSParam vLB Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:','doACPolicyPut','2017-03-14 20:00:56','\n\n BRMSParam vLB Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy:\n \n \n \n \n com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml\n \n \n \n \n \n DROOLS\n \n \n \n BRMS_PARAM_RULE\n \n \n \n SampleRiskType\n \n \n \n 1\n \n \n \n False\n \n \n \n NA\n \n \n \n \n \n \n \n \n \n \n ACCESS\n \n \n \n Config\n \n \n \n \n \n \n \n \n Configuration\n \n \n $URL/Config/com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt\n \n \n com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml\n \n \n 1\n \n \n DROOLS\n \n \n BRMS_PARAM_RULE\n \n \n vDNS\n \n \n SampleRiskType\n \n \n 1\n \n \n False\n \n \n NA\n \n \n \n \n\n','Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml',0,'com',1,NULL,3203); INSERT INTO `policyversion` VALUES (1,'com/Config_BRMS_Param_BRMSParamvFWDemoPolicy',1,1,'2017-03-03 17:16:37','demo','2017-03-03 17:16:37','demo'),(2,'com/Config_BRMS_Param_BRMSParamvLBDemoPolicy',1,1,'2017-03-03 17:20:03','demo','2017-03-03 17:20:03','demo'); diff --git a/packages/base/src/files/install/servers/brmsgw/config.properties b/packages/base/src/files/install/servers/brmsgw/config.properties index f46a27840..96bfa682e 100644 --- a/packages/base/src/files/install/servers/brmsgw/config.properties +++ b/packages/base/src/files/install/servers/brmsgw/config.properties @@ -82,6 +82,6 @@ test_via_jmx=${{test_via_jmx}} ping_interval=30000 -brms.dependency.version=1.0.0-SNAPSHOT +brms.dependency.version=1.1.0-SNAPSHOT CLIENT_FILE=client.properties diff --git a/packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml b/packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml old mode 100644 new mode 100755 index a21ed006f..1e8b6cf48 --- a/packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml +++ b/packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.xml @@ -1,6 +1,6 @@ - - BRMSParamvFWDemoPolicy@CreatedBy:demo@CreatedBy:@ModifiedBy:demo@ModifiedBy: + + BRMSParam vFW Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy: @@ -37,7 +37,7 @@ - + diff --git a/packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml b/packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml old mode 100644 new mode 100755 index 46b968298..86defdf44 --- a/packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml +++ b/packages/base/src/files/install/servers/console/bin/workspace/admin/repository/com/Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.xml @@ -1,6 +1,6 @@ - - vLB Demo Policy@CreatedBy:demo@CreatedBy:@ModifiedBy:demo@ModifiedBy: + + BRMSParam vLB Demo Policy@CreatedBy:@CreatedBy:@ModifiedBy:@ModifiedBy: @@ -37,7 +37,7 @@ - + diff --git a/packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt b/packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt old mode 100644 new mode 100755 index 102c293e9..25b53d0ca --- a/packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt +++ b/packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvFWDemoPolicy.1.txt @@ -1051,7 +1051,7 @@ rule "BRMSParamvFWDemoPolicy.MSO.RESPONSE" // // The operation can either be succeeded or failed // - if($response.request.requestStatus.requestState.equals("Completed")) { + if($response.request.requestStatus.requestState.equals("COMPLETE")) { $operationWrapper.operation.outcome = "SUCCESS"; $manager.setControlLoopResult("SUCCESS"); notification.history.add($operationWrapper.operation); diff --git a/packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt b/packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt old mode 100644 new mode 100755 index 25de49320..e640d007d --- a/packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt +++ b/packages/base/src/files/install/servers/pap/webapps/Config/com.Config_BRMS_Param_BRMSParamvLBDemoPolicy.1.txt @@ -1051,7 +1051,7 @@ rule "BRMSParamvLBDemoPolicy.MSO.RESPONSE" // // The operation can either be succeeded or failed // - if($response.request.requestStatus.requestState.equals("Completed")) { + if($response.request.requestStatus.requestState.equals("COMPLETE")) { $operationWrapper.operation.outcome = "SUCCESS"; $manager.setControlLoopResult("SUCCESS"); notification.history.add($operationWrapper.operation); -- cgit 1.2.3-korg