-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:
jbjohnso 2010-09-01 20:43:34 +00:00
parent 88b03ab604
commit 592daeb835

View File

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