vagrant-proxmox 0.0.3 → 0.0.5

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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/lib/sanity_checks.rb +1 -1
  3. data/lib/vagrant-proxmox.rb +1 -2
  4. data/lib/vagrant-proxmox/action.rb +133 -86
  5. data/lib/vagrant-proxmox/action/connect_proxmox.rb +10 -10
  6. data/lib/vagrant-proxmox/action/create_vm.rb +33 -28
  7. data/lib/vagrant-proxmox/action/destroy_vm.rb +10 -6
  8. data/lib/vagrant-proxmox/action/get_node_list.rb +8 -6
  9. data/lib/vagrant-proxmox/action/is_created.rb +1 -0
  10. data/lib/vagrant-proxmox/action/is_stopped.rb +1 -0
  11. data/lib/vagrant-proxmox/action/message_file_not_found.rb +21 -0
  12. data/lib/vagrant-proxmox/action/message_not_running.rb +20 -0
  13. data/lib/vagrant-proxmox/action/message_upload_server_error.rb +20 -0
  14. data/lib/vagrant-proxmox/action/proxmox_action.rb +6 -22
  15. data/lib/vagrant-proxmox/action/read_ssh_info.rb +1 -0
  16. data/lib/vagrant-proxmox/action/read_state.rb +11 -14
  17. data/lib/vagrant-proxmox/action/select_node.rb +23 -0
  18. data/lib/vagrant-proxmox/action/shutdown_vm.rb +8 -8
  19. data/lib/vagrant-proxmox/action/start_vm.rb +20 -12
  20. data/lib/vagrant-proxmox/action/stop_vm.rb +9 -8
  21. data/lib/vagrant-proxmox/action/sync_folders.rb +1 -1
  22. data/lib/vagrant-proxmox/action/upload_iso_file.rb +38 -0
  23. data/lib/vagrant-proxmox/action/upload_template_file.rb +38 -0
  24. data/lib/vagrant-proxmox/config.rb +85 -5
  25. data/lib/vagrant-proxmox/errors.rb +22 -2
  26. data/lib/vagrant-proxmox/plugin.rb +0 -14
  27. data/lib/vagrant-proxmox/proxmox/connection.rb +217 -0
  28. data/lib/vagrant-proxmox/proxmox/errors.rb +23 -0
  29. data/lib/vagrant-proxmox/version.rb +1 -1
  30. data/locales/en.yml +29 -2
  31. data/spec/actions/cleanup_after_destroy_action_spec.rb +2 -2
  32. data/spec/actions/connect_proxmox_action_spec.rb +32 -15
  33. data/spec/actions/create_vm_action_spec.rb +155 -130
  34. data/spec/actions/destroy_vm_action_spec.rb +50 -23
  35. data/spec/actions/get_node_list_action_spec.rb +25 -12
  36. data/spec/actions/is_created_action_spec.rb +8 -8
  37. data/spec/actions/is_stopped_action_spec.rb +8 -8
  38. data/spec/actions/message_already_running_action_spec.rb +2 -2
  39. data/spec/actions/message_already_stopped_action_spec.rb +2 -2
  40. data/spec/actions/message_file_not_found_spec.rb +23 -0
  41. data/spec/actions/message_not_created_action_spec.rb +2 -2
  42. data/spec/actions/message_not_running_action_spec.rb +23 -0
  43. data/spec/actions/message_upload_server_error_spec.rb +23 -0
  44. data/spec/actions/proxmox_action_shared.rb +0 -64
  45. data/spec/actions/proxmox_action_spec.rb +57 -0
  46. data/spec/actions/read_ssh_info_action_spec.rb +6 -6
  47. data/spec/actions/read_state_action_spec.rb +36 -34
  48. data/spec/actions/select_node_spec.rb +33 -0
  49. data/spec/actions/shutdown_vm_action_spec.rb +50 -22
  50. data/spec/actions/start_vm_action_spec.rb +87 -33
  51. data/spec/actions/stop_vm_action_spec.rb +50 -23
  52. data/spec/actions/sync_folders_action_spec.rb +9 -9
  53. data/spec/actions/upload_iso_file_action_spec.rb +70 -0
  54. data/spec/actions/upload_template_file_action_spec.rb +70 -0
  55. data/spec/commands/destroy_command_spec.rb +25 -25
  56. data/spec/commands/halt_command_spec.rb +17 -17
  57. data/spec/commands/provision_command_spec.rb +22 -9
  58. data/spec/commands/ssh_command_spec.rb +18 -5
  59. data/spec/commands/ssh_run_command_spec.rb +19 -6
  60. data/spec/commands/status_command_spec.rb +2 -2
  61. data/spec/commands/up_command_spec.rb +174 -34
  62. data/spec/config_spec.rb +325 -46
  63. data/spec/plugin_spec.rb +1 -8
  64. data/spec/provider_spec.rb +4 -4
  65. data/spec/proxmox/connection_spec.rb +662 -0
  66. data/spec/proxmox/rest_call_shared.rb +41 -0
  67. data/spec/sanity_checks_spec.rb +1 -1
  68. data/spec/spec_helper.rb +15 -97
  69. data/spec/spec_helpers/common_helpers.rb +111 -0
  70. data/spec/spec_helpers/time_helpers.rb +90 -0
  71. metadata +161 -45
@@ -8,8 +8,8 @@ module VagrantPlugins::Proxmox
8
8
  let(:ui) { double('ui').as_null_object }
9
9
 
10
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 }
11
+ expect(Action::ConnectProxmox).to be_called
12
+ expect(Action::ReadState).to be_called { |env| env[:machine_state_id] = :stopped }
13
13
  expect(ui).to receive(:info).with /stopped \(proxmox\)/, anything
14
14
  execute_vagrant_command environment, :status
15
15
  end
@@ -5,51 +5,191 @@ module VagrantPlugins::Proxmox
5
5
  describe 'Vagrant Proxmox provider up command' do
6
6
 
7
7
  let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
8
+ let(:connection) { Connection.new 'https://your.proxmox.server/api2/json' }
9
+ let(:env) { {machine: environment.machine(environment.primary_machine_name, :proxmox)} }
8
10
  let(:ui) { double('ui').as_null_object }
11
+ let(:proxmox_vm_type) { :openvz }
12
+ let(:qemu_os) { :l26 }
13
+ let(:qemu_iso) { 'someiso.iso' }
14
+ let(:qemu_disk_size) { '30G' }
9
15
 
10
16
  before do
11
- Vagrant::UI::Interface.stub(:new).and_return ui
17
+ allow(Vagrant::UI::Interface).to receive_messages :new => ui
18
+ env[:machine].provider_config.vm_type = proxmox_vm_type
12
19
  end
13
20
 
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'
21
+ context 'the vm_type is :openvz' do
22
+
23
+ context 'the vm is not yet created' do
24
+ it 'should call the appropriate actions and print a ui message that the vm will be created' do
25
+ expect(Action::ConnectProxmox).to be_called
26
+ expect(Action::GetNodeList).to be_called { |env| env[:proxmox_nodes] = ['localhost'] }
27
+ expect(Action::SelectNode).to be_called { |env| env[:proxmox_selected_node] = ['localhost'] }
28
+ expect(Action::IsCreated).to be_called { |env| env[:result] = false }
29
+ expect(Action::UploadTemplateFile).to be_called { |env| env[:result] = :ok }
30
+ expect(Action::UploadIsoFile).to be_omitted
31
+ expect(Action::CreateVm).to be_called { |env| env[:machine].id = 'localhost/100' }
32
+ expect(Action::Provision).to be_called
33
+ expect(Action::StartVm).to be_called
34
+ expect(Action::SyncFolders).to be_called
35
+ execute_vagrant_command environment, :up, '--provider=proxmox'
36
+ end
24
37
  end
25
- end
26
38
 
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'
39
+ context 'the vm is stopped' do
40
+ it 'should call the appropriate actions and print a ui message that the vm will be started' do
41
+ expect(Action::ConnectProxmox).to be_called
42
+ expect(Action::IsCreated).to be_called { |env| env[:result] = true }
43
+ expect(Action::IsStopped).to be_called { |env| env[:result] = true }
44
+ expect(Action::Provision).to be_called
45
+ expect(Action::StartVm).to be_called
46
+ expect(Action::SyncFolders).to be_called
47
+ expect(Action::UploadTemplateFile).to be_omitted
48
+ expect(Action::UploadIsoFile).to be_omitted
49
+ expect(Action::CreateVm).to be_omitted
50
+ execute_vagrant_command environment, :up, '--provider=proxmox'
51
+ end
37
52
  end
38
- end
39
53
 
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'
54
+ context 'the vm is already running' do
55
+ it 'should call the appropriate actions and print a ui message that the vm is already running' do
56
+ expect(Action::ConnectProxmox).to be_called
57
+ expect(Action::IsCreated).to be_called { |env| env[:result] = true }
58
+ expect(Action::IsStopped).to be_called { |env| env[:result] = false }
59
+ expect(Action::MessageAlreadyRunning).to be_called
60
+ expect(Action::Provision).to be_omitted
61
+ expect(Action::UploadTemplateFile).to be_omitted
62
+ expect(Action::UploadIsoFile).to be_omitted
63
+ expect(Action::CreateVm).to be_omitted
64
+ expect(Action::StartVm).to be_omitted
65
+ execute_vagrant_command environment, :up, '--provider=proxmox'
66
+ end
67
+ end
68
+
69
+ context 'an invalid local template file is specified' do
70
+
71
+ it 'should call the appropriate actions and print a ui message that a file was not found' do
72
+ expect(Action::ConnectProxmox).to be_called
73
+ expect(Action::GetNodeList).to be_called { |env| env[:proxmox_nodes] = ['localhost'] }
74
+ expect(Action::IsCreated).to be_called { |env| env[:result] = false }
75
+ expect(Action::Provision).to be_called
76
+ expect(Action::UploadTemplateFile).to be_called { |env| env[:result] = :file_not_found }
77
+ expect(Action::UploadIsoFile).to be_omitted
78
+ expect(Action::MessageFileNotFound).to be_called
79
+ expect(Action::CreateVm).to be_omitted
80
+ expect(Action::StartVm).to be_omitted
81
+ expect(Action::SyncFolders).to be_omitted
82
+ execute_vagrant_command environment, :up, '--provider=proxmox'
83
+ end
84
+ end
85
+
86
+ context 'a server error occurs' do
87
+
88
+ it 'should call the appropriate actions and print a ui message that a server error occured' do
89
+ expect(Action::ConnectProxmox).to be_called
90
+ expect(Action::GetNodeList).to be_called { |env| env[:proxmox_nodes] = ['localhost'] }
91
+ expect(Action::IsCreated).to be_called { |env| env[:result] = false }
92
+ expect(Action::Provision).to be_called
93
+ expect(Action::UploadTemplateFile).to be_called { |env| env[:result] = :server_upload_error }
94
+ expect(Action::UploadIsoFile).to be_omitted
95
+ expect(Action::MessageUploadServerError).to be_called
96
+ expect(Action::CreateVm).to be_omitted
97
+ expect(Action::StartVm).to be_omitted
98
+ expect(Action::SyncFolders).to be_omitted
99
+ execute_vagrant_command environment, :up, '--provider=proxmox'
100
+ end
50
101
  end
51
102
  end
52
103
 
53
- end
104
+ context 'the vm_type is :qemu' do
105
+
106
+ let(:proxmox_vm_type) { :qemu }
107
+
108
+ before do
109
+ env[:machine].provider_config.qemu_os = qemu_os
110
+ env[:machine].provider_config.qemu_iso = qemu_iso
111
+ env[:machine].provider_config.qemu_disk_size = qemu_disk_size
112
+ end
54
113
 
114
+ context 'the vm is not yet created' do
115
+ it 'should call the appropriate actions and print a ui message that the vm will be created' do
116
+ expect(Action::ConnectProxmox).to be_called
117
+ expect(Action::GetNodeList).to be_called { |env| env[:proxmox_nodes] = ['localhost'] }
118
+ expect(Action::SelectNode).to be_called { |env| env[:proxmox_selected_node] = ['localhost'] }
119
+ expect(Action::IsCreated).to be_called { |env| env[:result] = false }
120
+ expect(Action::UploadTemplateFile).to be_omitted
121
+ expect(Action::UploadIsoFile).to be_called { |env| env[:result] = :ok }
122
+ expect(Action::CreateVm).to be_called { |env| env[:machine].id = 'localhost/100' }
123
+ expect(Action::Provision).to be_called
124
+ expect(Action::StartVm).to be_called
125
+ expect(Action::SyncFolders).to be_called
126
+ execute_vagrant_command environment, :up, '--provider=proxmox'
127
+ end
128
+ end
129
+
130
+ context 'the vm is stopped' do
131
+ it 'should call the appropriate actions and print a ui message that the vm will be started' do
132
+ expect(Action::ConnectProxmox).to be_called
133
+ expect(Action::IsCreated).to be_called { |env| env[:result] = true }
134
+ expect(Action::IsStopped).to be_called { |env| env[:result] = true }
135
+ expect(Action::Provision).to be_called
136
+ expect(Action::StartVm).to be_called
137
+ expect(Action::SyncFolders).to be_called
138
+ expect(Action::UploadTemplateFile).to be_omitted
139
+ expect(Action::UploadIsoFile).to be_omitted
140
+ expect(Action::CreateVm).to be_omitted
141
+ execute_vagrant_command environment, :up, '--provider=proxmox'
142
+ end
143
+ end
144
+
145
+ context 'the vm is already running' do
146
+ it 'should call the appropriate actions and print a ui message that the vm is already running' do
147
+ expect(Action::ConnectProxmox).to be_called
148
+ expect(Action::IsCreated).to be_called { |env| env[:result] = true }
149
+ expect(Action::IsStopped).to be_called { |env| env[:result] = false }
150
+ expect(Action::MessageAlreadyRunning).to be_called
151
+ expect(Action::Provision).to be_omitted
152
+ expect(Action::UploadTemplateFile).to be_omitted
153
+ expect(Action::UploadIsoFile).to be_omitted
154
+ expect(Action::CreateVm).to be_omitted
155
+ expect(Action::StartVm).to be_omitted
156
+ execute_vagrant_command environment, :up, '--provider=proxmox'
157
+ end
158
+ end
159
+
160
+ context 'an invalid local iso file is specified' do
161
+
162
+ it 'should call the appropriate actions and print a ui message that a file was not found' do
163
+ expect(Action::ConnectProxmox).to be_called
164
+ expect(Action::GetNodeList).to be_called { |env| env[:proxmox_nodes] = ['localhost'] }
165
+ expect(Action::IsCreated).to be_called { |env| env[:result] = false }
166
+ expect(Action::Provision).to be_called
167
+ expect(Action::UploadTemplateFile).to be_omitted
168
+ expect(Action::UploadIsoFile).to be_called { |env| env[:result] = :file_not_found }
169
+ expect(Action::MessageFileNotFound).to be_called
170
+ expect(Action::CreateVm).to be_omitted
171
+ expect(Action::StartVm).to be_omitted
172
+ expect(Action::SyncFolders).to be_omitted
173
+ execute_vagrant_command environment, :up, '--provider=proxmox'
174
+ end
175
+ end
176
+
177
+ context 'a server error occurs' do
178
+
179
+ it 'should call the appropriate actions and print a ui message that a server error occured' do
180
+ expect(Action::ConnectProxmox).to be_called
181
+ expect(Action::GetNodeList).to be_called { |env| env[:proxmox_nodes] = ['localhost'] }
182
+ expect(Action::IsCreated).to be_called { |env| env[:result] = false }
183
+ expect(Action::Provision).to be_called
184
+ expect(Action::UploadTemplateFile).to be_omitted
185
+ expect(Action::UploadIsoFile).to be_called { |env| env[:result] = :server_upload_error }
186
+ expect(Action::MessageUploadServerError).to be_called
187
+ expect(Action::CreateVm).to be_omitted
188
+ expect(Action::StartVm).to be_omitted
189
+ expect(Action::SyncFolders).to be_omitted
190
+ execute_vagrant_command environment, :up, '--provider=proxmox'
191
+ end
192
+ end
193
+ end
194
+ end
55
195
  end
data/spec/config_spec.rb CHANGED
@@ -6,66 +6,345 @@ describe VagrantPlugins::Proxmox::Config do
6
6
  describe 'defaults' do
7
7
  subject { super().tap { |o| o.finalize! } }
8
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
9
+ describe '#endpoint' do
10
+ subject { super().endpoint }
11
+ it { is_expected.to be_nil }
12
+ end
19
13
 
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 }
14
+ describe '#user_name' do
15
+ subject { super().user_name }
16
+ it { is_expected.to be_nil }
17
+ end
23
18
 
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
19
+ describe '#password' do
20
+ subject { super().password }
21
+ it { is_expected.to be_nil }
22
+ end
36
23
 
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 }
24
+ describe '#vm_type' do
25
+ subject { super().vm_type }
26
+ it { is_expected.to be_nil }
27
+ end
41
28
 
42
- subject { config }
29
+ describe '#openvz_os_template' do
30
+ subject { super().openvz_os_template }
31
+ it { is_expected.to be_nil }
32
+ end
43
33
 
44
- describe 'with a valid configuration' do
45
- it 'should validate without any error' do
46
- subject.validate(machine).should == {'Proxmox Provider' => []}
47
- end
34
+ describe '#openvz_template_file' do
35
+ subject { super().openvz_template_file }
36
+ it { is_expected.to be_nil }
48
37
  end
49
38
 
50
- describe 'with a missing endpoint' do
51
- before { subject.endpoint = nil }
52
- specify { subject.validate(machine).should == {'Proxmox Provider' => ['No endpoint specified.']} }
39
+ describe '#vm_id_range' do
40
+ subject { super().vm_id_range }
41
+ it { is_expected.to eq(900..999) }
53
42
  end
54
43
 
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.']} }
44
+ describe '#vm_name_prefix' do
45
+ subject { super().vm_name_prefix }
46
+ it { is_expected.to eq('vagrant_') }
58
47
  end
59
48
 
60
- describe 'with a missing password' do
61
- before { subject.password = nil }
62
- specify { subject.validate(machine).should == {'Proxmox Provider' => ['No password specified.']} }
49
+ describe '#vm_memory' do
50
+ subject { super().vm_memory }
51
+ it { is_expected.to eq(512) }
63
52
  end
64
53
 
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.']} }
54
+ describe '#task_timeout' do
55
+ subject { super().task_timeout }
56
+ it { is_expected.to eq(60) }
68
57
  end
58
+
59
+ describe '#task_status_check_interval' do
60
+ subject { super().task_status_check_interval }
61
+ it { is_expected.to eq(2) }
62
+ end
63
+
64
+ describe '#ssh_timeout' do
65
+ subject { super().ssh_timeout }
66
+ it { is_expected.to eq(60) }
67
+ end
68
+
69
+ describe '#ssh_status_check_interval' do
70
+ subject { super().ssh_status_check_interval }
71
+ it { is_expected.to eq(5) }
72
+ end
73
+
74
+ describe '#imgcopy_timeout' do
75
+ subject { super().imgcopy_timeout }
76
+ it { is_expected.to eq(120) }
77
+ end
78
+
79
+ describe '#qemu_os' do
80
+ subject { super().qemu_os }
81
+ it { is_expected.to be_nil }
82
+ end
83
+
84
+ describe '#qemu_iso' do
85
+ subject { super().qemu_iso }
86
+ it { is_expected.to be_nil }
87
+ end
88
+
89
+ describe '#qemu_iso_file' do
90
+ subject { super().qemu_iso_file }
91
+ it { is_expected.to be_nil }
92
+ end
93
+
94
+ describe '#qemu_disk_size' do
95
+ subject { super().qemu_disk_size }
96
+ it { is_expected.to be_nil }
97
+ end
98
+
99
+ end
100
+
101
+ describe 'of a given Vagrantfile' do
102
+
103
+ let(:proxmox_qemu_iso) { '' }
104
+ let(:proxmox_openvz_os_template) { "proxmox.openvz_os_template = 'local:vztmpl/template.tar.gz'" }
105
+ let(:proxmox_openvz_template_file) { '' }
106
+ let(:proxmox_vm_type) { 'proxmox.vm_type = :openvz' }
107
+ let(:proxmox_qemu_iso_file) { '' }
108
+ let(:proxmox_qemu_disk_size) { '' }
109
+ let(:vagrantfile_content) { "
110
+ Vagrant.configure('2') do |config|
111
+ config.vm.provider :proxmox do |proxmox|
112
+ proxmox.endpoint = 'https://proxmox.example.com/api2/json'
113
+ proxmox.user_name = 'vagrant'
114
+ proxmox.password = 'password'
115
+ #{proxmox_vm_type}
116
+ #{proxmox_openvz_os_template}
117
+ #{proxmox_openvz_template_file}
118
+ #{proxmox_qemu_iso}
119
+ #{proxmox_qemu_iso_file}
120
+ #{proxmox_qemu_disk_size}
121
+ proxmox.vm_id_range = 900..910
122
+ proxmox.vm_name_prefix = 'vagrant_test_'
123
+ proxmox.vm_memory = 256
124
+ proxmox.task_timeout = 30
125
+ proxmox.task_status_check_interval = 1
69
126
  end
70
127
 
128
+ config.vm.define :machine, primary: true do |machine|
129
+ machine.vm.box = 'b681e2bc-617b-4b35-94fa-edc92e1071b8'
130
+ end
71
131
  end
132
+ " }
133
+
134
+ let(:vagrantfile) do
135
+ File.open("#{Dir.tmpdir}/#{Dir::Tmpname.make_tmpname 'rspec', nil }", 'w').tap do |file|
136
+ file.write vagrantfile_content
137
+ file.flush
138
+ end
139
+ end
140
+
141
+ let(:environment) { Vagrant::Environment.new vagrantfile_name: vagrantfile.path }
142
+ let(:config) { environment.machine(environment.primary_machine_name, :proxmox).config.vm.get_provider_config :proxmox }
143
+
144
+ after { File.unlink (vagrantfile.path) }
145
+
146
+ describe 'overwriting defaults' do
147
+
148
+ subject { config }
149
+
150
+ describe '#endpoint' do
151
+ subject { super().endpoint }
152
+ it { is_expected.to eq('https://proxmox.example.com/api2/json') }
153
+ end
154
+
155
+ describe '#user_name' do
156
+ subject { super().user_name }
157
+ it { is_expected.to eq('vagrant') }
158
+ end
159
+
160
+ describe '#password' do
161
+ subject { super().password }
162
+ it { is_expected.to eq('password') }
163
+ end
164
+
165
+ context 'with an existing template file' do
166
+ describe '#openvz_os_template' do
167
+ before do
168
+ end
169
+ subject { super().openvz_os_template }
170
+ it { is_expected.to eq('local:vztmpl/template.tar.gz') }
171
+ end
172
+ end
173
+
174
+ context 'with a new template file' do
175
+ let(:proxmox_openvz_os_template) { "" }
176
+ let(:proxmox_openvz_template_file) { "proxmox.openvz_template_file = 'template.tar.gz'" }
177
+
178
+ describe '#openvz_template_file' do
179
+ before do
180
+ end
181
+ subject { super().openvz_template_file }
182
+ it { is_expected.to eq('template.tar.gz') }
183
+ end
184
+ end
185
+
186
+ describe '#vm_id_range' do
187
+ subject { super().vm_id_range }
188
+ it { is_expected.to eq(900..910) }
189
+ end
190
+
191
+ describe '#vm_name_prefix' do
192
+ subject { super().vm_name_prefix }
193
+ it { is_expected.to eq('vagrant_test_') }
194
+ end
195
+
196
+ describe '#vm_memory' do
197
+ subject { super().vm_memory }
198
+ it { is_expected.to eq(256) }
199
+ end
200
+
201
+ describe '#task_timeout' do
202
+ subject { super().task_timeout }
203
+ it { is_expected.to eq(30) }
204
+ end
205
+
206
+ describe '#task_status_check_interval' do
207
+ subject { super().task_status_check_interval }
208
+ it { is_expected.to eq(1) }
209
+ end
210
+ end
211
+
212
+ describe 'is validated' do
213
+ let(:machine) { double 'machine' }
214
+ let(:environment) { Vagrant::Environment.new vagrantfile_name: 'dummy_box/Vagrantfile' }
215
+ let(:config) { environment.machine(environment.primary_machine_name, :proxmox).config.vm.get_provider_config :proxmox }
216
+
217
+ subject { config }
218
+
219
+ context 'when the vagrantfile is valid' do
220
+ specify 'the configuration should be valid' do
221
+ expect(subject.validate(machine)).to eq({'Proxmox Provider' => []})
222
+ end
223
+ end
224
+
225
+ context 'when the vagrantfile is erroneous' do
226
+
227
+ describe 'because of a missing endpoint' do
228
+ before { subject.endpoint = nil }
229
+ specify 'it should report an error' do
230
+ expect(subject.validate(machine)).to eq({'Proxmox Provider' => ['No endpoint specified.']})
231
+ end
232
+ end
233
+
234
+ describe 'because of a missing user_name' do
235
+ before { subject.user_name = nil }
236
+ specify 'it should report an error' do
237
+ expect(subject.validate(machine)).to eq({'Proxmox Provider' => ['No user_name specified.']})
238
+ end
239
+ end
240
+
241
+ describe 'because of a missing password' do
242
+ before { subject.password = nil }
243
+ specify 'it should report an error' do
244
+ expect(subject.validate(machine)).to eq({'Proxmox Provider' => ['No password specified.']})
245
+ end
246
+ end
247
+
248
+ describe 'because of a missing vm_type' do
249
+ before { subject.vm_type = nil }
250
+ specify 'it should report an error' do
251
+ expect(subject.validate(machine)).to eq({'Proxmox Provider' => ['No vm_type specified']})
252
+ end
253
+ end
254
+
255
+ context 'with vm_type = :openvz' do
256
+
257
+ describe 'because of a missing openvz_os_template and missing openvz_template_file' do
258
+ before do
259
+ subject.openvz_os_template = nil
260
+ subject.openvz_template_file = nil
261
+ end
262
+ specify 'it should report an error' do
263
+ expect(subject.validate(machine)).to eq({'Proxmox Provider' => ['No openvz_os_template or openvz_template_file specified for vm_type=:openvz']})
264
+ end
265
+ end
266
+ end
267
+
268
+ context 'with vm_type = :qemu' do
269
+
270
+ before do
271
+ subject.vm_type = :qemu
272
+ subject.qemu_os = :l26
273
+ subject.qemu_iso = 'anyiso.iso'
274
+ subject.qemu_disk_size = '30G'
275
+ end
276
+
277
+ describe 'because of a missing qemu_iso and missing qemu_iso_file' do
278
+ before do
279
+ subject.qemu_iso = nil
280
+ subject.qemu_iso_file = nil
281
+ end
282
+ specify 'it should report an error' do
283
+ expect(subject.validate(machine)).to eq({'Proxmox Provider' => ['No qemu_iso or qemu_iso_file specified for vm_type=:qemu']})
284
+ end
285
+ end
286
+
287
+ describe 'because of a missing qemu_os_type' do
288
+ before do
289
+ subject.qemu_os = nil
290
+ end
291
+ specify 'it should report an error' do
292
+ expect(subject.validate(machine)).to eq({'Proxmox Provider' => ['No qemu_os specified for vm_type=:qemu']})
293
+ end
294
+ end
295
+
296
+ describe 'because of a missing qemu_disk_size' do
297
+ before do
298
+ subject.qemu_disk_size = nil
299
+ end
300
+ specify 'it should report an error' do
301
+ expect(subject.validate(machine)).to eq({'Proxmox Provider' => ['No qemu_disk_size specified for vm_type=:qemu']})
302
+ end
303
+ end
304
+
305
+ end
306
+ end
307
+ end
308
+
309
+ describe 'is finalized' do
310
+
311
+ context 'with vm_type=:openvz' do
312
+
313
+ context 'a template file was specified' do
314
+
315
+ let(:proxmox_openvz_os_template) { '' }
316
+ let(:proxmox_openvz_template_file) { "proxmox.openvz_template_file = '/my/dir/mytemplate.tar.gz'" }
317
+
318
+ it 'should set the openvz_os_template to the uploaded template file' do
319
+ expect(config.openvz_os_template).to eq('local:vztmpl/mytemplate.tar.gz')
320
+ end
321
+ end
322
+
323
+ end
324
+
325
+ context 'with vm_type=:qemu' do
326
+
327
+ context 'an iso file was specified' do
328
+
329
+ let(:proxmox_openvz_os_template) { '' }
330
+ let(:proxmox_openvz_template_file) { '' }
331
+ let(:proxmox_qemu_iso) { '' }
332
+ let(:proxmox_qemu_iso_file) { "proxmox.qemu_iso_file = '/my/dir/myiso.iso'" }
333
+
334
+ it 'should set the openvz_os_template to the uploaded template file' do
335
+ expect(config.qemu_iso).to eq('local:iso/myiso.iso')
336
+ end
337
+ end
338
+
339
+ context 'when the disk size contains a unit' do
340
+
341
+ let (:proxmox_qemu_disk_size) {"proxmox.qemu_disk_size = '15G' "}
342
+
343
+ it 'should be converted into gigabytes' do
344
+ expect(config.qemu_disk_size).to eq('15')
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end
350
+ end