foreman_xen 0.7.1 → 1.0.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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -1
  3. data/app/assets/javascripts/foreman_xen/xenserver/cache_refresh.js +31 -18
  4. data/app/controllers/foreman_xen/cache_controller.rb +8 -5
  5. data/app/helpers/xen_compute_helper.rb +8 -103
  6. data/app/models/concerns/fog_extensions/xenserver/host.rb +23 -0
  7. data/app/models/concerns/fog_extensions/xenserver/server.rb +21 -3
  8. data/app/models/concerns/fog_extensions/xenserver/storage_repository.rb +45 -0
  9. data/app/models/concerns/fog_extensions/xenserver/vdi.rb +11 -0
  10. data/app/models/concerns/foreman_xen/host_extensions.rb +17 -0
  11. data/app/models/foreman_xen/xenserver.rb +395 -172
  12. data/app/views/api/v1/compute_resources/xenserver.json.rabl +1 -1
  13. data/app/views/api/v2/compute_resources/xenserver.json.rabl +1 -1
  14. data/app/views/compute_resources/form/_xenserver.html.erb +2 -4
  15. data/app/views/compute_resources_vms/form/_hypervisors.html.erb +15 -11
  16. data/app/views/compute_resources_vms/form/_image_provisioning.html.erb +49 -0
  17. data/app/views/compute_resources_vms/form/_isos.html.erb +15 -0
  18. data/app/views/compute_resources_vms/form/_network_provisioning.html.erb +26 -0
  19. data/app/views/compute_resources_vms/form/_profile.html.erb +5 -0
  20. data/app/views/compute_resources_vms/form/_templates.html.erb +13 -34
  21. data/app/views/compute_resources_vms/form/xenserver/_base.html.erb +22 -178
  22. data/app/views/compute_resources_vms/form/xenserver/_network.html.erb +23 -0
  23. data/app/views/compute_resources_vms/form/xenserver/_volume.html.erb +15 -0
  24. data/app/views/compute_resources_vms/index/_xenserver.html.erb +1 -1
  25. data/app/views/images/form/_xenserver.html.erb +4 -0
  26. data/lib/foreman_xen/engine.rb +14 -3
  27. data/lib/foreman_xen/version.rb +1 -1
  28. data/test/test_helper.rb +1 -3
  29. metadata +14 -7
  30. data/app/assets/javascripts/foreman_xen/xenserver/populate_fields.js +0 -32
  31. data/app/views/compute_resources_vms/form/_network.html.erb +0 -20
  32. data/app/views/compute_resources_vms/form/_volume.html.erb +0 -18
  33. data/app/views/compute_resources_vms/form/_xenstore.html.erb +0 -119
@@ -1 +1 @@
1
- attributes :user
1
+ attributes :user, :iso_library_mountpoint
@@ -1 +1 @@
1
- attributes :user
1
+ attributes :user, :iso_library_mountpoint
@@ -1,11 +1,9 @@
1
1
  <%= text_f f, :url, :class => "input-xlarge", :help_block => _("e.g. x.x.x.x") %>
2
2
  <%= text_f f, :user %>
3
3
  <%= password_f f, :password %>
4
-
4
+ <%= text_f f, :iso_library_mountpoint %>
5
5
  <% hypervisor = f.object.hypervisor.uuid rescue nil %>
6
6
  <% if hypervisor -%>
7
7
  <%= f.hidden_field :uuid, :value => hypervisor %>
8
8
  <% end -%>
9
- <%= link_to_function _("Test Connection"), "testConnection(this)", :class => "btn + #{hypervisor.nil? ? "btn-default" : "btn-success"}", :'data-url' => test_connection_compute_resources_path %>
10
-
11
- <%= hidden_spinner('', :id => 'test_connection_indicator') %>
9
+ <%= test_connection_button_f(f, !hypervisor.nil?) %>
@@ -1,12 +1,16 @@
1
- <div id='templates' class=''>
2
- <div class="form-group">
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
- %>
11
- </div>
1
+ <div id='hypervisor_selection'>
2
+ <%= selectable_f_with_cache_invalidation(f, :hypervisor_host,
3
+ options_from_collection_for_select(
4
+ compute_resource.available_hypervisors, :uuid, :display_name
5
+ ),
6
+ { include_blank: 'Automatic allocation' },
7
+ { class: "span2",
8
+ disabled: (controller_name != 'hosts'),
9
+ label: _("Hypervisor"), },
10
+ { title: 'Refresh available hypervisors',
11
+ url: url_for(controller: "foreman_xen/cache",
12
+ action: "refresh", only_path: true),
13
+ compute_resource_id: compute_resource.id,
14
+ attribute: 'available_hypervisors' }
15
+ ) %>
12
16
  </div>
@@ -0,0 +1,49 @@
1
+ <div class="image_fields" style="display:none">
2
+ <div id='image_selection'>
3
+ <%= select_f f, :image_id, images, :uuid, :name,
4
+ { :include_blank => (images.empty? || images.size == 1) ? false : _('Please select an image') },
5
+ { :disabled => images.empty?, :label => _('Image'), :label_size => "col-md-2" } %>
6
+ </div>
7
+ <div id="target_sr_selection">
8
+ <%= selectable_f_with_cache_invalidation(f, :target_sr,
9
+ options_from_collection_for_select(
10
+ compute_resource.storage_pools, :uuid, :display_name
11
+ ),
12
+ {},
13
+ { class: "span2",
14
+ label: _("Target Repository"), },
15
+ { title: 'Refresh available storage repositories',
16
+ url: url_for(controller: "foreman_xen/cache",
17
+ action: "refresh", only_path: true),
18
+ compute_resource_id: compute_resource.id,
19
+ attribute: 'storage_pools' }
20
+ ) %>
21
+ </div>
22
+
23
+ <% if compute_resource.iso_library_mountpoint %>
24
+
25
+ <div id="configdrive">
26
+ <%= checkbox_f(f, :configdrive,
27
+ { checked: true, label: _('Metadata ISO'),
28
+ help_inline: 'Attach cloud-init compatible configdrive' }
29
+ )%>
30
+ </div>
31
+ <%= javascript_tag("
32
+ $(document).on('change', '#host_provision_method_image', function(){
33
+ if ($('#host_provision_method_image').is(':checked')) {
34
+ $('#configdrive').appendTo($('#image_provisioning'));
35
+ $('#configdrive').show();
36
+ }
37
+ });
38
+ ") %>
39
+
40
+ <%end%>
41
+ </div>
42
+ <%= javascript_tag("
43
+ $(document).on('change', '#host_provision_method_image', function(){
44
+ if ($('#host_provision_method_image').is(':checked')) {
45
+ $('#target_sr_selection').appendTo($('#image_provisioning'));
46
+ $('#target_sr_selection').show();
47
+ }
48
+ });
49
+ "); %>
@@ -0,0 +1,15 @@
1
+ <div id="iso_selection">
2
+ <%= selectable_f_with_cache_invalidation(f, :iso,
3
+ options_from_collection_for_select(
4
+ compute_resource.isos, :uuid, :name, compute_attributes.dig(:iso)
5
+ ),
6
+ { prompt: 'Select ISO to attach' },
7
+ { class: "span2",
8
+ label: _('Attach ISO'), },
9
+ { title: 'Refresh available storage repositories',
10
+ url: url_for(controller: "foreman_xen/cache",
11
+ action: "refresh", only_path: true),
12
+ compute_resource_id: compute_resource.id,
13
+ attribute: 'isos' }
14
+ ) %>
15
+ </div>
@@ -0,0 +1,26 @@
1
+ <!-- VM Template -->
2
+ <div class="network_fields" style="display:none">
3
+ <div id="vm_template_selection">
4
+ <%= selectable_f_with_cache_invalidation(f, :builtin_template,
5
+ options_from_collection_for_select(
6
+ compute_resource.builtin_templates, :uuid, :name
7
+ ),
8
+ { selected: nil, #TODO
9
+ prompt: 'No Template'},
10
+ { class: 'span2', label: 'VM Template' },
11
+ { title: 'Refresh available builtin templates',
12
+ url: url_for(controller: "foreman_xen/cache",
13
+ action: "refresh", only_path: true),
14
+ compute_resource_id: compute_resource.id,
15
+ attribute: 'builtin_templates' }
16
+ ) %>
17
+ </div>
18
+ </div>
19
+ <%= javascript_tag("
20
+ $(document).ready(function(){
21
+ if (!$('#network_provisioning').has('#vm_template_selection').length) {
22
+ $('#vm_template_selection').appendTo($('#network_provisioning'));
23
+ $('#vm_template_selection').show();
24
+ }
25
+ });
26
+ ") %>
@@ -0,0 +1,5 @@
1
+ <div class="fields">
2
+ <%= counter_f f, :vcpus_max, :label => _('vCPUs'), :label_size => 'col-md-2', :'data-soft-max' => compute_resource.max_cpu_count %>
3
+ <%= byte_size_f f, :memory_min, :label => _('Memory Min'), :label_size => "col-md-2", :'data-soft-max' => compute_resource.max_memory %>
4
+ <%= byte_size_f f, :memory_max, :label => _('Memory Max'), :label_size => "col-md-2", :'data-soft-max' => compute_resource.max_memory %>
5
+ </div>
@@ -1,39 +1,18 @@
1
1
  <div class="fields">
2
- <div id='templates' class=''>
3
- <div class="form-group">
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
- %>
19
- </div>
20
-
2
+ <div id='templates'>
21
3
  <div class="form-group ">
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
- %>
4
+ <%= selectable_f_with_cache_invalidation(f, :builtin_template,
5
+ options_from_collection_for_select(
6
+ compute_resource.builtin_templates, :uuid, :name
7
+ ),
8
+ { prompt: 'Select a Template'},
9
+ { class: 'span2', label: 'Builtin Template' },
10
+ { title: 'Refresh available builtin templates',
11
+ url: url_for(controller: "foreman_xen/cache",
12
+ action: "refresh", only_path: true),
13
+ compute_resource_id: compute_resource.id,
14
+ attribute: 'builtin_templates' }
15
+ ) %>
37
16
  </div>
38
17
  </div>
39
18
  </div>
@@ -1,196 +1,40 @@
1
- <% new = f.object
2
- attribute_map = compute_attribute_map(params, compute_resource, new)
3
-
4
- hide_raw = ''
5
- if params && params['host'] && params['host']['compute_attributes'] && params['host']['compute_attributes']['custom_template_name'] != ''
6
- hide_raw = 'display:none;'
7
- end
8
-
9
- if controller_name == 'hosts'
10
- fields_enabled = true
11
- start_enable = true
12
- elsif controller_name == 'compute_attributes'
13
- fields_enabled = true
14
- compute_attributes = compute_resource.compute_profile_attributes_for(params['compute_profile_id'])
15
- name = compute_attributes['name']
16
- else
17
- fields_enabled = false
18
- end
19
-
20
- -%>
1
+ <% compute_attributes = compute_attributes_from_params(compute_resource) -%>
2
+ <%= javascript_include_tag 'foreman_xen/xenserver/cache_refresh' %>
21
3
  <%= javascript_tag("$(document).on('ContentLoad', tfm.numFields.initAll)"); %>
22
- <!-- VM Initial Settings -->
23
- <div class="children_fields">
24
- <fieldset id="vm_profile">
25
- <legend>VM Profile</legend>
26
- <div class="fields">
27
- <!--<%= text_f f, :name, :disabled => !fields_enabled, :value => name, :label => 'Name' if controller_name != 'hosts' %>-->
28
- <%= counter_f f, :vcpus_max, :disabled => !fields_enabled, :label => _('vCPUs'), :label_size => 'col-md-2', :'data-soft-max' => compute_resource.max_cpu_count %>
29
- <%= byte_size_f f, :memory_min, :disabled => !fields_enabled, :label => _('Memory Min'), :label_size => "col-md-2", :'data-soft-max' => compute_resource.max_memory %>
30
- <%= byte_size_f f, :memory_max, :disabled => !fields_enabled, :label => _('Memory Max'), :label_size => "col-md-2", :'data-soft-max' => compute_resource.max_memory %>
31
- </div>
32
- </fieldset>
33
- </div>
34
4
 
35
- <!-- Templates -->
5
+ <!-- VM Profile -->
36
6
  <div class="children_fields">
37
- <%= field_set_tag 'VM Template', :id => 'xen_templates', :title => _('Template') do -%>
38
- <%= render 'compute_resources_vms/form/templates', :f => f, :compute_resource => compute_resource, :new => new, :attribute_map => attribute_map %>
39
- <% end -%>
40
- </div>
41
-
42
- <!-- XenStore Data -->
43
- <div class="children_fields" id="xenserver-xenstore-data">
44
- <%= field_set_tag 'Xen Store Data', :id => 'xen_store_data', :title => _('Xen Store Data') do -%>
45
- <%= render 'compute_resources_vms/form/xenstore', :f => f, :compute_resource => compute_resource, :new => new, :attribute_map => attribute_map %>
46
- <% end %>
47
- </div>
48
-
49
- <!-- Storage -->
50
- <div class="children_fields xenserver-raw" id="xenserver-storage" style="<%= hide_raw %>">
51
- <%= field_set_tag 'Storage', :id => 'storage_volumes', :title => _('Storage') do -%>
52
- <%= f.fields_for :VBDs do |i| %>
53
- <%= render 'compute_resources_vms/form/volume', :f => i, :compute_resource => compute_resource, :new => new, :attribute_map => attribute_map %>
54
- <% end -%>
7
+ <%= field_set_tag 'VM Profile', :id => 'vm_profile', :title => _('VM Profile') do -%>
8
+ <%= render 'compute_resources_vms/form/profile', :f => f, :compute_resource => compute_resource %>
55
9
  <% end -%>
56
- <%= checkbox_f f, :xstools, :checked => false, :label => _('Insert XS Tools ISO Drive') %>
57
10
  </div>
58
11
 
59
- <!-- Network -->
60
- <div class="children_fields" id="xenserver-network" style="<%= hide_raw %>">
61
- <%= field_set_tag 'Network interfaces', :id => 'network_interfaces', :title => _('Networks') do -%>
62
- <%= f.fields_for :VIFs do |i| %>
63
- <%= render 'compute_resources_vms/form/network', :f => i, :compute_resource => compute_resource, :new => new, :attribute_map => attribute_map %>
64
- <% end -%>
12
+ <!-- ISOs -->
13
+ <div class="children_fields">
14
+ <%= field_set_tag 'Attach ISO', :id => 'xen_isos', :title => _('ISOs') do -%>
15
+ <%= render 'compute_resources_vms/form/isos', :f => f, :compute_resource => compute_resource, compute_attributes: compute_attributes %>
65
16
  <% end -%>
66
17
  </div>
67
18
 
68
- <div class="children_fields" id="xenserver-hosts" style="<%= hide_raw %>">
19
+ <!-- Hypervisor -->
20
+ <div class="children_fields" id="xenserver-hosts">
69
21
  <%= field_set_tag 'Start on server', :id => 'xen_hypervisors', :title => _('Start on server') do -%>
70
- <%= render 'compute_resources_vms/form/hypervisors', :f => f, :compute_resource => compute_resource, :new => new, :attribute_map => attribute_map %>
22
+ <%= render 'compute_resources_vms/form/hypervisors', :f => f, :compute_resource => compute_resource %>
71
23
  <% end -%>
72
24
  </div>
73
25
 
74
26
  <!-- Startup -->
75
- <div class="children_fields" id="xenserver-vm-start" style="<%= hide_raw %>">
27
+ <% start_checked = compute_attributes.dig(:start) == '0' ? false : true -%>
28
+ <div class="children_fields" id="xenserver-vm-start">
76
29
  <%= field_set_tag 'VM Startup Options', :id => 'vm_startup_options', :title => _('Power ON VM') do -%>
77
- <%= checkbox_f f, :start, :checked => (attribute_map[:power_on] == '1' || start_enable), :label => _("Power ON VM") %>
30
+ <%= checkbox_f f, :start, :checked => start_checked, :label => _("Power ON VM") %>
78
31
  <% end -%>
79
32
  </div>
80
33
 
81
- <script type="text/javascript">
82
-
83
- // Check if its a computer resource template then just do not show the form of XenStore
84
- if ($("#compute_attribute_compute_profile_id").length > 0) {
85
- $('#xenserver-xenstore-data').hide(1)
86
- }
87
-
88
- // Check if custom template in use then do now show SR settings
89
- if ($("#compute_attribute_vm_attrs_builtin_template_name").val() == "" && $("#compute_attribute_vm_attrs_custom_template_name").val() != "") {
90
- $('.xenserver-raw').hide(1);
91
- }
92
-
93
- // Check which template are in use
94
- if ($("#compute_attribute_vm_attrs_builtin_template_name").val() != "") {
95
- $('#compute_attribute_vm_attrs_custom_template_name').val($("#compute_attribute_vm_attrs_custom_template_name option:contains('No template')").val());
96
- // IE and Chrome
97
- $('#compute_attribute_vm_attrs_custom_template_name').attr("disabled", 'disabled');
98
- $('.custom_template_name').prop("disabled", true);
99
- }
100
-
101
- if ($("#compute_attribute_vm_attrs_custom_template_name").val() != "") {
102
- $('#compute_attribute_vm_attrs_builtin_template_name').val($("#compute_attribute_vm_attrs_custom_template_name option:contains('No template')").val());
103
- // IE and Chrome
104
- $('#compute_attribute_vm_attrs_builtin_template_name').attr("disabled", 'disabled');
105
- $('.builtin_templates').prop("disabled", true);
106
- }
107
-
108
- // Computer Profile Templates
109
- $(document).off('change.xenserver', '#compute_attribute_vm_attrs_custom_template_name');
110
- $(document).on('change.xenserver', '#compute_attribute_vm_attrs_custom_template_name', function (data) {
111
- if ($('option:selected', data.target).val() == "") {
112
- $('.xenserver-raw').show(1000);
113
- // IE and Chrome
114
- $('.builtin_templates').prop("disabled", false);
115
- $('#compute_attribute_vm_attrs_builtin_template_name').removeAttr('disabled');
116
- } else {
117
- $('.xenserver-raw').hide(1000);
118
- $('#compute_attribute_vm_attrs_builtin_template_name').val($("#compute_attribute_vm_attrs_builtin_template_name option:contains('No template')").val());
119
- // IE and Chrome
120
- $('#compute_attribute_vm_attrs_builtin_template_name').attr("disabled", 'disabled');
121
- $('.builtin_templates').prop("disabled", true);
122
-
123
- }
124
-
125
- });
126
-
127
- $(document).off('change.xenserver', '#compute_attribute_vm_attrs_builtin_template_name');
128
- $(document).on('change.xenserver', '#compute_attribute_vm_attrs_builtin_template_name', function (data) {
129
- if ($('option:selected', data.target).val() == "") {
130
- // IE and Chrome
131
- $('.builtin_templates').prop("disabled", false);
132
- $('#compute_attribute_vm_attrs_custom_template_name').removeAttr('disabled');
133
- } else {
134
- $('#compute_attribute_vm_attrs_custom_template_name').val($("#compute_attribute_vm_attrs_custom_template_name option:contains('No template')").val());
135
- // IE and Chrome
136
- $('#compute_attribute_vm_attrs_custom_template_name').attr("disabled", 'disabled');
137
- $('.custom_template_name').prop("disabled", true);
138
-
139
- }
140
-
141
- });
142
-
143
-
144
- // Host Profile Forms
145
-
146
- // Check which template are in use
147
- if ($("#host_compute_attributes_custom_template_name").val() != "") {
148
- $('#host_compute_attributes_builtin_template_name').val($("#host_compute_attributes_builtin_template_name option:contains('No template')").val());
149
- // IE and Chrome
150
- $('#host_compute_attributes_builtin_template_name').attr("disabled", 'disabled');
151
- $('.builtin_templates').prop("disabled", true);
152
- }
153
-
154
- if ($("#host_compute_attributes_builtin_template_name").val() != "") {
155
- $('#host_compute_attributes_custom_template_name').val($("#host_compute_attributes_custom_template_name option:contains('No template')").val());
156
- // IE and Chrome
157
- $('#host_compute_attributes_custom_template_name').attr("disabled", 'disabled');
158
- $('.custom_template_name').prop("disabled", true);
159
- }
160
-
161
- $(document).off('change.xenserver', '#host_compute_attributes_custom_template_name');
162
- $(document).on('change.xenserver', '#host_compute_attributes_custom_template_name', function (data) {
163
- if ($('option:selected', data.target).val() == "") {
164
- $('.xenserver-raw').show(1000);
165
- // IE and Chrome
166
- $('.builtin_templates').prop("disabled", false);
167
- $('#host_compute_attributes_builtin_template_name').removeAttr('disabled');
168
- } else {
169
- $('.xenserver-raw').hide(1000);
170
- $('#host_compute_attributes_builtin_template_name').val($("#host_compute_attributes_builtin_template_name option:contains('No template')").val());
171
- // IE and Chrome
172
- $('#host_compute_attributes_builtin_template_name').attr("disabled", 'disabled');
173
- $('.builtin_templates').prop("disabled", true);
174
-
175
- }
176
-
177
- });
178
-
179
- $(document).off('change.xenserver', '#host_compute_attributes_builtin_template_name');
180
- $(document).on('change.xenserver', '#host_compute_attributes_builtin_template_name', function (data) {
181
- if ($('option:selected', data.target).val() == "") {
182
- // IE and Chrome
183
- $('.builtin_templates').prop("disabled", false);
184
- $('#host_compute_attributes_custom_template_name').removeAttr('disabled');
185
- } else {
186
- $('#host_compute_attributes_custom_template_name').val($("#host_compute_attributes_builtin_template_name option:contains('No template')").val());
187
- // IE and Chrome
188
- $('#host_compute_attributes_custom_template_name').attr("disabled", 'disabled');
189
- $('.custom_template_name').prop("disabled", true);
190
-
191
- }
192
- })
193
- </script>
194
-
195
- <%= compute_specific_js(compute_resource, 'foreman_xen/cache_refresh') %>
196
- <%= compute_specific_js(compute_resource, 'foreman_xen/populate_fields') %>
34
+ <!-- Provisioning -->
35
+ <%
36
+ arch ||= nil ; os ||= nil
37
+ images = possible_images(compute_resource, arch, os)
38
+ %>
39
+ <%= render 'compute_resources_vms/form/image_provisioning', f: f, compute_resource: compute_resource, images: images %>
40
+ <%= render 'compute_resources_vms/form/network_provisioning', f: f, compute_resource: compute_resource %>
@@ -0,0 +1,23 @@
1
+ <div class="fields">
2
+ <div id='xenserver_network'>
3
+ <%= selectable_f_with_cache_invalidation f, :network,
4
+ options_from_collection_for_select(
5
+ compute_resource.networks, :uuid, :name
6
+ ),
7
+ { include_blank: compute_resource.networks.any? ? false : _('No networks') },
8
+ { class: 'span2',
9
+ label: _('Network'),
10
+ label_size: 'col-md-3',
11
+ sizer: 'col-md-8',
12
+ disabled: (controller_name != 'hosts') },
13
+ { title: 'Refresh available networks',
14
+ url: url_for(controller: "foreman_xen/cache",
15
+ action: "refresh", only_path: true),
16
+ compute_resource_id: compute_resource.id,
17
+ attribute: 'networks' }
18
+ %>
19
+ </div>
20
+ </div>
21
+ <%= javascript_tag("
22
+ $(document).ready(function(){ $('#network_interfaces').hide(); });
23
+ ") if controller_name != 'hosts' %>