diff --git a/lib/vagrant-lxc/container/cli.rb b/lib/vagrant-lxc/container/cli.rb new file mode 100644 index 0000000..d4d75ed --- /dev/null +++ b/lib/vagrant-lxc/container/cli.rb @@ -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 diff --git a/spec/unit/container/cli_spec.rb b/spec/unit/container/cli_spec.rb new file mode 100644 index 0000000..1e9068d --- /dev/null +++ b/spec/unit/container/cli_spec.rb @@ -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