-Pull in all known guest related images as disks

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6652 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
jbjohnso 2010-07-06 14:51:19 +00:00
parent aa22a37e49
commit 903a7d3d3d

View File

@ -139,14 +139,28 @@ sub get_storage_pool_by_url {
return $poolobj;
}
sub get_filepath_by_url { #sadly, libvirt has opted for the 'enterprisey' way like another vendor
#and provided an api to overcomplicate a straightforward request
#using it to appease those who are anti-ssh
#sshing in and checkning mount ourselves would be more
#robust, flexible, and easier, but oh well
#wouldn't be as bad if it weren't for the fact that it also has to be
#micromanaged.. I.e. the meat of the issue (mountpints/filenames) still must
#be resolved, but we also are having to deal with an extra level of info
sub get_multiple_paths_by_url {
my %args =@_;
my $url = $args{url};
my $node = $args{node};
my $poolobj = get_storage_pool_by_url($url);
unless ($poolobj) { die "Cound not get storage pool for $url"; }
my @volobjs = $poolobj->list_volumes();
my %paths;
foreach (@volobjs) {
if ($_->get_name() =~ /^$node\.(.*)$/) {
$paths{$_->get_path()} = $1;
}
}
return \%paths;
}
sub get_filepath_by_url { #at the end of the day, the libvirt storage api gives the following capability:
#mount, limited ls, and qemu-img
#it does not frontend mkdir, and does not abstract away any nitty-gritty detail, you must know:
#the real mountpoint, and the real full path to storage
#in addition to this, subdirectories are not allowed, and certain extra metadata must be created
#not a big fan compared to ssh and run the commands myself, but it's the most straightforward path
#to avoid ssh for users who dislike that style access
my %args = @_;
my $url = $args{url};
my $dev = $args{dev};
@ -282,10 +296,28 @@ sub build_diskstruct {
$diskhash->{type}='block';
$diskhash->{source}->{dev} = substr($disk_parts[0], 4);
} elsif ($disk_parts[0] =~ m/^nfs:\/\/(.*)$/) {
$diskhash->{source}->{file} = get_filepath_by_url(url=>$disk_parts[0],dev=>$diskhash->{target}->{dev}); #"/var/lib/xcat/vmnt/nfs_".$1."/$node/".$diskhash->{target}->{dev};
unless ($diskhash->{source}->{file}) {
die "Unable to find ".$diskhash->{target}->{dev}." at ".$disk_parts[0];
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];
}
foreach (keys %disks) {
my $tdiskhash;
$tdiskhash->{type};
$tdiskhash->{device}='disk';
$tdiskhash->{source}->{file}=$_;
$tdiskhash->{target}->{dev} = $disks{$_};
if ($disks{$_} =~ /^vd/) {
$tdiskhash->{target}->{bus} = 'virtio';
} elsif ($disks{$_} =~ /^hd/) {
$tdiskhash->{target}->{bus} = 'ide';
} elsif ($disks{$_} =~ /^sd/) {
$tdiskhash->{target}->{bus} = 'scsi';
}
push @returns,$tdiskhash;
}
next; #nfs:// skips the other stuff
#$diskhash->{source}->{file} = get_filepath_by_url(url=>$disk_parts[0],dev=>$diskhash->{target}->{dev}); #"/var/lib/xcat/vmnt/nfs_".$1."/$node/".$diskhash->{target}->{dev};
} else {
$diskhash->{source}->{file} = $disk_parts[0];
}