Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
0d5ab2c
Add CheckObjectSupport validator with unit tests (#2523)
perdasilva Feb 26, 2026
32761fc
Update golang to 1.25.7 (#2526)
tmshort Feb 26, 2026
25704ad
:seedling: Bump platformdirs from 4.5.1 to 4.6.0 (#2529)
dependabot[bot] Feb 26, 2026
c642f05
Merge branch 'main' into synchronize
tmshort Feb 26, 2026
900a020
UPSTREAM: <carry>: Add OpenShift specific files
dtfranz Oct 26, 2023
9e78d12
UPSTREAM: <carry>: Add new tests for single/own namespaces install modes
camilamacedo86 Oct 6, 2025
0c48027
UPSTREAM: <carry>: Upgrade OCP image from 4.20 to 4.21
camilamacedo86 Oct 13, 2025
3aaa4ac
UPSTREAM: <carry>: [Default Catalog Tests] - Change logic to get ocp …
camilamacedo86 Oct 13, 2025
b7e099c
UPSTREAM: <carry>: Update OCP catalogs to v4.21
tmshort Oct 13, 2025
6286659
UPSTREAM: <carry>: support singleown cases in disconnected
kuiwang02 Oct 16, 2025
f9609b1
UPSTREAM: <carry>: fix cases 81696 and 74618 for product code changes
kuiwang02 Oct 17, 2025
04075be
UPSTREAM: <carry>: Define Default timeouts and apply their usage accr…
camilamacedo86 Oct 22, 2025
a32b45c
UPSTREAM: <carry>: Update to new feature-gate options in helm
tmshort Oct 22, 2025
b50398e
UPSTREAM: <carry>: Fix flake for single/own ns tests by ensuring uniq…
camilamacedo86 Oct 22, 2025
9d82c19
UPSTREAM: <carry>: [OTE]: Enhance single/own ns based on review comme…
camilamacedo86 Oct 24, 2025
7ee3a60
UPSTREAM: <carry>: Update OwnSingle template to use spec.config.inlin…
kuiwang02 Nov 3, 2025
d2f8752
UPSTREAM: <carry>: [OTE]: Add webhook cleanup validation on extension…
camilamacedo86 Nov 4, 2025
93d95bc
UPSTREAM: <carry>: Add [OTP] to migrated cases
kuiwang02 Nov 7, 2025
c7e9680
UPSTREAM: <carry>: [OTE]: Upgrade dependencies used
camilamacedo86 Nov 5, 2025
b9c134c
UPSTREAM: <carry>: fix(OTE): fix OpenShift Kubernetes replace version…
camilamacedo86 Nov 10, 2025
a80c97f
UPSTREAM: <carry>: [Default Catalog Tests] Upgrade go 1.24.6 and depe…
camilamacedo86 Nov 11, 2025
af42fa4
UPSTREAM: <carry>: add disconnected environment support with custom p…
kuiwang02 Nov 12, 2025
2033945
UPSTREAM: <carry>: migrate jiazha test cases to OTE
jianzhangbjz Nov 14, 2025
5348ed3
UPSTREAM: <carry>: migrate clustercatalog case to ote
Xia-Zhao-rh Oct 17, 2025
db1a52b
UPSTREAM: <carry>: migrate olmv1 QE stress cases
kuiwang02 Nov 20, 2025
bc4de2f
UPSTREAM: <carry>: Use busybox/httpd to simulate probes
tmshort Nov 25, 2025
379bf2f
UPSTREAM: <carry>: migrate olmv1 QE cases
Xia-Zhao-rh Nov 25, 2025
e7305b9
UPSTREAM: <carry>: add agent for olmv1 qe cases
kuiwang02 Oct 21, 2025
fd97489
UPSTREAM: <carry>: Disable upstream PodDisruptionBudget
tmshort Dec 3, 2025
2ccd116
UPSTREAM: <carry>: Add AGENTS.md for AI code contributions
rashmigottipati Dec 11, 2025
c1c0b35
UPSTREAM: <carry>: address review comments through addl prompts
rashmigottipati Dec 11, 2025
363d096
UPSTREAM: <carry>: addressing some more review comments
rashmigottipati Dec 11, 2025
a4f52a3
UPSTREAM: <carry>: remove DCO line
rashmigottipati Dec 11, 2025
a31916b
UPSTREAM: <carry>: migrate bandrade test cases to OTE
bandrade Nov 18, 2025
3ac31dd
UPSTREAM: <carry>: update metadata
bandrade Dec 3, 2025
93d0cd8
UPSTREAM: <carry>: remove originalName
bandrade Dec 3, 2025
405fe9f
UPSTREAM: <carry>: update 80458's timeout to 180s
jianzhangbjz Dec 8, 2025
76f0ed3
UPSTREAM: <carry>: update 83026 to specify the clustercatalog
jianzhangbjz Dec 15, 2025
7d4ee9f
UPSTREAM: <carry>: Update to golang 1.25 and ocp 4.22
oceanc80 Dec 18, 2025
fee5e8b
UPSTREAM: <carry>: Use oc client for running e2e tests
pedjak Jan 13, 2026
e3af695
UPSTREAM: <carry>: Run upstream e2e tests tagged with `@catalogd-update`
pedjak Jan 14, 2026
5dc1c99
UPSTREAM: <carry>: enhance case to make it more stable
kuiwang02 Jan 6, 2026
534f3f9
UPSTREAM: <carry>: add service account to curl job
ehearne-redhat Jan 7, 2026
10b8f0f
UPSTREAM: <carry>: move sa creation out of buildCurlJob()
ehearne-redhat Jan 8, 2026
17c8078
UPSTREAM: <carry>: comment out delete service account
ehearne-redhat Jan 9, 2026
0d6e641
UPSTREAM: <carry>: move defercleanup for sa for LIFO
ehearne-redhat Jan 9, 2026
8dcff11
UPSTREAM: <carry>: add polling so job fully deleted before proceed
ehearne-redhat Jan 12, 2026
8522386
UPSTREAM: <carry>: Revert "Merge pull request #594 from ehearne-redha…
sosiouxme Jan 20, 2026
bbe8563
UPSTREAM: <carry>: Remove openshift-redhat-marketplace catalog tests
camilamacedo86 Jan 8, 2026
7e6da77
UPSTREAM: <carry>: config watchnamespace cases
kuiwang02 Jan 6, 2026
edc3960
UPSTREAM: <carry>: enhance ocp-79770
Xia-Zhao-rh Jan 26, 2026
0e7882a
UPSTREAM: <carry>: upgrade version support case
kuiwang02 Jan 28, 2026
c252cc9
UPSTREAM: <carry>: Remove installed condition check from auth preflig…
Jan 30, 2026
501fcc9
UPSTREAM: <carry>: Add openshift/api dependency
Jan 30, 2026
14de308
UPSTREAM: <carry>: Add boxcutter specific preflight auth test
Jan 30, 2026
635d492
UPSTREAM: <carry>: adjust watchnamespace case based on change
kuiwang02 Feb 2, 2026
f2cf6dd
UPSTREAM: <carry>: fix(ote): Use as operator-controller dep from root…
camilamacedo86 Feb 3, 2026
d538aa7
UPSTREAM: <carry>: add 83979 automation
bandrade Feb 2, 2026
6c74f17
UPSTREAM: <carry>: add 85889 automation
bandrade Feb 2, 2026
7e9d724
UPSTREAM: <carry>: Update test-operator startup script to fix pod pro…
Feb 4, 2026
56ac425
UPSTREAM: <carry>: Fix up own-namespace invalid configuration test
Feb 7, 2026
56a79ba
UPSTREAM: <carry>: Preflight tests use in-cluster catalog and bundles…
camilamacedo86 Feb 24, 2026
d2067ab
UPSTREAM: <drop>: go mod vendor
tmshort Feb 26, 2026
36454a5
UPSTREAM: <drop>: remove upstream GitHub configuration
tmshort Feb 26, 2026
b9377ae
UPSTREAM: <drop>: configure the commit-checker
tmshort Feb 26, 2026
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
2 changes: 1 addition & 1 deletion commitchecker.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
expectedMergeBase: dfd25de92909f8a72869cfd0b1377b4fd524df8c
expectedMergeBase: 25704ad1e1d3dd9029d01b918829850f7139a63a
upstreamBranch: main
upstreamOrg: operator-framework
upstreamRepo: operator-controller
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/operator-framework/operator-controller

go 1.25.3
go 1.25.7

require (
github.com/BurntSushi/toml v1.6.0
Expand Down
2 changes: 1 addition & 1 deletion hack/kind-config/containerd/certs.d/go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module hack-cert.d

go 1.25.3
go 1.25.7

// This file is present in the certs.d directory to ensure that
// certs.d/host:port directories are not included in the main go
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ var BundleValidator = render.BundleValidator{
validators.CheckConversionWebhookCRDReferenceUniqueness,
validators.CheckConversionWebhooksReferenceOwnedCRDs,
validators.CheckWebhookRules,
validators.CheckObjectSupport,
}

// ResourceGenerators a slice of ResourceGenerators required to generate plain resource manifests for
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ func Test_BundleValidatorHasAllValidationFns(t *testing.T) {
validators.CheckConversionWebhookCRDReferenceUniqueness,
validators.CheckConversionWebhooksReferenceOwnedCRDs,
validators.CheckWebhookRules,
validators.CheckObjectSupport,
}
actualValidationFns := registryv1.BundleValidator

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"k8s.io/apimachinery/pkg/util/validation"

"github.com/operator-framework/api/pkg/operators/v1alpha1"
regv1bundle "github.com/operator-framework/operator-registry/pkg/lib/bundle"

"github.com/operator-framework/operator-controller/internal/operator-controller/rukpak/bundle"
)
Expand Down Expand Up @@ -348,3 +349,16 @@ func CheckWebhookRules(rv1 *bundle.RegistryV1) []error {
}
return errs
}

// CheckObjectSupport checks that the non-CRD and non-CSV bundle objects are supported by the
// registry+v1 standard
func CheckObjectSupport(rv1 *bundle.RegistryV1) []error {
var errs []error
for _, obj := range rv1.Others {
kind := obj.GetObjectKind().GroupVersionKind().Kind
if ok, _ := regv1bundle.IsSupported(kind); !ok {
errs = append(errs, fmt.Errorf("unsupported resource %q with kind %q", obj.GetName(), kind))
}
}
return errs
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"

"github.com/operator-framework/api/pkg/operators/v1alpha1"

Expand Down Expand Up @@ -1171,3 +1173,82 @@ func Test_CheckWebhookNameIsDNS1123SubDomain(t *testing.T) {
})
}
}

func newUnstructuredObject(gvk schema.GroupVersionKind, name string) unstructured.Unstructured {
obj := unstructured.Unstructured{}
obj.SetGroupVersionKind(gvk)
obj.SetName(name)
return obj
}

func Test_CheckObjectSupport(t *testing.T) {
for _, tc := range []struct {
name string
bundle *bundle.RegistryV1
expectedErrs []error
}{
{
name: "accepts bundles with no other objects",
bundle: &bundle.RegistryV1{},
expectedErrs: nil,
},
{
name: "accepts bundles with supported object kinds",
bundle: &bundle.RegistryV1{
Others: []unstructured.Unstructured{
newUnstructuredObject(schema.GroupVersionKind{Group: "", Version: "v1", Kind: "Secret"}, "my-secret"),
newUnstructuredObject(schema.GroupVersionKind{Group: "", Version: "v1", Kind: "ConfigMap"}, "my-configmap"),
newUnstructuredObject(schema.GroupVersionKind{Group: "", Version: "v1", Kind: "ServiceAccount"}, "my-sa"),
newUnstructuredObject(schema.GroupVersionKind{Group: "", Version: "v1", Kind: "Service"}, "my-service"),
newUnstructuredObject(schema.GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRole"}, "my-clusterrole"),
newUnstructuredObject(schema.GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "ClusterRoleBinding"}, "my-clusterrolebinding"),
newUnstructuredObject(schema.GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "Role"}, "my-role"),
newUnstructuredObject(schema.GroupVersionKind{Group: "rbac.authorization.k8s.io", Version: "v1", Kind: "RoleBinding"}, "my-rolebinding"),
},
},
expectedErrs: nil,
},
{
name: "rejects bundles with unsupported object kinds",
bundle: &bundle.RegistryV1{
Others: []unstructured.Unstructured{
newUnstructuredObject(schema.GroupVersionKind{Group: "apps", Version: "v1", Kind: "Deployment"}, "my-deployment"),
},
},
expectedErrs: []error{
errors.New(`unsupported resource "my-deployment" with kind "Deployment"`),
},
},
{
name: "reports errors for each unsupported object",
bundle: &bundle.RegistryV1{
Others: []unstructured.Unstructured{
newUnstructuredObject(schema.GroupVersionKind{Group: "apps", Version: "v1", Kind: "Deployment"}, "my-deployment"),
newUnstructuredObject(schema.GroupVersionKind{Group: "apps", Version: "v1", Kind: "StatefulSet"}, "my-statefulset"),
},
},
expectedErrs: []error{
errors.New(`unsupported resource "my-deployment" with kind "Deployment"`),
errors.New(`unsupported resource "my-statefulset" with kind "StatefulSet"`),
},
},
{
name: "accepts supported objects and rejects unsupported objects in the same bundle",
bundle: &bundle.RegistryV1{
Others: []unstructured.Unstructured{
newUnstructuredObject(schema.GroupVersionKind{Group: "", Version: "v1", Kind: "ConfigMap"}, "my-configmap"),
newUnstructuredObject(schema.GroupVersionKind{Group: "batch", Version: "v1", Kind: "Job"}, "my-job"),
newUnstructuredObject(schema.GroupVersionKind{Group: "", Version: "v1", Kind: "Secret"}, "my-secret"),
},
},
expectedErrs: []error{
errors.New(`unsupported resource "my-job" with kind "Job"`),
},
},
} {
t.Run(tc.name, func(t *testing.T) {
errs := validators.CheckObjectSupport(tc.bundle)
require.Equal(t, tc.expectedErrs, errs)
})
}
}
2 changes: 1 addition & 1 deletion openshift/tests-extension/go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/openshift/operator-framework-operator-controller/openshift/tests-extension

go 1.25.3
go 1.25.7

require (
github.com/blang/semver/v4 v4.0.0
Expand Down
34 changes: 3 additions & 31 deletions openshift/tests-extension/test/olmv1-catalog.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (

batchv1 "k8s.io/api/batch/v1"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -77,38 +76,12 @@ func verifyCatalogEndpoint(ctx SpecContext, catalog, endpoint, query string) {
strings.ReplaceAll(endpoint, "?", ""),
strings.ReplaceAll(catalog, "-", ""))

// create service account object
serviceAccount := &corev1.ServiceAccount{
ObjectMeta: metav1.ObjectMeta{
Name: jobNamePrefix,
Namespace: "default",
},
}

err = k8sClient.Create(ctx, serviceAccount)

Expect(err).To(Or(BeNil(), Satisfy(apierrors.IsAlreadyExists)),
"Failed to ensure ServiceAccount %s", jobNamePrefix)

DeferCleanup(func(ctx SpecContext) {
_ = k8sClient.Delete(ctx, serviceAccount)
})

job := buildCurlJob(jobNamePrefix, "default", serviceURL, serviceAccount)

job := buildCurlJob(jobNamePrefix, "default", serviceURL)
err = k8sClient.Create(ctx, job)
Expect(err).NotTo(HaveOccurred(), "failed to create Job")

DeferCleanup(func(ctx SpecContext) {
_ = k8sClient.Delete(ctx, job)
// We poll for deletion success so that the cleanup succeeds only when
// the job is deleted. Then, we can move onto deleting the service
// account without issue.
Eventually(func(g Gomega) {
recheck := &batchv1.Job{}
err := k8sClient.Get(ctx, client.ObjectKeyFromObject(job), recheck)
g.Expect(apierrors.IsNotFound(err)).To(BeTrue(), fmt.Sprintf("Job %v should be deleted", job.Name))
}).WithTimeout(helpers.DefaultTimeout).WithPolling(helpers.DefaultPolling).Should(Succeed())
})

By("Waiting for Job to succeed")
Expand Down Expand Up @@ -230,7 +203,7 @@ var _ = Describe("[sig-olmv1][OCPFeatureGate:NewOLM][Skipped:Disconnected] OLMv1
})
})

func buildCurlJob(prefix, namespace, url string, serviceAccount *corev1.ServiceAccount) *batchv1.Job {
func buildCurlJob(prefix, namespace, url string) *batchv1.Job {
backoff := int32(1)
// This means the k8s garbage collector will automatically delete the job 5 minutes
// after it has completed or failed.
Expand Down Expand Up @@ -259,8 +232,7 @@ func buildCurlJob(prefix, namespace, url string, serviceAccount *corev1.ServiceA
BackoffLimit: &backoff,
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
ServiceAccountName: serviceAccount.Name,
RestartPolicy: corev1.RestartPolicyNever,
RestartPolicy: corev1.RestartPolicyNever,
Containers: []corev1.Container{{
Name: "api-tester",
Image: "registry.redhat.io/rhel8/httpd-24:latest",
Expand Down
2 changes: 1 addition & 1 deletion openshift/tests-extension/vendor/modules.txt
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ github.com/openshift/client-go/user/clientset/versioned/typed/user/v1
## explicit; go 1.24.0
github.com/openshift/origin/test/extended/util/image
# github.com/operator-framework/operator-controller v1.5.1 => ../../
## explicit; go 1.25.3
## explicit; go 1.25.7
github.com/operator-framework/operator-controller/api/v1
# github.com/pborman/uuid v1.2.1
## explicit
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ mkdocs-material-extensions==1.3.1
packaging==26.0
paginate==0.5.7
pathspec==1.0.4
platformdirs==4.5.1
platformdirs==4.6.0
Pygments==2.19.2
pymdown-extensions==10.20.1
pyquery==2.0.1
Expand Down