summaryrefslogtreecommitdiffstats
path: root/components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/ccvpn/BandwidthEvaluator.java
diff options
context:
space:
mode:
Diffstat (limited to 'components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/ccvpn/BandwidthEvaluator.java')
-rw-r--r--components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/ccvpn/BandwidthEvaluator.java156
1 files changed, 18 insertions, 138 deletions
diff --git a/components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/ccvpn/BandwidthEvaluator.java b/components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/ccvpn/BandwidthEvaluator.java
index c66122c1..43391809 100644
--- a/components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/ccvpn/BandwidthEvaluator.java
+++ b/components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/ccvpn/BandwidthEvaluator.java
@@ -20,12 +20,10 @@
*******************************************************************************/
package org.onap.slice.analysis.ms.service.ccvpn;
-import com.google.gson.JsonObject;
import lombok.NonNull;
import org.onap.slice.analysis.ms.aai.AaiService;
import org.onap.slice.analysis.ms.models.Configuration;
-import org.onap.slice.analysis.ms.service.PolicyService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,23 +31,14 @@ import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
import java.util.Map;
-import java.util.TreeMap;
import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-
-import static java.util.concurrent.Executors.newSingleThreadExecutor;
/**
* This class implements the CCVPN PM Closed-loop logical function.
@@ -67,15 +56,14 @@ public class BandwidthEvaluator {
CCVPNPmDatastore ccvpnPmDatastore;
@Autowired
- PolicyService policyService;
+ StrategyFactory strategyFactory;
private Loop evaluationEventLoop;
private Loop aaiEventLoop;
private static final Event KILL_PILL = new SimpleEvent(null, 0);
private static final int DEFAULT_EVAL_INTERVAL = 5;
- private static final String SERVICE_INSTANCE_LOCATION_ID = "service-instance-location-id";
- private static final String BANDWIDTH_TOTAL = "bandwidth-total";
+ private static final String DEFAULT_STRATEGY_NAME = "FixedUpperBoundStrategy";
/**
* Interval of each round of evaluation, defined in config_all.json
@@ -83,14 +71,10 @@ public class BandwidthEvaluator {
private static int evaluationInterval;
/**
- * Percentage threshold of bandwidth adjustment.
+ * Bandwidth Evaluation and adjustment strategy.
*/
- private static double threshold;
+ private static String strategyName;
- /**
- * Precision of bandwidth evaluation and adjustment.
- */
- private static double precision; // in Mbps;
private final ScheduledExecutorService executorPool = Executors.newScheduledThreadPool(1);
/**
@@ -99,110 +83,17 @@ public class BandwidthEvaluator {
@PostConstruct
public void init() {
loadConfig();
+ strategyName = (strategyName != null)? strategyName : DEFAULT_STRATEGY_NAME;
+ evaluationInterval = (evaluationInterval == 0)? DEFAULT_EVAL_INTERVAL : evaluationInterval;
+ EvaluationStrategy strategy = strategyFactory.getStrategy(strategyName);
+
/**
* Evalution main loop
*/
evaluationEventLoop = new Loop("EvaluationLoop"){
@Override
public void process(Event event) {
- if (event.type() == SimpleEvent.Type.PERIODIC_CHECK && isPeriodicCheckOn()){
- log.info("=== Processing new periodic check request: {} ===", event.time());
- Map<Endpointkey, CCVPNPmDatastore.EvictingQueue<Integer>> usedBwMap = ccvpnPmDatastore.getUsedBwMap();
- Map<String, Integer> candidate = new TreeMap<>();
- for(Map.Entry<Endpointkey, CCVPNPmDatastore.EvictingQueue<Integer>> entry: usedBwMap.entrySet()) {
- String serviceId = entry.getKey().getCllId();
- Object[] usedBws = entry.getValue().tryReadToArray();
-
- if (usedBws == null) {
- // No enough data for evaluating
- log.debug("CCVPN Evaluator Output: service {}, not enough data to evaluate", serviceId);
- continue;
- }
- if (ccvpnPmDatastore.getMaxBwOfSvc(serviceId) == 0) {
- // Max bandwidth not cached yet
- log.debug("CCVPN Evaluator Output: service {}, max bandwidth not cached, wait for next round", serviceId);
- post(new SimpleEvent(SimpleEvent.Type.AAI_BW_REQ, serviceId));
- continue;
- }
- double avg = Arrays.stream(usedBws)
- .mapToInt(o -> (int) o)
- .summaryStatistics()
- .getAverage();
- if (needAdjust(serviceId, avg, ccvpnPmDatastore.getMaxBwOfSvc(serviceId))) {
- log.debug("CCVPN Evaluator Output: service {}, need adjustment, putting into candidate list", serviceId);
- int newBw = (int) (Math.ceil((avg / threshold) * 1.2 / precision) * precision);
- candidate.put(serviceId, Math.max(candidate.getOrDefault(serviceId, 0), newBw));
- }
- }
- // check svc under maintenance
- Map<String , ServiceState> svcUnderMaintenance = getServicesUnderMaintenance();
- for (Map.Entry<String, ServiceState> entry: svcUnderMaintenance.entrySet()){
- candidate.putIfAbsent(entry.getKey(), 0);
- }
- // fetch the maxbandwidth info if underMaintenance; otherwise send modification request
- for(Map.Entry<String, Integer> entry: candidate.entrySet()) {
- if (isServiceUnderMaintenance(entry.getKey())) {
- if (entry.getValue() == 0){
- log.debug("CCVPN Evaluator Output: service {}," +
- " are in maintenance state, fetching bandwidth info from AAI", entry.getKey());
- } else {
- log.debug("CCVPN Evaluator Output: candidate {}," +
- " need adjustment, but skipped due to maintenance state", entry.getKey());
- }
- post(new SimpleEvent(SimpleEvent.Type.AAI_BW_REQ, entry.getKey()));
- continue;
- }
- log.debug("CCVPN Evaluator Output: candidate {}," +
- " need adjustment, sending request to policy", entry.getKey());
- ccvpnPmDatastore.updateSvcState(entry.getKey(), ServiceState.UNDER_MAINTENANCE);
- sendModifyRequest(entry.getKey(), entry.getValue(), RequestOwner.DCAE);
- }
- log.info("=== Processing periodic check complete ===");
-
- } else if (event.type() == SimpleEvent.Type.ONDEMAND_CHECK && isOnDemandCheckOn()) {
- log.info("=== Processing new on-demand check request: {} ===", event.time());
- JsonObject payload = (JsonObject) event.subject();
- String serviceId = payload.get(SERVICE_INSTANCE_LOCATION_ID).getAsString();
- if (!isServiceUnderMaintenance(serviceId)){
- int newBandwidth = payload.get(BANDWIDTH_TOTAL).getAsInt();
- Map<String, Integer> maxBandwidthData = aaiService.fetchMaxBandwidthOfService(serviceId);
- if (maxBandwidthData.get("maxBandwidth") != null
- && maxBandwidthData.get("maxBandwidth") != newBandwidth){
- log.debug("CCVPN Evaluator Output: on-demand adjustment request for service: {} processed," +
- " sending request to policy", serviceId);
- ccvpnPmDatastore.updateSvcState(serviceId, ServiceState.UNDER_MAINTENANCE);
- sendModifyRequest(serviceId, newBandwidth, RequestOwner.UUI);
- }
- } else {
- log.debug("CCVPN Evaluator Output: service {}," +
- " received on-demand request, but skipped due to maintenance state", serviceId);
- }
- log.info("=== Processing on-demand check complete ===");
- }
- }
-
- private void sendModifyRequest(String cllId, Integer newBandwidth, RequestOwner owner) {
- log.info("Sending modification request to policy. RequestOwner: {} - Service: {} change to bw: {}",
- owner, cllId, newBandwidth);
- policyService.sendOnsetMessageToPolicy(
- policyService.formPolicyOnsetMessageForCCVPN(cllId, newBandwidth, owner)
- );
- }
-
- private boolean needAdjust(String serivceId, double currentAverageUsage, int maxBandwidth){
- log.debug("CCVPN Service Usage Analysis: usage: {}, threshold: {}, maxbw {}", currentAverageUsage, threshold, maxBandwidth);
- return currentAverageUsage > threshold * maxBandwidth;
- }
-
- private boolean isServiceUnderMaintenance(String serivceId) {
- return ccvpnPmDatastore.getStatusOfSvc(serivceId) == ServiceState.UNDER_MAINTENANCE;
- }
-
- private Map<String, ServiceState> getServicesUnderMaintenance(){
- return ccvpnPmDatastore.getSvcStatusMap().entrySet()
- .stream()
- .filter(e -> e.getValue() == ServiceState.UNDER_MAINTENANCE)
- .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
+ strategy.execute(event);
}
};
@@ -213,22 +104,22 @@ public class BandwidthEvaluator {
@Override
public void process(Event event) {
if (event.type() == SimpleEvent.Type.AAI_BW_REQ){
- log.info("=== Processing new AAI network policy query at: {} ===", event.time());
+ log.debug("=== Processing new AAI network policy query at: {} ===", event.time());
String serviceId = (String) event.subject();
Map<String, Integer> maxBandwidthData = aaiService.fetchMaxBandwidthOfService(serviceId);
if (maxBandwidthData.get("maxBandwidth") != null){
- log.debug("Successfully retrieved bandwidth info from AAI; service: {}, bandwidth: {}",
+ log.info("Successfully retrieved bandwidth info from AAI; service: {}, bandwidth: {}",
serviceId, maxBandwidthData.get("maxBandwidth"));
int bwValue = maxBandwidthData.get("maxBandwidth").intValue();
- if (ccvpnPmDatastore.getMaxBwOfSvc(serviceId) == 0){
- ccvpnPmDatastore.updateMaxBw(serviceId, bwValue, true);
- } else if (ccvpnPmDatastore.getMaxBwOfSvc(serviceId) != bwValue) {
- log.debug("Service modification complete; serviceId: {} with new bandwidth: {}", serviceId, bwValue);
- ccvpnPmDatastore.updateMaxBw(serviceId, bwValue, true);
+ if (ccvpnPmDatastore.getProvBwOfSvc(serviceId) == 0){
+ ccvpnPmDatastore.updateProvBw(serviceId, bwValue, true);
+ } else if (ccvpnPmDatastore.getProvBwOfSvc(serviceId) != bwValue) {
+ log.info("Service modification complete; serviceId: {} with new bandwidth: {}", serviceId, bwValue);
+ ccvpnPmDatastore.updateProvBw(serviceId, bwValue, true);
ccvpnPmDatastore.updateSvcState(serviceId, ServiceState.RUNNING);
}
}
- log.info("=== Processing AAI network policy query complete ===");
+ log.debug("=== Processing AAI network policy query complete ===");
}
}
};
@@ -283,18 +174,7 @@ public class BandwidthEvaluator {
private void loadConfig() {
configuration = Configuration.getInstance();
evaluationInterval = configuration.getCcvpnEvalInterval();
- threshold = configuration.getCcvpnEvalThreshold();
- precision = configuration.getCcvpnEvalPrecision(); // in Mbps;
- }
-
- private boolean isPeriodicCheckOn() {
- configuration = Configuration.getInstance();
- return configuration.isCcvpnEvalPeriodicCheckOn();
- }
-
- private boolean isOnDemandCheckOn() {
- configuration = Configuration.getInstance();
- return configuration.isCcvpnEvalOnDemandCheckOn();
+ strategyName = configuration.getCcvpnEvalStrategy();
}
/**