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=========================================================
20 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.ServiceInstance
27 import org.onap.aai.domain.yang.CommunicationServiceProfile
28 import org.onap.aai.domain.yang.CommunicationServiceProfiles
29 import org.onap.logging.filter.base.ONAPComponents
30 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
31 import org.onap.so.bpmn.common.scripts.ExceptionUtil
32 import org.onap.so.bpmn.common.scripts.MsoUtils
33 import org.onap.so.bpmn.common.scripts.RequestDBUtil
34 import org.onap.so.bpmn.core.UrnPropertiesReader
35 import org.onap.so.bpmn.core.WorkflowException
36 import org.onap.so.bpmn.core.json.JsonUtils
37 import org.onap.so.client.HttpClient
38 import org.onap.so.client.HttpClientFactory
39 import org.onap.so.client.aai.AAIObjectType
40 import org.onap.so.client.aai.AAIResourcesClient
41 import org.onap.so.client.aai.entities.AAIResultWrapper
42 import org.onap.so.client.aai.entities.uri.AAIResourceUri
43 import org.onap.so.client.aai.entities.uri.AAIUriFactory
44 import org.onap.so.db.request.beans.OperationStatus
45 import org.slf4j.Logger
46 import org.slf4j.LoggerFactory
48 import javax.ws.rs.NotFoundException
49 import javax.ws.rs.core.Response
51 import static org.apache.commons.lang3.StringUtils.isBlank
53 class DeleteCommunicationService extends AbstractServiceTaskProcessor {
54 private final String PREFIX ="DeleteCommunicationService"
55 private final Long TIMEOUT = 60 * 60 * 1000
57 ExceptionUtil exceptionUtil = new ExceptionUtil()
58 JsonUtils jsonUtil = new JsonUtils()
59 private RequestDBUtil requestDBUtil = new RequestDBUtil()
60 private static final Logger LOGGER = LoggerFactory.getLogger(DeleteCommunicationService.class)
63 void preProcessRequest(DelegateExecution execution) {
64 execution.setVariable("prefix",PREFIX)
67 LOGGER.trace("Starting preProcessRequest")
70 // check for incoming json message/input
71 String siRequest = execution.getVariable("bpmnRequest")
72 String requestId = execution.getVariable("mso-request-id")
73 execution.setVariable("msoRequestId", requestId)
74 execution.setVariable("operationType", "DELETE")
76 //communication service id
77 String serviceInstanceId = execution.getVariable("serviceInstanceId")
78 if (isBlank(serviceInstanceId)) {
79 msg = "communication-service id is null"
80 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
83 LOGGER.info("Input Request: ${siRequest}, reqId: ${requestId}, serviceInstanceId: ${serviceInstanceId}")
86 checkAndSetRequestParam(siRequest,"globalSubscriberId",false,execution)
87 checkAndSetRequestParam(siRequest,"serviceType",false,execution)
88 checkAndSetRequestParam(siRequest,"operationId",false,execution)
90 } catch (BpmnError e) {
93 msg = "Exception in preProcessRequest " + any.getCause()
95 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
97 LOGGER.trace("Exit preProcessRequest")
102 * prepare update operation status
105 void preInitUpdateOperationStatus(DelegateExecution execution){
106 LOGGER.trace(" ======== STARTED initUpdateOperationStatus Process ======== ")
108 execution.setVariable("result","processing")
109 execution.setVariable("progress","0")
110 execution.setVariable("operationContent","delete communication service operation start")
111 setOperationStatus(execution)
114 LOGGER.error("Exception Occured Processing initUpdateOperationStatus. Exception is:\n" + e)
115 execution.setVariable("CVFMI_ErrorResponse", "Error Occurred during initUpdateOperationStatus Method:\n" + e.getMessage())
117 LOGGER.trace("======== COMPLETED initUpdateOperationStatus Process ======== ")
124 void sendSyncResponse(DelegateExecution execution) {
125 LOGGER.debug("Begin sendSyncResponse")
128 String operationId = execution.getVariable("operationId")
129 String syncResponse = """{"operationId":"${operationId}"}""".trim()
130 sendWorkflowResponse(execution, 202, syncResponse)
132 } catch (Exception ex) {
133 String msg = "Exception in sendSyncResponse: " + ex.getMessage()
134 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
136 LOGGER.debug("Exit sendSyncResponse")
140 * query CommunicationSerive from AAI
141 * save e2eslice-service instance id and service name
144 void queryCommunicationSeriveFromAAI(DelegateExecution execution)
146 LOGGER.trace(" ***** begin queryCommunicationSeriveFromAAI *****")
147 String serviceInstanceId = execution.getVariable("serviceInstanceId")
149 String errorMsg = "query communication service from aai failed"
150 AAIResultWrapper wrapper = queryAAI(execution, AAIObjectType.SERVICE_INSTANCE, serviceInstanceId, errorMsg)
151 Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
154 String serviceInstName = si.get()?.getServiceInstanceName()
155 String e2eSliceServiceInstId
158 List<Relationship> relationshipList = si.get().getRelationshipList()?.getRelationship()
159 for (Relationship relationship : relationshipList)
161 String relatedTo = relationship.getRelatedTo()
162 if (relatedTo == "service-instance")
164 String relatedLink = relationship.getRelatedLink()?:""
165 e2eSliceServiceInstId = relatedLink ? relatedLink.substring(relatedLink.lastIndexOf("/") + 1,relatedLink.length()) : ""
170 execution.setVariable("e2eSliceServiceInstanceId", e2eSliceServiceInstId)
171 execution.setVariable("serviceInstanceName", serviceInstName ?: "")
172 LOGGER.info("communication-service Id: ${serviceInstanceId}, e2eslice-service Id: ${e2eSliceServiceInstId}, serviceName: ${serviceInstName}")
174 LOGGER.debug(" ***** Exit queryCommunicationSeriveFromAAI *****")
180 * @param aaiObjectType
182 * @return AAIResultWrapper
184 private AAIResultWrapper queryAAI(DelegateExecution execution, AAIObjectType aaiObjectType, String instanceId, String errorMsg)
186 String globalSubscriberId = execution.getVariable("globalSubscriberId")
187 String serviceType = execution.getVariable("serviceType")
189 AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(aaiObjectType, globalSubscriberId, serviceType, instanceId)
190 if (!getAAIClient().exists(resourceUri)) {
191 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, errorMsg)
193 AAIResultWrapper wrapper = getAAIClient().get(resourceUri, NotFoundException.class)
199 * 再次调用deleteE2EServiceInstance接口,然后获取到operationid,
201 void sendRequest2NSMFWF(DelegateExecution execution) {
202 LOGGER.trace("begin preRequestSend2NSMF")
204 //url:/onap/so/infra/e2eServiceInstances/v3/{serviceInstanceId}"
205 def NSMF_endpoint = UrnPropertiesReader.getVariable("mso.infra.endpoint.url", execution)
206 String url = "${NSMF_endpoint}/e2eServiceInstances/v3/${execution.getVariable("e2eSliceServiceInstanceId")}"
208 String requestBody = """
210 "globalSubscriberId": "${execution.getVariable("globalSubscriberId")}",
211 "serviceType": "${execution.getVariable("serviceType")}"
214 requestBody.replaceAll("\\s+", "")
216 String basicAuthValue = UrnPropertiesReader.getVariable("mso.infra.endpoint.auth", execution)
217 HttpClient httpClient = new HttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO)
218 httpClient.addAdditionalHeader("Authorization", basicAuthValue)
219 httpClient.addAdditionalHeader("Accept", "application/json")
220 Response httpResponse = httpClient.delete(requestBody)
221 handleNSSMFWFResponse(httpResponse, execution)
223 } catch (BpmnError e) {
226 String msg = "Exception in DeleteCommunicationService.preRequestSend2NSMF. " + any.getCause()
228 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
231 LOGGER.trace("exit preRequestSend2NSMF")
235 * prepare update operation status
238 private void handleNSSMFWFResponse(Response httpResponse, DelegateExecution execution){
239 LOGGER.debug(" ======== STARTED prepareUpdateOperationStatus Process ======== ")
241 int nsmfResponseCode = httpResponse.getStatus()
242 LOGGER.debug("nsmfResponseCode${nsmfResponseCode}")
244 if (nsmfResponseCode >= 200 && nsmfResponseCode < 204 && httpResponse.hasEntity()) {
245 String nsmfResponse = httpResponse.readEntity(String.class)
246 def e2eOperationId = jsonUtil.getJsonValue(nsmfResponse, "operationId")
247 execution.setVariable("e2eOperationId", e2eOperationId)
248 execution.setVariable("progress","20")
249 execution.setVariable("operationContent","waiting nsmf service delete finished")
251 execution.setVariable("currentCycle",0)
252 execution.setVariable("isNSMFTimeOut", "no")
253 execution.setVariable("isNSMFWFRspSucceed","yes")
257 String serviceName = execution.getVariable("serviceInstanceName")
258 execution.setVariable("progress", "100")
259 execution.setVariable("result", "error")
260 execution.setVariable("operationContent", "terminate service failure.")
261 execution.setVariable("reason","NSMF WF asynchronous response failed, status Code:${nsmfResponseCode}")
262 execution.setVariable("isNSMFWFRspSucceed","no")
263 LOGGER.error("nsmf async response error,nsmfResponseCode:${nsmfResponseCode},serivceName:${serviceName}")
265 setOperationStatus(execution)
266 LOGGER.debug("======== COMPLETED prepareUpdateOperationStatus Process ======== ")
270 * prepare to call sub process
273 void prepareCallCheckProcessStatus(DelegateExecution execution)
275 LOGGER.debug(PREFIX + "prepareCallCheckProcessStatus Start")
277 def successConditions = new ArrayList<>()
278 successConditions.add("finished")
279 execution.setVariable("successConditions", successConditions)
281 def errorConditions = new ArrayList<>()
282 errorConditions.add("error")
283 execution.setVariable("errorConditions", errorConditions)
285 execution.setVariable("processServiceType", "communication service")
286 execution.setVariable("subOperationType", "DELETE")
287 execution.setVariable("initProgress", 20)
288 execution.setVariable("endProgress",90)
290 execution.setVariable("timeOut", TIMEOUT)
292 LOGGER.debug(PREFIX + "prepareCallCheckProcessStatus Exit")
296 * delete communication profile from AAI
299 void delCSProfileFromAAI(DelegateExecution execution)
301 LOGGER.debug("start delete communication service profile from AAI")
302 String globalSubscriberId = execution.getVariable("globalSubscriberId")
303 String serviceType = execution.getVariable("serviceType")
304 String serviceInstanceId = execution.getVariable("serviceInstanceId")
309 AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.COMMUNICATION_PROFILE_ALL, globalSubscriberId, serviceType, serviceInstanceId)
310 AAIResultWrapper wrapper = getAAIClient().get(resourceUri, NotFoundException.class)
311 Optional<CommunicationServiceProfiles> csProfilesOpt = wrapper.asBean(CommunicationServiceProfiles.class)
312 if(csProfilesOpt.isPresent()){
313 CommunicationServiceProfiles csProfiles = csProfilesOpt.get()
314 CommunicationServiceProfile csProfile = csProfiles.getCommunicationServiceProfile().get(0)
315 profileId = csProfile ? csProfile.getProfileId() : ""
317 resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.COMMUNICATION_SERVICE_PROFILE, globalSubscriberId, serviceType, serviceInstanceId, profileId)
318 if (!getAAIClient().exists(resourceUri)) {
319 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "communication service profile was not found in aai")
322 getAAIClient().delete(resourceUri)
323 LOGGER.debug("end delete communication service profile from AAI")
327 String msg = "delete communication service profile from aai failed! cause-"+any.getCause()
328 LOGGER.error(any.printStackTrace())
329 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg);
335 * delete communication service from AAI
338 void delCSFromAAI(DelegateExecution execution)
342 LOGGER.debug("start delete communication service from AAI")
343 AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("serviceType"), execution.getVariable("serviceInstanceId"))
344 getAAIClient().delete(serviceInstanceUri)
346 execution.setVariable("progress", "100")
347 execution.setVariable("result", "finished")
348 execution.setVariable("operationContent", "CSMF completes service terminated.")
349 setOperationStatus(execution)
350 LOGGER.debug("end delete communication service from AAI")
354 LOGGER.error("Error occured within delCSFromAAI method, cause: ${any.getCause()} ")
355 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Error occured during delete communication service from aai")
359 void sendSyncError(DelegateExecution execution)
361 LOGGER.debug("Starting sendSyncError")
364 String errorMessage = "Sending Sync Error."
365 if (execution.getVariable("WorkflowException") instanceof WorkflowException) {
366 WorkflowException wfe = execution.getVariable("WorkflowException")
367 errorMessage = wfe.getErrorMessage()
370 String buildworkflowException =
371 """<aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1">
372 <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage>
373 <aetgt:ErrorCode>7000</aetgt:ErrorCode>
374 </aetgt:WorkflowException>"""
376 LOGGER.debug(buildworkflowException)
377 sendWorkflowResponse(execution, 500, buildworkflowException)
379 } catch (Exception ex) {
380 LOGGER.error("Sending Sync Error Activity Failed. " + "\n" + ex.getMessage())
385 * prepare update operation status
388 void preFailedOperationStatus(DelegateExecution execution)
390 LOGGER.debug(" ======== STARTED preFailedOperationStatus Process ======== ")
392 execution.setVariable("progress", "100")
393 execution.setVariable("result", "error")
394 execution.setVariable("operationContent", "terminate service failure")
396 WorkflowException wfex = execution.getVariable("WorkflowException") as WorkflowException
397 String errorMessage = wfex.getErrorMessage()
398 errorMessage = errorMessage.length() > 200 ? errorMessage.substring(0,200) + "......" : errorMessage
399 execution.setVariable("reason", errorMessage)
400 setOperationStatus(execution)
402 LOGGER.debug("======== COMPLETED prepareEndOperationStatus Process ======== ")
406 * prepare Operation status
408 * @param operationType
410 private void setOperationStatus(DelegateExecution execution)
412 OperationStatus operationStatus = new OperationStatus()
413 operationStatus.setServiceId(execution.getVariable("serviceInstanceId"))
414 operationStatus.setOperationId(execution.getVariable("operationId"))
415 operationStatus.setUserId(execution.getVariable("globalSubscriberId"))
416 //interface not support update
417 operationStatus.setServiceName(execution.getVariable("serviceInstanceName"))
418 operationStatus.setResult(execution.getVariable("result"))
419 operationStatus.setProgress(execution.getVariable("progress"))
420 operationStatus.setOperationContent(execution.getVariable("operationContent"))
421 operationStatus.setReason(execution.getVariable("reason")?:"")
422 operationStatus.setOperation("DELETE")
424 requestDBUtil.prepareUpdateOperationStatus(execution, operationStatus)
427 void prepareFailureStatus(DelegateExecution execution)
429 execution.setVariable("result", "finished")
430 execution.setVariable("progress", "100")
431 execution.setVariable("operationContent", "terminate service failure.")
432 setOperationStatus(execution)
433 LOGGER.debug("${PREFIX}-prepareFailureStatus,result:${execution.getVariable("result")}, reason: ${execution.getVariable("reason")}")
437 * check request json and save parameter to execution
440 * @param isErrorException
443 private void checkAndSetRequestParam(String siRequest, String paraName, boolean isErrorException, DelegateExecution execution)
446 String paramValue = jsonUtil.getJsonValue(siRequest, paraName)
447 if (isBlank(paramValue)) {
448 msg = "Input ${paraName} is null"
452 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
456 execution.setVariable(paraName, paramValue)