*/
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 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;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.so.bpmn.core.domain.GroupResource;
+import org.onap.so.bpmn.core.domain.Resource;
+import org.onap.so.bpmn.core.domain.VnfResource;
public class InstanceResourceList {
- private static List<Map<String, List<GroupResource>>> convertUUIReqTOStd(final String uuiRequest,
- List<Resource> seqResourceList) {
+ private InstanceResourceList() {
+ throw new IllegalStateException("Utility class");
+ }
- List<Map<String, List<GroupResource>>> normalizedList = new ArrayList<>();
+ // 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 resourceInput = "";
+ if (resource instanceof VnfResource) {
+ resourceInput = ((VnfResource) resource).getResourceInput();
+ } else if (resource instanceof GroupResource) {
+ resourceInput = ((GroupResource) resource).getVnfcs().get(0).getResourceInput();
+ }
Gson gson = new Gson();
- JsonObject servJsonObject = gson.fromJson(uuiRequest, JsonObject.class);
+ Type type = new TypeToken<Map<String, String>>() {}.getType();
+ Map<String, String> map = gson.fromJson(resourceInput, type);
+
+ if (map != null) {
+ 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() : "";
+ } else {
+ return "";
+ }
+ }
+
+
+ public static List<Resource> getInstanceResourceList(final VnfResource vnfResource, final String uuiRequest) {
+ List<Resource> sequencedResourceList = 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);
- }
- }
+ String pk = getPrimaryKey(vnfResource);
+ // if pk is not empty that means it can contain list of VNF
+ if (!pk.isEmpty()) {
+ JsonElement vfNode = reqInputJsonObj.get(pk);
+ if (vfNode.isJsonArray()) {
+ // multiple instance of VNF
+ JsonArray vfNodeList = vfNode.getAsJsonArray();
+ for (JsonElement vf : vfNodeList) {
+ JsonObject vfObj = vf.getAsJsonObject();
+
+ // Add VF first before adding groups
+ sequencedResourceList.add(vnfResource);
+ List<Resource> sequencedGroupResourceList = getGroupResourceInstanceList(vnfResource, vfObj);
+ if (!sequencedGroupResourceList.isEmpty()) {
+ sequencedResourceList.addAll(sequencedGroupResourceList);
}
- List<GroupResource> seqGrpResourceList = seqGrpResource(tmpGrpsHolder, seqResourceList);
- HashMap<String, List<GroupResource>> entryNormList = new HashMap<>();
- entryNormList.put(key, seqGrpResourceList);
- normalizedList.add(entryNormList);
}
}
+ } else {
+ // if pk is empty that means it has only one VNF Node
+ // Add VF first before adding groups
+ sequencedResourceList.add(vnfResource);
+ // check the groups for this VNF and add into resource list
+ List<Resource> sequencedGroupResourceList = getGroupResourceInstanceList(vnfResource, reqInputJsonObj);
+ if (!sequencedGroupResourceList.isEmpty()) {
+ sequencedResourceList.addAll(sequencedGroupResourceList);
+ }
}
- 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);
- }
- }
+ // In negative case consider only VNF resource only
+ if (sequencedResourceList.isEmpty()) {
+ sequencedResourceList.add(vnfResource);
}
- 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;
- }
+ // check if the resource contains vf-module
+ if (vnfResource != null && vnfResource.getVfModules() != null) {
+ sequencedResourceList.addAll(vnfResource.getVfModules());
}
- return null;
+
+ return sequencedResourceList;
}
- 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()));
+ private static List<Resource> getGroupResourceInstanceList(VnfResource vnfResource, JsonObject vfObj) {
+ List<Resource> sequencedResourceList = new ArrayList<>();
+ if (vnfResource.getGroupOrder() != null && !StringUtils.isEmpty(vnfResource.getGroupOrder())) {
+ String[] grpSequence = vnfResource.getGroupOrder().split(",");
+ for (String grpType : grpSequence) {
+ for (GroupResource gResource : vnfResource.getGroups()) {
+ if (StringUtils.containsIgnoreCase(gResource.getModelInfo().getModelName(), grpType)) {
+ // check the number of group instances from UUI to be added
+ String sk = getPrimaryKey(gResource);
+
+ // if sk is empty that means it is not list type
+ // only one group / vnfc to be considered
+ if (sk.isEmpty()) {
+ sequencedResourceList.add(gResource);
+ } else {
+ // check the number of list size of VNFC of a group
+ JsonElement vfcNode = vfObj.get(sk);
+ if (vfcNode.isJsonArray()) {
+ JsonArray vfcList = vfcNode.getAsJsonArray();
+ for (JsonElement vfc : vfcList) {
+ sequencedResourceList.add(gResource);
+ }
+ } else {
+ // consider only one vnfc/group if not an array
+ sequencedResourceList.add(gResource);
+ }
+ }
+
}
}
}
}
- 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);
+ return sequencedResourceList;
}
}