Skip to content

Commit a561fed

Browse files
committed
Refactor Secure Boot Support and Firmware Handling
- Renamed firmware-related attributes to align with VMware conventions. - Added the `loader` attribute to determine if SB is enabled.
1 parent e491682 commit a561fed

File tree

3 files changed

+47
-21
lines changed

3 files changed

+47
-21
lines changed

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ class Server < Fog::Compute::Server
1313

1414
attribute :cpus
1515
attribute :cputime
16-
attribute :os_firmware
17-
attribute :os_firmware_features
16+
attribute :firmware
17+
attribute :firmware_features
18+
attribute :secure_boot
19+
attribute :loader_attributes
1820
attribute :os_type
1921
attribute :memory_size
2022
attribute :max_memory_size
@@ -291,8 +293,7 @@ def to_xml
291293
xml.vcpu(cpus)
292294
os_tags = {}
293295

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+
os_tags[:firmware] = firmware if firmware == 'efi'
296297

297298
xml.os(**os_tags) do
298299
type = xml.type(os_type, :arch => arch)
@@ -302,9 +303,13 @@ def to_xml
302303
xml.boot(:dev => dev)
303304
end
304305

305-
if os_firmware == "efi"
306+
loader_attributes&.each do |key, value|
307+
xml.loader(key => value)
308+
end
309+
310+
if firmware == "efi" && firmware_features&.any?
306311
xml.firmware do
307-
os_firmware_features.each_pair do |key, value|
312+
firmware_features.each_pair do |key, value|
308313
xml.feature(:name => key, :enabled => value)
309314
end
310315
end
@@ -555,6 +560,7 @@ def defaults
555560
:guest_agent => true,
556561
:video => {:type => "cirrus", :vram => 9216, :heads => 1},
557562
:virtio_rng => {},
563+
:firmware_features => { "secure-boot" => "no" },
558564
}
559565
end
560566

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: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@
3232
attributes = [ :id,
3333
:cpus,
3434
:cputime,
35-
:os_firmware,
36-
:os_firmware_features,
35+
:firmware,
36+
:firmware_features,
37+
:secure_boot,
38+
:loader_attributes,
3739
:os_type,
3840
:memory_size,
3941
:max_memory_size,
@@ -92,31 +94,28 @@
9294
test("with efi firmware") do
9395
server = Fog::Libvirt::Compute::Server.new(
9496
{
95-
:os_firmware => "efi",
96-
:os_firmware_features => {
97-
"secure-boot" => "no",
98-
"enrolled-keys" => "no"
99-
},
97+
:firmware => "efi",
10098
:nics => [],
10199
:volumes => []
102100
}
103101
)
104102
xml = server.to_xml
105103

106104
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" />')
105+
secure_boot = xml.include?('<feature name="secure-boot" enabled="no"/>')
106+
loader_attributes = !xml.include?('<loader secure="yes"/>')
109107

110-
os_firmware && secure_boot && enrolled_keys
108+
os_firmware && secure_boot && loader_attributes
111109
end
112-
test("with secure boot") do
110+
test("with secure boot enabled") do
113111
server = Fog::Libvirt::Compute::Server.new(
114112
{
115-
:os_firmware => "efi",
116-
:os_firmware_features => {
113+
:firmware => "efi",
114+
:firmware_features => {
117115
"secure-boot" => "yes",
118116
"enrolled-keys" => "yes"
119117
},
118+
:loader_attributes => { "secure" => "yes" },
120119
:nics => [],
121120
:volumes => []
122121
}
@@ -126,8 +125,9 @@
126125
os_firmware = xml.include?('<os firmware="efi">')
127126
secure_boot = xml.include?('<feature name="secure-boot" enabled="yes"/>')
128127
enrolled_keys = xml.include?('<feature name="enrolled-keys" enabled="yes"/>')
128+
loader_attributes = xml.include?('<loader secure="yes"/>')
129129

130-
os_firmware && secure_boot && enrolled_keys
130+
os_firmware && secure_boot && enrolled_keys && loader_attributes
131131
end
132132
end
133133
end

0 commit comments

Comments
 (0)