Skip to content

Automated Sync from main to stable - #40

Open
rhods-devops-app[bot] wants to merge 395 commits into
stablefrom
main
Open

rhods-devops-app[bot] wants to merge 395 commits into
stablefrom
main

Conversation

@rhods-devops-app

@rhods-devops-app rhods-devops-app Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Automated Sync from main to stable

This PR automatically syncs the main branch to the stable branch by opening a pull request from main into stable.

Sync Summary

  • Latest commit: a4c0bd2b chore(deps): refresh rpm lockfiles [SECURITY] (chore(deps): refresh rpm lockfiles [SECURITY] #92)

  • Total commits to sync: 390

  • Source: https://github.com/red-hat-data-services/OpenShell.git @ main

  • Target: https://github.com/red-hat-data-services/OpenShell.git @ stable

  • PR head: main

Commits to be synced

Merging

GitHub automerge is enabled for this pull request once required checks pass.

moulalis and others added 30 commits October 21, 2026 08:12
)

Signed-off-by: Simon Scatton <sscatton@nvidia.com>
Signed-off-by: Krzysztof Malczuk <kmalczuk@redhat.com>
…NVIDIA#4762)

Some credentials are checked by handlers rather than by the gateway's
authenticators, so their rejections only reached the caller and plain
logs. They now emit the same OCSF events as the router's checks:

- SSH session tokens. A ForwardTcp SSH connection whose token is
  missing, unknown, revoked, minted for another sandbox, or expired
  emits an Authentication failure with protocol ssh_session_token and a
  reason category. An accepted token logs on once, like other
  credentials. The router has already authenticated the caller, so these
  events name that caller.
- IssueSandboxToken. A compute-driver identity that no longer matches
  the sandbox's recorded runtime emits an Authentication failure
  (stale_identity); a sandbox with no record, or no usable recorded
  identity, emits unknown_identity. A sandbox calling it with a gateway
  JWT is refused with method_not_permitted and raises the sandbox
  boundary finding.
- RefreshSandboxToken. A caller that is not a gateway-JWT sandbox is
  refused with method_not_permitted. A request for an extension service
  the sandbox policy does not select is refused with the new
  extension_service_not_selected reason, without a finding, because a
  policy update can race the supervisor's request.
- Sandbox logons on IssueSandboxToken and RefreshSandboxToken. The
  router logged a compute-driver credential on IssueSandboxToken, or a
  gateway JWT on RefreshSandboxToken, before the handler finished
  checking the recorded runtime or the token lineage, so a credential
  that failed that check recorded a success and then a failure. Those
  handlers now record the logon once their check passes. Other
  credentials on these methods are fully verified by the router and
  still log on there, even when authorization then refuses them.
- GetCurrentUser. A non-user principal is refused with
  method_not_permitted. The router already blocks such callers, so this
  is defense in depth.

Callers receive the same status codes and messages as before, and the
events never include the tokens.

Refs NVIDIA#2912

Signed-off-by: Kris Hicks <khicks@nvidia.com>
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
NVIDIA#4435)

* feat(skills): add release-captain skill for the weekly release cadence

Add an internal skill with Monday pre-flight, Tuesday stable cut, and
recovery steps for the RFC 0014 release train. All tag, workflow, merge,
and Slack actions require explicit maintainer approval.

Closes NVIDIA#4433

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): document starting a release train after tag-push triggers

Pre-release tag pushes now start Release Tag, so the skill no longer
dispatches after pushing. Add seed-commit selection from Release Dev
results, a commit-type summary for the patch/minor decision, and a
recovery row for a tag push that starts no run.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): create lightweight release tags regardless of signing config

With tag.gpgSign enabled, git tag creates an annotated tag and blocks in
an editor. Disable signing for the release tag commands so they create
the same lightweight tags as Auto-Tag.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): capture release captain lessons from starting 0.1.5

Note that Auto-Tag skips report success and show how to tell from the
log, the UTC time of the schedule across DST, where pre-releases appear
instead of the Releases page, why tags need a forced fetch, reading
workflow triggers from origin/main, the rolling dev tag, and the common
compatibility-review false positive for unpublished internal crates.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): add recovery for pre-releases failing on new RustSec advisories

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): recommend fixing forward to a green pre-release

A failed pre-release doesn't end the train. Document merging the fix and
tagging the next pre-release by hand once its Release Dev run passes,
letting the failed run finish for its remaining signal.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): describe the triage channel and thread replies for pre-release failures

Name #openshell-triage, where TriageBot posts each failed Release Tag
attempt, and ask the captain to reply in the failure's thread so others
know a fix is underway. List common transient failure types and rerun
once when a failure looks unrelated to the commit.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): drop Codex Security from release captain run matching

Codex Security no longer runs in release qualification (NVIDIA#4469), so the
stable release can't rely on a pre-release's Codex result and runs can't
be matched by its job name. Match dispatched runs by the qualification
artifact name instead.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): describe where and how to post the release coordination thread

Name the CNCF Slack channel, note that the release ships from main with
no release branch or cherry-picks, and add an example post.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): make seeding the next train the outgoing captain's handoff

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): update release captain for the Release workflow and add usage guide

Stable releases are now dispatched with release.yml, which selects the
qualified pre-release and creates the tag, and pre-releases run in
release-prerelease.yml. Replace the stable tag push steps and stale
recovery rows, add a preview of the selected candidate, add a section on
when to use each part of the skill, and trim redundant explanations.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): explain what the release cutoff guarantees

The release ships the final pre-release's commit only if it passes, so
the coordination post must not promise that every PR merged by the
cutoff ships. Describe the Auto-Tag and hand-tagged cutoffs, and tag
the final pre-release by hand on Tuesday for a later cutoff.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): add release notes review and v0.1.5 release day lessons

Review the release notes preview from the Pre-release run before
approval, and describe how Release regenerates them. Correct the thread
when the shipped pre-release was cut before the posted cutoff, require
maintainer agreement for accepted-risk breaks in a patch release, and
add recovery rows for startup failures and release notes failures.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): make starting the next train the captain's final duty

Move starting the next train after closing the loop, so it is the last
Tuesday step. The captain's week ends when the next -pre.1 Pre-release
run passes or its failure is handed off. Also move open milestone items
when closing the loop.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): trim the release captain skill to its durable steps

Remove repeated guidance, week-specific examples, fragile commands, and
debugging detail an agent can derive from the workflows. Keep the
approval guardrails, the weekly steps, and a short recovery table.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(ci): document Release Auto-Tag and pre-release notes previews

Add Release Auto-Tag to the workflow table, including that each train's
-pre.1 is pushed by hand, and note that every Pre-release run writes a
release notes preview.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): add a template for the release announcement reply

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): watch pre-releases in the week before your turn

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): remove internal channel references from release captain

Check pre-release runs directly instead of relying on an internal
notification channel, and drop internal Slack channel IDs.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* docs(skills): fix pre-release failures in a new number via Auto-Tag

A rerun repeats the same commit, so a failure that needs a fix ships
in the next -pre.N. Cut it by dispatching Release Auto-Tag from the tip
of main, and tag a specific commit by hand only when needed.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
NVIDIA#4777)

Handlers recorded each refusal by emitting an OCSF event and then
building the status by hand, so a new refusal could skip the event.
These helpers do both in one call:

- audit::deny emits an authorization denial for the current request and
  returns the permission-denied status. Guards, workspace
  authorization, and the token and current-user handlers use it.
- audit::reject_credential emits an Authentication failure for a
  credential a handler verifies itself and returns the rejection's
  status. It replaces emit_credential_failure for SSH session tokens and
  IssueSandboxToken. RefreshSandboxToken now takes its path and origin
  from the request scope, as every other handler does, instead of
  rebuilding them from the request.
- Failure and logon events share one Authentication builder.
- AuthMechanism and AuthFailureReason carry their audit labels. The
  logon digest uses the label instead of the variant's Debug name.

Events and statuses are unchanged.

Refs NVIDIA#2912

Signed-off-by: Kris Hicks <khicks@nvidia.com>
NVIDIA#4799)

Forward tests retried on a new port only when the CLI's port check
found the port in use. Another test can also take the port after that
check passes and before the fake ssh binds it. The fake then panicked
with exit status 101, which the retry did not recognize, so the test
failed.

The fake ssh now exits 255 when its port is taken, as
ssh -o ExitOnForwardFailure=yes does, and the tests retry on that exit
status too.

Signed-off-by: Kris Hicks <khicks@nvidia.com>
…NVIDIA#3967)

Workload images no longer need iproute2 or nftables since the supervisor
moved out of the workload (NVIDIA#2942). Docker and Podman run images without
USER as UID/GID 1000 (NVIDIA#3386), the driver creates /sandbox, and the CLI no
longer builds Dockerfiles (NVIDIA#3214). Update the bring-your-own-container
example and the runtimes page to match.

Fixes NVIDIA#3965

Signed-off-by: Adel Zaalouk <azaalouk@redhat.com>
Restore debug-openshell-cluster skill edits dropped by sync merge 5b42917 and make license:check pass for midstream-only files.

Signed-off-by: Andre Lustosa <alustosa@redhat.com>
…ill-license-headers/andre-motta

CARRY: fix(odh): restore upstream skill edits and SPDX header check
Tests for the gateway's OCSF events each carried their own copy of the
same fixtures: converting captured events to JSON, the request ID and
peer address, running a handler inside a routed request, and checking
event shapes. They now share them:

- OcsfCapture::json_events returns captured events as their exported
  JSON.
- auth::audit::test_support holds the test request origin, audited()
  for running a handler as a routed request, and assertions for
  authentication failures, logons, denials, boundary findings, the
  request origin, and redacted secrets. The event assertions also check
  each event against its OCSF class schema, which the handler tests did
  not do before.
- auth::principal::test_support builds the OIDC user and gateway-JWT
  sandbox principals that several test modules defined identically.

Refs NVIDIA#2912

Signed-off-by: Kris Hicks <khicks@nvidia.com>
Signed-off-by: Yuedong Wu <dwcn22@outlook.com>
* fix(examples): repair multi-agent notepad launch

Signed-off-by: Taylor Mutch <taylormutch@gmail.com>

* test(examples): remove redundant demo harness

Signed-off-by: Taylor Mutch <taylormutch@gmail.com>

---------

Signed-off-by: Taylor Mutch <taylormutch@gmail.com>
Signed-off-by: Taylor Mutch <taylormutch@gmail.com>
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
Signed-off-by: Taylor Mutch <taylormutch@gmail.com>
The example configuration left the dashboard on its chart's default image,
the upstream publisher's personal quay.io repository, although Konflux
publishes a public ODH build. It now sets dashboard.images.dashboard to
quay.io/opendatahub/odh-openshell-dashboard, pinned by digest. The chart
reference stays on its upstream publisher until an ODH chart registry
exists (RHOAIENG-96944).

The installer gave the dashboard the admin role but not the user role.
Dashboard builds since 2026-10-19 show an entitlement page to anyone
without one of the two roles and default the user role to "user", so a
standard user under any other role name was refused. The dashboard now
gets oidc.userRole from user_role, as the gateway does. Charts that
predate the value ignore it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Gage Krumbach <gkrumbac@redhat.com>
The example left the gateway, supervisor and sandbox runtime on the
gateway chart's defaults, the upstream publisher's images, while the
README asked for ODH builds without showing them. The example now names
quay.io/opendatahub/odh-openshell-{gateway,supervisor,sandbox} with
digest placeholders, and the README says how to pair a rhaiv tag with
the gateway chart. The default sandbox workload image stays on the
chart default: ODH publishes no replacement.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Gage Krumbach <gkrumbac@redhat.com>
gmenher and others added 8 commits November 2, 2026 16:14
Signed-off-by: Gaizka Menendez <gmenende@redhat.com>
Signed-off-by: Adrien Langou <alangou@nvidia.com>
* fix(ci): stop skipped release notes from skipping publication

Stable releases that reused the prerelease notes preview skipped the
Write Release Notes job. Every job that depends on Publish Release Assets
used an implicit success() check, which treats a skipped job anywhere
upstream as a failure. As a result, v0.1.6 never published its snap,
TypeScript SDK, Go SDK tag, wheels, or Fern docs. Prereleases hit the same
problem: Publish Prerelease Snap was always skipped.

Move notes production out of release-publish.yml. release-notes.yml now
chooses between reusing the preview and generating notes inside its steps,
so the job always succeeds when notes exist. Release runs it as a sibling
of Build, and Publish requires it. Publish Release Assets depends only on
assembly and the Helm chart again.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* fix(ci): make stable release publication rerunnable

Re-dispatching Release for an existing stable tag rebuilt the artifacts,
overwrote the published GHCR version tags, and then failed at the Helm
duplicate check before reaching the package publishers. Each publisher now
skips what is already published:

- GHCR keeps existing version tags and still verifies their SBOMs.
- Helm skips packaging and pushing when both charts exist, and still fails
  when only one exists. The Helm action is loaded from the workflow
  revision, so retrying an older tag uses the current duplicate handling.
- The GitHub Release uploads only missing assets.
- npm and the PyPI wheel trigger skip versions that already exist, whether
  called by Release or dispatched by hand.

test:release-workflows checks that publish logic is loaded from the
workflow revision and that no needed publish job can be skipped on its own.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* fix(ci): fail release runs when an expected publisher does not succeed

GitHub treats skipped jobs as passing, so v0.1.6 showed a green Release
run although its publishers never ran. A final Check Publication job in
release-publish.yml runs always and fails when any publisher expected for
the release kind did not succeed, which also fires the existing Pre-release
Slack alert. Release now sends the same Slack failure notice.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

* fix(ci): fail instead of overwriting when a registry lookup errors

The GHCR and Helm existence checks treated any lookup error as not
published, so a transient registry error could fall through to a push that
overwrites a published tag. Only a confirmed missing tag now counts as
unpublished; any other lookup error fails the job.

Also state in CI.md that published artifacts are never overwritten, and
remove the static release workflow test; check-publication catches skipped
publishers at runtime.

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>

---------

Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
…#4918)

* feat(sdk): route Python SDK exec to the sandbox owner replica

Ask GetSandbox for the owner replica, cache it for 30 seconds, and send
it as x-openshell-replica on ExecSandbox. Retry once without the hint
when the per-replica route has no healthy endpoint, forgetting the
cached owner.

Part of NVIDIA#4223

Signed-off-by: divesh <dgude@nvidia.com>

* refactor(sdk): share the Python GetSandbox request for owner lookup

Reuse get's request for the owner lookup, point the routing headers at
their documented contract, and accept only string owner metadata.

Part of NVIDIA#4223

Signed-off-by: divesh <dgude@nvidia.com>

---------

Signed-off-by: divesh <dgude@nvidia.com>
…IA#5131)

Signed-off-by: Artem Lytvyn <letv1n2007@icloud.com>
concurrency:
group: ${{ inputs.notes-only && format('release-notes-preview-{0}', github.ref) || 'release-stable' }}
cancel-in-progress: false
queue: max
red-hat-konflux Bot and others added 2 commits November 3, 2026 01:57
Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com>
Signed-off-by: konflux-internal-p02 <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
Co-authored-by: konflux-internal-p02[bot] <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
konflux-internal-p02 Bot and others added 11 commits November 4, 2026 07:44
Signed-off-by: konflux-internal-p02 <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
Co-authored-by: konflux-internal-p02[bot] <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
…3-review-followups

CARRY: fix(odh): harden generic fetcher follow-ups
…tmaker/main/lock-file-maintenance

chore(deps): refresh rpm lockfiles
…hub-io#158)

CARRY: fix(ci): refresh stale e2e generic-fetcher checksums

The Mint Maker bumps for uv, nextest, helm, and ocp-release rewrote the
download URLs and filenames in deploy/konflux/e2e-odh/generic-fetcher.yaml
without recomputing the checksums, leaving the previous versions' hashes
in place. Hermeto's strict-mode verification then failed the
prefetch-dependencies step of odh-openshell-e2e-on-pull-request on every
PR. Refresh all eight amd64/arm64 checksums by running
sync-generic-fetcher.py --update uv oc helm nextest, with each hash
verified against the publisher's checksum sidecar.

Signed-off-by: Emilien Macchi <emacchi@redhat.com>

* fix(ci): generate typed gRPC stubs in the e2e image

Upstream 5040 added --mypy_grpc_out to generate_python_proto.py, which
needs the protoc-gen-mypy_grpc plugin from mypy-protobuf. The e2e image
builds its hermetic venv from odh/requirements.txt, which did not include
that package, so the image build failed at the proto generation step
with "protoc-gen-mypy_grpc: program not found". The failure was masked
until now because the stale generic-fetcher checksums failed the
pipeline earlier.

Add mypy-protobuf to odh/requirements.in and regenerate the locked
requirements with hashes, matching the mypy-protobuf>=5.1 declaration
in the root pyproject.toml. grpc_tools.protoc resolves plugins through
PATH, and the image invokes the venv python without activating the venv,
so also prepend /opt/odh-e2e-venv/bin to PATH for the generation step.

Signed-off-by: Emilien Macchi <emacchi@redhat.com>

---------

Signed-off-by: Emilien Macchi <emacchi@redhat.com>
… docker tag to v9.8-1793614932 (#91)

Signed-off-by: konflux-internal-p02 <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
Co-authored-by: konflux-internal-p02[bot] <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
Signed-off-by: konflux-internal-p02 <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
Co-authored-by: konflux-internal-p02[bot] <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
… docker tag to v9.8-1793614932 (opendatahub-io#155)

Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com>
Co-authored-by: red-hat-konflux[bot] <126015336+red-hat-konflux[bot]@users.noreply.github.com>
moulalis and others added 4 commits November 5, 2026 08:08
Signed-off-by: konflux-internal-p02 <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
Co-authored-by: konflux-internal-p02[bot] <170854209+konflux-internal-p02[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment