foreman_hyperv 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 095c817dd697a8c2bde70d4b2a4d4dad16eba039
4
- data.tar.gz: 59761e7d008a15a913ee8951678c8467a5ed85ec
3
+ metadata.gz: 710168316d53c6c4bb3276fa02faa45a28c602bb
4
+ data.tar.gz: 484471496d5c678718430e539639d4d6bc4b38d3
5
5
  SHA512:
6
- metadata.gz: 61ef39ff83c31aa3e9fd8b8a6c8151163b4eba692b8c54025c3ab0544e9c6b22990c44cdb5d71d7f3b81fe2ec5073def03354d513c0c8a6483ea3689724202f0
7
- data.tar.gz: 35cc0657a3474aacb7033550580478fd4285599e290147fb95713f57c8a918b9f4fce48a7977d14574d39a7f21f74637be7dbc8e432497752e816cf0658a3bd7
6
+ metadata.gz: 19eb7700b2fc5030f2d4c7711d31dd3c77d5445b5442ac66e199cf7da0cdcd01c91609240a911e59036696411436f2a59e5e7314a10afef8ffdffed436f03245
7
+ data.tar.gz: 3a03d174196f13b3e8967f25c1eb23fb524f12919ede792dc8000ab8c34d5e88bb632182a4529a7e73740fcf288ec7a71261b7bfcbff33ee5a70a1646bdcb190
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ ## v0.0.2 2017-09-30
2
+
3
+ - Add Dynamic memory settings
4
+ - Add JS for disabling unavailable settings to improve UX
5
+ - Fix secure boot setting to actually apply
6
+ - Skip several unnecessary Hyper-V calls to improve performance
7
+ - Improve VM properties view to look a little better and house another few nuggets of information
8
+
9
+ ## v0.0.1 2017-09-28
10
+
11
+ - Initial release
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Foreman Hyper-V
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/foreman_hyperv.svg)](https://badge.fury.io/rb/foreman_hyperv)
4
+
3
5
  Microsoft Hyper-V compute resource for Foreman
4
6
 
5
7
  Uses the in-development `fog-hyperv` gem found [here](https://github.com/ace13/fog-hyperv).
@@ -1,6 +1,32 @@
1
- $(document).on('ContentLoad', hypervGenerationChange);
1
+ function hypervGenerationChange(item) {
2
+ var toIter = ['#host_compute_attributes_secure_boot_enabled', '#compute_attribute_vm_attrs_secure_boot_enabled'];
3
+ gen = $(item).val();
2
4
 
3
- function hypervGenerationChange() {
4
- gen = $('#host_compute_attributes_generation').val()
5
- // $('#host_compute_attributes_secure_boot_enabled').disable()
5
+ if (gen == 1) {
6
+ for (var i = 0; i < toIter.length; ++i) {
7
+ $(toIter[i]).attr('disabled', true);
8
+ }
9
+ } else {
10
+ for (var i = 0; i < toIter.length; ++i) {
11
+ $(toIter[i]).removeAttr('disabled');
12
+ }
13
+ }
14
+ }
15
+
16
+ function hypervDynamicMemoryChange(item) {
17
+ var toIter = [
18
+ '#host_compute_attributes_memory_maximum',
19
+ '#host_compute_attributes_memory_minimum',
20
+ '#compute_attribute_vm_attrs_memory_maximum',
21
+ '#compute_attribute_vm_attrs_memory_minimum',
22
+ ];
23
+ if (item.checked) {
24
+ for (var i = 0; i < toIter.length; ++i) {
25
+ $(toIter[i]).removeAttr('disabled');
26
+ }
27
+ } else {
28
+ for (var i = 0; i < toIter.length; ++i) {
29
+ $(toIter[i]).attr('disabled', true);
30
+ }
31
+ }
6
32
  }
@@ -15,10 +15,10 @@ module ForemanHyperv
15
15
  end
16
16
 
17
17
  def test_connection(options = {})
18
- super options
18
+ super
19
19
  client.valid?
20
- rescue Fog::Hyperv::Errors::ServiceError, ArgumentError, WinRM::WinRMAuthorizationError
21
- false
20
+ rescue Fog::Hyperv::Errors::ServiceError, ArgumentError, WinRM::WinRMAuthorizationError => e
21
+ errors[:base] << e.message
22
22
  end
23
23
 
24
24
  def provided_attributes
@@ -53,11 +53,12 @@ module ForemanHyperv
53
53
 
54
54
  def create_vm(args = {})
55
55
  args = vm_instance_defaults.merge(args.to_hash.deep_symbolize_keys)
56
- logger.debug "Creating a VM with arguments; #{args}"
56
+ client.logger.debug "Creating a VM with arguments; #{args}"
57
+
57
58
  pre_create = {
58
59
  boot_device: 'NetworkAdapter',
59
60
  generation: args[:generation].to_i,
60
- memory_startup: args[:memory_startup].presence,
61
+ memory_startup: args[:memory_startup].presence.to_i,
61
62
  name: args[:name],
62
63
  no_vhd: true
63
64
  }
@@ -65,7 +66,9 @@ module ForemanHyperv
65
66
  vm = client.servers.create pre_create
66
67
 
67
68
  post_save = {
68
- dynamic_memory_enabled: ActiveRecord::Type::Boolean.new.type_cast_from_user(args[:dynamic_memory_enabled]),
69
+ dynamic_memory_enabled: Foreman::Cast.to_bool(args[:dynamic_memory_enabled]),
70
+ memory_minimum: args[:memory_minimum].presence.to_i,
71
+ memory_maximum: args[:memory_maximum].presence.to_i,
69
72
  notes: args[:notes].presence,
70
73
  processor_count: args[:processor_count].to_i
71
74
  }
@@ -75,9 +78,9 @@ module ForemanHyperv
75
78
 
76
79
  vm.save if vm.dirty?
77
80
 
78
- if vm.generation == 2 && !args[:secure_boot_enabled].nil?
81
+ if vm.generation == 2 && args[:secure_boot_enabled].present?
79
82
  f = vm.firmware
80
- f.secure_boot = ActiveRecord::Type::Boolean.new.type_cast_from_user(args[:secure_boot_enabled]) ? :On : :Off
83
+ f.secure_boot = Foreman::Cast.to_bool(args[:secure_boot_enabled]) ? :On : :Off
81
84
  f.save if f.dirty?
82
85
  end
83
86
 
@@ -93,17 +96,20 @@ module ForemanHyperv
93
96
 
94
97
  def save_vm(uuid, attr)
95
98
  vm = find_vm_by_uuid(uuid)
96
- logger.debug "Saving a VM with arguments; #{attr}"
99
+ client.logger.debug "Saving a VM with arguments; #{attr}"
97
100
  attr.each do |k, v|
98
101
  vm.send("#{k}=".to_sym, v) if vm.respond_to?("#{k}=".to_sym)
99
102
  end
100
- if vm.generation == 2 && !args[:secure_boot_enabled].nil?
103
+
104
+ if vm.generation == 2 && attr[:secure_boot_enabled].present?
101
105
  f = vm.firmware
102
- f.secure_boot = ActiveRecord::Type::Boolean.new.type_cast_from_user(args[:secure_boot_enabled]) ? :On : :Off
106
+ f.secure_boot = Foreman::Cast.to_bool(attr[:secure_boot_enabled]) ? :On : :Off
103
107
  f.save if f.dirty?
104
108
  end
109
+
105
110
  update_interfaces(vm, attr[:interfaces_attributes])
106
111
  update_volumes(vm, attr[:volumes_attributes])
112
+
107
113
  vm.save if vm.dirty?
108
114
  vm
109
115
  end
@@ -177,9 +183,9 @@ module ForemanHyperv
177
183
  vm.network_adapters.each(&:destroy)
178
184
 
179
185
  interfaces = nested_attributes_for :interfaces, attrs
180
- logger.debug "Building interfaces with: #{interfaces}"
186
+ client.logger.debug "Building interfaces with: #{interfaces}"
181
187
  interfaces.each do |iface|
182
- nic = vm.network_adapters.create name: iface[:name], switch_name: iface[:network]
188
+ nic = vm.network_adapters.new name: iface[:name], switch_name: iface[:network]
183
189
  if iface[:mac]
184
190
  nic.mac = iface[:mac]
185
191
  nic.dynamic_mac_address_enabled = false
@@ -200,7 +206,7 @@ module ForemanHyperv
200
206
 
201
207
  def create_volumes(vm, attrs)
202
208
  volumes = nested_attributes_for :volumes, attrs
203
- logger.debug "Building volumes with: #{volumes}"
209
+ client.logger.debug "Building volumes with: #{volumes}"
204
210
  volumes.each do |vol|
205
211
  vhd = vm.vhds.create path: vm.folder_name + '\\' + vol[:path], size: vol[:size]
206
212
  vm.hard_drives.create path: vhd.path
@@ -210,7 +216,7 @@ module ForemanHyperv
210
216
 
211
217
  def update_interfaces(vm, attrs)
212
218
  interfaces = nested_attributes_for :interfaces, attrs
213
- logger.debug "Updating interfaces with: #{interfaces}"
219
+ client.logger.debug "Updating interfaces with: #{interfaces}"
214
220
  interfaces.each do |interface|
215
221
  if interface[:id].blank? && interface[:_delete] != '1'
216
222
  nic = vm.network_adapters.create interface
@@ -232,14 +238,14 @@ module ForemanHyperv
232
238
 
233
239
  def update_volumes(vm, attrs)
234
240
  volumes = nested_attributes_for :volumes, attrs
235
- logger.debug "Updating volumes with: #{volumes}"
241
+ client.logger.debug "Updating volumes with: #{volumes}"
236
242
  volumes.each do |volume|
237
243
  if volume[:_delete] == '1' && volume[:id].present?
238
- hd = vm.hard_drives.get(path: volume[:path])
244
+ hd = vm.hard_drives.find { |h| h.id == volume[:id] }
239
245
  hd.vhd.destroy
240
246
  hd.destroy
241
247
  end
242
- vm.hard_drives.create(path: volume[:path], size: volume[:size]) if volume[:id].blank?
248
+ vm.hard_drives.create(path: volume[:path], size: volume[:size]) if volume[:id].blank? && volume[:_delete] != '1'
243
249
  end
244
250
  end
245
251
  end
@@ -1,15 +1,19 @@
1
- <%#= compute_specific_js(compute_resource, 'base') %>
2
1
  <%= javascript_tag("$(document).on('ContentLoad', tfm.numFields.initAll)") %>
3
2
 
4
3
  <%
5
4
  generations = [ [1, 'Generation 1 (BIOS)'], [2, 'Generation 2 (UEFI)'] ]
6
5
  %>
7
- <%= select_f f, :generation, generations, :first, :last, {}, label: 'Generation', disabled: !new_host, onchange: 'hypervGenerationChange()' %>
8
- <%= checkbox_f f, :secure_boot_enabled, { label: _('Use Secure Boot') }, 'true', 'false' %>
6
+ <%= select_f f, :generation, generations, :first, :last, {}, label: 'Generation', disabled: !new_host, onchange: 'hypervGenerationChange(this);' %>
7
+ <% if new_host || f.object.generation == 2 %>
8
+ <%= checkbox_f f, :secure_boot_enabled, { label: _('Use Secure Boot'), disabled: f.object.generation == 1 }, 'true', 'false' %>
9
+ <% end %>
9
10
 
10
11
  <%= counter_f f, :processor_count, label: _('CPUs'), label_size: 'col-md-2' %>
11
- <%= byte_size_f f, :memory_startup, class: 'col-md-2', label: _('Memory') %>
12
- <%= checkbox_f f, :dynamic_memory_enabled, { label: _('Use Dynamic Memory') }, 'true', 'false' %>
12
+ <%= byte_size_f f, :memory_startup, class: 'col-md-2', label: _('Memory (Startup)') %>
13
+
14
+ <%= byte_size_f f, :memory_maximum, class: 'col-md-2', label: _('Memory Maximum'), disabled: !f.object.dynamic_memory_enabled %>
15
+ <%= byte_size_f f, :memory_minimum, class: 'col-md-2', label: _('Memory Minimum'), disabled: !f.object.dynamic_memory_enabled %>
16
+ <%= checkbox_f f, :dynamic_memory_enabled, { label: _('Use Dynamic Memory'), onchange: 'hypervDynamicMemoryChange(this);' }, 'true', 'false' %>
13
17
 
14
18
  <% if new_host %>
15
19
  <% checked = params[:host] && params[:host][:compute_attributes] && params[:host][:compute_attributes][:start] || '1' %>
@@ -18,3 +22,5 @@
18
22
 
19
23
  <%= textarea_f f, :notes, rows: '3', label: _('Notes') %>
20
24
  <%= f.hidden_field :id %>
25
+
26
+ <%= compute_specific_js(compute_resource, 'base') %>
@@ -1,4 +1,18 @@
1
1
  <% title @vm.name %>
2
+ <%
3
+ def memory_prop(method)
4
+ content_tag :tr do
5
+ result = content_tag(:td) do
6
+ method.to_s.humanize
7
+ end
8
+ result += content_tag(:td) do
9
+ value = @vm.send(method) rescue nil
10
+ value && number_to_human_size(value)
11
+ end
12
+ result
13
+ end
14
+ end
15
+ %>
2
16
 
3
17
  <div class='col-md-12'>
4
18
  <table class="<%= table_css_classes %>">
@@ -8,11 +22,22 @@
8
22
  <tbody>
9
23
  <%= prop :id %>
10
24
  <%#= prop :cluster %>
11
- <%= prop :memory_startup %>
25
+ <%= prop :name %>
26
+ <tr>
27
+ <td>Generation</td>
28
+ <td><%= @vm.generation == 1 ? 'Generation 1 (BIOS)' : 'Generation 2 (UEFI)' %></td>
29
+ </tr>
30
+ <% if @vm.generation != 1 %>
31
+ <tr>
32
+ <td>SecureBoot</td>
33
+ <td><%= @vm.firmware.secure_boot %></td>
34
+ </tr>
35
+ <% end %>
12
36
  <% if @vm.dynamic_memory_enabled %>
13
- <%= prop :memory_minimum %>
14
- <%= prop :memory_maximum %>
37
+ <%= memory_prop :memory_maximum %>
38
+ <%= memory_prop :memory_minimum %>
15
39
  <% end %>
40
+ <%= memory_prop :memory_startup %>
16
41
  <%= prop :public_ip_address %>
17
42
  <%= prop :mac %>
18
43
  <%= prop :processor_count %>
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^test\/})
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_runtime_dependency 'fog-hyperv', '~> 0.0.1'
22
+ spec.add_runtime_dependency 'fog-hyperv', '~> 0.0.2'
23
23
 
24
24
  spec.add_development_dependency 'bundler', '~> 1.13'
25
25
  spec.add_development_dependency 'rake', '~> 10.0'
@@ -9,8 +9,19 @@ module ForemanHyperv
9
9
  end
10
10
  end
11
11
 
12
+ assets_to_precompile =
13
+ Dir.chdir(root) do
14
+ Dir['app/assets/javascripts/**/*'].map do |f|
15
+ f.split(File::SEPARATOR, 4).last
16
+ end
17
+ end
18
+
12
19
  initializer 'foreman_hyperv.assets.precompile' do |app|
13
- app.config.assets.precompile += %w(compute_resources/hyperv/base.js)
20
+ app.config.assets.precompile += assets_to_precompile
21
+ end
22
+
23
+ initializer 'foreman_hyperv.configure_assets', group: :assets do
24
+ SETTINGS[:foreman_hyperv] = { assets: { precompile: assets_to_precompile } }
14
25
  end
15
26
 
16
27
  config.to_prepare do
@@ -1,3 +1,3 @@
1
1
  module ForemanHyperv
2
- VERSION = '0.0.1'.freeze
2
+ VERSION = '0.0.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_hyperv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Olofsson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-28 00:00:00.000000000 Z
11
+ date: 2017-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog-hyperv
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.0.1
19
+ version: 0.0.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.0.1
26
+ version: 0.0.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -77,12 +77,12 @@ files:
77
77
  - ".rubocop.yml"
78
78
  - ".rubocop_todo.yml"
79
79
  - ".travis.yml"
80
+ - CHANGELOG.md
80
81
  - Gemfile
81
82
  - LICENSE.txt
82
83
  - README.md
83
84
  - Rakefile
84
85
  - app/assets/javascripts/compute_resources/hyperv/base.js
85
- - app/helpers/hyperv_helpers.rb
86
86
  - app/models/concerns/fog_extensions/hyperv/compute.rb
87
87
  - app/models/concerns/fog_extensions/hyperv/network_adapter.rb
88
88
  - app/models/concerns/fog_extensions/hyperv/server.rb
@@ -1,7 +0,0 @@
1
- module HypervHelpers
2
- def hyperv_switches(compute)
3
- compute.switches.map do |sw|
4
- [sw.name, sw.name]
5
- end
6
- end
7
- end