2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
22 package org.openecomp.policy.controlloop;
24 import java.util.List;
25 import java.util.LinkedList;
27 import java.util.HashMap;
28 import java.util.UUID;
30 import org.openecomp.policy.controlloop.VirtualControlLoopEvent;
31 import org.openecomp.policy.controlloop.ControlLoopEventStatus;
32 import org.openecomp.policy.controlloop.VirtualControlLoopNotification;
33 import org.openecomp.policy.controlloop.ControlLoopNotificationType;
34 import org.openecomp.policy.controlloop.ControlLoopOperation;
35 import org.openecomp.policy.controlloop.ControlLoopOperationWrapper;
36 import org.openecomp.policy.template.demo.ControlLoopException;
38 import org.openecomp.policy.aai.AAINQF199.AAINQF199CloudRegion;
39 import org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperties;
40 import org.openecomp.policy.aai.AAINQF199.AAINQF199ExtraProperty;
41 import org.openecomp.policy.aai.AAINQF199.AAINQF199GenericVNF;
42 import org.openecomp.policy.aai.AAINQF199.AAINQF199InstanceFilters;
43 import org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItem;
44 import org.openecomp.policy.aai.AAINQF199.AAINQF199InventoryResponseItems;
45 import org.openecomp.policy.aai.AAINQF199.AAINQF199Manager;
46 import org.openecomp.policy.aai.AAINQF199.AAINQF199NamedQuery;
47 import org.openecomp.policy.aai.AAINQF199.AAINQF199QueryParameters;
48 import org.openecomp.policy.aai.AAINQF199.AAINQF199Request;
49 import org.openecomp.policy.aai.AAINQF199.AAINQF199RequestWrapper;
50 import org.openecomp.policy.aai.AAINQF199.AAINQF199Response;
51 import org.openecomp.policy.aai.AAINQF199.AAINQF199ResponseWrapper;
52 import org.openecomp.policy.aai.AAINQF199.AAINQF199ServiceInstance;
53 import org.openecomp.policy.aai.AAINQF199.AAINQF199Tenant;
54 import org.openecomp.policy.aai.AAINQF199.AAINQF199VfModule;
55 import org.openecomp.policy.aai.AAINQF199.AAINQF199VServer;
56 import org.openecomp.policy.aai.util.Serialization;
58 import org.openecomp.policy.appc.CommonHeader;
59 import org.openecomp.policy.appc.Request;
60 import org.openecomp.policy.appc.Response;
61 import org.openecomp.policy.appc.ResponseCode;
62 import org.openecomp.policy.appc.ResponseStatus;
63 import org.openecomp.policy.appc.ResponseValue;
65 import org.openecomp.policy.template.demo.EventManager;
66 import org.openecomp.policy.vnf.trafficgenerator.PGRequest;
67 import org.openecomp.policy.vnf.trafficgenerator.PGStream;
68 import org.openecomp.policy.vnf.trafficgenerator.PGStreams;
70 import org.openecomp.policy.mso.MSOManager;
71 import org.openecomp.policy.mso.MSORequest;
72 import org.openecomp.policy.mso.MSORequestStatus;
73 import org.openecomp.policy.mso.MSORequestDetails;
74 import org.openecomp.policy.mso.MSOModelInfo;
75 import org.openecomp.policy.mso.MSOCloudConfiguration;
76 import org.openecomp.policy.mso.MSORequestInfo;
77 import org.openecomp.policy.mso.MSORequestParameters;
78 import org.openecomp.policy.mso.MSORelatedInstanceListElement;
79 import org.openecomp.policy.mso.MSORelatedInstance;
80 import org.openecomp.policy.mso.MSOResponse;
82 //import org.openecomp.policy.drools.system.PolicyEngine;
85 // These parameters are required to build the runtime policy
88 closedLoopControlName : String
96 aaiNamedQueryUUID : String
98 notificationTopic : String
104 * Called once and only once to insert the parameters into working memory for this Closed Loop policy.
105 * (Comment SETUP rule out for the first ECOMP opensource release since policy BRMS_GW already puts a Params fact in there)
108 rule "${policyName}.SETUP"
111 System.out.println("rule SETUP is triggered.");
112 Params params = new Params();
113 params.setClosedLoopControlName("${closedLoopControlName}");
114 params.setActor("${actor}");
115 params.setAaiURL("${aaiURL}");
116 params.setAaiUsername("${aaiUsername}");
117 params.setAaiPassword("${aaiPassword}");
118 params.setMsoURL("${msoURL}");
119 params.setMsoUsername("${msoUsername}");
120 params.setMsoPassword("${msoPassword}");
121 params.setAaiNamedQueryUUID("${aaiNamedQueryUUID}");
122 params.setAaiPatternMatch(${aaiPatternMatch});
123 params.setNotificationTopic("${notificationTopic}");
124 params.setAppcTopic("${appcTopic}");
126 // This stays in memory as long as the rule is alive and running
133 * This rule responds to DCAE Events
136 rule "${policyName}.EVENT"
138 $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
139 $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
140 not ( EventManager( closedLoopControlName == $event.closedLoopControlName ))
142 System.out.println("rule EVENT is triggered.");
145 // Check the requestID in the event to make sure it is not null before we create the EventManager.
146 // The EventManager will do extra syntax checking as well check if the closed loop is disabled/
148 if ($event.requestID == null) {
149 VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
150 notification.notification = ControlLoopNotificationType.REJECTED;
151 notification.from = "policy";
152 notification.message = "Missing requestID from DCAE event";
153 notification.policyName = drools.getRule().getName();
154 notification.policyScope = "${policyScope}";
155 notification.policyVersion = "${policyVersion}";
157 // Let interested parties know
160 System.out.println(Serialization.gsonPretty.toJson(notification));
161 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
162 } catch (Exception e) {
164 System.out.println("Can't deliver notification: " + notification);
167 // Retract it from memory
170 System.out.println("Event with requestID=null has been retracted.");
173 // Create an EventManager
175 EventManager manager = new EventManager($params.getClosedLoopControlName(), $event.requestID, $event.target);
177 // Determine if EventManager can actively process the event (i.e. syntax)
179 VirtualControlLoopNotification notification = manager.activate($event);
180 notification.from = "policy";
181 notification.policyName = drools.getRule().getName();
182 notification.policyScope = "${policyScope}";
183 notification.policyVersion = "${policyVersion}";
185 // Are we actively pursuing this event?
187 if (notification.notification == ControlLoopNotificationType.ACTIVE) {
189 // Insert Event Manager into memory, this will now kick off processing.
193 // Let interested parties know
196 System.out.println(Serialization.gsonPretty.toJson(notification));
197 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
198 } catch (Exception e) {
200 System.out.println("Can't deliver notification: " + notification);
204 // Let interested parties know
207 System.out.println(Serialization.gsonPretty.toJson(notification));
208 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
209 } catch (Exception e) {
211 System.out.println("Can't deliver notification: " + notification);
214 // Retract it from memory
219 // Now that the manager is inserted into Drools working memory, we'll wait for
220 // another rule to fire in order to continue processing. This way we can also
221 // then screen for additional ONSET and ABATED events for this same RequestIDs
222 // and for different RequestIDs but with the same closedLoopControlName and target.
226 } catch (Exception e) {
228 VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
229 notification.notification = ControlLoopNotificationType.REJECTED;
230 notification.message = "Exception occurred " + e.getMessage();
231 notification.policyName = drools.getRule().getName();
232 notification.policyScope = "${policyScope}";
233 notification.policyVersion = "${policyVersion}";
238 System.out.println(Serialization.gsonPretty.toJson(notification));
239 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
240 } catch (Exception e1) {
241 System.out.println("Can't deliver notification: " + notification);
242 e1.printStackTrace();
253 * This rule happens when we got a valid ONSET, closed loop is enabled and an Event Manager
254 * is created. We can start the operations for this closed loop.
257 rule "${policyName}.EVENT.MANAGER"
259 $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
260 $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
261 $manager : EventManager( closedLoopControlName == $event.closedLoopControlName, controlLoopResult == null)
263 System.out.println("rule EVENT.MANAGER is triggered.");
265 // Check which event this is.
267 EventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event);
269 // We only want the initial ONSET event in memory,
270 // all the other events need to be retracted to support
271 // cleanup and avoid the other rules being fired for this event.
273 if (eventStatus != EventManager.NEW_EVENT_STATUS.FIRST_ONSET) {
274 System.out.println("Retracting "+eventStatus+" Event.");
279 // Now the event in memory is first onset event
283 // Pull the known AAI field from the Event
285 // generic-vnf is needed for vFirewall case
286 // vserver-name is needed for vLoadBalancer case
288 String genericVNF = $event.AAI.get("generic-vnf.vnf-id");
289 String vserver = $event.AAI.get("vserver.vserver-name");
291 // Check if we are implementing a simple pattern match.
293 if ($params.getAaiPatternMatch() == 1) {
297 //Basic naming characteristics:
298 //VF Name (9 char)+VM name (13 char total)+VFC (19 char total)
300 //VF Name (9 characters): cscf0001v
301 //VM Name(13 characters): cscf0001vm001
302 //VFC name(19 characters): cscf0001vm001cfg001
304 // zdfw1fwl01fwl02 or zdfw1fwl01fwl01
306 // zdfw1fwl01pgn02 or zdfw1fwl01pgn01
308 int index = genericVNF.lastIndexOf("fwl");
310 System.err.println("The generic-vnf.vnf-id from DCAE Event is not valid.");
312 genericVNF = genericVNF.substring(0, index) + "pgn" + genericVNF.substring(index+"fwl".length());
315 // Construct an APPC request
317 ControlLoopOperation operation = new ControlLoopOperation();
318 operation.actor = $params.getActor();
319 operation.operation = "ModifyConfig";
320 operation.target = $event.target;
322 // Create operationWrapper
324 ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);
326 // insert operationWrapper into memory
328 insert(operationWrapper);
330 Request request = new Request();
331 request.CommonHeader = new CommonHeader();
332 request.CommonHeader.RequestID = $event.requestID;
333 request.Action = operation.operation;
334 request.Payload = new HashMap<String, Object>();
336 // Fill in the payload
338 request.Payload.put("generic-vnf.vnf-id", genericVNF);
340 PGRequest pgRequest = new PGRequest();
341 pgRequest.pgStreams = new PGStreams();
344 for(int i = 0; i < 5; i++){
345 pgStream = new PGStream();
346 pgStream.streamId = "fw_udp"+(i+1);
347 pgStream.isEnabled = "true";
348 pgRequest.pgStreams.pgStream.add(pgStream);
350 request.Payload.put("pg-streams", pgRequest.pgStreams);
352 if (request != null) {
354 // Insert request into memory
358 // Tell interested parties we are performing this Operation
360 VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
361 notification.notification = ControlLoopNotificationType.OPERATION;
362 // message and history ??
363 notification.from = "policy";
364 notification.policyName = drools.getRule().getName();
365 notification.policyScope = "${policyScope}";
366 notification.policyVersion = "${policyVersion}";
368 System.out.println(Serialization.gsonPretty.toJson(notification));
369 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
370 } catch (Exception e) {
371 System.out.println("Can't deliver notification: " + notification);
375 // Now send the operation request
377 if (request instanceof Request) {
379 System.out.println("APPC request sent:");
380 System.out.println(Serialization.gsonPretty.toJson(request));
381 //PolicyEngine.manager.deliver($params.getAppcTopic(), request);
382 } catch (Exception e) {
384 System.out.println("Can't deliver request: " + request);
389 // what happens if it is null
395 // create AAI named-query request with UUID started with "F199"
397 AAINQF199Request aainqf199request = new AAINQF199Request();
398 AAINQF199QueryParameters aainqf199queryparam = new AAINQF199QueryParameters();
399 AAINQF199NamedQuery aainqf199namedquery = new AAINQF199NamedQuery();
400 AAINQF199InstanceFilters aainqf199instancefilter = new AAINQF199InstanceFilters();
404 aainqf199namedquery.namedQueryUUID = UUID.fromString($params.getAaiNamedQueryUUID());
405 aainqf199queryparam.namedQuery = aainqf199namedquery;
406 aainqf199request.queryParameters = aainqf199queryparam;
410 Map aainqf199instancefiltermap = new HashMap();
411 Map aainqf199instancefiltermapitem = new HashMap();
412 aainqf199instancefiltermapitem.put("vserver-name", vserver);
413 aainqf199instancefiltermap.put("vserver", aainqf199instancefiltermapitem);
414 aainqf199instancefilter.instanceFilter.add(aainqf199instancefiltermap);
415 aainqf199request.instanceFilters = aainqf199instancefilter;
417 // print aainqf199request for debug
419 System.out.println("AAI Request sent:");
420 System.out.println(Serialization.gsonPretty.toJson(aainqf199request));
422 // Create AAINQF199RequestWrapper
424 AAINQF199RequestWrapper aainqf199RequestWrapper = new AAINQF199RequestWrapper($event.requestID, aainqf199request);
426 // insert aainqf199request into memory
428 insert(aainqf199RequestWrapper);
431 } catch (Exception e) {
438 * This rule happens when we got a valid ONSET, closed loop is enabled, an Event Manager
439 * is created, AAI Manager and AAI Request are ready in memory. We can start sending query to AAI and then wait for response.
442 rule "${policyName}.EVENT.MANAGER.AAINQF199REQUEST"
444 $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
445 $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
446 $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )
447 $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)
449 System.out.println("rule EVENT.MANAGER.AAINQF199REQUEST is triggered.");
453 AAINQF199Response aainqf199response = AAINQF199Manager.postQuery($params.getAaiURL(), $params.getAaiUsername(), $params.getAaiPassword(),
454 $aainqf199RequestWrapper.aainqf199request, $event.requestID);
458 //////////////////////////////////////////////////////////
459 // Simulate a valid aainqf199response for junit test
460 // Remove this for real deployment
463 AAINQF199InventoryResponseItem serviceItem = new AAINQF199InventoryResponseItem();
464 serviceItem.modelName = "service-instance";
465 serviceItem.serviceInstance = new AAINQF199ServiceInstance();
466 serviceItem.serviceInstance.serviceInstanceID = "cf8426a6-0b53-4e3d-bfa6-4b2f4d5913a5";
467 serviceItem.serviceInstance.serviceInstanceName = "Service_Ete_Named90e1ab3-dcd5-4877-9edb-eadfc84e32c8";
468 serviceItem.serviceInstance.personaModelId = "4fcbc1c0-7793-46d8-8aa1-fa1c2ed9ec7b";
469 serviceItem.serviceInstance.personaModelVersion = "1.0";
470 serviceItem.serviceInstance.resourceVersion = "1485542400";
471 serviceItem.extraProperties = new AAINQF199ExtraProperties();
472 serviceItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name", "8330e932-2a23-4943-8606"));
473 serviceItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-type", "service"));
474 serviceItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-version", "1"));
475 serviceItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-id", "4fcbc1c0-7793-46d8-8aa1-fa1c2ed9ec7b"));
476 serviceItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name-version-id", "5c996219-b2e2-4c76-9b43-7e8672a33c1d"));
478 AAINQF199InventoryResponseItem vfModuleItem = new AAINQF199InventoryResponseItem();
479 vfModuleItem.modelName = "C15ce9e1E9144c8fB8bb..base_vlb..module-0";
480 vfModuleItem.vfModule = new AAINQF199VfModule();
481 vfModuleItem.vfModule.vfModuleId = "b0eff878-e2e1-4947-9597-39afdd0f51dd";
482 vfModuleItem.vfModule.vfModuleName = "Vfmodule_Ete_Named90e1ab3-dcd5-4877-9edb-eadfc84e32c8";
483 vfModuleItem.vfModule.heatStackId = "Vfmodule_Ete_Named90e1ab3-dcd5-4877-9edb-eadfc84e32c8/5845f37b-6cda-4e91-8ca3-f5572d226488";
484 vfModuleItem.vfModule.orchestrationStatus = "active";
485 vfModuleItem.vfModule.isBaseVfModule = true;
486 vfModuleItem.vfModule.resourceVersion = "1485542667";
487 vfModuleItem.vfModule.personaModelId = "79ee24cd-fc9a-4f14-afae-5e1dd2ab2941";
488 vfModuleItem.vfModule.personaModelVersion = "1";
490 vfModuleItem.extraProperties = new AAINQF199ExtraProperties();
491 vfModuleItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name", "C15ce9e1E9144c8fB8bb..base_vlb..module-0"));
492 vfModuleItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-type", "resource"));
493 vfModuleItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-version", "1"));
494 vfModuleItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-id", "79ee24cd-fc9a-4f14-afae-5e1dd2ab2941"));
495 vfModuleItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name-version-id", "5484cabb-1a0d-4f29-a616-094a3f643d73"));
498 AAINQF199InventoryResponseItem vfModuleItem1 = new AAINQF199InventoryResponseItem();
499 //vfModuleItem1.modelName = "vf-module";
500 vfModuleItem1.vfModule = new AAINQF199VfModule();
501 vfModuleItem1.vfModule.vfModuleId = "dummy";
502 vfModuleItem1.vfModule.vfModuleName = "dummy";
503 vfModuleItem1.vfModule.isBaseVfModule = false;
504 vfModuleItem1.vfModule.resourceVersion = "1485561752";
505 vfModuleItem1.vfModule.personaModelId = "f32568ec-2f1c-458a-864b-0593d53d141a";
506 vfModuleItem1.vfModule.personaModelVersion = "1.0";
508 vfModuleItem1.extraProperties = new AAINQF199ExtraProperties();
509 vfModuleItem1.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name", "C15ce9e1E9144c8fB8bb..dnsscaling..module-1"));
510 vfModuleItem1.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-type", "resource"));
511 vfModuleItem1.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-version", "1"));
512 vfModuleItem1.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-id", "f32568ec-2f1c-458a-864b-0593d53d141a"));
513 vfModuleItem1.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name-version-id", "69615025-879d-4f0d-afe3-b7d1a7eeed1f"));
517 AAINQF199InventoryResponseItem vfModuleItem2 = new AAINQF199InventoryResponseItem();
518 //vfModuleItem2.modelName = "vf-module";
519 vfModuleItem2.vfModule = new AAINQF199VfModule();
520 vfModuleItem2.vfModule.vfModuleId = "8cd79e44-1fae-48c1-a160-609f90b46749";
521 vfModuleItem2.vfModule.vfModuleName = "vDNS_Ete_Named90e1ab3-dcd5-4877-9edb-eadfc84e32c8";
522 vfModuleItem2.vfModule.heatStackId = "vDNS_Ete_Named90e1ab3-dcd5-4877-9edb-eadfc84e32c8/f447ce51-14dd-4dcd-9957-68a047c79673";
523 vfModuleItem2.vfModule.orchestrationStatus = "active";
524 vfModuleItem2.vfModule.isBaseVfModule = false;
525 vfModuleItem2.vfModule.resourceVersion = "1485562712";
526 vfModuleItem2.vfModule.personaModelId = "f32568ec-2f1c-458a-864b-0593d53d141a";
527 vfModuleItem2.vfModule.personaModelVersion = "1.0";
529 vfModuleItem2.extraProperties = new AAINQF199ExtraProperties();
530 vfModuleItem2.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name", "C15ce9e1E9144c8fB8bb..dnsscaling..module-1"));
531 vfModuleItem2.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-type", "resource"));
532 vfModuleItem2.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-version", "1"));
533 vfModuleItem2.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-id", "f32568ec-2f1c-458a-864b-0593d53d141a"));
534 vfModuleItem2.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name-version-id", "69615025-879d-4f0d-afe3-b7d1a7eeed1f"));
540 AAINQF199InventoryResponseItem genericVNFItem = new AAINQF199InventoryResponseItem();
541 genericVNFItem.modelName = "generic-vnf";
542 genericVNFItem.genericVNF = new AAINQF199GenericVNF();
543 genericVNFItem.genericVNF.vnfID = "594e2fe0-48b8-41ff-82e2-3d4bab69b192";
544 genericVNFItem.genericVNF.vnfName = "Vnf_Ete_Named90e1ab3-dcd5-4877-9edb-eadfc84e32c8";
545 genericVNFItem.genericVNF.vnfType = "8330e932-2a23-4943-8606/c15ce9e1-e914-4c8f-b8bb 1";
546 genericVNFItem.genericVNF.serviceId = "b3f70641-bdb9-4030-825e-6abb73a1f929";
547 // genericVNFItem.genericVNF.provStatus = "PREPROV";
548 // genericVNFItem.genericVNF.operationalState = "dhv-test-operational-state";
549 // genericVNFItem.genericVNF.ipv4OamAddress = "dhv-test-gvnf-ipv4-oam-address";
550 // genericVNFItem.genericVNF.ipv4Loopback0Address = "dhv-test-gvnfipv4-loopback0-address";
551 genericVNFItem.genericVNF.inMaint = false;
552 genericVNFItem.genericVNF.isClosedLoopDisabled = false;
553 genericVNFItem.genericVNF.resourceVersion = "1485542422";
554 // genericVNFItem.genericVNF.encrypedAccessFlag = true;
555 genericVNFItem.genericVNF.personaModelId = "033a32ed-aa65-4764-a736-36f2942f1aa0";
556 genericVNFItem.genericVNF.personaModelVersion = "1.0";
557 genericVNFItem.extraProperties = new AAINQF199ExtraProperties();
558 genericVNFItem.extraProperties.extraProperty = new LinkedList<AAINQF199ExtraProperty>();
559 genericVNFItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name", "c15ce9e1-e914-4c8f-b8bb"));
560 genericVNFItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-type", "resource"));
561 genericVNFItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-version", "1"));
562 genericVNFItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-id", "033a32ed-aa65-4764-a736-36f2942f1aa0"));
563 genericVNFItem.extraProperties.extraProperty.add(new AAINQF199ExtraProperty("model.model-name-version-id", "d4d072dc-4e21-4a03-9524-628985819a8e"));
564 genericVNFItem.items = new AAINQF199InventoryResponseItems();
565 genericVNFItem.items.inventoryResponseItems = new LinkedList<AAINQF199InventoryResponseItem>();
566 genericVNFItem.items.inventoryResponseItems.add(serviceItem);
567 genericVNFItem.items.inventoryResponseItems.add(vfModuleItem);
568 genericVNFItem.items.inventoryResponseItems.add(vfModuleItem1);
569 genericVNFItem.items.inventoryResponseItems.add(vfModuleItem2);
571 AAINQF199InventoryResponseItem cloudItem = new AAINQF199InventoryResponseItem();
572 cloudItem.cloudRegion = new AAINQF199CloudRegion();
573 cloudItem.cloudRegion.cloudOwner = "OWNER";
574 cloudItem.cloudRegion.cloudRegionId = "REGIONID";
575 cloudItem.cloudRegion.cloudRegionVersion = "2.5";
576 cloudItem.cloudRegion.complexName = "COMPLEXNAME";
577 cloudItem.cloudRegion.resourceVersion = "1485465545";
579 AAINQF199InventoryResponseItem tenantItem = new AAINQF199InventoryResponseItem();
580 tenantItem.tenant = new AAINQF199Tenant();
581 tenantItem.tenant.tenantId = "1015548";
582 tenantItem.tenant.tenantName = "1015548";
583 tenantItem.tenant.resourceVersion = "1485465545";
584 tenantItem.items = new AAINQF199InventoryResponseItems();
585 tenantItem.items.inventoryResponseItems = new LinkedList<AAINQF199InventoryResponseItem>();
586 tenantItem.items.inventoryResponseItems.add(cloudItem);
588 AAINQF199InventoryResponseItem vserverItem = new AAINQF199InventoryResponseItem();
589 vserverItem.vserver = new AAINQF199VServer();
590 vserverItem.vserver.vserverId = "70f081eb-2a87-4c81-9296-4b93d7d145c6";
591 vserverItem.vserver.vserverName = "vlb-lb-32c8";
592 vserverItem.vserver.vserverName2 = "vlb-lb-32c8";
593 vserverItem.vserver.provStatus = "ACTIVE";
594 vserverItem.vserver.vserverSelflink = "https://dfw.servers.api.rackspacecloud.com/v2/1015548/servers/70f081eb-2a87-4c81-9296-4b93d7d145c6";
595 vserverItem.vserver.inMaint = false;
596 vserverItem.vserver.isClosedLoopDisabled = false;
597 vserverItem.vserver.resourceVersion = "1485546436";
598 vserverItem.items = new AAINQF199InventoryResponseItems();
599 vserverItem.items.inventoryResponseItems = new LinkedList<AAINQF199InventoryResponseItem>();
600 vserverItem.items.inventoryResponseItems.add(genericVNFItem);
601 vserverItem.items.inventoryResponseItems.add(tenantItem);
603 aainqf199response = new AAINQF199Response();
604 aainqf199response.inventoryResponseItems.add(vserverItem);
606 System.out.println("PAM");
607 System.out.println(Serialization.gsonPretty.toJson(aainqf199response));
609 //////////////////////////////////////////////////////////
616 // Check AAI response
618 if (aainqf199response == null) {
619 System.err.println("Failed to get AAI response");
621 // Fail and retract everything
625 retract($aainqf199RequestWrapper);
628 // Create AAINQF199ResponseWrapper
630 AAINQF199ResponseWrapper aainqf199ResponseWrapper = new AAINQF199ResponseWrapper($event.requestID, aainqf199response);
632 // insert aainqf199ResponseWrapper to memeory
634 insert(aainqf199ResponseWrapper);
640 * This rule happens when we got a valid AAI response. We can start sending request to APPC or MSO now.
643 rule "${policyName}.EVENT.MANAGER.AAINQF199RESPONSE"
645 $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
646 $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
647 $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )
648 $aainqf199RequestWrapper : AAINQF199RequestWrapper(requestID == $event.requestID)
649 $aainqf199ResponseWrapper : AAINQF199ResponseWrapper(requestID == $event.requestID)
651 System.out.println("rule EVENT.MANAGER.AAINQF199RESPONSE is triggered.");
653 // Extract related fields out of AAINQF199RESPONSE
656 String vnfItemVnfId, vnfItemVnfType, vnfItemPersonaModelId, vnfItemPersonaModelVersion, vnfItemModelName,
657 vnfItemModelVersion, vnfItemModelNameVersionId, serviceItemServiceInstanceId, serviceItemPersonaModelId,
658 serviceItemModelName, serviceItemModelType, serviceItemModelVersion, serviceItemModelNameVersionId,
659 vfModuleItemVfModuleName, vfModuleItemPersonaModelId, vfModuleItemPersonaModelVersion, vfModuleItemModelName,
660 vfModuleItemModelNameVersionId, tenantItemTenantId, cloudRegionItemCloudRegionId;
665 vnfItemVnfId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfID;
666 vnfItemVnfType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.vnfType;
667 vnfItemVnfType = vnfItemVnfType.substring(vnfItemVnfType.lastIndexOf("/")+1);
668 vnfItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelId;
669 vnfItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).genericVNF.personaModelVersion;
670 vnfItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;
671 vnfItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(2).propertyValue;
672 vnfItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;
676 serviceItemServiceInstanceId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.serviceInstanceID;
677 serviceItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelId;
678 serviceItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(0).propertyValue;
679 serviceItemModelType = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(1).propertyValue;
680 serviceItemModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).serviceInstance.personaModelVersion;
681 serviceItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).extraProperties.extraProperty.get(4).propertyValue;
683 // Find the index for base vf module and non-base vf module
686 int nonBaseIndex = -1;
687 List<AAINQF199InventoryResponseItem> inventoryItems = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems;
688 for (AAINQF199InventoryResponseItem m : inventoryItems) {
689 if (m.vfModule != null && m.vfModule.isBaseVfModule == true) {
690 baseIndex = inventoryItems.indexOf(m);
691 } else if (m.vfModule != null && m.vfModule.isBaseVfModule == false && m.vfModule.orchestrationStatus == null) {
692 nonBaseIndex = inventoryItems.indexOf(m);
695 if (baseIndex != -1 && nonBaseIndex != -1) {
700 // Report the error if either base vf module or non-base vf module is not found
702 if (baseIndex == -1 || nonBaseIndex == -1) {
703 System.err.println("Either base or non-base vf module is not found from AAI response.");
704 retract($aainqf199RequestWrapper);
705 retract($aainqf199ResponseWrapper);
711 // This comes from the base module
713 vfModuleItemVfModuleName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(baseIndex).vfModule.vfModuleName;
714 vfModuleItemVfModuleName = vfModuleItemVfModuleName.replace("Vfmodule", "vDNS");
716 // vfModuleItem - NOT the base module
718 vfModuleItemPersonaModelId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelId;
719 vfModuleItemPersonaModelVersion = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).vfModule.personaModelVersion;
720 vfModuleItemModelName = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(0).propertyValue;
721 vfModuleItemModelNameVersionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(nonBaseIndex).extraProperties.extraProperty.get(4).propertyValue;
725 tenantItemTenantId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).tenant.tenantId;
729 cloudRegionItemCloudRegionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).items.inventoryResponseItems.get(0).cloudRegion.cloudRegionId;
731 } catch (Exception e) {
733 VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
734 notification.notification = ControlLoopNotificationType.REJECTED;
735 notification.message = "Exception occurred " + e.getMessage();
736 notification.policyName = drools.getRule().getName();
737 notification.policyScope = "${policyScope}";
738 notification.policyVersion = "${policyVersion}";
741 System.out.println(Serialization.gsonPretty.toJson(notification));
742 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
743 } catch (Exception e1) {
744 System.out.println("Can't deliver notification: " + notification);
745 e1.printStackTrace();
748 notification.notification = ControlLoopNotificationType.FINAL_FAILURE;
749 notification.message = "Invalid named-query response from AAI";
752 System.out.println(Serialization.gsonPretty.toJson(notification));
753 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
754 } catch (Exception e1) {
755 System.out.println("Can't deliver notification: " + notification);
756 e1.printStackTrace();
759 // Retract everything
761 retract($aainqf199RequestWrapper);
762 retract($aainqf199ResponseWrapper);
768 // Extracted fields should not be null
770 if ((vnfItemVnfId == null) || (vnfItemVnfType == null) ||
771 (vnfItemPersonaModelId == null) || (vnfItemModelName == null) ||
772 (vnfItemModelVersion == null) || (vnfItemModelNameVersionId == null) ||
773 (serviceItemServiceInstanceId == null) || (serviceItemModelName == null) ||
774 (serviceItemModelType == null) || (serviceItemModelVersion == null) ||
775 (serviceItemModelNameVersionId == null) || (vfModuleItemVfModuleName == null) ||
776 (vfModuleItemPersonaModelId == null) || (vfModuleItemPersonaModelVersion == null) ||
777 (vfModuleItemModelName == null) || (vfModuleItemModelNameVersionId == null) ||
778 (tenantItemTenantId == null) || (cloudRegionItemCloudRegionId == null)) {
780 System.err.println("some fields are missing from AAI response.");
782 // Fail and retract everything
784 retract($aainqf199RequestWrapper);
785 retract($aainqf199ResponseWrapper);
791 // We don't need them any more
793 retract($aainqf199ResponseWrapper);
794 retract($aainqf199RequestWrapper);
796 // check the actor of this closed loop
798 switch ($params.getActor()) {
802 // Construct an APPC request
804 ControlLoopOperation operation = new ControlLoopOperation();
805 operation.actor = $params.getActor();
806 operation.operation = "ModifyConfig";
807 operation.target = $event.target;
809 // Create operationWrapper
811 ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);
813 // insert operationWrapper into memory
815 insert(operationWrapper);
817 Request request = new Request();
818 request.CommonHeader = new CommonHeader();
819 request.CommonHeader.RequestID = $event.requestID;
820 request.Action = operation.operation;
821 request.Payload = new HashMap<String, Object>();
823 // Fill in the payload
824 // Hardcode genericVNF for now since AAI has not been ready for vFirewall demo case
826 String genericVNF = "zdfw1fwl01pgn02";
827 request.Payload.put("generic-vnf.vnf-id", genericVNF);
829 PGRequest pgRequest = new PGRequest();
830 pgRequest.pgStreams = new PGStreams();
833 for(int i = 0; i < 5; i++){
834 pgStream = new PGStream();
835 pgStream.streamId = "fw_udp"+(i+1);
836 pgStream.isEnabled = "true";
837 pgRequest.pgStreams.pgStream.add(pgStream);
839 request.Payload.put("pg-streams", pgRequest.pgStreams);
841 if (request != null) {
843 // Insert request into memory
847 // Tell interested parties we are performing this Operation
849 VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
850 notification.notification = ControlLoopNotificationType.OPERATION;
851 // message and history ??
852 notification.from = "policy";
853 notification.policyName = drools.getRule().getName();
854 notification.policyScope = "${policyScope}";
855 notification.policyVersion = "${policyVersion}";
857 System.out.println(Serialization.gsonPretty.toJson(notification));
858 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
859 } catch (Exception e) {
860 System.out.println("Can't deliver notification: " + notification);
864 // Now send the operation request
866 if (request instanceof Request) {
868 System.out.println("APPC request sent:");
869 System.out.println(Serialization.gsonPretty.toJson(request));
870 //PolicyEngine.manager.deliver($params.getAppcTopic(), request);
871 } catch (Exception e) {
873 System.out.println("Can't deliver request: " + request);
878 // what happens if it is null
886 // Construct an operation
888 ControlLoopOperation operation = new ControlLoopOperation();
889 operation.actor = $params.getActor();
890 operation.operation = "createModuleInstance";
891 operation.target = $event.target;
893 // Create operationWrapper
895 ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);
897 // Construct an MSO request
899 MSORequest request = new MSORequest();
900 request.requestDetails = new MSORequestDetails();
901 request.requestDetails.modelInfo = new MSOModelInfo();
902 request.requestDetails.cloudConfiguration = new MSOCloudConfiguration();
903 request.requestDetails.requestInfo = new MSORequestInfo();
904 request.requestDetails.requestParameters = new MSORequestParameters();
905 request.requestDetails.requestParameters.userParams = null;
907 // cloudConfiguration
909 request.requestDetails.cloudConfiguration.lcpCloudRegionId = cloudRegionItemCloudRegionId;
910 request.requestDetails.cloudConfiguration.tenantId = tenantItemTenantId;
914 request.requestDetails.modelInfo.modelType = "vfModule";
915 request.requestDetails.modelInfo.modelInvariantId = vfModuleItemPersonaModelId;
916 request.requestDetails.modelInfo.modelNameVersionId = vfModuleItemModelNameVersionId;
917 request.requestDetails.modelInfo.modelName = vfModuleItemModelName;
918 request.requestDetails.modelInfo.modelVersion = vfModuleItemPersonaModelVersion;
922 request.requestDetails.requestInfo.instanceName = vfModuleItemVfModuleName;
923 request.requestDetails.requestInfo.source = "POLICY";
924 request.requestDetails.requestInfo.suppressRollback = false;
926 // relatedInstanceList
928 MSORelatedInstanceListElement relatedInstanceListElement1 = new MSORelatedInstanceListElement();
929 MSORelatedInstanceListElement relatedInstanceListElement2 = new MSORelatedInstanceListElement();
930 relatedInstanceListElement1.relatedInstance = new MSORelatedInstance();
931 relatedInstanceListElement2.relatedInstance = new MSORelatedInstance();
933 relatedInstanceListElement1.relatedInstance.instanceId = serviceItemServiceInstanceId;
934 relatedInstanceListElement1.relatedInstance.modelInfo = new MSOModelInfo();
935 relatedInstanceListElement1.relatedInstance.modelInfo.modelType = "service";
936 relatedInstanceListElement1.relatedInstance.modelInfo.modelInvariantId = serviceItemPersonaModelId;
937 relatedInstanceListElement1.relatedInstance.modelInfo.modelNameVersionId = serviceItemModelNameVersionId;
938 relatedInstanceListElement1.relatedInstance.modelInfo.modelName = serviceItemModelName;
939 relatedInstanceListElement1.relatedInstance.modelInfo.modelVersion = serviceItemModelVersion;
941 relatedInstanceListElement2.relatedInstance.instanceId = vnfItemVnfId;
942 relatedInstanceListElement2.relatedInstance.modelInfo = new MSOModelInfo();
943 relatedInstanceListElement2.relatedInstance.modelInfo.modelType = "vnf";
944 relatedInstanceListElement2.relatedInstance.modelInfo.modelInvariantId = vnfItemPersonaModelId;
945 relatedInstanceListElement2.relatedInstance.modelInfo.modelNameVersionId = vnfItemModelNameVersionId;
946 relatedInstanceListElement2.relatedInstance.modelInfo.modelName = vnfItemModelName;
947 relatedInstanceListElement2.relatedInstance.modelInfo.modelVersion = vnfItemPersonaModelVersion;
948 relatedInstanceListElement2.relatedInstance.modelInfo.modelCustomizationName = vnfItemVnfType;
950 request.requestDetails.relatedInstanceList.add(relatedInstanceListElement1);
951 request.requestDetails.relatedInstanceList.add(relatedInstanceListElement2);
953 // print MSO request for debug
955 System.out.println("MSO request sent:");
956 System.out.println(Serialization.gsonPretty.toJson(request));
960 if (request != null) {
962 // Tell interested parties we are performing this Operation
964 VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
965 notification.notification = ControlLoopNotificationType.OPERATION;
966 notification.from = "policy";
967 notification.policyName = drools.getRule().getName();
968 notification.policyScope = "${policyScope}";
969 notification.policyVersion = "${policyVersion}";
971 System.out.println(Serialization.gsonPretty.toJson(notification));
972 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
973 } catch (Exception e) {
974 System.out.println("Can't deliver notification: " + notification);
978 // Concatenate serviceItemServiceInstanceId and vnfItemVnfId to msoURL
980 String MSOUrl = $params.getMsoURL() + "/serviceInstances/v2/" + serviceItemServiceInstanceId + "/vnfs/" + vnfItemVnfId + "/vfModules";
984 MSOResponse response = MSOManager.createModuleInstance(MSOUrl, $params.getMsoURL(), $params.getMsoUsername(), $params.getMsoPassword(), request);
988 //////////////////////////////////////////////////////////
989 // Simulate a valid MSOResponse for junit test
990 // Remove this for real deployment
992 response = new MSOResponse();
993 response.request = new MSORequest();
994 response.request.requestStatus = new MSORequestStatus();
995 response.request.requestStatus.requestState = "COMPLETE";
996 //////////////////////////////////////////////////////////
1002 if (response != null) {
1006 request.requestId = $event.requestID.toString();
1007 response.request.requestId = $event.requestID.toString();
1011 insert(operationWrapper);
1016 // MSO request not even accepted
1018 notification.message = operationWrapper.operation.toMessage();
1019 operationWrapper.operation.message = operationWrapper.operation.toMessage();
1020 operationWrapper.operation.outcome = "FAILURE_EXCEPTION";
1021 $manager.setControlLoopResult("FAILURE_EXCEPTION");
1022 notification.history.add(operationWrapper.operation);
1023 notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;
1025 // Let interested parties know
1028 System.out.println(Serialization.gsonPretty.toJson(notification));
1029 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1030 } catch (Exception e) {
1031 System.out.println("Can't deliver notification: " + notification);
1032 e.printStackTrace();
1034 notification.notification = ControlLoopNotificationType.FINAL_FAILURE;
1036 System.out.println(Serialization.gsonPretty.toJson(notification));
1037 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1038 } catch (Exception e) {
1039 System.out.println("Can't deliver notification: " + notification);
1040 e.printStackTrace();
1043 // Retract everything
1049 System.err.println("constructed MSO request is invalid.");
1058 * This rule responds to APPC Response Events
1061 rule "${policyName}.APPC.RESPONSE"
1063 $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
1064 $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
1065 $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )
1066 $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )
1067 $request : Request( getCommonHeader().RequestID == $event.requestID )
1068 $response : Response( getCommonHeader().RequestID == $event.requestID )
1070 System.out.println("rule APPC.RESPONSE is triggered.");
1071 if ($response.Status == null) {
1072 $operationWrapper.operation.outcome = "FAILURE_EXCEPTION";
1073 $manager.setControlLoopResult("FAILURE_EXCEPTION");
1076 // Get the Response Code
1078 ResponseCode code = ResponseCode.toResponseCode($response.Status.Code);
1080 $operationWrapper.operation.outcome = "FAILURE_EXCEPTION";
1081 $manager.setControlLoopResult("FAILURE_EXCEPTION");
1084 // Construct notification
1086 VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
1087 notification.from = "policy";
1088 notification.policyName = drools.getRule().getName();
1089 notification.policyScope = "${policyScope}";
1090 notification.policyVersion = "${policyVersion}";
1091 notification.message = $operationWrapper.operation.toMessage();
1092 $operationWrapper.operation.message = $operationWrapper.operation.toMessage();
1094 // Ok, let's figure out what APP-C's response is
1098 $operationWrapper.operation.outcome = "PROCESSING";
1102 $operationWrapper.operation.outcome = "FAILURE_EXCEPTION";
1103 $manager.setControlLoopResult("FAILURE_EXCEPTION");
1106 $operationWrapper.operation.outcome = "SUCCESS";
1107 $manager.setControlLoopResult("SUCCESS");
1110 $operationWrapper.operation.outcome = "FAILURE";
1111 $manager.setControlLoopResult("FAILURE");
1114 if ($operationWrapper.operation.outcome.equals("SUCCESS")) {
1115 notification.history.add($operationWrapper.operation);
1116 notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;
1118 // Let interested parties know
1121 System.out.println(Serialization.gsonPretty.toJson(notification));
1122 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1123 } catch (Exception e) {
1124 System.out.println("Can't deliver notification: " + notification);
1125 e.printStackTrace();
1127 notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;
1129 System.out.println(Serialization.gsonPretty.toJson(notification));
1130 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1131 } catch (Exception e) {
1132 System.out.println("Can't deliver notification: " + notification);
1133 e.printStackTrace();
1137 // We are going to retract these objects from memory
1139 System.out.println("Retracting everything");
1140 retract($operationWrapper);
1145 } else if ($operationWrapper.operation.outcome.equals("PROCESSING")) {
1148 notification.history.add($operationWrapper.operation);
1149 notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;
1151 // Let interested parties know
1154 System.out.println(Serialization.gsonPretty.toJson(notification));
1155 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1156 } catch (Exception e) {
1157 System.out.println("Can't deliver notification: " + notification);
1158 e.printStackTrace();
1160 notification.notification = ControlLoopNotificationType.FINAL_FAILURE;
1162 // Let interested parties know
1165 System.out.println(Serialization.gsonPretty.toJson(notification));
1166 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1167 } catch (Exception e) {
1168 System.out.println("Can't deliver notification: " + notification);
1169 e.printStackTrace();
1172 // We are going to retract these objects from memory
1174 System.out.println("Retracting everything");
1175 retract($operationWrapper);
1186 * This rule is used to clean up APPC response
1189 rule "${policyName}.APPC.RESPONSE.CLEANUP"
1191 $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
1192 $response : Response($id : getCommonHeader().RequestID )
1193 not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) )
1195 System.out.println("rule APPC.RESPONSE.CLEANUP is triggered.");
1201 * This rule responds to MSO Response Events
1204 rule "${policyName}.MSO.RESPONSE"
1206 $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
1207 $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
1208 $manager : EventManager( closedLoopControlName == $event.closedLoopControlName )
1209 $operationWrapper : ControlLoopOperationWrapper( requestID == $event.requestID )
1210 $request : MSORequest( requestId == $event.requestID.toString() )
1211 $response : MSOResponse( request.requestId == $event.requestID.toString() )
1213 System.out.println("rule MSO.RESPONSE is triggered.");
1215 // Construct notification
1217 VirtualControlLoopNotification notification = new VirtualControlLoopNotification($event);
1218 notification.from = "policy";
1219 notification.policyName = drools.getRule().getName();
1220 notification.policyScope = "${policyScope}";
1221 notification.policyVersion = "${policyVersion}";
1222 notification.message = $operationWrapper.operation.toMessage();
1223 $operationWrapper.operation.message = $operationWrapper.operation.toMessage();
1225 // The operation can either be succeeded or failed
1227 if($response.request.requestStatus.requestState.equals("COMPLETE")) {
1228 $operationWrapper.operation.outcome = "SUCCESS";
1229 $manager.setControlLoopResult("SUCCESS");
1230 notification.history.add($operationWrapper.operation);
1231 notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;
1233 // Let interested parties know
1236 System.out.println(Serialization.gsonPretty.toJson(notification));
1237 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1238 } catch (Exception e) {
1239 System.out.println("Can't deliver notification: " + notification);
1240 e.printStackTrace();
1242 notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;
1244 // Let interested parties know
1247 System.out.println(Serialization.gsonPretty.toJson(notification));
1248 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1249 } catch (Exception e) {
1250 System.out.println("Can't deliver notification: " + notification);
1251 e.printStackTrace();
1254 // We are going to retract these objects from memory
1256 System.out.println("Retracting everything");
1257 retract($operationWrapper);
1263 $operationWrapper.operation.outcome = "FAILURE";
1264 $manager.setControlLoopResult("FAILURE");
1265 notification.history.add($operationWrapper.operation);
1266 notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;
1268 // Let interested parties know
1271 System.out.println(Serialization.gsonPretty.toJson(notification));
1272 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1273 } catch (Exception e) {
1274 System.out.println("Can't deliver notification: " + notification);
1275 e.printStackTrace();
1277 notification.notification = ControlLoopNotificationType.FINAL_FAILURE;
1279 // Let interested parties know
1282 System.out.println(Serialization.gsonPretty.toJson(notification));
1283 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
1284 } catch (Exception e) {
1285 System.out.println("Can't deliver notification: " + notification);
1286 e.printStackTrace();
1289 // We are going to retract these objects from memory
1291 System.out.println("Retracting everything");
1292 retract($operationWrapper);