diff --git a/debian/changelog b/debian/changelog index da83e9e..f0761fa 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -vn-vmware (1.0.34) stable; urgency=low +vn-vmware (1.0.35) stable; urgency=low * Initial Release. diff --git a/vn-vmware.pl b/vn-vmware.pl index fbd4947..d332204 100755 --- a/vn-vmware.pl +++ b/vn-vmware.pl @@ -433,13 +433,13 @@ sub backup_machine() { } log_message "Creating backup snapshot."; - my $snapshotRef = $vm->CreateSnapshot( + my $snapshot_ref = $vm->CreateSnapshot( name => "backup", description => "Scheduled backup", memory => false, quiesce => true ); - $snapshot = Vim::get_view(mo_ref => $snapshotRef); + $snapshot = Vim::get_view(mo_ref => $snapshot_ref); log_message "Copying virtual disk files."; @@ -451,8 +451,7 @@ sub backup_machine() { next; } - my $backing = $device->backing; - my $disk_path = $backing->fileName; + my $disk_path = $device->backing->fileName; my $disk_file = basename($disk_path); log_message $disk_path; @@ -475,6 +474,7 @@ sub backup_machine() { removeChildren => true, consolidate => true ); + $snapshot = undef; my $pigz_processes; @@ -582,32 +582,31 @@ sub clone_machine { log_message "Cloning '$vm_name' to '$dst_name'."; log_message "Doing some previous checkings."; + my $dst_tmp_name = $dst_name; + my $original_vm = Vim::find_entity_view( view_type => 'VirtualMachine', filter => {'name' => $dst_name} ); if ($original_vm) { - if ($overwrite) { - set_power_state($original_vm, 'poweredOff'); - - log_message "Deleting machine '$dst_name'."; - $original_vm->Destroy(); - } else { + if (not($overwrite)) { die "Machine with same name exists."; } + + my $dst_tmp_name = "$dst_name.tmp"; } # If MAC is not especified, it is generated by VMWare if ($mac) { - my $vmView = Vim::find_entity_views(view_type => 'VirtualMachine'); - foreach my $vmRes (@$vmView) { + my $vm_view = Vim::find_entity_views(view_type => 'VirtualMachine'); + foreach my $vm_res (@$vm_view) { my @nics = grep { $_->isa("VirtualEthernetCard") } @{ $vm->config->hardware->device }; for my $nic (@nics) { if ($nic->macAddress eq $mac) { - my $machineName = $vmRes->name; + my $machineName = $vm_res->name; die "Machine '$machineName' with same MAC exists."; } } @@ -645,38 +644,6 @@ sub clone_machine { ); } - # Datastore - - my $relocate_spec; - my $host_view = $vm->summary->runtime->host; - - if (defined($dst_host)) { - $host_view = Vim::find_entity_view( - view_type => 'HostSystem', - filter => {'name' => $dst_host} - ); - } - - my $comp_res_view = Vim::get_view(mo_ref => $host_view->parent); - - if (defined($dst_datastore)) { - my $ds_new = Vim::find_entity_view( - view_type => 'Datastore', - filter => {'name' => $dst_datastore}, - properties => ['name'] - ); - $relocate_spec = VirtualMachineRelocateSpec->new( - pool => $comp_res_view->resourcePool, - host => $host_view, - datastore => $ds_new - ); - } else { - $relocate_spec = VirtualMachineRelocateSpec->new( - pool => $comp_res_view->resourcePool, - host => $host_view - ); - } - # Network card my $mac_type = 'Generated'; @@ -726,30 +693,76 @@ sub clone_machine { device => $new_network_device ); + # Datastore + + my $relocate_spec; + my $host_view = $vm->summary->runtime->host; + + if (defined($dst_host)) { + $host_view = Vim::find_entity_view( + view_type => 'HostSystem', + filter => {'name' => $dst_host} + ); + } + + my $comp_res_view = Vim::get_view(mo_ref => $host_view->parent); + + if (defined($dst_datastore)) { + my $ds_new = Vim::find_entity_view( + view_type => 'Datastore', + filter => {'name' => $dst_datastore}, + properties => ['name'] + ); + $relocate_spec = VirtualMachineRelocateSpec->new( + pool => $comp_res_view->resourcePool, + host => $host_view, + deviceChange => [$vm_dev_spec], + datastore => $ds_new + ); + } else { + $relocate_spec = VirtualMachineRelocateSpec->new( + pool => $comp_res_view->resourcePool, + host => $host_view, + deviceChange => [$vm_dev_spec] + ); + } + # Gathering specifications and cloning + log_message "Cloning machine."; + my $clone_spec = VirtualMachineCloneSpec->new( + powerOn => false, + template => false, + location => $relocate_spec + ); + my $vm_clone_ref = $vm->CloneVM( + folder => $vm->parent, + name => $dst_tmp_name, + spec => $clone_spec + ); + my $vm_clone = Vim::get_view(mo_ref => $vm_clone_ref); + my $change_spec = VirtualMachineConfigSpec->new( - deviceChange => [$vm_dev_spec], - name => $dst_name, memoryMB => $memory, numCPUs => $num_cpus, cpuAllocation => $cpu, memoryAllocation => $mem_res, extraConfig => [$extra_conf] ); - my $clone_spec = VirtualMachineCloneSpec->new( - powerOn => $poweron, - template => 0, - location => $relocate_spec, - config => $change_spec - ); + $vm_clone->ReconfigVM(spec => $change_spec); + + if ($original_vm && $overwrite) { + log_message "Deleting machine '$dst_name'."; + $original_vm->Destroy(); - log_message "Cloning machine."; - $vm->CloneVM( - folder => $vm->parent, - name => $dst_name, - spec => $clone_spec - ); + log_message "Renaming '$dst_tmp_name' to '$dst_name'."; + $vm_clone->Rename(newName => $dst_name); + } + + if ($poweron) { + log_message "Powering on '$dst_name'."; + $vm_clone->PowerOnVM(); + } log_message "Clone '$dst_name' of '$vm_name' successfully created."; } @@ -831,23 +844,3 @@ sub open_machine() { log_message "Found machine '$vm_name'."; } - -sub set_power_state { - my ($vm_power, $state) = @_; - - eval { - if ($vm_power->runtime->powerState->val ne $state) { - given ($state) { - when ('poweredOff') { - $vm_power->ShutdownGuest(); - log_message "Turning off ".$vm_power->name."."; - } - when ('poweredOn') { - $vm_power->PowerOnVM(); - log_message "Turning on ".$vm_power->name."."; - } - } - sleep(50); - } - }; -}