diff --git a/lib/Ravada.pm b/lib/Ravada.pm index 4301b384f..4af454efd 100644 --- a/lib/Ravada.pm +++ b/lib/Ravada.pm @@ -6367,7 +6367,7 @@ sub _refresh_volatile_domains($self) { "SELECT id, name, id_vm, id_owner, vm FROM domains WHERE is_volatile=1 " ." AND date_changed < ? " ); - $sth->execute(Ravada::Utils::date_now(-120)); + $sth->execute(Ravada::Utils::date_now(-$Ravada::Domain::TTL_REMOVE_VOLATILE)); while ( my ($id_domain, $name, $id_vm, $id_owner, $type) = $sth->fetchrow ) { my $domain; eval { $domain = Ravada::Domain->open(id => $id_domain, _force => 1) } ; diff --git a/lib/Ravada/Request.pm b/lib/Ravada/Request.pm index 60fe69dcf..8f92fe5f8 100644 --- a/lib/Ravada/Request.pm +++ b/lib/Ravada/Request.pm @@ -713,6 +713,7 @@ sub _duplicated_request($self=undef, $command=undef, $args=undef) { confess "Error: missing command " if !$command; # delete $args_d->{uid} unless $command eq 'clone'; delete $args_d->{uid} if $command =~ /(cleanup|refresh_vms|set_base_vm)/; + delete $args_d->{uid} if exists $args_d->{uid} && !defined $args_d->{uid}; delete $args_d->{at}; delete $args_d->{status}; delete $args_d->{timeout}; @@ -720,7 +721,7 @@ sub _duplicated_request($self=undef, $command=undef, $args=undef) { my $sth = $$CONNECTOR->dbh->prepare( "SELECT id,args FROM requests WHERE (status <> 'done')" ." AND command=?" - ." AND ( error = '' OR error is NULL)" + ." AND ( error = '' OR error is NULL OR error like '% waiting for process%')" ); $sth->execute($command); while (my ($id,$args_found) = $sth->fetchrow) { diff --git a/script/rvd_back b/script/rvd_back index 3b7ca9c2f..a17e82849 100755 --- a/script/rvd_back +++ b/script/rvd_back @@ -280,9 +280,12 @@ sub do_start { if ( time - $t_refresh > 60 ) { Ravada::Request->cleanup(); - Ravada::Request->refresh_vms() if rand(5)<3; - Ravada::Request->enforce_limits() if rand(5)<2; - Ravada::Request->manage_pools() if rand(5)<2; + next if rand(5)>2; + + Ravada::Request->refresh_vms(); + Ravada::Request->enforce_limits(); + Ravada::Request->manage_pools(); + $t_refresh = time; } sleep 1 if time - $t0 <1; diff --git a/t/device/10_templates.t b/t/device/10_templates.t index 0e55ec341..02ada153c 100644 --- a/t/device/10_templates.t +++ b/t/device/10_templates.t @@ -896,7 +896,7 @@ sub test_templates($vm) { $vm->add_host_device(template => $first->{name}); @list_hostdev = $vm->list_host_devices(); is(scalar @list_hostdev , $n+2); - like ($list_hostdev[-1]->{name} , qr/[a-zA-Z] \d+$/) or exit; + like ($list_hostdev[-1]->{name} , qr/[a-zA-Z\)\(] \d+$/) or exit; my $host_device = $list_hostdev[-1]; diff --git a/t/nodes/10_basic.t b/t/nodes/10_basic.t index 4a933a600..dd5007d70 100644 --- a/t/nodes/10_basic.t +++ b/t/nodes/10_basic.t @@ -19,6 +19,7 @@ my $BASE_NAME = "zz-test-base-alpine"; use_ok('Ravada'); init(); +$Ravada::Domain::TTL_REMOVE_VOLATILE=3; ################################################################################## @@ -668,7 +669,7 @@ sub test_volatile_req($vm, $node) { is($clone->_vm->id, $node->id) or exit; shutdown_domain_internal($clone); - rvd_back->_cmd_refresh_vms(); + _wait_machine_removed($clone); for my $vol ( $clone->list_volumes ) { ok(!$vm->file_exists($vol),$vol) or exit; ok(!$node->file_exists($vol),$vol." in ".$node->name) or exit; @@ -676,6 +677,20 @@ sub test_volatile_req($vm, $node) { _remove_domain($base); } +sub _wait_machine_removed($clone) { + rvd_back->_cmd_refresh_vms(); + for ( 1 .. 10 ) { + my $clone2; + eval { $clone2 = Ravada::Front::Domain->open($clone->id) }; + last if !$clone2; + + rvd_back->_cmd_refresh_vms(); + wait_request(); + + } + wait_request(); +} + sub test_domain_gone($vm, $node) { my $sth = connector->dbh->prepare("INSERT INTO domains (name, id_vm,status, vm) " ." VALUES (?,?,?,?)" @@ -742,7 +757,7 @@ sub test_volatile_req_clone($vm, $node, $machine='pc-i440fx') { push @vols,($clone2->list_volumes); shutdown_domain_internal($clone2); } - rvd_back->_cmd_refresh_vms(); + _wait_machine_removed($clone); for my $vol ( @vols ) { ok(!$vm->file_exists($vol),$vol) or exit; ok(!$node->file_exists($vol),$vol) or exit; diff --git a/t/vm/55_rename.t b/t/vm/55_rename.t index c78983bdd..0993e8248 100644 --- a/t/vm/55_rename.t +++ b/t/vm/55_rename.t @@ -75,9 +75,55 @@ sub test_rename_domain { return $new_domain_name; } +sub _change_hardware_ram($domain) { + Ravada::Request->shutdown_domain( + uid => user_admin->id + ,id_domain => $domain->id + ,timeout => 1 + ); + wait_request(); + + my $max_mem = $domain->info(user_admin)->{max_mem}; + my $mem = $domain->info(user_admin)->{memory}; + + my $new_max_mem = int($max_mem * 1.7 ) + 1; + my $new_mem = int($mem * 1.6 ) + 1; + + Ravada::Request->change_hardware ( + uid => user_admin->id + ,id_domain => $domain->id + ,hardware => 'memory' + ,data => { max_mem => $new_max_mem , memory => $new_mem } + ); + wait_request(debug => 0); + my $domain2 = Ravada::Front::Domain->open($domain->id); + like($domain2->_data('config_no_hd'),qr/./) or die $domain->name; +} + +sub _add_hardware_disk($domain) { + diag("add disk"); + Ravada::Request->shutdown_domain( + uid => user_admin->id + ,id_domain => $domain->id + ,timeout => 1 + ); + wait_request(); + + Ravada::Request->add_hardware( + uid => user_admin->id + ,id_domain => $domain->id + ,name => 'disk' + ,data => { size => 1*1024*1024, type => 'data' } + ); + wait_request(); + my $domain2 = Ravada::Front::Domain->open($domain->id); + diag($domain2->_data('config_no_hd')); +} + sub test_req_rename_domain { - my ($vm_name, $domain_name, $dont_fork) = @_; + my ($vm_name, $domain_name, $dont_fork, $change_hardware) = @_; my $debug = 0; + $change_hardware = 0 if !defined $change_hardware; my $domain_id; { @@ -86,7 +132,11 @@ sub test_req_rename_domain { my $domain = $vm->search_domain($domain_name); ok($domain,"[$vm_name-req] Expecting found $domain_name") or return; $domain_id = $domain->id; - $domain->shutdown_now($USER); + if ($change_hardware == 1 ) { + _add_hardware_disk($domain); + } elsif($change_hardware == 2) { + _change_hardware_ram($domain); + } } my $new_domain_name = new_domain_name(); { @@ -120,6 +170,18 @@ sub test_req_rename_domain { ."$new_domain_name") or return; } + my $req = Ravada::Request->start_domain( + uid => user_admin->id + ,id_domain => $domain_id + ); + wait_request(debug => 0); + Ravada::Request->force_shutdown_domain( + uid => user_admin->id + ,id_domain => $domain_id + ); + wait_request(); + + return $new_domain_name; } sub test_clone_domain { @@ -399,7 +461,13 @@ for my $vm_name ( vm_names()) { test_create_domain($vm_name, $domain_name); $domain_name = test_create_domain($vm_name); - test_req_rename_domain($vm_name, $domain_name) or next; + + my $name2=test_req_rename_domain($vm_name, $domain_name); + next if !$name2; + my $name3 = test_req_rename_domain($vm_name, $name2, undef, 1); + next if !$name3; + my $name4 = test_req_rename_domain($vm_name, $name3, undef, 2); + next if !$name4; test_create_domain($vm_name, $domain_name); test_rename_clone($vm_name);