001/*
002 * VM-Operator
003 * Copyright (C) 2023 Michael N. Lipp
004 * 
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
017 */
018
019package org.jdrupes.vmoperator.runner.qemu;
020
021import java.math.BigInteger;
022import java.util.Optional;
023import org.jdrupes.vmoperator.runner.qemu.commands.QmpSetBalloon;
024import org.jdrupes.vmoperator.runner.qemu.events.ConfigureQemu;
025import org.jdrupes.vmoperator.runner.qemu.events.MonitorCommand;
026import org.jgrapes.core.Channel;
027import org.jgrapes.core.Component;
028import org.jgrapes.core.annotation.Handler;
029
030/**
031 * The Class RamController.
032 */
033public class RamController extends Component {
034
035    private BigInteger currentRam;
036
037    /**
038     * Instantiates a new CPU controller.
039     *
040     * @param componentChannel the component channel
041     */
042    @SuppressWarnings("PMD.AssignmentToNonFinalStatic")
043    public RamController(Channel componentChannel) {
044        super(componentChannel);
045    }
046
047    /**
048     * On configure qemu.
049     *
050     * @param event the event
051     */
052    @Handler
053    public void onConfigureQemu(ConfigureQemu event) {
054        Optional.ofNullable(event.configuration().vm.currentRam)
055            .ifPresent(cr -> {
056                if (currentRam != null && currentRam.equals(cr)) {
057                    return;
058                }
059                currentRam = cr;
060                fire(new MonitorCommand(new QmpSetBalloon(cr)));
061            });
062    }
063
064}