Skip to content

CNF-23534: Add automated OpenAPI schema generation for PolicyGenerator list merging#787

Merged
openshift-merge-bot[bot] merged 5 commits into
openshift-kni:mainfrom
irinamihai:extend-openapi-schema
Jul 1, 2026
Merged

CNF-23534: Add automated OpenAPI schema generation for PolicyGenerator list merging#787
openshift-merge-bot[bot] merged 5 commits into
openshift-kni:mainfrom
irinamihai:extend-openapi-schema

Conversation

@irinamihai

Copy link
Copy Markdown
Contributor

Add automated OpenAPI schema generation for PolicyGenerator list merging

Two-step pipeline to dynamically generate schema.openapi files from upstream CRDs, replacing the previously hand-crafted schemas:

  1. generate-schema-config.py scans Subscription CRs to update crd-schema-config.json with current channels and git refs
  2. extract-schema.py downloads CRDs and extracts minimal merge directive schemas for ACM PolicyGenerator

Adds nightly GitHub Actions workflow to auto-PR when schemas drift.

@openshift-ci openshift-ci Bot requested review from sabbir-47 and yuvalk May 26, 2026 21:16
@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label May 26, 2026
@irinamihai irinamihai changed the title CNF-23534 CNF-23534: Add automated OpenAPI schema generation for PolicyGenerator list merging May 26, 2026
@coderabbitai

coderabbitai Bot commented May 26, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds OpenAPI schema generation tooling, config and build wiring, generated schema artifacts, documentation updates, and a scheduled GitHub Actions workflow that regenerates schemas and opens an automated pull request.

Changes

OpenAPI Schema Generation

Layer / File(s) Summary
Schema extraction
hack/extract-schema.py
Loads CRDs from file, cluster, or GitHub; converts and prunes OpenAPI schemas; injects merge keys; and emits deterministic schema definitions from the CLI.
Schema config generation
hack/generate-schema-config.py
Scans Subscription manifests, detects the OpenShift version, derives GitHub refs, and updates the CRD schema config JSON.
Build targets and config
hack/crd-schema-config.json, Makefile
Adds the CRD schema configuration and Makefile targets for regenerating, copying, and checking generated OpenAPI outputs.
Generated schema artifacts
telco-core/configuration/schema.openapi, telco-ran/configuration/argocd/example/acmpolicygenerator/schema.openapi, telco-ran/configuration/argocd/example/acmpolicygenerator/hub-side-templating/schema.openapi
Updates the committed OpenAPI schema files for telco-core and telco-ran with CRD definitions and merge-annotation metadata, including the new Tuned definition.
Documentation updates
telco-ran/configuration/argocd/example/acmpolicygenerator/README.md, VERSION_UPDATE_GUIDE.md
Updates the PolicyGenerator README and version update guide with schema generation steps, merge behavior notes, and revised checklist numbering.
Automated schema refresh workflow
.github/workflows/openapi-schema-check.yml
Adds a scheduled and manual GitHub Actions workflow that installs pinned dependencies, runs schema generation, and creates an automated pull request with the updated outputs.

Sequence Diagram(s)

sequenceDiagram
  participant GitHubActions
  participant Makefile
  participant GenerateConfig
  participant ExtractSchema
  participant CreatePullRequest

  GitHubActions->>Makefile: run make generate-openapi-schemas
  Makefile->>GenerateConfig: regenerate hack/crd-schema-config.json
  Makefile->>ExtractSchema: extract telco-ran schema.openapi
  Makefile->>ExtractSchema: extract telco-core schema.openapi
  GitHubActions->>CreatePullRequest: open update-openapi-schemas PR
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: automated OpenAPI schema generation for PolicyGenerator list merging.
Description check ✅ Passed The description directly matches the changeset and explains the new generation pipeline and nightly auto-PR workflow.
Docstring Coverage ✅ Passed Docstring coverage is 87.50% which is sufficient. The required threshold is 80.00%.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@openshift-ci-robot

openshift-ci-robot commented May 26, 2026

Copy link
Copy Markdown
Collaborator

@irinamihai: This pull request references CNF-23534 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:

Add automated OpenAPI schema generation for PolicyGenerator list merging

Two-step pipeline to dynamically generate schema.openapi files from upstream CRDs, replacing the previously hand-crafted schemas:

  1. generate-schema-config.py scans Subscription CRs to update crd-schema-config.json with current channels and git refs
  2. extract-schema.py downloads CRDs and extracts minimal merge directive schemas for ACM PolicyGenerator

Adds nightly GitHub Actions workflow to auto-PR when schemas drift.

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.

@irinamihai

Copy link
Copy Markdown
Contributor Author

/hold for further testing

@openshift-ci openshift-ci Bot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label May 26, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (1)
.github/workflows/openapi-schema-check.yml (1)

25-25: ⚡ Quick win

Pin PyYAML to a specific version for reproducibility.

Installing PyYAML without a version constraint means the workflow will fetch whatever version is latest at runtime. If PyYAML releases breaking changes, the workflow could fail unpredictably.

📌 Proposed fix to pin PyYAML version
-          pip install PyYAML
+          pip install PyYAML==6.0.1

Update the version number as needed to match the version tested with your scripts.

🤖 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 @.github/workflows/openapi-schema-check.yml at line 25, Replace the unpinned
installer command "pip install PyYAML" in the GitHub Actions job with a pinned
version (e.g., "pip install PyYAML==<version>") to ensure reproducible runs;
pick and lock the exact PyYAML version you tested against and update that
version string in the workflow step that currently runs pip install PyYAML.
🤖 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 @.github/workflows/openapi-schema-check.yml:
- Line 19: Replace semantic version tags for GitHub Actions with pinned commit
SHAs to satisfy supply-chain requirements: update usages of actions/checkout@v4
and peter-evans/create-pull-request@v7 to their corresponding full commit SHAs
(e.g., actions/checkout@<sha> and peter-evans/create-pull-request@<sha>), fetch
the latest stable commit SHAs from each action's repository first, and commit
the workflow changes so the workflow references the fixed SHAs instead of the
version tags.
- Around line 23-24: The workflow currently downloads yq_linux_amd64 and makes
it executable without integrity checks; update the steps around the curl and
chmod so you first fetch or define an expected checksum (e.g.,
YQ_CHECKSUM/YQ_VERSION), verify the downloaded file's SHA256 (or other selected
hash) against that expected value using a verification tool (sha256sum or shasum
-a 256) and only call chmod +x /usr/local/bin/yq and move it into the PATH if
the checksum matches; ensure the job fails if verification fails and document
updating YQ_VERSION and YQ_CHECKSUM to the intended release.

In `@hack/extract-schema.py`:
- Around line 236-240: The branch that handles "x-kubernetes-patch-strategy" can
KeyError on schema["x-kubernetes-patch-merge-key"]; update the logic in the
block that builds result (the code using the local variable schema and creating
result) to read the merge key via schema.get("x-kubernetes-patch-merge-key") and
only include the "x-kubernetes-patch-merge-key" entry in the result when that
get() returns a non-None value (keep the "x-kubernetes-patch-strategy" entry as
before and preserve the default for "type").

In `@hack/generate-schema-config.py`:
- Around line 66-70: The aggregation logic that populates results[pkg_name] with
"channel" and "components" silently ignores when the same spec.name (pkg_name)
appears with a different channel; update the block that checks pkg_name and
channel (where results is built and
results[pkg_name]["components"].add(component) is called) to detect if
results[pkg_name]["channel"] already exists and differs from the current
channel, and on that conflict raise an error (or exit non‑zero) with a clear
message referencing the spec.name/pkg_name and both channels; do not merge
components across differing channels.

---

Nitpick comments:
In @.github/workflows/openapi-schema-check.yml:
- Line 25: Replace the unpinned installer command "pip install PyYAML" in the
GitHub Actions job with a pinned version (e.g., "pip install PyYAML==<version>")
to ensure reproducible runs; pick and lock the exact PyYAML version you tested
against and update that version string in the workflow step that currently runs
pip install PyYAML.
🪄 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: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: 00891ba2-3175-4320-88cf-d34e51e42032

📥 Commits

Reviewing files that changed from the base of the PR and between abd1ee2 and ea70e61.

📒 Files selected for processing (11)
  • .github/workflows/openapi-schema-check.yml
  • Makefile
  • VERSION_UPDATE_GUIDE.md
  • hack/crd-schema-config.json
  • hack/extract-schema.py
  • hack/generate-schema-config.py
  • telco-core/configuration/schema.openapi
  • telco-ran/configuration/argocd/example/acmpolicygenerator/README.md
  • telco-ran/configuration/argocd/example/acmpolicygenerator/hub-side-templating/schema.openapi
  • telco-ran/configuration/argocd/example/acmpolicygenerator/hub-side-templating/schema.openapi
  • telco-ran/configuration/argocd/example/acmpolicygenerator/schema.openapi

Comment thread .github/workflows/openapi-schema-check.yml Outdated
Comment thread .github/workflows/openapi-schema-check.yml Outdated
Comment thread hack/extract-schema.py
Comment on lines +66 to +70
if pkg_name and channel:
if pkg_name not in results:
results[pkg_name] = {"channel": channel, "components": set()}
results[pkg_name]["components"].add(component)

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 | 🟠 Major | ⚡ Quick win

Detect and fail on cross-component channel conflicts per package.

If the same spec.name is found with different channels, current logic silently keeps the first channel and merges components, which can generate wrong refs and schemas.

Proposed fix
             if pkg_name and channel:
                 if pkg_name not in results:
                     results[pkg_name] = {"channel": channel, "components": set()}
+                elif results[pkg_name]["channel"] != channel:
+                    raise RuntimeError(
+                        f"Conflicting channels for package '{pkg_name}': "
+                        f"'{results[pkg_name]['channel']}' vs '{channel}'"
+                    )
                 results[pkg_name]["components"].add(component)
🤖 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 `@hack/generate-schema-config.py` around lines 66 - 70, The aggregation logic
that populates results[pkg_name] with "channel" and "components" silently
ignores when the same spec.name (pkg_name) appears with a different channel;
update the block that checks pkg_name and channel (where results is built and
results[pkg_name]["components"].add(component) is called) to detect if
results[pkg_name]["channel"] already exists and differs from the current
channel, and on that conflict raise an error (or exit non‑zero) with a clear
message referencing the spec.name/pkg_name and both channels; do not merge
components across differing channels.

@irinamihai

Copy link
Copy Markdown
Contributor Author

/unhold

@openshift-ci openshift-ci Bot removed the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label May 27, 2026
Comment on lines +10 to +11
contents: write
pull-requests: write

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Are there finer grained permissions that can be granted. These are pretty broad.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

These are already the minimum required permissions for peter-evans/create-pull-request - contents: write to push the commit and pull-requests: write to create the PR. This matches the permissions used by doc-updater.yml in this repo. There are no finer-grained alternatives for this use case where we want to automatically create PRs.

What restrictions/rules did you have in mind?

Comment thread .github/workflows/openapi-schema-check.yml

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Will PolicyGenerator follow the redirect path?
Also nit: newline

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

PolicyGenerator rejects symlinks that resolve outside the directory tree. The file is kept as a regular copy of the parent schema.openapi. The following work to restructure the directories to resemble telco-core plus the removal of the non templated PolicyGenerator examples will consolidate this so there's a single schema.openapi co-located with the PolicyGenerator CRs.
For now, I'm going to leave the full content in this file and update the Makefile to copy the generated schema in here.

Comment on lines +4 to +7
"Static fields (source, merge_keys, version, package_name, ref_rule)",
"are manually maintained.",
"Dynamic fields (subscription_channel, components, source.github.ref)",
"are updated by: python3 hack/generate-schema-config.py",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Would it make sense to separate the static and dynamic/derived data into separate files? Perhaps yaml file listing the static (human generated) data.
Do we need persistence of the dynamic data, or is it for archival/informational purposes (ie a log of what was found)?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The dynamic fields (subscription_channel, components, source.github.ref) are needed by extract-schema.py to know which GitHub branch to fetch CRDs from - they're not just informational. generate-schema-config.py updates them in-place while preserving the static fields (source.github.{owner,repo,path},merge_keys, version, ref_rule).

Splitting into two files would add complexity to the merge/read logic, since the round-trip update preserves static fields and git diff shows exactly what changed. The _comment block at the top documents which fields are static vs dynamic.

We can revisit if the config grows significantly, but for 6 CRD entries the single file keeps things simple.
WDYT?

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jun 27, 2026
…onfiguration

Description:

Add automated OpenAPI schema generation for PolicyGenerator list merging

  Two-step pipeline to dynamically generate schema.openapi files from
  upstream CRDs, replacing the previously hand-crafted schemas:

  1. generate-schema-config.py scans Subscription CRs to update
     crd-schema-config.json with current channels and git refs
  2. extract-schema.py downloads CRDs and extracts minimal merge
     directive schemas for ACM PolicyGenerator

  Adds nightly GitHub Actions workflow to auto-PR when schemas drift.
Description:
- check openapi schema workflow - security hardening
- warning for channel clash across core vs ran
- README updates
@irinamihai irinamihai force-pushed the extend-openapi-schema branch from b549584 to 1a5246f Compare June 29, 2026 21:05
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jun 29, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

♻️ Duplicate comments (1)
hack/generate-schema-config.py (1)

66-77: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Abort on channel conflicts instead of warning and continuing.

This still collapses both components into one results[pkg_name] entry after the warning. main() then stamps one subscription_channel and derived ref onto every matching config entry, so one component can silently regenerate schemas from the wrong branch. Also, the suggested “split the entry” workaround cannot work with the current subscriptions[pkg_name] lookup model.

🤖 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 `@hack/generate-schema-config.py` around lines 66 - 77, The channel conflict
handling in generate-schema-config.py should abort instead of printing a warning
and continuing, because the current results[pkg_name] merge still drives one
subscription_channel and ref for all components. Update the logic around the
results[pkg_name] / components accumulation so that a mismatched channel in
main() or the package-processing loop raises an error and exits immediately, and
make sure the subscriptions[pkg_name] lookup path does not silently reuse a
single entry for conflicting components.
🤖 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 `@hack/extract-schema.py`:
- Around line 293-303: The version selection in the schema extraction flow is
too naive and can pick the wrong API version. Update the logic around the
preferred_version handling and the loop over versions so it follows the
documented CRD order: prefer the requested version, otherwise choose the storage
version, and then the first served version that has a schema; use the existing
versions list and schema lookup in extract-schema.py to filter out deprecated or
served=false entries before emitting directives.
- Around line 190-194: The map-list patch metadata in the schema extractor is
synthesizing an invalid comma-delimited `x-kubernetes-patch-merge-key`, which
only supports a single field name. Update the `extract-schema.py` logic around
the `is_map_list`/`map_keys` handling to either reject multi-key list-maps
explicitly or require an explicit `merge_keys` override, and only set
`x-kubernetes-patch-merge-key` when there is exactly one valid key.

In `@hack/generate-schema-config.py`:
- Around line 123-133: The CRD config update loop leaves stale dynamic fields
behind when a package_name no longer matches a Subscription. Update the config
processing in generate-schema-config.py so the per-entry fields populated from
sub are also removed or reset when sub is None, specifically clearing
subscription_channel and components before writing back the entry. Keep the
existing derive_ref and entry["source"]["github"]["ref"] update behavior intact,
but ensure removed operators no longer retain old component filters in the
generated JSON.

---

Duplicate comments:
In `@hack/generate-schema-config.py`:
- Around line 66-77: The channel conflict handling in generate-schema-config.py
should abort instead of printing a warning and continuing, because the current
results[pkg_name] merge still drives one subscription_channel and ref for all
components. Update the logic around the results[pkg_name] / components
accumulation so that a mismatched channel in main() or the package-processing
loop raises an error and exits immediately, and make sure the
subscriptions[pkg_name] lookup path does not silently reuse a single entry for
conflicting components.
🪄 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: Organization UI

Review profile: CHILL

Plan: Enterprise

Run ID: 1c6d0c68-6b76-4385-988d-f00d45c6799e

📥 Commits

Reviewing files that changed from the base of the PR and between b549584 and 1a5246f.

📒 Files selected for processing (10)
  • .github/workflows/openapi-schema-check.yml
  • Makefile
  • VERSION_UPDATE_GUIDE.md
  • hack/crd-schema-config.json
  • hack/extract-schema.py
  • hack/generate-schema-config.py
  • telco-core/configuration/schema.openapi
  • telco-ran/configuration/argocd/example/acmpolicygenerator/README.md
  • telco-ran/configuration/argocd/example/acmpolicygenerator/hub-side-templating/schema.openapi
  • telco-ran/configuration/argocd/example/acmpolicygenerator/schema.openapi
✅ Files skipped from review due to trivial changes (2)
  • hack/crd-schema-config.json
  • telco-ran/configuration/argocd/example/acmpolicygenerator/README.md
🚧 Files skipped from review as they are similar to previous changes (4)
  • telco-core/configuration/schema.openapi
  • .github/workflows/openapi-schema-check.yml
  • telco-ran/configuration/argocd/example/acmpolicygenerator/hub-side-templating/schema.openapi
  • telco-ran/configuration/argocd/example/acmpolicygenerator/schema.openapi

Comment thread hack/extract-schema.py Outdated
Comment thread hack/extract-schema.py
Comment thread hack/generate-schema-config.py
Comment thread hack/generate-schema-config.py Outdated
"""
ref_rule = entry.get("ref_rule")
if not ref_rule:
return entry["source"]["github"].get("ref")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Add handling for missing keys (or use get() with default {}).

Comment thread hack/extract-schema.py Outdated
Comment on lines +385 to +386
with open(config_path) as f:
config = json.load(f)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Add FileNotFoundError handling

Comment thread hack/extract-schema.py
Comment thread hack/extract-schema.py Outdated
req.add_header("Authorization", f"token {token}")

try:
resp = urllib.request.urlopen(req)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Claude suggests adding timeout:

Suggested change
resp = urllib.request.urlopen(req)
resp = urllib.request.urlopen(req, timeout=30)

Description:
- Reject multi-key list-maps in x-kubernetes-patch-merge-key (single key only)
- Prefer storage version when selecting CRD API version
- Clear stale subscription_channel and components when operator is removed
- Use chained .get() for missing keys in derive_ref
- Add FileNotFoundError handling for config file
- Add timeout=30 to urlopen
@irinamihai irinamihai force-pushed the extend-openapi-schema branch from 6bfc7b1 to e1e3b43 Compare June 30, 2026 17:44
Comment thread hack/crd-schema-config.json Outdated
Comment on lines +95 to +96
"merge_keys": {
"spec.hugepages.pages": "size"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I don't think this is the correct merge key for hugepages. You can spec hugepages per numa node so there may be multiple entries for 1G. For this field I don't think we can do an intelligent merge, the user needs to provide the full set of content.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Yes, good point. I'll leave this empty for now, to make it obvious that the PerformanceProfile CRD was considered, but no relevant merge keys were identified.

Description:
- Per-NUMA hugepages entries can share the same size, so size is not
  a valid merge key. Users must provide the full pages list.
- No relevant merge keys for PerformanceProfile as of yet, keeping
  it in the crd-schema-config.json for awareness that the CRD was
  considered in the current openAPI schema generation

@imiller0 imiller0 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label Jul 1, 2026
@openshift-ci

openshift-ci Bot commented Jul 1, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: imiller0, irinamihai

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:
  • OWNERS [imiller0,irinamihai]

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

@openshift-merge-bot openshift-merge-bot Bot merged commit 50ff4e0 into openshift-kni:main Jul 1, 2026
8 checks passed
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. lgtm Indicates that a PR is ready to be merged.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants