operator-framework / operator-registry

Operator Registry runs in a Kubernetes or OpenShift cluster to provide operator catalog data to Operator Lifecycle Manager.
Apache License 2.0
212 stars 247 forks source link

[BUG] opm alpha bundle validate does not detect invalid semver #932

Open sugarraysam opened 2 years ago

sugarraysam commented 2 years ago

Introduction

OPM recently changed their semver package #910. It does not allow the "v" prefix in the CSV version fields. When running bundle validation command, my expectation is that the tooling should detect and failed on invalid semver. This error is unfortunately only catched after an index image is built using the faulty bundle.

The validation should cover all CSV fields where semver are expected:

Example

I have a local bundle which uses v1.1.1-57:

# CSV uses "v" prefix
$ cat manifests/rhods-operator.1.1.1-57.clusterserviceversion.yml| yq .spec.version
"v1.1.1-57"

# Image is built and pushed here: quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da
$ opm alpha bundle validate --tag quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da
INFO[0000] Create a temp directory at /tmp/bundle-1847428757  container-tool=docker
DEBU[0000] Pulling and unpacking container image         container-tool=docker
INFO[0000] running /usr/bin/docker pull quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da  container-tool=docker
INFO[0002] running docker create                         container-tool=docker
DEBU[0002] [docker create quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da ]  container-tool=docker
INFO[0002] running docker cp                             container-tool=docker
DEBU[0002] [docker cp f2e44644351599e36e52268fc34fda9a95b16848aefe039cb39b327d74670561:/. /tmp/bundle-1847428757]  container-tool=docker
INFO[0002] running docker rm                             container-tool=docker
DEBU[0002] [docker rm f2e44644351599e36e52268fc34fda9a95b16848aefe039cb39b327d74670561]  container-tool=docker
INFO[0002] Unpacked image layers, validating bundle image format & contents  container-tool=docker
DEBU[0002] Found manifests directory                     container-tool=docker
DEBU[0002] Found metadata directory                      container-tool=docker
DEBU[0002] Getting mediaType info from manifests directory  container-tool=docker
DEBU[0002] Found annotations file                        container-tool=docker
DEBU[0002] Could not find optional dependencies file     container-tool=docker
DEBU[0002] Validating bundle contents                    container-tool=docker
DEBU[0002] Validating "apiextensions.k8s.io/v1, Kind=CustomResourceDefinition" from file "kfdef.apps.kubeflow.org.crd.yml"  container-tool=docker
DEBU[0002] Validating "operators.coreos.com/v1alpha1, Kind=ClusterServiceVersion" from file "rhods-operator.1.1.1-57.clusterserviceversion.yml"  container-tool=docker
INFO[0002] All validation tests have been completed successfully  container-tool=docker

# Validation is successful
$ echo $?
0

# Invalid semver is triggered by `opm index` when building an sql-based index image with the bundle
$ opm index --container-tool docker add --bundles quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da --tag quay.io/sblaisdo/rhods-index:5ac30da
WARN[0000] DEPRECATION NOTICE:
Sqlite-based catalogs and their related subcommands are deprecated. Support for
them will be removed in a future release. Please migrate your catalog workflows
to the new file-based catalog format.
INFO[0000] building the index                            bundles="[quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da]"
INFO[0000] running /usr/bin/docker pull quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da  bundles="[quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da]"
INFO[0001] running docker create                         bundles="[quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da]"
INFO[0001] running docker cp                             bundles="[quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da]"
INFO[0001] running docker rm                             bundles="[quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da]"
INFO[0001] Could not find optional dependencies file     file=bundle_tmp1812320581/metadata load=annotations with=./bundle_tmp1812320581
INFO[0001] Could not find optional properties file       file=bundle_tmp1812320581/metadata load=annotations with=./bundle_tmp1812320581
INFO[0001] Could not find optional dependencies file     file=bundle_tmp1812320581/metadata load=annotations with=./bundle_tmp1812320581
INFO[0001] Could not find optional properties file       file=bundle_tmp1812320581/metadata load=annotations with=./bundle_tmp1812320581
ERRO[0001] permissive mode disabled                      bundles="[quay.io/sblaisdo/rhods-bundle:1.1.1-57-5ac30da]" error="error parsing bundle rhods-operator.1.1.1-57 version v1.1.1-57: Invalid character(s) found in major number \"v1\""
Error: error parsing bundle rhods-operator.1.1.1-57 version v1.1.1-57: Invalid character(s) found in major number "v1"

OPM version

$ opm version
Version: version.Version{OpmVersion:"v1.21.0", GitCommit:"9999f796", BuildDate:"2022-03-03T21:23:12Z", GoOs:"linux", GoArch:"amd64"}
joelanford commented 2 years ago

Semver is not expected in spec.replaces or spec.skips.

Also, this validation logic exists in the operator-framework/api repo. The issue tracking these fixes is: https://github.com/operator-framework/api/issues/226

We'll need to vendor a new version of the api repo in this repo when that fix is released.

sugarraysam commented 2 years ago

I'm confused though, because if you use "v" prefixes in your version, than how would you reference past bundles in spec.replaces ?