vagrant-lxc 0.8.0 → 1.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -2
  3. data/BOXES.md +13 -21
  4. data/CHANGELOG.md +49 -0
  5. data/CONTRIBUTING.md +5 -2
  6. data/Gemfile +12 -13
  7. data/Gemfile.lock +66 -51
  8. data/README.md +39 -25
  9. data/development/Vagrantfile +0 -2
  10. data/lib/vagrant-backports/README.md +12 -0
  11. data/lib/vagrant-backports/action/handle_box.rb +1 -0
  12. data/lib/vagrant-backports/action/is_state.rb +34 -0
  13. data/lib/vagrant-backports/action/message.rb +20 -0
  14. data/lib/{vagrant-lxc → vagrant-backports}/action/wait_for_communicator.rb +6 -5
  15. data/lib/vagrant-backports/ui.rb +12 -0
  16. data/lib/vagrant-backports/utils.rb +27 -0
  17. data/lib/vagrant-lxc.rb +8 -0
  18. data/lib/vagrant-lxc/action.rb +81 -48
  19. data/lib/vagrant-lxc/action/boot.rb +2 -1
  20. data/lib/vagrant-lxc/action/fetch_ip_from_dnsmasq_leases.rb +1 -0
  21. data/lib/vagrant-lxc/action/handle_box_metadata.rb +36 -14
  22. data/lib/vagrant-lxc/action/message.rb +0 -23
  23. data/lib/vagrant-lxc/action/prepare_nfs_settings.rb +64 -0
  24. data/lib/vagrant-lxc/action/prepare_nfs_valid_ids.rb +19 -0
  25. data/lib/vagrant-lxc/action/setup_package_files.rb +6 -2
  26. data/lib/vagrant-lxc/{action → backports/action}/share_folders.rb +0 -0
  27. data/lib/vagrant-lxc/command/root.rb +58 -0
  28. data/lib/vagrant-lxc/command/sudoers.rb +87 -0
  29. data/lib/vagrant-lxc/driver.rb +21 -11
  30. data/lib/vagrant-lxc/plugin.rb +23 -5
  31. data/lib/vagrant-lxc/provider/cap/public_address.rb +17 -0
  32. data/lib/vagrant-lxc/synced_folder.rb +42 -0
  33. data/lib/vagrant-lxc/version.rb +1 -1
  34. data/locales/en.yml +6 -5
  35. data/scripts/lxc-template +165 -0
  36. data/spec/spec_helper.rb +9 -13
  37. data/spec/unit/action/clear_forwarded_ports_spec.rb +3 -3
  38. data/spec/unit/action/compress_rootfs_spec.rb +7 -5
  39. data/spec/unit/action/forward_ports_spec.rb +8 -8
  40. data/spec/unit/action/handle_box_metadata_spec.rb +71 -15
  41. data/spec/unit/action/setup_package_files_spec.rb +32 -8
  42. data/spec/unit/driver/cli_spec.rb +31 -30
  43. data/spec/unit/driver_spec.rb +35 -27
  44. data/spec/unit/support/unit_example_group.rb +6 -6
  45. data/spec/unit_helper.rb +4 -2
  46. data/tasks/spec.rake +18 -11
  47. data/vagrant-lxc.gemspec +7 -0
  48. data/vagrant-spec.config.rb +24 -0
  49. metadata +24 -36
  50. data/boxes/build-all.sh +0 -22
  51. data/boxes/build-debian-box.sh +0 -167
  52. data/boxes/build-openmandriva-box.sh +0 -159
  53. data/boxes/build-ubuntu-box.sh +0 -151
  54. data/boxes/common/cleanup +0 -7
  55. data/boxes/common/install-babushka +0 -16
  56. data/boxes/common/install-chef +0 -15
  57. data/boxes/common/install-puppet +0 -13
  58. data/boxes/common/install-salt +0 -12
  59. data/boxes/common/install-salt-debian +0 -28
  60. data/boxes/common/lxc-template +0 -226
  61. data/boxes/common/lxc-template-openmandriva +0 -225
  62. data/boxes/common/lxc.conf +0 -49
  63. data/boxes/common/metadata.json +0 -5
  64. data/lib/vagrant-lxc/action/check_created.rb +0 -21
  65. data/lib/vagrant-lxc/action/check_running.rb +0 -21
  66. data/lib/vagrant-lxc/action/created.rb +0 -20
  67. data/lib/vagrant-lxc/action/disconnect.rb +0 -18
  68. data/lib/vagrant-lxc/action/is_running.rb +0 -19
  69. data/spec/acceptance/sanity_check_spec.rb +0 -111
  70. data/spec/acceptance/support/acceptance_example_group.rb +0 -76
  71. data/spec/acceptance/support/machine_ext.rb +0 -12
  72. data/spec/acceptance/support/test_ui.rb +0 -22
  73. data/spec/acceptance_helper.rb +0 -21
@@ -5,16 +5,16 @@ require 'vagrant-lxc/action/setup_package_files'
5
5
  describe Vagrant::LXC::Action::SetupPackageFiles do
6
6
  let(:app) { double(:app, call: true) }
7
7
  let(:env) { {machine: machine, tmp_path: tmp_path, ui: double(info: true), 'package.rootfs' => rootfs_path} }
8
- let(:machine) { instance_double('Vagrant::Machine', box: box) }
8
+ let(:machine) { double(Vagrant::Machine, box: box) }
9
9
  let!(:tmp_path) { Pathname.new(Dir.mktmpdir) }
10
- let(:box) { instance_double('Vagrant::Box', directory: tmp_path.join('box')) }
10
+ let(:box) { double(Vagrant::Box, directory: tmp_path.join('box')) }
11
11
  let(:rootfs_path) { tmp_path.join('rootfs-amd64.tar.gz') }
12
12
 
13
13
  subject { described_class.new(app, env) }
14
14
 
15
15
  before do
16
16
  box.directory.mkdir
17
- files = %w( lxc-template metadata.json lxc.conf ).map { |f| box.directory.join(f) }
17
+ files = %w( lxc-template metadata.json lxc.conf lxc-config ).map { |f| box.directory.join(f) }
18
18
  (files + [rootfs_path]).each do |file|
19
19
  file.open('w') { |f| f.puts file.to_s }
20
20
  end
@@ -30,20 +30,34 @@ describe Vagrant::LXC::Action::SetupPackageFiles do
30
30
  before { subject.call(env) }
31
31
 
32
32
  it 'copies box lxc-template to package directory' do
33
- env['package.directory'].join('lxc-template').should be_file
33
+ expect(env['package.directory'].join('lxc-template')).to be_file
34
34
  end
35
35
 
36
36
  it 'copies metadata.json to package directory' do
37
- env['package.directory'].join('metadata.json').should be_file
37
+ expect(env['package.directory'].join('metadata.json')).to be_file
38
38
  end
39
39
 
40
40
  it 'copies box lxc.conf to package directory' do
41
- env['package.directory'].join('lxc-template').should be_file
41
+ expect(env['package.directory'].join('lxc-template')).to be_file
42
+ end
43
+
44
+ it 'copies box lxc-config to package directory' do
45
+ expect(env['package.directory'].join('lxc-config')).to be_file
42
46
  end
43
47
 
44
48
  it 'moves the compressed rootfs to package directory' do
45
- env['package.directory'].join(rootfs_path.basename).should be_file
46
- env['package.rootfs'].should_not be_file
49
+ expect(env['package.directory'].join(rootfs_path.basename)).to be_file
50
+ expect(env['package.rootfs']).not_to be_file
51
+ end
52
+ end
53
+
54
+ context 'when lxc-template file is not present' do
55
+ before do
56
+ box.directory.join('lxc-template').delete
57
+ end
58
+
59
+ it 'does not blow up' do
60
+ expect { subject.call(env) }.to_not raise_error
47
61
  end
48
62
  end
49
63
 
@@ -56,4 +70,14 @@ describe Vagrant::LXC::Action::SetupPackageFiles do
56
70
  expect { subject.call(env) }.to_not raise_error
57
71
  end
58
72
  end
73
+
74
+ context 'when lxc-config file is not present' do
75
+ before do
76
+ box.directory.join('lxc-config').delete
77
+ end
78
+
79
+ it 'does not blow up' do
80
+ expect { subject.call(env) }.to_not raise_error
81
+ end
82
+ end
59
83
  end
@@ -1,9 +1,10 @@
1
1
  require 'unit_helper'
2
2
 
3
+ require 'vagrant-lxc/sudo_wrapper'
3
4
  require 'vagrant-lxc/driver/cli'
4
5
 
5
6
  describe Vagrant::LXC::Driver::CLI do
6
- let(:sudo_wrapper) { instance_double('Vagrant::LXC::SudoWrapper', run: true) }
7
+ let(:sudo_wrapper) { double(Vagrant::LXC::SudoWrapper, run: true) }
7
8
 
8
9
  subject { described_class.new(sudo_wrapper) }
9
10
 
@@ -12,18 +13,18 @@ describe Vagrant::LXC::Driver::CLI do
12
13
  let(:result) { @result }
13
14
 
14
15
  before do
15
- subject.stub(:run).with(:ls).and_return(lxc_ls_out)
16
+ allow(subject).to receive(:run).with(:ls).and_return(lxc_ls_out)
16
17
  @result = subject.list
17
18
  end
18
19
 
19
20
  it 'grabs previously created containers from lxc-ls output' do
20
- result.should be_an Enumerable
21
- result.should include 'a-container'
22
- result.should include 'dup-container'
21
+ expect(result).to be_an Enumerable
22
+ expect(result).to include 'a-container'
23
+ expect(result).to include 'dup-container'
23
24
  end
24
25
 
25
26
  it 'removes duplicates from lxc-ls output' do
26
- result.uniq.should == result
27
+ expect(result.uniq).to eq(result)
27
28
  end
28
29
  end
29
30
 
@@ -31,11 +32,11 @@ describe Vagrant::LXC::Driver::CLI do
31
32
  let(:lxc_version_out) { "lxc version: 0.x.y-rc1\n" }
32
33
 
33
34
  before do
34
- subject.stub(:run).with(:version).and_return(lxc_version_out)
35
+ allow(subject).to receive(:run).with(:version).and_return(lxc_version_out)
35
36
  end
36
37
 
37
38
  it 'parses the version from the output' do
38
- subject.version.should == '0.x.y-rc1'
39
+ expect(subject.version).to eq('0.x.y-rc1')
39
40
  end
40
41
  end
41
42
 
@@ -48,12 +49,12 @@ describe Vagrant::LXC::Driver::CLI do
48
49
  subject { described_class.new(sudo_wrapper, name) }
49
50
 
50
51
  before do
51
- subject.stub(:run) { |*args| @run_args = args }
52
+ allow(subject).to receive(:run) { |*args| @run_args = args }
52
53
  end
53
54
 
54
55
  it 'issues a lxc-create with provided template, container name and hash of arguments' do
55
56
  subject.create(template, config_file, template_args)
56
- subject.should have_received(:run).with(
57
+ expect(subject).to have_received(:run).with(
57
58
  :create,
58
59
  '--template', template,
59
60
  '--name', name,
@@ -65,7 +66,7 @@ describe Vagrant::LXC::Driver::CLI do
65
66
  end
66
67
 
67
68
  it 'wraps a low level error into something more meaningful in case the container already exists' do
68
- subject.stub(:run) { raise Vagrant::LXC::Errors::ExecuteError, stderr: 'alreAdy Exists' }
69
+ allow(subject).to receive(:run) { raise Vagrant::LXC::Errors::ExecuteError, stderr: 'alreAdy Exists' }
69
70
  expect {
70
71
  subject.create(template, config_file, template_args)
71
72
  }.to raise_error(Vagrant::LXC::Errors::ContainerAlreadyExists)
@@ -78,12 +79,12 @@ describe Vagrant::LXC::Driver::CLI do
78
79
  subject { described_class.new(sudo_wrapper, name) }
79
80
 
80
81
  before do
81
- subject.stub(:run)
82
+ allow(subject).to receive(:run)
82
83
  subject.destroy
83
84
  end
84
85
 
85
86
  it 'issues a lxc-destroy with container name' do
86
- subject.should have_received(:run).with(:destroy, '--name', name)
87
+ expect(subject).to have_received(:run).with(:destroy, '--name', name)
87
88
  end
88
89
  end
89
90
 
@@ -92,12 +93,12 @@ describe Vagrant::LXC::Driver::CLI do
92
93
  subject { described_class.new(sudo_wrapper, name) }
93
94
 
94
95
  before do
95
- subject.stub(:run)
96
+ allow(subject).to receive(:run)
96
97
  end
97
98
 
98
99
  it 'starts container on the background' do
99
100
  subject.start
100
- subject.should have_received(:run).with(
101
+ expect(subject).to have_received(:run).with(
101
102
  :start,
102
103
  '-d',
103
104
  '--name', name
@@ -111,16 +112,16 @@ describe Vagrant::LXC::Driver::CLI do
111
112
 
112
113
  before do
113
114
  subject.stub(system: true)
114
- subject.stub(:run)
115
+ allow(subject).to receive(:run)
115
116
  end
116
117
 
117
118
  it 'issues a lxc-shutdown with provided container name' do
118
119
  subject.shutdown
119
- subject.should have_received(:run).with(:shutdown, '--name', name)
120
+ expect(subject).to have_received(:run).with(:shutdown, '--name', name)
120
121
  end
121
122
 
122
123
  it 'raises a ShutdownNotSupported in case it is not supported' do
123
- subject.stub(:system).with('which lxc-shutdown > /dev/null').and_return(false)
124
+ allow(subject).to receive(:system).with('which lxc-shutdown > /dev/null').and_return(false)
124
125
  expect { subject.shutdown }.to raise_error(described_class::ShutdownNotSupported)
125
126
  end
126
127
  end
@@ -130,21 +131,21 @@ describe Vagrant::LXC::Driver::CLI do
130
131
  subject { described_class.new(sudo_wrapper, name) }
131
132
 
132
133
  before do
133
- subject.stub(:run).and_return("state: STOPPED\npid: 2")
134
+ allow(subject).to receive(:run).and_return("state: STOPPED\npid: 2")
134
135
  end
135
136
 
136
137
  it 'calls lxc-info with the right arguments' do
137
138
  subject.state
138
- subject.should have_received(:run).with(:info, '--name', name, retryable: true)
139
+ expect(subject).to have_received(:run).with(:info, '--name', name, retryable: true)
139
140
  end
140
141
 
141
142
  it 'maps the output of lxc-info status out to a symbol' do
142
- subject.state.should == :stopped
143
+ expect(subject.state).to eq(:stopped)
143
144
  end
144
145
 
145
146
  it 'is not case sensitive' do
146
- subject.stub(:run).and_return("StatE: STarTED\npid: 2")
147
- subject.state.should == :started
147
+ allow(subject).to receive(:run).and_return("StatE: STarTED\npid: 2")
148
+ expect(subject.state).to eq(:started)
148
149
  end
149
150
  end
150
151
 
@@ -160,17 +161,17 @@ describe Vagrant::LXC::Driver::CLI do
160
161
 
161
162
  it 'calls lxc-attach with specified command' do
162
163
  subject.attach(*command)
163
- subject.should have_received(:run).with(:attach, '--name', name, '--', *command)
164
+ expect(subject).to have_received(:run).with(:attach, '--name', name, '--', *command)
164
165
  end
165
166
 
166
167
  it 'supports a "namespaces" parameter' do
167
- subject.stub(:run).with(:attach, '-h', :show_stderr => true).and_return({:stdout => '', :stderr => '--namespaces'})
168
+ allow(subject).to receive(:run).with(:attach, '-h', :show_stderr => true).and_return({:stdout => '', :stderr => '--namespaces'})
168
169
  subject.attach *(command + [{namespaces: ['network', 'mount']}])
169
- subject.should have_received(:run).with(:attach, '--name', name, '--namespaces', 'NETWORK|MOUNT', '--', *command)
170
+ expect(subject).to have_received(:run).with(:attach, '--name', name, '--namespaces', 'NETWORK|MOUNT', '--', *command)
170
171
  end
171
172
 
172
173
  it 'raises a NamespacesNotSupported error if not supported' do
173
- subject.stub(:run).with(:attach, '-h', :show_stderr => true).and_return({:stdout => '', :stderr => 'not supported'})
174
+ allow(subject).to receive(:run).with(:attach, '-h', :show_stderr => true).and_return({:stdout => '', :stderr => 'not supported'})
174
175
  expect {
175
176
  subject.attach *(command + [{namespaces: ['network', 'mount']}])
176
177
  }.to raise_error(Vagrant::LXC::Errors::NamespacesNotSupported)
@@ -186,9 +187,9 @@ describe Vagrant::LXC::Driver::CLI do
186
187
  end
187
188
 
188
189
  it 'yields a cli object' do
189
- subject.stub(:shutdown)
190
+ allow(subject).to receive(:shutdown)
190
191
  subject.transition_to(:stopped) { |c| c.shutdown }
191
- subject.should have_received(:shutdown)
192
+ expect(subject).to have_received(:shutdown)
192
193
  end
193
194
 
194
195
  it 'throws an exception if block is not provided' do
@@ -197,6 +198,6 @@ describe Vagrant::LXC::Driver::CLI do
197
198
  }.to raise_error(described_class::TransitionBlockNotProvided)
198
199
  end
199
200
 
200
- pending 'waits for the expected container state'
201
+ skip 'waits for the expected container state'
201
202
  end
202
203
  end
@@ -1,15 +1,15 @@
1
1
  require 'unit_helper'
2
2
 
3
- require 'vagrant'
4
3
  require 'vagrant-lxc/driver'
5
4
  require 'vagrant-lxc/driver/cli'
5
+ require 'vagrant-lxc/sudo_wrapper'
6
6
 
7
7
  describe Vagrant::LXC::Driver do
8
8
  describe 'container name validation' do
9
9
  let(:unknown_container) { described_class.new('unknown', nil, cli) }
10
10
  let(:valid_container) { described_class.new('valid', nil, cli) }
11
11
  let(:new_container) { described_class.new(nil, nil) }
12
- let(:cli) { instance_double('Vagrant::LXC::Driver::CLI', list: ['valid']) }
12
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, list: ['valid']) }
13
13
 
14
14
  it 'raises a ContainerNotFound error if an unknown container name gets provided' do
15
15
  expect {
@@ -37,21 +37,21 @@ describe Vagrant::LXC::Driver do
37
37
  let(:template_opts) { {'--some' => 'random-option'} }
38
38
  let(:config_file) { '/path/to/lxc-config-from-box' }
39
39
  let(:rootfs_tarball) { '/path/to/cache/rootfs.tar.gz' }
40
- let(:cli) { instance_double('Vagrant::LXC::Driver::CLI', :create => true, :name= => true) }
40
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, :create => true, :name= => true) }
41
41
 
42
42
  subject { described_class.new(nil, nil, cli) }
43
43
 
44
44
  before do
45
- subject.stub(:import_template).and_yield(template_name)
45
+ allow(subject).to receive(:import_template).and_yield(template_name)
46
46
  subject.create name, template_path, config_file, template_opts
47
47
  end
48
48
 
49
49
  it 'sets the cli object container name' do
50
- cli.should have_received(:name=).with(name)
50
+ expect(cli).to have_received(:name=).with(name)
51
51
  end
52
52
 
53
53
  it 'creates container with the right arguments' do
54
- cli.should have_received(:create).with(
54
+ expect(cli).to have_received(:create).with(
55
55
  template_name,
56
56
  config_file,
57
57
  template_opts
@@ -60,22 +60,22 @@ describe Vagrant::LXC::Driver do
60
60
  end
61
61
 
62
62
  describe 'destruction' do
63
- let(:cli) { instance_double('Vagrant::LXC::Driver::CLI', destroy: true) }
63
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, destroy: true) }
64
64
 
65
65
  subject { described_class.new('name', nil, cli) }
66
66
 
67
67
  before { subject.destroy }
68
68
 
69
69
  it 'delegates to cli object' do
70
- cli.should have_received(:destroy)
70
+ expect(cli).to have_received(:destroy)
71
71
  end
72
72
  end
73
73
 
74
74
  describe 'start' do
75
75
  let(:customizations) { [['a', '1'], ['b', '2']] }
76
76
  let(:internal_customization) { ['internal', 'customization'] }
77
- let(:cli) { instance_double('Vagrant::LXC::Driver::CLI', start: true) }
78
- let(:sudo) { instance_double('Vagrant::LXC::SudoWrapper', su_c: true) }
77
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, start: true) }
78
+ let(:sudo) { double(Vagrant::LXC::SudoWrapper, su_c: true) }
79
79
 
80
80
  subject { described_class.new('name', sudo, cli) }
81
81
 
@@ -89,61 +89,62 @@ describe Vagrant::LXC::Driver do
89
89
  it 'writes configurations to config file'
90
90
 
91
91
  it 'starts container with configured customizations' do
92
- cli.should have_received(:start)
92
+ expect(cli).to have_received(:start)
93
93
  end
94
94
  end
95
95
 
96
96
  describe 'halt' do
97
- let(:cli) { instance_double('Vagrant::LXC::Driver::CLI', shutdown: true) }
97
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, shutdown: true) }
98
98
 
99
99
  subject { described_class.new('name', nil, cli) }
100
100
 
101
101
  before do
102
- cli.stub(:transition_to).and_yield(cli)
102
+ allow(cli).to receive(:transition_to).and_yield(cli)
103
103
  end
104
104
 
105
105
  it 'delegates to cli shutdown' do
106
- cli.should_receive(:shutdown)
106
+ expect(cli).to receive(:shutdown)
107
107
  subject.forced_halt
108
108
  end
109
109
 
110
110
  it 'expects a transition to running state to take place' do
111
- cli.should_receive(:transition_to).with(:stopped)
111
+ expect(cli).to receive(:transition_to).with(:stopped)
112
112
  subject.forced_halt
113
113
  end
114
114
 
115
115
  it 'attempts to force the container to stop in case a shutdown doesnt work' do
116
- cli.stub(:shutdown).and_raise(Vagrant::LXC::Driver::CLI::TargetStateNotReached.new :target, :source)
117
- cli.should_receive(:transition_to).with(:stopped).twice
118
- cli.should_receive(:stop)
116
+ allow(cli).to receive(:shutdown).and_raise(Vagrant::LXC::Driver::CLI::TargetStateNotReached.new :target, :source)
117
+ expect(cli).to receive(:transition_to).with(:stopped).twice
118
+ expect(cli).to receive(:stop)
119
119
  subject.forced_halt
120
120
  end
121
121
 
122
122
  it 'attempts to force the container to stop in case lxc-shutdown is not supported' do
123
- cli.stub(:shutdown).and_raise(Vagrant::LXC::Driver::CLI::ShutdownNotSupported)
124
- cli.should_receive(:transition_to).with(:stopped).twice
125
- cli.should_receive(:stop)
123
+ allow(cli).to receive(:shutdown).and_raise(Vagrant::LXC::Driver::CLI::ShutdownNotSupported)
124
+ expect(cli).to receive(:transition_to).with(:stopped).twice
125
+ expect(cli).to receive(:stop)
126
126
  subject.forced_halt
127
127
  end
128
128
  end
129
129
 
130
130
  describe 'state' do
131
131
  let(:cli_state) { :something }
132
- let(:cli) { instance_double('Vagrant::LXC::Driver::CLI', state: cli_state) }
132
+ let(:cli) { double(Vagrant::LXC::Driver::CLI, state: cli_state) }
133
133
 
134
134
  subject { described_class.new('name', nil, cli) }
135
135
 
136
136
  it 'delegates to cli' do
137
- subject.state.should == cli_state
137
+ expect(subject.state).to eq(cli_state)
138
138
  end
139
139
  end
140
140
 
141
141
  describe 'folder sharing' do
142
142
  let(:shared_folder) { {guestpath: '/vagrant', hostpath: '/path/to/host/dir'} }
143
- let(:folders) { [shared_folder] }
143
+ let(:ro_rw_folder) { {guestpath: '/vagrant/ro_rw', hostpath: '/path/to/host/dir', mount_options: ['ro', 'rw']} }
144
+ let(:folders) { [shared_folder, ro_rw_folder] }
144
145
  let(:rootfs_path) { Pathname('/path/to/rootfs') }
145
146
  let(:expected_guest_path) { "#{rootfs_path}/vagrant" }
146
- let(:sudo_wrapper) { instance_double('Vagrant::LXC::SudoWrapper', run: true) }
147
+ let(:sudo_wrapper) { double(Vagrant::LXC::SudoWrapper, run: true) }
147
148
 
148
149
  subject { described_class.new('name', sudo_wrapper) }
149
150
 
@@ -153,14 +154,21 @@ describe Vagrant::LXC::Driver do
153
154
  end
154
155
 
155
156
  it "creates guest folder under container's rootfs" do
156
- sudo_wrapper.should have_received(:run).with("mkdir", "-p", expected_guest_path)
157
+ expect(sudo_wrapper).to have_received(:run).with("mkdir", "-p", expected_guest_path)
157
158
  end
158
159
 
159
160
  it 'adds a mount.entry to its local customizations' do
160
- subject.customizations.should include [
161
+ expect(subject.customizations).to include [
161
162
  'mount.entry',
162
163
  "#{shared_folder[:hostpath]} #{expected_guest_path} none bind 0 0"
163
164
  ]
164
165
  end
166
+
167
+ it 'supports additional mount options' do
168
+ expect(subject.customizations).to include [
169
+ 'mount.entry',
170
+ "#{ro_rw_folder[:hostpath]} #{rootfs_path}/vagrant/ro_rw none ro,rw 0 0"
171
+ ]
172
+ end
165
173
  end
166
174
  end
@@ -2,23 +2,23 @@ module UnitExampleGroup
2
2
  def self.included(base)
3
3
  base.metadata[:type] = :unit
4
4
  base.before do
5
- Object.any_instance.stub(:system) { |*args, &block|
5
+ allow_any_instance_of(Object).to receive(:system) { |instance, *args, &block|
6
6
  UnitExampleGroup.prevent_system_calls(*args, &block)
7
7
  }
8
- Object.any_instance.stub(:`) { |*args, &block|
8
+ allow_any_instance_of(Object).to receive(:`) { |instance, *args, &block|
9
9
  UnitExampleGroup.prevent_system_calls(*args, &block)
10
10
  }
11
- Object.any_instance.stub(:exec) { |*args, &block|
11
+ allow_any_instance_of(Object).to receive(:exec) { |instance, *args, &block|
12
12
  UnitExampleGroup.prevent_system_calls(*args, &block)
13
13
  }
14
- Object.any_instance.stub(:fork) { |*args, &block|
14
+ allow_any_instance_of(Object).to receive(:fork) { |instance, *args, &block|
15
15
  UnitExampleGroup.prevent_system_calls(*args, &block)
16
16
  }
17
- Object.any_instance.stub(:spawn) { |*args, &block|
17
+ allow_any_instance_of(Object).to receive(:spawn) { |instance, *args, &block|
18
18
  UnitExampleGroup.prevent_system_calls(*args, &block)
19
19
  }
20
20
  require 'vagrant/util/subprocess'
21
- Vagrant::Util::Subprocess.stub(:execute) { |*args, &block|
21
+ allow(Vagrant::Util::Subprocess).to receive(:execute) { |*args, &block|
22
22
  UnitExampleGroup.prevent_system_calls(*args, &block)
23
23
  }
24
24
  end