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. * Initial Release.

View File

@ -433,13 +433,13 @@ sub backup_machine() {
} }
log_message "Creating backup snapshot."; log_message "Creating backup snapshot.";
my $snapshotRef = $vm->CreateSnapshot( my $snapshot_ref = $vm->CreateSnapshot(
name => "backup", name => "backup",
description => "Scheduled backup", description => "Scheduled backup",
memory => false, memory => false,
quiesce => true quiesce => true
); );
$snapshot = Vim::get_view(mo_ref => $snapshotRef); $snapshot = Vim::get_view(mo_ref => $snapshot_ref);
log_message "Copying virtual disk files."; log_message "Copying virtual disk files.";
@ -451,8 +451,7 @@ sub backup_machine() {
next; next;
} }
my $backing = $device->backing; my $disk_path = $device->backing->fileName;
my $disk_path = $backing->fileName;
my $disk_file = basename($disk_path); my $disk_file = basename($disk_path);
log_message $disk_path; log_message $disk_path;
@ -475,6 +474,7 @@ sub backup_machine() {
removeChildren => true, removeChildren => true,
consolidate => true consolidate => true
); );
$snapshot = undef;
my $pigz_processes; my $pigz_processes;
@ -582,32 +582,31 @@ sub clone_machine {
log_message "Cloning '$vm_name' to '$dst_name'."; log_message "Cloning '$vm_name' to '$dst_name'.";
log_message "Doing some previous checkings."; log_message "Doing some previous checkings.";
my $dst_tmp_name = $dst_name;
my $original_vm = Vim::find_entity_view( my $original_vm = Vim::find_entity_view(
view_type => 'VirtualMachine', view_type => 'VirtualMachine',
filter => {'name' => $dst_name} filter => {'name' => $dst_name}
); );
if ($original_vm) { if ($original_vm) {
if ($overwrite) { if (not($overwrite)) {
set_power_state($original_vm, 'poweredOff');
log_message "Deleting machine '$dst_name'.";
$original_vm->Destroy();
} else {
die "Machine with same name exists."; 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 is not especified, it is generated by VMWare
if ($mac) { if ($mac) {
my $vmView = Vim::find_entity_views(view_type => 'VirtualMachine'); my $vm_view = Vim::find_entity_views(view_type => 'VirtualMachine');
foreach my $vmRes (@$vmView) { foreach my $vm_res (@$vm_view) {
my @nics = grep { $_->isa("VirtualEthernetCard") } @{ $vm->config->hardware->device }; my @nics = grep { $_->isa("VirtualEthernetCard") } @{ $vm->config->hardware->device };
for my $nic (@nics) { for my $nic (@nics) {
if ($nic->macAddress eq $mac) { if ($nic->macAddress eq $mac) {
my $machineName = $vmRes->name; my $machineName = $vm_res->name;
die "Machine '$machineName' with same MAC exists."; 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 # Network card
my $mac_type = 'Generated'; my $mac_type = 'Generated';
@ -726,30 +693,76 @@ sub clone_machine {
device => $new_network_device 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 # 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( my $change_spec = VirtualMachineConfigSpec->new(
deviceChange => [$vm_dev_spec],
name => $dst_name,
memoryMB => $memory, memoryMB => $memory,
numCPUs => $num_cpus, numCPUs => $num_cpus,
cpuAllocation => $cpu, cpuAllocation => $cpu,
memoryAllocation => $mem_res, memoryAllocation => $mem_res,
extraConfig => [$extra_conf] extraConfig => [$extra_conf]
); );
my $clone_spec = VirtualMachineCloneSpec->new( $vm_clone->ReconfigVM(spec => $change_spec);
powerOn => $poweron,
template => 0, if ($original_vm && $overwrite) {
location => $relocate_spec, log_message "Deleting machine '$dst_name'.";
config => $change_spec $original_vm->Destroy();
);
log_message "Cloning machine."; log_message "Renaming '$dst_tmp_name' to '$dst_name'.";
$vm->CloneVM( $vm_clone->Rename(newName => $dst_name);
folder => $vm->parent, }
name => $dst_name,
spec => $clone_spec if ($poweron) {
); log_message "Powering on '$dst_name'.";
$vm_clone->PowerOnVM();
}
log_message "Clone '$dst_name' of '$vm_name' successfully created."; log_message "Clone '$dst_name' of '$vm_name' successfully created.";
} }
@ -831,23 +844,3 @@ sub open_machine() {
log_message "Found machine '$vm_name'."; 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);
}
};
}