vagrant-parallels 1.6.2 → 1.6.3
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 +4 -4
- data/CHANGELOG.md +29 -0
- data/LICENSE.txt +1 -1
- data/lib/vagrant-parallels/action.rb +7 -0
- data/lib/vagrant-parallels/action/box_unregister.rb +3 -0
- data/lib/vagrant-parallels/action/check_shared_interface.rb +29 -0
- data/lib/vagrant-parallels/action/clear_forwarded_ports.rb +3 -2
- data/lib/vagrant-parallels/action/export.rb +69 -6
- data/lib/vagrant-parallels/action/forward_ports.rb +1 -1
- data/lib/vagrant-parallels/action/network.rb +8 -10
- data/lib/vagrant-parallels/action/sane_defaults.rb +2 -1
- data/lib/vagrant-parallels/cap.rb +0 -1
- data/lib/vagrant-parallels/config.rb +18 -8
- data/lib/vagrant-parallels/driver/base.rb +68 -24
- data/lib/vagrant-parallels/driver/meta.rb +3 -1
- data/lib/vagrant-parallels/driver/pd_10.rb +36 -39
- data/lib/vagrant-parallels/driver/pd_11.rb +4 -0
- data/lib/vagrant-parallels/driver/pd_8.rb +31 -27
- data/lib/vagrant-parallels/errors.rb +10 -2
- data/lib/vagrant-parallels/version.rb +1 -1
- data/locales/en.yml +25 -9
- metadata +4 -29
- data/.gitignore +0 -34
- data/.travis.yml +0 -10
- data/CONTRIBUTING.md +0 -80
- data/Gemfile +0 -14
- data/Rakefile +0 -21
- data/debug.log +0 -1237
- data/tasks/acceptance.rake +0 -28
- data/tasks/bundler.rake +0 -3
- data/tasks/test.rake +0 -8
- data/test/acceptance/base.rb +0 -2
- data/test/acceptance/provider/linked_clone_spec.rb +0 -30
- data/test/acceptance/provider/snapshot_spec.rb +0 -63
- data/test/acceptance/shared/context_parallels.rb +0 -2
- data/test/acceptance/skeletons/linked_clone/Vagrantfile +0 -7
- data/test/unit/base.rb +0 -24
- data/test/unit/cap_test.rb +0 -96
- data/test/unit/config_test.rb +0 -91
- data/test/unit/driver/pd_10_test.rb +0 -31
- data/test/unit/driver/pd_8_test.rb +0 -10
- data/test/unit/driver/pd_9_test.rb +0 -29
- data/test/unit/support/shared/parallels_context.rb +0 -230
- data/test/unit/support/shared/pd_driver_examples.rb +0 -339
- data/test/unit/synced_folder_test.rb +0 -49
- data/vagrant-parallels.gemspec +0 -59
- data/vagrant-spec.config.example.rb +0 -10
@@ -1,230 +0,0 @@
|
|
1
|
-
shared_context 'parallels' do
|
2
|
-
let(:parallels_context) { true }
|
3
|
-
let(:uuid) { '1234-here-is-uuid-5678' }
|
4
|
-
let(:parallels_version) { '9' }
|
5
|
-
let(:subprocess) { double('Vagrant::Util::Subprocess') }
|
6
|
-
let(:driver) { subject.instance_variable_get('@driver') }
|
7
|
-
|
8
|
-
let(:vm_name) {'VM_Name'}
|
9
|
-
let(:tpl_uuid) {'1234-some-template-uuid-5678'}
|
10
|
-
let(:tpl_name) {'Some_Template_Name'}
|
11
|
-
let(:tools_state) {'installed'}
|
12
|
-
let(:tools_version) {'8.0.18615.123456'}
|
13
|
-
let(:hostonly_iface) {'vnic10'}
|
14
|
-
|
15
|
-
let(:vnic_options) do {
|
16
|
-
name: 'vagrant_vnic6',
|
17
|
-
adapter_ip: '11.11.11.11',
|
18
|
-
netmask: '255.255.252.0',
|
19
|
-
dhcp: {
|
20
|
-
ip: '11.11.11.11',
|
21
|
-
lower: '11.11.8.1',
|
22
|
-
upper: '11.11.11.254'
|
23
|
-
}
|
24
|
-
} end
|
25
|
-
|
26
|
-
# this is a helper that returns a duck type suitable from a system command
|
27
|
-
# execution; allows setting exit_code, stdout, and stderr in stubs.
|
28
|
-
def subprocess_result(options={})
|
29
|
-
defaults = {exit_code: 0, stdout: '', stderr: ''}
|
30
|
-
double('subprocess_result', defaults.merge(options))
|
31
|
-
end
|
32
|
-
|
33
|
-
before do
|
34
|
-
# Consider that 'prlctl' and 'prlsrvctl' binaries are available
|
35
|
-
allow(Vagrant::Util::Which).to receive(:which).with('prlctl').and_return('prlctl')
|
36
|
-
allow(Vagrant::Util::Which).to receive(:which).with('prlsrvctl').and_return('prlsrvctl')
|
37
|
-
allow(Vagrant::Util::Which).to receive(:which).with('prl_disk_tool').and_return('prl_disk_tool')
|
38
|
-
|
39
|
-
# we don't want unit tests to ever run commands on the system; so we wire
|
40
|
-
# in a double to ensure any unexpected messages raise exceptions
|
41
|
-
stub_const('Vagrant::Util::Subprocess', subprocess)
|
42
|
-
|
43
|
-
# drivers will blow up on instantiation if they cannot determine the
|
44
|
-
# Parallels Desktop version, so wire this stub in automatically
|
45
|
-
subprocess.stub(:execute).
|
46
|
-
with('prlctl', '--version', an_instance_of(Hash)).
|
47
|
-
and_return(subprocess_result(stdout: "prlctl version #{parallels_version}.0.98765"))
|
48
|
-
|
49
|
-
# drivers also call vm_exists? during init;
|
50
|
-
subprocess.stub(:execute).
|
51
|
-
with('prlctl', 'list', uuid, kind_of(Hash)).
|
52
|
-
and_return(subprocess_result(exit_code: 0))
|
53
|
-
|
54
|
-
# Returns detailed info about specified VM or all registered VMs
|
55
|
-
# `prlctl list <vm_uuid> --info --no-header --json`
|
56
|
-
# `prlctl list --all --info --no-header --json`
|
57
|
-
subprocess.stub(:execute).
|
58
|
-
with('prlctl', 'list', kind_of(String), '--info', '--no-header', '--json',
|
59
|
-
kind_of(Hash)) do
|
60
|
-
out = <<-eos
|
61
|
-
[
|
62
|
-
{
|
63
|
-
"ID": "#{uuid}",
|
64
|
-
"Name": "#{vm_name}",
|
65
|
-
"State": "stopped",
|
66
|
-
"Home": "/path/to/#{vm_name}.pvm/",
|
67
|
-
"GuestTools": {
|
68
|
-
"state": "#{tools_state}",
|
69
|
-
"version": "#{tools_version}"
|
70
|
-
},
|
71
|
-
"Hardware": {
|
72
|
-
"cpu": {
|
73
|
-
"cpus": 1
|
74
|
-
},
|
75
|
-
"memory": {
|
76
|
-
"size": "512Mb"
|
77
|
-
},
|
78
|
-
"hdd0": {
|
79
|
-
"enabled": true,
|
80
|
-
"image": "/path/to/disk1.hdd"
|
81
|
-
},
|
82
|
-
"net0": {
|
83
|
-
"enabled": true,
|
84
|
-
"type": "shared",
|
85
|
-
"mac": "001C42B4B074",
|
86
|
-
"card": "e1000",
|
87
|
-
"dhcp": "yes"
|
88
|
-
},
|
89
|
-
"net1": {
|
90
|
-
"enabled": true,
|
91
|
-
"type": "bridged",
|
92
|
-
"iface": "vnic2",
|
93
|
-
"mac": "001C42EC0068",
|
94
|
-
"card": "e1000",
|
95
|
-
"ips": "33.33.33.5/255.255.255.0 "
|
96
|
-
}
|
97
|
-
},
|
98
|
-
"Host Shared Folders": {
|
99
|
-
"enabled": true,
|
100
|
-
"shared_folder_1": {
|
101
|
-
"enabled": true,
|
102
|
-
"path": "/path/to/shared/folder/1"
|
103
|
-
},
|
104
|
-
"shared_folder_2": {
|
105
|
-
"enabled": true,
|
106
|
-
"path": "/path/to/shared/folder/2"
|
107
|
-
}
|
108
|
-
}
|
109
|
-
}
|
110
|
-
]
|
111
|
-
eos
|
112
|
-
subprocess_result(stdout: out)
|
113
|
-
end
|
114
|
-
|
115
|
-
# Returns detailed info about specified template or all registered templates
|
116
|
-
# `prlctl list <tpl_uuid> --info --json --no-header --template`
|
117
|
-
# `prlctl list --all --info --no-header --json --template`
|
118
|
-
subprocess.stub(:execute).
|
119
|
-
with('prlctl', 'list', kind_of(String), '--info', '--no-header', '--json',
|
120
|
-
'--template', kind_of(Hash)) do
|
121
|
-
out = <<-eos
|
122
|
-
[
|
123
|
-
{
|
124
|
-
"ID": "#{tpl_uuid}",
|
125
|
-
"Name": "#{tpl_name}",
|
126
|
-
"State": "stopped",
|
127
|
-
"Home": "/path/to/#{tpl_name}.pvm/",
|
128
|
-
"GuestTools": {
|
129
|
-
"state": "#{tools_state}",
|
130
|
-
"version": "#{tools_version}"
|
131
|
-
},
|
132
|
-
"Hardware": {
|
133
|
-
"cpu": {
|
134
|
-
"cpus": 1
|
135
|
-
},
|
136
|
-
"memory": {
|
137
|
-
"size": "512Mb"
|
138
|
-
},
|
139
|
-
"hdd0": {
|
140
|
-
"enabled": true,
|
141
|
-
"image": "/path/to/harddisk.hdd"
|
142
|
-
},
|
143
|
-
"net0": {
|
144
|
-
"enabled": true,
|
145
|
-
"type": "shared",
|
146
|
-
"mac": "001C42F6E500",
|
147
|
-
"card": "e1000",
|
148
|
-
"dhcp": "yes"
|
149
|
-
},
|
150
|
-
"net1": {
|
151
|
-
"enabled": true,
|
152
|
-
"type": "bridged",
|
153
|
-
"iface": "vnic4",
|
154
|
-
"mac": "001C42AB0071",
|
155
|
-
"card": "e1000",
|
156
|
-
"ips": "33.33.33.10/255.255.255.0 "
|
157
|
-
}
|
158
|
-
}
|
159
|
-
}
|
160
|
-
]
|
161
|
-
eos
|
162
|
-
subprocess_result(stdout: out)
|
163
|
-
end
|
164
|
-
|
165
|
-
# Returns detailed info about virtual network interface
|
166
|
-
# `prlsrvctl net info <net_name>, '--json'`
|
167
|
-
subprocess.stub(:execute).
|
168
|
-
with('prlsrvctl', 'net', 'info', kind_of(String), '--json',
|
169
|
-
kind_of(Hash)) do
|
170
|
-
out = <<-eos
|
171
|
-
{
|
172
|
-
"Network ID": "#{vnic_options[:name]}",
|
173
|
-
"Type": "host-only",
|
174
|
-
"Bound To": "#{hostonly_iface}",
|
175
|
-
"Parallels adapter": {
|
176
|
-
"IP address": "#{vnic_options[:adapter_ip]}",
|
177
|
-
"Subnet mask": "#{vnic_options[:netmask]}"
|
178
|
-
},
|
179
|
-
"DHCPv4 server": {
|
180
|
-
"Server address": "#{vnic_options[:dhcp][:ip] || '10.37.132.1'}",
|
181
|
-
"IP scope start address": "#{vnic_options[:dhcp][:lower] || '10.37.132.1'}",
|
182
|
-
"IP scope end address": "#{vnic_options[:dhcp][:upper] || '10.37.132.254'}"
|
183
|
-
}
|
184
|
-
}
|
185
|
-
eos
|
186
|
-
subprocess_result(stdout: out)
|
187
|
-
end
|
188
|
-
|
189
|
-
# Returns values of 'name' and 'uuid' options for all registered VMs
|
190
|
-
# `prlctl list --all --no-header --json -o name,uuid`
|
191
|
-
subprocess.stub(:execute).
|
192
|
-
with('prlctl', 'list', '--all', '--no-header', '--json', '-o', 'name,uuid',
|
193
|
-
kind_of(Hash)) do
|
194
|
-
out = <<-eos
|
195
|
-
[
|
196
|
-
{
|
197
|
-
"name": "#{vm_name}",
|
198
|
-
"uuid": "#{uuid}"
|
199
|
-
}
|
200
|
-
]
|
201
|
-
eos
|
202
|
-
subprocess_result(stdout: out)
|
203
|
-
end
|
204
|
-
|
205
|
-
# Returns values of 'name' and 'uuid' options for all registered templates
|
206
|
-
# `prlctl list --all --no-header --json -o name,uuid --template`
|
207
|
-
subprocess.stub(:execute).
|
208
|
-
with('prlctl', 'list', '--all', '--no-header', '--json', '-o', 'name,uuid',
|
209
|
-
'--template', kind_of(Hash)) do
|
210
|
-
out = <<-eos
|
211
|
-
[
|
212
|
-
{
|
213
|
-
"name": "#{tpl_name}",
|
214
|
-
"uuid": "#{tpl_uuid}"
|
215
|
-
}
|
216
|
-
]
|
217
|
-
eos
|
218
|
-
subprocess_result(stdout: out)
|
219
|
-
end
|
220
|
-
|
221
|
-
# Returns value of 'mac' options for the specified VM
|
222
|
-
# `prlctl list --all --no-header -o mac`
|
223
|
-
subprocess.stub(:execute).
|
224
|
-
with('prlctl', 'list', kind_of(String), '--no-header', '-o', 'mac',
|
225
|
-
kind_of(Hash)) do
|
226
|
-
subprocess_result(stdout: "00:1C:42:B4:B0:74 00:1C:42:B4:B0:90\n")
|
227
|
-
end
|
228
|
-
|
229
|
-
end
|
230
|
-
end
|
@@ -1,339 +0,0 @@
|
|
1
|
-
shared_examples 'parallels desktop driver' do |options|
|
2
|
-
before do
|
3
|
-
raise ArgumentError, 'Need parallels context to use these shared examples.' unless defined? parallels_context
|
4
|
-
end
|
5
|
-
|
6
|
-
describe 'compact' do
|
7
|
-
settings = {'Hardware' => {'hdd0' => {'image' => '/path/to/disk0.hdd'},
|
8
|
-
'hdd1' => {'image' => '/path/to/disk1.hdd'}}}
|
9
|
-
it 'compacts the VM disk drives' do
|
10
|
-
driver.should_receive(:read_settings).and_return(settings)
|
11
|
-
|
12
|
-
subprocess.should_receive(:execute).exactly(2).times.
|
13
|
-
with('prl_disk_tool', 'compact', '--hdd', /^\/path\/to\/disk(0|1).hdd$/,
|
14
|
-
an_instance_of(Hash)).
|
15
|
-
and_return(subprocess_result(exit_code: 0))
|
16
|
-
subject.compact(uuid)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe 'clear_shared_folders' do
|
21
|
-
it 'deletes every shared folder assigned to the VM' do
|
22
|
-
subprocess.should_receive(:execute).at_least(2).times.
|
23
|
-
with('prlctl', 'set', uuid, '--shf-host-del', an_instance_of(String),
|
24
|
-
an_instance_of(Hash)).
|
25
|
-
and_return(subprocess_result(exit_code: 0))
|
26
|
-
subject.clear_shared_folders
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe 'create_host_only_network' do
|
31
|
-
let(:hostonly_iface) {'vnic12'}
|
32
|
-
it 'creates host-only NIC with dhcp server configured' do
|
33
|
-
vnic_opts = {
|
34
|
-
network_id: 'vagrant_vnic8',
|
35
|
-
adapter_ip: '11.11.11.11',
|
36
|
-
netmask: '255.255.252.0',
|
37
|
-
dhcp: {
|
38
|
-
ip: '11.11.11.11',
|
39
|
-
lower: '11.11.8.1',
|
40
|
-
upper: '11.11.11.254'
|
41
|
-
}
|
42
|
-
}
|
43
|
-
|
44
|
-
subprocess.should_receive(:execute).
|
45
|
-
with('prlsrvctl', 'net', 'add', vnic_opts[:network_id],
|
46
|
-
'--type', 'host-only', an_instance_of(Hash)).
|
47
|
-
and_return(subprocess_result(exit_code: 0))
|
48
|
-
|
49
|
-
subprocess.should_receive(:execute).
|
50
|
-
with('prlsrvctl', 'net', 'set', vnic_opts[:network_id],
|
51
|
-
'--ip', "#{vnic_opts[:adapter_ip]}/#{vnic_opts[:netmask]}",
|
52
|
-
'--dhcp-ip', vnic_opts[:dhcp][:ip],
|
53
|
-
'--ip-scope-start', vnic_opts[:dhcp][:lower],
|
54
|
-
'--ip-scope-end', vnic_opts[:dhcp][:upper], an_instance_of(Hash)).
|
55
|
-
and_return(subprocess_result(exit_code: 0))
|
56
|
-
|
57
|
-
interface = subject.create_host_only_network(vnic_opts)
|
58
|
-
|
59
|
-
interface.should include(:ip => vnic_opts[:adapter_ip])
|
60
|
-
interface.should include(:netmask => vnic_opts[:netmask])
|
61
|
-
interface.should include(:dhcp => vnic_opts[:dhcp])
|
62
|
-
# TODO: implement nicer tests for all supported PD versions
|
63
|
-
# interface.should include(:name => hostonly_iface)
|
64
|
-
# interface[:name].should =~ /^(vnic(\d+))$/
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'creates host-only NIC without dhcp' do
|
68
|
-
vnic_options = {
|
69
|
-
network_id: 'vagrant_vnic3',
|
70
|
-
adapter_ip: '22.22.22.22',
|
71
|
-
netmask: '255.255.254.0',
|
72
|
-
}
|
73
|
-
|
74
|
-
subprocess.should_receive(:execute).
|
75
|
-
with('prlsrvctl', 'net', 'add', vnic_options[:network_id],
|
76
|
-
'--type', 'host-only', an_instance_of(Hash)).
|
77
|
-
and_return(subprocess_result(exit_code: 0))
|
78
|
-
|
79
|
-
subprocess.should_receive(:execute).
|
80
|
-
with('prlsrvctl', 'net', 'set', vnic_options[:network_id],
|
81
|
-
'--ip', "#{vnic_options[:adapter_ip]}/#{vnic_options[:netmask]}",
|
82
|
-
an_instance_of(Hash)).
|
83
|
-
and_return(subprocess_result(exit_code: 0))
|
84
|
-
|
85
|
-
interface = subject.create_host_only_network(vnic_options)
|
86
|
-
|
87
|
-
interface.should include(:ip => vnic_options[:adapter_ip])
|
88
|
-
interface.should include(:netmask => vnic_options[:netmask])
|
89
|
-
interface.should include(:dhcp => nil)
|
90
|
-
# TODO: implement nicer tests for all supported PD versions
|
91
|
-
# interface.should include(:name => hostonly_iface)
|
92
|
-
# interface[:name].should =~ /^(vnic(\d+))$/
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
describe 'delete' do
|
97
|
-
it 'deletes the VM' do
|
98
|
-
subprocess.should_receive(:execute).
|
99
|
-
with('prlctl', 'delete', uuid, an_instance_of(Hash)).
|
100
|
-
and_return(subprocess_result(exit_code: 0))
|
101
|
-
subject.delete
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
describe 'delete_disabled_adapters' do
|
106
|
-
it 'deletes disabled networks adapters from VM config' do
|
107
|
-
settings = {'Hardware' => {'net0' => {'enabled' => false},
|
108
|
-
'net1' => {'enabled' => false}}}
|
109
|
-
driver.should_receive(:read_settings).and_return(settings)
|
110
|
-
subprocess.should_receive(:execute).exactly(2).times.
|
111
|
-
with('prlctl', 'set', uuid, '--device-del', /^net(0|1)$/,
|
112
|
-
an_instance_of(Hash)).
|
113
|
-
and_return(subprocess_result(exit_code: 0))
|
114
|
-
subject.delete_disabled_adapters
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe 'clone_vm' do
|
119
|
-
it 'clones VM to the new one' do
|
120
|
-
subprocess.should_receive(:execute).
|
121
|
-
with('prlctl', 'clone', tpl_uuid, '--name', an_instance_of(String),
|
122
|
-
an_instance_of(Hash)).
|
123
|
-
and_return(subprocess_result(exit_code: 0))
|
124
|
-
subject.clone_vm(tpl_uuid)
|
125
|
-
end
|
126
|
-
|
127
|
-
it 'clones VM to the exported VM' do
|
128
|
-
subprocess.should_receive(:execute).
|
129
|
-
with('prlctl', 'clone', uuid, '--name', an_instance_of(String),
|
130
|
-
'--dst', an_instance_of(String), an_instance_of(Hash)).
|
131
|
-
and_return(subprocess_result(exit_code: 0))
|
132
|
-
subject.clone_vm(uuid, {dst: '/path/to/template'})
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe 'halt' do
|
137
|
-
it 'stops the VM' do
|
138
|
-
subprocess.should_receive(:execute).
|
139
|
-
with('prlctl', 'stop', uuid, an_instance_of(Hash)).
|
140
|
-
and_return(subprocess_result(exit_code: 0))
|
141
|
-
subject.halt
|
142
|
-
end
|
143
|
-
|
144
|
-
it 'stops the VM force' do
|
145
|
-
subprocess.should_receive(:execute).
|
146
|
-
with('prlctl', 'stop', uuid, '--kill', an_instance_of(Hash)).
|
147
|
-
and_return(subprocess_result(exit_code: 0))
|
148
|
-
subject.halt(force=true)
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
describe 'read_guest_tools_state' do
|
153
|
-
let(:tools_state) {'outdated'}
|
154
|
-
|
155
|
-
it 'returns Guest Tools state as a symbol' do
|
156
|
-
subject.read_guest_tools_state.should be(:outdated)
|
157
|
-
end
|
158
|
-
|
159
|
-
it "returns :not_installed if Guest Tools state can't be reached" do
|
160
|
-
driver.should_receive(:read_settings).and_return(exit_code: 0)
|
161
|
-
subject.read_guest_tools_state.should be(:not_installed)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
describe 'read_guest_tools_iso_path' do
|
166
|
-
before do
|
167
|
-
subprocess.stub(:execute).
|
168
|
-
with('mdfind', /^kMDItemCFBundleIdentifier ==/, an_instance_of(Hash)).
|
169
|
-
and_return(subprocess_result(stdout: '/Applications/Parallels Desktop.app'))
|
170
|
-
end
|
171
|
-
|
172
|
-
it 'returns a valid path to the ISO' do
|
173
|
-
File.stub(:exist?).and_return(true)
|
174
|
-
iso_path = subject.read_guest_tools_iso_path('linux')
|
175
|
-
iso_path.should be_kind_of(String)
|
176
|
-
iso_path.should match(/prl-tools-lin\.iso$/)
|
177
|
-
end
|
178
|
-
|
179
|
-
it 'raises an exception if ISO file does not exists' do
|
180
|
-
File.stub(:exist?).and_return(false)
|
181
|
-
expect { subject.read_guest_tools_iso_path('windows') }.
|
182
|
-
to raise_error(VagrantPlugins::Parallels::Errors::ParallelsToolsIsoNotFound)
|
183
|
-
end
|
184
|
-
|
185
|
-
it 'returns nil if guest OS is unsupported or invalid' do
|
186
|
-
subject.read_guest_tools_iso_path('').should be_nil
|
187
|
-
subject.read_guest_tools_iso_path('bolgenos').should be_nil
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
describe 'read_mac_addresses' do
|
192
|
-
it 'returns MAC addresses of all network interface cards' do
|
193
|
-
subject.read_mac_addresses.should be_kind_of(Array)
|
194
|
-
subject.read_mac_addresses.should include('001C42B4B074')
|
195
|
-
subject.read_mac_addresses.should include('001C42B4B090')
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
describe 'read_settings' do
|
200
|
-
it 'returns a hash with detailed info about the VM' do
|
201
|
-
subject.read_settings.should be_kind_of(Hash)
|
202
|
-
subject.read_settings.should include('ID' => uuid)
|
203
|
-
subject.read_settings.should include('Hardware')
|
204
|
-
subject.read_settings.should include('GuestTools')
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
describe 'read_vm_option' do
|
209
|
-
it 'returns stripped value' do
|
210
|
-
subprocess.stub(:execute).
|
211
|
-
with('prlctl', 'list', uuid, '--no-header', '-o', an_instance_of(String),
|
212
|
-
an_instance_of(Hash)).
|
213
|
-
and_return(subprocess_result(stdout: "opt_val \n"))
|
214
|
-
|
215
|
-
subject.read_vm_option('supported_option').should == 'opt_val'
|
216
|
-
end
|
217
|
-
|
218
|
-
it 'raises an exception in option is not available' do
|
219
|
-
subprocess.stub(:execute).
|
220
|
-
with('prlctl', 'list', uuid, '--no-header', '-o', an_instance_of(String),
|
221
|
-
an_instance_of(Hash)).
|
222
|
-
and_return(subprocess_result(stdout: " \n"))
|
223
|
-
|
224
|
-
expect { subject.read_vm_option('invalid_option') }.
|
225
|
-
to raise_error(VagrantPlugins::Parallels::Errors::ParallelsVMOptionNotFound)
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
describe 'read_vms' do
|
230
|
-
it 'returns the list of all registered VMs and templates' do
|
231
|
-
subject.read_vms.should be_kind_of(Hash)
|
232
|
-
subject.read_vms.should have_at_least(2).items
|
233
|
-
subject.read_vms.should include(vm_name => uuid)
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
describe 'read_vms_info' do
|
238
|
-
it 'returns detailed info about all registered VMs and templates' do
|
239
|
-
subject.read_vms_info.should be_kind_of(Array)
|
240
|
-
subject.read_vms_info.should have_at_least(2).items
|
241
|
-
|
242
|
-
# It should include info about current VM
|
243
|
-
vm_settings = driver.send(:read_settings)
|
244
|
-
subject.read_vms_info.should include(vm_settings)
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
describe 'register' do
|
249
|
-
it 'registers specified virtual machine or template' do
|
250
|
-
subprocess.should_receive(:execute).
|
251
|
-
with('prlctl', 'register', an_instance_of(String), an_instance_of(Hash)).
|
252
|
-
and_return(subprocess_result(exit_code: 0))
|
253
|
-
|
254
|
-
subject.register('/path/to/vm_image.pvm')
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
describe 'set_name' do
|
259
|
-
it 'sets new name for the VM' do
|
260
|
-
subprocess.should_receive(:execute).
|
261
|
-
with('prlctl', 'set', uuid, '--name', an_instance_of(String),
|
262
|
-
an_instance_of(Hash)).
|
263
|
-
and_return(subprocess_result(exit_code: 0))
|
264
|
-
|
265
|
-
subject.set_name(uuid, 'new_vm_name')
|
266
|
-
end
|
267
|
-
end
|
268
|
-
|
269
|
-
describe 'ssh_ip' do
|
270
|
-
let(:content) {'10.200.0.100="1394546410,1800,001c420000ff,01001c420000ff
|
271
|
-
10.200.0.99="1394547632,1800,001c420000ff,01001c420000ff"'}
|
272
|
-
|
273
|
-
it 'returns an IP address assigned to the specified MAC' do
|
274
|
-
driver.should_receive(:read_mac_address).and_return('001C420000FF')
|
275
|
-
File.should_receive(:open).with(an_instance_of(String)).
|
276
|
-
and_return(StringIO.new(content))
|
277
|
-
|
278
|
-
subject.ssh_ip.should == '10.200.0.99'
|
279
|
-
end
|
280
|
-
|
281
|
-
it 'rises DhcpLeasesNotAccessible exception when file is not accessible' do
|
282
|
-
File.stub(:open).and_call_original
|
283
|
-
File.should_receive(:open).with(an_instance_of(String)).
|
284
|
-
and_raise(Errno::EACCES)
|
285
|
-
expect { subject.ssh_ip }.
|
286
|
-
to raise_error(VagrantPlugins::Parallels::Errors::DhcpLeasesNotAccessible)
|
287
|
-
end
|
288
|
-
end
|
289
|
-
|
290
|
-
describe 'start' do
|
291
|
-
it 'starts the VM' do
|
292
|
-
subprocess.should_receive(:execute).
|
293
|
-
with('prlctl', 'start', uuid, an_instance_of(Hash)).
|
294
|
-
and_return(subprocess_result(exit_code: 0))
|
295
|
-
subject.start
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
describe 'suspend' do
|
300
|
-
it 'suspends the VM' do
|
301
|
-
subprocess.should_receive(:execute).
|
302
|
-
with('prlctl', 'suspend', uuid, an_instance_of(Hash)).
|
303
|
-
and_return(subprocess_result(exit_code: 0))
|
304
|
-
subject.suspend
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
describe 'unregister' do
|
309
|
-
it 'suspends the VM' do
|
310
|
-
subprocess.should_receive(:execute).
|
311
|
-
with('prlctl', 'unregister', an_instance_of(String),
|
312
|
-
an_instance_of(Hash)).
|
313
|
-
and_return(subprocess_result(exit_code: 0))
|
314
|
-
subject.unregister('template_or_vm_uuid')
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
describe 'version' do
|
319
|
-
it 'parses the version from output' do
|
320
|
-
subject.version.should match(/^#{parallels_version}.\d+\.\d+$/)
|
321
|
-
end
|
322
|
-
|
323
|
-
it 'raises an exception for unsupported version' do
|
324
|
-
subprocess.should_receive(:execute).
|
325
|
-
with('prlctl', '--version', an_instance_of(Hash)).
|
326
|
-
and_return(subprocess_result(stdout: 'prlctl version 7.0.12345'))
|
327
|
-
expect { subject.version }.
|
328
|
-
to raise_error(VagrantPlugins::Parallels::Errors::ParallelsUnsupportedVersion)
|
329
|
-
end
|
330
|
-
|
331
|
-
it 'raises an exception for invalid version output' do
|
332
|
-
subprocess.should_receive(:execute).
|
333
|
-
with('prlctl', '--version', an_instance_of(Hash)).
|
334
|
-
and_return(subprocess_result(stdout: 'prlctl version 1.2.foo.bar'))
|
335
|
-
expect { subject.version }.
|
336
|
-
to raise_error(VagrantPlugins::Parallels::Errors::ParallelsInvalidVersion)
|
337
|
-
end
|
338
|
-
end
|
339
|
-
end
|