From 9fd2e282b17fff34bfe5652a08a4ae02e8259bb3 Mon Sep 17 00:00:00 2001 From: "Michael N. Lipp" Date: Sun, 30 Jul 2023 12:31:23 +0200 Subject: [PATCH] RAM size adaption works. --- .../vmoperator/runner/qemu/Configuration.java | 17 +++++++---- .../vmoperator/runner/qemu/QemuMonitor.java | 2 +- ...rOpened.java => QemuMonitorAvailable.java} | 4 +-- .../vmoperator/runner/qemu/Runner.java | 30 ++++++++++++++++--- 4 files changed, 40 insertions(+), 13 deletions(-) rename org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/{QemuMonitorOpened.java => QemuMonitorAvailable.java} (90%) diff --git a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Configuration.java b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Configuration.java index 94222d7..2d8e7c4 100644 --- a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Configuration.java +++ b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Configuration.java @@ -19,6 +19,7 @@ package org.jdrupes.vmoperator.runner.qemu; import java.io.IOException; +import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -35,7 +36,6 @@ import java.util.regex.Pattern; import org.jdrupes.vmoperator.util.Dto; import org.jdrupes.vmoperator.util.FsdUtils; -// TODO: Auto-generated Javadoc /** * The configuration information from the configuration file. */ @@ -50,7 +50,7 @@ class Configuration implements Dto { @SuppressWarnings({ "PMD.FieldNamingConventions", "PMD.VariableNamingConventions" }) private static final Pattern memorySize - = Pattern.compile("\\s*(\\d+)\\s*([^\\s]*)"); + = Pattern.compile("^\\s*(\\d+(\\.\\d+)?)\\s*([A-Za-z]*)\\s*"); static { // SI units and common abbreviations @@ -105,6 +105,7 @@ class Configuration implements Dto { * @param amount the amount * @return the big integer */ + @SuppressWarnings("PMD.DataflowAnomalyAnalysis") public static BigInteger parseMemory(Object amount) { if (amount == null) { return (BigInteger) amount; @@ -119,12 +120,16 @@ class Configuration implements Dto { if (!matcher.matches()) { throw new NumberFormatException(amount.toString()); } - var unit = unitMap.get(matcher.group(2)); - if (unit == null) { - throw new NumberFormatException(amount.toString()); + var unit = BigInteger.ONE; + if (matcher.group(3) != null) { + unit = unitMap.get(matcher.group(3)); + if (unit == null) { + throw new NumberFormatException(amount.toString()); + } } var number = matcher.group(1); - return new BigInteger(number).multiply(unit); + return new BigDecimal(number).multiply(new BigDecimal(unit)) + .toBigInteger(); } /** diff --git a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitor.java b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitor.java index 05f58ca..d9ccf8b 100644 --- a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitor.java +++ b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitor.java @@ -220,7 +220,7 @@ public class QemuMonitor extends Component { var response = ((Runner) channel()).mapper().readValue(line, JsonNode.class); if (response.has("QMP")) { - fire(new QemuMonitorOpened()); + fire(new QemuMonitorAvailable()); } } catch (JsonProcessingException e) { throw new IOException(e); diff --git a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitorOpened.java b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitorAvailable.java similarity index 90% rename from org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitorOpened.java rename to org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitorAvailable.java index 2eea438..f1ba921 100644 --- a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitorOpened.java +++ b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/QemuMonitorAvailable.java @@ -18,12 +18,12 @@ package org.jdrupes.vmoperator.runner.qemu; -import org.jgrapes.io.events.Opened; +import org.jgrapes.core.Event; /** * Signals that the connection to the Qemu monitor socket has been * established successfully. */ -public class QemuMonitorOpened extends Opened { +public class QemuMonitorAvailable extends Event { } diff --git a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Runner.java b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Runner.java index 7d897d3..7ad48a0 100644 --- a/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Runner.java +++ b/org.jdrupes.vmoperator.runner.qemu/src/org/jdrupes/vmoperator/runner/qemu/Runner.java @@ -226,7 +226,9 @@ public class Runner extends Component { event.structured(componentPath()).ifPresent(c -> { if (event instanceof InitialConfiguration) { processInitialConfiguration(c); + return; } + updateConfiguration(c); }); } @@ -323,6 +325,24 @@ public class Runner extends Component { return mapper.readValue(out.toString(), JsonNode.class); } + @SuppressWarnings("unchecked") + private void updateConfiguration(Map conf) { + Optional.ofNullable((Map) conf.get("vm")) + .map(vm -> vm.get("currentRam")).map(Configuration::parseMemory) + .ifPresent(cr -> { + if (config.vm.currentRam != null + && config.vm.currentRam.equals(cr)) { + return; + } + synchronized (state) { + config.vm.currentRam = cr; + if (state.get() == State.RUNNING) { + qemuMonitor.setCurrentRam(cr); + } + } + }); + } + /** * Handle the start event. * @@ -456,10 +476,12 @@ public class Runner extends Component { * @param event the event */ @Handler - public void onQemuMonitorOpened(QemuMonitorOpened event) { - Optional.ofNullable(config.vm.currentRam) - .ifPresent(qemuMonitor::setCurrentRam); - state.set(State.RUNNING); + public void onQemuMonitorAvailable(QemuMonitorAvailable event) { + synchronized (state) { + Optional.ofNullable(config.vm.currentRam) + .ifPresent(qemuMonitor::setCurrentRam); + state.set(State.RUNNING); + } } /**