public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources
@ 2025-10-14  9:47 Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 1/9] sim: add command to set static service stats Maximiliano Sandoval
                   ` (8 more replies)
  0 siblings, 9 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

This series allows to:

 - Set the cluster resource scheduler
 - Set a node's static resources on creation and edit them after the fact
 - Persist the current state of the simulator for future runs
 - We sneak at the end a commit to add the build dir to .gitignore, please feel
   free to not apply it if this is unwanted.

The next step would be to allow adding/removing nodes and setting/editing their
resource stats, but that can go in a follow-up.

Suggested-by: Daniel Kral <d.kral@proxmox.com>

Maximiliano Sandoval (9):
  sim: add command to set static service stats
  sim: add UI to set resource stats for new guests
  sim: allow editing static resources of resource
  sim: add helper to store datacenter configuration
  sim: allow configuring datacenter configuration
  sim: add method to persist current state
  sim: add button to persist state to header bar
  sim: set default cpu count and memory on new nodes
  gitignore: ignore build directory

 .gitignore                   |   1 +
 src/PVE/HA/Sim/Hardware.pm   | 102 ++++++++++++++++-
 src/PVE/HA/Sim/RTHardware.pm | 207 +++++++++++++++++++++++++++++++++--
 3 files changed, 300 insertions(+), 10 deletions(-)

-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH ha-manager 1/9] sim: add command to set static service stats
  2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
@ 2025-10-14  9:47 ` Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 2/9] sim: add UI to set resource stats for new guests Maximiliano Sandoval
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

This will allow testing different cluster resource schedulers.

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/HA/Sim/Hardware.pm | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm
index 9e8c799..4d84eeb 100644
--- a/src/PVE/HA/Sim/Hardware.pm
+++ b/src/PVE/HA/Sim/Hardware.pm
@@ -178,6 +178,25 @@ sub set_service_state {
     return $conf;
 }
 
+sub set_static_service_stats {
+    my ($self, $sid, $new_stats) = @_;
+
+    my $stats = $self->read_static_service_stats();
+    die "no such service '$sid'" if !$stats->{$sid};
+
+    if (my $memory = $new_stats->{maxmemory}) {
+        print "setting $sid memory to $memory\n" if $memory != $stats->{$sid}->{maxmemory};
+        $stats->{$sid}->{maxmemory} = $memory;
+    }
+
+    if (my $cpu = $new_stats->{maxcpu}) {
+        print "setting $sid memory to $cpu\n" if $cpu != $stats->{$sid}->{maxcpu};
+        $stats->{$sid}->{maxcpu} = $cpu;
+    }
+
+    $self->write_static_service_stats($stats);
+}
+
 sub add_service {
     my ($self, $sid, $opts, $running) = @_;
 
@@ -397,6 +416,14 @@ sub read_static_service_stats {
     return $stats;
 }
 
+sub write_static_service_stats {
+    my ($self, $stats) = @_;
+
+    my $filename = "$self->{statusdir}/static_service_stats";
+    eval { PVE::HA::Tools::write_json_to_file($filename, $stats) };
+    $self->log('error', "writing static service stats failed - $@") if $@;
+}
+
 sub new {
     my ($this, $testdir) = @_;
 
@@ -611,6 +638,7 @@ sub get_cfs_state {
 #   service <sid> stop <timeout>
 #   service <sid> lock/unlock [lockname]
 #   service <sid> add <node> [<request-state=started>] [<running=0>]
+#   service <sid> set-static-stats <maxcpu> <maxmemory>
 #   service <sid> delete
 sub sim_hardware_cmd {
     my ($self, $cmdstr, $logid) = @_;
@@ -760,6 +788,15 @@ sub sim_hardware_cmd {
                     $params[2] || 0,
                 );
 
+            } elsif ($action eq 'set-static-stats') {
+                die "sim_hardware_cmd: missing maxcpu for '$action' command" if !$params[0];
+                die "sim_hardware_cmd: missing maxmemory for '$action' command" if !$params[1];
+
+                $self->set_static_service_stats(
+                    $sid,
+                    { maxcpu => $params[0], maxmemory => $params[1] },
+                );
+
             } elsif ($action eq 'delete') {
 
                 $self->delete_service($sid);
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH ha-manager 2/9] sim: add UI to set resource stats for new guests
  2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 1/9] sim: add command to set static service stats Maximiliano Sandoval
@ 2025-10-14  9:47 ` Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 3/9] sim: allow editing static resources of resource Maximiliano Sandoval
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

Adds a dialog which allow setting the maxmemory and maxcpu of an
existing HA service.

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/HA/Sim/RTHardware.pm | 43 +++++++++++++++++++++++++++++++++++-
 1 file changed, 42 insertions(+), 1 deletion(-)

diff --git a/src/PVE/HA/Sim/RTHardware.pm b/src/PVE/HA/Sim/RTHardware.pm
index 0dfe0b2..28c756e 100644
--- a/src/PVE/HA/Sim/RTHardware.pm
+++ b/src/PVE/HA/Sim/RTHardware.pm
@@ -24,6 +24,9 @@ use PVE::HA::LRM;
 use PVE::HA::Sim::RTEnv;
 use base qw(PVE::HA::Sim::Hardware);
 
+my $DEFAULT_MAXMEM = 4096;
+my $DEFAULT_MAXCPU = 4;
+
 sub new {
     my ($this, $testdir) = @_;
 
@@ -434,8 +437,41 @@ sub show_service_add_dialog {
     $node_cb->set_active(0);
     $grid->attach($node_cb, 2, 1, 1, 1);
 
+    my $cpu_label = Gtk3::Label->new('CPU Count');
+    $cpu_label->set_hexpand(1);
+    $cpu_label->set_xalign(0);
+
+    my $cpu_count_spin = Gtk3::SpinButton->new_with_range(1.0, 1024, 1.0);
+    $cpu_count_spin->set_value($DEFAULT_MAXCPU);
+
+    my $cpu_box = Gtk3::Box->new('horizontal', 6);
+    $cpu_box->add($cpu_label);
+    $cpu_box->add($cpu_count_spin);
+
+    my $memory_label = Gtk3::Label->new('Memory (MiB)');
+    $memory_label->set_hexpand(1);
+    $memory_label->set_xalign(0);
+
+    # There is an arbitrary limit of 10 TiB
+    my $memory_spin = Gtk3::SpinButton->new_with_range(1.0, 10485760.0, 1.0);
+    $memory_spin->set_value($DEFAULT_MAXMEM);
+
+    my $memory_box = Gtk3::Box->new('horizontal', 6);
+    $memory_box->add($memory_label);
+    $memory_box->add($memory_spin);
+
+    my $vbox = Gtk3::Box->new('vertical', 6);
+    $vbox->set_margin_start(6);
+    $vbox->set_margin_end(6);
+    $vbox->set_margin_top(6);
+    $vbox->set_margin_bottom(6);
+    $vbox->add($grid);
+    $vbox->add($cpu_box);
+    $vbox->add($memory_box);
+    $vbox->show_all();
+
     my $contarea = $dialog->get_content_area();
-    $contarea->add($grid);
+    $contarea->add($vbox);
 
     $dialog->show_all();
     my $res = $dialog->run();
@@ -443,6 +479,11 @@ sub show_service_add_dialog {
     if (defined($res) && $res eq 'ok') {
         my $sid = "$service_type:$service_id";
         $self->sim_hardware_cmd("service $sid add $service_node", 'command');
+
+        my $maxcpu = $cpu_count_spin->get_value();
+        my $maxmemory = $memory_spin->get_value();
+        $self->sim_hardware_cmd("service $sid set-static-stats $maxcpu $maxmemory", 'command');
+
         $self->add_service_to_gui($sid);
     }
 
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH ha-manager 3/9] sim: allow editing static resources of resource
  2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 1/9] sim: add command to set static service stats Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 2/9] sim: add UI to set resource stats for new guests Maximiliano Sandoval
@ 2025-10-14  9:47 ` Maximiliano Sandoval
  2025-10-14 10:00   ` Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 4/9] sim: add helper to store datacenter configuration Maximiliano Sandoval
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/HA/Sim/RTHardware.pm | 82 +++++++++++++++++++++++++++++++++++-
 1 file changed, 80 insertions(+), 2 deletions(-)

diff --git a/src/PVE/HA/Sim/RTHardware.pm b/src/PVE/HA/Sim/RTHardware.pm
index 28c756e..e46cb91 100644
--- a/src/PVE/HA/Sim/RTHardware.pm
+++ b/src/PVE/HA/Sim/RTHardware.pm
@@ -490,6 +490,75 @@ sub show_service_add_dialog {
     $dialog->destroy();
 }
 
+sub show_service_edit_dialog {
+    my ($self, $sid) = @_;
+
+    my $stats = $self->read_static_service_stats();
+    my $resource_stats = $stats->{$sid}
+        // { maxcpu => $DEFAULT_MAXCPU, maxmemory => $DEFAULT_MAXMEM };
+
+    my $cpu_label = Gtk3::Label->new('CPU Count');
+    $cpu_label->set_hexpand(1);
+    $cpu_label->set_xalign(0);
+
+    my $cpu_count_spin = Gtk3::SpinButton->new_with_range(1.0, 1024, 1.0);
+    $cpu_count_spin->set_value($resource_stats->{maxcpu});
+
+    my $cpu_box = Gtk3::Box->new('horizontal', 6);
+    $cpu_box->add($cpu_label);
+    $cpu_box->add($cpu_count_spin);
+
+    my $memory_label = Gtk3::Label->new('Memory (MiB)');
+    $memory_label->set_hexpand(1);
+    $memory_label->set_xalign(0);
+
+    # There is an arbitrary limit of 10 TiB
+    my $memory_spin = Gtk3::SpinButton->new_with_range(1.0, 10485760.0, 1.0);
+    $memory_spin->set_value($resource_stats->{maxmemory});
+
+    my $memory_box = Gtk3::Box->new('horizontal', 6);
+    $memory_box->add($memory_label);
+    $memory_box->add($memory_spin);
+
+    my $vbox = Gtk3::Box->new('vertical', 6);
+    $vbox->add($cpu_box);
+    $vbox->add($memory_box);
+
+    my $dialog = Gtk3::Dialog->new();
+
+    $dialog->set_title("Migrate $sid");
+    $dialog->set_modal(1);
+    $dialog->set_transient_for($self->{main_window});
+
+    $dialog->add_button("_OK", 'ok');
+
+    my $content_area = $dialog->get_content_area();
+    $content_area->add($vbox);
+    $vbox->set_margin_start(12);
+    $vbox->set_margin_end(12);
+    $vbox->set_margin_top(12);
+    $vbox->set_margin_bottom(12);
+
+    $dialog->show_all();
+
+    $dialog->signal_connect(
+        'response' => sub {
+            my ($dialog, $response) = @_;
+
+            if ($response eq 'ok') {
+                $self->set_static_service_stats(
+                    $sid,
+                    {
+                        maxcpu => $cpu_count_spin->get_value(),
+                        maxmemory => $memory_spin->get_value(),
+                    },
+                );
+            }
+            $dialog->close();
+        },
+    );
+}
+
 sub show_service_delete_dialog {
     my ($self, $sid) = @_;
 
@@ -659,8 +728,17 @@ sub new_service_gui_entry {
     $sgrid->attach($w, 4, $row, 1, 1);
     $self->{service_gui}->{$sid}->{status_label} = $w;
 
+    my $edit_button = Gtk3::Button->new_from_icon_name('document-edit', 1);
+    $edit_button->set_tooltip_text('Edit static resources');
+    $sgrid->attach($edit_button, 5, $row, 1, 1);
+    $edit_button->signal_connect(
+        clicked => sub {
+            $self->show_service_edit_dialog($sid);
+        },
+    );
+
     $w = Gtk3::Button->new_from_icon_name('edit-delete', 1);
-    $sgrid->attach($w, 5, $row, 1, 1);
+    $sgrid->attach($w, 6, $row, 1, 1);
     $w->signal_connect(
         clicked => sub {
             $self->show_service_delete_dialog($sid);
@@ -699,7 +777,7 @@ sub create_service_control {
     }
 
     $w = Gtk3::Button->new_from_icon_name('list-add', 1);
-    $sgrid->attach($w, 5, $row, 1, 1);
+    $sgrid->attach($w, 6, $row, 1, 1);
     $w->signal_connect(
         clicked => sub {
             $self->show_service_add_dialog();
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH ha-manager 4/9] sim: add helper to store datacenter configuration
  2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
                   ` (2 preceding siblings ...)
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 3/9] sim: allow editing static resources of resource Maximiliano Sandoval
@ 2025-10-14  9:47 ` Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 5/9] sim: allow configuring " Maximiliano Sandoval
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/HA/Sim/Hardware.pm | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm
index 4d84eeb..a0ce563 100644
--- a/src/PVE/HA/Sim/Hardware.pm
+++ b/src/PVE/HA/Sim/Hardware.pm
@@ -538,6 +538,13 @@ sub read_datacenter_conf {
     return PVE::HA::Tools::read_json_from_file($filename, {});
 }
 
+sub write_datacenter_conf {
+    my ($self, $conf) = @_;
+
+    my $filename = "$self->{statusdir}/datacenter.cfg";
+    PVE::HA::Tools::write_json_to_file($filename, $conf);
+}
+
 sub global_lock {
     my ($self, $code, @param) = @_;
 
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH ha-manager 5/9] sim: allow configuring datacenter configuration
  2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
                   ` (3 preceding siblings ...)
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 4/9] sim: add helper to store datacenter configuration Maximiliano Sandoval
@ 2025-10-14  9:47 ` Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 6/9] sim: add method to persist current state Maximiliano Sandoval
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/HA/Sim/RTHardware.pm | 60 +++++++++++++++++++++++++++++++++++-
 1 file changed, 59 insertions(+), 1 deletion(-)

diff --git a/src/PVE/HA/Sim/RTHardware.pm b/src/PVE/HA/Sim/RTHardware.pm
index e46cb91..5b7c765 100644
--- a/src/PVE/HA/Sim/RTHardware.pm
+++ b/src/PVE/HA/Sim/RTHardware.pm
@@ -290,6 +290,56 @@ sub set_network_state {
     $self->sim_hardware_cmd("network $node $action");
 }
 
+sub create_datacenter_control {
+    my ($self) = @_;
+
+    my $active = 0;
+    my $initial_conf = $self->read_datacenter_conf();
+    if (my $crs = $initial_conf->{crs}) {
+        if (my $ha = $crs->{ha}) {
+            $active = 1 if $ha eq 'static';
+        }
+    }
+
+    my $crs_types = ['basic', 'static'];
+
+    my $label = Gtk3::Label->new('Cluster Resource Scheduler');
+    $label->set_hexpand(1);
+    $label->set_xalign(0.0);
+
+    my $crs_combo = Gtk3::ComboBoxText->new();
+    $crs_combo->set_valign('center');
+    foreach my $type (@$crs_types) {
+        $crs_combo->append_text($type);
+    }
+    $crs_combo->set_active($active);
+    $crs_combo->signal_connect(
+        'notify::active' => sub {
+            my $combo = shift;
+
+            my $active = $combo->get_active();
+            return if $active < 0;
+
+            my $ha_type = $crs_types->[$active];
+
+            my $conf = $self->read_datacenter_conf();
+            $conf->{crs}->{ha} = $ha_type;
+            $self->write_datacenter_conf($conf);
+        },
+    );
+
+    my $hbox = Gtk3::Box->new('horizontal', 0);
+    $hbox->set_margin_start(6);
+    $hbox->set_margin_end(6);
+    $hbox->set_margin_top(6);
+    $hbox->set_margin_bottom(6);
+    $hbox->add($label);
+    $hbox->add($crs_combo);
+    $hbox->show_all();
+
+    return $hbox;
+}
+
 sub create_node_control {
     my ($self) = @_;
 
@@ -854,10 +904,18 @@ sub create_main_window {
     my $vbox = Gtk3::VBox->new(0, 0);
     $grid->attach($vbox, 1, 0, 1, 1);
 
+    my $datacenter_control = $self->create_datacenter_control();
+    $vbox->pack_start($datacenter_control, 0, 0, 0);
+
+    my $sep = Gtk3::Separator->new('horizontal');
+    $sep->set('margin-top', 10);
+    $sep->set_vexpand(0);
+    $vbox->pack_start($sep, 0, 0, 0);
+
     my $ngrid = $self->create_node_control();
     $vbox->pack_start($ngrid, 0, 0, 0);
 
-    my $sep = Gtk3::HSeparator->new;
+    $sep = Gtk3::Separator->new('horizontal');
     $sep->set('margin-top', 10);
     $vbox->pack_start($sep, 0, 0, 0);
 
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH ha-manager 6/9] sim: add method to persist current state
  2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
                   ` (4 preceding siblings ...)
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 5/9] sim: allow configuring " Maximiliano Sandoval
@ 2025-10-14  9:47 ` Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 7/9] sim: add button to persist state to header bar Maximiliano Sandoval
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

This method is essentially `new()` but in reverse.

This allows us to save the current state in the simulator and start from
it instead of using the default state.

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/HA/Sim/Hardware.pm | 52 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm
index a0ce563..0747dde 100644
--- a/src/PVE/HA/Sim/Hardware.pm
+++ b/src/PVE/HA/Sim/Hardware.pm
@@ -507,6 +507,58 @@ sub new {
     return $self;
 }
 
+sub save_state {
+    my ($self, $testdir) = @_;
+
+    die "missing testdir" if !$testdir;
+
+    die "testdir '$testdir' does not exist or is not a directory!\n"
+        if !-d $testdir;
+
+    my $statusdir = $self->{statusdir};
+    my $cstatus = $self->read_hardware_status_nolock();
+
+    foreach my $node (sort keys %$cstatus) {
+        if (-f "$statusdir/service_status_$node") {
+            copy("$statusdir/service_status_$node", "$testdir/service_status_$node");
+        }
+    }
+
+    if (-f "$statusdir/static_service_stats") {
+        copy("$statusdir/static_service_stats", "$testdir/static_service_stats");
+    }
+
+    if (-f "$statusdir/datacenter.cfg") {
+        copy("$statusdir/datacenter.cfg", "$testdir/datacenter.cfg");
+    }
+
+    if (-f "$statusdir/fence.cfg") {
+        copy("$statusdir/fence.cfg", "$testdir/fence.cfg");
+    }
+
+    if (-f "$statusdir/hardware_status") {
+        copy("$statusdir/hardware_status", "$testdir/hardware_status");
+    }
+
+    if (-f "$statusdir/service_config") {
+        copy("$statusdir/service_config", "$testdir/service_config");
+    }
+
+    if (-f "$statusdir/groups") {
+        copy("$statusdir/groups", "$testdir/groups");
+    }
+
+    if (-f "$statusdir/rules_config") {
+        copy("$statusdir/rules_config", "$testdir/rules_config");
+    }
+
+    if (-f "$statusdir/manager_status") {
+        copy("$statusdir/manager_status", "$testdir/manager_status");
+    }
+
+    print "current state saved\n";
+}
+
 sub get_time {
     my ($self) = @_;
 
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH ha-manager 7/9] sim: add button to persist state to header bar
  2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
                   ` (5 preceding siblings ...)
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 6/9] sim: add method to persist current state Maximiliano Sandoval
@ 2025-10-14  9:47 ` Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 8/9] sim: set default cpu count and memory on new nodes Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 9/9] gitignore: ignore build directory Maximiliano Sandoval
  8 siblings, 0 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/HA/Sim/RTHardware.pm | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/src/PVE/HA/Sim/RTHardware.pm b/src/PVE/HA/Sim/RTHardware.pm
index 5b7c765..a9bba4b 100644
--- a/src/PVE/HA/Sim/RTHardware.pm
+++ b/src/PVE/HA/Sim/RTHardware.pm
@@ -48,7 +48,7 @@ sub new {
         $d->{lrm_env} = PVE::HA::Env->new('PVE::HA::Sim::RTEnv', $node, $self, 'lrm');
     }
 
-    $self->create_main_window();
+    $self->create_main_window($testdir);
 
     return $self;
 }
@@ -886,10 +886,26 @@ sub create_log_view {
 }
 
 sub create_main_window {
-    my ($self) = @_;
+    my ($self, $testdir) = @_;
+
+    my $title = 'Proxmox HA Simulator';
 
     my $window = Gtk3::Window->new();
-    $window->set_title("Proxmox HA Simulator");
+    $window->set_title($title);
+
+    my $save_button = Gtk3::Button->new('Save');
+    $save_button->signal_connect(
+        clicked => sub {
+            $self->save_state($testdir);
+        },
+    );
+
+    my $header_bar = Gtk3::HeaderBar->new();
+    $header_bar->pack_end($save_button);
+    $header_bar->set_title($title);
+    $header_bar->set_show_close_button(1);
+
+    $window->set_titlebar($header_bar);
 
     $window->signal_connect(destroy => sub { Gtk3::main_quit(); });
 
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH ha-manager 8/9] sim: set default cpu count and memory on new nodes
  2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
                   ` (6 preceding siblings ...)
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 7/9] sim: add button to persist state to header bar Maximiliano Sandoval
@ 2025-10-14  9:47 ` Maximiliano Sandoval
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 9/9] gitignore: ignore build directory Maximiliano Sandoval
  8 siblings, 0 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

Otherwise when switching to the static crs a warning would be thrown.

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 src/PVE/HA/Sim/Hardware.pm | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/PVE/HA/Sim/Hardware.pm b/src/PVE/HA/Sim/Hardware.pm
index 0747dde..2b63f5a 100644
--- a/src/PVE/HA/Sim/Hardware.pm
+++ b/src/PVE/HA/Sim/Hardware.pm
@@ -471,9 +471,9 @@ sub new {
             || die "Copy failed: $!\n";
     } else {
         my $cstatus = {
-            node1 => { power => 'off', network => 'off' },
-            node2 => { power => 'off', network => 'off' },
-            node3 => { power => 'off', network => 'off' },
+            node1 => { power => 'off', network => 'off', cpus => 24, memory => 131072 },
+            node2 => { power => 'off', network => 'off', cpus => 24, memory => 131072 },
+            node3 => { power => 'off', network => 'off', cpus => 24, memory => 131072 },
         };
         $self->write_hardware_status_nolock($cstatus);
     }
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [pve-devel] [PATCH ha-manager 9/9] gitignore: ignore build directory
  2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
                   ` (7 preceding siblings ...)
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 8/9] sim: set default cpu count and memory on new nodes Maximiliano Sandoval
@ 2025-10-14  9:47 ` Maximiliano Sandoval
  8 siblings, 0 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14  9:47 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
---
 .gitignore | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitignore b/.gitignore
index 35de63f..0a6dc7e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@
 /src/test/fence_cfgs/*.cfg.commands
 /src/test/fence_cfgs/*.cfg.write
 /src/test/rules_cfgs/*.cfg.output
+/pve-ha-manager-[0-9]*/
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [pve-devel] [PATCH ha-manager 3/9] sim: allow editing static resources of resource
  2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 3/9] sim: allow editing static resources of resource Maximiliano Sandoval
@ 2025-10-14 10:00   ` Maximiliano Sandoval
  0 siblings, 0 replies; 11+ messages in thread
From: Maximiliano Sandoval @ 2025-10-14 10:00 UTC (permalink / raw)
  To: pve-devel

Maximiliano Sandoval <m.sandoval@proxmox.com> writes:

> Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
> ---
>  src/PVE/HA/Sim/RTHardware.pm | 82 +++++++++++++++++++++++++++++++++++-
>  1 file changed, 80 insertions(+), 2 deletions(-)
>
> diff --git a/src/PVE/HA/Sim/RTHardware.pm b/src/PVE/HA/Sim/RTHardware.pm
> index 28c756e..e46cb91 100644
> --- a/src/PVE/HA/Sim/RTHardware.pm
> +++ b/src/PVE/HA/Sim/RTHardware.pm
> @@ -490,6 +490,75 @@ sub show_service_add_dialog {
>      $dialog->destroy();
>  }
>  
> +sub show_service_edit_dialog {
> +    my ($self, $sid) = @_;
> +
> +    my $stats = $self->read_static_service_stats();
> +    my $resource_stats = $stats->{$sid}
> +        // { maxcpu => $DEFAULT_MAXCPU, maxmemory => $DEFAULT_MAXMEM };
> +
> +    my $cpu_label = Gtk3::Label->new('CPU Count');
> +    $cpu_label->set_hexpand(1);
> +    $cpu_label->set_xalign(0);
> +
> +    my $cpu_count_spin = Gtk3::SpinButton->new_with_range(1.0, 1024, 1.0);
> +    $cpu_count_spin->set_value($resource_stats->{maxcpu});
> +
> +    my $cpu_box = Gtk3::Box->new('horizontal', 6);
> +    $cpu_box->add($cpu_label);
> +    $cpu_box->add($cpu_count_spin);
> +
> +    my $memory_label = Gtk3::Label->new('Memory (MiB)');
> +    $memory_label->set_hexpand(1);
> +    $memory_label->set_xalign(0);
> +
> +    # There is an arbitrary limit of 10 TiB
> +    my $memory_spin = Gtk3::SpinButton->new_with_range(1.0, 10485760.0, 1.0);
> +    $memory_spin->set_value($resource_stats->{maxmemory});
> +
> +    my $memory_box = Gtk3::Box->new('horizontal', 6);
> +    $memory_box->add($memory_label);
> +    $memory_box->add($memory_spin);
> +
> +    my $vbox = Gtk3::Box->new('vertical', 6);
> +    $vbox->add($cpu_box);
> +    $vbox->add($memory_box);
> +
> +    my $dialog = Gtk3::Dialog->new();
> +
> +    $dialog->set_title("Migrate $sid");

This should be Edit instead.

> +    $dialog->set_modal(1);
> +    $dialog->set_transient_for($self->{main_window});
> +
> +    $dialog->add_button("_OK", 'ok');
> +
> +    my $content_area = $dialog->get_content_area();
> +    $content_area->add($vbox);
> +    $vbox->set_margin_start(12);
> +    $vbox->set_margin_end(12);
> +    $vbox->set_margin_top(12);
> +    $vbox->set_margin_bottom(12);
> +
> +    $dialog->show_all();
> +
> +    $dialog->signal_connect(
> +        'response' => sub {
> +            my ($dialog, $response) = @_;
> +
> +            if ($response eq 'ok') {
> +                $self->set_static_service_stats(
> +                    $sid,
> +                    {
> +                        maxcpu => $cpu_count_spin->get_value(),
> +                        maxmemory => $memory_spin->get_value(),
> +                    },
> +                );
> +            }
> +            $dialog->close();
> +        },
> +    );
> +}
> +
>  sub show_service_delete_dialog {
>      my ($self, $sid) = @_;
>  
> @@ -659,8 +728,17 @@ sub new_service_gui_entry {
>      $sgrid->attach($w, 4, $row, 1, 1);
>      $self->{service_gui}->{$sid}->{status_label} = $w;
>  
> +    my $edit_button = Gtk3::Button->new_from_icon_name('document-edit', 1);
> +    $edit_button->set_tooltip_text('Edit static resources');
> +    $sgrid->attach($edit_button, 5, $row, 1, 1);
> +    $edit_button->signal_connect(
> +        clicked => sub {
> +            $self->show_service_edit_dialog($sid);
> +        },
> +    );
> +
>      $w = Gtk3::Button->new_from_icon_name('edit-delete', 1);
> -    $sgrid->attach($w, 5, $row, 1, 1);
> +    $sgrid->attach($w, 6, $row, 1, 1);
>      $w->signal_connect(
>          clicked => sub {
>              $self->show_service_delete_dialog($sid);
> @@ -699,7 +777,7 @@ sub create_service_control {
>      }
>  
>      $w = Gtk3::Button->new_from_icon_name('list-add', 1);
> -    $sgrid->attach($w, 5, $row, 1, 1);
> +    $sgrid->attach($w, 6, $row, 1, 1);
>      $w->signal_connect(
>          clicked => sub {
>              $self->show_service_add_dialog();

-- 
Maximiliano


_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2025-10-14 10:00 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-14  9:47 [pve-devel] [PATCH ha-manager 0/9] allow setting crs and service static resources Maximiliano Sandoval
2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 1/9] sim: add command to set static service stats Maximiliano Sandoval
2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 2/9] sim: add UI to set resource stats for new guests Maximiliano Sandoval
2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 3/9] sim: allow editing static resources of resource Maximiliano Sandoval
2025-10-14 10:00   ` Maximiliano Sandoval
2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 4/9] sim: add helper to store datacenter configuration Maximiliano Sandoval
2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 5/9] sim: allow configuring " Maximiliano Sandoval
2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 6/9] sim: add method to persist current state Maximiliano Sandoval
2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 7/9] sim: add button to persist state to header bar Maximiliano Sandoval
2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 8/9] sim: set default cpu count and memory on new nodes Maximiliano Sandoval
2025-10-14  9:47 ` [pve-devel] [PATCH ha-manager 9/9] gitignore: ignore build directory Maximiliano Sandoval

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal