Author: arkurth
Date: Wed May 3 22:14:19 2017
New Revision: 1793726
URL: http://svn.apache.org/viewvc?rev=1793726&view=rev
Log:
VCL-1000
Renamed:
* OS.pm::run_management_node_tools_scripts --> run_stage_scripts_on_computer
* ManagementNode.pm::run_management_node_stage_scripts -->
run_stage_scripts_on_management_node
Added:
* OS.pm::run_stage_scripts
run_stage_scripts which calls both run_stage_scripts_on_computer and
run_stage_scripts_on_management_node to avoid making the same 2 calls in many
locations. Replaced individual calls with single call to run_stage_scripts.
The following were added and only contain a call to OS.pm::run_stage_scripts
with the corresponding stage argument:
* OS.pm::post_load
* OS.pm::post_reserve
* OS.pm::post_initial_connection
* OS.pm::post_reservation
* OS.pm::pre_reload
Removed calls to the run*scripts subroutines and added calls to the new
subroutines in OS.pm:
* Linux.pm::post_load --> $self->SUPER::post_load
* Linux.pm::post_reserve --> $self->SUPER::post_reserve
* Linux.pm::post_reservation --> $self->SUPER::post_reservation
* ESXi.pm::post_load --> $self->SUPER::post_load (Note: this module is not
supported yet)
* OSX.pm::post_load --> $self->SUPER::post_load
* Windows.pm::post_load --> $self->SUPER::post_load
* Windows.pm::post_reserve --> $self->SUPER::post_reserve
* Windows.pm::post_reservation --> $self->SUPER::post_reservation
* Windows.pm::pre_reload --> $self->SUPER::pre_reload
* Version_5.pm.pm::pre_reload --> $self->SUPER::pre_reload
* Version_6.pm.pm::pre_reload --> $self->SUPER::pre_reload
Replaced call to run_management_node_tools_scripts with
OS.pm::post_initial_connection in reserved.pm::process causing both computer
and management node scripts to be executed.
Changed location where scripts reside that are executed on the management node
during the stages to better align with other directories under tools:
* tools/mn_stage_scripts --> tools/ManagementNode/Scripts
Moved execution of vcl_post_load.cmd from Version_5.pm and Version_6.pm to
Windows.pm::post_load.
Other
Fixed bug in Windows.pm::_get_os_perl_package. It was using the wrong package
for Windows 10 and 2016.
Updated utils.pm::help to include information for all command line options.
Cleaned up and added debugging information to utils.pm::check_time.
Parameterized timing window for when preloads are processed to make it easier
to configure it to use the variable table in the future.
Modified:
vcl/trunk/managementnode/lib/VCL/Module/OS.pm
vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ESXi.pm
vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm
vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/UnixLab.pm
vcl/trunk/managementnode/lib/VCL/Module/OS/OSX.pm
vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm
vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm
vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm
vcl/trunk/managementnode/lib/VCL/new.pm
vcl/trunk/managementnode/lib/VCL/reclaim.pm
vcl/trunk/managementnode/lib/VCL/reserved.pm
vcl/trunk/managementnode/lib/VCL/utils.pm
Modified: vcl/trunk/managementnode/lib/VCL/Module/OS.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS.pm Wed May 3 22:14:19 2017
@@ -130,14 +130,8 @@ sub pre_capture {
return 0;
}
- # Run custom pre_capture scripts on the management node
- my $enable_experimental_features =
get_variable('enable_experimental_features', 0);
- if ($enable_experimental_features) {
- $self->mn_os->run_management_node_stage_scripts('pre_capture');
- }
-
- # Run custom pre_capture scripts on the computer
- $self->run_management_node_tools_scripts('pre_capture');
+ # Run custom pre_capture scripts
+ $self->run_stage_scripts('pre_capture');
notify($ERRORS{'OK'}, 0, "completed common image capture preparation
tasks");
return 1;
@@ -163,12 +157,32 @@ sub post_capture {
return;
}
- # Run custom post_capture scripts on the management node
- my $enable_experimental_features =
get_variable('enable_experimental_features', 0);
- if ($enable_experimental_features) {
- $self->mn_os->run_management_node_stage_scripts('post_capture');
+ # Run custom post_capture scripts
+ $self->run_stage_scripts('post_capture');
+
+ return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 post_load
+
+ Parameters : none
+ Returns : boolean
+ Description : Performs common OS steps after an image is loaded.
+
+=cut
+
+sub post_load {
+ my $self = shift;
+ if (ref($self) !~ /VCL::Module/) {
+ notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a
function, it must be called as a class method");
+ return;
}
+ # Run custom post_load scripts
+ $self->run_stage_scripts('post_load');
+
return 1;
}
@@ -209,6 +223,99 @@ sub reserve {
#/////////////////////////////////////////////////////////////////////////////
+=head2 post_reserve
+
+ Parameters : none
+ Returns : boolean
+ Description : Performs common OS steps after an image is loaded.
+
+=cut
+
+sub post_reserve {
+ my $self = shift;
+ if (ref($self) !~ /VCL::Module/) {
+ notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a
function, it must be called as a class method");
+ return 0;
+ }
+
+ # Run custom post_reserve scripts
+ $self->run_stage_scripts('post_reserve');
+
+ return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 post_initial_connection
+
+ Parameters : none
+ Returns : boolean
+ Description : Performs common OS steps after a user makes an initial
+ connection.
+
+=cut
+
+sub post_initial_connection {
+ my $self = shift;
+ if (ref($self) !~ /VCL::Module/) {
+ notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a
function, it must be called as a class method");
+ return;
+ }
+
+ # Run custom post_initial_connection scripts
+ $self->run_stage_scripts('post_initial_connection');
+
+ return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 post_reservation
+
+ Parameters : none
+ Returns : boolean
+ Description : Performs common OS steps after a user's reservation is over.
+
+=cut
+
+sub post_reservation {
+ my $self = shift;
+ if (ref($self) !~ /VCL::Module/) {
+ notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a
function, it must be called as a class method");
+ return 0;
+ }
+
+ # Run custom post_reservation scripts
+ $self->run_stage_scripts('post_reservation');
+
+ return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 pre_reload
+
+ Parameters : none
+ Returns : boolean
+ Description : Performs common OS steps prior to a computer being reloaded.
+
+=cut
+
+sub pre_reload {
+ my $self = shift;
+ if (ref($self) !~ /VCL::Module/) {
+ notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a
function, it must be called as a class method");
+ return 0;
+ }
+
+ # Run custom pre_reload scripts
+ $self->run_stage_scripts('pre_reload');
+
+ return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
=head2 add_user_accounts
Parameters : none
@@ -4346,17 +4453,51 @@ sub get_timings {
#/////////////////////////////////////////////////////////////////////////////
-=head2 run_management_node_tools_scripts
+=head2 run_stage_scripts
+
+Parameters : $stage
+ Returns : boolean
+ Description : Runs scripts on both the management node and computer intended
+ for the reservation stage specified by the argument. Management
+ node scripts are executed first.
+
+=cut
+
+sub run_stage_scripts {
+ my $self = shift;
+ if (ref($self) !~ /VCL::Module/) {
+ notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a
function, it must be called as a class method");
+ return;
+ }
+
+ # Get the stage argument
+ my $stage = shift;
+ if (!$stage) {
+ notify($ERRORS{'WARNING'}, 0, "stage argument was not
supplied");
+ return;
+ }
+
+ notify($ERRORS{'DEBUG'}, 0, "attempting to execute custom scripts for
'$stage' stage if any exist");
+
+ my $computer_result = $self->run_stage_scripts_on_computer($stage);
+ my $management_node_result =
$self->mn_os->run_stage_scripts_on_management_node($stage);
+ return $computer_result && $management_node_result;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 run_stage_scripts_on_computer
Parameters : $stage
Returns : boolean
Description : Runs scripts on the computer intended for the state specified by
the argument. The stage argument may be any of the following:
- * pre_capture
* post_load
- * post_reserve
- * post_initial_connection
- * post_reservation
+ * post_reserve
+ * post_initial_connection
+ * post_reservation
+ * pre_reload
+ * pre_capture
Scripts are stored in various directories under tools matching
the OS of the image being loaded. For example, scripts residing
@@ -4390,7 +4531,7 @@ sub get_timings {
=cut
-sub run_management_node_tools_scripts {
+sub run_stage_scripts_on_computer {
my $self = shift;
if (ref($self) !~ /VCL::Module/) {
notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a
function, it must be called as a class method");
@@ -4403,10 +4544,25 @@ sub run_management_node_tools_scripts {
notify($ERRORS{'WARNING'}, 0, "stage argument was not
supplied");
return;
}
- elsif ($stage !~
/(pre_capture|post_load|post_reserve|post_initial_connection|post_reservation)/)
{
+
+ my $computer_stages = {
+ 'post_capture' => 0,
+ 'post_initial_connection' => 1,
+ 'post_load' => 1,
+ 'post_reservation' => 1,
+ 'post_reserve' => 1,
+ 'pre_capture' => 1,
+ 'pre_reload' => 1,
+ };
+
+ if (!defined($computer_stages->{$stage})) {
notify($ERRORS{'WARNING'}, 0, "invalid stage argument was
supplied: $stage");
return;
}
+ elsif (!$computer_stages->{$stage}) {
+ notify($ERRORS{'DEBUG'}, 0, "'$stage' stage scripts are not
supported to be run on a computer");
+ return 1;
+ }
my $computer_node_name = $self->data->get_computer_node_name();
my $image_name = $self->data->get_image_name();
Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm Wed May 3 22:14:19 2017
@@ -527,9 +527,6 @@ sub post_load {
$self->update_public_hostname();
}
- # Run custom post_load scripts residing on the management node
- $self->run_management_node_tools_scripts('post_load');
-
# Run the vcl_post_load script if it exists in the image
my @post_load_script_paths = ('/usr/local/vcl/vcl_post_load',
'/etc/init.d/vcl_post_load');
@@ -549,8 +546,8 @@ sub post_load {
}
}
- return 1;
-} ## end sub post_load
+ return $self->SUPER::post_load();
+}
#/////////////////////////////////////////////////////////////////////////////
@@ -573,17 +570,7 @@ sub post_reserve {
my $image_name = $self->data->get_image_name();
my $computer_short_name = $self->data->get_computer_short_name();
- notify($ERRORS{'OK'}, 0, "initiating Linux post_reserve: $image_name on
$computer_short_name");
- # Run custom post_reserve scripts on the management node
- my $enable_experimental_features =
get_variable('enable_experimental_features', 0);
- if ($enable_experimental_features) {
- $self->mn_os->run_management_node_stage_scripts('post_reserve');
- }
-
- # Run custom post_reserve scripts residing on the management node
- $self->run_management_node_tools_scripts('post_reserve');
-
# User supplied data
#check if variable is set
#get variable from variable table related to server reservation id
âuserdata|<reservation id>â
@@ -637,7 +624,8 @@ sub post_reserve {
}
}
}
- return 1;
+
+ return $self->SUPER::post_reserve();
}
#/////////////////////////////////////////////////////////////////////////////
@@ -658,9 +646,6 @@ sub post_reservation {
return 0;
}
- # Run custom post_reservation scripts residing on the management node
- $self->run_management_node_tools_scripts('post_reservation');
-
my $script_path = '/usr/local/vcl/vcl_post_reservation';
# Check if script exists
@@ -672,13 +657,7 @@ sub post_reservation {
notify($ERRORS{'DEBUG'}, 0, "script does NOT exist:
$script_path");
}
- # Run custom post_reserve scripts on the management node
- my $enable_experimental_features =
get_variable('enable_experimental_features', 0);
- if ($enable_experimental_features) {
-
$self->mn_os->run_management_node_stage_scripts('post_reservation');
- }
-
- return 1;
+ return $self->SUPER::post_reservation();
}
#/////////////////////////////////////////////////////////////////////////////
Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ESXi.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ESXi.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ESXi.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ESXi.pm Wed May 3
22:14:19 2017
@@ -92,7 +92,7 @@ sub post_load {
return 0;
}
- return 1;
+ return $self->SUPER::post_load();
}
#/////////////////////////////////////////////////////////////////////////////
Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm
(original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm Wed May
3 22:14:19 2017
@@ -69,11 +69,11 @@ use VCL::utils;
reservation.
Example:
- /usr/local/vcl/tools/mn_stage_scripts
+ /usr/local/vcl/tools/ManagementNode/Scripts
=cut
-our $MN_STAGE_SCRIPTS_DIRECTORY = "$TOOLS/mn_stage_scripts";
+our $MN_STAGE_SCRIPTS_DIRECTORY = "$TOOLS/ManagementNode/Scripts";
##############################################################################
@@ -374,7 +374,7 @@ sub delete_management_node_reservation_i
#/////////////////////////////////////////////////////////////////////////////
-=head2 run_management_node_stage_scripts
+=head2 run_stage_scripts_on_management_node
Parameters : $stage
Returns : boolean
@@ -384,20 +384,21 @@ sub delete_management_node_reservation_i
specifically for each reservation.
The stage argument may be any of the following:
- * pre_capture
- * post_capture
- * post_load
- * post_reserve
- * post_initial_connection
- * post_reservation
+ * post_capture
+ * post_initial_connection
+ * post_load
+ * post_reservation
+ * post_reserve
+ * pre_capture
+ * pre_reload
The scripts are stored on the management node under:
- /usr/local/vcl/tools/mn_stage_scripts
+ /usr/local/vcl/tools/ManagementNode/Scripts
No scripts exist by default. When the vcld process reaches the
stage specified by the argument, it will check the subdirectory
with a name that matches the stage name. For example:
- /usr/local/vcl/tools/mn_stage_scripts/post_capture
+ /usr/local/vcl/tools/ManagementNode/Scripts/post_capture
It will attempt to execute any files under this directory.
@@ -417,7 +418,7 @@ sub delete_management_node_reservation_i
=cut
-sub run_management_node_stage_scripts {
+sub run_stage_scripts_on_management_node {
my $self = shift;
if (ref($self) !~ /VCL::/i) {
notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a
function, it must be called as a class method");
@@ -430,10 +431,26 @@ sub run_management_node_stage_scripts {
notify($ERRORS{'WARNING'}, 0, "stage argument was not
supplied");
return;
}
- elsif ($stage !~
/(pre_capture|post_capture|post_load|post_reserve|post_initial_connection|post_reservation)/)
{
+
+ my $management_node_stages = {
+ 'post_capture' => 1,
+ 'post_initial_connection' => 1,
+ 'post_load' => 1,
+ 'post_reservation' => 1,
+ 'post_reserve' => 1,
+ 'pre_capture' => 1,
+ 'pre_reload' => 1,
+ };
+
+ if (!defined($management_node_stages->{$stage})) {
notify($ERRORS{'WARNING'}, 0, "invalid stage argument was
supplied: $stage");
return;
}
+ elsif (!$management_node_stages->{$stage}) {
+ # Note: Not currently used, could someday if a particular stage
is defined for computer scripts but not MN scripts
+ notify($ERRORS{'DEBUG'}, 0, "'$stage' stage scripts are not
supported to be run on a managment node");
+ return 1;
+ }
# Override the die handler
local $SIG{__DIE__} = sub{};
Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/UnixLab.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/UnixLab.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/UnixLab.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/UnixLab.pm Wed May 3
22:14:19 2017
@@ -350,11 +350,11 @@ sub reserve { return 1; }
#//////////////////////////////////////////////////////////////////////////////
-=head2 run_management_node_tools_scripts
+=head2 run_stage_scripts_on_computer
=cut
-sub run_management_node_tools_scripts { return 1; }
+sub run_stage_scripts_on_computer { return 1; }
#/////////////////////////////////////////////////////////////////////////////
Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/OSX.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/OSX.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/OSX.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/OSX.pm Wed May 3 22:14:19 2017
@@ -276,6 +276,9 @@ sub post_load {
$self->activate_irapp();
+ # arkurth: added for possible future use, don't have a way to test
+ # Use the following line to enable execution of stage scripts:
+ # return $self->SUPER::post_load();
notify($ERRORS{'OK'}, 0, "returning 1");
return 1;
Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Windows.pm Wed May 3 22:14:19
2017
@@ -995,15 +995,34 @@ sub post_load {
}
delete $self->{reboot_required};
}
-
+
+=item *
+
+ Run custom post_load scripts residing in the image
+
+=cut
+
+ my $script_path = '$SYSTEMROOT/vcl_post_load.cmd';
+ if (!$self->file_exists($script_path)) {
+ notify($ERRORS{'DEBUG'}, 0, "custom post_load script does NOT
exist in image: $script_path");
+ }
+ else {
+ $self->run_script($script_path);
+ }
+
+=item *
+
+ Call OS.pm::post_load
+
+=cut
+
+ return $self->SUPER::post_load();
=back
=cut
- notify($ERRORS{'DEBUG'}, 0, "Windows common post-load tasks complete");
- return 1;
-} ## end sub post_load
+}
#/////////////////////////////////////////////////////////////////////////////
@@ -1060,16 +1079,9 @@ sub post_reserve {
return 0;
}
- # Run custom post_reserve scripts residing on the management node
- $self->run_management_node_tools_scripts('post_reserve');
-
# Check if custom post_reserve script exists in the image
my $script_path = '$SYSTEMROOT/vcl_post_reserve.cmd';
- if (!$self->file_exists($script_path)) {
- notify($ERRORS{'DEBUG'}, 0, "custom post_reserve script does
NOT exist in image: $script_path");
- return 1;
- }
- else {
+ if ($self->file_exists($script_path)) {
# If post_reserve script exists, assume it does user or
reservation-specific actions
# If the user never connects and the reservation times out,
there's no way to revert these actions in order to clean the computer for
another user
# Tag the image as tainted so it is reloaded
@@ -1078,8 +1090,11 @@ sub post_reserve {
# Run the post_reserve script
$self->run_script($script_path);
}
+ else {
+ notify($ERRORS{'DEBUG'}, 0, "custom post_reserve script does
NOT exist in image: $script_path");
+ }
- return 1;
+ return $self->SUPER::post_reserve();
}
#/////////////////////////////////////////////////////////////////////////////
@@ -1100,9 +1115,6 @@ sub post_reservation {
return 0;
}
- # Run custom post_reservation scripts residing on the management node
- $self->run_management_node_tools_scripts('post_reservation');
-
# Check if custom post_reservation script exists in image
my $script_path = '$SYSTEMROOT/vcl_post_reservation.cmd';
if ($self->file_exists($script_path)) {
@@ -1113,7 +1125,7 @@ sub post_reservation {
notify($ERRORS{'DEBUG'}, 0, "custom post_reservation script
does NOT exist in image: $script_path");
}
- return 1;
+ return $self->SUPER::post_reservation();
}
#/////////////////////////////////////////////////////////////////////////////
@@ -1142,7 +1154,7 @@ sub pre_reload {
$self->ad_delete_computer($computer_name,
$computer_current_domain_name);
}
- return 1;
+ return $self->SUPER::pre_reload();
}
#/////////////////////////////////////////////////////////////////////////////
@@ -12706,9 +12718,12 @@ sub _get_os_perl_package {
elsif ($product_name =~ /(XP|2003)/i) {
$perl_package = "VCL::Module::OS::Windows::Version_5::$1";
}
- elsif ($product_name =~ /(Vista|2008|2012|2016|7|8|10)/ig) {
+ elsif ($product_name =~ /(Vista|2008|2012|7|8)/ig) {
$perl_package = "VCL::Module::OS::Windows::Version_6::$1";
}
+ elsif ($product_name =~ /(2016|10)/ig) {
+ $perl_package = "VCL::Module::OS::Windows::Version_10::$1";
+ }
else {
notify($ERRORS{'WARNING'}, 0, "failed to determine OS installed
on computer, unsupported Windows product name: $product_name");
return;
Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_5.pm Wed May 3
22:14:19 2017
@@ -150,43 +150,16 @@ sub post_load {
notify($ERRORS{'DEBUG'}, 0, "beginning Windows version 5.x post-load
tasks");
-=item * Call parent class's post_load() subroutine
+=item * Call Windows.pm::post_load()
=cut
- notify($ERRORS{'DEBUG'}, 0, "calling parent class post_load()
subroutine");
- if ($self->SUPER::post_load()) {
- notify($ERRORS{'OK'}, 0, "successfully executed parent class
post_load() subroutine");
- }
- else {
- notify($ERRORS{'WARNING'}, 0, "failed to execute parent class
post_load() subroutine");
- return;
- }
-
-=item * Run custom post_load scripts residing on the management node
-
-=cut
-
- $self->run_management_node_tools_scripts('post_load');
-
-=item * Run custom post_load scripts residing in the image
-
-=cut
-
- my $script_path = '$SYSTEMROOT/vcl_post_load.cmd';
- if (!$self->file_exists($script_path)) {
- notify($ERRORS{'DEBUG'}, 0, "custom post_load script does NOT
exist in image: $script_path");
- }
- else {
- $self->run_script($script_path);
- }
+ return $self->SUPER::post_load();
=back
=cut
- notify($ERRORS{'DEBUG'}, 0, "Windows version 5.x post-load tasks
complete");
- return 1;
}
##############################################################################
Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Windows/Version_6.pm Wed May 3
22:14:19 2017
@@ -183,21 +183,15 @@ sub post_load {
notify($ERRORS{'CRITICAL'}, 0, "subroutine can only be called
as a VCL::Module object method");
return;
}
-
- notify($ERRORS{'DEBUG'}, 0, "beginning Windows version 6 post-load
tasks");
=item * Call parent class's post_load() subroutine
=cut
- notify($ERRORS{'DEBUG'}, 0, "calling parent class post_load()
subroutine");
- if ($self->SUPER::post_load()) {
- notify($ERRORS{'OK'}, 0, "successfully executed parent class
post_load() subroutine");
- }
- else {
- notify($ERRORS{'WARNING'}, 0, "failed to execute parent class
post_load() subroutine");
- return;
- }
+ $self->SUPER::post_load() || return;
+
+
+ notify($ERRORS{'DEBUG'}, 0, "beginning Windows version 6 post-load
tasks");
=item * Ignore default routes configured for the private interface and use
default routes configured for the public interface
@@ -211,24 +205,6 @@ sub post_load {
$self->activate();
-=item * Run custom post_load scripts residing on the management node
-
-=cut
-
- $self->run_management_node_tools_scripts('post_load');
-
-=item * Run custom post_load scripts residing in the image
-
-=cut
-
- my $script_path = '$SYSTEMROOT/vcl_post_load.cmd';
- if (!$self->file_exists($script_path)) {
- notify($ERRORS{'DEBUG'}, 0, "custom post_load script does NOT
exist in image: $script_path");
- }
- else {
- $self->run_script($script_path);
- }
-
=back
=cut
Modified: vcl/trunk/managementnode/lib/VCL/new.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/new.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/new.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/new.pm Wed May 3 22:14:19 2017
@@ -580,7 +580,7 @@ sub reload_image {
# Attempt to create a new OS object representing OS currently
installed and check if that object implements a 'pre_reload' subroutine
if ($self->os->is_ssh_responding()) {
my $computer_current_os =
$self->create_current_os_object($computer_id, 1);
- if ($computer_current_os &&
$computer_current_os->can('pre_reload')) {
+ if ($computer_current_os) {
$computer_current_os->pre_reload();
}
}
Modified: vcl/trunk/managementnode/lib/VCL/reclaim.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/reclaim.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/reclaim.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/reclaim.pm Wed May 3 22:14:19 2017
@@ -249,14 +249,7 @@ sub insert_reload_and_exit {
my $computer_id = $self->data->get_computer_id();
my $computer_shortname = $self->data->get_computer_short_name();
- # Run any vcl_post_reservation scripts (if exists)
- if ($self->os->can("post_reservation")) {
- if ($self->os->is_ssh_responding()) {
- if ($self->os->post_reservation()) {
- notify($ERRORS{'OK'}, 0, "post_reservation
script has been executed on $computer_shortname prior to reloading");
- }
- }
- }
+ $self->os->post_reservation();
# Retrieve next image
my ($action, $next_image_name, $next_image_id, $next_imagerevision_id)
= $self->data->get_next_image_data_structure();
Modified: vcl/trunk/managementnode/lib/VCL/reserved.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/reserved.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/reserved.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/reserved.pm Wed May 3 22:14:19 2017
@@ -279,8 +279,8 @@ sub process {
}
}
- # Run custom post_initial_connection scripts residing on the management
node
- $self->os->run_management_node_tools_scripts('post_initial_connection');
+ # Perform steps after a user makes an initial connection
+ $self->os->post_initial_connection();
# For cluster reservations, the parent must wait until all child
reserved processes have exited
# Otherwise, the state will change to inuse while the child processes
are still finishing up the reserved state
Modified: vcl/trunk/managementnode/lib/VCL/utils.pm
URL:
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1793726&r1=1793725&r2=1793726&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/utils.pm Wed May 3 22:14:19 2017
@@ -549,10 +549,12 @@ Please read the README and INSTALLATION
Documentation is available at http://cwiki.apache.org/VCL.
Command line options:
+-conf=<path> | Specify vcld configuration file (default: /etc/vcl/vcld.conf)
+-log=<path> | Specify vcld log file (default: /var/log/vcld.log)
-setup | Run management node setup
--conf=<path> | Specify vcld configuration file
-verbose | Run vcld in verbose mode
--debug | Run vcld in non-daemon mode
+-nodaemon | Run vcld in non-daemon mode
+-exn | Use persistent SSH connections (experimental)
-help | Display this help information
============================================================================
END
@@ -1107,6 +1109,9 @@ sub check_time {
my $lastcheck_diff_minutes = round($lastcheck_diff_seconds / 60);
my $start_diff_minutes = round($start_diff_seconds / 60);
my $end_diff_minutes = round($end_diff_seconds / 60);
+
+ my $preload_window_minutes_prior_high = 35;
+ my $preload_window_minutes_prior_low = 25;
# Print the time differences
#notify($ERRORS{'OK'}, 0, "reservation lastcheck difference:
$lastcheck_diff_minutes minutes ($lastcheck_diff_seconds seconds)");
@@ -1115,20 +1120,24 @@ sub check_time {
#notify($ERRORS{'OK'}, 0, "changelog timestamp difference:
$changelog_diff_seconds seconds");
# Check the state, and then figure out the return code
- if ($request_state_name =~ /new|imageprep|reload|tovmhostinuse/) {
+ if ($request_state_name =~ /(new|imageprep|reload|tovmhostinuse|test)/)
{
if ($start_diff_minutes > 0) {
# Start time is either now or in future,
$start_diff_minutes is positive
-
- if ($start_diff_minutes > 35) {
- #notify($ERRORS{'DEBUG'}, 0, "reservation will
start in more than 35 minutes ($start_diff_minutes)");
+ my $preload_start_minutes = ($start_diff_minutes -
$preload_window_minutes_prior_high);
+ if ($start_diff_minutes >
$preload_window_minutes_prior_high) {
+ if (($preload_start_minutes <= 5 ||
$start_diff_minutes % 5 == 0) && ($start_diff_seconds % 60) >= 50) {
+ notify($ERRORS{'DEBUG'}, 0,
"$request_state_name request start time is $start_diff_minutes minutes from
now, preload process will begin in $preload_start_minutes minutes
($preload_window_minutes_prior_high minutes prior to request start time),
returning 0");
+ }
return "0";
}
- elsif ($start_diff_minutes >= 25 && $start_diff_minutes
<= 35) {
- notify($ERRORS{'DEBUG'}, 0, "reservation will
start in 25-35 minutes ($start_diff_minutes)");
+ elsif ($start_diff_minutes >=
$preload_window_minutes_prior_low && $start_diff_minutes <=
$preload_window_minutes_prior_high) {
+ notify($ERRORS{'DEBUG'}, 0,
"$request_state_name request start time is $start_diff_minutes minutes from
now, returning 'preload'");
return "preload";
}
else {
- #notify($ERRORS{'DEBUG'}, 0, "reservation will
start less than 25 minutes ($start_diff_minutes)");
+ if (($start_diff_minutes <= 5 ||
$start_diff_minutes % 5 == 0) && ($start_diff_seconds % 60) >= 50) {
+ notify($ERRORS{'DEBUG'}, 0,
"$request_state_name request will be processed in $start_diff_minutes minutes,
returning 0");
+ }
return "0";
}
} ## end if ($start_diff_minutes > 0)
@@ -1138,28 +1147,33 @@ sub check_time {
#Start time is fairly old - something is off
#send warning to log for tracking purposes
if ($start_diff_minutes < -17) {
- notify($ERRORS{'WARNING'}, 0, "reservation
start time was in the past 17 minutes ($start_diff_minutes)");
+ notify($ERRORS{'WARNING'}, 0, "reservation
start time was in the past 17 minutes ($start_diff_minutes), returning
'start'");
+ }
+ else {
+ notify($ERRORS{'DEBUG'}, 0, "reservation start
time was $start_diff_minutes minutes ago, returning 'start'");
}
return "start";
} ## end else [ if ($start_diff_minutes > 0)
}
- elsif ($request_state_name =~ /tomaintenance/) {
+ elsif ($request_state_name =~ /(tomaintenance)/) {
+ # Only display this once per hour at most, tomaintenance can be
far into the future
if ($start_diff_minutes > 0) {
- # Start time is either now or in future,
$start_diff_minutes is positive
- notify($ERRORS{'DEBUG'}, 0, "$request_state_name
request will be processed in $start_diff_minutes minutes");
+ if ($start_diff_minutes % 60 == 0 &&
($start_diff_seconds % 60) >= 50) {
+ notify($ERRORS{'DEBUG'}, 0,
"$request_state_name request will be processed in $start_diff_minutes minutes,
returning 0");
+ }
return "0";
}
else {
# Start time is in past, $start_diff_minutes is negative
- notify($ERRORS{'DEBUG'}, 0, "$request_state_name
request will be processed now");
+ notify($ERRORS{'DEBUG'}, 0, "$request_state_name
request will be processed now, returning 'start'");
return "start";
}
}
- elsif ($request_state_name =~ /inuse/) {
+ elsif ($request_state_name =~ /(inuse)/) {
if ($end_diff_minutes <= 10) {
- notify($ERRORS{'DEBUG'}, 0, "reservation will end in 10
minutes or less ($end_diff_minutes)");
+ notify($ERRORS{'DEBUG'}, 0, "reservation will end in 10
minutes or less ($end_diff_minutes), returning 'end'");
return "end";
}
elsif ($lastcheck_epoch_seconds < $changelog_epoch_seconds &&
$changelog_diff_seconds < 0) {
@@ -1194,32 +1208,31 @@ sub check_time {
return "poll";
}
else {
- #notify($ERRORS{'DEBUG'}, 0,
"reservation has been checked within the past $general_inuse_check_time minutes
($lastcheck_diff_minutes)");
+ #notify($ERRORS{'DEBUG'}, 0,
"reservation has been checked within the past $general_inuse_check_time minutes
($lastcheck_diff_minutes), returning 0");
return 0;
}
}
} ## end else [ if ($end_diff_minutes <= 10)
} ## end elsif ($request_state_name =~ /inuse|imageinuse/) [ if
($request_state_name =~ /new|imageprep|reload|tomaintenance|tovmhostinuse/)
-
- elsif ($request_state_name =~ /complete|failed/) {
+ elsif ($request_state_name =~ /(complete|failed)/) {
# Don't need to keep requests in database if laststate was...
if ($request_laststate_name =~
/image|deleted|makeproduction|reload|tomaintenance|tovmhostinuse/) {
+ notify($ERRORS{'DEBUG'}, 0, "request laststate is
'$request_laststate_name', returning 'remove'");
return "remove";
}
-
- if ($end_diff_minutes < 0) {
- notify($ERRORS{'DEBUG'}, 0, "reservation end time was
in the past ($end_diff_minutes)");
+ elsif ($end_diff_minutes < 0) {
+ notify($ERRORS{'DEBUG'}, 0, "reservation end time was
in the past ($end_diff_minutes), returning 'remove'");
return "remove";
}
else {
# End time is now or in the future
- #notify($ERRORS{'DEBUG'}, 0, "reservation end time is
either right now or in the future ($end_diff_minutes)");
+ notify($ERRORS{'DEBUG'}, 0, "reservation end time is
either right now or in the future ($end_diff_minutes), returning 0");
return "0";
}
} # Close if state is complete or failed
-
# Just return start for all other states
else {
+ notify($ERRORS{'DEBUG'}, 0, "request state is
'$request_state_name', returning 'start'");
return "start";
}
@@ -8841,13 +8854,20 @@ sub format_array_reference {
my $indent_character = ' ';
my $indent_count = 3;
- my $data_type = ref($data);
- if ($data_type !~ /(ARRAY|HASH)/) {
- return "'',\n";
+ if (!defined($data)) {
+ return "<undef>,\n";
}
-
-
+ my $data_type = ref($data);
+ if (!$data_type) {
+ if (length($data) > 100) {
+ $data = substr($data, 0, 100) . '<truncated>';
+ }
+ return "'" . $data . "',\n";
+ }
+ elsif ($data_type !~ /(ARRAY|HASH)/) {
+ return "<ref:$data_type>,\n";
+ }
my $hash_ref;
my $opening_char;
@@ -10620,6 +10640,11 @@ sub get_file_size_info_string {
sub get_copy_speed_info_string {
my ($copied_bytes, $duration_seconds) = @_;
+ # Avoid divide by zero errors
+ if ($duration_seconds == 0) {
+ $duration_seconds = 1;
+ }
+
my $minutes = ($duration_seconds / 60);
$minutes =~ s/\..*//g;
my $seconds = ($duration_seconds - ($minutes * 60));