Skip to content

Commit cd2a063

Browse files
committed
Add libvirt support
1 parent ed65dc6 commit cd2a063

4 files changed

Lines changed: 127 additions & 1 deletion

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# frozen_string_literal: true
2+
3+
module ForemanBootdisk
4+
module ComputeResources
5+
module Libvirt
6+
def capabilities
7+
super + [:bootdisk]
8+
end
9+
10+
def set_boot_order(attr = {})
11+
order = super(attr)
12+
order.unshift 'cdrom' if attr[:provision_method] == 'bootdisk'
13+
order
14+
end
15+
16+
def iso_upload(iso, _vm_uuid)
17+
client.upload_iso(libvirt_iso_pool_name, File.basename(iso), iso)
18+
end
19+
20+
def iso_attach(iso, vm_uuid)
21+
client.attach_iso(vm_uuid, File.basename(iso))
22+
end
23+
24+
def iso_detach(vm_uuid)
25+
client.detach_iso(vm_uuid)
26+
end
27+
28+
def iso_delete(iso, _vm_uuid = nil)
29+
client.destroy_iso(libvirt_iso_pool_name, File.basename(iso))
30+
end
31+
32+
private
33+
34+
def libvirt_iso_pool_name
35+
if respond_to?(:volumes) && volumes.present?
36+
pool = volumes.first.try(:pool_name) || volumes.first.try(:[], 'pool_name')
37+
return pool if pool.present?
38+
end
39+
40+
'default'
41+
end
42+
end
43+
end
44+
end

app/models/concerns/foreman_bootdisk/orchestration/compute.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def queue_bootdisk_compute
3131
action: [self, :setGenerateIsoImage])
3232
queue.create(name: _('Upload ISO image to datastore for %s') % self, priority: 6,
3333
action: [self, :setIsoImage])
34-
queue.create(name: _('Attach ISO image to CDROM drive for %s') % self, priority: 1001,
34+
queue.create(name: _('Attach ISO image to CDROM drive for %s') % self, priority: 30,
3535
action: [self, :setAttachIsoImage])
3636
# Detach ISO image when host sends 'built' HTTP POST request
3737
elsif old&.build? && !build?

lib/foreman_bootdisk/engine.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ class Engine < ::Rails::Engine
140140
Host::Managed.prepend ForemanBootdisk::HostExt
141141
Host::Managed.include ForemanBootdisk::Orchestration::Compute
142142
Foreman::Model::Vmware.prepend ForemanBootdisk::ComputeResources::Vmware if Foreman::Model::Vmware.available?
143+
Foreman::Model::Libvirt.prepend ForemanBootdisk::ComputeResources::Libvirt if Foreman::Model::Libvirt.available?
143144
ForemanFogProxmox::Proxmox.prepend ForemanBootdisk::ComputeResources::Proxmox if ForemanBootdisk.with_proxmox?
144145
rescue StandardError => e
145146
Rails.logger.warn "#{ForemanBootdisk::ENGINE_NAME}: skipping engine hook (#{e})"
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# frozen_string_literal: true
2+
3+
require 'test_plugin_helper'
4+
5+
module ForemanBootdisk
6+
class LibvirtTest < ActiveSupport::TestCase
7+
class DummyLibvirtComputeResource
8+
prepend ForemanBootdisk::ComputeResources::Libvirt
9+
10+
attr_reader :client
11+
12+
def initialize(client, volumes = [])
13+
@client = client
14+
@volumes = volumes
15+
end
16+
17+
def capabilities
18+
[:image]
19+
end
20+
21+
def volumes
22+
@volumes
23+
end
24+
25+
def set_boot_order(_attr = {})
26+
%w[hd]
27+
end
28+
end
29+
30+
setup do
31+
@client = mock('client')
32+
@cr = DummyLibvirtComputeResource.new(@client, [OpenStruct.new(pool_name: 'bootdisk')])
33+
end
34+
35+
describe '#capabilities' do
36+
test 'should include bootdisk' do
37+
assert_includes @cr.capabilities, :bootdisk
38+
end
39+
end
40+
41+
describe '#iso_upload' do
42+
test 'calls fog-libvirt upload_iso' do
43+
@client.expects(:upload_iso).with('bootdisk', 'test.iso', '/tmp/test.iso')
44+
@cr.iso_upload('/tmp/test.iso', '1234')
45+
end
46+
end
47+
48+
describe '#iso_attach' do
49+
test 'calls fog-libvirt attach_iso' do
50+
@client.expects(:attach_iso).with('1234', 'test.iso')
51+
@cr.iso_attach('test.iso', '1234')
52+
end
53+
end
54+
55+
describe '#iso_detach' do
56+
test 'calls fog-libvirt detach_iso' do
57+
@client.expects(:detach_iso).with('1234', nil)
58+
@cr.iso_detach('1234')
59+
end
60+
end
61+
62+
describe '#iso_delete' do
63+
test 'calls fog-libvirt destroy_iso' do
64+
@client.expects(:destroy_iso).with('bootdisk', 'test.iso')
65+
@cr.iso_delete('test.iso')
66+
end
67+
end
68+
69+
describe '#set_boot_order' do
70+
test 'prepends cdrom when provision_method is bootdisk' do
71+
order = @cr.set_boot_order(provision_method: 'bootdisk')
72+
assert_equal %w[cdrom network hd], order
73+
end
74+
75+
test 'returns base order when provision_method is not bootdisk' do
76+
order = @cr.set_boot_order(provision_method: 'image')
77+
assert_equal %w[hd], order
78+
end
79+
end
80+
end
81+
end

0 commit comments

Comments
 (0)