foreman_fog_proxmox 0.14.0 → 0.14.1
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 +42 -29
- data/app/controllers/concerns/foreman_fog_proxmox/compute_resources_vms_controller.rb +17 -7
- data/app/controllers/concerns/foreman_fog_proxmox/controller/parameters/compute_resource.rb +1 -1
- data/app/controllers/concerns/foreman_fog_proxmox/hosts_controller.rb +8 -3
- data/app/controllers/foreman_fog_proxmox/compute_resources_controller.rb +6 -3
- data/app/helpers/proxmox_compute_controllers_helper.rb +2 -1
- data/app/helpers/proxmox_compute_resources_helper.rb +3 -3
- data/app/helpers/proxmox_compute_resources_vms_helper.rb +16 -7
- data/app/helpers/proxmox_form_helper.rb +9 -5
- data/app/helpers/proxmox_vm_config_helper.rb +16 -25
- data/app/helpers/proxmox_vm_interfaces_helper.rb +19 -6
- data/app/helpers/proxmox_vm_os_template_helper.rb +2 -5
- data/app/helpers/proxmox_vm_uuid_helper.rb +1 -1
- data/app/helpers/proxmox_vm_volumes_helper.rb +22 -25
- data/app/models/concerns/fog_extensions/proxmox/node.rb +2 -2
- data/app/models/concerns/fog_extensions/proxmox/server.rb +9 -5
- data/app/models/concerns/host_ext/proxmox/associator.rb +3 -2
- data/app/models/concerns/host_ext/proxmox/for_vm.rb +1 -1
- data/app/models/concerns/host_ext/proxmox/interfaces.rb +7 -3
- data/app/models/concerns/orchestration/proxmox/compute.rb +11 -4
- data/app/models/foreman_fog_proxmox/options_select.rb +1 -3
- data/app/models/foreman_fog_proxmox/proxmox.rb +12 -10
- data/app/models/foreman_fog_proxmox/proxmox_compute_attributes.rb +15 -3
- data/app/models/foreman_fog_proxmox/proxmox_connection.rb +6 -2
- data/app/models/foreman_fog_proxmox/proxmox_console.rb +3 -1
- data/app/models/foreman_fog_proxmox/proxmox_images.rb +2 -2
- data/app/models/foreman_fog_proxmox/proxmox_interfaces.rb +28 -6
- data/app/models/foreman_fog_proxmox/proxmox_operating_systems.rb +6 -1
- data/app/models/foreman_fog_proxmox/proxmox_pools.rb +4 -4
- data/app/models/foreman_fog_proxmox/proxmox_version.rb +7 -3
- data/app/models/foreman_fog_proxmox/proxmox_vm_commands.rb +9 -7
- data/app/models/foreman_fog_proxmox/proxmox_vm_new.rb +37 -24
- data/app/models/foreman_fog_proxmox/proxmox_vm_queries.rb +4 -5
- data/app/models/foreman_fog_proxmox/proxmox_volumes.rb +23 -12
- data/app/models/foreman_fog_proxmox/vms.rb +2 -2
- data/app/views/compute_resources_vms/form/proxmox/container/_config.html.erb +2 -2
- data/app/views/compute_resources_vms/form/proxmox/container/_volume_mp.html.erb +1 -1
- data/app/views/compute_resources_vms/form/proxmox/container/_volume_rootfs.html.erb +1 -1
- data/app/views/compute_resources_vms/form/proxmox/server/_config.html.erb +3 -3
- data/app/views/compute_resources_vms/form/proxmox/server/_volume_hard_disk.html.erb +1 -1
- data/config/routes.rb +8 -4
- data/db/migrate/20210312105013_update_proxmox_uuid_host.rb +1 -2
- data/lib/foreman_fog_proxmox/engine.rb +4 -3
- data/lib/foreman_fog_proxmox/semver.rb +1 -4
- data/lib/foreman_fog_proxmox/version.rb +1 -1
- data/locale/en/foreman_fog_proxmox.po +140 -47
- data/locale/foreman_fog_proxmox.pot +300 -137
- data/locale/fr/foreman_fog_proxmox.po +145 -52
- data/test/factories/foreman_fog_proxmox/proxmox_container_mock_factory.rb +6 -7
- data/test/factories/foreman_fog_proxmox/proxmox_server_mock_factory.rb +6 -7
- data/test/functional/compute_resources_controller_test.rb +4 -2
- data/test/test_plugin_helper.rb +12 -7
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_container_helper_test.rb +38 -47
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_server_helper_test.rb +49 -34
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_helper_test.rb +29 -65
- data/test/unit/foreman_fog_proxmox/helpers/proxmox_vm_volumes_helper_test.rb +3 -3
- data/test/unit/foreman_fog_proxmox/proxmox_compute_attributes_test.rb +22 -13
- data/test/unit/foreman_fog_proxmox/proxmox_interfaces_test.rb +18 -9
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_container_test.rb +45 -35
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_create_test.rb +0 -4
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cdrom_test.rb +34 -22
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_cloudinit_test.rb +20 -14
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_hard_disk_test.rb +76 -54
- data/test/unit/foreman_fog_proxmox/proxmox_vm_commands_server_update_test.rb +26 -15
- data/test/unit/foreman_fog_proxmox/proxmox_vm_queries_test.rb +1 -1
- data/test/unit/foreman_fog_proxmox/semver_test.rb +2 -1
- metadata +35 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70a0629dba4c5afe29ddca15cbe49df9325edb80ca73d076c41c3fc1d283ecff
|
4
|
+
data.tar.gz: f680eed4c519701ecdc5bc38117ca62eb846551ab972aa8e5f38869b17fe414e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c8d56b7e0a4e02ac2195fdd248aa12f5934b8a9746763d1aff59d0df1316f09abb3dbfe212f99e7a39307132065550871bb84a7fcab04787e3e8ca9bd70e50d
|
7
|
+
data.tar.gz: 883ee296ceea79f15e220c8fe9cad273aed8201862be59b41b79761ae01d8cc837adcbe3dae54e9e24d1f30f34dee3d85e7eb8c83ccaa94d0522f27bc28925b3
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|

|
4
4
|
[](https://codeclimate.com/github/theforeman/foreman_fog_proxmox/maintainability)
|
5
|
-
[](https://codeclimate.com/github/theforeman/foreman_fog_proxmox/test_coverage)
|
6
6
|
[](https://badge.fury.io/rb/foreman_fog_proxmox)
|
7
7
|
|
8
8
|
# ForemanFogProxmox
|
@@ -38,7 +38,7 @@ You can support the plugin development via the following methods:
|
|
38
38
|
|
39
39
|
## Installation
|
40
40
|
|
41
|
-
### From OS packages
|
41
|
+
### From OS packages (required)
|
42
42
|
|
43
43
|
Please see the Foreman manual for complete instructions:
|
44
44
|
|
@@ -128,15 +128,17 @@ Then you can check plugin installation after login into your new foreman server
|
|
128
128
|
|
129
129
|
### Dev prerequisites
|
130
130
|
|
131
|
-
|
132
|
-
|
133
|
-
* You
|
131
|
+
> See [Foreman dev setup](https://github.com/theforeman/foreman/blob/develop/developer_docs/foreman_dev_setup.asciidoc)
|
132
|
+
|
133
|
+
* You need a Proxmox VE 6.2+ server running.
|
134
|
+
* You need ruby 2.7. You can install it with [asdf-vm](https://asdf-vm.com).
|
135
|
+
* You also need nodejs 14 in your dev machine to run webpack-dev-server. You can install it with [asdf-vm](https://asdf-vm.com).
|
134
136
|
|
135
137
|
### Platform
|
136
138
|
|
137
139
|
* Fork this github repo.
|
138
140
|
* Clone it on your local machine
|
139
|
-
* Install foreman
|
141
|
+
* Install foreman v2.5+ on your machine:
|
140
142
|
|
141
143
|
```shell
|
142
144
|
git clone https://github.com/theforeman/foreman -b develop
|
@@ -158,9 +160,9 @@ gem 'simplecov' # test
|
|
158
160
|
|
159
161
|
```shell
|
160
162
|
gem install bundler
|
161
|
-
# prerequisites
|
162
|
-
|
163
|
-
bundle config
|
163
|
+
# prerequisites libraries on Ubuntu OS:
|
164
|
+
# sudo apt install postgresql-client-13 libpq-dev libsystemd-dev
|
165
|
+
bundle config set without 'libvirt ovirt'
|
164
166
|
bundle install
|
165
167
|
```
|
166
168
|
|
@@ -178,6 +180,12 @@ add these lines to config/settings.yml:
|
|
178
180
|
|
179
181
|
```yaml
|
180
182
|
:webpack_dev_server: true
|
183
|
+
:destroy_vm_on_host_delete: true # optional, could be set on UI
|
184
|
+
:logging:
|
185
|
+
:level: debug
|
186
|
+
:loggers:
|
187
|
+
:sql:
|
188
|
+
:enabled: false
|
181
189
|
```
|
182
190
|
|
183
191
|
* SQLite is no more default rails dev or test database, instead add:
|
@@ -189,45 +197,42 @@ DATABASE_URL=nulldb://nohost
|
|
189
197
|
* (Optional) test and dev with postgresql database:
|
190
198
|
|
191
199
|
```shell
|
192
|
-
cp config/model.mappings.example config/model.mappings
|
193
200
|
cp config/database.yml.example config/database.yml
|
194
201
|
```
|
195
202
|
|
196
203
|
add these lines to each environment in config/database.yml:
|
197
204
|
|
198
205
|
```yaml
|
206
|
+
host: localhost
|
199
207
|
username: foreman
|
200
208
|
password: foreman
|
201
209
|
```
|
202
210
|
|
203
211
|
```shell
|
204
212
|
cp config/ignored_environments.yml.sample config/ignored_environments.yml
|
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
|
213
|
+
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:13
|
206
214
|
bundle exec bin/rake db:migrate
|
207
|
-
|
208
|
-
bundle exec bin/rake db:seed assets:precompile locale:pack webpack:compile
|
215
|
+
RAILS_ENV=development bundle exec bin/rake db:seed assets:precompile locale:pack webpack:compile
|
209
216
|
```
|
210
217
|
|
211
|
-
* You can reset admin password if needed:
|
218
|
+
* You can reset and change your admin password if needed:
|
212
219
|
|
213
220
|
```shell
|
214
|
-
bundle exec bin/rake permissions:reset
|
221
|
+
RAILS_ENV=development bundle exec bin/rake permissions:reset password=changeme
|
215
222
|
```
|
216
223
|
|
217
224
|
* You should write tests and you can execute those specific to this plugin:
|
218
225
|
|
219
|
-
first, create database `foreman-test
|
226
|
+
first, create database `foreman-test`:
|
220
227
|
|
221
228
|
```shell
|
222
|
-
|
223
|
-
foreman=# create database "foreman-test";
|
229
|
+
RAILS_ENV=test bundle exec rake db:create
|
224
230
|
```
|
225
231
|
|
226
232
|
then add test schema and seeds:
|
227
233
|
|
228
234
|
```shell
|
229
235
|
RAILS_ENV=test bundle exec bin/rake db:migrate
|
230
|
-
# reboot if error: "ActiveRecord::RecordNotFound: Couldn't find Setting with [WHERE "settings"."name" = $1]"
|
231
236
|
RAILS_ENV=test bundle exec bin/rake db:seed
|
232
237
|
```
|
233
238
|
|
@@ -245,10 +250,22 @@ export DISABLE_SPRING=true
|
|
245
250
|
bundle exec bin/rake test TEST=../foreman_fog_proxmox/test/functional/compute_resources_controller_test.rb DATABASE_URL=nulldb://nohost
|
246
251
|
```
|
247
252
|
|
248
|
-
*
|
253
|
+
* In foreman_fog_proxmox source directory, check code syntax with rubocop and foreman rules:
|
254
|
+
|
255
|
+
```shell
|
256
|
+
bundle exec rubocop
|
257
|
+
```
|
258
|
+
|
259
|
+
safe autocorrect:
|
260
|
+
|
261
|
+
```shell
|
262
|
+
bundle exec rubocop -a
|
263
|
+
```
|
264
|
+
|
265
|
+
Temporary ignore offenses:
|
249
266
|
|
250
267
|
```shell
|
251
|
-
bundle exec
|
268
|
+
bundle exec rubocop --auto-gen-config
|
252
269
|
```
|
253
270
|
|
254
271
|
* See deface overrides result:
|
@@ -265,14 +282,16 @@ bundle exec bin/rake plugin:assets:precompile[foreman_fog_proxmox]
|
|
265
282
|
|
266
283
|
* In foreman directory, after you modify foreman_fog_proxmox translations (language, texts in new files, etc) you have to compile it:
|
267
284
|
|
285
|
+
Prerequisites: [Transifex CLI](https://github.com/transifex/cli)
|
286
|
+
|
268
287
|
```shell
|
269
|
-
bundle exec bin/rake plugin:gettext[foreman_fog_proxmox]
|
288
|
+
bundle exec bin/rake plugin:gettext\[foreman_fog_proxmox\]
|
270
289
|
```
|
271
290
|
|
272
291
|
* In foreman directory, run in a new terminal the webpack-dev-server:
|
273
292
|
|
274
293
|
```shell
|
275
|
-
./node_modules/.bin/webpack-dev-server --config config/webpack.config.js
|
294
|
+
./node_modules/.bin/webpack-dev-server-without-h2 --config config/webpack.config.js
|
276
295
|
```
|
277
296
|
|
278
297
|
* Or without webpack-dev-server, add this line in config/settings.yml:
|
@@ -299,12 +318,6 @@ bundle exec bin/rails server
|
|
299
318
|
bundle exec foreman start
|
300
319
|
```
|
301
320
|
|
302
|
-
If you want to delete vm on host destroy, add this line in config/settings.yml:
|
303
|
-
|
304
|
-
```yml
|
305
|
-
:destroy_vm_on_host_delete: false
|
306
|
-
```
|
307
|
-
|
308
321
|
See details in [foreman plugin development](https://projects.theforeman.org/projects/foreman/wiki/How_to_Create_a_Plugin)
|
309
322
|
|
310
323
|
## Contributing
|
@@ -26,15 +26,20 @@ module ForemanFogProxmox
|
|
26
26
|
module Overrides
|
27
27
|
def associate
|
28
28
|
if Host.for_vm_uuid(@compute_resource, @vm).any?
|
29
|
-
process_error(:error_msg => _("VM already associated with a host"),
|
29
|
+
process_error(:error_msg => _("VM already associated with a host"),
|
30
|
+
:redirect => compute_resource_vm_path(:compute_resource_id => params[:compute_resource_id],
|
31
|
+
:id => proxmox_vm_id(@compute_resource, @vm)))
|
30
32
|
return
|
31
33
|
end
|
32
34
|
host = @compute_resource.associated_host(@vm) if @compute_resource.respond_to?(:associated_host)
|
33
35
|
if host.present?
|
34
36
|
host.associate!(@compute_resource, @vm)
|
35
|
-
process_success(:success_msg => _("VM associated to host %s") % host.name,
|
37
|
+
process_success(:success_msg => _("VM associated to host %s") % host.name,
|
38
|
+
:success_redirect => host_path(host))
|
36
39
|
else
|
37
|
-
process_error(:error_msg => _("No host found to associate this VM with"),
|
40
|
+
process_error(:error_msg => _("No host found to associate this VM with"),
|
41
|
+
:redirect => compute_resource_vm_path(:compute_resource_id => params[:compute_resource_id],
|
42
|
+
:id => proxmox_vm_id(@compute_resource, @vm)))
|
38
43
|
end
|
39
44
|
end
|
40
45
|
|
@@ -51,14 +56,15 @@ module ForemanFogProxmox
|
|
51
56
|
'hosts/console/log'
|
52
57
|
end
|
53
58
|
rescue StandardError => e
|
54
|
-
process_error :redirect => compute_resource_vm_path(@compute_resource, proxmox_vm_id(@compute_resource, @vm)),
|
59
|
+
process_error :redirect => compute_resource_vm_path(@compute_resource, proxmox_vm_id(@compute_resource, @vm)),
|
60
|
+
:error_msg => (_("Failed to set console: %s") % e), :object => @vm
|
55
61
|
end
|
56
62
|
|
57
63
|
private
|
58
64
|
|
59
65
|
def proxmox_vm_id(compute_resource, vm)
|
60
66
|
id = vm.identity
|
61
|
-
id = vm.unique_cluster_identity(compute_resource) if compute_resource.
|
67
|
+
id = vm.unique_cluster_identity(compute_resource) if compute_resource.instance_of?(ForemanFogProxmox::Proxmox)
|
62
68
|
id
|
63
69
|
end
|
64
70
|
|
@@ -69,11 +75,15 @@ module ForemanFogProxmox
|
|
69
75
|
else
|
70
76
|
error format(_("failed to %<action>s %<vm>s"), { :action => _(action), :vm => @vm })
|
71
77
|
end
|
72
|
-
redirect_back(:fallback_location => compute_resource_vm_path(
|
78
|
+
redirect_back(:fallback_location => compute_resource_vm_path(
|
79
|
+
:compute_resource_id => params[:compute_resource_id], :id => proxmox_vm_id(@compute_resource, @vm)
|
80
|
+
))
|
73
81
|
# This should only rescue Fog::Errors, but Fog returns all kinds of errors...
|
74
82
|
rescue StandardError => e
|
75
83
|
error format(_("Error - %<message>s"), { :message => _(e.message) })
|
76
|
-
redirect_back(:fallback_location => compute_resource_vm_path(
|
84
|
+
redirect_back(:fallback_location => compute_resource_vm_path(
|
85
|
+
:compute_resource_id => params[:compute_resource_id], :id => proxmox_vm_id(@compute_resource, @vm)
|
86
|
+
))
|
77
87
|
end
|
78
88
|
end
|
79
89
|
end
|
@@ -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
|
-
|
30
|
+
:ssl_certs, :disable_proxy, :auth_method, :token_id, :token
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -28,11 +28,16 @@ module ForemanFogProxmox
|
|
28
28
|
# Clone the host
|
29
29
|
def clone
|
30
30
|
super
|
31
|
-
return true unless @host.compute_resource.
|
31
|
+
return true unless @host.compute_resource.instance_of?(ForemanFogProxmox::Proxmox)
|
32
32
|
|
33
33
|
@host.compute_attributes[:vmid] = next_vmid
|
34
|
-
@host.compute_attributes[:interfaces_attributes].each
|
35
|
-
|
34
|
+
@host.compute_attributes[:interfaces_attributes].each do |index, interface_attributes|
|
35
|
+
@host.compute_attributes[:interfaces_attributes][index] =
|
36
|
+
interface_attributes.merge(macaddr: nil).merge(hwaddr: nil).merge(ip: nil).merge(ip6: nil)
|
37
|
+
end
|
38
|
+
@host.compute_attributes[:volumes_attributes].each do |index, volume_attributes|
|
39
|
+
@host.compute_attributes[:volumes_attributes][index] = volume_attributes.merge(volid: nil)
|
40
|
+
end
|
36
41
|
end
|
37
42
|
|
38
43
|
private
|
@@ -21,7 +21,8 @@ module ForemanFogProxmox
|
|
21
21
|
class ComputeResourcesController < ::ApplicationController
|
22
22
|
# GET foreman_fog_proxmox/isos/:compute_resource_id/:node_id/:storage
|
23
23
|
def isos_by_id_and_node_and_storage
|
24
|
-
volumes = load_compute_resource(params[:compute_resource_id]).images_by_storage(params[:node_id],
|
24
|
+
volumes = load_compute_resource(params[:compute_resource_id]).images_by_storage(params[:node_id],
|
25
|
+
params[:storage], 'iso')
|
25
26
|
respond_to do |format|
|
26
27
|
format.json { render :json => volumes }
|
27
28
|
end
|
@@ -29,7 +30,8 @@ module ForemanFogProxmox
|
|
29
30
|
|
30
31
|
# GET foreman_fog_proxmox/ostemplates/:compute_resource_id/:node_id/:storage
|
31
32
|
def ostemplates_by_id_and_node_and_storage
|
32
|
-
volumes = load_compute_resource(params[:compute_resource_id]).images_by_storage(params[:node_id],
|
33
|
+
volumes = load_compute_resource(params[:compute_resource_id]).images_by_storage(params[:node_id],
|
34
|
+
params[:storage], 'vztmpl')
|
33
35
|
respond_to do |format|
|
34
36
|
format.json { render :json => volumes }
|
35
37
|
end
|
@@ -37,7 +39,8 @@ module ForemanFogProxmox
|
|
37
39
|
|
38
40
|
# GET foreman_fog_proxmox/isos/:compute_resource_id/:node_id
|
39
41
|
def isos_by_id_and_node
|
40
|
-
volumes = load_compute_resource(params[:compute_resource_id]).images_by_storage(params[:node_id],
|
42
|
+
volumes = load_compute_resource(params[:compute_resource_id]).images_by_storage(params[:node_id],
|
43
|
+
params[:storage], 'iso')
|
41
44
|
respond_to do |format|
|
42
45
|
format.json { render :json => volumes }
|
43
46
|
end
|
@@ -19,7 +19,8 @@
|
|
19
19
|
|
20
20
|
module ProxmoxComputeControllersHelper
|
21
21
|
def proxmox_controllers_map
|
22
|
-
proxmox_controllers_cloudinit_map << ForemanFogProxmox::OptionsSelect.new(name: 'VirtIO Block', id: 'virtio',
|
22
|
+
proxmox_controllers_cloudinit_map << ForemanFogProxmox::OptionsSelect.new(name: 'VirtIO Block', id: 'virtio',
|
23
|
+
range: 15)
|
23
24
|
end
|
24
25
|
|
25
26
|
def proxmox_controllers_cloudinit_map
|
@@ -21,9 +21,9 @@ module ProxmoxComputeResourcesHelper
|
|
21
21
|
def user_token_expiration_date(compute_resource)
|
22
22
|
expire = compute_resource.current_user_token_expire
|
23
23
|
rescue ::Foreman::Exception => e
|
24
|
-
|
24
|
+
'Has already expired. Please edit the compute resource to set a new valid one.' if e.message == 'User token expired'
|
25
25
|
rescue StandardError => e
|
26
|
-
logger.warn(
|
26
|
+
logger.warn("failed to get identity client version: #{e}")
|
27
27
|
raise e
|
28
28
|
else
|
29
29
|
return 'Never' if expire == 0
|
@@ -36,7 +36,7 @@ module ProxmoxComputeResourcesHelper
|
|
36
36
|
rescue ::Foreman::Exception => e
|
37
37
|
return [] if e.message == 'User token expired'
|
38
38
|
rescue StandardError => e
|
39
|
-
logger.warn(
|
39
|
+
logger.warn("failed to get cluster nodes: #{e}")
|
40
40
|
raise e
|
41
41
|
else
|
42
42
|
nodes
|
@@ -20,7 +20,7 @@
|
|
20
20
|
module ProxmoxComputeResourcesVmsHelper
|
21
21
|
def proxmox_vm_id(compute_resource, vm)
|
22
22
|
id = vm.identity
|
23
|
-
id = vm.unique_cluster_identity(compute_resource) if compute_resource.
|
23
|
+
id = vm.unique_cluster_identity(compute_resource) if compute_resource.instance_of?(ForemanFogProxmox::Proxmox)
|
24
24
|
id
|
25
25
|
end
|
26
26
|
|
@@ -32,7 +32,9 @@ module ProxmoxComputeResourcesVmsHelper
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def vm_power_action(vm, authorizer = nil)
|
35
|
-
opts = hash_for_power_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => proxmox_vm_id(@compute_resource, vm)).merge(
|
35
|
+
opts = hash_for_power_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => proxmox_vm_id(@compute_resource, vm)).merge(
|
36
|
+
:auth_object => @compute_resource, :permission => 'power_compute_resources_vms', :authorizer => authorizer
|
37
|
+
)
|
36
38
|
html = power_action_html(vm)
|
37
39
|
|
38
40
|
display_link_if_authorized "Power #{action_string(vm)}", opts, html.merge(:method => :put)
|
@@ -46,7 +48,8 @@ module ProxmoxComputeResourcesVmsHelper
|
|
46
48
|
:id => proxmox_vm_id(@compute_resource, vm)
|
47
49
|
).merge(
|
48
50
|
:auth_object => @compute_resource,
|
49
|
-
:permission => 'edit_compute_resources'
|
51
|
+
:permission => 'edit_compute_resources'
|
52
|
+
),
|
50
53
|
:title => _('Associate VM to a Foreman host'),
|
51
54
|
:method => :put,
|
52
55
|
:class => 'btn btn-default'
|
@@ -62,7 +65,8 @@ module ProxmoxComputeResourcesVmsHelper
|
|
62
65
|
hash_for_import_compute_resource_vm_path(
|
63
66
|
:compute_resource_id => @compute_resource,
|
64
67
|
:id => proxmox_vm_id(@compute_resource, vm),
|
65
|
-
:type => 'managed'
|
68
|
+
:type => 'managed'
|
69
|
+
),
|
66
70
|
html_options
|
67
71
|
)
|
68
72
|
import_unmanaged_link = display_link_if_authorized(
|
@@ -70,7 +74,8 @@ module ProxmoxComputeResourcesVmsHelper
|
|
70
74
|
hash_for_import_compute_resource_vm_path(
|
71
75
|
:compute_resource_id => @compute_resource,
|
72
76
|
:id => proxmox_vm_id(@compute_resource, vm),
|
73
|
-
:type => 'unmanaged'
|
77
|
+
:type => 'unmanaged'
|
78
|
+
),
|
74
79
|
html_options
|
75
80
|
)
|
76
81
|
|
@@ -88,12 +93,16 @@ module ProxmoxComputeResourcesVmsHelper
|
|
88
93
|
),
|
89
94
|
{
|
90
95
|
:id => 'console-button',
|
91
|
-
:class => 'btn btn-info'
|
96
|
+
:class => 'btn btn-info',
|
92
97
|
}
|
93
98
|
)
|
94
99
|
end
|
95
100
|
|
96
101
|
def vm_delete_action(vm, authorizer = nil)
|
97
|
-
display_delete_if_authorized(
|
102
|
+
display_delete_if_authorized(
|
103
|
+
hash_for_compute_resource_vm_path(:compute_resource_id => @compute_resource, :id => proxmox_vm_id(@compute_resource, vm)).merge(
|
104
|
+
:auth_object => @compute_resource, :authorizer => authorizer
|
105
|
+
), :class => 'btn btn-danger'
|
106
|
+
)
|
98
107
|
end
|
99
108
|
end
|
@@ -29,9 +29,11 @@ module ProxmoxFormHelper
|
|
29
29
|
options[:value] = value if value.present?
|
30
30
|
addClass options, 'form-control'
|
31
31
|
pass = f.password_field(attr, options) +
|
32
|
-
tag(:span, '', class: 'glyphicon glyphicon-warning-sign input-addon', title: 'Caps lock ON',
|
32
|
+
tag(:span, '', class: 'glyphicon glyphicon-warning-sign input-addon', title: 'Caps lock ON',
|
33
|
+
style: 'display:none')
|
33
34
|
if unset_button
|
34
|
-
button = link_to_function(icon_text('edit', '', :kind => 'pficon'), 'toggle_input_group(this)',
|
35
|
+
button = link_to_function(icon_text('edit', '', :kind => 'pficon'), 'toggle_input_group(this)',
|
36
|
+
:id => 'disable-pass-btn', :class => 'btn btn-default', :title => _('Change the password'))
|
35
37
|
input_group(pass, input_group_btn(button))
|
36
38
|
else
|
37
39
|
pass
|
@@ -53,10 +55,12 @@ module ProxmoxFormHelper
|
|
53
55
|
options[:form_builder_local] ||= :f
|
54
56
|
options[:form_builder_attrs] ||= {}
|
55
57
|
|
56
|
-
content_tag(:div, :class => "#{options[:type]}_#{association}_fields_template form_template",
|
57
|
-
|
58
|
+
content_tag(:div, :class => "#{options[:type]}_#{association}_fields_template form_template",
|
59
|
+
:style => 'display: none;') do
|
60
|
+
form_builder.fields_for(association, options[:object],
|
61
|
+
:child_index => "new_#{options[:type]}_#{association}") do |f|
|
58
62
|
render(:partial => options[:partial], :layout => options[:layout],
|
59
|
-
|
63
|
+
:locals => { options[:form_builder_local] => f }.merge(options[:form_builder_attrs]))
|
60
64
|
end
|
61
65
|
end
|
62
66
|
end
|
@@ -25,28 +25,20 @@ require 'foreman_fog_proxmox/hash_collection'
|
|
25
25
|
|
26
26
|
# Convert a foreman form server hash into a fog-proxmox server attributes hash
|
27
27
|
module ProxmoxVmConfigHelper
|
28
|
-
KILO = 1024
|
29
|
-
MEGA = KILO * KILO
|
30
|
-
GIGA = KILO * MEGA
|
31
|
-
|
32
28
|
def object_to_config_hash(vm, type)
|
33
29
|
vm_h = ActiveSupport::HashWithIndifferentAccess.new
|
34
30
|
main_a = ['vmid']
|
35
31
|
main = vm.attributes.select { |key, _value| main_a.include? key }
|
36
32
|
main_a += ['templated']
|
37
|
-
config = vm.config.attributes.reject
|
33
|
+
config = vm.config.attributes.reject do |key, _value|
|
34
|
+
main_a.include?(key) || Fog::Proxmox::DiskHelper.disk?(key) || Fog::Proxmox::NicHelper.nic?(key)
|
35
|
+
end
|
38
36
|
vm_h = vm_h.merge(main)
|
39
37
|
vm_h = vm_h.merge('config_attributes': config)
|
40
|
-
logger.debug(
|
38
|
+
logger.debug("object_to_config_hash(#{type}): vm_h=#{vm_h}")
|
41
39
|
vm_h
|
42
40
|
end
|
43
41
|
|
44
|
-
def convert_memory_size(config_hash, key)
|
45
|
-
# default unit memory size is Mb
|
46
|
-
memory = (config_hash[key].to_i / MEGA).to_s == '0' ? config_hash[key] : (config_hash[key].to_i / MEGA).to_s
|
47
|
-
config_hash.store(key, memory)
|
48
|
-
end
|
49
|
-
|
50
42
|
def general_a(type)
|
51
43
|
general_a = ['node_id', 'type', 'config_attributes', 'volumes_attributes', 'interfaces_attributes']
|
52
44
|
general_a += ['firmware_type', 'provision_method', 'container_volumes', 'server_volumes', 'start_after_create']
|
@@ -59,7 +51,7 @@ module ProxmoxVmConfigHelper
|
|
59
51
|
main_a = ['name', 'type', 'node_id', 'vmid', 'interfaces', 'mount_points', 'disks']
|
60
52
|
case type
|
61
53
|
when 'lxc'
|
62
|
-
cpu_a = ['arch', 'cpulimit', 'cpuunits'
|
54
|
+
cpu_a = ['arch', 'cpulimit', 'cpuunits']
|
63
55
|
memory_a = ['memory', 'swap']
|
64
56
|
ostemplate_a = ['ostemplate', 'ostemplate_storage', 'ostemplate_file']
|
65
57
|
keys.store(:ostemplate, ostemplate_a)
|
@@ -76,10 +68,6 @@ module ProxmoxVmConfigHelper
|
|
76
68
|
keys
|
77
69
|
end
|
78
70
|
|
79
|
-
def convert_memory_sizes(args)
|
80
|
-
['memory', 'balloon', 'shares', 'swap'].each { |key| convert_memory_size(args['config_attributes'], key) }
|
81
|
-
end
|
82
|
-
|
83
71
|
def config_general_or_ostemplate_key?(key)
|
84
72
|
config_typed_keys('lxc')[:general].include?(key) || config_typed_keys(type)[:ostemplate].include?(key)
|
85
73
|
end
|
@@ -125,7 +113,9 @@ module ProxmoxVmConfigHelper
|
|
125
113
|
logger.debug("parsed_typed_config(#{type}): config_cpu=#{config_cpu}")
|
126
114
|
cpu = parse_typed_cpu(config_cpu, type)
|
127
115
|
memory = parse_typed_memory(config.select { |key, _value| config_typed_keys(type)[:memory].include? key }, type)
|
128
|
-
parsed_config = config.reject
|
116
|
+
parsed_config = config.reject do |key, value|
|
117
|
+
config_a(type).include?(key) || ForemanFogProxmox::Value.empty?(value)
|
118
|
+
end
|
129
119
|
parsed_vm = args.reject { |key, value| args_a(type).include?(key) || ForemanFogProxmox::Value.empty?(value) }
|
130
120
|
parsed_vm = parsed_vm.merge(config_options(config, args, type))
|
131
121
|
parsed_vm = parsed_vm.merge(parsed_config).merge(cpu).merge(memory)
|
@@ -134,26 +124,27 @@ module ProxmoxVmConfigHelper
|
|
134
124
|
end
|
135
125
|
|
136
126
|
def parse_typed_memory(args, type)
|
137
|
-
memory = {}
|
138
127
|
ForemanFogProxmox::HashCollection.remove_empty_values(args)
|
139
|
-
|
140
|
-
|
128
|
+
logger.debug("parse_typed_memory(#{type}): args=#{args}")
|
129
|
+
args
|
141
130
|
end
|
142
131
|
|
143
132
|
def parse_typed_cpu(args, type)
|
144
133
|
cpu = {}
|
145
134
|
ForemanFogProxmox::HashCollection.remove_empty_values(args)
|
146
|
-
|
135
|
+
case type
|
136
|
+
when 'qemu'
|
147
137
|
logger.debug("parse_typed_cpu(#{type}): args=#{args}")
|
148
138
|
cpu_flattened = Fog::Proxmox::CpuHelper.flatten(args)
|
149
139
|
cpu_flattened = args[:cpu] if cpu_flattened.empty?
|
150
140
|
logger.debug("parse_typed_cpu(#{type}): cpu_flattened=#{cpu_flattened}")
|
151
|
-
ForemanFogProxmox::HashCollection.remove_empty_values(args)
|
152
|
-
ForemanFogProxmox::HashCollection.remove_keys(args, config_typed_keys('qemu')[:cpu])
|
153
141
|
args.each_value(&:to_i)
|
154
142
|
cpu = { cpu: cpu_flattened }
|
143
|
+
when 'lxc'
|
144
|
+
config_typed_keys('lxc')[:cpu].each do |key|
|
145
|
+
ForemanFogProxmox::HashCollection.add_and_format_element(cpu, key.to_sym, args, key)
|
146
|
+
end
|
155
147
|
end
|
156
|
-
config_typed_keys('lxc')[:cpu].each { |key| ForemanFogProxmox::HashCollection.add_and_format_element(cpu, key.to_sym, args, key) } if type == 'lxc'
|
157
148
|
logger.debug("parse_typed_cpu(#{type}): cpu=#{cpu}")
|
158
149
|
cpu
|
159
150
|
end
|
@@ -35,8 +35,12 @@ module ProxmoxVmInterfacesHelper
|
|
35
35
|
interfaces_to_add = []
|
36
36
|
interfaces_to_delete = []
|
37
37
|
interfaces_attributes = args['interfaces_attributes']
|
38
|
-
|
39
|
-
|
38
|
+
unless ForemanFogProxmox::Value.empty?(args['config_attributes'])
|
39
|
+
interfaces_attributes ||= args['config_attributes']['interfaces_attributes']
|
40
|
+
end
|
41
|
+
interfaces_attributes&.each_value do |value|
|
42
|
+
add_or_delete_typed_interface(value, interfaces_to_delete, interfaces_to_add, type)
|
43
|
+
end
|
40
44
|
[interfaces_to_add, interfaces_to_delete]
|
41
45
|
end
|
42
46
|
|
@@ -65,7 +69,9 @@ module ProxmoxVmInterfacesHelper
|
|
65
69
|
def add_or_delete_typed_interface(interface_attributes, interfaces_to_delete, interfaces_to_add, type)
|
66
70
|
logger.debug("add_or_delete_typed_interface(#{type}): interface_attributes=#{interface_attributes}")
|
67
71
|
ForemanFogProxmox::HashCollection.remove_empty_values(interface_attributes)
|
68
|
-
|
72
|
+
if interface_attributes['compute_attributes']
|
73
|
+
ForemanFogProxmox::HashCollection.remove_empty_values(interface_attributes['compute_attributes'])
|
74
|
+
end
|
69
75
|
nic = {}
|
70
76
|
id = interface_attributes['id']
|
71
77
|
delete = interface_attributes['_delete'].to_i == 1
|
@@ -73,10 +79,17 @@ module ProxmoxVmInterfacesHelper
|
|
73
79
|
logger.debug("add_or_delete_typed_interface(#{type}): delete id=#{id}")
|
74
80
|
interfaces_to_delete.push(id.to_s)
|
75
81
|
else
|
76
|
-
interface_common_typed_keys(type).each
|
82
|
+
interface_common_typed_keys(type).each do |key|
|
83
|
+
ForemanFogProxmox::HashCollection.add_and_format_element(nic, key[:dest].to_sym, interface_attributes,
|
84
|
+
key[:origin])
|
85
|
+
end
|
77
86
|
interface_attributes_h = interface_attributes['compute_attributes']
|
78
|
-
|
79
|
-
|
87
|
+
if ForemanFogProxmox::Value.empty?(interface_attributes['compute_attributes'])
|
88
|
+
interface_attributes_h ||= interface_attributes
|
89
|
+
end
|
90
|
+
interface_compute_attributes_typed_keys(type).each do |key|
|
91
|
+
ForemanFogProxmox::HashCollection.add_and_format_element(nic, key.to_sym, interface_attributes_h, key)
|
92
|
+
end
|
80
93
|
compute_dhcps(interface_attributes_h)
|
81
94
|
logger.debug("add_or_delete_typed_interface(#{type}): add nic=#{nic}")
|
82
95
|
interfaces_to_add.push(Fog::Proxmox::NicHelper.flatten(nic))
|
@@ -38,10 +38,7 @@ module ProxmoxVmOsTemplateHelper
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def parse_container_ostemplate(args)
|
41
|
-
ostemplate = args['ostemplate']
|
42
|
-
|
43
|
-
ostemplate ||= ostemplate_file
|
44
|
-
parsed_ostemplate = { ostemplate: ostemplate }
|
45
|
-
parsed_ostemplate
|
41
|
+
ostemplate = args['ostemplate'] || args['ostemplate_file']
|
42
|
+
{ ostemplate: ostemplate }
|
46
43
|
end
|
47
44
|
end
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# along with ForemanFogProxmox. If not, see <http://www.gnu.org/licenses/>.
|
19
19
|
|
20
20
|
module ProxmoxVmUuidHelper
|
21
|
-
UUID_REGEXP = /(?<cluster_id>\d+)
|
21
|
+
UUID_REGEXP = /(?<cluster_id>\d+)_(?<vmid>\d+)/.freeze
|
22
22
|
def extract(uuid, name)
|
23
23
|
captures_h = uuid ? UUID_REGEXP.match(uuid.to_s) : { cluster_id: '', vmid: '' }
|
24
24
|
captures_h ? captures_h[name] : ''
|