vagrant-lxc 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: