diff --git a/xCAT-server/lib/xcat/plugins/kvm.pm b/xCAT-server/lib/xcat/plugins/kvm.pm index cc95229a0..7da2bdd22 100644 --- a/xCAT-server/lib/xcat/plugins/kvm.pm +++ b/xCAT-server/lib/xcat/plugins/kvm.pm @@ -407,7 +407,7 @@ sub build_diskstruct { } else { #give the VM an empty optical drive, to allow chvm live attach/remove my $cdhash; $cdhash->{device}='cdrom'; - $cdhash->{type}='block'; + $cdhash->{type}='file'; $cdhash->{readonly}; $cdhash->{target}->{dev}='hdc'; push @returns,$cdhash; @@ -1342,12 +1342,16 @@ sub chvm { my @purge; my @derefdisks; my $memory; + my $cdrom; + my $eject; @ARGV=@_; require Getopt::Long; GetOptions( "a=s"=>\@addsizes, "d=s"=>\@derefdisks, "mem=s"=>\$memory, + "cdrom=s"=>\$cdrom, + "eject"=>\$eject, "cpus=s" => \$cpucount, "p=s"=>\@purge, "resize=s%" => \%resize, @@ -1514,6 +1518,53 @@ sub chvm { } } + my $newcdxml; + if ($cdrom) { + my $cdpath; + if ($cdrom =~ m!://!) { + my $url = $cdrom; + $url =~ s!([^/]+)\z!!; + my $imagename=$1; + my $poolobj = get_storage_pool_by_url($url); + unless ($poolobj) { die "Cound not get storage pool for $url"; } + my $poolxml = $poolobj->get_xml_description(); #yes, I have to XML parse for even this... + my $parsedpool = $parser->parse_string($poolxml); + $cdpath = $parsedpool->findnodes("/pool/target/path/text()")->[0]->data; + $cdpath .= "/".$imagename; + } else { + if ($cdrom =~ m!^/dev/!) { + die "TODO: device pass through if anyone cares"; + } elsif ($cdrom =~ m!^/!) { #full path... I guess + $cdpath=$cdrom; + } else { + die "TODO: relative paths, use client cwd as hint?"; + } + } + unless ($cdpath) { die "unable to understand cd path specification"; } + $newcdxml = ""; + } elsif ($eject) { + $newcdxml = ""; + } + if ($newcdxml) { + if ($currstate eq 'on') { + $dom->attach_device($newcdxml); + $vmxml=$dom->get_xml_description(); + } else { + unless ($vmxml) { + $vmxml=$confdata->{kvmnodedata}->{$node}->[0]->{xml}; + } + my $domparsed = $parser->parse_string($vmxml); + my $candidatenodes=$domparsed->findnodes("//disk[device='cdrom'"): + if (scalar (@$candidatenodes) != 1) { + die "shouldn't be possible, should only have one cdrom"; + } + my $newcd=$parser->parse_balanced_chunk($newcdxml); + $candidatenodes->[0]->replaceNode($newcd); + my $moddedxml; + $vmxml=$moddedxml; + } + $updatetable->{kvm_nodedata}->{$node}->{xml}=$vmxml; + } if ($cpucount or $memory) { if ($currstate eq 'on') { xCAT::SvrUtils::sendmsg([1,"Hot add of cpus or memory not supported"],$callback,$node);