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
22 import com.fasterxml.jackson.databind.ObjectMapper
23 import org.camunda.bpm.engine.delegate.DelegateExecution
24 import org.onap.aai.domain.yang.SliceProfiles
25 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
26 import org.onap.aaiclient.client.aai.entities.uri.AAIPluralResourceUri
27 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
28 import org.onap.aaiclient.client.aai.entities.uri.AAISimpleUri
29 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
30 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder
31 import org.onap.so.beans.nsmf.*
32 import org.onap.so.beans.nsmf.oof.SubnetType
33 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
34 import org.onap.so.bpmn.common.scripts.ExceptionUtil
35 import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
36 import org.onap.so.bpmn.common.scripts.RequestDBUtil
37 import org.onap.so.bpmn.core.domain.ServiceDecomposition
38 import org.onap.so.bpmn.core.json.JsonUtils
39 import org.onap.so.db.request.beans.OperationStatus
40 import org.slf4j.Logger
41 import org.slf4j.LoggerFactory
43 import javax.ws.rs.NotFoundException
45 class DoDeallocateNSSI extends AbstractServiceTaskProcessor
47 private final String PREFIX ="DoDeallocateNSSI"
49 private ExceptionUtil exceptionUtil = new ExceptionUtil()
50 private JsonUtils jsonUtil = new JsonUtils()
51 ObjectMapper objectMapper = new ObjectMapper()
52 private RequestDBUtil requestDBUtil = new RequestDBUtil()
53 private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
55 private static final Logger LOGGER = LoggerFactory.getLogger( DoDeallocateNSSI.class)
58 void preProcessRequest(DelegateExecution execution) {
59 LOGGER.trace(" ***** ${PREFIX} Start preProcessRequest *****")
61 def currentNSSI = execution.getVariable("currentNSSI")
63 String msg = "currentNSSI is null"
65 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
68 LOGGER.trace("***** ${PREFIX} Exit preProcessRequest *****")
75 void prepareDecomposeService(DelegateExecution execution)
77 LOGGER.trace(" *****${PREFIX} Start prepareDecomposeService *****")
80 def currentNSSI = execution.getVariable("currentNSSI")
81 String modelInvariantUuid = currentNSSI['modelInvariantId']
82 String modelVersionId = currentNSSI['modelVersionId']
83 String serviceModelInfo = """{
84 "modelInvariantUuid":"${modelInvariantUuid}",
85 "modelUuid":"${modelVersionId}",
88 execution.setVariable("serviceModelInfo", serviceModelInfo)
92 String exceptionMessage = "Bpmn error encountered in deallocate nssi. Unexpected Error from method prepareDecomposeService() - " + any.getMessage()
93 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
95 LOGGER.debug(" ***** ${PREFIX} Exit prepareDecomposeService *****")
102 void processDecomposition(DelegateExecution execution) {
103 LOGGER.debug("*****${PREFIX} start processDecomposition *****")
106 ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition") as ServiceDecomposition
107 String vendor = serviceDecomposition.getServiceRole()
108 NetworkType domainType = convertServiceCategory(serviceDecomposition.getServiceCategory())
110 def currentNSSI = execution.getVariable("currentNSSI")
111 currentNSSI['vendor'] = vendor
112 currentNSSI['domainType'] = domainType
113 LOGGER.info("processDecomposition, current vendor-domainType:" +String.join("-", vendor, domainType.toString()))
116 String exceptionMessage = "Bpmn error encountered in deallocate nssi. processDecomposition() - " + any.getMessage()
117 LOGGER.debug(exceptionMessage)
118 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
120 LOGGER.debug("*****${PREFIX} Exit processDecomposition *****")
125 * get subnetType from serviceCategory
128 private NetworkType convertServiceCategory(String serviceCategory){
129 if(serviceCategory ==~ /CN.*/){
130 return SubnetType.CN.getNetworkType()
132 if (serviceCategory ==~ /AN.*/){
133 return SubnetType.AN.getNetworkType()
135 if (serviceCategory ==~ /TN.*BH.*/){
136 return SubnetType.TN_BH.getNetworkType()
138 if(serviceCategory ==~ /TN.*MH.*/){
139 return SubnetType.TN_MH.getNetworkType()
141 if(serviceCategory ==~ /TN.*FH.*/){
142 return SubnetType.TN_FH.getNetworkType()
148 * send deallocate request to nssmf
151 void sendRequestToNSSMF(DelegateExecution execution)
153 LOGGER.debug("*****${PREFIX} start sendRequestToNSSMF *****")
154 def currentNSSI = execution.getVariable("currentNSSI")
155 String snssai= currentNSSI['snssai']
156 String profileId = currentNSSI['profileId']
157 String nssiId = currentNSSI['nssiServiceInstanceId']
158 String nsiId = currentNSSI['nsiServiceInstanceId']
159 String scriptName = execution.getVariable("scriptName")
161 String serviceInvariantUuid = currentNSSI['modelInvariantId']
162 String serviceUuid = currentNSSI['modelVersionId']
163 String globalSubscriberId = currentNSSI['globalSubscriberId']
164 String subscriptionServiceType = currentNSSI['serviceType']
166 DeAllocateNssi deAllocateNssi = new DeAllocateNssi()
167 deAllocateNssi.setNsiId(nsiId)
168 deAllocateNssi.setNssiId(nssiId)
169 deAllocateNssi.setTerminateNssiOption(0)
170 deAllocateNssi.setSnssaiList(Arrays.asList(snssai))
171 deAllocateNssi.setScriptName(scriptName)
172 deAllocateNssi.setSliceProfileId(profileId)
174 ServiceInfo serviceInfo = new ServiceInfo()
175 serviceInfo.setServiceInvariantUuid(serviceInvariantUuid)
176 serviceInfo.setServiceUuid(serviceUuid)
177 serviceInfo.setNsiId(nsiId)
178 serviceInfo.setNssiId(nssiId)
179 serviceInfo.setGlobalSubscriberId(globalSubscriberId)
180 serviceInfo.setSubscriptionServiceType(subscriptionServiceType)
181 String serviceInfoString = objectMapper.writeValueAsString(serviceInfo)
183 EsrInfo esrInfo = getEsrInfo(currentNSSI)
184 String esrInfoString = objectMapper.writeValueAsString(esrInfo)
186 execution.setVariable("deAllocateNssi",deAllocateNssi)
187 execution.setVariable("esrInfo", esrInfoString)
188 execution.setVariable("serviceInfo", serviceInfoString)
189 String nssmfRequest = """
191 "deAllocateNssi": ${objectMapper.writeValueAsString(deAllocateNssi)},
192 "esrInfo": ${esrInfoString},
193 "serviceInfo": ${serviceInfoString}
197 String urlStr = String.format("/api/rest/provMns/v1/NSS/SliceProfiles/%s", profileId)
199 NssiResponse nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlStr, nssmfRequest, NssiResponse.class)
200 if (nssmfResponse != null) {
201 currentNSSI['jobId']= nssmfResponse.getJobId() ?: ""
202 currentNSSI['jobProgress'] = 0
203 execution.setVariable("currentNSSI", currentNSSI)
205 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a Bad Response from NSSMF.")
207 LOGGER.debug("*****${PREFIX} Exit sendRequestToNSSMF *****")
211 * send to nssmf query progress
214 void prepareJobStatusRequest(DelegateExecution execution)
216 def currentNSSI = execution.getVariable("currentNSSI")
217 String jobId = currentNSSI['jobId']
218 execution.setVariable("jobId", jobId)
223 * send to nssmf query progress
226 void handleJobStatus(DelegateExecution execution)
230 String jobStatusResponse = execution.getVariable("responseDescriptor")
231 String status = jsonUtil.getJsonValue(jobStatusResponse,"status")
232 def statusDescription = jsonUtil.getJsonValue(jobStatusResponse,"statusDescription")
233 def progress = jsonUtil.getJsonValue(jobStatusResponse,"progress")
234 if(!status.equalsIgnoreCase("failed"))
238 LOGGER.error("job progress is null or empty!")
239 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a Bad Job progress from NSSMF.")
241 def currentNSSI = execution.getVariable("currentNSSI")
242 int oldProgress = currentNSSI['jobProgress']
243 int currentProgress = Integer.parseInt(progress)
245 execution.setVariable("isNSSIDeAllocated", (currentProgress == 100))
246 execution.setVariable("isNeedUpdateDB", (oldProgress != currentProgress))
247 currentNSSI['jobProgress'] = currentProgress
248 currentNSSI['status'] = status
249 currentNSSI['statusDescription'] = statusDescription
251 String nssiId = currentNSSI['nssiServiceInstanceId']
252 String nsiId = currentNSSI['nsiServiceInstanceId']
253 LOGGER.debug("job status result: nsiId = ${nsiId}, nssiId=${nssiId}, oldProgress=${oldProgress}, progress = ${currentProgress}" )
256 execution.setVariable("isNeedUpdateDB", "true")
257 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a Bad Response from NSSMF.")
262 String msg = "Received a Bad Response from NSSMF. cause-"+any.getCause()
263 LOGGER.error(any.printStackTrace())
264 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
268 private EsrInfo getEsrInfo(def currentNSSI)
270 NetworkType domainType = currentNSSI['domainType']
271 String vendor = currentNSSI['vendor']
273 EsrInfo info = new EsrInfo()
274 info.setNetworkType(domainType)
275 info.setVendor(vendor)
281 * prepare update requestdb
284 void prepareUpdateOperationStatus(DelegateExecution execution)
286 def currentNSSI = execution.getVariable("currentNSSI")
287 int currentProgress = currentNSSI["jobProgress"]
288 def proportion = currentNSSI['proportion']
289 int progress = (currentProgress as int) == 0 ? 0 : (currentProgress as int) / 100 * (proportion as int)
290 def status = currentNSSI['status']
293 OperationStatus operationStatus = new OperationStatus()
294 operationStatus.setServiceId(currentNSSI['e2eServiceInstanceId'] as String)
295 operationStatus.setOperationId(currentNSSI['operationId'] as String)
296 operationStatus.setOperation("DELETE")
297 operationStatus.setResult("processing")
298 operationStatus.setProgress(progress as String)
299 operationStatus.setOperationContent(currentNSSI['domainType'].toString() + " " + status.toString())
300 requestDBUtil.prepareUpdateOperationStatus(execution, operationStatus)
301 LOGGER.debug("update operation, currentProgress=${currentProgress}, proportion=${proportion}, progress = ${progress}" )
305 * delete slice profile from aai
308 void delSliceProfileServiceFromAAI(DelegateExecution execution)
310 LOGGER.debug("*****${PREFIX} start delSliceProfileFromAAI *****")
311 def currentNSSI = execution.getVariable("currentNSSI")
312 String nssiServiceInstanceId = currentNSSI['nssiServiceInstanceId']
313 String profileId = currentNSSI['profileId']
314 String globalSubscriberId = currentNSSI["globalSubscriberId"]
315 String serviceType = currentNSSI['serviceType']
319 LOGGER.debug("delete nssiServiceInstanceId:${nssiServiceInstanceId}, profileId:${profileId}")
320 AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(
321 AAIFluentTypeBuilder.business().customer(globalSubscriberId).serviceSubscription(serviceType).serviceInstance(profileId))
322 if (!getAAIClient().exists(resourceUri)) {
323 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai")
325 getAAIClient().delete(resourceUri)
329 String msg = "delete slice profile from aai failed! cause-"+any.getCause()
330 LOGGER.error(any.printStackTrace())
331 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
333 LOGGER.debug("*****${PREFIX} Exist delSliceProfileFromAAI *****")
336 void delSliceProfileFromAAI(DelegateExecution execution){
338 LOGGER.debug("*****${PREFIX} start delSliceProfileFromAAI *****")
339 def currentNSSI = execution.getVariable("currentNSSI")
340 String globalSubscriberId = currentNSSI["globalSubscriberId"]
341 String serviceType = currentNSSI['serviceType']
342 String sliceProfileInstId = currentNSSI['profileId']
346 AAIPluralResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(globalSubscriberId).serviceSubscription(serviceType).serviceInstance(sliceProfileInstId).sliceProfiles())
347 AAIResultWrapper wrapper = getAAIClient().get(resourceUri, NotFoundException.class)
348 Optional<SliceProfiles> sliceProfilesOpt =wrapper.asBean(SliceProfiles.class)
349 SliceProfiles sliceProfiles
351 if(sliceProfilesOpt.isPresent()){
352 sliceProfiles = sliceProfilesOpt.get()
353 org.onap.aai.domain.yang.SliceProfile sliceProfile = sliceProfiles.getSliceProfile().get(0)
354 profileId = sliceProfile ? sliceProfile.getProfileId() : ""
357 AAISimpleUri profileUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(globalSubscriberId).serviceSubscription(serviceType).serviceInstance(sliceProfileInstId).sliceProfile(profileId))
358 if (!getAAIClient().exists(profileUri)) {
359 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai")
361 getAAIClient().delete(profileUri)
367 String msg = "delete service profile from aai failed! cause-"+any.getCause()
368 LOGGER.error(any.printStackTrace())
369 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg);