clone job clones before remove existing one
This commit is contained in:
parent
f674f5fffa
commit
36c574b549
|
@ -1,4 +1,4 @@
|
||||||
vn-vmware (1.0.34) stable; urgency=low
|
vn-vmware (1.0.35) stable; urgency=low
|
||||||
|
|
||||||
* Initial Release.
|
* Initial Release.
|
||||||
|
|
||||||
|
|
151
vn-vmware.pl
151
vn-vmware.pl
|
@ -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);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
Reference in New Issue