foreman_bootdisk 14.0.0 → 17.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHORS +30 -0
  3. data/README.md +25 -0
  4. data/app/controllers/foreman_bootdisk/api/v2/disks_controller.rb +5 -7
  5. data/app/controllers/foreman_bootdisk/api/v2/subnet_disks_controller.rb +9 -4
  6. data/app/controllers/foreman_bootdisk/disks_controller.rb +11 -10
  7. data/app/helpers/concerns/foreman_bootdisk/hosts_helper_ext.rb +14 -14
  8. data/app/lib/foreman_bootdisk/scope/bootdisk.rb +4 -1
  9. data/app/lib/foreman_bootdisk/scope/full_host_bootdisk_efi.rb +15 -0
  10. data/app/models/concerns/foreman_bootdisk/compute_resources/vmware.rb +10 -1
  11. data/app/models/concerns/foreman_bootdisk/host_ext.rb +7 -10
  12. data/app/models/concerns/foreman_bootdisk/orchestration/compute.rb +28 -19
  13. data/app/models/setting/bootdisk.rb +16 -19
  14. data/app/services/foreman_bootdisk/iso_generator.rb +129 -52
  15. data/app/services/foreman_bootdisk/renderer.rb +36 -18
  16. data/app/views/foreman_bootdisk/generic_efi_host.erb +64 -0
  17. data/app/views/foreman_bootdisk/generic_static_host.erb +34 -0
  18. data/app/views/foreman_bootdisk/host.erb +27 -11
  19. data/db/seeds.d/50-bootdisk_templates.rb +15 -31
  20. data/lib/foreman_bootdisk/engine.rb +6 -6
  21. data/lib/foreman_bootdisk/version.rb +1 -1
  22. data/lib/tasks/bootdisk.rake +10 -6
  23. data/locale/action_names.rb +5 -0
  24. data/locale/ca/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  25. data/locale/ca/foreman_bootdisk.po +65 -16
  26. data/locale/de/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  27. data/locale/de/foreman_bootdisk.po +74 -23
  28. data/locale/en/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  29. data/locale/en/foreman_bootdisk.po +58 -10
  30. data/locale/en_GB/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  31. data/locale/en_GB/foreman_bootdisk.po +65 -17
  32. data/locale/es/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  33. data/locale/es/foreman_bootdisk.po +82 -34
  34. data/locale/foreman_bootdisk.pot +124 -48
  35. data/locale/fr/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  36. data/locale/fr/foreman_bootdisk.po +65 -17
  37. data/locale/it/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  38. data/locale/it/foreman_bootdisk.po +63 -15
  39. data/locale/ja/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  40. data/locale/ja/foreman_bootdisk.po +64 -16
  41. data/locale/ko/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  42. data/locale/ko/foreman_bootdisk.po +63 -15
  43. data/locale/pt_BR/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  44. data/locale/pt_BR/foreman_bootdisk.po +76 -27
  45. data/locale/ru/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  46. data/locale/ru/foreman_bootdisk.po +63 -15
  47. data/locale/sv_SE/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  48. data/locale/sv_SE/foreman_bootdisk.po +61 -13
  49. data/locale/zh_CN/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  50. data/locale/zh_CN/foreman_bootdisk.po +79 -31
  51. data/locale/zh_TW/LC_MESSAGES/foreman_bootdisk.mo +0 -0
  52. data/locale/zh_TW/foreman_bootdisk.po +63 -15
  53. data/release-gem +84 -0
  54. data/test/functional/foreman_bootdisk/api/v2/disks_controller_test.rb +51 -17
  55. data/test/functional/foreman_bootdisk/api/v2/subnet_disks_controller_test.rb +23 -10
  56. data/test/functional/foreman_bootdisk/disks_controller_test.rb +65 -25
  57. data/test/test_plugin_helper.rb +23 -3
  58. data/test/unit/concerns/host_test.rb +12 -1
  59. data/test/unit/concerns/orchestration/compute_test.rb +32 -13
  60. data/test/unit/foreman_bootdisk/renderer_test.rb +1 -1
  61. data/test/unit/iso_generator_test.rb +16 -7
  62. metadata +65 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd7cc51c2b0f332b25d13f49d22c813c0ed28fb9b6e34238a7f44cfd40eddda1
4
- data.tar.gz: f46b68427bbd016563ef186a9ed2cacbaf8f271c8da421db5f7eefb21eb363c6
3
+ metadata.gz: cc43113465fd89f890f9606fb04af3e948b96ac1bd6c1943211a452e38c4cb2a
4
+ data.tar.gz: 9db1069085f706df776576fc0df25f49a7d09ae71555ea15397d57656ddd0da5
5
5
  SHA512:
6
- metadata.gz: cefbdba361acd20cdfb1a9137010da3290b8170fe9bf8bafc9f786f514acb7b81a5b448f4b8f794d5416800f5cdcf3faad55693efd6672fbe454375ae84ecf3c
7
- data.tar.gz: b00a6e9af217a60d776508e3e076077729ebd0360cf3bdb246a71be9e307abeef10bc42c46a68f23834153a8fa86123eeb14cfafe007aa29c77b38087a3f612f
6
+ metadata.gz: 115bddba362f7c53b78d06ca78a1f120babae76cc2f922447cd0e05b1f322f189e30b186e6cb0718b7d9a24bfca67bf2287283fd9495eba4193a9b6bb560ec29
7
+ data.tar.gz: 1cd764fdc0a939d45934070d6b34e2619870c8c206afd4915cae93f68f7553cfcc9b18d3c04770aba9f4b6f45d62bbd779563798b7175595ee8c2b991f03b660
data/AUTHORS ADDED
@@ -0,0 +1,30 @@
1
+ Adam Ruzicka
2
+ Bernhard Suttner
3
+ Bryan Kearney
4
+ crito
5
+ Damon Maria
6
+ Dominic Cleal
7
+ Greg Sutcliffe
8
+ Ido Kanner
9
+ Jon Fautley
10
+ Justin Sherrill
11
+ Leos Stejskal
12
+ Lukas Zapletal
13
+ Lukáš Zapletal
14
+ Marek Hulan
15
+ Marek Hulán
16
+ Martin Bačovský
17
+ Michael Hofer
18
+ Michael Moll
19
+ Ohad Levy
20
+ Ondrej Prazak
21
+ Ondřej Ezr
22
+ Ondřej Pražák
23
+ Robert Antoni Buj Gelonch
24
+ Rohan21Lobo
25
+ Ronald van Zantvoort
26
+ Sam Kottler
27
+ Sean O'Keeffe
28
+ Stephen Benjamin
29
+ Swapnil Abnave
30
+ Timo Goebel
data/README.md CHANGED
@@ -50,6 +50,10 @@ gPXE images are unsupported due to lack of initrd support.
50
50
  | >= 1.19 | ~> 13.0 |
51
51
  | >= 1.20 | ~> 14.0 |
52
52
  | >= 1.21 | ~> 15.0 |
53
+ | >= 1.23 | ~> 16.0 |
54
+ | >= 1.24 | ~> 16.1 |
55
+ | >= 2.0 | ~> 16.1 |
56
+ | >= 2.1 | ~> 17.0 |
53
57
 
54
58
  # Usage
55
59
 
@@ -119,6 +123,7 @@ TFTP settings are needed.
119
123
  <th>DHCP reservation</th>
120
124
  <th>Pre-register host</th>
121
125
  <th>OS-specific</th>
126
+ <th>EFI supported</th>
122
127
  </tr>
123
128
  <tr>
124
129
  <td>Per-host image</td>
@@ -127,6 +132,7 @@ TFTP settings are needed.
127
132
  <td>No</td>
128
133
  <td>Yes</td>
129
134
  <td>No</td>
135
+ <td>No</td>
130
136
  </tr>
131
137
  <tr>
132
138
  <td>Full host image</td>
@@ -135,6 +141,7 @@ TFTP settings are needed.
135
141
  <td>No</td>
136
142
  <td>Yes</td>
137
143
  <td>Yes</td>
144
+ <td>Yes</td>
138
145
  </tr>
139
146
  <tr>
140
147
  <td>Generic image</td>
@@ -143,6 +150,7 @@ TFTP settings are needed.
143
150
  <td>No</td>
144
151
  <td>Yes</td>
145
152
  <td>No</td>
153
+ <td>No</td>
146
154
  </tr>
147
155
  <tr>
148
156
  <td>Subnet image</td>
@@ -151,6 +159,7 @@ TFTP settings are needed.
151
159
  <td>No</td>
152
160
  <td>Yes</td>
153
161
  <td>No</td>
162
+ <td>Yes</td>
154
163
  </tr>
155
164
  </table>
156
165
 
@@ -236,6 +245,22 @@ To generate from the command line on the Foreman server:
236
245
  Set `OUTPUT=/path` to change the output destination path (directory or file).
237
246
  It must be writable by the 'foreman' user.
238
247
 
248
+ ### Generic static image
249
+
250
+ This is generic image type which asks for network credentials instead of doing
251
+ DHCP request. Tokens must be turned off in order to find the host by MAC
252
+ address. To do that, set Token duration to 0 in Administer - Settings.
253
+
254
+ - Network interface name
255
+ - IP Address
256
+ - Netmask
257
+ - Gateway
258
+ - DNS
259
+
260
+ To use generic static host image, set "Generic image template" to "Bootdisk
261
+ iPXE - host template" in Administer - Settings - Boot disk. Only one template
262
+ can be used at one time across all hosts.
263
+
239
264
  ### Subnet images
240
265
 
241
266
  Subnet images are similar to generic images, but chain-loading is done via the
@@ -21,9 +21,10 @@ module ForemanBootdisk
21
21
 
22
22
  api :GET, '/generic', N_('Download generic image')
23
23
  def generic
24
+ # EFI not supported for iPXE generic bootdisk
24
25
  tmpl = ForemanBootdisk::Renderer.new.generic_template_render
25
26
  ForemanBootdisk::ISOGenerator.generate(ipxe: tmpl) do |iso|
26
- send_data read_file(iso), filename: "bootdisk_#{URI.parse(Setting[:foreman_url]).host}.iso"
27
+ send_file(iso, filename: "bootdisk_#{URI.parse(Setting[:foreman_url]).host}.iso")
27
28
  end
28
29
  end
29
30
 
@@ -34,22 +35,19 @@ module ForemanBootdisk
34
35
  host = @disk
35
36
  if params[:full]
36
37
  ForemanBootdisk::ISOGenerator.generate_full_host(host) do |iso|
37
- send_data read_file(iso), filename: "#{host.name}#{ForemanBootdisk::ISOGenerator.token_expiry(host)}.iso"
38
+ send_file(iso, filename: "#{host.name}#{ForemanBootdisk::ISOGenerator.token_expiry(host)}.iso")
38
39
  end
39
40
  else
41
+ # EFI not supported for iPXE host bootdisk
40
42
  tmpl = host.bootdisk_template_render
41
43
  ForemanBootdisk::ISOGenerator.generate(ipxe: tmpl) do |iso|
42
- send_data read_file(iso), filename: "#{host.name}.iso"
44
+ send_file(iso, filename: "#{host.name}.iso")
43
45
  end
44
46
  end
45
47
  end
46
48
 
47
49
  private
48
50
 
49
- def read_file(filename)
50
- File.read(filename)
51
- end
52
-
53
51
  def resource_scope
54
52
  Host::Managed.authorized('view_hosts')
55
53
  end
@@ -25,10 +25,15 @@ module ForemanBootdisk
25
25
  def subnet
26
26
  subnet = @subnet_disk
27
27
  subnet.tftp || raise(::Foreman::Exception.new(N_('TFTP feature not enabled for subnet %s'), subnet.name))
28
- tmpl = ForemanBootdisk::Renderer.new.generic_template_render(subnet)
29
- ForemanBootdisk::ISOGenerator.generate(ipxe: tmpl) do |iso|
30
- name = subnet.name
31
- send_data File.read(iso), filename: "bootdisk_subnet_#{name}.iso"
28
+ tmpl_bios = ForemanBootdisk::Renderer.new.generic_template_render(subnet)
29
+ tmpl_efi = nil
30
+ if subnet.httpboot
31
+ tmpl_efi = ForemanBootdisk::Renderer.new.generic_efi_template_render(subnet)
32
+ else
33
+ ForemanBootdisk.logger.warn('HTTPBOOT feature is not enabled for subnet %s, UEFI may not be available for bootdisk' % subnet.name)
34
+ end
35
+ ForemanBootdisk::ISOGenerator.generate(ipxe: tmpl_bios, grub: tmpl_efi) do |temp_iso_filename|
36
+ send_file(temp_iso_filename, filename: subnet.name)
32
37
  end
33
38
  end
34
39
 
@@ -12,6 +12,7 @@ module ForemanBootdisk
12
12
 
13
13
  def generic
14
14
  begin
15
+ # EFI not supported for iPXE generic bootdisk
15
16
  tmpl = ForemanBootdisk::Renderer.new.generic_template_render
16
17
  rescue StandardError => e
17
18
  error_rendering(e)
@@ -20,13 +21,14 @@ module ForemanBootdisk
20
21
  end
21
22
 
22
23
  ForemanBootdisk::ISOGenerator.generate(ipxe: tmpl) do |iso|
23
- send_data read_file(iso), filename: "bootdisk_#{URI.parse(Setting[:foreman_url]).host}.iso"
24
+ send_file(iso, filename: "bootdisk_#{URI.parse(Setting[:foreman_url]).host}.iso")
24
25
  end
25
26
  end
26
27
 
27
28
  def host
28
29
  host = @disk
29
30
  begin
31
+ # EFI not supported for iPXE host bootdisk
30
32
  tmpl = host.bootdisk_template_render
31
33
  rescue StandardError => e
32
34
  error_rendering(e)
@@ -35,14 +37,14 @@ module ForemanBootdisk
35
37
  end
36
38
 
37
39
  ForemanBootdisk::ISOGenerator.generate(ipxe: tmpl) do |iso|
38
- send_data read_file(iso), filename: "#{host.name}.iso"
40
+ send_file(iso, filename: "#{host.name}.iso")
39
41
  end
40
42
  end
41
43
 
42
44
  def full_host
43
45
  host = @disk
44
46
  ForemanBootdisk::ISOGenerator.generate_full_host(host) do |iso|
45
- send_data read_file(iso), filename: "#{host.name}#{ForemanBootdisk::ISOGenerator.token_expiry(host)}.iso"
47
+ send_file(iso, filename: "#{host.name}#{ForemanBootdisk::ISOGenerator.token_expiry(host)}.iso")
46
48
  end
47
49
  end
48
50
 
@@ -51,15 +53,18 @@ module ForemanBootdisk
51
53
  begin
52
54
  subnet = host.try(:subnet) || raise(::Foreman::Exception.new(N_('Subnet is not assigned to the host %s'), host.name))
53
55
  subnet.tftp || raise(::Foreman::Exception.new(N_('TFTP feature not enabled for subnet %s'), subnet.name))
54
- tmpl = ForemanBootdisk::Renderer.new.generic_template_render(subnet)
56
+ subnet.httpboot || ForemanBootdisk.logger.warn('HTTPBOOT feature is not enabled for subnet %s, UEFI may not be available for bootdisk' % subnet.name)
57
+
58
+ tmpl_bios = ForemanBootdisk::Renderer.new.generic_template_render(subnet)
59
+ tmpl_efi = ForemanBootdisk::Renderer.new.generic_efi_template_render(subnet)
55
60
  rescue StandardError => e
56
61
  error_rendering(e)
57
62
  redirect_back(fallback_location: '/')
58
63
  return
59
64
  end
60
65
 
61
- ForemanBootdisk::ISOGenerator.generate(ipxe: tmpl) do |iso|
62
- send_data read_file(iso), filename: "bootdisk_subnet_#{subnet.name}.iso"
66
+ ForemanBootdisk::ISOGenerator.generate(ipxe: tmpl_bios, grub: tmpl_efi) do |iso|
67
+ send_file(iso, filename: "bootdisk_subnet_#{subnet.name}.iso")
63
68
  end
64
69
  end
65
70
 
@@ -67,10 +72,6 @@ module ForemanBootdisk
67
72
 
68
73
  private
69
74
 
70
- def read_file(filename)
71
- File.read(filename)
72
- end
73
-
74
75
  def resource_scope(_controller = controller_name)
75
76
  Host::Managed.authorized(:view_hosts)
76
77
  end
@@ -2,27 +2,27 @@
2
2
 
3
3
  module ForemanBootdisk
4
4
  module HostsHelperExt
5
- def host_title_actions(*args)
6
- if @host.bootdisk_downloadable?
5
+ def host_title_actions(host)
6
+ if host.bootdisk_downloadable?
7
7
  title_actions(
8
8
  button_group(
9
9
  select_action_button(
10
10
  _('Boot disk'), { class: 'btn btn-group' },
11
11
  display_bootdisk_link_if_authorized(
12
- _("Host '%s' image") % @host.name.split('.')[0],
12
+ _("Host '%s' image") % host.name.split('.')[0],
13
13
  {
14
14
  controller: 'foreman_bootdisk/disks',
15
15
  action: 'host',
16
- id: @host
16
+ id: host
17
17
  },
18
18
  class: 'la'
19
19
  ),
20
20
  display_bootdisk_link_if_authorized(
21
- _("Full host '%s' image") % @host.name.split('.')[0],
21
+ _("Full host '%s' image") % host.name.split('.')[0],
22
22
  {
23
23
  controller: 'foreman_bootdisk/disks',
24
24
  action: 'full_host',
25
- id: @host
25
+ id: host
26
26
  },
27
27
  class: 'la'
28
28
  ),
@@ -35,7 +35,7 @@ module ForemanBootdisk
35
35
  },
36
36
  class: 'la'
37
37
  ),
38
- display_bootdisk_for_subnet,
38
+ display_bootdisk_for_subnet(host),
39
39
  content_tag(:li, '', class: 'divider'),
40
40
  display_bootdisk_link_if_authorized(
41
41
  _('Help'), {
@@ -48,29 +48,29 @@ module ForemanBootdisk
48
48
  )
49
49
  )
50
50
  else
51
- bootdisk_button_disabled
51
+ bootdisk_button_disabled(host)
52
52
  end
53
53
 
54
54
  super
55
55
  end
56
56
 
57
- def bootdisk_button_disabled
57
+ def bootdisk_button_disabled(host)
58
58
  title_actions(
59
59
  button_group(
60
60
  link_to(_('Boot disk'), '#', disabled: true, class: 'btn btn-default',
61
- title: _('Boot disk download not available for %s architecture') % @host.architecture.name)
61
+ title: _('Boot disk download not available for %s architecture') % host.architecture.name)
62
62
  )
63
63
  )
64
64
  end
65
65
 
66
66
  # need to wrap this one in a test for template proxy presence
67
- def display_bootdisk_for_subnet
68
- if (proxy = @host.try(:subnet).try(:tftp)) && proxy.has_feature?('Templates')
67
+ def display_bootdisk_for_subnet(host)
68
+ if (proxy = host.try(:subnet).try(:tftp) || host.try(:subnet).try(:httpboot)) && proxy.has_feature?('Templates')
69
69
  display_bootdisk_link_if_authorized(
70
- _("Subnet '%s' generic image") % @host.subnet.name, {
70
+ _("Subnet '%s' generic image") % host.subnet.name, {
71
71
  controller: 'foreman_bootdisk/disks',
72
72
  action: 'subnet',
73
- id: @host
73
+ id: host
74
74
  },
75
75
  class: 'la'
76
76
  )
@@ -6,7 +6,6 @@ module ForemanBootdisk
6
6
  def bootdisk_chain_url(mac = host.try(:mac), action = 'iPXE')
7
7
  url = foreman_url(action)
8
8
  u = URI.parse(url)
9
- ForemanBootdisk.logger.warn("Foreman or proxy is configured with HTTPS, probably not supported by iPXE: #{u}") if u.scheme == 'https'
10
9
  new_query_data = URI.decode_www_form(u.query || '') << ['mac', mac || '']
11
10
  new_querystring = URI.encode_www_form(new_query_data)
12
11
  u.query = nil
@@ -18,6 +17,10 @@ module ForemanBootdisk
18
17
  def bootdisk_raise(*args)
19
18
  raise ::Foreman::Exception.new(*args)
20
19
  end
20
+
21
+ def template_name
22
+ "Foreman Bootdisk"
23
+ end
21
24
  end
22
25
  end
23
26
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ForemanBootdisk
4
+ module Scope
5
+ class FullHostBootdiskEfi < Bootdisk
6
+ def kernel(medium_provider)
7
+ '/' + ForemanBootdisk::ISOGenerator.iso9660_filename(super)
8
+ end
9
+
10
+ def initrd(medium_provider)
11
+ '/' + ForemanBootdisk::ISOGenerator.iso9660_filename(super)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -36,12 +36,21 @@ module ForemanBootdisk
36
36
  'instance_uuid' => vm_uuid,
37
37
  'iso' => "foreman_isos/#{iso}",
38
38
  'datastore' => bootdisk_datastore(vm_uuid),
39
- 'start_connected' => false,
39
+ 'start_connected' => true,
40
40
  'connected' => true,
41
41
  'allow_guest_control' => true
42
42
  }
43
43
  client.vm_reconfig_cdrom options
44
44
  end
45
+
46
+ def iso_detach(vm_uuid)
47
+ options = {
48
+ 'instance_uuid' => vm_uuid,
49
+ 'start_connected' => false,
50
+ 'connected' => false,
51
+ }
52
+ client.vm_reconfig_cdrom options
53
+ end
45
54
  end
46
55
  end
47
56
  end
@@ -5,14 +5,11 @@ require 'uri'
5
5
  module ForemanBootdisk
6
6
  module HostExt
7
7
  def bootdisk_template
8
- template = ProvisioningTemplate.unscoped.find_by(
9
- name: Setting[:bootdisk_host_template]
10
- )
8
+ template = ProvisioningTemplate.unscoped.find_by(name: Setting[:bootdisk_host_template])
11
9
  unless template
12
- raise ::Foreman::Exception.new(
13
- N_('Unable to find template specified by %s setting'), 'bootdisk_host_template'
14
- )
10
+ raise ::Foreman::Exception.new(N_('Unable to find template specified by %s setting'), 'bootdisk_host_template')
15
11
  end
12
+
16
13
  template
17
14
  end
18
15
 
@@ -36,12 +33,12 @@ module ForemanBootdisk
36
33
  /i.86|x86[_-]64/ =~ architecture.name
37
34
  end
38
35
 
39
- def validate_media?
40
- super || (managed && bootdisk_build? && build?)
41
- end
42
-
43
36
  def can_be_built?
44
37
  super || (managed? && SETTINGS[:unattended] && bootdisk_build? && !build?)
45
38
  end
46
39
  end
47
40
  end
41
+
42
+ class Host::Managed::Jail < Safemode::Jail
43
+ allow :bootdisk_build?
44
+ end
@@ -9,7 +9,6 @@ module ForemanBootdisk
9
9
 
10
10
  included do
11
11
  after_validation :queue_bootdisk_compute
12
- after_build :rebuild_with_bootdisk
13
12
  end
14
13
 
15
14
  def bootdisk_isodir
@@ -21,15 +20,25 @@ module ForemanBootdisk
21
20
  end
22
21
 
23
22
  def queue_bootdisk_compute
24
- return unless compute? && errors.empty? && new_record?
23
+ return unless compute? && errors.empty?
25
24
  return unless provision_method == 'bootdisk'
26
25
 
27
- queue.create(name: _('Generating ISO image for %s') % self, priority: 5,
28
- action: [self, :setGenerateIsoImage])
29
- queue.create(name: _('Upload ISO image to datastore for %s') % self, priority: 6,
30
- action: [self, :setIsoImage])
31
- queue.create(name: _('Attach ISO image to CDROM drive for %s') % self, priority: 1001,
32
- action: [self, :setAttachIsoImage])
26
+ # We want to add our queue jobs only if really necessary:
27
+ # - in case of starting to create a new host
28
+ # - in case of a rebuild
29
+ if (old.nil? || !old.build?) && build?
30
+ queue.create(name: _('Generating ISO image for %s') % self, priority: 5,
31
+ action: [self, :setGenerateIsoImage])
32
+ queue.create(name: _('Upload ISO image to datastore for %s') % self, priority: 6,
33
+ action: [self, :setIsoImage])
34
+ queue.create(name: _('Attach ISO image to CDROM drive for %s') % self, priority: 1001,
35
+ action: [self, :setAttachIsoImage])
36
+ # Detach ISO image when host sends 'built' HTTP POST request
37
+ elsif old&.build? && !build?
38
+ queue.create(name: _('Detach ISO image from CDROM drive for %s') % self, priority: 52,
39
+ action: [self, :setDetachIsoImage])
40
+ end
41
+ true
33
42
  end
34
43
 
35
44
  def bootdisk_generate_iso_image
@@ -46,6 +55,10 @@ module ForemanBootdisk
46
55
  compute_resource.iso_attach(File.basename(bootdisk_isofile), uuid)
47
56
  end
48
57
 
58
+ def bootdisk_detach_iso
59
+ compute_resource.iso_detach(uuid)
60
+ end
61
+
49
62
  def setGenerateIsoImage
50
63
  logger.info format('Generating ISO image for %s', name)
51
64
  bootdisk_generate_iso_image
@@ -73,18 +86,14 @@ module ForemanBootdisk
73
86
 
74
87
  def delAttachIsoImage; end
75
88
 
76
- def rebuild_with_bootdisk
77
- return true unless bootdisk?
78
-
79
- begin
80
- bootdisk_generate_iso_image
81
- bootdisk_upload_iso
82
- bootdisk_attach_iso
83
- rescue StandardError => e
84
- Foreman::Logging.exception "Failed to rebuild Bootdisk image for #{name}", e, level: :error
85
- return false
86
- end
89
+ def setDetachIsoImage
90
+ logger.info format('Detaching ISO image from CDROM drive for %s', name)
91
+ bootdisk_detach_iso
92
+ rescue StandardError => e
93
+ failure format(_('Failed to detach ISO image from CDROM drive of instance %{name}: %{message}'), name: name, message: e.message), e
87
94
  end
95
+
96
+ def delDetachIsoImage; end
88
97
  end
89
98
  end
90
99
  end