foreman_fog_proxmox 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of foreman_fog_proxmox might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/README.md +24 -12
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_compute_resource.js +26 -0
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm.js +92 -0
- data/app/assets/javascripts/foreman_fog_proxmox/proxmox_vm_container.js +60 -0
- data/app/assets/javascripts/foreman_fog_proxmox/{proxmox.js → proxmox_vm_server.js} +10 -10
- data/app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb +1 -1
- data/app/controllers/foreman_fog_proxmox/compute_resources_controller.rb +9 -1
- data/app/helpers/node_dashboard_helper.rb +36 -0
- data/app/helpers/proxmox_compute_selectors_helper.rb +23 -0
- data/app/helpers/proxmox_container_helper.rb +157 -0
- data/app/helpers/proxmox_form_helper.rb +67 -0
- data/app/helpers/{proxmox_compute_helper.rb → proxmox_server_helper.rb} +49 -38
- data/app/helpers/proxmox_vm_helper.rb +86 -0
- data/app/models/concerns/fog_extensions/proxmox/container.rb +57 -0
- data/{test/factories/foreman_fog_proxmox_factories.rb → app/models/concerns/fog_extensions/proxmox/container_config.rb} +16 -13
- data/app/models/concerns/fog_extensions/proxmox/server.rb +8 -2
- data/app/models/foreman_fog_proxmox/proxmox.rb +160 -67
- data/app/overrides/compute_resources_vms/form/add_clone_to_new_vm_compute_detail.rb +24 -0
- data/app/overrides/compute_resources_vms/form/add_vm_type_to_networks_form.rb +32 -0
- data/app/overrides/compute_resources_vms/form/add_vm_type_to_nic_provider_specific_form.rb +25 -0
- data/app/overrides/compute_resources_vms/form/add_vm_type_to_volumes_edit.rb +24 -0
- data/app/overrides/compute_resources_vms/form/add_vm_type_to_volumes_new_volume.rb +24 -0
- data/app/services/foreman_fog_proxmox/node_dashboard/data.rb +37 -0
- data/app/views/compute_resources/form/_proxmox.html.erb +7 -4
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_form.html.erb +23 -0
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_networks_new_childs_form.html.erb +25 -0
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_nic_provider_specific_form.html.erb +23 -0
- data/app/views/compute_resources_vms/form/proxmox/_add_vm_type_to_volumes_edit.html.erb +73 -0
- data/app/views/compute_resources_vms/form/proxmox/_base.html.erb +16 -23
- data/app/views/compute_resources_vms/form/proxmox/_general.html.erb +37 -0
- data/app/views/compute_resources_vms/form/proxmox/_network.html.erb +2 -7
- data/app/views/compute_resources_vms/form/proxmox/container/_advanced.html.erb +31 -0
- data/app/views/compute_resources_vms/form/proxmox/container/_config.html.erb +41 -0
- data/app/views/compute_resources_vms/form/proxmox/container/_extended.html.erb +26 -0
- data/app/views/compute_resources_vms/form/proxmox/container/_network.html.erb +25 -0
- data/app/views/compute_resources_vms/form/proxmox/container/_volume_mp.html.erb +25 -0
- data/app/views/compute_resources_vms/form/proxmox/container/_volume_rootfs.html.erb +24 -0
- data/app/views/compute_resources_vms/form/proxmox/server/_advanced.html.erb +31 -0
- data/app/views/compute_resources_vms/form/proxmox/{_config.html.erb → server/_config.html.erb} +11 -8
- data/app/views/compute_resources_vms/form/proxmox/server/_network.html.erb +29 -0
- data/app/views/compute_resources_vms/form/proxmox/server/_volume.html.erb +27 -0
- data/app/views/compute_resources_vms/index/_proxmox.html.erb +4 -2
- data/app/views/compute_resources_vms/show/_proxmox.html.erb +9 -2
- data/app/views/dashboard/_foreman_fog_proxmox_widget.erb +4 -2
- data/app/views/images/form/_proxmox.html.erb +17 -0
- data/config/routes.rb +1 -0
- data/lib/foreman_fog_proxmox/engine.rb +10 -3
- data/lib/foreman_fog_proxmox/value.rb +24 -0
- data/lib/foreman_fog_proxmox/version.rb +1 -1
- data/locale/en/foreman_fog_proxmox.edit.po +456 -0
- data/locale/en/foreman_fog_proxmox.po +327 -11
- data/locale/en/foreman_fog_proxmox.po.time_stamp +0 -0
- data/locale/foreman_fog_proxmox.pot +515 -8
- data/locale/fr/foreman_fog_proxmox.edit.po +456 -0
- data/locale/fr/foreman_fog_proxmox.po +327 -11
- data/locale/fr/foreman_fog_proxmox.po.time_stamp +0 -0
- data/test/factories/proxmox_factory.rb +72 -0
- data/test/functional/compute_resources_controller_test.rb +34 -0
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +205 -0
- data/test/{helpers/proxmox_compute_helper_test.rb → unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb} +36 -28
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +240 -0
- data/test/unit/foreman_fog_proxmox/proxmox_test.rb +327 -0
- data/test/unit/foreman_fog_proxmox/proxmox_test_helpers.rb +251 -0
- metadata +83 -14
- data/app/views/compute_resources_vms/form/proxmox/_volume.html.erb +0 -23
- data/test/unit/foreman_fog_proxmox_test.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 475afb51f19055c5bf62055527903df576d3eafe
|
4
|
+
data.tar.gz: ed7c4afa8aee30e7e80f7fcc7258d13ae3dbca72
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 604c52d8435cbda0f9fe498d07c2fe3a58576152303148f9005fff7c59c3b2dbe1bb24e50bd6c8a77f79e8a8584b54cd895e60fbe40a5936a4cb696c79e74995
|
7
|
+
data.tar.gz: a4afeaac998b8e596efb70a48dfc2a5ea44701dcd8688566e791644d54c0a9f5cfe4c31bc9a452a1684d58d2bf4b2879868c19933c459a7721a4f3684e7b2346
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
![ForemanFogProxmox](.github/images/foremanproxmox.png)
|
2
2
|
|
3
|
-
[![Build Status](https://travis-ci.com/tristanrobert/
|
4
|
-
[![Maintainability](https://api.codeclimate.com/v1/badges/922162c278e0fa9207ba/maintainability)](https://codeclimate.com/github/tristanrobert/
|
5
|
-
[![Test Coverage](https://api.codeclimate.com/v1/badges/922162c278e0fa9207ba/test_coverage)](https://codeclimate.com/github/tristanrobert/
|
3
|
+
[![Build Status](https://travis-ci.com/tristanrobert/foreman_fog_proxmox.svg?branch=master)](https://travis-ci.com/tristanrobert/foreman_fog_proxmox)
|
4
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/922162c278e0fa9207ba/maintainability)](https://codeclimate.com/github/tristanrobert/foreman_fog_proxmox/maintainability)
|
5
|
+
[![Test Coverage](https://api.codeclimate.com/v1/badges/922162c278e0fa9207ba/test_coverage)](https://codeclimate.com/github/tristanrobert/foreman_fog_proxmox/test_coverage)
|
6
6
|
|
7
7
|
# ForemanFogProxmox
|
8
8
|
|
@@ -14,8 +14,8 @@ It is intended to satisfy this [feature](http://projects.theforeman.org/issues/2
|
|
14
14
|
|
15
15
|
Tested with:
|
16
16
|
|
17
|
-
* Foreman = 1.17.
|
18
|
-
* Fog-proxmox >= 0.
|
17
|
+
* Foreman = 1.17.3
|
18
|
+
* Fog-proxmox >= 0.5.1
|
19
19
|
|
20
20
|
## Installation
|
21
21
|
|
@@ -54,6 +54,12 @@ sudo -u foreman /usr/bin/foreman-ruby /usr/bin/bundle install
|
|
54
54
|
/usr/bin/foreman-ruby /usr/bin/bundle exec bin/rake plugin:assets:precompile[foreman_fog_proxmox]
|
55
55
|
```
|
56
56
|
|
57
|
+
* Compile plugin translations if (french) needed :
|
58
|
+
|
59
|
+
```shell
|
60
|
+
/usr/bin/foreman-ruby /usr/bin/bundle exec bin/rake plugin:gettext[foreman_fog_proxmox]
|
61
|
+
```
|
62
|
+
|
57
63
|
* Complete installation of foreman 1.17 with foreman-installer:
|
58
64
|
|
59
65
|
```shell
|
@@ -99,18 +105,18 @@ You also need nodejs in your dev machine to run webpack-dev-server.
|
|
99
105
|
|
100
106
|
* Fork this github repo.
|
101
107
|
* Clone it on your local machine
|
102
|
-
* Install foreman v1.17 on your machine:
|
108
|
+
* Install foreman v1.17.3 on your machine:
|
103
109
|
|
104
110
|
```shell
|
105
111
|
git clone https://github.com/theforeman/foreman
|
106
|
-
git checkout tags/1.17
|
112
|
+
git checkout tags/1.17.3
|
107
113
|
```
|
108
114
|
|
109
115
|
* Create a Gemfile.local.rb file in foreman/bundler.d/
|
110
116
|
* Add this line:
|
111
117
|
|
112
118
|
```ruby
|
113
|
-
gem 'foreman_fog_proxmox', :path => '/your_path_to/
|
119
|
+
gem 'foreman_fog_proxmox', :path => '/your_path_to/foreman_fog_proxmox'
|
114
120
|
```
|
115
121
|
|
116
122
|
* In foreman directory, install dependencies:
|
@@ -129,20 +135,26 @@ cp config/settings.yaml.example config/settings.yaml
|
|
129
135
|
|
130
136
|
```shell
|
131
137
|
cp config/database.yaml.example config/database.yaml
|
132
|
-
bundle exec rake db:migrate
|
133
|
-
bundle exec rake db:seed
|
138
|
+
bundle exec bin/rake db:migrate
|
139
|
+
bundle exec bin/rake db:seed
|
134
140
|
```
|
135
141
|
|
136
142
|
* You can reset admin password if needed:
|
137
143
|
|
138
144
|
```shell
|
139
|
-
bundle exec rake permissions:reset
|
145
|
+
bundle exec bin/rake permissions:reset
|
140
146
|
```
|
141
147
|
|
142
148
|
* In foreman directory, after you modify foreman_fog_proxmox specific assets (proxmox.js, etc) you have to precompile it:
|
143
149
|
|
144
150
|
```shell
|
145
|
-
bundle plugin:assets:precompile[foreman_fog_proxmox]
|
151
|
+
bundle exec bin/rake plugin:assets:precompile[foreman_fog_proxmox]
|
152
|
+
```
|
153
|
+
|
154
|
+
* In foreman directory, after you modify foreman_fog_proxmox translations (language, texts in new files, etc) you have to compile it:
|
155
|
+
|
156
|
+
```shell
|
157
|
+
bundle exec bin/rake plugin:gettext[foreman_fog_proxmox]
|
146
158
|
```
|
147
159
|
|
148
160
|
* In foreman directory, run rails server:
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// Copyright 2018 Tristan Robert
|
2
|
+
|
3
|
+
// This file is part of ForemanFogProxmox.
|
4
|
+
|
5
|
+
// ForemanFogProxmox is free software: you can redistribute it and/or modify
|
6
|
+
// it under the terms of the GNU General Public License as published by
|
7
|
+
// the Free Software Foundation, either version 3 of the License, or
|
8
|
+
// (at your option) any later version.
|
9
|
+
|
10
|
+
// ForemanFogProxmox is distributed in the hope that it will be useful,
|
11
|
+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
// GNU General Public License for more details.
|
14
|
+
|
15
|
+
// You should have received a copy of the GNU General Public License
|
16
|
+
// along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
function sslVerifyPeerSelected(item){
|
19
|
+
var selected = $(item).is(':checked');
|
20
|
+
var ssl_certs_form = $('#compute_resource_ssl_certs').parents('.clearfix');
|
21
|
+
if (selected) {
|
22
|
+
ssl_certs_form.show();
|
23
|
+
} else {
|
24
|
+
ssl_certs_form.hide();
|
25
|
+
}
|
26
|
+
}
|
@@ -0,0 +1,92 @@
|
|
1
|
+
// Copyright 2018 Tristan Robert
|
2
|
+
|
3
|
+
// This file is part of ForemanFogProxmox.
|
4
|
+
|
5
|
+
// ForemanFogProxmox is free software: you can redistribute it and/or modify
|
6
|
+
// it under the terms of the GNU General Public License as published by
|
7
|
+
// the Free Software Foundation, either version 3 of the License, or
|
8
|
+
// (at your option) any later version.
|
9
|
+
|
10
|
+
// ForemanFogProxmox is distributed in the hope that it will be useful,
|
11
|
+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
// GNU General Public License for more details.
|
14
|
+
|
15
|
+
// You should have received a copy of the GNU General Public License
|
16
|
+
// along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
$(document).on('ContentLoad', tfm.numFields.initAll);
|
19
|
+
$(document).ready(vmTypeSelected);
|
20
|
+
|
21
|
+
function vmTypeSelected() {
|
22
|
+
var selected = $("#host_compute_attributes_type").val();
|
23
|
+
if (selected == undefined) selected = $("#compute_attribute_vm_attrs_type").val();
|
24
|
+
var host_uuid = $("input[id='host_uuid']").val();
|
25
|
+
var new_vm = host_uuid == undefined;
|
26
|
+
var fieldsets = [];
|
27
|
+
fieldsets.push({id: 'config_advanced_options', toggle: true, new_vm: new_vm, selected: selected});
|
28
|
+
fieldsets.push({id: 'config_ext', toggle: true, new_vm: new_vm, selected: selected});
|
29
|
+
fieldsets.push({id: 'volume', toggle: true, new_vm: new_vm, selected: selected});
|
30
|
+
fieldsets.push({id: 'network', toggle: true, new_vm: true, selected: selected});
|
31
|
+
fieldsets.push({id: 'config_options', toggle: false, new_vm: new_vm, selected: selected});
|
32
|
+
fieldsets.push({id: 'config_cpu', toggle: false, new_vm: new_vm, selected: selected});
|
33
|
+
fieldsets.push({id: 'config_memory', toggle: false, new_vm: new_vm, selected: selected});
|
34
|
+
fieldsets.push({id: 'config_cdrom', toggle: false, new_vm: new_vm, selected: selected});
|
35
|
+
fieldsets.push({id: 'config_os', toggle: false, new_vm: new_vm, selected: selected});
|
36
|
+
fieldsets.push({id: 'config_dns', toggle: false, new_vm: new_vm, selected: selected});
|
37
|
+
fieldsets.forEach(toggleFieldset);
|
38
|
+
toggleVolumes(selected);
|
39
|
+
return false;
|
40
|
+
}
|
41
|
+
|
42
|
+
function toggleVolumes(selected){
|
43
|
+
var div_container = $("div[id^='container_volumes']");
|
44
|
+
var div_server = $("div[id^='server_volumes']");
|
45
|
+
var a_container = $("a[data-association='container_volumes']");
|
46
|
+
var a_server = $("a[data-association='server_volumes']");
|
47
|
+
switch (selected) {
|
48
|
+
case 'qemu':
|
49
|
+
div_container.hide();
|
50
|
+
div_server.show();
|
51
|
+
a_container.hide();
|
52
|
+
a_server.show();
|
53
|
+
break;
|
54
|
+
case 'lxc':
|
55
|
+
div_container.show();
|
56
|
+
div_server.hide();
|
57
|
+
a_container.show();
|
58
|
+
a_server.hide();
|
59
|
+
break;
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
function toggleFieldset(fieldset, index, fieldsets){
|
64
|
+
var server_input_hidden = $("div[id^='server_volumes']" + " > input:hidden");
|
65
|
+
var container_input_hidden = $("div[id^='container_volumes']" + " > input:hidden");
|
66
|
+
var server_fieldset = $("fieldset[id^='server_"+fieldset.id+"']");
|
67
|
+
var container_fieldset = $("fieldset[id^='container_"+fieldset.id+"']");
|
68
|
+
switch (fieldset.selected) {
|
69
|
+
case 'qemu':
|
70
|
+
if (fieldset.toggle && fieldset.new_vm){
|
71
|
+
server_fieldset.show();
|
72
|
+
container_fieldset.hide();
|
73
|
+
}
|
74
|
+
server_fieldset.removeAttr('disabled');
|
75
|
+
container_fieldset.attr('disabled','disabled');
|
76
|
+
server_input_hidden.removeAttr('disabled');
|
77
|
+
container_input_hidden.attr('disabled','disabled');
|
78
|
+
break;
|
79
|
+
case 'lxc':
|
80
|
+
if (fieldset.toggle && fieldset.new_vm){
|
81
|
+
server_fieldset.hide();
|
82
|
+
container_fieldset.show();
|
83
|
+
}
|
84
|
+
server_fieldset.attr('disabled','disabled');
|
85
|
+
container_fieldset.removeAttr('disabled');
|
86
|
+
container_input_hidden.removeAttr('disabled');
|
87
|
+
server_input_hidden.attr('disabled','disabled');
|
88
|
+
break;
|
89
|
+
default:
|
90
|
+
break;
|
91
|
+
}
|
92
|
+
}
|
@@ -0,0 +1,60 @@
|
|
1
|
+
// Copyright 2018 Tristan Robert
|
2
|
+
|
3
|
+
// This file is part of ForemanFogProxmox.
|
4
|
+
|
5
|
+
// ForemanFogProxmox is free software: you can redistribute it and/or modify
|
6
|
+
// it under the terms of the GNU General Public License as published by
|
7
|
+
// the Free Software Foundation, either version 3 of the License, or
|
8
|
+
// (at your option) any later version.
|
9
|
+
|
10
|
+
// ForemanFogProxmox is distributed in the hope that it will be useful,
|
11
|
+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
// GNU General Public License for more details.
|
14
|
+
|
15
|
+
// You should have received a copy of the GNU General Public License
|
16
|
+
// along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
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
|
+
|
36
|
+
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
|
+
}
|
@@ -21,18 +21,18 @@ function cdromSelected(item) {
|
|
21
21
|
|
22
22
|
switch (selected) {
|
23
23
|
case 'none':
|
24
|
-
|
25
|
-
|
24
|
+
initCdromStorage();
|
25
|
+
initCdromOptions('iso');
|
26
26
|
cdrom_image_form.hide();
|
27
27
|
break;
|
28
28
|
case 'cdrom':
|
29
|
-
|
30
|
-
|
29
|
+
initCdromStorage();
|
30
|
+
initCdromOptions('iso');
|
31
31
|
cdrom_image_form.hide();
|
32
32
|
break;
|
33
33
|
case 'image':
|
34
|
-
|
35
|
-
|
34
|
+
initCdromStorage();
|
35
|
+
initCdromOptions('iso');
|
36
36
|
cdrom_image_form.show();
|
37
37
|
break;
|
38
38
|
default:
|
@@ -41,13 +41,13 @@ function cdromSelected(item) {
|
|
41
41
|
return false;
|
42
42
|
}
|
43
43
|
|
44
|
-
function
|
44
|
+
function initCdromStorage(){
|
45
45
|
var select = '#host_compute_attributes_config_attributes_cdrom_storage';
|
46
46
|
$(select + ' option:selected').prop('selected',false);
|
47
47
|
$(select).val('');
|
48
48
|
}
|
49
49
|
|
50
|
-
function
|
50
|
+
function initCdromOptions(name){
|
51
51
|
var select = '#host_compute_attributes_config_attributes_cdrom_'+name;
|
52
52
|
$(select).empty();
|
53
53
|
$(select).append($("<option></option>").val('').text(''));
|
@@ -68,14 +68,14 @@ function initOptions(name){
|
|
68
68
|
console.log("Error=" + error +", status=" + status + " loading isos for storage=" + storage);
|
69
69
|
},
|
70
70
|
success: function(isos) {
|
71
|
-
|
71
|
+
initCdromOptions('iso');
|
72
72
|
$.each(isos, function(i,iso){
|
73
73
|
$('#host_compute_attributes_config_attributes_cdrom_iso').append($("<option></option>").val(iso.volid).text(iso.volid));
|
74
74
|
});
|
75
75
|
}
|
76
76
|
});
|
77
77
|
} else {
|
78
|
-
|
78
|
+
initCdromOptions('iso');
|
79
79
|
}
|
80
80
|
}
|
81
81
|
|
@@ -23,7 +23,15 @@ module ForemanFogProxmox
|
|
23
23
|
|
24
24
|
# GET foreman_fog_proxmox/isos/:storage
|
25
25
|
def isos
|
26
|
-
volumes = @compute_resource.
|
26
|
+
volumes = @compute_resource.images_by_storage('iso',params[:storage])
|
27
|
+
respond_to do |format|
|
28
|
+
format.json { render :json => volumes }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# GET foreman_fog_proxmox/ostemplates/:storage
|
33
|
+
def ostemplates
|
34
|
+
volumes = @compute_resource.images_by_storage('vztmpl',params[:storage])
|
27
35
|
respond_to do |format|
|
28
36
|
format.json { render :json => volumes }
|
29
37
|
end
|
@@ -0,0 +1,36 @@
|
|
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
|
+
module NodeDashboardHelper
|
21
|
+
|
22
|
+
def compute_data(statistics)
|
23
|
+
data = []
|
24
|
+
statistics.each do |statistic|
|
25
|
+
t = Time.at(statistic['time'])
|
26
|
+
x = t.hour.to_s + ':' + t.min.to_s
|
27
|
+
data << [x,statistic['loadavg']*100]
|
28
|
+
end
|
29
|
+
data
|
30
|
+
end
|
31
|
+
|
32
|
+
def render_node_statistics(statistics,options = {})
|
33
|
+
data = compute_data(statistics)
|
34
|
+
flot_bar_chart("node_statistics", _("Time"), _("Average load (x100)"), data, options)
|
35
|
+
end
|
36
|
+
end
|
@@ -18,6 +18,29 @@
|
|
18
18
|
# along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
19
19
|
|
20
20
|
module ProxmoxComputeSelectorsHelper
|
21
|
+
|
22
|
+
def proxmox_types_map
|
23
|
+
[OpenStruct.new(id: 'qemu', name: 'KVM/Qemu server'),
|
24
|
+
OpenStruct.new(id: 'lxc', name: 'LXC container')]
|
25
|
+
end
|
26
|
+
|
27
|
+
def proxmox_archs_map
|
28
|
+
[OpenStruct.new(id: 'amd64', name: '64 bits'),
|
29
|
+
OpenStruct.new(id: 'i386', name: '32 bits')]
|
30
|
+
end
|
31
|
+
|
32
|
+
def proxmox_ostypes_map
|
33
|
+
[OpenStruct.new(id: 'debian', name: 'Debian'),
|
34
|
+
OpenStruct.new(id: 'ubuntu', name: 'Ubuntu'),
|
35
|
+
OpenStruct.new(id: 'centos', name: 'CentOS'),
|
36
|
+
OpenStruct.new(id: 'fedora', name: 'Fedora'),
|
37
|
+
OpenStruct.new(id: 'opensuse', name: 'OpenSuse'),
|
38
|
+
OpenStruct.new(id: 'archlinux', name: 'ArchLinux'),
|
39
|
+
OpenStruct.new(id: 'gentoo', name: 'Gentoo'),
|
40
|
+
OpenStruct.new(id: 'alpine', name: 'Alpine'),
|
41
|
+
OpenStruct.new(id: 'unmanaged', name: 'Unmanaged')]
|
42
|
+
end
|
43
|
+
|
21
44
|
def proxmox_controllers_map
|
22
45
|
[ForemanFogProxmox::OptionsSelect.new(id:'ide', name: 'IDE', range: 3),
|
23
46
|
ForemanFogProxmox::OptionsSelect.new(id:'sata', name: 'SATA', range: 5),
|
@@ -0,0 +1,157 @@
|
|
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 'fog/proxmox/helpers/disk_helper'
|
21
|
+
require 'fog/proxmox/helpers/nic_helper'
|
22
|
+
require 'foreman_fog_proxmox/value'
|
23
|
+
|
24
|
+
module ProxmoxContainerHelper
|
25
|
+
|
26
|
+
KILO = 1024
|
27
|
+
MEGA = KILO * KILO
|
28
|
+
GIGA = KILO * MEGA
|
29
|
+
|
30
|
+
def parse_container_vm(args)
|
31
|
+
args = ActiveSupport::HashWithIndifferentAccess.new(args)
|
32
|
+
return {} unless args
|
33
|
+
return {} if args.empty?
|
34
|
+
return {} unless args['type'] == 'lxc'
|
35
|
+
config = args['config_attributes']
|
36
|
+
main_a = %w[name type node vmid]
|
37
|
+
config = args.reject { |key,_value| main_a.include? key } unless config
|
38
|
+
ostemplate_a = %w[ostemplate ostemplate_storage ostemplate_file]
|
39
|
+
ostemplate = parse_container_ostemplate(args.select { |key,_value| ostemplate_a.include? key })
|
40
|
+
ostemplate = parse_container_ostemplate(config.select { |key,_value| ostemplate_a.include? key }) unless ostemplate[:ostemplate]
|
41
|
+
volumes = parse_container_volumes(args['volumes_attributes'])
|
42
|
+
cpu_a = %w[arch cpulimit cpuunits cores]
|
43
|
+
cpu = parse_container_cpu(config.select { |key,_value| cpu_a.include? key })
|
44
|
+
memory_a = %w[memory swap]
|
45
|
+
memory = parse_container_memory(config.select { |key,_value| memory_a.include? key })
|
46
|
+
interfaces_attributes = args['interfaces_attributes']
|
47
|
+
networks = parse_container_interfaces(interfaces_attributes)
|
48
|
+
general_a = %w[node name type config_attributes volumes_attributes interfaces_attributes firmware_type provision_method container_volumes server_volumes]
|
49
|
+
logger.debug("general_a: #{general_a}")
|
50
|
+
parsed_vm = args.reject { |key,value| general_a.include?(key) || ostemplate_a.include?(key) || ForemanFogProxmox::Value.empty?(value) }
|
51
|
+
config_a = []
|
52
|
+
config_a += cpu_a
|
53
|
+
config_a += memory_a
|
54
|
+
config_a += main_a
|
55
|
+
config_a += general_a
|
56
|
+
parsed_config = config.reject { |key,value| config_a.include?(key) || ForemanFogProxmox::Value.empty?(value) }
|
57
|
+
logger.debug("parse_container_config(): #{parsed_config}")
|
58
|
+
parsed_vm = parsed_vm.merge(parsed_config).merge(cpu).merge(memory).merge(ostemplate)
|
59
|
+
networks.each { |network| parsed_vm = parsed_vm.merge(network) }
|
60
|
+
volumes.each { |volume| parsed_vm = parsed_vm.merge(volume) }
|
61
|
+
logger.debug("parse_container_vm(): #{parsed_vm}")
|
62
|
+
parsed_vm
|
63
|
+
end
|
64
|
+
|
65
|
+
def parse_container_memory(args)
|
66
|
+
memory = {}
|
67
|
+
args.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
|
68
|
+
memory.store(:memory, args['memory'].to_i) if args['memory']
|
69
|
+
memory.store(:swap, args['swap'].to_i) if args['swap']
|
70
|
+
logger.debug("parse_container_memory(): #{memory}")
|
71
|
+
memory
|
72
|
+
end
|
73
|
+
|
74
|
+
def parse_container_cpu(args)
|
75
|
+
cpu = {}
|
76
|
+
args.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
|
77
|
+
cpu.store(:arch, args['arch'].to_s) if args['arch']
|
78
|
+
cpu.store(:cpulimit, args['cpulimit'].to_i) if args['cpulimit']
|
79
|
+
cpu.store(:cpuunits, args['cpuunits'].to_i) if args['cpuunits']
|
80
|
+
cpu.store(:cores, args['cores'].to_i) if args['cores']
|
81
|
+
logger.debug("parse_container_cpu(): #{cpu}")
|
82
|
+
cpu
|
83
|
+
end
|
84
|
+
|
85
|
+
def parse_container_ostemplate(args)
|
86
|
+
ostemplate = args['ostemplate']
|
87
|
+
ostemplate_file = args['ostemplate_file']
|
88
|
+
ostemplate = ostemplate ? ostemplate : ostemplate_file
|
89
|
+
ostemplate_storage = args['ostemplate_storage']
|
90
|
+
ostemplate_storage, ostemplate_file, _size = Fog::Proxmox::DiskHelper.extract_storage_volid_size(ostemplate) unless ForemanFogProxmox::Value.empty?(ostemplate)
|
91
|
+
parsed_ostemplate = {ostemplate: ostemplate, ostemplate_file: ostemplate_file, ostemplate_storage: ostemplate_storage}
|
92
|
+
logger.debug("parse_container_ostemplate(): #{parsed_ostemplate}")
|
93
|
+
parsed_ostemplate
|
94
|
+
end
|
95
|
+
|
96
|
+
def parse_container_volume(args)
|
97
|
+
disk = {}
|
98
|
+
id = args['id']
|
99
|
+
id = "mp#{args['device']}" unless id
|
100
|
+
delete = args['_delete'].to_i == 1
|
101
|
+
logger.debug("parse_container_volume() args=#{args}")
|
102
|
+
args.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
|
103
|
+
if delete
|
104
|
+
logger.debug("parse_container_volume(): delete id=#{id}")
|
105
|
+
disk.store(:delete, id)
|
106
|
+
disk
|
107
|
+
else
|
108
|
+
disk.store(:id, id)
|
109
|
+
disk.store(:volid, args['volid'])
|
110
|
+
disk.store(:storage, args['storage'].to_s)
|
111
|
+
disk.store(:size, args['size'].to_i)
|
112
|
+
options = args.reject { |key,_value| %w[id volid device storage size _delete].include? key}
|
113
|
+
disk.store(:options, options)
|
114
|
+
logger.debug("parse_container_volume(): add disk=#{disk}")
|
115
|
+
Fog::Proxmox::DiskHelper.flatten(disk)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def parse_container_volumes(args)
|
120
|
+
logger.debug("parse_container_volumes() args=#{args}")
|
121
|
+
volumes = []
|
122
|
+
args.each_value { |value| volumes.push(parse_container_volume(value))} if args
|
123
|
+
logger.debug("parse_container_volumes(): volumes=#{volumes}")
|
124
|
+
volumes
|
125
|
+
end
|
126
|
+
|
127
|
+
def parse_container_interfaces(args)
|
128
|
+
nics = []
|
129
|
+
args.each_value { |value| nics.push(parse_container_interface(value))} if args
|
130
|
+
logger.debug("parse_container_interfaces(): nics=#{nics}")
|
131
|
+
nics
|
132
|
+
end
|
133
|
+
|
134
|
+
def parse_container_interface(args)
|
135
|
+
args.delete_if { |_key,value| ForemanFogProxmox::Value.empty?(value) }
|
136
|
+
nic = {}
|
137
|
+
id = args['id']
|
138
|
+
logger.debug("parse_container_interface(): id=#{id}")
|
139
|
+
delete = args['_delete'].to_i == 1
|
140
|
+
if delete
|
141
|
+
logger.debug("parse_container_interface(): delete id=#{id}")
|
142
|
+
nic.store(:delete, id)
|
143
|
+
nic
|
144
|
+
else
|
145
|
+
nic.store(:id, id)
|
146
|
+
nic.store(:name, args['name'].to_s)
|
147
|
+
nic.store(:bridge, args['bridge'].to_s) if args['bridge']
|
148
|
+
nic.store(:ip, args['ip'].to_s) if args['ip']
|
149
|
+
nic.store(:ip6, args['ip6'].to_s) if args['ip6']
|
150
|
+
nic.store(:rate, args['rate'].to_i) if args['rate']
|
151
|
+
nic.store(:tag, args['tag'].to_i) if args['tag']
|
152
|
+
logger.debug("parse_container_interface(): add nic=#{nic}")
|
153
|
+
Fog::Proxmox::NicHelper.container_flatten(nic)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|