vagrant-lxc 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec70712d1aa228167002b92b029e5d2e11f5b61e
4
- data.tar.gz: 3f38fbed1265b8075f47951fb4d9ea4ef5c0878f
3
+ metadata.gz: e1dddc38d13d5bbf1413f5cfbe0a668416096636
4
+ data.tar.gz: 646adccd342594104746e82741a0661a3c8a87d4
5
5
  SHA512:
6
- metadata.gz: aa5ed8deeeb23cf12fbd93fbd719e6be1b62faf8b775c4bd1fff4046784a962f684643d22ce80f65f20bbb2ca84852f5d3d025dc21c91367a367a2dfe817dec7
7
- data.tar.gz: e1263666e742eb120e13516e593765dddcfc5f2efb302682be69398f2ace2b0d6da69465707a5e7291700e2f5f56c34d0253c58ee3508294621290a6222cd239
6
+ metadata.gz: 7aec9d4adc32aa37d0c3371e412698057fda1e05701c0f50ac7fe31bc3b72fd89a1a98b68947a92cb828c539ebf09c53d5a428ebf2e31c18c7423e3b5eb83554
7
+ data.tar.gz: 0a0593325da1a0b775d79251099647580583955d52cc6eda41b7c1bdad1f62680b24c0e867b010e238960861ce124996568a8436968fc33eb80f84ec06e5f787
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [1.0.1](https://github.com/fgrehm/vagrant-lxc/compare/v1.0.0...v1.0.1) (Oct 15, 2014)
2
+
3
+ IMPROVEMENTS:
4
+
5
+ - Avoid lock race condition when fetching container's IP [[GH-318]] and SSH execution [[GH-321]]
6
+ - Support for custom containers storage path by reading `lxc.lxcpath` [[GH-317]]
7
+
8
+
9
+ [GH-317]: https://github.com/fgrehm/vagrant-lxc/pull/317
10
+ [GH-318]: https://github.com/fgrehm/vagrant-lxc/pull/318
11
+ [GH-321]: https://github.com/fgrehm/vagrant-lxc/issues/321
12
+
1
13
  ## [1.0.0](https://github.com/fgrehm/vagrant-lxc/compare/v1.0.0.alpha.3...v1.0.0) (Sep 23, 2014)
2
14
 
3
15
  DEPRECATIONS:
data/Gemfile.lock CHANGED
@@ -40,7 +40,7 @@ GIT
40
40
  PATH
41
41
  remote: .
42
42
  specs:
43
- vagrant-lxc (1.0.0)
43
+ vagrant-lxc (1.0.1)
44
44
 
45
45
  GEM
46
46
  remote: https://rubygems.org/
@@ -195,16 +195,11 @@ module Vagrant
195
195
 
196
196
  # This action is called to read the IP of the container. The IP found
197
197
  # is expected to be put into the `:machine_ip` key.
198
- def self.action_fetch_ip
198
+ def self.action_ssh_ip
199
199
  Builder.new.tap do |b|
200
- b.use Builtin::ConfigValidate
201
- b.use Builtin::Call, Builtin::IsState, :running do |env, b2|
202
- if env[:result]
203
- b2.use FetchIpWithLxcAttach if env[:machine].provider.driver.supports_attach?
204
- b2.use FetchIpFromDnsmasqLeases
205
- else
206
- b2.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_running")
207
- end
200
+ b.use Builtin::Call, Builtin::ConfigValidate do |env, b2|
201
+ b2.use FetchIpWithLxcAttach if env[:machine].provider.driver.supports_attach?
202
+ b2.use FetchIpFromDnsmasqLeases
208
203
  end
209
204
  end
210
205
  end
@@ -28,14 +28,24 @@ module Vagrant
28
28
  end
29
29
 
30
30
  def version
31
- if run(:version) =~ /lxc version:\s+(.+)\s*$/
32
- $1.downcase
31
+ return @version if @version
32
+ @version = support_version_command? ? run(:version) : run(:create, '--version')
33
+ if @version =~ /(lxc version:\s+|)(.+)\s*$/
34
+ @version = $2.downcase
33
35
  else
34
36
  # TODO: Raise an user friendly error
35
37
  raise 'Unable to parse lxc version!'
36
38
  end
37
39
  end
38
40
 
41
+ def config(param)
42
+ if support_config_command?
43
+ run(:config, param).gsub("\n", '')
44
+ else
45
+ raise Errors::CommandNotSupported, name: 'config', available_version: '> 1.x.x', version: version
46
+ end
47
+ end
48
+
39
49
  def state
40
50
  if @name && run(:info, '--name', @name, retryable: true) =~ /^state:[^A-Z]+([A-Z]+)$/i
41
51
  $1.downcase.to_sym
@@ -134,6 +144,16 @@ module Vagrant
134
144
  return @supports_attach
135
145
  end
136
146
 
147
+ def support_config_command?
148
+ version[0].to_i >= 1
149
+ end
150
+
151
+ def support_version_command?
152
+ @sudo_wrapper.run('which', 'lxc-version').strip.chomp != ''
153
+ rescue Vagrant::LXC::Errors::ExecuteError
154
+ return false
155
+ end
156
+
137
157
  private
138
158
 
139
159
  def run(command, *args)
@@ -13,8 +13,8 @@ module Vagrant
13
13
  # a name.
14
14
  class ContainerNotFound < StandardError; end
15
15
 
16
- # Root folder where container configs are stored
17
- CONTAINERS_PATH = '/var/lib/lxc'
16
+ # Default root folder where container configs are stored
17
+ DEFAULT_CONTAINERS_PATH = '/var/lib/lxc'
18
18
 
19
19
  attr_reader :container_name,
20
20
  :customizations
@@ -31,12 +31,17 @@ module Vagrant
31
31
  raise ContainerNotFound if @container_name && ! @cli.list.include?(@container_name)
32
32
  end
33
33
 
34
+ # Root folder where container configs are stored
35
+ def containers_path
36
+ @containers_path ||= @cli.support_config_command? ? @cli.config('lxc.lxcpath') : DEFAULT_CONTAINERS_PATH
37
+ end
38
+
34
39
  def all_containers
35
40
  @cli.list
36
41
  end
37
42
 
38
43
  def base_path
39
- Pathname.new("#{CONTAINERS_PATH}/#{@container_name}")
44
+ Pathname.new("#{containers_path}/#{@container_name}")
40
45
  end
41
46
 
42
47
  def rootfs_path
@@ -26,6 +26,10 @@ module Vagrant
26
26
  error_key(:lxc_container_already_exists)
27
27
  end
28
28
 
29
+ class CommandNotSupported < Vagrant::Errors::VagrantError
30
+ error_key(:lxc_command_not_supported)
31
+ end
32
+
29
33
  # Box related errors
30
34
  class TemplateFileMissing < Vagrant::Errors::VagrantError
31
35
  error_key(:lxc_template_file_missing)
@@ -64,13 +64,13 @@ module Vagrant
64
64
 
65
65
  # Returns the SSH info for accessing the Container.
66
66
  def ssh_info
67
- # If the Container is not created then we cannot possibly SSH into it, so
67
+ # If the Container is not running then we cannot possibly SSH into it, so
68
68
  # we return nil.
69
- return nil if state == :not_created
69
+ return nil if state.id != :running
70
70
 
71
- # Run a custom action called "fetch_ip" which does what it says and puts
71
+ # Run a custom action called "ssh_ip" which does what it says and puts
72
72
  # the IP found into the `:machine_ip` key in the environment.
73
- env = @machine.action("fetch_ip")
73
+ env = @machine.action("ssh_ip")
74
74
 
75
75
  # If we were not able to identify the container's IP, we return nil
76
76
  # here and we let Vagrant core deal with it ;)
@@ -1,5 +1,5 @@
1
1
  module Vagrant
2
2
  module LXC
3
- VERSION = "1.0.0"
3
+ VERSION = "1.0.1"
4
4
  end
5
5
  end
data/locales/en.yml CHANGED
@@ -66,3 +66,7 @@ en:
66
66
  There is container on your system with the same name you've specified
67
67
  on your Vagrantfile (%{name}), please choose a different one or
68
68
  run `lxc-destroy --name %{name}` and try again.
69
+
70
+ lxc_command_not_supported: |-
71
+ Command (lxc-%{command}) not supported in version %{version}.
72
+ This command is available with version %{available_version}.
@@ -29,14 +29,52 @@ describe Vagrant::LXC::Driver::CLI do
29
29
  end
30
30
 
31
31
  describe 'version' do
32
- let(:lxc_version_out) { "lxc version: 0.x.y-rc1\n" }
32
+ before do
33
+ allow(subject).to receive(:run).with(:version).and_return(lxc_version_out)
34
+ end
35
+
36
+ describe 'lxc version before 1.x.x' do
37
+ let(:lxc_version_out) { "lxc version: 0.x.y-rc1\n" }
38
+
39
+ it 'parses the version from the output' do
40
+ expect(subject.version).to eq('0.x.y-rc1')
41
+ end
42
+ end
43
+
44
+ describe 'lxc version after 1.x.x' do
45
+ let(:lxc_version_out) { "1.0.0\n" }
46
+
47
+ it 'parses the version from the output' do
48
+ expect(subject.version).to eq('1.0.0')
49
+ end
50
+ end
51
+ end
33
52
 
53
+ describe 'config' do
34
54
  before do
55
+ allow(subject).to receive(:run).with(:config, 'lxc.lxcpath').and_return(lxc_config_out)
35
56
  allow(subject).to receive(:run).with(:version).and_return(lxc_version_out)
57
+ allow(subject).to receive(:run).with(:create, '--version').and_return(lxc_version_out)
36
58
  end
37
59
 
38
- it 'parses the version from the output' do
39
- expect(subject.version).to eq('0.x.y-rc1')
60
+ describe 'lxc version before 1.x.x' do
61
+ let(:support_version_command?) { true }
62
+ let(:lxc_config_out) { "/var/lib/lxc\n" }
63
+ let(:lxc_version_out) { "lxc version: 0.x.y-rc1\n" }
64
+
65
+ it 'not supported' do
66
+ expect{subject.config('lxc.lxcpath')}.to raise_error(Vagrant::LXC::Errors::CommandNotSupported)
67
+ end
68
+ end
69
+
70
+ describe 'lxc version before after 1.x.x'do
71
+ let(:support_version_command?) { false }
72
+ let(:lxc_config_out) { "/var/lib/lxc\n" }
73
+ let(:lxc_version_out) { "1.0.0\n" }
74
+
75
+ it 'parser the lxc.lxcpath value' do
76
+ expect(subject.config('lxc.lxcpath')).not_to end_with("\n")
77
+ end
40
78
  end
41
79
  end
42
80
 
@@ -89,7 +89,7 @@ describe Vagrant::LXC::Driver do
89
89
  describe 'start' do
90
90
  let(:customizations) { [['a', '1'], ['b', '2']] }
91
91
  let(:internal_customization) { ['internal', 'customization'] }
92
- let(:cli) { double(Vagrant::LXC::Driver::CLI, start: true) }
92
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, start: true, support_config_command?: false) }
93
93
  let(:sudo) { double(Vagrant::LXC::SudoWrapper) }
94
94
 
95
95
  subject { described_class.new('name', sudo, cli) }
@@ -99,6 +99,7 @@ describe Vagrant::LXC::Driver do
99
99
  and_return('# CONFIGURATION')
100
100
  sudo.should_receive(:run).twice.with('cp', '-f', %r{/tmp/.*}, '/var/lib/lxc/name/config')
101
101
  sudo.should_receive(:run).twice.with('chown', 'root:root', '/var/lib/lxc/name/config')
102
+
102
103
  subject.customizations << internal_customization
103
104
  subject.start(customizations)
104
105
  end
@@ -150,6 +151,30 @@ describe Vagrant::LXC::Driver do
150
151
  end
151
152
  end
152
153
 
154
+ describe 'containers_path' do
155
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, config: cli_config_value, support_config_command?: cli_support_config_command_value) }
156
+
157
+ subject { described_class.new('name', nil, cli) }
158
+
159
+ describe 'lxc version before 1.x.x' do
160
+ let(:cli_support_config_command_value) { false }
161
+ let(:cli_config_value) { '/var/lib/lxc' }
162
+
163
+ it 'delegates to cli' do
164
+ expect(subject.containers_path).to eq(cli_config_value)
165
+ end
166
+ end
167
+
168
+ describe 'lxc version after 1.x.x' do
169
+ let(:cli_support_config_command_value) { true }
170
+ let(:cli_config_value) { '/etc/lxc' }
171
+
172
+ it 'delegates to cli' do
173
+ expect(subject.containers_path).to eq(cli_config_value)
174
+ end
175
+ end
176
+ end
177
+
153
178
  describe 'folder sharing' do
154
179
  let(:shared_folder) { {guestpath: '/vagrant', hostpath: '/path/to/host/dir'} }
155
180
  let(:ro_rw_folder) { {guestpath: '/vagrant/ro_rw', hostpath: '/path/to/host/dir', mount_options: ['ro', 'rw']} }
@@ -95,12 +95,14 @@ Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-version'
95
95
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-ls'
96
96
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-info', '--name', /.*/
97
97
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-create', '-B', /.*/, '--template', /.*/, '--name', /.*/, '**'
98
+ Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-create', '--version'
98
99
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-destroy', '--name', /.*/
99
100
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-start', '-d', '--name', /.*/, '**'
100
101
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-stop', '--name', /.*/
101
102
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-shutdown', '--name', /.*/
102
103
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-attach', '--name', /.*/, '**'
103
104
  Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-attach', '-h'
105
+ Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-config', 'lxc.lxcpath'
104
106
 
105
107
  ##
106
108
  # Commands from driver/action/remove_temporary_files.rb
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-lxc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Rehm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-23 00:00:00.000000000 Z
11
+ date: 2014-10-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Linux Containers provider for Vagrant
14
14
  email: