clone job clones before remove existing one

This commit is contained in:
Juan 2018-11-12 23:02:46 +01:00
parent f674f5fffa
commit 36c574b549
2 changed files with 73 additions and 80 deletions

2
debian/changelog vendored
View File

@ -1,4 +1,4 @@
vn-vmware (1.0.34) stable; urgency=low
vn-vmware (1.0.35) stable; urgency=low
* Initial Release.

View File

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