vagrant-proxmox 0.0.2
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 +7 -0
- data/lib/sanity_checks.rb +11 -0
- data/lib/vagrant-proxmox/action/cleanup_after_destroy.rb +20 -0
- data/lib/vagrant-proxmox/action/connect_proxmox.rb +33 -0
- data/lib/vagrant-proxmox/action/create_vm.rb +63 -0
- data/lib/vagrant-proxmox/action/destroy_vm.rb +29 -0
- data/lib/vagrant-proxmox/action/get_node_list.rb +24 -0
- data/lib/vagrant-proxmox/action/is_created.rb +20 -0
- data/lib/vagrant-proxmox/action/is_stopped.rb +20 -0
- data/lib/vagrant-proxmox/action/message_already_running.rb +20 -0
- data/lib/vagrant-proxmox/action/message_already_stopped.rb +20 -0
- data/lib/vagrant-proxmox/action/message_not_created.rb +20 -0
- data/lib/vagrant-proxmox/action/proxmox_action.rb +47 -0
- data/lib/vagrant-proxmox/action/read_ssh_info.rb +22 -0
- data/lib/vagrant-proxmox/action/read_state.rb +37 -0
- data/lib/vagrant-proxmox/action/shutdown_vm.rb +31 -0
- data/lib/vagrant-proxmox/action/start_vm.rb +40 -0
- data/lib/vagrant-proxmox/action/stop_vm.rb +31 -0
- data/lib/vagrant-proxmox/action/sync_folders.rb +52 -0
- data/lib/vagrant-proxmox/action.rb +159 -0
- data/lib/vagrant-proxmox/config.rb +81 -0
- data/lib/vagrant-proxmox/errors.rb +39 -0
- data/lib/vagrant-proxmox/plugin.rb +75 -0
- data/lib/vagrant-proxmox/provider.rb +51 -0
- data/lib/vagrant-proxmox/version.rb +7 -0
- data/lib/vagrant-proxmox.rb +22 -0
- data/locales/en.yml +66 -0
- data/spec/actions/cleanup_after_destroy_action_spec.rb +22 -0
- data/spec/actions/connect_proxmox_action_spec.rb +49 -0
- data/spec/actions/create_vm_action_spec.rb +167 -0
- data/spec/actions/destroy_vm_action_spec.rb +37 -0
- data/spec/actions/get_node_list_action_spec.rb +25 -0
- data/spec/actions/is_created_action_spec.rb +35 -0
- data/spec/actions/is_stopped_action_spec.rb +34 -0
- data/spec/actions/message_already_running_action_spec.rb +23 -0
- data/spec/actions/message_already_stopped_action_spec.rb +23 -0
- data/spec/actions/message_not_created_action_spec.rb +23 -0
- data/spec/actions/proxmox_action_shared.rb +74 -0
- data/spec/actions/read_ssh_info_action_spec.rb +32 -0
- data/spec/actions/read_state_action_spec.rb +54 -0
- data/spec/actions/shutdown_vm_action_spec.rb +37 -0
- data/spec/actions/start_vm_action_spec.rb +47 -0
- data/spec/actions/stop_vm_action_spec.rb +37 -0
- data/spec/actions/sync_folders_action_spec.rb +51 -0
- data/spec/commands/destroy_command_spec.rb +68 -0
- data/spec/commands/halt_command_spec.rb +46 -0
- data/spec/commands/provision_command_spec.rb +33 -0
- data/spec/commands/ssh_command_spec.rb +31 -0
- data/spec/commands/ssh_run_command_spec.rb +32 -0
- data/spec/commands/status_command_spec.rb +19 -0
- data/spec/commands/up_command_spec.rb +55 -0
- data/spec/config_spec.rb +71 -0
- data/spec/plugin_spec.rb +22 -0
- data/spec/provider_spec.rb +25 -0
- data/spec/sanity_checks_spec.rb +19 -0
- data/spec/spec_helper.rb +128 -0
- metadata +242 -0
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'actions/proxmox_action_shared'
|
3
|
+
|
4
|
+
module VagrantPlugins::Proxmox
|
5
|
+
|
6
|
+
describe Action::SyncFolders do
|
7
|
+
|
8
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
9
|
+
let(:env) { {machine: environment.machine(environment.primary_machine_name, :proxmox), ui: double('ui').as_null_object} }
|
10
|
+
|
11
|
+
subject { described_class.new(-> (_) {}, environment) }
|
12
|
+
|
13
|
+
describe '#call' do
|
14
|
+
|
15
|
+
before do
|
16
|
+
env[:machine].stub(:ssh_info) { {host: '127.0.0.1', port: 22, username: 'vagrant', private_key_path: 'key'} }
|
17
|
+
env[:machine].communicate.stub :sudo
|
18
|
+
Vagrant::Util::Subprocess.stub(:execute).and_return Vagrant::Util::Subprocess::Result.new 0, nil, nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it_behaves_like 'a proxmox action call'
|
22
|
+
|
23
|
+
it 'should print a message to the user interface' do
|
24
|
+
expect(env[:ui]).to receive(:info).with("Rsyncing folder: #{Dir.pwd}/ => /vagrant")
|
25
|
+
subject.call env
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should create a directory on the vm with the predefined ownership' do
|
29
|
+
expect(env[:machine].communicate).to receive(:sudo).with("mkdir -p '/vagrant'")
|
30
|
+
expect(env[:machine].communicate).to receive(:sudo).with("chown vagrant '/vagrant'")
|
31
|
+
subject.call env
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should rsync the directory with the vm' do
|
35
|
+
expect(Vagrant::Util::Subprocess).to receive(:execute).with(
|
36
|
+
'rsync', '--verbose', '--archive', '--compress', '--delete',
|
37
|
+
'-e', "ssh -p 22 -i 'key' -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null",
|
38
|
+
"#{Dir.pwd}/", 'vagrant@127.0.0.1:/vagrant')
|
39
|
+
subject.call env
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should raise an error if the rsync fails' do
|
43
|
+
allow(Vagrant::Util::Subprocess).to receive(:execute).and_return(Vagrant::Util::Subprocess::Result.new 1, nil, nil)
|
44
|
+
expect { subject.call(env) }.to raise_error Errors::RsyncError
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module VagrantPlugins::Proxmox
|
4
|
+
|
5
|
+
describe 'Vagrant Proxmox provider destroy command', :need_box do
|
6
|
+
|
7
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
8
|
+
let(:env) { {machine: environment.machine(environment.primary_machine_name, :proxmox)} }
|
9
|
+
let(:ui) { double('ui').as_null_object }
|
10
|
+
|
11
|
+
context 'the vm is not created on the proxmox server' do
|
12
|
+
it 'should call the appropriate actions to print a ui message that the vm is not created' do
|
13
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
14
|
+
Action::IsCreated.should be_called { |env| env[:result] = false }
|
15
|
+
Action::MessageNotCreated.should be_called
|
16
|
+
Action::DestroyVm.should be_ommited
|
17
|
+
execute_vagrant_command environment, :destroy
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'the vm exists on the proxmox server' do
|
22
|
+
|
23
|
+
context 'the destroy command is not confirmed' do
|
24
|
+
it 'should call the appropriate actions to print a ui message that the vm will not be destroyed' do
|
25
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
26
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
27
|
+
::Vagrant::Action::Builtin::DestroyConfirm.should be_called { |env| env[:result] = false }
|
28
|
+
::VagrantPlugins::ProviderVirtualBox::Action::MessageWillNotDestroy.should be_called
|
29
|
+
Action::DestroyVm.should be_ommited
|
30
|
+
execute_vagrant_command environment, :destroy
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'the destroy command is confirmed' do
|
35
|
+
context 'the vm is running' do
|
36
|
+
it 'should call the appropriate actions to destroy the vm' do
|
37
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
38
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
39
|
+
::Vagrant::Action::Builtin::DestroyConfirm.should be_called { |env| env[:result] = true }
|
40
|
+
Action::IsStopped.should be_called { |env| env[:result] = false }
|
41
|
+
Action::ShutdownVm.should be_called
|
42
|
+
Action::DestroyVm.should be_called
|
43
|
+
::Vagrant::Action::Builtin::ProvisionerCleanup.should be_called
|
44
|
+
Action::CleanupAfterDestroy.should be_called
|
45
|
+
execute_vagrant_command environment, :destroy
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'the vm is stopped' do
|
50
|
+
it 'should call the appropriate actions to destroy the vm' do
|
51
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
52
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
53
|
+
Action::DestroyConfirm.should be_called { |env| env[:result] = true }
|
54
|
+
Action::IsStopped.should be_called { |env| env[:result] = true }
|
55
|
+
Action::DestroyVm.should be_called
|
56
|
+
::Vagrant::Action::Builtin::ProvisionerCleanup.should be_called
|
57
|
+
Action::CleanupAfterDestroy.should be_called
|
58
|
+
Action::ShutdownVm.should be_ommited
|
59
|
+
execute_vagrant_command environment, :destroy
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module VagrantPlugins::Proxmox
|
4
|
+
|
5
|
+
describe 'Vagrant Proxmox provider halt command', :need_box do
|
6
|
+
|
7
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
8
|
+
let(:ui) { double('ui').as_null_object }
|
9
|
+
|
10
|
+
context 'the vm is not created on the proxmox server' do
|
11
|
+
it 'should call the appropriate actions and print a ui message that the vm is not created' do
|
12
|
+
Action::ConfigValidate.should be_called
|
13
|
+
Action::IsCreated.should be_called { |env| env[:result] = false }
|
14
|
+
Action::MessageNotCreated.should be_called
|
15
|
+
Action::ConnectProxmox.should be_ommited
|
16
|
+
Action::ShutdownVm.should be_ommited
|
17
|
+
execute_vagrant_command environment, :halt
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'the vm is stopped' do
|
22
|
+
it 'should call the appropriate actions to shut down the vm' do
|
23
|
+
Action::ConfigValidate.should be_called
|
24
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
25
|
+
Action::IsStopped.should be_called { |env| env[:result] = true }
|
26
|
+
Action::MessageAlreadyStopped.should be_called
|
27
|
+
Action::ConnectProxmox.should be_ommited
|
28
|
+
Action::ShutdownVm.should be_ommited
|
29
|
+
execute_vagrant_command environment, :halt
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'the vm is running' do
|
34
|
+
it 'should call the appropriate actions to shut down the vm' do
|
35
|
+
Action::ConfigValidate.should be_called
|
36
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
37
|
+
Action::IsStopped.should be_called { |env| env[:result] = false }
|
38
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
39
|
+
Action::ShutdownVm.should be_called
|
40
|
+
execute_vagrant_command environment, :halt
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module VagrantPlugins::Proxmox
|
4
|
+
|
5
|
+
describe 'Vagrant Proxmox provider provision command', :need_box do
|
6
|
+
|
7
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
8
|
+
let(:ui) { double('ui').as_null_object }
|
9
|
+
|
10
|
+
context 'the vm is not created on the proxmox server' do
|
11
|
+
it 'should call the appropriate actions and print a ui message that the vm is not created' do
|
12
|
+
Action::ConfigValidate.should be_called
|
13
|
+
Action::IsCreated.should be_called { |env| env[:result] = false }
|
14
|
+
Action::MessageNotCreated.should be_called
|
15
|
+
Action::Provision.should be_ommited
|
16
|
+
Action::SyncFolders.should be_ommited
|
17
|
+
execute_vagrant_command environment, :provision
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'the vm exists on the proxmox server' do
|
22
|
+
it 'should call the appropriate actions and provision the vm' do
|
23
|
+
Action::ConfigValidate.should be_called
|
24
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
25
|
+
Action::Provision.should be_called
|
26
|
+
Action::SyncFolders.should be_called
|
27
|
+
execute_vagrant_command environment, :provision
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module VagrantPlugins::Proxmox
|
4
|
+
|
5
|
+
describe 'Vagrant Proxmox provider ssh command', :need_box do
|
6
|
+
|
7
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
8
|
+
let(:ui) { double('ui').as_null_object }
|
9
|
+
|
10
|
+
context 'the vm is not created on the proxmox server' do
|
11
|
+
it 'should call the appropriate actions and print a ui message that the vm is not created' do
|
12
|
+
Action::IsCreated.should be_called { |env| env[:result] = false }
|
13
|
+
Action::MessageNotCreated.should be_called
|
14
|
+
Action::SSHExec.should be_ommited
|
15
|
+
execute_vagrant_command environment, :ssh
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'the vm exists on the proxmox server' do
|
20
|
+
|
21
|
+
it 'should call the appropriate actions to open a ssh connection' do
|
22
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
23
|
+
Action::SSHExec.should be_called
|
24
|
+
execute_vagrant_command environment, :ssh
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module VagrantPlugins::Proxmox
|
4
|
+
|
5
|
+
describe 'Vagrant Proxmox provider ssh exec command', :need_box do
|
6
|
+
|
7
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
8
|
+
let(:env) { {machine: environment.machine(environment.primary_machine_name, :proxmox), ui: double('ui').as_null_object} }
|
9
|
+
let(:ui) { double('ui').as_null_object }
|
10
|
+
|
11
|
+
context 'the vm is not created on the proxmox server' do
|
12
|
+
it 'should call the appropriate actions and print a ui message that the vm is not created' do
|
13
|
+
Action::IsCreated.should be_called { |env| env[:result] = false }
|
14
|
+
Action::MessageNotCreated.should be_called
|
15
|
+
Action::SSHRun.should be_ommited
|
16
|
+
execute_vagrant_command environment, :ssh, '--command', 'foo'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'the vm exists on the proxmox server' do
|
21
|
+
before { env[:machine].stub(:ssh_info) { {host: '127.0.0.1', port: 22, username: 'vagrant', private_key_path: 'key'} } }
|
22
|
+
|
23
|
+
it 'should call the appropriate actions to execute a command via ssh on the vm' do
|
24
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
25
|
+
Action::SSHRun.should be_called
|
26
|
+
execute_vagrant_command environment, :ssh, '--command', 'foo'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module VagrantPlugins::Proxmox
|
4
|
+
|
5
|
+
describe 'Vagrant Proxmox provider status command', :need_box do
|
6
|
+
|
7
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
8
|
+
let(:ui) { double('ui').as_null_object }
|
9
|
+
|
10
|
+
specify do
|
11
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
12
|
+
Action::ReadState.should be_called { |env| env[:machine_state_id] = :stopped }
|
13
|
+
expect(ui).to receive(:info).with /stopped \(proxmox\)/, anything
|
14
|
+
execute_vagrant_command environment, :status
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module VagrantPlugins::Proxmox
|
4
|
+
|
5
|
+
describe 'Vagrant Proxmox provider up command' do
|
6
|
+
|
7
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
8
|
+
let(:ui) { double('ui').as_null_object }
|
9
|
+
|
10
|
+
before do
|
11
|
+
Vagrant::UI::Interface.stub(:new).and_return ui
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'the vm is not yet created' do
|
15
|
+
it 'should call the appropriate actions and print a ui message that the vm will be created' do
|
16
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
17
|
+
Action::GetNodeList.should be_called { |env| env[:proxmox_nodes] = [{node: 'localhost'}] }
|
18
|
+
Action::IsCreated.should be_called { |env| env[:result] = false }
|
19
|
+
Action::CreateVm.should be_called { |env| env[:machine].id = 'localhost/100' }
|
20
|
+
Action::Provision.should be_called
|
21
|
+
Action::StartVm.should be_called
|
22
|
+
Action::SyncFolders.should be_called
|
23
|
+
execute_vagrant_command environment, :up, '--provider=proxmox'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'the vm is stopped' do
|
28
|
+
it 'should call the appropriate actions and print a ui message that the vm will be started' do
|
29
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
30
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
31
|
+
Action::IsStopped.should be_called { |env| env[:result] = true }
|
32
|
+
Action::Provision.should be_called
|
33
|
+
Action::StartVm.should be_called
|
34
|
+
Action::SyncFolders.should be_called
|
35
|
+
Action::CreateVm.should be_ommited
|
36
|
+
execute_vagrant_command environment, :up, '--provider=proxmox'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'the vm is already running' do
|
41
|
+
it 'should call the appropriate actions and print a ui message that the vm is already running' do
|
42
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
43
|
+
Action::IsCreated.should be_called { |env| env[:result] = true }
|
44
|
+
Action::IsStopped.should be_called { |env| env[:result] = false }
|
45
|
+
Action::MessageAlreadyRunning.should be_called
|
46
|
+
Action::Provision.should be_ommited
|
47
|
+
Action::CreateVm.should be_ommited
|
48
|
+
Action::StartVm.should be_ommited
|
49
|
+
execute_vagrant_command environment, :up, '--provider=proxmox'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
data/spec/config_spec.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'vagrant-proxmox/config'
|
3
|
+
|
4
|
+
describe VagrantPlugins::Proxmox::Config do
|
5
|
+
|
6
|
+
describe 'defaults' do
|
7
|
+
subject { super().tap { |o| o.finalize! } }
|
8
|
+
|
9
|
+
its(:endpoint) { should be_nil }
|
10
|
+
its(:user_name) { should be_nil }
|
11
|
+
its(:password) { should be_nil }
|
12
|
+
its(:os_template) { should be_nil }
|
13
|
+
its(:vm_id_range) { should == (900..999) }
|
14
|
+
its(:vm_name_prefix) { should == 'vagrant_' }
|
15
|
+
its(:vm_memory) { should == 512 }
|
16
|
+
its(:task_timeout) { should == 60 }
|
17
|
+
its(:task_status_check_interval) { should == 2 }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'overwriting defaults using a Vagrantfile' do
|
21
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
22
|
+
let(:config) { environment.machine(environment.primary_machine_name, :proxmox).config.vm.get_provider_config :proxmox }
|
23
|
+
|
24
|
+
subject { config }
|
25
|
+
|
26
|
+
its(:endpoint) { should == 'https://your.proxmox.server/api2/json' }
|
27
|
+
its(:user_name) { should == 'vagrant' }
|
28
|
+
its(:password) { should == 'password' }
|
29
|
+
its(:os_template) { should == 'local:vztmpl/template.tgz' }
|
30
|
+
its(:vm_id_range) { should == (900..910) }
|
31
|
+
its(:vm_name_prefix) { should == 'vagrant_test_' }
|
32
|
+
its(:vm_memory) { should == 256 }
|
33
|
+
its(:task_timeout) { should == 30 }
|
34
|
+
its(:task_status_check_interval) { should == 1 }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'Configuration validation' do
|
38
|
+
let(:machine) { double 'machine' }
|
39
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
40
|
+
let(:config) { environment.machine(environment.primary_machine_name, :proxmox).config.vm.get_provider_config :proxmox }
|
41
|
+
|
42
|
+
subject { config }
|
43
|
+
|
44
|
+
describe 'with a valid configuration' do
|
45
|
+
it 'should validate without any error' do
|
46
|
+
subject.validate(machine).should == {'Proxmox Provider' => []}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'with a missing endpoint' do
|
51
|
+
before { subject.endpoint = nil }
|
52
|
+
specify { subject.validate(machine).should == {'Proxmox Provider' => ['No endpoint specified.']} }
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'with a missing user_name' do
|
56
|
+
before { subject.user_name = nil }
|
57
|
+
specify { subject.validate(machine).should == {'Proxmox Provider' => ['No user_name specified.']} }
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'with a missing password' do
|
61
|
+
before { subject.password = nil }
|
62
|
+
specify { subject.validate(machine).should == {'Proxmox Provider' => ['No password specified.']} }
|
63
|
+
end
|
64
|
+
|
65
|
+
describe 'with a missing os_template' do
|
66
|
+
before { subject.os_template = nil }
|
67
|
+
specify { subject.validate(machine).should == {'Proxmox Provider' => ['No os_template specified.']} }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
data/spec/plugin_spec.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Vagrant Proxmox plugin' do
|
4
|
+
|
5
|
+
specify { Vagrant.should have_plugin 'Proxmox' }
|
6
|
+
|
7
|
+
describe 'contains a fix for RestClient header unescaping bug' do
|
8
|
+
let(:request) { RestClient::Request.new method: :get, url: 'url', cookies: { key: '+%20%21' }}
|
9
|
+
it 'should not unescape the cookies' do
|
10
|
+
request.make_headers({})['Cookie'].should == 'key=+%20%21'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'when vagrant log level is set in ENV[VAGRANT_LOG]' do
|
15
|
+
before { ENV['VAGRANT_LOG'] = 'DEBUG' }
|
16
|
+
it 'should create a new vagrant proxmox logger ' do
|
17
|
+
expect(Log4r::Logger).to receive(:new).with('vagrant_proxmox').and_call_original
|
18
|
+
VagrantPlugins::Proxmox::Plugin.setup_logging
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'vagrant-proxmox/provider'
|
3
|
+
|
4
|
+
module VagrantPlugins::Proxmox
|
5
|
+
|
6
|
+
describe Provider do
|
7
|
+
|
8
|
+
let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
9
|
+
let(:machine) { environment.machine(environment.primary_machine_name, :proxmox) }
|
10
|
+
let(:ui) { double('ui').as_null_object }
|
11
|
+
|
12
|
+
subject { described_class.new(machine) }
|
13
|
+
|
14
|
+
describe '#ssh_info', :need_box do
|
15
|
+
it 'should call the appropriate actions and return the ssh info' do
|
16
|
+
Action::ConfigValidate.should be_called
|
17
|
+
Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
18
|
+
Action::ReadSSHInfo.should be_called { |env| env[:machine_ssh_info] = 'ssh_info'}
|
19
|
+
subject.ssh_info.should == 'ssh_info'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Vagrant Proxmox sanity checks' do
|
4
|
+
|
5
|
+
describe 'when loaded without vagrant installed' do
|
6
|
+
before { Object.any_instance.stub(:require) { raise LoadError } }
|
7
|
+
it 'should raise an error' do
|
8
|
+
expect { load 'sanity_checks.rb' }.to raise_error
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'when used with an outdated vagrant version' do
|
13
|
+
before { stub_const 'Vagrant::VERSION', '1.0.7' }
|
14
|
+
it 'should raise an error' do
|
15
|
+
expect { load 'sanity_checks.rb' }.to raise_error
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
if ENV['RUN_WITH_COVERAGE']
|
2
|
+
require 'simplecov'
|
3
|
+
require 'simplecov-rcov'
|
4
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
5
|
+
SimpleCov::Formatter::HTMLFormatter,
|
6
|
+
SimpleCov::Formatter::RcovFormatter,
|
7
|
+
]
|
8
|
+
SimpleCov.start do
|
9
|
+
add_filter '/dummy_box/Vagrantfile'
|
10
|
+
add_filter '/spec/'
|
11
|
+
add_filter '/lib/sanity_checks.rb'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'vagrant-proxmox'
|
16
|
+
require 'active_support/core_ext/string'
|
17
|
+
|
18
|
+
RSpec.configure do |config|
|
19
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
20
|
+
|
21
|
+
config.before(:suite) do
|
22
|
+
begin
|
23
|
+
Vagrant::Environment.new.boxes.add 'dummy_box/dummy.box', 'dummy', :proxmox
|
24
|
+
rescue Vagrant::Errors::BoxAlreadyExists
|
25
|
+
|
26
|
+
end
|
27
|
+
FileUtils.rm_r '.vagrant', force: true
|
28
|
+
end
|
29
|
+
config.after(:suite) do
|
30
|
+
execute_vagrant_command Vagrant::Environment.new, :box, 'remove', 'dummy'
|
31
|
+
end
|
32
|
+
config.after(:each) do
|
33
|
+
FileUtils.rm_r '.vagrant', force: true
|
34
|
+
end
|
35
|
+
|
36
|
+
config.before(:each, :need_box) do
|
37
|
+
up_local_box
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def execute_vagrant_command environment, command, *params
|
43
|
+
Vagrant.plugin('2').manager.commands[command].new(params, environment).execute
|
44
|
+
end
|
45
|
+
|
46
|
+
# If you want expectations on the action_class use something like:
|
47
|
+
#
|
48
|
+
# let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
49
|
+
#
|
50
|
+
# mock_action(VagrantPlugins::Proxmox::Action::ConnectProxmox).tap do |action|
|
51
|
+
# action.should receive(:perform) {|env| env[:proxmox_ticket] = 'ticket' }
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
def mock_action action_class, env = RSpec::Mocks::Mock.new('env').as_null_object
|
55
|
+
action_class.new(nil, env).tap do |action_instance|
|
56
|
+
action_instance_name = "@#{action_class.name.demodulize}Action".underscore
|
57
|
+
self.instance_variable_set action_instance_name, action_instance
|
58
|
+
|
59
|
+
action_class.stub(:new) do |app, _|
|
60
|
+
action_instance.instance_variable_set '@app', app
|
61
|
+
action_instance
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# If you want to stub your actions (stub their call methods), use something like this:
|
67
|
+
#
|
68
|
+
# let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
69
|
+
#
|
70
|
+
# stub_action(Action::ConnectProxmox) { |env| env[:proxmox_ticket] = 'ticket' }
|
71
|
+
#
|
72
|
+
def stub_action action_class
|
73
|
+
mock_action(action_class).tap do |action|
|
74
|
+
action.stub(:call) do |env|
|
75
|
+
yield env if block_given?
|
76
|
+
action.instance_variable_get(:@app).call env
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# If you want to expect your actions to be called (and optionally stub their call methods),
|
82
|
+
# use something like this:
|
83
|
+
#
|
84
|
+
# let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
|
85
|
+
#
|
86
|
+
# Action::ConnectProxmox.should be_called { |env| env[:proxmox_ticket] = 'ticket' }
|
87
|
+
#
|
88
|
+
class ActionCallMatcher < RSpec::Matchers::BuiltIn::BaseMatcher
|
89
|
+
def initialize action_stub, environment, example_group, kind=:called
|
90
|
+
super action_stub
|
91
|
+
@environment = environment
|
92
|
+
@example_group = example_group
|
93
|
+
@kind = kind
|
94
|
+
end
|
95
|
+
|
96
|
+
def match(action_stub, action_class)
|
97
|
+
mock_action(action_class).tap do |action|
|
98
|
+
case @kind
|
99
|
+
when :called
|
100
|
+
@example_group.expect(action).to @example_group.receive(:call).at_least(:once) do |env|
|
101
|
+
action_stub.call(env) if action_stub
|
102
|
+
action.instance_variable_get(:@app).call env
|
103
|
+
end
|
104
|
+
when :ommited
|
105
|
+
action.should_not_receive :call
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def be_called &action_stub
|
112
|
+
ActionCallMatcher.new action_stub, environment, self, :called
|
113
|
+
end
|
114
|
+
|
115
|
+
def be_ommited &action_stub
|
116
|
+
ActionCallMatcher.new action_stub, environment, self, :ommited
|
117
|
+
end
|
118
|
+
|
119
|
+
def up_local_box
|
120
|
+
Vagrant::UI::Interface.stub(:new).and_return ui
|
121
|
+
stub_action(VagrantPlugins::Proxmox::Action::ConnectProxmox)
|
122
|
+
stub_action(VagrantPlugins::Proxmox::Action::GetNodeList) { |env| env[:proxmox_nodes] = [{node: 'localhost'}] }
|
123
|
+
stub_action(VagrantPlugins::Proxmox::Action::IsCreated) { |env| env[:result] = false }
|
124
|
+
stub_action(VagrantPlugins::Proxmox::Action::CreateVm) { |env| env[:machine].id = 'localhost/100' }
|
125
|
+
stub_action(VagrantPlugins::Proxmox::Action::StartVm)
|
126
|
+
stub_action(VagrantPlugins::Proxmox::Action::SyncFolders)
|
127
|
+
execute_vagrant_command environment, :up, '--provider=proxmox'
|
128
|
+
end
|