diff --git a/docs/drafts/version-ranges.md b/docs/drafts/version-ranges.md index ec03a0a98..8704cff6f 100644 --- a/docs/drafts/version-ranges.md +++ b/docs/drafts/version-ranges.md @@ -3,47 +3,108 @@ This document explains how to specify a version range to install or update an Operator with OLM 1.0. You define an Operator's target version in its custom resource (CR) file. -The following list describes how OLM resolves an Operator's target version, and the resulting actions: -Not specifying a version in the CR -: Installs or updates the latest version of the Operator. -Updates are applied automatically when they are published to the catalog. +## Not specifying a version in the CR -Specifying a version in the CR -: Installs or updates the specified version. -Updates are not applied automatically. +If you do not specify a version in the Operator's CR, OLM 1.0 installs or updates the latest version of the Operator that can be resolved. +The resolved version is the latest version of the Operator that satisfies the dependencies and constraints of the Operator and the environment. +Updates that can be resolved are applied automatically when they are published to the catalog. + +For more information about dependency resolution in OLM 1.0, see the [Deppy introduction](https://github.com/operator-framework/deppy#introductionhttps://github.com/operator-framework/deppy#introductionhttps://github.com/operator-framework/deppy#introduction) + +// Should be consider porting the OCP dependency resolution docs upstream? +// https://docs.openshift.com/container-platform/4.14/operators/olm_v1/arch/olmv1-dependency.html + +## Specifying a version in the CR + +If you specify a version in the Operator's CR, OLM 1.0 installs or updates the specified version. +Operator updates are not applied automatically. If you want to update the Operator, you must manually edit the CR and apply the changes to the cluster. -Specifying a channel -: Installs or updates the latest version of the Operator in the channel. -Updates are applied automatically when they are published to the specified channel. +## Specifying a version range in the CR + +If you specify a version range in the Operator's CR, OLM 1.0 installs or updates the latest version of the Operator that can be resolved within the version range. +Operator updates within the specified range are automatically installed if they can be resolved successfully. +Updates are not installed if they are outside of the specified range or if they cannot be resolved successfully. -Specifying a version range in the CR -: Installs or updates the latest version of the Operator within the version range. -Updates that are within the specified range are automatically installed. -Updates that are outside of the specified range are not installed. +### Comparisons -The `spec.version` field uses the Masterminds `semver` package to enable the version range functionality. +A comparison string is composed of a list of comma or space separated values and one or more operators. You can add an additional comparison string by including an OR (`||`) operator between the strings. -OLM 1.0 does not support following methods for specifying a version range: +#### Basic comparisons -* Using tags and labels are not supported. -You must use semantic versioning to define a version range. -* Using [hypen range comparisons](https://github.com/Masterminds/semver#hyphen-range-comparisons) are not supported. +| Operator | Definition | +|----------|-----------------------------------| +| `=` | equal (not aliased to an operator | +| `!=` | not equal | +| `>` | greater than | +| `<` | less than | +| `>=` | greater than or equal to | +| `<=` | less than or equal to | + +// Should we create an issue to add a section for pre-release versions? +// https://github.com/Masterminds/semver#working-with-prerelease-versionshttps://github.com/Masterminds/semver#working-with-prerelease-versions + +#### Range comparisons + +OLM 1.0 does not support hypen range comparisons. For example, the following range option is not supported: ```yaml version: 3.0 - 3.6 ``` - To specify a range option, use a method similar to the following example: +To specify a version range, use a method similar to the following example: - ```yaml - version: >=3.0 <3.6 - ``` +```yaml +version: >=3.0, <3.6 +``` + +#### Wildcards in comparisons You can use the `x`, `X`, and `*` characters as wildcard characters in all comparison operations. +If you use a wildcard character with the `=` operator, you define a patch level comparision. +This is equivalent to making a tilde range comparison. + +*Example comparisons with wildcard characters* +| Comparison | Equivalent | +|------------|---------------------| +| `1.2.x` | `>= 1.2.0, < 1.3.0` | +| `>= 1.2.x` | `>= 1.2.0` | +| `<= 2.x` | `< 3` | +| `*` | `>= 0.0.0` | + + +#### Patch release or tilde (`~`) range comparison + +You can use the tilde (`~`) operator to make patch release comparisons. +This is useful when you want to specify a minor version up to the next major version. + +*Example patch release comparisons* +| Comparison | Equivalent | +|------------|---------------------| +| `~1.2.3` | `>= 1.2.3, < 1.3.0` | +| `~1` | `>= 1, <2` | +| `~2.3` | `>= 2.3, < 2.4` | +| `~1.2.x` | `>= 1.2.0, < 1.3.0` | +| `~1.x` | `>= 1, < 2` | + + +#### Major release or caret (`^`) range comparisons + +You can use the caret (`^`) operator to make major release comparisons after a stable, `1.0.0`, version is published. +If you use make a major release comparison before a stable version is published, minor versions define the API stability level. -For more information about parsing, sorting, checking, and comparing version constraints, see the [Masterminds SemVer README](https://github.com/Masterminds/semver#semver). +*Example major release comparisons* -## Example CRs that specify a version range +| Comparison | Equivalent | +|------------|----------------------------------------| +| `^1.2.3` | `>= 1.2.3, < 2.0.0``>= 1.2.3, < 2.0.0` | +| `^1.2.x` | `>= 1.2.0, < 2.0.0` | +| `^2.3` | `>= 2.3, < 3` | +| `^2.x` | `>= 2.0.0, < 3` | +| `^0.2.3` | `>=0.2.3 <0.3.0` | +| `^0.2` | `>=0.2.0 <0.3.0` | +| `^0.0.3` | `>=0.0.3 <0.0.4` | +| `^0.0` | `>=0.0.0 <0.1.0` | +| `^0` | `>=0.0.0 <1.0.0` |