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   70544 use v5.12.5;
  58         198  
8 58     58   410 use warnings;
  58         130  
  58         2375  
9              
10             our $VERSION = '1.14.3'; # VERSION
11              
12 58     58   881 use Rex::Logger;
  58         172  
  58         387  
13              
14 58     58   2596 use attributes;
  58         20899  
  58         1027  
15 58     58   3929 use Rex::Group::Entry::Server;
  58         296  
  58         463  
16              
17 58     58   1863 use vars qw(%groups);
  58         152  
  58         3416  
18 58     58   334 use List::Util 1.45 qw(uniq);
  58         972  
  58         3362  
19 58     58   407 use Data::Dumper;
  58         117  
  58         41623  
20              
21             sub new {
22 16     16 0 30 my $that = shift;
23 16   33     61 my $proto = ref($that) || $that;
24 16         48 my $self = {@_};
25              
26 16         29 bless( $self, $proto );
27 16         27 for my $srv ( @{ $self->{servers} } ) {
  16         46  
28 36         101 $srv->append_to_group( $self->{name} );
29             }
30              
31 16         83 return $self;
32             }
33              
34             sub get_servers {
35 23     23 0 39 my ($self) = @_;
36              
37 46 50       112 my @servers = map { ref( $_->to_s ) eq "CODE" ? &{ $_->to_s } : $_ }
  0         0  
38 23         33 @{ $self->{servers} };
  23         65  
39              
40 23         145 return uniq @servers;
41             }
42              
43             sub set_auth {
44 3     3 0 20 my ( $self, %data ) = @_;
45 3         12 $self->{auth} = \%data;
46              
47 3         12 map { $_->set_auth( %{ $self->get_auth } ) } $self->get_servers;
  3         50  
  3         11  
48             }
49              
50             sub get_auth {
51 3     3 0 5 my ($self) = @_;
52 3         18 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 37 my $class = shift;
66 16         26 my $group_name = shift;
67 16         42 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       83 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     144 if ( ref $server[$i] && $server[$i]->isa("Rex::Group::Entry::Server") ) {
75 25         36 push @server_obj, $server[$i];
76 25         48 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     55 ? %{ $server[ $i + 1 ] }
  0         0  
83             : ();
84              
85 11         58 my $obj = Rex::Group::Entry::Server->new( name => $server[$i], %options );
86 11         41 push @server_obj, $obj;
87             }
88              
89 16         62 $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 360 my $class = shift;
96 11         19 my $group_name = shift;
97              
98 11 50       35 if ( exists $groups{$group_name} ) {
99 11         40 return $groups{$group_name}->get_servers;
100             }
101              
102 0         0 return ();
103             }
104              
105             sub is_group {
106 8     8 0 16 my $class = shift;
107 8         13 my $group_name = shift;
108              
109 8 100       23 if ( defined $groups{$group_name} ) { return 1; }
  7         35  
110 1         5 return 0;
111             }
112              
113             sub get_groups {
114 1     1 0 22 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 13 my $class = shift;
126 6         10 my $name = shift;
127              
128 6         18 return $groups{$name};
129             }
130              
131             1;