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.
- checksums.yaml +4 -4
- data/README.md +24 -5
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +36 -2
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +134 -60
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_server.js +2 -50
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume.js +39 -0
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cdrom.js +63 -0
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_volume_cloudinit.js +25 -0
- data/app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb +1 -1
- data/app/controllers/foreman_fog_proxmox/compute_resources_controller.rb +23 -25
- data/app/helpers/proxmox_compute_controllers_helper.rb +39 -0
- data/app/helpers/proxmox_compute_resources_helper.rb +49 -0
- data/app/helpers/proxmox_compute_selectors_helper.rb +6 -44
- data/app/helpers/proxmox_form_helper.rb +12 -4
- data/app/{models/concerns/fog_extensions/proxmox/volume.rb → helpers/proxmox_storages_helper.rb} +5 -8
- data/app/helpers/proxmox_vm_cdrom_helper.rb +35 -0
- data/app/helpers/proxmox_vm_cloudinit_helper.rb +43 -0
- data/app/helpers/proxmox_vm_config_helper.rb +160 -0
- data/app/helpers/proxmox_vm_helper.rb +24 -62
- data/app/helpers/proxmox_vm_interfaces_helper.rb +85 -0
- data/app/helpers/proxmox_vm_os_template_helper.rb +47 -0
- data/app/{models/foreman_fog_proxmox/proxmox_token_expiration.rb → helpers/proxmox_vm_uuid_helper.rb} +14 -10
- data/app/helpers/proxmox_vm_volumes_helper.rb +105 -0
- data/app/models/concerns/fog_extensions/proxmox/disk.rb +17 -2
- data/app/models/concerns/fog_extensions/proxmox/interface.rb +19 -4
- data/app/models/concerns/fog_extensions/proxmox/server.rb +12 -3
- data/app/models/concerns/fog_extensions/proxmox/server_config.rb +8 -30
- data/app/models/concerns/host_ext/proxmox/interfaces.rb +7 -2
- data/app/models/concerns/orchestration/proxmox/compute.rb +49 -0
- data/app/models/foreman_fog_proxmox/proxmox.rb +58 -15
- data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +14 -18
- data/app/models/foreman_fog_proxmox/proxmox_connection.rb +14 -9
- data/app/models/foreman_fog_proxmox/proxmox_images.rb +2 -1
- data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +53 -28
- data/app/models/foreman_fog_proxmox/proxmox_operating_systems.rb +1 -1
- data/app/models/foreman_fog_proxmox/proxmox_version.rb +7 -2
- data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +19 -31
- data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +108 -94
- data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +9 -6
- data/app/models/foreman_fog_proxmox/proxmox_volumes.rb +79 -22
- data/app/services/foreman_fog_proxmox/node_dashboard/data.rb +6 -2
- data/app/views/api/v2/compute_resources/proxmox.json.rabl +1 -1
- data/app/views/compute_resources/form/_proxmox.html.erb +23 -10
- data/app/views/compute_resources/show/_proxmox.html.erb +6 -6
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +3 -1
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +46 -29
- data/app/views/compute_resources_vms/form/proxmox/_base.html.erb +3 -3
- data/app/views/compute_resources_vms/form/proxmox/_removable_layout.html.erb +2 -1
- data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +8 -7
- data/app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb +0 -2
- data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +15 -14
- data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +2 -2
- data/app/views/compute_resources_vms/form/proxmox/server/_volume_cdrom.html.erb +34 -0
- data/app/views/compute_resources_vms/form/proxmox/server/_volume_cloud_init.html.erb +29 -0
- data/app/views/compute_resources_vms/form/proxmox/server/{_volume.html.erb → _volume_hard_disk.html.erb} +7 -3
- data/app/views/compute_resources_vms/show/_proxmox.html.erb +2 -0
- data/config/routes.rb +7 -7
- data/db/migrate/20210312105013_update_proxmox_uuid_host.rb +29 -0
- data/lib/foreman_fog_proxmox/engine.rb +15 -10
- data/lib/foreman_fog_proxmox/hash_collection.rb +69 -0
- data/lib/foreman_fog_proxmox/version.rb +1 -1
- data/lib/tasks/foreman_fog_proxmox_tasks.rake +0 -3
- data/test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb +20 -8
- data/test/factories/foreman_fog_proxmox/proxmox_node_mock_factory.rb +5 -5
- data/test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb +17 -7
- data/test/factories/proxmox_factory.rb +4 -4
- data/test/functional/compute_resources_controller_test.rb +4 -4
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +53 -32
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +56 -31
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +22 -20
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_uuid_helper_test.rb +38 -0
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb +50 -0
- data/test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb +10 -11
- data/test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb +38 -10
- data/test/unit/foreman_fog_proxmox/proxmox_version_test.rb +10 -10
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +34 -24
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +8 -8
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb +181 -0
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb +131 -0
- 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
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb +21 -21
- data/test/unit/foreman_fog_proxmox/proxmox_vm_new_test.rb +3 -3
- data/test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb +3 -3
- metadata +44 -23
- data/app/helpers/proxmox_container_helper.rb +0 -163
- data/app/helpers/proxmox_server_helper.rb +0 -155
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15adca3cf1f65b7b543dcb24972d640c7cbd78ca11c6c7e657a1d1d0da2e250c
|
4
|
+
data.tar.gz: 387a162262465681620bf37c69ecac793757b09b7b592cd1209ce97741748a17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1222697f1f9a8eba96c0f45156420e1437139b2e8927c31944bc8e78ce915ba37f52e595d3e25edc3ab56ebc96db09f27866677f256674681814909dd57cf9fa
|
7
|
+
data.tar.gz: 0d1f4df3e6be994ef693df0d89755123fd440ed9d0eb2bdd660b10a8c55d0cf12bddd425bd0078fc9b1d5a2f14647a90ae7c8b01f9c0e3f6cd866d4f564933fc
|
data/README.md
CHANGED
@@ -32,6 +32,8 @@ You can support the plugin development via the following methods:
|
|
32
32
|
|>=0.10 |>=5.4|>=0.9.4|>=1.22|>=2.5|
|
33
33
|
|>=0.11 |>=5.4|>=0.10|>=1.22|>=2.5|
|
34
34
|
|>=0.12 |>=6.1|>=0.11|>=2.0|>=2.5|
|
35
|
+
|>=0.14 |>=6.2|=0.13.0|>=2.4|>=2.7|
|
36
|
+
|>=0.14 |>=6.2|>=0.13.1|>=2.3|>=2.5|
|
35
37
|
|
36
38
|
## Installation
|
37
39
|
|
@@ -114,8 +116,8 @@ Redhat, CentOS or Fedora users should also [setup Selinux](https://projects.thef
|
|
114
116
|
### Prerequisites
|
115
117
|
|
116
118
|
* You need a Proxmox VE 5.4+ server running.
|
117
|
-
* You need ruby >= 2.5. You can install it with [
|
118
|
-
* You also need nodejs in your dev machine to run webpack-dev-server. You can install it with [
|
119
|
+
* You need ruby >= 2.5. You can install it with [asdf-vm](https://asdf-vm.com).
|
120
|
+
* You also need nodejs in your dev machine to run webpack-dev-server. You can install it with [asdf-vm](https://asdf-vm.com).
|
119
121
|
|
120
122
|
### Platform
|
121
123
|
|
@@ -135,6 +137,7 @@ gem 'foreman_fog_proxmox', :path => '../../theforeman/foreman_fog_proxmox'
|
|
135
137
|
gem 'fog-proxmox', :path => '../../fog/fog-proxmox' # optional if you need to modify fog-proxmox code too
|
136
138
|
gem 'ruby-debug-ide' # dev
|
137
139
|
gem 'debase' # dev
|
140
|
+
gem 'solargraph' # dev
|
138
141
|
gem 'simplecov' # test
|
139
142
|
```
|
140
143
|
|
@@ -142,8 +145,9 @@ gem 'simplecov' # test
|
|
142
145
|
|
143
146
|
```shell
|
144
147
|
gem install bundler
|
145
|
-
# prerequisites postgresql-client library on OS
|
148
|
+
# prerequisites postgresql-XX-client library on OS (XX=major release installed in OS)
|
146
149
|
bundle config set without 'libvirt ovirt mysql2'
|
150
|
+
bundle config build.pg --with-pg-config=/usr/pgsql-XX/bin/pg_config
|
147
151
|
bundle install
|
148
152
|
```
|
149
153
|
|
@@ -176,7 +180,7 @@ cp config/model.mappings.example config/model.mappings
|
|
176
180
|
cp config/database.yml.example config/database.yml
|
177
181
|
```
|
178
182
|
|
179
|
-
add these lines to config/database.yml:
|
183
|
+
add these lines to each environment in config/database.yml:
|
180
184
|
|
181
185
|
```yaml
|
182
186
|
username: foreman
|
@@ -187,6 +191,7 @@ add these lines to config/database.yml:
|
|
187
191
|
cp config/ignored_environments.yml.sample config/ignored_environments.yml
|
188
192
|
docker run --name foreman-db -e POSTGRES_DB=foreman -e POSTGRES_USER=foreman -e POSTGRES_PASSWORD=foreman -p 5432:5432 -d postgres
|
189
193
|
bundle exec bin/rake db:migrate
|
194
|
+
# reboot if settings.NAME error in schema
|
190
195
|
bundle exec bin/rake db:seed assets:precompile locale:pack webpack:compile
|
191
196
|
```
|
192
197
|
|
@@ -205,7 +210,15 @@ docker exec -it foreman-db psql -U foreman
|
|
205
210
|
foreman=# create database "foreman-test";
|
206
211
|
```
|
207
212
|
|
208
|
-
|
213
|
+
then add test schema and seeds:
|
214
|
+
|
215
|
+
```shell
|
216
|
+
RAILS_ENV=test bundle exec bin/rake db:migrate
|
217
|
+
# reboot if error: "ActiveRecord::RecordNotFound: Couldn't find Setting with [WHERE "settings"."name" = $1]"
|
218
|
+
RAILS_ENV=test bundle exec bin/rake db:seed
|
219
|
+
```
|
220
|
+
|
221
|
+
Finally you can test all:
|
209
222
|
|
210
223
|
```shell
|
211
224
|
export DISABLE_SPRING=true
|
@@ -273,6 +286,12 @@ bundle exec bin/rails server
|
|
273
286
|
bundle exec foreman start
|
274
287
|
```
|
275
288
|
|
289
|
+
If you want to delete vm on host destroy, add this line in config/settings.yml:
|
290
|
+
|
291
|
+
```yml
|
292
|
+
:destroy_vm_on_host_delete: false
|
293
|
+
```
|
294
|
+
|
276
295
|
See details in [foreman plugin development](https://projects.theforeman.org/projects/foreman/wiki/How_to_Create_a_Plugin)
|
277
296
|
|
278
297
|
## Contributing
|
@@ -16,9 +16,13 @@
|
|
16
16
|
// along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
$(document).on('ContentLoad', tfm.numFields.initAll);
|
19
|
-
$(document).ready(sslVerifyPeerSelected);
|
20
19
|
|
21
|
-
function
|
20
|
+
$(document).ready(function () {
|
21
|
+
sslVerifyPeerSelected();
|
22
|
+
authMethodSelected();
|
23
|
+
});
|
24
|
+
|
25
|
+
function sslVerifyPeerSelected() {
|
22
26
|
var selected = $("#compute_resource_ssl_verify_peer").is(':checked');
|
23
27
|
var ssl_certs_block = $('#compute_resource_ssl_certs').parents('.clearfix');
|
24
28
|
var ssl_certs_textarea = $('#compute_resource_ssl_certs');
|
@@ -31,3 +35,33 @@ function sslVerifyPeerSelected(){
|
|
31
35
|
ssl_certs_textarea.hide();
|
32
36
|
}
|
33
37
|
}
|
38
|
+
|
39
|
+
function enableField(item) {
|
40
|
+
$(item).show();
|
41
|
+
$(item).removeAttr('disabled');
|
42
|
+
}
|
43
|
+
|
44
|
+
function disableField(item) {
|
45
|
+
$(item).hide();
|
46
|
+
$(item).attr('disabled','disabled');
|
47
|
+
}
|
48
|
+
|
49
|
+
function toggleFieldset(method, selected){
|
50
|
+
return method === selected ? enableField(authMethodFieldsetId(method)) : disableField(authMethodFieldsetId(method));
|
51
|
+
}
|
52
|
+
|
53
|
+
function authMethods(){
|
54
|
+
return ['user_token', 'access_ticket'];
|
55
|
+
}
|
56
|
+
|
57
|
+
function authMethodFieldsetId(method){
|
58
|
+
return '#compute_ressource_' + method + '_field_set';
|
59
|
+
}
|
60
|
+
|
61
|
+
function authMethodSelected() {
|
62
|
+
var selected = $("#compute_resource_auth_method").val();
|
63
|
+
console.log("auth_method="+selected);
|
64
|
+
authMethods().forEach(function(method){
|
65
|
+
toggleFieldset(method, selected);
|
66
|
+
});
|
67
|
+
}
|
@@ -34,67 +34,139 @@ function vmTypeSelected() {
|
|
34
34
|
fieldsets.push({id: 'config_cdrom', toggle: false, new_vm: new_vm, selected: selected});
|
35
35
|
fieldsets.push({id: 'config_os', toggle: false, new_vm: new_vm, selected: selected});
|
36
36
|
fieldsets.push({id: 'config_dns', toggle: false, new_vm: new_vm, selected: selected});
|
37
|
-
fieldsets.forEach(
|
37
|
+
fieldsets.forEach(toggleFieldsets);
|
38
38
|
toggleVolumes(selected);
|
39
39
|
return false;
|
40
40
|
}
|
41
41
|
|
42
|
+
function volumeButtonAddId(item){
|
43
|
+
return $("a[data-association='" + item + "_volumes']");
|
44
|
+
}
|
45
|
+
|
46
|
+
function volumeFieldsetId(item, type){
|
47
|
+
return $("fieldset[id^='" + type + "_volume_"+ item +"']").not("fieldset[id$='_new_" + item +"_volumes']");
|
48
|
+
}
|
49
|
+
|
50
|
+
function indexByIdAndType(item, storage_type, vm_type){
|
51
|
+
var regex = new RegExp(vm_type +"_volume_" + storage_type +"_(\\d+)");
|
52
|
+
return item.match(regex)[1];
|
53
|
+
}
|
54
|
+
|
55
|
+
function volidByIndexAndTag(index, tag){
|
56
|
+
return $(tag + "[id='host_compute_attributes_volumes_attributes_" + index + "_volid']").val();
|
57
|
+
}
|
58
|
+
|
59
|
+
function hasCloudinit(){
|
60
|
+
result = false;
|
61
|
+
var volume_id = volumeFieldsetId('cloud_init', 'server').attr('id');
|
62
|
+
if (volume_id !== undefined){
|
63
|
+
var index = indexByIdAndType(volume_id, 'cloud_init', 'server');
|
64
|
+
var volid = volidByIndexAndTag(index, 'input');
|
65
|
+
result = volid.includes("cloudinit");
|
66
|
+
}
|
67
|
+
return result;
|
68
|
+
}
|
69
|
+
|
70
|
+
function hasCdrom(){
|
71
|
+
result = false;
|
72
|
+
var volume_id = volumeFieldsetId('cdrom', 'server').attr('id');
|
73
|
+
if (volume_id !== undefined){
|
74
|
+
var index = indexByIdAndType(volume_id, 'cdrom', 'server');
|
75
|
+
var checked = $("input[id^='host_compute_attributes_volumes_attributes_" + index + "_cdrom']:checked").val();
|
76
|
+
var isCdrom = checked === 'cdrom';
|
77
|
+
result = isCdrom;
|
78
|
+
var isImage = checked === 'image';
|
79
|
+
if (isImage) {
|
80
|
+
var volid = volidByIndexAndTag(index, 'select');
|
81
|
+
result = volid.includes("iso");
|
82
|
+
}
|
83
|
+
}
|
84
|
+
return result;
|
85
|
+
}
|
86
|
+
|
87
|
+
function cloudinit(item){
|
88
|
+
return item === 'cloud_init' && hasCloudinit();
|
89
|
+
}
|
90
|
+
|
91
|
+
function cdrom(item){
|
92
|
+
return item === 'cdrom' && hasCdrom();
|
93
|
+
}
|
94
|
+
|
95
|
+
function enableVolume(volume_id, type){
|
96
|
+
volumeFieldsetId(volume_id, type).show();
|
97
|
+
volumeButtonAddId(volume_id).show();
|
98
|
+
if (cloudinit(volume_id) || cdrom(volume_id)){
|
99
|
+
volumeButtonAddId(volume_id).hide();
|
100
|
+
}
|
101
|
+
volumeFieldsetId(volume_id, type).removeAttr('disabled');
|
102
|
+
}
|
103
|
+
|
104
|
+
function disableVolume(volume_id, type){
|
105
|
+
volumeFieldsetId(volume_id, type).hide();
|
106
|
+
volumeButtonAddId(volume_id).hide();
|
107
|
+
volumeFieldsetId(volume_id, type).attr('disabled','disabled');
|
108
|
+
}
|
109
|
+
|
110
|
+
function volumes(type){
|
111
|
+
return type === 'qemu' ? ['hard_disk', 'cdrom', 'cloud_init'] : ['mp', 'rootfs'];
|
112
|
+
}
|
113
|
+
|
114
|
+
function volume(type){
|
115
|
+
return type === 'qemu' ? 'server' : 'container';
|
116
|
+
}
|
117
|
+
|
118
|
+
function toggleVolume(volume_id, type1, type2){
|
119
|
+
type1 === type2 ? enableVolume(volume_id, volume(type1)) : disableVolume(volume_id, volume(type1));
|
120
|
+
}
|
121
|
+
|
42
122
|
function toggleVolumes(selected){
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
break;
|
54
|
-
case 'lxc':
|
55
|
-
div_container.show();
|
56
|
-
div_server.hide();
|
57
|
-
a_container.show();
|
58
|
-
a_server.hide();
|
59
|
-
break;
|
60
|
-
default:
|
61
|
-
console.log("unkown type="+selected);
|
62
|
-
break;
|
123
|
+
['qemu', 'lxc'].forEach(function(type){
|
124
|
+
volumes(type).forEach(function(volume_id){
|
125
|
+
toggleVolume(volume_id, selected, type);
|
126
|
+
});
|
127
|
+
});
|
128
|
+
}
|
129
|
+
|
130
|
+
function enableFieldset(fieldsetId, fieldset) {
|
131
|
+
if (fieldset.toggle && fieldset.new_vm){
|
132
|
+
fieldset_id(fieldsetId, fieldset).show();
|
63
133
|
}
|
134
|
+
fieldset_id(fieldsetId, fieldset).removeAttr('disabled');
|
135
|
+
input_hidden_id(fieldsetId).removeAttr('disabled');
|
64
136
|
}
|
65
137
|
|
66
|
-
function
|
67
|
-
|
68
|
-
|
69
|
-
var removable_input_hidden = $("div.removable-item[style='display: none;']" + " + input:hidden");
|
70
|
-
var server_fieldset = $("fieldset[id^='server_"+fieldset.id+"']");
|
71
|
-
var container_fieldset = $("fieldset[id^='container_"+fieldset.id+"']");
|
72
|
-
removable_input_hidden.attr('disabled','disabled');
|
73
|
-
switch (fieldset.selected) {
|
74
|
-
case 'qemu':
|
75
|
-
if (fieldset.toggle && fieldset.new_vm){
|
76
|
-
server_fieldset.show();
|
77
|
-
container_fieldset.hide();
|
78
|
-
}
|
79
|
-
server_fieldset.removeAttr('disabled');
|
80
|
-
container_fieldset.attr('disabled','disabled');
|
81
|
-
server_input_hidden.removeAttr('disabled');
|
82
|
-
container_input_hidden.attr('disabled','disabled');
|
83
|
-
break;
|
84
|
-
case 'lxc':
|
85
|
-
if (fieldset.toggle && fieldset.new_vm){
|
86
|
-
server_fieldset.hide();
|
87
|
-
container_fieldset.show();
|
88
|
-
}
|
89
|
-
server_fieldset.attr('disabled','disabled');
|
90
|
-
container_fieldset.removeAttr('disabled');
|
91
|
-
container_input_hidden.removeAttr('disabled');
|
92
|
-
server_input_hidden.attr('disabled','disabled');
|
93
|
-
break;
|
94
|
-
default:
|
95
|
-
console.log("unkown type="+fieldset.selected);
|
96
|
-
break;
|
138
|
+
function disableFieldset(fieldsetId, fieldset) {
|
139
|
+
if (fieldset.toggle && fieldset.new_vm){
|
140
|
+
fieldset_id(fieldsetId, fieldset).hide();
|
97
141
|
}
|
142
|
+
fieldset_id(fieldsetId, fieldset).attr('disabled','disabled');
|
143
|
+
input_hidden_id(fieldsetId).attr('disabled','disabled');
|
144
|
+
}
|
145
|
+
|
146
|
+
function toggleFieldset(fieldsetId, fieldset, type1, type2) {
|
147
|
+
type1 === type2 ? enableFieldset(fieldsetId, fieldset) : disableFieldset(fieldsetId, fieldset);
|
148
|
+
}
|
149
|
+
|
150
|
+
function input_hidden_id(volume_id){
|
151
|
+
return $("div[id^='"+ volume_id +"_volumes']" + " + input:hidden");
|
152
|
+
}
|
153
|
+
|
154
|
+
function fieldset_id(fieldsetId, fieldset){
|
155
|
+
return $("fieldset[id^='" + fieldsetId + "_"+fieldset.id+"']");
|
156
|
+
}
|
157
|
+
|
158
|
+
function fieldsets(type){
|
159
|
+
return type === 'qemu' ? ['server'] : ['container'];
|
160
|
+
}
|
161
|
+
|
162
|
+
function toggleFieldsets(fieldset){
|
163
|
+
var removable_input_hidden = $("div.removable-item[style='display: none;']" + " + input:hidden");
|
164
|
+
removable_input_hidden.attr('disabled','disabled');
|
165
|
+
['qemu', 'lxc'].forEach(function(type){
|
166
|
+
fieldsets(type).forEach(function(fieldsetId){
|
167
|
+
toggleFieldset(fieldsetId, fieldset, fieldset.selected, type);
|
168
|
+
});
|
169
|
+
});
|
98
170
|
}
|
99
171
|
|
100
172
|
function nodeSelected(item) {
|
@@ -118,18 +190,18 @@ function nodeSelected(item) {
|
|
118
190
|
}
|
119
191
|
}
|
120
192
|
|
121
|
-
function emptySelect(
|
122
|
-
$(
|
123
|
-
$(
|
124
|
-
$(
|
193
|
+
function emptySelect(select_id){
|
194
|
+
$(select_id).empty();
|
195
|
+
$(select_id).append($("<option></option>").val('').text(''));
|
196
|
+
$(select_id).val('');
|
125
197
|
}
|
126
198
|
|
127
199
|
function initOptions(select_ids){
|
128
200
|
console.log('initOptions(' + select_ids[0] + ')');
|
129
201
|
select_ids.forEach(emptySelect);
|
130
|
-
select_ids.forEach(function(
|
131
|
-
$(
|
132
|
-
$(
|
202
|
+
select_ids.forEach(function(select_id){
|
203
|
+
$(select_id + ' option:selected').prop('selected',false);
|
204
|
+
$(select_id).val('');
|
133
205
|
});
|
134
206
|
}
|
135
207
|
|
@@ -156,7 +228,9 @@ function updateOptions(options_path, start_options_id, end_options_id, start_sec
|
|
156
228
|
if ( start_second_options_id != undefined && end_second_options_id != undefined) {
|
157
229
|
select_second_ids = selectIds(start_second_options_id, end_second_options_id);
|
158
230
|
}
|
159
|
-
var
|
231
|
+
var compute_resource_id = $("#host_compute_resource_id").val();
|
232
|
+
if (compute_resource_id == undefined) compute_resource_id = $("#compute_attribute_compute_resource_id").val(); // profil
|
233
|
+
var url = '/foreman_fog_proxmox/' + options_path + '/' + compute_resource_id + '/' + node_id;
|
160
234
|
if (second_id != undefined) url += '/' + second_id;
|
161
235
|
tfm.tools.showSpinner();
|
162
236
|
$.getJSON({
|
@@ -15,51 +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
|
-
function cdromSelected(item) {
|
19
|
-
var selected = $(item).val();
|
20
|
-
var cdrom_image_form = $('#cdrom_image_form');
|
21
|
-
|
22
|
-
switch (selected) {
|
23
|
-
case 'none':
|
24
|
-
initCdromStorage();
|
25
|
-
initCdromOptions('iso');
|
26
|
-
cdrom_image_form.hide();
|
27
|
-
break;
|
28
|
-
case 'cdrom':
|
29
|
-
initCdromStorage();
|
30
|
-
initCdromOptions('iso');
|
31
|
-
cdrom_image_form.hide();
|
32
|
-
break;
|
33
|
-
case 'image':
|
34
|
-
initCdromStorage();
|
35
|
-
initCdromOptions('iso');
|
36
|
-
cdrom_image_form.show();
|
37
|
-
break;
|
38
|
-
default:
|
39
|
-
break;
|
40
|
-
}
|
41
|
-
return false;
|
42
|
-
}
|
43
|
-
|
44
|
-
function initCdromStorage() {
|
45
|
-
var select = '#host_compute_attributes_config_attributes_cdrom_storage';
|
46
|
-
$(select + ' option:selected').prop('selected', false);
|
47
|
-
$(select).val('');
|
48
|
-
}
|
49
|
-
|
50
|
-
function initCdromOptions(name) {
|
51
|
-
var select = '#host_compute_attributes_config_attributes_cdrom_' + name;
|
52
|
-
$(select).empty();
|
53
|
-
$(select).append($("<option></option>").val('').text(''));
|
54
|
-
$(select).val('');
|
55
|
-
}
|
56
|
-
|
57
|
-
function storageIsoSelected(item) {
|
58
|
-
var storage = $(item).val();
|
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);
|
61
|
-
}
|
62
|
-
|
63
18
|
function attributesPrefixSelector(profile, type) {
|
64
19
|
return profile ? '#compute_attribute_vm_attrs_' + type + '_attributes_': '#host_compute_attributes_' + type + '_attributes_';
|
65
20
|
}
|
@@ -69,11 +24,10 @@ function volumesAttributesSelector(profile,index,selector) {
|
|
69
24
|
}
|
70
25
|
|
71
26
|
function getIndex(item) {
|
72
|
-
var
|
27
|
+
var index_id = $(item).attr('id');
|
73
28
|
var pattern = /(host_compute_attributes_volumes_attributes_||compute_attribute_vm_attrs_volumes_attributes_)(\d+)[_](.*)/i;
|
74
|
-
pattern_a = pattern.exec(
|
29
|
+
pattern_a = pattern.exec(index_id);
|
75
30
|
var index = pattern_a[2];
|
76
|
-
console.log("index=" + index);
|
77
31
|
return index;
|
78
32
|
}
|
79
33
|
|
@@ -86,7 +40,6 @@ function controllerSelected(item) {
|
|
86
40
|
var index = getIndex(item);
|
87
41
|
var max = computeControllerMaxDevice(controller);
|
88
42
|
var profile = isProfile();
|
89
|
-
console.log("profile="+profile);
|
90
43
|
var device_selector = volumesAttributesSelector(profile,index,'device');
|
91
44
|
var id_selector = volumesAttributesSelector(profile,index,'id');
|
92
45
|
$(device_selector).attr('data-soft-max', max);
|
@@ -100,7 +53,6 @@ function deviceSelected(item) {
|
|
100
53
|
var device = $(item).limitedSpinner('value');
|
101
54
|
var index = getIndex(item);
|
102
55
|
var profile = isProfile();
|
103
|
-
console.log("profile="+profile);
|
104
56
|
var controller_selector = volumesAttributesSelector(profile,index,'controller');
|
105
57
|
var id_selector = volumesAttributesSelector(profile,index,'id');
|
106
58
|
var controller = $(controller_selector).val();
|