Cisco-UCS

 view release on metacpan or  search on metacpan

lib/Cisco/UCS/Interconnect.pm  view on Meta::CPAN

package Cisco::UCS::Interconnect;

use warnings;
use strict;

use Cisco::UCS::Common::SwitchCard;
use Cisco::UCS::Common::PSU;
use Cisco::UCS::Common::Fan;
use Cisco::UCS::Interconnect::Stats;
use Scalar::Util qw(weaken);
use Carp qw(croak);

our $VERSION = '0.51';

our @ATTRIBUTES	= qw(dn id model operability serial vendor);

our %ATTRIBUTES = (
	memory		=> 'totalMemory',
	mgmt_ip		=> 'oobIfIp',
	mgmt_gw		=> 'oobIfGw',
	mgmt_net	=> 'oobIfMask',
);

my %MMAP = (	
	card	=> {
			type	=> 'equipmentSwitchCard',
			class	=> 'Cisco::UCS::Common::SwitchCard', 
		   },
	fan	=> {
			type	=> 'equipmentFan',
			class	=> 'Cisco::UCS::Common::Fan'
		   },
	psu	=> {
			type	=> 'equipmentPsu',
			class	=> 'Cisco::UCS::Common::PSU'
		   },
);

sub new {
	my ( $class, %args ) = @_;

	my $self = {};
	bless $self, $class;

	defined $args{dn}
		? $self->{dn} = $args{dn}
		: croak 'dn not defined';

	defined $args{ucs}
		? weaken( $self->{ucs} = $args{ucs} )
		: croak 'ucs not defined';

	my %attr = %{ $self->{ucs}->resolve_dn( 
				dn => $self->{dn} 
			)->{outConfig}->{networkElement} };

	while ( my( $k, $v ) = each %attr ) { $self->{$k} = $v }

	my ($v) = $self->{ucs}->version =~ /\((.*)\)/;

	$MMAP{fan}{type} = 'equipmentFanModule' if( $v =~ /^4/);

        return $self;
}

{
	no strict 'refs';

	while ( my( $pseudo, $attribute ) = each %ATTRIBUTES ) { 
		*{ __PACKAGE__ .'::'. $pseudo } = sub { return $_[0]->{$attribute} } 
	}

        foreach my $attribute ( @ATTRIBUTES ) { 
		*{ __PACKAGE__ .'::'. $attribute } = sub { return $_[0]->{$attribute} } 
	}

	foreach my $m ( keys %MMAP ) {  # i.e. object
		my $gm 	= "get_$m";	# i.e. get_object
		my $gms	= "get_$m".'s'; # i.e. get_objects

		*{ __PACKAGE__ .'::'. $m } = sub { 
			my( $self, $id ) = @_; 

			return ( 
				defined $self->{$m}->{$id}
					? $self->{$m}->{$id}
					: $self->$gm( $id ) 
			) 
		};

		*{ __PACKAGE__ .'::'. $gm } = sub { 
			my( $self, $id ) = @_;

			return ( $id ? $self->$gms( $id ) : undef ) 
		};

		*{ __PACKAGE__ .'::'. $gms } = sub { 
			my( $self, $id ) = @_;

			return $self->{ucs}->_get_child_objects( 
					id	=> $id,
					type	=> $MMAP{$m}{type},
					class	=> $MMAP{$m}{class},
					attr	=> $m,
					self	=> $self,
					eattrs  => { interconnect_id => $self->{ id } }
			) 
		};
	}
}



( run in 0.835 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )