diff options
Diffstat (limited to 'bpmn')
56 files changed, 2164 insertions, 832 deletions
diff --git a/bpmn/MSOCommonBPMN/pom.xml b/bpmn/MSOCommonBPMN/pom.xml index c051aac9b8..d5c9f05a27 100644 --- a/bpmn/MSOCommonBPMN/pom.xml +++ b/bpmn/MSOCommonBPMN/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.onap.so</groupId> <artifactId>bpmn</artifactId> - <version>1.8.0-SNAPSHOT</version> + <version>1.9.0-SNAPSHOT</version> </parent> <artifactId>MSOCommonBPMN</artifactId> <name>MSOCommonBPMN</name> @@ -163,7 +163,7 @@ <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> - </dependency> + </dependency> <dependency> <!-- Needed for InMemoryH2Test --> <groupId>com.h2database</groupId> diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/util/CommonTimestampGenerator.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/util/CommonTimestampGenerator.java new file mode 100644 index 0000000000..02ce540265 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/util/CommonTimestampGenerator.java @@ -0,0 +1,26 @@ +package org.onap.so.bpmn.common.util; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +public class CommonTimestampGenerator { + + private final DateTimeFormatter formatter; + + public CommonTimestampGenerator(String format) { + this.formatter = DateTimeFormatter.ofPattern(format).withZone(ZoneId.systemDefault()); + } + + public CommonTimestampGenerator() { + this.formatter = null; + } + + public String generateCurrentTimestamp() { + if (formatter != null) { + return formatter.format(Instant.now()); + } else { + return Instant.now().toString(); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/util/TimestampGeneratorUtil.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/util/TimestampGeneratorUtil.java new file mode 100644 index 0000000000..f74bd57c00 --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/util/TimestampGeneratorUtil.java @@ -0,0 +1,19 @@ +package org.onap.so.bpmn.common.util; + +public final class TimestampGeneratorUtil { + + private static final String APPC_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'.0Z'"; + private static final CommonTimestampGenerator APPC_TIMESTAMP_GENERATOR = new CommonTimestampGenerator(APPC_FORMAT); + + public static final CommonTimestampGenerator COMMON_GENERATOR = new CommonTimestampGenerator(); + + private TimestampGeneratorUtil() {} + + public static String generateCurrentTimestamp(String contollerType) { + if (contollerType.equals("APPC")) { + return APPC_TIMESTAMP_GENERATOR.generateCurrentTimestamp(); + } else { + return COMMON_GENERATOR.generateCurrentTimestamp(); + } + } +} diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java index 5cbadd6b75..83d1f5249f 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/BBInputSetup.java @@ -1054,8 +1054,18 @@ public class BBInputSetup implements JavaDelegate { if (requestDetails.getOwningEntity() != null) owningEntity = mapperLayer.mapRequestOwningEntity(requestDetails.getOwningEntity()); - Service service = - bbInputSetupUtils.getCatalogServiceByModelUUID(requestDetails.getModelInfo().getModelVersionId()); + String modelVersionId = requestDetails.getModelInfo().getModelVersionId(); + + if (ModelType.vnf == requestDetails.getModelInfo().getModelType()) { + for (RelatedInstanceList relatedInstanceList : requestDetails.getRelatedInstanceList()) { + if (ModelType.service == relatedInstanceList.getRelatedInstance().getModelInfo().getModelType()) { + modelVersionId = relatedInstanceList.getRelatedInstance().getModelInfo().getModelVersionId(); + break; + } + } + } + + Service service = bbInputSetupUtils.getCatalogServiceByModelUUID(modelVersionId); if (service == null) { service = bbInputSetupUtils.getCatalogServiceByModelVersionAndModelInvariantUUID( requestDetails.getModelInfo().getModelVersion(), diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/appc/ApplicationControllerClient.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/appc/ApplicationControllerClient.java index e810fc0259..c73299ffc3 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/appc/ApplicationControllerClient.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/appc/ApplicationControllerClient.java @@ -7,9 +7,9 @@ * 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. @@ -20,15 +20,12 @@ package org.onap.so.client.appc; +import static org.onap.so.bpmn.common.util.TimestampGeneratorUtil.generateCurrentTimestamp; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.time.Instant; import java.util.Properties; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; -import org.onap.so.bpmn.core.UrnPropertiesReader; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.onap.appc.client.lcm.api.AppcClientServiceFactoryProvider; import org.onap.appc.client.lcm.api.AppcLifeCycleManagerServiceFactory; import org.onap.appc.client.lcm.api.ApplicationContext; @@ -43,6 +40,9 @@ import org.onap.appc.client.lcm.model.Flags.Mode; import org.onap.appc.client.lcm.model.Payload; import org.onap.appc.client.lcm.model.Status; import org.onap.appc.client.lcm.model.ZULU; +import org.onap.so.bpmn.core.UrnPropertiesReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ApplicationControllerClient { @@ -77,7 +77,7 @@ public class ApplicationControllerClient { /** * Creates an ApplicationControllerClient for the specified controller type. - * + * * @param controllerType the controller type: "appc" or "sdnc". */ public ApplicationControllerClient(String controllerType) { @@ -90,7 +90,7 @@ public class ApplicationControllerClient { /** * Gets the controller type. - * + * * @return the controllertype */ public String getControllerType() { @@ -100,11 +100,11 @@ public class ApplicationControllerClient { /** * Returns the AppC client object associated with this ApplicationControllerClient. AppC client objects are shared * objects. One is created if it does not exist. - * + * * @return the client object, or null if creation failed */ public LifeCycleManagerStateful getAppCClient() { - return appCClients.computeIfAbsent(controllerType, k -> createAppCClient(k)); + return appCClients.computeIfAbsent(controllerType, this::createAppCClient); } protected LifeCycleManagerStateful createAppCClient(String controllerType) { @@ -194,8 +194,7 @@ public class ApplicationControllerClient { flags.setForce(force); flags.setTtl(FLAGS_TTL); commonHeader.setFlags(flags); - Instant timestamp = Instant.now(); - ZULU zulu = new ZULU(timestamp.toString()); + ZULU zulu = new ZULU(generateCurrentTimestamp(this.controllerType)); commonHeader.setTimestamp(zulu); return commonHeader; } diff --git a/bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterTest.groovy b/bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterTest.groovy index 3438c7957c..235b6219d1 100644 --- a/bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterTest.groovy +++ b/bpmn/MSOCommonBPMN/src/test/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterTest.groovy @@ -22,7 +22,6 @@ package org.onap.so.bpmn.common.scripts import static org.mockito.Mockito.* - import org.camunda.bpm.engine.ProcessEngineServices import org.camunda.bpm.engine.RepositoryService import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity @@ -48,10 +47,10 @@ public class SDNCAdapterTest { } - String workflowResponse = """<sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1" + String workflowResponse = """<sdncadapterworkflow:SDNCAdapterWorkflowResponse xmlns="com:att:sdnctl:l3api" + xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1" xmlns:tag0="http://org.onap/workflow/sdnc/adapter/schema/v1" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns="com:att:sdnctl:l3api"> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <sdncadapterworkflow:response-data> <tag0:CallbackHeader> <tag0:RequestId>testRequestId</tag0:RequestId> diff --git a/bpmn/MSOCommonBPMN/src/test/resources/logback-test.xml b/bpmn/MSOCommonBPMN/src/test/resources/logback-test.xml index 9088d1a844..90f73dc419 100644 --- a/bpmn/MSOCommonBPMN/src/test/resources/logback-test.xml +++ b/bpmn/MSOCommonBPMN/src/test/resources/logback-test.xml @@ -24,7 +24,7 @@ <root level="WARN"> <appender-ref ref="STDOUT" /> </root> - + <logger name="org.reflections" level="ERROR" /> <logger name="wiremock.org" level="ERROR" /> </configuration>
\ No newline at end of file diff --git a/bpmn/MSOCoreBPMN/pom.xml b/bpmn/MSOCoreBPMN/pom.xml index b6aead393f..4b196636fc 100644 --- a/bpmn/MSOCoreBPMN/pom.xml +++ b/bpmn/MSOCoreBPMN/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.onap.so</groupId> <artifactId>bpmn</artifactId> - <version>1.8.0-SNAPSHOT</version> + <version>1.9.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>MSOCoreBPMN</artifactId> diff --git a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/xml/XmlTool.java b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/xml/XmlTool.java index da096e5461..79a4c54e23 100644 --- a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/xml/XmlTool.java +++ b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/xml/XmlTool.java @@ -49,6 +49,7 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.apache.commons.lang3.StringEscapeUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; @@ -87,44 +88,47 @@ public final class XmlTool { * @throws SAXException * @throws XPathExpressionException */ - public static String normalize(Object xml) throws IOException, TransformerException, ParserConfigurationException, - SAXException, XPathExpressionException { + public static String normalize(final Object xml) throws IOException, TransformerException, + ParserConfigurationException, SAXException, XPathExpressionException { if (xml == null) { return null; } - Source xsltSource = new StreamSource(new StringReader(readResourceFile("normalize-namespaces.xsl"))); + final Source xsltSource = new StreamSource(new StringReader(readResourceFile("normalize-namespaces.xsl"))); - DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + final DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); dbFactory.setNamespaceAware(true); dbFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); dbFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - DocumentBuilder db = dbFactory.newDocumentBuilder(); - InputSource source = new InputSource(new StringReader(String.valueOf(xml))); - Document doc = db.parse(source); + final DocumentBuilder db = dbFactory.newDocumentBuilder(); + final InputSource source = new InputSource(new StringReader(String.valueOf(xml))); + final Document doc = db.parse(source); // Start of code to remove whitespace outside of tags - XPath xPath = XPathFactory.newInstance().newXPath(); - NodeList nodeList = (NodeList) xPath.evaluate("//text()[normalize-space()='']", doc, XPathConstants.NODESET); + final XPath xPath = XPathFactory.newInstance().newXPath(); + final NodeList nodeList = + (NodeList) xPath.evaluate("//text()[normalize-space()='']", doc, XPathConstants.NODESET); for (int i = 0; i < nodeList.getLength(); ++i) { - Node node = nodeList.item(i); + final Node node = nodeList.item(i); node.getParentNode().removeChild(node); } // End of code to remove whitespace outside of tags // the factory pattern supports different XSLT processors - TransformerFactory transformerFactory = TransformerFactory.newInstance(); + final TransformerFactory transformerFactory = TransformerFactory.newInstance(); + transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, StringUtils.EMPTY); + transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, StringUtils.EMPTY); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - Transformer transformer = transformerFactory.newTransformer(xsltSource); + final Transformer transformer = transformerFactory.newTransformer(xsltSource); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); - StringWriter writer = new StringWriter(); + final StringWriter writer = new StringWriter(); transformer.transform(new DOMSource(doc), new StreamResult(writer)); return writer.toString().trim(); } @@ -220,7 +224,7 @@ public final class XmlTool { * @return the contents of the modified XML document as a String or null/empty if the modification failed. * @throws IOException, TransformerException, ParserConfigurationException, SAXException */ - public static Optional<String> modifyElement(String xml, String elementTag, String newValue) + public static Optional<String> modifyElement(final String xml, final String elementTag, final String newValue) throws IOException, TransformerException, ParserConfigurationException, SAXException { if (xml == null || xml.isEmpty()) { @@ -228,15 +232,15 @@ public final class XmlTool { return Optional.empty(); } - DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + final DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); dbFactory.setNamespaceAware(true); dbFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); dbFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - DocumentBuilder db = dbFactory.newDocumentBuilder(); - InputSource source = new InputSource(new StringReader(xml)); - Document doc = db.parse(source); + final DocumentBuilder db = dbFactory.newDocumentBuilder(); + final InputSource source = new InputSource(new StringReader(xml)); + final Document doc = db.parse(source); - Node modNode = doc.getElementsByTagName(elementTag).item(0); + final Node modNode = doc.getElementsByTagName(elementTag).item(0); if (modNode == null) { // did not find the specified element to be modified, return empty // System.out.println("Did not find element tag " + elementTag + " in XML"); @@ -245,9 +249,12 @@ public final class XmlTool { modNode.setTextContent(newValue); } - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - Transformer transformer = transformerFactory.newTransformer(); - StringWriter writer = new StringWriter(); + final TransformerFactory transformerFactory = TransformerFactory.newInstance(); + transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, StringUtils.EMPTY); + transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, StringUtils.EMPTY); + + final Transformer transformer = transformerFactory.newTransformer(); + final StringWriter writer = new StringWriter(); transformer.transform(new DOMSource(doc), new StreamResult(writer)); // return the modified String representation of the XML return Optional.of(writer.toString().trim()); diff --git a/bpmn/MSOCoreBPMN/src/test/resources/logback-test.xml b/bpmn/MSOCoreBPMN/src/test/resources/logback-test.xml index 02ac437db6..20b0dce748 100644 --- a/bpmn/MSOCoreBPMN/src/test/resources/logback-test.xml +++ b/bpmn/MSOCoreBPMN/src/test/resources/logback-test.xml @@ -18,33 +18,34 @@ ============LICENSE_END========================================================= --> -<configuration > - - - <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> - <encoder> - <pattern>%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}||%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}||%X{Timer}|%msg%n</pattern> - </encoder> - </appender> +<configuration> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}||%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}||%X{Timer}|%msg%n + </pattern> + </encoder> + </appender> - <logger name="com.att.eelf.audit" level="info" additivity="false"> - <appender-ref ref="STDOUT" /> - </logger> - - <logger name="com.att.eelf.metrics" level="info" additivity="false"> + <logger name="com.att.eelf.audit" level="info" additivity="false"> + <appender-ref ref="STDOUT" /> + </logger> + + <logger name="com.att.eelf.metrics" level="info" additivity="false"> <appender-ref ref="STDOUT" /> - </logger> + </logger> - <logger name="com.att.eelf.error" level="trace" additivity="false"> - <appender-ref ref="STDOUT" /> - </logger> - <logger name="org.onap" level="${so.log.level:-DEBUG}" additivity="false"> - <appender-ref ref="STDOUT" /> - </logger> - <root level="info"> - <appender-ref ref="STDOUT" /> - </root> - + <logger name="com.att.eelf.error" level="trace" additivity="false"> + <appender-ref ref="STDOUT" /> + </logger> + <logger name="org.onap" level="${so.log.level:-DEBUG}" additivity="false"> + <appender-ref ref="STDOUT" /> + </logger> + + <logger name="org.reflections" level="ERROR" /> + + <root level="info"> + <appender-ref ref="STDOUT" /> + </root> </configuration> diff --git a/bpmn/mso-infrastructure-bpmn/pom.xml b/bpmn/mso-infrastructure-bpmn/pom.xml index aa76782aef..1f11453a64 100644 --- a/bpmn/mso-infrastructure-bpmn/pom.xml +++ b/bpmn/mso-infrastructure-bpmn/pom.xml @@ -3,7 +3,7 @@ <parent> <groupId>org.onap.so</groupId> <artifactId>bpmn</artifactId> - <version>1.8.0-SNAPSHOT</version> + <version>1.9.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>mso-infrastructure-bpmn</artifactId> diff --git a/bpmn/pom.xml b/bpmn/pom.xml index 7b7135fafc..6a61ed1df3 100644 --- a/bpmn/pom.xml +++ b/bpmn/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.onap.so</groupId> <artifactId>so</artifactId> - <version>1.8.0-SNAPSHOT</version> + <version>1.9.0-SNAPSHOT</version> </parent> <artifactId>bpmn</artifactId> <name>BPMN Subsystem</name> @@ -15,7 +15,7 @@ <camunda.bpm.assert.version>1.2</camunda.bpm.assert.version> <h2.version>1.4.196</h2.version> <groovy.version>2.5.3</groovy.version> - <saxon.version>9.5.1-8</saxon.version> + <saxon.version>10.5</saxon.version> <xmlunit.version>2.4.0</xmlunit.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> diff --git a/bpmn/so-bpmn-building-blocks/pom.xml b/bpmn/so-bpmn-building-blocks/pom.xml index a08fc61cfd..9e1d109964 100644 --- a/bpmn/so-bpmn-building-blocks/pom.xml +++ b/bpmn/so-bpmn-building-blocks/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.onap.so</groupId> <artifactId>bpmn</artifactId> - <version>1.8.0-SNAPSHOT</version> + <version>1.9.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>so-bpmn-building-blocks</artifactId> diff --git a/bpmn/so-bpmn-building-blocks/src/test/resources/logback-test.xml b/bpmn/so-bpmn-building-blocks/src/test/resources/logback-test.xml index c080bc90f8..c0b24d9680 100644 --- a/bpmn/so-bpmn-building-blocks/src/test/resources/logback-test.xml +++ b/bpmn/so-bpmn-building-blocks/src/test/resources/logback-test.xml @@ -27,5 +27,6 @@ </root> <logger name="wiremock.org" level="DEBUG" /> + <logger name="org.reflections" level="ERROR" /> </configuration>
\ No newline at end of file diff --git a/bpmn/so-bpmn-infrastructure-common/pom.xml b/bpmn/so-bpmn-infrastructure-common/pom.xml index c6a4ffc01d..846af27b96 100644 --- a/bpmn/so-bpmn-infrastructure-common/pom.xml +++ b/bpmn/so-bpmn-infrastructure-common/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.onap.so</groupId> <artifactId>bpmn</artifactId> - <version>1.8.0-SNAPSHOT</version> + <version>1.9.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>so-bpmn-infrastructure-common</artifactId> @@ -132,11 +132,11 @@ <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxrs</artifactId> </dependency> - <dependency> - <groupId>org.apache.cxf</groupId> - <artifactId>cxf-rt-rs-service-description-openapi-v3</artifactId> - <version>3.4.2</version> -</dependency> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-rt-rs-service-description-openapi-v3</artifactId> + <version>3.4.2</version> + </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/AnNssmfutils.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/AnNssmfutils.groovy index 2c1fa64609..540358fde7 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/AnNssmfutils.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/AnNssmfutils.groovy @@ -176,9 +176,9 @@ public void createSliceProfilesInAai(DelegateExecution execution) { org.onap.aai.domain.yang.SliceProfile ANNF_SliceProfile = new SliceProfile() org.onap.aai.domain.yang.SliceProfile TNFH_SliceProfile = new SliceProfile() org.onap.aai.domain.yang.SliceProfile TNMH_SliceProfile = new SliceProfile() - ANNF_SliceProfile = createSliceProfile("AN-NF", execution) - TNFH_SliceProfile = createSliceProfile("TN-FH",execution) - TNMH_SliceProfile = createSliceProfile("TN-MH",execution) + ANNF_SliceProfile = createSliceProfile("AN_NF", execution) + TNFH_SliceProfile = createSliceProfile("TN_FH",execution) + TNMH_SliceProfile = createSliceProfile("TN_MH",execution) ANNF_SliceProfiles.getSliceProfile().add(ANNF_SliceProfile) TNFH_SliceProfiles.getSliceProfile().add(TNFH_SliceProfile) @@ -194,13 +194,13 @@ public void createSliceProfilesInAai(DelegateExecution execution) { String serviceStatus = "deactivated" ANNF_sliceProfileInstance.setOrchestrationStatus(serviceStatus) String serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("ranNfSliceProfile"), "plmnIdList") - ANNF_sliceProfileInstance.setServiceInstanceLocationId(serviceInstanceLocationid) + ANNF_sliceProfileInstance.setServiceInstanceLocationId(jsonUtil.StringArrayToList(serviceInstanceLocationid).get(0)) String serviceRole = "slice-profile-instance" ANNF_sliceProfileInstance.setServiceRole(serviceRole) ArrayList<String> snssaiList = execution.getVariable("snssaiList") String snssai = snssaiList.get(0) ANNF_sliceProfileInstance.setEnvironmentContext(snssai) - ANNF_sliceProfileInstance.setWorkloadContext("AN-NF") + ANNF_sliceProfileInstance.setWorkloadContext("AN_NF") ANNF_sliceProfileInstance.setSliceProfiles(ANNF_SliceProfiles) String serviceFunctionAnnf = jsonUtil.getJsonValue(execution.getVariable("ranNfSliceProfile"), "resourceSharingLevel") ANNF_sliceProfileInstance.setServiceFunction(serviceFunctionAnnf) @@ -214,10 +214,10 @@ public void createSliceProfilesInAai(DelegateExecution execution) { TNFH_sliceProfileInstance.setServiceType(serviceType) TNFH_sliceProfileInstance.setOrchestrationStatus(serviceStatus) serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("tnFhSliceProfile"), "plmnIdList") - TNFH_sliceProfileInstance.setServiceInstanceLocationId(serviceInstanceLocationid) + TNFH_sliceProfileInstance.setServiceInstanceLocationId(jsonUtil.StringArrayToList(serviceInstanceLocationid).get(0)) TNFH_sliceProfileInstance.setServiceRole(serviceRole) TNFH_sliceProfileInstance.setEnvironmentContext(snssai) - TNFH_sliceProfileInstance.setWorkloadContext("TN-FH") + TNFH_sliceProfileInstance.setWorkloadContext("TN_FH") TNFH_sliceProfileInstance.setSliceProfiles(TNFH_SliceProfiles) String serviceFunctionTnFH = jsonUtil.getJsonValue(execution.getVariable("tnFhSliceProfile"), "resourceSharingLevel") TNFH_sliceProfileInstance.setServiceFunction(serviceFunctionTnFH) @@ -231,10 +231,10 @@ public void createSliceProfilesInAai(DelegateExecution execution) { TNMH_sliceProfileInstance.setServiceType(serviceType) TNMH_sliceProfileInstance.setOrchestrationStatus(serviceStatus) serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("tnMhSliceProfile"), "plmnIdList") - TNMH_sliceProfileInstance.setServiceInstanceLocationId(serviceInstanceLocationid) + TNMH_sliceProfileInstance.setServiceInstanceLocationId(jsonUtil.StringArrayToList(serviceInstanceLocationid).get(0)) TNMH_sliceProfileInstance.setServiceRole(serviceRole) TNMH_sliceProfileInstance.setEnvironmentContext(snssai) - TNMH_sliceProfileInstance.setWorkloadContext("TN-MH") + TNMH_sliceProfileInstance.setWorkloadContext("TN_MH") TNMH_sliceProfileInstance.setSliceProfiles(TNMH_SliceProfiles) String serviceFunctionTnMH = jsonUtil.getJsonValue(execution.getVariable("tnMhSliceProfile"), "resourceSharingLevel") TNMH_sliceProfileInstance.setServiceFunction(serviceFunctionTnMH) @@ -267,7 +267,7 @@ private SliceProfile createSliceProfile(String domainType, DelegateExecution exe SliceProfile result = new SliceProfile() Map<String,Object> profile switch(domainType) { - case "AN-NF": + case "AN_NF": profile = objectMapper.readValue(execution.getVariable("ranNfSliceProfile"), Map.class)//pending fields - cSReliabilityMeanTime, cSAvailabilityTarget, terminalDensity, msgSizeByte result.setJitter(profile.get("jitter")) result.setLatency(profile.get("latency")) @@ -288,7 +288,7 @@ private SliceProfile createSliceProfile(String domainType, DelegateExecution exe result.setExpDataRate(profile.get("expDataRate")) result.setProfileId(execution.getVariable("ANNF_sliceProfileId")) break - case "TN-FH": + case "TN_FH": profile = objectMapper.readValue(execution.getVariable("tnFhSliceProfile"), Map.class) result.setJitter(profile.get("jitter")) result.setLatency(profile.get("latency")) @@ -296,7 +296,7 @@ private SliceProfile createSliceProfile(String domainType, DelegateExecution exe result.setResourceSharingLevel(profile.get("resourceSharingLevel")) result.setProfileId(execution.getVariable("TNFH_sliceProfileId")) break - case "TN-MH": + case "TN_MH": profile = objectMapper.readValue(execution.getVariable("tnMhSliceProfile"), Map.class) result.setJitter(profile.get("jitter")) result.setLatency(profile.get("latency")) @@ -361,7 +361,8 @@ private SliceProfile createSliceProfile(String domainType, DelegateExecution exe if(domainType.equals("TN_FH")) { serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("TNFH_modelInvariantUuid")) serviceInfo.addProperty("serviceUuid", execution.getVariable("TNFH_modelUuid")) - serviceInfo.addProperty("nssiName", execution.getVariable("TNFH_modelName")) + serviceInfo.addProperty("nssiName", "nssi_"+execution.getVariable("TNFH_modelName")) + serviceInfo.addProperty("sst", execution.getVariable("sst")) allocateTnNssi.addProperty("nsstId", execution.getVariable("TNFH_modelUuid")) allocateTnNssi.addProperty("nssiName", execution.getVariable("TNFH_modelName")) Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("tnFhSliceProfile"), Map.class) @@ -373,7 +374,8 @@ private SliceProfile createSliceProfile(String domainType, DelegateExecution exe }else if(domainType.equals("TN_MH")) { serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("TNMH_modelInvariantUuid")) serviceInfo.addProperty("serviceUuid", execution.getVariable("TNMH_modelUuid")) - serviceInfo.addProperty("nssiName", execution.getVariable("TNMH_modelName")) + serviceInfo.addProperty("nssiName", "nssi_"+execution.getVariable("TNMH_modelName")) + serviceInfo.addProperty("sst", execution.getVariable("sst")) allocateTnNssi.addProperty("nsstId", execution.getVariable("TNMH_modelUuid")) allocateTnNssi.addProperty("nssiName", execution.getVariable("TNMH_modelName")) Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("tnMhSliceProfile"), Map.class) @@ -383,26 +385,40 @@ private SliceProfile createSliceProfile(String domainType, DelegateExecution exe endpoints.addProperty("transportEndpointB", execution.getVariable("tranportEp_ID_CUIN")) connectionLinksList.add(endpoints) } - - //Connection links - connectionLinks.add("connectionLinks", connectionLinksList) - transportSliceNetworksList.add(connectionLinks) - allocateTnNssi.add("transportSliceNetworks", transportSliceNetworksList) }else if(action.equals("modify-allocate")) { + JsonObject endpoints = new JsonObject() if(domainType.equals("TN_FH")) { allocateTnNssi.addProperty("nssiName", execution.getVariable("TNFH_nssiName")) allocateTnNssi.addProperty("sliceProfileId", execution.getVariable("TNFH_sliceProfileInstanceId")) allocateTnNssi.addProperty("nssiId", execution.getVariable("TNFH_NSSI")) serviceInfo.addProperty("nssiId", execution.getVariable("TNFH_NSSI")) serviceInfo.addProperty("nssiName", execution.getVariable("TNFH_nssiName")) + Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("tnFhSliceProfile"), Map.class) + sliceProfile.put("sliceProfileId", execution.getVariable("TNFH_sliceProfileInstanceId")) + allocateTnNssi.add("sliceProfile", jsonConverter.toJsonTree(sliceProfile)) + endpoints.addProperty("transportEndpointA", execution.getVariable("tranportEp_ID_RU")) + endpoints.addProperty("transportEndpointB", execution.getVariable("tranportEp_ID_DUIN")) + connectionLinksList.add(endpoints) }else if(domainType.equals("TN_MH")) { allocateTnNssi.addProperty("nssiName", execution.getVariable("TNMH_nssiName")) allocateTnNssi.addProperty("sliceProfileId", execution.getVariable("TNMH_sliceProfileInstanceId")) allocateTnNssi.addProperty("nssiId", execution.getVariable("TNMH_NSSI")) serviceInfo.addProperty("nssiId", execution.getVariable("TNMH_NSSI")) serviceInfo.addProperty("nssiName", execution.getVariable("TNMH_nssiName")) + Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("tnMhSliceProfile"), Map.class) + sliceProfile.put("sliceProfileId", execution.getVariable("TNMH_sliceProfileInstanceId")) + allocateTnNssi.add("sliceProfile", jsonConverter.toJsonTree(sliceProfile)) + endpoints.addProperty("transportEndpointA", execution.getVariable("tranportEp_ID_DUEG")) + endpoints.addProperty("transportEndpointB", execution.getVariable("tranportEp_ID_CUIN")) + connectionLinksList.add(endpoints) } } + + //Connection links + connectionLinks.add("connectionLinks", connectionLinksList) + transportSliceNetworksList.add(connectionLinks) + allocateTnNssi.add("transportSliceNetworks", transportSliceNetworksList) + JsonParser parser = new JsonParser() String nsiInfo = jsonUtil.getJsonValue(execution.getVariable("sliceParams"), "nsiInfo") allocateTnNssi.add("nsiInfo",(JsonObject) parser.parse(nsiInfo)) diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateAccessNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateAccessNSSI.groovy index 567c703496..f3fca050a2 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateAccessNSSI.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateAccessNSSI.groovy @@ -53,6 +53,7 @@ import org.onap.aaiclient.client.aai.AAINamespaceConstants import org.onap.aaiclient.client.aai.AAIObjectType import org.onap.aai.domain.yang.NetworkPolicy import org.onap.aai.domain.yang.NetworkRoute +import org.json.JSONArray class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { @@ -85,7 +86,8 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { " subscriptionServiceType - "+execution.getVariable("subscriptionServiceType")+ " jobId - "+execution.getVariable("jobId")+ " sliceParams - "+execution.getVariable("sliceParams")+ - " servicename - "+ execution.getVariable("servicename")) + " servicename - "+ execution.getVariable("servicename")+ + " sst - "+ execution.getVariable("sst")) //validate slice subnet inputs @@ -101,7 +103,14 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { String sliceProfileId = jsonUtil.getJsonValue(sliceProfile, "sliceProfileId") def snssaiList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "snssaiList")) def plmnIdList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "plmnIdList")) - def coverageAreaTAList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "coverageAreaTAList")) + String jsonArray = jsonUtil.getJsonValue(sliceProfile, "coverageAreaTAList") + List<Integer> list = new ArrayList<>(); + JSONArray arr = new JSONArray(jsonArray); + for (int i = 0; i < arr.length(); i++) { + int s = (int) arr.get(i); + list.add(s); + } + def coverageAreaTAList = list; if (isBlank(sliceProfileId) || (snssaiList.empty) || (plmnIdList.empty) || (coverageAreaTAList.empty)) { @@ -131,16 +140,16 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { execution.setVariable("job_timeout", 10) //set BH end point - List<String> BH_endPoints = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceParams, "endPoints")) - logger.debug("BH end points list : "+BH_endPoints) - if(BH_endPoints.empty) { - msg = "End point info is empty" - logger.debug(msg) - exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) - }else { - execution.setVariable("bh_endpoint", BH_endPoints.get(0)) - } - + def BH_endPoints = jsonUtil.getJsonValue(sliceParams, "endPoint") + logger.debug("BH end points list : "+BH_endPoints) + if(isBlank(BH_endPoints)) { + msg = "End point info is empty" + logger.debug(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) + }else { + execution.setVariable("bh_endpoint", BH_endPoints) + } + } catch(BpmnError e) { throw e } catch(Exception ex) { @@ -261,6 +270,7 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { String requestId = execution.getVariable("msoRequestId") String messageType = "NSISelectionResponse" Map<String, Object> profileInfo = objectMapper.readValue(execution.getVariable("sliceProfile"), Map.class) + profileInfo.put("sST",execution.getVariable("sst")) String modelUuid = execution.getVariable("modelUuid") String modelInvariantUuid = execution.getVariable("modelInvariantUuid") String modelName = execution.getVariable("ranModelName") @@ -377,8 +387,7 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { serviceInfo.addProperty("nssiId", execution.getVariable("RANServiceInstanceId")) serviceInfo.addProperty("nsiId", execution.getVariable("nsiId")) serviceInfo.addProperty("nssiName", execution.getVariable("servicename")) - String sST = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST") - serviceInfo.addProperty("sST", sST) + serviceInfo.addProperty("sST", execution.getVariable("sst")) serviceInfo.addProperty("PLMNIdList", objectMapper.writeValueAsString(execution.getVariable("plmnIdList"))) serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId")) serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType")) @@ -475,6 +484,7 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { List<String> ranConstituentSliceProfiles = jsonUtil.StringArrayToList(execution.getVariable("RanConstituentSliceProfiles")) anNssmfUtils.createDomainWiseSliceProfiles(ranConstituentSliceProfiles, execution) Map<String, Object> profileInfo = objectMapper.readValue(execution.getVariable("ranNfSliceProfile"), Map.class) + profileInfo.put("sST",execution.getVariable("sst")) String modelUuid = execution.getVariable("ANNF_modelUuid") String modelInvariantUuid = execution.getVariable("ANNF_modelInvariantUuid") String modelName = execution.getVariable("ANNF_modelName") @@ -518,6 +528,7 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { ServiceDecomposition serviceDecomposition = execution.getVariable("ANNF_ServiceDecomposition") serviceDecomposition.setServiceInstance(serviceInstance); execution.setVariable("ANNF_ServiceDecomposition", serviceDecomposition) + execution.setVariable("modifyAction","allocate") execution.setVariable("isRspRanNfNssi", true) }else { logger.debug("No solutions returned from OOF .. Create new RAN NF NSSI") @@ -544,17 +555,18 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { String sliceInstanceName = execution.getVariable("servicename") ANServiceInstance.setServiceInstanceName(sliceInstanceName) String serviceType = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST") - ANServiceInstance.setServiceType(serviceType) + ANServiceInstance.setServiceType(execution.getVariable("sst")) String serviceStatus = "deactivated" ANServiceInstance.setOrchestrationStatus(serviceStatus) String serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "plmnIdList") - ANServiceInstance.setServiceInstanceLocationId(serviceInstanceLocationid) + ANServiceInstance.setServiceInstanceLocationId(jsonUtil.StringArrayToList(serviceInstanceLocationid).get(0)) String serviceRole = "nssi" ANServiceInstance.setServiceRole(serviceRole) - List<String> snssaiList = objectMapper.readValue(execution.getVariable("snssaiList"), List.class) + List<String> snssaiList = execution.getVariable("snssaiList") String snssai = snssaiList.get(0) - ANServiceInstance.setEnvironmentContext(snssai) - ANServiceInstance.setWorkloadContext("AN") + //ANServiceInstance.setEnvironmentContext(snssai) + ANServiceInstance.setEnvironmentContext("an") //Network Type + ANServiceInstance.setWorkloadContext("AN") //domain Type logger.debug("completed AN service instance build "+ ANServiceInstance.toString()) String msg = "" @@ -610,7 +622,7 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { String sliceInstanceName = execution.getVariable("servicename") ANServiceInstance.setServiceInstanceName(sliceInstanceName) String serviceType = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST") - ANServiceInstance.setServiceType(serviceType) + ANServiceInstance.setServiceType(execution.getVariable("sst")) String serviceStatus = "deactivated" ANServiceInstance.setOrchestrationStatus(serviceStatus) String serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "plmnIdList") @@ -630,19 +642,19 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { logger.debug("completed AN service instance build "+ ANServiceInstance.toString()) //create RAN NF NSSI ANNFServiceInstance.setServiceInstanceId(execution.getVariable("RANNFServiceInstanceId")) - sliceInstanceName = execution.getVariable("ANNF_modelName") + sliceInstanceName = "nssi_"+execution.getVariable("ANNF_modelName") ANNFServiceInstance.setServiceInstanceName(sliceInstanceName) - ANNFServiceInstance.setServiceType(serviceType) + ANNFServiceInstance.setServiceType(execution.getVariable("sst")) ANNFServiceInstance.setOrchestrationStatus(serviceStatus) serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("ranNfSliceProfile"), "plmnIdList") - ANNFServiceInstance.setServiceInstanceLocationId(serviceInstanceLocationid) + ANNFServiceInstance.setServiceInstanceLocationId(jsonUtil.StringArrayToList(serviceInstanceLocationid).get(0)) ANNFServiceInstance.setServiceRole(serviceRole) snssaiList = execution.getVariable("snssaiList") snssai = snssaiList.get(0) ANNFServiceInstance.setEnvironmentContext(snssai) ANNFServiceInstance.setModelInvariantId(execution.getVariable("ANNF_modelInvariantUuid")) ANNFServiceInstance.setModelVersionId(execution.getVariable("ANNF_modelUuid")) - ANNFServiceInstance.setWorkloadContext("AN-NF") + ANNFServiceInstance.setWorkloadContext("AN_NF") String serviceFunctionAnnf = jsonUtil.getJsonValue(execution.getVariable("ranNfSliceProfile"), "resourceSharingLevel") ANNFServiceInstance.setServiceFunction(serviceFunctionAnnf) logger.debug("completed AN service instance build "+ ANNFServiceInstance.toString()) @@ -720,8 +732,7 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { execution.setVariable("esrInfo", esrInfo.toString()) JsonObject serviceInfo = new JsonObject() serviceInfo.addProperty("nsiId", execution.getVariable("nsiId")) - String sST = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST") - serviceInfo.addProperty("sST", sST) + serviceInfo.addProperty("sST", execution.getVariable("sst")) serviceInfo.addProperty("PLMNIdList", objectMapper.writeValueAsString(execution.getVariable("plmnIdList"))) serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId")) serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType")) @@ -902,7 +913,7 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { String requestId = execution.getVariable("msoRequestId") Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("ranNfSliceProfile"), Map.class) sliceProfile.put("sliceProfileId", execution.getVariable("ANNF_sliceProfileInstanceId")) - sliceProfile.put("maxNumberofConns", sliceProfile.get("maxNumberofPDUSessions")) + sliceProfile.put("maxNumberofConns", sliceProfile.get("maxNumberofPDUSession")) sliceProfile.put("uLThptPerSlice", sliceProfile.get("expDataRateUL")) sliceProfile.put("dLThptPerSlice", sliceProfile.get("expDataRateDL")) @@ -912,11 +923,11 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { JsonObject commonHeader = new JsonObject() JsonObject payload = new JsonObject() JsonObject payloadInput = new JsonObject() - commonHeader.addProperty("TimeStamp",new Date(System.currentTimeMillis()).format("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", TimeZone.getDefault())) + commonHeader.addProperty("timeStamp",new Date(System.currentTimeMillis()).format("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", TimeZone.getDefault())) commonHeader.addProperty("api-ver", "1.0") + commonHeader.addProperty("originator-id", "testing") commonHeader.addProperty("request-id", requestId) commonHeader.addProperty("sub-request-id", "1") - commonHeader.add("request-track", new JsonObject()) commonHeader.add("flags", new JsonObject()) Gson jsonConverter = new Gson() payloadInput.add("sliceProfile", jsonConverter.toJsonTree(sliceProfile)) @@ -924,6 +935,8 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { payloadInput.addProperty("NSIID", execution.getVariable("nsiId")) payloadInput.addProperty("RANNFNSSIId", execution.getVariable("RANNFServiceInstanceId")) payloadInput.addProperty("callbackURL", callbackUrl) + payloadInput.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId")) + payloadInput.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType")) payloadInput.add("additionalproperties", new JsonObject()) payload.add("input", payloadInput) input.add("common-header", commonHeader) @@ -948,8 +961,8 @@ class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor { String bh_routeId = UUID.randomUUID().toString() execution.setVariable("tranportEp_ID_bh", bh_routeId) String role = "CU" - String CU_IpAddress = jsonUtil.getJsonValue(bh_endpoint, "IpAddress") - String LogicalLinkId = jsonUtil.getJsonValue(bh_endpoint, "LogicalLinkId") + String CU_IpAddress = jsonUtil.getJsonValue(bh_endpoint, "ipAddress") + String LogicalLinkId = jsonUtil.getJsonValue(bh_endpoint, "logicInterfaceId") String nextHopInfo = jsonUtil.getJsonValue(bh_endpoint, "nextHopInfo") NetworkRoute bh_ep = new NetworkRoute() bh_ep.setRouteId(bh_routeId) diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreNonSharedSlice.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreNonSharedSlice.groovy index a1afe9ae95..2801c11e47 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreNonSharedSlice.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreNonSharedSlice.groovy @@ -94,12 +94,12 @@ class DoAllocateCoreNonSharedSlice extends AbstractServiceTaskProcessor { execution.setVariable("networkServiceModelUuid", networkServiceModelUuid) String sliceParams = execution.getVariable("sliceParams") logger.debug("sliceParams "+sliceParams) - List<String> bhEndPoints = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceParams, "endPoints")) + String bhEndPoints = jsonUtil.getJsonValue(sliceParams, "endPoint") if(bhEndPoints.empty) { logger.debug("End point info is empty") exceptionUtil.buildAndThrowWorkflowException(execution, 500, "End point info is empty") }else { - execution.setVariable("bh_endpoint", bhEndPoints.get(0)) + execution.setVariable("bh_endpoint", bhEndPoints) } logger.debug(Prefix+ " **** Exit DoAllocateCoreNonSharedSlice::: preProcessRequest ****") } @@ -130,6 +130,10 @@ class DoAllocateCoreNonSharedSlice extends AbstractServiceTaskProcessor { logger.debug(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) } + //set shared or non shared value from sliceProfile object in request + String additionalParams = execution.getVariable("sliceParams") + //Get resourceSharingLevel from sliceProfile + String serviceFunction = jsonUtil.getJsonValue(additionalParams, "sliceProfile.resourceSharingLevel") String serviceInstanceName = "nssi_"+execution.getVariable("nsstName") ServiceInstance si = new ServiceInstance() si.setServiceInstanceId(execution.getVariable("nssiServiceInstanceId")) @@ -141,6 +145,7 @@ class DoAllocateCoreNonSharedSlice extends AbstractServiceTaskProcessor { si.setModelVersionId(execution.getVariable("modelUuid")) si.setEnvironmentContext(environmentContext) si.setWorkloadContext(workloadContext) + si.setServiceFunction(serviceFunction) logger.debug("AAI service Instance Request Payload : "+si.toString()) AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(execution.getVariable("globalSubscriberId")).serviceSubscription(serviceType).serviceInstance(serviceInstanceId)) getAAIClient().create(uri, si) @@ -225,7 +230,7 @@ class DoAllocateCoreNonSharedSlice extends AbstractServiceTaskProcessor { logger.debug(("Service Vnfs JSON: "+jsonUtil.getJsonValue(json, "serviceResources.serviceVnfs"))) List serviceVnfs = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(json, "serviceResources.serviceVnfs")) String networkServiceVnfJson = serviceVnfs.get(0) - String vnfInstanceName = (jsonUtil.getJsonValue(networkServiceVnfJson, "modelInfo.modelInstanceName")).trim() ?: "" + String vnfInstanceName = (jsonUtil.getJsonValue(networkServiceVnfJson, "modelInfo.modelInstanceName")).replace(" ","") ?: "" execution.setVariable("vnfInstanceName", vnfInstanceName) } @@ -420,8 +425,8 @@ class DoAllocateCoreNonSharedSlice extends AbstractServiceTaskProcessor { String bh_routeId = UUID.randomUUID().toString() execution.setVariable("coreEp_ID_bh", bh_routeId) String role = "CN" - String cnIpAddress = jsonUtil.getJsonValue(bh_endpoint, "IpAddress") - String LogicalLinkId = jsonUtil.getJsonValue(bh_endpoint, "LogicalLinkId") + String cnIpAddress = jsonUtil.getJsonValue(bh_endpoint, "ipAddress") + String LogicalLinkId = jsonUtil.getJsonValue(bh_endpoint, "logicInterfaceId") String nextHopInfo = jsonUtil.getJsonValue(bh_endpoint, "nextHopInfo") NetworkRoute bh_ep = new NetworkRoute() logger.debug("bh_endpoint: {}, bh_routeId: {}, cnIpAddress: {}, role: {}, LogicalLinkId: {}, nextHopInfo: {}, bh_ep: {}", bh_endpoint, bh_routeId, cnIpAddress, role, LogicalLinkId, nextHopInfo, bh_ep) diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreSharedSlice.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreSharedSlice.groovy index b3c99c6e9a..61528de793 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreSharedSlice.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreSharedSlice.groovy @@ -80,14 +80,7 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: preProcessRequest ****") //Get NSSI Solutions String nssisolutions = execution.getVariable("solutions") - - //Get First Object - List<String> nssiSolutionList = jsonUtil.StringArrayToList(nssisolutions) - - logger.debug("nssiSolutionList : "+nssiSolutionList) - - String nssiId = jsonUtil.getJsonValue(nssiSolutionList.get(0), "NSSIId") - logger.debug("NSSIId : "+nssiId) + String nssiId = jsonUtil.getJsonValue(nssisolutions, "NSSIId") if (isBlank(nssiId)) { String msg = "solution nssiId is null" @@ -98,12 +91,20 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { } String sNssaiListAsString = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "snssaiList") - logger.debug("sNssaiListAsString "+sNssaiListAsString) List<String> sNssaiList = jsonUtil.StringArrayToList(sNssaiListAsString) - logger.debug("sNssaiList "+sNssaiList) String sNssai = sNssaiList.get(0) execution.setVariable("sNssai", sNssai) - logger.debug("sNssai: "+sNssai) + + //Setting this value in Map + Map<String, Object> spiWithsNssaiAndOrchStatus = new LinkedHashMap<>() + spiWithsNssaiAndOrchStatus.put("snssai", sNssai) + spiWithsNssaiAndOrchStatus.put("status", "created") + + List <Map<String, Object>> spiWithsNssaiAndOrchStatusList = new ArrayList<>(); + spiWithsNssaiAndOrchStatusList.add(spiWithsNssaiAndOrchStatus) + + execution.setVariable("snssaiAndOrchStatusList", spiWithsNssaiAndOrchStatusList) + logger.debug("service Profile's NSSAI And Orchestration Status: "+spiWithsNssaiAndOrchStatus) String serviceType = execution.getVariable("subscriptionServiceType") execution.setVariable("serviceType", serviceType) @@ -125,79 +126,77 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { String networkServiceInstanceId ="" if(nsi.isPresent()) { List<Relationship> relationshipList = nsi.get().getRelationshipList()?.getRelationship() - List spiWithsNssaiAndOrchStatusList = new ArrayList<>() + + List spiWithsNssaiAndOrchStatusList = execution.getVariable("snssaiAndOrchStatusList") + + if(spiWithsNssaiAndOrchStatusList == null) { + spiWithsNssaiAndOrchStatusList = new ArrayList<>(); + } for (Relationship relationship : relationshipList) { String relatedTo = relationship.getRelatedTo() - if (relatedTo == "service-instance") { + if ("service-instance".equals(relatedTo)) { List<RelationshipData> relationshipDataList = relationship.getRelationshipData() List<RelatedToProperty> relatedToPropertyList = relationship.getRelatedToProperty() for (RelationshipData relationshipData : relationshipDataList) { - if (relationshipData.getRelationshipKey() == "service-instance.service-instance-id") { + if ("service-instance.service-instance-id".equals(relationshipData.getRelationshipKey())) { logger.debug("**** service-instance.service-instance-id 1 :: getServiceInstanceRelationships :: "+ relationshipData.getRelationshipValue()) - execution.setVariable("networkServiceInstanceId", relationshipData.getRelationshipValue()) - } - } - for (RelatedToProperty relatedToProperty : relatedToPropertyList) { - if (relatedToProperty.getPropertyKey() == "service-instance.service-instance-name") { - execution.setVariable("networkServiceInstanceName", relatedToProperty.getPropertyValue()) - } - } - } - //If related to is allotted-Resource - if (relatedTo == "allotted-resource") { - //get slice Profile Instance Id from allotted resource in list by nssi - List<String> sliceProfileInstanceIdList = new ArrayList<>() - List<RelationshipData> relationshipDataList = relationship.getRelationshipData() - for (RelationshipData relationshipData : relationshipDataList) { - if (relationshipData.getRelationshipKey() == "service-instance.service-instance-id") { - sliceProfileInstanceIdList.add(relationshipData.getRelationshipValue()) - } - } - for (String sliceProfileServiceInstanceId : sliceProfileInstanceIdList) { - String errorSliceProfileMsg = "Slice Profile Service Instance was not found in aai" - - //Query Slice Profile Service Instance From AAI by sliceProfileServiceInstanceId - AAIResultWrapper sliceProfileInstanceWrapper = queryAAI(execution, Types.SERVICE_INSTANCE, sliceProfileServiceInstanceId, errorSliceProfileMsg) - Optional<ServiceInstance> sliceProfileServiceInstance = sliceProfileInstanceWrapper.asBean(ServiceInstance.class) - if (sliceProfileServiceInstance.isPresent()) { - String orchestrationStatus= sliceProfileServiceInstance.get().getOrchestrationStatus() - String sNssai = sliceProfileServiceInstance.get().getSliceProfiles().getSliceProfile().get(0).getSNssai() - if(sNssai.equals(execution.getVariable("sNssai"))) { - orchestrationStatus = execution.getVariable("oStatus") - //Slice Profile Service Instance to be updated in AAI - execution.setVariable("sliceProfileServiceInstance", sliceProfileServiceInstance) - } - Map<String, Object> spiWithsNssaiAndOrchStatus = new LinkedHashMap<>() - spiWithsNssaiAndOrchStatus.put("snssai", sNssai) - spiWithsNssaiAndOrchStatus.put("status", orchestrationStatus) - spiWithsNssaiAndOrchStatusList.add(spiWithsNssaiAndOrchStatus) - logger.debug("service Profile's NSSAI And Orchestration Status: "+spiWithsNssaiAndOrchStatus) + //Query Every related Service Instance From AAI by service Instance ID + AAIResultWrapper instanceWrapper = queryAAI(execution, Types.SERVICE_INSTANCE, relationshipData.getRelationshipValue(), "No Instance Present") + Optional<ServiceInstance> relatedServiceInstance = instanceWrapper.asBean(ServiceInstance.class) + if (relatedServiceInstance.isPresent()) { + ServiceInstance relatedServiceInstanceObj = relatedServiceInstance.get() + + String role = relatedServiceInstanceObj.getServiceRole(); + + if(role == null || role.isEmpty()) { + networkServiceInstanceId = relatedServiceInstanceObj.getServiceInstanceId() + networkServiceInstanceName = relatedServiceInstanceObj.getServiceInstanceName() + + logger.debug("networkServiceInstanceId: {} networkServiceInstanceName: {} ",networkServiceInstanceId, networkServiceInstanceName) + + execution.setVariable("networkServiceInstanceId", networkServiceInstanceId) + execution.setVariable("networkServiceInstanceName", networkServiceInstanceName) + + } else if("slice-profile-instance".equals(role)) { + + String orchestrationStatus= relatedServiceInstanceObj.getOrchestrationStatus() + String sNssai = relatedServiceInstanceObj.getEnvironmentContext() + if(sNssai.equals(execution.getVariable("sNssai"))) { + orchestrationStatus = execution.getVariable("oStatus") + //Slice Profile Service Instance to be updated in AAI + execution.setVariable("sliceProfileServiceInstance", relatedServiceInstanceObj) + } + + Map<String, Object> spiWithsNssaiAndOrchStatus = new LinkedHashMap<>() + spiWithsNssaiAndOrchStatus.put("snssai", sNssai) + spiWithsNssaiAndOrchStatus.put("status", orchestrationStatus) + spiWithsNssaiAndOrchStatusList.add(spiWithsNssaiAndOrchStatus) + logger.debug("service Profile's NSSAI And Orchestration Status: "+spiWithsNssaiAndOrchStatus) + } + + } } + } + } } execution.setVariable("snssaiAndOrchStatusList", spiWithsNssaiAndOrchStatusList) } - logger.debug("NSSI Id: ${serviceInstanceId}, network Service Instance Id: ${networkServiceInstanceId}, serviceName: ${networkServiceInstanceName}") - //Get ServiceInstance Relationships getServiceInstanceRelationships(execution) - //Get Vnf Relationships getVnfRelationships(execution) logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: getNetworkInstanceAssociatedWithNssiId ****") - } + } private void getServiceInstanceRelationships(DelegateExecution execution) { - - logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: getServiceInstanceRelationships ****") - + logger.debug(Prefix +" **** Enter DoAllocateCoreSharedSlice ::: getServiceInstanceRelationships ****") String serviceInstanceId = execution.getVariable("networkServiceInstanceId") - String errorMsg = "query Network Service Instance from AAI failed" AAIResultWrapper wrapper = queryAAI(execution, Types.SERVICE_INSTANCE, serviceInstanceId, errorMsg) Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class) @@ -208,47 +207,45 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { List<Relationship> relationshipList = si.get().getRelationshipList()?.getRelationship() for (Relationship relationship : relationshipList) { String relatedTo = relationship.getRelatedTo() - if (relatedTo == "owning-entity") { + if (("owning-entity").equals(relatedTo)) { List<RelationshipData> relationshipDataList = relationship.getRelationshipData() for (RelationshipData relationshipData : relationshipDataList) { - if (relationshipData.getRelationshipKey() == "owning-entity.owning-entity-id") { + if (("owning-entity.owning-entity-id").equals(relationshipData.getRelationshipKey())) { execution.setVariable("owningEntityId", relationshipData.getRelationshipValue()) } } - } else if (relatedTo == "generic-vnf") { + } else if (("generic-vnf").equals(relatedTo)) { List<RelationshipData> relationshipDataList = relationship.getRelationshipData() List<RelatedToProperty> relatedToPropertyList = relationship.getRelatedToProperty() //Get VnfId for (RelationshipData relationshipData : relationshipDataList) { - if (relationshipData.getRelationshipKey() == "generic-vnf.vnf-id") { + if (("generic-vnf.vnf-id").equals(relationshipData.getRelationshipKey())) { execution.setVariable("vnfId", relationshipData.getRelationshipValue()) } } - //Get Vnf Name Check If necessary for (RelatedToProperty relatedToProperty : relatedToPropertyList) { - if (relatedToProperty.getPropertyKey() == "generic-vnf.vnf-name") { + if (("generic-vnf.vnf-name").equals(relatedToProperty.getPropertyKey())) { execution.setVariable("vnfName", relatedToProperty.getPropertyValue()) } } - } else if (relatedTo == "project") { + } else if (("project").equals(relatedTo)) { List<RelationshipData> relationshipDataList = relationship.getRelationshipData() for (RelationshipData relationshipData : relationshipDataList) { - if (relationshipData.getRelationshipKey() == "project.project-name") { + if (("project.project-name").equals(relationshipData.getRelationshipKey())) { execution.setVariable("projectName", relationshipData.getRelationshipValue()) } } } } - - logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: getServiceInstanceRelationships ****") + logger.debug(Prefix +" **** Exit DoAllocateCoreSharedSlice ::: getServiceInstanceRelationships ****") } } private void getVnfRelationships(DelegateExecution execution) { - logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: getVnfRelationships ****") + logger.debug(Prefix +" **** Enter DoAllocateCoreSharedSlice ::: getVnfRelationships ****") String msg = "query Generic Vnf from AAI failed" try { AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().genericVnf(execution.getVariable('vnfId'))) @@ -261,33 +258,34 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { List<Relationship> relationshipList = vnf.get().getRelationshipList()?.getRelationship() for (Relationship relationship : relationshipList) { String relatedTo = relationship.getRelatedTo() - if (relatedTo == "tenant") { + if (("tenant").equals(relatedTo)) { List<RelationshipData> relationshipDataList = relationship.getRelationshipData() for (RelationshipData relationshipData : relationshipDataList) { - if (relationshipData.getRelationshipKey() == "tenant.tenant-id") { + if (("tenant.tenant-id").equals(relationshipData.getRelationshipKey())) { execution.setVariable("tenantId", relationshipData.getRelationshipValue()) } } - } else if (relatedTo == "cloud-region") { + } else if (("cloud-region").equals(relatedTo)) { List<RelationshipData> relationshipDataList = relationship.getRelationshipData() + for (RelationshipData relationshipData : relationshipDataList) { - if (relationshipData.getRelationshipKey() == "cloud-region.cloud-owner") { + if (("cloud-region.cloud-owner").equals(relationshipData.getRelationshipKey())) { execution.setVariable("cloudOwner", relationshipData.getRelationshipValue()) - } else if (relationshipData.getRelationshipKey() == "cloud-region.cloud-region-id") { + } else if (("cloud-region.cloud-region-id").equals(relationshipData.getRelationshipKey())) { execution.setVariable("lcpCloudRegionId", relationshipData.getRelationshipValue()) } } - } else if (relatedTo == "platform") { + } else if (("platform").equals(relatedTo)) { List<RelationshipData> relationshipDataList = relationship.getRelationshipData() for (RelationshipData relationshipData : relationshipDataList) { - if (relationshipData.getRelationshipKey() == "platform.platform-name") { + if (("platform.platform-name").equals(relationshipData.getRelationshipKey())) { execution.setVariable("platformName", relationshipData.getRelationshipValue()) } } - } else if (relatedTo == "line-of-business") { + } else if (("line-of-business").equals(relatedTo)) { List<RelationshipData> relationshipDataList = relationship.getRelationshipData() for (RelationshipData relationshipData : relationshipDataList) { - if (relationshipData.getRelationshipKey() == "line-of-business.line-of-business-name") { + if (("line-of-business.line-of-business-name").equals(relationshipData.getRelationshipKey())) { execution.setVariable("lineOfBusinessName", relationshipData.getRelationshipValue()) } } @@ -301,9 +299,16 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { logger.debug(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) } - logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: getVnfRelationships ****") + logger.debug(Prefix +" **** Exit DoAllocateCoreSharedSlice ::: getVnfRelationships ****") } + /** + * query AAI + * @param execution + * @param aaiObjectName + * @param instanceId + * @return AAIResultWrapper + */ private AAIResultWrapper queryAAI(DelegateExecution execution, AAIObjectName aaiObjectName, String instanceId, String errorMsg) { logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: queryAAI ****") String globalSubscriberId = execution.getVariable("globalSubscriberId") @@ -344,9 +349,7 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { public void prepareSOMacroRequestPayload(DelegateExecution execution) { logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: prepareSOMacroRequestPayLoad ****") String json = execution.getVariable("serviceVnfs") - logger.debug(">>>> json "+json) List<Object> vnfList = mapper.readValue(json, List.class); - logger.debug("vnfList: "+vnfList) Map<String,Object> serviceMap = mapper.readValue(execution.getVariable("serviceModelInfo"), Map.class); ModelInfo serviceModelInfo = new ModelInfo() serviceModelInfo.setModelType(ModelType.service) @@ -354,19 +357,12 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { serviceModelInfo.setModelVersionId(serviceMap.get("modelUuid")) serviceModelInfo.setModelName(serviceMap.get("modelName")) serviceModelInfo.setModelVersion(serviceMap.get("modelVersion")) - logger.debug("serviceModelInfo: "+serviceModelInfo) //List of Vnfs List<Object> vnfModelInfoList = new ArrayList<>() Map vnfMap = vnfList.get(0) - ModelInfo vnfModelInfo = vnfMap.get("modelInfo") - vnfModelInfo.setModelCustomizationId(vnfModelInfo.getModelCustomizationUuid()) - vnfModelInfo.setModelVersionId(vnfModelInfo.getModelId()) - logger.debug("vnfModelInfo "+vnfModelInfo) - //List of VFModules List<Map<String, Object>> vfModuleList = vnfMap.get("vfModules") - logger.debug("vfModuleList "+vfModuleList) //List of VfModules List<ModelInfo> vfModelInfoList = new ArrayList<>() @@ -376,16 +372,17 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { ModelInfo vfModelInfo = vfModule.get("modelInfo") vfModelInfo.setModelCustomizationId(vfModelInfo.getModelCustomizationUuid()) vfModelInfo.setModelVersionId(vfModelInfo.getModelId()) - logger.debug("vfModelInfo "+vfModelInfo) vfModelInfoList.add(vfModelInfo) } + + String networkServiceInstanceName = execution.getVariable("networkServiceInstanceName") //RequestInfo RequestInfo requestInfo = new RequestInfo() //Dummy Product FamilyId requestInfo.setProductFamilyId("test1234") requestInfo.setSource("VID") - requestInfo.setInstanceName(execution.getVariable("networkServiceInstanceName")) + requestInfo.setInstanceName(networkServiceInstanceName) requestInfo.setSuppressRollback(false) requestInfo.setRequestorId("NBI") @@ -395,10 +392,13 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { serviceParams.add(serviceParamsValues) //Cloud Configuration + String lcpCloudRegionId = execution.getVariable("lcpCloudRegionId") + String tenantId = execution.getVariable("tenantId") + String cloudOwner = execution.getVariable("cloudOwner") CloudConfiguration cloudConfiguration = new CloudConfiguration() - cloudConfiguration.setLcpCloudRegionId(execution.getVariable("lcpCloudRegionId")) - cloudConfiguration.setTenantId(execution.getVariable("tenantId")) - cloudConfiguration.setCloudOwner(execution.getVariable("cloudOwner")) + cloudConfiguration.setLcpCloudRegionId(lcpCloudRegionId) + cloudConfiguration.setTenantId(tenantId) + cloudConfiguration.setCloudOwner(cloudOwner) //VFModules List List<Map<String, Object>> vfModules = new ArrayList<>() @@ -415,8 +415,6 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { } //Vnf intsanceParams - Map<String, Object> sliceProfile = mapper.readValue(execution.getVariable("sliceProfile"), Map.class); - List<Map<String, Object>> vnfInstanceParamsList = new ArrayList<>() String supportedsNssaiJson= prepareVnfInstanceParamsJson(execution) @@ -425,13 +423,17 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { vnfInstanceParamsList.add(supportedNssai) Platform platform = new Platform() - String platformName = execution.getVariable("platformName") + String platformName = execution.getVariable("platformName") platform.setPlatformName(platformName) LineOfBusiness lineOfbusiness = new LineOfBusiness() String lineOfBusinessName = execution.getVariable("lineOfBusinessName") lineOfbusiness.setLineOfBusinessName(lineOfBusinessName) + ModelInfo vnfModelInfo = vnfMap.get("modelInfo") + vnfModelInfo.setModelCustomizationId(vnfModelInfo.getModelCustomizationUuid()) + vnfModelInfo.setModelVersionId(vnfModelInfo.getModelId()) + //Vnf Values Map<String, Object> vnfValues = new LinkedHashMap<>() vnfValues.put("lineOfBusiness", lineOfbusiness) @@ -449,9 +451,10 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { serviceResources.put("vnfs", vnfModelInfoList) //Service Values + String serviceInstanceName = execution.getVariable("networkServiceInstanceName") Map<String, Object> serviceValues = new LinkedHashMap<>() serviceValues.put("modelInfo", serviceModelInfo) - serviceValues.put("instanceName", execution.getVariable("networkServiceInstanceName")) + serviceValues.put("instanceName", serviceInstanceName) serviceValues.put("resources", serviceResources) serviceValues.put("instanceParams", serviceParams) @@ -469,22 +472,26 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { userParams.add(userParamsValues) //Request Parameters + String serviceType = execution.getVariable("serviceType") RequestParameters requestParameters = new RequestParameters() requestParameters.setaLaCarte(false) - requestParameters.setSubscriptionServiceType(execution.getVariable("serviceType")) + requestParameters.setSubscriptionServiceType(serviceType) requestParameters.setUserParams(userParams) //SubscriberInfo + String globalSubscriberId = execution.getVariable("globalSubscriberId") SubscriberInfo subscriberInfo = new SubscriberInfo() - subscriberInfo.setGlobalSubscriberId(execution.getVariable("globalSubscriberId")) + subscriberInfo.setGlobalSubscriberId(globalSubscriberId) //Owning Entity + String owningEntityId = execution.getVariable("owningEntityId") OwningEntity owningEntity = new OwningEntity() - owningEntity.setOwningEntityId(execution.getVariable("owningEntityId")) + owningEntity.setOwningEntityId(owningEntityId) //Project + String projectName = execution.getVariable("projectName") Project project = new Project() - project.setProjectName(execution.getVariable("projectName")) + project.setProjectName(projectName) RequestDetails requestDetails = new RequestDetails() requestDetails.setModelInfo(serviceModelInfo) @@ -500,17 +507,16 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { String requestPayload = mapper.writeValueAsString(requestDetailsMap) logger.debug("requestDetails "+requestPayload) execution.setVariable("requestPayload", requestPayload) + logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: prepareSOMacroRequestPayLoad ****") } private String prepareVnfInstanceParamsJson(DelegateExecution execution) { - logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: prepareVnfInstanceParamsJson ****") + logger.debug(Prefix +" **** Enter DoAllocateCoreSharedSlice ::: prepareVnfInstanceParamsJson ****") List instanceParamsvalues = execution.getVariable("snssaiAndOrchStatusList") Map<String, Object> nSsai= new LinkedHashMap<>() nSsai.put("sNssai", instanceParamsvalues) String supportedsNssaiJson = mapper.writeValueAsString(nSsai) - //SupportedNssai - logger.debug("**** supportedsNssaiJson**** "+supportedsNssaiJson) logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: prepareVnfInstanceParamsJson ****") return supportedsNssaiJson } @@ -519,9 +525,13 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: sendPutRequestToSOMacro ****") try { String msoEndpoint = UrnPropertiesReader.getVariable("mso.infra.endpoint.url", execution) - String url = msoEndpoint+"/serviceInstantiation/v7/serviceInstances/"+execution.getVariable("networkServiceInstanceId")+"/vnfs/"+execution.getVariable("vnfId") + String networkServiceInstanceId = execution.getVariable("networkServiceInstanceId") + String vnfId = execution.getVariable("vnfId") + String url = msoEndpoint+"/serviceInstantiation/v7/serviceInstances/"+networkServiceInstanceId+"/vnfs/"+vnfId String requestBody = execution.getVariable("requestPayload") - String encodeString = "Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==" + String msoKey = UrnPropertiesReader.getVariable("mso.msoKey", execution) + String basicAuth = UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution) + String encodeString = utils.getBasicAuth(basicAuth, msoKey) logger.debug("msoEndpoint: "+msoEndpoint +" "+ "url: "+url +" requestBody: "+requestBody +" "+ "encodeString: "+encodeString) HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO) httpClient.addAdditionalHeader("Authorization", encodeString) @@ -531,24 +541,28 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { } catch (BpmnError e) { throw e } catch (any) { - String msg = Prefix+" Exception in DoAllocateCoreSharedSlice " + any.getCause() + String msg = Prefix+" Exception in DoAllocate Shared " + any.getCause() logger.error(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) } logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: sendPostRequestToSOMacro ****") } + /** + * Handle SO Response for PUT and prepare update operation status + * @param execution + */ private void handleSOResponse(Response httpResponse, DelegateExecution execution){ logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: handleSOResponse ****") + int soResponseCode = httpResponse.getStatus() logger.debug("soResponseCode : "+soResponseCode) if (soResponseCode >= 200 && soResponseCode < 204 && httpResponse.hasEntity()) { String soResponse = httpResponse.readEntity(String.class) logger.debug("soResponse: "+soResponse) - logger.debug("soResponse JsonUtil: "+jsonUtil.getJsonValue(soResponse, "requestReferences.requestId")) - def macroOperationId = jsonUtil.getJsonValue(soResponse, "requestReferences.requestId") - def requestSelfLink = jsonUtil.getJsonValue(soResponse, "requestReferences.requestSelfLink") + String macroOperationId = jsonUtil.getJsonValue(soResponse, "requestReferences.requestId") + String requestSelfLink = jsonUtil.getJsonValue(soResponse, "requestReferences.requestSelfLink") execution.setVariable("macroOperationId", macroOperationId) execution.setVariable("requestSelfLink", requestSelfLink) execution.setVariable("isSOTimeOut", "no") @@ -564,10 +578,11 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { public void getSOPUTProgress(DelegateExecution execution) { logger.debug(Prefix+ " **** Enter DoAllocateCoreSharedSlice ::: getSOPUTProgress ****") String url= execution.getVariable("requestSelfLink") - logger.debug("url "+url) HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO) - //Hardcoding for now, will be updated in next patch - httpClient.addAdditionalHeader("Authorization", "Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==") + String msoKey = UrnPropertiesReader.getVariable("mso.msoKey", execution) + String basicAuth = UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution) + String encodeString = utils.getBasicAuth(basicAuth, msoKey) + httpClient.addAdditionalHeader("Authorization", encodeString) httpClient.addAdditionalHeader("Accept", "application/json") Response httpResponse = httpClient.get() logger.debug("httpResponse "+httpResponse) @@ -586,71 +601,80 @@ class DoAllocateCoreSharedSlice extends AbstractServiceTaskProcessor { logger.debug(Prefix+ " **** Exit DoAllocateCoreSharedSlice ::: getSOPUTProgress ****") } - public void timeDelay(DelegateExecution execution) { + public void timeDelay() { try { logger.debug(Prefix+ " **** DoAllocateCoreSharedSlice ::: timeDelay going to sleep for 5 sec") Thread.sleep(5000) - logger.debug("**** DoAllocateCoreNonSharedSlice ::: timeDelay wakeup after 5 sec") + logger.debug("**** DoActivateCoreNSSI ::: timeDelay wakeup after 5 sec") } catch(InterruptedException e) { logger.error(Prefix+ " **** DoAllocateCoreSharedSlice ::: timeDelay exception" + e) } - } + } void prepareUpdateResourceOperationStatus(DelegateExecution execution) { logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: prepareUpdateResourceOperationStatus ****") //Prepare Update Status for PUT failure and success - if("COMPLETED".equals(execution.getVariable("requestState"))) { + if(execution.getVariable("isTimeOut").equals("YES")) { + logger.debug("TIMEOUT - SO PUT Failure") + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "SO PUT Failure") + } else { execution.setVariable("progress", "100") execution.setVariable("status", "finished") - execution.setVariable("operationContent", "AllocteCoreNSSI successful.") - logger.debug("Success ,result:${execution.getVariable("result")}, reason: ${execution.getVariable("reason")}") - } else { - logger.debug("SO PUT Failure") - exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "SO PUT Failure") + execution.setVariable("operationContent", "AllocteCoreNSSI Shared successful.") + logger.debug("prepareFailureStatus,result:${execution.getVariable("result")}, reason: ${execution.getVariable("reason")}") } setResourceOperationStatus(execution) logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: prepareUpdateResourceOperationStatus ****") } + /** + * prepare ResourceOperation status + * @param execution + * @param operationType + */ private void setResourceOperationStatus(DelegateExecution execution) { logger.debug(Prefix+" **** Enter DoAllocateCoreSharedSlice ::: setResourceOperationStatus ****") - String serviceId = execution.getVariable("nssiId") + String serviceId = execution.getVariable("nsiId") String jobId = execution.getVariable("jobId") - String nsiId = execution.getVariable("nsiId") - String operationType = execution.getVariable("operationType") - logger.debug("serviceId: "+serviceId +" "+ " jobId: "+jobId +" "+ " nsiId: "+nsiId+" nssiId: "+nssiId+" operationType: "+operationType) + String nssiId = execution.getVariable("nssiId") + String operationType = "ALLOCATE" + String modelUuid= execution.getVariable("modelUuid") ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus() resourceOperationStatus.setServiceId(serviceId) + resourceOperationStatus.setJobId(jobId) resourceOperationStatus.setOperationId(jobId) - resourceOperationStatus.setResourceTemplateUUID(nsiId) - resourceOperationStatus.setResourceInstanceID(nssiId) + resourceOperationStatus.setResourceTemplateUUID(modelUuid) + resourceOperationStatus.setResourceInstanceID(nssiId) resourceOperationStatus.setOperType(operationType) - resourceOperationStatus.setStatus("finished") - resourceOperationStatus.setProgress("100") - resourceOperationStatus.setStatusDescription("Core Allocate successful") + resourceOperationStatus.setStatus(execution.getVariable("status")) + resourceOperationStatus.setProgress(execution.getVariable("progress")) + resourceOperationStatus.setStatusDescription(execution.getVariable("statusDescription")) requestDBUtil.prepareUpdateResourceOperationStatus(execution, resourceOperationStatus) logger.debug(Prefix+" **** Exit DoAllocateCoreSharedSlice ::: setResourceOperationStatus ****") } void prepareFailedOperationStatusUpdate(DelegateExecution execution){ logger.debug(Prefix + " **** Enter DoAllocateCoreSharedSlice ::: prepareFailedOperationStatusUpdate ****") - String serviceId = execution.getVariable("nsiId") + String serviceId = execution.getVariable("nsiId") String jobId = execution.getVariable("jobId") - String nsiId = execution.getVariable("nsiId") + String nssiId = execution.getVariable("nssiId") String operationType = "ALLOCATE" - logger.debug("serviceId: "+serviceId +" "+ " jobId: "+jobId +" "+ " nsiId: "+nsiId+" operationType: "+operationType) + //modelUuid String modelUuid= execution.getVariable("modelUuid") + logger.debug("serviceId: {}, jobId: {}, nssiId: {}, operationType: {}.", serviceId, jobId, nssiId, operationType) ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus() resourceOperationStatus.setServiceId(serviceId) resourceOperationStatus.setJobId(jobId) resourceOperationStatus.setOperationId(jobId) + resourceOperationStatus.setResourceInstanceID(nssiId) resourceOperationStatus.setResourceTemplateUUID(modelUuid) resourceOperationStatus.setOperType(operationType) resourceOperationStatus.setProgress("0") resourceOperationStatus.setStatus("failed") - resourceOperationStatus.setStatusDescription("Core NSSI Allocate Failed") + resourceOperationStatus.setStatusDescription("Core NSSI Shared Allocate Failed") requestDBUtil.prepareUpdateResourceOperationStatus(execution, resourceOperationStatus) logger.debug(Prefix + " **** Exit DoAllocateCoreSharedSlice ::: prepareFailedOperationStatusUpdate ****") } -}
\ No newline at end of file +} + diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateTnNssiInstance.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateTnNssiInstance.groovy index 9221067cce..dd168519e5 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateTnNssiInstance.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateTnNssiInstance.groovy @@ -297,7 +297,7 @@ class DoCreateTnNssiInstance extends AbstractServiceTaskProcessor { List<String> linkStrList = jsonUtil.StringArrayToList(linkArrayStr) for (String linkStr : linkStrList) { - String linkId = jsonUtil.getJsonValue(linkStr, "id") + String linkId = jsonUtil.getJsonValue(linkStr, "name") if (isBlank(linkId)) { linkId = "tn-nssmf-" + UUID.randomUUID().toString() } diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyAccessNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyAccessNSSI.groovy index 8695946fd6..8859af25f6 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyAccessNSSI.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyAccessNSSI.groovy @@ -28,6 +28,8 @@ import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils import org.onap.so.bpmn.common.scripts.OofUtils import org.onap.so.bpmn.common.scripts.RequestDBUtil import org.onap.so.bpmn.core.json.JsonUtils +import org.onap.so.beans.nsmf.PerfReqEmbb +import org.onap.so.beans.nsmf.PerfReq import org.onap.so.db.request.beans.ResourceOperationStatus import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -47,6 +49,9 @@ import org.onap.aai.domain.yang.Relationship import org.onap.aai.domain.yang.ServiceInstance import org.onap.aai.domain.yang.SliceProfile import org.onap.aai.domain.yang.SliceProfiles +import org.onap.aai.domain.yang.AllottedResource +import org.onap.aai.domain.yang.AllottedResources +import org.onap.aaiclient.client.graphinventory.entities.uri.Depth import org.onap.aaiclient.client.aai.entities.uri.AAISimplePluralUri import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.databind.SerializationFeature @@ -231,8 +236,28 @@ class DoModifyAccessNSSI extends AbstractServiceTaskProcessor { Map<String, Object> profileInfo = objectMapper.readValue(execution.getVariable("RANSliceProfile"), Map.class) ServiceInstance ranSliceProfileInstance = execution.getVariable("ranSliceProfileInstance") profileInfo.put("sST",ranSliceProfileInstance.getServiceType()) - profileInfo.put("snssaiList",ranSliceProfileInstance.getEnvironmentContext()) - profileInfo.put("plmnIdList",ranSliceProfileInstance.getServiceInstanceLocationId()) + profileInfo.put("snssaiList",execution.getVariable("snssaiList")) + profileInfo.put("plmnIdList",Arrays.asList(ranSliceProfileInstance.getServiceInstanceLocationId())) + profileInfo.put("uEMobilityLevel",profileInfo.get("ueMobilityLevel")) + profileInfo.put("cSAvailabilityTarget",profileInfo.get("csAvailabilityTarget")) + profileInfo.put("maxNumberofPDUSession",profileInfo.get("maxNumberOfPDUSession")) + profileInfo.put("maxNumberofUEs",profileInfo.get("maxNumberOfUEs")) + + PerfReq perfReq = new PerfReq(); + List<PerfReqEmbb> perfReqEmbbs = new ArrayList<>(); + PerfReqEmbb perfReqEmbb = new PerfReqEmbb(); + perfReqEmbb.setExpDataRateDL(profileInfo.get("expDataRateDL")); + perfReqEmbb.setExpDataRateUL(profileInfo.get("expDataRateUL")); + perfReqEmbbs.add(perfReqEmbb); + perfReq.setPerfReqEmbbList(perfReqEmbbs); + profileInfo.put("perfReq",perfReq) + + profileInfo.remove("maxNumberOfUEs") + profileInfo.remove("resourceVersion") + profileInfo.remove("csAvailabilityTarget") + profileInfo.remove("ueMobilityLevel") + profileInfo.remove("maxNumberOfPDUSession") + profileInfo.remove("profileId") String modelUuid = ranSliceProfileInstance.getModelVersionId() String modelInvariantUuid = ranSliceProfileInstance.getModelInvariantId() String modelName = execution.getVariable("servicename") @@ -308,23 +333,25 @@ class DoModifyAccessNSSI extends AbstractServiceTaskProcessor { logger.debug("getNssisFromAai ranConstituentNssis : "+ranConstituentNssis.toString()) ranConstituentNssis.each { key, val -> switch(key) { - case "AN-NF": + case "AN_NF": execution.setVariable("ANNF_NSSI", val.getServiceInstanceId()) execution.setVariable("ANNF_nssiName", val.getServiceInstanceName()) execution.setVariable("ANNF_modelInvariantUuid", val.getModelInvariantId()) execution.setVariable("ANNF_modelUuid", val.getModelVersionId()) break - case "TN-FH": + case "TN_FH": execution.setVariable("TNFH_NSSI", val.getServiceInstanceId()) execution.setVariable("TNFH_nssiName", val.getServiceInstanceName()) execution.setVariable("TNFH_modelInvariantUuid", val.getModelInvariantId()) execution.setVariable("TNFH_modelUuid", val.getModelVersionId()) + getConnectionLinks(execution, key, val) break - case "TN-MH": + case "TN_MH": execution.setVariable("TNMH_NSSI", val.getServiceInstanceId()) execution.setVariable("TNMH_nssiName", val.getServiceInstanceName()) execution.setVariable("TNMH_modelInvariantUuid", val.getModelInvariantId()) execution.setVariable("TNMH_modelUuid", val.getModelVersionId()) + getConnectionLinks(execution, key, val) break default: logger.error("No expected match found for current domainType "+ key) @@ -333,6 +360,50 @@ class DoModifyAccessNSSI extends AbstractServiceTaskProcessor { } } + + private void getConnectionLinks(DelegateExecution execution, String domainType, ServiceInstance instance) { + AllottedResources allottedResources = instance.getAllottedResources() + if(allottedResources == null) { + String msg = "AllottedResourceFromAAI doesn't exist. " + instance + logger.debug(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) + } + + List<AllottedResource> AllottedResourceList = allottedResources.getAllottedResource() + for(AllottedResource allottedResource : AllottedResourceList) { + List<Relationship> relationshipList = allottedResource.getRelationshipList().getRelationship() + for (Relationship relationship : relationshipList) { + String relatedTo = relationship.getRelatedTo() + if (relatedTo.toLowerCase() == "logical-link") { + String relatioshipurl = relationship.getRelatedLink() + String logicalLinkId= + relatioshipurl.substring(relatioshipurl.lastIndexOf("/") + 1, relatioshipurl.length()) + AAIResourcesClient client = new AAIResourcesClient() + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().logicalLink(logicalLinkId)) + if (!client.exists(uri)) { + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, + "Resource was not found in aai: ${logicalLinkId}") + } + AAIResultWrapper wrapper01 = client.get(uri, NotFoundException.class) + Optional<org.onap.aai.domain.yang.LogicalLink> resource = wrapper01.asBean(org.onap.aai.domain.yang.LogicalLink.class) + if (resource.isPresent()) { + org.onap.aai.domain.yang.LogicalLink logicalLinkInstance = resource.get() + if(domainType.equalsIgnoreCase("TN-FH")) + { + execution.setVariable("tranportEp_ID_RU",logicalLinkInstance.getLinkName()) + execution.setVariable("tranportEp_ID_DUIN",logicalLinkInstance.getLinkName2()) + } + else if(domainType.equalsIgnoreCase("TN-MH")) + { + execution.setVariable("tranportEp_ID_DUEG",logicalLinkInstance.getLinkName()) + execution.setVariable("tranportEp_ID_CUIN",logicalLinkInstance.getLinkName2()) + } + } + } + } + } + } + def createSliceProfiles = { DelegateExecution execution -> logger.debug(Prefix+"createSliceProfiles method start") anNssmfUtils.createSliceProfilesInAai(execution) @@ -446,8 +517,6 @@ class DoModifyAccessNSSI extends AbstractServiceTaskProcessor { JsonObject serviceInfo = new JsonObject() serviceInfo.addProperty("nsiId", execution.getVariable("nsiId")) - String sST = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST") - serviceInfo.addProperty("sST", sST) serviceInfo.addProperty("PLMNIdList", objectMapper.writeValueAsString(execution.getVariable("plmnIdList"))) serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId")) serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType")) @@ -506,13 +575,13 @@ class DoModifyAccessNSSI extends AbstractServiceTaskProcessor { logger.debug("getSliceProfilesFromAai ranConstituentSliceProfiles : "+ranConstituentSliceProfiles.toString()) ranConstituentSliceProfiles.each { key, val -> switch(key) { - case "AN-NF": + case "AN_NF": execution.setVariable("ANNF_sliceProfileInstanceId", val.getServiceInstanceId()) break - case "TN-FH": + case "TN_FH": execution.setVariable("TNFH_sliceProfileInstanceId", val.getServiceInstanceId()) break - case "TN-MH": + case "TN_MH": execution.setVariable("TNMH_sliceProfileInstanceId", val.getServiceInstanceId()) break default: @@ -655,7 +724,7 @@ class DoModifyAccessNSSI extends AbstractServiceTaskProcessor { exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai: ${serviceInstanceId} related to ${instanceId}") } - AAIResultWrapper wrapper01 = client01.get(uri01, NotFoundException.class) + AAIResultWrapper wrapper01 = client01.get(uri01.depth(Depth.TWO), NotFoundException.class) Optional<ServiceInstance> serviceInstance = wrapper01.asBean(ServiceInstance.class) if (serviceInstance.isPresent()) { ServiceInstance instance = serviceInstance.get() diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyRanNfNssi.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyRanNfNssi.groovy index bb8e516c3b..10846d4cfa 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyRanNfNssi.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyRanNfNssi.groovy @@ -28,6 +28,7 @@ import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor import org.onap.so.bpmn.common.scripts.ExceptionUtil import org.onap.so.bpmn.core.json.JsonUtils import com.fasterxml.jackson.databind.ObjectMapper +import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.JsonParser import java.time.Instant @@ -114,7 +115,7 @@ class DoModifyRanNfNssi extends AbstractServiceTaskProcessor { logger.debug(Prefix+"createSdnrRequest method start") String callbackUrl = UrnPropertiesReader.getVariable("mso.workflow.message.endpoint") + "/AsyncSdnrResponse/"+execution.getVariable("msoRequestId") String modifyAction = execution.getVariable("modifyAction") - String sdnrRequest = buildSdnrAllocateRequest(execution, modifyAction, "InstantiateRANSlice", callbackUrl) + String sdnrRequest = buildSdnrAllocateRequest(execution, modifyAction, "instantiateRANSlice", callbackUrl) execution.setVariable("createNSSI_sdnrRequest", sdnrRequest) execution.setVariable("createNSSI_timeout", "PT10M") execution.setVariable("createNSSI_correlator", execution.getVariable("msoRequestId")) @@ -152,7 +153,7 @@ class DoModifyRanNfNssi extends AbstractServiceTaskProcessor { if(action.equals("allocate")) { sliceProfile = objectMapper.readValue(execution.getVariable("sliceProfile"), Map.class) sliceProfile.put("sliceProfileId", execution.getVariable("sliceProfileId")) - sliceProfile.put("maxNumberofConns", sliceProfile.get("maxNumberofPDUSessions")) + sliceProfile.put("maxNumberofConns", sliceProfile.get("maxNumberofPDUSession")) sliceProfile.put("uLThptPerSlice", sliceProfile.get("expDataRateUL")) sliceProfile.put("dLThptPerSlice", sliceProfile.get("expDataRateDL")) action = "modify-"+action @@ -174,9 +175,12 @@ class DoModifyRanNfNssi extends AbstractServiceTaskProcessor { commonHeader.addProperty("request-id", requestId) commonHeader.addProperty("sub-request-id", "1") commonHeader.add("flags", new JsonObject()) - payloadInput.addProperty("sliceProfile", sliceProfile.toString()) + Gson jsonConverter = new Gson() + payloadInput.add("sliceProfile", jsonConverter.toJsonTree(sliceProfile)) payloadInput.addProperty("RANNFNSSIId", execution.getVariable("serviceInstanceID")) payloadInput.addProperty("callbackURL", callbackUrl) + payloadInput.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId")) + payloadInput.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType")) payload.add("input", payloadInput) input.add("common-header", commonHeader) input.addProperty("action", action) diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssi.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssi.groovy index 9440b42124..25cb2f57f6 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssi.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssi.groovy @@ -24,7 +24,11 @@ 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.* +import org.onap.aai.domain.yang.AllottedResource +import org.onap.aai.domain.yang.AllottedResources +import org.onap.aai.domain.yang.NetworkPolicy +import org.onap.aai.domain.yang.ServiceInstance +import org.onap.aai.domain.yang.SliceProfile 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 @@ -38,7 +42,9 @@ import org.onap.so.db.request.beans.ResourceOperationStatus import org.slf4j.Logger import org.slf4j.LoggerFactory -import static org.apache.commons.lang3.StringUtils.* +import static org.apache.commons.lang3.StringUtils.isBlank +import static org.apache.commons.lang3.StringUtils.isEmpty +import static org.apache.commons.lang3.StringUtils.isNotBlank public class DoModifyTnNssi extends AbstractServiceTaskProcessor { String Prefix = "TNMOD_" @@ -150,26 +156,31 @@ public class DoModifyTnNssi extends AbstractServiceTaskProcessor { AAIResourceUri ssServiceuri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(serviceInstanceId)) try { - if (resourceClient.exists(ssServiceuri)) { - ServiceInstance ss = resourceClient.get(ServiceInstance.class, ssServiceuri) - - AllottedResources ars = ss.getAllottedResources() - List<AllottedResource> arList = ars.getAllottedResource() - List<String> arIdList = new ArrayList<>() - Map<String, String> policyMap = new HashMap<>() - Map<String, List<String>> logicalLinksMap = new HashMap<>() - for (AllottedResource ar : arList) { - String arId = ar.getId() - arIdList.add(arId) - String policyId = tnNssmfUtils.getPolicyIdFromAr(execution, serviceInstanceId, arId, true) - policyMap.put(arId, policyId) - List<String> logicalLinkList = tnNssmfUtils.getLogicalLinkNamesFromAr(execution, - serviceInstanceId, arId, true) - logicalLinksMap.put(arId, logicalLinkList) + Optional<ServiceInstance> ssOpt = resourceClient.get(ServiceInstance.class, ssServiceuri) + if (ssOpt.isPresent()) { + ServiceInstance ss = ssOpt.get() + AllottedResources ars = tnNssmfUtils.getAllottedResourcesFromAai(execution, serviceInstanceId, true) + if (ars != null) { + List<AllottedResource> arList = ars.getAllottedResource() + List<String> arIdList = new ArrayList<>() + Map<String, String> policyMap = new HashMap<>() + Map<String, List<String>> logicalLinksMap = new HashMap<>() + for (AllottedResource ar : arList) { + String arId = ar.getId() + arIdList.add(arId) + String policyId = tnNssmfUtils.getPolicyIdFromAr(execution, serviceInstanceId, arId, true) + policyMap.put(arId, policyId) + List<String> logicalLinkList = tnNssmfUtils.getLogicalLinkNamesFromAr(execution, + serviceInstanceId, arId, true) + logicalLinksMap.put(arId, logicalLinkList) + } + execution.setVariable("arIdList", arIdList) + execution.setVariable("arPolicyMap", policyMap) + execution.setVariable("arLogicalLinkMap", logicalLinksMap) + } else { + logger.error("ERROR: getExistingServiceInstance: getAllottedResources() returned null. ss=" + ss + .toString()) } - execution.setVariable("arIdList", arIdList) - execution.setVariable("arPolicyMap", policyMap) - execution.setVariable("arLogicalLinkMap", logicalLinksMap) } else { exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service instance was not found in aai to " + "associate allotted resource for service :" + serviceInstanceId) @@ -177,7 +188,7 @@ public class DoModifyTnNssi extends AbstractServiceTaskProcessor { } catch (BpmnError e) { throw e; } catch (Exception ex) { - String msg = "Exception in getServiceInstance. " + ex.getMessage() + String msg = "Exception in getExistingServiceInstance. " + ex.getMessage() logger.debug(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) } @@ -195,6 +206,7 @@ public class DoModifyTnNssi extends AbstractServiceTaskProcessor { //ss.setServiceInstanceId(ssInstanceId) String serviceStatus = "modified" ss.setOrchestrationStatus(serviceStatus) + ss.setEnvironmentContext("tn") AAIResourcesClient client = getAAIClient() AAIResourceUri uri = AAIUriFactory.createResourceUri( AAIFluentTypeBuilder.business() @@ -279,14 +291,15 @@ public class DoModifyTnNssi extends AbstractServiceTaskProcessor { void updateLogicalLinksInNetwork(DelegateExecution execution, String networkJsonStr) { try { - String arId = getValidArId(jsonUtil.getJsonValue(networkJsonStr, "id")) + String arId = getValidArId(execution, jsonUtil.getJsonValue(networkJsonStr, "id")) String linkArrayStr = jsonUtil.getJsonValue(networkJsonStr, "connectionLinks") updateLogicalLinksInAr(execution, arId, linkArrayStr) } catch (BpmnError e) { throw e } catch (Exception ex) { - exceptionUtil.buildAndThrowWorkflowException(execution, 7000, - "Exception in updateLogicalLinksInNetwork" + ex.getMessage()) + String msg = String.format("ERROR: updateLogicalLinksInNetwork: exception: %s", ex.getMessage()) + logger.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); } } @@ -351,7 +364,7 @@ public class DoModifyTnNssi extends AbstractServiceTaskProcessor { try { int maxBw = getMaxBw(execution) - String arId = getValidArId(jsonUtil.getJsonValue(networkJsonStr, "id")) + String arId = getValidArId(execution, jsonUtil.getJsonValue(networkJsonStr, "id")) Map<String, String> policyMap = execution.getVariable("arPolicyMap") String policyId = policyMap.get(arId) if (isBlank(policyId)) { @@ -365,8 +378,9 @@ public class DoModifyTnNssi extends AbstractServiceTaskProcessor { } catch (BpmnError e) { throw e } catch (Exception ex) { - exceptionUtil.buildAndThrowWorkflowException(execution, 7000, - "Exception in updateNetworkPolicy" + ex.getMessage()) + String msg = String.format("ERROR: updateNetworkPolicy: exception: %s", ex.getMessage()) + logger.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg); } } @@ -428,7 +442,7 @@ public class DoModifyTnNssi extends AbstractServiceTaskProcessor { try { String serviceInstanceId = execution.getVariable("sliceServiceInstanceId") - String sdncRequest = tnNssmfUtils.buildSDNCRequest(execution, serviceInstanceId, "modify") + String sdncRequest = tnNssmfUtils.buildSDNCRequest(execution, serviceInstanceId, "update") execution.setVariable("TNNSSMF_SDNCRequest", sdncRequest) logger.debug("Outgoing SDNCRequest is: \n" + sdncRequest) @@ -483,6 +497,7 @@ public class DoModifyTnNssi extends AbstractServiceTaskProcessor { ResourceOperationStatus roStatus = tnNssmfUtils.buildRoStatus(modelUuid, ssInstanceId, jobId, nsiId, operType, status, progress, statusDescription) + logger.debug("prepareUpdateJobStatus: roStatus={}", roStatus) requestDBUtil.prepareUpdateResourceOperationStatus(execution, roStatus) } diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnNssmfUtils.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnNssmfUtils.groovy index 4624cdafe9..fc21ed4a5e 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnNssmfUtils.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnNssmfUtils.groovy @@ -22,17 +22,19 @@ package org.onap.so.bpmn.infrastructure.scripts import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution +import org.onap.aai.domain.yang.AllottedResources import org.onap.aai.domain.yang.LogicalLink import org.onap.aai.domain.yang.NetworkPolicy import org.onap.aai.domain.yang.Relationship import org.onap.aai.domain.yang.ServiceInstance import org.onap.aaiclient.client.aai.AAIResourcesClient +import org.onap.aaiclient.client.aai.AAIVersion import org.onap.aaiclient.client.aai.entities.AAIResultWrapper import org.onap.aaiclient.client.aai.entities.Relationships +import org.onap.aaiclient.client.aai.entities.uri.AAIPluralResourceUri import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder -import org.onap.aaiclient.client.generated.fluentbuilders.Activities import org.onap.so.bpmn.common.scripts.ExceptionUtil import org.onap.so.bpmn.common.scripts.MsoUtils import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils @@ -47,7 +49,7 @@ import org.slf4j.LoggerFactory import static org.apache.commons.lang3.StringUtils.isBlank class TnNssmfUtils { - static final String AAI_VERSION = "v23" + static final String AAI_VERSION = AAIVersion.LATEST private static final Logger logger = LoggerFactory.getLogger(TnNssmfUtils.class); @@ -91,6 +93,9 @@ class TnNssmfUtils { case "deactivate": reqAction = "DeactivateTransportSliceInstance" break + case "update": + reqAction = "ModifyTransportSliceInstance" + break default: reqAction = svcAction } @@ -433,7 +438,7 @@ class TnNssmfUtils { return null } - return si.modelVersionId() + return si.getModelVersionId() } AAIResourceUri buildNetworkPolicyUri(String networkPolicyId) { @@ -456,6 +461,52 @@ class TnNssmfUtils { return allottedResourceUri } + AAIPluralResourceUri buildAllottedResourcesUri(DelegateExecution execution, String serviceInstanceId) { + + AAIPluralResourceUri arsUri = + AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business() + .customer(execution.getVariable("globalSubscriberId")) + .serviceSubscription(execution.getVariable("subscriptionServiceType")) + .serviceInstance(serviceInstanceId) + .allottedResources()) + + return arsUri + } + + AllottedResources getAllottedResourcesFromAai(DelegateExecution execution, String serviceInstanceId, boolean exceptionOnErr) { + AllottedResources res + try { + AAIResourcesClient client = new AAIResourcesClient() + + AAIPluralResourceUri arsUri = buildAllottedResourcesUri(execution, serviceInstanceId) + + //AAIResultWrapper wrapperAllotted = client.get(arsUri, NotFoundException.class) + //Optional<AllottedResources> allAllotted = wrapperAllotted.asBean(AllottedResources.class) + //AllottedResources allottedResources = allAllotted.get() + + Optional<AllottedResources> arsOpt = client.get(AllottedResources.class, arsUri) + if (arsOpt.isPresent()) { + res = arsOpt.get() + return res + } else { + String msg = String.format("ERROR: getAllottedResourcesFromAai: ars not found. nssiId=%s", serviceInstanceId) + logger.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) + } + } catch (BpmnError e) { + if (exceptionOnErr) { + throw e; + } + } catch (Exception ex) { + if (exceptionOnErr) { + String msg = String.format("ERROR: getAllottedResourcesFromAai: %s", ex.getMessage()) + logger.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) + } + } + + return res + } String getPolicyIdFromAr(DelegateExecution execution, String serviceInstanceId, String arId, boolean exceptionOnErr) { @@ -464,15 +515,15 @@ class TnNssmfUtils { AAIResourcesClient client = new AAIResourcesClient() AAIResourceUri arUri = buildAllottedResourceUri(execution, serviceInstanceId, arId) - List<AAIResourceUri> logicalLinkUriList = getRelationshipUriListInAai(execution, arUri, + List<AAIResourceUri> policyUriList = getRelationshipUriListInAai(execution, arUri, AAIFluentTypeBuilder.Types.NETWORK_POLICY, exceptionOnErr) - for (AAIResourceUri logicalLinkUri : logicalLinkUriList) { - Optional<NetworkPolicy> policyOpt = client.get(NetworkPolicy.class, logicalLinkUri) + for (AAIResourceUri policyUri : policyUriList) { + Optional<NetworkPolicy> policyOpt = client.get(NetworkPolicy.class, policyUri) if (policyOpt.isPresent()) { NetworkPolicy policy = policyOpt.get() return policy.getNetworkPolicyId() } else { - String msg = String.format("ERROR: getLogicalLinkNamesFromAr: logicalLinkUri=%s", logicalLinkUri) + String msg = String.format("ERROR: getPolicyIdFromAr: arUri=%s", policyUri) logger.error(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) } @@ -483,7 +534,7 @@ class TnNssmfUtils { } } catch (Exception ex) { if (exceptionOnErr) { - String msg = String.format("ERROR: getLogicalLinkNamesFromAr: %s", ex.getMessage()) + String msg = String.format("ERROR: getPolicyIdFromAr: %s", ex.getMessage()) logger.error(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) } @@ -494,7 +545,8 @@ class TnNssmfUtils { List<AAIResourceUri> getRelationshipUriListInAai(DelegateExecution execution, - AAIResourceUri uri, Activities.Info info, + AAIResourceUri uri, + Object info, boolean exceptionOnErr) { AAIResourcesClient client = new AAIResourcesClient() AAIResultWrapper wrapper = client.get(uri); diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreNonSharedSliceTest.groovy b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreNonSharedSliceTest.groovy index fa1cef291e..dfbf93e3f6 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreNonSharedSliceTest.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreNonSharedSliceTest.groovy @@ -64,7 +64,7 @@ class DoAllocateCoreNonSharedSliceTest extends MsoGroovyTest { "sourceModelUuid" : "f3666c56-744e-4055-9f4a-0726460898e0" }""" - String sliceParams= """{\r\n\t\"sliceProfile\": {\r\n\t\t\"snssaiList\": [\r\n\t\t\t\"001-100001\"\r\n\t\t],\r\n\t\t\"sliceProfileId\": \"ab9af40f13f721b5f13539d87484098\",\r\n\t\t\"plmnIdList\": [\r\n\t\t\t\"460-00\",\r\n\t\t\t\"460-01\"\r\n\t\t],\r\n\t\t\"perfReq\": {\r\n\t\t\t\"perfReqEmbbList \": [{\r\n\t\t\t\t\"activityFactor\": 50\r\n\t\t\t}]\r\n\t\t},\r\n\t\t\"maxNumberofUEs\": 200,\r\n\t\t\"coverageAreaTAList\": [\r\n\t\t\t\"1\",\r\n\t\t\t\"2\",\r\n\t\t\t\"3\",\r\n\t\t\t\"4\"\r\n\t\t],\r\n\t\t\"latency\": 2,\r\n\t\t\"resourceSharingLevel\": \"non-shared\"\r\n\t},\r\n\t\"endPoints\": [{\r\n\t\t\"IpAdress\": \"\",\r\n\t\t\"LogicalLinkId\": \"\",\r\n\t\t\"nextHopInfo\": \"\"\r\n\t}],\r\n\t\"nsiInfo\": {\r\n\t\t\"nsiId\": \"NSI-M-001-HDBNJ-NSMF-01-A-ZX\",\r\n\t\t\"nsiName\": \"eMBB-001\"\r\n\t},\r\n\t\"scriptName\": \"AN1\"\r\n}""" + String sliceParams= """{\r\n\t\"sliceProfile\": {\r\n\t\t\"snssaiList\": [\r\n\t\t\t\"001-100001\"\r\n\t\t],\r\n\t\t\"sliceProfileId\": \"ab9af40f13f721b5f13539d87484098\",\r\n\t\t\"plmnIdList\": [\r\n\t\t\t\"460-00\",\r\n\t\t\t\"460-01\"\r\n\t\t],\r\n\t\t\"perfReq\": {\r\n\t\t\t\"perfReqEmbbList \": [{\r\n\t\t\t\t\"activityFactor\": 50\r\n\t\t\t}]\r\n\t\t},\r\n\t\t\"maxNumberofUEs\": 200,\r\n\t\t\"coverageAreaTAList\": [\r\n\t\t\t\"1\",\r\n\t\t\t\"2\",\r\n\t\t\t\"3\",\r\n\t\t\t\"4\"\r\n\t\t],\r\n\t\t\"latency\": 2,\r\n\t\t\"resourceSharingLevel\": \"non-shared\"\r\n\t},\r\n\t\"endPoint\": {\r\n\t\t\"ipAdress\": \"\",\r\n\t\t\"logicalInterfaceId\": \"\",\r\n\t\t\"nextHopInfo\": \"\"\r\n\t},\r\n\t\"nsiInfo\": {\r\n\t\t\"nsiId\": \"NSI-M-001-HDBNJ-NSMF-01-A-ZX\",\r\n\t\t\"nsiName\": \"eMBB-001\"\r\n\t},\r\n\t\"scriptName\": \"AN1\"\r\n}""" when(mockExecution.getVariable("serviceInstanceId")).thenReturn("123456") when(mockExecution.getVariable("networkServiceModelInfo")).thenReturn(networkServiceModelInfo) @@ -122,6 +122,8 @@ class DoAllocateCoreNonSharedSliceTest extends MsoGroovyTest { ObjectMapper objectMapper = new ObjectMapper() Map<String, Object> serviceCharacteristic = objectMapper.readValue(sliceProfile, Map.class); + //provide mock vnfInstance name + when(mockExecution.getVariable("vnfInstanceName")).thenReturn("vf00") DoAllocateCoreNonSharedSlice allocateNssi = new DoAllocateCoreNonSharedSlice() List characteristicList=allocateNssi.retrieveServiceCharacteristicsAsKeyValue(mockExecution, serviceCharacteristic) assertEquals(expectedList, characteristicList) diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreSharedSliceTest.groovy b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreSharedSliceTest.groovy index 9068692e30..34945b9135 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreSharedSliceTest.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateCoreSharedSliceTest.groovy @@ -59,17 +59,12 @@ class DoAllocateCoreSharedSliceTest extends MsoGroovyTest { @Test void testPreProcessRequest(){ - String solutions = """ [ - { - "invariantUUID": "y7685f64-5717-4562-b3fc-2c963f66afa6", - "UUID": "8u785f64-5717-4562-b3fc-2c963f66afa6", - "NSSIName": "embb-core-ser", - "NSSIId": "f4485f64-5717-4562-b3fc-2c963f66afa6", - "matchLevel": { - "blob":"content" - } - } - ]""" + String solutions = """ { + "NSSIId": "11c0c52a-d748-48aa-86e3-c783cbf5026f", + "invariantUUID": "8ebba719-f815-47e3-8473-c5f0db801356", + "NSSIName": "nssi_CN_NSST", + "UUID": "70e2b55b-8dca-4ff3-8f47-374c2965b731" + }""" String sliceProfile = "{\r\n \"snssaiList\": [ \r\n \"001-100001\"\r\n ],\r\n \"sliceProfileId\": \"ab9af40f13f721b5f13539d87484098\",\r\n \"plmnIdList\": [\r\n \"460-00\",\r\n \"460-01\"\r\n ],\r\n \"perfReq\": {\r\n \"perfReqEmbbList \": [\r\n {\r\n \"activityFactor\": 50\r\n }\r\n ]\r\n },\r\n \"maxNumberofUEs\": 200, \r\n \"coverageAreaTAList\": [ \r\n \"1\",\r\n \"2\",\r\n \"3\",\r\n \"4\"\r\n ],\r\n \"latency\": 2,\r\n \"resourceSharingLevel\": \"non-shared\" \r\n }" setUpBaseMockData() @@ -81,13 +76,13 @@ class DoAllocateCoreSharedSliceTest extends MsoGroovyTest { Mockito.verify(mockExecution, times(1)).setVariable(eq("nssiId"), captor.capture()) def nssiId = captor.getValue() - assertEquals("f4485f64-5717-4562-b3fc-2c963f66afa6", nssiId) + assertEquals("11c0c52a-d748-48aa-86e3-c783cbf5026f", nssiId) Mockito.verify(mockExecution, times(1)).setVariable(eq("sNssai"), captor.capture()) def sNssai = captor.getValue() assertEquals("001-100001", sNssai) - Mockito.verify(mockExecution,times(3)).setVariable(captor.capture() as String, captor.capture()) + Mockito.verify(mockExecution,times(4)).setVariable(captor.capture() as String, captor.capture()) List<ExecutionEntity> values = captor.getAllValues() assertNotNull(values) } @@ -155,6 +150,14 @@ class DoAllocateCoreSharedSliceTest extends MsoGroovyTest { //Check Vnf when(mockExecution.getVariable("vnfId")).thenReturn("eeb66c6f-36bd-47ad-8294-48f46b1aa912") + Map<String, Object> spiWithsNssaiAndOrchStatus = new LinkedHashMap<>() + spiWithsNssaiAndOrchStatus.put("snssai", "01-5C83F071") + spiWithsNssaiAndOrchStatus.put("status", "activated") + List <Map<String, Object>> spiWithsNssaiAndOrchStatusList = new ArrayList<>(); + spiWithsNssaiAndOrchStatusList.add(spiWithsNssaiAndOrchStatus) + //snssaiAndOrchStatusList + when(mockExecution.getVariable("snssaiAndOrchStatusList")).thenReturn(spiWithsNssaiAndOrchStatusList) + AAIResourceUri resourceUri3 = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().genericVnf(mockExecution.getVariable("vnfId"))) when(client.exists(resourceUri3)).thenReturn(true) AAIResultWrapper wrapper3 = new AAIResultWrapper(mockQueryVnf()) @@ -197,10 +200,7 @@ class DoAllocateCoreSharedSliceTest extends MsoGroovyTest { snssaiMap.put("snssai", "01-5C83F071") snssaiMap.put("status", "activated") snssaiList.add(snssaiMap) - Map<String, Object> snssaiMap1 = new LinkedHashMap<>() - snssaiMap1.put("snssai", "01-5B179BD4") - snssaiMap1.put("status", "activated") - snssaiList.add(snssaiMap1) + assertEquals(snssaiList, captor.getValue()) //Verify Project @@ -227,12 +227,12 @@ class DoAllocateCoreSharedSliceTest extends MsoGroovyTest { void setUpBaseMockData() { String sliceParams ="""{ - "nsiId": "NSI-M-001-HDBNJ-NSMF-01-A-ZX", - "snssaiList": [ - "01-5B179BD4" - ], - "sliceProfileId": "ab9af40f13f721b5f13539d87484098" - }""" + "nsiId": "NSI-M-001-HDBNJ-NSMF-01-A-ZX", + "snssaiList": [ + "01-5B179BD4" + ], + "sliceProfileId": "ab9af40f13f721b5f13539d87484098" + }""" when(mockExecution.getVariable("msoRequestId")).thenReturn("5ad89cf9-0569-4a93-4509-d8324321e2be") when(mockExecution.getVariable("serviceInstanceID")).thenReturn("NSSI-C-7Q4-HDBNJ-NSSMF-01-A-ZX") @@ -247,55 +247,55 @@ class DoAllocateCoreSharedSliceTest extends MsoGroovyTest { String mockQueryNS() { return """ - { - "service-instance-id": "206535e7-77c9-4036-9387-3f1cf57b4379", - "service-instance-name": "nsi_DemoEmbb", - "environment-context": "General_Revenue-Bearing", - "workload-context": "Production", - "model-invariant-id": "848c5656-5594-4d41-84bb-7afc7c64765c", - "model-version-id": "2de92587-3395-44e8-bb2c-b9529747e580", - "resource-version": "1599228110527", - "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/206535e7-77c9-4036-9387-3f1cf57b4379/service-data/service-topology/", - "orchestration-status": "Assigned", - "relationship-list": { - "relationship": [{ - "related-to": "owning-entity", - "relationship-label": "org.onap.relationships.inventory.BelongsTo", - "related-link": "/aai/v19/business/owning-entities/owning-entity/OE-generic", - "relationship-data": [{ - "relationship-key": "owning-entity.owning-entity-id", - "relationship-value": "OE-generic" - }] - }, { - "related-to": "generic-vnf", - "relationship-label": "org.onap.relationships.inventory.ComposedOf", - "related-link": "/aai/v19/network/generic-vnfs/generic-vnf/eeb66c6f-36bd-47ad-8294-48f46b1aa912", - "relationship-data": [{ - "relationship-key": "generic-vnf.vnf-id", - "relationship-value": "eeb66c6f-36bd-47ad-8294-48f46b1aa912" - }], - "related-to-property": [{ - "property-key": "generic-vnf.vnf-name", - "property-value": "vfwuctest 0" - }] - }, { - "related-to": "project", - "relationship-label": "org.onap.relationships.inventory.Uses", - "related-link": "/aai/v19/business/projects/project/Project-generic", - "relationship-data": [{ - "relationship-key": "project.project-name", - "relationship-value": "Project-generic" - }] - }] - } + { + "service-instance-id": "206535e7-77c9-4036-9387-3f1cf57b4379", + "service-instance-name": "nsi_DemoEmbb", + "environment-context": "General_Revenue-Bearing", + "workload-context": "Production", + "model-invariant-id": "848c5656-5594-4d41-84bb-7afc7c64765c", + "model-version-id": "2de92587-3395-44e8-bb2c-b9529747e580", + "resource-version": "1599228110527", + "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/206535e7-77c9-4036-9387-3f1cf57b4379/service-data/service-topology/", + "orchestration-status": "Assigned", + "relationship-list": { + "relationship": [{ + "related-to": "owning-entity", + "relationship-label": "org.onap.relationships.inventory.BelongsTo", + "related-link": "/aai/v19/business/owning-entities/owning-entity/OE-generic", + "relationship-data": [{ + "relationship-key": "owning-entity.owning-entity-id", + "relationship-value": "OE-generic" + }] + }, { + "related-to": "generic-vnf", + "relationship-label": "org.onap.relationships.inventory.ComposedOf", + "related-link": "/aai/v19/network/generic-vnfs/generic-vnf/eeb66c6f-36bd-47ad-8294-48f46b1aa912", + "relationship-data": [{ + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "eeb66c6f-36bd-47ad-8294-48f46b1aa912" + }], + "related-to-property": [{ + "property-key": "generic-vnf.vnf-name", + "property-value": "vfwuctest 0" + }] + }, { + "related-to": "project", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v19/business/projects/project/Project-generic", + "relationship-data": [{ + "relationship-key": "project.project-name", + "relationship-value": "Project-generic" + }] + }] + } } - """ + """ } String mockQueryVnf() { return """ - { + { "vnf-id": "eeb66c6f-36bd-47ad-8294-48f46b1aa912", "vnf-name": "vfwuctest 0", "vnf-type": "vfwuctest/null", @@ -379,7 +379,7 @@ class DoAllocateCoreSharedSliceTest extends MsoGroovyTest { }] } } - """ + """ } String mockQuerySliceServiceReturn(){ @@ -414,7 +414,7 @@ class DoAllocateCoreSharedSliceTest extends MsoGroovyTest { "property-value": "nsi_DemoEmbb" }] }, - { + { "related-to": "allotted-resource", "relationship-label": "org.onap.relationships.inventory.Uses", "related-link": "/aai/v19/business/customers/customer/5GCustomer/service-subscriptions/service-subscription/5G/service-instances/service-instance/0d3d3cce-46a8-486d-816a-954e71697c4e/allotted-resources/allotted-resource/d63c241a-4c0b-4294-b4c3-5a57421a1769", @@ -461,7 +461,7 @@ class DoAllocateCoreSharedSliceTest extends MsoGroovyTest { "property-value": "Allotted_DemoEmbb" }] } - ] + ] } } """ diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/resources/logback-test.xml b/bpmn/so-bpmn-infrastructure-common/src/test/resources/logback-test.xml index 38a2ef6ef5..7a8d2a122c 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/test/resources/logback-test.xml +++ b/bpmn/so-bpmn-infrastructure-common/src/test/resources/logback-test.xml @@ -1,7 +1,5 @@ <configuration> - - <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] |%X{RequestId}| %-5level @@ -10,7 +8,6 @@ </encoder> </appender> - <logger name="com.att.ecomp.audit" level="info" additivity="false"> <appender-ref ref="STDOUT" /> </logger> @@ -26,19 +23,19 @@ <logger name="org.onap" level="${so.log.level:-DEBUG}" additivity="false"> <appender-ref ref="STDOUT" /> </logger> - <logger name="ch.vorburger" level="WARN" additivity="false"> <appender-ref ref="STDOUT" /> </logger> - - <logger name="AUDIT" level="info" additivity="true"> + + <logger name="AUDIT" level="info" additivity="true"> <appender-ref ref="STDOUT" /> </logger> + <logger name="org.reflections" level="ERROR" /> + <root level="WARN"> <appender-ref ref="STDOUT" /> </root> - </configuration>
\ No newline at end of file diff --git a/bpmn/so-bpmn-infrastructure-flows/pom.xml b/bpmn/so-bpmn-infrastructure-flows/pom.xml index 0602522c67..4e44d94e64 100644 --- a/bpmn/so-bpmn-infrastructure-flows/pom.xml +++ b/bpmn/so-bpmn-infrastructure-flows/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>org.onap.so</groupId> <artifactId>bpmn</artifactId> - <version>1.8.0-SNAPSHOT</version> + <version>1.9.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>so-bpmn-infrastructure-flows</artifactId> diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/AllocateSliceSubnet.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/AllocateSliceSubnet.bpmn index 07077a1cab..4012467df9 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/AllocateSliceSubnet.bpmn +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/AllocateSliceSubnet.bpmn @@ -77,7 +77,8 @@ nss.sendSyncResponse(execution)</bpmn:script> <camunda:in source="jobId" target="jobId" /> <camunda:in source="sliceParams" target="sliceParams" /> <camunda:out source="WorkflowException" target="WorkflowException" /> - <camunda:in source="servicename" target="servicename" /> + <camunda:in source="servicename" target="servicename" /> + <camunda:in source="sst" target="sst" /> </bpmn:extensionElements> <bpmn:incoming>Flow_1kk0exp</bpmn:incoming> <bpmn:outgoing>Flow_09b50tn</bpmn:outgoing> @@ -105,7 +106,8 @@ nss.prepareInitOperationStatus(execution)</bpmn:script> <camunda:in source="jobId" target="jobId" /> <camunda:in source="sliceParams" target="sliceParams" /> <camunda:out source="WorkflowException" target="WorkflowException" /> - <camunda:in source="servicename" target="servicename" /> + <camunda:in source="servicename" target="servicename" /> + <camunda:in source="sst" target="sst" /> </bpmn:extensionElements> <bpmn:incoming>Flow_1fij4ds</bpmn:incoming> <bpmn:outgoing>Flow_1coedjo</bpmn:outgoing> diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoAllocateAccessNSSI.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoAllocateAccessNSSI.bpmn index 9b449013b1..9df7398f8c 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoAllocateAccessNSSI.bpmn +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoAllocateAccessNSSI.bpmn @@ -353,7 +353,7 @@ nss.createModifyNssiQueryJobStatus(execution)</bpmn:script> <camunda:in source="modifyRanNssiJobId" target="jobId" /> <camunda:in source="modifySliceParams" target="sliceParams" /> <camunda:out source="WorkflowException" target="WorkflowException" /> - <camunda:in source="servicename" target="servicename" /> + <camunda:in source="ranModelName" target="servicename" /> </bpmn:extensionElements> <bpmn:incoming>Flow_10j50jb</bpmn:incoming> <bpmn:outgoing>Flow_05s0wso</bpmn:outgoing> @@ -500,7 +500,7 @@ nss.prepareFailedOperationStatusUpdate(execution)</bpmn:script> <bpmn:extensionElements> <camunda:in source="msoRequestId" target="msoRequestId" /> <camunda:in source="globalSubscriberId" target="globalSubscriberId" /> - <camunda:in source="ANNF_NSSI" target="serviceInstanceID" /> + <camunda:in source="RANNFServiceInstanceId" target="serviceInstanceID" /> <camunda:in source="subscriptionServiceType" target="subscriptionServiceType" /> <camunda:in source="ANNF_sliceProfileInstanceId" target="sliceProfileId" /> <camunda:in source="snssaiList" target="snssaiList" /> diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoAllocateCoreSharedSlice.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoAllocateCoreSharedSlice.bpmn index 88902d1c91..4d9de6c9a8 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoAllocateCoreSharedSlice.bpmn +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoAllocateCoreSharedSlice.bpmn @@ -170,12 +170,28 @@ allocateNssi.prepareFailedOperationStatusUpdate(execution)</bpmn:script> <bpmn:outgoing>Flow_163kxug</bpmn:outgoing> <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* def allocateNssi = new DoAllocateCoreSharedSlice() -allocateNssi.timeDelay(execution)</bpmn:script> +allocateNssi.timeDelay()</bpmn:script> </bpmn:scriptTask> <bpmn:sequenceFlow id="Flow_163kxug" sourceRef="Activity_1qm4des" targetRef="Activity_0ge2y0l" /> </bpmn:process> <bpmndi:BPMNDiagram id="BPMNDiagram_1"> <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DoAllocateCoreSharedSlice"> + <bpmndi:BPMNEdge id="Flow_163kxug_di" bpmnElement="Flow_163kxug"> + <di:waypoint x="630" y="380" /> + <di:waypoint x="534" y="380" /> + <di:waypoint x="534" y="321" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1lzv4jo_di" bpmnElement="Flow_1lzv4jo"> + <di:waypoint x="680" y="306" /> + <di:waypoint x="680" y="340" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="591" y="299" width="78" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_15lksyg_di" bpmnElement="Flow_15lksyg"> + <di:waypoint x="705" y="281" /> + <di:waypoint x="778" y="281" /> + </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_1nn15tq_di" bpmnElement="Flow_1nn15tq"> <di:waypoint x="420" y="256" /> <di:waypoint x="420" y="200" /> @@ -259,22 +275,6 @@ allocateNssi.timeDelay(execution)</bpmn:script> <dc:Bounds x="207" y="179" width="90" height="12" /> </bpmndi:BPMNLabel> </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="Flow_15lksyg_di" bpmnElement="Flow_15lksyg"> - <di:waypoint x="705" y="281" /> - <di:waypoint x="778" y="281" /> - </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="Flow_1lzv4jo_di" bpmnElement="Flow_1lzv4jo"> - <di:waypoint x="680" y="306" /> - <di:waypoint x="680" y="340" /> - <bpmndi:BPMNLabel> - <dc:Bounds x="603" y="315" width="78" height="27" /> - </bpmndi:BPMNLabel> - </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="Flow_163kxug_di" bpmnElement="Flow_163kxug"> - <di:waypoint x="630" y="380" /> - <di:waypoint x="534" y="380" /> - <di:waypoint x="534" y="321" /> - </bpmndi:BPMNEdge> <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1"> <dc:Bounds x="248" y="102" width="36" height="36" /> <bpmndi:BPMNLabel> @@ -329,12 +329,6 @@ allocateNssi.timeDelay(execution)</bpmn:script> <dc:Bounds x="380" y="315.5" width="80" height="27" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="Gateway_1boyqt9_di" bpmnElement="Gateway_1boyqt9" isMarkerVisible="true"> - <dc:Bounds x="655" y="256" width="50" height="50" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="Activity_1iksno7_di" bpmnElement="Activity_1qm4des"> - <dc:Bounds x="630" y="340" width="100" height="80" /> - </bpmndi:BPMNShape> <bpmndi:BPMNShape id="Activity_08h38js_di" bpmnElement="Activity_08h38js" isExpanded="true"> <dc:Bounds x="250" y="440" width="781" height="196" /> </bpmndi:BPMNShape> @@ -369,6 +363,12 @@ allocateNssi.timeDelay(execution)</bpmn:script> <bpmndi:BPMNShape id="Activity_1btidug_di" bpmnElement="Activity_1btidug"> <dc:Bounds x="540" y="504" width="100" height="80" /> </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1boyqt9_di" bpmnElement="Gateway_1boyqt9" isMarkerVisible="true"> + <dc:Bounds x="655" y="256" width="50" height="50" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1iksno7_di" bpmnElement="Activity_1qm4des"> + <dc:Bounds x="630" y="340" width="100" height="80" /> + </bpmndi:BPMNShape> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </bpmn:definitions> diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoModifyAccessNSSI.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoModifyAccessNSSI.bpmn index c346097c70..3844770023 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoModifyAccessNSSI.bpmn +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoModifyAccessNSSI.bpmn @@ -73,7 +73,7 @@ nss.getNssisFromAai(execution)</bpmn:script> </bpmn:scriptTask> <bpmn:sequenceFlow id="Flow_1fpw4gf" sourceRef="Activity_0c8tzf1" targetRef="Activity_1so8vif" /> <bpmn:sequenceFlow id="Flow_05cl21h" sourceRef="Activity_1so8vif" targetRef="Activity_0uxxkp1" /> - <bpmn:scriptTask id="Activity_0uxxkp1" name="update AAI relationships"> + <bpmn:scriptTask id="Activity_0uxxkp1" name="update AAI relationships" scriptFormat="groovy"> <bpmn:incoming>Flow_05cl21h</bpmn:incoming> <bpmn:outgoing>Flow_1jwk3jy</bpmn:outgoing> <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoModifyTransportNSSI.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoModifyTransportNSSI.bpmn index dcfd31beac..06bcb0820f 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoModifyTransportNSSI.bpmn +++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/subprocess/DoModifyTransportNSSI.bpmn @@ -29,7 +29,7 @@ ex.processJavaException(execution)</bpmn:script> <bpmn:incoming>SequenceFlow_0kixzdj</bpmn:incoming> <bpmn:outgoing>SequenceFlow_1qv8qw1</bpmn:outgoing> <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.* -def runScript = new DoActivateTnNssi() +def runScript = new DoModifyTnNssi() runScript.prepareUpdateJobStatus(execution,"FINISHED","100","Modified TN NSSI successfully")</bpmn:script> </bpmn:scriptTask> <bpmn:sequenceFlow id="SequenceFlow_03s744c" sourceRef="StartEvent_1nbljfd" targetRef="ScriptTask_1tc44ge" /> @@ -73,8 +73,8 @@ runScript.preprocessSdncModifyTnNssiRequest(execution)</bpmn:script> <bpmn:extensionElements> <camunda:in source="TNNSSMF_SDNCRequest" target="sdncAdapterWorkflowRequest" /> <camunda:in source="isDebugLogEnabled" target="isDebugLogEnabled" /> - <camunda:in source="mso-request-id" target="mso-request-id" /> - <camunda:in source="mso-service-instance-id" target="mso-service-instance-id" /> + <camunda:in source="msoRequestId" target="mso-request-id" /> + <camunda:in source="sliceServiceInstanceId" target="mso-service-instance-id" /> <camunda:out source="WorkflowException" target="WorkflowException" /> <camunda:out source="sdncAdapterResponse" target="TNNSSMF_SDNCAdapterResponse" /> <camunda:out source="SDNCA_SuccessIndicator" target="SDNCA_SuccessIndicator" /> @@ -132,6 +132,20 @@ runScript.validateSDNCResponse(execution, response, "modify")</bpmn:script> <bpmn:error id="Error_0p2naox" name="MSOWorkflowException" errorCode="MSOWorkflowException" /> <bpmndi:BPMNDiagram id="BPMNDiagram_1"> <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="DoModifyTransportNSSI"> + <bpmndi:BPMNEdge id="Flow_0b3rxne_di" bpmnElement="Flow_0b3rxne"> + <di:waypoint x="690" y="146" /> + <di:waypoint x="690" y="360" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="698" y="203" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0cm9i4m_di" bpmnElement="Flow_0cm9i4m"> + <di:waypoint x="715" y="121" /> + <di:waypoint x="789" y="121" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="743" y="103" width="19" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> <bpmndi:BPMNEdge id="Flow_1akxvak_di" bpmnElement="Flow_1akxvak"> <di:waypoint x="1230" y="400" /> <di:waypoint x="1372" y="400" /> @@ -171,62 +185,12 @@ runScript.validateSDNCResponse(execution, response, "modify")</bpmn:script> <di:waypoint x="208" y="121" /> <di:waypoint x="290" y="121" /> </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="Flow_0cm9i4m_di" bpmnElement="Flow_0cm9i4m"> - <di:waypoint x="715" y="121" /> - <di:waypoint x="789" y="121" /> - <bpmndi:BPMNLabel> - <dc:Bounds x="743" y="103" width="19" height="14" /> - </bpmndi:BPMNLabel> - </bpmndi:BPMNEdge> - <bpmndi:BPMNEdge id="Flow_0b3rxne_di" bpmnElement="Flow_0b3rxne"> - <di:waypoint x="690" y="146" /> - <di:waypoint x="690" y="360" /> - <bpmndi:BPMNLabel> - <dc:Bounds x="698" y="203" width="15" height="14" /> - </bpmndi:BPMNLabel> - </bpmndi:BPMNEdge> - <bpmndi:BPMNShape id="Activity_1vtz33q_di" bpmnElement="Activity_1vtz33q"> - <dc:Bounds x="1229" y="74" width="121" height="94" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="Activity_14ab476_di" bpmnElement="Activity_14ab476"> - <dc:Bounds x="989" y="74" width="121" height="94" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="Activity_0h1vr2l_di" bpmnElement="Activity_0h1vr2l"> - <dc:Bounds x="789" y="74" width="121" height="94" /> - </bpmndi:BPMNShape> <bpmndi:BPMNShape id="StartEvent_1nbljfd_di" bpmnElement="StartEvent_1nbljfd"> <dc:Bounds x="172" y="103" width="36" height="36" /> <bpmndi:BPMNLabel> <dc:Bounds x="155" y="146" width="86" height="40" /> </bpmndi:BPMNLabel> </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="ScriptTask_1tc44ge_di" bpmnElement="ScriptTask_1tc44ge"> - <dc:Bounds x="290" y="81" width="100" height="80" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="Activity_0phv8e5_di" bpmnElement="Activity_0phv8e5"> - <dc:Bounds x="479" y="74" width="121" height="94" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="Gateway_1o68a9z_di" bpmnElement="Gateway_1o68a9z" isMarkerVisible="true"> - <dc:Bounds x="665" y="96" width="50" height="50" /> - <bpmndi:BPMNLabel> - <dc:Bounds x="653" y="73" width="75" height="14" /> - </bpmndi:BPMNLabel> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="ScriptTask_19uxoi8_di" bpmnElement="ScriptTask_19uxoi8"> - <dc:Bounds x="640" y="360" width="100" height="80" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="ScriptTask_1ssh2l9_di" bpmnElement="ScriptTask_1ssh2l9"> - <dc:Bounds x="860" y="360" width="100" height="80" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="Activity_0ziz3ti_di" bpmnElement="Activity_0ziz3ti"> - <dc:Bounds x="1130" y="360" width="100" height="80" /> - </bpmndi:BPMNShape> - <bpmndi:BPMNShape id="EndEvent_05h01gx_di" bpmnElement="EndEvent_05h01gx"> - <dc:Bounds x="1372" y="382" width="36" height="36" /> - <bpmndi:BPMNLabel> - <dc:Bounds x="1380" y="425" width="20" height="14" /> - </bpmndi:BPMNLabel> - </bpmndi:BPMNShape> <bpmndi:BPMNShape id="SubProcess_1yv9i68_di" bpmnElement="SubProcess_1yv9i68" isExpanded="true"> <dc:Bounds x="735" y="1080" width="781" height="196" /> </bpmndi:BPMNShape> @@ -247,6 +211,42 @@ runScript.validateSDNCResponse(execution, response, "modify")</bpmn:script> <bpmndi:BPMNShape id="ScriptTask_1swzdpw_di" bpmnElement="ScriptTask_1swzdpw"> <dc:Bounds x="1029" y="1144" width="100" height="80" /> </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="EndEvent_05h01gx_di" bpmnElement="EndEvent_05h01gx"> + <dc:Bounds x="1372" y="382" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1380" y="425" width="20" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1ssh2l9_di" bpmnElement="ScriptTask_1ssh2l9"> + <dc:Bounds x="860" y="360" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_19uxoi8_di" bpmnElement="ScriptTask_19uxoi8"> + <dc:Bounds x="640" y="360" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0phv8e5_di" bpmnElement="Activity_0phv8e5"> + <dc:Bounds x="479" y="74" width="121" height="94" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="ScriptTask_1tc44ge_di" bpmnElement="ScriptTask_1tc44ge"> + <dc:Bounds x="290" y="81" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0h1vr2l_di" bpmnElement="Activity_0h1vr2l"> + <dc:Bounds x="789" y="74" width="121" height="94" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_14ab476_di" bpmnElement="Activity_14ab476"> + <dc:Bounds x="989" y="74" width="121" height="94" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1vtz33q_di" bpmnElement="Activity_1vtz33q"> + <dc:Bounds x="1229" y="74" width="121" height="94" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0ziz3ti_di" bpmnElement="Activity_0ziz3ti"> + <dc:Bounds x="1130" y="360" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1o68a9z_di" bpmnElement="Gateway_1o68a9z" isMarkerVisible="true"> + <dc:Bounds x="665" y="96" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="653" y="73" width="75" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </bpmn:definitions> diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/logback-test.xml b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/logback-test.xml index 3b0bdb252f..6fbf09ec4a 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/logback-test.xml +++ b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/logback-test.xml @@ -45,6 +45,8 @@ <logger name="AUDIT" level="info" additivity="true"> <appender-ref ref="STDOUT"/> </logger> + + <logger name="org.reflections" level="ERROR" /> <!-- suppress the amount of org.apache.tomcat.util.net.NioEndpoint log--> <logger name="org.apache.tomcat" level="WARN" /> diff --git a/bpmn/so-bpmn-tasks/pom.xml b/bpmn/so-bpmn-tasks/pom.xml index 276b546072..64db71339d 100644 --- a/bpmn/so-bpmn-tasks/pom.xml +++ b/bpmn/so-bpmn-tasks/pom.xml @@ -3,7 +3,7 @@ <parent> <groupId>org.onap.so</groupId> <artifactId>bpmn</artifactId> - <version>1.8.0-SNAPSHOT</version> + <version>1.9.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>so-bpmn-tasks</artifactId> diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/cnf/tasks/CnfAdapterCreateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/cnf/tasks/CnfAdapterCreateTasks.java index 1220dc05c1..f49cf48ff5 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/cnf/tasks/CnfAdapterCreateTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/cnf/tasks/CnfAdapterCreateTasks.java @@ -109,12 +109,15 @@ public class CnfAdapterCreateTasks { protected InstanceRequest createInstanceRequest(VfModule vfModule, CloudRegion cloudRegion, Map<String, String> sdncDirectives) { InstanceRequest request = new InstanceRequest(); - request.setRbName(vfModule.getModelInfoVfModule().getModelInvariantUUID()); - request.setRbVersion(vfModule.getModelInfoVfModule().getModelUUID()); + request.setModelInvariantId(vfModule.getModelInfoVfModule().getModelInvariantUUID()); + request.setModelVersionId(vfModule.getModelInfoVfModule().getModelUUID()); + request.setModelCustomizationId(vfModule.getModelInfoVfModule().getModelCustomizationUUID()); request.setCloudRegion(cloudRegion.getLcpCloudRegionId()); request.setVfModuleUUID(vfModule.getVfModuleId()); request.setProfileName(sdncDirectives.get("k8s-rb-profile-name")); request.setReleaseName(sdncDirectives.get("k8s-rb-instance-release-name")); + if (sdncDirectives.containsKey("k8s-rb-instance-status-check")) + request.setStatusCheck(sdncDirectives.get("k8s-rb-instance-status-check").equalsIgnoreCase("true")); request.setOverrideValues(sdncDirectives); return request; } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterImpl.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterImpl.java index 8e6e8678ed..7c6473f79d 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterImpl.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/network/tasks/NetworkAdapterImpl.java @@ -2,12 +2,15 @@ package org.onap.so.bpmn.infrastructure.adapter.network.tasks; import java.io.ByteArrayInputStream; import java.io.StringReader; +import java.nio.charset.StandardCharsets; import java.util.Optional; +import javax.xml.XMLConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.commons.lang3.StringUtils; import org.onap.so.adapters.nwrest.CreateNetworkResponse; import org.onap.so.adapters.nwrest.DeleteNetworkResponse; import org.onap.so.adapters.nwrest.UpdateNetworkResponse; @@ -22,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.w3c.dom.Document; @Component public class NetworkAdapterImpl { @@ -80,14 +84,16 @@ public class NetworkAdapterImpl { return unmarshaller.unmarshal(reader); } - protected Optional<String> findResponseType(String xmlString) { + protected Optional<String> findResponseType(final String xmlString) { try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - org.w3c.dom.Document doc; - doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes("UTF-8"))); + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, StringUtils.EMPTY); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, StringUtils.EMPTY); + + final DocumentBuilder builder = factory.newDocumentBuilder(); + final Document doc = builder.parse(new ByteArrayInputStream(xmlString.getBytes(StandardCharsets.UTF_8))); return Optional.of(doc.getDocumentElement().getNodeName()); - } catch (Exception e) { + } catch (final Exception e) { logger.error("Error Finding Response Type", e); return Optional.empty(); } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java index e55fa9e24b..7ed8447fa6 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java @@ -22,6 +22,7 @@ package org.onap.so.bpmn.infrastructure.sdnc.tasks; import java.io.StringReader; import java.io.StringWriter; +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; @@ -30,14 +31,15 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; +import org.apache.commons.lang3.StringUtils; import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.onap.logging.filter.base.ONAPComponents; import org.onap.so.bpmn.infrastructure.sdnc.exceptions.SDNCErrorResponseException; import org.onap.so.client.exception.BadResponseException; import org.onap.so.client.exception.ExceptionBuilder; import org.onap.so.client.exception.MapperException; import org.onap.so.client.sdnc.SDNCClient; import org.onap.so.client.sdnc.beans.SDNCRequest; -import org.onap.logging.filter.base.ONAPComponents; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -47,10 +49,17 @@ import org.w3c.dom.Document; import org.xml.sax.InputSource; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.PathNotFoundException; +import net.sf.saxon.lib.NamespaceConstant; +import net.sf.saxon.xpath.XPathFactoryImpl; @Component public class SDNCRequestTasks { + private static final String NET_SF_SAXON_XPATH_IMPL = "net.sf.saxon.xpath.XPathFactoryImpl"; + + private static final String XPATH_FACTORY_PROPERTY_NAME = + "javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON; + private static final Logger logger = LoggerFactory.getLogger(SDNCRequestTasks.class); private static final String SDNC_REQUEST = "SDNCRequest"; @@ -143,14 +152,20 @@ public class SDNCRequestTasks { return "Y".equals(finalMessageIndicator); } - protected String getXmlElement(Document doc, String exp) throws Exception { - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer transformer = tf.newTransformer(); - StringWriter writer = new StringWriter(); + protected String getXmlElement(final Document doc, final String exp) throws Exception { + final TransformerFactory factory = TransformerFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, StringUtils.EMPTY); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, StringUtils.EMPTY); + + final Transformer transformer = factory.newTransformer(); + final StringWriter writer = new StringWriter(); transformer.transform(new DOMSource(doc), new StreamResult(writer)); logger.debug(writer.getBuffer().toString()); - XPath xPath = XPathFactory.newInstance().newXPath(); - String result = xPath.evaluate(exp, doc); + + System.setProperty(XPATH_FACTORY_PROPERTY_NAME, NET_SF_SAXON_XPATH_IMPL); + final XPathFactory xPathFactory = XPathFactoryImpl.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON); + final XPath xPath = xPathFactory.newXPath(); + final String result = xPath.evaluate(exp, doc); if (result == null || result.isEmpty()) { throw new Exception("XPath Failed to find element expression: " + exp); } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java index 2138f489ee..2bd0f2c786 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilder.java @@ -10,6 +10,8 @@ * ================================================================================ * Modifications Copyright (c) 2020 Tech Mahindra * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ * 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 @@ -26,6 +28,7 @@ package org.onap.so.bpmn.infrastructure.workflow.tasks; +import org.apache.commons.lang3.builder.ToStringBuilder; import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock; import org.onap.so.bpmn.servicedecomposition.entities.ConfigurationResourceKeys; import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock; @@ -36,20 +39,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ASSIGNINSTANCE; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CONFIGURATION; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CONTROLLER; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CREATE_INSTANCE; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.NETWORKCOLLECTION; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.REPLACEINSTANCE; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.REPLACEINSTANCERETAINASSIGNMENTS; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.SERVICE; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.VOLUMEGROUP; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.*; @Component public class ExecuteBuildingBlockBuilder { @@ -62,78 +56,117 @@ public class ExecuteBuildingBlockBuilder { private static final String NETWORK = "Network"; protected List<ExecuteBuildingBlock> buildExecuteBuildingBlockList(List<OrchestrationFlow> orchFlows, - List<Resource> resourceList, String requestId, String apiVersion, String resourceId, String requestAction, - String vnfType, WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, - boolean replaceVnf) { + List<Resource> originalResourceList, String requestId, String apiVersion, String resourceId, + String requestAction, String vnfType, WorkflowResourceIds workflowResourceIds, + RequestDetails requestDetails, boolean replaceVnf) { + List<Resource> resourceList = getOnlyRootResourceList(originalResourceList); + List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>(); + + boolean ascendingOrder = requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGN_INSTANCE) + || requestAction.equals(ACTIVATE_INSTANCE); + + ExecutionPlan plan = ExecutionPlan.build(resourceList, ascendingOrder); + + logger.info("Orchestration Flows"); for (OrchestrationFlow orchFlow : orchFlows) { - if (orchFlow.getFlowName().contains(SERVICE)) { - if (!replaceVnf) { - workflowResourceIds.setServiceInstanceId(resourceId); - } - addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.SERVICE, orchFlow, requestId, - apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, - false); - } else if (orchFlow.getFlowName().contains(VNF) || (orchFlow.getFlowName().contains(CONTROLLER) - && (VNF).equalsIgnoreCase(orchFlow.getBpmnScope()))) { - addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.VNF, orchFlow, requestId, - apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, - false); - } else if (orchFlow.getFlowName().contains(PNF) || (orchFlow.getFlowName().contains(CONTROLLER) - && (PNF).equalsIgnoreCase(orchFlow.getBpmnScope()))) { - addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.PNF, orchFlow, requestId, - apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, - false); - } else if (orchFlow.getFlowName().contains(NETWORK) - && !orchFlow.getFlowName().contains(NETWORKCOLLECTION)) { - addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.NETWORK, orchFlow, requestId, - apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, - false); - addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.VIRTUAL_LINK, orchFlow, - requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, - true, false); - } else if (orchFlow.getFlowName().contains(VFMODULE) || (orchFlow.getFlowName().contains(CONTROLLER) - && (VFMODULE).equalsIgnoreCase(orchFlow.getBpmnScope()))) { - List<Resource> vfModuleResourcesSorted; - if (requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGNINSTANCE) - || requestAction.equals("activateInstance")) { - vfModuleResourcesSorted = sortVfModulesByBaseFirst(resourceList.stream() - .filter(x -> WorkflowType.VFMODULE == x.getResourceType()).collect(Collectors.toList())); - } else { - vfModuleResourcesSorted = sortVfModulesByBaseLast(resourceList.stream() - .filter(x -> WorkflowType.VFMODULE == x.getResourceType()).collect(Collectors.toList())); - } - for (Resource resource : vfModuleResourcesSorted) { - flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resource, apiVersion, resourceId, - requestAction, false, vnfType, workflowResourceIds, requestDetails, false, null, null, - false, null)); - } - } else if (orchFlow.getFlowName().contains(VOLUMEGROUP)) { - if (requestAction.equalsIgnoreCase(REPLACEINSTANCE) - || requestAction.equalsIgnoreCase(REPLACEINSTANCERETAINASSIGNMENTS)) { - logger.debug("Replacing workflow resource id by volume group id"); - resourceId = workflowResourceIds.getVolumeGroupId(); - } - addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.VOLUMEGROUP, orchFlow, - requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, - false, false); - } else if (orchFlow.getFlowName().contains(NETWORKCOLLECTION)) { - addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.NETWORKCOLLECTION, orchFlow, - requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, - false, false); - } else if (orchFlow.getFlowName().contains(CONFIGURATION)) { - addBuildingBlockToExecuteBBList(flowsToExecute, resourceList, WorkflowType.CONFIGURATION, orchFlow, - requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, - false, true); - } else { - flowsToExecute - .add(buildExecuteBuildingBlock(orchFlow, requestId, null, apiVersion, resourceId, requestAction, - false, vnfType, workflowResourceIds, requestDetails, false, null, null, false, null)); + String flowDetails = new ToStringBuilder(this).append("id", orchFlow.getId()) + .append("action", orchFlow.getAction()).append("sequenceNumber", orchFlow.getSequenceNumber()) + .append("flowName", orchFlow.getFlowName()).append("flowVersion", orchFlow.getFlowVersion()) + .append("bpmnAction", orchFlow.getBpmnAction()).append("bpmnScope", orchFlow.getBpmnScope()) + .toString(); + logger.info("Flow: " + flowDetails); + buildExecuteBuildingBlockListPlan(orchFlow, plan, requestId, apiVersion, resourceId, requestAction, vnfType, + workflowResourceIds, requestDetails, replaceVnf); + } + + plan.flushBlocksFromCache(flowsToExecute); + + return flowsToExecute; + } + + protected void buildExecuteBuildingBlockListPlan(OrchestrationFlow flow, ExecutionPlan plan, String requestId, + String apiVersion, String resourceId, String requestAction, String vnfType, + WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, boolean replaceVnf) { + + List<ExecuteBuildingBlock> mainFlows = buildExecuteBuildingBlockListRaw(flow, plan.getResource(), requestId, + apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, replaceVnf); + + plan.pushBlockToCache(mainFlows); + + for (ExecutionGroup nestedGroup : plan.getNestedExecutions()) { + for (ExecutionPlan nestedPlan : nestedGroup.getNestedExecutions()) { + buildExecuteBuildingBlockListPlan(flow, nestedPlan, requestId, apiVersion, resourceId, requestAction, + vnfType, workflowResourceIds, requestDetails, replaceVnf); } + if (nestedGroup.getCacheSize() > 0) + plan.changeCurrentGroup(nestedGroup); + } + } + + private List<ExecuteBuildingBlock> buildExecuteBuildingBlockListRaw(OrchestrationFlow orchFlow, Resource resource, + String requestId, String apiVersion, String resourceId, String requestAction, String vnfType, + WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, boolean replaceVnf) { + List<ExecuteBuildingBlock> flowsToExecute = new ArrayList<>(); + if (orchFlow.getFlowName().contains(SERVICE) || (orchFlow.getFlowName().contains(CONTROLLER) + && (SERVICE).equalsIgnoreCase(orchFlow.getBpmnScope()))) { + if (!replaceVnf) { + workflowResourceIds.setServiceInstanceId(resourceId); + } + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.SERVICE, orchFlow, requestId, + apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false); + } else if (orchFlow.getFlowName().contains(VNF) + || (orchFlow.getFlowName().contains(CONTROLLER) && (VNF).equalsIgnoreCase(orchFlow.getBpmnScope()))) { + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.VNF, orchFlow, requestId, apiVersion, + resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false); + } else if (orchFlow.getFlowName().contains(PNF) + || (orchFlow.getFlowName().contains(CONTROLLER) && (PNF).equalsIgnoreCase(orchFlow.getBpmnScope()))) { + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.PNF, orchFlow, requestId, apiVersion, + resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false); + } else if (orchFlow.getFlowName().contains(NETWORK) && !orchFlow.getFlowName().contains(NETWORKCOLLECTION)) { + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.NETWORK, orchFlow, requestId, + apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false); + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.VIRTUAL_LINK, orchFlow, requestId, + apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, true, false); + } else if (orchFlow.getFlowName().contains(VFMODULE) || (orchFlow.getFlowName().contains(CONTROLLER) + && (VFMODULE).equalsIgnoreCase(orchFlow.getBpmnScope()))) { + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.VFMODULE, orchFlow, requestId, + apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false); + } else if (orchFlow.getFlowName().contains(VOLUMEGROUP)) { + if (requestAction.equalsIgnoreCase(REPLACEINSTANCE) + || requestAction.equalsIgnoreCase(REPLACEINSTANCERETAINASSIGNMENTS)) { + logger.debug("Replacing workflow resource id by volume group id"); + resourceId = workflowResourceIds.getVolumeGroupId(); + } + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.VOLUMEGROUP, orchFlow, requestId, + apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, false); + } else if (orchFlow.getFlowName().contains(NETWORKCOLLECTION)) { + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.NETWORKCOLLECTION, orchFlow, + requestId, apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, + false, false); + } else if (orchFlow.getFlowName().contains(CONFIGURATION)) { + addBuildingBlockToExecuteBBList(flowsToExecute, resource, WorkflowType.CONFIGURATION, orchFlow, requestId, + apiVersion, resourceId, requestAction, vnfType, workflowResourceIds, requestDetails, false, true); + } else { + flowsToExecute + .add(buildExecuteBuildingBlock(orchFlow, requestId, null, apiVersion, resourceId, requestAction, + false, vnfType, workflowResourceIds, requestDetails, false, null, null, false, null)); } return flowsToExecute; } + protected List<Resource> getOnlyRootResourceList(List<Resource> resourceList) { + return resourceList.stream().filter(x -> countResourceOnTheResourceList(x, resourceList) == 1) + .collect(Collectors.toList()); + } + + protected int countResourceOnTheResourceList(Resource resource, List<Resource> resourceList) { + int count = resourceList.stream() + .mapToInt(x -> (x.equals(resource) ? 1 : 0) + countResourceOnTheResourceList(resource, x.getChildren())) + .reduce(0, Integer::sum); + return count; + } + protected ExecuteBuildingBlock buildExecuteBuildingBlock(OrchestrationFlow orchFlow, String requestId, Resource resource, String apiVersion, String resourceId, String requestAction, boolean aLaCarte, String vnfType, WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, @@ -169,39 +202,16 @@ public class ExecuteBuildingBlockBuilder { return executeBuildingBlock; } - protected List<Resource> sortVfModulesByBaseFirst(List<Resource> vfModuleResources) { - int count = 0; - for (Resource resource : vfModuleResources) { - if (resource.isBaseVfModule()) { - Collections.swap(vfModuleResources, 0, count); - break; - } - count++; - } - return vfModuleResources; - } - - protected List<Resource> sortVfModulesByBaseLast(List<Resource> vfModuleResources) { - int count = 0; - for (Resource resource : vfModuleResources) { - if (resource.isBaseVfModule()) { - Collections.swap(vfModuleResources, vfModuleResources.size() - 1, count); - break; - } - count++; - } - return vfModuleResources; - } - - private void addBuildingBlockToExecuteBBList(List<ExecuteBuildingBlock> flowsToExecute, List<Resource> resourceList, + private void addBuildingBlockToExecuteBBList(List<ExecuteBuildingBlock> flowsToExecute, Resource resource, WorkflowType workflowType, OrchestrationFlow orchFlow, String requestId, String apiVersion, String resourceId, String requestAction, String vnfType, WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, boolean isVirtualLink, boolean isConfiguration) { - resourceList.stream().filter(resource -> resource.getResourceType().equals(workflowType)) - .forEach(resource -> flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resource, - apiVersion, resourceId, requestAction, false, vnfType, workflowResourceIds, requestDetails, - isVirtualLink, resource.getVirtualLinkKey(), null, isConfiguration, null))); + if (resource == null || !resource.getResourceType().equals(workflowType)) + return; + flowsToExecute.add(buildExecuteBuildingBlock(orchFlow, requestId, resource, apiVersion, resourceId, + requestAction, false, vnfType, workflowResourceIds, requestDetails, isVirtualLink, + resource.getVirtualLinkKey(), null, isConfiguration, null)); } protected ConfigurationResourceKeys getConfigurationResourceKeys(Resource resource, String vnfcName) { @@ -212,6 +222,4 @@ public class ExecuteBuildingBlockBuilder { configurationResourceKeys.setVnfResourceCustomizationUUID(resource.getVnfCustomizationId()); return configurationResourceKeys; } - - } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecutionPlan.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecutionPlan.java new file mode 100644 index 0000000000..77cb616eb9 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecutionPlan.java @@ -0,0 +1,167 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2021 Orange Intellectual Property. 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.workflow.tasks; + +import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.stream.Collectors; + +class ExecutionPlan extends ExecutionCollection<ExecutionGroup> { + private final Resource resource; + private ExecutionGroup currentGroup = null; + + public ExecutionPlan(Resource resource, ExecutionGroup group) { + super(resource != null ? resource.getResourceType() : WorkflowType.SERVICE); + this.resource = resource; + if (group != null) { + group.addNestedPlans(Collections.singletonList(this)); + } + } + + public void changeCurrentGroup(ExecutionGroup group) { + if (currentGroup == null || !currentGroup.equals(group)) { + logger.info("Change " + getName() + " group[" + group.getName() + "]"); + if (currentGroup != null) + currentGroup.flushBlocksFromCache(this.blocksBuiltCache); + } + currentGroup = group; + } + + Resource getResource() { + return resource; + } + + protected String getName() { + return super.getName() + "[" + + (resource != null ? (resource.getProcessingPriority() + ", " + resource.getResourceId()) : "") + "]"; + } + + public static ExecutionPlan build(List<Resource> resourceList, boolean ascendingOrder) { + ExecutionPlan plan = new ExecutionPlan(null, null); + buildExecutionPlan(plan, resourceList, ascendingOrder); + if (plan.getNestedExecutions().size() == 1 + && plan.getNestedExecutions().get(0).getNestedExecutions().size() == 1) + plan = plan.getNestedExecutions().get(0).getNestedExecutions().get(0); + return plan; + } + + private static void buildExecutionPlan(ExecutionPlan plan, List<Resource> resourceList, boolean ascendingOrder) { + Map<WorkflowType, List<Resource>> resourceGroups = new TreeMap<>(); + for (Resource resource : resourceList) { + if (!resourceGroups.containsKey(resource.getResourceType())) { + resourceGroups.put(resource.getResourceType(), new ArrayList<>()); + } + resourceGroups.get(resource.getResourceType()).add(resource); + } + for (WorkflowType type : resourceGroups.keySet()) { + ExecutionGroup nestedGroup = new ExecutionGroup(type, plan); + List<Resource> resourceGroupSorted = resourceGroups.get(type).stream() + .sorted(ascendingOrder ? Resource.sortByPriorityAsc : Resource.sortByPriorityDesc) + .collect(Collectors.toList()); + for (Resource resource : resourceGroupSorted) { + ExecutionPlan planInGroup = new ExecutionPlan(resource, nestedGroup); + if (resource.getChildren().size() > 0) + buildExecutionPlan(planInGroup, resource.getChildren(), ascendingOrder); + } + } + } +} + + +class ExecutionGroup extends ExecutionCollection<ExecutionPlan> { + + public ExecutionGroup(WorkflowType groupType, ExecutionPlan plan) { + super(groupType); + plan.addNestedPlans(Collections.singletonList(this)); + } +} + + +class ExecutionCollection<T extends ExecutionCollection<?>> { + + protected static final Logger logger = LoggerFactory.getLogger(ExecutionCollection.class); + + protected final WorkflowType type; + protected List<ExecuteBuildingBlock> blocksBuiltCache; + protected final List<T> nestedExecutions; + + public ExecutionCollection(WorkflowType type) { + this.type = type; + this.nestedExecutions = new ArrayList<>(); + this.blocksBuiltCache = new ArrayList<>(); + } + + public WorkflowType getType() { + return type; + } + + public List<T> getNestedExecutions() { + return nestedExecutions; + } + + public void addNestedPlans(List<T> executions) { + nestedExecutions.addAll(executions); + } + + public void pushBlockToCache(List<ExecuteBuildingBlock> blocksCache) { + if (blocksCache.size() == 0) + return; + this.flushNestedBlocksToCache(); + String blocks = + blocksCache.stream().map(x -> x.getBuildingBlock().getBpmnFlowName() + ", ").reduce("", String::concat); + blocks = blocks.substring(0, blocks.length() - 2); + logger.info("Push " + getName() + " (" + blocksCache.size() + ") blocks [" + blocks + "]"); + this.blocksBuiltCache.addAll(blocksCache); + } + + private void flushNestedBlocksToCache() { + for (T collection : nestedExecutions) { + collection.flushBlocksFromCache(this.blocksBuiltCache); + } + } + + public void flushBlocksFromCache(List<ExecuteBuildingBlock> blockList) { + flushNestedBlocksToCache(); + if (this.blocksBuiltCache.size() > 0) { + String blocks = this.blocksBuiltCache.stream().map(x -> x.getBuildingBlock().getBpmnFlowName() + ", ") + .reduce("", String::concat); + blocks = blocks.substring(0, blocks.length() - 2); + logger.info("Flush " + getName() + " (" + blocksBuiltCache.size() + ") blocks [" + blocks + "]"); + blockList.addAll(this.blocksBuiltCache); + this.blocksBuiltCache.clear(); + } + } + + public int getCacheSize() { + return blocksBuiltCache.size() + + getNestedExecutions().stream().mapToInt(x -> x.getCacheSize()).reduce(0, Integer::sum); + } + + protected String getName() { + return type.name(); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java index 447f8994db..0d2844d08b 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/Resource.java @@ -4,6 +4,8 @@ * ================================================================================ * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ * 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 @@ -20,6 +22,11 @@ package org.onap.so.bpmn.infrastructure.workflow.tasks; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; + public class Resource { private String resourceId; @@ -30,11 +37,24 @@ public class Resource { private String vnfCustomizationId; private String vfModuleCustomizationId; private String cvnfModuleCustomizationId; + private int processingPriority; + private Resource parent; + private List<Resource> children; + + public static final Comparator<Resource> sortByPriorityAsc = + Comparator.comparingInt(Resource::getProcessingPriority); + public static final Comparator<Resource> sortByPriorityDesc = + Comparator.comparingInt(x -> -x.getProcessingPriority()); - public Resource(WorkflowType resourceType, String resourceId, boolean generated) { + public Resource(WorkflowType resourceType, String resourceId, boolean generated, Resource parent) { this.resourceId = resourceId; this.resourceType = resourceType; this.generated = generated; + this.processingPriority = 0; + this.children = new ArrayList<>(); + this.parent = parent; + if (parent != null) + this.parent.children.add(this); } public String getResourceId() { @@ -100,4 +120,20 @@ public class Resource { public void setCvnfModuleCustomizationId(String cvnfModuleCustomizationId) { this.cvnfModuleCustomizationId = cvnfModuleCustomizationId; } + + public int getProcessingPriority() { + return processingPriority == 0 ? (isBaseVfModule() ? Integer.MIN_VALUE + 1 : 0) : processingPriority; + } + + public void setProcessingPriority(int processingPriority) { + this.processingPriority = processingPriority; + } + + public Resource getParent() { + return this.parent; + } + + public List<Resource> getChildren() { + return this.children; + } } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java index 29206a6aa9..ce775af476 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java @@ -10,6 +10,8 @@ * ================================================================================ * Modifications Copyright (c) 2020 Tech Mahindra * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ * 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 @@ -26,13 +28,16 @@ package org.onap.so.bpmn.infrastructure.workflow.tasks; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ASSIGNINSTANCE; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ASSIGN_INSTANCE; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CONTROLLER; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CREATE_INSTANCE; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.DELETE_INSTANCE; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.FABRIC_CONFIGURATION; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.RECREATE_INSTANCE; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.REPLACEINSTANCE; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.REPLACEINSTANCERETAINASSIGNMENTS; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.SERVICE; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.UPDATE_INSTANCE; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.WORKFLOW_ACTION_ERROR_MESSAGE; import java.io.IOException; import java.util.ArrayList; @@ -279,14 +284,14 @@ public class WorkflowAction { List<Resource> resourceList = new ArrayList<>(); List<Pair<WorkflowType, String>> aaiResourceIds = new ArrayList<>(); - if (resourceType == WorkflowType.SERVICE) { + if (resourceType == WorkflowType.SERVICE || isVNFCreateOrDelete(resourceType, requestAction)) { resourceList = serviceEBBLoader.getResourceListForService(sIRequest, requestAction, execution, serviceInstanceId, resourceId, aaiResourceIds); } else if (resourceType == WorkflowType.VNF && (REPLACEINSTANCE.equalsIgnoreCase(requestAction) - || ("recreateInstance".equalsIgnoreCase(requestAction)))) { + || (RECREATE_INSTANCE.equalsIgnoreCase(requestAction)))) { vnfEBBLoader.traverseAAIVnf(execution, resourceList, workflowResourceIds.getServiceInstanceId(), workflowResourceIds.getVnfId(), aaiResourceIds); - } else if (resourceType == WorkflowType.VNF && "updateInstance".equalsIgnoreCase(requestAction)) { + } else if (resourceType == WorkflowType.VNF && UPDATE_INSTANCE.equalsIgnoreCase(requestAction)) { vnfEBBLoader.customTraverseAAIVnf(execution, resourceList, workflowResourceIds.getServiceInstanceId(), workflowResourceIds.getVnfId(), aaiResourceIds); } else { @@ -315,14 +320,32 @@ public class WorkflowAction { logger.info("Sorting for Vlan Tagging"); flowsToExecute = sortExecutionPathByObjectForVlanTagging(flowsToExecute, requestAction); } + logger.info("Building Block Execution Order"); + for (ExecuteBuildingBlock block : flowsToExecute) { + Resource res = resourceList.stream() + .filter(resource -> resource.getResourceId() == block.getBuildingBlock().getKey()).findAny() + .orElse(null); + String log = "Block: " + block.getBuildingBlock().getBpmnFlowName(); + if (res != null) { + log += ", Resource: " + res.getResourceType() + "[" + res.getResourceId() + "]"; + log += ", Priority: " + res.getProcessingPriority(); + if (res.getResourceType() == WorkflowType.VFMODULE) + log += ", Base: " + res.isBaseVfModule(); + } + if (block.getBuildingBlock().getBpmnScope() != null) + log += ", Scope: " + block.getBuildingBlock().getBpmnScope(); + if (block.getBuildingBlock().getBpmnAction() != null) + log += ", Action: " + block.getBuildingBlock().getBpmnAction(); + logger.info(log); + } // By default, enable homing at VNF level for CREATE_INSTANCE and ASSIGNINSTANCE if (resourceType == WorkflowType.SERVICE - && (requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGNINSTANCE)) + && (requestAction.equals(CREATE_INSTANCE) || requestAction.equals(ASSIGN_INSTANCE)) && resourceList.stream().anyMatch(x -> WorkflowType.VNF.equals(x.getResourceType()))) { execution.setVariable(HOMING, true); execution.setVariable("calledHoming", false); } - if (resourceType == WorkflowType.SERVICE && (requestAction.equalsIgnoreCase(ASSIGNINSTANCE) + if (resourceType == WorkflowType.SERVICE && (requestAction.equalsIgnoreCase(ASSIGN_INSTANCE) || requestAction.equalsIgnoreCase(CREATE_INSTANCE))) { generateResourceIds(flowsToExecute, resourceList, serviceInstanceId); } else { @@ -331,6 +354,11 @@ public class WorkflowAction { return flowsToExecute; } + private boolean isVNFCreateOrDelete(WorkflowType resourceType, String requestAction) { + return resourceType == WorkflowType.VNF + && (CREATE_INSTANCE.equalsIgnoreCase(requestAction) || DELETE_INSTANCE.equalsIgnoreCase(requestAction)); + } + private void setExecutionVariables(DelegateExecution execution, List<ExecuteBuildingBlock> flowsToExecute, List<String> flowNames) { execution.setVariable("flowNames", flowNames); @@ -409,7 +437,7 @@ public class WorkflowAction { resourceId = modelInfo.getModelCustomizationId(); } } - return new Resource(resourceType, resourceId, true); + return new Resource(resourceType, resourceId, true, null); } private String getCloudOwner(CloudConfiguration cloudConfiguration) { @@ -724,7 +752,7 @@ public class WorkflowAction { type = action; } } - return new Resource(WorkflowType.fromString(convertTypeFromPlural(type)), id, generated); + return new Resource(WorkflowType.fromString(convertTypeFromPlural(type)), id, generated, null); } else { throw new IllegalArgumentException("Uri could not be parsed: " + uri); } @@ -887,7 +915,7 @@ public class WorkflowAction { protected boolean isRequestMacroServiceResume(boolean aLaCarte, WorkflowType resourceType, String requestAction, String serviceInstanceId) { return (!aLaCarte && resourceType == WorkflowType.SERVICE - && (requestAction.equalsIgnoreCase(ASSIGNINSTANCE) || requestAction.equalsIgnoreCase(CREATE_INSTANCE)) + && (requestAction.equalsIgnoreCase(ASSIGN_INSTANCE) || requestAction.equalsIgnoreCase(CREATE_INSTANCE)) && (serviceInstanceId != null && serviceInstanceId.trim().length() > 1) && (bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId) != null)); } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionConstants.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionConstants.java index b2cc89545b..38ba0077e2 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionConstants.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionConstants.java @@ -32,16 +32,23 @@ public final class WorkflowActionConstants { throw new IllegalStateException("Utility class"); } - public static final String USER_PARAM_SERVICE = "service"; + public static final String ACTIVATE_INSTANCE = "activateInstance"; + public static final String ASSIGN_INSTANCE = "assignInstance"; + public static final String CONFIGURATION = "Configuration"; + public static final String CONTROLLER = "Controller"; public static final String CREATE_INSTANCE = "createInstance"; + public static final String DEACTIVATE_INSTANCE = "deactivateInstance"; + public static final String DELETE_INSTANCE = "deleteInstance"; public static final String FABRIC_CONFIGURATION = "FabricConfiguration"; - public static final String WORKFLOW_ACTION_ERROR_MESSAGE = "WorkflowActionErrorMessage"; - static final String SERVICE = "Service"; - static final String CONTROLLER = "Controller"; public static final String NETWORKCOLLECTION = "NetworkCollection"; - static final String CONFIGURATION = "Configuration"; - public static final String ASSIGNINSTANCE = "assignInstance"; - static final String REPLACEINSTANCE = "replaceInstance"; - static final String VOLUMEGROUP = "VolumeGroup"; - static final String REPLACEINSTANCERETAINASSIGNMENTS = "replaceInstanceRetainAssignments"; + public static final String RECREATE_INSTANCE = "recreateInstance"; + public static final String REPLACEINSTANCE = "replaceInstance"; + public static final String REPLACEINSTANCERETAINASSIGNMENTS = "replaceInstanceRetainAssignments"; + public static final String SERVICE = "Service"; + public static final String UNASSIGN_INSTANCE = "unassignInstance"; + public static final String UPDATE_INSTANCE = "updateInstance"; + public static final String USER_PARAM_SERVICE = "service"; + public static final String VOLUMEGROUP = "VolumeGroup"; + public static final String WORKFLOW_ACTION_ERROR_MESSAGE = "WorkflowActionErrorMessage"; + } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java index 068c287ee7..e4c6d2951f 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoader.java @@ -1,3 +1,25 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (c) 2020 Nokia + * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ + * 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.workflow.tasks.ebb.loader; import com.fasterxml.jackson.core.JsonProcessingException; @@ -35,12 +57,16 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ACTIVATE_INSTANCE; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.DEACTIVATE_INSTANCE; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.DELETE_INSTANCE; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.UNASSIGN_INSTANCE; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.WORKFLOW_ACTION_ERROR_MESSAGE; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CREATE_INSTANCE; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.FABRIC_CONFIGURATION; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.NETWORKCOLLECTION; import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.USER_PARAM_SERVICE; -import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ASSIGNINSTANCE; +import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ASSIGN_INSTANCE; @Component @@ -77,7 +103,7 @@ public class ServiceEBBLoader { boolean containsService = false; List<Resource> resourceList = new ArrayList<>(); List<Map<String, Object>> userParams = sIRequest.getRequestDetails().getRequestParameters().getUserParams(); - if (requestAction.equalsIgnoreCase(ASSIGNINSTANCE)) { + if (requestAction.equalsIgnoreCase(ASSIGN_INSTANCE)) { // SERVICE-MACRO-ASSIGN will always get user params with a // service. @@ -108,17 +134,16 @@ public class ServiceEBBLoader { if (!foundRelated(resourceList)) { traverseCatalogDbService(execution, sIRequest, resourceList, aaiResourceIds); } - } else if (("activateInstance".equalsIgnoreCase(requestAction) - || "unassignInstance".equalsIgnoreCase(requestAction) - || "deleteInstance".equalsIgnoreCase(requestAction) + } else if ((ACTIVATE_INSTANCE.equalsIgnoreCase(requestAction) + || UNASSIGN_INSTANCE.equalsIgnoreCase(requestAction) || DELETE_INSTANCE.equalsIgnoreCase(requestAction) || requestAction.equalsIgnoreCase("activate" + FABRIC_CONFIGURATION))) { // SERVICE-MACRO-ACTIVATE, SERVICE-MACRO-UNASSIGN, and // SERVICE-MACRO-DELETE // Will never get user params with service, macro will have // to query the SI in AAI to find related instances. traverseAAIService(execution, resourceList, resourceId, aaiResourceIds); - } else if ("deactivateInstance".equalsIgnoreCase(requestAction)) { - resourceList.add(new Resource(WorkflowType.SERVICE, "", false)); + } else if (DEACTIVATE_INSTANCE.equalsIgnoreCase(requestAction)) { + resourceList.add(new Resource(WorkflowType.SERVICE, "", false, null)); } return resourceList; } @@ -139,16 +164,18 @@ public class ServiceEBBLoader { if (service == null) { buildAndThrowException(execution, "Could not find the service model in catalog db."); } else { - resourceList.add(new Resource(WorkflowType.SERVICE, service.getModelUUID(), false)); + Resource serviceResource = new Resource(WorkflowType.SERVICE, service.getModelUUID(), false, null); + resourceList.add(serviceResource); RelatedInstance relatedVpnBinding = bbInputSetupUtils.getRelatedInstanceByType(sIRequest.getRequestDetails(), ModelType.vpnBinding); RelatedInstance relatedLocalNetwork = bbInputSetupUtils.getRelatedInstanceByType(sIRequest.getRequestDetails(), ModelType.network); if (relatedVpnBinding != null && relatedLocalNetwork != null) { - traverseVrfConfiguration(aaiResourceIds, resourceList, service, relatedVpnBinding, relatedLocalNetwork); + traverseVrfConfiguration(aaiResourceIds, resourceList, serviceResource, service, relatedVpnBinding, + relatedLocalNetwork); } else { - traverseNetworkCollection(execution, resourceList, service); + traverseNetworkCollection(execution, resourceList, serviceResource, service); } } } @@ -166,14 +193,17 @@ public class ServiceEBBLoader { ServiceInstance serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(resourceId); org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO = bbInputSetup.getExistingServiceInstance(serviceInstanceAAI); - resourceList.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false)); - traverseServiceInstanceMSOVnfs(resourceList, aaiResourceIds, serviceInstanceMSO); - traverseServiceInstanceMSOPnfs(resourceList, aaiResourceIds, serviceInstanceMSO); + Resource serviceResource = + new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false, null); + resourceList.add(serviceResource); + traverseServiceInstanceMSOVnfs(resourceList, serviceResource, aaiResourceIds, serviceInstanceMSO); + traverseServiceInstanceMSOPnfs(resourceList, serviceResource, aaiResourceIds, serviceInstanceMSO); if (serviceInstanceMSO.getNetworks() != null) { for (org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network network : serviceInstanceMSO .getNetworks()) { aaiResourceIds.add(new Pair<>(WorkflowType.NETWORK, network.getNetworkId())); - resourceList.add(new Resource(WorkflowType.NETWORK, network.getNetworkId(), false)); + resourceList + .add(new Resource(WorkflowType.NETWORK, network.getNetworkId(), false, serviceResource)); } } if (serviceInstanceMSO.getCollection() != null) { @@ -181,7 +211,7 @@ public class ServiceEBBLoader { aaiResourceIds .add(new Pair<>(WorkflowType.NETWORKCOLLECTION, serviceInstanceMSO.getCollection().getId())); resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, - serviceInstanceMSO.getCollection().getId(), false)); + serviceInstanceMSO.getCollection().getId(), false, serviceResource)); } if (serviceInstanceMSO.getConfigurations() != null) { for (Configuration config : serviceInstanceMSO.getConfigurations()) { @@ -192,8 +222,8 @@ public class ServiceEBBLoader { if (relationship.getRelatedTo().contains("vnfc") || relationship.getRelatedTo().contains("vpn-binding")) { aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, config.getConfigurationId())); - resourceList.add( - new Resource(WorkflowType.CONFIGURATION, config.getConfigurationId(), false)); + resourceList.add(new Resource(WorkflowType.CONFIGURATION, config.getConfigurationId(), + false, serviceResource)); break; } } @@ -207,7 +237,7 @@ public class ServiceEBBLoader { } } - private void traverseServiceInstanceMSOVnfs(List<Resource> resourceList, + private void traverseServiceInstanceMSOVnfs(List<Resource> resourceList, Resource serviceResource, List<Pair<WorkflowType, String>> aaiResourceIds, org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) { if (serviceInstanceMSO.getVnfs() == null) { @@ -215,18 +245,20 @@ public class ServiceEBBLoader { } for (org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf : serviceInstanceMSO.getVnfs()) { aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId())); - resourceList.add(new Resource(WorkflowType.VNF, vnf.getVnfId(), false)); - traverseVnfModules(resourceList, aaiResourceIds, vnf); + Resource vnfResource = new Resource(WorkflowType.VNF, vnf.getVnfId(), false, serviceResource); + resourceList.add(vnfResource); + traverseVnfModules(resourceList, vnfResource, aaiResourceIds, vnf); if (vnf.getVolumeGroups() != null) { for (org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup volumeGroup : vnf.getVolumeGroups()) { aaiResourceIds.add(new Pair<>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId())); - resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false)); + resourceList.add( + new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false, vnfResource)); } } } } - private void traverseServiceInstanceMSOPnfs(List<Resource> resourceList, + private void traverseServiceInstanceMSOPnfs(List<Resource> resourceList, Resource serviceResource, List<Pair<WorkflowType, String>> aaiResourceIds, org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) { if (serviceInstanceMSO.getPnfs() == null) { @@ -234,12 +266,12 @@ public class ServiceEBBLoader { } for (org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf pnf : serviceInstanceMSO.getPnfs()) { aaiResourceIds.add(new Pair<>(WorkflowType.PNF, pnf.getPnfId())); - resourceList.add(new Resource(WorkflowType.PNF, pnf.getPnfId(), false)); + resourceList.add(new Resource(WorkflowType.PNF, pnf.getPnfId(), false, serviceResource)); } } protected void traverseVrfConfiguration(List<Pair<WorkflowType, String>> aaiResourceIds, - List<Resource> resourceList, org.onap.so.db.catalog.beans.Service service, + List<Resource> resourceList, Resource serviceResource, org.onap.so.db.catalog.beans.Service service, RelatedInstance relatedVpnBinding, RelatedInstance relatedLocalNetwork) throws VrfBondingServiceException, JsonProcessingException { org.onap.aai.domain.yang.L3Network aaiLocalNetwork = @@ -257,12 +289,12 @@ public class ServiceEBBLoader { aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, existingAAIVrfConfiguration)); } resourceList.add(new Resource(WorkflowType.CONFIGURATION, - service.getConfigurationCustomizations().get(0).getModelCustomizationUUID(), false)); + service.getConfigurationCustomizations().get(0).getModelCustomizationUUID(), false, serviceResource)); } protected void traverseNetworkCollection(DelegateExecution execution, List<Resource> resourceList, - org.onap.so.db.catalog.beans.Service service) { + Resource serviceResource, org.onap.so.db.catalog.beans.Service service) { if (isVnfCustomizationsInTheService(service)) { buildAndThrowException(execution, "Cannot orchestrate Service-Macro-Create without user params with a vnf. Please update ASDC model for new macro orchestration support or add service_recipe records to route to old macro flows"); @@ -277,14 +309,16 @@ public class ServiceEBBLoader { } else { CollectionResourceCustomization collectionResourceCustomization = findCatalogNetworkCollection(execution, service); - traverseNetworkCollectionResourceCustomization(resourceList, collectionResourceCustomization); + traverseNetworkCollectionResourceCustomization(resourceList, serviceResource, + collectionResourceCustomization); } - traverseNetworkCollectionCustomization(resourceList, service); + traverseNetworkCollectionCustomization(resourceList, serviceResource, service); } - private void traverseNetworkCollectionResourceCustomization(List<Resource> resourceList, + private void traverseNetworkCollectionResourceCustomization(List<Resource> resourceList, Resource serviceResource, CollectionResourceCustomization collectionResourceCustomization) { - if (collectionResourceCustomizationShouldNotBeProcessed(resourceList, collectionResourceCustomization)) + if (collectionResourceCustomizationShouldNotBeProcessed(resourceList, serviceResource, + collectionResourceCustomization)) return; int minNetworks = 0; org.onap.so.db.catalog.beans.InstanceGroup instanceGroup = @@ -309,7 +343,7 @@ public class ServiceEBBLoader { for (int i = 0; i < minNetworks; i++) { if (collectionNetworkResourceCust != null) { Resource resource = new Resource(WorkflowType.VIRTUAL_LINK, - collectionNetworkResourceCust.getModelCustomizationUUID(), false); + collectionNetworkResourceCust.getModelCustomizationUUID(), false, serviceResource); resource.setVirtualLinkKey(Integer.toString(i)); resourceList.add(resource); } @@ -331,13 +365,13 @@ public class ServiceEBBLoader { } private boolean collectionResourceCustomizationShouldNotBeProcessed(List<Resource> resourceList, - CollectionResourceCustomization collectionResourceCustomization) { + Resource serviceResource, CollectionResourceCustomization collectionResourceCustomization) { if (collectionResourceCustomization == null) { logger.debug("No Network Collection Customization found"); return true; } resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, - collectionResourceCustomization.getModelCustomizationUUID(), false)); + collectionResourceCustomization.getModelCustomizationUUID(), false, serviceResource)); logger.debug("Found a network collection"); if (collectionResourceCustomization.getCollectionResource() == null) { logger.debug("No Network Collection found. collectionResource is null"); @@ -365,7 +399,7 @@ public class ServiceEBBLoader { return toscaNodeType != null && toscaNodeType.contains(NETWORKCOLLECTION); } - private void traverseNetworkCollectionCustomization(List<Resource> resourceList, + private void traverseNetworkCollectionCustomization(List<Resource> resourceList, Resource serviceResource, org.onap.so.db.catalog.beans.Service service) { if (isNetworkCollectionInTheResourceList(resourceList)) { return; @@ -376,7 +410,7 @@ public class ServiceEBBLoader { } for (int i = 0; i < service.getNetworkCustomizations().size(); i++) { resourceList.add(new Resource(WorkflowType.NETWORK, - service.getNetworkCustomizations().get(i).getModelCustomizationUUID(), false)); + service.getNetworkCustomizations().get(i).getModelCustomizationUUID(), false, serviceResource)); } } @@ -388,14 +422,15 @@ public class ServiceEBBLoader { return !(service.getPnfCustomizations() == null || service.getPnfCustomizations().isEmpty()); } - private void traverseVnfModules(List<Resource> resourceList, List<Pair<WorkflowType, String>> aaiResourceIds, + private void traverseVnfModules(List<Resource> resourceList, Resource vnfResource, + List<Pair<WorkflowType, String>> aaiResourceIds, org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf) { if (vnf.getVfModules() == null) { return; } for (VfModule vfModule : vnf.getVfModules()) { aaiResourceIds.add(new Pair<>(WorkflowType.VFMODULE, vfModule.getVfModuleId())); - Resource resource = new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false); + Resource resource = new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false, vnfResource); resource.setBaseVfModule(vfModule.getModelInfoVfModule().getIsBaseBoolean()); resourceList.add(resource); } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java index 4b1fdd8da1..1f932743ca 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversal.java @@ -10,6 +10,8 @@ * ================================================================================ * Modifications Copyright (c) 2020 Tech Mahindra * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ * 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 @@ -89,38 +91,45 @@ public class UserParamsServiceTraversal { private List<Resource> getResourceList(DelegateExecution execution, String serviceModelVersionId, String requestAction, Service validate) { List<Resource> resourceList = new ArrayList<>(); - resourceList.add(new Resource(WorkflowType.SERVICE, validate.getModelInfo().getModelVersionId(), false)); + Resource serviceResource = + new Resource(WorkflowType.SERVICE, validate.getModelInfo().getModelVersionId(), false, null); + resourceList.add(serviceResource); if (validate.getResources().getVnfs() != null) { - setResourceListForVnfs(execution, resourceList, validate); + setResourceListForVnfs(execution, resourceList, serviceResource, validate); } if (validate.getResources().getPnfs() != null) { - setResourceListForPnfs(resourceList, validate); + setResourceListForPnfs(resourceList, serviceResource, validate); } if (validate.getResources().getNetworks() != null) { - setResourceListForNetworks(execution, serviceModelVersionId, requestAction, resourceList, validate); + setResourceListForNetworks(execution, serviceModelVersionId, requestAction, resourceList, serviceResource, + validate); } return resourceList; } - private void setResourceListForVnfs(DelegateExecution execution, List<Resource> resourceList, Service validate) { + private void setResourceListForVnfs(DelegateExecution execution, List<Resource> resourceList, + Resource serviceResource, Service validate) { for (Vnfs vnf : validate.getResources().getVnfs()) { setVnfCustomizationUUID(vnf); - resourceList.add(new Resource(WorkflowType.VNF, vnf.getModelInfo().getModelCustomizationId(), false)); - setResourceListForVfModules(execution, resourceList, validate, vnf); + Resource vnfResource = new Resource(WorkflowType.VNF, vnf.getModelInfo().getModelCustomizationId(), false, + serviceResource); + vnfResource.setProcessingPriority(vnf.getProcessingPriority()); + resourceList.add(vnfResource); + setResourceListForVfModules(execution, resourceList, vnfResource, validate, vnf); } } - private void setResourceListForVfModules(DelegateExecution execution, List<Resource> resourceList, Service validate, - Vnfs vnf) { + private void setResourceListForVfModules(DelegateExecution execution, List<Resource> resourceList, + Resource vnfResource, Service validate, Vnfs vnf) { if (vnf.getVfModules() != null) { for (VfModules vfModule : vnf.getVfModules()) { setVfModuleCustomizationUUID(vfModule); VfModuleCustomization vfModuleCustomization = catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID(vfModuleCustomizationUUID); if (vfModuleCustomization != null && vfModuleCustomization.getVfModule() != null) { - setVolumeGroupWorkFlowTypeToResourceList(resourceList, vfModuleCustomization); - setVfModuleAndConfigurationWorkFlowTypeToResourceList(resourceList, validate, vnf, vfModule, - vfModuleCustomization); + setVolumeGroupWorkFlowTypeToResourceList(resourceList, vnfResource, vfModuleCustomization); + setVfModuleAndConfigurationWorkFlowTypeToResourceList(resourceList, vnfResource, validate, vnf, + vfModule, vfModuleCustomization); if (!foundVfModuleOrVG) { buildAndThrowException(execution, "Could not determine if vfModule was a vfModule or volume group. Heat template and Heat env are null"); @@ -130,46 +139,49 @@ public class UserParamsServiceTraversal { } } - private void setVolumeGroupWorkFlowTypeToResourceList(List<Resource> resourceList, + private void setVolumeGroupWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource, VfModuleCustomization vfModuleCustomization) { if (vfModuleCustomization.getVfModule().getVolumeHeatTemplate() != null && vfModuleCustomization.getVolumeHeatEnv() != null) { foundVfModuleOrVG = true; - resourceList.add( - new Resource(WorkflowType.VOLUMEGROUP, vfModuleCustomization.getModelCustomizationUUID(), false)); + resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, vfModuleCustomization.getModelCustomizationUUID(), + false, vnfResource)); } } - private void setVfModuleAndConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList, Service validate, - Vnfs vnf, VfModules vfModule, VfModuleCustomization vfModuleCustomization) { + private void setVfModuleAndConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList, + Resource vnfResource, Service validate, Vnfs vnf, VfModules vfModule, + VfModuleCustomization vfModuleCustomization) { if ((vfModuleCustomization.getVfModule().getModuleHeatTemplate() != null && vfModuleCustomization.getHeatEnvironment() != null) || (vfModuleCustomization.getVfModule().getModelName() != null && vfModuleCustomization.getVfModule().getModelName().contains("helm"))) { foundVfModuleOrVG = true; - Resource resource = setVfModuleWorkFlowTypeToResourceList(resourceList, vfModuleCustomization); - setConfigurationWorkFlowTypeToResourceList(resourceList, validate, vnf, vfModule, resource); + Resource resource = + setVfModuleWorkFlowTypeToResourceList(resourceList, vnfResource, vfModuleCustomization, vfModule); + setConfigurationWorkFlowTypeToResourceList(resourceList, vnfResource, validate, vnf, vfModule, resource); } } - private Resource setVfModuleWorkFlowTypeToResourceList(List<Resource> resourceList, - VfModuleCustomization vfModuleCustomization) { - Resource resource = - new Resource(WorkflowType.VFMODULE, vfModuleCustomization.getModelCustomizationUUID(), false); + private Resource setVfModuleWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource, + VfModuleCustomization vfModuleCustomization, VfModules vfModule) { + Resource resource = new Resource(WorkflowType.VFMODULE, vfModuleCustomization.getModelCustomizationUUID(), + false, vnfResource); + resource.setProcessingPriority(vfModule.getProcessingPriority()); resource.setBaseVfModule(vfModuleCustomization.getVfModule().getIsBase() != null && vfModuleCustomization.getVfModule().getIsBase()); resourceList.add(resource); return resource; } - private void setConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList, Service validate, Vnfs vnf, - VfModules vfModule, Resource resource) { + private void setConfigurationWorkFlowTypeToResourceList(List<Resource> resourceList, Resource vnfResource, + Service validate, Vnfs vnf, VfModules vfModule, Resource resource) { if (!vnfCustomizationUUID.isEmpty() && !vfModuleCustomizationUUID.isEmpty()) { List<CvnfcConfigurationCustomization> configs = traverseCatalogDbForConfiguration(validate.getModelInfo().getModelVersionId()); for (CvnfcConfigurationCustomization config : configs) { Resource configResource = new Resource(WorkflowType.CONFIGURATION, - config.getConfigurationResource().getModelUUID(), false); + config.getConfigurationResource().getModelUUID(), false, vnfResource); resource.setVnfCustomizationId(vnf.getModelInfo().getModelCustomizationId()); resource.setVfModuleCustomizationId(vfModule.getModelInfo().getModelCustomizationId()); resourceList.add(configResource); @@ -193,22 +205,28 @@ public class UserParamsServiceTraversal { } } - private void setResourceListForPnfs(List<Resource> resourceList, Service validate) { + private void setResourceListForPnfs(List<Resource> resourceList, Resource serviceResource, Service validate) { for (Pnfs pnf : validate.getResources().getPnfs()) { - resourceList.add(new Resource(WorkflowType.PNF, pnf.getModelInfo().getModelCustomizationId(), false)); + Resource pnfResource = new Resource(WorkflowType.PNF, pnf.getModelInfo().getModelCustomizationId(), false, + serviceResource); + pnfResource.setProcessingPriority(pnf.getProcessingPriority()); + resourceList.add(pnfResource); } } private void setResourceListForNetworks(DelegateExecution execution, String serviceModelVersionId, - String requestAction, List<Resource> resourceList, Service validate) { + String requestAction, List<Resource> resourceList, Resource serviceResource, Service validate) { for (Networks network : validate.getResources().getNetworks()) { - resourceList - .add(new Resource(WorkflowType.NETWORK, network.getModelInfo().getModelCustomizationId(), false)); + Resource networkResource = new Resource(WorkflowType.NETWORK, + network.getModelInfo().getModelCustomizationId(), false, serviceResource); + networkResource.setProcessingPriority(network.getProcessingPriority()); + resourceList.add(networkResource); } if (requestAction.equals(CREATE_INSTANCE)) { String networkColCustId = queryCatalogDbForNetworkCollection(execution, serviceModelVersionId); if (networkColCustId != null) { - resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, networkColCustId, false)); + resourceList + .add(new Resource(WorkflowType.NETWORKCOLLECTION, networkColCustId, false, serviceResource)); } } } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/VnfEBBLoader.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/VnfEBBLoader.java index b271226414..c1d1d7ad5a 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/VnfEBBLoader.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/VnfEBBLoader.java @@ -10,6 +10,8 @@ * ================================================================================ * Modifications Copyright (c) 2020 Tech Mahindra * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ * 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 @@ -73,9 +75,11 @@ public class VnfEBBLoader { org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(serviceId); ServiceInstance serviceInstanceMSO = bbInputSetup.getExistingServiceInstance(serviceInstanceAAI); - resourceList.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false)); + Resource serviceResource = + new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false, null); + resourceList.add(serviceResource); if (serviceInstanceMSO.getVnfs() != null) { - findVnfWithGivenId(serviceInstanceMSO, vnfId, aaiResourceIds, resourceList, execution); + findVnfWithGivenId(serviceInstanceMSO, vnfId, aaiResourceIds, resourceList, serviceResource, execution); } } catch (Exception ex) { logger.error("Exception in traverseAAIVnf", ex); @@ -90,10 +94,12 @@ public class VnfEBBLoader { org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(serviceId); ServiceInstance serviceInstanceMSO = bbInputSetup.getExistingServiceInstance(serviceInstanceAAI); - resourceList.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false)); + Resource serviceResource = + new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false, null); + resourceList.add(serviceResource); if (serviceInstanceMSO.getVnfs() != null) { findVnfWithGivenIdAndAddCustomizationUUID(serviceInstanceMSO, vnfId, aaiResourceIds, resourceList, - execution); + serviceResource, execution); } } catch (Exception ex) { logger.error("Exception in customTraverseAAIVnf", ex); @@ -104,34 +110,38 @@ public class VnfEBBLoader { } private void findVnfWithGivenId(ServiceInstance serviceInstanceMSO, String vnfId, - List<Pair<WorkflowType, String>> aaiResourceIds, List<Resource> resourceList, DelegateExecution execution) { + List<Pair<WorkflowType, String>> aaiResourceIds, List<Resource> resourceList, Resource serviceResource, + DelegateExecution execution) { for (GenericVnf vnf : serviceInstanceMSO.getVnfs()) { if (vnf.getVnfId().equals(vnfId)) { aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId())); - resourceList.add(new Resource(WorkflowType.VNF, vnf.getVnfId(), false)); - processVfModules(vnf, aaiResourceIds, resourceList, execution); - processVolumeGroups(vnf, aaiResourceIds, resourceList); + Resource vnfResource = new Resource(WorkflowType.VNF, vnf.getVnfId(), false, serviceResource); + resourceList.add(vnfResource); + processVfModules(vnf, aaiResourceIds, resourceList, vnfResource, execution); + processVolumeGroups(vnf, aaiResourceIds, resourceList, vnfResource); break; } } } private void findVnfWithGivenIdAndAddCustomizationUUID(ServiceInstance serviceInstanceMSO, String vnfId, - List<Pair<WorkflowType, String>> aaiResourceIds, List<Resource> resourceList, DelegateExecution execution) { + List<Pair<WorkflowType, String>> aaiResourceIds, List<Resource> resourceList, Resource serviceResource, + DelegateExecution execution) { for (GenericVnf vnf : serviceInstanceMSO.getVnfs()) { if (vnf.getVnfId().equals(vnfId)) { aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId())); - resourceList.add(new Resource(WorkflowType.VNF, - bbInputSetupUtils.getAAIGenericVnf(vnfId).getModelCustomizationId(), false)); - processVfModules(vnf, aaiResourceIds, resourceList, execution); - processVolumeGroups(vnf, aaiResourceIds, resourceList); + Resource vnfResource = new Resource(WorkflowType.VNF, + bbInputSetupUtils.getAAIGenericVnf(vnfId).getModelCustomizationId(), false, serviceResource); + resourceList.add(vnfResource); + processVfModules(vnf, aaiResourceIds, resourceList, vnfResource, execution); + processVolumeGroups(vnf, aaiResourceIds, resourceList, vnfResource); break; } } } private void findConfigurationsInsideVfModule(DelegateExecution execution, String vnfId, String vfModuleId, - List<Resource> resourceList, List<Pair<WorkflowType, String>> aaiResourceIds) { + List<Resource> resourceList, Resource vfModuleResource, List<Pair<WorkflowType, String>> aaiResourceIds) { try { org.onap.aai.domain.yang.VfModule aaiVfModule = bbInputSetupUtils.getAAIVfModule(vnfId, vfModuleId); AAIResultWrapper vfModuleWrapper = new AAIResultWrapper( @@ -140,7 +150,7 @@ public class VnfEBBLoader { relationshipsOp = vfModuleWrapper.getRelationships(); if (relationshipsOp.isPresent()) { relationshipsOp = workflowActionUtils.extractRelationshipsVnfc(relationshipsOp.get()); - addConfigToResources(relationshipsOp, resourceList, aaiResourceIds); + addConfigToResources(relationshipsOp, resourceList, vfModuleResource, aaiResourceIds); } } catch (Exception ex) { logger.error("Exception in findConfigurationsInsideVfModule", ex); @@ -149,35 +159,39 @@ public class VnfEBBLoader { } private void processVfModules(GenericVnf vnf, List<Pair<WorkflowType, String>> aaiResourceIds, - List<Resource> resourceList, DelegateExecution execution) { + List<Resource> resourceList, Resource vnfResource, DelegateExecution execution) { if (vnf.getVfModules() != null) { for (VfModule vfModule : vnf.getVfModules()) { aaiResourceIds.add(new Pair<>(WorkflowType.VFMODULE, vfModule.getVfModuleId())); - resourceList.add(new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false)); + Resource vfModuleResource = + new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false, vnfResource); + resourceList.add(vfModuleResource); findConfigurationsInsideVfModule(execution, vnf.getVnfId(), vfModule.getVfModuleId(), resourceList, - aaiResourceIds); + vfModuleResource, aaiResourceIds); } } } private void processVolumeGroups(GenericVnf vnf, List<Pair<WorkflowType, String>> aaiResourceIds, - List<Resource> resourceList) { + List<Resource> resourceList, Resource vnfResource) { if (vnf.getVolumeGroups() != null) { for (VolumeGroup volumeGroup : vnf.getVolumeGroups()) { aaiResourceIds.add(new Pair<>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId())); - resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false)); + resourceList.add( + new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false, vnfResource)); } } } private void addConfigToResources(Optional<Relationships> relationshipsOp, List<Resource> resourceList, - List<Pair<WorkflowType, String>> aaiResourceIds) { + Resource vfModuleResource, List<Pair<WorkflowType, String>> aaiResourceIds) { if (relationshipsOp.isPresent()) { Optional<Configuration> config = workflowActionUtils.extractRelationshipsConfiguration(relationshipsOp.get()); if (config.isPresent()) { aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, config.get().getConfigurationId())); - resourceList.add(new Resource(WorkflowType.CONFIGURATION, config.get().getConfigurationId(), false)); + resourceList.add(new Resource(WorkflowType.CONFIGURATION, config.get().getConfigurationId(), false, + vfModuleResource)); } } } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/cnf/entities/InstanceRequest.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/cnf/entities/InstanceRequest.java index f4b2a8b4b1..c4fbdc5359 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/cnf/entities/InstanceRequest.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/cnf/entities/InstanceRequest.java @@ -7,83 +7,89 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; @JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({"rb-name", "rb-version", "profile-name", "release-name", "cloud-region", "labels", - "override-values"}) public class InstanceRequest { @JsonProperty("modelInvariantId") - private String rbName; + private String modelInvariantId; @JsonProperty("modelVersionId") - private String rbVersion; + private String modelVersionId; + @JsonProperty("modelCustomizationId") + private String modelCustomizationId; @JsonProperty("k8sRBProfileName") private String profileName; @JsonProperty("k8sRBInstanceReleaseName") private String releaseName; + @JsonProperty("k8sRBInstanceStatusCheck") + private Boolean statusCheck = false; @JsonProperty("vfModuleUUID") private String vfModuleUUID; @JsonProperty("cloudRegionId") private String cloudRegion; @JsonProperty("labels") private Map<String, String> labels; - @JsonProperty(value = "override-values") + @JsonProperty("override-values") private Map<String, String> overrideValues; - @JsonProperty("rb-name") - public String getRbName() { - return rbName; + public String getModelInvariantId() { + return modelInvariantId; } - @JsonProperty("rb-name") - public void setRbName(String rbName) { - this.rbName = rbName; + public void setModelInvariantId(String modelInvariantId) { + this.modelInvariantId = modelInvariantId; } - @JsonProperty("rb-version") - public String getRbVersion() { - return rbVersion; + public String getModelVersionId() { + return modelVersionId; } - @JsonProperty("rb-version") - public void setRbVersion(String rbVersion) { - this.rbVersion = rbVersion; + public void setModelVersionId(String modelVersionId) { + this.modelVersionId = modelVersionId; + } + + public String getModelCustomizationId() { + return modelCustomizationId; + } + + public void setModelCustomizationId(String modelCustomizationId) { + this.modelCustomizationId = modelCustomizationId; } - @JsonProperty("profile-name") public String getProfileName() { return profileName; } - @JsonProperty("profile-name") public void setProfileName(String profileName) { this.profileName = profileName; } - @JsonProperty("release-name") + public Boolean getStatusCheck() { + return statusCheck; + } + + public void setStatusCheck(Boolean statusCheck) { + this.statusCheck = statusCheck; + } + public String getReleaseName() { return releaseName; } - @JsonProperty("release-name") public void setReleaseName(String releaseName) { this.releaseName = releaseName; } - @JsonProperty("cloud-region") public String getCloudRegion() { return cloudRegion; } - @JsonProperty("cloud-region") public void setCloudRegion(String cloudRegion) { this.cloudRegion = cloudRegion; } - @JsonProperty("labels") public Map<String, String> getLabels() { return labels; } - @JsonProperty("labels") public void setLabels(Map<String, String> labels) { this.labels = labels; } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICommonTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICommonTasksTest.java new file mode 100644 index 0000000000..f2687efeac --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICommonTasksTest.java @@ -0,0 +1,102 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Modifications Copyright (c) 2021 Nokia + * ================================================================================ + * 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.aai.tasks; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import java.util.Optional; +import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.common.DelegateExecutionImpl; +import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance; +import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey; +import org.onap.so.bpmn.servicedecomposition.modelinfo.ModelInfoServiceInstance; +import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB; +import org.onap.so.client.exception.BBObjectNotFoundException; +import org.onap.so.client.exception.ExceptionBuilder; + +@RunWith(MockitoJUnitRunner.class) +public class AAICommonTasksTest { + + private static final String SERVICE_TYPE = "testService"; + + @Mock + private ExtractPojosForBB extractPojosForBBMock; + @Mock + private ExceptionBuilder exceptionBuilder; + @InjectMocks + private AAICommonTasks testedObject; + + private ServiceInstance serviceInstance; + private BuildingBlockExecution buildingBlockExecution; + + @Before + public void setup() { + serviceInstance = new ServiceInstance(); + buildingBlockExecution = new DelegateExecutionImpl(new DelegateExecutionFake()); + } + + @Test + public void getServiceType_success() throws Exception { + // given + ModelInfoServiceInstance modelInfoServiceInstance = new ModelInfoServiceInstance(); + modelInfoServiceInstance.setServiceType(SERVICE_TYPE); + serviceInstance.setModelInfoServiceInstance(modelInfoServiceInstance); + when(extractPojosForBBMock.extractByKey(buildingBlockExecution, ResourceKey.SERVICE_INSTANCE_ID)) + .thenReturn(serviceInstance); + // when + Optional<String> resultOpt = testedObject.getServiceType(buildingBlockExecution); + // then + assertThat(resultOpt).isNotEmpty(); + String result = resultOpt.get(); + assertThat(result).isEqualTo(SERVICE_TYPE); + } + + @Test + public void getServiceType_emptyWhenServiceInstanceModelIsNull() throws Exception { + // given + when(extractPojosForBBMock.extractByKey(buildingBlockExecution, ResourceKey.SERVICE_INSTANCE_ID)) + .thenReturn(serviceInstance); + // when + Optional<String> result = testedObject.getServiceType(buildingBlockExecution); + // then + assertThat(result).isEmpty(); + } + + @Test + public void getServiceType_exceptionHandling() throws Exception { + // given + BBObjectNotFoundException exception = new BBObjectNotFoundException(); + when(extractPojosForBBMock.extractByKey(buildingBlockExecution, ResourceKey.SERVICE_INSTANCE_ID)) + .thenThrow(exception); + // when + testedObject.getServiceType(buildingBlockExecution); + // then + verify(exceptionBuilder).buildAndThrowWorkflowException(buildingBlockExecution, 7000, exception); + } +} diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/service/level/ServiceLevelTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/service/level/ServiceLevelTest.java index cfaa4040c7..fb15ffa2b3 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/service/level/ServiceLevelTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/service/level/ServiceLevelTest.java @@ -21,35 +21,85 @@ package org.onap.so.bpmn.infrastructure.service.level; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import java.util.ArrayList; +import java.util.List; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake; +import org.junit.Before; import org.junit.Test; -import java.util.List; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; import org.onap.so.bpmn.infrastructure.service.level.impl.ServiceLevelConstants; +import org.onap.so.client.exception.ExceptionBuilder; +@RunWith(MockitoJUnitRunner.class) public class ServiceLevelTest { private static final String EXECUTION_KEY_PNF_NAME_LIST = "pnfNameList"; private static final String EXECUTION_KEY_PNF_COUNTER = "pnfCounter"; + private static final String PARAM_NAME = "param1"; + private static final String SCOPE = "scope1"; + private static final String PNF_NAME = "pnfName1"; + + @Mock + private ExceptionBuilder exceptionBuilderMock; + @InjectMocks + private ServiceLevel testedObject; + + private DelegateExecution execution; + + @Before + public void init() { + execution = new DelegateExecutionFake(); + } @Test public void pnfCounterExecution_success() { // given - String pnfName = "pnfName1"; - DelegateExecution execution = new DelegateExecutionFake(); - execution.setVariable(EXECUTION_KEY_PNF_NAME_LIST, createPnfNameList(pnfName)); + execution.setVariable(EXECUTION_KEY_PNF_NAME_LIST, createPnfNameList()); execution.setVariable(EXECUTION_KEY_PNF_COUNTER, 0); // when - new ServiceLevel().pnfCounterExecution(execution); + testedObject.pnfCounterExecution(execution); // then - assertThat(execution.getVariable(ServiceLevelConstants.PNF_NAME)).isEqualTo(pnfName); + assertThat(execution.getVariable(ServiceLevelConstants.PNF_NAME)).isEqualTo(PNF_NAME); assertThat(execution.getVariable(EXECUTION_KEY_PNF_COUNTER)).isEqualTo(1); } - private List<String> createPnfNameList(String pnfName) { + @Test + public void validateParams_success_paramExistsInExecution() { + // given + execution.setVariable(PARAM_NAME, "anyValue"); + // when + testedObject.validateParamsWithScope(execution, "anyScope", createParamList()); + // then + verify(exceptionBuilderMock, times(0)).buildAndThrowWorkflowException(any(DelegateExecution.class), + eq(ServiceLevelConstants.ERROR_CODE), any(String.class)); + } + + @Test + public void validateParams_exceptionParamDoesNotExistInExecution() { + // when + testedObject.validateParamsWithScope(execution, SCOPE, createParamList()); + // then + verify(exceptionBuilderMock).buildAndThrowWorkflowException(execution, ServiceLevelConstants.ERROR_CODE, + "Validation of health check workflow parameters failed for the scope: " + SCOPE); + } + + private List<String> createParamList() { + List<String> params = new ArrayList<>(); + params.add(PARAM_NAME); + return params; + } + + private List<String> createPnfNameList() { List<String> pnfNameList = new ArrayList<>(); - pnfNameList.add(pnfName); + pnfNameList.add(PNF_NAME); return pnfNameList; } } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilderTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilderTest.java index fae2317c8d..61b5740238 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilderTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ExecuteBuildingBlockBuilderTest.java @@ -10,6 +10,8 @@ * ================================================================================ * Modifications Copyright (c) 2020 Tech Mahindra * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ * 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 @@ -29,8 +31,10 @@ package org.onap.so.bpmn.infrastructure.workflow.tasks; import org.junit.Test; import org.onap.so.bpmn.servicedecomposition.entities.ConfigurationResourceKeys; import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds; import org.onap.so.db.catalog.beans.macro.OrchestrationFlow; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -41,43 +45,6 @@ public class ExecuteBuildingBlockBuilderTest { final private ExecuteBuildingBlockBuilder executeBBBuilder = new ExecuteBuildingBlockBuilder(); @Test - public void sortVfModulesByBaseFirstTest() { - List<Resource> resources = new ArrayList<>(); - Resource resource1 = new Resource(WorkflowType.VFMODULE, "111", false); - resource1.setBaseVfModule(false); - resources.add(resource1); - Resource resource2 = new Resource(WorkflowType.VFMODULE, "222", false); - resource2.setBaseVfModule(false); - resources.add(resource2); - Resource resource3 = new Resource(WorkflowType.VFMODULE, "333", false); - resource3.setBaseVfModule(true); - resources.add(resource3); - - List<Resource> result = executeBBBuilder.sortVfModulesByBaseFirst(resources); - assertEquals("333", result.get(0).getResourceId()); - assertEquals("222", result.get(1).getResourceId()); - assertEquals("111", result.get(2).getResourceId()); - } - - @Test - public void sortVfModulesByBaseLastTest() { - List<Resource> resources = new ArrayList<>(); - Resource resource1 = new Resource(WorkflowType.VFMODULE, "111", false); - resource1.setBaseVfModule(true); - resources.add(resource1); - Resource resource2 = new Resource(WorkflowType.VFMODULE, "222", false); - resource2.setBaseVfModule(false); - resources.add(resource2); - Resource resource3 = new Resource(WorkflowType.VFMODULE, "333", false); - resource3.setBaseVfModule(false); - resources.add(resource3); - List<Resource> result = executeBBBuilder.sortVfModulesByBaseLast(resources); - assertEquals("333", result.get(0).getResourceId()); - assertEquals("222", result.get(1).getResourceId()); - assertEquals("111", result.get(2).getResourceId()); - } - - @Test public void verifyLackOfNullPointerExceptionForNullResource() { ExecuteBuildingBlock result = null; try { @@ -96,7 +63,7 @@ public class ExecuteBuildingBlockBuilderTest { String cvnfModuleCustomizationId = "2b1a3c"; String vnfCustomizationId = "zz12aa"; - Resource resource = new Resource(WorkflowType.SERVICE, "123", true); + Resource resource = new Resource(WorkflowType.SERVICE, "123", true, null); resource.setCvnfModuleCustomizationId(vfModuleCustomizationId); resource.setCvnfModuleCustomizationId(cvnfModuleCustomizationId); @@ -110,4 +77,170 @@ public class ExecuteBuildingBlockBuilderTest { assertEquals(vnfCustomizationId, confResourceKeys.getVnfResourceCustomizationUUID()); } + + private Resource getResource(List<Resource> resources, ExecuteBuildingBlock block) { + Resource res = + resources.stream().filter(resource -> resource.getResourceId() == block.getBuildingBlock().getKey()) + .findAny().orElse(null); + return res; + } + + private void buildExecuteBuildingBlockListOrderOfVnf(int vnfCount, boolean addPnf, boolean priorities) { + WorkflowResourceIds wfIds = new WorkflowResourceIds(); + wfIds.setServiceInstanceId("1"); + List<Resource> resources = new ArrayList<>(); + Resource r1 = new Resource(WorkflowType.SERVICE, "1", false, null); + resources.add(r1); + for (int i = 0; i < vnfCount; i++) { + Resource r2 = new Resource(WorkflowType.VNF, Integer.toString(2 + i * 3), false, r1); + Resource r3 = new Resource(WorkflowType.VFMODULE, Integer.toString(3 + i * 3), false, r2); + Resource r4 = new Resource(WorkflowType.VFMODULE, Integer.toString(4 + i * 3), false, r2); + r4.setBaseVfModule(true); + resources.add(r2); + resources.add(r3); + resources.add(r4); + if (priorities) { + r2.setProcessingPriority(vnfCount - i); + r3.setProcessingPriority(1); + r4.setProcessingPriority(2); + } + } + if (addPnf) { + Resource r5 = new Resource(WorkflowType.PNF, Integer.toString(5 + (vnfCount - 1) * 3), false, r1); + resources.add(r5); + } + + OrchestrationFlow f1 = new OrchestrationFlow(); + f1.setFlowName("AssignServiceInstanceBB"); + OrchestrationFlow f2 = new OrchestrationFlow(); + f2.setFlowName("AssignVnfBB"); + OrchestrationFlow f3 = new OrchestrationFlow(); + f3.setFlowName("AssignVfModuleBB"); + OrchestrationFlow f4 = new OrchestrationFlow(); + f4.setFlowName("ControllerExecutionBB"); + f4.setBpmnAction("config-assign"); + f4.setBpmnScope("vnf"); + OrchestrationFlow f5 = new OrchestrationFlow(); + f5.setFlowName("AssignPnfBB"); + OrchestrationFlow f6 = new OrchestrationFlow(); + f6.setFlowName("WaitForPnfReadyBB"); + OrchestrationFlow f7 = new OrchestrationFlow(); + f7.setFlowName("ControllerExecutionBB"); + f7.setBpmnAction("config-assign"); + f7.setBpmnScope("pnf"); + OrchestrationFlow f8 = new OrchestrationFlow(); + f8.setFlowName("ControllerExecutionBB"); + f8.setBpmnAction("config-deploy"); + f8.setBpmnScope("pnf"); + OrchestrationFlow f9 = new OrchestrationFlow(); + f9.setFlowName("ActivatePnfBB"); + OrchestrationFlow f10 = new OrchestrationFlow(); + f10.setFlowName("CreateVfModuleBB"); + OrchestrationFlow f11 = new OrchestrationFlow(); + f11.setFlowName("ActivateVfModuleBB"); + OrchestrationFlow f12 = new OrchestrationFlow(); + f12.setFlowName("ControllerExecutionBB"); + f12.setBpmnAction("config-deploy"); + f12.setBpmnScope("vnf"); + OrchestrationFlow f13 = new OrchestrationFlow(); + f13.setFlowName("ActivateVnfBB"); + OrchestrationFlow f14 = new OrchestrationFlow(); + f14.setFlowName("ActivateServiceInstanceBB"); + + List<OrchestrationFlow> flows = Arrays.asList(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14); + for (int i = 0; i < flows.size(); i++) { + OrchestrationFlow flow = flows.get(i); + flow.setId(i + 1); + flow.setSequenceNumber(i + 1); + flow.setFlowVersion(1.0); + flow.setAction("Service-Macro-Create"); + } + + List<ExecuteBuildingBlock> flowsToExecute = executeBBBuilder.buildExecuteBuildingBlockList(flows, resources, + "1", "1", "1", WorkflowActionConstants.CREATE_INSTANCE, "type", wfIds, null, false); + + for (ExecuteBuildingBlock block : flowsToExecute) { + String name = block.getBuildingBlock().getBpmnFlowName(); + if (name.equals("ControllerExecutionBB")) + name += " [" + block.getBuildingBlock().getBpmnScope() + ", " + block.getBuildingBlock().getBpmnAction() + + "]"; + System.out.println(name); + } + assertNotNull(flowsToExecute); + assertEquals((addPnf ? 7 : 2) + vnfCount * 4L + vnfCount * 2L * 3, flowsToExecute.size()); + + for (ExecuteBuildingBlock block : flowsToExecute) + assertNotNull(getResource(resources, block)); + + if (priorities) { + if (vnfCount > 1) + assertEquals("5", getResource(resources, flowsToExecute.get(1)).getResourceId()); + else + assertEquals("3", getResource(resources, flowsToExecute.get(2)).getResourceId()); + } else { + if (vnfCount > 1) + assertEquals("2", getResource(resources, flowsToExecute.get(1)).getResourceId()); + else + assertEquals("4", getResource(resources, flowsToExecute.get(2)).getResourceId()); + } + + // AssignVfModuleBB + assertEquals(f3.getFlowName(), flowsToExecute.get(2).getBuildingBlock().getBpmnFlowName()); + // ControllerExecutionBB + assertEquals(f4.getFlowName(), flowsToExecute.get(4).getBuildingBlock().getBpmnFlowName()); + if (vnfCount > 1) { + // AssignVnfBB + if (addPnf) + assertEquals(f2.getFlowName(), flowsToExecute.get(5).getBuildingBlock().getBpmnFlowName()); + else + assertEquals(f2.getFlowName(), flowsToExecute.get(11).getBuildingBlock().getBpmnFlowName()); + } + int pnfOffset = -5; + if (addPnf) { + pnfOffset = (vnfCount - 1) * 4; + // AssignPnfBB + assertEquals(f5.getFlowName(), flowsToExecute.get(5 + pnfOffset).getBuildingBlock().getBpmnFlowName()); + // WaitForPnfReadyBB + assertEquals(f6.getFlowName(), flowsToExecute.get(6 + pnfOffset).getBuildingBlock().getBpmnFlowName()); + // ControllerExecutionBB + assertEquals(f7.getFlowName(), flowsToExecute.get(7 + pnfOffset).getBuildingBlock().getBpmnFlowName()); + // ControllerExecutionBB + assertEquals(f8.getFlowName(), flowsToExecute.get(8 + pnfOffset).getBuildingBlock().getBpmnFlowName()); + // ActivatePnfBB + assertEquals(f9.getFlowName(), flowsToExecute.get(9 + pnfOffset).getBuildingBlock().getBpmnFlowName()); + } + // CreateVfModuleBB + assertEquals(f10.getFlowName(), flowsToExecute.get(10 + pnfOffset).getBuildingBlock().getBpmnFlowName()); + // ActivateVfModuleBB + assertEquals(f11.getFlowName(), flowsToExecute.get(11 + pnfOffset).getBuildingBlock().getBpmnFlowName()); + // ControllerExecutionBB + assertEquals(f12.getFlowName(), flowsToExecute.get(14 + pnfOffset).getBuildingBlock().getBpmnFlowName()); + // ActivateVnfBB + assertEquals(f13.getFlowName(), flowsToExecute.get(15 + pnfOffset).getBuildingBlock().getBpmnFlowName()); + } + + @Test + public void buildExecuteBuildingBlockListSortByBaseVfModuleTest() { + buildExecuteBuildingBlockListOrderOfVnf(1, false, false); + } + + @Test + public void buildExecuteBuildingBlockListSortByPriorityTest() { + buildExecuteBuildingBlockListOrderOfVnf(1, false, true); + } + + @Test + public void buildExecuteBuildingBlockListGroupByResourceTypeAndSortByPriorityTest() { + buildExecuteBuildingBlockListOrderOfVnf(2, false, true); + } + + @Test + public void buildExecuteBuildingBlockListGroupByResourceTypeTest() { + buildExecuteBuildingBlockListOrderOfVnf(2, false, false); + } + + @Test + public void buildExecuteBuildingBlockListGroupByResourceTypeVnfAndPnfTest() { + buildExecuteBuildingBlockListOrderOfVnf(2, true, false); + } } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ResourceTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ResourceTest.java new file mode 100644 index 0000000000..cd98792938 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ResourceTest.java @@ -0,0 +1,115 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2021 Bell Canada. All rights reserved. + * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ + * 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.workflow.tasks; + +import static org.junit.Assert.assertEquals; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.Test; + +public class ResourceTest { + + @Test + public void testBaseFirstComparator() { + Resource r1 = new Resource(null, "1", false, null); + Resource r2 = new Resource(null, "2", false, null); + r2.setBaseVfModule(true); + + List<Resource> sorted = + Arrays.asList(r1, r2).stream().sorted(Resource.sortByPriorityAsc).collect(Collectors.toList()); + + assertEquals("2", sorted.get(0).getResourceId()); + } + + @Test + public void testPriorityAscComparator() { + Resource r1 = new Resource(null, "1", false, null); + Resource r2 = new Resource(null, "2", false, null); + Resource r3 = new Resource(null, "3", false, null); + Resource r4 = new Resource(null, "4", false, null); + r1.setProcessingPriority(4); + r2.setBaseVfModule(true); + r3.setProcessingPriority(2); + r4.setProcessingPriority(1); + + List<Resource> sorted = + Arrays.asList(r1, r2, r3, r4).stream().sorted(Resource.sortByPriorityAsc).collect(Collectors.toList()); + + assertEquals("2", sorted.get(0).getResourceId()); + assertEquals("4", sorted.get(1).getResourceId()); + assertEquals("3", sorted.get(2).getResourceId()); + } + + @Test + public void testBaseLastComparator() { + Resource r1 = new Resource(null, "1", false, null); + Resource r2 = new Resource(null, "2", false, null); + r1.setBaseVfModule(true); + + List<Resource> sorted = + Arrays.asList(r1, r2).stream().sorted(Resource.sortByPriorityDesc).collect(Collectors.toList()); + + assertEquals("1", sorted.get(1).getResourceId()); + } + + @Test + public void testPriorityDescComparator() { + Resource r1 = new Resource(null, "1", false, null); + Resource r2 = new Resource(null, "2", false, null); + Resource r3 = new Resource(null, "3", false, null); + Resource r4 = new Resource(null, "4", false, null); + r1.setProcessingPriority(4); + r2.setBaseVfModule(true); + r3.setProcessingPriority(2); + r4.setProcessingPriority(1); + + List<Resource> sorted = + Arrays.asList(r1, r2, r3, r4).stream().sorted(Resource.sortByPriorityDesc).collect(Collectors.toList()); + + assertEquals("1", sorted.get(0).getResourceId()); + assertEquals("3", sorted.get(1).getResourceId()); + assertEquals("4", sorted.get(2).getResourceId()); + } + + @Test + public void testPriorityReplaceBase() { + Resource r1 = new Resource(null, "1", false, null); + Resource r2 = new Resource(null, "2", false, null); + Resource r3 = new Resource(null, "3", false, null); + Resource r4 = new Resource(null, "4", false, null); + r1.setProcessingPriority(4); + r2.setBaseVfModule(true); + r2.setProcessingPriority(6); + r3.setProcessingPriority(2); + r4.setProcessingPriority(1); + + List<Resource> sorted = + Arrays.asList(r1, r2, r3, r4).stream().sorted(Resource.sortByPriorityAsc).collect(Collectors.toList()); + + assertEquals("4", sorted.get(0).getResourceId()); + assertEquals("3", sorted.get(1).getResourceId()); + assertEquals("1", sorted.get(2).getResourceId()); + } + +} diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java index 10e6ed4895..e52d2dfecf 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionTest.java @@ -8,6 +8,8 @@ * ================================================================================ * Modifications Copyright (c) 2020 Nokia * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ * 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 @@ -115,6 +117,7 @@ public class WorkflowActionTest extends BaseTaskTest { "VfModuleReplaceRebuildVolumeGroups.json"; private static final String MACRO_CREATE_NETWORK_COLLECTION_JSON = "Macro/CreateNetworkCollection.json"; private static final String MACRO_VNF_MACRO_REPLACE_JSON = "Macro/VnfMacroReplace.json"; + private static final String MACRO_CREATE_JSON = "Macro/ServiceMacroAssignVnfAndPnf.json"; @Mock protected Environment environment; @@ -298,7 +301,7 @@ public class WorkflowActionTest extends BaseTaskTest { vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8"); when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString())) - .thenReturn(prepareListWithResources()); + .thenReturn(prepareListWithResources(false, false)); when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource, false, "my-custom-cloud-owner")).thenReturn(northBoundRequest); when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f")) @@ -349,7 +352,7 @@ public class WorkflowActionTest extends BaseTaskTest { vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8"); when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString())) - .thenReturn(prepareListWithResources()); + .thenReturn(prepareListWithResources(false, false)); when(environment.getProperty("org.onap.so.cloud-owner")).thenReturn("att-aic"); when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource, false, "att-aic")).thenReturn(northBoundRequest); @@ -406,13 +409,13 @@ public class WorkflowActionTest extends BaseTaskTest { workflowAction.selectExecutionList(execution); List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute"); assertEqualsBulkFlowName(ebbs, "CreateVolumeGroupBB", "ActivateVolumeGroupBB", "CreateVfModuleBB", - "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", + "ActivateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", "ActivateServiceInstanceBB"); assertEquals("volumeGroup0", ebbs.get(0).getWorkflowResourceIds().getVolumeGroupId()); assertEquals("volumeGroup0", ebbs.get(1).getWorkflowResourceIds().getVolumeGroupId()); assertEquals("testVfModuleId1", ebbs.get(2).getWorkflowResourceIds().getVfModuleId()); - assertEquals("testVfModuleId2", ebbs.get(3).getWorkflowResourceIds().getVfModuleId()); - assertEquals("testVfModuleId1", ebbs.get(4).getWorkflowResourceIds().getVfModuleId()); + assertEquals("testVfModuleId1", ebbs.get(3).getWorkflowResourceIds().getVfModuleId()); + assertEquals("testVfModuleId2", ebbs.get(4).getWorkflowResourceIds().getVfModuleId()); assertEquals("testVfModuleId2", ebbs.get(5).getWorkflowResourceIds().getVfModuleId()); assertEquals("vnf0", ebbs.get(6).getWorkflowResourceIds().getVnfId()); assertEquals("si0", ebbs.get(7).getWorkflowResourceIds().getServiceInstanceId()); @@ -624,7 +627,7 @@ public class WorkflowActionTest extends BaseTaskTest { vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8"); when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString())) - .thenReturn(prepareListWithResources()); + .thenReturn(prepareListWithResources(false, false)); when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource, false, "my-custom-cloud-owner")).thenReturn(northBoundRequest); when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f")) @@ -638,8 +641,8 @@ public class WorkflowActionTest extends BaseTaskTest { List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute"); assertEqualsBulkFlowName(ebbs, "AssignServiceInstanceBB", "AssignVnfBB", "AssignVolumeGroupBB", "AssignVfModuleBB", "AssignVfModuleBB", "AssignVfModuleBB", "CreateVolumeGroupBB", - "ActivateVolumeGroupBB", "CreateVfModuleBB", "CreateVfModuleBB", "CreateVfModuleBB", - "ActivateVfModuleBB", "ActivateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", + "ActivateVolumeGroupBB", "CreateVfModuleBB", "ActivateVfModuleBB", "CreateVfModuleBB", + "ActivateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", "ActivateServiceInstanceBB"); assertEquals(3, ebbs.get(0).getWorkflowResourceIds().getServiceInstanceId().length()); @@ -663,6 +666,92 @@ public class WorkflowActionTest extends BaseTaskTest { } @Test + public void selectExecutionListServiceMacroCreateWithUserParamsAndPriorities() throws Exception { + String gAction = "createInstance"; + String resource = "Service"; + String bpmnRequest = readBpmnRequestFromFile(MACRO_CREATE_JSON); + initExecution(gAction, bpmnRequest, false); + execution.setVariable("requestUri", "v6/serviceInstances/123"); + + NorthBoundRequest northBoundRequest = new NorthBoundRequest(); + List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB", "CreateNetworkCollectionBB", + "AssignNetworkBB", "AssignVnfBB", "AssignVolumeGroupBB", "AssignVfModuleBB", "AssignPnfBB", + "WaitForPnfReadyBB", "ActivatePnfBB", "CreateNetworkBB", "ActivateNetworkBB", "CreateVolumeGroupBB", + "ActivateVolumeGroupBB", "CreateVfModuleBB", "ActivateVfModuleBB", "AssignFabricConfigurationBB", + "ActivateFabricConfigurationBB", "ActivateVnfBB", "ActivateNetworkCollectionBB", + "ActivateServiceInstanceBB"); + northBoundRequest.setOrchestrationFlowList(orchFlows); + + Service service = new Service(); + service.setModelUUID("3c40d244-808e-42ca-b09a-256d83d19d0a"); + + VfModuleCustomization vfModuleCustomization = new VfModuleCustomization(); + vfModuleCustomization.setModelCustomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"); + HeatEnvironment volumeHeatEnv = new HeatEnvironment(); + vfModuleCustomization.setVolumeHeatEnv(volumeHeatEnv); + org.onap.so.db.catalog.beans.VfModule vfModule = new org.onap.so.db.catalog.beans.VfModule(); + HeatTemplate volumeHeatTemplate = new HeatTemplate(); + vfModule.setVolumeHeatTemplate(volumeHeatTemplate); + vfModuleCustomization.setVfModule(vfModule); + + VfModuleCustomization vfModuleCustomization2 = new VfModuleCustomization(); + vfModuleCustomization2.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8"); + HeatEnvironment heatEnvironment = new HeatEnvironment(); + vfModuleCustomization2.setHeatEnvironment(heatEnvironment); + org.onap.so.db.catalog.beans.VfModule vfModule2 = new org.onap.so.db.catalog.beans.VfModule(); + HeatTemplate moduleHeatTemplate = new HeatTemplate(); + vfModule2.setModuleHeatTemplate(moduleHeatTemplate); + vfModuleCustomization2.setVfModule(vfModule2); + + VfModuleCustomization vfModuleCustomization3 = vfModuleCustomization2; + vfModuleCustomization3.setModelCustomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8"); + + when(userParamsServiceTraversal.getResourceListFromUserParams(any(), anyList(), anyString(), anyString())) + .thenReturn(prepareListWithResources(true, true)); + when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction, resource, + false, "my-custom-cloud-owner")).thenReturn(northBoundRequest); + when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f")) + .thenReturn(vfModuleCustomization); + when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("72d9d1cd-f46d-447a-abdb-451d6fb05fa8")) + .thenReturn(vfModuleCustomization2); + when(catalogDbClient.getVfModuleCustomizationByModelCuztomizationUUID("da4d4327-fb7d-4311-ac7a-be7ba60cf969")) + .thenReturn(vfModuleCustomization3); + when(catalogDbClient.getServiceByID("3c40d244-808e-42ca-b09a-256d83d19d0a")).thenReturn(service); + workflowAction.selectExecutionList(execution); + List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute"); + assertEqualsBulkFlowName(ebbs, "AssignServiceInstanceBB", "AssignVnfBB", "AssignVolumeGroupBB", + "AssignVfModuleBB", "AssignVfModuleBB", "AssignVfModuleBB", "AssignPnfBB", "WaitForPnfReadyBB", + "ActivatePnfBB", "CreateVolumeGroupBB", "ActivateVolumeGroupBB", "CreateVfModuleBB", + "ActivateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "CreateVfModuleBB", + "ActivateVfModuleBB", "ActivateVnfBB", "ActivateServiceInstanceBB"); + + assertEquals(3, ebbs.get(0).getWorkflowResourceIds().getServiceInstanceId().length()); + int randomUUIDLength = UUID.randomUUID().toString().length(); + assertEquals(randomUUIDLength, ebbs.get(1).getWorkflowResourceIds().getVnfId().length()); + assertEquals(randomUUIDLength, ebbs.get(2).getWorkflowResourceIds().getVolumeGroupId().length()); + assertEquals(randomUUIDLength, ebbs.get(3).getWorkflowResourceIds().getVfModuleId().length()); + assertEquals(randomUUIDLength, ebbs.get(4).getWorkflowResourceIds().getVfModuleId().length()); + assertEquals(randomUUIDLength, ebbs.get(5).getWorkflowResourceIds().getVfModuleId().length()); + assertEquals("72d9d1cd-f46d-447a-abdb-451d6fb05fa8", ebbs.get(3).getBuildingBlock().getKey()); + assertEquals("da4d4327-fb7d-4311-ac7a-be7ba60cf969", ebbs.get(4).getBuildingBlock().getKey()); + assertEquals("3c40d244-808e-42ca-b09a-256d83d19d0a", ebbs.get(5).getBuildingBlock().getKey()); + assertEquals(randomUUIDLength, ebbs.get(6).getWorkflowResourceIds().getPnfId().length()); + assertEquals(randomUUIDLength, ebbs.get(7).getWorkflowResourceIds().getPnfId().length()); + assertEquals(randomUUIDLength, ebbs.get(8).getWorkflowResourceIds().getPnfId().length()); + assertEquals(randomUUIDLength, ebbs.get(9).getWorkflowResourceIds().getVolumeGroupId().length()); + assertEquals(randomUUIDLength, ebbs.get(10).getWorkflowResourceIds().getVolumeGroupId().length()); + assertEquals(randomUUIDLength, ebbs.get(11).getWorkflowResourceIds().getVfModuleId().length()); + assertEquals(randomUUIDLength, ebbs.get(12).getWorkflowResourceIds().getVfModuleId().length()); + assertEquals(randomUUIDLength, ebbs.get(13).getWorkflowResourceIds().getVfModuleId().length()); + assertEquals(randomUUIDLength, ebbs.get(14).getWorkflowResourceIds().getVfModuleId().length()); + assertEquals(randomUUIDLength, ebbs.get(15).getWorkflowResourceIds().getVfModuleId().length()); + assertEquals(randomUUIDLength, ebbs.get(16).getWorkflowResourceIds().getVfModuleId().length()); + assertEquals(randomUUIDLength, ebbs.get(17).getWorkflowResourceIds().getVnfId().length()); + assertEquals(3, ebbs.get(0).getWorkflowResourceIds().getServiceInstanceId().length()); + assertEquals(true, execution.getVariable("homing")); + } + + @Test public void selectExecutionListServiceMacroDeleteTest() throws Exception { String gAction = "deleteInstance"; String resource = "Service"; @@ -708,7 +797,7 @@ public class WorkflowActionTest extends BaseTaskTest { false, "my-custom-cloud-owner")).thenReturn(northBoundRequest); workflowAction.selectExecutionList(execution); List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute"); - assertEqualsBulkFlowName(ebbs, "DeactivateVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB", + assertEqualsBulkFlowName(ebbs, "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeactivateVolumeGroupBB", "DeleteVolumeGroupBB", "DeactivateVnfBB", "DeactivatePnfBB", "DeactivateServiceInstanceBB", "UnassignVfModuleBB", "UnassignVfModuleBB", "UnassignVolumeGroupBB", "UnassignVnfBB", "UnassignServiceInstanceBB"); @@ -879,8 +968,8 @@ public class WorkflowActionTest extends BaseTaskTest { workflowAction.selectExecutionList(execution); List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute"); assertEqualsBulkFlowName(ebbs, "AAICheckVnfInMaintBB", "AAISetVnfInMaintBB", "DeactivateVfModuleBB", - "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeleteVfModuleBB", "DeactivateVnfBB", "CreateVfModuleBB", - "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", "SDNOVnfHealthCheckBB", + "DeleteVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeactivateVnfBB", "CreateVfModuleBB", + "ActivateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVnfBB", "SDNOVnfHealthCheckBB", "AAIUnsetVnfInMaintBB"); } @@ -940,12 +1029,13 @@ public class WorkflowActionTest extends BaseTaskTest { false, "cloud-owner")).thenReturn(northBoundRequest); workflowAction.selectExecutionList(execution); List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute"); - assertEqualsBulkFlowName(ebbs, "AAICheckVnfInMaintBB", "AAISetVnfInMaintBB", "DeactivateFabricConfigurationBB", - "UnassignFabricConfigurationBB", "DeactivateVfModuleBB", "DeactivateVfModuleBB", "DeleteVfModuleBB", - "DeleteVfModuleBB", "DeactivateVnfBB", "ChangeModelVfModuleBB", "ChangeModelVfModuleBB", - "CreateVfModuleBB", "CreateVfModuleBB", "ActivateVfModuleBB", "ActivateVfModuleBB", - "AssignFabricConfigurationBB", "ActivateFabricConfigurationBB", "ChangeModelVnfBB", "ActivateVnfBB", - "ChangeModelServiceInstanceBB", "SDNOVnfHealthCheckBB", "AAIUnsetVnfInMaintBB"); + assertEqualsBulkFlowName(ebbs, "AAICheckVnfInMaintBB", "AAISetVnfInMaintBB", "DeactivateVfModuleBB", + "DeleteVfModuleBB", "DeactivateFabricConfigurationBB", "UnassignFabricConfigurationBB", + "DeactivateVfModuleBB", "DeleteVfModuleBB", "DeactivateVnfBB", "ChangeModelVfModuleBB", + "CreateVfModuleBB", "ActivateVfModuleBB", "ChangeModelVfModuleBB", "CreateVfModuleBB", + "ActivateVfModuleBB", "AssignFabricConfigurationBB", "ActivateFabricConfigurationBB", + "ChangeModelVnfBB", "ActivateVnfBB", "ChangeModelServiceInstanceBB", "SDNOVnfHealthCheckBB", + "AAIUnsetVnfInMaintBB"); for (ExecuteBuildingBlock executeBuildingBlock : ebbs) { assertEquals("123", executeBuildingBlock.getWorkflowResourceIds().getServiceInstanceId()); } @@ -1540,7 +1630,7 @@ public class WorkflowActionTest extends BaseTaskTest { String vnfType = "vnfType"; String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0"; String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e"; - Resource resourceKey = new Resource(resourceType, key, aLaCarte); + Resource resourceKey = new Resource(resourceType, key, aLaCarte, null); WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution); thrown.expect(AAIEntityNotFoundException.class); @@ -1592,7 +1682,7 @@ public class WorkflowActionTest extends BaseTaskTest { String vnfType = "vnfType"; String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0"; String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e"; - Resource resourceKey = new Resource(resourceType, key, aLaCarte); + Resource resourceKey = new Resource(resourceType, key, aLaCarte, null); WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution); List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB", @@ -1667,7 +1757,7 @@ public class WorkflowActionTest extends BaseTaskTest { String vnfType = "vnfType"; String key = "00d15ebb-c80e-43c1-80f0-90c40dde70b0"; String resourceId = "d1d35800-783d-42d3-82f6-d654c5054a6e"; - Resource resourceKey = new Resource(resourceType, key, aLaCarte); + Resource resourceKey = new Resource(resourceType, key, aLaCarte, null); WorkflowResourceIds workflowResourceIds = SPY_workflowAction.populateResourceIdsFromApiHandler(execution); List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB", "DeleteVfModuleBB", @@ -1948,10 +2038,10 @@ public class WorkflowActionTest extends BaseTaskTest { String uri6 = "/v6/serviceInstances/123/vnfs/1234/someAction"; String uri7 = "/v6/serviceInstances/123/vnfs/1234/vfModules/5678/replace"; String uri8 = "/v6/serviceInstances/123/vnfs/1234/vfModules/scaleOut"; - Resource expected1 = new Resource(WorkflowType.SERVICE, "123", true); - Resource expected2 = new Resource(WorkflowType.VNF, "1234", false); - Resource expected3 = new Resource(WorkflowType.VNF, "1234", false); - Resource expected4 = new Resource(WorkflowType.VFMODULE, "5678", false); + Resource expected1 = new Resource(WorkflowType.SERVICE, "123", true, null); + Resource expected2 = new Resource(WorkflowType.VNF, "1234", false, expected1); + Resource expected3 = new Resource(WorkflowType.VNF, "1234", false, expected1); + Resource expected4 = new Resource(WorkflowType.VFMODULE, "5678", false, expected2); Resource result = workflowAction.extractResourceIdAndTypeFromUri(uri); assertEquals(expected1.getResourceId(), result.getResourceId()); assertEquals(expected1.getResourceType(), result.getResourceType()); @@ -2091,14 +2181,31 @@ public class WorkflowActionTest extends BaseTaskTest { return new String(Files.readAllBytes(Paths.get("src/test/resources/__files/" + fileName))); } - private List<Resource> prepareListWithResources() { + private List<Resource> prepareListWithResources(boolean addPnf, boolean addPriorites) { List<Resource> resourceList = new ArrayList<>(); - resourceList.add(new Resource(WorkflowType.SERVICE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false)); - resourceList.add(new Resource(WorkflowType.VNF, "ab153b6e-c364-44c0-bef6-1f2982117f04", false)); - resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", false)); - resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false)); - resourceList.add(new Resource(WorkflowType.VFMODULE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false)); - resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false)); + Resource r1 = new Resource(WorkflowType.SERVICE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false, null); + resourceList.add(r1); + Resource r2 = new Resource(WorkflowType.VNF, "ab153b6e-c364-44c0-bef6-1f2982117f04", false, r1); + resourceList.add(r2); + Resource r3 = new Resource(WorkflowType.VOLUMEGROUP, "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", false, r2); + resourceList.add(r3); + Resource r4 = new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false, r2); + resourceList.add(r4); + Resource r5 = new Resource(WorkflowType.VFMODULE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false, r2); + resourceList.add(r5); + Resource r6 = new Resource(WorkflowType.VFMODULE, "da4d4327-fb7d-4311-ac7a-be7ba60cf969", false, r2); + resourceList.add(r6); + if (addPnf) { + Resource r7 = new Resource(WorkflowType.PNF, "aa153b6e-c364-44c0-bef6-1f2982117f04", false, r1); + resourceList.add(r7); + } + if (addPriorites) { + r3.setProcessingPriority(2); + r4.setProcessingPriority(1); + r5.setProcessingPriority(4); + r5.setBaseVfModule(true); + r6.setProcessingPriority(3); + } return resourceList; } } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoaderTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoaderTest.java index a5ecf364a6..7a26422eb9 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoaderTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/ServiceEBBLoaderTest.java @@ -4,6 +4,8 @@ * ================================================================================ * Copyright (c) 2020 Nokia * ================================================================================ + * Modifications Copyright (c) 2021 Orange + * ================================================================================ * 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 @@ -171,10 +173,10 @@ public class ServiceEBBLoaderTest extends BaseTaskTest { @Test public void foundRelatedTest() { List<Resource> resourceList = new ArrayList<>(); - resourceList.add(new Resource(WorkflowType.PNF, "model customization id", false)); - resourceList.add(new Resource(WorkflowType.VNF, "model customization id", false)); - resourceList.add(new Resource(WorkflowType.NETWORK, "model customization id", false)); - resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, "model customization id", false)); + resourceList.add(new Resource(WorkflowType.PNF, "model customization id", false, null)); + resourceList.add(new Resource(WorkflowType.VNF, "model customization id", false, null)); + resourceList.add(new Resource(WorkflowType.NETWORK, "model customization id", false, null)); + resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, "model customization id", false, null)); assertTrue(serviceEBBLoader.foundRelated(resourceList)); } @@ -182,10 +184,10 @@ public class ServiceEBBLoaderTest extends BaseTaskTest { @Test public void containsWorkflowTypeTest() { List<Resource> resourceList = new ArrayList<>(); - resourceList.add(new Resource(WorkflowType.PNF, "resource id", false)); - resourceList.add(new Resource(WorkflowType.VNF, "model customization id", false)); - resourceList.add(new Resource(WorkflowType.NETWORK, "model customization id", false)); - resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, "model customization id", false)); + resourceList.add(new Resource(WorkflowType.PNF, "resource id", false, null)); + resourceList.add(new Resource(WorkflowType.VNF, "model customization id", false, null)); + resourceList.add(new Resource(WorkflowType.NETWORK, "model customization id", false, null)); + resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION, "model customization id", false, null)); assertTrue(serviceEBBLoader.containsWorkflowType(resourceList, WorkflowType.PNF)); assertTrue(serviceEBBLoader.containsWorkflowType(resourceList, WorkflowType.VNF)); @@ -280,7 +282,8 @@ public class ServiceEBBLoaderTest extends BaseTaskTest { doReturn(aaiLocalNetwork).when(mockBbInputSetupUtils).getAAIL3Network("localNetworkInstanceId"); - serviceEBBLoader.traverseVrfConfiguration(aaiResourceIds, resource, service, relatedVpnBinding, + Resource serviceResource = new Resource(WorkflowType.SERVICE, "1", false, null); + serviceEBBLoader.traverseVrfConfiguration(aaiResourceIds, resource, serviceResource, service, relatedVpnBinding, relatedLocalNetwork); assertEquals(resource.size(), 1); assertEquals(aaiResourceIds.size(), 0); @@ -346,12 +349,14 @@ public class ServiceEBBLoaderTest extends BaseTaskTest { private List<Resource> prepareListWithResources() { List<Resource> resourceList = new ArrayList<>(); - resourceList.add(new Resource(WorkflowType.SERVICE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false)); - resourceList.add(new Resource(WorkflowType.VNF, "ab153b6e-c364-44c0-bef6-1f2982117f04", false)); - resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", false)); - resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false)); - resourceList.add(new Resource(WorkflowType.VFMODULE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false)); - resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false)); + Resource r1 = new Resource(WorkflowType.SERVICE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false, null); + resourceList.add(r1); + Resource r2 = new Resource(WorkflowType.VNF, "ab153b6e-c364-44c0-bef6-1f2982117f04", false, r1); + resourceList.add(r2); + resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", false, r2)); + resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false, r2)); + resourceList.add(new Resource(WorkflowType.VFMODULE, "3c40d244-808e-42ca-b09a-256d83d19d0a", false, r2)); + resourceList.add(new Resource(WorkflowType.VFMODULE, "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", false, r2)); return resourceList; } } diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversalTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversalTest.java index 9f4bd97ac6..58fee86ade 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversalTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/workflow/tasks/ebb/loader/UserParamsServiceTraversalTest.java @@ -59,6 +59,7 @@ import static org.mockito.Mockito.mock; public class UserParamsServiceTraversalTest extends BaseTaskTest { private static final String MACRO_ASSIGN_JSON = "Macro/ServiceMacroAssign.json"; + private static final String MACRO_CREATE_JSON = "Macro/ServiceMacroAssignVnfAndPnf.json"; private static final String MACRO_ASSIGN_PNF_JSON = "Macro/ServiceMacroAssignPnf.json"; private static final String NETWORK_COLLECTION_JSON = "Macro/CreateNetworkCollection.json"; private static final String MACRO_CREATE_WITHOUT_RESOURCES_JSON = "Macro/ServiceMacroCreateWithoutResources.json"; @@ -114,6 +115,26 @@ public class UserParamsServiceTraversalTest extends BaseTaskTest { } @Test + public void getResourceListFromUserParamsForVnfsWithPriorities() throws Exception { + initExecution(requestAction, readBpmnRequestFromFile(MACRO_CREATE_JSON), false); + Mockito.doReturn(getVfModuleCustomization()).when(mockCatalogDbClient) + .getVfModuleCustomizationByModelCuztomizationUUID("a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"); + Mockito.doReturn(getCvnfcCustomizations()).when(mockCatalogDbClient).getCvnfcCustomization(anyString(), + anyString(), anyString()); + + List<Resource> resourceListFromUserParams = userParamsServiceTraversal.getResourceListFromUserParams(execution, + getUserParams(), serviceInstanceId, requestAction); + List<WorkflowType> expected = List.of(WorkflowType.SERVICE, WorkflowType.VNF, WorkflowType.VOLUMEGROUP, + WorkflowType.VFMODULE, WorkflowType.CONFIGURATION, WorkflowType.PNF); + List<WorkflowType> result = + resourceListFromUserParams.stream().map(Resource::getResourceType).collect(Collectors.toList()); + + assertEquals(6, resourceListFromUserParams.size()); + assertThat(expected, is(result)); + assertEquals(2, resourceListFromUserParams.get(1).getChildren().get(1).getProcessingPriority()); + } + + @Test public void getResourceListFromUserParamsForPnfs() throws Exception { initExecution(requestAction, readBpmnRequestFromFile(MACRO_ASSIGN_PNF_JSON), false); Mockito.doReturn(getVfModuleCustomization()).when(mockCatalogDbClient) diff --git a/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignVnfAndPnf.json b/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignVnfAndPnf.json new file mode 100644 index 0000000000..5a2c963135 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/test/resources/__files/Macro/ServiceMacroAssignVnfAndPnf.json @@ -0,0 +1,157 @@ +{ + "requestDetails": { + "modelInfo": { + "modelType": "service", + "modelInvariantId": "5d48acb5-097d-4982-aeb2-f4a3bd87d31b", + "modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a", + "modelName": "Sample Service Model", + "modelVersion": "10.0" + }, + "cloudConfiguration": { + "cloudOwner": "my-custom-cloud-owner" + }, + "owningEntity": { + "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489", + "owningEntityName": "PACKET CORE" + }, + "project": { + "projectName": "{some project name}" + }, + "subscriberInfo": { + "globalSubscriberId": "{some subscriber id}" + }, + "requestInfo": { + "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "source": "VID", + "suppressRollback": true, + "requestorId": "xxxxxx", + "instanceName": "test" + }, + "requestParameters": { + "subscriptionServiceType": "VMX", + "aLaCarte": false, + "userParams": [ + { + "service": { + "modelInfo": { + "modelType": "service", + "modelName": "Sample Service Model", + "modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a" + }, + "instanceParams": [], + "resources": { + "pnfs": [ + { + "modelInfo": { + "modelType": "pnf", + "modelName": "2016-73_MOW-AVPN-vPE-BV-L-PNF", + "modelVersionId": "1f40c192-f63c-463e-ba94-286933b895f8", + "modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L-PNF 0", + "modelCustomizationId": "aa153b6e-c364-44c0-bef6-1f2982117f04" + }, + "cloudConfiguration": { + "lcpCloudRegionId": "mdt1", + "tenantId": "88a6ca3ee0394ade9403f075db23167e" + }, + "platform": { + "platformName": "test" + }, + "lineOfBusiness": { + "lineOfBusinessName": "someValue" + }, + "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "instanceParams": [] + } + ], + "vnfs": [ + { + "modelInfo": { + "modelType": "vnf", + "modelName": "2016-73_MOW-AVPN-vPE-BV-L", + "modelVersionId": "7f40c192-f63c-463e-ba94-286933b895f8", + "modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L 0", + "modelCustomizationId": "ab153b6e-c364-44c0-bef6-1f2982117f04" + }, + "cloudConfiguration": { + "lcpCloudRegionId": "mdt1", + "tenantId": "88a6ca3ee0394ade9403f075db23167e" + }, + "platform": { + "platformName": "test" + }, + "lineOfBusiness": { + "lineOfBusinessName": "someValue" + }, + "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", + "instanceParams": [], + "processingPriority": 2, + "vfModules": [ + { + "modelInfo": { + "modelType": "vfModule", + "modelName": "201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0", + "modelVersionId": "4c75f813-fa91-45a4-89d0-790ff5f1ae79", + "modelCustomizationId": "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f" + }, + "processingPriority": 2, + "instanceParams": [ + { + "vmx_int_net_len": "24" + } + ] + }, + { + "modelInfo": { + "modelType": "vfModule", + "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1", + "modelVersionId": "56e2b103-637c-4d1a-adc8-3a7f4a6c3240", + "modelCustomizationId": "72d9d1cd-f46d-447a-abdb-451d6fb05fa8" + }, + "processingPriority": 1, + "instanceParams": [ + { + "availability_zone_0": "mtpocdv-kvm-az01", + "vre_a_volume_size_0": "100" + } + ] + }, + { + "modelInfo": { + "modelType": "vfModule", + "modelName": "201673MowAvpnVpeBvL..AVPN_vPFE_BV..module-3", + "modelVersionId": "f555558f-d538-4876-8ffa-b102650fad64", + "modelCustomizationId": "3c40d244-808e-42ca-b09a-256d83d19d0a" + }, + "processingPriority": 4, + "instanceParams": [ + { + "availability_zone_0": "mtpocdv-kvm-az01", + "vmx_vpfe_int_ip_0": "192.168.0.16" + } + ] + }, + { + "modelInfo": { + "modelType": "vfModule", + "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-2", + "modelVersionId": "16e2b103-637c-4d1a-adc8-3a7f4a6c3240", + "modelCustomizationId": "da4d4327-fb7d-4311-ac7a-be7ba60cf969" + }, + "processingPriority": 3, + "instanceParams": [ + { + "availability_zone_0": "mtpocdv-kvm-az01", + "vre_a_volume_size_0": "50" + } + ] + } + ] + } + ] + } + } + } + ] + } + } +}
\ No newline at end of file diff --git a/bpmn/so-bpmn-tasks/src/test/resources/logback-test.xml b/bpmn/so-bpmn-tasks/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..bb4aee6e05 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/test/resources/logback-test.xml @@ -0,0 +1,36 @@ +<!-- + ============LICENSE_START======================================================= + ONAP - SO + ================================================================================ + Copyright (C) 2021 Nordix Foundation. + ================================================================================ + 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. + + SPDX-License-Identifier: Apache-2.0 + ============LICENSE_END========================================================= +--> +<configuration> + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n + </pattern> + </encoder> + </appender> + + <logger name="org.reflections" level="ERROR" /> + <logger name="org.onap" level="DEBUG" /> + + <root level="INFO"> + <appender-ref ref="STDOUT" /> + </root> +</configuration> |