File Coverage

lib/Rex/Virtualization/LibVirt/info.pm
Criterion Covered Total %
statement 20 43 46.5
branch 0 12 0.0
condition 0 9 0.0
subroutine 7 8 87.5
pod 0 1 0.0
total 27 73 36.9


line stmt bran cond sub pod time code
1             #
2             # (c) Jan Gehring
3             #
4              
5             package Rex::Virtualization::LibVirt::info;
6              
7 1     1   13 use v5.12.5;
  1         4  
8 1     1   7 use warnings;
  1         4  
  1         59  
9              
10             our $VERSION = '1.14.2.2'; # TRIAL VERSION
11              
12 1     1   7 use Rex::Logger;
  1         2  
  1         6  
13 1     1   32 use Rex::Helper::Run;
  1         5  
  1         70  
14              
15 1     1   10 use XML::Simple;
  1         3  
  1         10  
16 1     1   76 use Rex::Virtualization::LibVirt::dumpxml;
  1         2  
  1         15  
17              
18 1     1   28 use Data::Dumper;
  1         2  
  1         402  
19              
20             sub execute {
21 0     0 0   my ( $class, $vmname ) = @_;
22 0           my $virt_settings = Rex::Config->get("virtualization");
23             chomp( my $uri =
24 0 0         ref($virt_settings) ? $virt_settings->{connect} : i_run "virsh uri" );
25              
26 0 0         unless ($vmname) {
27 0           die("You have to define the vm name!");
28             }
29              
30 0           Rex::Logger::debug("Getting info of domain: $vmname");
31              
32 0           my $xml;
33              
34 0           my @dominfo = i_run "virsh -c $uri dominfo '$vmname'", fail_ok => 1;
35              
36 0 0         if ( $? != 0 ) {
37 0           die("Error running virsh dominfo '$vmname'");
38             }
39              
40 0           my %ret = ();
41 0           my ( $k, $v );
42              
43 0           for my $line (@dominfo) {
44 0           ( $k, $v ) = split( /:\s+/, $line );
45 0           $ret{$k} = $v;
46             }
47              
48 0 0         if (Rex::Config::get_use_rex_kvm_agent) {
49 0           my $xml_ref = Rex::Virtualization::LibVirt::dumpxml->execute($vmname);
50 0 0 0       if ( $xml_ref
      0        
51             && exists $xml_ref->{devices}->{serial}
52             && ref $xml_ref->{devices}->{serial} eq "ARRAY" )
53             {
54             my ($agent_serial) = grep {
55             exists $_->{type}
56             && $_->{type} eq "tcp"
57 0 0 0       && $_->{target}->{port} == 1
58 0           } @{ $xml_ref->{devices}->{serial} };
  0            
59              
60             #TODO: $xml_ref->{devices}->{serial} is an arrayref if there are multiple devices, hashref otherwise
61             #TODO: it might be a better idea to name the serial device and match by its name here
62              
63 0           $ret{has_kvm_agent_on_port} = $agent_serial->{source}->{service};
64             }
65             }
66              
67 0           return \%ret;
68             }
69              
70             1;