195 lines
4.4 KiB
Perl
195 lines
4.4 KiB
Perl
|
# IBM(c) 2010 EPL license http://www.eclipse.org/legal/epl-v10.html
|
||
|
package xCAT_plugin::cloud;
|
||
|
BEGIN
|
||
|
{
|
||
|
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
|
||
|
}
|
||
|
use lib "$::XCATROOT/lib/perl";
|
||
|
|
||
|
use strict;
|
||
|
use xCAT::Table;
|
||
|
use Getopt::Long;
|
||
|
Getopt::Long::Configure("bundling");
|
||
|
Getopt::Long::Configure("pass_through");
|
||
|
#use xCAT::Utils;
|
||
|
#use xCAT::TableUtils;
|
||
|
use xCAT::Template;
|
||
|
|
||
|
|
||
|
|
||
|
sub handled_commands
|
||
|
{
|
||
|
return {makeclouddata => "cloud",};
|
||
|
}
|
||
|
|
||
|
############################################################
|
||
|
# check_options will process the options for makeclouddata and
|
||
|
# give a usage error for any invalid options
|
||
|
############################################################
|
||
|
sub check_options
|
||
|
{
|
||
|
my $req = shift;
|
||
|
my $callback = shift;
|
||
|
my $rc = 0;
|
||
|
|
||
|
Getopt::Long::Configure("bundling");
|
||
|
$Getopt::Long::ignorecase = 0;
|
||
|
Getopt::Long::Configure("no_pass_through");
|
||
|
|
||
|
# Exit if the packet has been preprocessed
|
||
|
if ($req->{_xcatpreprocessed}->[0] == 1) { return [$req]; }
|
||
|
|
||
|
# Save the arguements in ARGV for GetOptions
|
||
|
if ($req && $req->{arg}) { @ARGV = @{$req->{arg}}; }
|
||
|
else { @ARGV = (); }
|
||
|
|
||
|
|
||
|
# Parse the options for makedhcp
|
||
|
if (!GetOptions(
|
||
|
'h|help' => \$::opt_h,
|
||
|
))
|
||
|
{
|
||
|
# If the arguements do not pass GetOptions then issue error message and return
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
# display the usage if -h
|
||
|
if ($::opt_h)
|
||
|
{
|
||
|
return 1;
|
||
|
|
||
|
}
|
||
|
|
||
|
my $cloudlist =shift( @ARGV );
|
||
|
|
||
|
if( defined($cloudlist) ) {
|
||
|
my @clouds = split(",", $cloudlist);
|
||
|
$req->{clouds} = \@clouds;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
sub cloudvars {
|
||
|
|
||
|
my $inf = shift;
|
||
|
my $outf = shift;
|
||
|
my $cloud = shift;
|
||
|
my $callback = shift;
|
||
|
my $outh;
|
||
|
my $inh;
|
||
|
open($inh,"<",$inf);
|
||
|
unless ($inh) {
|
||
|
my $rsp;
|
||
|
$rsp->{errorcode}->[0]=1;
|
||
|
$rsp->{error}->[0]="Unable to open $inf, aborting\n";
|
||
|
$callback->($rsp);
|
||
|
return;
|
||
|
}
|
||
|
my $inc;
|
||
|
#First load input into memory..
|
||
|
while (<$inh>) {
|
||
|
$inc.=$_;
|
||
|
}
|
||
|
close($inh);
|
||
|
$inc =~ s/\$CLOUD/$cloud/eg;
|
||
|
$inc =~ s/#TABLE:([^:]+):([^:]+):([^#]+)#/xCAT::Template::tabdb($1,$2,$3)/eg;
|
||
|
|
||
|
open($outh,">",$outf);
|
||
|
unless($outh) {
|
||
|
my $rsp;
|
||
|
$rsp->{errorcode}->[0]=1;
|
||
|
$rsp->{error}->[0]="Unable to open $inf, aborting\n";
|
||
|
$callback->($rsp);
|
||
|
return;
|
||
|
}
|
||
|
print $outh $inc;
|
||
|
close($outh);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
sub process_request
|
||
|
{
|
||
|
my $req = shift;
|
||
|
my $callback = shift;
|
||
|
my $rc = 0;
|
||
|
|
||
|
# define usage statement
|
||
|
my $usage="Usage: \n\tmkcloudata\n\tmakeclouddata <cloudname>\n\tmakeclouddata [-h|--help]";
|
||
|
|
||
|
$rc = check_options($req,$callback);
|
||
|
if ($rc == -1) {
|
||
|
my $rsp = {};
|
||
|
$rsp->{data}->[0] = $usage;
|
||
|
xCAT::MsgUtils->message("E", $rsp, $callback, 1);
|
||
|
return;
|
||
|
} elsif ($rc == 1) {
|
||
|
my $rsp = {};
|
||
|
$rsp->{data}->[0] = $usage;
|
||
|
xCAT::MsgUtils->message("I", $rsp, $callback, 0);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
my $tab = "clouds";
|
||
|
my $ptab = xCAT::Table->new("$tab");
|
||
|
|
||
|
unless ($ptab) {
|
||
|
my $rsp;
|
||
|
$rsp->{errorcode}->[0]=1;
|
||
|
$rsp->{error}->[0]="Unable to open $tab table";
|
||
|
$callback->($rsp);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
my $t = $req->{clouds};
|
||
|
my %h;
|
||
|
if( defined(@$t) ) {
|
||
|
%h = map { $_ => 1} @$t;
|
||
|
}
|
||
|
|
||
|
my @cloudentries = $ptab->getAllAttribs('name', 'template', 'repository');
|
||
|
|
||
|
foreach my $cloudentry (@cloudentries) {
|
||
|
|
||
|
my $cloud = $cloudentry->{name};
|
||
|
if( %h ) {
|
||
|
# if makeclouddata <cloudA>, and
|
||
|
if( $h{$cloud} != 1) {
|
||
|
next;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
my $tmplfile = $cloudentry->{template};
|
||
|
my $repos = $cloudentry->{repository};
|
||
|
|
||
|
unless ( -r "$tmplfile") {
|
||
|
my $rsp;
|
||
|
$rsp->{errorcode}->[0]=1;
|
||
|
$rsp->{error}->[0]="The $cloud environment template $tmplfile doesn't exist.";
|
||
|
$callback->($rsp);
|
||
|
next;
|
||
|
}
|
||
|
|
||
|
unless ( -r "$repos") {
|
||
|
my $rsp;
|
||
|
$rsp->{errorcode}->[0]=1;
|
||
|
$rsp->{error}->[0]="The $cloud repository $repos doesn't exist.";
|
||
|
$callback->($rsp);
|
||
|
next;
|
||
|
}
|
||
|
|
||
|
my $tmperr = cloudvars(
|
||
|
$tmplfile,
|
||
|
"$repos/environments/$cloud.rb",
|
||
|
$cloud,
|
||
|
$callback
|
||
|
);
|
||
|
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
1;
|