Skip to content

Commit 273feae

Browse files
authored
Merge pull request #155 from nofaralfasi/sb_libvirt
EFI & Secure Boot
2 parents 11f3821 + a561fed commit 273feae

File tree

4 files changed

+91
-2
lines changed

4 files changed

+91
-2
lines changed

.rubocop.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,7 @@ Style/SignalException:
1717

1818
Metrics/ClassLength:
1919
Enabled: false
20+
21+
Metrics/BlockLength:
22+
Exclude:
23+
- tests/**/*.rb

lib/fog/libvirt/models/compute/server.rb

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ class Server < Fog::Compute::Server
1313

1414
attribute :cpus
1515
attribute :cputime
16+
attribute :firmware
17+
attribute :firmware_features
18+
attribute :secure_boot
19+
attribute :loader_attributes
1620
attribute :os_type
1721
attribute :memory_size
1822
attribute :max_memory_size
@@ -287,14 +291,31 @@ def to_xml
287291
end
288292

289293
xml.vcpu(cpus)
290-
xml.os do
294+
os_tags = {}
295+
296+
os_tags[:firmware] = firmware if firmware == 'efi'
297+
298+
xml.os(**os_tags) do
291299
type = xml.type(os_type, :arch => arch)
292300
type[:machine] = "q35" if ["i686", "x86_64"].include?(arch)
293301

294302
boot_order.each do |dev|
295303
xml.boot(:dev => dev)
296304
end
305+
306+
loader_attributes&.each do |key, value|
307+
xml.loader(key => value)
308+
end
309+
310+
if firmware == "efi" && firmware_features&.any?
311+
xml.firmware do
312+
firmware_features.each_pair do |key, value|
313+
xml.feature(:name => key, :enabled => value)
314+
end
315+
end
316+
end
297317
end
318+
298319
xml.features do
299320
xml.acpi
300321
xml.apic
@@ -539,6 +560,7 @@ def defaults
539560
:guest_agent => true,
540561
:video => {:type => "cirrus", :vram => 9216, :heads => 1},
541562
:virtio_rng => {},
563+
:firmware_features => { "secure-boot" => "no" },
542564
}
543565
end
544566

lib/fog/libvirt/requests/compute/list_domains.rb

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,24 @@ def boot_order xml
4646
xml_elements(xml, "domain/os/boot", "dev")
4747
end
4848

49+
def firmware(xml)
50+
firmware_from_loader = xml_elements(xml, "domain/os/loader", "type").first
51+
52+
case firmware_from_loader
53+
when 'pflash'
54+
'efi'
55+
when 'rom'
56+
'bios'
57+
else
58+
xml_elements(xml, "domain/os", "firmware").first || 'bios'
59+
end
60+
end
61+
62+
# we rely on the fact that the secure attribute is only present when secure boot is enabled
63+
def secure_boot_enabled?(xml)
64+
xml_elements(xml, "domain/os/loader", "secure").first == 'yes'
65+
end
66+
4967
def domain_interfaces xml
5068
ifs = xml_elements(xml, "domain/devices/interface")
5169
ifs.map { |i|
@@ -78,7 +96,9 @@ def domain_to_attributes(dom)
7896
:boot_order => boot_order(dom.xml_desc),
7997
:nics => domain_interfaces(dom.xml_desc),
8098
:volumes_path => domain_volumes(dom.xml_desc),
81-
:state => states[dom.info.state]
99+
:state => states[dom.info.state],
100+
:firmware => firmware(dom.xml_desc),
101+
:secure_boot => secure_boot_enabled?(dom.xml_desc),
82102
}
83103
rescue ::Libvirt::RetrieveError, ::Libvirt::Error
84104
# Catch libvirt exceptions to avoid race conditions involving

tests/libvirt/models/compute/server_tests.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@
3232
attributes = [ :id,
3333
:cpus,
3434
:cputime,
35+
:firmware,
36+
:firmware_features,
37+
:secure_boot,
38+
:loader_attributes,
3539
:os_type,
3640
:memory_size,
3741
:max_memory_size,
@@ -67,6 +71,7 @@
6771

6872
test('be a kind of Fog::Libvirt::Compute::Server') { server.kind_of? Fog::Libvirt::Compute::Server }
6973
tests("serializes to xml") do
74+
test("without firmware") { server.to_xml.include?("<os>") }
7075
test("with memory") { server.to_xml.match?(%r{<memory>\d+</memory>}) }
7176
test("with disk of type file") do
7277
xml = server.to_xml
@@ -86,5 +91,43 @@
8691
end
8792
test("with q35 machine type on x86_64") { server.to_xml.match?(%r{<type arch="x86_64" machine="q35">hvm</type>}) }
8893
end
94+
test("with efi firmware") do
95+
server = Fog::Libvirt::Compute::Server.new(
96+
{
97+
:firmware => "efi",
98+
:nics => [],
99+
:volumes => []
100+
}
101+
)
102+
xml = server.to_xml
103+
104+
os_firmware = xml.include?('<os firmware="efi">')
105+
secure_boot = xml.include?('<feature name="secure-boot" enabled="no"/>')
106+
loader_attributes = !xml.include?('<loader secure="yes"/>')
107+
108+
os_firmware && secure_boot && loader_attributes
109+
end
110+
test("with secure boot enabled") do
111+
server = Fog::Libvirt::Compute::Server.new(
112+
{
113+
:firmware => "efi",
114+
:firmware_features => {
115+
"secure-boot" => "yes",
116+
"enrolled-keys" => "yes"
117+
},
118+
:loader_attributes => { "secure" => "yes" },
119+
:nics => [],
120+
:volumes => []
121+
}
122+
)
123+
xml = server.to_xml
124+
125+
os_firmware = xml.include?('<os firmware="efi">')
126+
secure_boot = xml.include?('<feature name="secure-boot" enabled="yes"/>')
127+
enrolled_keys = xml.include?('<feature name="enrolled-keys" enabled="yes"/>')
128+
loader_attributes = xml.include?('<loader secure="yes"/>')
129+
130+
os_firmware && secure_boot && enrolled_keys && loader_attributes
131+
end
89132
end
90133
end

0 commit comments

Comments
 (0)