From 5dca02576cefd20d40ab21277f3a2a5fda69bda8 Mon Sep 17 00:00:00 2001 From: ipatini Date: Tue, 14 Dec 2021 15:37:44 +0200 Subject: [PATCH 1/3] MetaSolver: Implementing feature "156 Manually switch from/to reactive/proactive reconfiguration". Added 'operation mode' with values ACTUAL_AND_PREDICTED, ACTUAL_ONLY, PREDICTED_ONLY --- .../metasolver/MetaSolverController.java | 22 ++++++++++++++ .../metricvalue/MetricValueListener.java | 29 ++++++++++++++++++- .../metricvalue/MetricValueMonitorBean.java | 2 +- .../properties/MetaSolverProperties.java | 3 ++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/MetaSolverController.java b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/MetaSolverController.java index cab832870..a4d8f1aaf 100644 --- a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/MetaSolverController.java +++ b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/MetaSolverController.java @@ -11,6 +11,7 @@ package eu.melodic.upperware.metasolver; import eu.melodic.models.commons.NotificationResult; import eu.melodic.models.commons.NotificationResultImpl; import eu.melodic.models.interfaces.metaSolver.*; +import eu.melodic.upperware.metasolver.properties.MetaSolverProperties; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -212,6 +213,27 @@ public class MetaSolverController { return metricsNamesResponse; } + @GetMapping("/getOperationMode") + public MetaSolverProperties.OperationMode getOperationMode(@RequestHeader(name = HttpHeaders.AUTHORIZATION) String jwtToken) { + setAuthenticationToken(jwtToken); + log.info("Received request for getting operation mode: "); + MetaSolverProperties.OperationMode mode = coordinator.getMetaSolverProperties().getOperationMode(); + log.info("Current operation mode: {}", mode); + return mode; + } + + @GetMapping("/setOperationMode/{mode}") + public void setOperationMode(@PathVariable("mode") MetaSolverProperties.OperationMode mode, + @RequestHeader(name = HttpHeaders.AUTHORIZATION) String jwtToken) { + + setAuthenticationToken(jwtToken); + log.info("Received request for setting operation mode: {}", mode); + MetaSolverProperties.OperationMode prevMode = coordinator.getMetaSolverProperties().getOperationMode(); + log.info("Previous operation mode: {}", prevMode); + coordinator.getMetaSolverProperties().setOperationMode(mode); + log.info("New operation mode: {}", mode); + } + @RequestMapping(value = "/health", method = GET) public void health() { } diff --git a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueListener.java b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueListener.java index d0a6ec963..9311e897a 100644 --- a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueListener.java +++ b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueListener.java @@ -10,6 +10,7 @@ package eu.melodic.upperware.metasolver.metricvalue; import com.google.gson.Gson; import eu.melodic.upperware.metasolver.Coordinator; +import eu.melodic.upperware.metasolver.properties.MetaSolverProperties; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; @@ -30,8 +31,9 @@ public class MetricValueListener implements MessageListener { private MetricValueRegistry registry; private Gson gson; private Coordinator coordinator; + private MetaSolverProperties.OperationMode operationMode; - public MetricValueListener(Coordinator coordinator, Topic topic, TopicType type, MetricValueRegistry registry, boolean isPrediction) throws JMSException { + public MetricValueListener(Coordinator coordinator, Topic topic, TopicType type, MetricValueRegistry registry, boolean isPrediction, MetaSolverProperties.OperationMode operationMode) throws JMSException { log.debug("MetricValueListener.: type={}", type); this.coordinator = coordinator; this.topic = topic; @@ -41,6 +43,7 @@ public class MetricValueListener implements MessageListener { this.isPrediction = isPrediction; this.reconfigurationProbabilityThreshold = coordinator.getMetaSolverProperties().getReconfigurationProbabilityThreshold(); gson = new Gson(); + this.operationMode = operationMode; } public void onMessage(Message message) { @@ -107,12 +110,24 @@ public class MetricValueListener implements MessageListener { log.debug("Listener of topic {}: MetricValueEvent instance: {}", topicName, event); if (!isPrediction) { + // check operation mode + if (operationMode==MetaSolverProperties.OperationMode.PREDICTED_ONLY) { + log.debug(" Operation-Mode is {}. Ignoring MVV event due to actual metric: topic={}, payload={}", operationMode, metricName, payload); + return; + } + // Cache Metric Value in registry log.debug("Listener of topic {}: Metric registry values BEFORE update: {}", topicName, registry); registry.setMetricValue(metricName, event.getMetricValue()); log.info("Metric Value set: name='{}', value='{}', topic={}", metricName, event.getMetricValue(), topicName); log.debug("Listener of topic {}: Metric registry values AFTER update: {}", topicName, registry); } else { + // check operation mode + if (operationMode==MetaSolverProperties.OperationMode.ACTUAL_ONLY) { + log.debug(" Operation-Mode is {}. Ignoring MVV event due to predicted metric: topic={}, payload={}", operationMode, metricName, payload); + return; + } + // Get predictionTime long predictionTime = getPredictionTime(event, metricName, payload); @@ -135,9 +150,21 @@ public class MetricValueListener implements MessageListener { try { log.debug("Listener of topic {}: Calling coordinator to start Scaling process...", topicName); if (!isPrediction) { + // check operation mode + if (operationMode==MetaSolverProperties.OperationMode.PREDICTED_ONLY) { + log.debug(" Operation-Mode is {}. Ignoring SCALE event due to actual metric: topic={}, payload={}", operationMode, metricName, payload); + return; + } + // Start reconfiguration with the actual metric values set in CP model coordinator.requestReconfigurationStart(false); } else { + // check operation mode + if (operationMode==MetaSolverProperties.OperationMode.ACTUAL_ONLY) { + log.debug(" Operation-Mode is {}. Ignoring SCALE event due to predicted metric: topic={}, payload={}", operationMode, metricName, payload); + return; + } + // Extract key-value pairs from message payload // ...using MetricValueEvent log.debug("Listener of topic {}: Converting event payload to MetricValueEvent instance...", topicName); diff --git a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueMonitorBean.java b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueMonitorBean.java index 072adae0e..b25e35b65 100644 --- a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueMonitorBean.java +++ b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueMonitorBean.java @@ -228,7 +228,7 @@ public class MetricValueMonitorBean implements ApplicationContextAware { } private MessageListener getListener(Topic topic, TopicType type, boolean isPrediction) throws JMSException { - MessageListener listener = new MetricValueListener(coordinator, topic, type, registry, isPrediction); + MessageListener listener = new MetricValueListener(coordinator, topic, type, registry, isPrediction, properties.getOperationMode()); return listener; } diff --git a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/properties/MetaSolverProperties.java b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/properties/MetaSolverProperties.java index e4dbec52d..40347b476 100644 --- a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/properties/MetaSolverProperties.java +++ b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/properties/MetaSolverProperties.java @@ -60,6 +60,9 @@ public class MetaSolverProperties { private DebugEvent debugEvents = new DebugEvent(); + public enum OperationMode {ACTUAL_AND_PREDICTED, ACTUAL_ONLY, PREDICTED_ONLY} + private OperationMode operationMode = OperationMode.ACTUAL_AND_PREDICTED; + // -------------------------------------------------------------- @Data -- GitLab From 78346503ac6743d94b5c05bb2d2008343e7b0c0a Mon Sep 17 00:00:00 2001 From: ipatini Date: Wed, 15 Dec 2021 10:25:17 +0200 Subject: [PATCH 2/3] MetaSolver: Fixed a bug in feature "156 Manually switch from/to reactive/proactive reconfiguration" --- meta_solver/src/main/docker/Dockerfile | 3 ++- .../metasolver/metricvalue/MetricValueListener.java | 8 +++++--- .../metasolver/metricvalue/MetricValueMonitorBean.java | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/meta_solver/src/main/docker/Dockerfile b/meta_solver/src/main/docker/Dockerfile index 745af2a30..452f21dbe 100644 --- a/meta_solver/src/main/docker/Dockerfile +++ b/meta_solver/src/main/docker/Dockerfile @@ -8,8 +8,9 @@ FROM java:8-alpine VOLUME /tmp -ADD meta-solver.jar meta-solver.jar RUN /bin/sh -c "apk add --no-cache bash" + +ADD meta-solver.jar meta-solver.jar RUN bash -c 'touch /meta-solver.jar' COPY ./run.sh . diff --git a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueListener.java b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueListener.java index 9311e897a..b8e12d16d 100644 --- a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueListener.java +++ b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueListener.java @@ -31,9 +31,9 @@ public class MetricValueListener implements MessageListener { private MetricValueRegistry registry; private Gson gson; private Coordinator coordinator; - private MetaSolverProperties.OperationMode operationMode; + private MetaSolverProperties metaSolverProperties; - public MetricValueListener(Coordinator coordinator, Topic topic, TopicType type, MetricValueRegistry registry, boolean isPrediction, MetaSolverProperties.OperationMode operationMode) throws JMSException { + public MetricValueListener(Coordinator coordinator, Topic topic, TopicType type, MetricValueRegistry registry, boolean isPrediction, MetaSolverProperties metaSolverProperties) throws JMSException { log.debug("MetricValueListener.: type={}", type); this.coordinator = coordinator; this.topic = topic; @@ -43,7 +43,7 @@ public class MetricValueListener implements MessageListener { this.isPrediction = isPrediction; this.reconfigurationProbabilityThreshold = coordinator.getMetaSolverProperties().getReconfigurationProbabilityThreshold(); gson = new Gson(); - this.operationMode = operationMode; + this.metaSolverProperties = metaSolverProperties; } public void onMessage(Message message) { @@ -107,6 +107,7 @@ public class MetricValueListener implements MessageListener { // ...using MetricValueEvent log.debug("Listener of topic {}: Converting event payload to MetricValueEvent instance...", topicName); MetricValueEvent event = gson.fromJson(payload, MetricValueEvent.class); + MetaSolverProperties.OperationMode operationMode = metaSolverProperties.getOperationMode(); log.debug("Listener of topic {}: MetricValueEvent instance: {}", topicName, event); if (!isPrediction) { @@ -149,6 +150,7 @@ public class MetricValueListener implements MessageListener { protected void processScaleEvent(@NonNull String metricName, @NonNull String payload) { try { log.debug("Listener of topic {}: Calling coordinator to start Scaling process...", topicName); + MetaSolverProperties.OperationMode operationMode = metaSolverProperties.getOperationMode(); if (!isPrediction) { // check operation mode if (operationMode==MetaSolverProperties.OperationMode.PREDICTED_ONLY) { diff --git a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueMonitorBean.java b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueMonitorBean.java index b25e35b65..2f22fc93a 100644 --- a/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueMonitorBean.java +++ b/meta_solver/src/main/java/eu/melodic/upperware/metasolver/metricvalue/MetricValueMonitorBean.java @@ -228,7 +228,7 @@ public class MetricValueMonitorBean implements ApplicationContextAware { } private MessageListener getListener(Topic topic, TopicType type, boolean isPrediction) throws JMSException { - MessageListener listener = new MetricValueListener(coordinator, topic, type, registry, isPrediction, properties.getOperationMode()); + MessageListener listener = new MetricValueListener(coordinator, topic, type, registry, isPrediction, properties); return listener; } -- GitLab From f05dc6c52f956bf6ea687f75c0297009510bff08 Mon Sep 17 00:00:00 2001 From: ipatini Date: Thu, 16 Dec 2021 15:00:26 +0200 Subject: [PATCH 3/3] MetaSolver: Updated default configuration to include operationMode --- .../config/eu.melodic.upperware.metaSolver.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/meta_solver/src/main/resources/config/eu.melodic.upperware.metaSolver.properties b/meta_solver/src/main/resources/config/eu.melodic.upperware.metaSolver.properties index 077de68f1..6cacdb61f 100644 --- a/meta_solver/src/main/resources/config/eu.melodic.upperware.metaSolver.properties +++ b/meta_solver/src/main/resources/config/eu.melodic.upperware.metaSolver.properties @@ -85,5 +85,8 @@ reconfigurationProbabilityThreshold = 0.5 #preventConcurrentReconfigurations = false #preventConcurrentReconfigurationsTimeout = -1L +# Default operation mode. Allowed values: ACTUAL_AND_PREDICTED (default), ACTUAL_ONLY, PREDICTED_ONLY +#operationMode = ACTUAL_AND_PREDICTED + ### logback configuration ### logging.config=file:${MELODIC_CONFIG_DIR}/logback-conf/logback-spring.xml \ No newline at end of file -- GitLab