c06e313c4cfe5ad26ba975e91867c341c8cb6cbc
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoCreateTnNssiInstance.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License")
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.bpmn.infrastructure.scripts
22
23 import org.camunda.bpm.engine.delegate.BpmnError
24 import org.camunda.bpm.engine.delegate.DelegateExecution
25 import org.onap.aai.domain.yang.NetworkPolicy
26 import org.onap.aai.domain.yang.SliceProfile
27 import org.onap.aaiclient.client.aai.AAIResourcesClient
28 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
29 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
30 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder
31 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
32 import org.onap.so.bpmn.common.scripts.ExceptionUtil
33 import org.onap.so.bpmn.core.json.JsonUtils
34 import org.slf4j.Logger
35 import org.slf4j.LoggerFactory
36
37 import static org.apache.commons.lang3.StringUtils.isBlank
38 import static org.apache.commons.lang3.StringUtils.isNotBlank
39
40 class DoCreateTnNssiInstance extends AbstractServiceTaskProcessor {
41
42     private static final Logger logger = LoggerFactory.getLogger(DoCreateTnNssiInstance.class);
43     final String AAI_VERSION = "v21"
44     JsonUtils jsonUtil = new JsonUtils()
45     TnNssmfUtils tnNssmfUtils = new TnNssmfUtils()
46     ExceptionUtil exceptionUtil = new ExceptionUtil()
47     String Prefix = "DCTN_"
48
49     void preProcessRequest(DelegateExecution execution) {
50         String msg = ""
51         logger.trace("Enter preProcessRequest()")
52
53         execution.setVariable("prefix", Prefix)
54
55         String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
56         String modelUuid = execution.getVariable("modelUuid")
57         //here modelVersion is not set, we use modelUuid to decompose the service.
58         def isDebugLogEnabled = true
59         execution.setVariable("isDebugLogEnabled", isDebugLogEnabled)
60         String serviceModelInfo = """{
61             "modelInvariantUuid":"${modelInvariantUuid}",
62             "modelUuid":"${modelUuid}",
63             "modelVersion":""
64              }"""
65         execution.setVariable("serviceModelInfo", serviceModelInfo)
66
67         if (isBlank(execution.getVariable("enableSdnc"))) {
68             tnNssmfUtils.setEnableSdncConfig(execution)
69         }
70
71         logger.trace("Exit preProcessRequest")
72     }
73
74
75     void createSliceProfile(DelegateExecution execution) {
76
77         String ssInstanceId = execution.getVariable("sliceServiceInstanceId")
78         String sliceProfileStr = execution.getVariable("sliceProfile")
79         String sliceProfileId = UUID.randomUUID().toString()
80         SliceProfile sliceProfile = new SliceProfile();
81         sliceProfile.setProfileId(sliceProfileId)
82         sliceProfile.setLatency(Integer.parseInt(jsonUtil.getJsonValue(sliceProfileStr, "latency")))
83         sliceProfile.setResourceSharingLevel(jsonUtil.getJsonValue(sliceProfileStr, "resourceSharingLevel"))
84         //sliceProfile.setSNssai(tnNssmfUtils.getFirstSnssaiFromSliceProfile(sliceProfileStr))
85
86         sliceProfile.setMaxBandwidth(Integer.parseInt(jsonUtil.getJsonValue(sliceProfileStr, "maxBandwidth")))
87
88         //sliceProfile.setReliability(new Object())
89         try {
90             AAIResourcesClient client = getAAIClient()
91             AAIResourceUri uri =
92                     AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
93                             .customer(execution.getVariable("globalSubscriberId"))
94                             .serviceSubscription(execution.getVariable("subscriptionServiceType"))
95                             .serviceInstance(ssInstanceId)
96                             .sliceProfile(sliceProfileId))
97             client.create(uri, sliceProfile)
98
99         } catch (BpmnError e) {
100             throw e
101         } catch (Exception ex) {
102             String msg = "Exception in DoCreateSliceServiceInstance.instantiateSliceService. " + ex.getMessage()
103             logger.info(msg)
104             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
105         }
106     }
107
108
109     void createServiceInstance(DelegateExecution execution) {
110
111         String serviceRole = "nssi"
112         String serviceType = execution.getVariable("subscriptionServiceType")
113         String ssInstanceId = execution.getVariable("sliceServiceInstanceId")
114         String sliceProfileStr = execution.getVariable("sliceProfile")
115         try {
116             if (sliceProfileStr == null || sliceProfileStr.isEmpty()) {
117                 String msg = "ERROR: createServiceInstance: sliceProfile is null"
118                 logger.error(msg)
119                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
120             }
121
122             org.onap.aai.domain.yang.ServiceInstance ss = new org.onap.aai.domain.yang.ServiceInstance()
123             ss.setServiceInstanceId(ssInstanceId)
124             String sliceInstanceName = execution.getVariable("sliceServiceInstanceName")
125             if (isBlank(sliceInstanceName)) {
126                 logger.error("ERROR: createServiceInstance: sliceInstanceName is null")
127                 sliceInstanceName = ssInstanceId
128             }
129             ss.setServiceInstanceName(sliceInstanceName)
130             ss.setServiceType(serviceType)
131             String serviceStatus = "deactivated"
132             ss.setOrchestrationStatus(serviceStatus)
133             String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
134             String modelUuid = execution.getVariable("modelUuid")
135             ss.setModelInvariantId(modelInvariantUuid)
136             ss.setModelVersionId(modelUuid)
137             String serviceInstanceLocationId = tnNssmfUtils.getFirstPlmnIdFromSliceProfile(sliceProfileStr)
138             ss.setServiceInstanceLocationId(serviceInstanceLocationId)
139             String snssai = tnNssmfUtils.getFirstSnssaiFromSliceProfile(sliceProfileStr)
140             //ss.setEnvironmentContext(snssai)
141             ss.setEnvironmentContext("tn")
142             ss.setServiceRole(serviceRole)
143
144             String domainTypeStr = jsonUtil.getJsonValue(sliceProfileStr, "domainType")
145             if (isNotBlank(domainTypeStr)) {
146                 ss.setWorkloadContext(domainTypeStr)
147             }
148
149             AAIResourcesClient client = getAAIClient()
150             AAIResourceUri uri =
151                     AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
152                             .customer(execution.getVariable("globalSubscriberId"))
153                             .serviceSubscription(execution.getVariable("subscriptionServiceType"))
154                             .serviceInstance(ssInstanceId))
155             client.create(uri, ss)
156         } catch (BpmnError e) {
157             throw e
158         } catch (Exception ex) {
159             String msg = "Exception in DoCreateTnNssiInstance.createServiceInstance: " + ex.getMessage()
160             logger.error(msg)
161             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
162         }
163     }
164
165
166     void createAllottedResource(DelegateExecution execution) {
167         String ssInstanceId = execution.getVariable('sliceServiceInstanceId')
168
169         try {
170             List<String> networkStrList = jsonUtil.StringArrayToList(execution.getVariable("transportSliceNetworks"))
171
172             for (String networkStr : networkStrList) {
173                 String allottedResourceId = UUID.randomUUID().toString()
174                 AAIResourceUri allottedResourceUri =
175                         AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
176                                 .customer(execution.getVariable("globalSubscriberId"))
177                                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
178                                 .serviceInstance(execution.getVariable("sliceServiceInstanceId"))
179                                 .allottedResource(allottedResourceId))
180                 execution.setVariable("allottedResourceUri", allottedResourceUri)
181                 String modelInvariantId = execution.getVariable("modelInvariantUuid")
182                 String modelVersionId = execution.getVariable("modelUuid")
183
184                 org.onap.aai.domain.yang.AllottedResource resource = new org.onap.aai.domain.yang.AllottedResource()
185                 resource.setId(allottedResourceId)
186                 resource.setType("TsciNetwork")
187                 resource.setAllottedResourceName("network_" + execution.getVariable("sliceServiceInstanceName"))
188                 getAAIClient().create(allottedResourceUri, resource)
189
190                 createNetworkPolicyForAllocatedResource(execution, ssInstanceId, allottedResourceId)
191
192                 String linkArrayStr = jsonUtil.getJsonValue(networkStr, "connectionLinks")
193                 createLogicalLinksForAllocatedResource(execution, linkArrayStr, ssInstanceId, allottedResourceId)
194             }
195         } catch (BpmnError e) {
196             throw e
197         } catch (Exception ex) {
198             String msg = "Exception in DoCreateTnNssiInstance.createAllottedResource: " + ex.getMessage()
199             logger.error(msg)
200             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
201         }
202     }
203
204     void createNetworkPolicy(DelegateExecution execution, String ssInstanceId, String networkPolicyId) {
205         try {
206
207             String sliceProfileStr = execution.getVariable("sliceProfile")
208             if (sliceProfileStr == null || sliceProfileStr.isEmpty()) {
209                 String msg = "ERROR: createNetworkPolicy: sliceProfile is null"
210                 logger.error(msg)
211                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
212             }
213
214             NetworkPolicy networkPolicy = new NetworkPolicy();
215             networkPolicy.setNetworkPolicyId(networkPolicyId)
216             networkPolicy.setName("TSCi policy")
217             networkPolicy.setType("SLA")
218             networkPolicy.setNetworkPolicyFqdn(ssInstanceId)
219
220             String latencyStr = jsonUtil.getJsonValue(sliceProfileStr, "latency")
221             if (latencyStr != null && !latencyStr.isEmpty()) {
222                 networkPolicy.setLatency(Integer.parseInt(latencyStr))
223             }
224
225             String bwStr = jsonUtil.getJsonValue(sliceProfileStr, "maxBandwidth")
226             if (bwStr != null && !bwStr.isEmpty()) {
227                 networkPolicy.setMaxBandwidth(Integer.parseInt(bwStr))
228             } else {
229                 log.debug("ERROR: createNetworkPolicy: maxBandwidth is null")
230             }
231
232             //networkPolicy.setReliability(new Object())
233
234             AAIResourceUri networkPolicyUri =
235                     AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkPolicy(networkPolicyId))
236             getAAIClient().create(networkPolicyUri, networkPolicy)
237
238         } catch (BpmnError e) {
239             throw e
240         } catch (Exception ex) {
241             String msg = "Exception in DoCreateSliceServiceInstance.instantiateSliceService. " + ex.getMessage()
242             logger.error(msg)
243             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
244         }
245     }
246
247     void createNetworkPolicyForAllocatedResource(DelegateExecution execution,
248                                                  String ssInstanceId,
249                                                  String allottedResourceId) {
250         try {
251             AAIResourceUri allottedResourceUri =
252                     AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
253                             .customer(execution.getVariable("globalSubscriberId"))
254                             .serviceSubscription(execution.getVariable("subscriptionServiceType"))
255                             .serviceInstance(ssInstanceId)
256                             .allottedResource(allottedResourceId))
257
258             if (!getAAIClient().exists(allottedResourceUri)) {
259                 logger.info("ERROR: createLogicalLinksForAllocatedResource: allottedResource not exist: uri={}",
260                         allottedResourceUri)
261                 return
262             }
263
264             String networkPolicyId = UUID.randomUUID().toString()
265             createNetworkPolicy(execution, ssInstanceId, networkPolicyId)
266
267             tnNssmfUtils.attachNetworkPolicyToAllottedResource(execution, AAI_VERSION, allottedResourceUri, networkPolicyId);
268
269         } catch (BpmnError e) {
270             throw e
271         } catch (Exception ex) {
272             String msg = "Exception in DoCreateSliceServiceInstance.instantiateSliceService. " + ex.getMessage()
273             logger.error(msg)
274             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
275         }
276     }
277
278     void createLogicalLinksForAllocatedResource(DelegateExecution execution,
279                                                 String linkArrayStr, String ssInstanceId,
280                                                 String allottedResourceId) {
281         try {
282             AAIResourceUri allottedResourceUri =
283                     AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
284                             .customer(execution.getVariable("globalSubscriberId"))
285                             .serviceSubscription(execution.getVariable("subscriptionServiceType"))
286                             .serviceInstance(ssInstanceId)
287                             .allottedResource(allottedResourceId))
288
289             if (!getAAIClient().exists(allottedResourceUri)) {
290                 logger.info("ERROR: createLogicalLinksForAllocatedResource: allottedResource not exist: uri={}",
291                         allottedResourceUri)
292                 return
293             }
294
295             List<String> linkStrList = jsonUtil.StringArrayToList(linkArrayStr)
296
297             for (String linkStr : linkStrList) {
298                 String linkName = jsonUtil.getJsonValue(linkStr, "name")
299                 if (isBlank(linkName)) {
300                     linkName = "tn-nssmf-" + UUID.randomUUID().toString()
301                 }
302                 logger.debug("createLogicalLinksForAllocatedResource: linkName=" + linkName)
303
304                 String epA = jsonUtil.getJsonValue(linkStr, "transportEndpointA")
305                 String epB = jsonUtil.getJsonValue(linkStr, "transportEndpointB")
306                 String modelInvariantId = execution.getVariable("modelInvariantUuid")
307                 String modelVersionId = execution.getVariable("modelUuid")
308
309                 org.onap.aai.domain.yang.LogicalLink resource = new org.onap.aai.domain.yang.LogicalLink()
310                 resource.setLinkName(linkName)
311                 resource.setLinkId(epA)
312                 resource.setLinkName2(epB)
313                 resource.setLinkType("TsciConnectionLink")
314                 resource.setInMaint(false)
315
316                 //epA is link-name
317                 AAIResourceUri logicalLinkUri =
318                         AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().logicalLink(linkName))
319                 getAAIClient().create(logicalLinkUri, resource)
320
321                 tnNssmfUtils.attachLogicalLinkToAllottedResource(execution, AAI_VERSION, allottedResourceUri, linkName);
322             }
323         } catch (BpmnError e) {
324             throw e
325         } catch (Exception ex) {
326             String msg = "Exception in DoCreateTnNssiInstance.createLogicalLinksForAllocatedResource: " + ex.getMessage()
327             logger.error(msg)
328             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
329         }
330     }
331
332     void preprocessSdncAllocateTnNssiRequest(DelegateExecution execution) {
333         def method = getClass().getSimpleName() + '.preProcessSDNCActivateRequest(' +
334                 'execution=' + execution.getId() +
335                 ')'
336         def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
337         logger.trace('Entered ' + method)
338
339         logger.trace("STARTED preProcessSDNCActivateRequest Process")
340         try {
341             String serviceInstanceId = execution.getVariable("sliceServiceInstanceId")
342
343             String createSDNCRequest = tnNssmfUtils.buildSDNCRequest(execution, serviceInstanceId, "create")
344
345             execution.setVariable("TNNSSMF_SDNCRequest", createSDNCRequest)
346             logger.debug("Outgoing SDNCRequest is: \n" + createSDNCRequest)
347
348         } catch (Exception e) {
349             logger.debug("Exception Occured Processing preProcessSDNCActivateRequest. Exception is:\n" + e)
350             exceptionUtil.buildAndThrowWorkflowException(execution, 1002,
351                     "Error Occured during  preProcessSDNCActivateRequest Method:\n" + e.getMessage())
352         }
353         logger.trace("COMPLETED  preProcessSDNCActivateRequest Process")
354     }
355
356
357     void validateSDNCResponse(DelegateExecution execution, String response, String method) {
358         tnNssmfUtils.validateSDNCResponse(execution, response, method)
359     }
360 }