Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
eebdcea
Makefile: add test-upgrade-experimental-e2e (#2151)
joelanford Aug 15, 2025
ac4edb6
Merge branch 'main' into synchronize
Aug 18, 2025
20d7153
UPSTREAM: <carry>: Add OpenShift specific files
dtfranz Oct 26, 2023
d4da2cb
UPSTREAM: <carry>: Fix catalogd.Dockerfile to use new paths
tmshort Feb 26, 2025
2a1df41
UPSTREAM: <carry>: Update DOWNSTREAM_OWNERS_ALIASES
tmshort Mar 6, 2025
64f090d
UPSTREAM: <carry>: Add openshift node selector annotation
oceanc80 Mar 26, 2025
ff322a1
UPSTREAM: <carry>: Add caalogd-cas-dir option to op-con
tmshort Apr 15, 2025
31a6461
UPSTREAM: <carry>: set the SElinux type
jianzhangbjz Apr 27, 2025
277a507
UPSTREAM: <carry>: Add initial stack to run tests to validate the cat…
camilamacedo86 Apr 17, 2025
fb7a176
UPSTREAM: <carry>: Add vendor files for the catalog-sync tests
camilamacedo86 Apr 17, 2025
6e6c466
UPSTREAM: <carry>: Bump catalog versions to 4.19
tmshort Apr 24, 2025
8431fe8
UPSTREAM: <carry>: revert "Bump catalog versions to 4.19"
tmshort May 15, 2025
ed06fbc
UPSTREAM: <carry>: Update HOWTO-origin-tests
tmshort May 14, 2025
ec74e90
UPSTREAM: <carry>: [DefaultCatalogTests]: Allow to pass auth path for…
camilamacedo86 May 16, 2025
d5e2dd5
UPSTREAM: <carry>: fix: set NoLchown=true to allow image unpack on OCPci
camilamacedo86 May 19, 2025
8850389
UPSTREAM: <carry>: [DefaultCatalogTests]: Moving parse of ENVVAR to t…
camilamacedo86 May 17, 2025
55cd9e9
UPSTREAM: <carry>: [Default Catalog]: Create tmp dir to extract layer…
camilamacedo86 May 20, 2025
11ee1ae
UPSTREAM: <carry>: [Default Catalog](cleanp) Remove hack directory wh…
camilamacedo86 May 19, 2025
0c3555f
UPSTREAM: <carry>: Change code implementation to extract layers in OC…
camilamacedo86 May 21, 2025
94c326c
UPSTREAM: <carry>: Add vendor files for change in the extract code im…
camilamacedo86 May 21, 2025
3854441
UPSTREAM: <carry>: [Default Catalog Tests]: Final cleanups and enhanc…
camilamacedo86 May 22, 2025
a6e7aca
UPSTREAM: <carry>: SELinux type for operator-controller
jianzhangbjz May 22, 2025
3e33e5e
UPSTREAM: <carry>: Bump catalog versions to 4.19
tmshort Apr 24, 2025
341cf8a
UPSTREAM: <carry>: [Default Catalog Consistency Test] (feat) add chec…
camilamacedo86 May 28, 2025
bc40f20
UPSTREAM: <carry>: [Default Catalog Consistency Test]: fix junit outp…
camilamacedo86 Jun 2, 2025
372f943
UPSTREAM: <carry>: [Default Catalog Consistency Test] (feat) add chec…
camilamacedo86 May 29, 2025
11a5fec
UPSTREAM: <carry>: [Default Catalog Consistency Test]: Enable Catalog…
camilamacedo86 Jun 4, 2025
a16abae
UPSTREAM: <carry>: [Default Catalog Consistency Test]: Rename Tests s…
camilamacedo86 Jun 4, 2025
ff936d7
UPSTREAM: <carry>: Updating ose-olm-operator-controller-container ima…
Jun 18, 2025
9ac2329
UPSTREAM: <carry>: Updating ose-olm-catalogd-container image to be co…
Jun 18, 2025
c0a6bf0
UPSTREAM: <carry>: Update e2e registry to use 1.24/4.20
tmshort Jun 30, 2025
730f066
UPSTREAM: <carry>: [Catalog Default Tests]: Upgrade go version to 1.2…
camilamacedo86 Jul 1, 2025
5cdd8ba
UPSTREAM: <carry>: Add structure to allow move the orgin tests using OTE
camilamacedo86 Jun 13, 2025
3de03f0
UPSTREAM: <carry>: Add support for experimental manifests
tmshort Jul 2, 2025
80e332e
UPSTREAM: <carry>: [OTE] - chore: follow up #383 – remove unreachable…
camilamacedo86 Jul 10, 2025
9fdbdd5
UPSTREAM: <carry>: Remove build of test image registry
tmshort Jul 9, 2025
0d58b00
UPSTREAM: <carry>: Add test-experimental-e2e target to openshift Make…
tmshort Jul 15, 2025
748d982
UPSTREAM: <carry>: [OTE]: Add binary in the operator controller image…
camilamacedo86 Jul 11, 2025
ca50644
UPSTREAM: <carry>: Fix experimental manifest copying
tmshort Jul 17, 2025
0b434cb
UPSTREAM: <carry>: Update manifest generation for upstream rbac/webhooks
tmshort Jul 17, 2025
085dd1d
UPSTREAM: <carry>: [OTE] - Add tracking mechanism
camilamacedo86 Jul 17, 2025
c3efb16
UPSTREAM: <carry>: Update OTE dep to get fix
camilamacedo86 Jul 22, 2025
509b219
UPSTREAM: <carry>: [OTE] Add Readme
camilamacedo86 Jul 24, 2025
9389b95
UPSTREAM: <carry>: set GIT_COMMIT env from SOURCE_GIT_COMMIT in Docke…
rashmigottipati Jun 6, 2025
1b0f134
UPSTREAM: <carry>: add openshift specific build target to pass commit…
ankitathomas Jun 11, 2025
3eb90bb
UPSTREAM: <carry>: add source commit into binaries when linking
bentito Jul 9, 2025
041fb0f
UPSTREAM: <carry>: OTE add first test from openshift/origin olmv1.go
camilamacedo86 Jul 19, 2025
3b53832
UPSTREAM: <carry>: Migrate tasks from openshift/origin olm v1.go file…
camilamacedo86 Jul 31, 2025
8d7f672
UPSTREAM: <carry>: OTE - How to test locally with OCP instances
camilamacedo86 Aug 6, 2025
090a4ef
UPSTREAM: <carry>: [OTE] Refac: refac helper and olmv1 test to create…
camilamacedo86 Aug 8, 2025
0cab7d0
UPSTREAM: <carry>: [OTE] add webhook tests
camilamacedo86 Jul 31, 2025
f7986f2
UPSTREAM: <carry>: OTE: rewrite the upgrade incompatible operator test
tmshort Aug 11, 2025
a59d4ef
UPSTREAM: <carry>: Handle service-ca cert availability/rotation
tmshort Aug 15, 2025
2e3c8a5
UPSTREAM: <drop>: go mod vendor
Aug 18, 2025
a898d01
UPSTREAM: <drop>: remove upstream GitHub configuration
Aug 18, 2025
0253154
UPSTREAM: <drop>: configure the commit-checker
Aug 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 33 additions & 11 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,6 @@ EXPERIMENTAL_MANIFEST := ./manifests/experimental.yaml
EXPERIMENTAL_E2E_MANIFEST := ./manifests/experimental-e2e.yaml
CATALOGS_MANIFEST := ./manifests/default-catalogs.yaml

# Manifest used by kind-deploy, which may be overridden by other targets
SOURCE_MANIFEST := $(STANDARD_MANIFEST)

# Disable -j flag for make
.NOTPARALLEL:

Expand Down Expand Up @@ -277,14 +274,16 @@ test-e2e: SOURCE_MANIFEST := $(STANDARD_E2E_MANIFEST)
test-e2e: KIND_CLUSTER_NAME := operator-controller-e2e
test-e2e: GO_BUILD_EXTRA_FLAGS := -cover
test-e2e: COVERAGE_NAME := e2e
test-e2e: run image-registry prometheus e2e e2e-coverage kind-clean #HELP Run e2e test suite on local kind cluster
test-e2e: export MANIFEST := $(STANDARD_RELEASE_MANIFEST)
test-e2e: run-internal image-registry prometheus e2e e2e-coverage kind-clean #HELP Run e2e test suite on local kind cluster

.PHONY: test-experimental-e2e
test-experimental-e2e: SOURCE_MANIFEST := $(EXPERIMENTAL_E2E_MANIFEST)
test-experimental-e2e: KIND_CLUSTER_NAME := operator-controller-e2e
test-experimental-e2e: GO_BUILD_EXTRA_FLAGS := -cover
test-experimental-e2e: COVERAGE_NAME := experimental-e2e
test-experimental-e2e: run image-registry prometheus experimental-e2e e2e e2e-coverage kind-clean #HELP Run experimental e2e test suite on local kind cluster
test-experimental-e2e: export MANIFEST := $(EXPERIMENTAL_RELEASE_MANIFEST)
test-experimental-e2e: run-internal image-registry prometheus experimental-e2e e2e e2e-coverage kind-clean #HELP Run experimental e2e test suite on local kind cluster

.PHONY: prometheus
prometheus: PROMETHEUS_NAMESPACE := olmv1-system
Expand All @@ -293,13 +292,15 @@ prometheus: #EXHELP Deploy Prometheus into specified namespace
./hack/test/install-prometheus.sh $(PROMETHEUS_NAMESPACE) $(PROMETHEUS_VERSION) $(KUSTOMIZE) $(VERSION)

.PHONY: test-extension-developer-e2e
test-extension-developer-e2e: SOURCE_MANIFEST := $(STANDARD_E2E_MANIFEST)
test-extension-developer-e2e: KIND_CLUSTER_NAME := operator-controller-ext-dev-e2e
test-extension-developer-e2e: export INSTALL_DEFAULT_CATALOGS := false
test-extension-developer-e2e: run image-registry extension-developer-e2e kind-clean #HELP Run extension-developer e2e on local kind cluster
test-extension-developer-e2e: export MANIFEST := $(STANDARD_RELEASE_MANIFEST)
test-extension-developer-e2e: run-internal image-registry extension-developer-e2e kind-clean #HELP Run extension-developer e2e on local kind cluster

.PHONY: run-latest-release
run-latest-release:
curl -L -s https://github.com/operator-framework/operator-controller/releases/latest/download/$(notdir $(STANDARD_RELEASE_INSTALL)) | bash -s
curl -L -s https://github.com/operator-framework/operator-controller/releases/latest/download/$(notdir $(RELEASE_INSTALL)) | bash -s

.PHONY: pre-upgrade-setup
pre-upgrade-setup:
Expand All @@ -309,11 +310,27 @@ pre-upgrade-setup:
post-upgrade-checks:
go test -count=1 -v ./test/upgrade-e2e/...


TEST_UPGRADE_E2E_TASKS := kind-cluster run-latest-release image-registry pre-upgrade-setup docker-build kind-load kind-deploy post-upgrade-checks kind-clean

.PHONY: test-upgrade-e2e
test-upgrade-e2e: SOURCE_MANIFEST := $(STANDARD_MANIFEST)
test-upgrade-e2e: RELEASE_INSTALL := $(STANDARD_RELEASE_INSTALL)
test-upgrade-e2e: KIND_CLUSTER_NAME := operator-controller-upgrade-e2e
test-upgrade-e2e: export MANIFEST := $(STANDARD_RELEASE_MANIFEST)
test-upgrade-e2e: export TEST_CLUSTER_CATALOG_NAME := test-catalog
test-upgrade-e2e: export TEST_CLUSTER_EXTENSION_NAME := test-package
test-upgrade-e2e: kind-cluster run-latest-release image-registry pre-upgrade-setup docker-build kind-load kind-deploy post-upgrade-checks kind-clean #HELP Run upgrade e2e tests on a local kind cluster
test-upgrade-e2e: $(TEST_UPGRADE_E2E_TASKS) #HELP Run upgrade e2e tests on a local kind cluster

.PHONY: test-upgrade-experimental-e2e
test-upgrade-experimental-e2e: SOURCE_MANIFEST := $(EXPERIMENTAL_MANIFEST)
test-upgrade-experimental-e2e: RELEASE_INSTALL := $(EXPERIMENTAL_RELEASE_INSTALL)
test-upgrade-experimental-e2e: KIND_CLUSTER_NAME := operator-controller-upgrade-experimental-e2e
test-upgrade-experimental-e2e: export MANIFEST := $(EXPERIMENTAL_RELEASE_MANIFEST)
test-upgrade-experimental-e2e: export TEST_CLUSTER_CATALOG_NAME := test-catalog
test-upgrade-experimental-e2e: export TEST_CLUSTER_EXTENSION_NAME := test-package
test-upgrade-experimental-e2e: $(TEST_UPGRADE_E2E_TASKS) #HELP Run upgrade e2e tests on a local kind cluster


.PHONY: e2e-coverage
e2e-coverage:
Expand All @@ -327,7 +344,6 @@ kind-load: $(KIND) #EXHELP Loads the currently constructed images into the KIND
$(CONTAINER_RUNTIME) save $(CATD_IMG) | $(KIND) load image-archive /dev/stdin --name $(KIND_CLUSTER_NAME)

.PHONY: kind-deploy
kind-deploy: export MANIFEST := $(STANDARD_RELEASE_MANIFEST)
kind-deploy: export DEFAULT_CATALOG := $(RELEASE_CATALOGS)
kind-deploy: manifests
@echo -e "\n\U1F4D8 Using $(SOURCE_MANIFEST) as source manifest\n"
Expand Down Expand Up @@ -401,12 +417,18 @@ go-build-linux: export GOOS=linux
go-build-linux: export GOARCH=amd64
go-build-linux: $(BINARIES)

.PHONY: run-internal
run-internal: docker-build kind-cluster kind-load kind-deploy wait

.PHONY: run
run: docker-build kind-cluster kind-load kind-deploy wait #HELP Build the operator-controller then deploy it into a new kind cluster.
run: SOURCE_MANIFEST := $(STANDARD_MANIFEST)
run: export MANIFEST := $(STANDARD_RELEASE_MANIFEST)
run: run-internal #HELP Build operator-controller then deploy it with the standard manifest into a new kind cluster.

.PHONY: run-experimental
run-experimental: SOURCE_MANIFEST := $(EXPERIMENTAL_MANIFEST)
run-experimental: run #HELP Build the operator-controller then deploy it with the experimental manifest into a new kind cluster.
run-experimental: export MANIFEST := $(EXPERIMENTAL_RELEASE_MANIFEST)
run-experimental: run-internal #HELP Build the operator-controller then deploy it with the experimental manifest into a new kind cluster.

CATD_NAMESPACE := olmv1-system
wait:
Expand Down
2 changes: 1 addition & 1 deletion commitchecker.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
expectedMergeBase: 0e0e70605e09910fca8cb701c9e9b436c0f23826
expectedMergeBase: eebdcea5ba8b91c07719a5342c50f9fabd0ebf83
upstreamBranch: main
upstreamOrg: operator-framework
upstreamRepo: operator-controller
2 changes: 2 additions & 0 deletions hack/test/pre-upgrade-setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,10 @@ rules:
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- "olm.operatorframework.io"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ spec:
type: Image
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/certified-operator-index:v4.20
ref: registry.redhat.io/redhat/certified-operator-index:v4.19
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ spec:
type: Image
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/community-operator-index:v4.20
ref: registry.redhat.io/redhat/community-operator-index:v4.19
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ spec:
type: Image
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/redhat-marketplace-index:v4.20
ref: registry.redhat.io/redhat/redhat-marketplace-index:v4.19
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ spec:
type: Image
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/redhat-operator-index:v4.20
ref: registry.redhat.io/redhat/redhat-operator-index:v4.19
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ spec:
source:
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/certified-operator-index:v4.20
ref: registry.redhat.io/redhat/certified-operator-index:v4.19
type: Image
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ spec:
source:
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/community-operator-index:v4.20
ref: registry.redhat.io/redhat/community-operator-index:v4.19
type: Image
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ spec:
source:
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/redhat-marketplace-index:v4.20
ref: registry.redhat.io/redhat/redhat-marketplace-index:v4.19
type: Image
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ spec:
source:
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/redhat-operator-index:v4.20
ref: registry.redhat.io/redhat/redhat-operator-index:v4.19
type: Image
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ spec:
source:
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/certified-operator-index:v4.20
ref: registry.redhat.io/redhat/certified-operator-index:v4.19
type: Image
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ spec:
source:
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/community-operator-index:v4.20
ref: registry.redhat.io/redhat/community-operator-index:v4.19
type: Image
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ spec:
source:
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/redhat-marketplace-index:v4.20
ref: registry.redhat.io/redhat/redhat-marketplace-index:v4.19
type: Image
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ spec:
source:
image:
pollIntervalMinutes: 10
ref: registry.redhat.io/redhat/redhat-operator-index:v4.20
ref: registry.redhat.io/redhat/redhat-operator-index:v4.19
type: Image
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,55 @@
"source": "openshift:payload:olmv1",
"lifecycle": "blocking",
"environmentSelector": {}
},
{
"name": "[sig-olmv1][OCPFeatureGate:NewOLMWebhookProviderOpenshiftServiceCA][Skipped:Disconnected][Serial] OLMv1 operator with webhooks should have a working validating webhook",
"labels": {},
"resources": {
"isolation": {}
},
"source": "openshift:payload:olmv1",
"lifecycle": "blocking",
"environmentSelector": {}
},
{
"name": "[sig-olmv1][OCPFeatureGate:NewOLMWebhookProviderOpenshiftServiceCA][Skipped:Disconnected][Serial] OLMv1 operator with webhooks should have a working mutating webhook",
"labels": {},
"resources": {
"isolation": {}
},
"source": "openshift:payload:olmv1",
"lifecycle": "blocking",
"environmentSelector": {}
},
{
"name": "[sig-olmv1][OCPFeatureGate:NewOLMWebhookProviderOpenshiftServiceCA][Skipped:Disconnected][Serial] OLMv1 operator with webhooks should have a working conversion webhook",
"labels": {},
"resources": {
"isolation": {}
},
"source": "openshift:payload:olmv1",
"lifecycle": "blocking",
"environmentSelector": {}
},
{
"name": "[sig-olmv1][OCPFeatureGate:NewOLMWebhookProviderOpenshiftServiceCA][Skipped:Disconnected][Serial] OLMv1 operator with webhooks should be tolerant to openshift-service-ca certificate rotation",
"labels": {},
"resources": {
"isolation": {}
},
"source": "openshift:payload:olmv1",
"lifecycle": "blocking",
"environmentSelector": {}
},
{
"name": "[sig-olmv1][OCPFeatureGate:NewOLMWebhookProviderOpenshiftServiceCA][Skipped:Disconnected][Serial] OLMv1 operator with webhooks should be tolerant to tls secret deletion",
"labels": {},
"resources": {
"isolation": {}
},
"source": "openshift:payload:olmv1",
"lifecycle": "blocking",
"environmentSelector": {}
}
]
4 changes: 2 additions & 2 deletions openshift/tests-extension/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ pkg/bindata/catalog/catalog.go: $(shell find testdata/catalog -type f)
# It prevents various FIPS compliance policies from being applied to this compilation.
# Do not set globally.
.PHONY: build
build: #HELP Build the extended tests binary
build: bindata #HELP Build the extended tests binary
@mkdir -p $(TOOLS_BIN_DIR)
GO_COMPLIANCE_POLICY="exempt_all" go build -ldflags "$(LDFLAGS)" -mod=vendor -o $(TOOLS_BIN_DIR)/olmv1-tests-ext ./cmd/...

Expand Down Expand Up @@ -125,7 +125,7 @@ update-metadata: #HELP Build and run 'update-metadata' to generate test metadata
# This will regenerate the metadata without the test entry.
#────────────────────────────────────────────────────────────────────
.PHONY: build-update
build-update: bindata build update-metadata #HELP Build and update metadata and sanitize output
build-update: build update-metadata #HELP Build and update metadata and sanitize output

#SECTION Metadata

Expand Down
52 changes: 52 additions & 0 deletions openshift/tests-extension/pkg/helpers/catalogs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package helpers

import (
"context"
"fmt"
"time"

//nolint:staticcheck // ST1001: dot-imports for readability
. "github.com/onsi/gomega"

"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/controller-runtime/pkg/client"

olmv1 "github.com/operator-framework/operator-controller/api/v1"

"github/operator-framework-operator-controller/openshift/tests-extension/pkg/env"
)

// NewClusterCatalog returns a new ClusterCatalog object.
// It sets the image reference as source.
func NewClusterCatalog(name, imageRef string) *olmv1.ClusterCatalog {
return &olmv1.ClusterCatalog{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
Spec: olmv1.ClusterCatalogSpec{
Source: olmv1.CatalogSource{
Type: olmv1.SourceTypeImage,
Image: &olmv1.ImageSource{
Ref: imageRef,
},
},
},
}
}

// ExpectCatalogToBeServing checks that the catalog with the given name is installed
func ExpectCatalogToBeServing(ctx context.Context, name string) {
k8sClient := env.Get().K8sClient
Eventually(func(g Gomega) {
var catalog olmv1.ClusterCatalog
err := k8sClient.Get(ctx, client.ObjectKey{Name: name}, &catalog)
g.Expect(err).ToNot(HaveOccurred(), fmt.Sprintf("failed to get catalog %q", name))

conditions := catalog.Status.Conditions
g.Expect(conditions).NotTo(BeEmpty(), fmt.Sprintf("catalog %q has empty status.conditions", name))

g.Expect(meta.IsStatusConditionPresentAndEqual(conditions, olmv1.TypeServing, metav1.ConditionTrue)).
To(BeTrue(), fmt.Sprintf("catalog %q is not serving", name))
}).WithTimeout(5 * time.Minute).WithPolling(5 * time.Second).Should(Succeed())
}
Loading