#
# (c) Oleg Hardt <litwol@litwol.com>
#
# vim: set ts=2 sw=2 tw=0:
# vim: set expandtab:

package Rex::Virtualization::Lxc::list;

use strict;
use warnings;

our $VERSION = '1.7.0'; # VERSION

use Rex::Logger;
use Rex::Helper::Run;

# Not sure if global scope is good place to keep this.
# Also not sure "polluting" execute method wih this is also an option.
my %allowed_states;
$allowed_states{active}  = 1;
$allowed_states{running} = 1;
$allowed_states{frozen}  = 1;
$allowed_states{stopped} = 1;

sub execute {
  my ( $class, $state, %opt ) = @_;
  my @containers;

  my $opts = \%opt;

  Rex::Logger::debug("Getting Linux Containers list");

  $state = exists $allowed_states{$state} ? '--' . $state : '';
  my $format =
    exists $opts->{format}
    ? $opts->{format}
    : 'name,state,autostart,groups,ipv4,ipv6,pid';
  my $fancy = exists $opts->{fancy} ? '-f' : '';
  my $groups = exists $opts->{groups} ? '-g' . $opts->{groups} : '';

  # When using not fancy output, lxc-ls defaults to outputting only name.
  if ( $fancy ne '-f' ) {
    $format = 'name';
  }

  my $command_to_run = "lxc-ls -1 $state $groups $fancy -F\"$format\"";
  @containers = i_run $command_to_run, fail_ok => 1;
  if ( $? != 0 ) {
    die("Error running lxc-ls");
  }

  my @columns = split( ',', $format );
  my @ret     = ();
  for my $line (@containers) {
    next
      if $line =~ m/NAME|AUTOSTART|STATE|IPV4|IPV6|AUTOSTART|PID|RAM|SWAP\s/;
    my @values = split( /\s{1,}/, $line );

    # Convert provided format into hash values.
    my %row = ();
    foreach my $column ( 0 .. $#columns ) {
      $row{ $columns[$column] } = $values[$column];
    }

    push( @ret, \%row, );
  }

  return \@ret;
}

1;