foreman_fog_proxmox 0.12.2 → 0.13.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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +24 -5
  3. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +36 -2
  4. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +134 -60
  5. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +2 -50
  6. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume.js +39 -0
  7. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cdrom.js +63 -0
  8. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cloudinit.js +25 -0
  9. data/app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb +1 -1
  10. data/app/controllers/foreman_fog_proxmox/compute_resources_controller.rb +23 -25
  11. data/app/helpers/proxmox_compute_controllers_helper.rb +39 -0
  12. data/app/helpers/proxmox_compute_resources_helper.rb +49 -0
  13. data/app/helpers/proxmox_compute_selectors_helper.rb +6 -44
  14. data/app/helpers/proxmox_form_helper.rb +12 -4
  15. data/app/{models/concerns/fog_extensions/proxmox/volume.rb → helpers/proxmox_storages_helper.rb} +5 -8
  16. data/app/helpers/proxmox_vm_cdrom_helper.rb +35 -0
  17. data/app/helpers/proxmox_vm_cloudinit_helper.rb +43 -0
  18. data/app/helpers/proxmox_vm_config_helper.rb +160 -0
  19. data/app/helpers/proxmox_vm_helper.rb +24 -62
  20. data/app/helpers/proxmox_vm_interfaces_helper.rb +85 -0
  21. data/app/helpers/proxmox_vm_os_template_helper.rb +47 -0
  22. data/app/{models/foreman_fog_proxmox/proxmox_token_expiration.rb → helpers/proxmox_vm_uuid_helper.rb} +14 -10
  23. data/app/helpers/proxmox_vm_volumes_helper.rb +105 -0
  24. data/app/models/concerns/fog_extensions/proxmox/disk.rb +17 -2
  25. data/app/models/concerns/fog_extensions/proxmox/interface.rb +19 -4
  26. data/app/models/concerns/fog_extensions/proxmox/server.rb +12 -3
  27. data/app/models/concerns/fog_extensions/proxmox/server_config.rb +8 -30
  28. data/app/models/concerns/host_ext/proxmox/interfaces.rb +7 -2
  29. data/app/models/concerns/orchestration/proxmox/compute.rb +49 -0
  30. data/app/models/foreman_fog_proxmox/proxmox.rb +58 -15
  31. data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +14 -18
  32. data/app/models/foreman_fog_proxmox/proxmox_connection.rb +14 -9
  33. data/app/models/foreman_fog_proxmox/proxmox_images.rb +2 -1
  34. data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +53 -28
  35. data/app/models/foreman_fog_proxmox/proxmox_operating_systems.rb +1 -1
  36. data/app/models/foreman_fog_proxmox/proxmox_version.rb +7 -2
  37. data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +19 -31
  38. data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +108 -94
  39. data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +9 -6
  40. data/app/models/foreman_fog_proxmox/proxmox_volumes.rb +79 -22
  41. data/app/services/foreman_fog_proxmox/node_dashboard/data.rb +6 -2
  42. data/app/views/api/v2/compute_resources/proxmox.json.rabl +1 -1
  43. data/app/views/compute_resources/form/_proxmox.html.erb +23 -10
  44. data/app/views/compute_resources/show/_proxmox.html.erb +6 -6
  45. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +3 -1
  46. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +46 -29
  47. data/app/views/compute_resources_vms/form/proxmox/_base.html.erb +3 -3
  48. data/app/views/compute_resources_vms/form/proxmox/_removable_layout.html.erb +2 -1
  49. data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +8 -7
  50. data/app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb +0 -2
  51. data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +15 -14
  52. data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +2 -2
  53. data/app/views/compute_resources_vms/form/proxmox/server/_volume_cdrom.html.erb +34 -0
  54. data/app/views/compute_resources_vms/form/proxmox/server/_volume_cloud_init.html.erb +29 -0
  55. data/app/views/compute_resources_vms/form/proxmox/server/{_volume.html.erb → _volume_hard_disk.html.erb} +7 -3
  56. data/app/views/compute_resources_vms/show/_proxmox.html.erb +2 -0
  57. data/config/routes.rb +7 -7
  58. data/db/migrate/20210312105013_update_proxmox_uuid_host.rb +29 -0
  59. data/lib/foreman_fog_proxmox/engine.rb +15 -10
  60. data/lib/foreman_fog_proxmox/hash_collection.rb +69 -0
  61. data/lib/foreman_fog_proxmox/version.rb +1 -1
  62. data/lib/tasks/foreman_fog_proxmox_tasks.rake +0 -3
  63. data/test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb +20 -8
  64. data/test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb +5 -5
  65. data/test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb +17 -7
  66. data/test/factories/proxmox_factory.rb +4 -4
  67. data/test/functional/compute_resources_controller_test.rb +4 -4
  68. data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +53 -32
  69. data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +56 -31
  70. data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +22 -20
  71. data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb +38 -0
  72. data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb +50 -0
  73. data/test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb +10 -11
  74. data/test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb +38 -10
  75. data/test/unit/foreman_fog_proxmox/proxmox_version_test.rb +10 -10
  76. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +34 -24
  77. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +8 -8
  78. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb +181 -0
  79. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb +131 -0
  80. data/test/unit/foreman_fog_proxmox/{proxmox_vm_commands_server_update_volumes_test.rb → proxmox_vm_commands_server_update_hard_disk_test.rb} +45 -19
  81. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb +21 -21
  82. data/test/unit/foreman_fog_proxmox/proxmox_vm_new_test.rb +3 -3
  83. data/test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb +3 -3
  84. metadata +44 -23
  85. data/app/helpers/proxmox_container_helper.rb +0 -163
  86. data/app/helpers/proxmox_server_helper.rb +0 -155
@@ -18,14 +18,14 @@
18
18
  # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
20
  require 'test_plugin_helper'
21
- require 'fog/compute/proxmox/models/server'
22
- require 'fog/compute/proxmox/models/server_config'
23
- require 'fog/compute/proxmox/models/interface'
24
- require 'fog/compute/proxmox/models/interfaces'
25
- require 'fog/compute/proxmox/models/disk'
26
- require 'fog/compute/proxmox/models/disks'
27
- require 'fog/compute/proxmox/models/snapshots'
28
- require 'fog/compute/proxmox/models/tasks'
21
+ require 'fog/proxmox/compute/models/server'
22
+ require 'fog/proxmox/compute/models/server_config'
23
+ require 'fog/proxmox/compute/models/interface'
24
+ require 'fog/proxmox/compute/models/interfaces'
25
+ require 'fog/proxmox/compute/models/disk'
26
+ require 'fog/proxmox/compute/models/disks'
27
+ require 'fog/proxmox/compute/models/snapshots'
28
+ require 'fog/proxmox/compute/models/tasks'
29
29
 
30
30
  module ForemanFogProxmox
31
31
  class ProxmoxVmHelperTest < ActiveSupport::TestCase
@@ -39,7 +39,7 @@ module ForemanFogProxmox
39
39
  'vmid' => '100',
40
40
  'hostname' => 'test',
41
41
  :type => 'lxc',
42
- :node_id => 'pve',
42
+ :node_id => 'proxmox',
43
43
  :service => service,
44
44
  'templated' => '0',
45
45
  'memory' => '536870912',
@@ -61,7 +61,7 @@ module ForemanFogProxmox
61
61
  Fog::Proxmox::Compute::Server.new(
62
62
  'vmid' => '100',
63
63
  'name' => 'test',
64
- :node_id => 'pve',
64
+ :node_id => 'proxmox',
65
65
  :service => service,
66
66
  :type => 'qemu',
67
67
  'templated' => '0',
@@ -84,7 +84,7 @@ module ForemanFogProxmox
84
84
  let(:host_server) do
85
85
  { 'vmid' => '100',
86
86
  'name' => 'test',
87
- 'node_id' => 'pve',
87
+ 'node_id' => 'proxmox',
88
88
  'type' => 'qemu',
89
89
  'config_attributes' => {
90
90
  'memory' => '536870912',
@@ -110,7 +110,7 @@ module ForemanFogProxmox
110
110
  { 'vmid' => '100',
111
111
  'name' => 'test',
112
112
  'type' => 'lxc',
113
- 'node_id' => 'pve',
113
+ 'node_id' => 'proxmox',
114
114
  'ostemplate_storage' => 'local',
115
115
  'ostemplate_file' => 'local:vztmpl/alpine-3.7-default_20171211_amd64.tar.xz',
116
116
  'password' => 'proxmox01',
@@ -142,31 +142,33 @@ module ForemanFogProxmox
142
142
  describe 'object_to_config_hash' do
143
143
  setup { Fog.mock! }
144
144
  teardown { Fog.unmock! }
145
+ excluded_qemu_keys = ['templated', 'ide2', 'scsi0', 'net0', 'net1']
146
+ excluded_lxc_keys = ['templated', 'rootfs', 'mp0', 'net0', 'net1']
145
147
 
146
148
  it '#server qemu' do
147
- config_hash = object_to_config_hash(server)
148
- expected_config_hash = ActiveSupport::HashWithIndifferentAccess.new(server.config.attributes).reject { |key, _value| ['templated', 'ide2', 'scsi0', 'net0', 'net1'].include? key }
149
+ config_hash = object_to_config_hash(server, 'qemu')
150
+ expected_config_hash = ActiveSupport::HashWithIndifferentAccess.new(server.config.attributes).reject { |key, _value| excluded_qemu_keys.include? key }
149
151
  assert_equal expected_config_hash, config_hash['config_attributes']
150
152
  end
151
153
 
152
154
  it '#server lxc' do
153
- config_hash = object_to_config_hash(server)
155
+ config_hash = object_to_config_hash(server, 'lxc')
154
156
  assert config_hash.key?('config_attributes')
155
- expected_config_hash = ActiveSupport::HashWithIndifferentAccess.new(server.config.attributes).reject { |key, _value| ['templated', 'ide2', 'scsi0', 'net0', 'net1'].include? key }
157
+ expected_config_hash = ActiveSupport::HashWithIndifferentAccess.new(server.config.attributes).reject { |key, _value| excluded_qemu_keys.include? key }
156
158
  assert_equal expected_config_hash, config_hash['config_attributes']
157
159
  end
158
160
 
159
161
  it '#container qemu' do
160
- config_hash = object_to_config_hash(container)
162
+ config_hash = object_to_config_hash(container, 'qemu')
161
163
  assert config_hash.key?('config_attributes')
162
- expected_config_hash = ActiveSupport::HashWithIndifferentAccess.new(container.config.attributes).reject { |key, _value| ['templated', 'rootfs', 'mp0', 'net0', 'net1'].include? key }
164
+ expected_config_hash = ActiveSupport::HashWithIndifferentAccess.new(container.config.attributes).reject { |key, _value| excluded_lxc_keys.include? key }
163
165
  assert_equal expected_config_hash, config_hash['config_attributes']
164
166
  end
165
167
 
166
168
  it '#container lxc' do
167
- config_hash = object_to_config_hash(container)
169
+ config_hash = object_to_config_hash(container, 'lxc')
168
170
  assert config_hash.key?('config_attributes')
169
- expected_config_hash = ActiveSupport::HashWithIndifferentAccess.new(container.config.attributes).reject { |key, _value| ['templated', 'rootfs', 'mp0', 'net0', 'net1'].include? key }
171
+ expected_config_hash = ActiveSupport::HashWithIndifferentAccess.new(container.config.attributes).reject { |key, _value| excluded_lxc_keys.include? key }
170
172
  assert_equal expected_config_hash, config_hash['config_attributes']
171
173
  end
172
174
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Tristan Robert
4
+
5
+ # This file is part of ForemanFogProxmox.
6
+
7
+ # ForemanFogProxmox is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+
12
+ # ForemanFogProxmox is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ require 'test_plugin_helper'
21
+
22
+ module ForemanFogProxmox
23
+ class ProxmoxVmUuidHelperTest < ActiveSupport::TestCase
24
+ include ProxmoxVmUuidHelper
25
+
26
+ describe 'extract_vmid' do
27
+ setup { Fog.mock! }
28
+ teardown { Fog.unmock! }
29
+
30
+ it '#uuid=1_100 returns 100' do
31
+ assert_equal '100', extract_vmid('1_100')
32
+ end
33
+ it '#uuid=pve_100 returns ' do
34
+ assert_equal '', extract_vmid('pve_100')
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Tristan Robert
4
+
5
+ # This file is part of ForemanFogProxmox.
6
+
7
+ # ForemanFogProxmox is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+
12
+ # ForemanFogProxmox is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ require 'test_plugin_helper'
21
+
22
+ module ForemanFogProxmox
23
+ class ProxmoxVmVolumesHelperTest < ActiveSupport::TestCase
24
+ include ProxmoxVmVolumesHelper
25
+
26
+ describe 'remove_deletes' do
27
+ setup { Fog.mock! }
28
+ teardown { Fog.unmock! }
29
+ args = {
30
+ 'volumes_attributes' => {
31
+ '0' => {
32
+ '_delete' => '',
33
+ 'id' => 'scsi0',
34
+ 'volid' => 'local-lvm:vm-100-disk',
35
+ 'storage' => 'local-lvm',
36
+ 'storage_type' => 'hard_disk'
37
+ }
38
+ }
39
+ }
40
+
41
+ it '# server volumes' do
42
+ remove_volume_keys(args)
43
+ assert args.key?('volumes_attributes')
44
+ assert args['volumes_attributes'].key?('0')
45
+ assert_not args['volumes_attributes']['0'].key?('_delete')
46
+ # assert_not args['volumes_attributes']['0'].key?('storage_type')
47
+ end
48
+ end
49
+ end
50
+ end
@@ -61,7 +61,7 @@ module ForemanFogProxmox
61
61
  end
62
62
 
63
63
  it 'sets container hostname with host name' do
64
- physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :primary => true, :compute_attributes => { 'dhcpv4' => '1', 'dhcpv6' => '1' })
64
+ physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :primary => true, :compute_attributes => { 'dhcp' => '1', 'dhcp6' => '1' })
65
65
  host = FactoryBot.build(
66
66
  :host_empty,
67
67
  :interfaces => [physical_nic],
@@ -84,23 +84,23 @@ module ForemanFogProxmox
84
84
  before do
85
85
  @cr = FactoryBot.build_stubbed(:proxmox_cr)
86
86
  end
87
+ excluded_keys = [:vmid, :disks, :interfaces]
87
88
 
88
89
  it 'converts a server to hash' do
89
90
  vm, config_attributes, volume_attributes, interface_attributes = mock_server_vm
90
91
  vm_attrs = @cr.vm_compute_attributes(vm)
91
92
  assert_not vm_attrs.key?(:config)
92
93
  assert vm_attrs.key?(:config_attributes)
93
- assert_equal config_attributes.reject { |key, value| [:vmid, :disks, :interfaces].include?(key) || value.to_s.empty? }, vm_attrs[:config_attributes]
94
+ assert_equal config_attributes.reject { |key, value| excluded_keys.include?(key) || value.to_s.empty? }, vm_attrs[:config_attributes]
94
95
  assert_not vm_attrs[:config_attributes].key?(:disks)
95
96
  assert vm_attrs.key?(:volumes_attributes)
96
97
  assert_equal volume_attributes, vm_attrs[:volumes_attributes]['0']
97
98
  assert_not vm_attrs[:config_attributes].key?(:interfaces)
98
99
  assert vm_attrs.key?(:interfaces_attributes)
99
100
  assert_equal interface_attributes[:id], vm_attrs[:interfaces_attributes]['0'][:id]
100
- assert_equal interface_attributes[:id], vm_attrs[:interfaces_attributes]['0'][:identifier]
101
- assert_equal interface_attributes[:macaddr], vm_attrs[:interfaces_attributes]['0'][:mac]
102
- assert_equal interface_attributes[:model], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:model]
103
- assert_equal interface_attributes[:bridge], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:bridge]
101
+ assert_equal interface_attributes[:mac], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:macaddr]
102
+ assert_equal interface_attributes[:compute_attributes][:model], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:model]
103
+ assert_equal interface_attributes[:compute_attributes][:bridge], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:bridge]
104
104
  end
105
105
 
106
106
  it 'converts a container to hash' do
@@ -108,16 +108,15 @@ module ForemanFogProxmox
108
108
  vm_attrs = @cr.vm_compute_attributes(vm)
109
109
  assert_not vm_attrs.key?(:config)
110
110
  assert vm_attrs.key?(:config_attributes)
111
- assert_equal config_attributes.reject { |key, value| [:vmid, :disks, :interfaces].include?(key) || value.to_s.empty? }, vm_attrs[:config_attributes]
111
+ assert_equal config_attributes.reject { |key, value| excluded_keys.include?(key) || value.to_s.empty? }, vm_attrs[:config_attributes]
112
112
  assert_not vm_attrs[:config_attributes].key?(:disks)
113
113
  assert vm_attrs.key?(:volumes_attributes)
114
114
  assert_equal volume_attributes, vm_attrs[:volumes_attributes]['0']
115
115
  assert vm_attrs.key?(:interfaces_attributes)
116
116
  assert_equal interface_attributes[:id], vm_attrs[:interfaces_attributes]['0'][:id]
117
- assert_equal interface_attributes[:id], vm_attrs[:interfaces_attributes]['0'][:identifier]
118
- assert_equal interface_attributes[:name], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:name]
119
- assert_equal interface_attributes[:mac], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:mac]
120
- assert_equal interface_attributes[:bridge], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:bridge]
117
+ assert_equal interface_attributes[:compute_attributes][:name], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:name]
118
+ assert_equal interface_attributes[:mac], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:hwaddr]
119
+ assert_equal interface_attributes[:compute_attributes][:bridge], vm_attrs[:interfaces_attributes]['0'][:compute_attributes][:bridge]
121
120
  end
122
121
  end
123
122
  end
@@ -46,10 +46,11 @@ module ForemanFogProxmox
46
46
  assert err.message.end_with?('Invalid identifier interface[0]. Must be net[n] with n integer >= 0')
47
47
  end
48
48
 
49
- it 'sets server compute id with identifier, ip and ip6' do
49
+ it 'sets server compute id with identifier, ip and ip6 and mac adress' do
50
50
  ip = '192.168.56.100'
51
+ mac_address = '36:25:8C:53:0C:50'
51
52
  ip6 = Array.new(4) { format('%<x>s', x: rand(16**4)) }.join(':') + '::1'
52
- physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6)
53
+ physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :mac => mac_address)
53
54
  host = FactoryBot.build(
54
55
  :host_empty,
55
56
  :interfaces => [physical_nic],
@@ -65,13 +66,14 @@ module ForemanFogProxmox
65
66
  assert_equal 'net0', nic_attr[:id]
66
67
  assert_equal ip, nic_attr[:ip]
67
68
  assert_equal ip6, nic_attr[:ip6]
69
+ assert_equal mac_address, nic_attr[:macaddr]
68
70
  end
69
71
 
70
72
  it 'sets container compute id with identifier, ip/CIDR, gw and ip6' do
71
73
  ip = '192.168.56.100'
72
- cidr_suffix = '31'
74
+ cidr = '31'
73
75
  ip6 = Array.new(4) { format('%<x>s', x: rand(16**4)) }.join(':') + '::1'
74
- physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :compute_attributes => { 'cidrv4_prefix' => cidr_suffix, 'gwv4' => ip, 'dhcpv6' => '1' })
76
+ physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :compute_attributes => { 'cidr' => cidr, 'gw' => ip, 'ip' => ip, 'dhcp6' => '1' })
75
77
  host = FactoryBot.build(
76
78
  :host_empty,
77
79
  :interfaces => [physical_nic],
@@ -85,16 +87,16 @@ module ForemanFogProxmox
85
87
  nic_attributes = @cr.host_interfaces_attrs(host).values.select(&:present?)
86
88
  nic_attr = nic_attributes.first
87
89
  assert_equal 'net0', nic_attr[:id]
88
- assert_equal Fog::Proxmox::IpHelper.to_cidr(ip, cidr_suffix), nic_attr[:ip]
89
- assert_equal ip, nic_attr[:gw]
90
+ assert_equal Fog::Proxmox::IpHelper.to_cidr(ip, cidr), nic_attr[:ip]
91
+ assert_equal ip, nic_attr['gw']
90
92
  assert_equal 'dhcp', nic_attr[:ip6]
91
93
  end
92
94
 
93
95
  it 'sets container compute id with identifier, ip DHCP, gw6 and ip6' do
94
96
  ip = '192.168.56.100'
95
- cidr6_suffix = '100'
97
+ cidr6 = '100'
96
98
  ip6 = '2001:0:1234::c1c0:abcd:876'
97
- physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :compute_attributes => { 'cidrv6_prefix' => cidr6_suffix, 'dhcpv4' => '1', 'gwv6' => ip6 })
99
+ physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :compute_attributes => { 'cidr6' => cidr6, 'dhcp' => '1', 'gw6' => ip6 })
98
100
  host = FactoryBot.build(
99
101
  :host_empty,
100
102
  :interfaces => [physical_nic],
@@ -109,8 +111,34 @@ module ForemanFogProxmox
109
111
  nic_attr = nic_attributes.first
110
112
  assert_equal 'net0', nic_attr[:id]
111
113
  assert_equal 'dhcp', nic_attr[:ip]
112
- assert_equal Fog::Proxmox::IpHelper.to_cidr6(ip6, cidr6_suffix), nic_attr[:ip6]
113
- assert_equal ip6, nic_attr[:gw6]
114
+ assert_equal Fog::Proxmox::IpHelper.to_cidr6(ip6, cidr6), nic_attr[:ip6]
115
+ assert_equal ip6, nic_attr['gw6']
116
+ end
117
+
118
+ it 'sets container compute id with identifier, ip DHCP, mac adress and firewall' do
119
+ ip = '192.168.56.100'
120
+ mac_address = '36:25:8C:53:0C:50'
121
+ ip6 = '2001:0:1234::c1c0:abcd:876'
122
+ firewall = '1'
123
+ compute_attributes = { 'dhcp' => '1', 'ip6' => ip6, 'firewall' => firewall }
124
+ physical_nic = FactoryBot.build(:nic_base_empty, :identifier => 'net0', :ip => ip, :ip6 => ip6, :mac => mac_address, :compute_attributes => compute_attributes)
125
+ host = FactoryBot.build(
126
+ :host_empty,
127
+ :interfaces => [physical_nic],
128
+ :compute_attributes => {
129
+ 'type' => 'lxc',
130
+ 'interfaces_attributes' => {
131
+ '0' => physical_nic
132
+ }
133
+ }
134
+ )
135
+ nic_attributes = @cr.host_interfaces_attrs(host).values.select(&:present?)
136
+ nic_attr = nic_attributes.first
137
+ assert_equal 'net0', nic_attr[:id]
138
+ assert_equal 'dhcp', nic_attr[:ip]
139
+ assert_equal mac_address, nic_attr[:hwaddr]
140
+ assert_equal ip6, nic_attr[:ip6]
141
+ assert_equal firewall, nic_attr['firewall']
114
142
  end
115
143
  end
116
144
  end
@@ -26,11 +26,11 @@ module ForemanFogProxmox
26
26
  include ComputeResourceTestHelpers
27
27
  include ProxmoxVmHelper
28
28
 
29
- wrong_version = { version: '5.a', release: '1' }.with_indifferent_access
30
- supported_version = { version: '5.4', release: '3' }.with_indifferent_access
31
- supported_6_version = { version: '6.0', release: '1' }.with_indifferent_access
32
- supported_6_1_version = { version: '6.1', release: '3' }.with_indifferent_access
33
- unsupported_version = { version: '5.2', release: '2' }.with_indifferent_access
29
+ wrong_version = { version: '5.a', release: '5.a-1' }.with_indifferent_access
30
+ supported_version = { version: '5.4', release: '5.4-3' }.with_indifferent_access
31
+ supported_6_version = { version: '6.0', release: '6.0-1' }.with_indifferent_access
32
+ supported_6_1_version = { version: '6.1', release: '6.1-3' }.with_indifferent_access
33
+ unsupported_version = { version: '5.2', release: '5.2-2' }.with_indifferent_access
34
34
 
35
35
  describe 'version' do
36
36
  before do
@@ -41,17 +41,17 @@ module ForemanFogProxmox
41
41
 
42
42
  it 'returns 5.a.1 with 5.a-1' do
43
43
  @identity_client.stubs(:read_version).returns(wrong_version)
44
- assert_equal '5.a.1', @cr.version
44
+ assert_equal '5.a', @cr.version
45
45
  end
46
46
 
47
47
  it 'returns 5.4.3 with 5.4-3' do
48
48
  @identity_client.stubs(:read_version).returns(supported_version)
49
- assert_equal '5.4.3', @cr.version
49
+ assert_equal '5.4', @cr.version
50
50
  end
51
51
 
52
52
  it 'returns 5.2.2 with 5.2-2' do
53
53
  @identity_client.stubs(:read_version).returns(unsupported_version)
54
- assert_equal '5.2.2', @cr.version
54
+ assert_equal '5.2', @cr.version
55
55
  end
56
56
  end
57
57
 
@@ -62,12 +62,12 @@ module ForemanFogProxmox
62
62
  @cr.stubs(:identity_client).returns(@identity_client)
63
63
  end
64
64
 
65
- it 'raises error with 5.a.1' do
65
+ it 'raises error with 5.a' do
66
66
  @identity_client.stubs(:read_version).returns(wrong_version)
67
67
  err = assert_raises Foreman::Exception do
68
68
  @cr.version_suitable?
69
69
  end
70
- assert err.message.end_with?('Proxmox version 5.a.1 is not semver suitable')
70
+ assert err.message.end_with?('Proxmox version 5.a is not semver suitable')
71
71
  end
72
72
 
73
73
  it 'is true with 5.4-3' do
@@ -43,10 +43,11 @@ module ForemanFogProxmox
43
43
  vm.stubs(:config).returns(config)
44
44
  vm.stubs(:container?).returns(true)
45
45
  vm.stubs(:type).returns('lxc')
46
- vm.stubs(:node_id).returns('pve')
46
+ vm.stubs(:node_id).returns('proxmox')
47
+ vm.stubs(:attributes).returns(node_id: 'proxmox', type: 'lxc')
47
48
  @cr.stubs(:find_vm_by_uuid).returns(vm)
48
- attr = { 'templated' => '0', 'node_id' => 'pve', 'config_attributes' => { 'cores' => '1', 'cpulimit' => '1', 'onboot' => '0' } }.with_indifferent_access
49
- @cr.stubs(:parse_container_vm).returns('vmid' => '100', 'node_id' => 'pve2', 'type' => 'lxc', 'cores' => '1', 'cpulimit' => '1')
49
+ attr = { 'templated' => '0', 'node_id' => 'proxmox', 'config_attributes' => { 'cores' => '1', 'cpulimit' => '1', 'onboot' => '0' } }.with_indifferent_access
50
+ @cr.stubs(:parse_container_vm).returns('vmid' => '100', 'node_id' => 'proxmox2', 'type' => 'lxc', 'cores' => '1', 'cpulimit' => '1')
50
51
  expected_attr = { :cores => '1', :cpulimit => '1' }
51
52
  vm.expects(:update, expected_attr)
52
53
  @cr.save_vm(uuid, attr)
@@ -60,10 +61,11 @@ module ForemanFogProxmox
60
61
  vm.stubs(:config).returns(config)
61
62
  vm.stubs(:container?).returns(true)
62
63
  vm.stubs(:type).returns('lxc')
63
- vm.stubs(:node_id).returns('pve')
64
+ vm.stubs(:node_id).returns('proxmox')
65
+ vm.stubs(:attributes).returns(node_id: 'proxmox', type: 'lxc')
64
66
  @cr.stubs(:find_vm_by_uuid).returns(vm)
65
- attr = { 'templated' => '0', 'node_id' => 'pve', 'config_attributes' => { 'cores' => '1', 'cpulimit' => '1', 'onboot' => '0' } }.with_indifferent_access
66
- @cr.stubs(:parse_container_vm).returns('vmid' => '100', 'node_id' => 'pve', 'type' => 'lxc', 'cores' => '1', 'cpulimit' => '1')
67
+ attr = { 'templated' => '0', 'node_id' => 'proxmox', 'config_attributes' => { 'cores' => '1', 'cpulimit' => '1', 'onboot' => '0' } }.with_indifferent_access
68
+ @cr.stubs(:parse_container_vm).returns('vmid' => '100', 'node_id' => 'proxmox', 'type' => 'lxc', 'cores' => '1', 'cpulimit' => '1')
67
69
  expected_attr = { :cores => '1', :cpulimit => '1' }
68
70
  vm.expects(:update, expected_attr)
69
71
  @cr.save_vm(uuid, attr)
@@ -81,14 +83,16 @@ module ForemanFogProxmox
81
83
  config.stubs(:disks).returns(disks)
82
84
  config.stubs(:attributes).returns(:cores => '')
83
85
  vm = mock('vm')
86
+ vm.stubs(:identity).returns(uuid)
84
87
  vm.stubs(:config).returns(config)
85
88
  vm.stubs(:container?).returns(true)
86
89
  vm.stubs(:type).returns('lxc')
87
- vm.stubs(:node_id).returns('pve')
90
+ vm.stubs(:node_id).returns('proxmox')
91
+ vm.stubs(:attributes).returns(node_id: 'proxmox', type: 'lxc')
88
92
  @cr.stubs(:find_vm_by_uuid).returns(vm)
89
93
  new_attributes = {
90
94
  'templated' => '0',
91
- 'node_id' => 'pve',
95
+ 'node_id' => 'proxmox',
92
96
  'config_attributes' => {
93
97
  'cores' => '1',
94
98
  'cpulimit' => '1'
@@ -105,7 +109,7 @@ module ForemanFogProxmox
105
109
  }
106
110
  }
107
111
  }.with_indifferent_access
108
- @cr.stubs(:parse_container_vm).returns('vmid' => '100', 'node_id' => 'pve', 'type' => 'lxc', 'cores' => '1', 'cpulimit' => '1')
112
+ @cr.stubs(:parse_container_vm).returns('vmid' => '100', 'node_id' => 'proxmox', 'type' => 'lxc', 'cores' => '1', 'cpulimit' => '1')
109
113
  expected_config_attr = { :cores => '1', :cpulimit => '1' }
110
114
  expected_volume_attr =
111
115
  [
@@ -131,19 +135,22 @@ module ForemanFogProxmox
131
135
  disk.stubs(:size).returns(1_073_741_824)
132
136
  disk.stubs(:storage).returns('local-lvm')
133
137
  disk.stubs(:id).returns('rootfs')
138
+ disk.stubs(:attributes).returns(id: 'rootfs', storage: 'local-lvm', size: 1_073_741_824)
134
139
  disks.stubs(:get).returns(disk)
135
140
  config.stubs(:disks).returns(disks)
136
141
  config.stubs(:attributes).returns(:cores => '')
137
142
  vm = mock('vm')
143
+ vm.stubs(:identity).returns(uuid)
138
144
  vm.stubs(:config).returns(config)
139
145
  vm.stubs(:container?).returns(true)
140
146
  vm.stubs(:type).returns('lxc')
141
- vm.stubs(:node_id).returns('pve')
147
+ vm.stubs(:node_id).returns('proxmox')
148
+ vm.stubs(:attributes).returns(node_id: 'proxmox', type: 'lxc', 'rootfs' => '')
142
149
  @cr.stubs(:find_vm_by_uuid).returns(vm)
143
150
  new_attributes =
144
151
  {
145
152
  'templated' => '0',
146
- 'node_id' => 'pve',
153
+ 'node_id' => 'proxmox',
147
154
  'config_attributes' => {
148
155
  'cores' => '1',
149
156
  'cpulimit' => '1',
@@ -163,7 +170,7 @@ module ForemanFogProxmox
163
170
  }.with_indifferent_access
164
171
  @cr.stubs(:parse_container_vm).returns(
165
172
  'vmid' => '100',
166
- 'node_id' => 'pve',
173
+ 'node_id' => 'proxmox',
167
174
  'type' => 'lxc',
168
175
  'cores' => '1',
169
176
  'cpulimit' => '1'
@@ -185,18 +192,21 @@ module ForemanFogProxmox
185
192
  disk.stubs(:id).returns('mp0')
186
193
  disk.stubs(:size).returns(1_073_741_824)
187
194
  disk.stubs(:storage).returns('local-lvm')
195
+ disk.stubs(:attributes).returns(id: 'mp0', storage: 'local-lvm', size: 1_073_741_824, volid: 'local-lvm:vm-100-disk-0')
188
196
  disks.stubs(:get).returns(disk)
189
197
  config.stubs(:disks).returns(disks)
190
198
  config.stubs(:attributes).returns(:cores => '')
191
199
  vm = mock('vm')
200
+ vm.stubs(:identity).returns(uuid)
192
201
  vm.stubs(:config).returns(config)
193
202
  vm.stubs(:container?).returns(true)
194
203
  vm.stubs(:type).returns('lxc')
195
- vm.stubs(:node_id).returns('pve')
204
+ vm.stubs(:node_id).returns('proxmox')
205
+ vm.stubs(:attributes).returns(node_id: 'proxmox', type: 'lxc')
196
206
  @cr.stubs(:find_vm_by_uuid).returns(vm)
197
207
  new_attributes = {
198
208
  'templated' => '0',
199
- 'node_id' => 'pve',
209
+ 'node_id' => 'proxmox',
200
210
  'config_attributes' => {
201
211
  'cores' => '1',
202
212
  'cpulimit' => '1'
@@ -214,7 +224,7 @@ module ForemanFogProxmox
214
224
  }
215
225
  }
216
226
  }.with_indifferent_access
217
- @cr.stubs(:parse_server_vm).returns('vmid' => '100', 'node_id' => 'pve', 'type' => 'qemu', 'cores' => '1', 'cpulimit' => '1')
227
+ @cr.stubs(:parse_typed_vm).returns('vmid' => '100', 'node_id' => 'proxmox', 'type' => 'qemu', 'cores' => '1', 'cpulimit' => '1')
218
228
  expected_config_attr = { :cores => '1', :cpulimit => '1' }
219
229
  expected_volume_attr = { :id => 'mp0', :volid => 'local-lvm:vm-100-disk-0', :size => 1_073_741_824 }, { :mp => '/opt/toto' }
220
230
  vm.expects(:attach, expected_volume_attr)
@@ -225,44 +235,44 @@ module ForemanFogProxmox
225
235
 
226
236
  describe 'create_vm' do
227
237
  it 'creates container without bootstart' do
228
- args = { vmid: '100', type: 'lxc', node_id: 'pve', start_after_create: '0' }
238
+ args = { vmid: '100', type: 'lxc', node_id: 'proxmox', start_after_create: '0' }
229
239
  servers = mock('servers')
230
240
  servers.stubs(:id_valid?).returns(true)
231
241
  containers = mock('containers')
232
- containers.stubs(:create).with(vmid: 100, type: 'lxc', node_id: 'pve', start_after_create: '0')
242
+ containers.stubs(:create).with(args)
233
243
  cr = mock_node_servers_containers(ForemanFogProxmox::Proxmox.new, servers, containers)
234
244
  cr.stubs(:convert_sizes).with(args)
235
- cr.stubs(:parse_container_vm).with(args).returns(args)
245
+ cr.stubs(:parse_typed_vm).with(args, 'lxc').returns(args)
236
246
  vm = mock('vm')
237
247
  cr.stubs(:find_vm_by_uuid).with((args[:vmid]).to_s).returns(vm)
238
248
  cr.create_vm(args)
239
249
  end
240
250
 
241
251
  it 'creates container with bootstart' do
242
- args = { vmid: '100', type: 'lxc', node_id: 'pve', start_after_create: '1' }
252
+ args = { vmid: '100', type: 'lxc', node_id: 'proxmox', start_after_create: '1' }
243
253
  servers = mock('servers')
244
254
  servers.stubs(:id_valid?).returns(true)
245
255
  containers = mock('containers')
246
256
  vm = mock('vm')
247
- containers.stubs(:create).with(vmid: 100, type: 'lxc', node_id: 'pve', start_after_create: '1').returns(vm)
257
+ containers.stubs(:create).with(args).returns(vm)
248
258
  cr = mock_node_servers_containers(ForemanFogProxmox::Proxmox.new, servers, containers)
249
259
  cr.stubs(:convert_sizes).with(args)
250
- cr.stubs(:parse_container_vm).with(args).returns(args)
260
+ cr.stubs(:parse_typed_vm).with(args, 'lxc').returns(args)
251
261
  cr.stubs(:find_vm_by_uuid).with((args[:vmid]).to_s).returns(vm)
252
262
  cr.stubs(:start_on_boot).with(vm, args).returns(vm)
253
263
  cr.create_vm(args)
254
264
  end
255
265
 
256
266
  it 'creates container within pool' do
257
- args = { vmid: '100', type: 'lxc', node_id: 'pve', start_after_create: '0', pool: 'pool1' }
267
+ args = { vmid: '100', type: 'lxc', node_id: 'proxmox', start_after_create: '0', pool: 'pool1' }
258
268
  servers = mock('servers')
259
269
  servers.stubs(:id_valid?).returns(true)
260
270
  containers = mock('containers')
261
271
  vm = mock('vm')
262
- containers.stubs(:create).with(vmid: 100, type: 'lxc', node_id: 'pve', start_after_create: '0', pool: 'pool1').returns(vm)
272
+ containers.stubs(:create).with(args).returns(vm)
263
273
  cr = mock_node_servers_containers(ForemanFogProxmox::Proxmox.new, servers, containers)
264
274
  cr.stubs(:convert_sizes).with(args)
265
- cr.stubs(:parse_container_vm).with(args).returns(args)
275
+ cr.stubs(:parse_typed_vm).with(args, 'lxc').returns(args)
266
276
  cr.stubs(:find_vm_by_uuid).with((args[:vmid]).to_s).returns(vm)
267
277
  cr.create_vm(args)
268
278
  end