-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
update_agent: support rebase to OCI pullspec #1241
base: main
Are you sure you want to change the base?
Conversation
f0713e1
to
1ca8a87
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Very quick look but looks good 👍🏻
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's cross-link to coreos/fedora-coreos-tracker#1823 in the commit message for the larger context.
4b9c09b
to
11aa880
Compare
Parse rpm-ostree status to detect if the current booted deployment is an OCI image. If so, query the OCI graph for cincinnati and rebase to the correct OCI image. Requires coreos/fedora-coreos-cincinnati#99 and coreos/rpm-ostree#5120 Part of: coreos/fedora-coreos-tracker#1823
11aa880
to
7000352
Compare
…ee-remote-image to verify fedora ostree signatures
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I updated this to use ostree-remote-image
so we validate the ostree signatures, as suggested in coreos/fedora-coreos-tracker#1823 (comment)
I think this is ready for review now. I will clean up and sqash commits once the design is agreed
src/rpm_ostree/cli_status.rs
Outdated
pub fn base_revision(&self) -> String { | ||
self.base_checksum | ||
self.container_image_reference | ||
.clone() | ||
.map(|pullspec| { | ||
pullspec | ||
.strip_prefix("ostree-remote-image:fedora:docker://") | ||
.map(|s| s.to_string()) | ||
}) | ||
.flatten() | ||
.or(self.base_checksum.clone()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe it would make more sense to add an Option<String>
to the Deployement
struct to be able to have both the pullspec and the base commit ?
However the cincinnati graph does not contains checksum in the OCI case so we can't compare ostree commits when doing rebase
later anyway.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
haven't had the need for it in the Zincati context, except maybe if we want Zincati to do OCI -> OSTree ? (in that case, after calling rpm-ostree deploy
zincati will fail as the checksum won't match
OK, had some more discussion with Jlebon and travier today and there are some more things to flesh out |
Allright, I think this is ready for review now. I highlighted a couple of things I am unsure of. |
90c5b25
to
450550b
Compare
Switch boot images to use OCI for updates. This is a step towards bootable containers support and bootc rebase. See https://fedoraproject.org/wiki/Changes/CoreOSOstree2OCIUpdates Requires coreos/zincati#1241 See coreos/fedora-coreos-tracker#1823
450550b
to
add9bf7
Compare
add9bf7
to
c5e0459
Compare
Some(params) => params, | ||
None => HashMap::new(), | ||
}; | ||
let query_params = self.query_params.unwrap_or_default(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Minor: clippy fix I'm guessing? This could be its own separate commit.
src/cincinnati/mod.rs
Outdated
log::warn!( | ||
"booted deployment {} not found in the update graph", | ||
&booted_depl.checksum | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Minor: this could be its own separate commit.
src/rpm_ostree/cli_finalize.rs
Outdated
// get the latest commit but that would be racy, so let's finalize the latest | ||
// commit. | ||
if release.is_oci { | ||
cmd.arg("--allow-missing-checksum") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think probably the cleaner thing is to have rpm-ostree accept a digested pullspec the way it accepts commit checksums and it can verify that it matches the digested pullspec that was staged. Then we can drop this.
src/update_agent/actor.rs
Outdated
bail!( | ||
log::error!( | ||
"expected pending deployment '{}', but found '{}' instead", | ||
release.version, | ||
pending.version | ||
); | ||
return Ok(false); | ||
} | ||
if pending.checksum != release.checksum { | ||
bail!( | ||
log::error!( | ||
"detected checksum mismatch for pending deployment '{}', got unexpected value '{}'", | ||
release.version, | ||
release.checksum, | ||
); | ||
return Ok(false); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, why do we need this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The rest of the function was built that way, and the bail error text was swallowed so I just aligned all the checks to use the same syntax
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This changes the semantics of the function. I think those differences might be on purpose.
In the OSTree case, if the checksum doesn't match, then something went really wrong because we expicitly deployed by checksum. Whereas the stream check below this line is done here because it can't be done before deploying; it's part of the commit metadata. (Though I guess we could pull it before deploying.)
We can't exactly transpose this to the OCI case, because there while we do deploy by digest, that digest doesn't actually mean much within the object store. That said, here I think checksum
is actually the pullspec in the OCI path as this PR is written (right?), so we do also expect it to be always true. It's basically checking that the custom origin URL we've set has correctly been set. I think then we do still want to keep this a hard error?
For the version check, I think the change to not make it a hard error makes sense.
Allright, I reworked this PR a bunch following the review comments, that ended up being pretty substantial changes. Overview :
TestingHere are my notes to test this out it case someone wants to experiment: Start a VM with Zincati disabled : Rebase to an OCI image in graph (recent enough to get
Now import Zincati build with this PR then:
Zincati should now pick up an OCI update through the OCI graph Getting zincati custom build in the COSA VMWhile we can make a custom FCOS build with an override to get our Zincati build inside, it will be erased by the content of the OCI image with a rebase, so here is how I did, after building zincati and copy the binary into
In the meantime, I'll squash this and try to make commits that make sense :) |
Add a configuration knob in
update
to optionnaly use OCI pullspec instead of ostree checksums.This will default to false.
Requires coreos/fedora-coreos-cincinnati#99 and coreos/rpm-ostree#5120