Skip to content

OTA-1967: Take official CRDs from the OpenShift Lightspeed operator#1387

Open
hongkailiu wants to merge 6 commits into
openshift:mainfrom
hongkailiu:OTA-1967
Open

OTA-1967: Take official CRDs from the OpenShift Lightspeed operator#1387
hongkailiu wants to merge 6 commits into
openshift:mainfrom
hongkailiu:OTA-1967

Conversation

@hongkailiu
Copy link
Copy Markdown
Member

@hongkailiu hongkailiu commented May 8, 2026

Summary by CodeRabbit

  • Breaking Changes

    • Agent CRD schema reworked: now requires an LLM provider object, adds timeouts and maxTurns; several previous Agent fields removed—existing Agent manifests may need updating.
  • New Features

    • Added LLMProvider CRD to manage provider/model configurations with validation.
    • Added AnalysisResult CRD to record analysis proposals, options, and status.
  • Removals

    • Temporary Workflow CRD removed.
  • Chores

    • Go toolchain and dependency versions updated.

hongkailiu added 2 commits May 8, 2026 08:51
```console
$ git --no-pager -C ../lightspeed-agentic-operator log --pretty=oneline -1
  84a97541c3e01c7a89c96ea0acf1afc663bb5a8f (HEAD -> main, origin/main, origin/HEAD) Merge pull request #1 from harche/wt/api-pr
$ cp ../lightspeed-agentic-operator/config/crd/bases/agentic.openshift.io_proposals.yaml install/0000_00_cluster-version-operator_45_lightspeed-crd-proposals.yaml
$ cp ../lightspeed-agentic-operator/config/crd/bases/agentic.openshift.io_agents.yaml install/0000_00_cluster-version-operator_46_lightspeed-crd-agents.yaml
$ cp ../lightspeed-agentic-operator/config/crd/bases/agentic.openshift.io_llmproviders.yaml install/0000_00_cluster-version-operator_47_lightspeed-crd-llmproviders.yaml
$ cp ../lightspeed-agentic-operator/config/crd/bases/agentic.openshift.io_analysisresults.yaml install/0000_00_cluster-version-operator_47_lightspeed-crd-analysisresults.yaml
$ rm install/0000_00_cluster-version-operator_47_lightspeed-crd-workflows.yaml
```
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label May 8, 2026
@openshift-ci openshift-ci Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label May 8, 2026
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented May 8, 2026

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@openshift-ci-robot
Copy link
Copy Markdown
Contributor

openshift-ci-robot commented May 8, 2026

@hongkailiu: This pull request references OTA-1967 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@hongkailiu hongkailiu marked this pull request as ready for review May 8, 2026 13:06
@openshift-ci openshift-ci Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label May 8, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 8, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 62a84afe-f8e6-4311-bfcf-38b840e18ce8

📥 Commits

Reviewing files that changed from the base of the PR and between 935cd6c and 4f02d49.

📒 Files selected for processing (1)
  • pkg/proposal/controller.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • pkg/proposal/controller.go

Walkthrough

Externalize in-repo proposal API types to github.com/openshift/lightspeed-agentic-operator/api/v1alpha1; bump Go/toolchain and many dependencies; replace local CRD manifests (Agent rewritten, add LLMProvider and AnalysisResult, remove Workflow); delete many local API type files; add deepcopy code; update imports, wiring, and tests to use the external API package.

Changes

API Externalization & CRD Migration

Layer / File(s) Summary
Toolchain & Dependencies
go.mod
Bump toolchain to go 1.25.7; add github.com/openshift/lightspeed-agentic-operator/api; upgrade multiple direct and indirect golang.org/x/*, k8s.io/*, and sigs.k8s.io/* requirements (notably Kubernetes v0.35.3, controller-runtime v0.23.3, klog v2.140.0).
CRD Shape / Schema (Agent)
install/0000_00_cluster-version-operator_46_lightspeed-crd-agents.yaml
Rewrite Agent CRD schema: remove prior fields (image, llmRef, skills, mcpServers, systemPromptRef, outputFields, rawOutputSchema); add spec.llmProvider (required), spec.maxTurns, spec.providerSettings, spec.timeouts; update printer columns and status; enable status subresource.
New CRDs
install/0000_00_cluster-version-operator_47_lightspeed-crd-analysisresults.yaml, install/0000_00_cluster-version-operator_47_lightspeed-crd-llmproviders.yaml
Add AnalysisResult (Namespaced) CRD with immutable spec.proposalName, status.conditions, status.options, and status.sandbox; add cluster-scoped LLMProvider CRD with required spec.type/spec.model, provider-specific config blocks, validation rules, and optional spec.url.
CRD Removal
install/0000_00_cluster-version-operator_47_lightspeed-crd-workflows.yaml
Remove the Workflow CRD manifest (cluster-scoped 3-step workflow schema and conditional validations).
Local API Types Removed
pkg/proposal/api/v1alpha1/*
Delete many in-repo API type files and scheme registrations: olsconfig_types.go, proposal_types.go, workflow_types.go, llmprovider_types.go (and associated enums/types and init registrations).
DeepCopy Implementations Added
pkg/proposal/api/v1alpha1/outputfield_deepcopy.go
Add manual DeepCopyInto/DeepCopy methods for OutputField, OutputSubField, OutputFieldItems, and OutputSubFieldItems.
Core Implementation Changes
pkg/proposal/controller.go
Switch import to external proposalv1alpha1 package and add apiextensionsv1; update stubbed getProposals to populate Spec.Analysis.Agent (replace WorkflowRef usage), set Spec.Request value, and populate AnalysisOutput.Schema as apiextensionsv1.JSONSchemaProps.
Wiring / Scheme Registration
pkg/start/start.go
Switch scheme registration to use external github.com/openshift/lightspeed-agentic-operator/api/v1alpha1 types.
Tests / Expectations
pkg/proposal/controller_test.go, test/cvo/proposal.go
Update imports to the external proposal API package; update CRD expectation list in tests to remove workflows.agentic.openshift.io and add analysisresults.agentic.openshift.io and llmproviders.agentic.openshift.io; use external ProposalList type where applicable.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

🚥 Pre-merge checks | ✅ 10 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Test Structure And Quality ⚠️ Warning Test fails on assertion messages (12 of 17 lack context) and cleanup: Test 2 creates Proposals via CV update but lacks explicit deletion in AfterEach, violating guidelines on cluster resource cleanup. Add messages to Expect assertions and explicit Proposal cleanup in AfterEach to match accept_risks.go patterns for namespaced resource management.
✅ Passed checks (10 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly and specifically describes the main objective: syncing official CRDs from the OpenShift Lightspeed operator into CVO. It directly relates to the primary changes shown in the changeset.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names ✅ Passed All test names use stable, static descriptive strings with no dynamic content, generated identifiers, timestamps, or variable suffixes.
Microshift Test Compatibility ✅ Passed No new Ginkgo e2e tests are added in this PR. Only existing tests are modified (CRD name updates). The custom check is not applicable—it only applies when new test code is added.
Single Node Openshift (Sno) Test Compatibility ✅ Passed New tests verify CRD installation and resource creation without assuming multiple nodes or pod scheduling across distinct hosts. Tests are SNO-compatible.
Topology-Aware Scheduling Compatibility ✅ Passed No scheduling constraints added. Changes are CRD schema definitions, removal of in-repo API types, import updates, and dependency updates. No deployment manifests or workload specs modified.
Ote Binary Stdout Contract ✅ Passed PR introduces no stdout contract violations. No fmt.Print/Println/Printf calls found. init() function only registers schemes. Ginkgo logger used correctly. All logging uses klog or GinkgoLogr.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed No new Ginkgo e2e tests were added in this PR. The PR only modifies existing tests to use the new API import path from the lightspeed-agentic-operator package instead of local package definitions.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Comment @coderabbitai help to get the list of available commands and usage tips.

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented May 8, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: hongkailiu

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label May 8, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
test/cvo/proposal.go (1)

85-86: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Update the asserted CRD names to the new installed set.

Line 85 still expects workflows.agentic.openshift.io, but this PR removes the workflows CRD and introduces llmproviders.agentic.openshift.io and analysisresults.agentic.openshift.io. The current assertion no longer matches the intended manifest set.

Suggested fix
-		for _, name := range []string{"proposals.agentic.openshift.io", "agents.agentic.openshift.io", "workflows.agentic.openshift.io"} {
+		for _, name := range []string{
+			"proposals.agentic.openshift.io",
+			"agents.agentic.openshift.io",
+			"llmproviders.agentic.openshift.io",
+			"analysisresults.agentic.openshift.io",
+		} {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/cvo/proposal.go` around lines 85 - 86, Update the asserted CRD names in
the loop that checks CRD existence: replace the slice used in the for-range
(currently containing "proposals.agentic.openshift.io",
"agents.agentic.openshift.io", "workflows.agentic.openshift.io") with the new
installed set "proposals.agentic.openshift.io", "agents.agentic.openshift.io",
"llmproviders.agentic.openshift.io", and "analysisresults.agentic.openshift.io"
so the Get calls in
apiExtensionsClient.ApiextensionsV1().CustomResourceDefinitions().Get(...) match
the current manifest.
pkg/proposal/controller.go (1)

113-116: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Use the Create return error directly (current code reads a stale err).

On Line 113, c.client.Create(ctx, proposal) drops its returned error, and Line 114 checks err from a previous operation. This can hide create failures and route error handling incorrectly.

Suggested fix
-		if c.client.Create(ctx, proposal) != nil {
-			if !kerrors.IsAlreadyExists(err) {
+		if err := c.client.Create(ctx, proposal); err != nil {
+			if !kerrors.IsAlreadyExists(err) {
 				klog.V(i.Normal).Infof("Failed to create proposal %s/%s: %v", proposal.Namespace, proposal.Name, err)
 				errs = append(errs, err)
 			} else {
 				klog.V(i.Debug).Infof("The proposal %s/%s existed already", proposal.Namespace, proposal.Name)
 			}
 		} else {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/proposal/controller.go` around lines 113 - 116, The call to
c.client.Create(ctx, proposal) ignores its returned error and the subsequent
check uses a stale variable err; update the code to capture the Create return
value (e.g., err := c.client.Create(ctx, proposal)) and then use that err in the
kerrors.IsAlreadyExists(err) check and in the klog.V(...).Infof/errs =
append(errs, err) paths so create failures are handled correctly for the
proposal object.
🧹 Nitpick comments (2)
install/0000_00_cluster-version-operator_46_lightspeed-crd-agents.yaml (1)

4-8: 💤 Low value

Missing kubernetes.io/description annotation.

The manifest is missing a kubernetes.io/description annotation to explain the CRD's purpose.

Suggested annotation
 metadata:
   annotations:
     include.release.openshift.io/self-managed-high-availability: "true"
     release.openshift.io/feature-set: TechPreviewNoUpgrade
+    kubernetes.io/description: |-
+      Agent defines a cluster-scoped agent tier that configures LLM infrastructure and runtime settings.
     controller-gen.kubebuilder.io/version: v0.20.1
   name: agents.agentic.openshift.io

As per coding guidelines: "Use kubernetes.io/description annotations to explain the resource's purpose."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@install/0000_00_cluster-version-operator_46_lightspeed-crd-agents.yaml`
around lines 4 - 8, Add a kubernetes.io/description annotation to the
metadata.annotations block of the lightspeed CRD manifest (the
install/0000_00_cluster-version-operator_46_lightspeed-crd-agents.yaml resource)
so the CRD purpose is documented; update the metadata.annotations alongside
include.release.openshift.io/self-managed-high-availability and
release.openshift.io/feature-set with a concise human-readable description of
what the Lightspeed CRD (agents) manages and any important behavior or intent.
install/0000_00_cluster-version-operator_47_lightspeed-crd-analysisresults.yaml (1)

4-9: 💤 Low value

Missing kubernetes.io/description annotation; inconsistent controller-gen version.

The manifest is missing a kubernetes.io/description annotation. Also note that controller-gen version here is v0.19.0 while the other CRDs use v0.20.1—this inconsistency may be intentional if these come from different upstream sources, but worth verifying.

Suggested annotation
 metadata:
   annotations:
     include.release.openshift.io/self-managed-high-availability: "true"
     release.openshift.io/feature-set: TechPreviewNoUpgrade
+    kubernetes.io/description: |-
+      AnalysisResult records the output of an analysis step execution, owned by the parent Proposal.
     controller-gen.kubebuilder.io/version: v0.19.0
   name: analysisresults.agentic.openshift.io

As per coding guidelines: "Use kubernetes.io/description annotations to explain the resource's purpose."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@install/0000_00_cluster-version-operator_47_lightspeed-crd-analysisresults.yaml`
around lines 4 - 9, The manifest for the CRD
"analysisresults.agentic.openshift.io" is missing a kubernetes.io/description
annotation and has an inconsistent controller-gen version; add a
kubernetes.io/description entry under metadata.annotations that briefly explains
the resource's purpose (e.g., what AnalysisResults represent) and update
controller-gen.kubebuilder.io/version from v0.19.0 to v0.20.1 to match other
CRDs unless the v0.19.0 value is intentional—if intentional, add a comment or
note in repo docs explaining the divergence; locate these changes in the
metadata.annotations block that contains name:
analysisresults.agentic.openshift.io and controller-gen.kubebuilder.io/version.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@install/0000_00_cluster-version-operator_47_lightspeed-crd-llmproviders.yaml`:
- Around line 4-9: This file conflicts with another CRD using the same numeric
prefix; rename the file number (e.g., change the prefix from `_47_` to `_48_`)
so it no longer collides with
0000_00_cluster-version-operator_47_lightspeed-crd-analysisresults.yaml, and add
a kubernetes.io/description annotation under metadata.annotations for the CRD
name llmproviders.agentic.openshift.io that succinctly explains the CRD's
purpose (one-line description), ensuring deterministic ordering and compliance
with the coding guidelines.

---

Outside diff comments:
In `@pkg/proposal/controller.go`:
- Around line 113-116: The call to c.client.Create(ctx, proposal) ignores its
returned error and the subsequent check uses a stale variable err; update the
code to capture the Create return value (e.g., err := c.client.Create(ctx,
proposal)) and then use that err in the kerrors.IsAlreadyExists(err) check and
in the klog.V(...).Infof/errs = append(errs, err) paths so create failures are
handled correctly for the proposal object.

In `@test/cvo/proposal.go`:
- Around line 85-86: Update the asserted CRD names in the loop that checks CRD
existence: replace the slice used in the for-range (currently containing
"proposals.agentic.openshift.io", "agents.agentic.openshift.io",
"workflows.agentic.openshift.io") with the new installed set
"proposals.agentic.openshift.io", "agents.agentic.openshift.io",
"llmproviders.agentic.openshift.io", and "analysisresults.agentic.openshift.io"
so the Get calls in
apiExtensionsClient.ApiextensionsV1().CustomResourceDefinitions().Get(...) match
the current manifest.

---

Nitpick comments:
In `@install/0000_00_cluster-version-operator_46_lightspeed-crd-agents.yaml`:
- Around line 4-8: Add a kubernetes.io/description annotation to the
metadata.annotations block of the lightspeed CRD manifest (the
install/0000_00_cluster-version-operator_46_lightspeed-crd-agents.yaml resource)
so the CRD purpose is documented; update the metadata.annotations alongside
include.release.openshift.io/self-managed-high-availability and
release.openshift.io/feature-set with a concise human-readable description of
what the Lightspeed CRD (agents) manages and any important behavior or intent.

In
`@install/0000_00_cluster-version-operator_47_lightspeed-crd-analysisresults.yaml`:
- Around line 4-9: The manifest for the CRD
"analysisresults.agentic.openshift.io" is missing a kubernetes.io/description
annotation and has an inconsistent controller-gen version; add a
kubernetes.io/description entry under metadata.annotations that briefly explains
the resource's purpose (e.g., what AnalysisResults represent) and update
controller-gen.kubebuilder.io/version from v0.19.0 to v0.20.1 to match other
CRDs unless the v0.19.0 value is intentional—if intentional, add a comment or
note in repo docs explaining the divergence; locate these changes in the
metadata.annotations block that contains name:
analysisresults.agentic.openshift.io and controller-gen.kubebuilder.io/version.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: 8cfbe721-0d41-4553-9d42-db96aa73e67a

📥 Commits

Reviewing files that changed from the base of the PR and between 4cfd94b and b53d744.

⛔ Files ignored due to path filters (85)
  • go.sum is excluded by !**/*.sum, !go.sum
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/LICENSE is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/agent_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/analysisresult_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/approvalpolicy_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/escalationresult_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/executionresult_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/groupversion_info.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/llmprovider_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/proposal_analysis_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/proposal_status_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/proposal_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/proposalapproval_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/reference_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/result_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/shared_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/tools_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/verificationresult_types.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/lightspeed-agentic-operator/api/v1alpha1/zz_generated.deepcopy.go is excluded by !vendor/**, !**/vendor/**, !**/zz_generated*
  • vendor/golang.org/x/net/http2/transport.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/net/http2/writesched_priority_rfc9218.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/net/trace/events.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/net/websocket/hybi.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/mkerrors.sh is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_386.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_arm.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_mips.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/term/terminal.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/text/encoding/japanese/eucjp.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/text/encoding/japanese/iso2022jp.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/text/encoding/japanese/shiftjis.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/text/encoding/korean/euckr.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/text/encoding/traditionalchinese/big5.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/text/encoding/unicode/unicode.go is excluded by !vendor/**, !**/vendor/**
  • vendor/golang.org/x/tools/go/ast/inspector/cursor.go is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/klog/v2/README.md is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/klog/v2/internal/serialize/keyvalues.go is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/klog/v2/internal/serialize/keyvalues_no_slog.go is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/klog/v2/internal/serialize/keyvalues_slog.go is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/klog/v2/klog.go is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/klog/v2/klogr.go is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/klog/v2/klogr_slog.go is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/kube-openapi/pkg/validation/spec/ref.go is excluded by !vendor/**, !**/vendor/**
  • vendor/k8s.io/utils/buffer/ring_fixed.go is excluded by !vendor/**, !**/vendor/**
  • vendor/modules.txt is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/apimachinery.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/errors.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/client.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/client_rest_resources.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/config/config.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/dryrun.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/versioned_tracker.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/fieldowner.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/fieldvalidation.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/interceptor/intercept.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/interfaces.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/namespaced_client.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/options.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/patch.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/typed_client.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/client/unstructured_client.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/log/log.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/controller-runtime/pkg/log/null.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/structured-merge-diff/v6/schema/elements.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/structured-merge-diff/v6/typed/remove.go is excluded by !vendor/**, !**/vendor/**
  • vendor/sigs.k8s.io/structured-merge-diff/v6/value/reflectcache.go is excluded by !vendor/**, !**/vendor/**
📒 Files selected for processing (16)
  • go.mod
  • install/0000_00_cluster-version-operator_45_lightspeed-crd-proposals.yaml
  • install/0000_00_cluster-version-operator_46_lightspeed-crd-agents.yaml
  • install/0000_00_cluster-version-operator_47_lightspeed-crd-analysisresults.yaml
  • install/0000_00_cluster-version-operator_47_lightspeed-crd-llmproviders.yaml
  • install/0000_00_cluster-version-operator_47_lightspeed-crd-workflows.yaml
  • pkg/proposal/api/v1alpha1/agent_types.go
  • pkg/proposal/api/v1alpha1/llmprovider_types.go
  • pkg/proposal/api/v1alpha1/olsconfig_types.go
  • pkg/proposal/api/v1alpha1/outputfield_deepcopy.go
  • pkg/proposal/api/v1alpha1/proposal_types.go
  • pkg/proposal/api/v1alpha1/workflow_types.go
  • pkg/proposal/controller.go
  • pkg/proposal/controller_test.go
  • pkg/start/start.go
  • test/cvo/proposal.go
💤 Files with no reviewable changes (7)
  • pkg/proposal/api/v1alpha1/outputfield_deepcopy.go
  • pkg/proposal/api/v1alpha1/workflow_types.go
  • pkg/proposal/api/v1alpha1/agent_types.go
  • install/0000_00_cluster-version-operator_47_lightspeed-crd-workflows.yaml
  • pkg/proposal/api/v1alpha1/olsconfig_types.go
  • pkg/proposal/api/v1alpha1/llmprovider_types.go
  • pkg/proposal/api/v1alpha1/proposal_types.go

Comment on lines +4 to +9
metadata:
annotations:
include.release.openshift.io/self-managed-high-availability: "true"
release.openshift.io/feature-set: TechPreviewNoUpgrade
controller-gen.kubebuilder.io/version: v0.20.1
name: llmproviders.agentic.openshift.io
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

File numbering collision: both this file and analysisresults use _47_.

This file and 0000_00_cluster-version-operator_47_lightspeed-crd-analysisresults.yaml share the same file number (47). Consider renumbering one of them (e.g., use _48_ for this file) to ensure deterministic ordering.

Additionally, the manifest is missing a kubernetes.io/description annotation to explain the CRD's purpose.

Suggested annotations
 metadata:
   annotations:
     include.release.openshift.io/self-managed-high-availability: "true"
     release.openshift.io/feature-set: TechPreviewNoUpgrade
+    kubernetes.io/description: |-
+      LLMProvider defines an LLM provider configuration referenced by Agent resources.
     controller-gen.kubebuilder.io/version: v0.20.1
   name: llmproviders.agentic.openshift.io

As per coding guidelines: "Use kubernetes.io/description annotations to explain the resource's purpose" and "File numbering should leave gaps for future additions."

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
metadata:
annotations:
include.release.openshift.io/self-managed-high-availability: "true"
release.openshift.io/feature-set: TechPreviewNoUpgrade
controller-gen.kubebuilder.io/version: v0.20.1
name: llmproviders.agentic.openshift.io
metadata:
annotations:
include.release.openshift.io/self-managed-high-availability: "true"
release.openshift.io/feature-set: TechPreviewNoUpgrade
kubernetes.io/description: |-
LLMProvider defines an LLM provider configuration referenced by Agent resources.
controller-gen.kubebuilder.io/version: v0.20.1
name: llmproviders.agentic.openshift.io
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@install/0000_00_cluster-version-operator_47_lightspeed-crd-llmproviders.yaml`
around lines 4 - 9, This file conflicts with another CRD using the same numeric
prefix; rename the file number (e.g., change the prefix from `_47_` to `_48_`)
so it no longer collides with
0000_00_cluster-version-operator_47_lightspeed-crd-analysisresults.yaml, and add
a kubernetes.io/description annotation under metadata.annotations for the CRD
name llmproviders.agentic.openshift.io that succinctly explains the CRD's
purpose (one-line description), ensuring deterministic ordering and compliance
with the coding guidelines.

@hongkailiu
Copy link
Copy Markdown
Member Author

Take from this job:

$ curl -s https://gcsweb-ci.apps.ci.l2s4.p1.openshiftapps.com/gcs/test-platform-results/pr-logs/pull/openshift_cluster-version-operator/1387/pull-ci-openshift-cluster-version-operator-main-e2e-agnostic-ovn-techpreview-serial-2of3/2052748353468370944/artifacts/e2e-agnostic-ovn-techpreview-serial/openshift-e2e-test/artifacts/e2e.log | grep proposals
started: 0/1/28 "[Jira:\"Cluster Version Operator\"] cluster-version-operator should create proposals"
passed: (700ms) 2026-05-08T15:41:23 "[Jira:\"Cluster Version Operator\"] cluster-version-operator should create proposals"

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented May 8, 2026

@hongkailiu: The following tests failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/e2e-agnostic-ovn 935cd6c link true /test e2e-agnostic-ovn
ci/prow/e2e-hypershift-conformance 935cd6c link true /test e2e-hypershift-conformance

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@@ -1,12 +1,8 @@
# Temporary CRD stub — will be removed once the lightspeed-agentic-operator owns this CRD.
# Generated from github.com/harche/lightspeed-agentic-operator/api/v1alpha1
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Usually, API and promotion changes are being gated by the API folks with their extensive expertise. These manifests will get applied in clusters. Are the APIs being updated in a non-conflicting manner so as not to break clusters updating from various versions? Currently, this is for the main branch, but soon EC and RC will start getting built. TechPreview clusters will be getting updated. And so on. Are the changes stable non-conflicting, or are the CRDs mainly used for rapid development testing with larger changes? If conflicting, can this approach potentially break future updates?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are the CRDs mainly used for rapid development testing with larger changes?

Yes.

can this approach potentially break future updates?

I believe some changes on CRD itself wont break anything, such as removing a property in a CRD's spec.
The bad thing happens when some CR is stored in ETCD while its CRD is not backward-compatible.

So if 5.0.1 is built and some job upgrades (by --force) a cluster with it to 5.0.2. Yes, the upgrade might be broken if ec.1 is with a totally different CRD.

But upgrade is not supported when TechPriview is enabled. As long as the feature is guarded by TP, we (upgrade) should be good. Do you notice any blocking job doing it?

Let me know if the above relieves your concerns. Better safe than sorry.

Copy link
Copy Markdown
Contributor

@DavidHurta DavidHurta May 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But upgrade is not supported when TechPriview is enabled. As long as the feature is guarded by TP, we (upgrade) should be good.

Patch version updates (not minor-level) are possible and encouraged.

Docs:

Warning
Enabling the TechPreviewNoUpgrade feature set on your cluster cannot be undone and prevents minor version updates. You should not enable this feature set on production clusters.


Do you notice any blocking job doing it?

I am not sure if we are testing upgrades for techpreview clusters as extensively as we are testing default clusters; however, customer are using TechPreviewNoUpgrade clusters, and their experience is important. I am not clear on the policy for the EC builds, though.


After a code freeze all backports will be closely reviewed.

I am wondering about updates from EC TechPreviewNoUpgrade clusters. For example, the build02 cluster is such a cluster.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After a code freeze all backports will be closely reviewed.

And by then these CRDs will be removed from the CVO repository.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants