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…
Add table
Reference in a new issue