File Coverage

blib/lib/Rex/Virtualization/CBSD/bstop.pm
Criterion Covered Total %
statement 15 38 39.4
branch 0 16 0.0
condition 0 3 0.0
subroutine 5 6 83.3
pod 0 1 0.0
total 20 64 31.2


line stmt bran cond sub pod time code
1             #
2             # (c) Zane C. Bowers-Hadley
3             #
4              
5             package Rex::Virtualization::CBSD::bstop;
6              
7 1     1   67417 use strict;
  1         11  
  1         29  
8 1     1   6 use warnings;
  1         2  
  1         38  
9              
10             our $VERSION = '0.0.1'; # VERSION
11              
12 1     1   440 use Rex::Logger;
  1         11071  
  1         39  
13 1     1   416 use Rex::Helper::Run;
  1         76569  
  1         72  
14 1     1   8 use Term::ANSIColor qw(colorstrip);
  1         2  
  1         1992  
15              
16             sub execute {
17 0     0 0   my ( $class, $name, %opts ) = @_;
18              
19             # set the hard_timeout if needed
20 0           my $hard_timeout = '';
21 0 0         if ( defined( $opts{hard_timeout} ) ) {
22              
23             # make sure we have a valid value
24 0 0         if ( $opts{hard_timeout} !~ /^[0123456789]+$/ ) {
25 0           die 'hard_timeout value,"' . $opts{hard_timeout} . '", is not numeric';
26             }
27              
28 0           $hard_timeout = 'hard_timeout=' . $opts{hard_timeout};
29             }
30              
31             # set the noacpi value if needed
32 0           my $noacpi = '';
33 0 0         if ( defined( $opts{noacpi} ) ) {
34              
35             # make sure we have a valid value
36 0 0 0       if ( ( $opts{noacpi} ne '0' )
37             && ( $opts{noacpi} ne '1' ) )
38             {
39 0           die 'noacpi is set and it is not equal to "0" or "1"';
40             }
41              
42 0           $noacpi = 'noacpi=' . $opts{noacpi};
43             }
44              
45             # make sure we have a
46 0 0         if ( !defined($name) ) {
47 0           die('No VM name defined');
48             }
49              
50 0           Rex::Logger::debug( "CBSD VM stop via cbsd bstop " . $name );
51              
52 0           my $returned = i_run( 'cbsd bstop jname=' . $name . ' ' . $hard_timeout . ' ' . $noacpi, fail_ok => 1 );
53              
54             # the output is colorized
55 0           $returned = colorstrip($returned);
56              
57             # check for failures caused by it not existing
58 0 0         if ( $returned =~ /^No\ such/ ) {
59 0           die( '"' . $name . '" does not exist' );
60             }
61              
62             # test after no such as that will also exit non-zero
63 0 0         if ( $? != 0 ) {
64 0           die( "Error running 'cbsd bstop " . $name . "'" );
65             }
66              
67             # this is warning message will be thrown if stop fails.... does not return 0 though
68 0 0         if ( $returned =~ /unable\ to\ determine\ bhyve\ pid/ ) {
69 0           die( "Either already stopped or other issue determining bhyve PID for '" . $name . "'" );
70             }
71              
72 0           return 1;
73             }
74              
75             1;