Skip to content

Commit e491682

Browse files
stejskalleosekohl
authored andcommitted
EFI & Secure Boot
Co-authored-by: Ewoud Kohl van Wijngaarden <[email protected]>
1 parent 11f3821 commit e491682

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
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: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class Server < Fog::Compute::Server
1313

1414
attribute :cpus
1515
attribute :cputime
16+
attribute :os_firmware
17+
attribute :os_firmware_features
1618
attribute :os_type
1719
attribute :memory_size
1820
attribute :max_memory_size
@@ -287,14 +289,28 @@ def to_xml
287289
end
288290

289291
xml.vcpu(cpus)
290-
xml.os do
292+
os_tags = {}
293+
294+
# Set firmware only if it's EFI, BIOS don't need to be set
295+
os_tags[:firmware] = "efi" if os_firmware == "efi"
296+
297+
xml.os(**os_tags) do
291298
type = xml.type(os_type, :arch => arch)
292299
type[:machine] = "q35" if ["i686", "x86_64"].include?(arch)
293300

294301
boot_order.each do |dev|
295302
xml.boot(:dev => dev)
296303
end
304+
305+
if os_firmware == "efi"
306+
xml.firmware do
307+
os_firmware_features.each_pair do |key, value|
308+
xml.feature(:name => key, :enabled => value)
309+
end
310+
end
311+
end
297312
end
313+
298314
xml.features do
299315
xml.acpi
300316
xml.apic

tests/libvirt/models/compute/server_tests.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
attributes = [ :id,
3333
:cpus,
3434
:cputime,
35+
:os_firmware,
36+
:os_firmware_features,
3537
:os_type,
3638
:memory_size,
3739
:max_memory_size,
@@ -67,6 +69,7 @@
6769

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

0 commit comments

Comments
 (0)