diff options
Diffstat (limited to 'bpmn')
13 files changed, 708 insertions, 740 deletions
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/NssmfAdapterUtils.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/NssmfAdapterUtils.groovy new file mode 100644 index 0000000000..775f088136 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/NssmfAdapterUtils.groovy @@ -0,0 +1,149 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + # Copyright (c) 2019, CMCC Technologies Co., Ltd. + # + # Licensed under the Apache License, Version 2.0 (the "License") + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.so.bpmn.common.scripts + +import org.apache.commons.lang3.StringUtils +import org.camunda.bpm.engine.delegate.DelegateExecution +import org.json.JSONArray +import org.json.JSONObject +import org.onap.logging.filter.base.ErrorCode +import org.onap.logging.filter.base.ONAPComponents +import org.onap.logging.ref.slf4j.ONAPLogConstants +import org.onap.so.bpmn.core.UrnPropertiesReader +import org.onap.so.bpmn.core.json.JsonUtils +import org.onap.so.client.HttpClient +import org.onap.so.client.HttpClientFactory +import org.onap.so.logger.LoggingAnchor +import org.onap.so.logger.MessageEnum +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.web.util.UriUtils + +import javax.ws.rs.core.MediaType +import javax.ws.rs.core.Response + +/*** + * Utilities for accessing Catalog DB Adapter to retrieve Networks, VNF/VFModules, AllottedResources and complete ServiceResources information + * + */ + +class NssmfAdapterUtils { + private static final Logger logger = LoggerFactory.getLogger( NssmfAdapterUtils.class); + + private HttpClientFactory httpClientFactory + private MsoUtils utils + private JsonUtils jsonUtils + + NssmfAdapterUtils(HttpClientFactory httpClientFactory, JsonUtils jsonUtils) { + this.httpClientFactory = httpClientFactory + this.utils = new MsoUtils() + this.jsonUtils = jsonUtils + } + + + public <T> T sendPostRequestNSSMF (DelegateExecution execution, String endPoint, String nssmfRequest, Class<T> entityType) { + try { + + String nssmfEndpoint = UrnPropertiesReader.getVariable("mso.adapters.nssmf.endpoint",execution) + String queryEndpoint = nssmfEndpoint + endPoint + def responseData + HttpClient client = httpClientFactory.newJsonClient(new URL(queryEndpoint), ONAPComponents.EXTERNAL) + String basicAuthCred = execution.getVariable("BasicAuthHeaderValue") + client.addAdditionalHeader("Authorization", StringUtils.defaultIfEmpty(basicAuthCred, getBasicDBAuthHeader(execution))) + + logger.debug('sending POST to NSSMF endpoint: ' + endPoint) + Response response = client.post(nssmfRequest) + + responseData = response.readEntity(entityType) + if (responseData != null) { + logger.debug("Received data from NSSMF: " + responseData) + } + + logger.debug('Response code:' + response.getStatus()) + logger.debug('Response:' + System.lineSeparator() + responseData) + if (response.getStatus() >= 200 && response.getStatus() < 300) { + // parse response as needed + return responseData + } + else { + return null + } + } + catch (Exception e) { + logger.debug("ERROR WHILE QUERYING CATALOG DB: " + e.message) + throw e + } + + } + + public String sendPostRequestNSSMF (DelegateExecution execution, String endPoint, String nssmfRequest) { + try { + + String nssmfEndpoint = UrnPropertiesReader.getVariable("mso.adapters.nssmf.endpoint",execution) + String queryEndpoint = nssmfEndpoint + endPoint + def responseData + HttpClient client = httpClientFactory.newJsonClient(new URL(queryEndpoint), ONAPComponents.EXTERNAL) + String basicAuthCred = execution.getVariable("BasicAuthHeaderValue") + client.addAdditionalHeader("Authorization", StringUtils.defaultIfEmpty(basicAuthCred, getBasicDBAuthHeader(execution))) + + logger.debug('sending POST to NSSMF endpoint: ' + endPoint) + Response response = client.post(nssmfRequest) + + responseData = response.readEntity(String.class) + if (responseData != null) { + logger.debug("Received data from NSSMF: " + responseData) + } + + logger.debug('Response code:' + response.getStatus()) + logger.debug('Response:' + System.lineSeparator() + responseData) + if (response.getStatus() >= 200 && response.getStatus() < 300) { + // parse response as needed + return responseData + } + else { + return null + } + } + catch (Exception e) { + logger.debug("ERROR WHILE QUERYING CATALOG DB: " + e.message) + throw e + } + + } + + + private String getBasicDBAuthHeader(DelegateExecution execution) { + + String encodedString = null + try { + String basicAuthValueDB = UrnPropertiesReader.getVariable("mso.adapters.db.auth", execution) + logger.debug("DEBUG", " Obtained BasicAuth userid password for Catalog DB adapter: " + basicAuthValueDB) + + encodedString = utils.getBasicAuth(basicAuthValueDB, UrnPropertiesReader.getVariable("mso.msoKey", execution)) + execution.setVariable("BasicAuthHeaderValue", encodedString) + } catch (IOException ex) { + String dataErrorMessage = " Unable to encode Catalog DB user/password string - " + ex.getMessage() + logger.error(dataErrorMessage) + } + return encodedString + } + +} diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/OofUtils.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/OofUtils.groovy index 34cbb00735..d307a4e7bc 100644 --- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/OofUtils.groovy +++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/OofUtils.groovy @@ -534,6 +534,7 @@ class OofUtils { public String buildSelectNSTRequest(String requestId, Map<String, Object> profileInfo) { def transactionId = requestId logger.debug( "transactionId is: " + transactionId) + String callbackUrl = "http://0.0.0.0:9000/callback/" ObjectMapper objectMapper = new ObjectMapper() String json = objectMapper.writeValueAsString(profileInfo) StringBuilder response = new StringBuilder() @@ -543,11 +544,45 @@ class OofUtils { " \"transactionId\": \"${transactionId}\",\n" + " \"requestId\": \"${requestId}\",\n" + " \"sourceId\": \"so\",\n" + - " \"timeout\": 600\n" + + " \"timeout\": 600,\n" + + " \"callbackUrl\": \"${callbackUrl}\"\n" + " },\n") - response.append(",\n \"serviceInfo\": \n") + response.append(" \"serviceProfile\": {\n" + + " \"serviceProfileParameters\": ") + response.append(json); + response.append("\n }\n") + response.append("\n}\n") + return response.toString() + } + + public String buildSelectNSIRequest(String requestId, String nstInfo, Map<String, Object> profileInfo){ + + def transactionId = requestId + logger.debug( "transactionId is: " + transactionId) + String callbackUrl = "http://0.0.0.0:9000/callback/" + ObjectMapper objectMapper = new ObjectMapper(); + String json = objectMapper.writeValueAsString(profileInfo); + StringBuilder response = new StringBuilder(); + response.append( + "{\n" + + " \"requestInfo\": {\n" + + " \"transactionId\": \"${transactionId}\",\n" + + " \"requestId\": \"${requestId}\",\n" + + " \"sourceId\": \"so\",\n" + + " \"timeout\": 600,\n" + + " \"callbackUrl\": \"${callbackUrl}\"\n" + + " },\n" + + " \"serviceInfo\": {\n" + + " \"serviceInstanceId\": \"\",\n" + + " \"serviceName\": \"\"\n" + + " },\n" + + " \"NSTInfoList\": [\n") + response.append(nstInfo); + response.append("\n ],\n") + response.append("\n \"serviceProfile\": \n") response.append(json); response.append("\n }\n") return response.toString() } + } diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CheckServiceProcessStatus.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CheckServiceProcessStatus.groovy index 169c00b68b..ecbe766695 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CheckServiceProcessStatus.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CheckServiceProcessStatus.groovy @@ -129,7 +129,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { /** * check service status through request operation id, update operation status */ - def preCheckServiceStatusReq = { DelegateExecution execution -> + void preCheckServiceStatusReq(DelegateExecution execution) { logger.trace(Prefix + "preCheckServiceStatusReq Start") String serviceInstanceId = execution.getVariable("serviceInstanceId") as String String operationId = execution.getVariable("operationId") as String @@ -142,7 +142,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { * handle service status, if service status is finished or error, set the service status * @param execution */ - def handlerServiceStatusResp = { DelegateExecution execution -> + void handlerServiceStatusResp(DelegateExecution execution) { logger.trace(Prefix + "handlerServiceStatusResp Start") String msg try { @@ -203,7 +203,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { } - def timeWaitDelay = { DelegateExecution execution -> + void timeWaitDelay(DelegateExecution execution) { Long startTime = execution.getVariable("startTime") as Long Long timeOut = execution.getVariable("timeOut") as Long @@ -221,7 +221,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { } - private handlerTimeOut = { DelegateExecution execution -> + private handlerTimeOut(DelegateExecution execution) { Map<String, Object> paramMap = execution.getVariable("timeOutParamMap") as Map @@ -229,7 +229,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { } - private handlerSuccess = { DelegateExecution execution, String result -> + private handlerSuccess(DelegateExecution execution, String result) { Map<String, Object> paramMap = execution.getVariable("successParamMap") as Map @@ -237,7 +237,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { } - private handlerError = { DelegateExecution execution, String result -> + private handlerError(DelegateExecution execution, String result) { Map<String, Object> paramMap = execution.getVariable("errorParamMap") as Map @@ -245,7 +245,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { } - private handlerProcess = { DelegateExecution execution, String result, def paramMap, def status, def msg -> + private handlerProcess(DelegateExecution execution, String result, def paramMap, def status, def msg) { if (paramMap != null) { for (Map.Entry<String, Object> entry : paramMap.entrySet()) { @@ -260,7 +260,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { if (isBlank(execution.getVariable("operationContent") as String)) { - String operationContent = execution.getVariable("processServiceType") + " " + + String operationContent = execution.getVariable("processServiceType") + " " + execution.getVariable("operationType") + " operation finished " + msg execution.setVariable("operationContent", operationContent) } @@ -275,7 +275,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { /** * judge if the service processing success finished */ - private isSuccessCompleted = { DelegateExecution execution, String result -> + private Boolean isSuccessCompleted(DelegateExecution execution, String result) { //successConditions: processing end success conditions List<String> successConditions = execution.getVariable("successConditions") as List @@ -291,7 +291,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { /** * judge if the service processing error finished */ - private isErrorCompleted = { DelegateExecution execution, String result -> + private Boolean isErrorCompleted(DelegateExecution execution, String result) { //errorConditions: processing end error conditions List<String> errorConditions = execution.getVariable("errorConditions") as List @@ -304,7 +304,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { } - def preUpdateOperationProgress = { DelegateExecution execution -> + void preUpdateOperationProgress(DelegateExecution execution) { logger.trace(Prefix + "prepareUpdateOperationStatus Start") def progress = execution.getVariable("progress") as Integer @@ -314,7 +314,7 @@ class CheckServiceProcessStatus extends AbstractServiceTaskProcessor { def resProgress = (initProgress + (endProgress - initProgress) / 100 * progress) as Integer def operationType = execution.getVariable("operationType") - def operationContent = execution.getVariable("processServiceType") + " " + + def operationContent = execution.getVariable("processServiceType") + " " + operationType + " operation processing " + resProgress // update status creating diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSliceService.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSliceService.groovy index 2da5878e36..15a0f34482 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSliceService.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/CreateSliceService.groovy @@ -349,7 +349,7 @@ public class CreateSliceService extends AbstractServiceTaskProcessor { String orchStatus = execution.getVariable("orchestrationStatus") try { - ServiceInstance si = execution.getVariable("serviceInstanceData") + ServiceInstance si = ServiceInstance si = new ServiceInstance() si.setOrchestrationStatus(orchStatus) AAIResourcesClient client = new AAIResourcesClient() AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId) diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSIandNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSIandNSSI.groovy index f58cd9a60d..cc2d865957 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSIandNSSI.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSIandNSSI.groovy @@ -1,31 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + package org.onap.so.bpmn.infrastructure.scripts -import com.google.common.reflect.TypeToken -import com.google.gson.Gson import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution -import org.onap.aai.domain.yang.AllottedResource import org.onap.aai.domain.yang.Relationship import org.onap.aai.domain.yang.RelationshipList import org.onap.aai.domain.yang.ServiceInstance import org.onap.so.beans.nsmf.SliceTaskParams import org.onap.so.bpmn.common.scripts.ExceptionUtil +import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils import org.onap.so.bpmn.core.domain.ServiceDecomposition import org.onap.so.bpmn.core.domain.ServiceProxy import org.onap.so.bpmn.core.json.JsonUtils import org.onap.aaiclient.client.aai.AAIObjectType import org.onap.aaiclient.client.aai.AAIResourcesClient -import org.onap.aaiclient.client.aai.entities.AAIEdgeLabel import org.onap.aaiclient.client.aai.entities.AAIResultWrapper import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory -import org.onap.so.db.request.client.RequestsDbClient -import org.onap.so.db.request.beans.OrchestrationTask import org.slf4j.Logger import org.slf4j.LoggerFactory import javax.ws.rs.NotFoundException -import javax.ws.rs.core.UriBuilder import static org.apache.commons.lang3.StringUtils.isBlank @@ -36,7 +50,8 @@ class DoAllocateNSIandNSSI extends org.onap.so.bpmn.common.scripts.AbstractServi ExceptionUtil exceptionUtil = new ExceptionUtil() JsonUtils jsonUtil = new JsonUtils() - RequestsDbClient requestsDbClient = new RequestsDbClient() + + private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil) /** * Pre Process the BPMN Flow Request @@ -65,8 +80,9 @@ class DoAllocateNSIandNSSI extends org.onap.so.bpmn.common.scripts.AbstractServi SliceTaskParams sliceParams = execution.getVariable("sliceTaskParams") try { - String modelUuid = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.nstar0_allottedresource0_providing_service_uuid") - String modelInvariantUuid = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.nstar0_allottedresource0_providing_service_invariant_uuid") + Map<String, Object> nstSolution = execution.getVariable("nstSolution") as Map + String modelUuid = nstSolution.get("UUID") + String modelInvariantUuid = nstSolution.get("invariantUUID") String serviceModelInfo = """{ "modelInvariantUuid":"${modelInvariantUuid}", "modelUuid":"${modelUuid}", @@ -105,7 +121,7 @@ class DoAllocateNSIandNSSI extends org.onap.so.bpmn.common.scripts.AbstractServi String nsiServiceInstanceID = sliceParams.getSuggestNsiId() AAIResourcesClient resourceClient = new AAIResourcesClient() - AAIResourceUri nsiServiceuri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("serviceType"), nsiServiceInstanceID) + AAIResourceUri nsiServiceuri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), nsiServiceInstanceID) //AAIResourceUri nsiServiceuri = AAIUriFactory.createResourceUri(AAIObjectType.QUERY_ALLOTTED_RESOURCE, execution.getVariable("globalSubscriberId"), execution.getVariable("serviceType"), nsiServiceInstanceID) try { @@ -156,7 +172,7 @@ class DoAllocateNSIandNSSI extends org.onap.so.bpmn.common.scripts.AbstractServi { try { AAIResourcesClient resourceClient = new AAIResourcesClient() - AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("serviceType"), nssiID) + AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), nssiID) AAIResultWrapper wrapper = resourceClient.get(serviceInstanceUri, NotFoundException.class) Optional<org.onap.aai.domain.yang.ServiceInstance> si = wrapper.asBean(org.onap.aai.domain.yang.ServiceInstance.class) org.onap.aai.domain.yang.ServiceInstance nssi = si.get() @@ -179,13 +195,13 @@ class DoAllocateNSIandNSSI extends org.onap.so.bpmn.common.scripts.AbstractServi } void createNSIinAAI(DelegateExecution execution) { - logger.trace("Enter CreateNSIinAAI in DoAllocateNSIandNSSI()") + logger.debug("Enter CreateNSIinAAI in DoAllocateNSIandNSSI()") ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition") org.onap.aai.domain.yang.ServiceInstance nsi = new ServiceInstance(); String sliceInstanceId = UUID.randomUUID().toString() execution.setVariable("sliceInstanceId",sliceInstanceId) nsi.setServiceInstanceId(sliceInstanceId) - String sliceInstanceName = "nsi_"+execution.getVariable("serviceInstanceName") + String sliceInstanceName = "nsi_"+execution.getVariable("sliceServiceInstanceName") nsi.setServiceInstanceName(sliceInstanceName) String serviceType = execution.getVariable("serviceType") nsi.setServiceType(serviceType) @@ -202,11 +218,20 @@ class DoAllocateNSIandNSSI extends org.onap.so.bpmn.common.scripts.AbstractServi //nsi.setEnvironmentContext(snssai) String serviceRole = "nsi" nsi.setServiceRole(serviceRole) + String msg = "" try { AAIResourcesClient client = new AAIResourcesClient() - AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), sliceInstanceId) - client.create(uri, nsi) + AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), sliceInstanceId) + client.create(nsiServiceUri, nsi) + + Relationship relationship = new Relationship() + logger.info("Creating Allotted resource relationship, nsiServiceUri: " + nsiServiceUri.build().toString()) + relationship.setRelatedLink(nsiServiceUri.build().toString()) + AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.ALLOTTED_RESOURCE, + execution.getVariable("globalSubscriberId"),execution.getVariable("subscriptionServiceType"), + execution.getVariable("sliceServiceInstanceId"), execution.getVariable("allottedResourceId")).relationshipAPI() + client.create(allottedResourceUri, relationship) } catch (BpmnError e) { throw e @@ -243,7 +268,7 @@ class DoAllocateNSIandNSSI extends org.onap.so.bpmn.common.scripts.AbstractServi execution.setVariable("maxIndex",maxIndex) execution.setVariable('nsiServiceInstanceId',sliceInstanceId) execution.setVariable("nsiServiceInstanceName",sliceInstanceName) - logger.trace("Exit CreateNSIinAAI in DoAllocateNSIandNSSI()") + logger.debug("Exit CreateNSIinAAI in DoAllocateNSIandNSSI()") } void getOneNsstInfo(DelegateExecution execution){ @@ -271,7 +296,7 @@ class DoAllocateNSIandNSSI extends org.onap.so.bpmn.common.scripts.AbstractServi String domain = jsonUtil.getJsonValue(content, "metadata.domainType") Map<String, Object> nssiMap = execution.getVariable("nssiMap") - String servicename = execution.getVariable("serviceInstanceName") + String servicename = execution.getVariable("sliceServiceInstanceName") String nsiname = "nsi_"+servicename nssiMap.put(domain,"""{ "serviceInstanceId":"", @@ -335,4 +360,4 @@ class DoAllocateNSIandNSSI extends org.onap.so.bpmn.common.scripts.AbstractServi } logger.trace("Exit updateCurrentIndex in DoAllocateNSIandNSSI()") } -} +}
\ No newline at end of file diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSSI.groovy index e2aa7972df..2d0034a34d 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSSI.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSSI.groovy @@ -4,7 +4,6 @@ import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution import org.onap.aai.domain.yang.ServiceInstance import org.onap.aai.domain.yang.SliceProfile -import org.onap.logging.filter.base.ONAPComponents import org.onap.so.beans.nsmf.AllocateAnNssi import org.onap.so.beans.nsmf.AllocateCnNssi import org.onap.so.beans.nsmf.AllocateTnNssi @@ -19,18 +18,15 @@ import org.onap.so.beans.nsmf.PerfReq import org.onap.so.beans.nsmf.PerfReqEmbbList import org.onap.so.beans.nsmf.PerfReqUrllcList import org.onap.so.beans.nsmf.ResourceSharingLevel -import org.onap.so.beans.nsmf.ServiceProfile import org.onap.so.beans.nsmf.SliceTaskParams import org.onap.so.beans.nsmf.TnSliceProfile import org.onap.so.beans.nsmf.UeMobilityLevel import org.onap.so.bpmn.common.scripts.ExceptionUtil +import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils import org.onap.so.bpmn.core.RollbackData -import org.onap.so.bpmn.core.UrnPropertiesReader import org.onap.so.bpmn.core.domain.ModelInfo import org.onap.so.bpmn.core.domain.ServiceDecomposition import org.onap.so.bpmn.core.json.JsonUtils -import org.onap.so.client.HttpClient -import org.onap.so.client.HttpClientFactory import org.onap.aaiclient.client.aai.AAIObjectType import org.onap.aaiclient.client.aai.AAIResourcesClient import org.onap.aaiclient.client.aai.entities.AAIEdgeLabel @@ -39,7 +35,6 @@ import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory import org.slf4j.Logger import org.slf4j.LoggerFactory import com.fasterxml.jackson.databind.ObjectMapper; -import javax.ws.rs.core.Response import static org.apache.commons.lang3.StringUtils.isBlank @@ -53,6 +48,8 @@ class DoAllocateNSSI extends org.onap.so.bpmn.common.scripts.AbstractServiceTask JsonUtils jsonUtil = new JsonUtils() + private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil) + /** * Pre Process the BPMN Flow Request * Inclouds: @@ -155,134 +152,78 @@ class DoAllocateNSSI extends org.onap.so.bpmn.common.scripts.AbstractServiceTask void sendUpdateRequestNSSMF(DelegateExecution execution) { - logger.trace("Enter sendUpdateRequestNSSMF in DoAllocateNSSI()") - String urlString = UrnPropertiesReader.getVariable("mso.adapters.nssmf.endpoint", execution) - logger.debug( "get NSSMF: " + urlString) - - //Prepare auth for NSSMF - Begin - def authHeader = "" - String basicAuth = UrnPropertiesReader.getVariable("mso.nssmf.auth", execution) + logger.debug("Enter sendUpdateRequestNSSMF in DoAllocateNSSI()") String domain = execution.getVariable("nsstDomain") String nssmfRequest = buildUpdateNSSMFRequest(execution, domain.toUpperCase()) - //send request to update NSSI option - Begin - URL url = new URL(urlString+"/api/rest/provMns/v1/NSS/SliceProfiles") - HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.EXTERNAL) - Response httpResponse = httpClient.post(nssmfRequest) - - int responseCode = httpResponse.getStatus() - logger.debug("NSSMF sync response code is: " + responseCode) - - if(responseCode < 199 && responseCode > 299){ - String nssmfResponse ="NSSMF response have nobody" - if(httpResponse.hasEntity()) - nssmfResponse = httpResponse.readEntity(String.class) - logger.trace("received error message from NSSMF : "+nssmfResponse) - logger.trace("Exit sendCreateRequestNSSMF in DoAllocateNSSI()") - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from NSSMF.") - } + String urlString = "/api/rest/provMns/v1/NSS/SliceProfiles" + + String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest) - if(httpResponse.hasEntity()){ - String nssmfResponse = httpResponse.readEntity(String.class) + if (nssmfResponse != null) { execution.setVariable("nssmfResponse", nssmfResponse) String nssiId = jsonUtil.getJsonValue(nssmfResponse, "nssiId") String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId") execution.setVariable("nssiId",nssiId) execution.setVariable("jobId",jobId) - }else{ - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from NSSMF.") + + } else { + logger.error("received error message from NSSMF : "+ nssmfResponse) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.") } logger.trace("Exit sendUpdateRequestNSSMF in DoAllocateNSSI()") } void sendCreateRequestNSSMF(DelegateExecution execution) { - logger.trace("Enter sendCreateRequestNSSMF in DoAllocateNSSI()") - String urlString = UrnPropertiesReader.getVariable("mso.adapters.nssmf.endpoint", execution) - logger.debug( "get NSSMF: " + urlString) - + logger.debug("Enter sendCreateRequestNSSMF in DoAllocateNSSI()") //Prepare auth for NSSMF - Begin String domain = execution.getVariable("nsstDomain") String nssmfRequest = buildCreateNSSMFRequest(execution, domain.toUpperCase()) - //send request to get NSI option - Begin - URL url = new URL(urlString+"/api/rest/provMns/v1/NSS/SliceProfiles") - HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.EXTERNAL) - Response httpResponse = httpClient.post(nssmfRequest) - - int responseCode = httpResponse.getStatus() - logger.debug("NSSMF sync response code is: " + responseCode) - - if(responseCode < 199 || responseCode > 299 ){ - String nssmfResponse ="NSSMF response have nobody" - if(httpResponse.hasEntity()) - nssmfResponse = httpResponse.readEntity(String.class) - logger.trace("received error message from NSSMF : "+nssmfResponse) - logger.trace("Exit sendCreateRequestNSSMF in DoAllocateNSSI()") - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from NSSMF.") - } + String urlString = "/api/rest/provMns/v1/NSS/SliceProfiles" + + String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest) - if(httpResponse.hasEntity()){ - String nssmfResponse = httpResponse.readEntity(String.class) + if (nssmfResponse != null) { execution.setVariable("nssmfResponse", nssmfResponse) String nssiId = jsonUtil.getJsonValue(nssmfResponse, "nssiId") String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId") execution.setVariable("nssiId",nssiId) execution.setVariable("jobId",jobId) - }else{ - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from NSSMF.") + + } else { + logger.error("received error message from NSSMF : "+ nssmfResponse) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.") } - logger.trace("Exit sendCreateRequestNSSMF in DoAllocateNSSI()") + logger.debug("Exit sendCreateRequestNSSMF in DoAllocateNSSI()") } void getNSSMFProgresss(DelegateExecution execution) { - logger.trace("Enter getNSSMFProgresss in DoAllocateNSSI()") - - String endpoint = UrnPropertiesReader.getVariable("mso.adapters.nssmf.endpoint", execution) - logger.debug( "get NSSMF: " + endpoint) - - //Prepare auth for NSSMF - Begin - def authHeader = "" - String basicAuth = UrnPropertiesReader.getVariable("mso.nssmf.auth", execution) + logger.debug("Enter getNSSMFProgresss in DoAllocateNSSI()") String nssmfRequest = buildNSSMFProgressRequest(execution) - String strUrl="/api/rest/provMns/v1/NSS/jobs/"+execution.getVariable("jobId") - //send request to update NSSI option - Begin - URL url = new URL(endpoint+strUrl) - HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.EXTERNAL) - Response httpResponse = httpClient.post(nssmfRequest) - - int responseCode = httpResponse.getStatus() - logger.debug("NSSMF sync response code is: " + responseCode) - - if(responseCode < 199 || responseCode > 299){ - String nssmfResponse ="NSSMF response have nobody" - if(httpResponse.hasEntity()) - nssmfResponse = httpResponse.readEntity(String.class) - logger.trace("received error message from NSSMF : "+nssmfResponse) - logger.trace("Exit sendCreateRequestNSSMF in DoAllocateNSSI()") - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from NSSMF.") - } + String strUrl="/api/rest/provMns/v1/NSS/jobs/" + execution.getVariable("jobId") + + String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, strUrl, nssmfRequest) - if(httpResponse.hasEntity()){ - String nssmfResponse = httpResponse.readEntity(String.class) + if(nssmfResponse != null){ Boolean isNSSICreated = false execution.setVariable("nssmfResponse", nssmfResponse) - Integer progress = java.lang.Integer.parseInt(jsonUtil.getJsonValue(nssmfResponse, "responseDescriptor.progress")) + Integer progress = Integer.parseInt(jsonUtil.getJsonValue(nssmfResponse, "responseDescriptor.progress")) String status = jsonUtil.getJsonValue(nssmfResponse, "responseDescriptor.status") String statusDescription = jsonUtil.getJsonValue(nssmfResponse, "responseDescriptor.statusDescription") execution.setVariable("nssmfProgress",progress) execution.setVariable("nssmfStatus",status) execution.setVariable("nddmfStatusDescription",statusDescription) - if(progress>99) + if(progress > 99) isNSSICreated = true execution.setVariable("isNSSICreated",isNSSICreated) - - }else{ - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from NSSMF.") + } else { + logger.error("received error message from NSSMF : "+ nssmfResponse) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.") } - logger.trace("Exit getNSSMFProgresss in DoAllocateNSSI()") - + logger.debug("Exit getNSSMFProgresss in DoAllocateNSSI()") } void updateRelationship(DelegateExecution execution) { diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOption.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOption.groovy index 8ab7c7a2d1..5741a78ed4 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOption.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOption.groovy @@ -1,13 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + # Copyright (c) 2019, CMCC Technologies Co., Ltd. + # + # Licensed under the Apache License, Version 2.0 (the "License") + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + * ============LICENSE_END========================================================= + */ + package org.onap.so.bpmn.infrastructure.scripts import com.fasterxml.jackson.core.type.TypeReference -import groovy.json.JsonBuilder +import com.fasterxml.jackson.databind.ObjectMapper import groovy.json.JsonSlurper -import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution -import org.onap.aai.domain.yang.Relationship -import org.onap.aai.domain.yang.RelationshipList -import org.onap.aai.domain.yang.ServiceInstance import org.onap.logging.filter.base.ONAPComponents import org.onap.so.beans.nsmf.SliceTaskParams import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor @@ -24,45 +40,27 @@ import org.onap.aaiclient.client.aai.AAIResourcesClient import org.onap.aaiclient.client.aai.entities.AAIResultWrapper import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory -import org.onap.so.db.request.client.RequestsDbClient -import org.onap.so.db.request.beans.OrchestrationTask import org.slf4j.Logger import org.slf4j.LoggerFactory + import javax.ws.rs.NotFoundException import javax.ws.rs.core.Response import static org.apache.commons.lang3.StringUtils.isBlank -public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ +class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ private static final Logger logger = LoggerFactory.getLogger( DoCreateSliceServiceOption.class) - ExceptionUtil exceptionUtil = new ExceptionUtil() JsonUtils jsonUtil = new JsonUtils() - RequestsDbClient requestsDbClient = new RequestsDbClient() - OofUtils oofUtils = new OofUtils() - /** - * Pre Process the BPMN Flow Request - * Inclouds: - * generate the nsOperationKey - * generate the nsParameters - */ - void preProcessRequest (DelegateExecution execution) { - String msg = "" - logger.trace("Enter preProcessRequest()") - String taskID = execution.getVariable("taskID") - Boolean isSharable = true - String resourceSharingLevel = execution.getVariable("resourceSharingLevel") - if (resourceSharingLevel.equals("shared")) - isSharable = true - execution.setVariable("isSharable",isSharable) - logger.trace("Exit preProcessRequest") + ObjectMapper objectMapper = new ObjectMapper() + void preProcessRequest (DelegateExecution execution) { } @@ -70,11 +68,10 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution) logger.debug( "get NSI option OOF Url: " + urlString) + boolean isNSISuggested = true execution.setVariable("isNSISuggested",isNSISuggested) - String nsiInstanceId = "" - String nsiName = "" - SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") + //Prepare auth for OOF - Begin def authHeader = "" String basicAuth = UrnPropertiesReader.getVariable("mso.oof.auth", execution) @@ -100,235 +97,234 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ String requestId = execution.getVariable("msoRequestId") Map<String, Object> profileInfo = execution.getVariable("serviceProfile") - String nstModelUuid = execution.getVariable("nstModelUuid") - String nstModelInvariantUuid = execution.getVariable("nstModelInvariantUuid") - String nstInfo = """"NSTInfo" : { - "invariantUUID":"${nstModelInvariantUuid}", - "UUID":"${nstModelUuid}" + Map<String, Object> nstSolution = execution.getVariable("nstSolution") + logger.debug("Get NST selection from OOF: " + nstSolution.toString()) + String nstInfo = """{ + "modelInvariantId":"${nstSolution.invariantUUID}", + "modelVersionId":"${nstSolution.UUID}", + "modelName":"${nstSolution.NSTName}" }""" - String oofRequest = oofUtils.buildSelectNSIRequest(execution, requestId, nstInfo, profileInfo) + String oofRequest = oofUtils.buildSelectNSIRequest(requestId, nstInfo, profileInfo) + logger.debug("Sending request to OOF: " + oofRequest) //send request to get NSI option - Begin - URL url = new URL(urlString+"/api/oof/v1/selectnsi") + URL url = new URL(urlString+"/api/oof/selection/nsi/v1") HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.OOF) httpClient.addAdditionalHeader("Authorization", authHeader) Response httpResponse = httpClient.post(oofRequest) + processOOFResponse(httpResponse, execution) + + //解析sliceProfile + logger.debug("start parseServiceProfile") + parseServiceProfile(execution) + logger.debug("end parseServiceProfile") + } + + private void processOOFResponse(Response httpResponse, DelegateExecution execution) { int responseCode = httpResponse.getStatus() logger.debug("OOF sync response code is: " + responseCode) - if(responseCode != 200){ + if (responseCode != 200) { exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from OOF.") - logger.debug("Info: No NSI suggested by OOF" ) + logger.debug("Info: No NSI suggested by OOF") } - if(httpResponse.hasEntity()){ + SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") + if (httpResponse.hasEntity()) { String OOFResponse = httpResponse.readEntity(String.class) + logger.debug("NSI OOFResponse is: " + OOFResponse) execution.setVariable("OOFResponse", OOFResponse) - int index = 0 //This needs to be changed to derive a value when we add policy to decide the solution options. + int index = 0 + //This needs to be changed to derive a value when we add policy to decide the solution options. Map OOFResponseObject = new JsonSlurper().parseText(OOFResponse) - if(execution.getVariable("isSharable" ) == true && OOFResponseObject.get("solutions").containsKey("sharedNSIsolutions")) { - nsiInstanceId = OOFResponseObject.get("solutions").get("sharedNSIsolutions").get(0).get("NSISolution").NSIId - nsiName = OOFResponseObject.get("solutions").get("sharedNSIsolutions").get(0).get("NSISolution").NSIName - sliceTaskParams.setNstId(nsiInstanceId) - sliceTaskParams.setSuggestNsiName(nsiName) - execution.setVariable("nsiInstanceId",nsiInstanceId) - execution.setVariable("nsiName",nsiName) - }else { - if(OOFResponseObject.get("solutions").containsKey("newNSISolutions")) { - List NSSImap = OOFResponseObject.get("solutions").get("newNSISolutions").get(index).get("NSSISolutions") - for(Map nssi : NSSImap) { - String nssiName = nssi.get("NSSISolution").NSSIName - String nssiId = nssi.get("NSSISolution").NSSIId - String domain = nssi.get("NSSISolution").domain.toUpperCase() - switch (domain) { - case "AN": - sliceTaskParams.setAnSuggestNssiId(nssiId) - sliceTaskParams.setAnSuggestNssiName(nssiName) - break; - case "CN": - sliceTaskParams.setCnSuggestNssiId(nssiId) - sliceTaskParams.setCnSuggestNssiName(nssiName) - break; - case "TN": - sliceTaskParams.setTnSuggestNssiId(nssiId) - sliceTaskParams.setTnSuggestNssiName(nssiName) - break; - default: - break; + Map solutions = OOFResponseObject.get("solutions") + + String resourceSharingLevel = execution.getVariable("resourceSharingLevel") + Boolean isSharable = resourceSharingLevel.equals("shared") + + if (solutions != null) { + if (isSharable) { + //sharedNSISolution + processSharedNSISolutions(solutions, execution) + } else { + //TODO test OOF + if (solutions.containsKey("newNSISolutions")) { + List<Map> newNSISolutions = solutions.get("newNSISolutions") + List<Map> NSSImap = new ArrayList<>() + if (newNSISolutions != null && newNSISolutions.size() > 0) { + NSSImap = newNSISolutions.get(index).get("NSSISolutions") as List<Map> + } + for (Map nssi : NSSImap) { + def nssiSolution = nssi.get("NSSISolution") as Map<String, ?> + String nssiName = nssiSolution.getOrDefault("NSSIName", "") + String nssiId = nssiSolution.getOrDefault("NSSIId", "") + String domain = nssiSolution.getOrDefault("domainName", "").toString().toUpperCase() + switch (domain) { + case "AN": + sliceTaskParams.setAnSuggestNssiId(nssiId) + sliceTaskParams.setAnSuggestNssiName(nssiName) + break + case "CN": + sliceTaskParams.setCnSuggestNssiId(nssiId) + sliceTaskParams.setCnSuggestNssiName(nssiName) + break + case "TN": + sliceTaskParams.setTnSuggestNssiId(nssiId) + sliceTaskParams.setTnSuggestNssiName(nssiName) + break + default: + break + } } + //TODO sliceProfile } } - } execution.setVariable("sliceTaskParams", sliceTaskParams) - logger.debug("Info: No NSI suggested by OOF" ) + logger.debug("sliceTaskParams: "+sliceTaskParams.convertToJson()) } - //send request to get NSI option - Begin - + logger.debug("*** Completed options Call to OOF ***") + } - //send request to get NSI service Info - Begin - - /*** - * Need to check whether its needed. - */ -// logger.debug("Begin to query OOF suggetsed NSI from AAI ") -// if(isBlank(nsiInstanceId)){ -// isNSISuggested = false -// execution.setVariable("isNSISuggested",isNSISuggested) -// }else -// { -// try { -// String globalSubscriberId = execution.getVariable('globalSubscriberId') -// String serviceType = execution.getVariable('subscriptionServiceType') -// AAIResourcesClient resourceClient = new AAIResourcesClient() -// AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, globalSubscriberId, serviceType, nsiInstanceId) -// AAIResultWrapper wrapper = resourceClient.get(serviceInstanceUri, NotFoundException.class) -// Optional<org.onap.aai.domain.yang.ServiceInstance> si = wrapper.asBean(org.onap.aai.domain.yang.ServiceInstance.class) -// org.onap.aai.domain.yang.ServiceInstance nsiServiceInstance = si.get() -// execution.setVariable("nsiServiceInstance",nsiServiceInstance) -// isNSISuggested = true -// execution.setVariable("isNSISuggested",isNSISuggested) -// SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") -// sliceTaskParams.setSuggestNsiId(nsiInstanceId) -// sliceTaskParams.setSuggestNsiName(si.get().getServiceInstanceName()) -// execution.setVariable("sliceTaskParams", sliceTaskParams) -// logger.debug("Info: NSI suggested by OOF exist in AAI ") -// }catch(BpmnError e) { -// throw e -// }catch(Exception ex) { -// String msg = "Internal Error in getServiceInstance: " + ex.getMessage() -// //exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) -// logger.debug("Info: NSI suggested by OOF doesnt exist in AAI " + nsiInstanceId) -// } -// } - //send request to get NSI service Info - End - //${OrchestrationTaskHandler.createOrchestrationTask(execution.getVariable("OrchestrationTask"))} - logger.debug( "*** Completed options Call to OOF ***") + private void processSharedNSISolutions(Map solutions, DelegateExecution execution) { + if (!solutions.containsKey("sharedNSISolutions")) + { + logger.error("OOF don't return sharedNSISolutions") + return + } + String nsiName, nsiInstanceId, nssiId, nssiName + Map sliceProfile + SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") + Map sharedNSIsolution = ((List) solutions.get("sharedNSISolutions")).get(0) + nsiInstanceId = sharedNSIsolution.getOrDefault("NSIId", "") + nsiName = sharedNSIsolution.getOrDefault("NSIName", "") + sliceTaskParams.setSuggestNsiId(nsiInstanceId) + sliceTaskParams.setSuggestNsiName(nsiName) + + //Temporary modification + List NSSIs = sharedNSIsolution.get("NSSIs") + if(NSSIs.size()==1){ + Map nssi = NSSIs.get(0) + nssiId = nssi.getOrDefault("NSSIId","") + nssiName = nssi.getOrDefault("NSSIName","") + sliceTaskParams.setCnSuggestNssiId(nssiId) + //TODO Need update after OOF return camel key and domainType + sliceProfile = ((List)nssi.get("sliceProfile"))?.get(0) + sliceTaskParams.setCnSuggestNssiName(nssiName) +// execution.setVariable("sliceProfileCn", sliceProfile) +// sliceTaskParams.setSliceProfileCn(sliceProfile) + } + logger.debug("OOF sharedNSISolution nsiInstanceId:${nsiInstanceId}, nsiName:${nsiName}, nssiId:${nssiId}, nssiName:${nssiName}") + logger.debug("OOF SliceProfile:"+sliceProfile.toString()) } - - public void parseServiceProfile(DelegateExecution execution) { + void parseServiceProfile(DelegateExecution execution) { logger.debug("Start parseServiceProfile") String serviceType = execution.getVariable("serviceType") Map<String, Object> serviceProfile = execution.getVariable("serviceProfile") - + SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") // set sliceProfile for three domains - Map<String, Object> sliceProfileTn = getSliceProfile(serviceType, "TN", serviceProfile) - Map<String, Object> sliceProfileCn = getSliceProfile(serviceType, "CN", serviceProfile) - Map<String, Object> sliceProfileAn = getSliceProfile(serviceType, "AN", serviceProfile) + if(!sliceTaskParams.getSliceProfileAn()){ + Map<String, Object> sliceProfileAn = getSliceProfile(serviceType, "AN", serviceProfile) + execution.setVariable("sliceProfileAn", sliceProfileAn) + sliceTaskParams.setSliceProfileAn(sliceProfileAn) + logger.debug("sliceProfileAn: " + sliceProfileAn) + } - execution.setVariable("sliceProfileTn", sliceProfileTn) - execution.setVariable("sliceProfileCn", sliceProfileCn) - execution.setVariable("sliceProfileAn", sliceProfileAn) - logger.debug("sliceProfileTn: " + sliceProfileTn) - logger.debug("sliceProfileCn: " + sliceProfileCn) - logger.debug("sliceProfileAn: " + sliceProfileAn) + if(!sliceTaskParams.getSliceProfileTn()){ + Map<String, Object> sliceProfileTn = getSliceProfile(serviceType, "TN", serviceProfile) + execution.setVariable("sliceProfileTn", sliceProfileTn) + sliceTaskParams.setSliceProfileTn(sliceProfileTn) + logger.debug("sliceProfileTn: " + sliceProfileTn) + } + + if(!sliceTaskParams.getSliceProfileCn()){ + Map<String, Object> sliceProfileCn = getSliceProfile(serviceType, "CN", serviceProfile) + execution.setVariable("sliceProfileCn", sliceProfileCn) + sliceTaskParams.setSliceProfileCn(sliceProfileCn) + logger.debug("sliceProfileCn: " + sliceProfileCn) + } logger.debug("Finish parseServiceProfile") } - public Map getSliceProfile(String serviceType, String domain, Map<String, Object> serviceProfile) { - String variablePath = "nsmf." + serviceType + ".profileMap" + domain - String profileMapStr = UrnPropertiesReader.getVariable(variablePath) - logger.debug("Profile map for " + domain + " : " + profileMapStr) - Map<String, String> profileMaps = objectMapper.readValue(profileMapStr, new TypeReference<Map<String, String>>(){}) - Map<String, Object> sliceProfileTn = [:] + Map getSliceProfile(String serviceType, String domain, Map<String, Object> serviceProfile) { + String profileMapStr + Integer domainLatency = (Integer) serviceProfile.get("latency")/3 + + switch (domain) { + case "AN": + profileMapStr = """ { + "latency": ${domainLatency}, + "sNSSAI": "sNSSAI", + "uEMobilityLevel": "uEMobilityLevel", + "coverageAreaTAList": "coverageAreaTAList", + "5QI": 100 + } + """.trim().replaceAll(" ", "") + break + case "TN": + profileMapStr =""" { + "latency":${domainLatency}, + "sNSSAI":"sNSSAI", + "e2eLatency":"latency", + "bandwidth": 100 + } + """.trim().replaceAll(" ", "") + break + case "CN": + profileMapStr = """ { + "areaTrafficCapDL":"areaTrafficCapDL", + "maxNumberofUEs":"maxNumberofUEs", + "latency":${domainLatency}, + "expDataRateUL":"expDataRateUL", + "sNSSAI":"sNSSAI", + "areaTrafficCapUL":"areaTrafficCapUL", + "uEMobilityLevel":"uEMobilityLevel", + "expDataRateDL":"expDataRateDL", + "activityFactor":"activityFactor", + "resourceSharingLevel":"resourceSharingLevel" + } + """.trim().replaceAll(" ", "") + break + default: + break + } + + logger.debug("Profile map for " + domain + " : " + profileMapStr) + Map<String, Object> profileMaps = objectMapper.readValue(profileMapStr, new TypeReference<Map<String, String>>(){}) + Map<String, Object> sliceProfile = [:] for (Map.Entry<String, String> profileMap : profileMaps) { - sliceProfileTn.put(profileMap.key, serviceProfile.get(profileMap.value)) + String key = profileMap.key + String value = profileMaps.get(key) + if(serviceProfile.keySet().contains(value)){ + sliceProfile.put(key, serviceProfile.get(value)) + } + else{ + sliceProfile.put(key, profileMaps.get(key)) + } } - return sliceProfileTn + return sliceProfile } + void processDecomposition(DelegateExecution execution){ + logger.debug("Start processDecomposition") - void prepareNSSIList(DelegateExecution execution) - { ServiceDecomposition serviceDecomposition= execution.getVariable("serviceDecomposition") - List<String> nssiAssociated = new ArrayList<>() - Map<String, String> nssimap = new HashMap<>() - String nsiInstanceId=execution.getVariable("nsiInstanceId") - String globalSubscriberId = execution.getVariable("globalSubscriberId") - String serviceType = execution.getVariable("subscriptionServiceType") - - try { - - ServiceInstance si = execution.getVariable("nsiServiceInstance") - //List<Relationship> relationships = si.getRelationshipList().getRelationship().stream().filter(relation -> - // relation.getRelatedTo().equalsIgnoreCase("service-instance")) - RelationshipList relationshipList = si.getRelationshipList() - List<Relationship> relationships = relationshipList.getRelationship() - for(Relationship relationship in relationships) - { - if(relationship.getRelatedTo().equalsIgnoreCase("service-instance")) - { - String NSSIassociated = relationship.getRelatedLink().substring(relationship.getRelatedLink().lastIndexOf("/") + 1); - if(!NSSIassociated.equals(nsiInstanceId)) - nssiAssociated.add(NSSIassociated) - } - } - }catch(BpmnError e) { - throw e - }catch(Exception ex) { - String msg = "Internal Error in getServiceInstance: " + ex.getMessage() - exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) - } - Map<String, Object> params = execution.getVariable("params") SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") - for(String nssiID in nssiAssociated) - { - try { - AAIResourcesClient resourceClient = new AAIResourcesClient() - AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, globalSubscriberId, serviceType, nssiID) - AAIResultWrapper wrapper = resourceClient.get(serviceInstanceUri, NotFoundException.class) - Optional<org.onap.aai.domain.yang.ServiceInstance> si = wrapper.asBean(org.onap.aai.domain.yang.ServiceInstance.class) - org.onap.aai.domain.yang.ServiceInstance nssi = si.get() - - String domain = nssi.getEnvironmentContext().toString().toUpperCase() - switch (domain) { - case "AN": - sliceTaskParams.setAnSuggestNssiId(nssi.getServiceInstanceId()) - sliceTaskParams.setAnSuggestNssiName(nssi.getServiceInstanceName()) - break; - case "CN": - sliceTaskParams.setCnSuggestNssiId(nssi.getServiceInstanceId()) - sliceTaskParams.setCnSuggestNssiName(nssi.getServiceInstanceName()) - break; - case "TN": - sliceTaskParams.setTnSuggestNssiId(nssi.getServiceInstanceId()) - sliceTaskParams.setTnSuggestNssiName(nssi.getServiceInstanceName()) - break; - default: - break; - } - }catch(NotFoundException e) - { - logger.debug("NSSI Service Instance not found in AAI: " + nssiID) - }catch(Exception e) - { - logger.debug("NSSI Service Instance not found in AAI: " + nssiID) - } - - } String nstName = serviceDecomposition.getModelInfo().getModelName() - sliceTaskParams.setNstName(nstName) String nstId = serviceDecomposition.getModelInfo().getModelUuid() + sliceTaskParams.setNstName(nstName) sliceTaskParams.setNstId(nstId) - execution.setVariable("sliceTaskParams",sliceTaskParams) + logger.debug("End processDecomposition") } - void updateOptionsInDB(DelegateExecution execution) { - logger.debug("Updating options with default value since not sharable : Begin ") - String taskID = execution.getVariable("taskID") - String params = execution.getVariable("params") - logger.debug("Updating options with default value since not sharable : End ") - - } - void prepareNSTDecompose(DelegateExecution execution) { String modelUuid = execution.getVariable("nstModelUuid") @@ -364,14 +360,6 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ } - void updateStatusInDB(DelegateExecution execution) { - - String taskID = execution.getVariable("taskID") - //OrchestrationTask orchestrationTask = requestsDbClient.getNetworkSliceOption(taskID); - //orchestrationTask.setTaskStage("wait to confirm") - //requestsDbClient.updateNetworkSliceOption(orchestrationTask) - } - void prepareNSSTlistfromNST(DelegateExecution execution) { //Need to update this part from decomposition. logger.trace("Enter prepareNSSTlistfromNST()") @@ -400,7 +388,6 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ } - void getNSSTOption(DelegateExecution execution) { ServiceDecomposition serviceDecomposition= execution.getVariable("serviceDecomposition") String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution) @@ -483,17 +470,17 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ case "AN": sliceTaskParams.setAnSuggestNssiId(nssi.getServiceInstanceId()) sliceTaskParams.setAnSuggestNssiName(nssi.getServiceInstanceName()) - break; + break case "CN": sliceTaskParams.setCnSuggestNssiId(nssi.getServiceInstanceId()) sliceTaskParams.setCnSuggestNssiName(nssi.getServiceInstanceName()) - break; + break case "TN": sliceTaskParams.setTnSuggestNssiId(nssi.getServiceInstanceId()) sliceTaskParams.setTnSuggestNssiName(nssi.getServiceInstanceName()) - break; + break default: - break; + break } }catch(NotFoundException e) { @@ -503,22 +490,6 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ logger.debug("NSSI Service Instance not found in AAI: " + nssiInstanceId) } } - - - //Prepare send request to OOF - End - -// String content = serviceDecomposition.getServiceInfo().getServiceArtifact().get(0).getContent() -// String nsstID = jsonUtil.getJsonValue(content, "metadata.id") -// String vendor = jsonUtil.getJsonValue(content, "metadata.vendor") -// String domain = jsonUtil.getJsonValue(content, "metadata.domainType") -// String type = jsonUtil.getJsonValue(content, "metadata.type") -// String nsstContentInfo = """{ -// "NsstID":"${nsstID}", -// "Vendor":"${vendor}", -// "type":"${type}" -// }""" - logger.debug("Prepare NSSI option completed ") } } - diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateNSSI.groovy index e6f6af5ab7..4be6ca7e49 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateNSSI.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateNSSI.groovy @@ -31,15 +31,14 @@ import org.onap.so.beans.nsmf.NssiDeAllocateRequest import org.onap.so.beans.nsmf.NssiResponse import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor import org.onap.so.bpmn.common.scripts.ExceptionUtil +import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils import org.onap.so.bpmn.common.scripts.RequestDBUtil import org.onap.so.bpmn.core.UrnPropertiesReader import org.onap.so.bpmn.core.domain.ServiceArtifact import org.onap.so.bpmn.core.domain.ServiceDecomposition import org.onap.so.bpmn.core.json.JsonUtils import org.onap.so.client.HttpClient -import org.onap.so.client.HttpClientFactory import org.onap.aaiclient.client.aai.AAIObjectType -import org.onap.aaiclient.client.aai.AAIResourcesClient import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory import org.onap.so.db.request.beans.OperationStatus @@ -56,6 +55,8 @@ class DoDeallocateNSSI extends AbstractServiceTaskProcessor private ExceptionUtil exceptionUtil = new ExceptionUtil() private JsonUtils jsonUtil = new JsonUtils() private RequestDBUtil requestDBUtil = new RequestDBUtil() + private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil) + private static final Logger LOGGER = LoggerFactory.getLogger( DoDeallocateNSSI.class) @Override @@ -103,7 +104,7 @@ class DoDeallocateNSSI extends AbstractServiceTaskProcessor * get vendor Info * @param execution */ - void processDecomposition(DelegateExecution execution) { + void processDecomposition(DelegateExecution execution) { LOGGER.debug("*****${PREFIX} start processDecomposition *****") try { @@ -150,26 +151,21 @@ class DoDeallocateNSSI extends AbstractServiceTaskProcessor deAllocateRequest.setEsrInfo(getEsrInfo(currentNSSI)) ObjectMapper mapper = new ObjectMapper() - String json = mapper.writeValueAsString(deAllocateRequest) - - //Prepare auth for NSSMF - Begin - String nssmfRequest = UrnPropertiesReader.getVariable("mso.adapters.nssmf.endpoint", execution) - nssmfRequest = nssmfRequest + String.format("/api/rest/provMns/v1/NSS/SliceProfiles/%s",profileId) - //nssmfRequest = nssmfRequest + String.format(NssmfAdapterUtil.NSSMI_DEALLOCATE_URL,profileId) - //send request to active NSSI TN option - URL url = new URL(nssmfRequest) - LOGGER.info("deallocate nssmfRequest:${nssmfRequest}, reqBody: ${json}") - - HttpClient httpClient = getHttpClientFactory().newJsonClient(url, ONAPComponents.EXTERNAL) - Response httpResponse = httpClient.post(json) - checkNssmfResponse(httpResponse, execution) - - NssiResponse nssmfResponse = httpResponse.readEntity(NssiResponse.class) - currentNSSI['jobId']= nssmfResponse.getJobId() ?: "" - currentNSSI['jobProgress'] = 0 - execution.setVariable("currentNSSI", currentNSSI) - - LOGGER.debug("*****${PREFIX} Exit sendRequestToNSSMF *****") + String nssmfRequest = mapper.writeValueAsString(deAllocateRequest) + + String urlStr = String.format("/api/rest/provMns/v1/NSS/SliceProfiles/%s",profileId) + + NssiResponse nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlStr, nssmfRequest, NssiResponse.class) + if (nssmfResponse != null) { + currentNSSI['jobId']= nssmfResponse.getJobId() ?: "" + currentNSSI['jobProgress'] = 0 + execution.setVariable("currentNSSI", currentNSSI) + + LOGGER.debug("*****${PREFIX} Exit sendRequestToNSSMF *****") + } else { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a Bad Response from NSSMF.") + } + } /** @@ -189,48 +185,36 @@ class DoDeallocateNSSI extends AbstractServiceTaskProcessor jobStatusRequest.setEsrInfo(getEsrInfo(currentNSSI)) ObjectMapper mapper = new ObjectMapper() - String json = mapper.writeValueAsString(jobStatusRequest) - - //Prepare auth for NSSMF - Begin - String nssmfRequest = UrnPropertiesReader.getVariable("mso.adapters.nssmf.endpoint", execution) - nssmfRequest = nssmfRequest + String.format("/api/rest/provMns/v1/NSS/jobs/%s",jobId) - //send request to active NSSI TN option - URL url = new URL(nssmfRequest) - LOGGER.info("get deallocate job status, nssmfRequest:${nssmfRequest}, requestBody: ${json}") - - HttpClient httpClient = getHttpClientFactory().newJsonClient(url, ONAPComponents.EXTERNAL) - Response httpResponse = httpClient.post(json) - checkNssmfResponse(httpResponse, execution) - - JobStatusResponse jobStatusResponse = httpResponse.readEntity(JobStatusResponse.class) - def progress = jobStatusResponse?.getResponseDescriptor()?.getProgress() - if(!progress) - { - LOGGER.error("job progress is null or empty!") - exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a Bad Job progress from NSSMF.") - } - int oldProgress = currentNSSI['jobProgress'] - int currentProgress = progress + String nssmfRequest = mapper.writeValueAsString(jobStatusRequest) - execution.setVariable("isNSSIDeAllocated", (currentProgress == 100)) - execution.setVariable("isNeedUpdateDB", (oldProgress != currentProgress)) - currentNSSI['jobProgress'] = currentProgress + String urlStr = String.format("/api/rest/provMns/v1/NSS/jobs/%s", jobId) - def statusDescription = jobStatusResponse?.getResponseDescriptor()?.getStatusDescription() - currentNSSI['statusDescription'] = statusDescription + JobStatusResponse jobStatusResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlStr, nssmfRequest, JobStatusResponse.class) - LOGGER.debug("job status result: nsiId = ${nsiId}, nssiId=${nssiId}, oldProgress=${oldProgress}, progress = ${currentProgress}" ) - } + if (jobStatusResponse != null) { + def progress = jobStatusResponse?.getResponseDescriptor()?.getProgress() + if(!progress) + { + LOGGER.error("job progress is null or empty!") + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a Bad Job progress from NSSMF.") + } + int oldProgress = currentNSSI['jobProgress'] + int currentProgress = progress + + execution.setVariable("isNSSIDeAllocated", (currentProgress == 100)) + execution.setVariable("isNeedUpdateDB", (oldProgress != currentProgress)) + currentNSSI['jobProgress'] = currentProgress - private void checkNssmfResponse(Response httpResponse, DelegateExecution execution) { - int responseCode = httpResponse.getStatus() - LOGGER.debug("NSSMF response code is: " + responseCode) + def statusDescription = jobStatusResponse?.getResponseDescriptor()?.getStatusDescription() + currentNSSI['statusDescription'] = statusDescription - if ( responseCode < 200 || responseCode > 204 || !httpResponse.hasEntity()) { - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Response from NSSMF.") + LOGGER.debug("job status result: nsiId = ${nsiId}, nssiId=${nssiId}, oldProgress=${oldProgress}, progress = ${currentProgress}" ) + + } else { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a Bad Response from NSSMF.") } - } + } private EsrInfo getEsrInfo(def currentNSSI) { @@ -305,4 +289,4 @@ class DoDeallocateNSSI extends AbstractServiceTaskProcessor } LOGGER.debug("*****${PREFIX} Exist delSliceProfileFromAAI *****") } -} +}
\ No newline at end of file diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoSendCommandToNSSMF.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoSendCommandToNSSMF.groovy index 5acc016c7b..a85f5d8ab3 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoSendCommandToNSSMF.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoSendCommandToNSSMF.groovy @@ -25,17 +25,13 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution -import org.onap.logging.filter.base.ONAPComponents import org.onap.so.beans.nsmf.* import org.onap.so.bpmn.common.scripts.* -import org.onap.so.bpmn.common.util.OofInfraUtils import org.onap.so.bpmn.core.UrnPropertiesReader import org.onap.so.bpmn.core.WorkflowException import org.onap.so.bpmn.core.domain.ServiceArtifact import org.onap.so.bpmn.core.domain.ServiceDecomposition import org.onap.so.bpmn.core.json.JsonUtils -import org.onap.so.client.HttpClient -import org.onap.so.client.HttpClientFactory import org.onap.logging.filter.base.ErrorCode import org.onap.so.logger.LoggingAnchor import org.onap.so.logger.MessageEnum @@ -43,7 +39,6 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.web.util.UriUtils -import javax.ws.rs.core.Response import java.lang.reflect.Type /** @@ -60,7 +55,8 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { JsonUtils jsonUtil = new JsonUtils() VidUtils vidUtils = new VidUtils(this) SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils() - OofInfraUtils oofInfraUtils = new OofInfraUtils() + + private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil) /** * This method gets and validates the incoming @@ -99,7 +95,7 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { execution.setVariable("msoRequestId", requestId) String operationType = execution.getVariable("operationType") - execution.setVariable("operationType", operationType) + execution.setVariable("operationType", operationType.toLowerCase()) logger.debug("Incoming operationType is: " + operationType) if (operationType == "activation") { @@ -123,6 +119,7 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { } logger.trace("COMPLETED DoSendCommandToNSSMF PreProcessRequest Process") } + private String mapToJsonStr(Map<String, NSSI> stringNSSIHashMap) { HashMap<String, NSSI> map = new HashMap<String, NSSI>() for(Map.Entry<String, NSSI> child:stringNSSIHashMap.entrySet()) @@ -131,6 +128,7 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { } return new Gson().toJson(map) } + public void getNSSIformlist(DelegateExecution execution) { String nssiMap = execution.getVariable("DonssiMap") @@ -179,6 +177,7 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { execution.setVariable("activationIndex", indexcurrent)} } + /** * get vendor Info * @param execution @@ -204,6 +203,7 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { } logger.debug("***** Exit processDecomposition *****") } + public void UpdateIndex(DelegateExecution execution) { def activationIndex = execution.getVariable("activationIndex") int activateNumberSlice = execution.getVariable("activateNumberSlice") as Integer @@ -225,7 +225,7 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { String operationId = UUID.randomUUID().toString() String operationType = execution.getVariable("operationType") String userId = "" - String result = (operationType.equals("activation"))? "ACTIVATING": "DEACTIVATING" + String result = (operationType.equalsIgnoreCase("activation"))? "ACTIVATING": "DEACTIVATING" int progress = rate String reason = "" String operationContent = "Service activation in progress" @@ -269,24 +269,25 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { } logger.trace("finished Activate Slice") } + public void WaitForReturn(DelegateExecution execution) { //logger.debug("Query : "+ Jobid) - def miniute=execution.getVariable("miniute") + String miniute = execution.getVariable("miniute") Thread.sleep(10000) int miniute01 = Integer.parseInt(miniute) + 1 logger.debug("waiting for : "+ miniute + "miniutes") execution.setVariable("miniute", String.valueOf(miniute01)) } + public void GetTheStatusOfActivation(DelegateExecution execution) { - String snssai= execution.getVariable("snssai") String domaintype = execution.getVariable("domainType") String NSIserviceid=execution.getVariable("NSIserviceid") String nssiId = execution.getVariable("nssiId") String Jobid=execution.getVariable("JobId") - def miniute=execution.getVariable("miniute") + String miniute=execution.getVariable("miniute") String vendor = execution.getVariable("vendor") - String jobstatus ="error" + String jobstatus logger.debug("Query the jobid activation of SNSSAI: "+ Jobid) @@ -306,66 +307,46 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { ObjectMapper mapper = new ObjectMapper() - String Reqjson = mapper.writeValueAsString(jobStatusRequest) - String isActivateSuccessfull=false - - String urlString = UrnPropertiesReader.getVariable("mso.adapters.nssmf.endpoint", execution) - String nssmfRequest = urlString + "/api/rest/provMns/v1/NSS/jobs/" +Jobid - - //send request to active NSSI TN option - URL url = new URL(nssmfRequest) - - HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.EXTERNAL) - Response httpResponse = httpClient.post(Reqjson) - - int responseCode = httpResponse.getStatus() - logger.debug("NSSMF activation response code is: " + responseCode) - - if (responseCode == 404) { - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad job status Response from NSSMF.") - isActivateSuccessfull = false - execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) - jobstatus="error" - }else if(responseCode == 200) { - if (httpResponse.hasEntity()) { - JobStatusResponse jobStatusResponse = httpResponse.readEntity(JobStatusResponse.class) - execution.setVariable("statusDescription", jobStatusResponse.getResponseDescriptor().getStatusDescription()) - jobstatus = jobStatusResponse.getResponseDescriptor().getStatus() - switch(jobstatus) { - case "started": - case "processing": - isActivateSuccessfull = "waitting" - execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) - break - case "finished": - isActivateSuccessfull = "true" - execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) - execution.setVariable("activateNumberSlice",execution.getVariable("activateNumberSlice")+ 1) - break - case "error": - default: - isActivateSuccessfull = "false" - execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) - - } - if(Integer.parseInt(miniute) > 6 ) - { - isActivateSuccessfull = "false" - execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a timeout job status Response from NSSMF.") - } - }else - { - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad job status Response from NSSMF.") - isActivateSuccessfull = false - execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) - } - } else { - isActivateSuccessfull = false - execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad job status Response from NSSMF.") - } + String nssmfRequest = mapper.writeValueAsString(jobStatusRequest) + String isActivateSuccessfull + + String urlString = "/api/rest/provMns/v1/NSS/jobs/" +Jobid + + JobStatusResponse jobStatusResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest, JobStatusResponse.class) + + if (jobStatusResponse != null) { + execution.setVariable("statusDescription", jobStatusResponse.getResponseDescriptor().getStatusDescription()) + jobstatus = jobStatusResponse.getResponseDescriptor().getStatus() + switch(jobstatus) { + case "started": + case "processing": + isActivateSuccessfull = "waitting" + execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) + break + case "finished": + isActivateSuccessfull = "true" + execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) + execution.setVariable("activateNumberSlice",execution.getVariable("activateNumberSlice")+ 1) + break + case "error": + default: + isActivateSuccessfull = "false" + execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) + + } + if(Integer.parseInt(miniute) > 6 ) + { + isActivateSuccessfull = "false" + execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a timeout job status Response from NSSMF.") + } + } else { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a Bad job status Response from NSSMF.") + isActivateSuccessfull = false + execution.setVariable("isActivateSuccessfull", isActivateSuccessfull) + } } + public void SendCommandToNssmf(DelegateExecution execution) { String snssai= execution.getVariable("snssai") @@ -391,49 +372,28 @@ class DoSendCommandToNSSMF extends AbstractServiceTaskProcessor { actRequest.setActDeActNssi(actNssi); actRequest.setEsrInfo(esr) - ObjectMapper mapper = new ObjectMapper(); - String json = mapper.writeValueAsString(actRequest); - - - String urlString = UrnPropertiesReader.getVariable("mso.adapters.nssmf.endpoint", execution) + ObjectMapper mapper = new ObjectMapper() + String nssmfRequest = mapper.writeValueAsString(actRequest) - //Prepare auth for NSSMF - Begin - def authHeader = "" - String basicAuth = UrnPropertiesReader.getVariable("mso.nssmf.auth", execution) String operationType = execution.getVariable("operationType") - String nssmfRequest = urlString + "/api/rest/provMns/v1/NSS/" + snssai + "/" + operationType - - //send request to active NSSI TN option - URL url = new URL(nssmfRequest) + String urlString = "/api/rest/provMns/v1/NSS/" + snssai + "/" + operationType.toLowerCase() - HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.EXTERNAL) - Response httpResponse = httpClient.post(json) + NssiResponse nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest, NssiResponse.class) - int responseCode = httpResponse.getStatus() - logger.debug("NSSMF activate response code is: " + responseCode) - checkNssmfResponse(httpResponse, execution) - - NssiResponse nssmfResponse = httpResponse.readEntity(NssiResponse.class) - String jobId = nssmfResponse.getJobId() ?: "" - execution.setVariable("JobId", jobId) + if (nssmfResponse != null) { + String isNSSIActivated = "true" + execution.setVariable("isNSSIActivated", isNSSIActivated) + String jobId = nssmfResponse.getJobId() ?: "" + execution.setVariable("JobId", jobId) + } else { + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a Bad Response from NSSMF.") + String isNSSIActivated = "false" + execution.setVariable("isNSSIActivated", isNSSIActivated) + execution.setVariable("isNSSIActivate","false") + } } - private void checkNssmfResponse(Response httpResponse, DelegateExecution execution) { - int responseCode = httpResponse.getStatus() - logger.debug("NSSMF response code is: " + responseCode) - - if ( responseCode < 200 || responseCode > 202 || !httpResponse.hasEntity()) { - exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Response from NSSMF.") - String isNSSIActivated = "false" - execution.setVariable("isNSSIActivated", isNSSIActivated) - execution.setVariable("isNSSIActivate","false") - }else{ - String isNSSIActivated = "true" - execution.setVariable("isNSSIActivated", isNSSIActivated) - } - } - void sendSyncError (DelegateExecution execution) { logger.trace("start sendSyncError") diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/HandleOrchestrationTask.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/HandleOrchestrationTask.groovy index 89490ff620..0f15717b3c 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/HandleOrchestrationTask.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/HandleOrchestrationTask.groovy @@ -103,6 +103,7 @@ class HandleOrchestrationTask extends AbstractServiceTaskProcessor { task.setName(taskName) task.setStatus(taskStatus) task.setIsManual(isManual) + task.setCreatedTime(new Date()) task.setParams(paramJson) ObjectMapper objectMapper = new ObjectMapper() payload = objectMapper.writeValueAsString(task) diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn index 013e1b62c2..f27794a389 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/CreateSliceService.bpmn @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1wio50w" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.1.2"> - <bpmn:process id="Process_0r5eb97" isExecutable="true"> +<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1wio50w" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.4.1"> + <bpmn:process id="CreateSliceService" name="CreateSliceService" isExecutable="true"> <bpmn:startEvent id="StartEvent_1nbljfd" name="Create Slice Service Creation Flow"> <bpmn:outgoing>SequenceFlow_03s744c</bpmn:outgoing> </bpmn:startEvent> @@ -369,6 +369,7 @@ css.sendSyncResponse(execution)</bpmn:script> <camunda:out source="rollbackData" target="rollbackData" /> <camunda:out source="rolledBack" target="rolledBack" /> <camunda:in source="allottedResourceId" target="allottedResourceId" /> + <camunda:in source="nstSolution" target="nstSolution" /> </bpmn:extensionElements> <bpmn:incoming>SequenceFlow_1bevt3a</bpmn:incoming> <bpmn:outgoing>SequenceFlow_0mlrlbv</bpmn:outgoing> @@ -435,6 +436,10 @@ css.sendSyncResponse(execution)</bpmn:script> <camunda:in source="globalSubscriberId" target="globalSubscriberId" /> <camunda:in source="subscriptionServiceType" target="subscriptionServiceType" /> <camunda:in source="serviceType" target="serviceType" /> + <camunda:in source="nstSolution" target="nstSolution" /> + <camunda:out source="sliceProfileTn" target="sliceProfileTn" /> + <camunda:out source="sliceProfileCn" target="sliceProfileCn" /> + <camunda:out source="sliceProfileAn" target="sliceProfileAn" /> </bpmn:extensionElements> <bpmn:incoming>SequenceFlow_1ey6m1e</bpmn:incoming> <bpmn:outgoing>SequenceFlow_1aaozcg</bpmn:outgoing> @@ -457,7 +462,7 @@ css.updateAAIOrchStatus(execution)</bpmn:script> <bpmn:error id="Error_03akl5v" name="MSOWorkflowException" errorCode="MSOWorkflowException" /> <bpmn:error id="Error_0p2naox" name="MSOWorkflowException" errorCode="MSOWorkflowException" /> <bpmndi:BPMNDiagram id="BPMNDiagram_1"> - <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_0r5eb97"> + <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="CreateSliceService"> <bpmndi:BPMNShape id="StartEvent_1nbljfd_di" bpmnElement="StartEvent_1nbljfd"> <dc:Bounds x="178" y="103" width="36" height="36" /> <bpmndi:BPMNLabel> @@ -802,4 +807,3 @@ css.updateAAIOrchStatus(execution)</bpmn:script> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </bpmn:definitions> - diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeleteSliceService.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeleteSliceService.bpmn index 6d9df5240d..3024e39c4e 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeleteSliceService.bpmn +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/DeleteSliceService.bpmn @@ -143,14 +143,15 @@ dss.prepareEndOperationStatus(execution)</bpmn:script> <bpmn:extensionElements> <camunda:connector> <camunda:inputOutput> - <camunda:inputParameter name="url">${CVFMI_dbAdapterEndpoint}</camunda:inputParameter> + <camunda:inputParameter name="url">${dbAdapterEndpoint}</camunda:inputParameter> <camunda:inputParameter name="headers"> <camunda:map> <camunda:entry key="content-type">application/soap+xml</camunda:entry> <camunda:entry key="Authorization">Basic YnBlbDpwYXNzd29yZDEk</camunda:entry> </camunda:map> </camunda:inputParameter> - <camunda:inputParameter name="payload">${CVFMI_updateServiceOperStatusRequest}</camunda:inputParameter> + <camunda:inputParameter name="payload">${updateOperationStatus} +</camunda:inputParameter> <camunda:inputParameter name="method">POST</camunda:inputParameter> <camunda:outputParameter name="CVFMI_dbResponseCode">${statusCode}</camunda:outputParameter> <camunda:outputParameter name="CVFMI_dbResponse">${response}</camunda:outputParameter> @@ -329,4 +330,4 @@ ex.processJavaException(execution)</bpmn:script> </bpmndi:BPMNShape> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> -</bpmn:definitions> +</bpmn:definitions>
\ No newline at end of file diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoCreateSliceServiceOption.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoCreateSliceServiceOption.bpmn index 435f91921d..ad0732df4d 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoCreateSliceServiceOption.bpmn +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoCreateSliceServiceOption.bpmn @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.2.3"> +<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.4.1"> <bpmn:process id="DoCreateSliceServiceOption" name="DoCreateSliceServiceOption" isExecutable="true"> <bpmn:startEvent id="createNS_StartEvent" name="createOption_StartEvent"> <bpmn:outgoing>SequenceFlow_1qo2pln</bpmn:outgoing> </bpmn:startEvent> <bpmn:sequenceFlow id="SequenceFlow_1qo2pln" sourceRef="createNS_StartEvent" targetRef="PreprocessIncomingRequest_task" /> - <bpmn:sequenceFlow id="SequenceFlow_0khtova" sourceRef="PreprocessIncomingRequest_task" targetRef="ExclusiveGateway_0b9d9l0" /> + <bpmn:sequenceFlow id="SequenceFlow_0khtova" sourceRef="PreprocessIncomingRequest_task" targetRef="Task_09nzhwk" /> <bpmn:scriptTask id="Task_09nzhwk" name="send request to OOF for NSI options" scriptFormat="groovy"> - <bpmn:incoming>SequenceFlow_1h5bw41</bpmn:incoming> + <bpmn:incoming>SequenceFlow_0khtova</bpmn:incoming> <bpmn:outgoing>SequenceFlow_1utpplq</bpmn:outgoing> <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* def dcso = new DoCreateSliceServiceOption() @@ -20,48 +20,12 @@ dcso.getNSIOptionfromOOF(execution)</bpmn:script> def dcso = new DoCreateSliceServiceOption() dcso.preProcessRequest(execution)</bpmn:script> </bpmn:scriptTask> - <bpmn:sequenceFlow id="SequenceFlow_0cq2q6g" sourceRef="finishNSCreate_Task" targetRef="ScriptTask_0j3wd2o" /> <bpmn:endEvent id="EndEvent_1x6k78c"> - <bpmn:incoming>SequenceFlow_01ak5x3</bpmn:incoming> <bpmn:incoming>SequenceFlow_1ap8kar</bpmn:incoming> <bpmn:incoming>SequenceFlow_0hnsycl</bpmn:incoming> </bpmn:endEvent> - <bpmn:scriptTask id="finishNSCreate_Task" name="prepare list of NSSI associated with NSI" scriptFormat="groovy"> - <bpmn:incoming>SequenceFlow_15679e8</bpmn:incoming> - <bpmn:outgoing>SequenceFlow_0cq2q6g</bpmn:outgoing> - <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* -def dcso = new DoCreateSliceServiceOption() -dcso.prepareNSSIList(execution)</bpmn:script> - </bpmn:scriptTask> - <bpmn:exclusiveGateway id="ExclusiveGateway_0b9d9l0" default="SequenceFlow_0ueeeca"> - <bpmn:incoming>SequenceFlow_0khtova</bpmn:incoming> - <bpmn:outgoing>SequenceFlow_1h5bw41</bpmn:outgoing> - <bpmn:outgoing>SequenceFlow_0ueeeca</bpmn:outgoing> - </bpmn:exclusiveGateway> - <bpmn:sequenceFlow id="SequenceFlow_1h5bw41" name="NSI Sharable" sourceRef="ExclusiveGateway_0b9d9l0" targetRef="Task_09nzhwk"> - <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{(execution.getVariable("isSharable" ) == true)}</bpmn:conditionExpression> - </bpmn:sequenceFlow> - <bpmn:scriptTask id="ScriptTask_1ehyrsg" name="update task status in request DB" scriptFormat="groovy"> - <bpmn:incoming>SequenceFlow_0ueeeca</bpmn:incoming> - <bpmn:outgoing>SequenceFlow_0ojueqq</bpmn:outgoing> - <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* -def dcso = new DoCreateSliceServiceOption() -dcso.updateStatusInDB(execution)</bpmn:script> - </bpmn:scriptTask> - <bpmn:sequenceFlow id="SequenceFlow_0ueeeca" name="NSI Not Sharable" sourceRef="ExclusiveGateway_0b9d9l0" targetRef="ScriptTask_1ehyrsg" /> - <bpmn:endEvent id="EndEvent_00n990e"> - <bpmn:incoming>SequenceFlow_0ojueqq</bpmn:incoming> - </bpmn:endEvent> - <bpmn:scriptTask id="ScriptTask_0j3wd2o" name="updated options in request DB" scriptFormat="groovy"> - <bpmn:incoming>SequenceFlow_0cq2q6g</bpmn:incoming> - <bpmn:outgoing>SequenceFlow_01ak5x3</bpmn:outgoing> - <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* -def dcso = new DoCreateSliceServiceOption() -dcso.updateOptionsInDB(execution)</bpmn:script> - </bpmn:scriptTask> - <bpmn:sequenceFlow id="SequenceFlow_01ak5x3" sourceRef="ScriptTask_0j3wd2o" targetRef="EndEvent_1x6k78c" /> <bpmn:scriptTask id="ScriptTask_0kecvrc" name="prepare list of NSST associated with NST" scriptFormat="groovy"> - <bpmn:incoming>SequenceFlow_1614gtr</bpmn:incoming> + <bpmn:incoming>SequenceFlow_0wy6oag</bpmn:incoming> <bpmn:outgoing>SequenceFlow_0lt2cdo</bpmn:outgoing> <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* def dcso = new DoCreateSliceServiceOption() @@ -76,7 +40,7 @@ dcso.getNSSTOption(execution)</bpmn:script> </bpmn:scriptTask> <bpmn:exclusiveGateway id="ExclusiveGateway_1y1wzs9"> <bpmn:incoming>SequenceFlow_0lt2cdo</bpmn:incoming> - <bpmn:incoming>SequenceFlow_00gq7h2</bpmn:incoming> + <bpmn:incoming>SequenceFlow_1r9n9ef</bpmn:incoming> <bpmn:outgoing>SequenceFlow_1ap8kar</bpmn:outgoing> <bpmn:outgoing>SequenceFlow_0m2mr0o</bpmn:outgoing> </bpmn:exclusiveGateway> @@ -87,44 +51,7 @@ dcso.getNSSTOption(execution)</bpmn:script> <bpmn:sequenceFlow id="SequenceFlow_0m2mr0o" sourceRef="ExclusiveGateway_1y1wzs9" targetRef="ScriptTask_1e5ysya"> <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{(execution.getVariable("isMoreNSSTtoProcess" ) == true)}</bpmn:conditionExpression> </bpmn:sequenceFlow> - <bpmn:scriptTask id="ScriptTask_0ojz4lj" name="save NSI and NSSI options in DB" scriptFormat="groovy"> - <bpmn:incoming>SequenceFlow_1r9n9ef</bpmn:incoming> - <bpmn:outgoing>SequenceFlow_00gq7h2</bpmn:outgoing> - <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* -def dcso = new DoCreateSliceServiceOption() -dcso.updateOptionsInDB(execution)</bpmn:script> - </bpmn:scriptTask> - <bpmn:sequenceFlow id="SequenceFlow_1r9n9ef" sourceRef="ScriptTask_1mlytov" targetRef="ScriptTask_0ojz4lj" /> - <bpmn:sequenceFlow id="SequenceFlow_00gq7h2" sourceRef="ScriptTask_0ojz4lj" targetRef="ExclusiveGateway_1y1wzs9" /> - <bpmn:sequenceFlow id="SequenceFlow_0ojueqq" sourceRef="ScriptTask_1ehyrsg" targetRef="EndEvent_00n990e" /> - <bpmn:exclusiveGateway id="ExclusiveGateway_1mdr1l2" default="SequenceFlow_1614gtr"> - <bpmn:incoming>SequenceFlow_041f5ne</bpmn:incoming> - <bpmn:outgoing>SequenceFlow_15679e8</bpmn:outgoing> - <bpmn:outgoing>SequenceFlow_1614gtr</bpmn:outgoing> - </bpmn:exclusiveGateway> - <bpmn:sequenceFlow id="SequenceFlow_15679e8" sourceRef="ExclusiveGateway_1mdr1l2" targetRef="finishNSCreate_Task"> - <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{(execution.getVariable("isNSISuggested" ) == true)}</bpmn:conditionExpression> - </bpmn:sequenceFlow> - <bpmn:sequenceFlow id="SequenceFlow_1614gtr" sourceRef="ExclusiveGateway_1mdr1l2" targetRef="ScriptTask_0kecvrc" /> - <bpmn:scriptTask id="ScriptTask_0uu3j3h" name="prepare NST decomposition" scriptFormat="groovy"> - <bpmn:incoming>SequenceFlow_0wy6oag</bpmn:incoming> - <bpmn:outgoing>SequenceFlow_1jnsyix</bpmn:outgoing> - <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* -def dcso = new DoCreateSliceServiceOption() -dcso.prepareNSTDecompose(execution)</bpmn:script> - </bpmn:scriptTask> - <bpmn:callActivity id="CallActivity_1qs8xd5" name="Call Decompose Service" calledElement="DecomposeService"> - <bpmn:extensionElements> - <camunda:in source="msoRequestId" target="msoRequestId" /> - <camunda:in source="serviceInstanceId" target="serviceInstanceId" /> - <camunda:in source="serviceModelInfo" target="serviceModelInfo" /> - <camunda:in source="isDebugLogEnabled" target="isDebugLogEnabled" /> - <camunda:out source="serviceDecomposition" target="serviceDecomposition" /> - <camunda:out source="WorkflowException" target="WorkflowException" /> - </bpmn:extensionElements> - <bpmn:incoming>SequenceFlow_1jnsyix</bpmn:incoming> - <bpmn:outgoing>SequenceFlow_041f5ne</bpmn:outgoing> - </bpmn:callActivity> + <bpmn:sequenceFlow id="SequenceFlow_1r9n9ef" sourceRef="ScriptTask_1mlytov" targetRef="ExclusiveGateway_1y1wzs9" /> <bpmn:scriptTask id="ScriptTask_1e5ysya" name="prepare NSST decomposition" scriptFormat="groovy"> <bpmn:incoming>SequenceFlow_0m2mr0o</bpmn:incoming> <bpmn:outgoing>SequenceFlow_016vi3s</bpmn:outgoing> @@ -146,193 +73,163 @@ dcso.prepareNSSTDecompose(execution)</bpmn:script> <bpmn:outgoing>SequenceFlow_0a5f5y6</bpmn:outgoing> </bpmn:callActivity> <bpmn:sequenceFlow id="SequenceFlow_0a5f5y6" sourceRef="CallActivity_1rfnoe2" targetRef="ScriptTask_1mlytov" /> - <bpmn:sequenceFlow id="SequenceFlow_1utpplq" sourceRef="Task_09nzhwk" targetRef="ExclusiveGateway_1skfk7w" /> - <bpmn:sequenceFlow id="SequenceFlow_1jnsyix" sourceRef="ScriptTask_0uu3j3h" targetRef="CallActivity_1qs8xd5" /> - <bpmn:sequenceFlow id="SequenceFlow_041f5ne" sourceRef="CallActivity_1qs8xd5" targetRef="ExclusiveGateway_1mdr1l2" /> + <bpmn:sequenceFlow id="SequenceFlow_1utpplq" sourceRef="Task_09nzhwk" targetRef="ScriptTask_1umbyel" /> <bpmn:exclusiveGateway id="ExclusiveGateway_1skfk7w" default="SequenceFlow_0wy6oag"> - <bpmn:incoming>SequenceFlow_1utpplq</bpmn:incoming> + <bpmn:incoming>SequenceFlow_0d774n5</bpmn:incoming> <bpmn:outgoing>SequenceFlow_0wy6oag</bpmn:outgoing> <bpmn:outgoing>SequenceFlow_0hnsycl</bpmn:outgoing> </bpmn:exclusiveGateway> - <bpmn:sequenceFlow id="SequenceFlow_0wy6oag" sourceRef="ExclusiveGateway_1skfk7w" targetRef="ScriptTask_0uu3j3h" /> + <bpmn:sequenceFlow id="SequenceFlow_0wy6oag" sourceRef="ExclusiveGateway_1skfk7w" targetRef="ScriptTask_0kecvrc" /> <bpmn:sequenceFlow id="SequenceFlow_0hnsycl" sourceRef="ExclusiveGateway_1skfk7w" targetRef="EndEvent_1x6k78c"> <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{(execution.getVariable("isNSISuggested" ) == true)}</bpmn:conditionExpression> </bpmn:sequenceFlow> + <bpmn:scriptTask id="ScriptTask_1umbyel" name="prepare NST decomposition" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_1utpplq</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0piifl1</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcso = new DoCreateSliceServiceOption() +dcso.prepareNSTDecompose(execution)</bpmn:script> + </bpmn:scriptTask> + <bpmn:sequenceFlow id="SequenceFlow_0piifl1" sourceRef="ScriptTask_1umbyel" targetRef="CallActivity_0ly8xiw" /> + <bpmn:callActivity id="CallActivity_0ly8xiw" name="Call Decompose Service" calledElement="DecomposeService"> + <bpmn:extensionElements> + <camunda:in source="msoRequestId" target="msoRequestId" /> + <camunda:in source="serviceInstanceId" target="serviceInstanceId" /> + <camunda:in source="serviceModelInfo" target="serviceModelInfo" /> + <camunda:in source="isDebugLogEnabled" target="isDebugLogEnabled" /> + <camunda:out source="serviceDecomposition" target="serviceDecomposition" /> + <camunda:out source="WorkflowException" target="WorkflowException" /> + </bpmn:extensionElements> + <bpmn:incoming>SequenceFlow_0piifl1</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_086yszq</bpmn:outgoing> + </bpmn:callActivity> + <bpmn:sequenceFlow id="SequenceFlow_086yszq" sourceRef="CallActivity_0ly8xiw" targetRef="Task_1k2ypj0" /> + <bpmn:sequenceFlow id="SequenceFlow_0d774n5" sourceRef="Task_1k2ypj0" targetRef="ExclusiveGateway_1skfk7w" /> + <bpmn:scriptTask id="Task_1k2ypj0" name="Process Decomposition" scriptFormat="groovy"> + <bpmn:incoming>SequenceFlow_086yszq</bpmn:incoming> + <bpmn:outgoing>SequenceFlow_0d774n5</bpmn:outgoing> + <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* +def dcso = new DoCreateSliceServiceOption() +dcso.processDecomposition(execution)</bpmn:script> + </bpmn:scriptTask> </bpmn:process> <bpmndi:BPMNDiagram id="BPMNDiagram_1"> <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DoCreateSliceServiceOption"> <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="createNS_StartEvent"> - <dc:Bounds x="175" y="187" width="36" height="36" /> + <dc:Bounds x="175" y="107" width="36" height="36" /> <bpmndi:BPMNLabel> - <dc:Bounds x="150" y="223" width="87" height="27" /> + <dc:Bounds x="151" y="143" width="86" height="27" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="SequenceFlow_1qo2pln_di" bpmnElement="SequenceFlow_1qo2pln"> - <di:waypoint x="211" y="205" /> - <di:waypoint x="251" y="205" /> - <di:waypoint x="251" y="205" /> - <di:waypoint x="293" y="205" /> + <di:waypoint x="211" y="125" /> + <di:waypoint x="251" y="125" /> + <di:waypoint x="251" y="125" /> + <di:waypoint x="293" y="125" /> <bpmndi:BPMNLabel> <dc:Bounds x="266" y="123" width="0" height="12" /> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="SequenceFlow_0khtova_di" bpmnElement="SequenceFlow_0khtova"> - <di:waypoint x="393" y="205" /> - <di:waypoint x="448" y="205" /> + <di:waypoint x="393" y="125" /> + <di:waypoint x="460" y="125" /> <bpmndi:BPMNLabel> <dc:Bounds x="436" y="108" width="0" height="12" /> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="ScriptTask_1dw39hg_di" bpmnElement="Task_09nzhwk"> - <dc:Bounds x="594" y="165" width="100" height="80" /> + <dc:Bounds x="460" y="85" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="ScriptTask_03j6ogo_di" bpmnElement="PreprocessIncomingRequest_task"> - <dc:Bounds x="293" y="165" width="100" height="80" /> + <dc:Bounds x="293" y="85" width="100" height="80" /> </bpmndi:BPMNShape> - <bpmndi:BPMNEdge id="SequenceFlow_0cq2q6g_di" bpmnElement="SequenceFlow_0cq2q6g"> - <di:waypoint x="1536" y="205" /> - <di:waypoint x="1592" y="205" /> - <bpmndi:BPMNLabel> - <dc:Bounds x="556.5" y="574" width="90" height="12" /> - </bpmndi:BPMNLabel> - </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="EndEvent_15pcuuc_di" bpmnElement="EndEvent_1x6k78c"> - <dc:Bounds x="1813" y="187" width="36" height="36" /> + <dc:Bounds x="1813" y="107" width="36" height="36" /> <bpmndi:BPMNLabel> <dc:Bounds x="412" y="617" width="90" height="12" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="ScriptTask_0xxyfku_di" bpmnElement="finishNSCreate_Task"> - <dc:Bounds x="1436" y="165" width="100" height="80" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="ExclusiveGateway_0b9d9l0_di" bpmnElement="ExclusiveGateway_0b9d9l0" isMarkerVisible="true"> - <dc:Bounds x="448" y="180" width="50" height="50" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNEdge id="SequenceFlow_1h5bw41_di" bpmnElement="SequenceFlow_1h5bw41"> - <di:waypoint x="498" y="205" /> - <di:waypoint x="594" y="205" /> - <bpmndi:BPMNLabel> - <dc:Bounds x="514" y="187" width="66" height="14" /> - </bpmndi:BPMNLabel> - </bpmndi:BPMNEdge> - <bpmndi:BPMNShape id="ScriptTask_1ehyrsg_di" bpmnElement="ScriptTask_1ehyrsg"> - <dc:Bounds x="602" y="-197" width="100" height="80" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNEdge id="SequenceFlow_0ueeeca_di" bpmnElement="SequenceFlow_0ueeeca"> - <di:waypoint x="473" y="180" /> - <di:waypoint x="473" y="-157" /> - <di:waypoint x="602" y="-157" /> - <bpmndi:BPMNLabel> - <dc:Bounds x="415" y="14" width="86" height="14" /> - </bpmndi:BPMNLabel> - </bpmndi:BPMNEdge> - <bpmndi:BPMNShape id="EndEvent_00n990e_di" bpmnElement="EndEvent_00n990e"> - <dc:Bounds x="785" y="-175" width="36" height="36" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="ScriptTask_0j3wd2o_di" bpmnElement="ScriptTask_0j3wd2o"> - <dc:Bounds x="1592" y="165" width="100" height="80" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNEdge id="SequenceFlow_01ak5x3_di" bpmnElement="SequenceFlow_01ak5x3"> - <di:waypoint x="1692" y="205" /> - <di:waypoint x="1813" y="205" /> - </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="ScriptTask_0kecvrc_di" bpmnElement="ScriptTask_0kecvrc"> - <dc:Bounds x="1297" y="391" width="100" height="80" /> + <dc:Bounds x="1250" y="311" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="ScriptTask_1mlytov_di" bpmnElement="ScriptTask_1mlytov"> - <dc:Bounds x="1781" y="533" width="100" height="80" /> + <dc:Bounds x="1680" y="453" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNShape id="ExclusiveGateway_1y1wzs9_di" bpmnElement="ExclusiveGateway_1y1wzs9" isMarkerVisible="true"> - <dc:Bounds x="1461" y="406" width="50" height="50" /> + <dc:Bounds x="1461" y="326" width="50" height="50" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="SequenceFlow_1ap8kar_di" bpmnElement="SequenceFlow_1ap8kar"> - <di:waypoint x="1486" y="406" /> - <di:waypoint x="1486" y="315" /> - <di:waypoint x="1831" y="315" /> - <di:waypoint x="1831" y="223" /> + <di:waypoint x="1486" y="326" /> + <di:waypoint x="1486" y="235" /> + <di:waypoint x="1831" y="235" /> + <di:waypoint x="1831" y="143" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="SequenceFlow_0lt2cdo_di" bpmnElement="SequenceFlow_0lt2cdo"> - <di:waypoint x="1397" y="431" /> - <di:waypoint x="1461" y="431" /> + <di:waypoint x="1350" y="351" /> + <di:waypoint x="1461" y="351" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="SequenceFlow_0m2mr0o_di" bpmnElement="SequenceFlow_0m2mr0o"> - <di:waypoint x="1511" y="431" /> - <di:waypoint x="1592" y="431" /> + <di:waypoint x="1511" y="351" /> + <di:waypoint x="1592" y="351" /> </bpmndi:BPMNEdge> - <bpmndi:BPMNShape id="ScriptTask_0ojz4lj_di" bpmnElement="ScriptTask_0ojz4lj"> - <dc:Bounds x="1592" y="533" width="100" height="80" /> - </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="SequenceFlow_1r9n9ef_di" bpmnElement="SequenceFlow_1r9n9ef"> - <di:waypoint x="1781" y="573" /> - <di:waypoint x="1692" y="573" /> - </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="SequenceFlow_00gq7h2_di" bpmnElement="SequenceFlow_00gq7h2"> - <di:waypoint x="1592" y="573" /> - <di:waypoint x="1486" y="573" /> - <di:waypoint x="1486" y="456" /> - </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="SequenceFlow_0ojueqq_di" bpmnElement="SequenceFlow_0ojueqq"> - <di:waypoint x="702" y="-157" /> - <di:waypoint x="785" y="-157" /> - </bpmndi:BPMNEdge> - <bpmndi:BPMNShape id="ExclusiveGateway_1mdr1l2_di" bpmnElement="ExclusiveGateway_1mdr1l2" isMarkerVisible="true"> - <dc:Bounds x="1322" y="180" width="50" height="50" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNEdge id="SequenceFlow_15679e8_di" bpmnElement="SequenceFlow_15679e8"> - <di:waypoint x="1372" y="205" /> - <di:waypoint x="1436" y="205" /> - </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="SequenceFlow_1614gtr_di" bpmnElement="SequenceFlow_1614gtr"> - <di:waypoint x="1347" y="230" /> - <di:waypoint x="1347" y="391" /> + <di:waypoint x="1680" y="493" /> + <di:waypoint x="1486" y="493" /> + <di:waypoint x="1486" y="376" /> </bpmndi:BPMNEdge> - <bpmndi:BPMNShape id="ScriptTask_0uu3j3h_di" bpmnElement="ScriptTask_0uu3j3h"> - <dc:Bounds x="967" y="165" width="100" height="80" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="CallActivity_1qs8xd5_di" bpmnElement="CallActivity_1qs8xd5"> - <dc:Bounds x="1136" y="165" width="100" height="80" /> - </bpmndi:BPMNShape> <bpmndi:BPMNShape id="ScriptTask_1e5ysya_di" bpmnElement="ScriptTask_1e5ysya"> - <dc:Bounds x="1592" y="391" width="100" height="80" /> + <dc:Bounds x="1592" y="311" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="SequenceFlow_016vi3s_di" bpmnElement="SequenceFlow_016vi3s"> - <di:waypoint x="1692" y="431" /> - <di:waypoint x="1781" y="431" /> + <di:waypoint x="1692" y="351" /> + <di:waypoint x="1781" y="351" /> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="CallActivity_1rfnoe2_di" bpmnElement="CallActivity_1rfnoe2"> - <dc:Bounds x="1781" y="391" width="100" height="80" /> + <dc:Bounds x="1781" y="311" width="100" height="80" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="SequenceFlow_0a5f5y6_di" bpmnElement="SequenceFlow_0a5f5y6"> - <di:waypoint x="1881" y="431" /> - <di:waypoint x="1968" y="431" /> - <di:waypoint x="1968" y="573" /> - <di:waypoint x="1881" y="573" /> + <di:waypoint x="1881" y="351" /> + <di:waypoint x="1968" y="351" /> + <di:waypoint x="1968" y="493" /> + <di:waypoint x="1780" y="493" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="SequenceFlow_1utpplq_di" bpmnElement="SequenceFlow_1utpplq"> - <di:waypoint x="694" y="205" /> - <di:waypoint x="796" y="205" /> - </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="SequenceFlow_1jnsyix_di" bpmnElement="SequenceFlow_1jnsyix"> - <di:waypoint x="1067" y="205" /> - <di:waypoint x="1136" y="205" /> - </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="SequenceFlow_041f5ne_di" bpmnElement="SequenceFlow_041f5ne"> - <di:waypoint x="1236" y="205" /> - <di:waypoint x="1322" y="205" /> + <di:waypoint x="560" y="125" /> + <di:waypoint x="620" y="125" /> </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="ExclusiveGateway_1skfk7w_di" bpmnElement="ExclusiveGateway_1skfk7w" isMarkerVisible="true"> - <dc:Bounds x="796" y="180" width="50" height="50" /> + <dc:Bounds x="1095" y="100" width="50" height="50" /> </bpmndi:BPMNShape> <bpmndi:BPMNEdge id="SequenceFlow_0wy6oag_di" bpmnElement="SequenceFlow_0wy6oag"> - <di:waypoint x="846" y="205" /> - <di:waypoint x="967" y="205" /> + <di:waypoint x="1120" y="150" /> + <di:waypoint x="1120" y="351" /> + <di:waypoint x="1250" y="351" /> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="SequenceFlow_0hnsycl_di" bpmnElement="SequenceFlow_0hnsycl"> - <di:waypoint x="821" y="180" /> - <di:waypoint x="821" y="90" /> - <di:waypoint x="1831" y="90" /> - <di:waypoint x="1831" y="187" /> + <di:waypoint x="1145" y="125" /> + <di:waypoint x="1813" y="125" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_1umbyel_di" bpmnElement="ScriptTask_1umbyel"> + <dc:Bounds x="620" y="85" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_0piifl1_di" bpmnElement="SequenceFlow_0piifl1"> + <di:waypoint x="720" y="125" /> + <di:waypoint x="780" y="125" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="CallActivity_0ly8xiw_di" bpmnElement="CallActivity_0ly8xiw"> + <dc:Bounds x="780" y="85" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="SequenceFlow_086yszq_di" bpmnElement="SequenceFlow_086yszq"> + <di:waypoint x="880" y="125" /> + <di:waypoint x="940" y="125" /> </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="SequenceFlow_0d774n5_di" bpmnElement="SequenceFlow_0d774n5"> + <di:waypoint x="1040" y="125" /> + <di:waypoint x="1095" y="125" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="ScriptTask_1895p18_di" bpmnElement="Task_1k2ypj0"> + <dc:Bounds x="940" y="85" width="100" height="80" /> + </bpmndi:BPMNShape> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> -</bpmn:definitions> +</bpmn:definitions>
\ No newline at end of file |