Skip to content

Commit 4c5a514

Browse files
authored
Merge pull request bootc-dev#723 from HuijingHei/adopt-bios
bios.rs: add `adopt-and-update`
2 parents 241b28c + 7cc055f commit 4c5a514

File tree

4 files changed

+58
-41
lines changed

4 files changed

+58
-41
lines changed

src/bios.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,16 +122,22 @@ impl Component for Bios {
122122
}
123123

124124
fn query_adopt(&self) -> Result<Option<Adoptable>> {
125-
Ok(None)
125+
crate::component::query_adopt_state()
126126
}
127127

128-
#[allow(unused_variables)]
129-
fn adopt_update(
130-
&self,
131-
sysroot: &openat::Dir,
132-
update: &ContentMetadata,
133-
) -> Result<InstalledContent> {
134-
todo!();
128+
fn adopt_update(&self, _: &openat::Dir, update: &ContentMetadata) -> Result<InstalledContent> {
129+
let Some(meta) = self.query_adopt()? else {
130+
anyhow::bail!("Failed to find adoptable system")
131+
};
132+
133+
let device = self.get_device()?;
134+
let device = device.trim();
135+
self.run_grub_install("/", device)?;
136+
Ok(InstalledContent {
137+
meta: update.clone(),
138+
filetree: None,
139+
adopted_from: Some(meta.version),
140+
})
135141
}
136142

137143
fn query_update(&self, sysroot: &openat::Dir) -> Result<Option<ContentMetadata>> {

src/component.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,38 @@ pub(crate) fn get_component_update(
144144
}
145145
}
146146

147+
#[context("Querying adoptable state")]
148+
pub(crate) fn query_adopt_state() -> Result<Option<Adoptable>> {
149+
// This would be extended with support for other operating systems later
150+
if let Some(coreos_aleph) = crate::coreos::get_aleph_version(Path::new("/"))? {
151+
let meta = ContentMetadata {
152+
timestamp: coreos_aleph.ts,
153+
version: coreos_aleph.aleph.version,
154+
};
155+
log::trace!("Adoptable: {:?}", &meta);
156+
return Ok(Some(Adoptable {
157+
version: meta,
158+
confident: true,
159+
}));
160+
} else {
161+
log::trace!("No CoreOS aleph detected");
162+
}
163+
let ostree_deploy_dir = Path::new("/ostree/deploy");
164+
if ostree_deploy_dir.exists() {
165+
let btime = ostree_deploy_dir.metadata()?.created()?;
166+
let timestamp = chrono::DateTime::from(btime);
167+
let meta = ContentMetadata {
168+
timestamp,
169+
version: "unknown".to_string(),
170+
};
171+
return Ok(Some(Adoptable {
172+
version: meta,
173+
confident: true,
174+
}));
175+
}
176+
Ok(None)
177+
}
178+
147179
#[cfg(test)]
148180
mod tests {
149181
use super::*;

src/efi.rs

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ fn string_from_utf16_bytes(slice: &[u8]) -> String {
179179
fn read_efi_var_utf16_string(name: &str) -> Option<String> {
180180
let efivars = Path::new("/sys/firmware/efi/efivars");
181181
if !efivars.exists() {
182-
log::warn!("No efivars mount at {:?}", efivars);
182+
log::trace!("No efivars mount at {:?}", efivars);
183183
return None;
184184
}
185185
let path = efivars.join(name);
@@ -239,39 +239,13 @@ impl Component for Efi {
239239
log::trace!("No ESP detected");
240240
return Ok(None);
241241
};
242-
// This would be extended with support for other operating systems later
243-
if let Some(coreos_aleph) = crate::coreos::get_aleph_version(Path::new("/"))? {
244-
let meta = ContentMetadata {
245-
timestamp: coreos_aleph.ts,
246-
version: coreos_aleph.aleph.version,
247-
};
248-
log::trace!("EFI adoptable: {:?}", &meta);
249-
return Ok(Some(Adoptable {
250-
version: meta,
251-
confident: true,
252-
}));
253-
} else {
254-
log::trace!("No CoreOS aleph detected");
255-
}
242+
256243
// Don't adopt if the system is booted with systemd-boot or
257244
// systemd-stub since those will be managed with bootctl.
258245
if skip_systemd_bootloaders() {
259246
return Ok(None);
260247
}
261-
let ostree_deploy_dir = Path::new("/ostree/deploy");
262-
if ostree_deploy_dir.exists() {
263-
let btime = ostree_deploy_dir.metadata()?.created()?;
264-
let timestamp = chrono::DateTime::from(btime);
265-
let meta = ContentMetadata {
266-
timestamp,
267-
version: "unknown".to_string(),
268-
};
269-
return Ok(Some(Adoptable {
270-
version: meta,
271-
confident: true,
272-
}));
273-
}
274-
Ok(None)
248+
crate::component::query_adopt_state()
275249
}
276250

277251
/// Given an adoptable system and an update, perform the update.
@@ -280,10 +254,8 @@ impl Component for Efi {
280254
sysroot: &openat::Dir,
281255
updatemeta: &ContentMetadata,
282256
) -> Result<InstalledContent> {
283-
let meta = if let Some(meta) = self.query_adopt()? {
284-
meta
285-
} else {
286-
anyhow::bail!("Failed to find adoptable system");
257+
let Some(meta) = self.query_adopt()? else {
258+
anyhow::bail!("Failed to find adoptable system")
287259
};
288260

289261
let esp = self.open_esp()?;

tests/e2e-update/e2e-update-in-vm.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ if test -s out.txt; then
8484
fi
8585
ok update not avail
8686

87+
mount -o remount,rw /boot
88+
rm -f /boot/bootupd-state.json
89+
bootupctl adopt-and-update | tee out.txt
90+
assert_file_has_content out.txt "Adopted and updated: BIOS: .*"
91+
assert_file_has_content out.txt "Adopted and updated: EFI: .*"
92+
ok adopt-and-update
93+
8794
tap_finish
8895
touch /run/testtmp/success
8996
sync

0 commit comments

Comments
 (0)