You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by ar...@apache.org on 2014/07/16 21:57:57 UTC
svn commit: r1611158 -
/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
Author: arkurth
Date: Wed Jul 16 19:57:57 2014
New Revision: 1611158
URL: http://svn.apache.org/r1611158
Log:
VCL-770
Updated vSphere_SDK.pm to check the resultant vmdk file name after cloning a VM in copy_virtual_disk. With vSphere SDK 5.5 and possibly other versions, the file may be named something like copy-000001.vmdk instead of copy.vmdk. If it detects this, the vmdk is renamed.
Modified:
vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm?rev=1611158&r1=1611157&r2=1611158&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm Wed Jul 16 19:57:57 2014
@@ -610,6 +610,7 @@ sub copy_virtual_disk {
my $source_datastore = $self->_get_datastore_object($source_datastore_name) || return;
my $destination_datastore = $self->_get_datastore_object($destination_datastore_name) || return;
+ my $destination_file_name = $self->_get_file_name($destination_path);
my $destination_base_name = $self->_get_file_base_name($destination_path);
# Get the source vmdk file info so the source adapter and disk type can be displayed
@@ -725,6 +726,9 @@ sub copy_virtual_disk {
my $source_vm_directory_path = "[$source_datastore_name] $source_vm_name";
my $clone_vm_directory_path = "[$destination_datastore_name] $clone_vm_name";
+ # Make sure the "source-..." directory doesn't exist or else the clone will fail
+ $self->delete_file($source_vm_directory_path);
+
# Check if VMs already exist using the source/clone directories
my @existing_vmx_file_paths = $self->get_vmx_file_paths();
for my $existing_vmx_file_path (@existing_vmx_file_paths) {
@@ -758,7 +762,7 @@ sub copy_virtual_disk {
notify($ERRORS{'WARNING'}, 0, "unable to copy virtual disk, clone VM directory path already exists: $clone_vm_directory_path");
return;
}
-
+
# Create a virtual machine on top of this virtual disk
# First, create a controller for the virtual disk
my $controller;
@@ -877,6 +881,7 @@ EOF
"clone VM directory path: $clone_vm_directory_path"
);
+
# Clone the temporary VM, thus creating a copy of its virtual disk
notify($ERRORS{'DEBUG'}, 0, "attempting to clone VM: $source_vm_name --> $clone_vm_name\nclone VM directory path: '$clone_vm_directory_path'");
my $clone_vm_view;
@@ -909,7 +914,7 @@ EOF
}
return;
}
-
+
notify($ERRORS{'DEBUG'}, 0, "deleting source VM: $source_vm_name");
$self->vm_unregister($source_vm_view);
notify($ERRORS{'DEBUG'}, 0, "deleting source VM directory: $source_vm_directory_path");
@@ -917,12 +922,37 @@ EOF
notify($ERRORS{'DEBUG'}, 0, "deleting cloned VM: $clone_vm_name");
$self->vm_unregister($clone_vm_view);
+
+ # Get all files created for cloned VM
my @clone_files = $self->find_files($clone_vm_directory_path, '*', 1);
+
+ # Delete all non-vmdk files
for my $clone_file_path (grep(!/\.(vmdk)$/i, @clone_files)) {
- notify($ERRORS{'DEBUG'}, 0, "deleting cloned VM file: $clone_file_path");
+ notify($ERRORS{'DEBUG'}, 0, "deleting clone VM file: $clone_file_path");
$self->delete_file($clone_file_path);
}
+ # Get the clone vmdk file names
+ my (@clone_vmdk_file_paths) = grep(/\.(vmdk)$/i, @clone_files);
+ if (@clone_vmdk_file_paths) {
+ my ($clone_vmdk_file_path) = grep(/$clone_vm_name-\d+\.vmdk$/, @clone_vmdk_file_paths);
+ if ($clone_vmdk_file_path) {
+ my $clone_vmdk_file_name = $self->_get_file_name($clone_vmdk_file_path);
+ notify($ERRORS{'OK'}, 0, "clone vmdk name is different than requested, attempting to rename clone vmdk: $clone_vmdk_file_name --> $destination_file_name");
+ if (!$self->move_virtual_disk($clone_vmdk_file_path, $destination_path)) {
+ $self->delete_file($clone_vm_directory_path);
+ return;
+ }
+ }
+ else {
+ notify($ERRORS{'DEBUG'}, 0, "clone vmdk name matches requested:\n" . join("\n", @clone_vmdk_file_paths));
+ }
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "no file created for clone VM ends with .vmdk:\n" . join("\n", @clone_files));
+ return;
+ }
+
# Set this as a class value so that it is retrievable from within
# the calling context, i.e. capture(), routine. This way, in case
# the name changes, it is possible to update the database with the new value.