-Implement clonevm from base in vmware
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@7341 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
88b03ab604
commit
592daeb835
@ -1648,15 +1648,17 @@ sub clonevms {
|
||||
my $newdatastores;
|
||||
my $mastername;
|
||||
my $url;
|
||||
my $masterref;
|
||||
if ($base) { #if base, we need to pull in the target datastores
|
||||
my $mastertab=xCAT::Table->new('vmmaster');
|
||||
my $masterref=$mastertab->getAttribs(name=>$base);
|
||||
$masterref=$mastertab->getAttribs(name=>$base);
|
||||
unless ($masterref) {
|
||||
foreach my $node (@$nodes) {
|
||||
xCAT::SvrUtils::sendmsg([1,"Cannot find master $base in vmmaster table"], $output_handler,$node);
|
||||
}
|
||||
return;
|
||||
}
|
||||
$newdatastores{$masterref->{storage}}=[]; #make sure that the master datastore is mounted...
|
||||
foreach (@$nodes) {
|
||||
my $url;
|
||||
if ($tablecfg{vm}->{$_}->[0]->{storage}) {
|
||||
@ -1684,9 +1686,73 @@ sub clonevms {
|
||||
if ($target) {
|
||||
return promote_vm_to_master(node=>$nodes->[0],target=>$target,force=>$force,detach=>$detach,hyp=>$hyp,url=>$url,mastername=>$mastername);
|
||||
} elsif ($base) {
|
||||
return clone_vms_from_master(nodes=>$nodes,base=>$base,detach=>$detach,hyp=>$hyp);
|
||||
return clone_vms_from_master(nodes=>$nodes,base=>$base,detach=>$detach,hyp=>$hyp,mastername=>$mastername,masterent=>$masterref);
|
||||
}
|
||||
}
|
||||
sub clone_vms_from_master {
|
||||
my %args = @_;
|
||||
my $mastername=$args{mastername};
|
||||
my $regex=qr/^mastername\z/;
|
||||
my @nodes=@{$args{nodes}};
|
||||
my $node;
|
||||
my $masterviews = $hyphash{$hyp}->{conn}->find_entity_views(view_type => 'VirtualMachine',filter=>{'config.name'=>$regex});
|
||||
if (scalar(@$masterviews) != 1) {
|
||||
foreach $node (@nodes) {
|
||||
xCAT::SvrUtils::sendmsg([1,"Unable to find master $mastername in VMWare infrastructure"], $output_handler,$node);
|
||||
}
|
||||
return;
|
||||
}
|
||||
my $masterview=$masterviews->[0];
|
||||
my $masterent=$args{masterent};
|
||||
foreach $node (@nodes) {
|
||||
my $destination=$tabecfg{vm}->{$node}->[0]->{storage};
|
||||
my $nodetypeent;
|
||||
my $vment;
|
||||
foreach (qw/os arch profile/) {
|
||||
$nodetypeent->{$_}=$masterent->{$_};
|
||||
}
|
||||
foreach (qw/storagemodel nics/) {
|
||||
$vment->{$_}=$masterent->{$_};
|
||||
}
|
||||
$vment->{master}=$args{mastername};
|
||||
unless ($destination) {
|
||||
$destination=$masterent->{storage};
|
||||
$vment->{storage}=$destination;
|
||||
}
|
||||
my $relocatespec = VirtualMachineRelocateSpec->new(
|
||||
datastore=>$hyphash{$hyp}->{datastorerefmap}->{$destination},
|
||||
diskMoveType=>"createNewChildDiskBacking",
|
||||
);
|
||||
my $clonespec = VirtualMachineCloneSpec->new(
|
||||
location=>$relocatespec,
|
||||
template=>0,
|
||||
powerOn=>0
|
||||
);
|
||||
my $task = $nodeview->CloneVM_Task(folder=>$hyphash{$hyp}->{vmfolder},name=>$node,spec=>$clonespec);
|
||||
$running_tasks{$task}->{data} = { node => $node, successtext => 'Successfully cloned from '.$args{mastername}, mastername=>$args{mastername}, nodetypeent=>$nodetypeent,vment=>$vment };
|
||||
$running_tasks{$task}->{task} = $task;
|
||||
$running_tasks{$task}->{callback} = \&clone_task_callback;
|
||||
$running_tasks{$task}->{hyp} = $args{hyp}; #$hyp_conns->{$hyp};
|
||||
}
|
||||
}
|
||||
|
||||
sub clone_task_callback {
|
||||
my $task = shift;
|
||||
my $parms = shift;
|
||||
my $state = $task->info->state->val;
|
||||
my $node = $parms->{node};
|
||||
my $intent = $parms->{successtext};
|
||||
if ($state eq 'success') {
|
||||
xCAT::SvrUtils::sendmsg($intent, $output_handler,$node);
|
||||
my $nodetype=xCAT::Table->new('nodetype',-create=>1);
|
||||
my $vm=xCAT::Table->new('vm',-create=>1);
|
||||
$vm->setAttribs({node=>$node},$args{vment});
|
||||
$nodetype->setAttribs({node=>$node},$args{nodetypeent});
|
||||
} elsif ($state eq 'error') {
|
||||
relay_vmware_err($task,"",$node);
|
||||
}
|
||||
}
|
||||
|
||||
sub promote_vm_to_master {
|
||||
my %args = @_;
|
||||
my $node=$args{node};
|
||||
|
Loading…
Reference in New Issue
Block a user