[POLICY-11] Sample Query with variable arguments
[policy/drools-applications.git] / template.demo / src / main / resources / archetype-resources / src / main / resources / ControlLoopDemo__closedLoopControlName__.drl
1 /*-
2  * ============LICENSE_START=======================================================
3  * demo
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21
22 package org.openecomp.policy.controlloop;
23
24 import java.util.List;
25 import java.util.LinkedList;
26 import java.util.Map;
27 import java.util.HashMap;
28 import java.util.UUID;
29
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;
37
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;
57
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;
64
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;
69
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;
81
82 //import org.openecomp.policy.drools.system.PolicyEngine;
83
84 //
85 // These parameters are required to build the runtime policy
86 //
87 declare Params
88     closedLoopControlName : String
89     actor : String
90     aaiURL : String
91     aaiUsername : String
92     aaiPassword : String
93     msoURL : String
94     msoUsername : String
95     msoPassword : String
96     aaiNamedQueryUUID : String
97     aaiPatternMatch : int 
98     notificationTopic : String
99     appcTopic : String
100 end
101
102 /*
103 *
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)
106 *
107 */
108 rule "${policyName}.SETUP"
109         when
110         then
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}");
125                 //
126                 // This stays in memory as long as the rule is alive and running
127                 //
128                 insert(params);
129 end
130
131 /*
132 *
133 * This rule responds to DCAE Events
134 *
135 */
136 rule "${policyName}.EVENT"
137         when
138         $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
139         $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
140         not ( EventManager( closedLoopControlName == $event.closedLoopControlName ))
141         then
142                 System.out.println("rule EVENT is triggered.");
143                 try {
144                         // 
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/
147                         //
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}";
156                                 //
157                                 // Let interested parties know
158                                 //
159                                 try {
160                                         System.out.println(Serialization.gsonPretty.toJson(notification));
161                                         //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
162                                 } catch (Exception e) {
163                                         e.printStackTrace();
164                                         System.out.println("Can't deliver notification: " + notification);
165                                 }
166                                 //
167                                 // Retract it from memory
168                                 //
169                                 retract($event);
170                                 System.out.println("Event with requestID=null has been retracted.");
171                         } else {
172                                 //
173                                 // Create an EventManager
174                                 //
175                                 EventManager manager = new EventManager($params.getClosedLoopControlName(), $event.requestID, $event.target);
176                                 //
177                                 // Determine if EventManager can actively process the event (i.e. syntax)
178                                 //
179                                 VirtualControlLoopNotification notification = manager.activate($event);
180                                 notification.from = "policy"; 
181                                 notification.policyName = drools.getRule().getName();
182                                 notification.policyScope = "${policyScope}";
183                                 notification.policyVersion = "${policyVersion}";
184                                 //
185                                 // Are we actively pursuing this event?
186                                 //
187                                 if (notification.notification == ControlLoopNotificationType.ACTIVE) {
188                                         //
189                                         // Insert Event Manager into memory, this will now kick off processing.
190                                         //
191                                         insert(manager);
192                                         //
193                                         // Let interested parties know
194                                         //
195                                         try {
196                                                 System.out.println(Serialization.gsonPretty.toJson(notification));
197                                                 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
198                                         } catch (Exception e) {
199                                                 e.printStackTrace();
200                                                 System.out.println("Can't deliver notification: " + notification);
201                                         }               
202                                 } else {
203                                         //
204                                         // Let interested parties know
205                                         //
206                                         try {
207                                                 System.out.println(Serialization.gsonPretty.toJson(notification));
208                                                 //PolicyEngine.manager.deliver($params.getNotificationTopic(), notification);
209                                         } catch (Exception e) {
210                                                 e.printStackTrace();
211                                                 System.out.println("Can't deliver notification: " + notification);
212                                         }
213                                         //
214                                         // Retract it from memory
215                                         //
216                                         retract($event);
217                                 }
218                                 //
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.
223                                 //
224                         }
225                 //
226                 } catch (Exception e) {
227                         e.printStackTrace();
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}";
234                         //
235                         //
236                         //
237                         try {
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();
243                         }
244                         //
245                         // Retract the event
246                         //
247                         retract($event);
248                 }
249 end
250
251 /*
252 *
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.
255 *
256 */
257 rule "${policyName}.EVENT.MANAGER"
258         when
259                 $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
260                 $event : VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), closedLoopEventStatus == ControlLoopEventStatus.ONSET )
261                 $manager : EventManager( closedLoopControlName == $event.closedLoopControlName, controlLoopResult == null)
262         then
263                 System.out.println("rule EVENT.MANAGER is triggered.");
264                 //
265                 // Check which event this is.
266                 //
267                 EventManager.NEW_EVENT_STATUS eventStatus = $manager.onNewEvent($event);
268                 //
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.
272                 //
273                 if (eventStatus != EventManager.NEW_EVENT_STATUS.FIRST_ONSET) {
274                         System.out.println("Retracting "+eventStatus+" Event.");
275                         retract($event);
276                         return;
277                 }
278                 //
279                 // Now the event in memory is first onset event
280                 //
281                 try {
282                         //
283                         // Pull the known AAI field from the Event
284                         //
285                         // generic-vnf is needed for vFirewall case
286                         // vserver-name is needed for vLoadBalancer case
287                         //
288                         String genericVNF = $event.AAI.get("generic-vnf.vnf-id");
289                         String vserver = $event.AAI.get("vserver.vserver-name");
290                         //
291                         // Check if we are implementing a simple pattern match.
292                         //
293                         if ($params.getAaiPatternMatch() == 1) {
294                                 //
295                                 // Yes
296                                 //
297                                 //Basic naming characteristics:
298                                 //VF Name (9 char)+VM name (13 char total)+VFC (19 char total)
299                                 //Example: 
300                                 //VF Name (9 characters):    cscf0001v
301                                 //VM Name(13 characters): cscf0001vm001
302                                 //VFC name(19 characters): cscf0001vm001cfg001
303                                 //
304                                 // zdfw1fwl01fwl02 or zdfw1fwl01fwl01  
305                                 // replaced with
306                                 // zdfw1fwl01pgn02 or zdfw1fwl01pgn01
307                                 //
308                                 int index = genericVNF.lastIndexOf("fwl");
309                                 if (index == -1) {
310                                         System.err.println("The generic-vnf.vnf-id from DCAE Event is not valid.");
311                                 } else {
312                                         genericVNF = genericVNF.substring(0, index) + "pgn" + genericVNF.substring(index+"fwl".length());
313                                 }
314                                 //
315                                 // Construct an APPC request
316                                 //
317                                 ControlLoopOperation operation = new ControlLoopOperation();
318                                 operation.actor = $params.getActor();
319                                 operation.operation = "ModifyConfig";
320                                 operation.target = $event.target;
321                                 //
322                                 // Create operationWrapper
323                                 //
324                                 ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);
325                                 //
326                                 // insert operationWrapper into memory
327                                 //
328                                 insert(operationWrapper);
329                                 //
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>();
335                                 //
336                                 // Fill in the payload
337                                 //
338                                 request.Payload.put("generic-vnf.vnf-id", genericVNF);
339                                 //
340                                 PGRequest pgRequest = new PGRequest();
341                                 pgRequest.pgStreams = new PGStreams();
342                                 
343                                 PGStream pgStream;
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);
349                                 }
350                                 request.Payload.put("pg-streams", pgRequest.pgStreams);
351                                 
352                                 if (request != null) {
353                                         //
354                                         // Insert request into memory
355                                         //
356                                         insert(request);
357                                         //
358                                         // Tell interested parties we are performing this Operation
359                                         //
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}";
367                                         try {
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);
372                                                 e.printStackTrace();
373                                         }
374                                         //
375                                         // Now send the operation request
376                                         //
377                                         if (request instanceof Request) {
378                                                 try {
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) {
383                                                         e.printStackTrace();
384                                                         System.out.println("Can't deliver request: " + request);
385                                                 }
386                                         }
387                                 } else {
388                                         //
389                                         // what happens if it is null
390                                         //
391                                 }
392                                 //
393                         } else {
394                                 //
395                                 // create AAI named-query request with UUID started with "F199"
396                                 //
397                                 AAINQF199Request aainqf199request = new AAINQF199Request();
398                                 AAINQF199QueryParameters aainqf199queryparam = new AAINQF199QueryParameters();
399                                 AAINQF199NamedQuery aainqf199namedquery = new AAINQF199NamedQuery();
400                                 AAINQF199InstanceFilters aainqf199instancefilter = new AAINQF199InstanceFilters();
401                                 //
402                                 // queryParameters
403                                 //
404                                 aainqf199namedquery.namedQueryUUID = UUID.fromString($params.getAaiNamedQueryUUID()); 
405                                 aainqf199queryparam.namedQuery = aainqf199namedquery;
406                                 aainqf199request.queryParameters = aainqf199queryparam;
407                                 //
408                                 // instanceFilters
409                                 //
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;
416                                 //
417                                 // print aainqf199request for debug
418                                 //
419                                 System.out.println("AAI Request sent:");
420                                 System.out.println(Serialization.gsonPretty.toJson(aainqf199request));
421                                 //
422                                 // Create AAINQF199RequestWrapper
423                                 //
424                                 AAINQF199RequestWrapper aainqf199RequestWrapper = new AAINQF199RequestWrapper($event.requestID, aainqf199request);
425                                 //
426                                 // insert aainqf199request into memory
427                                 //
428                                 insert(aainqf199RequestWrapper);
429                         }
430                         //
431                 } catch (Exception e) {
432                  e.printStackTrace();
433                 }
434 end
435
436 /*
437 *
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.
440 *
441 */
442 rule "${policyName}.EVENT.MANAGER.AAINQF199REQUEST"
443         when
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)
448         then
449                 System.out.println("rule EVENT.MANAGER.AAINQF199REQUEST is triggered.");
450                 //
451                 // send the request
452                 //
453                 AAINQF199Response aainqf199response = AAINQF199Manager.postQuery($params.getAaiURL(), $params.getAaiUsername(), $params.getAaiPassword(),
454                                                                                                            $aainqf199RequestWrapper.aainqf199request, $event.requestID);
455                 
456                 
457                 
458                 //////////////////////////////////////////////////////////
459                 // Simulate a valid aainqf199response for junit test
460                 // Remove this for real deployment
461                 //
462                 
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"));
477                 
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";
489
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"));
496
497
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";
507
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"));
514
515
516
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";
528
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"));
535
536
537
538
539                 
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);
570                 
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";
578                 
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);
587                 
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);
602                 
603                 aainqf199response = new AAINQF199Response();
604                 aainqf199response.inventoryResponseItems.add(vserverItem);
605                 
606                 System.out.println("PAM");
607                 System.out.println(Serialization.gsonPretty.toJson(aainqf199response));
608                 
609                 //////////////////////////////////////////////////////////
610                 
611                 
612                 
613                 
614                 
615                 //
616                 // Check AAI response
617                 //
618                 if (aainqf199response == null) {
619                         System.err.println("Failed to get AAI response");
620                         //
621                         // Fail and retract everything
622                         //
623                         retract($event);
624                         retract($manager);
625                         retract($aainqf199RequestWrapper);
626                 } else {
627                         //
628                         // Create AAINQF199ResponseWrapper
629                         //
630                         AAINQF199ResponseWrapper aainqf199ResponseWrapper = new AAINQF199ResponseWrapper($event.requestID, aainqf199response);
631                         //
632                         // insert aainqf199ResponseWrapper to memeory
633                         //
634                         insert(aainqf199ResponseWrapper);
635                 }
636 end
637
638 /*
639 *
640 * This rule happens when we got a valid AAI response. We can start sending request to APPC or MSO now.
641 *
642 */
643 rule "${policyName}.EVENT.MANAGER.AAINQF199RESPONSE"
644         when 
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)
650         then
651                 System.out.println("rule EVENT.MANAGER.AAINQF199RESPONSE is triggered.");
652                 //
653                 // Extract related fields out of AAINQF199RESPONSE
654                 //
655                 //
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;
661                 try {
662                         //
663                         // vnfItem
664                         //
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;
673                         //
674                         // serviceItem
675                         //
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;
682                         //
683                         // Find the index for base vf module and non-base vf module
684                         //
685                         int baseIndex = -1;
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);
693                                 }
694                                 //
695                                 if (baseIndex != -1 && nonBaseIndex != -1) {
696                                         break;
697                                 }
698                         }
699                         //
700                         // Report the error if either base vf module or non-base vf module is not found
701                         //
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);
706                                 retract($manager);
707                                 retract($event);
708                                 return;
709                         }
710                         //
711                         // This comes from the base module
712                         //
713                         vfModuleItemVfModuleName =                      $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(0).items.inventoryResponseItems.get(baseIndex).vfModule.vfModuleName;
714                         vfModuleItemVfModuleName = vfModuleItemVfModuleName.replace("Vfmodule", "vDNS");
715                         //
716                         // vfModuleItem - NOT the base module
717                         //
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;
722                         //
723                         // tenantItem
724                         //
725                         tenantItemTenantId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).tenant.tenantId;
726                         //
727                         // cloudRegionItem
728                         //
729                         cloudRegionItemCloudRegionId = $aainqf199ResponseWrapper.aainqf199response.inventoryResponseItems.get(0).items.inventoryResponseItems.get(1).items.inventoryResponseItems.get(0).cloudRegion.cloudRegionId;
730                         //
731                 } catch (Exception e) {
732                         e.printStackTrace();
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}";
739                         //
740                         try {
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();
746                         }
747                         //
748                         notification.notification = ControlLoopNotificationType.FINAL_FAILURE;
749                         notification.message = "Invalid named-query response from AAI";
750             //
751             try {
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();
757             }
758                         //
759                         // Retract everything
760                         //
761                         retract($aainqf199RequestWrapper);
762                         retract($aainqf199ResponseWrapper);
763                         retract($manager);
764                         retract($event);
765                         return;
766                 }       
767                 //
768                 // Extracted fields should not be null
769                 //
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)) {
779                         //
780                         System.err.println("some fields are missing from AAI response.");
781                         //
782                         // Fail and retract everything
783                         //
784                         retract($aainqf199RequestWrapper);
785                         retract($aainqf199ResponseWrapper);
786                         retract($manager);
787                         retract($event);
788                         return;
789                 }
790                 //
791                 // We don't need them any more
792                 //
793                 retract($aainqf199ResponseWrapper);
794                 retract($aainqf199RequestWrapper);  
795                 //
796                 // check the actor of this closed loop
797                 //
798                 switch ($params.getActor()) {
799                         case "APPC":
800                         {
801                                 //
802                                 // Construct an APPC request
803                                 //
804                                 ControlLoopOperation operation = new ControlLoopOperation();
805                                 operation.actor = $params.getActor();
806                                 operation.operation = "ModifyConfig";
807                                 operation.target = $event.target;
808                                 //
809                                 // Create operationWrapper
810                                 //
811                                 ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);
812                                 //
813                                 // insert operationWrapper into memory
814                                 //
815                                 insert(operationWrapper);
816                                 //
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>();
822                                 //
823                                 // Fill in the payload
824                                 // Hardcode genericVNF for now since AAI has not been ready for vFirewall demo case
825                                 //
826                                 String genericVNF = "zdfw1fwl01pgn02";
827                                 request.Payload.put("generic-vnf.vnf-id", genericVNF);
828                                 //
829                                 PGRequest pgRequest = new PGRequest();
830                                 pgRequest.pgStreams = new PGStreams();
831                                 
832                                 PGStream pgStream;
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);
838                                 }
839                                 request.Payload.put("pg-streams", pgRequest.pgStreams);
840                                 
841                                 if (request != null) {
842                                         //
843                                         // Insert request into memory
844                                         //
845                                         insert(request);
846                                         //
847                                         // Tell interested parties we are performing this Operation
848                                         //
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}";
856                                         try {
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);
861                                                 e.printStackTrace();
862                                         }
863                                         //
864                                         // Now send the operation request
865                                         //
866                                         if (request instanceof Request) {
867                                                 try {
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) {
872                                                         e.printStackTrace();
873                                                         System.out.println("Can't deliver request: " + request);
874                                                 }
875                                         }
876                                 } else {
877                                         //
878                                         // what happens if it is null
879                                         //
880                                 }
881                         }
882                         break;
883                         case "MSO":
884                         {
885                                 //
886                                 // Construct an operation
887                                 //
888                                 ControlLoopOperation operation = new ControlLoopOperation();
889                                 operation.actor = $params.getActor();
890                                 operation.operation = "createModuleInstance";
891                                 operation.target = $event.target;
892                                 //
893                                 // Create operationWrapper
894                                 //
895                                 ControlLoopOperationWrapper operationWrapper = new ControlLoopOperationWrapper($event.requestID, operation);
896                                 //
897                                 // Construct an MSO request
898                                 //
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;
906                                 //
907                                 // cloudConfiguration
908                                 //
909                                 request.requestDetails.cloudConfiguration.lcpCloudRegionId = cloudRegionItemCloudRegionId;
910                                 request.requestDetails.cloudConfiguration.tenantId = tenantItemTenantId;
911                                 //
912                                 // modelInfo
913                                 //
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;
919                                 //
920                                 // requestInfo
921                                 //
922                                 request.requestDetails.requestInfo.instanceName = vfModuleItemVfModuleName;
923                                 request.requestDetails.requestInfo.source = "POLICY";
924                                 request.requestDetails.requestInfo.suppressRollback = false;
925                                 //
926                                 // relatedInstanceList
927                                 //
928                                 MSORelatedInstanceListElement relatedInstanceListElement1 = new MSORelatedInstanceListElement();
929                                 MSORelatedInstanceListElement relatedInstanceListElement2 = new MSORelatedInstanceListElement();
930                                 relatedInstanceListElement1.relatedInstance = new MSORelatedInstance();
931                                 relatedInstanceListElement2.relatedInstance = new MSORelatedInstance();
932                                 //
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;
940                                 //
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;
949                                 //      
950                                 request.requestDetails.relatedInstanceList.add(relatedInstanceListElement1);
951                                 request.requestDetails.relatedInstanceList.add(relatedInstanceListElement2);
952                                 //
953                                 // print MSO request for debug
954                                 //
955                                 System.out.println("MSO request sent:");
956                                 System.out.println(Serialization.gsonPretty.toJson(request));
957                                 //
958                                 //
959                                 //
960                                 if (request != null) {
961                                         //
962                                         // Tell interested parties we are performing this Operation
963                                         //
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}";
970                                         try {
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);
975                                                 e.printStackTrace();
976                                         }
977                                         //
978                                         // Concatenate serviceItemServiceInstanceId and vnfItemVnfId to msoURL
979                                         //
980                                         String MSOUrl = $params.getMsoURL() + "/serviceInstances/v2/" + serviceItemServiceInstanceId + "/vnfs/" + vnfItemVnfId + "/vfModules";
981                                         //
982                                         // Call MSO
983                                         //
984                                         MSOResponse response = MSOManager.createModuleInstance(MSOUrl, $params.getMsoURL(), $params.getMsoUsername(), $params.getMsoPassword(), request);
985                                         
986                                         
987                                         
988                                         //////////////////////////////////////////////////////////
989                                         // Simulate a valid MSOResponse for junit test
990                                         // Remove this for real deployment
991                                         //
992                                         response = new MSOResponse();
993                                         response.request = new MSORequest();
994                                         response.request.requestStatus = new MSORequestStatus();
995                                         response.request.requestStatus.requestState = "COMPLETE";
996                                         //////////////////////////////////////////////////////////
997                                         
998                                         
999                                         
1000                                         
1001                                         
1002                                         if (response != null) {
1003                                                 //
1004                                                 // Assign requestId
1005                                                 //
1006                                                 request.requestId = $event.requestID.toString();                                                
1007                                                 response.request.requestId = $event.requestID.toString();
1008                                                 //
1009                                                 // Insert facts
1010                                                 //
1011                                                 insert(operationWrapper);
1012                                                 insert(request);
1013                                                 insert(response);
1014                                         } else {
1015                                                 //
1016                                                 // MSO request not even accepted
1017                                                 //
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;
1024                                                 //
1025                                                 // Let interested parties know
1026                                                 //
1027                                                 try {
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();
1033                                                 }
1034                             notification.notification = ControlLoopNotificationType.FINAL_FAILURE;
1035                         try {
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();
1041                         }
1042                                                 //
1043                                                 // Retract everything
1044                                                 //
1045                                                 retract($event);
1046                                                 retract($manager);
1047                                         }
1048                                 } else {
1049                                         System.err.println("constructed MSO request is invalid.");
1050                                 }
1051                         }
1052                         break; 
1053                 } 
1054 end
1055                 
1056 /*
1057 *
1058 * This rule responds to APPC Response Events
1059 *
1060 */
1061 rule "${policyName}.APPC.RESPONSE"
1062         when
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 ) 
1069         then
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");
1074                 } 
1075                 //
1076                 // Get the Response Code
1077                 //
1078                 ResponseCode code = ResponseCode.toResponseCode($response.Status.Code);
1079                 if (code == null) {
1080                         $operationWrapper.operation.outcome = "FAILURE_EXCEPTION";
1081                         $manager.setControlLoopResult("FAILURE_EXCEPTION");
1082                 }
1083                 //
1084                 // Construct notification
1085                 //
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();
1093                 //
1094                 // Ok, let's figure out what APP-C's response is
1095                 //
1096                 switch (code) {
1097                         case ACCEPT:
1098                                 $operationWrapper.operation.outcome = "PROCESSING";
1099                                 break;
1100                         case ERROR:
1101                         case REJECT:
1102                                 $operationWrapper.operation.outcome = "FAILURE_EXCEPTION";
1103                                 $manager.setControlLoopResult("FAILURE_EXCEPTION");
1104                                 break;
1105                         case SUCCESS:
1106                                 $operationWrapper.operation.outcome = "SUCCESS";
1107                                 $manager.setControlLoopResult("SUCCESS");
1108                                 break;
1109                         case FAILURE:
1110                                 $operationWrapper.operation.outcome = "FAILURE";
1111                                 $manager.setControlLoopResult("FAILURE");
1112                                 break;
1113                 }
1114                 if ($operationWrapper.operation.outcome.equals("SUCCESS")) {
1115                         notification.history.add($operationWrapper.operation);
1116                         notification.notification = ControlLoopNotificationType.OPERATION_SUCCESS;
1117                         //
1118                         // Let interested parties know
1119                         //
1120                         try {
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();
1126                         }
1127             notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;
1128             try {
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();
1134             }
1135
1136                         //
1137                         // We are going to retract these objects from memory
1138                         //
1139                         System.out.println("Retracting everything");
1140                         retract($operationWrapper);
1141                         retract($request);
1142                         retract($response);
1143                         retract($event);
1144                         retract($manager);
1145                 } else if ($operationWrapper.operation.outcome.equals("PROCESSING")) {
1146                         retract($response);
1147                 } else {
1148                         notification.history.add($operationWrapper.operation);
1149                         notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;
1150                         //
1151                         // Let interested parties know
1152                         //
1153                         try {
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();
1159                         }
1160             notification.notification = ControlLoopNotificationType.FINAL_FAILURE;
1161             //
1162             // Let interested parties know
1163             //
1164             try {
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();
1170             }
1171                         //
1172                         // We are going to retract these objects from memory
1173                         //
1174                         System.out.println("Retracting everything");
1175                         retract($operationWrapper);
1176                         retract($request);
1177                         retract($response);
1178                         retract($event);
1179                         retract($manager);
1180                 }
1181                 
1182 end             
1183
1184 /*
1185 *
1186 * This rule is used to clean up APPC response
1187 *
1188 */              
1189 rule "${policyName}.APPC.RESPONSE.CLEANUP"
1190         when
1191                 $params : Params( getClosedLoopControlName() == "${closedLoopControlName}" )
1192         $response : Response($id : getCommonHeader().RequestID )
1193                 not ( VirtualControlLoopEvent( closedLoopControlName == $params.getClosedLoopControlName(), requestID == $id, closedLoopEventStatus == ControlLoopEventStatus.ONSET ) ) 
1194         then
1195                 System.out.println("rule APPC.RESPONSE.CLEANUP is triggered.");
1196                 retract($response);
1197 end
1198
1199 /*
1200 *
1201 * This rule responds to MSO Response Events
1202 *
1203 */
1204 rule "${policyName}.MSO.RESPONSE"
1205         when
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() )     
1212         then
1213                 System.out.println("rule MSO.RESPONSE is triggered.");
1214                 //
1215                 // Construct notification
1216                 //
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();
1224                 //
1225                 // The operation can either be succeeded or failed
1226                 // 
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;
1232                         //
1233                         // Let interested parties know
1234                         //
1235                         try {
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();
1241                         }
1242                         notification.notification = ControlLoopNotificationType.FINAL_SUCCESS;
1243             //
1244             // Let interested parties know
1245             //
1246             try {
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();
1252             }
1253             //
1254                         // We are going to retract these objects from memory
1255                         //
1256                         System.out.println("Retracting everything");
1257                         retract($operationWrapper);
1258                         retract($request);
1259                         retract($response);
1260                         retract($event);
1261                         retract($manager);
1262                 } else {
1263                         $operationWrapper.operation.outcome = "FAILURE";
1264                         $manager.setControlLoopResult("FAILURE");
1265                         notification.history.add($operationWrapper.operation);
1266                         notification.notification = ControlLoopNotificationType.OPERATION_FAILURE;
1267                         //
1268                         // Let interested parties know
1269                         //
1270                         try {
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();
1276                         }
1277                         notification.notification = ControlLoopNotificationType.FINAL_FAILURE;
1278             //
1279             // Let interested parties know
1280             //
1281             try {
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();
1287             }
1288             //
1289                         // We are going to retract these objects from memory
1290                         //
1291                         System.out.println("Retracting everything");
1292                         retract($operationWrapper);
1293                         retract($request);
1294                         retract($response);
1295                         retract($event);
1296                         retract($manager);
1297                 }
1298                 
1299 end