aboutsummaryrefslogtreecommitdiffstats
path: root/vid-app-common/src/main/java/org/onap/vid/services/AAIServiceTree.java
diff options
context:
space:
mode:
Diffstat (limited to 'vid-app-common/src/main/java/org/onap/vid/services/AAIServiceTree.java')
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/services/AAIServiceTree.java124
1 files changed, 63 insertions, 61 deletions
diff --git a/vid-app-common/src/main/java/org/onap/vid/services/AAIServiceTree.java b/vid-app-common/src/main/java/org/onap/vid/services/AAIServiceTree.java
index 6199c4e58..d62d5d5d4 100644
--- a/vid-app-common/src/main/java/org/onap/vid/services/AAIServiceTree.java
+++ b/vid-app-common/src/main/java/org/onap/vid/services/AAIServiceTree.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.
@@ -21,7 +21,6 @@
package org.onap.vid.services;
import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableList;
import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
import org.onap.vid.aai.AaiClientInterface;
@@ -31,21 +30,24 @@ import org.onap.vid.asdc.parser.ServiceModelInflator;
import org.onap.vid.exceptions.GenericUncheckedException;
import org.onap.vid.model.ServiceModel;
import org.onap.vid.model.aaiTree.AAITreeNode;
+import org.onap.vid.model.aaiTree.NodeType;
import org.onap.vid.model.aaiTree.ServiceInstance;
import org.onap.vid.utils.Tree;
+import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import javax.ws.rs.core.Response;
import java.util.*;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.ExecutorService;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
-import static java.lang.Thread.sleep;
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toSet;
import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
-import static org.onap.vid.services.AAITreeNodeBuilder.*;
+import static org.onap.vid.utils.KotlinUtilsKt.JACKSON_OBJECT_MAPPER;
@Component
public class AAIServiceTree {
@@ -60,38 +62,58 @@ public class AAIServiceTree {
private final ServiceModelInflator serviceModelInflator;
- private final ObjectMapper mapper = new ObjectMapper();
+ private final ExecutorService executorService;
private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(AAIServiceTree.class);
public static final Tree<AaiRelationship> AAI_TREE_PATHS =
- new Tree<>(new AaiRelationship(SERVICE_INSTANCE));
+ new Tree<>(new AaiRelationship(NodeType.SERVICE_INSTANCE));
static {
- AAI_TREE_PATHS.addPath(toAaiRelationshipList(GENERIC_VNF, VG));
- AAI_TREE_PATHS.addPath(toAaiRelationshipList(NETWORK));
- AAI_TREE_PATHS.addPath(toAaiRelationshipList(GENERIC_VNF, NETWORK));
- AAI_TREE_PATHS.addPath(toAaiRelationshipList(INSTANCE_GROUP));
+ AAI_TREE_PATHS.addPath(toAaiRelationshipList(NodeType.GENERIC_VNF, NodeType.VOLUME_GROUP));
+ AAI_TREE_PATHS.addPath(toAaiRelationshipList(NodeType.GENERIC_VNF, NodeType.VF_MODULE));
+ AAI_TREE_PATHS.addPath(toAaiRelationshipList(NodeType.GENERIC_VNF, NodeType.NETWORK, NodeType.VPN_BINDING));
+ AAI_TREE_PATHS.addPath(toAaiRelationshipList(NodeType.NETWORK, NodeType.VPN_BINDING));
+ AAI_TREE_PATHS.addPath(toAaiRelationshipList(NodeType.INSTANCE_GROUP, NodeType.GENERIC_VNF));
+ AAI_TREE_PATHS.addPath(toAaiRelationshipList(NodeType.COLLECTION_RESOURCE, NodeType.INSTANCE_GROUP));
+ AAI_TREE_PATHS.addPath(toAaiRelationshipList(NodeType.CONFIGURATION, NodeType.NETWORK, NodeType.VPN_BINDING));
+ AAI_TREE_PATHS.addPath(toAaiRelationshipList(NodeType.CONFIGURATION, NodeType.VPN_BINDING));
+ }
+
+ public static List<AAIServiceTree.AaiRelationship> toAaiRelationshipList(NodeType... types) {
+ return Stream.of(types).map(AAIServiceTree.AaiRelationship::new).collect(Collectors.toList());
}
@Inject
public AAIServiceTree(AaiClientInterface aaiClient, AAITreeNodeBuilder aaiTreeNodeBuilder,
AAITreeConverter aaiTreeConverter, VidService sdcService,
- ServiceModelInflator serviceModelInflator) {
+ ServiceModelInflator serviceModelInflator, ExecutorService executorService) {
this.aaiClient = aaiClient;
this.aaiTreeNodeBuilder = aaiTreeNodeBuilder;
this.aaiTreeConverter = aaiTreeConverter;
this.sdcService = sdcService;
this.serviceModelInflator = serviceModelInflator;
+ this.executorService = executorService;
+ }
+
+ List<AAITreeNode> buildAAITreeForUniqueResource(String getUrl, NodeType nodeType) {
+ return buildAAITreeForUniqueResourceFromCustomQuery(getUrl, null, HttpMethod.GET, nodeType);
+ }
+
+ List<AAITreeNode> buildAAITreeForUniqueResourceFromCustomQuery(String url, String payload, HttpMethod method, NodeType nodeType) {
+ Tree<AAIServiceTree.AaiRelationship> pathsToSearch = new Tree<>(new AAIServiceTree.AaiRelationship(nodeType));
+ return buildAAITree(url, payload, method, pathsToSearch, false);
}
- public List<AAITreeNode> buildAAITree(String getUrl, Tree<AaiRelationship> pathsToSearch) {
+ public List<AAITreeNode> buildAAITree(String url, String payload, HttpMethod method, Tree<AaiRelationship> pathsToSearch, boolean enrichWithModelVersion) {
ConcurrentSkipListSet<AAITreeNode> nodesAccumulator = createNodesAccumulator();
- List<AAITreeNode> aaiTreeNodes = fetchAAITree(getUrl, pathsToSearch, nodesAccumulator, true);
+ List<AAITreeNode> aaiTreeNodes = fetchAAITree(url, payload, method, pathsToSearch, nodesAccumulator);
- enrichNodesWithModelVersionAndModelName(nodesAccumulator);
+ if (enrichWithModelVersion) {
+ enrichNodesWithModelVersionAndModelName(nodesAccumulator);
+ }
return aaiTreeNodes;
}
@@ -105,7 +127,7 @@ public class AAIServiceTree {
//Used later to get the nodes UUID
ConcurrentSkipListSet<AAITreeNode> nodesAccumulator = createNodesAccumulator();
- AAITreeNode aaiTree = fetchAAITree(getURL, AAI_TREE_PATHS, nodesAccumulator, false).get(0);
+ AAITreeNode aaiTree = fetchAAITree(getURL, null, HttpMethod.GET, AAI_TREE_PATHS, nodesAccumulator).get(0);
//Populate nodes with model-name & model-version (from aai)
enrichNodesWithModelVersionAndModelName(nodesAccumulator);
@@ -115,28 +137,28 @@ public class AAIServiceTree {
//Populate nodes with model-customization-name (from sdc model)
enrichNodesWithModelCustomizationName(nodesAccumulator, serviceModel);
- return aaiTreeConverter.convertTreeToUIModel(aaiTree, globalCustomerId, serviceType, getInstantiationType(serviceModel));
+ return aaiTreeConverter.convertTreeToUIModel(aaiTree, globalCustomerId, serviceType, getInstantiationType(serviceModel), getInstanceRole(serviceModel), getInstanceType(serviceModel));
}
- private List<AAITreeNode> fetchAAITree(String getUrl, Tree<AaiRelationship> pathsToSearch,
- ConcurrentSkipListSet<AAITreeNode> nodesAccumulator, boolean partialTreeOnTimeout) {
- ThreadPoolExecutor threadPool = getThreadPool();
-
- List<AAITreeNode> aaiTree = aaiTreeNodeBuilder.buildNode(SERVICE_INSTANCE,
- getUrl, defaultIfNull(nodesAccumulator, createNodesAccumulator()),
- threadPool, new ConcurrentLinkedQueue<>(),
- new AtomicInteger(0), pathsToSearch);
-
- boolean timeoutOccurred = waitForTreeFetch(threadPool);
+ private String getInstanceType(ServiceModel serviceModel){
+ if (serviceModel != null && serviceModel.getService() != null) {
+ return serviceModel.getService().getServiceType();
+ }
+ return "";
+ }
- if (timeoutOccurred) {
- if (!partialTreeOnTimeout) {
- throw new GenericUncheckedException("Timeout on fetchAAITree. Fetched " + nodesAccumulator.size() + " nodes for url: " + getUrl);
- }
- LOGGER.warn(EELFLoggerDelegate.errorLogger, "Timeout on fetchAAITree for url: " + getUrl);
+ private String getInstanceRole(ServiceModel serviceModel) {
+ if (serviceModel != null && serviceModel.getService() != null) {
+ return serviceModel.getService().getServiceRole();
}
+ return "";
+ }
- return aaiTree;
+ private List<AAITreeNode> fetchAAITree(String url, String payload, HttpMethod method, Tree<AaiRelationship> pathsToSearch,
+ ConcurrentSkipListSet<AAITreeNode> nodesAccumulator) {
+ return aaiTreeNodeBuilder.buildNode(NodeType.fromString(pathsToSearch.getRootValue().type),
+ url, payload, method, defaultIfNull(nodesAccumulator, createNodesAccumulator()),
+ executorService, pathsToSearch);
}
private ConcurrentSkipListSet<AAITreeNode> createNodesAccumulator() {
@@ -204,12 +226,12 @@ public class AAIServiceTree {
private JsonNode getModels(AaiClientInterface aaiClient, Collection<String> invariantIDs) {
Response response = aaiClient.getVersionByInvariantId(ImmutableList.copyOf(invariantIDs));
try {
- JsonNode responseJson = mapper.readTree(response.readEntity(String.class));
+ JsonNode responseJson = JACKSON_OBJECT_MAPPER.readTree(response.readEntity(String.class));
return responseJson.get("model");
} catch (Exception e) {
LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to getVersionByInvariantId from A&AI", e);
}
- return mapper.createObjectNode();
+ return JACKSON_OBJECT_MAPPER.createObjectNode();
}
private Set<String> getModelInvariantIds(Collection<AAITreeNode> nodes) {
@@ -219,30 +241,6 @@ public class AAIServiceTree {
.collect(toSet());
}
- private boolean waitForTreeFetch(ThreadPoolExecutor threadPool) {
- int timer = 60;
- try {
- //Stop fetching information if it takes more than 1 minute
- while (threadPool.getActiveCount() != 0 &&
- timer > 0) {
- sleep(1000);
- timer--;
- }
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- throw new GenericUncheckedException(e);
- }
- threadPool.shutdown();
- return (timer == 0);
- }
-
- private ThreadPoolExecutor getThreadPool() {
- //Use at least one thread, and never more than 75% of the available thread.
- int cores = Math.max((int)(Runtime.getRuntime().availableProcessors() * 0.75), 1);
- BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
- return new ThreadPoolExecutor(1, cores, 10, TimeUnit.SECONDS, queue);
- }
-
public static class AaiRelationship {
public final String type;
@@ -251,6 +249,10 @@ public class AAIServiceTree {
this.type = type;
}
+ public AaiRelationship(NodeType nodeType) {
+ this.type = nodeType.getType();
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;