mirror of https://github.com/fluxcd/flux2.git
RFC: draft proposal for artifact revision fmt
Signed-off-by: Hidde Beydals <hello@hidde.co>pull/3233/head
parent
6f7cdde1ba
commit
fa217b8775
@ -0,0 +1,175 @@
|
|||||||
|
# RFC-NNNN Artifact Revision format and introduction of digests
|
||||||
|
|
||||||
|
**Status:** provisional
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Status represents the current state of the RFC.
|
||||||
|
Must be one of `provisional`, `implementable`, `implemented`, `deferred`, `rejected`, `withdrawn`, or `replaced`.
|
||||||
|
-->
|
||||||
|
|
||||||
|
**Creation date:** 2022-10-20
|
||||||
|
|
||||||
|
**Last update:** 2022-10-20
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
This RFC proposes to establish a canonical format for an `Artifact` which
|
||||||
|
points to a specific checksum (e.g. an OCI manifest digest or Git commit SHA)
|
||||||
|
of a named pointer (e.g. an OCI image tag or Git tag). In addition, it proposes
|
||||||
|
to include the algorithm name (e.g. `sha256`) as a prefix to any advertised
|
||||||
|
checksum in an `Artifact` and further referring to it as a `Digest` opposed to
|
||||||
|
a `Checksum`.
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
The current `Artifact` type's `Revision` field format is not "officially"
|
||||||
|
standardized (albeit assumed throughout our code bases), and has mostly been
|
||||||
|
derived from `GitRepository` which uses `/` as a delimiter between the named
|
||||||
|
pointer (a Git branch or tag) and a specific (SHA-1, or theoretical SHA-256)
|
||||||
|
revision.
|
||||||
|
|
||||||
|
Since the introduction of `OCIRepository` and with the recent changes around
|
||||||
|
`HelmChart` objects to allow the consumption of charts from OCI registries.
|
||||||
|
This could be seen as outdated or confusing due to the format differing from
|
||||||
|
the canonical format used by OCI, which is `<tag>@<algo>:<checksum>` (the
|
||||||
|
part after `@` formally known as a "digest") to refer to a specific version
|
||||||
|
of a tagged OCI manifest.
|
||||||
|
|
||||||
|
While also taking note that Git does not have an official canonical format for
|
||||||
|
e.g. branch references at a specific commit, and `/` has less of a symbolic
|
||||||
|
meaning than `@`. Which could be interpreted as "`<branch>` _at_
|
||||||
|
`<commit SHA>`".
|
||||||
|
|
||||||
|
In addition, with the introduction of algorithm prefixes for an `Artifact`'s
|
||||||
|
checksum. It would be possible to add support and allow user configuration of
|
||||||
|
other algorithms than SHA-256. For example SHA-384 and SHA-512, or the more
|
||||||
|
performant (parallelizable) [BLAKE3][].
|
||||||
|
|
||||||
|
Besides this, it would make it easier to implement a client that can verify the
|
||||||
|
checksum without having to resort to an assumed format or guessing
|
||||||
|
method based on the length of it, and allows for a more robust solution in
|
||||||
|
which it can continue to calculate against the algorithm of a previous
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
The inclusion of the `Artifact`'s algorithm prefix has been proposed before in
|
||||||
|
[source-controller#855](https://github.com/fluxcd/source-controller/issues/855),
|
||||||
|
with supportive response from Core Maintainers.
|
||||||
|
|
||||||
|
### Goals
|
||||||
|
|
||||||
|
- Establish a canonical format to refer to an `Artifact`'s `Revision` field
|
||||||
|
which consists of a named pointer and a specific checksum reference.
|
||||||
|
- Allow easier verification of the `Artifact`'s checksum by including an
|
||||||
|
alias for the algorithm.
|
||||||
|
- Allow configuration of the algorithm used to calculate the checksum of an
|
||||||
|
`Artifact`.
|
||||||
|
- Allow configuration of [BLAKE3][] as an alternative to SHA for calculating
|
||||||
|
checksums. This has promising performance improvements over SHA-256, which
|
||||||
|
could allow for performance improvements in large scale environments.
|
||||||
|
- Allow compatability with SemVer name references which might contain an `@`
|
||||||
|
symbol already (e.g. `package@v1.0.0@sha256:...`, opposed to OCI's
|
||||||
|
`tag:v1.0.0@sha256:...`).
|
||||||
|
|
||||||
|
### Non-Goals
|
||||||
|
|
||||||
|
- Define a canonical format for an `Artifact`'s `Revision` field which contains
|
||||||
|
a named pointer and a different reference than a checksum.
|
||||||
|
|
||||||
|
## Proposal
|
||||||
|
|
||||||
|
### Establish an Artifact Revision format
|
||||||
|
|
||||||
|
Change the format of the `Revision` field of the `source.toolkit.fluxcd.io`
|
||||||
|
Group's `Artifact` type across all `Source` kinds to contain an `@` delimiter
|
||||||
|
opposed to `/`, and include the algorithm alias as a prefix to the checksum
|
||||||
|
(creating a "digest").
|
||||||
|
|
||||||
|
```text
|
||||||
|
[ <named pointer> ] [ [ "@" ] <algo> ":" <checksum> ]
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `<named pointer>` is the name of e.g. a Git branch or OCI tag,
|
||||||
|
`<checksum>` is the exact revision (e.g. a Git commit SHA or OCI manifest
|
||||||
|
digest), and `<algo>` is the alias of the algorithm used to calculate the
|
||||||
|
checksum (e.g. `sha256`). In case only a named pointer or digest is advertised,
|
||||||
|
the `@` is omitted.
|
||||||
|
|
||||||
|
For a `GitRepository`'s `Artifact` pointing towards an SHA-256 Git commit on
|
||||||
|
branch `main`, the `Revision` field value would become:
|
||||||
|
|
||||||
|
```text
|
||||||
|
main@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
||||||
|
```
|
||||||
|
|
||||||
|
For a `GitRepository`'s `Artifact` pointing towards a specific SHA-1 Git commit
|
||||||
|
without a defined branch or tag, the `Revision` field value would become:
|
||||||
|
|
||||||
|
```text
|
||||||
|
sha1:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
||||||
|
```
|
||||||
|
|
||||||
|
### Change the Artifact Checksum to a Digest
|
||||||
|
|
||||||
|
Change the format of the `Checksum` field of the `source.toolkit.fluxcd.io`
|
||||||
|
Group's `Artifact` to `Digest`, and include the alias of the algorithm used to
|
||||||
|
calculate the Artifact checksum as a prefix (creating a "digest").
|
||||||
|
|
||||||
|
```text
|
||||||
|
<algo> ":" <checksum>
|
||||||
|
```
|
||||||
|
|
||||||
|
For a `GitRepository` `Artifact`'s checksum calculated using SHA-256, the
|
||||||
|
`Digest` field value would become:
|
||||||
|
|
||||||
|
```text
|
||||||
|
sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
||||||
|
```
|
||||||
|
|
||||||
|
### User Stories
|
||||||
|
|
||||||
|
> As a user of the source-controller, I want to be able to see the exact
|
||||||
|
> revision of an Artifact that is being used, so that I can verify that it
|
||||||
|
> matches the expected revision.
|
||||||
|
|
||||||
|
> As a user of the notification-controller, I want to be able to see the
|
||||||
|
> exact revision a notification is referring to.
|
||||||
|
|
||||||
|
> As a Flux CLI user, I want to see the current revision of my Source in a
|
||||||
|
> listed overview.
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Optional if existing discussions and/or issues are linked in the motivation section.
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Alternatives
|
||||||
|
|
||||||
|
<!--
|
||||||
|
List plausible alternatives to the proposal and explain why the proposal is superior.
|
||||||
|
|
||||||
|
This is a good place to incorporate suggestions made during discussion of the RFC.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Design Details
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This section should contain enough information that the specifics of your
|
||||||
|
change are understandable. This may include API specs and code snippets.
|
||||||
|
|
||||||
|
The design details should address at least the following questions:
|
||||||
|
- How can this feature be enabled / disabled?
|
||||||
|
- Does enabling the feature change any default behavior?
|
||||||
|
- Can the feature be disabled once it has been enabled?
|
||||||
|
- How can an operator determine if the feature is in use?
|
||||||
|
- Are there any drawbacks when enabling this feature?
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Implementation History
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Major milestones in the lifecycle of the RFC such as:
|
||||||
|
- The first Flux release where an initial version of the RFC was available.
|
||||||
|
- The version of Flux where the RFC graduated to general availability.
|
||||||
|
- The version of Flux where the RFC was retired or superseded.
|
||||||
|
-->
|
||||||
|
|
||||||
|
[BLAKE3]: https://github.com/BLAKE3-team/BLAKE3
|
Loading…
Reference in New Issue