a15a86d5668a2213b5cced919da2afb6324509b6
[so.git] / bpmn / MSOCommonBPMN / src / main / groovy / org / openecomp / mso / bpmn / common / scripts / CreateAAIVfModuleVolumeGroup.groovy
1 /*-\r
2  * ============LICENSE_START=======================================================\r
3  * ONAP - SO\r
4  * ================================================================================\r
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * \r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ============LICENSE_END=========================================================\r
19  */\r
20 \r
21 package org.openecomp.mso.bpmn.common.scripts\r
22 \r
23 import org.camunda.bpm.engine.delegate.BpmnError\r
24 import org.camunda.bpm.engine.runtime.Execution\r
25 import org.openecomp.mso.rest.APIResponse\r
26 \r
27 \r
28 public class CreateAAIVfModuleVolumeGroup extends AbstractServiceTaskProcessor {\r
29 \r
30         private XmlParser xmlParser = new XmlParser()\r
31         ExceptionUtil exceptionUtil = new ExceptionUtil()\r
32 \r
33         /**\r
34          * Initialize the flow's variables.\r
35          *\r
36          * @param execution The flow's execution instance.\r
37          */\r
38         public void initProcessVariables(Execution execution) {\r
39                 execution.setVariable('prefix', 'CAAIVfModVG_')\r
40                 execution.setVariable('CAAIVfModVG_vnfId', null)\r
41                 execution.setVariable('CAAIVfModVG_vfModuleId', null)\r
42                 execution.setVariable('CAAIVfModVG_aicCloudRegion', null)\r
43                 execution.setVariable('CAAIVfModVG_volumeGroupId', null)\r
44                 execution.setVariable('CAAIVfModVG_getVfModuleResponseCode' ,null)\r
45                 execution.setVariable('CAAIVfModVG_getVfModuleResponse', '')\r
46                 execution.setVariable('CAAIVfModVG_updateVfModuleResponseCode', null)\r
47                 execution.setVariable('CAAIVfModVG_updateVfModuleResponse', '')\r
48         }\r
49 \r
50         /**\r
51          * Check for missing elements in the received request.\r
52          *\r
53          * @param execution The flow's execution instance.\r
54          */\r
55         public void preProcessRequest(Execution execution) {\r
56                 def method = getClass().getSimpleName() + '.preProcessRequest(' +\r
57                         'execution=' + execution.getId() +\r
58                         ')'\r
59                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')\r
60                 logDebug('Entered ' + method, isDebugLogEnabled)\r
61 \r
62                 try {\r
63                         def xml = execution.getVariable('CreateAAIVfModuleVolumeGroupRequest')\r
64                         logDebug('Received request xml:\n' + xml, isDebugLogEnabled)\r
65                         utils.logAudit("CreateAAIVfModuleVolume Received Request XML: " + xml)\r
66                         initProcessVariables(execution)\r
67 \r
68                         def vnfId = getRequiredNodeText(execution, xml,'vnf-id')\r
69                         execution.setVariable('CAAIVfModVG_vnfId', vnfId)\r
70 \r
71                         def vfModuleId = getRequiredNodeText(execution, xml,'vf-module-id')\r
72                         execution.setVariable('CAAIVfModVG_vfModuleId', vfModuleId)\r
73                         \r
74                         def aicCloudRegion = getRequiredNodeText(execution, xml,'aic-cloud-region')\r
75                         execution.setVariable('CAAIVfModVG_aicCloudRegion', aicCloudRegion)\r
76                         \r
77                         def volumeGroupId = getRequiredNodeText(execution, xml,'volume-group-id')\r
78                         execution.setVariable('CAAIVfModVG_volumeGroupId', volumeGroupId)\r
79 \r
80                         logDebug('Exited ' + method, isDebugLogEnabled)\r
81                 } catch (BpmnError e) {\r
82                         throw e;\r
83                 } catch (Exception e) {\r
84                         logError('Caught exception in ' + method, e)\r
85                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in preProcessRequest(): ' + e.getMessage())\r
86 \r
87                 }\r
88         }\r
89 \r
90         /**\r
91          * Using the received vnfId and vfModuleId, query AAI to get the corresponding VF Module.\r
92          * A 200 response is expected with the VF Module in the response body.\r
93          *\r
94          * @param execution The flow's execution instance.\r
95          */\r
96         public void getVfModule(Execution execution) {\r
97                 def method = getClass().getSimpleName() + '.getVfModule(' +\r
98                         'execution=' + execution.getId() +\r
99                         ')'\r
100                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')\r
101                 logDebug('Entered ' + method, isDebugLogEnabled)\r
102 \r
103                 try {\r
104                         def vnfId = execution.getVariable('CAAIVfModVG_vnfId')\r
105                         def vfModuleId = execution.getVariable('CAAIVfModVG_vfModuleId')\r
106 \r
107                         // Construct endpoint\r
108                         AaiUtil aaiUtil = new AaiUtil(this)\r
109                         def aai_uri = aaiUtil.getNetworkGenericVnfUri(execution)\r
110                         logDebug('AAI URI is: ' + aai_uri, isDebugLogEnabled)\r
111                         String endPoint = execution.getVariable('URN_aai_endpoint') + aai_uri + '/' + URLEncoder.encode(vnfId, "UTF-8") + '/vf-modules/vf-module/' + URLEncoder.encode(vfModuleId, "UTF-8")\r
112 \r
113                         try {\r
114                                 logDebug('sending GET to AAI endpoint \'' + endPoint + '\'', isDebugLogEnabled)\r
115                                 utils.logAudit("aaiResponse GET TO AAI Endpoint: " + endPoint)\r
116                                 APIResponse response = aaiUtil.executeAAIGetCall(execution, endPoint)\r
117                                 def responseData = response.getResponseBodyAsString()\r
118                                 execution.setVariable('CAAIVfModVG_getVfModuleResponseCode', response.getStatusCode())\r
119                                 execution.setVariable('CAAIVfModVG_getVfModuleResponse', responseData)\r
120                                 \r
121                                 utils.logAudit("CreateAAIVfModule Response Code: " + response.getStatusCode())\r
122                                 utils.logAudit("CreateAAIVfModule Response: " + response)\r
123                                 logDebug('Response code:' + response.getStatusCode(), isDebugLogEnabled)\r
124                                 logDebug('Response:' + System.lineSeparator() + responseData, isDebugLogEnabled)\r
125                         } catch (Exception ex) {\r
126                                 ex.printStackTrace()\r
127                                 logDebug('Exception occurred while executing AAI GET:' + ex.getMessage(),isDebugLogEnabled)\r
128                                 execution.setVariable('CAAIVfModVG_getVfModuleResponseCode', 500)\r
129                                 execution.setVariable('CAAIVfModVG_getVfModuleResponse', 'AAI GET Failed:' + ex.getMessage())\r
130                         }\r
131                         logDebug('Exited ' + method, isDebugLogEnabled)\r
132                 } catch (BpmnError e) {\r
133                         throw e;\r
134                 } catch (Exception e) {\r
135                         logError('Caught exception in ' + method, e)\r
136                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in getVfModule(): ' + e.getMessage())\r
137                 }\r
138         }\r
139 \r
140         /**\r
141          * Construct and send a PUT request to AAI to update the VF Module with the\r
142          * created Volume Group relationship.\r
143          *\r
144          * @param execution The flow's execution instance.\r
145          */\r
146         public void updateVfModule(Execution execution) {\r
147                 def method = getClass().getSimpleName() + '.updateVfModule(' +\r
148                         'execution=' + execution.getId() +\r
149                         ')'\r
150                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')\r
151                 logDebug('Entered ' + method, isDebugLogEnabled)\r
152 \r
153                 try {\r
154                         def vnfId = execution.getVariable('CAAIVfModVG_vnfId')\r
155                         def vfModuleId = execution.getVariable('CAAIVfModVG_vfModuleId')\r
156                         def vfModule = execution.getVariable('CAAIVfModVG_getVfModuleResponse')\r
157                         def origRequest = execution.getVariable('CreateAAIVfModuleVolumeGroupRequest')\r
158                         def Node vfModuleNode = xmlParser.parseText(vfModule)\r
159                         \r
160                         // Confirm resource-version is in retrieved VF Module\r
161                         if (utils.getChildNode(vfModuleNode, 'resource-version') == null) {\r
162                                 def msg = 'Can\'t update VF Module ' + vfModuleId + ' since \'resource-version\' is missing'\r
163                                 logError(msg)\r
164                                 throw new Exception(msg)\r
165                         }\r
166                                                 \r
167                         // Construct payload by creating a Volume Group relationhip and inserting it into the VF Module\r
168                         def aicCloudRegion = execution.getVariable('CAAIVfModVG_aicCloudRegion')\r
169                         def volumeGroupId = execution.getVariable('CAAIVfModVG_volumeGroupId')\r
170                         def Node vgRelationshipNode = createVolumeGroupRelationshipNode(aicCloudRegion, volumeGroupId)\r
171                         insertVolumeGroupRelationshipNode(vfModuleNode, vgRelationshipNode)\r
172                         def payload = utils.nodeToString(vfModuleNode)\r
173 \r
174                         // Construct endpoint\r
175                         AaiUtil aaiUtil = new AaiUtil(this)\r
176                         def aai_uri = aaiUtil.getNetworkGenericVnfUri(execution)\r
177                         logDebug('AAI URI is: ' + aai_uri, isDebugLogEnabled)\r
178                         String endPoint = execution.getVariable('URN_aai_endpoint') + aai_uri + '/' + URLEncoder.encode(vnfId, "UTF-8") + '/vf-modules/vf-module/' + URLEncoder.encode(vfModuleId, "UTF-8")\r
179 \r
180                         try {\r
181                                 utils.logAudit("CreateAAIVfModuleVolume Sendind PUT to AAI Endpoint \n " + endPoint + " with payload \n " + payload)\r
182                                 logDebug('sending PUT to AAI endpoint \'' + endPoint + '\'' + 'with payload \n' + payload, isDebugLogEnabled)\r
183                                 APIResponse response = aaiUtil.executeAAIPutCall(execution, endPoint, payload)\r
184                                 def responseData = response.getResponseBodyAsString()\r
185                                 execution.setVariable('CAAIVfModVG_updateVfModuleResponseCode', response.getStatusCode())\r
186                                 execution.setVariable('CAAIVfModVG_updateVfModuleResponse', responseData)\r
187                                 \r
188                                 utils.logAudit("CreateAAIVfModule Response code: " + response.getStatusCode())\r
189                                 utils.logAudit("CreateAAIVfModule Response: " + responseData)\r
190                                 logDebug('Response code:' + response.getStatusCode(), isDebugLogEnabled)\r
191                                 logDebug('Response:' + System.lineSeparator() + responseData, isDebugLogEnabled)\r
192                         } catch (Exception ex) {\r
193                                 ex.printStackTrace()\r
194                                 logDebug('Exception occurred while executing AAI PUT:' + ex.getMessage(),isDebugLogEnabled)\r
195                                 execution.setVariable('CAAIVfModVG_updateVfModuleResponseCode', 500)\r
196                                 execution.setVariable('CAAIVfModVG_updateVfModuleResponse', 'AAI PUT Failed:' + ex.getMessage())\r
197                         }\r
198                         logDebug('Exited ' + method, isDebugLogEnabled)\r
199                 } catch (BpmnError e) {\r
200                         throw e;\r
201                 } catch (Exception e) {\r
202                         logError('Caught exception in ' + method, e)\r
203                         exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in updateVfModule(): ' + e.getMessage())\r
204                 }\r
205         }\r
206 \r
207         /**\r
208          * Construct a Volume Group relationship Node with the given AIC Cloud Region and\r
209          * Volume Group ID for insertion into a VF Module.\r
210          * \r
211          * @param aicCloudRegion Cloud Region ID to use in the Volume Group relationship\r
212          * @param volumeGroupId Volume Group ID to use in the Volume Group relationship\r
213          * @return a Node representing the new Volume Group relationship\r
214          */\r
215         private Node createVolumeGroupRelationshipNode(String aicCloudRegion, String volumeGroupId) {\r
216                 \r
217                 def Node relatedTo = new Node(null, 'related-to', 'volume-group')\r
218                 \r
219                 def Node relationshipKeyCO = new Node(null, 'relationship-key', 'cloud-region.cloud-owner')\r
220                 def Node relationshipValueCO = new Node(null, 'relationship-value', 'att-aic')\r
221                 def Node relationshipDataCO = new Node(null, 'relationship-data')\r
222                 relationshipDataCO.append(relationshipKeyCO)\r
223                 relationshipDataCO.append(relationshipValueCO)\r
224                 \r
225                 def Node relationshipKeyCRI = new Node(null, 'relationship-key', 'cloud-region.cloud-region-id')\r
226                 def Node relationshipValueCRI = new Node(null, 'relationship-value', aicCloudRegion)\r
227                 def Node relationshipDataCRI = new Node(null, 'relationship-data')\r
228                 relationshipDataCRI.append(relationshipKeyCRI)\r
229                 relationshipDataCRI.append(relationshipValueCRI)\r
230 \r
231                 def Node relationshipKeyVGI = new Node(null, 'relationship-key', 'volume-group.volume-group-id')\r
232                 def Node relationshipValueVGI = new Node(null, 'relationship-value', volumeGroupId)\r
233                 def Node relationshipDataVGI = new Node(null, 'relationship-data')\r
234                 relationshipDataVGI.append(relationshipKeyVGI)\r
235                 relationshipDataVGI.append(relationshipValueVGI)\r
236                 \r
237                 def Node volumeGroupRelationship = new Node(null, 'relationship')\r
238                 volumeGroupRelationship.append(relatedTo)\r
239                 volumeGroupRelationship.append(relationshipDataCO)\r
240                 volumeGroupRelationship.append(relationshipDataCRI)\r
241                 volumeGroupRelationship.append(relationshipDataVGI)\r
242                 \r
243                 return volumeGroupRelationship;\r
244         }\r
245         \r
246         /**\r
247          * Insert the given Volume Group relationship Node into the given VF Module.\r
248          * If the VF Module does NOT contain a relationship list:\r
249          *      - Create a relationship list containing the Volume Group relationship and insert it into the VF Module\r
250          * If the VF Module contains a relationship list but not a Volume Group relationship:\r
251          *      - Insert the the Volume Group relationship into the relationship lsit\r
252          * If the VF Module contains a relationship list and has a Volume Group relationship:\r
253          *      - Replace the existing Volume Group relationship with the new one\r
254          * @param vfModuleNode\r
255          * @param volumeGroupRelationshipNode\r
256          */\r
257         private void insertVolumeGroupRelationshipNode(Node vfModuleNode, Node volumeGroupRelationshipNode) {\r
258                 def Node relationshipList = utils.getChildNode(vfModuleNode, 'relationship-list')\r
259                 if (relationshipList == null) {\r
260                         relationshipList = new Node(null, 'relationship-list')\r
261                         relationshipList.append(volumeGroupRelationshipNode)\r
262                         vfModuleNode.append(relationshipList)\r
263                 } else {\r
264                         def Node currVolumeGroupRelationshipNode = getCurrVolumeGroupRelationshipNode(relationshipList)\r
265                         if (currVolumeGroupRelationshipNode == null) {\r
266                                 relationshipList.append(volumeGroupRelationshipNode)\r
267                         } else {\r
268                                 currVolumeGroupRelationshipNode.replaceNode(volumeGroupRelationshipNode)\r
269                         }\r
270                 }\r
271         }\r
272                 \r
273         /**\r
274          * Find and return the value of the Volume Group ID for the specified VF Module.  If\r
275          * the value of the Volume Group ID cannot be found for any reason, 'null' is returned.\r
276          * \r
277          * @param vfModuleNode VF Module (as a Node) retrieved from AAI.\r
278          * @return the value of the Volume Group ID for the specified VF Module.  If the\r
279          * value of the Volume Group ID cannot be found for any reason, 'null' is returned.\r
280          */\r
281         private Node getCurrVolumeGroupRelationshipNode(Node relationshipList) {\r
282                 def Node currVolumeGroupRelationshipNode = null\r
283                 def NodeList relationships = utils.getIdenticalChildren(relationshipList, 'relationship')\r
284                 for (Node relationshipNode in relationships) {\r
285                         def String relatedTo = utils.getChildNodeText(relationshipNode, 'related-to')\r
286                         if ((relatedTo != null) && relatedTo.equals('volume-group')) {\r
287                                 currVolumeGroupRelationshipNode = relationshipNode\r
288                         }\r
289                 }\r
290                 return currVolumeGroupRelationshipNode\r
291         }\r
292 \r
293         /**\r
294          * Generates a WorkflowException if the AAI query returns a response code other than 200.\r
295          *\r
296          * @param execution The flow's execution instance.\r
297          */\r
298         public void handleAAIQueryFailure(Execution execution) {\r
299                 def method = getClass().getSimpleName() + '.handleAAIQueryFailure(' +\r
300                         'execution=' + execution.getId() +\r
301                         ')'\r
302                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')\r
303                 logDebug('Entered ' + method, isDebugLogEnabled)\r
304 \r
305                 logError('Error occurred attempting to query AAI, Response Code ' +\r
306                         execution.getVariable('CAAIVfModVG_getVfModuleResponseCode') + ', Error Response ' +\r
307                         execution.getVariable('CAAIVfModVG_getVfModuleResponse'))\r
308                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
309                 exceptionUtil.buildWorkflowException(execution, 5000, execution.getVariable('CAAIVfModVG_getVfModuleResponse'))\r
310 \r
311                 logDebug('Exited ' + method, isDebugLogEnabled)\r
312         }\r
313 \r
314         /**\r
315          * Generates a WorkflowException if updating a VF Module in AAI returns a response code other than 200.\r
316          *\r
317          * @param execution The flow's execution instance.\r
318          */\r
319         public void handleUpdateVfModuleFailure(Execution execution) {\r
320                 def method = getClass().getSimpleName() + '.handleUpdateVfModuleFailure(' +\r
321                         'execution=' + execution.getId() +\r
322                         ')'\r
323                 def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')\r
324                 logDebug('Entered ' + method, isDebugLogEnabled)\r
325 \r
326                 logError('Error occurred attempting to update VF Module in AAI, Response Code ' +\r
327                         execution.getVariable('CAAIVfModVG_updateVfModuleResponseCode') + ', Error Response ' +\r
328                         execution.getVariable('CAAIVfModVG_updateVfModuleResponse'))\r
329                 ExceptionUtil exceptionUtil = new ExceptionUtil()\r
330                 exceptionUtil.buildWorkflowException(execution, 5000, execution.getVariable('CAAIVfModVG_updateVfModuleResponse'))\r
331 \r
332                 logDebug('Exited ' + method, isDebugLogEnabled)\r
333         }\r
334 }\r