| /*- |
| * ============LICENSE_START======================================================= |
| * archetype-closed-loop-demo-rules |
| * ================================================================================ |
| * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. |
| * ================================================================================ |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * ============LICENSE_END========================================================= |
| */ |
| |
| package org.onap.policy.controlloop; |
| |
| import java.util.List; |
| import java.util.LinkedList; |
| import java.util.Map; |
| import java.util.HashMap; |
| import java.util.UUID; |
| |
| import org.onap.policy.controlloop.VirtualControlLoopEvent; |
| import org.onap.policy.controlloop.ControlLoopEventStatus; |
| import org.onap.policy.controlloop.VirtualControlLoopNotification; |
| import org.onap.policy.controlloop.ControlLoopNotificationType; |
| import org.onap.policy.controlloop.ControlLoopOperation; |
| import org.onap.policy.controlloop.ControlLoopOperationWrapper; |
| import org.onap.policy.template.demo.ControlLoopException; |
| |
| import org.onap.policy.aai.AAINQF199.AAINQF199CloudRegion; |
| import org.onap.policy.aai.AAINQF199.AAINQF199ExtraProperties; |
| import org.onap.policy.aai.AAINQF199.AAINQF199ExtraProperty; |
| import org.onap.policy.aai.AAINQF199.AAINQF199GenericVNF; |
| import org.onap.policy.aai.AAINQF199.AAINQF199InstanceFilters; |
| import org.onap.policy.aai.AAINQF199.AAINQF199InventoryResponseItem; |
| import org.onap.policy.aai.AAINQF199.AAINQF199InventoryResponseItems; |
| import org.onap.policy.aai.AAINQF199.AAINQF199Manager; |
| import org.onap.policy.aai.AAINQF199.AAINQF199NamedQuery; |
| import org.onap.policy.aai.AAINQF199.AAINQF199QueryParameters; |
| import org.onap.policy.aai.AAINQF199.AAINQF199Request; |
| import org.onap.policy.aai.AAINQF199.AAINQF199RequestWrapper; |
| import org.onap.policy.aai.AAINQF199.AAINQF199Response; |
| import org.onap.policy.aai.AAINQF199.AAINQF199ResponseWrapper; |
| import org.onap.policy.aai.AAINQF199.AAINQF199ServiceInstance; |
| import org.onap.policy.aai.AAINQF199.AAINQF199Tenant; |
| import org.onap.policy.aai.AAINQF199.AAINQF199VfModule; |
| import org.onap.policy.aai.AAINQF199.AAINQF199VServer; |
| import org.onap.policy.aai.util.Serialization; |
| |
| import org.onap.policy.appc.CommonHeader; |
| import org.onap.policy.appc.Request; |
| import org.onap.policy.appc.Response; |
| import org.onap.policy.appc.ResponseCode; |
| import org.onap.policy.appc.ResponseStatus; |
| import org.onap.policy.appc.ResponseValue; |
| |
| import org.onap.policy.template.demo.EventManager; |
| import org.onap.policy.vnf.trafficgenerator.PGRequest; |
| import org.onap.policy.vnf.trafficgenerator.PGStream; |
| import org.onap.policy.vnf.trafficgenerator.PGStreams; |
| |
| import org.onap.policy.mso.MSOManager; |
| import org.onap.policy.mso.MSORequest; |
| import org.onap.policy.mso.MSORequestStatus; |
| import org.onap.policy.mso.MSORequestDetails; |
| import org.onap.policy.mso.MSOModelInfo; |
| import org.onap.policy.mso.MSOCloudConfiguration; |
| import org.onap.policy.mso.MSORequestInfo; |
| import org.onap.policy.mso.MSORequestParameters; |
| import org.onap.policy.mso.MSORelatedInstanceListElement; |
| import org.onap.policy.mso.MSORelatedInstance; |
| import org.onap.policy.mso.MSOResponse; |
| |
| import org.onap.policy.drools.system.PolicyEngine; |
| |
| // |
| // These parameters are required to build the runtime policy |
| // |
| declare PapParams |
| closedLoopControlName : String |
| actor : String |
| aaiURL : String |
| aaiUsername : String |
| aaiPassword : String |
| msoURL : String |
| msoUsername : String |
| msoPassword : String |
| aaiNamedQueryUUID : String |
| aaiPatternMatch : int |
| notificationTopic : String |
| appcTopic : String |
| end |
| |
| /* |
| * |
| * Called once and only once to insert the parameters into working memory for this Closed Loop policy. |
| * (Comment SETUP rule out for the first ONAP opensource release since policy BRMS_GW already puts a Params fact in there) |
| * |
| * |
| *rule "${policyName}.SETUP" |
| * when |
| * then |
| * System.out.println("rule SETUP is triggered."); |
| * Params params = new Params(); |
| * params.setClosedLoopControlName("${closedLoopControlName}"); |
| * params.setActor("${actor}"); |
| * params.setAaiURL("${aaiURL}"); |
| * params.setAaiUsername("${aaiUsername}"); |
| * params.setAaiPassword("${aaiPassword}"); |
| * params.setMsoURL("${msoURL}"); |
| * params.setMsoUsername("${msoUsername}"); |
| * params.setMsoPassword("${msoPassword}"); |
| * params.setAaiNamedQueryUUID("${aaiNamedQueryUUID}"); |
| * params.setAaiPatternMatch(${aaiPatternMatch}); |
| * params.setNotificationTopic("${notificationTopic}"); |
| * params.setAppcTopic("${appcTopic}"); |
| * // |
| * // This stays in memory as long as the rule is alive and running |
| * // |
| * insert(params); |
| *end |
| */ |
| /* |
| * |
| * This rule responds to DCAE Events |
| * |
| */ |
| rule "${policyName}.EVENT" |
| when |
| $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) |
| $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) |
| not ( EventManager( closedLoopControlName == $event.closedLoopControlName )) |
| then |
| System.out.println("rule EVENT is triggered."); |
| try { |
| // |
| // Check the requestID in the event to make sure it is not null before we create the EventManager. |
| // The EventManager will do extra syntax checking as well check if the closed loop is disabled/ |
| // |
| if ($event.requestID == null) { |
| VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); |
| notification.notification = ControlLoopNotificationType.REJECTED; |
| notification.from = "policy"; |
| notification.message = "Missing requestID from DCAE event"; |
| notification.policyName = drools.getRule().getName(); |
| notification.policyScope = "${policyScope}"; |
| notification.policyVersion = "${policyVersion}"; |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| System.out.println("Can't deliver notification: " + notification); |
| } |
| // |
| // Retract it from memory |
| // |
| retract($event); |
| System.out.println("Event with requestID=null has been retracted."); |
| } else { |
| // |
| // Create an EventManager |
| // |
| EventManager manager = new EventManager($params.getClosedLoopControlName(), $event.requestID, $event.target); |
| // |
| // Determine if EventManager can actively process the event (i.e. syntax) |
| // |
| VirtualControlLoopNotification notification = manager.activate($event); |
| notification.from = "policy"; |
| notification.policyName = drools.getRule().getName(); |
| notification.policyScope = "${policyScope}"; |
| notification.policyVersion = "${policyVersion}"; |
| // |
| // Are we actively pursuing this event? |
| // |
| if (notification.notification == ControlLoopNotificationType.ACTIVE) { |
| // |
| // Insert Event Manager into memory, this will now kick off processing. |
| // |
| insert(manager); |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| System.out.println("Can't deliver notification: " + notification); |
| } |
| } else { |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| System.out.println("Can't deliver notification: " + notification); |
| } |
| // |
| // Retract it from memory |
| // |
| retract($event); |
| } |
| // |
| // Now that the manager is inserted into Drools working memory, we'll wait for |
| // another rule to fire in order to continue processing. This way we can also |
| // then screen for additional ONSET and ABATED events for this same RequestIDs |
| // and for different RequestIDs but with the same closedLoopControlName and target. |
| // |
| } |
| // |
| } catch (Exception e) { |
| e.printStackTrace(); |
| VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); |
| notification.notification = ControlLoopNotificationType.REJECTED; |
| notification.message = "Exception occurred " + e.getMessage(); |
| notification.policyName = drools.getRule().getName(); |
| notification.policyScope = "${policyScope}"; |
| notification.policyVersion = "${policyVersion}"; |
| // |
| // |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e1) { |
| System.out.println("Can't deliver notification: " + notification); |
| e1.printStackTrace(); |
| } |
| // |
| // Retract the event |
| // |
| retract($event); |
| } |
| end |
| |
| /* |
| * |
| * This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager |
| * is created. We can start the operations for this closed loop. |
| * |
| */ |
| rule "${policyName}.EVENT.MANAGER" |
| when |
| $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) |
| $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) |
| $manager : EventManager( closedLoopControlName == $event.closedLoopControlName, controlLoopResult == null) |
| then |
| System.out.println("rule EVENT.MANAGER is triggered."); |
| // |
| // Check which event this is. |
| // |
| EventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event); |
| // |
| // We only want the initial ONSET event in memory, |
| // all the other events need to be retracted to support |
| // cleanup and avoid the other rules being fired for this event. |
| // |
| if (eventStatus != EventManager.NEW_EVENT_STATUS.FIRST_ONSET) { |
| System.out.println("Retracting "+eventStatus+" Event."); |
| retract($event); |
| return; |
| } |
| // |
| // Now the event in memory is first onset event |
| // |
| try { |
| // |
| // Pull the known AAI field from the Event |
| // |
| // generic-vnf is needed for vFirewall case |
| // vserver-name is needed for vLoadBalancer case |
| // |
| String genericVNF = $event.AAI.get("generic-vnf.vnf-id"); |
| String vserver = $event.AAI.get("vserver.vserver-name"); |
| // |
| // Check if we are implementing a simple pattern match. |
| // |
| if ($params.getAaiPatternMatch() == 1) { |
| // |
| // Yes |
| // |
| //Basic naming characteristics: |
| //VF Name (9 char)+VM name (13 char total)+VFC (19 char total) |
| //Example: |
| //VF Name (9 characters): cscf0001v |
| //VM Name(13 characters): cscf0001vm001 |
| //VFC name(19 characters): cscf0001vm001cfg001 |
| // |
| // zdfw1fwl01fwl02 or zdfw1fwl01fwl01 |
| // replaced with |
| // zdfw1fwl01pgn02 or zdfw1fwl01pgn01 |
| // |
| int index = genericVNF.lastIndexOf("fwl"); |
| if (index == -1) { |
| System.err.println("The generic-vnf.vnf-id from DCAE Event is not valid."); |
| } else { |
| genericVNF = genericVNF.substring(0, index) + "pgn" + genericVNF.substring(index+"fwl".length()); |
| } |
| // |
| // Construct an APPC request |
| // |
| ControlLoopOperation operation = new ControlLoopOperation(); |
| operation.actor = $params.getActor(); |
| operation.operation = "ModifyConfig"; |
| operation.target = $event.target; |
| // |
| // Create operationWrapper |
| // |
| ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation); |
| // |
| // insert operationWrapper into memory |
| // |
| insert(operationWrapper); |
| // |
| Request request = new Request(); |
| request.CommonHeader = new CommonHeader(); |
| request.CommonHeader.RequestID = $event.requestID; |
| request.Action = operation.operation; |
| request.Payload = new HashMap<String, Object>(); |
| // |
| // Fill in the payload |
| // |
| request.Payload.put("generic-vnf.vnf-id", genericVNF); |
| // |
| PGRequest pgRequest = new PGRequest(); |
| pgRequest.pgStreams = new PGStreams(); |
| |
| PGStream pgStream; |
| for(int i = 0; i < 5; i++){ |
| pgStream = new PGStream(); |
| pgStream.streamId = "fw_udp"+(i+1); |
| pgStream.isEnabled = "true"; |
| pgRequest.pgStreams.pgStream.add(pgStream); |
| } |
| request.Payload.put("pg-streams", pgRequest.pgStreams); |
| |
| if (request != null) { |
| // |
| // Insert request into memory |
| // |
| insert(request); |
| // |
| // Tell interested parties we are performing this Operation |
| // |
| VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); |
| notification.notification = ControlLoopNotificationType.OPERATION; |
| // message and history ?? |
| notification.from = "policy"; |
| notification.policyName = drools.getRule().getName(); |
| notification.policyScope = "${policyScope}"; |
| notification.policyVersion = "${policyVersion}"; |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| // |
| // Now send the operation request |
| // |
| if (request instanceof Request) { |
| try { |
| System.out.println("APPC request sent:"); |
| System.out.println(Serialization.gsonPretty.toJson(request)); |
| PolicyEngine.manager.deliver($params.getAppcTopic(), request); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| System.out.println("Can't deliver request: " + request); |
| } |
| } |
| } else { |
| // |
| // what happens if it is null |
| // |
| } |
| // |
| } else { |
| // |
| // create AAI named-query request with UUID started with "F199" |
| // |
| AAINQF199Request aainqf199request = new AAINQF199Request(); |
| AAINQF199QueryParameters aainqf199queryparam = new AAINQF199QueryParameters(); |
| AAINQF199NamedQuery aainqf199namedquery = new AAINQF199NamedQuery(); |
| AAINQF199InstanceFilters aainqf199instancefilter = new AAINQF199InstanceFilters(); |
| // |
| // queryParameters |
| // |
| aainqf199namedquery.namedQueryUUID = UUID.fromString($params.getAaiNamedQueryUUID()); |
| aainqf199queryparam.namedQuery = aainqf199namedquery; |
| aainqf199request.queryParameters = aainqf199queryparam; |
| // |
| // instanceFilters |
| // |
| Map aainqf199instancefiltermap = new HashMap(); |
| Map aainqf199instancefiltermapitem = new HashMap(); |
| aainqf199instancefiltermapitem.put("vserver-name", vserver); |
| aainqf199instancefiltermap.put("vserver", aainqf199instancefiltermapitem); |
| aainqf199instancefilter.instanceFilter.add(aainqf199instancefiltermap); |
| aainqf199request.instanceFilters = aainqf199instancefilter; |
| // |
| // print aainqf199request for debug |
| // |
| System.out.println("AAI Request sent:"); |
| System.out.println(Serialization.gsonPretty.toJson(aainqf199request)); |
| // |
| // Create AAINQF199RequestWrapper |
| // |
| AAINQF199RequestWrapper aainqf199RequestWrapper = new AAINQF199RequestWrapper($event.requestID, aainqf199request); |
| // |
| // insert aainqf199request into memory |
| // |
| insert(aainqf199RequestWrapper); |
| } |
| // |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| end |
| |
| /* |
| * |
| * This rule happens when we got a valid ONSET, closed loop is enabled, an Event Manager |
| * is created, AAI Manager and AAI Request are ready in memory. We can start sending query to AAI and then wait for response. |
| * |
| */ |
| rule "${policyName}.EVENT.MANAGER.AAINQF199REQUEST" |
| when |
| $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) |
| $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) |
| $manager : EventManager( closedLoopControlName == $event.closedLoopControlName ) |
| $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID) |
| then |
| System.out.println("rule EVENT.MANAGER.AAINQF199REQUEST is triggered."); |
| // |
| // send the request |
| // |
| AAINQF199Response aainqf199response = AAINQF199Manager.postQuery($params.getAaiURL(), $params.getAaiUsername(), $params.getAaiPassword(), |
| $aainqf199RequestWrapper.aainqf199request, $event.requestID); |
| // |
| // Check AAI response |
| // |
| if (aainqf199response == null) { |
| System.err.println("Failed to get AAI response"); |
| // |
| // Fail and retract everything |
| // |
| retract($event); |
| retract($manager); |
| retract($aainqf199RequestWrapper); |
| } else { |
| // |
| // Create AAINQF199ResponseWrapper |
| // |
| AAINQF199ResponseWrapper aainqf199ResponseWrapper = new AAINQF199ResponseWrapper($event.requestID, aainqf199response); |
| // |
| // insert aainqf199ResponseWrapper to memeory |
| // |
| insert(aainqf199ResponseWrapper); |
| } |
| end |
| |
| /* |
| * |
| * This rule happens when we got a valid AAI response. We can start sending request to APPC or MSO now. |
| * |
| */ |
| rule "${policyName}.EVENT.MANAGER.AAINQF199RESPONSE" |
| when |
| $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) |
| $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) |
| $manager : EventManager( closedLoopControlName == $event.closedLoopControlName ) |
| $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID) |
| $aainqf199ResponseWrapper : AAINQF199ResponseWrapper(requestID == $event.requestID) |
| then |
| System.out.println("rule EVENT.MANAGER.AAINQF199RESPONSE is triggered."); |
| // |
| // Extract related fields out of AAINQF199RESPONSE |
| // |
| String vnfItemVnfId, vnfItemVnfType, vnfItemPersonaModelId, vnfItemPersonaModelVersion, vnfItemModelName, |
| vnfItemModelVersion, vnfItemModelNameVersionId, serviceItemServiceInstanceId, serviceItemPersonaModelId, |
| serviceItemModelName, serviceItemModelType, serviceItemModelVersion, serviceItemModelNameVersionId, |
| vfModuleItemVfModuleName, vfModuleItemPersonaModelId, vfModuleItemPersonaModelVersion, vfModuleItemModelName, |
| vfModuleItemModelNameVersionId, tenantItemTenantId, cloudRegionItemCloudRegionId; |
| try { |
| // |
| // vnfItem |
| // |
| vnfItemVnfId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfID; |
| vnfItemVnfType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfType; |
| vnfItemVnfType = vnfItemVnfType.substring(vnfItemVnfType.lastIndexOf("/")+1); |
| vnfItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelId; |
| vnfItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelVersion; |
| vnfItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue; |
| vnfItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(2).propertyValue; |
| vnfItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue; |
| // |
| // serviceItem |
| // |
| serviceItemServiceInstanceId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.serviceInstanceID; |
| serviceItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelId; |
| serviceItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue; |
| serviceItemModelType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(1).propertyValue; |
| serviceItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelVersion; |
| serviceItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue; |
| // |
| // Find the index for base vf module and non-base vf module |
| // |
| int baseIndex = -1; |
| int nonBaseIndex = -1; |
| List<AAINQF199InventoryResponseItem> inventoryItems = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems; |
| for (AAINQF199InventoryResponseItem m : inventoryItems) { |
| if (m.vfModule != null && m.vfModule.isBaseVfModule == true) { |
| baseIndex = inventoryItems.indexOf(m); |
| } else if (m.vfModule != null && m.vfModule.isBaseVfModule == false && m.vfModule.orchestrationStatus == null) { |
| nonBaseIndex = inventoryItems.indexOf(m); |
| } |
| // |
| if (baseIndex != -1 && nonBaseIndex != -1) { |
| break; |
| } |
| } |
| // |
| // Report the error if either base vf module or non-base vf module is not found |
| // |
| if (baseIndex == -1 || nonBaseIndex == -1) { |
| System.err.println("Either base or non-base vf module is not found from AAI response."); |
| retract($aainqf199RequestWrapper); |
| retract($aainqf199ResponseWrapper); |
| retract($manager); |
| retract($event); |
| return; |
| } |
| // |
| // This comes from the base module |
| // |
| vfModuleItemVfModuleName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(baseIndex).vfModule.vfModuleName; |
| vfModuleItemVfModuleName = vfModuleItemVfModuleName.replace("Vfmodule", "vDNS"); |
| // |
| // vfModuleItem - NOT the base module |
| // |
| vfModuleItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelId; |
| vfModuleItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelVersion; |
| vfModuleItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(0).propertyValue; |
| vfModuleItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(4).propertyValue; |
| // |
| // tenantItem |
| // |
| tenantItemTenantId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).tenant.tenantId; |
| // |
| // cloudRegionItem |
| // |
| cloudRegionItemCloudRegionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).items.inventoryResponseItems.get(0).cloudRegion.cloudRegionId; |
| // |
| } catch (Exception e) { |
| e.printStackTrace(); |
| VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); |
| notification.notification = ControlLoopNotificationType.REJECTED; |
| notification.message = "Exception occurred " + e.getMessage(); |
| notification.policyName = drools.getRule().getName(); |
| notification.policyScope = "${policyScope}"; |
| notification.policyVersion = "${policyVersion}"; |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e1) { |
| System.out.println("Can't deliver notification: " + notification); |
| e1.printStackTrace(); |
| } |
| // |
| notification.notification = ControlLoopNotificationType.FINAL_FAILURE; |
| notification.message = "Invalid named-query response from AAI"; |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e1) { |
| System.out.println("Can't deliver notification: " + notification); |
| e1.printStackTrace(); |
| } |
| // |
| // Retract everything |
| // |
| retract($aainqf199RequestWrapper); |
| retract($aainqf199ResponseWrapper); |
| retract($manager); |
| retract($event); |
| return; |
| } |
| // |
| // Extracted fields should not be null |
| // |
| if ((vnfItemVnfId == null) || (vnfItemVnfType == null) || |
| (vnfItemPersonaModelId == null) || (vnfItemModelName == null) || |
| (vnfItemModelVersion == null) || (vnfItemModelNameVersionId == null) || |
| (serviceItemServiceInstanceId == null) || (serviceItemModelName == null) || |
| (serviceItemModelType == null) || (serviceItemModelVersion == null) || |
| (serviceItemModelNameVersionId == null) || (vfModuleItemVfModuleName == null) || |
| (vfModuleItemPersonaModelId == null) || (vfModuleItemPersonaModelVersion == null) || |
| (vfModuleItemModelName == null) || (vfModuleItemModelNameVersionId == null) || |
| (tenantItemTenantId == null) || (cloudRegionItemCloudRegionId == null)) { |
| // |
| System.err.println("some fields are missing from AAI response."); |
| // |
| // Fail and retract everything |
| // |
| retract($aainqf199RequestWrapper); |
| retract($aainqf199ResponseWrapper); |
| retract($manager); |
| retract($event); |
| return; |
| } |
| // |
| // We don't need them any more |
| // |
| retract($aainqf199ResponseWrapper); |
| retract($aainqf199RequestWrapper); |
| // |
| // check the actor of this closed loop |
| // |
| switch ($params.getActor()) { |
| case "APPC": |
| { |
| // |
| // Construct an APPC request |
| // |
| ControlLoopOperation operation = new ControlLoopOperation(); |
| operation.actor = $params.getActor(); |
| operation.operation = "ModifyConfig"; |
| operation.target = $event.target; |
| // |
| // Create operationWrapper |
| // |
| ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation); |
| // |
| // insert operationWrapper into memory |
| // |
| insert(operationWrapper); |
| // |
| Request request = new Request(); |
| request.CommonHeader = new CommonHeader(); |
| request.CommonHeader.RequestID = $event.requestID; |
| request.Action = operation.operation; |
| request.Payload = new HashMap<String, Object>(); |
| // |
| // Fill in the payload |
| // Hardcode genericVNF for now since AAI has not been ready for vFirewall demo case |
| // |
| String genericVNF = "zdfw1fwl01pgn02"; |
| request.Payload.put("generic-vnf.vnf-id", genericVNF); |
| // |
| PGRequest pgRequest = new PGRequest(); |
| pgRequest.pgStreams = new PGStreams(); |
| |
| PGStream pgStream; |
| for(int i = 0; i < 5; i++){ |
| pgStream = new PGStream(); |
| pgStream.streamId = "fw_udp"+(i+1); |
| pgStream.isEnabled = "true"; |
| pgRequest.pgStreams.pgStream.add(pgStream); |
| } |
| request.Payload.put("pg-streams", pgRequest.pgStreams); |
| |
| if (request != null) { |
| // |
| // Insert request into memory |
| // |
| insert(request); |
| // |
| // Tell interested parties we are performing this Operation |
| // |
| VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); |
| notification.notification = ControlLoopNotificationType.OPERATION; |
| // message and history ?? |
| notification.from = "policy"; |
| notification.policyName = drools.getRule().getName(); |
| notification.policyScope = "${policyScope}"; |
| notification.policyVersion = "${policyVersion}"; |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| // |
| // Now send the operation request |
| // |
| if (request instanceof Request) { |
| try { |
| System.out.println("APPC request sent:"); |
| System.out.println(Serialization.gsonPretty.toJson(request)); |
| PolicyEngine.manager.deliver($params.getAppcTopic(), request); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| System.out.println("Can't deliver request: " + request); |
| } |
| } |
| } else { |
| // |
| // what happens if it is null |
| // |
| } |
| } |
| break; |
| case "MSO": |
| { |
| // |
| // Construct an operation |
| // |
| ControlLoopOperation operation = new ControlLoopOperation(); |
| operation.actor = $params.getActor(); |
| operation.operation = "createModuleInstance"; |
| operation.target = $event.target; |
| // |
| // Create operationWrapper |
| // |
| ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation); |
| // |
| // Construct an MSO request |
| // |
| MSORequest request = new MSORequest(); |
| request.requestDetails = new MSORequestDetails(); |
| request.requestDetails.modelInfo = new MSOModelInfo(); |
| request.requestDetails.cloudConfiguration = new MSOCloudConfiguration(); |
| request.requestDetails.requestInfo = new MSORequestInfo(); |
| request.requestDetails.requestParameters = new MSORequestParameters(); |
| request.requestDetails.requestParameters.userParams = null; |
| // |
| // cloudConfiguration |
| // |
| request.requestDetails.cloudConfiguration.lcpCloudRegionId = cloudRegionItemCloudRegionId; |
| request.requestDetails.cloudConfiguration.tenantId = tenantItemTenantId; |
| // |
| // modelInfo |
| // |
| request.requestDetails.modelInfo.modelType = "vfModule"; |
| request.requestDetails.modelInfo.modelInvariantId = vfModuleItemPersonaModelId; |
| request.requestDetails.modelInfo.modelNameVersionId = vfModuleItemModelNameVersionId; |
| request.requestDetails.modelInfo.modelName = vfModuleItemModelName; |
| request.requestDetails.modelInfo.modelVersion = vfModuleItemPersonaModelVersion; |
| // |
| // requestInfo |
| // |
| request.requestDetails.requestInfo.instanceName = vfModuleItemVfModuleName; |
| request.requestDetails.requestInfo.source = "POLICY"; |
| request.requestDetails.requestInfo.suppressRollback = false; |
| // |
| // relatedInstanceList |
| // |
| MSORelatedInstanceListElement relatedInstanceListElement1 = new MSORelatedInstanceListElement(); |
| MSORelatedInstanceListElement relatedInstanceListElement2 = new MSORelatedInstanceListElement(); |
| relatedInstanceListElement1.relatedInstance = new MSORelatedInstance(); |
| relatedInstanceListElement2.relatedInstance = new MSORelatedInstance(); |
| // |
| relatedInstanceListElement1.relatedInstance.instanceId = serviceItemServiceInstanceId; |
| relatedInstanceListElement1.relatedInstance.modelInfo = new MSOModelInfo(); |
| relatedInstanceListElement1.relatedInstance.modelInfo.modelType = "service"; |
| relatedInstanceListElement1.relatedInstance.modelInfo.modelInvariantId = serviceItemPersonaModelId; |
| relatedInstanceListElement1.relatedInstance.modelInfo.modelNameVersionId = serviceItemModelNameVersionId; |
| relatedInstanceListElement1.relatedInstance.modelInfo.modelName = serviceItemModelName; |
| relatedInstanceListElement1.relatedInstance.modelInfo.modelVersion = serviceItemModelVersion; |
| // |
| relatedInstanceListElement2.relatedInstance.instanceId = vnfItemVnfId; |
| relatedInstanceListElement2.relatedInstance.modelInfo = new MSOModelInfo(); |
| relatedInstanceListElement2.relatedInstance.modelInfo.modelType = "vnf"; |
| relatedInstanceListElement2.relatedInstance.modelInfo.modelInvariantId = vnfItemPersonaModelId; |
| relatedInstanceListElement2.relatedInstance.modelInfo.modelNameVersionId = vnfItemModelNameVersionId; |
| relatedInstanceListElement2.relatedInstance.modelInfo.modelName = vnfItemModelName; |
| relatedInstanceListElement2.relatedInstance.modelInfo.modelVersion = vnfItemModelVersion; |
| relatedInstanceListElement2.relatedInstance.modelInfo.modelCustomizationName = vnfItemVnfType; |
| // |
| request.requestDetails.relatedInstanceList.add(relatedInstanceListElement1); |
| request.requestDetails.relatedInstanceList.add(relatedInstanceListElement2); |
| // |
| // print MSO request for debug |
| // |
| System.out.println("MSO request sent:"); |
| System.out.println(Serialization.gsonPretty.toJson(request)); |
| // |
| // |
| // |
| if (request != null) { |
| // |
| // Tell interested parties we are performing this Operation |
| // |
| VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); |
| notification.notification = ControlLoopNotificationType.OPERATION; |
| notification.from = "policy"; |
| notification.policyName = drools.getRule().getName(); |
| notification.policyScope = "${policyScope}"; |
| notification.policyVersion = "${policyVersion}"; |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| // |
| // Concatenate serviceItemServiceInstanceId and vnfItemVnfId to msoURL |
| // |
| String MSOUrl = $params.getMsoURL() + "/serviceInstances/v2/" + serviceItemServiceInstanceId + "/vnfs/" + vnfItemVnfId + "/vfModules"; |
| // |
| // Call MSO |
| // |
| MSOResponse response = MSOManager.createModuleInstance(MSOUrl, $params.getMsoURL(), $params.getMsoUsername(), $params.getMsoPassword(), request); |
| // |
| if (response != null) { |
| // |
| // Assign requestId |
| // |
| request.requestId = $event.requestID.toString(); |
| response.request.requestId = $event.requestID.toString(); |
| // |
| // Insert facts |
| // |
| insert(operationWrapper); |
| insert(request); |
| insert(response); |
| } else { |
| // |
| // MSO request not even accepted |
| // |
| notification.message = operationWrapper.operation.toMessage(); |
| operationWrapper.operation.message = operationWrapper.operation.toMessage(); |
| operationWrapper.operation.outcome = "FAILURE_EXCEPTION"; |
| $manager.setControlLoopResult("FAILURE_EXCEPTION"); |
| notification.history.add(operationWrapper.operation); |
| notification.notification = ControlLoopNotificationType.OPERATION_FAILURE; |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| notification.notification = ControlLoopNotificationType.FINAL_FAILURE; |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| // |
| // Retract everything |
| // |
| retract($event); |
| retract($manager); |
| } |
| } else { |
| System.err.println("constructed MSO request is invalid."); |
| } |
| } |
| break; |
| } |
| end |
| |
| /* |
| * |
| * This rule responds to APPC Response Events |
| * |
| */ |
| rule "${policyName}.APPC.RESPONSE" |
| when |
| $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) |
| $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) |
| $manager : EventManager( closedLoopControlName == $event.closedLoopControlName ) |
| $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID ) |
| $request : Request( getCommonHeader().RequestID == $event.requestID ) |
| $response : Response( getCommonHeader().RequestID == $event.requestID ) |
| then |
| System.out.println("rule APPC.RESPONSE is triggered."); |
| if ($response.Status == null) { |
| $operationWrapper.operation.outcome = "FAILURE_EXCEPTION"; |
| $manager.setControlLoopResult("FAILURE_EXCEPTION"); |
| } |
| // |
| // Get the Response Code |
| // |
| ResponseCode code = ResponseCode.toResponseCode($response.Status.Code); |
| if (code == null) { |
| $operationWrapper.operation.outcome = "FAILURE_EXCEPTION"; |
| $manager.setControlLoopResult("FAILURE_EXCEPTION"); |
| } |
| // |
| // Construct notification |
| // |
| VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); |
| notification.from = "policy"; |
| notification.policyName = drools.getRule().getName(); |
| notification.policyScope = "${policyScope}"; |
| notification.policyVersion = "${policyVersion}"; |
| notification.message = $operationWrapper.operation.toMessage(); |
| $operationWrapper.operation.message = $operationWrapper.operation.toMessage(); |
| // |
| // Ok, let's figure out what APP-C's response is |
| // |
| switch (code) { |
| case ACCEPT: |
| $operationWrapper.operation.outcome = "PROCESSING"; |
| break; |
| case ERROR: |
| case REJECT: |
| $operationWrapper.operation.outcome = "FAILURE_EXCEPTION"; |
| $manager.setControlLoopResult("FAILURE_EXCEPTION"); |
| break; |
| case SUCCESS: |
| $operationWrapper.operation.outcome = "SUCCESS"; |
| $manager.setControlLoopResult("SUCCESS"); |
| break; |
| case FAILURE: |
| $operationWrapper.operation.outcome = "FAILURE"; |
| $manager.setControlLoopResult("FAILURE"); |
| break; |
| } |
| if ($operationWrapper.operation.outcome.equals("SUCCESS")) { |
| notification.history.add($operationWrapper.operation); |
| notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS; |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| notification.notification = ControlLoopNotificationType.FINAL_SUCCESS; |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| |
| // |
| // We are going to retract these objects from memory |
| // |
| System.out.println("Retracting everything"); |
| retract($operationWrapper); |
| retract($request); |
| retract($response); |
| retract($event); |
| retract($manager); |
| } else if ($operationWrapper.operation.outcome.equals("PROCESSING")) { |
| retract($response); |
| } else { |
| notification.history.add($operationWrapper.operation); |
| notification.notification = ControlLoopNotificationType.OPERATION_FAILURE; |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| notification.notification = ControlLoopNotificationType.FINAL_FAILURE; |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| // |
| // We are going to retract these objects from memory |
| // |
| System.out.println("Retracting everything"); |
| retract($operationWrapper); |
| retract($request); |
| retract($response); |
| retract($event); |
| retract($manager); |
| } |
| |
| end |
| |
| /* |
| * |
| * This rule is used to clean up APPC response |
| * |
| */ |
| rule "${policyName}.APPC.RESPONSE.CLEANUP" |
| when |
| $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) |
| $response : Response($id : getCommonHeader().RequestID ) |
| not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) |
| then |
| System.out.println("rule APPC.RESPONSE.CLEANUP is triggered."); |
| retract($response); |
| end |
| |
| /* |
| * |
| * This rule responds to MSO Response Events |
| * |
| */ |
| rule "${policyName}.MSO.RESPONSE" |
| when |
| $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" ) |
| $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET ) |
| $manager : EventManager( closedLoopControlName == $event.closedLoopControlName ) |
| $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID ) |
| $request : MSORequest( requestId == $event.requestID.toString() ) |
| $response : MSOResponse( request.requestId == $event.requestID.toString() ) |
| then |
| System.out.println("rule MSO.RESPONSE is triggered."); |
| // |
| // Construct notification |
| // |
| VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event); |
| notification.from = "policy"; |
| notification.policyName = drools.getRule().getName(); |
| notification.policyScope = "${policyScope}"; |
| notification.policyVersion = "${policyVersion}"; |
| notification.message = $operationWrapper.operation.toMessage(); |
| $operationWrapper.operation.message = $operationWrapper.operation.toMessage(); |
| // |
| // The operation can either be succeeded or failed |
| // |
| if($response.request.requestStatus.requestState.equals("Completed")) { |
| $operationWrapper.operation.outcome = "SUCCESS"; |
| $manager.setControlLoopResult("SUCCESS"); |
| notification.history.add($operationWrapper.operation); |
| notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS; |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| notification.notification = ControlLoopNotificationType.FINAL_SUCCESS; |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| // |
| // We are going to retract these objects from memory |
| // |
| System.out.println("Retracting everything"); |
| retract($operationWrapper); |
| retract($request); |
| retract($response); |
| retract($event); |
| retract($manager); |
| } else { |
| $operationWrapper.operation.outcome = "FAILURE"; |
| $manager.setControlLoopResult("FAILURE"); |
| notification.history.add($operationWrapper.operation); |
| notification.notification = ControlLoopNotificationType.OPERATION_FAILURE; |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| notification.notification = ControlLoopNotificationType.FINAL_FAILURE; |
| // |
| // Let interested parties know |
| // |
| try { |
| System.out.println(Serialization.gsonPretty.toJson(notification)); |
| PolicyEngine.manager.deliver($params.getNotificationTopic(), notification); |
| } catch (Exception e) { |
| System.out.println("Can't deliver notification: " + notification); |
| e.printStackTrace(); |
| } |
| // |
| // We are going to retract these objects from memory |
| // |
| System.out.println("Retracting everything"); |
| retract($operationWrapper); |
| retract($request); |
| retract($response); |
| retract($event); |
| retract($manager); |
| } |
| |
| end |