fixed export to export image name and added beginning portion of import function

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@5710 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
vallard 2010-04-08 01:40:57 +00:00
parent ee102eb5cf
commit 9b5d77caeb

View File

@ -68,8 +68,48 @@ sub process_request
}
}
# extract the bundle, then add it to the osimage table. Basically the ying of the yang of the xexport
# function.
sub ximport {
my $request = shift;
my $callback = shift;
my %rsp; # response
my $help;
# return sthe mount point to the requesting node.
my $xusage = sub {
my $ec = shift;
push@{ $rsp{data} }, "imgimport: Takes in an xCAT image bundle and defines it to xCAT so you can use it";
push@{ $rsp{data} }, "Usage: ";
push@{ $rsp{data} }, "\timgimport [-h|--help] - displays this help message";
push@{ $rsp{data} }, "\timgimport <image name> - imports image. Image should be an xCAT bundle";
if($ec){ $rsp{errorcode} = $ec; }
$callback->(\%rsp);
};
unless(defined($request->{arg})){ $xusage->(1); return; }
@ARGV = @{ $request->{arg}};
if($#ARGV eq -1){
$xusage->(1);
return;
}
GetOptions(
'h|?|help' => \$help,
);
if($help){
$xusage->(0);
return;
}
# first extract the bundle
extract_bundle($request, $callback);
}
# function to export your image. The image should already be in production, work well, and have
# no bugs. Lots of places will have problems because the image may not be in osimage table
# or they may have hardcoded things, or have post install scripts.
sub xexport {
my $request = shift;
my $callback = shift;
@ -119,6 +159,10 @@ sub xexport {
}
# verify the image and return the values
sub get_image_info {
my $imagename = shift;
@ -177,6 +221,7 @@ sub get_image_info {
}
}
$attrs->{imagename} = $imagename;
# if we get nothing back, then we couldn't find the files. How sad, return nuthin'
return $attrs;
@ -358,7 +403,7 @@ sub make_bundle {
# is bad. In the case of my development machine, the / filesystem was nearly full.
# so doing it in cwd is easy and predictable.
my $dir = getcwd;
my $ttpath = mkdtemp("$dir/export.$$.XXXXXX");
my $ttpath = mkdtemp("$dir/imgexport.$$.XXXXXX");
my $tpath = "$ttpath/$imagename";
mkdir("$tpath");
chmod 0755,$tpath;
@ -367,7 +412,7 @@ sub make_bundle {
# the idea at first though.
my $xml = new XML::Simple(RootName =>'xcatimage');
open(FILE,">$tpath/manifest.xml") or die "Could not open $tpath/manifest.xml";
print FILE $xml->XMLout($attribs, noattr => 1, xmldecl => '<?xml version="1.0">');
print FILE $xml->XMLout($attribs, noattr => 1, xmldecl => '<?xml version="1.0"?>');
#print $xml->XMLout($attribs, noattr => 1, xmldecl => '<?xml version="1.0">');
close(FILE);
@ -413,3 +458,171 @@ sub make_bundle {
return;
}
}
sub extract_bundle {
my $request = shift;
my $callback = shift;
@ARGV = @{ $request->{arg} };
my $xml;
my $data;
my $datas;
my $bundle = shift @ARGV;
# extract the image in temp path in cwd
my $dir = getcwd;
my $tpath = mkdtemp("$dir/imgimport.$$.XXXXXX");
$callback->({data=>["Unbundling image..."],errorcode=>[1]});
my $rc = system("tar zxf $bundle -C $tpath");
if($rc){
$callback->({error => ["Failed to extract bundle $bundle"],errorcode=>[1]});
}
# get all the files in the tpath. These should be all the image names.
my @files = < $tpath/* >;
# go through each image directory. Find the XML and put it into the array. If there are any
# errors then the whole thing is over and we error and leave.
foreach my $imgdir (@files){
print "$imgdir \n";
unless(-r "$imgdir/manifest.xml"){
$callback->({error=>["Failed to find manifest.xml file in image bundle"],errorcode=>[1]});
return;
}
$xml = new XML::Simple;
# get the data!
# put it in an eval string so that it
$data = eval { $xml->XMLin("$imgdir/manifest.xml") };
if($@){
$callback->({error=>$@,errorcode=>[1]});
return;
}
print Dumper($data);
#push @{$datas}, $data;
# now we need to import the files...
unless(verify_manifest($data, $callback)){
next;
}
#print "manifest looks good, lets import!\n";
set_config($data, $callback);
# now place files in appropriate directories.
make_files($data, $callback);
}
}
sub set_config {
my $data = shift;
my $callback = shift;
my $ostab = xCAT::Table->new('osimage',-create => 1,-autocommit => 0);
my %keyhash;
my $osimage = $data->{imagename};
$callback->({data=>["Adding $osimage"],errorcode=>[1]});
# now we make a quick hash of what we want to put into this
$keyhash{provmethod} = $data->{provmethod};
$keyhash{profile} = $data->{profile};
$keyhash{osvers} = $data->{osvers};
$keyhash{osarch} = $data->{osarch};
$ostab->setAttribs({imagename => $osimage }, \%keyhash );
$ostab->commit;
}
sub verify_manifest {
my $data = shift;
my $callback = shift;
my $errors = 0;
# first make sure that the stuff is defined!
unless($data->{imagename}){
$callback->({error=>["The 'imagename' field is not defined in manifest.xml."],errorcode=>[1]});
$errors++;
}
unless($data->{provmethod}){
$callback->({error=>["The 'provmethod' field is not defined in manifest.xml."],errorcode=>[1]});
$errors++;
}
unless($data->{profile}){
$callback->({error=>["The 'profile' field is not defined in manifest.xml."],errorcode=>[1]});
$errors++;
}
unless($data->{osvers}){
$callback->({error=>["The 'osvers' field is not defined in manifest.xml."],errorcode=>[1]});
$errors++;
}
unless($data->{osarch}){
$callback->({error=>["The 'osarch' field is not defined in manifest.xml."],errorcode=>[1]});
$errors++;
}
unless($data->{provmethod} =~ /install|netboot|statelite/){
$callback->({error=>["Importing images with 'provemethod' " . $data->{provmethod} . " is not supported. Hint: install, netboot, or statelite"],errorcode=>[1]});
$errors++;
}
# if the install method is used, then we need to have certain files in place.
if($data->{provmethod} =~ /install/){
# we need to get the template for this one!
unless($data->{template}){
$callback->({error=>["The 'osarch' field is not defined in manifest.xml."],errorcode=>[1]});
$errors++;
}
#$attrs->{media} = "required"; (need to do something to verify media!
}elsif($data->{provmethod} =~ /netboot|statelite/){
unless($data->{ramdisk}){
$callback->({error=>["The 'ramdisk' field is not defined in manifest.xml."],errorcode=>[1]});
$errors++;
}
unless($data->{kernel}){
$callback->({error=>["The 'kernel' field is not defined in manifest.xml."],errorcode=>[1]});
$errors++;
}
unless($data->{rootimg}){
$callback->({error=>["The 'rootimg' field is not defined in manifest.xml."],errorcode=>[1]});
$errors++;
}
}
if($errors){
# we had problems, error and exit.
return 0;
}
# returning 1 means everything went good!
return 1;
}
sub make_files {
my $data = shift;
my $callback = shift;
my $os = $data->{osvers};
my $arch = $data->{osarch};
my $profile = $data->{profile};
if($data->{provmethod} =~ /install/){
my $template = $data->{template};
print "mkdir -p /install/custom/$os/$arch/$profile\n";
print "cp $template /install/netboot/$os/$arch/$profile\n";
}elsif($data->{provmethod} =~/netboot|statelite/){
print "mkdir -p /install/netboot/$os/$arch/$profile\n";
print "cp kernel /install/netboot/$os/$arch/$profile\n";
print "cp initrd.gz /install/netboot/$os/$arch/$profile\n";
print "cp rootimg.gz /install/netboot/$os/$arch/$profile\n";
}
if($data->{extra}){
# have to copy extras
print "copying extras...\n";
}
}