Begin to extract a lxc cli object

This commit is contained in:
Fabio Rehm 2013-03-10 19:15:31 -03:00
parent 30b1420ced
commit 811d9a4b29
2 changed files with 111 additions and 0 deletions

View file

@ -0,0 +1,81 @@
require 'unit_helper'
require "vagrant/util/retryable"
require "vagrant/util/subprocess"
require "vagrant-lxc/errors"
module Vagrant
module LXC
class Container
class CLI
# Include this so we can use `Subprocess` more easily.
include Vagrant::Util::Retryable
def initialize(name = nil)
@name = name
@logger = Log4r::Logger.new("vagrant::provider::lxc::container::cli")
end
def list
containers = lxc :ls
containers.split(/\s+/).uniq
end
private
def lxc(command, *args)
execute('sudo', "lxc-#{command}", *args)
end
# TODO: Review code below this line, it was pretty much a copy and paste from VirtualBox base driver
def execute(*command, &block)
# Get the options hash if it exists
opts = {}
opts = command.pop if command.last.is_a?(Hash)
tries = 0
tries = 3 if opts[:retryable]
sleep = opts.fetch(:sleep, 1)
# Variable to store our execution result
r = nil
retryable(:on => LXC::Errors::ExecuteError, :tries => tries, :sleep => sleep) do
# Execute the command
r = raw(*command, &block)
# If the command was a failure, then raise an exception that is
# nicely handled by Vagrant.
if r.exit_code != 0
if @interrupted
@logger.info("Exit code != 0, but interrupted. Ignoring.")
else
raise LXC::Errors::ExecuteError, :command => command.inspect
end
end
end
# Return the output, making sure to replace any Windows-style
# newlines with Unix-style.
r.stdout.gsub("\r\n", "\n")
end
def raw(*command, &block)
int_callback = lambda do
@interrupted = true
@logger.info("Interrupted.")
end
# Append in the options for subprocess
command << { :notify => [:stdout, :stderr] }
Vagrant::Util::Busy.busy(int_callback) do
Vagrant::Util::Subprocess.execute(*command, &block)
end
end
end
end
end
end

View file

@ -0,0 +1,30 @@
require 'unit_helper'
require "vendored_vagrant"
require 'vagrant-lxc/container/cli'
describe Vagrant::LXC::Container::CLI do
describe 'list' do
let(:lxc_ls_out) { "dup-container\na-container dup-container" }
let(:exec_args) { @exec_args }
let(:result) { subject.list }
before do
Vagrant::Util::Subprocess.stub(:execute) { |*args|
@exec_args = args
stub(exit_code: 0, stdout: lxc_ls_out)
}
end
it 'grabs previously created containers from lxc-ls' do
result.should be_an Enumerable
result.should include 'a-container'
result.should include 'dup-container'
exec_args.should include 'lxc-ls'
end
it 'removes duplicates from lxc-ls output' do
result.uniq.should == result
end
end
end