diff options
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.java | 156 |
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(); } /** |