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; }
