foreman_fog_proxmox 0.9.4 → 0.10.0

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.

Potentially problematic release.


This version of foreman_fog_proxmox might be problematic. Click here for more details.

Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +89 -0
  3. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_container.js +5 -41
  4. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +2 -21
  5. data/app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb +1 -1
  6. data/app/controllers/foreman_fog_proxmox/compute_resources_controller.rb +46 -6
  7. data/app/helpers/proxmox_container_helper.rb +3 -1
  8. data/app/helpers/proxmox_server_helper.rb +2 -1
  9. data/app/helpers/proxmox_vm_helper.rb +19 -0
  10. data/app/models/concerns/fog_extensions/proxmox/node.rb +0 -5
  11. data/app/models/concerns/fog_extensions/proxmox/server.rb +1 -1
  12. data/app/models/foreman_fog_proxmox/proxmox.rb +9 -13
  13. data/app/models/foreman_fog_proxmox/proxmox_images.rb +10 -5
  14. data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +6 -2
  15. data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +22 -6
  16. data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +9 -7
  17. data/app/models/foreman_fog_proxmox/vms.rb +37 -0
  18. data/app/overrides/compute_resources_vms/form/add_vm_type_node_to_new_form.rb +25 -0
  19. data/app/views/compute_resources/form/_proxmox.html.erb +0 -2
  20. data/app/views/compute_resources/show/_proxmox.html.erb +4 -0
  21. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_node_to_new_form.html.erb +24 -0
  22. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_form.html.erb +2 -1
  23. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_new_childs_form.html.erb +2 -1
  24. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +3 -2
  25. data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +6 -5
  26. data/app/views/compute_resources_vms/form/proxmox/_base.html.erb +3 -3
  27. data/app/views/compute_resources_vms/form/proxmox/_general.html.erb +2 -1
  28. data/app/views/compute_resources_vms/form/proxmox/_network.html.erb +2 -2
  29. data/app/views/compute_resources_vms/form/proxmox/container/_extended.html.erb +3 -2
  30. data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +4 -3
  31. data/app/views/compute_resources_vms/form/proxmox/container/_volume_mp.html.erb +1 -1
  32. data/app/views/compute_resources_vms/form/proxmox/container/_volume_rootfs.html.erb +1 -1
  33. data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +1 -1
  34. data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +4 -3
  35. data/app/views/compute_resources_vms/form/proxmox/server/_volume.html.erb +1 -1
  36. data/app/views/compute_resources_vms/index/_proxmox.html.erb +4 -2
  37. data/config/routes.rb +7 -2
  38. data/lib/foreman_fog_proxmox/engine.rb +4 -0
  39. data/lib/foreman_fog_proxmox/version.rb +1 -1
  40. data/locale/en/foreman_fog_proxmox.edit.po +508 -0
  41. data/locale/en/foreman_fog_proxmox.po +34 -7
  42. data/locale/en/foreman_fog_proxmox.po.time_stamp +0 -0
  43. data/locale/foreman_fog_proxmox.pot +112 -70
  44. data/locale/fr/foreman_fog_proxmox.edit.po +508 -0
  45. data/locale/fr/foreman_fog_proxmox.po +39 -12
  46. data/locale/fr/foreman_fog_proxmox.po.time_stamp +0 -0
  47. data/test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb +28 -8
  48. data/test/factories/proxmox_factory.rb +0 -1
  49. data/test/functional/compute_resources_controller_test.rb +16 -4
  50. data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +1 -0
  51. data/test/unit/foreman_fog_proxmox/proxmox_test.rb +0 -1
  52. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +33 -8
  53. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +2 -2
  54. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb +22 -2
  55. data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_volumes_test.rb +18 -6
  56. metadata +9 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4c422b2ba09e7b1cd71a0dec7ec72398c71f4653a0b8386d4949ea15932df346
4
- data.tar.gz: e870f6684243b1a7f7ee061648d0ad6efd1a1e51a466861f2c1e60f13bc6bc10
3
+ metadata.gz: 8d5a92b97ae63b9983d1e09d466c72be641abac13618416b3f9f9bc4adf9fe59
4
+ data.tar.gz: 44d499507243f4f78910adfdfd566e4fff153dd8b3b4783be1727d905fb9633b
5
5
  SHA512:
6
- metadata.gz: eede4a7f2e4a098e90737ba71c389d979254720fbd876d5a5c73e792302fc6b59a69e37ec8736fa4fd31da982384b6bde8bd9651131ec71035338460c6bb4c26
7
- data.tar.gz: 315fc305b50d96704ac6637d9a8689af9cc7d43ec93afe0c2804755b2b14a35183754a212be2f33cec25c1b37c0b124e9c20f0e0ed12a397560749115c88907c
6
+ metadata.gz: 61df6f0b8aa1caba1c31ad6c696093f3d92d8900d32e01985a671372b8f3503ee3d3752fd930b7a518dc2cd9a1b6eb56d92255fa5c19ff27eff049c2bfef6ff9
7
+ data.tar.gz: acac445ca9f9ee687c440707da9fab8e26e35afc455b29a14f325bcc5a42768f263edb5f6def86eb24acfa583658a5cd70729c40e3f86d5f9c740ec3f4555c4e
@@ -96,3 +96,92 @@ function toggleFieldset(fieldset, index, fieldsets){
96
96
  break;
97
97
  }
98
98
  }
99
+
100
+ function nodeSelected(item) {
101
+ var node_id = $(item).val();
102
+ var type = $("#host_compute_attributes_type").val();
103
+ if (type == undefined) type = $("#compute_attribute_vm_attrs_type").val();
104
+ switch (type) {
105
+ case 'qemu':
106
+ updateOptions('isostorages', 'compute_attributes_config_attributes', 'cdrom_storage', 'compute_attributes_config_attributes', 'cdrom_iso', 'storage', node_id);
107
+ updateOptions('storages', 'compute_attributes_volumes_attributes', 'storage', undefined, undefined, 'storage', node_id);
108
+ updateOptions('bridges', 'interfaces_attributes', 'compute_attributes_bridge', undefined, undefined, 'iface', node_id);
109
+ break;
110
+ case 'lxc':
111
+ updateOptions('ostemplates', 'compute_attributes_ostemplate', 'storage', 'compute_attributes_ostemplate', 'file', 'storage', node_id);
112
+ updateOptions('storages', 'compute_attributes_volumes_attributes', 'storage', undefined, undefined, 'storage', node_id);
113
+ updateOptions('bridges', 'interfaces_attributes', 'compute_attributes_bridge', undefined, undefined, 'iface', node_id);
114
+ break;
115
+ default:
116
+ console.log("unkown type=" + type);
117
+ break;
118
+ }
119
+ }
120
+
121
+ function emptySelect(select){
122
+ $(select).empty();
123
+ $(select).append($("<option></option>").val('').text(''));
124
+ $(select).val('');
125
+ }
126
+
127
+ function initOptions(select_ids){
128
+ console.log('initOptions(' + select_ids[0] + ')');
129
+ select_ids.forEach(emptySelect);
130
+ select_ids.forEach(function(select){
131
+ $(select + ' option:selected').prop('selected',false);
132
+ $(select).val('');
133
+ });
134
+ }
135
+
136
+ function updateOption(select_id, option, option_id){
137
+ console.log('update '+ select_id + ' with '+ option[option_id]);
138
+ $(select_id).append($('<option></option>').val(option[option_id]).text(option[option_id]));
139
+ }
140
+
141
+ function selectIds(start_options_id, end_options_id){
142
+ let select_host_id = 'select[id^=host_' + start_options_id + ']';
143
+ let compute_attributes_regex = /compute_attributes_/gi;
144
+ let select_profile_id = 'select[id^=compute_attribute_vm_attrs_' + start_options_id.replace(compute_attributes_regex, '') + ']';
145
+ if (end_options_id != undefined) {
146
+ select_host_id += '[id$=' + end_options_id + ']';
147
+ select_profile_id += '[id$=' + end_options_id.replace(compute_attributes_regex, '') + ']';
148
+ }
149
+ return [select_host_id, select_profile_id];
150
+ }
151
+
152
+ function updateOptions(options_path, start_options_id, end_options_id, start_second_options_id, end_second_options_id, option_id, node_id, second_id = undefined) {
153
+
154
+ let select_ids = selectIds(start_options_id, end_options_id);
155
+ let select_second_ids;
156
+ if ( start_second_options_id != undefined && end_second_options_id != undefined) {
157
+ select_second_ids = selectIds(start_second_options_id, end_second_options_id);
158
+ }
159
+ var url = '/foreman_fog_proxmox/' + options_path + '/' + node_id;
160
+ if (second_id != undefined) url += '/' + second_id;
161
+ tfm.tools.showSpinner();
162
+ $.getJSON({
163
+ type: 'get',
164
+ url: url,
165
+ error: function(j,status,error){
166
+ var errorMsg = 'Error=' + error + ', status=' + status + ' loading ' + options_path + ' for node_id=' + node_id;
167
+ if (second_id != undefined) errorMsg += ' and second_id=' + second_id;
168
+ console.log(errorMsg);
169
+ },
170
+ success: function(options) {
171
+ initOptions(select_ids);
172
+ if (select_second_ids != undefined) {
173
+ initOptions(select_second_ids);
174
+ }
175
+ $.each(options, function(i,option){
176
+ for (let j = 0; j < select_ids.length; j++) {
177
+ updateOption(select_ids[j], option, option_id);
178
+ }
179
+ });
180
+ },
181
+ complete: function(item){
182
+ // eslint-disable-next-line no-undef
183
+ reloadOnAjaxComplete(item);
184
+ tfm.tools.hideSpinner();
185
+ }
186
+ });
187
+ }
@@ -15,46 +15,10 @@
15
15
  // You should have received a copy of the GNU General Public License
16
16
  // along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
17
17
 
18
- function initOstemplateStorage(){
19
- var select = '#host_compute_attributes_ostemplate_storage';
20
- $(select + ' option:selected').prop('selected',false);
21
- $(select).val('');
22
- }
23
-
24
- function initOstemplateOptions(){
25
- var select_ids = ['#host_compute_attributes_ostemplate_file','#compute_attribute_vm_attrs_ostemplate_file'];
26
- select_ids.forEach(emptySelect);
27
- }
28
-
29
- function emptySelect(select, index, select_ids){
30
- $(select).empty();
31
- $(select).append($("<option></option>").val('').text(''));
32
- $(select).val('');
33
- }
34
-
35
18
 
36
19
  function storageOstemplateSelected(item) {
37
- var storage = $(item).val();
38
- if (storage != '') {
39
- tfm.tools.showSpinner();
40
- $.getJSON({
41
- type: 'get',
42
- url: '/foreman_fog_proxmox/ostemplates/'+storage,
43
- complete: function(){
44
- tfm.tools.hideSpinner();
45
- },
46
- error: function(j,status,error){
47
- console.log("Error=" + error +", status=" + status + " loading os templates for storage=" + storage);
48
- },
49
- success: function(ostemplates) {
50
- initOstemplateOptions();
51
- $.each(ostemplates, function(i,ostemplate){
52
- $('#host_compute_attributes_ostemplate_file').append($("<option></option>").val(ostemplate.volid).text(ostemplate.volid));
53
- $('#compute_attribute_vm_attrs_ostemplate_file').append($("<option></option>").val(ostemplate.volid).text(ostemplate.volid));
54
- });
55
- }
56
- });
57
- } else {
58
- initOstemplateOptions();
59
- }
60
- }
20
+ var storage = $(item).val();
21
+ var node_id = $('#host_compute_attributes_node_id').val();
22
+ if (node_id == undefined) node_id = $("#compute_attribute_vm_attrs_node_id").val();
23
+ updateOptions('ostemplates', 'compute_attributes_ostemplate', 'file', undefined, undefined, 'volid', node_id, storage);
24
+ }
@@ -56,27 +56,8 @@ function initCdromOptions(name) {
56
56
 
57
57
  function storageIsoSelected(item) {
58
58
  var storage = $(item).val();
59
- if (storage != '') {
60
- tfm.tools.showSpinner();
61
- $.getJSON({
62
- type: 'get',
63
- url: '/foreman_fog_proxmox/isos/' + storage,
64
- complete: function () {
65
- tfm.tools.hideSpinner();
66
- },
67
- error: function (j, status, error) {
68
- console.log("Error=" + error + ", status=" + status + " loading isos for storage=" + storage);
69
- },
70
- success: function (isos) {
71
- initCdromOptions('iso');
72
- $.each(isos, function (i, iso) {
73
- $('#host_compute_attributes_config_attributes_cdrom_iso').append($("<option></option>").val(iso.volid).text(iso.volid));
74
- });
75
- }
76
- });
77
- } else {
78
- initCdromOptions('iso');
79
- }
59
+ var node_id = $('#host_compute_attributes_node_id').val();
60
+ updateOptions('isos', 'compute_attributes_config_attributes', 'cdrom_iso', undefined, undefined, 'volid', node_id, storage);
80
61
  }
81
62
 
82
63
  function attributesPrefixSelector(profile, type) {
@@ -27,7 +27,7 @@ module ForemanFogProxmox
27
27
  def compute_resource_params_filter
28
28
  super.tap do |filter|
29
29
  filter.permit :ssl_verify_peer,
30
- :ssl_certs, :node_id, :disable_proxy, :cr_id, :renew
30
+ :ssl_certs, :disable_proxy, :cr_id, :renew
31
31
  end
32
32
  end
33
33
 
@@ -21,22 +21,62 @@ module ForemanFogProxmox
21
21
  class ComputeResourcesController < ::ApplicationController
22
22
  before_action :load_compute_resource
23
23
 
24
- # GET foreman_fog_proxmox/isos/:storage
25
- def isos
26
- volumes = @compute_resource.images_by_storage(params[:storage], 'iso')
24
+ # GET foreman_fog_proxmox/isos/:node_id/:storage
25
+ def isos_by_node_and_storage
26
+ volumes = @compute_resource.images_by_storage(params[:node_id], params[:storage], 'iso')
27
27
  respond_to do |format|
28
28
  format.json { render :json => volumes }
29
29
  end
30
30
  end
31
31
 
32
- # GET foreman_fog_proxmox/ostemplates/:storage
33
- def ostemplates
34
- volumes = @compute_resource.images_by_storage(params[:storage], 'vztmpl')
32
+ # GET foreman_fog_proxmox/ostemplates/:node_id/:storage
33
+ def ostemplates_by_node_and_storage
34
+ volumes = @compute_resource.images_by_storage(params[:node_id], params[:storage], 'vztmpl')
35
35
  respond_to do |format|
36
36
  format.json { render :json => volumes }
37
37
  end
38
38
  end
39
39
 
40
+ # GET foreman_fog_proxmox/isos/:node_id
41
+ def isos_by_node
42
+ volumes = @compute_resource.images_by_storage(params[:node_id], params[:storage], 'iso')
43
+ respond_to do |format|
44
+ format.json { render :json => volumes }
45
+ end
46
+ end
47
+
48
+ # GET foreman_fog_proxmox/ostemplates/:node_id
49
+ def ostemplates_by_node
50
+ storages = @compute_resource.storages(params[:node_id], 'vztmpl')
51
+ respond_to do |format|
52
+ format.json { render :json => storages }
53
+ end
54
+ end
55
+
56
+ # GET foreman_fog_proxmox/storages/:node_id
57
+ def storages_by_node
58
+ storages = @compute_resource.storages(params[:node_id])
59
+ respond_to do |format|
60
+ format.json { render :json => storages }
61
+ end
62
+ end
63
+
64
+ # GET foreman_fog_proxmox/isostorages/:node_id
65
+ def iso_storages_by_node
66
+ storages = @compute_resource.storages(params[:node_id], 'iso')
67
+ respond_to do |format|
68
+ format.json { render :json => storages }
69
+ end
70
+ end
71
+
72
+ # GET foreman_fog_proxmox/bridges/:node_id
73
+ def bridges_by_node
74
+ bridges = @compute_resource.bridges(params[:node_id])
75
+ respond_to do |format|
76
+ format.json { render :json => bridges }
77
+ end
78
+ end
79
+
40
80
  private
41
81
 
42
82
  def load_compute_resource
@@ -23,7 +23,9 @@ require 'foreman_fog_proxmox/value'
23
23
 
24
24
  module ProxmoxContainerHelper
25
25
  def config_keys
26
- keys = { general: ['node_id', 'name', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes', 'firmware_type', 'provision_method', 'container_volumes', 'server_volumes'] }
26
+ general_a = ['node_id', 'name', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes']
27
+ general_a += ['firmware_type', 'provision_method', 'container_volumes', 'server_volumes', 'start_after_create']
28
+ keys = { general: general_a }
27
29
  keys.store(:main, ['name', 'type', 'node_id', 'vmid', 'interfaces', 'mount_points', 'disks'])
28
30
  keys.store(:cpu, ['arch', 'cpulimit', 'cpuunits', 'cores'])
29
31
  keys.store(:memory, ['memory', 'swap'])
@@ -42,7 +42,8 @@ module ProxmoxServerHelper
42
42
  memory = parse_server_memory(config.select { |key, _value| memory_a.include? key })
43
43
  interfaces_attributes = args['interfaces_attributes']
44
44
  interfaces_to_add, interfaces_to_delete = parse_server_interfaces(interfaces_attributes)
45
- general_a = ['node_id', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes', 'firmware_type', 'provision_method', 'container_volumes', 'server_volumes']
45
+ general_a = ['node_id', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes']
46
+ general_a += ['firmware_type', 'provision_method', 'container_volumes', 'server_volumes', 'start_after_create']
46
47
  logger.debug("general_a: #{general_a}")
47
48
  parsed_vm = args.reject { |key, value| general_a.include?(key) || ForemanFogProxmox::Value.empty?(value) }
48
49
  config_a = []
@@ -57,6 +57,17 @@ module ProxmoxVmHelper
57
57
  end
58
58
  end
59
59
 
60
+ def convert_memory_sizes(args)
61
+ convert_memory_size(args['config_attributes'], 'memory')
62
+ convert_memory_size(args['config_attributes'], 'min_memory')
63
+ convert_memory_size(args['config_attributes'], 'shares')
64
+ convert_memory_size(args['config_attributes'], 'swap')
65
+ end
66
+
67
+ def convert_volumes_size(args)
68
+ args['volumes_attributes'].each_value { |value| value['size'] = (value['size'].to_i / GIGA).to_s unless ForemanFogProxmox::Value.empty?(value['size']) }
69
+ end
70
+
60
71
  def convert_sizes(args)
61
72
  convert_memory_size(args['config_attributes'], 'memory')
62
73
  convert_memory_size(args['config_attributes'], 'min_memory')
@@ -74,4 +85,12 @@ module ProxmoxVmHelper
74
85
  memory = (config_hash[key].to_i / MEGA).to_s == '0' ? config_hash[key] : (config_hash[key].to_i / MEGA).to_s
75
86
  config_hash.store(key, memory)
76
87
  end
88
+
89
+ def vm_type(host)
90
+ host.compute_object.type
91
+ end
92
+
93
+ def node_id(host)
94
+ host.compute_object.node_id
95
+ end
77
96
  end
@@ -21,11 +21,6 @@ module FogExtensions
21
21
  module Proxmox
22
22
  module Node
23
23
  extend ActiveSupport::Concern
24
- def all(_options = {})
25
- vms = servers.all
26
- vms += containers.all
27
- vms
28
- end
29
24
 
30
25
  def each(collection_filters = {})
31
26
  if block_given?
@@ -21,7 +21,7 @@ module FogExtensions
21
21
  module Proxmox
22
22
  module Server
23
23
  extend ActiveSupport::Concern
24
- attr_accessor :image_id, :templated, :ostemplate_storage, :ostemplate_file, :password
24
+ attr_accessor :image_id, :templated, :ostemplate_storage, :ostemplate_file, :password, :start_after_create
25
25
 
26
26
  def start
27
27
  action('start')
@@ -41,7 +41,6 @@ module ForemanFogProxmox
41
41
  validates :url, :format => { :with => URI::DEFAULT_PARSER.make_regexp }, :presence => true
42
42
  validates :user, :format => { :with => /(\w+)[@]{1}(\w+)/ }, :presence => true
43
43
  validates :password, :presence => true
44
- validates :node_id, :presence => true
45
44
  before_create :test_connection
46
45
 
47
46
  def provided_attributes
@@ -66,18 +65,6 @@ module ForemanFogProxmox
66
65
  associate_by('mac', vm.mac)
67
66
  end
68
67
 
69
- def node_id
70
- attrs[:node_id]
71
- end
72
-
73
- def node_id=(value)
74
- attrs[:node_id] = value
75
- end
76
-
77
- def node
78
- client.nodes.get node_id
79
- end
80
-
81
68
  def ssl_certs
82
69
  attrs[:ssl_certs]
83
70
  end
@@ -120,14 +107,23 @@ module ForemanFogProxmox
120
107
 
121
108
  def client
122
109
  @client ||= ::Fog::Proxmox::Compute.new(fog_credentials)
110
+ rescue StandardError => e
111
+ logger.error(e)
112
+ raise ::Foreman::Exception, format(N_('Failed retrieving proxmox compute client caused by %<e>s'), e: e)
123
113
  end
124
114
 
125
115
  def identity_client
126
116
  @identity_client ||= ::Fog::Proxmox::Identity.new(fog_credentials)
117
+ rescue StandardError => e
118
+ logger.error(e)
119
+ raise ::Foreman::Exception, format(N_('Failed retrieving proxmox identity client caused by %<e>s'), e: e)
127
120
  end
128
121
 
129
122
  def network_client
130
123
  @network_client ||= ::Fog::Proxmox::Network.new(fog_credentials)
124
+ rescue StandardError => e
125
+ logger.error(e)
126
+ raise ::Foreman::Exception, format(N_('Failed retrieving proxmox network client caused by %<e>s'), e: e)
131
127
  end
132
128
 
133
129
  def host
@@ -23,19 +23,24 @@ module ForemanFogProxmox
23
23
  !find_vm_by_uuid(image).nil?
24
24
  end
25
25
 
26
- def images_by_storage(storage_id, type = 'iso')
26
+ def images_by_storage(node_id, storage_id, type = 'iso')
27
+ node = client.nodes.get node_id
28
+ node ||= default_node
27
29
  storage = node.storages.get storage_id if storage_id
28
30
  storage.volumes.list_by_content_type(type).sort_by(&:volid) if storage
29
31
  end
30
32
 
31
33
  def available_images
32
- templates.collect { |template| OpenStruct.new(id: template.vmid) }
34
+ templates.collect { |template| OpenStruct.new(id: template.vmid.to_s) }
33
35
  end
34
36
 
35
37
  def templates
36
- storage = storages.first
37
- images = storage.volumes.list_by_content_type('images')
38
- images.select(&:templated?)
38
+ volumes = []
39
+ nodes.each do |node|
40
+ storage = storages(node.node).first
41
+ volumes += storage.volumes.list_by_content_type('images')
42
+ end
43
+ volumes.select(&:templated?)
39
44
  end
40
45
 
41
46
  def template(vmid)
@@ -22,7 +22,7 @@ module ForemanFogProxmox
22
22
  include ProxmoxVolumes
23
23
 
24
24
  def start_on_boot(vm, args)
25
- startonboot = args[:config_attributes][:onboot].blank? ? false : Foreman::Cast.to_bool(args[:config_attributes][:onboot])
25
+ startonboot = args[:start_after_create].blank? ? false : Foreman::Cast.to_bool(args[:start_after_create])
26
26
  vm.start if startonboot
27
27
  vm
28
28
  end
@@ -30,6 +30,7 @@ module ForemanFogProxmox
30
30
  def create_vm(args = {})
31
31
  vmid = args[:vmid].to_i
32
32
  type = args[:type]
33
+ node = client.nodes.get(args[:node_id])
33
34
  raise ::Foreman::Exception, format(N_('invalid vmid=%<vmid>s'), vmid: vmid) unless node.servers.id_valid?(vmid)
34
35
 
35
36
  image_id = args[:image_id]
@@ -88,9 +89,13 @@ module ForemanFogProxmox
88
89
  def save_vm(uuid, new_attributes)
89
90
  vm = find_vm_by_uuid(uuid)
90
91
  templated = new_attributes['templated']
92
+ node_id = new_attributes['node_id']
91
93
  if templated == '1' && !vm.templated?
92
94
  vm.create_template
95
+ elsif vm.node_id != node_id
96
+ vm.migrate(node_id)
93
97
  else
98
+ convert_memory_sizes(new_attributes)
94
99
  volumes_attributes = new_attributes['volumes_attributes']
95
100
  volumes_attributes&.each_value { |volume_attributes| save_volume(vm, volume_attributes) }
96
101
  parsed_attr = vm.container? ? parse_container_vm(new_attributes.merge(type: vm.type)) : parse_server_vm(new_attributes.merge(type: vm.type))
@@ -100,7 +105,6 @@ module ForemanFogProxmox
100
105
  cdrom_attributes = parsed_attr.select { |_key, value| Fog::Proxmox::DiskHelper.cdrom?(value.to_s) }
101
106
  config_attributes = config_attributes.reject { |key, _value| Fog::Proxmox::DiskHelper.disk?(key) }
102
107
  vm.update(config_attributes.merge(cdrom_attributes))
103
- start_on_boot(vm, new_attributes)
104
108
  end
105
109
  find_vm_by_uuid(uuid)
106
110
  end