diff options
author | subhash kumar singh <subhash.kumar.singh@huawei.com> | 2019-04-30 07:04:39 +0530 |
---|---|---|
committer | subhash kumar singh <subhash.kumar.singh@huawei.com> | 2019-05-02 16:34:39 +0530 |
commit | 5ed1062dcc39cfa7a99b8a5b6882a75f4acffea6 (patch) | |
tree | 3087a18d758354ff3fddd544abefb197ebbbf256 /bpmn/MSOCommonBPMN/src/main/java/org/onap | |
parent | acb8997a69725a39270a6527b33995f51c1e4586 (diff) |
Modify instance resource list creation
Modify instance resource list creation to avoid hard locking of
model name in UUI request.
e.g.
VF resource and gruop resource has resource input
vf { resource_input : { key1:value2, key2:[vf_prop_list,INDEX,key]|default}
Derive the key ("vf_prop_list") from resource input and use this
info to map UUI request.
UUI req:
{
...
resourceInput: {
vf_prop_list : /// mapped with resource input of resource
{
....
Change-Id: Ic40079a094b2628bcf6f5758121b7492ee3c1353
Issue-ID: SO-1393
Signed-off-by: subhash kumar singh <subhash.kumar.singh@huawei.com>
Diffstat (limited to 'bpmn/MSOCommonBPMN/src/main/java/org/onap')
-rw-r--r-- | bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/common/resource/InstanceResourceList.java | 175 |
1 files changed, 85 insertions, 90 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 index b50ecdad8b..71ea3b565b 100644 --- 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 @@ -19,116 +19,120 @@ */ package org.onap.so.bpmn.common.resource; +import com.google.common.reflect.TypeToken; import com.google.gson.Gson; +import com.google.gson.JsonArray; 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 org.onap.so.bpmn.core.domain.VnfResource; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; public class InstanceResourceList { - private static List<Map<String, List<GroupResource>>> convertUUIReqTOStd(final String uuiRequest, + private static Map<String, List<List<GroupResource>>> convertUUIReqTOStd(final JsonObject reqInputJsonObj, List<Resource> seqResourceList) { - List<Map<String, List<GroupResource>>> normalizedList = new ArrayList<>(); + Map<String, List<List<GroupResource>>> normalizedRequest = new HashMap<>(); + for (Resource r : seqResourceList) { - Gson gson = new Gson(); - JsonObject servJsonObject = gson.fromJson(uuiRequest, JsonObject.class); + if (r.getResourceType() == ResourceType.VNF) { + String pk = getPrimaryKey(r); - JsonObject reqInputJsonObj = servJsonObject.getAsJsonObject("service").getAsJsonObject("parameters") - .getAsJsonObject("requestInputs"); + JsonElement vfNode = reqInputJsonObj.get(pk); - // 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); - } + // if the service property is type of array then it + // means it is a VF resource + if (vfNode instanceof JsonArray) { + + for (int i = 0; i < ((JsonArray) vfNode).size(); i++) { + List<List<GroupResource>> groupsList = normalizedRequest.get(pk); + if (groupsList == null) { + groupsList = new ArrayList<>(); + normalizedRequest.put(pk, groupsList); } + + groupsList.add(new ArrayList<>()); } - List<GroupResource> seqGrpResourceList = seqGrpResource(tmpGrpsHolder, seqResourceList); - HashMap<String, List<GroupResource>> entryNormList = new HashMap<>(); - entryNormList.put(key, seqGrpResourceList); - normalizedList.add(entryNormList); } - } - } - return normalizedList; - } + } else if (r.getResourceType() == ResourceType.GROUP) { + String sk = getPrimaryKey(r); - 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); + for (String pk : normalizedRequest.keySet()) { + JsonArray vfs = reqInputJsonObj.getAsJsonArray(pk); + + for (int i = 0; i < vfs.size(); i++) { + + JsonElement vfcsNode = vfs.get(i).getAsJsonObject().get(sk); + if (vfcsNode instanceof JsonArray) { + + List<GroupResource> groupResources = normalizedRequest.get(pk).get(i); + + if (groupResources == null) { + groupResources = new ArrayList<>(); + normalizedRequest.get(pk).add(i, groupResources); + } + + for (int j = 0; j < ((JsonArray) vfcsNode).size(); j++) { + groupResources.add((GroupResource) r); + } + } + } } } } - return seqGrpResList; + return normalizedRequest; } - 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; - } + // this method returns key from resource input + // e.g. {\"sdwansite_emails\" : \"[sdwansiteresource_list(PK), INDEX, sdwansite_emails]|default\", + // ....} + // it will return sdwansiteresource_list + private static String getPrimaryKey(Resource resource) { + String pk = ""; + + String resourceInput = ""; + if (resource instanceof VnfResource) { + resourceInput = ((VnfResource) resource).getResourceInput(); + } else if (resource instanceof GroupResource) { + resourceInput = ((GroupResource) resource).getVnfcs().get(0).getResourceInput(); } - return null; + + Gson gson = new Gson(); + Type type = new TypeToken<Map<String, String>>() {}.getType(); + Map<String, String> map = gson.fromJson(resourceInput, type); + + Optional<String> pkOpt = map.values().stream().filter(e -> e.contains("[")).map(e -> e.replace("[", "")) + .map(e -> e.split(",")[0]).findFirst(); + + return pkOpt.isPresent() ? pkOpt.get() : ""; } - private static List<Resource> convertToInstanceResourceList(List<Map<String, List<GroupResource>>> normalizedReq, + private static List<Resource> convertToInstanceResourceList(Map<String, List<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())); + String primaryKey = getPrimaryKey(r); + for (String pk : normalizedReq.keySet()) { + + if (primaryKey.equalsIgnoreCase(pk)) { + + List<List<GroupResource>> vfs = normalizedReq.get(pk); + + vfs.stream().forEach(e -> { + flatResourceList.add(r); + flatResourceList.addAll(e); + }); } } } @@ -139,22 +143,13 @@ public class InstanceResourceList { public static List<Resource> getInstanceResourceList(final List<Resource> seqResourceList, final String uuiRequest) { + Gson gson = new Gson(); + JsonObject servJsonObject = gson.fromJson(uuiRequest, JsonObject.class); + JsonObject reqInputJsonObj = servJsonObject.getAsJsonObject("service").getAsJsonObject("parameters") + .getAsJsonObject("requestInputs"); + // 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); + Map<String, List<List<GroupResource>>> normalizedRequest = convertUUIReqTOStd(reqInputJsonObj, seqResourceList); + return convertToInstanceResourceList(normalizedRequest, seqResourceList); } } |