Merge "Implement Modify Core NSSMF workflow"
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoAllocateAccessNSSI.groovy
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  # Copyright (c) 2020, Wipro Limited.
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.BpmnError
24 import org.camunda.bpm.engine.delegate.DelegateExecution
25 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
26 import org.onap.so.bpmn.common.scripts.ExceptionUtil
27 import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
28 import org.onap.so.bpmn.common.scripts.OofUtils
29 import org.onap.so.bpmn.common.scripts.RequestDBUtil
30 import org.onap.so.bpmn.core.json.JsonUtils
31 import org.onap.so.db.request.beans.ResourceOperationStatus
32 import org.slf4j.Logger
33 import org.slf4j.LoggerFactory
34 import java.sql.Timestamp
35 import java.util.List
36 import static org.apache.commons.lang3.StringUtils.isBlank
37 import com.google.gson.JsonObject
38 import com.fasterxml.jackson.databind.ObjectMapper
39 import com.google.gson.JsonArray
40 import org.onap.aai.domain.yang.Relationship
41 import org.onap.aaiclient.client.aai.AAIResourcesClient
42 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
43 import org.onap.so.beans.nsmf.AllocateTnNssi
44 import org.onap.so.beans.nsmf.EsrInfo
45 import org.onap.so.bpmn.core.UrnPropertiesReader
46 import org.onap.so.bpmn.core.domain.ServiceDecomposition
47 import org.onap.so.bpmn.core.domain.ServiceInstance
48 import org.onap.so.bpmn.core.domain.ServiceProxy
49 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
50 import org.onap.aaiclient.client.aai.AAINamespaceConstants
51 import org.onap.aaiclient.client.aai.AAIObjectType
52 import org.onap.aai.domain.yang.NetworkPolicy
53 import org.onap.aai.domain.yang.NetworkRoute
54
55 class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor {
56
57         String Prefix="AASS_"
58         ExceptionUtil exceptionUtil = new ExceptionUtil()
59         RequestDBUtil requestDBUtil = new RequestDBUtil()
60         JsonUtils jsonUtil = new JsonUtils()
61         OofUtils oofUtils = new OofUtils()
62         AnNssmfUtils anNssmfUtils = new AnNssmfUtils()
63         ObjectMapper objectMapper = new ObjectMapper();
64         private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
65
66         private static final Logger logger = LoggerFactory.getLogger(DoAllocateAccessNSSI.class)
67
68         @Override
69         void preProcessRequest(DelegateExecution execution) {
70                 logger.debug(Prefix + "preProcessRequest Start")
71                 execution.setVariable("prefix", Prefix)
72                 execution.setVariable("startTime", System.currentTimeMillis())
73                 def msg
74                 try {
75
76                         logger.debug("input variables : msoRequestId - "+execution.getVariable("msoRequestId")
77                                         +" modelInvariantUuid - "+execution.getVariable("modelInvariantUuid")+
78                                         " modelUuid - "+execution.getVariable("modelUuid")+
79                                         " globalSubscriberId - "+execution.getVariable("globalSubscriberId")+
80                                         " dummyServiceId - "+ execution.getVariable("dummyServiceId")+
81                                         " nsiId - "+execution.getVariable("nsiId")+
82                                         " networkType - "+execution.getVariable("networkType")+
83                                         " subscriptionServiceType - "+execution.getVariable("subscriptionServiceType")+
84                                         " jobId - "+execution.getVariable("jobId")+
85                                         " sliceParams - "+execution.getVariable("sliceParams")+
86                                         " servicename - "+ execution.getVariable("servicename"))
87
88                         //validate slice subnet inputs
89
90                         String sliceParams = execution.getVariable("sliceParams")
91                         String sliceProfile = jsonUtil.getJsonValue(sliceParams, "sliceProfile")
92                         if (isBlank(sliceProfile)) {
93                                 msg = "Input sliceProfile is null"
94                                 logger.debug(msg)
95                                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
96                         } else {
97                                 execution.setVariable("sliceProfile", sliceProfile)
98                         }
99                         String sliceProfileId = jsonUtil.getJsonValue(sliceProfile, "sliceProfileId")
100                         def snssaiList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "snssaiList"))
101                         def plmnIdList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "plmnIdList"))
102                         def coverageAreaTAList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "coverageAreaTAList"))
103
104                         if (isBlank(sliceProfileId) || (snssaiList.empty) || (plmnIdList.empty)
105                         || (coverageAreaTAList.empty)) {
106
107                                 msg = "Mandatory slice profile fields are empty"
108                                 logger.debug(msg)
109                                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
110                         } else {
111                                 execution.setVariable("sliceProfileId", sliceProfileId)
112                                 execution.setVariable("snssaiList", snssaiList)
113                                 execution.setVariable("plmnIdList", plmnIdList)
114                                 execution.setVariable("coverageAreaTAList", coverageAreaTAList)
115                         }
116                         String nsiName = jsonUtil.getJsonValue(sliceParams, "nsiInfo.nsiName")
117                         String scriptName = jsonUtil.getJsonValue(sliceParams, "scriptName")
118                         execution.setVariable("nsiName", nsiName)
119                         execution.setVariable("scriptName", scriptName)
120                         //generate RAN,RAN NF NSSIs - will be re assigned if oof returns existing NSSI
121                         String RANServiceInstanceId = UUID.randomUUID().toString()
122                         String RANNFServiceInstanceId = UUID.randomUUID().toString()
123                         logger.debug("RAN serviceInstance Id "+RANServiceInstanceId)
124                         logger.debug("RAN NF serviceInstance Id "+RANNFServiceInstanceId)                       
125                         execution.setVariable("RANServiceInstanceId", RANServiceInstanceId)
126                         execution.setVariable("RANNFServiceInstanceId", RANNFServiceInstanceId)
127                         execution.setVariable("ranNssiPreferReuse", true)
128                         execution.setVariable("ranNfNssiPreferReuse", true)
129                         execution.setVariable("job_timeout", 10)
130                         
131                         //set BH end point
132                         List<String> BH_endPoints = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceParams, "endPoints"))
133                         logger.debug("BH end points list : "+BH_endPoints)
134                         if(BH_endPoints.empty) {
135                                 msg = "End point info is empty"
136                                 logger.debug(msg)
137                                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
138                         }else {
139                                 execution.setVariable("bh_endpoint", BH_endPoints.get(0))
140                         }
141                         
142                 } catch(BpmnError e) {
143                         throw e
144                 } catch(Exception ex) {
145                         msg = "Exception in DoAllocateAccessNSSI.preProcessRequest " + ex.getMessage()
146                         logger.debug(msg)
147                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
148                 }
149                 logger.debug(Prefix + "preProcessRequest Exit")
150         }
151
152         /*
153          * Prepare request params for decomposing RAN NSST
154          */
155
156         def prepareDecomposeService = { DelegateExecution execution ->
157                 logger.debug(Prefix+"prepareDecomposeService method start")
158                 String RANServiceInstanceId = execution.getVariable("RANServiceInstanceId")
159                 String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
160                 String modelUuid = execution.getVariable("modelUuid")
161                 String serviceModelInfo = """{
162             "modelInvariantUuid":"${modelInvariantUuid}",
163             "modelUuid":"${modelUuid}",
164             "modelVersion":""
165              }"""
166                 execution.setVariable("serviceModelInfo", serviceModelInfo)
167                 execution.setVariable("serviceInstanceId", RANServiceInstanceId)
168                 logger.debug("serviceModelInfo : "+serviceModelInfo)
169                 logger.debug("Finish RAN NSST prepareDecomposeService")
170         }
171
172         /* process the decompose service(RAN NSST) response
173          * 
174          */
175         def processDecomposition = { DelegateExecution execution ->
176                 logger.debug(Prefix+"processDecomposition method start")
177                 ServiceDecomposition ranNsstServiceDecomposition = execution.getVariable("ranNsstServiceDecomposition")
178                 logger.debug("ranNsstServiceDecomposition : "+ranNsstServiceDecomposition.toString())
179                 //RAN NSST decomposition
180                 String ranModelVersion = ranNsstServiceDecomposition.getModelInfo().getModelVersion()
181                 String ranModelName = ranNsstServiceDecomposition.getModelInfo().getModelName()
182                 List<ServiceProxy> serviceProxyList = ranNsstServiceDecomposition.getServiceProxy()
183                 List<String> nsstInfoList = new ArrayList<>()
184                 for(ServiceProxy serviceProxy : serviceProxyList)
185                 {
186                         String nsstModelUuid = serviceProxy.getModelInfo().getModelUuid()
187                         String nsstModelInvariantUuid = serviceProxy.getModelInfo().getModelInvariantUuid()
188                         String name = serviceProxy.getModelInfo().getModelName()
189                         String nsstServiceModelInfo = """{
190             "UUID":"${nsstModelUuid}",
191             "invariantUUID":"${nsstModelInvariantUuid}",
192             "name":"${name}"
193              }"""
194                         nsstInfoList.add(nsstServiceModelInfo)
195                 }
196                 int currentIndex=0
197                 int maxIndex=nsstInfoList.size()
198                 if(maxIndex < 1)
199                 {
200                         String msg = "Exception in RAN NSST processDecomposition. There is no NSST associated with RAN NSST "
201                         logger.info(msg)
202                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
203                 }
204                 execution.setVariable("ranNsstInfoList",nsstInfoList)
205                 execution.setVariable("ranModelVersion", ranModelVersion)
206                 execution.setVariable("ranModelName", ranModelName)
207                 execution.setVariable("currentIndex",currentIndex)
208                 execution.setVariable("maxIndex",maxIndex)
209                 logger.debug(Prefix+"processDecomposition maxIndex value - "+maxIndex)
210         }
211
212         /*
213          * Function to subnet capabilities from nssmf adapter
214          */
215         def getSubnetCapabilities = { DelegateExecution execution ->
216                 logger.debug(Prefix+"getSubnetCapabilities method start")
217
218                 String tnNssmfRequest = anNssmfUtils.buildCreateTNNSSMFSubnetCapabilityRequest()
219
220                 String urlString = "/api/rest/provMns/v1/NSS/subnetCapabilityQuery"
221
222                 String tnNssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, tnNssmfRequest)
223
224                 if (tnNssmfResponse != null) {
225                         String FHCapabilities= jsonUtil.getJsonValue(tnNssmfResponse, "TN_FH")
226                         String MHCapabilities = jsonUtil.getJsonValue(tnNssmfResponse, "TN_MH")
227                         execution.setVariable("FHCapabilities",FHCapabilities)
228                         execution.setVariable("MHCapabilities",MHCapabilities)
229
230                 } else {
231                         logger.error("received error message from NSSMF : "+ tnNssmfResponse)
232                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
233                 }
234                 String anNssmfRequest = anNssmfUtils.buildCreateANNFNSSMFSubnetCapabilityRequest()
235
236                 String anNssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, anNssmfRequest)
237
238                 if (anNssmfResponse != null) {
239                         String ANNFCapabilities = jsonUtil.getJsonValue(anNssmfResponse, "AN_NF")
240                         execution.setVariable("ANNFCapabilities",ANNFCapabilities)
241
242                 } else {
243                         logger.error("received error message from NSSMF : "+ anNssmfResponse)
244                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
245                 }
246         }
247
248         /*
249          * prepare OOF request for RAN NSSI selection
250          */
251         def prepareOofRequestForRanNSS = { DelegateExecution execution ->
252                 logger.debug(Prefix+"prepareOofRequestForRanNSS method start")
253
254                 String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
255                 logger.debug( "get NSSI option OOF Url: " + urlString)
256
257                 //build oof request body
258                 boolean ranNssiPreferReuse = execution.getVariable("ranNssiPreferReuse");
259                 String requestId = execution.getVariable("msoRequestId")
260                 String messageType = "NSISelectionResponse"
261                 Map<String, Object> profileInfo = objectMapper.readValue(execution.getVariable("sliceProfile"), Map.class)
262                 String modelUuid = execution.getVariable("modelUuid")
263                 String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
264                 String modelName = execution.getVariable("ranModelName")
265                 String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
266                 List<String> nsstInfoList =  objectMapper.readValue(execution.getVariable("nsstInfoList"), List.class)
267                 JsonArray capabilitiesList = new JsonArray()
268                 String FHCapabilities = execution.getVariable("FHCapabilities")
269                 String MHCapabilities = execution.getVariable("MHCapabilities")
270                 String ANNFCapabilities = execution.getVariable("ANNFCapabilities")
271                 JsonObject FH = new JsonObject()
272                 JsonObject MH = new JsonObject()
273                 JsonObject ANNF = new JsonObject()
274                 FH.addProperty("domainType", "TN_FH")
275                 FH.addProperty("capabilityDetails", FHCapabilities)
276                 MH.addProperty("domainType", "TN_MH")
277                 MH.addProperty("capabilityDetails", MHCapabilities)
278                 ANNF.addProperty("domainType", "AN_NF")
279                 ANNF.addProperty("capabilityDetails", FHCapabilities)
280                 capabilitiesList.add(FH)
281                 capabilitiesList.add(MH)
282                 capabilitiesList.add(ANNF)
283
284                 execution.setVariable("nssiSelection_Url", "/api/oof/selection/nsi/v1")
285                 execution.setVariable("nssiSelection_messageType",messageType)
286                 execution.setVariable("nssiSelection_correlator",requestId)
287                 execution.setVariable("nssiSelection_timeout",timeout)
288
289                 String oofRequest = anNssmfUtils.buildSelectRANNSSIRequest(requestId, messageType, modelUuid,modelInvariantUuid,
290                                 modelName, profileInfo, nsstInfoList, capabilitiesList, ranNssiPreferReuse)
291
292                 execution.setVariable("nssiSelection_oofRequest",oofRequest)
293                 logger.debug("Sending request to OOF: " + oofRequest)
294         }
295         /*
296          * process OOF response for RAN NSSI selection
297          */
298         def processOofResponseForRanNSS = { DelegateExecution execution ->
299                 logger.debug(Prefix+"processOofResponseForRanNSS method start")
300                 String oofResponse = execution.getVariable("nssiSelection_asyncCallbackResponse")
301                 String requestStatus = jsonUtil.getJsonValue(oofResponse, "requestStatus")
302                 if(requestStatus.equals("completed")) {
303                         List<String> solution = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(oofResponse, "solutions"))
304                         boolean existingNSI = jsonUtil.getJsonValue(solution.get(0), "existingNSI")
305                         if(existingNSI) {
306                                 def sharedNSISolution = jsonUtil.getJsonValue(solution.get(0), "sharedNSISolution")
307                                 execution.setVariable("sharedRanNSSISolution", sharedNSISolution)
308                                 logger.debug("sharedRanNSSISolution from OOF "+sharedNSISolution)
309                                 String RANServiceInstanceId = jsonUtil.getJsonValue(solution.get(0), "sharedNSISolution.NSIId")
310                                 execution.setVariable("RANServiceInstanceId", RANServiceInstanceId)
311                                 ServiceInstance serviceInstance = new ServiceInstance();
312                                 serviceInstance.setInstanceId(RANServiceInstanceId);
313                                 ServiceDecomposition serviceDecomposition = execution.getVariable("ranNsstServiceDecomposition")
314                                 serviceDecomposition.setServiceInstance(serviceInstance);
315                                 execution.setVariable("ranNsstServiceDecomposition", serviceDecomposition)
316                                 execution.setVariable("isRspRanNssi", true)
317                         }else {
318                                 def sliceProfiles = jsonUtil.getJsonValue(solution.get(0), "newNSISolution.sliceProfiles")
319                                 execution.setVariable("RanConstituentSliceProfiles", sliceProfiles)
320                                 logger.debug("RanConstituentSliceProfiles list from OOF "+sliceProfiles)
321                         }
322                 }else {
323                         String statusMessage = jsonUtil.getJsonValue(oofResponse, "statusMessage")
324                         logger.error("received failed status from oof "+ statusMessage)
325                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a failed Async Response from OOF : "+statusMessage)
326                 }
327
328         }
329
330         def prepareModifyAccessNssiInputs = { DelegateExecution execution ->
331                 logger.debug(Prefix+"prepareModifyAccessNssiInputs method start")
332                 String jobId = UUID.randomUUID().toString()
333                 execution.setVariable("modifyRanNssiJobId", jobId)              
334                 String snssaiList = execution.getVariable("snssaiList")
335                 String sliceParams = execution.getVariable("sliceParams")
336                 String sliceProfileId = execution.getVariable("sliceProfileId")
337                 String nsiInfo = jsonUtil.getJsonValue(sliceParams, "nsiInfo")
338                 String scriptName = execution.getVariable("scriptName")
339                 
340                 JsonObject modifySliceParams = new JsonObject()
341                 modifySliceParams.addProperty("modifyAction", "allocate")
342                 modifySliceParams.addProperty("snssaiList", snssaiList)
343                 modifySliceParams.addProperty("sliceProfileId", sliceProfileId)
344                 modifySliceParams.addProperty("nsiInfo", nsiInfo)
345                 modifySliceParams.addProperty("scriptName", scriptName)
346                 
347                 execution.setVariable("modifySliceParams", modifySliceParams.toString())
348                 //create operation status in request db
349                 String serviceId = execution.getVariable("RANServiceInstanceId")
350                 String nsiId = execution.getVariable("nsiId")
351                 logger.debug("Generated new job for Service Instance serviceId:" + serviceId + "jobId:" + jobId)
352
353                 ResourceOperationStatus initStatus = new ResourceOperationStatus()
354                 initStatus.setServiceId(serviceId)
355                 initStatus.setOperationId(jobId)
356                 initStatus.setResourceTemplateUUID(nsiId)
357                 initStatus.setOperType("Modify")
358                 requestDBUtil.prepareInitResourceOperationStatus(execution, initStatus)
359         }
360         
361         def createModifyNssiQueryJobStatus = { DelegateExecution execution ->
362                 logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
363                 EsrInfo esrInfo = new EsrInfo()
364                 esrInfo.setNetworkType("AN")
365                 esrInfo.setVendor("ONAP")
366                 String esrInfoString = objectMapper.writeValueAsString(esrInfo)
367                 execution.setVariable("esrInfo", esrInfoString)
368                 JsonObject serviceInfo = new JsonObject()
369                 serviceInfo.addProperty("nssiId", execution.getVariable("RANServiceInstanceId"))
370                 serviceInfo.addProperty("nsiId", execution.getVariable("nsiId"))
371                 serviceInfo.addProperty("nssiName", execution.getVariable("servicename"))
372                 String sST = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST")
373                 serviceInfo.addProperty("sST", sST)
374                 serviceInfo.addProperty("PLMNIdList", objectMapper.writeValueAsString(execution.getVariable("plmnIdList")))
375                 serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId"))
376                 serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType"))
377                 serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("modelInvariantUuid"))
378                 serviceInfo.addProperty("serviceUuid", execution.getVariable("modelUuid"))
379                 execution.setVariable("serviceInfo", serviceInfo.toString())
380                 execution.setVariable("responseId", "")
381         }
382         def prepareNsstDecomposeService = { DelegateExecution execution ->
383                 logger.debug(Prefix+"prepareNsstDecomposeService method start")
384                 List<String> nsstInfoList = objectMapper.readValue(execution.getVariable("ranNsstInfoList"), List.class)
385                 int currentIndex = execution.getVariable("currentIndex")
386                 int maxIndex = execution.getVariable("maxIndex")
387                 logger.debug(Prefix+"prepareNsstDecomposeService : currentIndex value - "+currentIndex+" maxIndex : "+maxIndex)
388                 if(currentIndex<maxIndex) {
389                         String nsstInfo = nsstInfoList.get(currentIndex)
390                         String modelInvariantUuid = jsonUtil.getJsonValue(nsstInfo, "invariantUUID")
391                         String modelUuid = jsonUtil.getJsonValue(nsstInfo, "UUID")
392                         
393                         String serviceModelInfo = """{
394             "modelInvariantUuid":"${modelInvariantUuid}",
395             "modelUuid":"${modelUuid}",
396             "modelVersion":""
397              }"""
398                         execution.setVariable("serviceModelInfo", serviceModelInfo)
399                         execution.setVariable("serviceInstanceId", "")
400                         logger.debug("serviceModelInfo : "+serviceModelInfo)
401                         currentIndex++
402                         execution.setVariable("currentIndex", currentIndex)
403                 }else {
404                         logger.error("nsstList decomposition error ")
405                         exceptionUtil.buildAndThrowWorkflowException(execution, 1000, "nsstList decomposition error ")
406                 }
407                 
408         }
409         def processNsstDecomposition = { DelegateExecution execution ->
410                 logger.debug(Prefix+"processNsstDecomposition method start")
411                 ServiceDecomposition decomposedNsst = execution.getVariable("nsstServiceDecomposition")
412                 logger.debug("decomposedNsst : "+decomposedNsst.toString())
413                 
414                 String nsstType = decomposedNsst.getServiceRole() //domainType
415                 String modelVersion = decomposedNsst.getModelInfo().getModelVersion()
416                 String modelName = decomposedNsst.getModelInfo().getModelName()
417                 String modelUuid = decomposedNsst.getModelInfo().getModelUuid()
418                 String modelInvariantUuid = decomposedNsst.getModelInfo().getModelInvariantUuid()
419                 
420                 switch(nsstType) {
421                         case "AN_NF":
422                                 execution.setVariable("ANNF_modelInvariantUuid", modelInvariantUuid)
423                                 execution.setVariable("ANNF_modelUuid", modelUuid)
424                                 execution.setVariable("ANNF_modelVersion", modelVersion)
425                                 execution.setVariable("ANNF_modelName", modelName)
426                                 execution.setVariable("ANNF_ServiceDecomposition", decomposedNsst)
427                                 break
428                         case "TN_FH":
429                                 execution.setVariable("TNFH_modelInvariantUuid", modelInvariantUuid)
430                                 execution.setVariable("TNFH_modelUuid", modelUuid)
431                                 execution.setVariable("TNFH_modelVersion", modelVersion)
432                                 execution.setVariable("TNFH_modelName", modelName)
433                                 execution.setVariable("TNFH_ServiceDecomposition", decomposedNsst)
434                                 break
435                         case "TN_MH":
436                                 execution.setVariable("TNMH_modelInvariantUuid", modelInvariantUuid)
437                                 execution.setVariable("TNMH_modelUuid", modelUuid)
438                                 execution.setVariable("TNMH_modelVersion", modelVersion)
439                                 execution.setVariable("TNMH_modelName", modelName)
440                                 execution.setVariable("TNMH_ServiceDecomposition", decomposedNsst)
441                                 break
442                         default:
443                                 logger.debug("No expected match found for current nsstType")
444                                 logger.error("No expected match found for current nsstType "+ nsstType)
445                                 exceptionUtil.buildAndThrowWorkflowException(execution, 1000,"No expected match found for current nsstType "+ nsstType)
446                 }
447                 boolean isAllNsstsDecomposed = false
448                 int currentIndex = execution.getVariable("currentIndex")
449                 int maxIndex = execution.getVariable("maxIndex")
450                 if(currentIndex == maxIndex) {
451                         isAllNsstsDecomposed = true
452                 }
453                 execution.setVariable("isAllNsstsDecomposed", isAllNsstsDecomposed)
454         }
455         /*
456          * prepare OOF request for NF RAN NSSI selection
457          */
458         def prepareOofRequestForRanNfNSS = { DelegateExecution execution ->
459                 logger.debug(Prefix+"prepareOofRequestForRanNfNSS method start")
460                 String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
461                 logger.debug( "get NSSI option OOF Url: " + urlString)
462
463                 //build oof request body
464                 boolean ranNfNssiPreferReuse = execution.getVariable("ranNfNssiPreferReuse");
465                 String requestId = execution.getVariable("msoRequestId")
466                 String messageType = "NSSISelectionResponse"
467                 List<String> ranConstituentSliceProfiles = jsonUtil.StringArrayToList(execution.getVariable("RanConstituentSliceProfiles"))
468                 anNssmfUtils.createDomainWiseSliceProfiles(ranConstituentSliceProfiles, execution)
469                 Map<String, Object> profileInfo = objectMapper.readValue(execution.getVariable("ranNfSliceProfile"), Map.class)
470                 String modelUuid = execution.getVariable("ANNF_modelUuid")
471                 String modelInvariantUuid = execution.getVariable("ANNF_modelInvariantUuid")
472                 String modelName = execution.getVariable("ANNF_modelName")
473                 String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
474
475                 execution.setVariable("nssiSelection_Url", "/api/oof/selection/nssi/v1")
476                 execution.setVariable("nssiSelection_messageType",messageType)
477                 execution.setVariable("nssiSelection_correlator",requestId)
478                 execution.setVariable("nssiSelection_timeout",timeout)
479
480                 String oofRequest = oofUtils.buildSelectNSSIRequest(requestId, messageType, modelUuid, modelInvariantUuid, modelName, profileInfo)
481
482                 execution.setVariable("nssiSelection_oofRequest",oofRequest)
483         }
484         /*
485          * process OOF response for RAN NF NSSI selection
486          */
487         def processOofResponseForRanNfNSS = { DelegateExecution execution ->
488                 logger.debug(Prefix+"processOofResponseForRanNfNSS method start")
489                 String oofResponse = execution.getVariable("nfNssiSelection_asyncCallbackResponse")
490                 String requestStatus = jsonUtil.getJsonValue(oofResponse, "requestStatus")
491                 if(requestStatus.equals("completed")) {
492                         List<String> solution = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(oofResponse, "solutions"))             
493                         if(solution.size()>=1) {
494                                 String ranNfNssiId = jsonUtil.getJsonValue(solution.get(0), "NSSIId")
495                                 String invariantUuid = jsonUtil.getJsonValue(solution.get(0), "invariantUUID")
496                                 String uuid = jsonUtil.getJsonValue(solution.get(0), "UUID")
497                                 String nssiName = jsonUtil.getJsonValue(solution.get(0), "NSSIName")
498                                 execution.setVariable("RANNFServiceInstanceId", ranNfNssiId)
499                                 execution.setVariable("RANNFInvariantUUID", invariantUuid)
500                                 execution.setVariable("RANNFUUID", uuid)
501                                 execution.setVariable("RANNFNssiName", nssiName)
502                                 logger.debug("RANNFServiceInstanceId from OOF "+ranNfNssiId)
503                                 
504                                 ServiceInstance serviceInstance = new ServiceInstance();
505                                 serviceInstance.setInstanceId(ranNfNssiId);
506                                 ServiceDecomposition serviceDecomposition = execution.getVariable("ANNF_ServiceDecomposition")
507                                 serviceDecomposition.setServiceInstance(serviceInstance);
508                                 execution.setVariable("ANNF_ServiceDecomposition", serviceDecomposition)
509                                 execution.setVariable("isRspRanNfNssi", true)
510                         }else {
511                                 logger.debug("No solutions returned from OOF .. Create new RAN NF NSSI")
512                         }
513                 }else {
514                         String statusMessage = jsonUtil.getJsonValue(oofResponse, "statusMessage")
515                         logger.error("received failed status from oof "+ statusMessage)
516                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a failed Async Response from OOF : "+statusMessage)
517                 }
518         }
519
520         def createSliceProfilesInAai = { DelegateExecution execution ->
521                 logger.debug(Prefix+"createSliceProfilesInAai method start")
522                 anNssmfUtils.createSliceProfilesInAai(execution)
523         }
524
525         def processRanNfModifyRsp = { DelegateExecution execution ->
526                 logger.debug(Prefix+"processRanNfModifyRsp method start")
527                 anNssmfUtils.processRanNfModifyRsp(execution)
528                 //create RAN NSSI 
529                 org.onap.aai.domain.yang.ServiceInstance ANServiceInstance = new ServiceInstance();
530                 //AN instance creation
531                 ANServiceInstance.setServiceInstanceId(execution.getVariable("RANServiceInstanceId"))
532                 String sliceInstanceName = execution.getVariable("servicename")
533                 ANServiceInstance.setServiceInstanceName(sliceInstanceName)
534                 String serviceType = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST")
535                 ANServiceInstance.setServiceType(serviceType)
536                 String serviceStatus = "deactivated"
537                 ANServiceInstance.setOrchestrationStatus(serviceStatus)
538                 String serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "plmnIdList")
539                 ANServiceInstance.setServiceInstanceLocationId(serviceInstanceLocationid)
540                 String serviceRole = "nssi"
541                 ANServiceInstance.setServiceRole(serviceRole)
542                 List<String> snssaiList = objectMapper.readValue(execution.getVariable("snssaiList"), List.class)
543                 String snssai = snssaiList.get(0)
544                 ANServiceInstance.setEnvironmentContext(snssai)
545                 ANServiceInstance.setWorkloadContext("AN")
546                 
547                 logger.debug("completed AN service instance build "+ ANServiceInstance.toString())
548                 String msg = ""
549                 try {
550         
551                         AAIResourcesClient client = new AAIResourcesClient()
552                         AAIResourceUri nssiServiceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), execution.getVariable("RANServiceInstanceId"))
553                         client.create(nssiServiceUri, ANServiceInstance)
554         
555                 } catch (BpmnError e) {
556                         throw e
557                 } catch (Exception ex) {
558                         msg = "Exception in AnNssmfUtils.createSliceProfilesInAai " + ex.getMessage()
559                         logger.info(msg)
560                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
561                 }
562                 //end point update
563                 createEndPointsInAai(execution)
564         }
565         
566         def createSdnrRequest = { DelegateExecution execution ->
567                 logger.debug(Prefix+"createSdnrRequest method start")
568                 String callbackUrl = UrnPropertiesReader.getVariable("mso.workflow.message.endpoint") + "/AsyncSdnrResponse/"+execution.getVariable("msoRequestId")
569                 String sdnrRequest = buildSdnrAllocateRequest(execution, "allocate", "InstantiateRANSlice", callbackUrl)
570                 execution.setVariable("createNSSI_sdnrRequest", sdnrRequest)
571                 execution.setVariable("createNSSI_timeout", "PT10M")
572                 execution.setVariable("createNSSI_correlator", execution.getVariable("msoRequestId"))
573                 execution.setVariable("createNSSI_messageType", "AsyncSdnrResponse");
574         }
575
576         def processSdnrResponse = { DelegateExecution execution ->
577                 logger.debug(Prefix+"processSdnrResponse method start")
578                 String SDNRResponse = execution.getVariable("SDNR_asyncCallbackResponse")
579                 String status = jsonUtil.getJsonValue(SDNRResponse, "status")
580                 if(status.equalsIgnoreCase("success")) {
581                         String nfIds = jsonUtil.getJsonValue(SDNRResponse, "nfIds")
582                         execution.setVariable("ranNfIdsJson", nfIds)
583                 }else {
584                         String reason = jsonUtil.getJsonValue(SDNRResponse, "reason")
585                         logger.error("received failed status from SDNR "+ reason)
586                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from SDNR "+ reason)
587                 }
588                 logger.debug("response from SDNR "+SDNRResponse)
589         }
590
591         def updateAaiWithRANInstances = { DelegateExecution execution ->
592                 logger.debug(Prefix+"updateAaiWithRANInstances method start")
593                 //create RAN NSSI 
594                 org.onap.aai.domain.yang.ServiceInstance ANServiceInstance = new ServiceInstance();
595                 org.onap.aai.domain.yang.ServiceInstance ANNFServiceInstance = new ServiceInstance();
596                 //AN instance creation
597                 ANServiceInstance.setServiceInstanceId(execution.getVariable("RANServiceInstanceId"))
598                 String sliceInstanceName = execution.getVariable("servicename")
599                 ANServiceInstance.setServiceInstanceName(sliceInstanceName)
600                 String serviceType = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST")
601                 ANServiceInstance.setServiceType(serviceType)
602                 String serviceStatus = "deactivated"
603                 ANServiceInstance.setOrchestrationStatus(serviceStatus)
604                 String serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "plmnIdList")
605                 ANServiceInstance.setServiceInstanceLocationId(serviceInstanceLocationid)
606                 String serviceRole = "nssi"
607                 ANServiceInstance.setServiceRole(serviceRole)
608                 List<String> snssaiList = objectMapper.readValue(execution.getVariable("snssaiList"), List.class)
609                 String snssai = snssaiList.get(0)
610                 ANServiceInstance.setEnvironmentContext(snssai)
611                 ANServiceInstance.setWorkloadContext("AN")
612                 
613                 logger.debug("completed AN service instance build "+ ANServiceInstance.toString())
614                 //create RAN NF NSSI
615                 ANNFServiceInstance.setServiceInstanceId(execution.getVariable("RANNFServiceInstanceId"))
616                 sliceInstanceName = execution.getVariable("ANNF_modelName")
617                 ANNFServiceInstance.setServiceInstanceName(sliceInstanceName)
618                 ANNFServiceInstance.setServiceType(serviceType)
619                 ANNFServiceInstance.setOrchestrationStatus(serviceStatus)
620                 serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("ranNfSliceProfile"), "plmnIdList")
621                 ANNFServiceInstance.setServiceInstanceLocationId(serviceInstanceLocationid)
622                 ANNFServiceInstance.setServiceRole(serviceRole)
623                 snssaiList = objectMapper.readValue(execution.getVariable("snssaiList"), List.class)
624                 snssai = snssaiList.get(0)
625                 ANNFServiceInstance.setEnvironmentContext(snssai)
626                 ANNFServiceInstance.setWorkloadContext("AN-NF")
627                 logger.debug("completed AN service instance build "+ ANNFServiceInstance.toString())
628                 
629                 String msg = ""
630                 try {
631         
632                         AAIResourcesClient client = new AAIResourcesClient()
633                         AAIResourceUri nssiServiceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), execution.getVariable("RANServiceInstanceId"))
634                         client.create(nssiServiceUri, ANServiceInstance)
635         
636                         AAIResourceUri nssiServiceUri1 = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), execution.getVariable("RANNFServiceInstanceId"))
637                         client.create(nssiServiceUri1, ANNFServiceInstance)
638         
639                 } catch (BpmnError e) {
640                         throw e
641                 } catch (Exception ex) {
642                         msg = "Exception in AnNssmfUtils.createSliceProfilesInAai " + ex.getMessage()
643                         logger.info(msg)
644                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
645                 }
646                 //end point update
647                 createEndPointsInAai(execution)
648         }
649         def prepareTnFhRequest = { DelegateExecution execution ->
650                 logger.debug(Prefix+"prepareTnFhRequest method start")
651
652                 String nssmfRequest = anNssmfUtils.buildCreateNSSMFRequest(execution, "TN_FH", "allocate")
653                 String urlString = "/api/rest/provMns/v1/NSS/SliceProfiles"
654                 String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
655
656                 if (nssmfResponse != null) {
657                         execution.setVariable("nssmfResponse", nssmfResponse)
658                         String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
659                         execution.setVariable("TNFH_jobId",jobId)
660                 } else {
661                         logger.error("received error message from NSSMF : "+ nssmfResponse)
662                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
663                 }
664                 logger.debug("Exit prepareTnFhRequest")
665
666         }
667         def prepareTnMhRequest = { DelegateExecution execution ->
668                 logger.debug(Prefix+"prepareTnMhRequest method start")
669
670                 String nssmfRequest = anNssmfUtils.buildCreateNSSMFRequest(execution, "TN_MH", "allocate")
671                 String urlString = "/api/rest/provMns/v1/NSS/SliceProfiles"
672                 String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
673
674                 if (nssmfResponse != null) {
675                         execution.setVariable("nssmfResponse", nssmfResponse)
676                         String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
677                         execution.setVariable("TNMH_jobId",jobId)
678                 } else {
679                         logger.error("received error message from NSSMF : "+ nssmfResponse)
680                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
681                 }
682                 logger.debug("Exit prepareTnMhRequest")
683         }
684         
685         def createFhAllocateNssiJobQuery = { DelegateExecution execution ->
686                 logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
687                 createTnAllocateNssiJobQuery(execution, "TN_FH")                
688         }
689         
690         def createMhAllocateNssiJobQuery = { DelegateExecution execution ->
691                 logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
692                 createTnAllocateNssiJobQuery(execution, "TN_MH")
693         }
694         
695         private void createTnAllocateNssiJobQuery(DelegateExecution execution, String domainType) {
696                 EsrInfo esrInfo = new EsrInfo()
697                 esrInfo.setNetworkType("TN")
698                 esrInfo.setVendor("ONAP")
699                 String esrInfoString = objectMapper.writeValueAsString(esrInfo)
700                 execution.setVariable("esrInfo", esrInfoString)
701                 JsonObject serviceInfo = new JsonObject()
702                 serviceInfo.addProperty("nssiId", null)
703                 serviceInfo.addProperty("nsiId", execution.getVariable("nsiId"))
704                 String sST = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST")
705                 serviceInfo.addProperty("sST", sST)
706                 serviceInfo.addProperty("PLMNIdList", objectMapper.writeValueAsString(execution.getVariable("plmnIdList")))
707                 serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId"))
708                 serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType"))
709                 if(domainType.equals("TN_FH")) {
710                         serviceInfo.addProperty("nssiName", execution.getVariable("TNFH_modelName"))
711                         serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("TNFH_modelInvariantUuid"))
712                         serviceInfo.addProperty("serviceUuid", execution.getVariable("TNFH_modelUuid"))
713                 }else if(domainType.equals("TN_MH")) {
714                         serviceInfo.addProperty("nssiName", execution.getVariable("TNMH_modelName"))
715                         serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("TNMH_modelInvariantUuid"))
716                         serviceInfo.addProperty("serviceUuid", execution.getVariable("TNMH_modelUuid"))
717                 }
718                 execution.setVariable("serviceInfo", serviceInfo.toString())
719                 execution.setVariable("responseId", "")
720         }
721         
722         def processFhAllocateNssiJobStatusRsp = { DelegateExecution execution ->
723                 logger.debug(Prefix+"processJobStatusRsp method start")
724                 String jobResponse = execution.getVariable("TNFH_jobResponse")
725                 logger.debug("Job status response "+jobResponse)
726                 String status = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.status")
727                 String nssi = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.nssi")
728                 if(status.equalsIgnoreCase("finished")) {
729                         execution.setVariable("TNFH_NSSI", nssi)
730                         logger.debug("Job successfully completed ... proceeding with flow for nssi : "+nssi)
731                 }
732                 else {
733                         String statusDescription = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.statusDescription")
734                         logger.error("received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
735                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
736                 }
737         }
738         
739         def processMhAllocateNssiJobStatusRsp = { DelegateExecution execution ->
740                 logger.debug(Prefix+"processJobStatusRsp method start")
741                 String jobResponse = execution.getVariable("TNMH_jobResponse")
742                 logger.debug("Job status response "+jobResponse)
743                 String status = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.status")
744                 String nssi = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.nssi")
745                 if(status.equalsIgnoreCase("finished")) {
746                         execution.setVariable("TNMH_NSSI", nssi)
747                         logger.debug("Job successfully completed ... proceeding with flow for nssi : "+nssi)
748                 }
749                 else {
750                         String statusDescription = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.statusDescription")
751                         logger.error("received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
752                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
753                 }
754         }
755         
756         def processModifyJobStatusRsp = { DelegateExecution execution ->
757                 logger.debug(Prefix+"processJobStatusRsp method start")
758                 String jobResponse = execution.getVariable("jobResponse")
759                 logger.debug("Job status response "+jobResponse)
760                 String status = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.status")
761                 String nssi = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.nssi")
762                 if(status.equalsIgnoreCase("finished")) {
763                         logger.debug("Job successfully completed ... proceeding with flow for nssi : "+nssi)
764                 }
765                 else {
766                         String statusDescription = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.statusDescription")
767                         logger.error("received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
768                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
769                 }
770         }
771
772         def updateAairelationships = { DelegateExecution execution ->
773                 logger.debug(Prefix + "updateAairelationships Start")
774                 String msg = ""
775                 try {
776                         def ANNF_serviceInstanceId = execution.getVariable("RANNFServiceInstanceId")
777                         def TNFH_serviceInstanceId = execution.getVariable("TNFH_NSSI")
778                         def TNMH_serviceInstanceId = execution.getVariable("TNMH_NSSI")
779                         def AN_profileInstanceId = execution.getVariable("sliceProfileId")
780                         def AN_NSSI = execution.getVariable("RANServiceInstanceId")
781                         def ANNF_profileInstanceId = execution.getVariable("ANNF_sliceProfileInstanceId")
782                         def TNFH_profileInstanceId = execution.getVariable("TNFH_sliceProfileInstanceId")
783                         def TNMH_profileInstanceId = execution.getVariable("TNMH_sliceProfileInstanceId")
784                         String globalSubscriberId = execution.getVariable("globalSubscriberId")
785                         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
786
787                         Relationship ANNF_relationship = new Relationship()
788                         Relationship TNFH_relationship = new Relationship()
789                         Relationship TNMH_relationship = new Relationship()
790                         
791                         String ANNF_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${ANNF_profileInstanceId}"
792                         String TNFH_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNFH_profileInstanceId}"
793                         String TNMH_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNMH_profileInstanceId}"
794                         
795                         String ANNF_NSSI_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${ANNF_serviceInstanceId}"
796                         String TNFH_NSSI_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNFH_serviceInstanceId}"
797                         String TNMH_NSSI_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNMH_serviceInstanceId}"
798                         
799                         ANNF_relationship.setRelatedLink(ANNF_relatedLink)
800                         ANNF_relationship.setRelatedTo("service-instance")
801                         ANNF_relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
802                         TNFH_relationship.setRelatedLink(TNFH_relatedLink)
803                         TNFH_relationship.setRelatedTo("service-instance")
804                         TNFH_relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
805                         TNMH_relationship.setRelatedLink(TNMH_relatedLink)
806                         TNMH_relationship.setRelatedTo("service-instance")
807                         TNMH_relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
808                         
809                         // create SliceProfile and NSSI relationship in AAI
810                         anNssmfUtils.createRelationShipInAAI(execution, ANNF_relationship,ANNF_serviceInstanceId)
811                         anNssmfUtils.createRelationShipInAAI(execution, TNFH_relationship,TNFH_serviceInstanceId)
812                         anNssmfUtils.createRelationShipInAAI(execution, TNMH_relationship,TNMH_serviceInstanceId)
813                         anNssmfUtils.createRelationShipInAAI(execution, ANNF_relationship,AN_profileInstanceId)
814                         anNssmfUtils.createRelationShipInAAI(execution, TNFH_relationship,AN_profileInstanceId)
815                         anNssmfUtils.createRelationShipInAAI(execution, TNMH_relationship,AN_profileInstanceId)
816                         
817                         //create AN NSSI and ANNF,TNFH,TNMH relationship in AAI
818                         ANNF_relationship.setRelatedLink(ANNF_NSSI_relatedLink)
819                         TNFH_relationship.setRelatedLink(TNFH_NSSI_relatedLink)
820                         TNMH_relationship.setRelatedLink(TNMH_NSSI_relatedLink)
821                         anNssmfUtils.createRelationShipInAAI(execution, ANNF_relationship,AN_NSSI)
822                         anNssmfUtils.createRelationShipInAAI(execution, TNFH_relationship,AN_NSSI)
823                         anNssmfUtils.createRelationShipInAAI(execution, TNMH_relationship,AN_NSSI)
824
825                 } catch (BpmnError e) {
826                         throw e
827                 } catch (Exception ex) {
828
829                         msg = "Exception in DoCreateE2EServiceInstance.createCustomRelationship. " + ex.getMessage()
830                         logger.info(msg)
831                         exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
832                 }
833         }
834         
835         /**
836          * update operation status in request db
837          *
838          */
839         def prepareOperationStatusUpdate = { DelegateExecution execution ->
840                 logger.debug(Prefix + "prepareOperationStatusUpdate Start")
841
842                 String serviceId = execution.getVariable("dummyServiceId")
843                 String jobId = execution.getVariable("jobId")
844                 String nsiId = execution.getVariable("nsiId")
845                 String nssiId = execution.getVariable("RANServiceInstanceId")
846                 logger.debug("Service Instance serviceId:" + serviceId + " jobId:" + jobId)
847
848                 ResourceOperationStatus updateStatus = new ResourceOperationStatus()
849                 updateStatus.setServiceId(serviceId)
850                 updateStatus.setOperationId(jobId)
851                 updateStatus.setResourceTemplateUUID(nsiId)
852                 updateStatus.setResourceInstanceID(nssiId)
853                 updateStatus.setOperType("Allocate")
854                 updateStatus.setProgress(100)
855                 updateStatus.setStatus("finished")
856                 requestDBUtil.prepareUpdateResourceOperationStatus(execution, updateStatus)
857
858                 logger.debug(Prefix + "prepareOperationStatusUpdate Exit")
859         }
860
861         def prepareFailedOperationStatusUpdate = { DelegateExecution execution ->
862                 logger.debug(Prefix + "prepareFailedOperationStatusUpdate Start")
863                 
864                 String serviceId = execution.getVariable("dummyServiceId")
865                 String jobId = execution.getVariable("jobId")
866                 String nsiId = execution.getVariable("nsiId")
867                 String nssiId = execution.getVariable("RANServiceInstanceId")
868                 logger.debug("Service Instance serviceId:" + serviceId + " jobId:" + jobId)
869
870                 ResourceOperationStatus updateStatus = new ResourceOperationStatus()
871                 updateStatus.setServiceId(serviceId)
872                 updateStatus.setOperationId(jobId)
873                 updateStatus.setResourceTemplateUUID(nsiId)
874                 updateStatus.setResourceInstanceID(nssiId)
875                 updateStatus.setOperType("Allocate")
876                 updateStatus.setProgress(0)
877                 updateStatus.setStatus("failed")
878                 requestDBUtil.prepareUpdateResourceOperationStatus(execution, updateStatus)
879         }
880         
881         private String buildSdnrAllocateRequest(DelegateExecution execution, String action, String rpcName, String callbackUrl) {
882                 
883                 String requestId = execution.getVariable("msoRequestId")
884                 Date date = new Date().getTime()
885                 Timestamp time = new Timestamp(date)
886                 Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("ranNfSliceProfile"), Map.class)
887                 sliceProfile.put("sliceProfileId", execution.getVariable("ANNF_sliceProfileInstanceId"))
888                 sliceProfile.put("maxNumberofConns", sliceProfile.get("maxNumberofPDUSessions"))
889                 sliceProfile.put("uLThptPerSlice", sliceProfile.get("expDataRateUL"))
890                 sliceProfile.put("dLThptPerSlice", sliceProfile.get("expDataRateDL"))
891                 String sliceProfileString = objectMapper.writeValueAsString(sliceProfile)
892                 JsonObject response = new JsonObject()
893                 JsonObject body = new JsonObject()
894                 JsonObject input = new JsonObject()
895                 JsonObject commonHeader = new JsonObject()
896                 JsonObject payload = new JsonObject()
897                 JsonObject payloadInput = new JsonObject()
898                 commonHeader.addProperty("TimeStamp", time.toString())
899                 commonHeader.addProperty("APIver", "1.0")
900                 commonHeader.addProperty("RequestID", requestId)
901                 commonHeader.addProperty("SubRequestID", "1")
902                 commonHeader.add("RequestTrack", new JsonObject())
903                 commonHeader.add("Flags", new JsonObject())
904                 payloadInput.addProperty("sliceProfile", sliceProfileString)
905                 payloadInput.addProperty("RANNSSIId", execution.getVariable("RANServiceInstanceId"))
906                 payloadInput.addProperty("NSIID", execution.getVariable("nsiId"))
907                 payloadInput.addProperty("RANNFNSSIId", execution.getVariable("RANNFServiceInstanceId"))
908                 payloadInput.addProperty("callbackURL", callbackUrl)
909                 payloadInput.add("additionalproperties", new JsonObject())
910                 payload.add("input", payloadInput)
911                 input.add("CommonHeader", commonHeader)
912                 input.addProperty("Action", action)
913                 input.add("Payload", payload)
914                 body.add("input", input)
915                 response.add("body", body)
916                 response.addProperty("version", "1.0")
917                 response.addProperty("rpc-name", rpcName)
918                 response.addProperty("correlation-id", requestId+"-1")
919                 response.addProperty("type", "request")
920                 return response.toString()
921         }
922         
923         private void createEndPointsInAai(DelegateExecution execution) {
924                 String type = "endpoint"
925                 String function = "transport_EP"
926                 int prefixLength = 24
927                 String addressFamily = "ipv4"
928                 //BH RAN end point update
929                 String bh_endpoint = execution.getVariable("bh_endpoint")
930                 String bh_routeId = UUID.randomUUID().toString()
931                 execution.setVariable("tranportEp_ID_bh", bh_routeId)
932                 String role = "CU"
933                 String CU_IpAddress = jsonUtil.getJsonValue(bh_endpoint, "IpAddress")
934                 String LogicalLinkId = jsonUtil.getJsonValue(bh_endpoint, "LogicalLinkId")
935                 String nextHopInfo = jsonUtil.getJsonValue(bh_endpoint, "nextHopInfo")
936                 NetworkRoute bh_ep = new NetworkRoute()
937                 bh_ep.setRouteId(bh_routeId)
938                 bh_ep.setFunction(function)
939                 bh_ep.setRole(role)
940                 bh_ep.setType(type)
941                 bh_ep.setIpAddress(CU_IpAddress)
942                 bh_ep.setLogicalInterfaceId(LogicalLinkId)
943                 bh_ep.setNextHop(nextHopInfo)
944                 bh_ep.setPrefixLength(prefixLength)
945                 bh_ep.setAddressFamily(addressFamily)
946                 //FH RAN end points update
947                 //RU
948                 String RU_routeId = UUID.randomUUID().toString()
949                 execution.setVariable("tranportEp_ID_RU", RU_routeId)
950                 role = "RU"
951                 NetworkRoute RU_ep = new NetworkRoute()
952                 RU_ep.setRouteId(RU_routeId)
953                 RU_ep.setFunction(function)
954                 RU_ep.setRole(role)
955                 RU_ep.setType(type)
956                 RU_ep.setIpAddress("192.168.100.4")
957                 RU_ep.setLogicalInterfaceId("1234")
958                 RU_ep.setNextHop("Host1")
959                 RU_ep.setPrefixLength(prefixLength)
960                 RU_ep.setAddressFamily(addressFamily)
961                 //DU Ingress
962                 String DUIN_routeId = UUID.randomUUID().toString()
963                 execution.setVariable("tranportEp_ID_DUIN", DUIN_routeId)
964                 role = "DU"
965                 NetworkRoute DU_ep = new NetworkRoute()
966                 DU_ep.setRouteId(DUIN_routeId)
967                 DU_ep.setFunction(function)
968                 DU_ep.setRole(role)
969                 DU_ep.setType(type)
970                 DU_ep.setIpAddress("192.168.100.5")
971                 DU_ep.setLogicalInterfaceId("1234")
972                 DU_ep.setNextHop("Host2")
973                 DU_ep.setPrefixLength(prefixLength)
974                 DU_ep.setAddressFamily(addressFamily)
975                 //MH RAN end point update
976                 //DUEG
977                 String DUEG_routeId = UUID.randomUUID().toString()
978                 execution.setVariable("tranportEp_ID_DUEG", DUEG_routeId)
979                 NetworkRoute DUEG_ep = new NetworkRoute()
980                 DU_ep.setRouteId(DUEG_routeId)
981                 DU_ep.setNextHop("Host3")
982                 //CUIN
983                 String CUIN_routeId = UUID.randomUUID().toString()
984                 execution.setVariable("tranportEp_ID_CUIN", CUIN_routeId)
985                 NetworkRoute CUIN_ep = new NetworkRoute()
986                 CUIN_ep.setRouteId(CUIN_routeId)
987                 CUIN_ep.setFunction(function)
988                 CUIN_ep.setRole(role)
989                 CUIN_ep.setType(type)
990                 CUIN_ep.setIpAddress("192.168.100.6")
991                 CUIN_ep.setLogicalInterfaceId("1234")
992                 CUIN_ep.setNextHop("Host4")
993                 CUIN_ep.setPrefixLength(prefixLength)
994                 CUIN_ep.setAddressFamily(addressFamily)
995                 try {
996                         AAIResourcesClient client = new AAIResourcesClient()
997                         logger.debug("creating bh endpoint . ID : "+bh_routeId+" node details : "+bh_ep.toString())
998                         AAIResourceUri networkRouteUri = AAIUriFactory.createResourceUri( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), bh_routeId)
999                         client.create(networkRouteUri, bh_ep)
1000                         logger.debug("creating RU endpoint . ID : "+RU_routeId+" node details : "+RU_ep.toString())
1001                         networkRouteUri = AAIUriFactory.createResourceUri( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), RU_routeId)
1002                         client.create(networkRouteUri, RU_ep)
1003                         logger.debug("creating DUIN endpoint . ID : "+DUIN_routeId+" node details : "+DU_ep.toString())
1004                         networkRouteUri = AAIUriFactory.createResourceUri( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), DUIN_routeId)
1005                         client.create(networkRouteUri, DU_ep)
1006                         logger.debug("creating DUEG endpoint . ID : "+DUEG_routeId+" node details : "+DU_ep.toString())
1007                         networkRouteUri = AAIUriFactory.createResourceUri( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), DUEG_routeId)
1008                         client.create(networkRouteUri, DU_ep)
1009                         logger.debug("creating CUIN endpoint . ID : "+CUIN_routeId+" node details : "+CUIN_ep.toString())
1010                         networkRouteUri = AAIUriFactory.createResourceUri( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), CUIN_routeId)
1011                         client.create(networkRouteUri, CUIN_ep)
1012                         //relationship b/w bh_ep and RAN NSSI
1013                         def AN_NSSI = execution.getVariable("RANServiceInstanceId")
1014                         Relationship relationship = new Relationship()
1015                         String relatedLink = "aai/v21/network/network-routes/network-route/${bh_routeId}"               
1016                         relationship.setRelatedLink(relatedLink)
1017                         relationship.setRelatedTo("network-route")
1018                         relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
1019                         anNssmfUtils.createRelationShipInAAI(execution, relationship, AN_NSSI)
1020                         def ANNF_serviceInstanceId = execution.getVariable("RANNFServiceInstanceId")
1021                         relatedLink = "aai/v21/network/network-routes/network-route/${RU_routeId}"
1022                         relationship.setRelatedLink(relatedLink)
1023                         anNssmfUtils.createRelationShipInAAI(execution, relationship, ANNF_serviceInstanceId)
1024                         relatedLink = "aai/v21/network/network-routes/network-route/${DUIN_routeId}"
1025                         relationship.setRelatedLink(relatedLink)
1026                         anNssmfUtils.createRelationShipInAAI(execution, relationship, ANNF_serviceInstanceId)
1027                         relatedLink = "aai/v21/network/network-routes/network-route/${DUEG_routeId}"
1028                         relationship.setRelatedLink(relatedLink)
1029                         anNssmfUtils.createRelationShipInAAI(execution, relationship, ANNF_serviceInstanceId)
1030                         relatedLink = "aai/v21/network/network-routes/network-route/${CUIN_routeId}"
1031                         relationship.setRelatedLink(relatedLink)
1032                         anNssmfUtils.createRelationShipInAAI(execution, relationship, ANNF_serviceInstanceId)
1033                 } catch (BpmnError e) {
1034                 throw e
1035         } catch (Exception ex) {
1036                 String msg = "Exception in createEndPointsInAai " + ex.getMessage()
1037                 logger.info(msg)
1038                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
1039         }
1040         }
1041 }