169 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
# IBM(c) 2013 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
						|
package xCAT::Cloud;
 | 
						|
 | 
						|
BEGIN
 | 
						|
{
 | 
						|
    $::XCATROOT =
 | 
						|
        $ENV{'XCATROOT'} ? $ENV{'XCATROOT'}
 | 
						|
      : -d '/opt/xcat'   ? '/opt/xcat'
 | 
						|
      : '/usr';
 | 
						|
}
 | 
						|
use lib "$::XCATROOT/lib/perl";
 | 
						|
use xCAT::Table;
 | 
						|
use xCAT::MsgUtils;
 | 
						|
use xCAT::NodeRange;
 | 
						|
use xCAT::Utils;
 | 
						|
use xCAT::TableUtils;
 | 
						|
#use Data::Dumper;
 | 
						|
use strict;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head3 getcloudinfo 
 | 
						|
 | 
						|
   This function will be invoked by Postage.pm.  
 | 
						|
   get the chef cookbook repository for each cloud from the clouds table, and 
 | 
						|
   then get all the node --> cloud from the cloud table. The two type information
 | 
						|
   will be stored in the %info
 | 
						|
 | 
						|
   If success, return the \%info.
 | 
						|
	
 | 
						|
 | 
						|
    Arguments:
 | 
						|
         none
 | 
						|
    Returns: 
 | 
						|
           \%info
 | 
						|
                        
 | 
						|
    Error:
 | 
						|
        none
 | 
						|
    Example:
 | 
						|
         
 | 
						|
    Comments:
 | 
						|
        none
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
sub getcloudinfo
 | 
						|
{
 | 
						|
    my %info = ();
 | 
						|
 | 
						|
    my $tab = "clouds";
 | 
						|
    my $ptab = xCAT::Table->new($tab);
 | 
						|
    unless ($ptab) { 
 | 
						|
        xCAT::MsgUtils->message("E", "Unable to open $tab table");
 | 
						|
        return undef; 
 | 
						|
    }
 | 
						|
    my @rs = $ptab->getAllAttribs('name','repository', 'pubinterface');
 | 
						|
 | 
						|
    foreach my $r ( @rs ) {
 | 
						|
       my $cloud = $r->{'name'};
 | 
						|
       my $repos = $r->{'repository'};
 | 
						|
       my $pubinterface = $r->{'pubinterface'};
 | 
						|
       $info{ $cloud }{repository}  = $repos; 
 | 
						|
       $info{ $cloud }{pubinterface}  = $pubinterface; 
 | 
						|
    }
 | 
						|
 | 
						|
    $tab = "cloud";
 | 
						|
    $ptab = xCAT::Table->new($tab);
 | 
						|
    unless ($ptab) { 
 | 
						|
        xCAT::MsgUtils->message("E", "Unable to open $tab table");
 | 
						|
        return undef;
 | 
						|
    }
 | 
						|
    @rs = $ptab->getAllAttribs('node','cloudname');
 | 
						|
 | 
						|
    my $pre;
 | 
						|
    my $curr;
 | 
						|
    foreach my $r ( @rs ) {
 | 
						|
       my $node = $r->{'node'};
 | 
						|
       my $cloud = $r->{'cloudname'};
 | 
						|
       $info{ $node }{cloud}  = $cloud;
 | 
						|
    }
 | 
						|
   
 | 
						|
    return \%info;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
} 
 | 
						|
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head3 getcloudres 
 | 
						|
 | 
						|
   This function will be invoked by Postage.pm. And it's only for one chef-server. 
 | 
						|
   1. get the chef cookbook repository for the clouds on one chef-server. 
 | 
						|
   All the clouds's repositoryies on one chef-server should be the same one.
 | 
						|
   2. get the cloud list for one chef-server
 | 
						|
   3. get the cloud name for each node on the same chef-server
 | 
						|
	
 | 
						|
 | 
						|
    Arguments:
 | 
						|
         $cloudinfo_hash -- This is from the getcloudinfo function.
 | 
						|
         $clients -- an array which stores different cloud nodes(chef-client)
 | 
						|
    Returns: 
 | 
						|
          $cloudres -- a string including cloud information
 | 
						|
                        
 | 
						|
    Error:
 | 
						|
        none
 | 
						|
    Example:
 | 
						|
         
 | 
						|
    Comments:
 | 
						|
        none
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
 | 
						|
 | 
						|
sub getcloudres
 | 
						|
{
 | 
						|
    my $cloudinfo_hash = shift;
 | 
						|
    my $node = shift;
 | 
						|
    my $clients = shift;  
 | 
						|
    my $cloudres;
 | 
						|
    my $cloudlist;
 | 
						|
    my $repos;
 | 
						|
    if( @$clients == 0 ) {
 | 
						|
        #This should not be a chef-server, and it's a chef-client
 | 
						|
        if( defined($cloudinfo_hash) && defined($cloudinfo_hash->{$node}) ) {
 | 
						|
            my $cloud=$cloudinfo_hash->{$node}->{cloud};
 | 
						|
            my $pubinterface=$cloudinfo_hash->{$cloud}->{pubinterface};
 | 
						|
            $cloudres="PUBINTERFACE='$pubinterface'\nexport PUBINTERFACE\n"; 
 | 
						|
        }
 | 
						|
        return $cloudres;
 | 
						|
    }
 | 
						|
    foreach my $client (@$clients) {
 | 
						|
        my $cloud;
 | 
						|
        if( defined($cloudinfo_hash) && defined($cloudinfo_hash->{$client}) ) {
 | 
						|
            $cloud = $cloudinfo_hash->{$client}->{cloud};
 | 
						|
        }
 | 
						|
        #$cloudres .= "hput $client cloud $cloud\n";
 | 
						|
        $cloudres .= "HASH".$client."cloud='$cloud'\nexport HASH".$client."cloud\n";
 | 
						|
        if( defined($cloud) ) {
 | 
						|
            if ( $cloudlist !~ $cloud ) {
 | 
						|
                $cloudlist .="$cloud,";
 | 
						|
            }
 | 
						|
        }
 | 
						|
        my $t = $cloudinfo_hash->{$cloud}->{repository};
 | 
						|
        if( !defined($repos) && defined($t) ) {
 | 
						|
            $repos =  $t;
 | 
						|
        }
 | 
						|
        if( defined($repos) && ( $repos != $t && "$repos/" != $t && $repos != "$t/" ) ) {
 | 
						|
            xCAT::MsgUtils->message("E", "Two cloud repositories: $repos and $t.\n There should be only one cloud repository one ont chef-server.");
 | 
						|
            return undef; 
 | 
						|
        }
 | 
						|
    }
 | 
						|
    chop $cloudlist;
 | 
						|
    $cloudres = "REPOSITORY='$repos'\nexport REPOSITORY\nCLOUDLIST='$cloudlist'\nexport CLOUDLIST\n$cloudres";
 | 
						|
    return $cloudres;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
1;
 |