Author: arkurth
Date: Tue Dec 13 20:46:23 2011
New Revision: 1213919

URL: http://svn.apache.org/viewvc?rev=1213919&view=rev
Log:
VCL-545
Added code to create a VM host OS object to State.pm::initialize if 
computer.vmhostid is set. This allows provisioning modules to access the VM 
host OS via $self->vmhost_os.

VCL-546
Updated OS.pm::_get_public_interface_name_helper. Reordered logic so that the 
private interface isn't returned if another interface is found which isn't 
assigned a public address.

Other
Updated OS.pm::create_text_file to attempt to create the parent directory 
first. It was failing if the directory didn't exist beforehand.

Commented out some unnecessary debugging statements in State.pm::DESTROY.

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

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module.pm?rev=1213919&r1=1213918&r2=1213919&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module.pm Tue Dec 13 20:46:23 
2011
@@ -390,6 +390,89 @@ sub create_mn_os_object {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 create_vmhost_os_object
+
+ Parameters  : None
+ Returns     : boolean
+ Description : Creates an OS object for the VM host.
+
+=cut
+
+sub create_vmhost_os_object {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       # Check if an OS object has already been stored in the calling object
+       if ($ENV{vmhost_os}) {
+               return 1;
+       }
+       
+       # Make sure calling object isn't an OS module to avoid an infinite loop
+       if ($self->isa('VCL::Module::OS')) {
+               notify($ERRORS{'WARNING'}, 0, "this subroutine cannot be called 
from an existing OS module: " . ref($self));
+               return;
+       }
+       
+       my $request_data = $self->data->get_request_data();
+       my $reservation_id = $self->data->get_reservation_id();
+       my $vmhost_computer_id = $self->data->get_vmhost_computer_id();
+       my $vmhost_profile_image_id = 
$self->data->get_vmhost_profile_image_id();
+       
+       # Create a DataStructure object containing computer data for the VM host
+       my $vmhost_data;
+       eval {
+               $vmhost_data = new VCL::DataStructure({
+                                                                               
                                        request_data => $request_data,
+                                                                               
                                        reservation_id => $reservation_id,
+                                                                               
                                        computer_id => $vmhost_computer_id,
+                                                                               
                                        image_id => $vmhost_profile_image_id
+                                                                               
                                        }
+                                                                               
                                  );
+       };
+       
+       if ($EVAL_ERROR) {
+               notify($ERRORS{'WARNING'}, 0, "unable to create DataStructure 
object for VM host, error: $EVAL_ERROR");
+               return;
+       }
+       elsif (!$vmhost_data) {
+               notify($ERRORS{'WARNING'}, 0, "unable to create DataStructure 
object for VM host, DataStructure object is not defined");
+               return;
+       }
+       
+       # Get the VM host OS module Perl package name
+       my $vmhost_os_perl_package = 
$vmhost_data->get_image_os_module_perl_package();
+       if (!$vmhost_os_perl_package) {
+               notify($ERRORS{'WARNING'}, 0, "unable to create DataStructure 
or OS object for VM host, failed to retrieve VM host image OS module Perl 
package name");
+               return;
+       }
+       
+       # Load the VM host OS module
+       notify($ERRORS{'DEBUG'}, 0, "attempting to load VM host OS module: 
$vmhost_os_perl_package");
+       eval "use $vmhost_os_perl_package";
+       if ($EVAL_ERROR) {
+               notify($ERRORS{'WARNING'}, 0, "VM host OS module could NOT be 
loaded: $vmhost_os_perl_package, error: $EVAL_ERROR");
+               return;
+       }
+       notify($ERRORS{'DEBUG'}, 0, "VM host OS module loaded: 
$vmhost_os_perl_package");
+       
+       # Attempt to create the object
+       if (my $vmhost_os = ($vmhost_os_perl_package)->new({data_structure => 
$vmhost_data})) {
+               my $address = sprintf('%x', $vmhost_os);
+               notify($ERRORS{'OK'}, 0, "$vmhost_os_perl_package OS object 
created, address: $address");
+               $self->set_vmhost_os($vmhost_os);
+               return 1;
+       }
+       else {
+               notify($ERRORS{'WARNING'}, 0, "failed to create VM host OS 
object");
+               return;
+       }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 create_provisioning_object
 
  Parameters  : None
@@ -435,7 +518,7 @@ sub create_provisioning_object {
        notify($ERRORS{'DEBUG'}, 0, "$provisioning_perl_package module loaded");
 
        # Create provisioner object
-       if (my $provisioner = ($provisioning_perl_package)->new({data_structure 
=> $self->data})) {
+       if (my $provisioner = ($provisioning_perl_package)->new({data_structure 
=> $self->data, os => $self->{os}})) {
                my $provisioner_address = sprintf('%x', $provisioner);
                my $provisioner_computer_name = 
$provisioner->data->get_computer_short_name();
                notify($ERRORS{'OK'}, 0, "$provisioning_perl_package 
provisioner object created for $provisioner_computer_name, address: 
$provisioner_address");
@@ -494,6 +577,28 @@ sub mn_os {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 vmhost_os
+
+ Parameters  : None
+ Returns     : VM hosts's OS object
+ Description : Allows modules to access the VM host's OS object.
+
+=cut
+
+sub vmhost_os {
+       my $self = shift;
+       
+       if (!$ENV{vmhost_os}) {
+               notify($ERRORS{'WARNING'}, 0, "unable to return VM host OS 
object, \$self->{vmhost_os} is not set");
+               return;
+       }
+       else {
+               return $ENV{vmhost_os};
+       }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 provisioner
 
  Parameters  : None
@@ -549,6 +654,22 @@ sub set_mn_os {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 set_vmhost_os
+
+ Parameters  : None
+ Returns     : 
+ Description : Sets the VM host OS object for the module to access.
+
+=cut
+
+sub set_vmhost_os {
+       my $self = shift;
+       my $vmhost_os = shift;
+       $ENV{vmhost_os} = $vmhost_os;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 set_provisioner
 
  Parameters  : None

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm?rev=1213919&r1=1213918&r2=1213919&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm Tue Dec 13 20:46:23 
2011
@@ -155,9 +155,9 @@ sub get_currentimage_txt_contents {
 
        # Attempt to retrieve the contents of currentimage.txt
        my $cat_command = "cat ~/currentimage.txt";
-       my ($cat_exit_status, $cat_output) = 
run_ssh_command($computer_node_name, $management_node_keys, $cat_command, '', 
'', 0);
+       my ($cat_exit_status, $cat_output) = 
run_ssh_command($computer_node_name, $management_node_keys, $cat_command);
        if (defined($cat_exit_status) && $cat_exit_status == 0) {
-               notify($ERRORS{'DEBUG'}, 0, "retrieved currentimage.txt 
contents from $computer_node_name");
+               notify($ERRORS{'DEBUG'}, 0, "retrieved currentimage.txt 
contents from $computer_node_name:\n" . join("\n", @$cat_output));
        }
        elsif (defined($cat_exit_status)) {
                notify($ERRORS{'WARNING'}, 0, "failed to retrieve 
currentimage.txt from $computer_node_name, exit status: $cat_exit_status, 
output:\n@{$cat_output}");
@@ -1038,7 +1038,31 @@ sub _get_public_interface_name_helper {
        my @ip_addresses_1 = keys 
%{$network_configuration->{$interface_name_1}{ip_address}};
        my @ip_addresses_2 = keys 
%{$network_configuration->{$interface_name_2}{ip_address}};
        
-       if (!$condition || $condition eq 'assigned_public') {
+       if (!$condition || $condition eq 'matches_private') {
+               # Get the computer private IP address
+               my $computer_private_ip_address = 
$self->data->get_computer_private_ip_address();
+               if (!$computer_private_ip_address) {
+                       notify($ERRORS{'DEBUG'}, 0, "unable to retrieve 
computer private IP address from reservation data");
+                       return;
+               }
+               
+               my $matches_private_1 = (grep { $_ eq 
$computer_private_ip_address } @ip_addresses_1) ? 1 : 0;
+               my $matches_private_2 = (grep { $_ eq 
$computer_private_ip_address } @ip_addresses_2) ? 1 : 0;
+               
+               if ($matches_private_1 eq $matches_private_2) {
+                       notify($ERRORS{'DEBUG'}, 0, "tie: both interfaces 
are/are not assigned the private IP address: $computer_private_ip_address, 
proceeding to check if either interface is assigned a public IP address");
+                       return 
$self->_get_public_interface_name_helper($interface_name_1, $interface_name_2, 
'assigned_public');
+               }
+               elsif ($matches_private_1) {
+                       notify($ERRORS{'DEBUG'}, 0, "'$interface_name_2' is 
more likely the public interface, it is NOT assigned the private IP address: 
$computer_private_ip_address");
+                       return $interface_name_2;
+               }
+               else {
+                       notify($ERRORS{'DEBUG'}, 0, "'$interface_name_1' is 
more likely the public interface, it is NOT assigned the private IP address: 
$computer_private_ip_address");
+                       return $interface_name_1;
+               }
+       }
+       elsif ($condition eq 'assigned_public') {
                my $assigned_public_1 = (grep { is_public_ip_address($_) } 
@ip_addresses_1) ? 1 : 0;
                my $assigned_public_2 = (grep { is_public_ip_address($_) } 
@ip_addresses_2) ? 1 : 0;
                
@@ -1060,8 +1084,8 @@ sub _get_public_interface_name_helper {
                my $assigned_default_gateway_2 = 
defined($network_configuration->{$interface_name_2}{default_gateway}) ? 1 : 0;
                
                if ($assigned_default_gateway_1 eq $assigned_default_gateway_2) 
{
-                       notify($ERRORS{'DEBUG'}, 0, "tie: both interfaces 
are/are not assigned a default gateway, proceeding to check if either is 
assigned the private IP address");
-                       return 
$self->_get_public_interface_name_helper($interface_name_1, $interface_name_2, 
'matches_private');
+                       notify($ERRORS{'DEBUG'}, 0, "tie: both interfaces 
are/are not assigned a default gateway, returning '$interface_name_2'");
+                       return $interface_name_2;
                }
                elsif ($assigned_default_gateway_1) {
                        notify($ERRORS{'DEBUG'}, 0, "'$interface_name_1' is 
more likely the public interface, it is assigned a default gateway, 
'$interface_name_2' is not");
@@ -1072,30 +1096,6 @@ sub _get_public_interface_name_helper {
                        return $interface_name_2;
                }
        }
-       elsif ($condition eq 'matches_private') {
-               # Get the computer private IP address
-               my $computer_private_ip_address = 
$self->data->get_computer_private_ip_address();
-               if (!$computer_private_ip_address) {
-                       notify($ERRORS{'DEBUG'}, 0, "unable to retrieve 
computer private IP address from reservation data");
-                       return;
-               }
-               
-               my $matches_private_1 = (grep { $_ eq 
$computer_private_ip_address } @ip_addresses_1) ? 1 : 0;
-               my $matches_private_2 = (grep { $_ eq 
$computer_private_ip_address } @ip_addresses_2) ? 1 : 0;
-               
-               if ($matches_private_1 eq $matches_private_2) {
-                       notify($ERRORS{'DEBUG'}, 0, "tie: both interfaces 
are/are not assigned the private IP address: $computer_private_ip_address, 
returning '$interface_name_1'");
-                       return $interface_name_1;
-               }
-               elsif ($matches_private_1) {
-                       notify($ERRORS{'DEBUG'}, 0, "'$interface_name_2' is 
more likely the public interface, it is NOT assigned the private IP address: 
$computer_private_ip_address");
-                       return $interface_name_2;
-               }
-               else {
-                       notify($ERRORS{'DEBUG'}, 0, "'$interface_name_1' is 
more likely the public interface, it is NOT assigned the private IP address: 
$computer_private_ip_address");
-                       return $interface_name_1;
-               }
-       }
        else {
                notify($ERRORS{'WARNING'}, 0, "unable to determine which 
interface is more likely the public interface, invalid \$condition argument: 
'$condition'");
                return;
@@ -1529,6 +1529,12 @@ sub create_text_file {
        my $computer_node_name = $self->data->get_computer_node_name();
        my $image_os_type = $self->data->get_image_os_type();
        
+       # Attempt to create the parent directory if it does not exist
+       if ($self->can('create_directory')) {
+               my $parent_directory_path = parent_directory_path($file_path);
+               $self->create_directory($parent_directory_path);
+       }
+       
        # Remove Windows-style carriage returns if the image OS isn't Windows
        if ($image_os_type =~ /windows/) {
                $file_contents_string =~ s/\r*\n/\r\n/g;
@@ -1767,6 +1773,7 @@ sub execute_new {
                                # If true, sets the timeout to "inactivity 
timeout"
                                # If false sets it to "absolute timeout"
                                #$ssh->restart_timeout_upon_receive(1);
+                               $ssh->read_all();
                        };
                        if ($EVAL_ERROR) {
                                if ($EVAL_ERROR =~ /^(\w+) at \//) {

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning.pm?rev=1213919&r1=1213918&r2=1213919&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning.pm Tue Dec 
13 20:46:23 2011
@@ -62,45 +62,6 @@ use VCL::utils;
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 set_vmhost_os
-
- Parameters  : None
- Returns     : Process's VM host OS object
- Description : Sets the VM host OS object for the provisioner module to access.
-
-=cut
-
-sub set_vmhost_os {
-       my $self = shift;
-       my $vmhost_os = shift;
-       $self->{vmhost_os} = $vmhost_os;
-}
-
-#/////////////////////////////////////////////////////////////////////////////
-
-=head2 vmhost_os
-
- Parameters  : None
- Returns     : Process's VM host OS object
- Description : Allows provisioning modules to access the reservation's VM host 
OS
-               object.
-
-=cut
-
-sub vmhost_os {
-       my $self = shift;
-       
-       if (!$self->{vmhost_os}) {
-               notify($ERRORS{'WARNING'}, 0, "unable to return VM host OS 
object, \$self->{vmhost_os} is not set");
-               return;
-       }
-       else {
-               return $self->{vmhost_os};
-       }
-}
-
-#/////////////////////////////////////////////////////////////////////////////
-
 =head2 retrieve_image
 
  Parameters  : none

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=1213919&r1=1213918&r2=1213919&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/State.pm Tue Dec 13 
20:46:23 2011
@@ -119,6 +119,12 @@ sub initialize {
                return;
        }
        
+       # Create a VM host OS object if vmhostid is set for the computer
+       if ($self->data->get_computer_vmhost_id() && 
!$self->create_vmhost_os_object()) {
+               notify($ERRORS{'WARNING'}, 0, "failed to create VM host OS 
object");
+               return;
+       }
+       
        # Create a provisioning object
        if (!$self->create_provisioning_object()) {
                notify($ERRORS{'WARNING'}, 0, "failed to create provisioning 
object");
@@ -126,8 +132,9 @@ sub initialize {
        }
        
        # Allow the provisioning object to access the OS object and vice-versa
-       $self->{provisioner}->set_os($self->{os});
-       $self->{os}->set_provisioner($self->{provisioner});
+       $self->provisioner->set_os($self->os());
+       $self->provisioner->set_vmhost_os($self->vmhost_os());
+       $self->os->set_provisioner($self->provisioner());
        
        notify($ERRORS{'DEBUG'}, 0, "returning 1");
        return 1;
@@ -838,7 +845,7 @@ sub DESTROY {
        my $self = shift;
        
        my $address = sprintf('%x', $self);
-       notify($ERRORS{'DEBUG'}, 0, ref($self) . " destructor called, address: 
$address");
+       #notify($ERRORS{'DEBUG'}, 0, ref($self) . " destructor called, address: 
$address");
        
        # If not a blockrequest, delete computerloadlog entry
        if ($self && $self->data && !$self->data->is_blockrequest()) {
@@ -858,14 +865,14 @@ sub DESTROY {
 
        # Print the number of database handles this process created for 
testing/development
        if (defined $ENV{dbh_count}) {
-               notify($ERRORS{'DEBUG'}, 0, "number of database handles state 
process created: $ENV{dbh_count}");
+               #notify($ERRORS{'DEBUG'}, 0, "number of database handles state 
process created: $ENV{dbh_count}");
        }
        else {
                notify($ERRORS{'DEBUG'}, 0, "state process created unknown 
number of database handles, \$ENV{dbh_count} is undefined");
        }
        
        if (defined $ENV{database_select_count}) {
-               notify($ERRORS{'DEBUG'}, 0, "database select queries: 
$ENV{database_select_count}");
+               #notify($ERRORS{'DEBUG'}, 0, "database select queries: 
$ENV{database_select_count}");
        }
        
        if (defined $ENV{database_select_calls}) {
@@ -876,11 +883,11 @@ sub DESTROY {
                        $database_select_calls_string .= 
"$ENV{database_select_calls}{$key}: $key\n";
                }
                
-               notify($ERRORS{'DEBUG'}, 0, "database select called 
from:\n$database_select_calls_string");
+               #notify($ERRORS{'DEBUG'}, 0, "database select called 
from:\n$database_select_calls_string");
        }
        
        if (defined $ENV{database_execute_count}) {
-               notify($ERRORS{'DEBUG'}, 0, "database execute queries: 
$ENV{database_execute_count}");
+               #notify($ERRORS{'DEBUG'}, 0, "database execute queries: 
$ENV{database_execute_count}");
        }
 
        # Close the database handle


Reply via email to