Begin to extract a lxc cli object
This commit is contained in:
parent
30b1420ced
commit
811d9a4b29
2 changed files with 111 additions and 0 deletions
81
lib/vagrant-lxc/container/cli.rb
Normal file
81
lib/vagrant-lxc/container/cli.rb
Normal 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
|
30
spec/unit/container/cli_spec.rb
Normal file
30
spec/unit/container/cli_spec.rb
Normal 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
|
Loading…
Reference in a new issue