Modified: 
incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm?rev=1153606&r1=1153605&r2=1153606&view=diff
==============================================================================
--- 
incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
 (original)
+++ 
incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
 Wed Aug  3 18:43:06 2011
@@ -337,6 +337,7 @@ sub get_vm_power_state {
    }
        
        my $power_state = $vm->runtime->powerState->val;
+       
        my $return_power_state;
        if ($power_state =~ /on/i) {
                $return_power_state = 'on';
@@ -1831,17 +1832,18 @@ sub initialize {
        my $vmhost_hostname = $self->data->get_vmhost_hostname();
        my $vmhost_username = $self->data->get_vmhost_profile_username();
        my $vmhost_password = $self->data->get_vmhost_profile_password();
+       my $vmhost_profile_id = $self->data->get_vmhost_profile_id();
        
        if (!$vmhost_hostname) {
                notify($ERRORS{'WARNING'}, 0, "VM host name could not be 
retrieved");
                return;
        }
        elsif (!$vmhost_username) {
-               notify($ERRORS{'DEBUG'}, 0, "unable to use vSphere SDK, VM host 
username is not configured in the database for the VM profile");
+               notify($ERRORS{'DEBUG'}, 0, "unable to use vSphere SDK, VM host 
username is not configured in the database for VM profile: $vmhost_profile_id");
                return;
        }
        elsif (!$vmhost_password) {
-               notify($ERRORS{'DEBUG'}, 0, "unable to use vSphere SDK, VM host 
password is not configured in the database for the VM profile");
+               notify($ERRORS{'DEBUG'}, 0, "unable to use vSphere SDK, VM host 
password is not configured in the database for VM profile: $vmhost_profile_id");
                return;
        }
        
@@ -2176,6 +2178,93 @@ sub _get_datastore_info {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 create_snapshot
+
+ Parameters  : $vmx_file_path, $name (optional)
+ Returns     : boolean
+ Description : Creates a snapshot of the VM.
+
+=cut
+
+sub create_snapshot {
+       my $self = shift;
+       if (ref($self) !~ /VCL::Module/i) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       # Get the vmx path argument and convert it to a datastore path
+       my $vmx_path = $self->_get_datastore_path(shift) || return;
+       
+       my $snapshot_name = shift || ("VCL: " . convert_to_datetime());
+       
+       # Override the die handler
+       local $SIG{__DIE__} = sub{};
+       
+       my $vm;
+       eval { $vm = Vim::find_entity_view(view_type => 'VirtualMachine', 
filter => {'config.files.vmPathName' => $vmx_path}); };
+       if (!$vm) {
+               notify($ERRORS{'WARNING'}, 0, "unable to create snapshop 
because VM is not registered: $vmx_path");
+               return;
+   }
+       
+       eval { $vm->CreateSnapshot(name => $snapshot_name,
+                                                                               
memory => 0,
+                                                                               
quiesce => 0,
+                                                                               
);
+                       };
+       
+       if ($@) {
+               notify($ERRORS{'WARNING'}, 0, "failed to create snapshot of VM: 
$vmx_path, error:\n$@");
+               return;
+       }
+       
+       notify($ERRORS{'DEBUG'}, 0, "created snapshot '$snapshot_name' of VM: 
$vmx_path");
+       return 1;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 snapshot_exists
+
+ Parameters  : $vmx_file_path
+ Returns     : boolean
+ Description : Determines if a snapshot exists for the VM.
+
+=cut
+
+sub snapshot_exists {
+       my $self = shift;
+       if (ref($self) !~ /VCL::Module/i) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       # Get the vmx path argument and convert it to a datastore path
+       my $vmx_path = $self->_get_datastore_path(shift) || return;
+       
+       # Override the die handler because fileManager may call it
+       local $SIG{__DIE__} = sub{};
+       
+       my $vm;
+       eval { $vm = Vim::find_entity_view(view_type => 'VirtualMachine', 
filter => {'config.files.vmPathName' => $vmx_path}); };
+       if (!$vm) {
+               notify($ERRORS{'WARNING'}, 0, "unable to determine if snapshot 
exists because VM is not registered: $vmx_path");
+               return;
+   }
+       
+       if (defined($vm->snapshot)) {
+               notify($ERRORS{'DEBUG'}, 0, "snapshot exists for VM: 
$vmx_path");
+               return 1;
+       }
+       else {
+               notify($ERRORS{'DEBUG'}, 0, "snapshot does NOT exist for VM: 
$vmx_path");
+               return 0;
+       }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 1;
 __END__
 

Modified: 
incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vmware_cmd.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vmware_cmd.pm?rev=1153606&r1=1153605&r2=1153606&view=diff
==============================================================================
--- 
incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vmware_cmd.pm
 (original)
+++ 
incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vmware_cmd.pm
 Wed Aug  3 18:43:06 2011
@@ -748,6 +748,47 @@ sub _get_datastore_info {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 create_snapshot
+
+ Parameters  : $vmx_file_path
+ Returns     : boolean
+ Description : Creates a snapshot of the VM.
+
+=cut
+
+sub create_snapshot {
+       my $self = shift;
+       if (ref($self) !~ /VCL::Module/i) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       # Get the vmx file path argument
+       my $vmx_file_path = shift;
+       if (!$vmx_file_path) {
+               notify($ERRORS{'WARNING'}, 0, "vmx file path argument was not 
supplied");
+               return;
+       }
+       
+       my $command = "vmrun snapshot \"$vmx_file_path\"";
+       
+       my ($exit_status, $output) = $self->vmhost_os->execute($command, 1);
+       if (!defined($output)) {
+               notify($ERRORS{'WARNING'}, 0, "failed to execute vmrun to 
create a snapshot of VM: $vmx_file_path, command: '$command'");
+               return;
+       }
+       elsif ($exit_status != 0 || grep(/error/i, @$output)) {
+               notify($ERRORS{'WARNING'}, 0, "error occurred executing vmrun 
to create a snapshot of VM: $vmx_file_path, command: '$command', output:\n" . 
join("\n", @$output));
+               return;
+       }
+       else {
+               notify($ERRORS{'OK'}, 0, "created snapshot of VM: 
$vmx_file_path, output:\n" . join("\n", @$output));
+               return 1;
+       }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 1;
 __END__
 

Modified: incubator/vcl/trunk/managementnode/lib/VCL/utils.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1153606&r1=1153605&r2=1153606&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Wed Aug  3 18:43:06 2011
@@ -5075,15 +5075,16 @@ EOF
        # Retrieve the image info
        my $imagerevision_image_id = $imagerevision_info->{imageid};
        my $imagerevision_image_info = get_image_info($imagerevision_image_id);
+       if (!$imagerevision_image_info) {
+               notify($ERRORS{'WARNING'}, 0, "failed to retrieve imagerevision 
info, image info could not be retrieved for image ID: $imagerevision_image_id");
+               return;
+       }
        $imagerevision_info->{image} = $imagerevision_image_info;
        
        # Retrieve the imagerevision user info
-       my $imagerevision_user_id = $imagerevision_info->{userid};
-       my $imagerevision_user_info = get_user_info($imagerevision_user_id);
-       my $imagerevision_user_info_address = sprintf('%x', 
$imagerevision_user_info);
-       $imagerevision_info->{user_address} = $imagerevision_user_info_address;
-       $imagerevision_info->{user} = $imagerevision_user_info;
+       $imagerevision_info->{user} = 
get_user_info($imagerevision_info->{userid});
        
+       # Add the info to %ENV so it doesn't need to be retrieved from the 
database again
        $ENV{imagerevision_info}{$imagerevision_identifier} = 
$imagerevision_info;
        #notify($ERRORS{'DEBUG'}, 0, "retrieved info from database for 
imagerevision '$imagerevision_identifier':\n" . 
format_data($ENV{imagerevision_info}{$imagerevision_identifier}));
        return $ENV{imagerevision_info}{$imagerevision_identifier};
@@ -5598,7 +5599,7 @@ sub run_ssh_command {
                        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) {
+               elsif ($exit_status == 255 && $ssh_command !~ 
/(vmware-cmd|vim-cmd|vmkfstools|vmrun)/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;
                }
@@ -8073,7 +8074,7 @@ EOF
        
        # Check to make sure row was returned
        if (!@selected_rows) {
-               notify($ERRORS{'OK'}, 0, "user was not found in the database: 
'$user_identifier', SQL statement:\n$select_statement");
+               notify($ERRORS{'WARNING'}, 0, "user was not found in the 
database: '$user_identifier'");
                return;
        }
        elsif (scalar @selected_rows > 1) {
@@ -10421,7 +10422,7 @@ EOF
                }
        }
        
-       notify($ERRORS{'DEBUG'}, 0, "retrieved OS info:\n" . 
format_data(\%info));
+       #notify($ERRORS{'DEBUG'}, 0, "retrieved OS info:\n" . 
format_data(\%info));
        return \%info;
 }
 


Reply via email to