diff options
Diffstat (limited to 'bpmn')
10 files changed, 367 insertions, 6 deletions
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/InstanceResourceList.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/InstanceResourceList.java new file mode 100644 index 0000000000..b50ecdad8b --- /dev/null +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/InstanceResourceList.java @@ -0,0 +1,160 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2019 Huawei 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.common.resource; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import org.onap.so.bpmn.core.domain.GroupResource; +import org.onap.so.bpmn.core.domain.Resource; +import org.onap.so.bpmn.core.domain.ResourceType; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class InstanceResourceList { + + private static List<Map<String, List<GroupResource>>> convertUUIReqTOStd(final String uuiRequest, + List<Resource> seqResourceList) { + + List<Map<String, List<GroupResource>>> normalizedList = new ArrayList<>(); + + Gson gson = new Gson(); + JsonObject servJsonObject = gson.fromJson(uuiRequest, JsonObject.class); + + JsonObject reqInputJsonObj = servJsonObject.getAsJsonObject("service").getAsJsonObject("parameters") + .getAsJsonObject("requestInputs"); + + // iterate all node in requestInputs + Iterator<Map.Entry<String, JsonElement>> iterator = reqInputJsonObj.entrySet().iterator(); + + while (iterator.hasNext()) { // iterate all <vf>_list + Map.Entry<String, JsonElement> entry = iterator.next(); + + // truncate "_list" from key and keep only the <VF_NAME> + String key = entry.getKey().substring(0, entry.getKey().indexOf("_list")); + + // all the element represent VF will contain "<VF_NAME>_list". + if (key.contains("_list")) { + // this will return list of vf of same type + // e.g. vf_list [{vf1}, {vf2}] + Iterator<JsonElement> vfsIterator = entry.getValue().getAsJsonArray().iterator(); + + while (vfsIterator.hasNext()) { // iterate all [] inside vf_list + JsonObject vfObject = vfsIterator.next().getAsJsonObject(); + List<GroupResource> tmpGrpsHolder = new ArrayList<>(); + + // iterate vfObject to get groups(vfc) + // currently each vfc represented by one group. + Iterator<Map.Entry<String, JsonElement>> vfIterator = vfObject.entrySet().iterator(); + while (vfIterator.hasNext()) { // iterate all property inside a VF + Map.Entry<String, JsonElement> vfEntry = vfIterator.next(); + + // property name for vfc input will always carry "<VFC_NAME>_list" + if (vfEntry.getKey().contains("_list")) { + // truncate "_list" from key and keep only the <VFC_NAME> + String vfcName = vfEntry.getKey().substring(0, vfEntry.getKey().indexOf("_list")); + GroupResource grpRes = getGroupResource(vfcName, seqResourceList); + // A <vfc>_list can contain more than one vfc of same type + Iterator<JsonElement> vfcsIterator = vfEntry.getValue().getAsJsonArray().iterator(); + + while (vfcsIterator.hasNext()) { // iterate all the vfcs inside <vfc>_list + tmpGrpsHolder.add(grpRes); + } + } + } + List<GroupResource> seqGrpResourceList = seqGrpResource(tmpGrpsHolder, seqResourceList); + HashMap<String, List<GroupResource>> entryNormList = new HashMap<>(); + entryNormList.put(key, seqGrpResourceList); + normalizedList.add(entryNormList); + } + } + } + + return normalizedList; + } + + private static List<GroupResource> seqGrpResource(List<GroupResource> grpResources, List<Resource> resourceList) { + List<GroupResource> seqGrpResList = new ArrayList<>(); + for (Resource r : resourceList) { + if (r.getResourceType() != ResourceType.GROUP) { + continue; + } + for (GroupResource g : grpResources) { + if (r.getModelInfo().getModelName().equalsIgnoreCase(g.getModelInfo().getModelName())) { + seqGrpResList.add(g); + } + } + } + return seqGrpResList; + } + + private static GroupResource getGroupResource(String vfcName, List<Resource> seqRessourceList) { + for (Resource r : seqRessourceList) { + if (r.getResourceType() == ResourceType.GROUP) { + // Currently only once vnfc is added to group + return ((GroupResource) r).getVnfcs().get(0).getModelInfo().getModelName().contains(vfcName) + ? (GroupResource) r + : null; + } + } + return null; + } + + private static List<Resource> convertToInstanceResourceList(List<Map<String, List<GroupResource>>> normalizedReq, + List<Resource> seqResourceList) { + List<Resource> flatResourceList = new ArrayList<>(); + for (Resource r : seqResourceList) { + if (r.getResourceType() == ResourceType.VNF) { + for (Map<String, List<GroupResource>> entry : normalizedReq) { + if (r.getModelInfo().getModelName().equalsIgnoreCase(entry.keySet().iterator().next())) { + flatResourceList.add(r); + flatResourceList.addAll(entry.get(entry.keySet().iterator().next())); + } + } + } + } + return flatResourceList; + } + + public static List<Resource> getInstanceResourceList(final List<Resource> seqResourceList, + final String uuiRequest) { + + // this will convert UUI request to normalized form + List<Map<String, List<GroupResource>>> normalizedReq = convertUUIReqTOStd(uuiRequest, seqResourceList); + + // now UUI json req is normalized to + // [ + // { VFB1 : [GrpA1, GrA2, GrB1]}, + // { VFB2 : [GrpA1, GrB1]}, + // { VFA1 : [GrpC1]} + // ] + // now sequence according to VF order (Group is already sequenced). + // After sequence it will look like : + // [ + // { VFA1 : [GrpA1, GrA2, GrB1]}, + // { VFA2 : [GrpA1, GrB1]}, + // { VFB1 : [GrpC1]} + // ] + return convertToInstanceResourceList(normalizedReq, seqResourceList); + } +} diff --git a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/GroupResource.java b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/GroupResource.java new file mode 100644 index 0000000000..d194f2750a --- /dev/null +++ b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/GroupResource.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2019 Huawei 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.core.domain; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import java.util.UUID; + +public class GroupResource extends Resource { + private static final long serialVersionUID = 1L; + + @JsonProperty("vnfcs") + private List<VnfcResource> vnfcs; + + public GroupResource() { + resourceType = ResourceType.GROUP; + setResourceId(UUID.randomUUID().toString()); + } + + public List<VnfcResource> getVnfcs() { + return vnfcs; + } + + public void setVnfcs(List<VnfcResource> vnfcs) { + this.vnfcs = vnfcs; + } +} diff --git a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/ResourceType.java b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/ResourceType.java index a30d0df825..0e17d4c826 100644 --- a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/ResourceType.java +++ b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/ResourceType.java @@ -22,5 +22,5 @@ package org.onap.so.bpmn.core.domain; public enum ResourceType { - VNF, NETWORK, MODULE, ALLOTTED_RESOURCE, CONFIGURATION // etc. + VNF, NETWORK, MODULE, ALLOTTED_RESOURCE, CONFIGURATION, GROUP, VNFC // etc. } diff --git a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/ServiceDecomposition.java b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/ServiceDecomposition.java index 419f545cdf..b3439d58e3 100644 --- a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/ServiceDecomposition.java +++ b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/ServiceDecomposition.java @@ -245,7 +245,7 @@ public class ServiceDecomposition extends JsonWrapper implements Serializable { */ @JsonIgnore public List<Resource> getServiceResources() { - ArrayList serviceResources = new ArrayList(); + ArrayList<Resource> serviceResources = new ArrayList(); if (this.getAllottedResources() != null) { serviceResources.addAll(this.getAllottedResources()); } diff --git a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/VnfResource.java b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/VnfResource.java index a69a49b89a..da8d5a1f13 100644 --- a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/VnfResource.java +++ b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/VnfResource.java @@ -51,6 +51,13 @@ public class VnfResource extends Resource { */ @JsonProperty("vfModules") private List<ModuleResource> vfModules; + + @JsonProperty("groups") + private List<GroupResource> groups; + + @JsonProperty("group-order") + private String groupOrder; + private String vnfHostname; private String vnfType; private String nfFunction; @@ -151,6 +158,22 @@ public class VnfResource extends Resource { this.resourceInput = resourceInput; } + public List<GroupResource> getGroups() { + return groups; + } + + public void setGroups(List<GroupResource> groups) { + this.groups = groups; + } + + public String getGroupOrder() { + return groupOrder; + } + + public void setGroupOrder(String groupOrder) { + this.groupOrder = groupOrder; + } + /** * Returns a list of all VfModule objects. Base module is first entry in the list * diff --git a/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/VnfcResource.java b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/VnfcResource.java new file mode 100644 index 0000000000..5fced9a8ab --- /dev/null +++ b/bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/VnfcResource.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2019 Huawei 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.core.domain; + +import java.util.UUID; + +public class VnfcResource extends Resource { + private static final long serialVersionUID = 1L; + + public VnfcResource() { + resourceType = ResourceType.VNFC; + setResourceId(UUID.randomUUID().toString()); + } +} diff --git a/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/ServiceDecompositionTest.java b/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/ServiceDecompositionTest.java index 5db277628e..7ef7deea30 100644 --- a/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/ServiceDecompositionTest.java +++ b/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/ServiceDecompositionTest.java @@ -52,6 +52,22 @@ public class ServiceDecompositionTest { configResource.setResourceId("configResourceId"); } + + @Test + public void serviceDecompositionWithGroupandVnfc() throws IOException { + String sericeStr = new String(Files.readAllBytes(Paths.get(RESOURCE_PATH + "ServiceWithGroupandVnfc.json"))); + ServiceDecomposition serviceDecomposition = new ServiceDecomposition(sericeStr); + + assertEquals(1, serviceDecomposition.getVnfResources().size()); + assertEquals(1, serviceDecomposition.getVnfResources().get(0).getGroups().size()); + assertEquals(1, serviceDecomposition.getVnfResources().get(0).getGroups().get(0).getVnfcs().size()); + + VnfcResource vnfcResource = serviceDecomposition.getVnfResources().get(0).getGroups().get(0).getVnfcs().get(0); + + assertEquals("xfs", vnfcResource.getModelInfo().getModelName()); + assertEquals("22", vnfcResource.getModelInfo().getModelUuid()); + } + @Test public void serviceDecompositionTest() throws JsonProcessingException, IOException { // covering methods not covered by openpojo test diff --git a/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/VnfResourceTest.java b/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/VnfResourceTest.java index b23633b4d8..de7b21ed73 100644 --- a/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/VnfResourceTest.java +++ b/bpmn/MSOCoreBPMN/src/test/java/org/onap/so/bpmn/core/domain/VnfResourceTest.java @@ -14,12 +14,13 @@ */ package org.onap.so.bpmn.core.domain; -import static org.junit.Assert.*; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class VnfResourceTest { diff --git a/bpmn/MSOCoreBPMN/src/test/resources/json-examples/ServiceWithGroupandVnfc.json b/bpmn/MSOCoreBPMN/src/test/resources/json-examples/ServiceWithGroupandVnfc.json new file mode 100644 index 0000000000..9d0326e66a --- /dev/null +++ b/bpmn/MSOCoreBPMN/src/test/resources/json-examples/ServiceWithGroupandVnfc.json @@ -0,0 +1,58 @@ +{ + "serviceResources": { + "modelInfo": { + "modelName": "NSService", + "modelUuid": "0bad8c92-7d22-49f0-b092-b64e6ca564a7", + "modelInvariantUuid": "69161960-515b-4bf3-91f1-313b813f5e1d", + "modelVersion": "1.0" + }, + "serviceType": "", + "serviceRole": "", + "environmentContext": "General_Revenue-Bearing", + "resourceOrder": "NF", + "workloadContext": "Production", + "serviceVnfs": [ + { + "modelInfo": { + "modelName": "", + "modelUuid": "123", + "modelInvariantUuid": "", + "modelVersion": "", + "modelCustomizationUuid": "1234", + "modelInstanceName": "test" + }, + "toscaNodeType": "", + "nfFunction": "", + "nfType": "", + "nfRole": "", + "nfNamingCode": "", + "multiStageDesign": "", + "resourceInput": "", + "vfModules": [], + "groups": [ + { + "modelInfo": { + "modelName": "test", + "modelUuid": "11", + "modelInvariantUuid": "11", + "modelVersion": "2" + }, + "vnfcs": [ + { + "modelInfo": { + "modelName": "xfs", + "modelUuid": "22", + "modelInvariantUuid": "2222", + "modelVersion": "22222", + "modelCustomizationUuid": "2222" + } + } + ] + } + ] + } + ], + "serviceNetworks": [], + "serviceAllottedResources": [] + } +}
\ No newline at end of file diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateResources.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateResources.groovy index 98def612de..973d8a156c 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateResources.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateResources.groovy @@ -22,7 +22,9 @@ package org.onap.so.bpmn.infrastructure.scripts +import org.onap.so.bpmn.common.resource.InstanceResourceList import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory +import org.onap.so.bpmn.core.domain.GroupResource import org.onap.so.bpmn.infrastructure.properties.BPMNProperties import org.apache.commons.lang3.StringUtils import org.apache.http.HttpResponse @@ -87,6 +89,16 @@ public class DoCreateResources extends AbstractServiceTaskProcessor{ logger.trace("Exit preProcessRequest ") } + // this method will convert resource list to instance_resource_list + void prepareInstanceResourceList(DelegateExecution execution) { + + String uuiRequest = execution.getVariable("uuiRequest") + List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList") + List<Resource> instanceResourceList = InstanceResourceList.getInstanceResourceList(sequencedResourceList, uuiRequest) + + execution.setVariable("instanceResourceList", instanceResourceList) + } + public void sequenceResoure(DelegateExecution execution) { logger.trace("Start sequenceResoure Process ") @@ -117,6 +129,22 @@ public class DoCreateResources extends AbstractServiceTaskProcessor{ if (StringUtils.containsIgnoreCase(resource.getModelInfo().getModelName(), resourceType)) { sequencedResourceList.add(resource) + // if resource type is vnfResource then check for groups also + // Did not use continue because if same model type is used twice + // then we would like to add it twice for processing + // e.g. S{ V1{G1, G2, G1}} --> S{ V1{G1, G1, G2}} + if (resource instanceof VnfResource) { + if (resource.getGroups() != null) { + String[] grpSequence = resource.getGroupOrder().split(",") + for (String grpType in grpSequence) { + for (GroupResource gResource in resource.getGroups()) { + if (StringUtils.containsIgnoreCase(gResource.getModelInfo().getModelName(), grpType)) { + sequencedResourceList.add(gResource) + } + } + } + } + } if (resource instanceof NetworkResource) { networkResourceList.add(resource) } @@ -126,7 +154,7 @@ public class DoCreateResources extends AbstractServiceTaskProcessor{ } else { //define sequenced resource list, we deploy vf first and then network and then ar - //this is defaule sequence + //this is default sequence List<VnfResource> vnfResourceList = new ArrayList<VnfResource>() List<AllottedResource> arResourceList = new ArrayList<AllottedResource>() |