You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by ar...@apache.org on 2008/12/30 20:26:51 UTC
svn commit: r730217 [3/3] - in /incubator/vcl/trunk/managementnode/lib/VCL:
DataStructure.pm Module/OS/Windows/Desktop/Vista.pm
Module/Provisioning/xCAT.pm new.pm reclaim.pm reserved.pm utils.pm
Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT.pm?rev=730217&r1=730216&r2=730217&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT.pm Tue Dec 30 11:26:51 2008
@@ -364,8 +364,8 @@
return;
}
-# Check progress, locate MAC and IP address for this node, monitor /var/log/messages for communication from node
-# dhcp req/ack, xcat calls, etc
+ # Check progress, locate MAC and IP address for this node, monitor /var/log/messages for communication from node
+ # dhcp req/ack, xcat calls, etc
my ($eth0MACaddress, $privateIP);
if (open(MACTAB, "$XCAT_ROOT/etc/mac.tab")) {
my @mactab = <MACTAB>;
@@ -661,7 +661,8 @@
READYFLAG:
#check /var/log/messages file for READY
-
+
+ # Wait for READY flag
if (open(TAIL, "</var/log/messages")) {
seek TAIL, -1, 2;
for (;;) {
@@ -687,7 +688,7 @@
close(TAIL);
goto SSHDATTEMPT;
}
- if ($readycount > 2) {
+ #if ($readycount > 2) {
#check ssh status just in case we missed the flag
my $sshd = _sshd_status($computer_node_name, $image_name);
@@ -697,7 +698,7 @@
close(TAIL);
goto SSHDATTEMPT;
}
- } ## end if ($readycount > 2)
+ #} ## end if ($readycount > 2)
if (!$ready) {
notify($ERRORS{'OK'}, 0, "$computer_node_name not ready yet, sleeping for 40 seconds");
sleep 40;
@@ -861,11 +862,57 @@
else {
notify($ERRORS{'CRITICAL'}, 0, "could not execute $XCAT_ROOT/sbin/makesshgkh $computer_node_name $!");
}
+
+ # IP configuration
+ if ($IPCONFIGURATION ne "manualDHCP") {
+ insertloadlog($reservation_id, $computer_id, "info", "detected change required in IP address configuration on node");
+
+ #not default setting
+ if ($IPCONFIGURATION eq "dynamicDHCP") {
+ my $assignedIPaddress = getdynamicaddress($computer_node_name, $image_os_name);
+ if ($assignedIPaddress) {
+
+ #update computer table
+ if (update_computer_address($computer_id, $assignedIPaddress)) {
+ notify($ERRORS{'OK'}, 0, "dynamic address collected $assignedIPaddress -- updated computer table");
+ insertloadlog($reservation_id, $computer_id, "dynamicDHCPaddress", "SUCCESS collected dynamicDHCP address");
+ }
+ else {
+ notify($ERRORS{'OK'}, 0, "failed to update dynamic address $assignedIPaddress for$computer_id $computer_node_name ");
+ insertloadlog($reservation_id, $computer_id, "dynamicDHCPaddress", "FAILED to update dynamicDHCP address failing reservation");
+ return 0;
+ }
+ } ## end if ($assignedIPaddress)
+ else {
+ notify($ERRORS{'CRITICAL'}, 0, "could not fetch dynamic address from $computer_node_name $image_name");
+ insertloadlog($reservation_id, $computer_id, "dynamicDHCPaddress", "FAILED to collected dynamicDHCP address failing reservation");
+ return 0;
+ }
+ } ## end if ($IPCONFIGURATION eq "dynamicDHCP")
+ elsif ($IPCONFIGURATION eq "static") {
+ insertloadlog($reservation_id, $computer_id, "info", "setting staticIPaddress");
+
+ if (setstaticaddress($computer_node_name, $image_os_name, $computer_ip_address)) {
+ notify($ERRORS{'DEBUG'}, 0, "set static address on $computer_ip_address $computer_node_name ");
+ insertloadlog($reservation_id, $computer_id, "staticIPaddress", "SUCCESS set static IP address on public interface");
+ }
+ else {
+ insertloadlog($reservation_id, $computer_id, "staticIPaddress", "failed to set static IP address on public interface");
+ return 0;
+ }
+ } ## end elsif ($IPCONFIGURATION eq "static") [ if ($IPCONFIGURATION eq "dynamicDHCP")
+ } ## end if ($IPCONFIGURATION ne "manualDHCP")
# Perform post load tasks
# Windows specific routines
- if ($image_os_name =~ /winxp|wxp|win2003/) {
+ if ($image_os_name =~ /winvista/) {
+ # If Vista, don't perform post-load tasks here
+ # new.pm calls the Vista module's post_load() subroutine to perform the same tasks as below
+ notify($ERRORS{'OK'}, 0, "vista image, skipping OS preparation tasks in xCAT.pm, returning 1");
+ return 1;
+ }
+ elsif ($image_os_name =~ /winxp|wxp|win2003|winvista/) {
insertloadlog($reservation_id, $computer_id, "info", "randomizing system level passwords");
@@ -948,11 +995,10 @@
} #while
} #reboot
-#win2003 only - need to set private adapter to static without a gateway
-# win2003 and probably vista zero out one gateway and we only need a gateway on the public adapter
-# so we need to remove the one on the private side
-# downside - we need to reset it to dhcp before making an image.....
-
+ #win2003 only - need to set private adapter to static without a gateway
+ # win2003 and probably vista zero out one gateway and we only need a gateway on the public adapter
+ # so we need to remove the one on the private side
+ # downside - we need to reset it to dhcp before making an image.....
if ($image_os_name =~ /^(win2003)/) {
insertloadlog($reservation_id, $computer_id, "info", "detected OS which requires network gateway modification");
notify($ERRORS{'OK'}, 0, "detected win2003 OS, proceeding to change private adapter to static from dhcp on $computer_node_name");
@@ -1135,46 +1181,6 @@
} ## end elsif ($image_os_name =~ /^(rh[0-9]image|rhel[0-9]|fc[0-9]image|rhfc[0-9]|rhas[0-9]|esx[0-9]+)/) [ if ($image_os_name =~ /winxp|wxp|win2003/)
- # IP configuration
- if ($IPCONFIGURATION ne "manualDHCP") {
- insertloadlog($reservation_id, $computer_id, "info", "detected change required in IP address configuration on node");
-
- #not default setting
- if ($IPCONFIGURATION eq "dynamicDHCP") {
- my $assignedIPaddress = getdynamicaddress($computer_node_name, $image_os_name);
- if ($assignedIPaddress) {
-
- #update computer table
- if (update_computer_address($computer_id, $assignedIPaddress)) {
- notify($ERRORS{'OK'}, 0, "dynamic address collected $assignedIPaddress -- updated computer table");
- insertloadlog($reservation_id, $computer_id, "dynamicDHCPaddress", "SUCCESS collected dynamicDHCP address");
- }
- else {
- notify($ERRORS{'OK'}, 0, "failed to update dynamic address $assignedIPaddress for$computer_id $computer_node_name ");
- insertloadlog($reservation_id, $computer_id, "dynamicDHCPaddress", "FAILED to update dynamicDHCP address failing reservation");
- return 0;
- }
- } ## end if ($assignedIPaddress)
- else {
- notify($ERRORS{'CRITICAL'}, 0, "could not fetch dynamic address from $computer_node_name $image_name");
- insertloadlog($reservation_id, $computer_id, "dynamicDHCPaddress", "FAILED to collected dynamicDHCP address failing reservation");
- return 0;
- }
- } ## end if ($IPCONFIGURATION eq "dynamicDHCP")
- elsif ($IPCONFIGURATION eq "static") {
- insertloadlog($reservation_id, $computer_id, "info", "setting staticIPaddress");
-
- if (setstaticaddress($computer_node_name, $image_os_name, $computer_ip_address)) {
- notify($ERRORS{'DEBUG'}, 0, "set static address on $computer_ip_address $computer_node_name ");
- insertloadlog($reservation_id, $computer_id, "staticIPaddress", "SUCCESS set static IP address on public interface");
- }
- else {
- insertloadlog($reservation_id, $computer_id, "staticIPaddress", "failed to set static IP address on public interface");
- return 0;
- }
- } ## end elsif ($IPCONFIGURATION eq "static") [ if ($IPCONFIGURATION eq "dynamicDHCP")
- } ## end if ($IPCONFIGURATION ne "manualDHCP")
-
return 1;
} ## end sub load
Modified: incubator/vcl/trunk/managementnode/lib/VCL/new.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/new.pm?rev=730217&r1=730216&r2=730217&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/new.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/new.pm Tue Dec 30 11:26:51 2008
@@ -138,7 +138,7 @@
notify($ERRORS{'OK'}, 0, "originating request laststate = $request_laststate_name");
notify($ERRORS{'OK'}, 0, "originating computer state = $computer_state_name");
notify($ERRORS{'OK'}, 0, "originating computer type = $computer_type");
-
+
# If state is tomaintenance, place machine into maintenance state and set request to complete
if ($request_state_name =~ /tomaintenance/) {
notify($ERRORS{'OK'}, 0, "this is a 'tomaintenance' request");
@@ -165,7 +165,7 @@
notify($ERRORS{'OK'}, 0, "exiting");
exit;
} ## end if ($request_state_name =~ /tomaintenance/)
-
+
# Confirm requested computer is available
if ($self->computer_not_being_used()) {
notify($ERRORS{'OK'}, 0, "$computer_short_name is not being used");
@@ -575,95 +575,124 @@
$node_status_string = 'reload';
}
- # Check the status string returned by node_status
- if ($node_status_string !~ /^ready/i) {
- notify($ERRORS{'OK'}, 0, "node status is $node_status_string, $computer_short_name will be reloaded");
- insertloadlog($reservation_id, $computer_id, "loadimageblade", "$computer_short_name must be reloaded with $image_name");
-
- # Make sure provisioning module's load() subroutine exists
- if (!$self->provisioner->can("load")) {
- notify($ERRORS{'CRITICAL'}, 0, ref($self->provisioner) . "->load() subroutine does not exist, returning");
- insertloadlog($reservation_id, $computer_id, "failed", ref($self->provisioner) . "->load() subroutine does not exist");
- return;
- }
+ # Check the status string returned by node_status = 'ready'
+ if ($node_status_string =~ /^ready/i) {
+ # node_status returned 'ready'
+ notify($ERRORS{'OK'}, 0, "node_status returned '$node_status_string', $computer_short_name will not be reloaded");
+ insertloadlog($reservation_id, $computer_id, "info", "node status is $node_status_string, $computer_short_name will not be reloaded");
+
+ notify($ERRORS{'OK'}, 0, "returning 1");
+ return 1;
+ }
+
+ # node_status did not return 'ready'
+ notify($ERRORS{'OK'}, 0, "node status is $node_status_string, $computer_short_name will be reloaded");
+ insertloadlog($reservation_id, $computer_id, "loadimageblade", "$computer_short_name must be reloaded with $image_name");
- # Make sure the image exists on this management node's local disks
- # Attempt to retrieve it if necessary
- if ($self->provisioner->can("does_image_exist")) {
- notify($ERRORS{'DEBUG'}, 0, "calling " . ref($self->provisioner) . "->does_image_exist()");
-
- if ($self->provisioner->does_image_exist($image_name)) {
- notify($ERRORS{'OK'}, 0, "$image_name exists on this management node");
- insertloadlog($reservation_id, $computer_id, "doesimageexists", "confirmed image exists");
- }
- else {
- notify($ERRORS{'OK'}, 0, "$image_name does not exist on this management node");
+ # Make sure provisioning module's load() subroutine exists
+ if (!$self->provisioner->can("load")) {
+ notify($ERRORS{'CRITICAL'}, 0, ref($self->provisioner) . "->load() subroutine does not exist, returning");
+ insertloadlog($reservation_id, $computer_id, "failed", ref($self->provisioner) . "->load() subroutine does not exist");
+ return;
+ }
- # Try to retrieve the image files from another management node
- if ($self->provisioner->can("retrieve_image")) {
- notify($ERRORS{'DEBUG'}, 0, "calling " . ref($self->provisioner) . "->retrieve_image()");
- if ($self->provisioner->retrieve_image($image_name)) {
- notify($ERRORS{'OK'}, 0, "$image_name was retrieved from another management node");
- }
- else {
- notify($ERRORS{'CRITICAL'}, 0, "$image_name does not exist on management node and could not be retrieved");
- insertloadlog($reservation_id, $computer_id, "failed", "requested image does not exist on management node and could not be retrieved");
- return;
- }
- } ## end if ($self->provisioner->can("retrieve_image"...
+ # Make sure the image exists on this management node's local disks
+ # Attempt to retrieve it if necessary
+ if ($self->provisioner->can("does_image_exist")) {
+ notify($ERRORS{'DEBUG'}, 0, "calling " . ref($self->provisioner) . "->does_image_exist()");
+
+ if ($self->provisioner->does_image_exist($image_name)) {
+ notify($ERRORS{'OK'}, 0, "$image_name exists on this management node");
+ insertloadlog($reservation_id, $computer_id, "doesimageexists", "confirmed image exists");
+ }
+ else {
+ notify($ERRORS{'OK'}, 0, "$image_name does not exist on this management node");
+
+ # Try to retrieve the image files from another management node
+ if ($self->provisioner->can("retrieve_image")) {
+ notify($ERRORS{'DEBUG'}, 0, "calling " . ref($self->provisioner) . "->retrieve_image()");
+
+ if ($self->provisioner->retrieve_image($image_name)) {
+ notify($ERRORS{'OK'}, 0, "$image_name was retrieved from another management node");
+ }
else {
- notify($ERRORS{'CRITICAL'}, 0, "unable to retrieve image from another management node, retrieve_image() is not implemented by " . ref($self->provisioner));
- insertloadlog($reservation_id, $computer_id, "failed", "failed requested image does not exist on management node, retrieve_image() is not implemented");
+ notify($ERRORS{'CRITICAL'}, 0, "$image_name does not exist on management node and could not be retrieved");
+ insertloadlog($reservation_id, $computer_id, "failed", "requested image does not exist on management node and could not be retrieved");
return;
}
- } ## end else [ if ($self->provisioner->does_image_exist($image_name...
- } ## end if ($self->provisioner->can("does_image_exist"...
- else {
- notify($ERRORS{'OK'}, 0, "unable to check if image exists, does_image_exist() not implemented by " . ref($self->provisioner));
- }
+ } ## end if ($self->provisioner->can("retrieve_image"...
+ else {
+ notify($ERRORS{'CRITICAL'}, 0, "unable to retrieve image from another management node, retrieve_image() is not implemented by " . ref($self->provisioner));
+ insertloadlog($reservation_id, $computer_id, "failed", "failed requested image does not exist on management node, retrieve_image() is not implemented");
+ return;
+ }
+ } ## end else [ if ($self->provisioner->does_image_exist($image_name...
+ } ## end if ($self->provisioner->can("does_image_exist"...
+ else {
+ notify($ERRORS{'OK'}, 0, "unable to check if image exists, does_image_exist() not implemented by " . ref($self->provisioner));
+ }
- # Update the computer state to reloading
- if (update_computer_state($computer_id, "reloading")) {
- notify($ERRORS{'OK'}, 0, "computer $computer_short_name state set to reloading");
- insertloadlog($reservation_id, $computer_id, "info", "computer state updated to reloading");
- }
- else {
- notify($ERRORS{'CRITICAL'}, 0, "unable to set $computer_short_name into reloading state, returning");
- insertloadlog($reservation_id, $computer_id, "failed", "unable to set computer $computer_short_name state to reloading");
- return;
- }
- # Call provisioning module's load() subroutine
- notify($ERRORS{'OK'}, 0, "calling " . ref($self->provisioner) . "->load() subroutine");
- insertloadlog($reservation_id, $computer_id, "info", "calling " . ref($self->provisioner) . "->load() subroutine");
- if ($self->provisioner->load($node_status)) {
- notify($ERRORS{'OK'}, 0, "$image_name was successfully reloaded on $computer_short_name");
- insertloadlog($reservation_id, $computer_id, "loadimagecomplete", "$image_name was successfully reloaded on $computer_short_name");
- }
- else {
- notify($ERRORS{'CRITICAL'}, 0, "$image_name failed to load on $computer_short_name, returning");
- insertloadlog($reservation_id, $computer_id, "loadimagefailed", "$image_name failed to load on $computer_short_name");
- return;
- }
+ # Update the computer state to reloading
+ if (update_computer_state($computer_id, "reloading")) {
+ notify($ERRORS{'OK'}, 0, "computer $computer_short_name state set to reloading");
+ insertloadlog($reservation_id, $computer_id, "info", "computer state updated to reloading");
+ }
+ else {
+ notify($ERRORS{'CRITICAL'}, 0, "unable to set $computer_short_name into reloading state, returning");
+ insertloadlog($reservation_id, $computer_id, "failed", "unable to set computer $computer_short_name state to reloading");
+ return;
+ }
+
- # Update the current image ID in the computer table
- if (update_currentimage($computer_id, $image_id, $imagerevision_id, $image_id)) {
- notify($ERRORS{'OK'}, 0, "updated computer table for $computer_short_name: currentimageid=$image_id");
+ # Call provisioning module's load() subroutine
+ notify($ERRORS{'OK'}, 0, "calling " . ref($self->provisioner) . "->load() subroutine");
+ insertloadlog($reservation_id, $computer_id, "info", "calling " . ref($self->provisioner) . "->load() subroutine");
+ if ($self->provisioner->load($node_status)) {
+ notify($ERRORS{'OK'}, 0, "$image_name was successfully reloaded on $computer_short_name");
+ insertloadlog($reservation_id, $computer_id, "loadimagecomplete", "$image_name was successfully reloaded on $computer_short_name");
+ }
+ else {
+ notify($ERRORS{'CRITICAL'}, 0, "$image_name failed to load on $computer_short_name, returning");
+ insertloadlog($reservation_id, $computer_id, "loadimagefailed", "$image_name failed to load on $computer_short_name");
+ return;
+ }
+
+
+ # Update the current image ID in the computer table
+ if (update_currentimage($computer_id, $image_id, $imagerevision_id, $image_id)) {
+ notify($ERRORS{'OK'}, 0, "updated computer table for $computer_short_name: currentimageid=$image_id");
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "failed to update computer table for $computer_short_name: currentimageid=$image_id");
+ }
+
+
+ # Check if OS module's post_load() subroutine exists
+ if ($self->os->can("post_load")) {
+ notify($ERRORS{'OK'}, 0, ref($self->os) . "->post_load() subroutine exists");
+
+ # Call OS module's post_load() subroutine
+ notify($ERRORS{'OK'}, 0, "calling " . ref($self->os) . "->post_load() subroutine");
+ insertloadlog($reservation_id, $computer_id, "info", "calling " . ref($self->os) . "->post_load() subroutine");
+ if ($self->os->post_load()) {
+ notify($ERRORS{'OK'}, 0, "successfully performed OS post-load tasks for $image_name on $computer_short_name");
+ insertloadlog($reservation_id, $computer_id, "info", "performed OS post-load tasks for $image_name on $computer_short_name");
}
else {
- notify($ERRORS{'WARNING'}, 0, "failed to update computer table for $computer_short_name: currentimageid=$image_id");
+ notify($ERRORS{'CRITICAL'}, 0, "failed to perform OS post-load tasks for $image_name on $computer_short_name, returning");
+ insertloadlog($reservation_id, $computer_id, "loadimagefailed", "failed to perform OS post-load tasks for $image_name on $computer_short_name");
+ return;
}
-
- insertloadlog($reservation_id, $computer_id, "nodeready", "$computer_short_name was reloaded with $image_name");
- } ## end if ($node_status_string !~ /^ready/i)
-
+ }
else {
- # node_status returned 'ready'
- notify($ERRORS{'OK'}, 0, "node_status returned '$node_status_string', $computer_short_name will not be reloaded");
- insertloadlog($reservation_id, $computer_id, "info", "node status is $node_status_string, $computer_short_name will not be reloaded");
+ notify($ERRORS{'OK'}, 0, ref($self->os) . "->post_load() subroutine does not exist");
}
+ notify($ERRORS{'OK'}, 0, "node ready: successfully reloaded $computer_short_name with $image_name");
+ insertloadlog($reservation_id, $computer_id, "nodeready", "$computer_short_name was reloaded with $image_name");
+
notify($ERRORS{'OK'}, 0, "returning 1");
return 1;
} ## end sub reload_image
@@ -1017,8 +1046,33 @@
else {
notify($ERRORS{'CRITICAL'}, 0, "failed to update password entry reservation_id $reservation_id");
}
+
+ # Set the password in the DataStructure object
+ $self->data->set_reservation_password($reservation_password);
+
+ # Windows Vista reservation tasks
+ # Much of this subroutine will be rearranged once other OS's are modularized
+ if ($image_os_name =~ /winvista/) {
+ if ($request_forimaging) {
+ # Set the Administrator password
+ notify($ERRORS{'OK'}, 0, "attempting to set Administrator password to $reservation_password on $computer_short_name");
+ if (!$self->os->set_password('Administrator')) {
+ notify($ERRORS{'WARNING'}, 0, "reserve computer failed: unable to set password for administrator account on $computer_short_name");
+ return 0;
+ }
+ }
+ else {
+ # Add the users to the computer
+ # OS add_users() subroutine will add the primary reservation user and any imagemeta group users
+ notify($ERRORS{'OK'}, 0, "attempting to add users to $computer_short_name");
+ if (!$self->os->add_users()) {
+ notify($ERRORS{'WARNING'}, 0, "reserve computer failed: unable to add users to $computer_short_name");
+ return 0;
+ }
+ }
+ }
- if ($image_os_type =~ /windows/ && $request_forimaging) {
+ elsif ($image_os_type =~ /windows/ && $request_forimaging) {
if (changewindowspasswd($computer_short_name, "administrator", $reservation_password)) {
notify($ERRORS{'OK'}, 0, "password changed for administrator account on $computer_short_name to $reservation_password");
}
Modified: incubator/vcl/trunk/managementnode/lib/VCL/reclaim.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/reclaim.pm?rev=730217&r1=730216&r2=730217&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/reclaim.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/reclaim.pm Tue Dec 30 11:26:51 2008
@@ -107,6 +107,7 @@
my $image_os_name = $request_data->{reservation}{$reservation_id}{image}{OS}{name};
my $imagerevision_imagename = $request_data->{reservation}{$reservation_id}{imagerevision}{imagename};
my $user_unityid = $request_data->{user}{unityid};
+ my $computer_currentimage_name = $self->data->get_computer_currentimage_name();
# Assemble a consistent prefix for notify messages
my $notify_prefix = "req=$request_id, res=$reservation_id:";
@@ -161,17 +162,58 @@
# The request will either be changed to "reload" or they will be cleaned
# up based on the OS.
# Lab computers only need to have sshd disabled.
-
+
elsif ($computer_type =~ /blade|virtualmachine/) {
notify($ERRORS{'OK'}, 0, "$notify_prefix computer type is $computer_type");
- # Check if request laststate is reserved
+ # Check if request laststate is reserved
# This is the only case where computers will be cleaned and not reloaded
if ($request_laststate_name =~ /reserved/) {
notify($ERRORS{'OK'}, 0, "$notify_prefix request laststate is $request_laststate_name, attempting to clean up computer for next user");
+ # *** BEGIN MODULARIZED OS CODE ***
+ # Attempt to get the name of the image currently loaded on the computer
+ # This should match the computer table's current image
+ if ($self->os->can("get_current_image_name")) {
+ notify($ERRORS{'OK'}, 0, "calling " . ref($self->os) . "::get_current_image_name() subroutine");
+ my $current_image_name;
+ if ($current_image_name = $self->os->get_current_image_name()) {
+ notify($ERRORS{'OK'}, 0, "retrieved name of image currently loaded on $computer_shortname: $current_image_name");
+ }
+ else {
+ # OS module's get_current_image_name() subroutine returned false, reload is necessary
+ notify($ERRORS{'WARNING'}, 0, "failed to retrieve name of image currently loaded on $computer_shortname, computer will be reloaded");
+ $self->insert_reload_and_exit();
+ }
+
+ # Make sure the computer table's current image name matches what's on the computer
+ if ($current_image_name eq $computer_currentimage_name) {
+ notify($ERRORS{'OK'}, 0, "computer table current image name ($computer_currentimage_name) matches OS's current image name ($current_image_name)");
+ }
+ else {
+ # Computer table current image name does not match current image, reload is necessary
+ notify($ERRORS{'WARNING'}, 0, "computer table current image name (" . string_to_ascii($computer_currentimage_name) . ") does not match OS's current image name (" . string_to_ascii($current_image_name) . "), computer will be reloaded");
+ $self->insert_reload_and_exit();
+ }
+ }
+
+ # Attempt to call modularized OS module's sanitize() subroutine
+ # This subroutine should perform all the tasks necessary to sanitize the OS if it was reserved and not logged in to
+ if ($self->os->can("sanitize")) {
+ notify($ERRORS{'OK'}, 0, "calling " . ref($self->os) . "::sanitize() subroutine");
+ if ($self->os->sanitize()) {
+ notify($ERRORS{'OK'}, 0, "OS has been sanitized on $computer_shortname");
+ }
+ else {
+ # OS module's sanitize() subroutine returned false, meaning reload is necessary
+ notify($ERRORS{'WARNING'}, 0, "failed to sanitize OS on $computer_shortname, computer will be reloaded");
+ $self->insert_reload_and_exit();
+ }
+ }
+ # *** END MODULARIZED OS CODE ***
+
# Check the image OS type and clean up computer accordingly
- if ($image_os_name =~ /^(win|vmwarewin|vmwareesxwin)/) {
+ elsif ($image_os_name =~ /^(win|vmwarewin|vmwareesxwin)/) {
# Loaded Windows image needs to be cleaned up
notify($ERRORS{'OK'}, 0, "$notify_prefix attempting steps to clean up loaded $image_os_name image");
@@ -379,6 +421,62 @@
}
} ## end sub process
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 insert_reload_and_exit
+
+ Parameters : $request_data_hash_reference
+ Returns : 1 if successful, 0 otherwise
+ Description :
+
+=cut
+
+sub insert_reload_and_exit {
+ my $self = shift;
+ my $request_data = $self->data->get_request_data;
+ my $reservation_id = $self->data->get_reservation_id();
+ my $computer_id = $self->data->get_computer_id();
+
+ # Retrieve next image
+ my $next_image_name;
+ my $next_image_id;
+ my $next_imagerevision_id;
+
+ if($self->predictor->can("get_next_image")){
+ ($next_image_name, $next_image_id, $next_imagerevision_id) = $self->predictor->get_next_image();
+ }
+ else{
+ notify($ERRORS{'WARNING'}, 0, "predictor module does not support get_next_image, calling get_next_image_default");
+ ($next_image_name, $next_image_id, $next_imagerevision_id) = get_next_image_default($computer_id);
+ }
+
+ # Update the DataStructure object with the next image values
+ # These will be used by insert_reload_request()
+ $self->data->set_image_name($next_image_name);
+ $self->data->set_image_id($next_image_id);
+ $self->data->set_imagerevision_id($next_imagerevision_id);
+
+ notify($ERRORS{'OK'}, 0, "next image: name=$next_image_name, image id=$next_image_id, imagerevisionid=$next_imagerevision_id");
+
+ # Insert reload request data into the datbase
+ if (insert_reload_request($request_data)) {
+ notify($ERRORS{'OK'}, 0, "inserted reload request into database for computer id=$computer_id, image=$next_image_name");
+
+ # Switch the request state to complete, leave the computer state as is, log ending to EOR, exit
+ switch_state($request_data, 'complete', '', 'EOR', '1');
+ }
+ else {
+ notify($ERRORS{'CRITICAL'}, 0, "failed to insert reload request into database for computer id=$computer_id image=$next_image_name");
+
+ # Switch the request and computer states to failed, log ending to failed, exit
+ switch_state($request_data, 'failed', 'failed', 'failed', '1');
+ }
+
+ # Make sure this VCL state process exits
+ exit;
+}
+
#/////////////////////////////////////////////////////////////////////////////
1;
Modified: incubator/vcl/trunk/managementnode/lib/VCL/reserved.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/reserved.pm?rev=730217&r1=730216&r2=730217&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/reserved.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/reserved.pm Tue Dec 30 11:26:51 2008
@@ -192,17 +192,32 @@
# User has acknowledged
notify($ERRORS{'OK'}, 0, "user acknowledged, remote IP: $remote_ip");
+ # Attempt to call modularized OS module's grant_access() subroutine
+ if ($self->os->can("grant_access")) {
+ # If grant_access() has been implemented by OS module,
+ # don't check for remote IP and open RDP firewall port directly in this module
+ # OS module's grant_access() subroutine to perform the same tasks as below
+ notify($ERRORS{'OK'}, 0, "calling " . ref($self->os) . "::grant_access() subroutine");
+ if ($self->os->grant_access()) {
+ notify($ERRORS{'OK'}, 0, "OS access has been granted on $nodename");
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "failed to grant OS access on $nodename");
+ }
+ }
+
+ # Older style code, remove below once all OS's have been modularized
# Check if computer type is blade
- if ($computer_type =~ /blade|virtualmachine/) {
+ elsif ($computer_type =~ /blade|virtualmachine/) {
notify($ERRORS{'OK'}, 0, "blade or virtual machine detected: $computer_type");
# different senerios
# standard -- 1-1-1 with connection checks
# group access M-N-K -- multiple users need access
# standard with no connection checks
-
+
if ($image_os_name =~ /win|vmwarewin/) {
notify($ERRORS{'OK'}, 0, "Windows image detected: $image_os_name");
-
+
# Determine whether to open RDP port for single IP or group access
if ($user_group_member_count > 0) {
# Imagemeta user group defined and member count is > 0
Modified: incubator/vcl/trunk/managementnode/lib/VCL/utils.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=730217&r1=730216&r2=730217&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Tue Dec 30 11:26:51 2008
@@ -6109,7 +6109,7 @@
# Set the image identity file path
my $imagerevision_imagename = $request_info{reservation}{$reservation_id}{imagerevision}{imagename};
my $identity_file_path;
- if ($imagerevision_imagename =~ /^(win|vmwarewin|vmwareesxwin)/) {
+ if ($imagerevision_imagename =~ /^(win|vmwarewin|vmwareesxwin|vista)/) {
$identity_file_path = $IDENTITY_wxp;
}
elsif ($imagerevision_imagename =~ /^(rh|fc|esx)/) {
@@ -6128,7 +6128,7 @@
notify($ERRORS{'OK'}, 0, "MPLS reservation: $request_id:$reservation_id");
}
else {
- notify($ERRORS{'WARNING'}, 0, "unsupported image type: $imagerevision_imagename");
+ notify($ERRORS{'WARNING'}, 0, "unsupported image type: '$imagerevision_imagename'");
}
$request_info{reservation}{$reservation_id}{image}{IDENTITY} = $identity_file_path;