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   70125 use v5.12.5;
  58         240  
8 58     58   313 use warnings;
  58         126  
  58         2860  
9              
10             our $VERSION = '1.14.2.2'; # TRIAL VERSION
11              
12 58     58   901 use Rex::Logger;
  58         147  
  58         434  
13              
14 58     58   2856 use attributes;
  58         20503  
  58         470  
15 58     58   4184 use Rex::Group::Entry::Server;
  58         175  
  58         522  
16              
17 58     58   2053 use vars qw(%groups);
  58         191  
  58         4187  
18 58     58   423 use List::Util 1.45 qw(uniq);
  58         1091  
  58         3528  
19 58     58   472 use Data::Dumper;
  58         138  
  58         43790  
20              
21             sub new {
22 16     16 0 40 my $that = shift;
23 16   33     61 my $proto = ref($that) || $that;
24 16         43 my $self = {@_};
25              
26 16         35 bless( $self, $proto );
27 16         25 for my $srv ( @{ $self->{servers} } ) {
  16         55  
28 36         94 $srv->append_to_group( $self->{name} );
29             }
30              
31 16         95 return $self;
32             }
33              
34             sub get_servers {
35 23     23 0 38 my ($self) = @_;
36              
37 46 50       100 my @servers = map { ref( $_->to_s ) eq "CODE" ? &{ $_->to_s } : $_ }
  0         0  
38 23         67 @{ $self->{servers} };
  23         63  
39              
40 23         136 return uniq @servers;
41             }
42              
43             sub set_auth {
44 3     3 0 14 my ( $self, %data ) = @_;
45 3         15 $self->{auth} = \%data;
46              
47 3         12 map { $_->set_auth( %{ $self->get_auth } ) } $self->get_servers;
  3         10  
  3         17  
48             }
49              
50             sub get_auth {
51 3     3 0 10 my ($self) = @_;
52 3         21 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 34 my $class = shift;
66 16         26 my $group_name = shift;
67 16         42 my @server = uniq grep { defined } @_;
  37         114  
68              
69 16         39 my @server_obj;
70 16         53 for ( my $i = 0 ; $i <= $#server ; $i++ ) {
71 36 50       81 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         36 push @server_obj, $server[$i];
76 25         47 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     58 ? %{ $server[ $i + 1 ] }
  0         0  
83             : ();
84              
85 11         64 my $obj = Rex::Group::Entry::Server->new( name => $server[$i], %options );
86 11         52 push @server_obj, $obj;
87             }
88              
89 16         69 $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 364 my $class = shift;
96 11         28 my $group_name = shift;
97              
98 11 50       27 if ( exists $groups{$group_name} ) {
99 11         39 return $groups{$group_name}->get_servers;
100             }
101              
102 0         0 return ();
103             }
104              
105             sub is_group {
106 8     8 0 15 my $class = shift;
107 8         13 my $group_name = shift;
108              
109 8 100       36 if ( defined $groups{$group_name} ) { return 1; }
  7         25  
110 1         5 return 0;
111             }
112              
113             sub get_groups {
114 1     1 0 14 my $class = shift;
115 1         2 my %ret = ();
116              
117 1         4 for my $key ( keys %groups ) {
118 9         21 $ret{$key} = [ $groups{$key}->get_servers ];
119             }
120              
121 1         9 return %ret;
122             }
123              
124             sub get_group_object {
125 6     6 0 14 my $class = shift;
126 6         12 my $name = shift;
127              
128 6         18 return $groups{$name};
129             }
130              
131             1;