Author: arkurth
Date: Mon Jul 18 14:50:55 2011
New Revision: 1147906

URL: http://svn.apache.org/viewvc?rev=1147906&view=rev
Log:
VCL-428
Added optional $no_cache argument to get_image_info, get_imagerevision_info, 
get_imagemeta_info, get_user_info, get_computer_info.  Updated 
get_request_info() to use this argument when calling the subroutines to ensure 
current data is retrieved for the reservation.

VCL-483
Updated xmlrpc_call to pass the ssl_opts/verify_hostname=0 argument to the 
LWP::UserAgent constructor. Also changed code to call object methods rather 
than accessing hash elements directly.

Other
Added check to make sure $ENV{management_node_info} is initialized before 
attempting to access it in notify().

Updated counters in database_select subroutine to report calling subroutine. 
Updated output in State.pm::DESTROY.

Updated run_ssh_command. It was not correctly detecting common SSH errors. 
Split up the if/else statement that checks the exit status and output.

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

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm?rev=1147906&r1=1147905&r2=1147906&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm Mon Jul 18 
14:50:55 2011
@@ -853,20 +853,22 @@ sub DESTROY {
        }
        
        if (defined $ENV{database_select_count}) {
-               notify($ERRORS{'DEBUG'}, 0, "number of database select queries: 
$ENV{database_select_count}");
+               notify($ERRORS{'DEBUG'}, 0, "database select queries: 
$ENV{database_select_count}");
        }
        
-       if (defined $ENV{database_select_row_count}) {
-               notify($ERRORS{'DEBUG'}, 0, "number of database select rows 
returned: $ENV{database_select_row_count}");
-       }
-       if (defined $ENV{database_select_field_count}) {
-               notify($ERRORS{'DEBUG'}, 0, "number of database select fields 
returned: $ENV{database_select_field_count}");
+       if (defined $ENV{database_select_calls}) {
+               my $database_select_calls_string;
+               my %hash = %{$ENV{database_select_calls}};
+               my @sorted_keys = sort { $hash{$b} cmp $hash{$a} } keys(%hash);
+               for my $key (@sorted_keys) {
+                       $database_select_calls_string .= 
"($ENV{database_select_calls}{$key}) $key\n";
+               }
+               
+               notify($ERRORS{'DEBUG'}, 0, "database select called 
from:\n$database_select_calls_string");
        }
        
-       for my $key (sort keys %ENV) {
-               if ($key =~ /^db_/) {
-                       print "$key: $ENV{$key}\n";
-               }
+       if (defined $ENV{database_execute_count}) {
+               notify($ERRORS{'DEBUG'}, 0, "database execute queries: 
$ENV{database_execute_count}");
        }
 
        # Close the database handle

Modified: incubator/vcl/trunk/managementnode/lib/VCL/utils.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1147906&r1=1147905&r2=1147906&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Mon Jul 18 14:50:55 2011
@@ -285,6 +285,7 @@ INIT {
        
        # Set a default config file path
        my $hostname = hostname();
+       $hostname =~ s/\..*//g;
        my $cwd = getcwd();
        our $CONF_FILE_PATH = "$cwd/$hostname.conf";
        if (!-f $CONF_FILE_PATH) {
@@ -598,13 +599,13 @@ sub notify {
 
        # Confirm sysadmin address exists
        my $sysadmin = 0;
-       if(defined($ENV{management_node_info}{SYSADMIN_EMAIL}) && 
$ENV{management_node_info}{SYSADMIN_EMAIL}){
+       if(ref($ENV{management_node_info}) && 
defined($ENV{management_node_info}{SYSADMIN_EMAIL}) && 
$ENV{management_node_info}{SYSADMIN_EMAIL}){
                $sysadmin = $ENV{management_node_info}{SYSADMIN_EMAIL};
        }
        
        # Confirm shared mail box exists
        my $shared_mail_box = 0;
-       if(defined($ENV{management_node_info}{SHARED_EMAIL_BOX}) && 
$ENV{management_node_info}{SHARED_EMAIL_BOX}){
+       if(ref($ENV{management_node_info}) && 
defined($ENV{management_node_info}{SHARED_EMAIL_BOX}) && 
$ENV{management_node_info}{SHARED_EMAIL_BOX}){
                my $shared_mail_box = 
$ENV{management_node_info}{SHARED_EMAIL_BOX};
        }
 
@@ -1207,7 +1208,7 @@ sub mail {
        my $mailer = Mail::Mailer->new("sendmail", $localreturnpath);
        
        my $shared_mail_box = 0;
-       if(defined($ENV{management_node_info}{SHARED_EMAIL_BOX}) && 
$ENV{management_node_info}{SHARED_EMAIL_BOX}){
+       if(ref($ENV{management_node_info}) && 
defined($ENV{management_node_info}{SHARED_EMAIL_BOX}) && 
$ENV{management_node_info}{SHARED_EMAIL_BOX}){
                $shared_mail_box = $ENV{management_node_info}{SHARED_EMAIL_BOX};
        }
 
@@ -4034,7 +4035,21 @@ sub kill_reservation_process {
 sub database_select {
        my ($select_statement, $database) = @_;
        
+       my $calling_sub = (caller(1))[3];
+       
+       # Initialize the database_select_calls element if not already 
initialized
+       if (!ref($ENV{database_select_calls})) {
+               $ENV{database_select_calls} = {};
+       }
+       
+       # For performance tuning - count the number of calls
        $ENV{database_select_count}++;
+       if (!defined($ENV{database_select_calls}{$calling_sub})) {
+               $ENV{database_select_calls}{$calling_sub} = 1;
+       }
+       else {
+               $ENV{database_select_calls}{$calling_sub}++;
+       }
        
        my $dbh;
        if (!($dbh = getnewdbh($database))) {
@@ -4070,14 +4085,6 @@ sub database_select {
        $select_handle->finish;
        $dbh->disconnect if !defined $ENV{dbh};
        
-       if (@return_rows) {
-               my $row_count = scalar(@return_rows);
-               my $column_count = scalar(keys %{$return_rows[0]});
-               $ENV{database_select_row_count} += $row_count;
-               $ENV{database_select_column_count} += $column_count;
-               $ENV{database_select_field_count} += ($column_count * 
$row_count);
-       }
-       
        return @return_rows;
 } ## end sub database_select
 
@@ -4094,6 +4101,8 @@ sub database_select {
 sub database_execute {
        my ($sql_statement, $database) = @_;
        my ($package, $filename, $line, $sub) = caller(0);
+       
+       $ENV{database_execute_count}++;
 
        my $dbh;
        if (!($dbh = getnewdbh($database))) {
@@ -4494,15 +4503,15 @@ sub get_request_info {
                
                # Retrieve the image, imagerevision, and computer info and add 
to the hash
                my $image_id = 
$request_info{reservation}{$reservation_id}{imageid};
-               my $image_info = get_image_info($image_id);
+               my $image_info = get_image_info($image_id, 1);
                $request_info{reservation}{$reservation_id}{image} = 
$image_info;
                
                my $imagerevision_id = 
$request_info{reservation}{$reservation_id}{imagerevisionid};
-               my $imagerevision_info = 
get_imagerevision_info($imagerevision_id);
+               my $imagerevision_info = 
get_imagerevision_info($imagerevision_id, 1);
                $request_info{reservation}{$reservation_id}{imagerevision} = 
$imagerevision_info;
                
                my $computer_id = 
$request_info{reservation}{$reservation_id}{computerid};
-               my $computer_info = get_computer_info($computer_id);
+               my $computer_info = get_computer_info($computer_id, 1);
                $request_info{reservation}{$reservation_id}{computer} = 
$computer_info;
                
        }    # Close loop through selected rows
@@ -4894,7 +4903,7 @@ sub get_management_node_requests {
 
 =head2  get_image_info
 
- Parameters  : $image_identifier
+ Parameters  : $image_identifier, $no_cache (optional)
  Returns     : hash reference
  Description : Retrieves info for the image specified by the argument. The
                argument can either be the image ID or image name.
@@ -4903,13 +4912,13 @@ sub get_management_node_requests {
 
 
 sub get_image_info {
-       my ($image_identifier) = @_;
+       my ($image_identifier, $no_cache) = @_;
        if (!defined($image_identifier)) {
                notify($ERRORS{'WARNING'}, 0, "image identifier argument was 
not specified");
                return;
        }
        
-       return $ENV{image_info}{$image_identifier} if 
$ENV{image_info}{$image_identifier};
+       return $ENV{image_info}{$image_identifier} if (!$no_cache && 
$ENV{image_info}{$image_identifier});
        
        # Get a hash ref containing the database column names
        my $database_table_columns = get_database_table_columns();
@@ -5015,20 +5024,20 @@ EOF
 
 =head2 get_imagerevision_info
 
- Parameters  : $imagerevision_identifier
+ Parameters  : $imagerevision_identifier, $no_cache (optional)
  Returns     : Hash reference
  Description : collects data from database on supplied $imagerevision_id
 
 =cut
 
 sub get_imagerevision_info {
-       my ($imagerevision_identifier) = @_;
+       my ($imagerevision_identifier, $no_cache) = @_;
        if (!defined($imagerevision_identifier)) {
                notify($ERRORS{'WARNING'}, 0, "imagerevision identifier 
argument was not specified");
                return;
        }
        
-       return $ENV{imagerevision_info}{$imagerevision_identifier} if 
$ENV{imagerevision_info}{$imagerevision_identifier};
+       return $ENV{imagerevision_info}{$imagerevision_identifier} if 
(!$no_cache && $ENV{imagerevision_info}{$imagerevision_identifier});
 
        my $select_statement = <<EOF;
 SELECT
@@ -5130,7 +5139,7 @@ EOF
 
 =head2 get_imagemeta_info
 
- Parameters  : $imagemeta_id
+ Parameters  : $imagemeta_id, $no_cache (optional)
  Returns     : Hash reference
  Description :
 
@@ -5138,14 +5147,14 @@ EOF
 
 
 sub get_imagemeta_info {
-       my ($imagemeta_id) = @_;
+       my ($imagemeta_id, $no_cache) = @_;
 
        # Return defaults if nothing was passed as the imagemeta id
        if (!$imagemeta_id) {
                return get_default_imagemeta_info();
        }
        
-       return $ENV{imagemeta_info}{$imagemeta_id} if 
$ENV{imagemeta_info}{$imagemeta_id};
+       return $ENV{imagemeta_info}{$imagemeta_id} if (!$no_cache && 
$ENV{imagemeta_info}{$imagemeta_id});
 
        # If imagemetaid isnt' NULL, perform another query to get the meta info
        my $select_statement = <<EOF;
@@ -5584,8 +5593,11 @@ sub run_ssh_command {
                # Check the exit status
                # ssh exits with the exit status of the remote command or with 
255 if an error occurred.
                # Check for vmware-cmd usage message, it returns 255 if the 
vmware-cmd usage output is returned
-               if ($ssh_output_formatted =~ /^ssh:/ && (($exit_status == 255 
&& $ssh_command !~ /(vmware-cmd|vim-cmd|vmkfstools)/i) ||
-                        $ssh_output_formatted =~ /(lost connection|reset by 
peer|no route to host|connection refused|connection timed out|resource 
temporarily unavailable|connection reset)/i)) {
+               if ($ssh_output_formatted =~ /ssh:.*(lost connection|reset by 
peer|no route to host|connection refused|connection timed out|resource 
temporarily unavailable|connection reset)/i) {
+                       notify($ERRORS{'WARNING'}, 0, "attempt 
$attempts/$max_attempts: failed to execute SSH command on $node: '$command', 
exit status: $exit_status, output:\n$ssh_output_formatted");
+                       next;
+               }
+               elsif ($exit_status == 255 && $ssh_command !~ 
/(vmware-cmd|vim-cmd|vmkfstools)/i) {
                        notify($ERRORS{'WARNING'}, 0, "attempt 
$attempts/$max_attempts: failed to execute SSH command on $node: '$command', 
exit status: $exit_status, SSH exits with the exit status of the remote command 
or with 255 if an error occurred, output:\n$ssh_output_formatted") if 
$output_level;
                        next;
                }
@@ -7976,7 +7988,7 @@ sub get_computer_grp_members {
 
 =head2 get_user_info
 
- Parameters  : $user_identifier, $affiliation_identifier (optional)
+ Parameters  : $user_identifier, $affiliation_identifier (optional), $no_cache 
(optional)
  Returns     : hash reference
  Description : Retrieves user information from the database. The user 
identifier
                argument can either be a user ID or unityid. A hash reference is
@@ -7985,14 +7997,14 @@ sub get_computer_grp_members {
 =cut
 
 sub get_user_info {
-       my ($user_identifier, $affiliation_identifier) = @_;
+       my ($user_identifier, $affiliation_identifier, $no_cache) = @_;
        
        if (!defined($user_identifier)) {
                notify($ERRORS{'WARNING'}, 0, "user identifier argument was not 
specified");
                return;
        }
        
-       return $ENV{user_info}{$user_identifier} if 
$ENV{user_info}{$user_identifier};
+       return $ENV{user_info}{$user_identifier} if (!$no_cache && 
$ENV{user_info}{$user_identifier});
        
        # If affiliation identifier argument wasn't supplied, set it to % 
wildcard
        $affiliation_identifier = '%' if !$affiliation_identifier;
@@ -8247,20 +8259,20 @@ EOF
 
 =head2 get_computer_info
 
- Parameters  : $computer_identifier
+ Parameters  : $computer_identifier, $no_cache (optional)
  Returns     : hash reference
  Description :
 
 =cut
 
 sub get_computer_info {
-       my ($computer_identifier) = @_;
+       my ($computer_identifier, $no_cache) = @_;
        if (!defined($computer_identifier)){
                notify($ERRORS{'WARNING'}, 0, "computer identifier argument was 
not supplied");
                return;
        }
        
-       return $ENV{computer_info}{$computer_identifier} if 
$ENV{computer_info}{$computer_identifier};
+       return $ENV{computer_info}{$computer_identifier} if (!$no_cache && 
$ENV{computer_info}{$computer_identifier});
        
        # Get a hash ref containing the database column names
        my $database_table_columns = get_database_table_columns();
@@ -8316,7 +8328,7 @@ EOF
                $select_statement .= "computer.id = $computer_identifier";
        }
        else {
-               $select_statement .= "computer.hostname LIKE 
'$computer_identifier'";
+               $select_statement .= "computer.hostname REGEXP 
'$computer_identifier(\\\\.|\$)'";
        }
        
        # Call the database select subroutine
@@ -9307,10 +9319,21 @@ sub xmlrpc_call {
        }
        
        # Create a Client object
-       my $client = RPC::XML::Client->new($XMLRPC_URL);
-       $client->{'__request'}{'_headers'}->push_header('X-User' => 
$XMLRPC_USER);
-       $client->{'__request'}{'_headers'}->push_header('X-Pass' => 
$XMLRPC_PASS);
-       $client->{'__request'}{'_headers'}->push_header('X-APIVERSION' => 2);
+       my $client;
+       
+       if (LWP::UserAgent->new->can('ssl_opts')) {
+               notify($ERRORS{'DEBUG'}, 0, "RPC::XML version supports 
useragent options, setting verify_hostname to 0");
+               $client = RPC::XML::Client->new($XMLRPC_URL, useragent => 
['ssl_opts' => {verify_hostname => 0}]);
+       }
+       else {
+               notify($ERRORS{'DEBUG'}, 0, "RPC::XML version does not support 
useragent options");
+               $client = RPC::XML::Client->new($XMLRPC_URL);
+       }
+       
+       $client->request->header('X-User' => $XMLRPC_USER);
+       $client->request->header('X-Pass' => $XMLRPC_PASS);
+       $client->request->header('X-APIVERSION' => 2);
+       
        if (defined($client)) {
                notify($ERRORS{'DEBUG'}, 0, "created RPC::XML client object:\n" 
.
                                 "URL: $XMLRPC_URL\n" .
@@ -9359,9 +9382,6 @@ sub xmlrpc_call {
        # Display the response details
        notify($ERRORS{'OK'}, 0, "called RPC::XML::Client::send_request:\n" .
                "arguments: " . join(", ", @arguments) . "\n" .
-               "response class: " . ref($response) . "\n" .
-               "response type: " . $response->type  . "\n" .
-               "response value type: " . ref($response->value)  . "\n" .
                "response value:\n" . format_data($response->value)
        );
        


Reply via email to