diff --git a/xCAT-server/lib/xcat/plugins/kvm.pm b/xCAT-server/lib/xcat/plugins/kvm.pm index dd881b5d2..ac9ef1bc8 100755 --- a/xCAT-server/lib/xcat/plugins/kvm.pm +++ b/xCAT-server/lib/xcat/plugins/kvm.pm @@ -2870,7 +2870,7 @@ sub fixup_clone_network { } sub mkvm { - shift; #Throuw away first argument + shift; #Throw away first argument @ARGV = @_; my $disksize; my $mastername; @@ -2885,6 +2885,12 @@ sub mkvm { "cpus=s" => \$cpucount, 'force|f' => \$force ); + if (defined $confdata->{vm}->{$node}->[0]->{othersettings}) { + my $nodefrom = $confdata->{vm}->{$node}->[0]->{othersettings}; + if ($nodefrom =~ /^nodefromrscan/) { + return 1, "this node was defined through rscan, it does not support to use 'mkvm' to create again."; + } + } if (defined $confdata->{vm}->{$node}->[0]->{storage}) { my $diskname = $confdata->{vm}->{$node}->[0]->{storage}; if ($diskname =~ /^phy:/) { #in this case, mkvm should have no argumens @@ -3136,14 +3142,23 @@ sub rscan { } my @vmstoragediskobjs = $domain->findnodes("/domain/devices/disk"); foreach my $vmstoragediskobj (@vmstoragediskobjs) { + my ($vmstorage_file_obj, $vmstorage_block_obj); if (($vmstoragediskobj->getAttribute("device") eq "disk") and ($vmstoragediskobj->getAttribute("type") eq "file")) { my @vmstorageobj = $vmstoragediskobj->findnodes("./source"); if (@vmstorageobj and defined($vmstorageobj[0])) { - $vmstorage = $vmstorageobj[0]->getAttribute("file"); - last; + $vmstorage_file_obj = $vmstorageobj[0]->getAttribute("file"); } + $vmstorage .= "$vmstorage_file_obj,"; + } + if (($vmstoragediskobj->getAttribute("device") eq "disk") and ($vmstoragediskobj->getAttribute("type") eq "block")) { + my @vmstorageobj = $vmstoragediskobj->findnodes("./source"); + if (@vmstorageobj and defined($vmstorageobj[0])) { + $vmstorage_block_obj = $vmstorageobj[0]->getAttribute("dev"); + } + $vmstorage .= "$vmstorage_block_obj,"; } } + chop($vmstorage); if (length($vmstorage) > $maxlength[7]) { $maxlength[7] = length($vmstorage); } @@ -3154,21 +3169,31 @@ sub rscan { my @interfaceobjs = $domain->findnodes("/domain/devices/interface"); foreach my $interfaceobj (@interfaceobjs) { if (($interfaceobj->getAttribute("type")) eq "bridge" ) { + my ($vmnics_obj, $mac_obj, $vmnicnicmodel_obj); my @vmnicsobj = $interfaceobj->findnodes("./source"); my @macobj = $interfaceobj->findnodes("./mac"); my @vmnicnicmodelobj = $interfaceobj->findnodes("./model"); - if ((@vmnicsobj and defined($vmnicsobj[0])) and (@macobj and defined($macobj[0])) and (@vmnicnicmodelobj and defined($vmnicnicmodelobj[0]))) { - $vmnics = $vmnicsobj[0]->getAttribute("bridge"); - $mac = $macobj[0]->getAttribute("address"); - $vmnicnicmodel = $vmnicnicmodelobj[0]->getAttribute("type"); - last; + if (@vmnicsobj and defined($vmnicsobj[0])) { + $vmnics_obj = $vmnicsobj[0]->getAttribute("bridge"); } + if (@macobj and defined($macobj[0])) { + $mac_obj = $macobj[0]->getAttribute("address"); + } + if (@vmnicnicmodelobj and defined($vmnicnicmodelobj[0])) { + $vmnicnicmodel_obj = $vmnicnicmodelobj[0]->getAttribute("type"); + } + $vmnics .= "$vmnics_obj,"; + $mac .= "$mac_obj,"; + $vmnicnicmodel .= "$vmnicnicmodel_obj,"; } } + chop($vmnics); + chop($mac); + chop($vmnicnicmodel); if (length($vmnics) > $maxlength[6]) { $maxlength[6] = length($vmnics); } - push @{$host2kvm{$uuid}}, join( ",", $type,$node,$hypervisor,$id,$vmcpus,$vmmemory,$vmnics,$vmstorage,$arch,$mac,$vmnicnicmodel ); + push @{$host2kvm{$uuid}}, join( ":", $type,$node,$hypervisor,$id,$vmcpus,$vmmemory,$vmnics,$vmstorage,$arch,$mac,$vmnicnicmodel ); if ($write) { unless (exists $hash_vm2host{$node}) { $updatetable->{vm}->{$node}->{host} = $hypervisor; @@ -3177,15 +3202,20 @@ sub rscan { $updatetable->{vm}->{$node}->{cpus} = $vmcpus; $updatetable->{vm}->{$node}->{nics} = $vmnics; $updatetable->{vm}->{$node}->{nicmodel} = $vmnicnicmodel; + $updatetable->{vm}->{$node}->{othersettings} = "nodefromrscan"; $updatetable->{mac}->{$node}->{mac} = $mac; $updatetable->{vpd}->{$node}->{uuid} = $uuid; + $updatetable->{nodelist}->{$node}->{groups} = "vm,all"; $updatetable->{nodetype}->{$node}->{arch} = $arch; $updatetable->{nodehm}->{$node}->{mgt} = "kvm"; + $updatetable->{nodehm}->{$node}->{serialport} = "0"; + $updatetable->{nodehm}->{$node}->{serialspeed} = "115200"; + $updatetable->{kvm_nodedata}->{$node}->{xml} = $currxml; } else { if ($hash_vm2host{$node} eq $hypervisor) { - #mark this node to delete in 'vm' 'mac' vpd' 'nodetype' 'nodehm' tables + #mark this node to delete in 'vm' 'mac' vpd' 'nodelist' 'nodetype' 'nodehm' tables $updatetable->{vm}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; $updatetable->{vm}->{$node}->{host} = $hypervisor; @@ -3194,14 +3224,21 @@ sub rscan { $updatetable->{vm}->{$node}->{cpus} = $vmcpus; $updatetable->{vm}->{$node}->{nics} = $vmnics; $updatetable->{vm}->{$node}->{nicmodel} = $vmnicnicmodel; + $updatetable->{vm}->{$node}->{othersettings} = "nodefromrscan"; $updatetable->{mac}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; $updatetable->{mac}->{$node}->{mac} = $mac; $updatetable->{vpd}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; $updatetable->{vpd}->{$node}->{uuid} = $uuid; + $updatetable->{nodelist}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; + $updatetable->{nodelist}->{$node}->{groups} = "vm,all"; $updatetable->{nodetype}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; $updatetable->{nodetype}->{$node}->{arch} = $arch; $updatetable->{nodehm}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; $updatetable->{nodehm}->{$node}->{mgt} = "kvm"; + $updatetable->{nodehm}->{$node}->{serialport} = "0"; + $updatetable->{nodehm}->{$node}->{serialspeed} = "115200"; + $updatetable->{kvm_nodedata}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; + $updatetable->{kvm_nodedata}->{$node}->{xml} = $currxml; } else { $callback->({data=>"the name of KVM guest $node on $hypervisor conflicts with the existing node in xCAT table."}); @@ -3217,14 +3254,21 @@ sub rscan { $updatetable->{vm}->{$node}->{cpus} = $vmcpus; $updatetable->{vm}->{$node}->{nics} = $vmnics; $updatetable->{vm}->{$node}->{nicmodel} = $vmnicnicmodel; + $updatetable->{vm}->{$node}->{othersettings} = "nodefromrscan"; $updatetable->{mac}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; $updatetable->{mac}->{$node}->{mac} = $mac; $updatetable->{vpd}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; $updatetable->{vpd}->{$node}->{uuid} = $uuid; + $updatetable->{nodelist}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; + $updatetable->{nodelist}->{$node}->{groups} = "vm,all"; $updatetable->{nodetype}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; $updatetable->{nodetype}->{$node}->{arch} = $arch; $updatetable->{nodehm}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; $updatetable->{nodehm}->{$node}->{mgt} = "kvm"; + $updatetable->{nodehm}->{$node}->{serialport} = "0"; + $updatetable->{nodehm}->{$node}->{serialspeed} = "115200"; + $updatetable->{kvm_nodedata}->{'!*XCATNODESTODELETE*!'}->{$node} = $node; + $updatetable->{kvm_nodedata}->{$node}->{xml} = $currxml; } } if ($create) { @@ -3235,10 +3279,15 @@ sub rscan { $updatetable->{vm}->{$node}->{cpus} = $vmcpus; $updatetable->{vm}->{$node}->{nics} = $vmnics; $updatetable->{vm}->{$node}->{nicmodel} = $vmnicnicmodel; + $updatetable->{vm}->{$node}->{othersettings} = "nodefromrscan"; $updatetable->{mac}->{$node}->{mac} = $mac; $updatetable->{vpd}->{$node}->{uuid} = $uuid; + $updatetable->{nodelist}->{$node}->{groups} = "vm,all"; $updatetable->{nodetype}->{$node}->{arch} = $arch; $updatetable->{nodehm}->{$node}->{mgt} = "kvm"; + $updatetable->{nodehm}->{$node}->{serialport} = "0"; + $updatetable->{nodehm}->{$node}->{serialspeed} = "115200"; + $updatetable->{kvm_nodedata}->{$node}->{xml} = $currxml; } } if ($stanza) { @@ -3276,7 +3325,7 @@ sub rscan { my @data; foreach (@{$host2kvm{$host}}) { my $info = $_; - foreach (split(',', $info)) { + foreach (split(':', $info)) { my $attr = $_; push @data, "$attr"; }