package Cisco::UCS::ServiceProfile;

use warnings;
use strict;

use Carp 		qw(croak);
use Scalar::Util 	qw(weaken);

our $VERSION = '0.11';

our @ATTRIBUTES	= qw(dn name owner pnDn type uuid);

our %ATTRIBUTES = (
                 agent_policy_name              => 'agentPolicyName',
                 assign_state                   => 'assignState',
                 assoc_state                    => 'assocState',
                 bios_profile_name              => 'biosProfileName',
                 boot_policy_name               => 'bootPolicyName',
                 config_state                   => 'configState',
                 desc                           => 'descr',
                 dynamic_conn_policy_name       => 'dynamicConPolicyName',
                 ext_ip_state                   => 'extIPState',
                 fsm_remote_inv_err_code        => 'fsmRmtInvErrCode',
                 fsm_timestamp                  => 'fsmStamp',
                 fsm_desc                       => 'fsmDescr',
                 fsm_flags                      => 'fsmFlags',
                 fsm_previous_state             => 'fsmPrev',
                 fsm_progress                   => 'fsmProgr',
                 fsm_remote_inv_err_desc	=> 'fsmRmtInvErrDescr',
                 fsm_stage_desc                 => 'fsmStageDescr',
                 fsm_status                     => 'fsmStatus',
                 fsm_try                        => 'fsmTry',
                 host_fw_policy_name            => 'hostFwPolicyName',
                 ident_pool_name                => 'identPoolName',
                 local_disk_policy_name         => 'localDiskPolicyName',
                 maint_policy_name              => 'maintPolicyName',
                 mgmt_access_policy_name        => 'mgmtAccessPolicyName',
                 mgmt_firmware_policy_name      => 'mgmtFwPolicyName',
                 oper_bios_profile_name         => 'operBiosProfileName',
                 oper_boot_policy_name          => 'operBootPolicyName',
                 oper_dynamic_conn_policy_name  => 'operDynamicConPolicyName',
                 oper_host_fw_policy_name       => 'operHostFwPolicyName',
                 oper_ident_pool_name           => 'operIdentPoolName',
                 oper_local_disk_policy_name    => 'operLocalDiskPolicyName',
                 oper_maint_policy_name         => 'operMaintPolicyName',
                 oper_mgmt_access_policy_name   => 'operMgmtAccessPolicyName',
                 oper_mgmt_fw_policy_name       => 'operMgmtFwPolicyName',
                 oper_power_policy_name         => 'operPowerPolicyName',
                 oper_scrub_policy_name         => 'operScrubPolicyName',
                 oper_sol_policy_name           => 'operSolPolicyName',
                 oper_src_template_name         => 'operSrcTemplName',
                 oper_state                     => 'operState',
                 oper_stats_policy_name         => 'operStatsPolicyName',
                 oper_vcon_profile_name         => 'operVconProfileName',
                 power_policy_name              => 'powerPolicyName',
                 scrub_policy_name              => 'scrubPolicyName',
                 sol_policy_name                => 'solPolicyName',
                 source_template_name           => 'srcTemplName',
                 stats_policy_name              => 'statsPolicyName',
                 user_label                     => 'usrLbl',
                 uuid_suffix                    => 'uuidSuffix',
                 vcon_profile_name              => 'vconProfileName'
		);

=head1 NAME

Cisco::UCS::ServiceProfile - Class for operations with a Cisco UCS Service Profile.

=cut

=head1 SYNOPSIS

	my $profile = $ucs->service_profile('profile-1');
	print "Profile " . $profile->name . " is bound to physical DN " . $profile->pnDn . "\n";

	print $ucs->service_profile('profile-2')->uuid;

=head1 DECRIPTION

Cisco::UCS::ServiceProfile is a class providing operations with a Cisco UCS Service Profile.

Note that you are not supposed to call the constructor yourself, rather a Cisco::UCS::ServiceProfile 
object is created automatically by method calls via methods in Cisco::UCS.

=cut

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 'dn not defined';
	my %attr = %{$self->{ucs}->resolve_dn(dn => $self->{dn})->{outConfig}->{lsServer}};
	
	while (my ($k, $v) = each %attr) { $self->{$k} = $v }

	return $self
}

{
        no strict 'refs';

        while ( my ($pseudo, $attribute) = each %ATTRIBUTES ) { 
                *{ __PACKAGE__ . '::' . $pseudo } = sub {
                        my $self = shift;
                        return $self->{$attribute}
                }   
        }   

        foreach my $attribute (@ATTRIBUTES) {
                *{ __PACKAGE__ . '::' . $attribute } = sub {
                        my $self = shift;
                        return $self->{$attribute}
                }   
        }   
}

=head1 METHODS

=head3 agent_policy_name

Returns the agent policy name.

=head3 assign_state

Returns the assignment state of the service profile.

=head3 assoc_state

Returns the association state of the service profile.

=head3 bios_profile_name

Returns the BIOS profile name of the service profile.

=head3 boot_policy_name

Returns the boot policy name of the service profile.

=head3 config_state

Returns the configuration state of the service profile.

=head3 desc

Returns the user-specified description of the service profile.

=head3 dn

Returns the distinguished name of the service profile in the UCS management information
heirarchy.

=head3 dynamic_conn_policy_name

Returns the dynamic connection policy name of the service profile.

=head3 ext_ip_state

Returns the external IP state of the service profile.

=head3 fsm_timestamp

Returns the timestamp of the most recent FSM transition.

=head3 fsm_desc

Returns a description of the FSM current state.

=head3 fsm_flags

Returns the FSM flags.

=head3 fsm_previous_state

Returns the previous state of the FSM prior to the last transition.

=head3 fsm_progress

Returns the current progress (given as a percentage) of the current progress
of the FSM through the current state.

=head3 fsm_remote_inv_err_code

Returns the FSM (finite state machine) remote invocation error code.

=head3 fsm_remote_inv_err_desc

Returns a description of the FSM remote invocation error state.

=head3 fsm_stage_desc

Returns a description of the current FSM stage.

=head3 fsm_status

Returns the current FSM status.

=head3 fsm_try

Returns the number of attempts for the current FSM stage transition.

=head3 host_fw_policy_name

Returns the host firmware policy name for the service profile.

=head3 ident_pool_name

Returns the pool name from which the UUID for the service profile is derived.

=head3 local_disk_policy_name

Returns the local disk policy name for the service profile.

=head3 maint_policy_name

Returns the maintenance policy name for the service profile.

=head3 mgmt_access_policy_name

Returns the management access policy name for the service profile.

=head3 mgmt_firmware_policy_name

Returns the management firmware policy name for the service profile.

=head3 name

Returns the user defined name of the service profile.

=head3 oper_bios_profile_name

Returns the operational BIOS profile name for the service profile.

=head3 oper_boot_policy_name

Returns the operational boot policy name for the service profile.

=head3 oper_dynamic_conn_policy_name

Returns the operational dynamic connection policy name for the service profile.

=head3 oper_host_fw_policy_name

Returns the operational firmware policy name for the service profile.

=head3 oper_ident_pool_name

Returns the operational identifier pool name for the service profile.

=head3 oper_local_disk_policy_name

Returns the operational local disk policy name for the service profile.

=head3 oper_maint_policy_name

Returns the operational maintenance policy name for the service profile.

=head3 oper_mgmt_access_policy_name

Returns the operational management access policy name for the service profile.

=head3 oper_mgmt_fw_policy_name

Returns the operational management firmware policy name for the service profile.

=head3 oper_power_policy_name

Returns the operational power policy name for the service profile.

=head3 oper_scrub_policy_name

Returns the operational scrub policy name for the service profile.

=head3 oper_sol_policy_name

Returns the operational SOL policy name for the service profile.

=head3 oper_src_template_name

Returns the operational source template name for the service profile.

=head3 oper_state

Returns the operational state of the service profile.

=head3 oper_stats_policy_name

Returns the operational statictics policy name for the service profile.

=head3 oper_vcon_profile_name

Returns the operational virtual connection profile name for the service profile.

=head3 owner

Returns the user-defined owner of the service profile.

=head3 pnDn

Returns the peer DN (distinguished name) of the blade to which this
service profile is associated.

=head3 power_policy_name

returns the operational power policy name for the service profile.

=head3 scrub_policy_name

Returns the scrub policy name for the service profile.

=head3 sol_policy_name

Returns the SOL policy name for the service profile.

=head3 source_template_name

Returns the source service profile template name for the service profile.

=head3 stats_policy_name

Returns the statistics policy name for the service profile.

=head3 type

Returns the type of the service profile - for service profiles this will return the
string of 'instance', for service profile templates this will return the string 'template'.

=head3 user_label

Returns the user defined label for the service profile.

=head3 uuid

Returns the UUID (Universally Unique Identifier) of the service profile.

=head3 uuid_suffix

Returns the UUID suffix for the service profile.

=head3 vcon_profile_name

Returns the virtual connection policy name for the service profile.


=head1 AUTHOR

Luke Poskitt, C<< <ltp at cpan.org> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-cisco-ucs-serviceprofile at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Cisco-UCS-ServiceProfile>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.

=head1 TO DO

This module barely scratches the surface in terms of available service profile information.
Future versions will provide access to virtual interface configuration and statistics and
environmental statictics.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc Cisco::UCS::ServiceProfile


You can also look for information at:

=over 4

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Cisco-UCS-ServiceProfile>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/Cisco-UCS-ServiceProfile>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/Cisco-UCS-ServiceProfile>

=item * Search CPAN

L<http://search.cpan.org/dist/Cisco-UCS-ServiceProfile/>

=back


=head1 ACKNOWLEDGEMENTS


=head1 LICENSE AND COPYRIGHT

Copyright 2012 Luke Poskitt.

This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.


=cut

1;
