Author: arkurth Date: Wed May 13 15:25:42 2009 New Revision: 774398 URL: http://svn.apache.org/viewvc?rev=774398&view=rev Log: VCL-20 Added ability to DataStructure.pm to retrieve management node's ssh port. Extended DataStructure.pm to allow the management node to be specified when using any of the get_management_node_xxx() functions.
VCL-82 Modified regex's in utils.pm::notify() to remove blank lines from the log output and to remove spaces from the beginning of lines. VCL-22 Modified utils.pm::get_management_node_info() to accept an IP address as the argument. It will return the info for the management node with the IP specified. Other Made minor change to utils.pm::run_ssh_command() output. It displays the full ssh command in the log if verbose mode is enabled. I also modified it to not display the return values if the 'no output' option was specified. Added an optional 'no output' argument to utils.pm::run_command(). This was done to control the output and to match run_ssh_command(). Changed a few 'OK' notify() messages to 'DEBUG' so they wouldn't appear in the log file if verbose mode is disabled. Modified: incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Modified: incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm?rev=774398&r1=774397&r2=774398&view=diff ============================================================================== --- incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm (original) +++ incubator/vcl/trunk/managementnode/lib/VCL/DataStructure.pm Wed May 13 15:25:42 2009 @@ -456,6 +456,7 @@ $SUBROUTINE_MAPPINGS{management_node_state_name} = '$ENV{management_node_info}{state}{name}'; $SUBROUTINE_MAPPINGS{management_node_os_name} = '$ENV{management_node_info}{OSNAME}'; $SUBROUTINE_MAPPINGS{management_node_predictive_module_id} = '$ENV{management_node_info}{predictivemoduleid}'; +$SUBROUTINE_MAPPINGS{management_node_ssh_port} = '$ENV{management_node_info}{sshport}'; $SUBROUTINE_MAPPINGS{management_node_predictive_module_name} = '$ENV{management_node_info}{predictive_name}'; $SUBROUTINE_MAPPINGS{management_node_predictive_module_pretty_name} = '$ENV{management_node_info}{predictive_prettyname}'; @@ -628,6 +629,8 @@ # eval is required in order to interpolate the hash path before retrieving the data my $key_defined = eval "defined $hash_path"; + my $return_value; + # If log or sublog data was requested and not yet populated, attempt to retrieve it if (!$key_defined && $data_identifier =~ /^(log_|sublog_)/) { notify($ERRORS{'DEBUG'}, 0, "attempting to retrieve log data, requested data has not been initialized ($data_identifier)"); @@ -644,12 +647,40 @@ return sub { }; } } + elsif ($data_identifier =~ /^(management_node)/ && $args[0]) { + # Data about a specific management node was requested by passing an argument: + # get_management_node_xxx(<management node identifier>) + #notify($ERRORS{'DEBUG'}, 0, "attempting to retrieve data for management node identifier: $args[0]"); + + # Get the management node info hash ref for the management node specified by the argument + my $management_node_info_retrieved = get_management_node_info($args[0]); + unless ($management_node_info_retrieved) { + notify($ERRORS{'WARNING'}, 0, "failed to retrieve data for management node: $args[0]"); + return sub { }; + } + + my $management_node_id = $management_node_info_retrieved->{id}; + my $management_node_hostname = $management_node_info_retrieved->{hostname}; + #notify($ERRORS{'DEBUG'}, 0, "retrieved data for management node: id=$management_node_id, hostname=$management_node_hostname"); + + # The normal reservation management node data is stored in $ENV{management_node_info} + # We don't want to overwrite this, but want to temporarily store the data retrieved for the different management node + # This allows the $hash_path mechanism to work without alterations + # Temporarily overwrite this data by using 'local', and set it to the data just retrieved + # Once the current scope is exited, $ENV{management_node_info} will return to its original value + local $ENV{management_node_info} = $management_node_info_retrieved; + + # Attempt to retrieve the value from the temporary data: $ENV{management_node_info}{KEY} + $return_value = eval $hash_path; + } elsif (!$key_defined) { notify($ERRORS{'WARNING'}, 0, "corresponding data has not been initialized for $method_name: $hash_path", $self->request_data); return sub { }; } - - my $return_value = eval $hash_path; + else { + # Just attempt to retrieve the value from the hash path + $return_value = eval $hash_path; + } if (!defined $return_value) { notify($ERRORS{'WARNING'}, 0, "corresponding data is undefined for $method_name: $hash_path", $self->request_data); Modified: incubator/vcl/trunk/managementnode/lib/VCL/utils.pm URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=774398&r1=774397&r2=774398&view=diff ============================================================================== --- incubator/vcl/trunk/managementnode/lib/VCL/utils.pm (original) +++ incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Wed May 13 15:25:42 2009 @@ -691,20 +691,21 @@ # Get the caller trace information my $caller_trace = get_caller_trace(6); - - + # Format the message string # Remove Windows carriage returns from the message string for consistency - $string =~ s/\r//g; - - # Remove newlines from the beginning and end of the message string - $string =~ s/^\n+//; - $string =~ s/\n+$//; - + $string =~ s/\r//gs; + + ## Remove newlines from the beginning and end of the message string + #$string =~ s/^\n+//; + #$string =~ s/\n+$//; + # Remove any spaces from the beginning or end of the string - $string =~ s/^\s+//; - $string =~ s/\s+$//; - + $string =~ s/(^\s+)|(\s+$)//gs; + + # Remove any spaces from the beginning or end of the each line + $string =~ s/\s*\n\s*/\n/gs; + # Replace consecutive spaces with a single space to keep log file concise as long as string doesn't contain a quote if ($string !~ /[\'\"]/gs) { $string =~ s/[ \t]+/ /gs; @@ -6735,7 +6736,7 @@ # Print the SSH command, only display the attempt # if > 1 if ($attempts == 1) { - notify($ERRORS{'DEBUG'}, 0, "executing SSH command on $node:\n$command"); + notify($ERRORS{'DEBUG'}, 0, "executing SSH command on $node:\n$ssh_command"); } else { notify($ERRORS{'DEBUG'}, 0, "attempt $attempts/$max_attempts: executing SSH command on $node:\n$ssh_command"); @@ -6825,10 +6826,10 @@ } # Display the full ssh command if the exit status is not 0 - if ($exit_status) { + if ($exit_status && !$no_output) { notify($ERRORS{'OK'}, 0, "SSH command executed on $node, command:\n$ssh_command\nreturning ($exit_status, \"$ssh_output_summary\")"); } - else { + elsif (!$no_output) { notify($ERRORS{'DEBUG'}, 0, "SSH command executed on $node, returning ($exit_status, \"$ssh_output_summary\")"); } @@ -7219,36 +7220,40 @@ } my $select_statement = " - SELECT - managementnode.*, - resource.id AS resource_id, - predictivemodule.name AS predictive_name, - predictivemodule.prettyname AS predictive_prettyname, - predictivemodule.description AS predictive_description, - predictivemodule.perlpackage AS predictive_perlpackage, - state.name AS statename - FROM - managementnode, - module predictivemodule, - resource, - resourcetype, - state - WHERE - managementnode.predictivemoduleid = predictivemodule.id - AND managementnode.stateid = state.id - AND resource.resourcetypeid = resourcetype.id - AND resource.subid = managementnode.id - AND resourcetype.name = 'managementnode' - AND - "; +SELECT +managementnode.*, +resource.id AS resource_id, +predictivemodule.name AS predictive_name, +predictivemodule.prettyname AS predictive_prettyname, +predictivemodule.description AS predictive_description, +predictivemodule.perlpackage AS predictive_perlpackage, +state.name AS statename +FROM +managementnode, +module predictivemodule, +resource, +resourcetype, +state +WHERE +managementnode.predictivemoduleid = predictivemodule.id +AND managementnode.stateid = state.id +AND resource.resourcetypeid = resourcetype.id +AND resource.subid = managementnode.id +AND resourcetype.name = 'managementnode' +AND "; # Figure out if the ID or hostname was passed as the identifier and complete the SQL statement - # Check if it only contains digits chomp $management_node_identifier; if ($management_node_identifier =~ /^\d+$/) { + # Identifier only contains digits, assume it's the id $select_statement .= "managementnode.id = $management_node_identifier"; } + elsif ($management_node_identifier =~ /^[\d\.]+$/) { + # Identifier contains digits and periods, assume it's the IP address + $select_statement .= "managementnode.IPAddress like \'$management_node_identifier%\'"; + } else { + # Assume hostname was specified $select_statement .= "managementnode.hostname like \'$management_node_identifier%\'"; } @@ -7258,11 +7263,12 @@ # Check to make sure 1 row was returned if (scalar @selected_rows == 0) { - notify($ERRORS{'WARNING'}, 0, "zero rows were returned from database select statement:\n$select_statement"); + notify($ERRORS{'WARNING'}, 0, "zero rows were returned from database select, management node identifier may be invalid: '$management_node_identifier'\n$select_statement"); return (); } elsif (scalar @selected_rows > 1) { - notify($ERRORS{'WARNING'}, 0, "" . scalar @selected_rows . " rows were returned from database select"); + my @id_hostnames = map ("management node: id=$_->{id}, hostname=$_->{hostname}, IP=$_->{IPaddress}", @selected_rows); + notify($ERRORS{'WARNING'}, 0, "" . scalar @selected_rows . " rows were returned from database select, management node identifier may be ambiguous: '$management_node_identifier'\n" . join("\n", @id_hostnames)); return (); } @@ -7284,19 +7290,19 @@ my $management_node_id = $management_node_info->{id}; if ($imagelib_enable && defined($imagelib_group_id) && $imagelib_group_id) { my $imagelib_statement = " - SELECT DISTINCT - managementnode.IPAddress - FROM - managementnode, - resource, - resourcegroup, - resourcegroupmembers - WHERE - resourcegroup.id = $imagelib_group_id - AND resourcegroupmembers.resourcegroupid = resourcegroup.id - AND resource.id = resourcegroupmembers.resourceid - AND resource.subid = managementnode.id - AND managementnode.id != $management_node_id +SELECT DISTINCT +managementnode.IPaddress +FROM +managementnode, +resource, +resourcegroup, +resourcegroupmembers +WHERE +resourcegroup.id = $imagelib_group_id +AND resourcegroupmembers.resourcegroupid = resourcegroup.id +AND resource.id = resourcegroupmembers.resourceid +AND resource.subid = managementnode.id +AND managementnode.id != $management_node_id "; # Call the database select subroutine @@ -7312,7 +7318,7 @@ # Loop through the rows, assemble a string separated by commas my $imagelib_ipaddress_string; for my $imagelib_row (@imagelib_rows) { - $imagelib_ipaddress_string .= "$imagelib_row->{IPAddress},"; + $imagelib_ipaddress_string .= "$imagelib_row->{IPaddress},"; } # Remove the trailing comma $imagelib_ipaddress_string =~ s/,$//; @@ -8410,7 +8416,7 @@ # Get a new data structure object eval { $data_structure = new VCL::DataStructure({request_data => $input_data, reservation_id => $input_data->{RESERVATIONID}}); - notify($ERRORS{'OK'}, 0, "created DataStructure object from passed hash"); + notify($ERRORS{'DEBUG'}, 0, "created DataStructure object from passed hash"); }; if (my $e = Exception::Class::Base->caught()) { notify($ERRORS{'WARNING'}, 0, "hash was passed but could not be turned into a DataStructure, " . $e->message); @@ -8454,7 +8460,7 @@ $new_process_name .= " imaging" if $request_forimaging; # Append cluster if there are multiple reservations for this request - notify($ERRORS{'OK'}, 0, "reservation count: $reservation_count"); + notify($ERRORS{'DEBUG'}, 0, "reservation count: $reservation_count"); if ($reservation_count > 1) { if ($reservation_is_parent) { @@ -8473,8 +8479,8 @@ $data_structure->get_request_data->{SUBIMAGE} = 0; } - notify($ERRORS{'OK'}, 0, "PARENTIMAGE: " . $data_structure->get_request_data->{PARENTIMAGE}); - notify($ERRORS{'OK'}, 0, "SUBIMAGE: " . $data_structure->get_request_data->{SUBIMAGE}); + notify($ERRORS{'DEBUG'}, 0, "PARENTIMAGE: " . $data_structure->get_request_data->{PARENTIMAGE}); + notify($ERRORS{'DEBUG'}, 0, "SUBIMAGE: " . $data_structure->get_request_data->{SUBIMAGE}); } ## end if ($state_name ne 'blockrequest') else { my $blockrequest_id = $data_structure->get_blockrequest_id(); @@ -10410,7 +10416,7 @@ =cut sub run_command { - my $command = shift; + my ($command, $no_output) = @_; my $pid; my @output = (); @@ -10438,7 +10444,10 @@ return; } - notify($ERRORS{'DEBUG'}, 0, "executed command: $command, pid: $pid, exit status: $exit_status, output:\...@output"); + if (!$no_output) { + notify($ERRORS{'DEBUG'}, 0, "executed command: $command, pid: $pid, exit status: $exit_status, output:\...@output"); + } + return ($exit_status, \...@output); }