Author: fapeeler
Date: Fri Oct 25 19:14:39 2013
New Revision: 1535827

URL: http://svn.apache.org/r1535827
Log:
VCL-409

Added checks for:
node available
ssh access to node
existing reservations for node, prompt for action, resume or start over
add new image to the user's newimages group via new xmlrpc routine



Modified:
    vcl/trunk/managementnode/lib/VCL/Module.pm
    vcl/trunk/managementnode/lib/VCL/image.pm
    vcl/trunk/managementnode/lib/VCL/utils.pm

Modified: vcl/trunk/managementnode/lib/VCL/Module.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module.pm?rev=1535827&r1=1535826&r2=1535827&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module.pm Fri Oct 25 19:14:39 2013
@@ -1404,7 +1404,11 @@ sub setup_test_rpc_xml {
                notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
                return;
        }
-       
+       my $verbose = shift;
+       if (!defined($verbose)) {
+               $verbose = 1;
+       }
+
        my $error_count = 0;
        my $user_id;
        
@@ -1499,7 +1503,7 @@ sub setup_test_rpc_xml {
        
        if ($error_count) {
                print "FAILURE: RPC-XML access is not configured correctly, 
errors encountered: $error_count\n";
-               return;
+               return 0;
        }
        
        my $xmlrpc_function = 'system.listMethods';
@@ -1509,14 +1513,14 @@ sub setup_test_rpc_xml {
        
        my $response = xmlrpc_call(@xmlrpc_arguments);
        if ($response && $response->value) {
-               print "SUCCESS: RPC-XML access is configured correctly\n" . 
format_data($response->value) . "\n";
-               return;
+               print "SUCCESS: RPC-XML access is configured correctly\n" . 
format_data($response->value) . "\n" if($verbose == 1);
+               return 1;
        }
        
        
        if (!$ENV{rpc_xml_error}) {
                print "FAILURE: RPC-XML access is not configured correctly, 
view the log file for more information: $LOGFILE\n";
-               return;
+               return 0;
        }
        
        print "FAILURE: RPC-XML access is not configured correctly, error 
message:\n$ENV{rpc_xml_error}\n\n";
@@ -1540,7 +1544,7 @@ sub setup_test_rpc_xml {
                print "SUGGESTION: make sure user ID $user_id has been added to 
the \$xmlrpcBlockAPIUsers line in the conf.php file on the web server\n";
        }
        
-       return;
+       return 0;
 }
 
 #/////////////////////////////////////////////////////////////////////////////

Modified: vcl/trunk/managementnode/lib/VCL/image.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/image.pm?rev=1535827&r1=1535826&r2=1535827&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/image.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/image.pm Fri Oct 25 19:14:39 2013
@@ -522,6 +522,14 @@ sub setup_capture_base_image {
                print "ERROR: failed to determine the management node ID\n";
                return;
        }
+
+       my ($request_id, $reservation_id) = 0;
+       my $image_is_virtual = 0;
+
+       print "\nTesting api call\n";
+       if($self->setup_test_rpc_xml(0)) {
+               print "VCL API call successful\n\n";
+       }
        
        # Get the user who the reservation and image will belong to
        my $user_id;
@@ -573,12 +581,12 @@ sub setup_capture_base_image {
                        $computer_id = (keys %computer_info)[0];
                }
                
-               
        }
        
        my $computer_hostname = $computer_info{$computer_id}{hostname};
        my $computer_state_name = $computer_info{$computer_id}{state}{name};
        my $computer_provisioning_module_name = 
$computer_info{$computer_id}{provisioning}{module}{name};
+       my $computer_node_name = $computer_info{$computer_id}{SHORTNAME};
        
        my $install_type;
        if ($computer_provisioning_module_name =~ /xcat/i) {
@@ -589,17 +597,177 @@ sub setup_capture_base_image {
        }
        
        print "\nComputer to be captured: $computer_hostname (ID: 
$computer_id)\n";
+       print "Computer shortname: $computer_node_name\n";
+       print "Computer State: $computer_state_name\n";
        print "Provisioning module: $computer_provisioning_module_name\n";
        print "Install type: $install_type\n";
-       print "\n";
        
+       my $vmhost_name;
+       if ($install_type eq "vmware") {
+               $image_is_virtual = 1;
+               #should have a vmhost assigned
+               if($computer_info{$computer_id}{vmhostid}){
+                       $vmhost_name = 
$computer_info{$computer_id}{vmhost}{computer}{SHORTNAME};
+                       print "VM host name: $vmhost_name\n";
+                       print "VM host profile: 
$computer_info{$computer_id}{vmhost}{vmprofile}{profilename}\n";
+                       print "\n";
+
+               }
+               else {
+                       print "ERROR: Install type is vmware, 
$computer_node_name is NOT assigned to a vmhost\n";
+                       print "ERROR: Assign $computer_node_name to a vmhost 
before proceeding.\n";
+                       print "\n";
+                       return;
+               }
+       }
+       
+       print "Testing ssh access to $computer_hostname\n";
+
+       # Node Checks
+       # is the node up and accessible through ssh pki
+       # If it is a vm, is it assigned to a vmhost
+       # Try nmap to see if any of the ssh ports are open before attempting to 
run a test command
+   my $port_22_status = nmap_port($computer_node_name, 22) ? "open" : "closed";
+   my $port_24_status = nmap_port($computer_node_name, 24) ? "open" : "closed";
+   if ($port_22_status ne 'open' && $port_24_status ne 'open') {
+               print "Error: ssh port on $computer_node_name is NOT responding 
to SSH, ports 22 or 24 are both closed\n";
+      return;
+   }
+
+       my ($exit_status, $output) = run_ssh_command({
+       node => $computer_node_name,
+       command => "echo \"testing ssh on $computer_node_name\"",
+       max_attempts => 2,
+       output_level => 0,
+       timeout_seconds => 30,
+   });
+
+   # The exit status will be 0 if the command succeeded
+   if (defined($output) && grep(/testing/, @$output)) {
+          print "$computer_node_name is responding to SSH, port 22: 
$port_22_status, port 24: $port_24_status\n";
+               print "\n";
+   } 
+       else {
+          print "ERROR: $computer_node_name is NOT responding to SSH, SSH 
command failed, port 22: $port_22_status, port 24: $port_24_status\n";
+               print "Make sure you can login using ssh PKI on 
$computer_node_name before continuing\n"; 
+               print "\n";
+               return;
+       }
+
+       # Check if computer id is in an existing or failed imaging reservation
+       my $computer_requests = get_request_by_computerid($computer_id);
+       my %existing_requests_array_choices;
+       if (keys(%$computer_requests)) {
+               $existing_requests_array_choices{0}{"prettyname"} = "None : 
delete all previous reservations for $computer_node_name";
+               for my $competing_request_id (sort keys %$computer_requests) {
+                   my $competing_reservation_id    = 
$computer_requests->{$competing_request_id}{data}->get_reservation_id();
+                   my $competing_imagerevision_id  = 
$computer_requests->{$competing_request_id}{data}->get_imagerevision_id();
+                   my $competing_image_id                      = 
$computer_requests->{$competing_request_id}{data}->get_image_id();
+                   my $competing_prettyimage_name  = 
$computer_requests->{$competing_request_id}{data}->get_image_prettyname();
+                   my $competing_image_name               = 
$computer_requests->{$competing_request_id}{data}->get_image_name();
+                        my $competing_request_state            = 
$computer_requests->{$competing_request_id}{data}->get_request_state_name();
+
+                       
$existing_requests_array_choices{$competing_request_id}{"prettyname"} = 
$competing_prettyimage_name;
+                       
$existing_requests_array_choices{$competing_request_id}{"name"} = 
$competing_image_name;
+                       
$existing_requests_array_choices{$competing_request_id}{"image_id"} = 
$competing_image_id;
+                       
$existing_requests_array_choices{$competing_request_id}{"image_revision_id"} = 
$competing_imagerevision_id;
+                       
$existing_requests_array_choices{$competing_request_id}{"current_state"} = 
$competing_request_state;
+                       
$existing_requests_array_choices{$competing_request_id}{"reservation_id"} = 
$competing_reservation_id;
+               }
+
+               my $num_computer_requests = keys(%$computer_requests);
+               print "WARNING: Image capture reservation exists for 
$computer_node_name.\n\n"; 
+               print "Make Selection, Choose none to start over or choose the 
image to restart image capture for that request:\n"; 
+
+               my $chosen_request_id = 
setup_get_hash_choice(\%existing_requests_array_choices, 'prettyname');
+               return if (!defined($chosen_request_id));
+               my $chosen_prettyname = 
$existing_requests_array_choices{$chosen_request_id}{prettyname};
+               print "\nSelected reservation: $chosen_request_id 
$chosen_prettyname\n\n";
+
+               # if 0 selected, delete all reservations related to 
$computer_node_name
+               # Set $computer_node_name to available, proceed with questions
+               my $epoch_time = convert_to_epoch_seconds;
+               if ($chosen_request_id == 0 ){
+                       delete $existing_requests_array_choices{0};
+
+                       foreach my $request_id_del (sort keys 
%existing_requests_array_choices) {
+                               my $del_reservation_id = 
$existing_requests_array_choices{$request_id_del}{reservation_id};
+                               my $del_image_id = 
$existing_requests_array_choices{$request_id_del}{image_id};
+                               my $del_imagerevision_id = 
$existing_requests_array_choices{$request_id_del}{image_revision_id};
+                               my $del_image_name = 
$existing_requests_array_choices{$request_id_del}{name};
+                               print "del_image_name= $del_image_name\n";
+                               my $new_image_name = $del_image_name . 
$epoch_time;
+                               my $new_prettyimage_name = 
$existing_requests_array_choices{$request_id_del}{prettyname} . $epoch_time;
+                               
+                               
if(reservation_being_processed($del_reservation_id)) {
+                                       print "WARNING: The selected 
reservation is currently being processed. You must wait until it has 
completed.\n";
+                                       print "Reservation id: 
$del_reservation_id\n";
+                                       print "\n";
+                                       next;
+                               }
+                               
+                               if(delete_request($request_id_del)) {
+                                       print "Removed reservation id 
$request_id_del for $del_image_name\n";
+                                       if(update_image_name($del_image_id, 
$del_imagerevision_id, $new_image_name, $new_prettyimage_name)) {
+                                       }
+                                       if (update_computer_state($computer_id, 
"available")){
+                                               print "Set $computer_node_name 
to available state\n";
+                                       }
+                               }
+                       }
+               }
+               # Elseif a request id is choosen. set $computer_node_name to 
available, test ssh access, restart image capture
+               if ($chosen_request_id){
+                       $request_id = $chosen_request_id;
+                       $reservation_id = 
$existing_requests_array_choices{$chosen_request_id}{reservation_id};
+                       if(reservation_being_processed($chosen_request_id)) {
+                               print "WARNING: The selected reservation is 
currently being processed. You must wait until it has completed.\n";
+                               print "Reservation id: $chosen_request_id\n";
+                               print "\n";
+                               my @yes_no_choices = (
+                                       'Yes',
+                                       'No',
+                               );
+       
+                               print "Monitor vcld.log for completion?:\n";
+                               my $monitor_choice_index = 
setup_get_array_choice(@yes_no_choices);
+                               last if (!defined($monitor_choice_index));
+                               my $monitor_choice = 
$yes_no_choices[$monitor_choice_index];
+                               if ($monitor_choice =~ /yes/i) {
+                                       print ".\n";    
+                                       goto MONITOR_LOG_OUTPUT;
+                               }
+                               else {
+                                       return;
+                               }
+                       }
+                       if (update_computer_state($computer_id, "available")){
+                                print "Set $computer_node_name to available 
state\n";
+               }
+                       $chosen_prettyname = 
$existing_requests_array_choices{$chosen_request_id}{prettyname};
+                       print "Restarting image capture for: \nRequest id= 
$chosen_request_id \nImage Name: $chosen_prettyname \nNode Name: 
$computer_node_name\n";
+
+
+                       if (update_request_state($chosen_request_id, "image", 
"image", 1)) {
+                               print "Set request_id= $chosen_request_id to 
image state\n\n";
+                               print "Starting monitor process:\n\n";
+                               
+                               goto MONITOR_LOG_OUTPUT;
+                       }
+                       else {
+                               print "ERROR: failed to update request state 
for $chosen_request_id, state_name= image, last_state: image\n";
+                       }
+               }
+       }
+
        # Make sure the computer state is valid
        if ($computer_state_name =~ /(maintenance|deleted)/i) {
-               print "ERROR: state of $computer_hostname is 
$computer_state_name\n";
+               print "ERROR: state of $computer_node_name is 
$computer_state_name\n";
+               print "\n";
                return;
        }
-       
-       
+
+
        # Get the OS table contents from the database
        my $os_info = get_os_info();
        if (!$os_info) {
@@ -676,7 +844,7 @@ EOF
        
        my $imagemeta_id = database_execute($insert_imagemeta_statement);
        if (!defined($imagemeta_id)) {
-               print "ERROR: failed to insert into imagemeta table\n";
+               print "ERROR: failed to insert into imagemeta table.\n";
                return;
        }
        
@@ -688,7 +856,7 @@ EOF
        
        my $image_id = database_execute($insert_image_statement);
        if (!defined($image_id)) {
-               print "ERROR: failed to insert into image table\n";
+               print "ERROR: failed to insert into image table. Please choose 
another name.\n";
                return;
        }
        
@@ -732,6 +900,13 @@ EOF
                print "ERROR: failed to insert into resource table\n";
                return;
        }
+
+       # Add image resource_id to users' new image group
+       if(!add_imageid_to_newimages($user_id, $resource_id, 
$image_is_virtual)) {
+               print "\nWARNING: Failed to add image to user's new images 
group\n";
+               print "You might need to add manually to the new images or all 
images image groups\n";
+               print "Continuing to with image capture\n\n";
+       }
        
        print "\nAdded new image to database: '$image_prettyname'\n";
        print "   image.name: $image_name\n";
@@ -741,7 +916,7 @@ EOF
        print "   resource.id: $resource_id\n\n";
        
        
-       my ($request_id, $reservation_id) = insert_request($management_node_id, 
'image', 'image', 0, $username, $computer_id, $image_id, $imagerevision_id, 0, 
60);
+       ($request_id, $reservation_id) = insert_request($management_node_id, 
'image', 'image', 0, $username, $computer_id, $image_id, $imagerevision_id, 0, 
60);
        if (!defined($request_id) || !defined($reservation_id)) {
                print "ERROR: failed to insert new imaging request\n";
                return;
@@ -763,12 +938,14 @@ EOF
        print '-' x 76 . "\n";
        print "$message";
        print '-' x 76 . "\n";
+
+MONITOR_LOG_OUTPUT:
        
        # Pipe the command output to a file handle
        # The open function returns the pid of the process
        if (open(COMMAND, "tail -f $LOGFILE 2>&1 |")) {
                # Capture the output of the command
-               
+
                while (my $output = <COMMAND>) {
                        print $output if ($output =~ /$reservation_id/);
                }

Modified: vcl/trunk/managementnode/lib/VCL/utils.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1535827&r1=1535826&r2=1535827&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/utils.pm Fri Oct 25 19:14:39 2013
@@ -222,6 +222,7 @@ our @EXPORT = qw(
   write_currentimage_txt
   xmlrpc_call
   xml_string_to_hash
+  add_imageid_to_newimages
 
   $CONF_FILE_PATH
   $DAEMON_MODE
@@ -5393,7 +5394,7 @@ sub update_log_loaded_time {
 =cut
 
 sub update_image_name {
-       my ($image_id, $imagerevision_id, $new_image_name) = @_;
+       my ($image_id, $imagerevision_id, $new_image_name, 
$new_image_pretty_name) = @_;
 
        # Check the passed parameter
        unless (defined($image_id) && defined($imagerevision_id) && 
defined($new_image_name)) {
@@ -5408,6 +5409,15 @@ image,
 imagerevision
 SET
 image.name = \'$new_image_name\',
+EOF
+
+       if(defined($new_image_pretty_name) ) {
+               $update_statement .= <<EOF;
+image.prettyname = \'$new_image_pretty_name\',
+EOF
+       }
+
+$update_statement .= <<EOF;    
 imagerevision.imagename = \'$new_image_name\'
 WHERE
 image.id = $image_id AND
@@ -7819,6 +7829,56 @@ sub string_to_ascii {
        }
 }
 
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 add_imageid_to_newimages
+
+ Parameters  : $ownerid, $resourceid, $virtual
+ Returns     : 1, 0 
+ Description : Calls the RPC::XML function defined in the arguments
+
+=cut
+sub add_imageid_to_newimages {
+       my ($ownerid, $resourceid, $virtual) = @_;
+
+   my ($package, $filename, $line, $sub) = caller(0);
+
+   # Check the arguments
+   if (!defined($ownerid)) {
+       notify($ERRORS{'WARNING'}, 0, "ownerid was not specified");
+       return 0;
+   }
+   if (!defined($resourceid)) {
+       notify($ERRORS{'WARNING'}, 0, "resourceid was not specified");
+       return 0;
+   }
+   if (!defined($virtual)) {
+       notify($ERRORS{'WARNING'}, 0, "virtual was not specified");
+       return 0;
+   }
+
+       my $method = "XMLRPCfinishBaseImageCapture";
+       my @argument_string = ($method,$ownerid, $resourceid, $virtual); 
+       my $xml_ret = xmlrpc_call(@argument_string);
+       # Check if the XML::RPC call failed
+   if (!defined($xml_ret)) {
+      notify($ERRORS{'WARNING'}, 0, "failed to add image to owner's new image 
group, XML::RPC '$method' call failed");
+      return 0;
+   }
+   elsif ($xml_ret->value->{status} !~ /success/) {
+      notify($ERRORS{'WARNING'}, 0, "failed to add image to owner's newimage 
group, XML::RPC '$method' status: $xml_ret->value->{status}\n" .
+            "error code $xml_ret->value->{errorcode}\n" .
+            "error message: $xml_ret->value->{errormsg}"
+       );
+       return 0;
+       }
+   else {
+        return 1;
+       }
+
+}
+
 #/////////////////////////////////////////////////////////////////////////////
 
 =head2 xmlrpc_call
@@ -7828,6 +7888,7 @@ sub string_to_ascii {
  Description : Calls the RPC::XML function defined in the arguments
 
 =cut
+
 sub xmlrpc_call {
        my @arguments = @_;
        if (!@arguments) {


Reply via email to