# 20230126-discuss-FCOS-update-graph-in-container-world ## Option 1 - Use tags - https://github.com/coreos/fedora-coreos-tracker/issues/1263#issuecomment-1192631773 - graph encodes tags - layering users are required to rebuild all our images using the same tag name - or maybe there is a label that could be used instead that maps back to the FCOS this container was derived from. ### Option 1a - Use version tags for non-derivation But derivation cases we just track whatever requested tag is there and ignore upgrade graphs and if things break it's the user's fault (for now). ### Option 1b - ostree.endoflife-rebase Barriers are manifested as tags - most obviously implemented corresponding to "major versions" e.g. Fedora 36, 37 and RHEL 9.1, 9.2. Metadata injected into container image metadata that says for e.g. quay.io/fedora/oscore:36 to switch to quay.io/fedora/oscore:37 later. This metadata would only be ## Option 2 - Dismantle Cincinnati graph - https://github.com/coreos/fedora-coreos-tracker/issues/1263#issuecomment-1397650636 and onward - stop using cincinnati - update system follow single tag - have a proxy registry (e.g. `registry.updates.fedoraproject.org`) for re-implementing rollout period and stopping rollouts ## Option 3 - throw some JSON/YAML/TOML/HCL/XML?/ASN.1?? in S3 - As a user, not deriving container images - things should work as today (no user facing changes) - As a user, deriving container images, but no need for more control over rollout/etc - user does not need to create their own json (accessible via https)? - the client IDs the base FCOS version that is the target of current upgrade - find related container image in user's defined repo via tags/labels? - As FCOS, scheduling a rollout - As FCOS, stopping a rollout - json file on the side to stop rollouts - also possibly control deadends/barriers - denylist upgrading from 35.* - deadend 36.20230111.1.0 - by default update to latest - no update server - put in place some policy for timing out systems to update - generation based ```yaml! rollouts: - target: 1.2.3.4 start: <time> duration: <duration> #barriers: deadends: - "37.2.3.4" # do not upgradea src: # barrier "< 36": "barrier-tag" ">= 36.0.1.2, < 36.1.2.3": "barrier-2" # deadend "< 35": ~ deny: - "37.2.3.4" ``` "{fedoraver}-{fcos-ver} > 37.1.2.3" # Related topics https://major.io/p/watchtower/ for container images ## Current controls that exist - server side controls - deadends - barriers - rollout window start/duration - fleet controls - reboot coordination - client side controls - periodic window (control when reboots happen and updates are applied) - systemd reboot inhibitors also block rebooting for updates (and other reasons) - checks - Zincati doesn't rerun an upgrade that's been rolled back ## Proposed Future Controls - server side controls - deadends - barriers - rollout window start/duration - client side controls - periodic window (control when reboots happen and updates are applied) - systemd reboot inhibitors also block rebooting for updates (and other reasons) - rollout window start/duration? - overriding rollout to upgrade immediately ## Lightweight layering (containers, git repos, tarballs?) - https://github.com/containers/bootc/issues/22 - layers are lightweight files and get applied client side - OS updates still follow canonical locations for the OS updates