foreman_fog_proxmox 0.13.1 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +27 -14
  3. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +6 -8
  4. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +59 -60
  5. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +2 -4
  6. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume.js +10 -10
  7. data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cloudinit.js +0 -1
  8. data/app/controllers/concerns/foreman_fog_proxmox/compute_resources_vms_controller.rb +80 -0
  9. data/app/controllers/concerns/foreman_fog_proxmox/hosts_controller.rb +53 -0
  10. data/app/helpers/proxmox_compute_resources_vms_helper.rb +99 -0
  11. data/app/helpers/proxmox_form_helper.rb +1 -1
  12. data/app/models/concerns/fog_extensions/proxmox/server.rb +3 -3
  13. data/app/models/concerns/host_ext/proxmox/associator.rb +46 -0
  14. data/app/models/concerns/host_ext/proxmox/for_vm.rb +33 -0
  15. data/app/models/concerns/orchestration/proxmox/compute.rb +18 -8
  16. data/app/models/foreman_fog_proxmox/proxmox.rb +4 -0
  17. data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +2 -6
  18. data/app/models/foreman_fog_proxmox/proxmox_images.rb +13 -4
  19. data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +14 -12
  20. data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +4 -2
  21. data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +2 -4
  22. data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +6 -1
  23. data/app/models/foreman_fog_proxmox/vms.rb +1 -1
  24. data/app/overrides/compute_resources_vms/form/add_clone_to_new_vm_compute_detail.rb +1 -1
  25. data/app/services/concerns/foreman_fog_proxmox/compute_resource_host_associator.rb +34 -0
  26. data/app/views/compute_resources_vms/form/proxmox/_add_from_profile_to_compute_form.html.erb +2 -2
  27. data/app/views/compute_resources_vms/form/proxmox/_add_from_profile_to_hosts_compute_detail_form.html.erb +4 -2
  28. data/app/views/compute_resources_vms/form/proxmox/_base.html.erb +0 -1
  29. data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +1 -1
  30. data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +2 -2
  31. data/app/views/compute_resources_vms/index/_proxmox.html.erb +2 -2
  32. data/lib/foreman_fog_proxmox/engine.rb +7 -1
  33. data/lib/foreman_fog_proxmox/version.rb +1 -1
  34. data/test/unit/foreman_fog_proxmox/proxmox_images_test.rb +3 -3
  35. data/test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb +40 -38
  36. metadata +9 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ee2ea48049134a2a429baa88bd6f3299c321f38a5f3532c8c17d1a3012dc277
4
- data.tar.gz: 246a3ee1a5bb9f7f99e55b7f97f637cae3b49b12e7917667444238ae007e21e6
3
+ metadata.gz: 19b7f2f30af319dbc8881900c660bf9ddc5026eb8762ace34dcd6b4ac7fa85f8
4
+ data.tar.gz: 5430f62a1d7db829fddb142c468d5c3741a0090131f0a3d26746bec75f6b943e
5
5
  SHA512:
6
- metadata.gz: b7ba0a9c31049f222e8cd06fd411356ae1302dcf1b9b0acfe0be8498d514c39e3c54373d8603484183c01318bff6c9ad4b18c8366f28916ffa05976e87b62914
7
- data.tar.gz: 66d723e3135509e731e663438fa5d5cd3f79464641e4470c7b8f7908d744ba04d069a579c334140acc1b927c408208fa91cac5e30daf27998cb64f91575b9fc8
6
+ metadata.gz: ceac1a672eb780a7c7e8e05d8024f70d74d129a3ff48ad5d65f9947c78d60778a3697c7a70e030eff53346f3f56587a726fa71b5a719bb448bbea573d7970e47
7
+ data.tar.gz: cd477463a37e43ce80db0986f08d8203b225cfc5abae4f31b5c165cfc149197c99be2b2d8687b6e217246609c77d781658d93c119b37c41bfebc6049be852b4a
data/README.md CHANGED
@@ -34,12 +34,31 @@ You can support the plugin development via the following methods:
34
34
  |>=0.12 |>=6.1|>=0.11|>=2.0|>=2.5|
35
35
  |>=0.14 |>=6.2|=0.13.0|>=2.4|>=2.7|
36
36
  |>=0.14 |>=6.2|>=0.13.1|>=2.3|>=2.5|
37
+ |>=0.14 |>=6.2|>=0.14.0|>=2.5|>=2.5|
37
38
 
38
39
  ## Installation
39
40
 
40
- ### Prerequisites
41
+ ### From OS packages
41
42
 
42
- You need [nodejs](https://nodejs.org/en/download/package-manager/) installed in order to use foreman-assets package.
43
+ Please see the Foreman manual for complete instructions:
44
+
45
+ * [Foreman: How to Install a Plugin from package](https://theforeman.org/plugins/#2.Installation)
46
+
47
+ [Install from package](https://theforeman.org/plugins/#2.2Packageinstallation) is the easiest way to install the plugin. Choose the latest release plugins repository. If you don't find it in the same foreman release repository, get it from the `nightly` repository.
48
+
49
+ Then you can install it with the package manager, in Debian/Ubuntu:
50
+
51
+ ```shell
52
+ sudo apt-get install ruby-foreman-fog-proxmox
53
+ ```
54
+
55
+ and in Fedora/Redhat Linux:
56
+
57
+ ```shell
58
+ sudo dnf install rubygem-foreman_fog_proxmox
59
+ ```
60
+
61
+ Redhat, CentOS or Fedora users should also [setup Selinux](https://projects.theforeman.org/projects/foreman/wiki/SELinux) to allow foreman and all its plugins to work.
43
62
 
44
63
  ### From gem
45
64
 
@@ -47,10 +66,10 @@ See complete details in [plugin installation from gem](https://theforeman.org/pl
47
66
 
48
67
  Here is a Debian sample:
49
68
 
50
- * Install foreman [from OS packages](https://theforeman.org/manuals/1.19/index.html#3.3InstallFromPackages):
69
+ * Install foreman [from OS packages](https://theforeman.org/manuals/latest/index.html#3.3InstallFromPackages):
51
70
 
52
71
  ```shell
53
- sudo apt install -y foreman foreman-compute foreman-sqlite3 foreman-assets
72
+ sudo apt install -y foreman foreman-pgsql
54
73
  ```
55
74
 
56
75
  * Use only foreman user (**not root!**) `sudo -u foreman ...`
@@ -68,6 +87,8 @@ sudo -u foreman /usr/bin/foreman-ruby /usr/bin/bundle install
68
87
 
69
88
  * Precompile plugin assets:
70
89
 
90
+ You need [nodejs](https://nodejs.org/en/download/package-manager/) installed in order to use foreman-assets package.
91
+
71
92
  ```shell
72
93
  /usr/bin/foreman-ruby /usr/bin/bundle exec bin/rake plugin:assets:precompile[foreman_fog_proxmox]
73
94
  ```
@@ -98,14 +119,6 @@ Then you can check plugin installation after login into your new foreman server
98
119
  ![About resources](.github/images/about_resources.png)
99
120
  ![About greffon](.github/images/about_greffon.png)
100
121
 
101
- ### From OS packages
102
-
103
- Please see the Foreman manual for complete instructions:
104
-
105
- * [Foreman: How to Install a Plugin](http://theforeman.org/manuals/latest/index.html#6.1InstallaPlugin)
106
-
107
- Redhat, CentOS or Fedora users should also [setup Selinux](https://projects.theforeman.org/projects/foreman/wiki/SELinux) to allow foreman and all its plugins to work.
108
-
109
122
  ## Usage
110
123
 
111
124
  * [Compute resource](.github/compute_resource.md)
@@ -113,7 +126,7 @@ Redhat, CentOS or Fedora users should also [setup Selinux](https://projects.thef
113
126
 
114
127
  ## Development
115
128
 
116
- ### Prerequisites
129
+ ### Dev prerequisites
117
130
 
118
131
  * You need a Proxmox VE 5.4+ server running.
119
132
  * You need ruby >= 2.5. You can install it with [asdf-vm](https://asdf-vm.com).
@@ -189,7 +202,7 @@ add these lines to each environment in config/database.yml:
189
202
 
190
203
  ```shell
191
204
  cp config/ignored_environments.yml.sample config/ignored_environments.yml
192
- docker run --name foreman-db -e POSTGRES_DB=foreman -e POSTGRES_USER=foreman -e POSTGRES_PASSWORD=foreman -p 5432:5432 -d postgres
205
+ docker run --name foreman-db -v foreman_data:/var/lib/postgresql/data -e POSTGRES_DB=foreman -e POSTGRES_USER=foreman -e POSTGRES_PASSWORD=foreman -p 5432:5432 -d postgres
193
206
  bundle exec bin/rake db:migrate
194
207
  # reboot if settings.NAME error in schema
195
208
  bundle exec bin/rake db:seed assets:precompile locale:pack webpack:compile
@@ -15,8 +15,6 @@
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
- $(document).on('ContentLoad', tfm.numFields.initAll);
19
-
20
18
  $(document).ready(function () {
21
19
  sslVerifyPeerSelected();
22
20
  authMethodSelected();
@@ -36,14 +34,14 @@ function sslVerifyPeerSelected() {
36
34
  }
37
35
  }
38
36
 
39
- function enableField(id) {
40
- $(id).show();
41
- $(id).removeAttr('disabled');
37
+ function enableField(item) {
38
+ $(item).show();
39
+ $(item).removeAttr('disabled');
42
40
  }
43
41
 
44
- function disableField(id) {
45
- $(id).hide();
46
- $(id).attr('disabled','disabled');
42
+ function disableField(item) {
43
+ $(item).hide();
44
+ $(item).attr('disabled','disabled');
47
45
  }
48
46
 
49
47
  function toggleFieldset(method, selected){
@@ -15,7 +15,6 @@
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
- $(document).on('ContentLoad', tfm.numFields.initAll);
19
18
  $(document).ready(vmTypeSelected);
20
19
 
21
20
  function vmTypeSelected() {
@@ -39,17 +38,17 @@ function vmTypeSelected() {
39
38
  return false;
40
39
  }
41
40
 
42
- function volumeButtonAddId(id){
43
- return $("a[data-association='" + id + "_volumes']");
41
+ function volumeButtonAddId(item){
42
+ return $("a[data-association='" + item + "_volumes']");
44
43
  }
45
44
 
46
- function volumeFieldsetId(id, type){
47
- return $("fieldset[id^='" + type + "_volume_"+ id +"']").not("fieldset[id$='_new_" + id +"_volumes']");
45
+ function volumeFieldsetId(item, type){
46
+ return $("fieldset[id^='" + type + "_volume_"+ item +"']").not("fieldset[id$='_new_" + item +"_volumes']");
48
47
  }
49
48
 
50
- function indexByIdAndType(id, storage_type, vm_type){
51
- let regex = new RegExp(`${vm_type}_volume_${storage_type}_(\\d+)`);
52
- return id.match(regex)[1];
49
+ function indexByIdAndType(item, storage_type, vm_type){
50
+ var regex = new RegExp(vm_type +"_volume_" + storage_type +"_(\\d+)");
51
+ return item.match(regex)[1];
53
52
  }
54
53
 
55
54
  function volidByIndexAndTag(index, tag){
@@ -58,10 +57,10 @@ function volidByIndexAndTag(index, tag){
58
57
 
59
58
  function hasCloudinit(){
60
59
  result = false;
61
- let id = volumeFieldsetId('cloud_init', 'server').attr('id');
62
- if (id !== undefined){
63
- let index = indexByIdAndType(id, 'cloud_init', 'server');
64
- let volid = volidByIndexAndTag(index, 'input');
60
+ var volume_id = volumeFieldsetId('cloud_init', 'server').attr('id');
61
+ if (volume_id !== undefined){
62
+ var index = indexByIdAndType(volume_id, 'cloud_init', 'server');
63
+ var volid = volidByIndexAndTag(index, 'input');
65
64
  result = volid.includes("cloudinit");
66
65
  }
67
66
  return result;
@@ -69,42 +68,42 @@ function hasCloudinit(){
69
68
 
70
69
  function hasCdrom(){
71
70
  result = false;
72
- let id = volumeFieldsetId('cdrom', 'server').attr('id');
73
- if (id !== undefined){
74
- let index = indexByIdAndType(id, 'cdrom', 'server');
75
- let checked = $("input[id^='host_compute_attributes_volumes_attributes_" + index + "_cdrom']:checked").val();
76
- let isCdrom = checked === 'cdrom';
71
+ var volume_id = volumeFieldsetId('cdrom', 'server').attr('id');
72
+ if (volume_id !== undefined){
73
+ var index = indexByIdAndType(volume_id, 'cdrom', 'server');
74
+ var checked = $("input[id^='host_compute_attributes_volumes_attributes_" + index + "_cdrom']:checked").val();
75
+ var isCdrom = checked === 'cdrom';
77
76
  result = isCdrom;
78
- let isImage = checked === 'image';
77
+ var isImage = checked === 'image';
79
78
  if (isImage) {
80
- let volid = volidByIndexAndTag(index, 'select');
79
+ var volid = volidByIndexAndTag(index, 'select');
81
80
  result = volid.includes("iso");
82
81
  }
83
82
  }
84
83
  return result;
85
84
  }
86
85
 
87
- function cloudinit(id){
88
- return id === 'cloud_init' && hasCloudinit();
86
+ function cloudinit(item){
87
+ return item === 'cloud_init' && hasCloudinit();
89
88
  }
90
89
 
91
- function cdrom(id){
92
- return id === 'cdrom' && hasCdrom();
90
+ function cdrom(item){
91
+ return item === 'cdrom' && hasCdrom();
93
92
  }
94
93
 
95
- function enableVolume(id, type){
96
- volumeFieldsetId(id, type).show();
97
- volumeButtonAddId(id).show();
98
- if (cloudinit(id) || cdrom(id)){
99
- volumeButtonAddId(id).hide();
94
+ function enableVolume(volume_id, type){
95
+ volumeFieldsetId(volume_id, type).show();
96
+ volumeButtonAddId(volume_id).show();
97
+ if (cloudinit(volume_id) || cdrom(volume_id)){
98
+ volumeButtonAddId(volume_id).hide();
100
99
  }
101
- volumeFieldsetId(id, type).removeAttr('disabled');
100
+ volumeFieldsetId(volume_id, type).removeAttr('disabled');
102
101
  }
103
102
 
104
- function disableVolume(id, type){
105
- volumeFieldsetId(id, type).hide();
106
- volumeButtonAddId(id).hide();
107
- volumeFieldsetId(id, type).attr('disabled','disabled');
103
+ function disableVolume(volume_id, type){
104
+ volumeFieldsetId(volume_id, type).hide();
105
+ volumeButtonAddId(volume_id).hide();
106
+ volumeFieldsetId(volume_id, type).attr('disabled','disabled');
108
107
  }
109
108
 
110
109
  function volumes(type){
@@ -115,44 +114,44 @@ function volume(type){
115
114
  return type === 'qemu' ? 'server' : 'container';
116
115
  }
117
116
 
118
- function toggleVolume(id, type1, type2){
119
- type1 === type2 ? enableVolume(id, volume(type1)) : disableVolume(id, volume(type1));
117
+ function toggleVolume(volume_id, type1, type2){
118
+ type1 === type2 ? enableVolume(volume_id, volume(type1)) : disableVolume(volume_id, volume(type1));
120
119
  }
121
120
 
122
121
  function toggleVolumes(selected){
123
122
  ['qemu', 'lxc'].forEach(function(type){
124
- volumes(type).forEach(function(id){
125
- toggleVolume(id, selected, type);
123
+ volumes(type).forEach(function(volume_id){
124
+ toggleVolume(volume_id, selected, type);
126
125
  });
127
126
  });
128
127
  }
129
128
 
130
- function enableFieldset(id, fieldset) {
129
+ function enableFieldset(fieldsetId, fieldset) {
131
130
  if (fieldset.toggle && fieldset.new_vm){
132
- fieldset_id(id, fieldset).show();
131
+ fieldset_id(fieldsetId, fieldset).show();
133
132
  }
134
- fieldset_id(id, fieldset).removeAttr('disabled');
135
- input_hidden_id(id).removeAttr('disabled');
133
+ fieldset_id(fieldsetId, fieldset).removeAttr('disabled');
134
+ input_hidden_id(fieldsetId).removeAttr('disabled');
136
135
  }
137
136
 
138
- function disableFieldset(id, fieldset) {
137
+ function disableFieldset(fieldsetId, fieldset) {
139
138
  if (fieldset.toggle && fieldset.new_vm){
140
- fieldset_id(id, fieldset).hide();
139
+ fieldset_id(fieldsetId, fieldset).hide();
141
140
  }
142
- fieldset_id(id, fieldset).attr('disabled','disabled');
143
- input_hidden_id(id).attr('disabled','disabled');
141
+ fieldset_id(fieldsetId, fieldset).attr('disabled','disabled');
142
+ input_hidden_id(fieldsetId).attr('disabled','disabled');
144
143
  }
145
144
 
146
- function toggleFieldset(id, fieldset, type1, type2) {
147
- type1 === type2 ? enableFieldset(id, fieldset) : disableFieldset(id, fieldset);
145
+ function toggleFieldset(fieldsetId, fieldset, type1, type2) {
146
+ type1 === type2 ? enableFieldset(fieldsetId, fieldset) : disableFieldset(fieldsetId, fieldset);
148
147
  }
149
148
 
150
- function input_hidden_id(id){
151
- return $("div[id^='"+ id +"_volumes']" + " + input:hidden");
149
+ function input_hidden_id(volume_id){
150
+ return $("div[id^='"+ volume_id +"_volumes']" + " + input:hidden");
152
151
  }
153
152
 
154
- function fieldset_id(id, fieldset){
155
- return $("fieldset[id^='" + id + "_"+fieldset.id+"']");
153
+ function fieldset_id(fieldsetId, fieldset){
154
+ return $("fieldset[id^='" + fieldsetId + "_"+fieldset.id+"']");
156
155
  }
157
156
 
158
157
  function fieldsets(type){
@@ -163,8 +162,8 @@ function toggleFieldsets(fieldset){
163
162
  var removable_input_hidden = $("div.removable-item[style='display: none;']" + " + input:hidden");
164
163
  removable_input_hidden.attr('disabled','disabled');
165
164
  ['qemu', 'lxc'].forEach(function(type){
166
- fieldsets(type).forEach(function(id){
167
- toggleFieldset(id, fieldset, fieldset.selected, type);
165
+ fieldsets(type).forEach(function(fieldsetId){
166
+ toggleFieldset(fieldsetId, fieldset, fieldset.selected, type);
168
167
  });
169
168
  });
170
169
  }
@@ -190,18 +189,18 @@ function nodeSelected(item) {
190
189
  }
191
190
  }
192
191
 
193
- function emptySelect(select){
194
- $(select).empty();
195
- $(select).append($("<option></option>").val('').text(''));
196
- $(select).val('');
192
+ function emptySelect(select_id){
193
+ $(select_id).empty();
194
+ $(select_id).append($("<option></option>").val('').text(''));
195
+ $(select_id).val('');
197
196
  }
198
197
 
199
198
  function initOptions(select_ids){
200
199
  console.log('initOptions(' + select_ids[0] + ')');
201
200
  select_ids.forEach(emptySelect);
202
- select_ids.forEach(function(select){
203
- $(select + ' option:selected').prop('selected',false);
204
- $(select).val('');
201
+ select_ids.forEach(function(select_id){
202
+ $(select_id + ' option:selected').prop('selected',false);
203
+ $(select_id).val('');
205
204
  });
206
205
  }
207
206
 
@@ -24,9 +24,9 @@ function volumesAttributesSelector(profile,index,selector) {
24
24
  }
25
25
 
26
26
  function getIndex(item) {
27
- var id = $(item).attr('id');
27
+ var index_id = $(item).attr('id');
28
28
  var pattern = /(host_compute_attributes_volumes_attributes_||compute_attribute_vm_attrs_volumes_attributes_)(\d+)[_](.*)/i;
29
- pattern_a = pattern.exec(id);
29
+ pattern_a = pattern.exec(index_id);
30
30
  var index = pattern_a[2];
31
31
  return index;
32
32
  }
@@ -46,7 +46,6 @@ function controllerSelected(item) {
46
46
  var device = $(device_selector).limitedSpinner('value');
47
47
  var id = controller + device;
48
48
  $(id_selector).val(id);
49
- tfm.numFields.initAll();
50
49
  }
51
50
 
52
51
  function deviceSelected(item) {
@@ -58,7 +57,6 @@ function deviceSelected(item) {
58
57
  var controller = $(controller_selector).val();
59
58
  var id = controller + device;
60
59
  $(id_selector).val(id);
61
- tfm.numFields.initAll();
62
60
  }
63
61
 
64
62
  function computeControllerMaxDevice(controller) {
@@ -16,24 +16,24 @@
16
16
  // along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
17
17
 
18
18
  function getIndex(item) {
19
- var id = $(item).attr('id');
19
+ var index_id = $(item).attr('id');
20
20
  var pattern = /(host_compute_attributes_volumes_attributes_||compute_attribute_vm_attrs_volumes_attributes_)(\d+)[_](.*)/i;
21
- pattern_a = pattern.exec(id);
21
+ pattern_a = pattern.exec(index_id);
22
22
  var index = pattern_a[2];
23
23
  return index;
24
24
  }
25
25
 
26
26
  function volumeId(type,index){
27
- let id = '#volume_' + type + '_' + index;
28
- return id;
27
+ var volume_id = '#volume_' + type + '_' + index;
28
+ return volume_id;
29
29
  }
30
30
 
31
- function enableField(id) {
32
- $(id).show();
33
- $(id).removeAttr('disabled');
31
+ function enableField(item) {
32
+ $(item).show();
33
+ $(item).removeAttr('disabled');
34
34
  }
35
35
 
36
- function disableField(id) {
37
- $(id).hide();
38
- $(id).attr('disabled','disabled');
36
+ function disableField(item) {
37
+ $(item).hide();
38
+ $(item).attr('disabled','disabled');
39
39
  }
@@ -21,5 +21,4 @@ function cloudinitControllerSelected(item) {
21
21
  var max = computeControllerMaxDevice(controller);
22
22
  var device_selector = 'host_compute_attributes_volumes_attributes_' + index + 'device';
23
23
  $(device_selector).attr('data-soft-max', max);
24
- tfm.numFields.initAll();
25
24
  }
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2021 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
+ module ForemanFogProxmox
21
+ module ComputeResourcesVmsController
22
+ extend ActiveSupport::Concern
23
+ included do
24
+ prepend Overrides
25
+ end
26
+ module Overrides
27
+ def associate
28
+ if Host.for_vm_uuid(@compute_resource, @vm).any?
29
+ process_error(:error_msg => _("VM already associated with a host"), :redirect => compute_resource_vm_path(:compute_resource_id => params[:compute_resource_id], :id => proxmox_vm_id(@compute_resource, @vm)))
30
+ return
31
+ end
32
+ host = @compute_resource.associated_host(@vm) if @compute_resource.respond_to?(:associated_host)
33
+ if host.present?
34
+ host.associate!(@compute_resource, @vm)
35
+ process_success(:success_msg => _("VM associated to host %s") % host.name, :success_redirect => host_path(host))
36
+ else
37
+ process_error(:error_msg => _("No host found to associate this VM with"), :redirect => compute_resource_vm_path(:compute_resource_id => params[:compute_resource_id], :id => proxmox_vm_id(@compute_resource, @vm)))
38
+ end
39
+ end
40
+
41
+ def console
42
+ @console = @compute_resource.console proxmox_vm_id(@compute_resource, @vm)
43
+ render case @console[:type]
44
+ when 'spice'
45
+ 'hosts/console/spice'
46
+ when 'vnc'
47
+ 'hosts/console/vnc'
48
+ when 'vmrc'
49
+ 'hosts/console/vmrc'
50
+ else
51
+ 'hosts/console/log'
52
+ end
53
+ rescue StandardError => e
54
+ process_error :redirect => compute_resource_vm_path(@compute_resource, proxmox_vm_id(@compute_resource, @vm)), :error_msg => (_("Failed to set console: %s") % e), :object => @vm
55
+ end
56
+
57
+ private
58
+
59
+ def proxmox_vm_id(compute_resource, vm)
60
+ id = vm.identity
61
+ id = vm.unique_cluster_identity(compute_resource) if compute_resource.class == ForemanFogProxmox::Proxmox
62
+ id
63
+ end
64
+
65
+ def run_vm_action(action)
66
+ if @vm.send(action)
67
+ @vm.reload
68
+ success format(_("%<vm>s is now %<vm_state>s"), { :vm => @vm, :vm_state => @vm.state.capitalize })
69
+ else
70
+ error format(_("failed to %<action>s %<vm>s"), { :action => _(action), :vm => @vm })
71
+ end
72
+ redirect_back(:fallback_location => compute_resource_vm_path(:compute_resource_id => params[:compute_resource_id], :id => proxmox_vm_id(@compute_resource, @vm)))
73
+ # This should only rescue Fog::Errors, but Fog returns all kinds of errors...
74
+ rescue StandardError => e
75
+ error format(_("Error - %<message>s"), { :message => _(e.message) })
76
+ redirect_back(:fallback_location => compute_resource_vm_path(:compute_resource_id => params[:compute_resource_id], :id => proxmox_vm_id(@compute_resource, @vm)))
77
+ end
78
+ end
79
+ end
80
+ end