diff --git a/xCAT-server/lib/xcat/plugins/kvm.pm b/xCAT-server/lib/xcat/plugins/kvm.pm index fda23011a..90fe46524 100755 --- a/xCAT-server/lib/xcat/plugins/kvm.pm +++ b/xCAT-server/lib/xcat/plugins/kvm.pm @@ -309,7 +309,7 @@ sub get_filepath_by_url { #at the end of the day, the libvirt storage api gives if ($force) { #must destroy the storage $_->delete(); } else { - die "Path already exists"; + die "Path $desiredname already exists"; } } else { return $_->get_path(); @@ -533,7 +533,7 @@ sub build_diskstruct { } elsif ($disk_parts[0] =~ m/^nfs:\/\/(.*)$/ or $disk_parts[0] =~ m/^dir:\/\/(.*)$/ or $disk_parts[0] =~ m/^lvm:\/\/(.*)$/) { my %disks = %{ get_multiple_paths_by_url(url => $disk_parts[0], node => $node) }; unless (keys %disks) { - die "Unable to find any persistent disks at " . $disk_parts[0]; + return(1,"Unable to find any persistent disks at $disk_parts[0] for $node"); } foreach (keys %disks) { my $tdiskhash; @@ -856,7 +856,10 @@ sub build_xmldesc { $xtree{features}->{acpi} = {}; $xtree{features}->{apic} = {}; $xtree{features}->{content} = "\n"; - $xtree{devices}->{disk} = build_diskstruct($cdloc); + ($xtree{devices}->{disk}, my $errstr) = build_diskstruct($cdloc); + if ($errstr) { + return (-1, $errstr); + } $xtree{devices}->{interface} = build_nicstruct($node); #use content to force xml simple to not make model the 'name' of video @@ -1328,6 +1331,7 @@ sub makedom { my $cdloc = shift; my $xml = shift; my $dom; + my $errstr; if (not $xml and $confdata->{kvmnodedata}->{$node} and $confdata->{kvmnodedata}->{$node}->[0] and $confdata->{kvmnodedata}->{$node}->[0]->{xml}) { #we do this to trigger storage prereq fixup @@ -1357,7 +1361,10 @@ sub makedom { $xml = $newxml; } } elsif (not $xml) { - $xml = build_xmldesc($node, cd => $cdloc); + ($xml, $errstr) = build_xmldesc($node, cd => $cdloc); + if ($errstr) { + return (1, $errstr); + } } my $parseddom = $parser->parse_string($xml); my ($graphics) = $parseddom->findnodes("//graphics"); @@ -1368,7 +1375,6 @@ sub makedom { } $graphics->setAttribute("listen", '0.0.0.0'); $xml = $parseddom->toString(); - my $errstr; eval { if ($::XCATSITEVALS{persistkvmguests}) { $dom = $hypconn->define_domain($xml); @@ -2040,7 +2046,9 @@ sub chvm { die "TODO: relative paths, use client cwd as hint?"; } } - unless ($cdpath) { die "unable to understand cd path specification"; } + unless ($cdpath) { + die "unable to understand cd path specification"; + } $newcdxml = ""; } elsif ($eject) { $newcdxml = ""; @@ -2898,6 +2906,7 @@ sub mkvm { require Getopt::Long; my $memory; my $cpucount; + my $errstr; GetOptions( 'master|m=s' => \$mastername, 'size|s=s' => \$disksize, @@ -2935,7 +2944,12 @@ sub mkvm { unless ($confdata->{kvmnodedata}->{$node} and $confdata->{kvmnodedata}->{$node}->[0] and $confdata->{kvmnodedata}->{$node}->[0]->{xml}) { my $xml; - $xml = build_xmldesc($node, cpus => $cpucount, memory => $memory); + ($xml, $errstr) = build_xmldesc($node, cpus => $cpucount, memory => $memory); + if ($errstr) { + # The caller splits the error message on ":", prepend ":" so that if actual + # error message contains ":" it will not be split in the middle + return (1, ":" . $errstr); + } $updatetable->{kvm_nodedata}->{$node}->{xml} = $xml; } } @@ -2943,7 +2957,12 @@ sub mkvm { if ($confdata->{kvmnodedata}->{$node} and $confdata->{kvmnodedata}->{$node}->[0] and $confdata->{kvmnodedata}->{$node}->[0]->{xml}) { $xml = $confdata->{kvmnodedata}->{$node}->[0]->{xml}; } else { # ($confdata->{kvmnodedata}->{$node} and $confdata->{kvmnodedata}->{$node}->[0] and $confdata->{kvmnodedata}->{$node}->[0]->{xml}) { - $xml = build_xmldesc($node, cpus => $cpucount, memory => $memory); + ($xml, $errstr) = build_xmldesc($node, cpus => $cpucount, memory => $memory); + if ($errstr) { + # The caller splits the error message on ":", prepend ":" so that if actual + # error message contains ":" it will not be split in the middle + return (1, ":" . $errstr); + } $updatetable->{kvm_nodedata}->{$node}->{xml} = $xml; } if ($::XCATSITEVALS{persistkvmguests}) {