From 8c97f478a84453020b3c786ef63d89610ca225d1 Mon Sep 17 00:00:00 2001 From: digimer Date: Wed, 1 Nov 2023 16:06:59 -0400 Subject: [PATCH] Updated Server->update_definition() to undefine a server when needed. * Boosted logging to debug anvil-delete-server hang in jenkins. Signed-off-by: digimer --- Anvil/Tools/Server.pm | 61 +++++++++++++++++++++++++++++++++++++++ share/words.xml | 8 +++++ tools/anvil-delete-server | 4 +++ 3 files changed, 73 insertions(+) diff --git a/Anvil/Tools/Server.pm b/Anvil/Tools/Server.pm index 6004c131..6fa1ecc8 100644 --- a/Anvil/Tools/Server.pm +++ b/Anvil/Tools/Server.pm @@ -3089,6 +3089,7 @@ sub update_definition }}); # Define the server + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0818", variables => { server_name => $server_name }}); eval { $anvil->data->{libvirtd}{$short_host_name}{connection}->define_domain($new_definition_xml); }; if ($@) { @@ -3099,6 +3100,66 @@ sub update_definition error => $@, }}); } + else + { + if (not ref($anvil->data->{libvirtd}{$short_host_name}{server}{$server_name}{connection}) eq "Sys::Virt::Domain") + { + # Connect to the server. + my @domains = $anvil->data->{libvirtd}{$short_host_name}{connection}->list_all_domains(); + foreach my $domain_handle (@domains) + { + my $this_server_name = $domain_handle->get_name; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + domain_handle => $domain_handle, + this_server_name => $this_server_name, + }}); + if ($this_server_name eq $server_name) + { + $anvil->data->{libvirtd}{$short_host_name}{server}{$server_name}{connection} = $domain_handle; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "libvirtd::${short_host_name}::server::${server_name}::connection" => $anvil->data->{libvirtd}{$short_host_name}{server}{$server_name}{connection}, + }}); + last; + } + } + + } + + # If this connection still valid? + if (ref($anvil->data->{libvirtd}{$short_host_name}{server}{$server_name}{connection}) eq "Sys::Virt::Domain") + { + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0819", variables => { server_name => $server_name }}); + my $uuid = ""; + eval { $uuid = $anvil->data->{libvirtd}{$short_host_name}{server}{$server_name}{connection}->get_uuid_string(); }; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { "uuid" => $uuid }}); + if ((not $@) && ($uuid)) + { + # Connection is good. + my $updated = $anvil->data->{libvirtd}{$short_host_name}{server}{$server_name}{connection}->is_updated(); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { "updated" => $updated }}); + if ($updated) + { + eval { $anvil->data->{libvirtd}{$short_host_name}{server}{$server_name}{connection}->undefine; }; + if ($@) + { + # Throw an error, then clear the URI so that we just update the DB/on-disk definitions. + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "warning_0167", variables => { + host_name => $short_host_name, + server_name => $server_name, + error => $@, + }}); + } + else + { + my $updated = $anvil->data->{libvirtd}{$short_host_name}{server}{$server_name}{connection}->is_updated(); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { "updated" => $updated }}); + + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0817", variables => { server_name => $server_name }}); + } + } + } + } + } } } } diff --git a/share/words.xml b/share/words.xml index aba0d9c7..411bf4a0 100644 --- a/share/words.xml +++ b/share/words.xml @@ -2629,6 +2629,9 @@ The file: [#!variable!file!#] needs to be updated. The difference is: There is an existing a functioning connection to: [#!variable!target!#], no need to reconnect. There is an existing a functioning connection to the server: [#!variable!server_name!#], no need to reconnect. Waiting for: [#!variable!delay!#] seconds. + The server: [#!variable!server_name!#] libvirt definition was updated, undefining static config. + The server: [#!variable!server_name!#] libvirt definition will now be updated. + Check to verify that the connection to the server: [#!variable!server_name!#] is valid. The host name: [#!variable!target!#] does not resolve to an IP address. @@ -3960,6 +3963,11 @@ We will try to proceed anyway. ==== #!variable!error!# ==== + + Failed to undefine the running server: [#!variable!server_name!#] on the host: [#!variable!host_name!#]. The error, if any, was: +==== +#!variable!error!# +==== diff --git a/tools/anvil-delete-server b/tools/anvil-delete-server index 4b7bdc89..c7065796 100755 --- a/tools/anvil-delete-server +++ b/tools/anvil-delete-server @@ -36,6 +36,10 @@ $anvil->Get->switches({list => [ $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => $anvil->data->{switches}}); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 2, secure => 0, key => "log_0115", variables => { program => $THIS_FILE }}); +### TODO: Remove this post testing +$anvil->Log->level({set => 2}); +$anvil->Log->secure({set => 1}); + $anvil->Database->connect(); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 3, secure => 0, key => "log_0132"}); if (not $anvil->data->{sys}{database}{connections})