2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 # Copyright (c) 2019, CMCC Technologies Co., Ltd.
7 # Licensed under the Apache License, Version 2.0 (the "License")
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
11 # http://www.apache.org/licenses/LICENSE-2.0
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.so.bpmn.infrastructure.scripts
23 import org.camunda.bpm.engine.delegate.BpmnError
24 import org.camunda.bpm.engine.delegate.DelegateExecution
25 import org.onap.aai.domain.yang.Relationship
26 import org.onap.aai.domain.yang.RelationshipData
27 import org.onap.aai.domain.yang.RelationshipList
28 import org.onap.aai.domain.yang.ServiceInstance
29 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
30 import org.onap.so.bpmn.common.scripts.ExceptionUtil
31 import org.onap.so.bpmn.common.scripts.MsoUtils
32 import org.onap.so.bpmn.common.scripts.RequestDBUtil
33 import org.onap.so.bpmn.core.UrnPropertiesReader
34 import org.onap.so.bpmn.core.WorkflowException
35 import org.onap.so.bpmn.core.json.JsonUtils
36 import org.onap.aaiclient.client.aai.AAIObjectType
37 import org.onap.aaiclient.client.aai.AAIResourcesClient
38 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
39 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
40 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
41 import org.onap.so.db.request.beans.OperationStatus
42 import org.slf4j.Logger
43 import org.slf4j.LoggerFactory
45 import javax.ws.rs.NotFoundException
47 import static org.apache.commons.lang3.StringUtils.isBlank
49 class ActivateCommunicationService extends AbstractServiceTaskProcessor {
53 ExceptionUtil exceptionUtil = new ExceptionUtil()
55 RequestDBUtil requestDBUtil = new RequestDBUtil()
57 JsonUtils jsonUtil = new JsonUtils()
59 AAIResourcesClient client = getAAIClient()
61 private static final Logger logger = LoggerFactory.getLogger(ActivateCommunicationService.class)
64 void preProcessRequest(DelegateExecution execution) {
65 logger.debug(Prefix + "preProcessRequest Start")
66 execution.setVariable("prefix", Prefix)
70 // check for incoming json message/input
71 String siRequest = execution.getVariable("bpmnRequest")
72 logger.debug(siRequest)
74 String requestId = execution.getVariable("mso-request-id")
75 execution.setVariable("msoRequestId", requestId)
76 logger.info("Input Request:" + siRequest + " reqId:" + requestId)
78 String serviceInstanceId = execution.getVariable("serviceInstanceId")
79 if (isBlank(serviceInstanceId)) {
80 msg = "Input serviceInstanceId' is null"
81 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
84 String globalSubscriberId = jsonUtil.getJsonValue(siRequest, "globalSubscriberId")
85 if (isBlank(globalSubscriberId)) {
86 msg = "Input globalSubscriberId' is null"
88 execution.setVariable("globalSubscriberId", "5GCustomer")
90 execution.setVariable("globalSubscriberId", globalSubscriberId)
93 String subscriptionServiceType = jsonUtil.getJsonValue(siRequest, "serviceType")
94 if (isBlank(subscriptionServiceType)) {
95 msg = "Input subscriptionServiceType is null"
97 execution.setVariable("subscriptionServiceType", "5G")
99 execution.setVariable("subscriptionServiceType", subscriptionServiceType)
102 String operationId = jsonUtil.getJsonValue(siRequest, "operationId")
103 execution.setVariable("operationId", operationId)
105 String operationType = execution.getVariable("operationType")
106 execution.setVariable("operationType", operationType.toUpperCase())
108 } catch (BpmnError e) {
110 } catch (Exception ex) {
111 msg = "Exception in preProcessRequest " + ex.getMessage()
113 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
115 logger.debug(Prefix + "preProcessRequest Exit")
119 def checkAAIOrchStatus = { DelegateExecution execution ->
121 logger.debug(Prefix + "checkAAIOrchStatus Start")
124 String serviceInstanceId = execution.getVariable("serviceInstanceId")
125 String globalSubscriberId = execution.getVariable("globalSubscriberId")
126 String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
127 String operationType = execution.getVariable("operationType")
129 logger.debug("serviceInstanceId: " + serviceInstanceId)
131 //check the cms status
133 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
134 globalSubscriberId, subscriptionServiceType, serviceInstanceId)
136 if (!client.exists(uri)) {
137 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai")
140 AAIResultWrapper wrapper = client.get(uri, NotFoundException.class)
141 Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
144 if (si.get().getOrchestrationStatus().toLowerCase() == "activated" &&
145 operationType.equalsIgnoreCase("deactivation")) {
146 logger.info("Service is in active state")
147 execution.setVariable("serviceExpectStatus", "deactivated")
148 execution.setVariable("isContinue", "true")
149 execution.setVariable("requestParam", "deactivate")
151 } else if (si.get().getOrchestrationStatus().toLowerCase() == "deactivated" &&
152 operationType.equalsIgnoreCase("activation")){
153 logger.info("Service is in de-activated state")
154 execution.setVariable("serviceExpectStatus", "activated")
155 execution.setVariable("isContinue", "true")
156 execution.setVariable("requestParam", "activate")
159 execution.setVariable("isContinue", "false")
162 RelationshipList relationshipList = si.get().getRelationshipList()
163 List<Relationship> relationship
164 if (relationshipList != null && (relationship = relationshipList.getRelationship()) != null
165 && relationship.size() > 0) {
166 List<RelationshipData> relationshipDatas = relationship.get(0).getRelationshipData()
168 for (RelationshipData relationshipData : relationshipDatas) {
169 execution.setVariable("e2e_" + relationshipData.getRelationshipKey(),
170 relationshipData.getRelationshipValue())
173 msg = "the communication service has no e2e service"
174 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
178 } catch (BpmnError e) {
180 } catch (Exception ex) {
181 msg = "Exception in " + Prefix + "checkAAIOrchStatus: " + ex.getMessage()
183 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
186 logger.debug(Prefix + "checkAAIOrchStatus Exit")
190 def prepareInitOperationStatus = { DelegateExecution execution ->
191 logger.debug(Prefix + "prepareInitOperationStatus Start")
193 String serviceId = execution.getVariable("serviceInstanceId")
196 String operationId = execution.getVariable("operationId")
198 String operationType = execution.getVariable("operationType")
200 OperationStatus initStatus = new OperationStatus()
201 initStatus.setServiceId(serviceId)
202 initStatus.setOperationId(operationId)
203 initStatus.setOperation(operationType)
204 initStatus.setUserId(execution.getVariable("globalSubscriberId") as String)
205 initStatus.setResult("processing")
206 initStatus.setProgress("0")
207 initStatus.setReason("")
208 initStatus.setOperationContent("communication service active operation start")
210 requestDBUtil.prepareUpdateOperationStatus(execution, initStatus)
212 logger.debug(Prefix + "prepareInitOperationStatus Exit")
216 def sendSyncResponse = { DelegateExecution execution ->
217 logger.debug(Prefix + "sendSyncResponse Start")
219 String operationId = execution.getVariable("operationId")
221 String restRequest = """{"operationId":"${operationId}"}""".trim()
222 logger.debug(" sendSyncResponse to APIH:" + "\n" + restRequest)
224 sendWorkflowResponse(execution, 202, restRequest)
225 execution.setVariable("sentSyncResponse", true)
226 } catch (Exception ex) {
227 String msg = "Exceptuion in sendSyncResponse:" + ex.getMessage()
229 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
231 logger.debug(Prefix + "sendSyncResponse Exit")
235 def preRequestSend2NSMF = { DelegateExecution execution ->
236 logger.debug(Prefix + "preRequestSend2NSMF Start")
239 String e2eServiceInstanceId = execution.getVariable("e2e_service-instance.service-instance-id")
240 execution.setVariable("e2eServiceInstanceId", e2eServiceInstanceId)
242 String requestParam = execution.getVariable("requestParam")
243 //String NSMF_endpoint = "/onap/so/infra/e2eServiceInstances/v3"
244 def NSMF_endpoint = UrnPropertiesReader.getVariable("mso.infra.endpoint.url", execution)
245 def url = NSMF_endpoint + "/e2eServiceInstances/v3/${e2eServiceInstanceId}/${requestParam}"
246 execution.setVariable("NSMF_endpoint", url)
248 //get from model catalog inputs
251 "globalSubscriberId": "${execution.getVariable("globalSubscriberId")}",
252 "serviceType": "${execution.getVariable("subscriptionServiceType")}"
255 execution.setVariable("CSMF_NSMFRequest", payload.replaceAll("\\s+", ""))
257 } catch (BpmnError e) {
259 } catch (Exception ex) {
260 String msg = "Exception in " + Prefix + "preRequestSend2NSMF. " + ex.getMessage()
262 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
265 logger.debug(Prefix + "preRequestSend2NSMF Exit")
269 def processNSMFResponse = { DelegateExecution execution ->
270 logger.debug(Prefix + "processNSMFResponse Start")
273 def CSMF_NSMFResponseCode = execution.getVariable("CSMF_NSMFResponseCode") as Integer
274 if (CSMF_NSMFResponseCode >= 200 && CSMF_NSMFResponseCode < 400) {
275 def CSMF_NSMFResponse = execution.getVariable("CSMF_NSMFResponse") as String
276 def e2eOperationId = jsonUtil.getJsonValue(CSMF_NSMFResponse, "operationId")
278 execution.setVariable("e2eOperationId", e2eOperationId)
279 execution.setVariable("ProcessNsmfSuccess", "OK")
281 execution.setVariable("ProcessNsmfSuccess", "ERROR")
282 execution.setVariable("operationStatus", "error")
283 execution.setVariable("operationContent",
284 "communication service " + execution.getVariable("operationType")
285 + " operation error: nsmf response fail")
286 execution.setVariable("orchestrationStatus", "error")
289 } catch (BpmnError e) {
291 } catch (Exception ex) {
292 String msg = "Exception in " + Prefix + "processOOFResponse. " + ex.getMessage()
294 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
296 logger.debug(Prefix + "processNSMFResponse Exit")
300 def prepareUpdateOperationStatus = { DelegateExecution execution ->
301 logger.debug(Prefix + "prepareUpdateOperationStatus Start")
302 // update status creating
303 OperationStatus status = new OperationStatus()
304 status.setServiceId(execution.getVariable("serviceInstanceId") as String)
305 status.setOperationId(execution.getVariable("operationId") as String)
306 status.setOperation(execution.getVariable("operationType") as String)
307 status.setResult("processing")
308 status.setProgress("20")
309 status.setOperationContent("communication service "+ execution.getVariable("operationType")
310 + " operation processing: waiting nsmf service create finished")
311 status.setUserId(execution.getVariable("globalSubscriberId") as String)
313 requestDBUtil.prepareUpdateOperationStatus(execution, status)
314 logger.debug(Prefix + "prepareUpdateOperationStatus Exit")
319 def prepareCallCheckProcessStatus = { DelegateExecution execution ->
320 logger.debug(Prefix + "prepareCallCheckProcessStatus Start")
322 def successConditions = new ArrayList<>()
323 successConditions.add("finished")
324 execution.setVariable("successConditions", successConditions)
326 def errorConditions = new ArrayList<>()
327 errorConditions.add("error")
328 execution.setVariable("errorConditions", errorConditions)
330 execution.setVariable("processServiceType", "communication service")
332 execution.setVariable("timeOut", 3 * 60 * 60 * 1000)
334 def successParamMap = new HashMap<String, Object>()
335 successParamMap.put("orchestrationStatus", execution.getVariable("serviceExpectStatus"))
337 execution.setVariable("successParamMap", successParamMap)
339 def errorParamMap = new HashMap<String, Object>()
340 errorParamMap.put("orchestrationStatus", "error")
342 execution.setVariable("errorParamMap", errorParamMap)
344 def timeOutParamMap = new HashMap<String, Object>()
345 timeOutParamMap.put("orchestrationStatus", "error")
347 execution.setVariable("timeOutParamMap", timeOutParamMap)
349 execution.setVariable("initProgress", 20)
350 execution.setVariable("endProgress", 90)
352 logger.debug(Prefix + "prepareCallCheckProcessStatus Exit")
357 * prepare update operation status to complete after NSMF process success
360 def prepareCompleteStatus = { DelegateExecution execution ->
362 logger.debug(Prefix + "prepareCompleteStatus Start")
363 String operationType = execution.getVariable("operationType")
364 OperationStatus status = new OperationStatus()
365 status.setServiceId(execution.getVariable("serviceInstanceId") as String)
366 status.setOperationId(execution.getVariable("operationId") as String)
367 status.setOperation(operationType)
368 status.setResult(execution.getVariable("operationStatus") as String)
369 status.setProgress("100")
370 status.setOperationContent(execution.getVariable("operationContent") as String)
371 status.setUserId(execution.getVariable("globalSubscriberId") as String)
373 requestDBUtil.prepareUpdateOperationStatus(execution, status)
374 logger.debug("prepareCompleteStatus end, serviceInstanceId: " + execution.getVariable("serviceInstanceId")
375 + ", operationId: " + execution.getVariable("operationId"))
377 logger.debug(Prefix + "prepareCompleteStatus Exit")
382 * update NSMF complete status to AAI when the NSMF process finished
385 def updateFinishStatusInAAI = { DelegateExecution execution ->
386 logger.debug(Prefix + "updateFinishStatusInAAI Start")
390 String serviceInstanceId = execution.getVariable("serviceInstanceId")
391 String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
392 String globalSubscriberId = execution.getVariable("globalSubscriberId")
393 String orchestrationStatus = execution.getVariable("orchestrationStatus")
395 ServiceInstance csi = new ServiceInstance()
396 csi.setOrchestrationStatus(orchestrationStatus)
397 AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
398 globalSubscriberId, subscriptionServiceType, serviceInstanceId)
399 client.update(uri, csi)
401 } catch (BpmnError e) {
403 } catch (Exception ex) {
404 msg = "Exception in complete communication service " + ex.getMessage()
406 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
408 logger.debug(Prefix + "updateFinishStatusInAAI Exit")
412 public sendSyncError = { DelegateExecution execution ->
413 logger.debug("sendSyncError Start")
416 if (execution.getVariable("WorkflowException") instanceof WorkflowException) {
417 WorkflowException wfe = execution.getVariable("WorkflowException") as WorkflowException
418 errorMessage = wfe.getErrorMessage()
420 errorMessage = "Sending Sync Error."
423 String buildWorkflowException =
424 """<aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1">
425 <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage>
426 <aetgt:ErrorCode>7000</aetgt:ErrorCode>
427 </aetgt:WorkflowException>"""
429 logger.debug(buildWorkflowException)
430 sendWorkflowResponse(execution, 500, buildWorkflowException)
432 } catch (Exception ex) {
433 logger.debug("Sending Sync Error Activity Failed. " + "\n" + ex.getMessage())
435 logger.debug(Prefix + "sendSyncError Exit")