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