foreman_bootdisk 14.0.0 → 17.0.2

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 (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