Containerization feature of SO
[so.git] / bpmn / so-bpmn-infrastructure-flows / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoScaleVFCNetworkServiceInstance.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2018 CMCC. 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 package org.onap.so.bpmn.infrastructure.scripts
22
23 import org.camunda.bpm.engine.delegate.DelegateExecution
24 import org.json.JSONArray
25 import org.json.JSONObject;
26
27 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
28 import org.onap.so.bpmn.common.scripts.ExceptionUtil
29 import org.onap.so.bpmn.core.json.JsonUtils
30
31 import org.camunda.bpm.engine.delegate.BpmnError
32 import org.camunda.bpm.engine.runtime.Execution
33 import com.fasterxml.jackson.databind.ObjectMapper
34
35 import org.onap.so.rest.RESTClient
36 import org.onap.so.rest.RESTConfig
37 import org.onap.so.rest.APIResponse;
38
39 import org.onap.so.bpmn.infrastructure.vfcmodel.ScaleResource
40 import org.onap.so.bpmn.infrastructure.vfcmodel.ScaleNsByStepsData
41 import org.onap.so.bpmn.infrastructure.vfcmodel.ScaleNsData
42
43 import org.onap.so.bpmn.infrastructure.vfcmodel.NSResourceInputParameter
44 import org.onap.so.bpmn.infrastructure.vfcmodel.NsOperationKey
45 import org.onap.so.bpmn.infrastructure.vfcmodel.NsScaleParameters
46 import org.onap.so.bpmn.infrastructure.vfcmodel.NsParameters
47 import org.onap.so.bpmn.infrastructure.vfcmodel.LocationConstraint
48 import org.onap.so.logger.MessageEnum
49 import org.onap.so.logger.MsoLogger
50
51
52
53
54 /**
55  * This groovy class supports the <class>DoScaleVFCNetworkServiceInstance.bpmn</class> process.
56  * flow for VFC Network Service Scale
57  */
58 public class DoScaleVFCNetworkServiceInstance extends AbstractServiceTaskProcessor {
59         private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DoScaleVFCNetworkServiceInstance.class);
60
61
62     String host = "http://mso.mso.testlab.openecomp.org:8080"
63
64     String scaleUrl = "/vfc/rest/v1/vfcadapter/ns/{nsInstanceId}/scale"
65
66     String queryJobUrl = "/vfc/rest/v1/vfcadapter/jobs/{jobId}"
67
68     ExceptionUtil exceptionUtil = new ExceptionUtil()
69
70     JsonUtils jsonUtil = new JsonUtils()
71
72     /**
73      * Pre Process the BPMN Flow Request
74      * Inclouds:
75      * generate the nsOperationKey
76      * generate the nsParameters
77      */
78     public void preProcessRequest(DelegateExecution execution) {
79         msoLogger.trace("preProcessRequest() ")
80
81         List<NSResourceInputParameter> nsRIPList = convertScaleNsReq2NSResInputParamList(execution)
82         String requestJsonStr = ""
83         int size = nsRIPList.size()
84         for (int i = 0; i < size; i++) {
85             NSResourceInputParameter nsRIP = nsRIPList.get(i)
86
87             if (i == size - 1) {
88                 requestJsonStr += objectToJsonStr(nsRIP)
89             } else {
90                 requestJsonStr += objectToJsonStr(nsRIP) + "|"
91             }
92         }
93
94         execution.setVariable("reqBody", requestJsonStr)
95
96         msoLogger.trace("Exit preProcessRequest ")
97     }
98
99     /**
100      * scale NS task
101      */
102     public void scaleNetworkService(DelegateExecution execution) {
103         def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
104
105         String saleNsRequest = execution.getVariable("reqBody")
106         String[] nsReqStr = saleNsRequest.split("\\|")
107
108         for (int i = 0; i < nsReqStr.length; i++) {
109             JSONObject reqBodyJsonObj = new JSONObject(nsReqStr[i])
110             String nsInstanceId = reqBodyJsonObj.getJSONObject("nsScaleParameters").getString("nsInstanceId")
111             String nodeTemplateUUID = reqBodyJsonObj.getJSONObject("nsOperationKey").getString("nodeTemplateUUID")
112             reqBodyJsonObj.getJSONObject("nsScaleParameters").remove("nsInstanceId")
113             String reqBody = reqBodyJsonObj.toString()
114
115             String url = host + scaleUrl.replaceAll("\\{nsInstanceId\\}", nsInstanceId)
116
117             APIResponse apiResponse = postRequest(execution, url, reqBody)
118
119             String returnCode = apiResponse.getStatusCode()
120             String aaiResponseAsString = apiResponse.getResponseBodyAsString()
121             String jobId = ""
122             if (returnCode == "200" || returnCode == "202") {
123                 jobId = jsonUtil.getJsonValue(aaiResponseAsString, "jobId")
124             }
125             utils.log("INFO", "scaleNetworkService get a ns scale job Id:" + jobId, isDebugEnabled)
126             execution.setVariable("jobId", jobId)
127             execution.setVariable("nodeTemplateUUID", nodeTemplateUUID)
128
129             String isScaleFinished = ""
130
131             if(jobId =="" || jobId == null){
132                 continue
133             }
134             // query the requested network service scale status, if finished, then start the next one, otherwise, wait
135             while (isScaleFinished != "finished" && isScaleFinished != "error"){
136                 timeDelay()
137                 queryNSProgress(execution)
138                 isScaleFinished = execution.getVariable("operationStatus")
139             }
140         }
141     }
142
143     /**
144      * query NS task
145      */
146     private void queryNSProgress(DelegateExecution execution) {
147         String jobId = execution.getVariable("jobId")
148         String url = host + queryJobUrl.replaceAll("\\{jobId\\}", jobId)
149
150         NsOperationKey nsOperationKey = new NsOperationKey()
151         // is this net work service ID or E2E service ID?
152         nsOperationKey.setServiceId(execution.getVariable("serviceId"))
153         nsOperationKey.setServiceType(execution.getVariable("serviceType"))
154         nsOperationKey.setGlobalSubscriberId(execution.getVariable("globalSubscriberId"))
155         nsOperationKey.setNodeTemplateUUID(execution.getVariable("nodeTemplateUUID"))
156         nsOperationKey.setOperationId(execution.getVariable("operationId"))
157         String queryReqBody = objectToJsonStr(nsOperationKey)
158
159         APIResponse apiResponse = postRequest(execution,url, queryReqBody)
160
161         String returnCode = apiResponse.getStatusCode()
162         String aaiResponseAsString = apiResponse.getResponseBodyAsString()
163
164         String operationStatus = "error"
165
166         if (returnCode == "200") {
167             operationStatus = jsonUtil.getJsonValue(aaiResponseAsString, "responseDescriptor.status")
168         }
169
170         execution.setVariable("operationStatus", operationStatus)
171     }
172
173     /**
174      * delay 5 sec
175      *
176      */
177     private void timeDelay() {
178         try {
179             Thread.sleep(5000)
180         } catch (InterruptedException e) {
181             msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Time Delay exception" + e, "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, "");
182         }
183     }
184
185     /**
186      * finish NS task
187      */
188     public void finishNSScale(DelegateExecution execution) {
189         //no need to do anything util now
190         System.out.println("Scale finished.")
191     }
192
193     /**
194      * post request
195      * url: the url of the request
196      * requestBody: the body of the request
197      */
198     private APIResponse postRequest(DelegateExecution execution, String url, String requestBody){
199         msoLogger.trace("Started Execute VFC adapter Post Process ")
200         msoLogger.info("url:"+url +"\nrequestBody:"+ requestBody)
201         APIResponse apiResponse = null
202         try{
203             RESTConfig config = new RESTConfig(url)
204             RESTClient client = new RESTClient(config).addHeader("Content-Type", "application/json").addHeader("Authorization","Basic QlBFTENsaWVudDpwYXNzd29yZDEk")
205 //            RESTClient client = new RESTClient(config).addHeader("Content-Type", "application/json").addHeader("Accept","application/json").addHeader("Authorization","Basic QlBFTENsaWVudDpwYXNzd29yZDEk")
206             apiResponse = client.httpPost(requestBody)
207             msoLogger.info("response code:"+ apiResponse.getStatusCode() +"\nresponse body:"+ apiResponse.getResponseBodyAsString())
208             msoLogger.trace("Completed Execute VF-C adapter Post Process ")
209         }catch(Exception e){
210             msoLogger.error(MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, "Exception occured while executing VFC Post Call.", "BPMN", MsoLogger.getServiceName(), MsoLogger.ErrorCode.UnknownError, e);
211             throw new BpmnError("MSOWorkflowException")
212         }
213         return apiResponse
214     }
215
216     /**
217      * create a Scale Resource object list from a NSScaleRequestJso nString
218      * This method is for the specific request from Scale Network Service BPMN workflow
219      * @param nsScaleRequestJsonString , a specific request Json string which conform to ?? class
220      * @return List < ScaleResource >
221      */
222     private List<ScaleResource> jsonGetNsResourceList(String nsScaleRequestJsonString) {
223         List<ScaleResource> list = new ArrayList<ScaleResource>()
224         JSONObject jsonObject = new JSONObject(nsScaleRequestJsonString)
225
226         JSONObject jsonResource = jsonObject.getJSONObject("service")
227         JSONArray arr = jsonResource.getJSONArray("resources")
228
229         for (int i = 0; i < arr.length(); i++) {
230             JSONObject tempResource = arr.getJSONObject(i)
231             ScaleResource resource = new ScaleResource()
232             resource.setResourceInstanceId(tempResource.getString("resourceInstanceId"))
233             resource.setScaleType(tempResource.getString("scaleType"))
234
235             JSONObject jsonScaleNsData = tempResource.getJSONObject("scaleNsData")
236             JSONObject jsonScaleNsByStepData = jsonScaleNsData.getJSONObject("scaleNsByStepsData")
237
238             ScaleNsData scaleNsData = new ScaleNsData()
239             ScaleNsByStepsData stepsData = new ScaleNsByStepsData()
240
241             stepsData.setAspectId(jsonScaleNsByStepData.getString("aspectId"))
242             stepsData.setScalingDirection(jsonScaleNsByStepData.getString("scalingDirection"))
243             stepsData.setNumberOfSteps(Integer.parseInt(jsonScaleNsByStepData.getString("numberOfSteps")))
244
245             scaleNsData.setScaleNsByStepsData(stepsData)
246             resource.setScaleNsData(scaleNsData)
247             list.add(resource)
248         }
249
250         return list
251     }
252
253     /**
254      * Convert a java class to JSON string
255      * @param obj
256      * @return
257      */
258     private String objectToJsonStr(Object obj) {
259         ObjectMapper mapper = new ObjectMapper()
260         String jsonStr = null
261         try {
262             jsonStr = mapper.writeValueAsString(obj)
263         } catch (IOException ioe) {
264             System.out.println(ioe.getMessage())
265         }
266         return jsonStr
267
268     }
269
270     /**
271      * create a NSResourceInputParameter list from a Scale Network request Json string
272      * @return
273      */
274     private List<NSResourceInputParameter> convertScaleNsReq2NSResInputParamList(DelegateExecution execution) {
275         String saleNsRequest = execution.getVariable("bpmnRequest")
276
277         //String requestId = execution.getVariable("msoRequestId")
278         //String serviceInstanceId = execution.getVariable("serviceInstanceId")
279         String serviceInstanceName = execution.getVariable("serviceInstanceName")
280         //String nodeTemplateUUID = execution.getVariable("nodeTemplateUUID")
281         String serviceType = execution.getVariable("serviceType")
282         String globalSubscriberId = execution.getVariable("globalSubscriberId")
283         String operationId = execution.getVariable("operationId")
284         String serviceId = execution.getVariable("serviceId")
285         String nsServiceDescription = execution.getVariable("requestDescription")
286
287         String resource = JsonUtils.getJsonValue(saleNsRequest, "service.resources")
288
289         // set nsScaleParameters properties
290         List<ScaleResource> scaleResourcesList = jsonGetNsResourceList(saleNsRequest)
291         List<NSResourceInputParameter> nsResourceInputParameterList = new ArrayList<NSResourceInputParameter>()
292
293         for (ScaleResource sr : scaleResourcesList) {
294             NSResourceInputParameter nsResourceInputParameter = new NSResourceInputParameter()
295             NsOperationKey nsOperationKey = new NsOperationKey()
296             NsParameters nsParameters = new NsParameters()
297             NsScaleParameters nsScaleParameters = new NsScaleParameters()
298             nsParameters.setLocationConstraints(new ArrayList<LocationConstraint>())
299             nsParameters.setAdditionalParamForNs(new HashMap<String, Object>())
300
301             // set NsOperationKey properties
302             nsOperationKey.setGlobalSubscriberId(globalSubscriberId)
303             nsOperationKey.setServiceId(serviceId)
304             nsOperationKey.setServiceType(serviceType)
305             // for ns scale the resourceInstanceId is the nodeTemplateUUID
306             nsOperationKey.setNodeTemplateUUID(sr.getResourceInstanceId())
307             nsOperationKey.setOperationId(operationId)
308
309             nsScaleParameters.setScaleType(sr.getScaleType())
310             nsScaleParameters.setNsInstanceId(sr.getResourceInstanceId())
311
312             ScaleNsByStepsData scaleNsByStepsData = new ScaleNsByStepsData()
313             scaleNsByStepsData.setScalingDirection(sr.getScaleNsData().getScaleNsByStepsData().getScalingDirection())
314             scaleNsByStepsData.setNumberOfSteps(sr.getScaleNsData().getScaleNsByStepsData().getNumberOfSteps())
315             scaleNsByStepsData.setAspectId(sr.getScaleNsData().getScaleNsByStepsData().getAspectId())
316
317             List<ScaleNsByStepsData> scaleNsByStepsDataList = new ArrayList<ScaleNsByStepsData>()
318             scaleNsByStepsDataList.add(scaleNsByStepsData)
319             nsScaleParameters.setScaleNsByStepsData(scaleNsByStepsDataList)
320
321             nsResourceInputParameter.setNsOperationKey(nsOperationKey)
322             nsResourceInputParameter.setNsServiceName(serviceInstanceName)
323             nsResourceInputParameter.setNsServiceDescription(nsServiceDescription)
324             nsResourceInputParameter.setNsParameters(nsParameters)
325             nsResourceInputParameter.setNsScaleParameters(nsScaleParameters)
326
327             nsResourceInputParameterList.add(nsResourceInputParameter)
328         }
329         return nsResourceInputParameterList
330     }
331 }
332