operator-sdk: Run bundle and upgrade bundle does not work when the bundles is not added to default channel
Bug Report
The command run bundle and upgrade bundle will fail when the bundle informed is not configured to be in its default channel:
operators.operatorframework.io.bundle.channel.default.v1: alpha
operators.operatorframework.io.bundle.channels.v1: mce-2.0
By default, the commands create a new index and try to add the bundle to it. So, when SDK call OPM, it fails in:
https://github.com/operator-framework/operator-registry/blob/v1.22.0/pkg/sqlite/load.go#L426-L428
What did you do?
Following the steps
$ operator-sdk run bundle quay.io/operatorhubio/hive-operator:v2.5.3508-6cb94c6
INFO[0014] Successfully created registry pod: quay-io-operatorhubio-hive-operator-v2-5-3508-6cb94c6
INFO[0014] Created CatalogSource: hive-operator-catalog
INFO[0014] OperatorGroup "operator-sdk-og" created
INFO[0014] Created Subscription: hive-operator-v2-5-3508-6cb94c6-sub
FATA[0120] Failed to run bundle: install plan is not available for the subscription hive-operator-v2-5-3508-6cb94c6-sub: timed out waiting for the condition
And then, by checking the bundle logs: (kubectl logs pod/quay-io-operatorhubio-hive-operator-v2-5-3508-6cb94c6)
$ kubectl logs pod/quay-io-operatorhubio-hive-operator-v2-5-3508-6cb94c6
time="2022-05-11T00:46:00Z" level=warning msg="\x1b[1;33mDEPRECATION NOTICE:\nSqlite-based catalogs and their related subcommands are deprecated. Support for\nthem will be removed in a future release. Please migrate your catalog workflows\nto the new file-based catalog format.\x1b[0m"
time="2022-05-11T00:46:00Z" level=info msg="adding to the registry" bundles="[quay.io/operatorhubio/hive-operator:v2.5.3508-6cb94c6]"
time="2022-05-11T00:46:01Z" level=info msg="Could not find optional dependencies file" file=bundle_tmp1603466453/metadata load=annotations with=./bundle_tmp1603466453
time="2022-05-11T00:46:01Z" level=info msg="Could not find optional properties file" file=bundle_tmp1603466453/metadata load=annotations with=./bundle_tmp1603466453
time="2022-05-11T00:46:01Z" level=info msg="Could not find optional dependencies file" file=bundle_tmp1603466453/metadata load=annotations with=./bundle_tmp1603466453
time="2022-05-11T00:46:01Z" level=info msg="Could not find optional properties file" file=bundle_tmp1603466453/metadata load=annotations with=./bundle_tmp1603466453
time="2022-05-11T00:46:01Z" level=error msg="permissive mode disabled" bundles="[quay.io/operatorhubio/hive-operator:v2.5.3508-6cb94c6]" error="error loading bundle into db: FOREIGN KEY constraint failed"
Error: error loading bundle into db: FOREIGN KEY constraint failed
Usage:
opm registry add [flags]
Also, we found the same above issue by using the operator-sdk run bundle-upgrade
, see: https://github.com/k8s-operatorhub/community-operators/runs/6364587418?check_suite_focus=true#step:3:7120 (More info: https://github.com/k8s-operatorhub/community-operators/issues/1195 )
What did you expect to see?
The bundle and upgrade bundle working.
What did you see instead? Under which circumstances?
The bundle is not shipped in the default channel. ( The following issues were closed in favor of this one so we can try to centralize the info )
- https://github.com/operator-framework/operator-sdk/issues/5410
- https://github.com/operator-framework/operator-sdk/issues/5616
- https://github.com/operator-framework/operator-sdk/issues/5413
- https://github.com/operator-framework/operator-sdk/issues/4100
- https://github.com/k8s-operatorhub/community-operators/issues/1195
Possible Solution
SDK commands replace the info provided via the default channel with `` when an index is not formed. So that OPM will not try to update it. Unless a user provides the index to the commands, their motivation with them would not be impacted:
- The goal of running the bundle is only to check if the bundle can be deployed with OLM, so the default channel is not relevant
- The goal of the upgrade bundle is to check if is a possible upgrade from the bundle installed to the new one so unless someone informed an index, the default channel is irrelevant.
Workarounds:
For SDK users that are using it to test the bundle locally
operators.operatorframework.io.bundle.channel.default.v1: alpha
operators.operatorframework.io.bundle.channels.v1: alpha, mce-2.0 // add the default channel to the bundle's channels
For CI/pipelines:
The workaround would be to generate a different temporary bundle adding the default channel to channels. So, this channel would be created in the operator registry; see that all channels will be created or updated before we try to set the default channel: https://github.com/operator-framework/operator-registry/blob/v1.22.0/pkg/sqlite/load.go#L419-L429.
Additional context
- In OPM, we propose providing context to the errors faced in the SQL statements so we can better clarify scenarios like this one https://github.com/operator-framework/operator-registry/pull/953
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 20 (13 by maintainers)
@everettraven thank you very much for your investigation. I tested multiple operators and upgrade is working. So we can implement it to our pipelines 😃 Thank you again, you can close the issue.