foreman_xen 0.4.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +3 -2
- data/app/assets/javascripts/compute_resources/xenserver/cache_refresh.js +20 -0
- data/app/assets/javascripts/compute_resources/xenserver/populate_fields.js +32 -0
- data/app/controllers/foreman_xen/cache_controller.rb +34 -0
- data/app/helpers/xen_compute_helper.rb +57 -26
- data/app/models/foreman_xen/xenserver.rb +104 -66
- data/app/views/compute_resources_vms/form/_hypervisors.html.erb +8 -1
- data/app/views/compute_resources_vms/form/_network.html.erb +16 -8
- data/app/views/compute_resources_vms/form/_templates.html.erb +31 -3
- data/app/views/compute_resources_vms/form/_volume.html.erb +14 -2
- data/app/views/compute_resources_vms/form/xenserver/_base.html.erb +4 -0
- data/config/routes.rb +2 -0
- data/lib/foreman_xen/engine.rb +15 -0
- data/lib/foreman_xen/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ac77329d8a3e6cb5a669b5f5f91768a9cc11cb9
|
4
|
+
data.tar.gz: 6e33e23e884e9b0a78e9f92e6c0f46c9aa2d7580
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7dbe2c6d1422283db19b090a17c4fe0a4ba8b2fc04983759614d05ae92c9d4dfb6cc586dddee8266e0d48aa080f043450ed7d13cc929e706d0b13ef4620352b
|
7
|
+
data.tar.gz: 26c02876370b0a7a495a652011411836d3d647efdc275e276d1e96188af2abca7a7624dcb2c562b538a87e0cfa5a976616ba222ae7380fdfba3a242aca5cdec7
|
data/README.md
CHANGED
@@ -20,8 +20,9 @@ Please see the Foreman manual for further instructions:
|
|
20
20
|
| >=1.5, <1.8 | 0.0.x (unmaintained) |
|
21
21
|
| >=1.8.1, <1.10 | 0.1.x (unmaintained) |
|
22
22
|
| >=1.10, <1.11 | 0.2.x (unmaintained) |
|
23
|
-
| >=1.11, <1.13 | 0.3.x
|
24
|
-
| >=1.13
|
23
|
+
| >=1.11, <1.13 | 0.3.x (unmaintained) |
|
24
|
+
| >=1.13, <1.14 | 0.4.x |
|
25
|
+
| >=1.14 | 0.5.x |
|
25
26
|
|
26
27
|
## Support
|
27
28
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
function refreshCache(item, on_success) {
|
2
|
+
tfm.tools.showSpinner();
|
3
|
+
attribute_name = $(item).data('attribute')
|
4
|
+
data = {
|
5
|
+
type: attribute_name,
|
6
|
+
compute_resource_id: $(item).data('compute-resource-id')
|
7
|
+
}
|
8
|
+
$.ajax({
|
9
|
+
type:'post',
|
10
|
+
url: $(item).data('url'),
|
11
|
+
data: data,
|
12
|
+
complete: function(){
|
13
|
+
tfm.tools.hideSpinner();
|
14
|
+
},
|
15
|
+
error: function(){
|
16
|
+
notify(__("Error refreshing cache for " + attribute_name), 'error', true);
|
17
|
+
},
|
18
|
+
success: on_success
|
19
|
+
})
|
20
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
function xenPopulateNetworks(network_list){
|
2
|
+
$('#host_compute_attributes_VIFs_print').children().remove();
|
3
|
+
for (var i = 0; i < network_list.length; i++) {
|
4
|
+
network = network_list[i];
|
5
|
+
$('#host_compute_attributes_VIFs_print').append('<option id=' + network['name'] + '>' + network['name'] + '</option>');
|
6
|
+
}
|
7
|
+
}
|
8
|
+
|
9
|
+
function xenPopulateStoragePools(results){
|
10
|
+
$('#host_compute_attributes_VBDs_sr_uuid').children().remove();
|
11
|
+
for (var i = 0; i < results.length; i++) {
|
12
|
+
result = results[i];
|
13
|
+
$('#host_compute_attributes_VBDs_sr_uuid').append('<option id=' + result['uuid'] + '>' + result['name'] + '</option>');
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
function xenPopulateCustomTemplates(custom_templates){
|
18
|
+
xenPopulateTemplates(custom_templates, '#host_compute_attributes_custom_template_name');
|
19
|
+
}
|
20
|
+
|
21
|
+
function xenPopulateBuiltinTemplates(builtin_templates){
|
22
|
+
xenPopulateTemplates(builtin_templates, '#host_compute_attributes_builtin_template_name');
|
23
|
+
}
|
24
|
+
|
25
|
+
function xenPopulateTemplates(results, selector){
|
26
|
+
$(selector).children().remove();
|
27
|
+
$(selector).append('<option>No template</option>');
|
28
|
+
for (var i = 0; i < results.length; i++) {
|
29
|
+
result = results[i];
|
30
|
+
$(selector).append('<option id=' + result['name'] + '>' + result['name'] + '</option>');
|
31
|
+
}
|
32
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ForemanXen
|
2
|
+
class CacheController < ::ApplicationController
|
3
|
+
before_action :load_compute_resource
|
4
|
+
|
5
|
+
# POST = foreman_xen/cache/refresh
|
6
|
+
def refresh
|
7
|
+
type = params[:type]
|
8
|
+
|
9
|
+
unless cache_attribute_whitelist.include?(type)
|
10
|
+
process_error(:error_msg => "Error refreshing cache. #{type} is not a white listed attribute")
|
11
|
+
end
|
12
|
+
|
13
|
+
unless @compute_resource.respond_to?("#{type}!")
|
14
|
+
process_error(:error_msg => "Error refreshing cache. Method '#{type}!' not found for compute resource" +
|
15
|
+
@compute_resource.name)
|
16
|
+
end
|
17
|
+
|
18
|
+
respond_to do |format|
|
19
|
+
format.json { render :json => @compute_resource.public_send("#{type}!") }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# List of methods to permit
|
26
|
+
def cache_attribute_whitelist
|
27
|
+
%w(networks hypervisors templates custom_templates builtin_templates storage_pools)
|
28
|
+
end
|
29
|
+
|
30
|
+
def load_compute_resource
|
31
|
+
@compute_resource = ComputeResource.find_by(id: params['compute_resource_id'])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -29,19 +29,7 @@ module XenComputeHelper
|
|
29
29
|
attribute_map = empty_attribute_map
|
30
30
|
if new_host?(new)
|
31
31
|
compute_attributes = compute_resource.compute_profile_attributes_for(params['host']['compute_profile_id'])
|
32
|
-
|
33
|
-
attribute_map[:volume_size] = compute_attributes['VBDs']['physical_size']
|
34
|
-
attribute_map[:volume_selected] = compute_attributes['VBDs']['sr_uuid']
|
35
|
-
end
|
36
|
-
if compute_attributes['VIFs']
|
37
|
-
attribute_map[:network_selected] = compute_attributes['VIFs']['print']
|
38
|
-
end
|
39
|
-
attribute_map[:template_selected_custom] = compute_attributes['custom_template_name']
|
40
|
-
attribute_map[:template_selected_builtin] = compute_attributes['builtin_template_name']
|
41
|
-
attribute_map[:cpu_count] = compute_attributes['vcpus_max']
|
42
|
-
attribute_map[:memory_min] = compute_attributes['memory_min']
|
43
|
-
attribute_map[:memory_max] = compute_attributes['memory_max']
|
44
|
-
attribute_map[:power_on] = compute_attributes['start']
|
32
|
+
attribute_map = filter_compute_attributes(attribute_map, compute_attributes)
|
45
33
|
elsif new
|
46
34
|
attribute_map[:cpu_count] = new.vcpus_max ? new.vcpus_max : nil
|
47
35
|
attribute_map[:memory_min] = new.memory_static_min ? new.memory_static_min : nil
|
@@ -68,19 +56,7 @@ module XenComputeHelper
|
|
68
56
|
compute_attributes = compute_resource.compute_profile_attributes_for(params['host']['compute_profile_id'])
|
69
57
|
end
|
70
58
|
if compute_attributes
|
71
|
-
|
72
|
-
attribute_map[:volume_size] = compute_attributes['VBDs']['physical_size']
|
73
|
-
attribute_map[:volume_selected] = compute_attributes['VBDs']['sr_uuid']
|
74
|
-
end
|
75
|
-
if compute_attributes['VIFs']
|
76
|
-
attribute_map[:network_selected] = compute_attributes['VIFs']['print']
|
77
|
-
end
|
78
|
-
attribute_map[:template_selected_custom] = compute_attributes['custom_template_name']
|
79
|
-
attribute_map[:template_selected_builtin] = compute_attributes['builtin_template_name']
|
80
|
-
attribute_map[:cpu_count] = compute_attributes['vcpus_max']
|
81
|
-
attribute_map[:memory_min] = compute_attributes['memory_min']
|
82
|
-
attribute_map[:memory_max] = compute_attributes['memory_max']
|
83
|
-
attribute_map[:power_on] = compute_attributes['start']
|
59
|
+
attribute_map = filter_compute_attributes(attribute_map, compute_attributes)
|
84
60
|
end
|
85
61
|
attribute_map
|
86
62
|
end
|
@@ -96,4 +72,59 @@ module XenComputeHelper
|
|
96
72
|
:memory_max => nil,
|
97
73
|
:power_on => nil }
|
98
74
|
end
|
75
|
+
|
76
|
+
def filter_compute_attributes(attribute_map, compute_attributes)
|
77
|
+
if compute_attributes['VBDs']
|
78
|
+
attribute_map[:volume_size] = compute_attributes['VBDs']['physical_size']
|
79
|
+
attribute_map[:volume_selected] = compute_attributes['VBDs']['sr_uuid']
|
80
|
+
end
|
81
|
+
if compute_attributes['VIFs']
|
82
|
+
attribute_map[:network_selected] = compute_attributes['VIFs']['print']
|
83
|
+
end
|
84
|
+
attribute_map[:template_selected_custom] = compute_attributes['custom_template_name']
|
85
|
+
attribute_map[:template_selected_builtin] = compute_attributes['builtin_template_name']
|
86
|
+
attribute_map[:cpu_count] = compute_attributes['vcpus_max']
|
87
|
+
attribute_map[:memory_min] = compute_attributes['memory_min']
|
88
|
+
attribute_map[:memory_max] = compute_attributes['memory_max']
|
89
|
+
attribute_map[:power_on] = compute_attributes['start']
|
90
|
+
attribute_map
|
91
|
+
end
|
92
|
+
|
93
|
+
def xen_builtin_template_map(compute_resource)
|
94
|
+
compute_resource.builtin_templates.map { |t| [t.name, t.name] }
|
95
|
+
end
|
96
|
+
|
97
|
+
def xen_custom_template_map(compute_resource)
|
98
|
+
compute_resource.custom_templates.map { |t| [t.name, t.name] }
|
99
|
+
end
|
100
|
+
|
101
|
+
def xen_storage_pool_map(compute_resource)
|
102
|
+
compute_resource.storage_pools.map { |item| [item[:display_name], item[:uuid]] }
|
103
|
+
end
|
104
|
+
|
105
|
+
def xen_hypervisor_map(compute_resource)
|
106
|
+
compute_resource.available_hypervisors!.map do |t|
|
107
|
+
[t.name + ' - ' + (
|
108
|
+
t.metrics.memory_free.to_f / t.metrics.memory_total.to_f * 100
|
109
|
+
).round(2).to_s + '% free mem', t.name]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def selectable_f_with_cache_invalidation(f, attr, array,
|
114
|
+
select_options = {}, html_options = {}, input_group_options = {})
|
115
|
+
unless html_options.key?('input_group_btn')
|
116
|
+
html_options[:input_group_btn] = link_to_function(
|
117
|
+
icon_text('refresh'),
|
118
|
+
"refreshCache(this, #{input_group_options[:callback]})",
|
119
|
+
:class => 'btn btn-primary',
|
120
|
+
:title => _(input_group_options[:title]),
|
121
|
+
:data => {
|
122
|
+
:url => input_group_options[:url],
|
123
|
+
:compute_resource_id => input_group_options[:computer_resource_id],
|
124
|
+
:attribute => input_group_options[:attribute]
|
125
|
+
}
|
126
|
+
)
|
127
|
+
end
|
128
|
+
selectable_f(f, attr, array, select_options, html_options)
|
129
|
+
end
|
99
130
|
end
|
@@ -60,12 +60,14 @@ module ForemanXen
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def available_hypervisors
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
63
|
+
read_from_cache('available_hypervisors', 'available_hypervisors!')
|
64
|
+
end
|
65
|
+
|
66
|
+
def available_hypervisors!
|
67
|
+
store_in_cache('available_hypervisors') do
|
68
|
+
hosts = client.hosts
|
69
|
+
hosts.sort_by(&:name)
|
67
70
|
end
|
68
|
-
tmps.sort_by(&:name)
|
69
71
|
end
|
70
72
|
|
71
73
|
def new_nic(attr = {})
|
@@ -77,38 +79,34 @@ module ForemanXen
|
|
77
79
|
end
|
78
80
|
|
79
81
|
def storage_pools
|
80
|
-
|
81
|
-
|
82
|
-
storages = begin
|
83
|
-
client.storage_repositories.select { |sr| sr.type != 'udev' && sr.type != 'iso' }
|
84
|
-
rescue
|
85
|
-
[]
|
86
|
-
end
|
87
|
-
hosts = client.hosts
|
88
|
-
|
89
|
-
storages.each do |sr|
|
90
|
-
subresults = {}
|
91
|
-
found = 0
|
92
|
-
|
93
|
-
hosts.each do |host|
|
94
|
-
next unless sr.reference == host.suspend_image_sr
|
95
|
-
found = 1
|
96
|
-
subresults[:name] = sr.name
|
97
|
-
subresults[:display_name] = sr.name + '(' + host.hostname + ')'
|
98
|
-
subresults[:uuid] = sr.uuid
|
99
|
-
break
|
100
|
-
end
|
82
|
+
read_from_cache('storage_pools', 'storage_pools!')
|
83
|
+
end
|
101
84
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
85
|
+
def storage_pools!
|
86
|
+
store_in_cache('storage_pools') do
|
87
|
+
results = []
|
88
|
+
storages = client.storage_repositories.select { |sr| sr.type != 'udev' && sr.type != 'iso' }
|
89
|
+
storages.each do |sr|
|
90
|
+
subresults = {}
|
91
|
+
found = false
|
92
|
+
|
93
|
+
available_hypervisors.each do |host|
|
94
|
+
next unless sr.reference == host.suspend_image_sr
|
95
|
+
found = true
|
96
|
+
subresults[:name] = sr.name
|
97
|
+
subresults[:display_name] = sr.name + '(' + host.hostname + ')'
|
98
|
+
subresults[:uuid] = sr.uuid
|
99
|
+
break
|
100
|
+
end
|
101
|
+
unless found
|
102
|
+
subresults[:name] = sr.name
|
103
|
+
subresults[:display_name] = sr.name
|
104
|
+
subresults[:uuid] = sr.uuid
|
105
|
+
end
|
106
|
+
results.push(subresults)
|
106
107
|
end
|
107
|
-
results.
|
108
|
+
results.sort_by! { |item| item[:display_name] }
|
108
109
|
end
|
109
|
-
|
110
|
-
results.sort_by! { |item| item[:display_name] }
|
111
|
-
results
|
112
110
|
end
|
113
111
|
|
114
112
|
def interfaces
|
@@ -118,36 +116,43 @@ module ForemanXen
|
|
118
116
|
end
|
119
117
|
|
120
118
|
def networks
|
121
|
-
networks
|
122
|
-
|
123
|
-
|
124
|
-
|
119
|
+
read_from_cache('networks', 'networks!')
|
120
|
+
end
|
121
|
+
|
122
|
+
def networks!
|
123
|
+
store_in_cache('networks') do
|
124
|
+
client.networks.sort_by(&:name)
|
125
125
|
end
|
126
|
-
networks.sort_by(&:name)
|
127
126
|
end
|
128
127
|
|
129
128
|
def templates
|
130
|
-
|
131
|
-
|
132
|
-
|
129
|
+
read_from_cache('templates', 'templates!')
|
130
|
+
end
|
131
|
+
|
132
|
+
def templates!
|
133
|
+
store_in_cache('templates') do
|
134
|
+
client.servers.templates.sort_by(&:name)
|
135
|
+
end
|
133
136
|
end
|
134
137
|
|
135
138
|
def custom_templates
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
139
|
+
read_from_cache('custom_templates', 'custom_templates!')
|
140
|
+
end
|
141
|
+
|
142
|
+
def custom_templates!
|
143
|
+
store_in_cache('custom_templates') do
|
144
|
+
get_templates(client.servers.custom_templates)
|
140
145
|
end
|
141
|
-
tmps.sort_by(&:name)
|
142
146
|
end
|
143
147
|
|
144
148
|
def builtin_templates
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
+
read_from_cache('builtin_templates', 'builtin_templates!')
|
150
|
+
end
|
151
|
+
|
152
|
+
def builtin_templates!
|
153
|
+
store_in_cache('builtin_templates') do
|
154
|
+
get_templates(client.servers.builtin_templates)
|
149
155
|
end
|
150
|
-
tmps.sort_by(&:name)
|
151
156
|
end
|
152
157
|
|
153
158
|
def associated_host(vm)
|
@@ -219,20 +224,15 @@ module ForemanXen
|
|
219
224
|
mem_max = args[:memory_max]
|
220
225
|
mem_min = args[:memory_min]
|
221
226
|
|
222
|
-
host =
|
223
|
-
client.hosts.find { |host| host.name == args[:hypervisor_host] }
|
224
|
-
else
|
225
|
-
client.hosts.first
|
226
|
-
end
|
227
|
+
host = get_hypervisor_host(args)
|
227
228
|
|
228
229
|
logger.info "create_vm_from_builtin: host : #{host.name}"
|
229
230
|
|
230
231
|
raise 'Memory max cannot be lower than Memory min' if mem_min.to_i > mem_max.to_i
|
231
|
-
vm = client.servers.new :name => args[:name],
|
232
|
-
:affinity => host,
|
233
|
-
:template_name => args[:custom_template_name]
|
234
232
|
|
235
|
-
|
233
|
+
template = client.custom_templates.select { |t| t.name == args[:custom_template_name] }.first
|
234
|
+
vm = template.clone args[:name]
|
235
|
+
vm.affinity = host
|
236
236
|
|
237
237
|
vm.provision
|
238
238
|
|
@@ -274,11 +274,7 @@ module ForemanXen
|
|
274
274
|
mem_max = args[:memory_max]
|
275
275
|
mem_min = args[:memory_min]
|
276
276
|
|
277
|
-
host =
|
278
|
-
client.hosts.find { |host| host.name == args[:hypervisor_host] }
|
279
|
-
else
|
280
|
-
client.hosts.first
|
281
|
-
end
|
277
|
+
host = get_hypervisor_host(args)
|
282
278
|
|
283
279
|
logger.info "create_vm_from_builtin: host : #{host.name}"
|
284
280
|
|
@@ -317,6 +313,23 @@ module ForemanXen
|
|
317
313
|
|
318
314
|
create_network(vm, args)
|
319
315
|
|
316
|
+
if args[:xstools] == '1'
|
317
|
+
# Add xs-tools ISO to newly created VMs
|
318
|
+
dvd_vdi = client.vdis.find { |isovdi| isovdi.name == 'xs-tools.iso' }
|
319
|
+
vbdconnectcd = {
|
320
|
+
'vdi' => dvd_vdi,
|
321
|
+
'vm' => vm.reference,
|
322
|
+
'userdevice' => '1',
|
323
|
+
'mode' => 'RO',
|
324
|
+
'type' => 'cd',
|
325
|
+
'other_config' => {},
|
326
|
+
'qos_algorithm_type' => '',
|
327
|
+
'qos_algorithm_params' => {}
|
328
|
+
}
|
329
|
+
vm.vbds = client.vbds.create vbdconnectcd
|
330
|
+
vm.reload
|
331
|
+
end
|
332
|
+
|
320
333
|
vm.provision
|
321
334
|
vm.set_attribute('HVM_boot_policy', 'BIOS order')
|
322
335
|
vm.reload
|
@@ -403,5 +416,30 @@ module ForemanXen
|
|
403
416
|
end
|
404
417
|
out_hash
|
405
418
|
end
|
419
|
+
|
420
|
+
def get_templates(templates)
|
421
|
+
tmps = templates.select { |t| !t.is_a_snapshot }
|
422
|
+
tmps.sort_by(&:name)
|
423
|
+
end
|
424
|
+
|
425
|
+
def get_hypervisor_host(args)
|
426
|
+
return client.hosts.first unless args[:hypervisor_host] != ''
|
427
|
+
client.hosts.find { |host| host.name == args[:hypervisor_host] }
|
428
|
+
end
|
429
|
+
|
430
|
+
def read_from_cache(key, fallback)
|
431
|
+
value = Rails.cache.fetch(cache_key + key) { public_send(fallback) }
|
432
|
+
value
|
433
|
+
end
|
434
|
+
|
435
|
+
def store_in_cache(key)
|
436
|
+
value = yield
|
437
|
+
Rails.cache.write(cache_key + key, value)
|
438
|
+
value
|
439
|
+
end
|
440
|
+
|
441
|
+
def cache_key
|
442
|
+
"computeresource_#{id}/"
|
443
|
+
end
|
406
444
|
end
|
407
445
|
end
|
@@ -1,5 +1,12 @@
|
|
1
1
|
<div id='templates' class=''>
|
2
2
|
<div class="form-group">
|
3
|
-
<%= selectable_f f, :hypervisor_host,
|
3
|
+
<%= selectable_f f, :hypervisor_host,
|
4
|
+
[[_("Automatic allocation"), ""]] + xen_hypervisor_map(compute_resource),
|
5
|
+
{},
|
6
|
+
{ :class => 'form-control span2',
|
7
|
+
:disabled => (controller_name != 'hosts'),
|
8
|
+
:label => 'Hypervisor'
|
9
|
+
}
|
10
|
+
%>
|
4
11
|
</div>
|
5
12
|
</div>
|
@@ -1,12 +1,20 @@
|
|
1
1
|
<div class="fields">
|
2
|
-
<%
|
3
|
-
nat = compute_resource.networks
|
4
|
-
-%>
|
5
|
-
|
6
2
|
<div id='nat' class=''>
|
7
|
-
<%=
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
<%= selectable_f_with_cache_invalidation f, :print,
|
4
|
+
compute_resource.networks.map(&:name),
|
5
|
+
{ :include_blank => compute_resource.networks.any? ? false : _('No networks'),
|
6
|
+
:selected => attribute_map[:network_selected]
|
7
|
+
},
|
8
|
+
{ :class => 'span2',
|
9
|
+
:label => _('Network')
|
10
|
+
},
|
11
|
+
{
|
12
|
+
:callback => 'xenPopulateNetworks',
|
13
|
+
:title => 'Refresh available networks',
|
14
|
+
:url => '/foreman_xen/cache/refresh',
|
15
|
+
:computer_resource_id => compute_resource.id,
|
16
|
+
:attribute => 'networks'
|
17
|
+
}
|
18
|
+
%>
|
11
19
|
</div>
|
12
20
|
</div>
|
@@ -1,11 +1,39 @@
|
|
1
1
|
<div class="fields">
|
2
2
|
<div id='templates' class=''>
|
3
3
|
<div class="form-group">
|
4
|
-
<%=
|
4
|
+
<%= selectable_f_with_cache_invalidation f,
|
5
|
+
:custom_template_name,
|
6
|
+
[[_("No template"), ""]] + xen_custom_template_map(compute_resource),
|
7
|
+
{ :selected => attribute_map[:template_selected_custom] },
|
8
|
+
{ :class => 'form-control span2',
|
9
|
+
:label => 'Custom Template'
|
10
|
+
},
|
11
|
+
{
|
12
|
+
:callback => 'xenPopulateCustomTemplates',
|
13
|
+
:title => 'Refresh available custom templates',
|
14
|
+
:url => '/foreman_xen/cache/refresh',
|
15
|
+
:computer_resource_id => compute_resource.id,
|
16
|
+
:attribute => 'custom_templates'
|
17
|
+
}
|
18
|
+
%>
|
5
19
|
</div>
|
6
20
|
|
7
21
|
<div class="form-group ">
|
8
|
-
<%=
|
22
|
+
<%= selectable_f_with_cache_invalidation f,
|
23
|
+
:builtin_template_name,
|
24
|
+
[[_("No template"), ""]] + xen_builtin_template_map(compute_resource),
|
25
|
+
{ :selected => attribute_map[:template_selected_builtin] },
|
26
|
+
{ :class => 'form-control span2',
|
27
|
+
:label => 'Builtin Template'
|
28
|
+
},
|
29
|
+
{
|
30
|
+
:callback => 'xenPopulateBuiltinTemplates',
|
31
|
+
:title => 'Refresh available builtin templates',
|
32
|
+
:url => '/foreman_xen/cache/refresh',
|
33
|
+
:computer_resource_id => compute_resource.id,
|
34
|
+
:attribute => 'builtin_templates'
|
35
|
+
}
|
36
|
+
%>
|
9
37
|
</div>
|
10
38
|
</div>
|
11
|
-
</div>
|
39
|
+
</div>
|
@@ -1,6 +1,18 @@
|
|
1
1
|
<div class="fields">
|
2
|
-
|
3
|
-
|
2
|
+
<%= selectable_f_with_cache_invalidation f, :sr_uuid,
|
3
|
+
xen_storage_pool_map(compute_resource),
|
4
|
+
{ :selected => attribute_map[:volume_selected] },
|
5
|
+
{ :class => "span2",
|
6
|
+
:label => _("Storage Repository"),
|
7
|
+
},
|
8
|
+
{
|
9
|
+
:callback => 'xenPopulateStoragePools',
|
10
|
+
:title => 'Refresh available storage repositories',
|
11
|
+
:url => '/foreman_xen/cache/refresh',
|
12
|
+
:computer_resource_id => compute_resource.id,
|
13
|
+
:attribute => 'storage_pools'
|
14
|
+
}
|
15
|
+
%>
|
4
16
|
|
5
17
|
<%= text_f f, :physical_size, :class => "input-mini", :label => _("Size (GB)"), :value => attribute_map[:volume_size] %>
|
6
18
|
</div>
|
@@ -53,6 +53,7 @@
|
|
53
53
|
<%= render 'compute_resources_vms/form/volume', :f => i, :compute_resource => compute_resource, :new => new, :attribute_map => attribute_map %>
|
54
54
|
<% end -%>
|
55
55
|
<% end -%>
|
56
|
+
<%= checkbox_f f, :xstools, :checked => false, :label => _('Insert XS Tools ISO Drive') %>
|
56
57
|
</div>
|
57
58
|
|
58
59
|
<!-- Network -->
|
@@ -190,3 +191,6 @@
|
|
190
191
|
}
|
191
192
|
})
|
192
193
|
</script>
|
194
|
+
|
195
|
+
<%= compute_specific_js(compute_resource, 'cache_refresh') %>
|
196
|
+
<%= compute_specific_js(compute_resource, 'populate_fields') %>
|
data/config/routes.rb
CHANGED
data/lib/foreman_xen/engine.rb
CHANGED
@@ -22,6 +22,21 @@ module ForemanXen
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
assets_to_precompile =
|
26
|
+
Dir.chdir(root) do
|
27
|
+
Dir['app/assets/javascripts/**/*', 'app/assets/stylesheets/**/*'].map do |f|
|
28
|
+
f.split(File::SEPARATOR, 4).last
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
initializer 'foreman_xen.assets.precompile' do |app|
|
33
|
+
app.config.assets.precompile += assets_to_precompile
|
34
|
+
end
|
35
|
+
|
36
|
+
initializer 'foreman_xen.configure_assets', group: :assets do
|
37
|
+
SETTINGS[:foreman_xen] = { assets: { precompile: assets_to_precompile } }
|
38
|
+
end
|
39
|
+
|
25
40
|
config.to_prepare do
|
26
41
|
begin
|
27
42
|
# extend fog xen server and image models.
|
data/lib/foreman_xen/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_xen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Nemirovsky
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2017-03-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: fog-xenserver
|
@@ -50,6 +50,9 @@ files:
|
|
50
50
|
- LICENSE
|
51
51
|
- README.md
|
52
52
|
- Rakefile
|
53
|
+
- app/assets/javascripts/compute_resources/xenserver/cache_refresh.js
|
54
|
+
- app/assets/javascripts/compute_resources/xenserver/populate_fields.js
|
55
|
+
- app/controllers/foreman_xen/cache_controller.rb
|
53
56
|
- app/controllers/foreman_xen/snapshots_controller.rb
|
54
57
|
- app/helpers/xen_compute_helper.rb
|
55
58
|
- app/models/concerns/fog_extensions/xenserver/server.rb
|