Skip to content

Commit 9b407b4

Browse files
cgwaltersopenshift-merge-robot
authored andcommitted
Thread sysroot through update query flow
More incremental work on #108 In some cases we're using both an absolute path and a dfd; fixing that gets involved because we need to use it for child processes too, which will require some more prep work.
1 parent 968b86c commit 9b407b4

File tree

3 files changed

+17
-14
lines changed

3 files changed

+17
-14
lines changed

src/bootupd.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ pub(crate) fn update(name: &str) -> Result<ComponentUpdateResult> {
101101
} else {
102102
anyhow::bail!("Component {} is not installed", name);
103103
};
104-
let update = component.query_update()?;
104+
let sysroot = openat::Dir::open("/")?;
105+
let update = component.query_update(&sysroot)?;
105106
let update = match update.as_ref() {
106107
Some(p) if inst.meta.can_upgrade_to(&p) => p,
107108
_ => return Ok(ComponentUpdateResult::AtLatestVersion),
@@ -110,8 +111,8 @@ pub(crate) fn update(name: &str) -> Result<ComponentUpdateResult> {
110111
let mut pending_container = state.pending.take().unwrap_or_default();
111112
let interrupted = pending_container.get(component.name()).cloned();
112113
pending_container.insert(component.name().into(), update.clone());
113-
let mut state_guard = SavedState::acquire_write_lock(openat::Dir::open("/")?)
114-
.context("Failed to acquire write lock")?;
114+
let mut state_guard =
115+
SavedState::acquire_write_lock(sysroot).context("Failed to acquire write lock")?;
115116
state_guard
116117
.update_state(&state)
117118
.context("Failed to update state")?;
@@ -132,18 +133,19 @@ pub(crate) fn update(name: &str) -> Result<ComponentUpdateResult> {
132133

133134
/// daemon implementation of component adoption
134135
pub(crate) fn adopt_and_update(name: &str) -> Result<ContentMetadata> {
136+
let sysroot = openat::Dir::open("/")?;
135137
let mut state = SavedState::load_from_disk("/")?.unwrap_or_default();
136138
let component = component::new_from_name(name)?;
137139
if state.installed.get(name).is_some() {
138140
anyhow::bail!("Component {} is already installed", name);
139141
};
140-
let update = if let Some(update) = component.query_update()? {
142+
let update = if let Some(update) = component.query_update(&sysroot)? {
141143
update
142144
} else {
143145
anyhow::bail!("Component {} has no available update", name);
144146
};
145-
let mut state_guard = SavedState::acquire_write_lock(openat::Dir::open("/")?)
146-
.context("Failed to acquire write lock")?;
147+
let mut state_guard =
148+
SavedState::acquire_write_lock(sysroot).context("Failed to acquire write lock")?;
147149

148150
let inst = component
149151
.adopt_update(&state_guard.sysroot, &update)
@@ -169,6 +171,7 @@ pub(crate) fn validate(name: &str) -> Result<ValidationResult> {
169171
pub(crate) fn status() -> Result<Status> {
170172
let mut ret: Status = Default::default();
171173
let mut known_components = get_components();
174+
let sysroot = openat::Dir::open("/")?;
172175
let state = SavedState::load_from_disk("/")?;
173176
if let Some(state) = state {
174177
for (name, ic) in state.installed.iter() {
@@ -182,7 +185,7 @@ pub(crate) fn status() -> Result<Status> {
182185
.as_ref()
183186
.map(|p| p.get(name.as_str()))
184187
.flatten();
185-
let update = component.query_update()?;
188+
let update = component.query_update(&sysroot)?;
186189
let updatable = ComponentUpdatable::from_metadata(&ic.meta, update.as_ref());
187190
let adopted_from = ic.adopted_from.clone();
188191
ret.components.insert(

src/component.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub(crate) trait Component {
5353
fn generate_update_metadata(&self, sysroot: &str) -> Result<ContentMetadata>;
5454

5555
/// Used on the client to query for an update cached in the current booted OS.
56-
fn query_update(&self) -> Result<Option<ContentMetadata>>;
56+
fn query_update(&self, sysroot: &openat::Dir) -> Result<Option<ContentMetadata>>;
5757

5858
/// Used on the client to run an update.
5959
fn run_update(
@@ -110,10 +110,9 @@ pub(crate) fn write_update_metadata(
110110

111111
/// Given a component, return metadata on the available update (if any)
112112
pub(crate) fn get_component_update(
113-
sysroot: &str,
113+
sysroot: &openat::Dir,
114114
component: &dyn Component,
115115
) -> Result<Option<ContentMetadata>> {
116-
let sysroot = openat::Dir::open(sysroot)?;
117116
let name = component_update_data_name(component);
118117
let path = Path::new(BOOTUPD_UPDATES_DIR).join(name);
119118
if let Some(f) = sysroot.open_file_optional(&path)? {

src/efi.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ impl Component for EFI {
103103
}
104104

105105
fn install(&self, src_root: &str, dest_root: &str) -> Result<InstalledContent> {
106-
let meta = if let Some(meta) = get_component_update(src_root, self)? {
106+
let src_rootd = openat::Dir::open(src_root)?;
107+
let meta = if let Some(meta) = get_component_update(&src_rootd, self)? {
107108
meta
108109
} else {
109110
anyhow::bail!("No update metadata for component {} found", self.name());
@@ -142,7 +143,7 @@ impl Component for EFI {
142143
.filetree
143144
.as_ref()
144145
.ok_or_else(|| anyhow::anyhow!("No filetree for installed EFI found!"))?;
145-
let updatemeta = self.query_update()?.expect("update available");
146+
let updatemeta = self.query_update(sysroot)?.expect("update available");
146147
let updated = sysroot
147148
.sub_dir(&component_updatedirname(self))
148149
.context("opening update dir")?;
@@ -243,8 +244,8 @@ impl Component for EFI {
243244
Ok(meta)
244245
}
245246

246-
fn query_update(&self) -> Result<Option<ContentMetadata>> {
247-
get_component_update("/", self)
247+
fn query_update(&self, sysroot: &openat::Dir) -> Result<Option<ContentMetadata>> {
248+
get_component_update(sysroot, self)
248249
}
249250

250251
fn validate(&self, current: &InstalledContent) -> Result<ValidationResult> {

0 commit comments

Comments
 (0)