Creating an update graph with OLM

Creating an update graph with OLM

Creating an Update Graph

OLM provides a variety of ways to specify updates between operator versions as well as different add modes (requires bundle format) to control how versions fit into the catalog.

Methods for Specifying Updates

Replaces

For explicit updates from one CSV to another, you can specify the CSV name to replace in your CSV as such:

metadata:
   name: myoperator.v1.0.1
spec:
   replaces: myoperator.v1.0.0

In order for myoperator.v1.0.1 to be added to the catalog successfully, myoperator.v1.0.0 needs to be included in your manifests or have already been added to that catalog (in the case where packaging is done in the bundle format).

An update sequence of bundles created via replaces will have updates step through each version in the chain. For example, given

myoperator.v1.0.0 -> myoperator.v1.0.1 -> myoperator.v1.0.2

A subscription on myoperator.v1.0.0 will update to myoperator.v1.0.2 through myoperator.v1.0.1.

Installing from the UI today will always install the latest of a given channel. However, installing specific versions is possible with this update graph by modifying the startingCSV field of the subscription to point to the desired CSV name. Note that, in this case, the subscription will need its approval field set to Manual to ensure that the subscription does not auto-update and instead stays pinned to the specified version.

Skips

In order to skip through certain updates you can specify a list of CSV names to be skipped as such:

metadata:
   name: myoperator.v1.0.3
spec:
   replaces: myoperator.v1.0.0
   skips:
   - myoperator.v1.0.1
   - myoperator.v1.0.2

Using the above graph, this will mean subscriptions on myoperator.v1.0.0 can update directly to myoperator.v1.0.3 without going through myoperator.v1.0.1 or myoperator.v1.0.2. Installs that are already on myoperator.v1.0.1 or myoperator.v1.0.2 will still be able to update to myoperator.v1.0.3.

This is particularly useful if myoperator.v1.0.1 and myoperator.v1.0.2 are affected by a CVE or contain bugs.

Skipped CSVs do not need to be present in a catalog or set of manifests prior to adding to a catalog.

SkipRange

OLM also allows you to specify updates through version ranges in your CSV. This requires your CSVs to define a version in their version field which must follow the semver spec. Internally, OLM uses the blang/semver go library.

metadata:
   name: myoperator.v1.0.3
   annotations:
      olm.skipRange: ">=1.0.0 <1.0.3"

The version specifying the olm.skipRange will be presented as a direct (one hop) update to any version from that package within that range. The versions in this range do not need to be in the index in order for bundle addition to be successful. We recommend avoiding using unbound ranges such as <1.0.3.

Warning: Adding a bundle that only specifies skipRange to a given channel will wipe out all the previous content in that channel. This means directly installing past versions by editing the startingCSV field of the subscription is not possible when using skiprange only. In order for past versions to be installable by startingCSV while also benefitting from the skipRange feature, you will need to also connect past edges by setting a replaces field in addition to the olm.skipRange. For example, assuming the above update graph:

myoperator.v1.0.0 -> myoperator.v1.0.1 -> myoperator.v1.0.2

In order to keep these versions installable by startingCSV when myoperator.v1.0.3 is added, the CSV for myoperator.v1.0.3 needs to have the following:

metadata:
   name: myoperator.v1.0.3
   annotations:
      olm.skipRange: ">=1.0.0 <1.0.3"
spec:
   replaces: myoperator.v1.0.2

SkipRange by itself is useful for teams who are not interested in supporting directly installing versions within a given range or for whom consumers of the operator are always on the latest version.

Channel Guidelines

Cross channel updates

Cross channel updates are not possible today in an automated way. In order for your subscription to switch channels, the cluster admin must manually change the channel field in the subcription object.

Changing this field does not always result in receiving updates from that channel. For that to occur, updates paths must be available from the given version to versions in the new channel.

If using replaces

The CSV name currently installed must be in the replaces field of a CSV in the new channel.

If using skips

The CSV name currently installed must be in the skips field of a CSV in the new channel.

If using skipRange

The version currently installed must be in the olm.skipRange field of a CSV in the new channel.

Add Modes

TODO