File Coverage

lib/Rex/Group.pm
Criterion Covered Total %
statement 74 77 96.1
branch 8 12 66.6
condition 5 9 55.5
subroutine 17 17 100.0
pod 0 9 0.0
total 104 124 83.8


line stmt bran cond sub pod time code
1             #
2             # (c) Jan Gehring
3             #
4              
5             package Rex::Group;
6              
7 58     58   70904 use v5.12.5;
  58         238  
8 58     58   307 use warnings;
  58         112  
  58         2774  
9              
10             our $VERSION = '1.14.2.3'; # TRIAL VERSION
11              
12 58     58   808 use Rex::Logger;
  58         168  
  58         473  
13              
14 58     58   2839 use attributes;
  58         21961  
  58         884  
15 58     58   3895 use Rex::Group::Entry::Server;
  58         157  
  58         438  
16              
17 58     58   2144 use vars qw(%groups);
  58         585  
  58         3451  
18 58     58   359 use List::Util 1.45 qw(uniq);
  58         950  
  58         3431  
19 58     58   362 use Data::Dumper;
  58         123  
  58         42383  
20              
21             sub new {
22 16     16 0 29 my $that = shift;
23 16   33     63 my $proto = ref($that) || $that;
24 16         46 my $self = {@_};
25              
26 16         32 bless( $self, $proto );
27 16         24 for my $srv ( @{ $self->{servers} } ) {
  16         51  
28 36         98 $srv->append_to_group( $self->{name} );
29             }
30              
31 16         81 return $self;
32             }
33              
34             sub get_servers {
35 23     23 0 43 my ($self) = @_;
36              
37 46 50       120 my @servers = map { ref( $_->to_s ) eq "CODE" ? &{ $_->to_s } : $_ }
  0         0  
38 23         32 @{ $self->{servers} };
  23         55  
39              
40 23         157 return uniq @servers;
41             }
42              
43             sub set_auth {
44 3     3 0 21 my ( $self, %data ) = @_;
45 3         10 $self->{auth} = \%data;
46              
47 3         10 map { $_->set_auth( %{ $self->get_auth } ) } $self->get_servers;
  3         6  
  3         11  
48             }
49              
50             sub get_auth {
51 3     3 0 5 my ($self) = @_;
52 3         15 return $self->{auth};
53             }
54              
55             ################################################################################
56             # STATIC FUNCTIONS
57             ################################################################################
58              
59             # Creates a new server group
60             # Possible calls:
61             # create_group(name => "g1", "srv1", "srv2");
62             # create_group(name => "g1", Rex::Group::Entry::Server->new(name => "srv1"), "srv2");
63             # create_group(name => "g1", "srv1" => { user => "other" }, "srv2");
64             sub create_group {
65 16     16 0 33 my $class = shift;
66 16         31 my $group_name = shift;
67 16         34 my @server = uniq grep { defined } @_;
  37         120  
68              
69 16         37 my @server_obj;
70 16         52 for ( my $i = 0 ; $i <= $#server ; $i++ ) {
71 36 50       80 next if ref $server[$i] eq 'HASH'; # already processed by previous loop
72              
73             # if argument is already a Rex::Group::Entry::Server
74 36 100 66     136 if ( ref $server[$i] && $server[$i]->isa("Rex::Group::Entry::Server") ) {
75 25         39 push @server_obj, $server[$i];
76 25         50 next;
77             }
78              
79             # if next argument is a HashRef, use it as options for the server
80             my %options =
81             ( $i < $#server and ref $server[ $i + 1 ] eq 'HASH' )
82 11 50 66     57 ? %{ $server[ $i + 1 ] }
  0         0  
83             : ();
84              
85 11         54 my $obj = Rex::Group::Entry::Server->new( name => $server[$i], %options );
86 11         50 push @server_obj, $obj;
87             }
88              
89 16         63 $groups{$group_name} =
90             Rex::Group->new( servers => \@server_obj, name => $group_name );
91             }
92              
93             # returns the servers in the group
94             sub get_group {
95 11     11 0 362 my $class = shift;
96 11         18 my $group_name = shift;
97              
98 11 50       30 if ( exists $groups{$group_name} ) {
99 11         35 return $groups{$group_name}->get_servers;
100             }
101              
102 0         0 return ();
103             }
104              
105             sub is_group {
106 8     8 0 17 my $class = shift;
107 8         12 my $group_name = shift;
108              
109 8 100       26 if ( defined $groups{$group_name} ) { return 1; }
  7         31  
110 1         4 return 0;
111             }
112              
113             sub get_groups {
114 1     1 0 14 my $class = shift;
115 1         3 my %ret = ();
116              
117 1         4 for my $key ( keys %groups ) {
118 9         20 $ret{$key} = [ $groups{$key}->get_servers ];
119             }
120              
121 1         9 return %ret;
122             }
123              
124             sub get_group_object {
125 6     6 0 15 my $class = shift;
126 6         11 my $name = shift;
127              
128 6         22 return $groups{$name};
129             }
130              
131             1;