vagrant-lxc 0.8.0 → 1.0.0.alpha.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.
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