From e4f183946ae0ff738544c110078be3fe0af1bd57 Mon Sep 17 00:00:00 2001 From: Francesc Guasch Date: Fri, 12 Apr 2024 15:17:57 +0200 Subject: [PATCH] wip: properly start nodes --- lib/Ravada.pm | 7 +++++-- lib/Ravada/Request.pm | 1 + lib/Ravada/VM.pm | 25 ++++++++++++++++++------- t/lib/Test/Ravada.pm | 2 +- t/mojo/70_volatile.t | 12 ++++++------ 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/lib/Ravada.pm b/lib/Ravada.pm index 108b4999a..3585a0b1f 100644 --- a/lib/Ravada.pm +++ b/lib/Ravada.pm @@ -5684,8 +5684,11 @@ sub _cmd_shutdown_node($self, $request) { sub _cmd_start_node($self, $request) { my $id_node = $request->args('id_node'); - my $node = Ravada::VM->open($id_node); - $node->start(); + my $node; + eval{ $node = Ravada::VM->open($id_node); + $node->start() if$node; + }; + Ravada::VM::_wake_on_lan($id_node) if !$node; } sub _cmd_connect_node($self, $request) { diff --git a/lib/Ravada/Request.pm b/lib/Ravada/Request.pm index 40c733d17..67473ed26 100644 --- a/lib/Ravada/Request.pm +++ b/lib/Ravada/Request.pm @@ -253,6 +253,7 @@ our %COMMAND = ( ,priority => 4 ,commands => ['shutdown','shutdown_now', 'enforce_limits', 'set_time' ,'remove_domain', 'remove', 'refresh_machine_ports' + ,'connect_node','start_node','shutdown_node' ] } diff --git a/lib/Ravada/VM.pm b/lib/Ravada/VM.pm index a48d87720..8dcc3a543 100644 --- a/lib/Ravada/VM.pm +++ b/lib/Ravada/VM.pm @@ -234,8 +234,10 @@ sub open { $args{security} = decode_json($row->{security}) if $row->{security}; my $vm = $self->new(%args); - return if !$vm || !$vm->vm; - $VM{$args{id}} = $vm unless $args{readonly}; + + eval { + $VM{$args{id}} = $vm unless $args{readonly} || !$vm->vm; + }; return $vm; } @@ -2399,17 +2401,26 @@ sub _store_mac_address($self, $force=0 ) { } } -sub _wake_on_lan( $self ) { - return if $self->is_local; +sub _wake_on_lan( $self=undef ) { + return if $self && ref($self) && $self->is_local; - die "Error: I don't know the MAC address for node ".$self->name - if !$self->_data('mac'); + my ($mac_addr, $id_node); + if (ref($self)) { + $mac_addr = $self->_data('mac'); + $id_node = $self->id; + } else { + $id_node = $self; + my $sth = $$CONNECTOR->dbh->prepare("SELECT mac FROM vms WHERE id=?"); + $sth->execute($id_node); + $mac_addr = $sth->fetchrow(); + } + die "Error: I don't know the MAC address for node $id_node" + if !$mac_addr; my $sock = new IO::Socket::INET(Proto=>'udp', Timeout => 60) or die "Error: I can't create an UDP socket"; my $host = '255.255.255.255'; my $port = 9; - my $mac_addr = $self->_data('mac'); my $ip_addr = inet_aton($host); my $sock_addr = sockaddr_in($port, $ip_addr); diff --git a/t/lib/Test/Ravada.pm b/t/lib/Test/Ravada.pm index 4783f6e5b..3b40207a8 100644 --- a/t/lib/Test/Ravada.pm +++ b/t/lib/Test/Ravada.pm @@ -1382,7 +1382,7 @@ sub wait_request { my $error = ($req->error or ''); next if $error =~ /waiting for processes/i; if ($req->command =~ m{rsync_back|set_base_vm|start}) { - like($error,qr{^($|.*port \d+ already used|rsync done)}) or confess $req->command; + like($error,qr{^($|.*port \d+ already used|.*rsync)}) or confess $req->command; } elsif($req->command eq 'refresh_machine_ports') { like($error,qr{^($|.*is not up|.*has ports down|nc: |Connection)}); $req->status('done'); diff --git a/t/mojo/70_volatile.t b/t/mojo/70_volatile.t index 3fc0360af..8a42aae35 100644 --- a/t/mojo/70_volatile.t +++ b/t/mojo/70_volatile.t @@ -451,7 +451,7 @@ sub _clean_old_known($vm_name) { } } -sub _clean_old_bases($vm_name) { +sub _clean_old_bases($vm_name, $wait=1) { my $sth = connector->dbh->prepare("SELECT name FROM domains " ." WHERE is_base=1 AND (id_base IS NULL or id_base=0)" ." AND name like 'zz-test%'" @@ -476,11 +476,11 @@ sub _clean_old_bases($vm_name) { ); } } - wait_request(); + wait_request() if$wait; } -sub _clean_old($vm_name) { - _clean_old_bases($vm_name); +sub _clean_old($vm_name, $wait=1) { + _clean_old_bases($vm_name, $wait); _clean_old_known($vm_name); _remove_unused_volumes(); } @@ -511,15 +511,15 @@ Test::Ravada::_discover(); _init_mojo_client(); login(); -for my $vm_name (reverse @{rvd_front->list_vm_types} ) { +for my $vm_name (@{rvd_front->list_vm_types} ) { diag("Testing volatile clones in $vm_name"); _clean_old($vm_name); test_clone($vm_name); + _clean_old($vm_name); } -remove_old_domains_req(0); # 0=do not wait for them remove_networks_req(); end();