Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
087b5b4
Drop e2e test msg `testing: warning: no tests to run` (#2509)
pedjak Feb 16, 2026
02f3666
:seedling: Bump babel from 2.17.0 to 2.18.0 (#2510)
dependabot[bot] Feb 16, 2026
23dd207
Add `/list-e2e-steps` Claude Code command (#2508)
pedjak Feb 16, 2026
130c987
ClusterExtensionRevision API Updates (#2491)
dtfranz Feb 17, 2026
fb28936
Replace cluster-admin with least-privilege RBAC for BoxcutterRuntime …
perdasilva Feb 18, 2026
480aa4c
Merge branch 'main' into synchronize
Feb 19, 2026
5d84c41
UPSTREAM: <carry>: Add OpenShift specific files
dtfranz Oct 26, 2023
5bbfa99
UPSTREAM: <carry>: Add new tests for single/own namespaces install modes
camilamacedo86 Oct 6, 2025
f026564
UPSTREAM: <carry>: Upgrade OCP image from 4.20 to 4.21
camilamacedo86 Oct 13, 2025
6be8233
UPSTREAM: <carry>: [Default Catalog Tests] - Change logic to get ocp …
camilamacedo86 Oct 13, 2025
9308927
UPSTREAM: <carry>: Update OCP catalogs to v4.21
tmshort Oct 13, 2025
22b7155
UPSTREAM: <carry>: support singleown cases in disconnected
kuiwang02 Oct 16, 2025
ae59a15
UPSTREAM: <carry>: fix cases 81696 and 74618 for product code changes
kuiwang02 Oct 17, 2025
a10124b
UPSTREAM: <carry>: Define Default timeouts and apply their usage accr…
camilamacedo86 Oct 22, 2025
33dd22e
UPSTREAM: <carry>: Update to new feature-gate options in helm
tmshort Oct 22, 2025
1056d1e
UPSTREAM: <carry>: Fix flake for single/own ns tests by ensuring uniq…
camilamacedo86 Oct 22, 2025
319e0dd
UPSTREAM: <carry>: [OTE]: Enhance single/own ns based on review comme…
camilamacedo86 Oct 24, 2025
a180ac1
UPSTREAM: <carry>: Update OwnSingle template to use spec.config.inlin…
kuiwang02 Nov 3, 2025
b2d1368
UPSTREAM: <carry>: [OTE]: Add webhook cleanup validation on extension…
camilamacedo86 Nov 4, 2025
6e5549e
UPSTREAM: <carry>: Add [OTP] to migrated cases
kuiwang02 Nov 7, 2025
ae2fcae
UPSTREAM: <carry>: [OTE]: Upgrade dependencies used
camilamacedo86 Nov 5, 2025
ac5cf95
UPSTREAM: <carry>: fix(OTE): fix OpenShift Kubernetes replace version…
camilamacedo86 Nov 10, 2025
accc3c2
UPSTREAM: <carry>: [Default Catalog Tests] Upgrade go 1.24.6 and depe…
camilamacedo86 Nov 11, 2025
447a78c
UPSTREAM: <carry>: add disconnected environment support with custom p…
kuiwang02 Nov 12, 2025
e90ccb0
UPSTREAM: <carry>: migrate jiazha test cases to OTE
jianzhangbjz Nov 14, 2025
98bc0ca
UPSTREAM: <carry>: migrate clustercatalog case to ote
Xia-Zhao-rh Oct 17, 2025
4fac1be
UPSTREAM: <carry>: migrate olmv1 QE stress cases
kuiwang02 Nov 20, 2025
e6d9946
UPSTREAM: <carry>: Use busybox/httpd to simulate probes
tmshort Nov 25, 2025
ec47afc
UPSTREAM: <carry>: migrate olmv1 QE cases
Xia-Zhao-rh Nov 25, 2025
3748a37
UPSTREAM: <carry>: add agent for olmv1 qe cases
kuiwang02 Oct 21, 2025
e0eb962
UPSTREAM: <carry>: Disable upstream PodDisruptionBudget
tmshort Dec 3, 2025
324f72b
UPSTREAM: <carry>: Add AGENTS.md for AI code contributions
rashmigottipati Dec 11, 2025
40a239d
UPSTREAM: <carry>: address review comments through addl prompts
rashmigottipati Dec 11, 2025
e06b806
UPSTREAM: <carry>: addressing some more review comments
rashmigottipati Dec 11, 2025
9606979
UPSTREAM: <carry>: remove DCO line
rashmigottipati Dec 11, 2025
67b4c11
UPSTREAM: <carry>: migrate bandrade test cases to OTE
bandrade Nov 18, 2025
cdea95d
UPSTREAM: <carry>: update metadata
bandrade Dec 3, 2025
b1ab415
UPSTREAM: <carry>: remove originalName
bandrade Dec 3, 2025
c2cf52f
UPSTREAM: <carry>: update 80458's timeout to 180s
jianzhangbjz Dec 8, 2025
7b013cc
UPSTREAM: <carry>: update 83026 to specify the clustercatalog
jianzhangbjz Dec 15, 2025
8d08d6c
UPSTREAM: <carry>: Update to golang 1.25 and ocp 4.22
oceanc80 Dec 18, 2025
e60b5ab
UPSTREAM: <carry>: Use oc client for running e2e tests
pedjak Jan 13, 2026
de243ef
UPSTREAM: <carry>: Run upstream e2e tests tagged with `@catalogd-update`
pedjak Jan 14, 2026
03e8a77
UPSTREAM: <carry>: enhance case to make it more stable
kuiwang02 Jan 6, 2026
54ad79d
UPSTREAM: <carry>: add service account to curl job
ehearne-redhat Jan 7, 2026
abf5c86
UPSTREAM: <carry>: move sa creation out of buildCurlJob()
ehearne-redhat Jan 8, 2026
bb40a98
UPSTREAM: <carry>: comment out delete service account
ehearne-redhat Jan 9, 2026
59ec72c
UPSTREAM: <carry>: move defercleanup for sa for LIFO
ehearne-redhat Jan 9, 2026
1682d3a
UPSTREAM: <carry>: add polling so job fully deleted before proceed
ehearne-redhat Jan 12, 2026
954deba
UPSTREAM: <carry>: Revert "Merge pull request #594 from ehearne-redha…
sosiouxme Jan 20, 2026
808cb2d
UPSTREAM: <carry>: Remove openshift-redhat-marketplace catalog tests
camilamacedo86 Jan 8, 2026
48f5fd9
UPSTREAM: <carry>: config watchnamespace cases
kuiwang02 Jan 6, 2026
f3a4446
UPSTREAM: <carry>: enhance ocp-79770
Xia-Zhao-rh Jan 26, 2026
87c94d5
UPSTREAM: <carry>: upgrade version support case
kuiwang02 Jan 28, 2026
99c7fd9
UPSTREAM: <carry>: Remove installed condition check from auth preflig…
Jan 30, 2026
f2bb05a
UPSTREAM: <carry>: Add openshift/api dependency
Jan 30, 2026
c02caed
UPSTREAM: <carry>: Add boxcutter specific preflight auth test
Jan 30, 2026
4880ea2
UPSTREAM: <carry>: adjust watchnamespace case based on change
kuiwang02 Feb 2, 2026
b72f8e1
UPSTREAM: <carry>: fix(ote): Use as operator-controller dep from root…
camilamacedo86 Feb 3, 2026
9b5580f
UPSTREAM: <carry>: add 83979 automation
bandrade Feb 2, 2026
6abb478
UPSTREAM: <carry>: add 85889 automation
bandrade Feb 2, 2026
1208c2a
UPSTREAM: <carry>: Update test-operator startup script to fix pod pro…
Feb 4, 2026
aa81d8c
UPSTREAM: <carry>: Fix up own-namespace invalid configuration test
Feb 7, 2026
f272e80
UPSTREAM: <drop>: go mod vendor
Feb 19, 2026
5c0f550
UPSTREAM: <drop>: remove upstream GitHub configuration
Feb 19, 2026
14c767e
UPSTREAM: <drop>: configure the commit-checker
Feb 19, 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
100 changes: 100 additions & 0 deletions .claude/commands/list-e2e-steps.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
---
description: List all available Godog e2e step definitions with categories, parameters, and descriptions
---

# List E2E Steps

Generate a categorized reference of all Godog (Cucumber BDD) step definitions available for writing e2e feature files.

## Instructions for Claude AI

When this command is invoked, you MUST:

**CRITICAL:** The final output MUST be a comprehensive categorized reference displayed directly in the conversation. Do NOT just create files - output the full reference as your response.

1. **Get the authoritative list of registered step patterns**

Run:
```bash
go test ./test/e2e/features_test.go -d || true 2>&1
```
The `-d` flag prints all registered step definitions without running tests. Parse each step regex pattern from the output.

2. **Read the step registration and handler implementations**

Read `test/e2e/steps/steps.go` and locate the `RegisterSteps()` function. For each regex pattern from step 1, find its corresponding `sc.Step()` call and the handler function it references.

Then read each handler function's signature to determine:
- What parameters it accepts (string, int, `*godog.DocString`, etc.)
- Whether it expects a DocString (multi-line YAML block in the feature file)

Consult the handler documentation to understand what the step does. If the documentation is missing,
check what the handler actually does (kubectl commands, polling, assertions, etc.)

3. **Output a categorized reference**

Organize all steps into the following categories and format. Use the information gathered from the handler implementations to write accurate descriptions.

### Output Format

Start with a variable substitution reference, then list steps by category.

---

#### Variable Substitution

These variables are automatically replaced in DocString content and some string parameters:

| Variable | Replaced With | Example |
|---|---|-----------------------------------------------|
| `${TEST_NAMESPACE}` | Scenario's test namespace | `olmv1-e2e-abc123` |
| `${NAME}` | Current ClusterExtension name | `ce-123` |

---

#### Categories

Organize steps into these 10 categories. For each step, document:
- **Pattern**: The human-readable Gherkin step text (with capture groups shown as `<arg>`)
- **Parameters**: Each captured parameter with its Go type
- **DocString**: Whether the step expects a `"""` YAML block (and what it should contain)
- **Description**: What the handler function does, based on reading its documentation

**Categories:**

1. **Setup & Prerequisites** - OLM availability, ServiceAccount setup, permissions
2. **Catalog Management** - ClusterCatalog creation, updates, image tagging, deletion
3. **ClusterExtension Lifecycle** - Apply, update, remove ClusterExtension resources
4. **ClusterExtension Status & Conditions** - Condition checks, transition times, reconciliation
5. **ClusterExtensionRevision** - Revision-specific condition checks, archival, annotations, labels, active revisions
6. **Generic Resource Operations** - Get, delete, restore, match arbitrary resources
7. **Test Operator Control** - Marking test-operator deployment ready/not-ready
8. **Metrics** - Fetching and validating Prometheus metrics
9. **CRD Patching** - Setting minimum values on CRD fields

Group steps by category.

For each step entry, use this format:

```
### <N>. <Category Name>

#### `<human-readable pattern>`
- **Parameters:** `<name>` (string), ...
- **DocString:** Yes/No — <what to include if yes>
- **Description:** <what the handler does>
- **Handler:** `<FunctionName>` in steps.go:<line>
- **Polling:** Yes/No - <specify the timeout if yes>
```

---

#### Notes Section

After all categories, include a **Notes** section covering:

- **Case insensitivity**: Most patterns use `(?i)` — step text is case-insensitive
- **Resource format**: Steps accepting a `"resource"` parameter expect `kind/name` format (e.g., `"deployment/my-deploy"`)
- **Scenario context**: The ClusterExtension name is auto-captured when a ClusterExtension is applied — subsequent steps reference it implicitly
- **Duplicate aliases**: Some steps have multiple patterns mapping to the same handler (e.g., `resource "X" is installed` / `resource "X" is available` / `resource "X" exists` all map to `ResourceAvailable`). Note which are aliases.
- **Catalog naming convention**: Catalog steps automatically append `-catalog` to the name parameter (e.g., `"test"` becomes `"test-catalog"`)
26 changes: 19 additions & 7 deletions api/v1/clusterextensionrevision_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,18 @@ const (
type ClusterExtensionRevisionSpec struct {
// lifecycleState specifies the lifecycle state of the ClusterExtensionRevision.
//
// When set to "Active" (the default), the revision is actively managed and reconciled.
// When set to "Active", the revision is actively managed and reconciled.
// When set to "Archived", the revision is inactive and any resources not managed by a subsequent revision are deleted.
// The revision is removed from the owner list of all objects previously under management.
// All objects that did not transition to a succeeding revision are deleted.
//
// Once a revision is set to "Archived", it cannot be un-archived.
//
// +kubebuilder:default="Active"
// It is possible for more than one revision to be "Active" simultaneously. This will occur when
// moving from one revision to another. The old revision will not be set to "Archived" until the
// new revision has been completely rolled out.
//
// +required
// +kubebuilder:validation:Enum=Active;Archived
// +kubebuilder:validation:XValidation:rule="oldSelf == 'Active' || oldSelf == 'Archived' && oldSelf == self", message="cannot un-archive"
LifecycleState ClusterExtensionRevisionLifecycleState `json:"lifecycleState,omitempty"`
Expand Down Expand Up @@ -82,7 +86,10 @@ type ClusterExtensionRevisionSpec struct {
//
// Once set, even if empty, the phases field is immutable.
//
// Each phase in the list must have a unique name. The maximum number of phases is 20.
//
// +kubebuilder:validation:XValidation:rule="self == oldSelf || oldSelf.size() == 0", message="phases is immutable"
// +kubebuilder:validation:MaxItems=20
// +listType=map
// +listMapKey=name
// +optional
Expand Down Expand Up @@ -125,13 +132,17 @@ type ClusterExtensionRevisionPhase struct {
//
// [RFC 1123]: https://tools.ietf.org/html/rfc1123
//
// +required
// +kubebuilder:validation:MinLength=1
// +kubebuilder:validation:MaxLength=63
// +kubebuilder:validation:Pattern=`^[a-z]([-a-z0-9]*[a-z0-9])?$`
// +kubebuilder:validation:XValidation:rule=`!format.dns1123Label().validate(self).hasValue()`,message="the value must consist of only lowercase alphanumeric characters and hyphens, and must start with an alphabetic character and end with an alphanumeric character."
Name string `json:"name"`

// objects is a required list of all Kubernetes objects that belong to this phase.
//
// All objects in this list are applied to the cluster in no particular order.
// All objects in this list are applied to the cluster in no particular order. The maximum number of objects per phase is 50.
// +required
// +kubebuilder:validation:MaxItems=50
Objects []ClusterExtensionRevisionObject `json:"objects"`
}

Expand All @@ -149,7 +160,9 @@ type ClusterExtensionRevisionObject struct {
// collisionProtection controls whether the operator can adopt and modify objects
// that already exist on the cluster.
//
// When set to "Prevent" (the default), the operator only manages objects it created itself.
// Allowed values are: "Prevent", "IfNoController", and "None".
//
// When set to "Prevent", the operator only manages objects it created itself.
// This prevents ownership collisions.
//
// When set to "IfNoController", the operator can adopt and modify pre-existing objects
Expand All @@ -161,9 +174,8 @@ type ClusterExtensionRevisionObject struct {
// Use this setting with extreme caution as it may cause multiple controllers to fight over
// the same resource, resulting in increased load on the API server and etcd.
//
// +kubebuilder:default="Prevent"
// +required
// +kubebuilder:validation:Enum=Prevent;IfNoController;None
// +optional
CollisionProtection CollisionProtection `json:"collisionProtection,omitempty"`
}

Expand Down
87 changes: 79 additions & 8 deletions api/v1/clusterextensionrevision_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,18 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
}{
"revision is immutable": {
spec: ClusterExtensionRevisionSpec{
Revision: 1,
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
},
updateFunc: func(cer *ClusterExtensionRevision) {
cer.Spec.Revision = 2
},
},
"phases may be initially empty": {
spec: ClusterExtensionRevisionSpec{
Revision: 1,
Phases: []ClusterExtensionRevisionPhase{},
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
Phases: []ClusterExtensionRevisionPhase{},
},
updateFunc: func(cer *ClusterExtensionRevision) {
cer.Spec.Phases = []ClusterExtensionRevisionPhase{
Expand All @@ -44,7 +46,8 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
},
"phases may be initially unset": {
spec: ClusterExtensionRevisionSpec{
Revision: 1,
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
},
updateFunc: func(cer *ClusterExtensionRevision) {
cer.Spec.Phases = []ClusterExtensionRevisionPhase{
Expand All @@ -58,7 +61,8 @@ func TestClusterExtensionRevisionImmutability(t *testing.T) {
},
"phases are immutable if not empty": {
spec: ClusterExtensionRevisionSpec{
Revision: 1,
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
Phases: []ClusterExtensionRevisionPhase{
{
Name: "foo",
Expand Down Expand Up @@ -107,20 +111,87 @@ func TestClusterExtensionRevisionValidity(t *testing.T) {
}{
"revision cannot be negative": {
spec: ClusterExtensionRevisionSpec{
Revision: -1,
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: -1,
},
valid: false,
},
"revision cannot be zero": {
spec: ClusterExtensionRevisionSpec{},
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
},
valid: false,
},
"revision must be positive": {
spec: ClusterExtensionRevisionSpec{
Revision: 1,
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
},
valid: true,
},
"lifecycleState must be set": {
spec: ClusterExtensionRevisionSpec{
Revision: 1,
},
valid: false,
},
"phases must have no more than 20 phases": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
Phases: make([]ClusterExtensionRevisionPhase, 21),
},
valid: false,
},
"phases entries must have no more than 50 objects": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
Phases: []ClusterExtensionRevisionPhase{
{
Name: "too-many-objects",
Objects: make([]ClusterExtensionRevisionObject, 51),
},
},
},
valid: false,
},
"phases entry names cannot be empty": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
Phases: []ClusterExtensionRevisionPhase{
{
Name: "",
},
},
},
valid: false,
},
"phases entry names cannot start with symbols": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
Phases: []ClusterExtensionRevisionPhase{
{
Name: "-invalid",
},
},
},
valid: false,
},
"phases entry names cannot start with numeric characters": {
spec: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
Revision: 1,
Phases: []ClusterExtensionRevisionPhase{
{
Name: "1-invalid",
},
},
},
valid: false,
},
} {
t.Run(name, func(t *testing.T) {
cer := &ClusterExtensionRevision{
Expand Down
9 changes: 8 additions & 1 deletion api/v1/validation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ func TestValidate(t *testing.T) {
"ClusterExtensionRevision: invalid progress deadline < 10": {
args: args{
object: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
ProgressDeadlineMinutes: 9,
},
},
Expand All @@ -99,6 +100,7 @@ func TestValidate(t *testing.T) {
"ClusterExtensionRevision: valid progress deadline = 10": {
args: args{
object: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
ProgressDeadlineMinutes: 10,
},
},
Expand All @@ -107,6 +109,7 @@ func TestValidate(t *testing.T) {
"ClusterExtensionRevision: valid progress deadline = 360": {
args: args{
object: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
ProgressDeadlineMinutes: 360,
},
},
Expand All @@ -115,6 +118,7 @@ func TestValidate(t *testing.T) {
"ClusterExtensionRevision: valid progress deadline = 720": {
args: args{
object: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
ProgressDeadlineMinutes: 720,
},
},
Expand All @@ -123,14 +127,17 @@ func TestValidate(t *testing.T) {
"ClusterExtensionRevision: invalid progress deadline > 720": {
args: args{
object: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
ProgressDeadlineMinutes: 721,
},
},
want: want{valid: false},
},
"ClusterExtensionRevision: no progress deadline set": {
args: args{
object: ClusterExtensionRevisionSpec{},
object: ClusterExtensionRevisionSpec{
LifecycleState: ClusterExtensionRevisionLifecycleStateActive,
},
},
want: want{valid: true},
},
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: 10c28416b75426e1b1db61efb0d4d0ac5feee6e2
expectedMergeBase: fb28936f0227ad129151ce04f53598cc08e1b96e
upstreamBranch: main
upstreamOrg: operator-framework
upstreamRepo: operator-controller
Loading