Skip to content

[fournos-launcher] Submit jobs to the psap-mgmt cluster - #19

Merged
kpouget merged 15 commits into
openshift-psap:mainfrom
kpouget:launcher
Apr 9, 2026
Merged

kpouget merged 15 commits into
openshift-psap:mainfrom
kpouget:launcher

Conversation

@kpouget

@kpouget kpouget commented Apr 9, 2026 •

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features

    • Job names are now automatically sanitized and validated for Kubernetes compatibility.
    • New utility for Kubernetes name handling added.
  • Bug Fixes

    • Improved command error reporting and safer job submission behavior.
  • Chores

    • Updated job orchestration owner identifier.
    • Upgraded Kubernetes API version in job templates and enabled inline config overrides.
    • CI artifacts for variable overrides moved into a dedicated metadata subdirectory.

@openshift-ci

openshift-ci Bot commented Apr 9, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign mml-coder for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found 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

@coderabbitai

coderabbitai Bot commented Apr 9, 2026 •

Copy link
Copy Markdown

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 Kubernetes name-sanitization utilities and uses them for job name generation; adjusts shell logging literals; updates fournOS orchestration owner string and FournosJob template apiVersion and preset/configOverrides rendering; and relocates CI variable_overrides.yaml into a 000__ci_metadata/ subdirectory with corresponding test and task updates.

Changes

Cohort / File(s) Summary
Shell logging
projects/core/dsl/shell.py
Replaced several f-string logger.info() messages with plain string literals for <stdout not logged>, <stderr not logged>, and <no output> lines; minor mkdir() header string change.
K8s helpers (new)
projects/core/dsl/utils/__init__.py, projects/core/dsl/utils/k8s.py
Added utils package docstring and new sanitize_k8s_name(name: str) -> str and is_valid_k8s_name(name: str) -> bool implementing Kubernetes name sanitization/validation rules (lowercase, replace invalid chars, collapse/truncate, ensure alphanumeric ends).
Job name usage & error formatting
projects/fournos_launcher/toolbox/submit_and_wait/main.py, projects/core/dsl/toolbox.py
generate_job_name now sets ctx.final_job_name using sanitize_k8s_name (from provided job name or auto-generated forge-{project}-{timestamp}); submit_fournos_job relies on shell.run to raise on oc apply failures; get_task_execution_error() special-cases subprocess.CalledProcessError.args when formatting.
Fournos orchestration config
projects/fournos_launcher/orchestration/config.yaml
Updated fournos.job.owner value from fournos-launcher → "FORGE/fournos-launcher".
Fournos job template
projects/fournos_launcher/toolbox/submit_and_wait/templates/job.yaml.j2
CRD apiVersion changed fournos.example.com/v1 → fournos.dev/v1; spec.forge.preset now rendered inline via `{{ args.args
CI artifact paths & tasks
projects/jump_ci/testing/test.py, projects/jump_ci/toolbox/jump_ci_prepare_step/tasks/main.yml, projects/legacy/library/config.py
Moved variable_overrides.yaml into 000__ci_metadata/variable_overrides.yaml in test lookup, Ansible task write/sync paths, and VARIABLE_OVERRIDES_FILENAME constant.

Sequence Diagram(s)

(omitted)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐰 I hopped through strings and trimmed each little name,
Replaced some f-strings, gave templates brand-new frame.
I nested meta files in a cozy tiny pad,
Sanitized job names so clusters aren't sad.
🥕 Hop, patch, deploy — a rabbit's tidy game.

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title refers to submitting jobs to a specific cluster, but the actual PR changes span multiple unrelated concerns: removing f-string interpolation from log messages, updating YAML configuration and template structures, adding new Kubernetes name validation utilities, and reorganizing artifact directory paths. Update the title to reflect the broader scope of changes, such as '[fournos-launcher] Restructure CI artifacts and add K8s name validation' or break into multiple focused PRs.
Docstring Coverage ⚠️ Warning Docstring coverage is 72.73% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@projects/core/dsl/shell.py`:
- Line 85: The two log lines use string placeholders but are missing the
f-string prefix, so update the logger.info calls that reference
result.stderr.strip() and result.returncode to use f-strings (add the leading
"f") so the placeholders are interpolated; locate the logger.info("| <stderr>
{result.stderr.strip()}") and logger.info("| Exit code: {result.returncode}")
occurrences in the shell execution routine and add the f prefix to each log
string.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: e57e3357-53ee-407b-8957-7b23a768da5b

📥 Commits

Reviewing files that changed from the base of the PR and between b6ae08d and 95cc14a.

📒 Files selected for processing (3)
  • projects/core/dsl/shell.py
  • projects/fournos_launcher/orchestration/config.yaml
  • projects/fournos_launcher/toolbox/submit_and_wait/templates/job.yaml.j2

Comment thread projects/core/dsl/shell.py Outdated
@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d hello world
/cluster cluster-1
/var something.is.wrong: false

@psap-forge-bot

psap-forge-bot Bot commented Apr 9, 2026

Copy link
Copy Markdown

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos llm_d hello world
/cluster cluster-1
/var something.is.wrong: false

• Failure indicator:

## /logs/artifacts/FAILURE 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~~ projects/fournos_launcher/toolbox/submit_and_wait/main.py:127
~~ TASK: submit_fournos_job: Submit the FOURNOS job
~~ ARTIFACT_DIR: /logs/artifacts/001__submit_and_wait
~~ LOG_FILE: /logs/artifacts/001__submit_and_wait/task.log
~~ ARGS:
~~     cluster_name: cluster-1
~~     project: llm_d
~~     args:
~~     - hello
~~     - world
~~     variables_overrides:
~~       something.is.wrong: 'false'
~~     job_name: ''
~~     namespace: psap-automation
~~     owner: FORGE/fournos-launcher
~~     display_name: Forge Job
~~     pipeline_name: fournos-run-only
~~     env:
~~       JOB_TYPE: presubmit
~~       JOB_NAME: pull-ci-openshift-psap-forge-main-fournos
~~       JOB_SPEC: '{"type":"presubmit","job":"pull-ci-openshift-psap-forge-main-fournos","buildid":"2042156963034304512","prowjobid":"14a1b397-f72b-41c3-8ea1-f5b3f0193711","refs":{"org":"openshift-psap","repo":"forge","repo_link":"https://github.com/openshift-psap/forge","base_ref":"main","base_sha":"b6ae08db216592eb5f72c896b7dbc486e845081f","base_link":"https://github.com/openshift-psap/forge/commit/b6ae08db216592eb5f72c896b7dbc486e845081f","pulls":[{"number":19,"author":"kpouget","sha":"95cc14a1ec8f58b07db4ee74dddb8848b7ce9b3b","title":"[fournos-launcher]
~~         Submit jobs to the psap-mgmt cluster","head_ref":"launcher","link":"https://github.com/openshift-psap/forge/pull/19","commit_link":"https://github.com/openshift-psap/forge/pull/19/commits/95cc14a1ec8f58b07db4ee74dddb8848b7ce9b3b","author_link":"https://github.com/kpouget"}]},"decoration_config":{"timeout":"23h0m0s","grace_period":"15s","utility_images":{"clonerefs":"us-docker.pkg.dev/k8s-infra-prow/images/clonerefs:v20260408-3bbc91829","initupload":"us-docker.pkg.dev/k8s-infra-prow/images/initupload:v20260408-3bbc91829","entrypoint":"us-docker.pkg.dev/k8s-infra-prow/images/entrypoint:v20260408-3bbc91829","sidecar":"us-docker.pkg.dev/k8s-infra-prow/images/sidecar:v20260408-3bbc91829"},"resources":{"clonerefs":{"limits":{"memory":"3Gi"},"requests":{"cpu":"100m","memory":"500Mi"}},"initupload":{"limits":{"memory":"200Mi"},"requests":{"cpu":"100m","memory":"50Mi"}},"place_entrypoint":{"limits":{"memory":"100Mi"},"requests":{"cpu":"100m","memory":"25Mi"}},"sidecar":{"limits":{"memory":"2Gi"},"requests":{"cpu":"100m","memory":"250Mi"}}},"gcs_configuration":{"bucket":"test-platform-results","path_strategy":"single","default_org":"openshift","default_repo":"origin","mediaTypes":{"log":"text/plain"},"compress_file_types":["txt","log","json","tar","html","yaml"]},"gcs_credentials_secret":"gce-sa-credentials-gcs-publisher","skip_cloning":true,"censor_secrets":true,"censoring_options":{"minimum_secret_length":6}}}'
~~       OPENSHIFT_CI: 'true'
~~       JOB_NAME_SAFE: fournos
~~       BUILD_ID: '2042156963034304512'
~~       PULL_PULL_SHA: 95cc14a1ec8f58b07db4ee74dddb8848b7ce9b3b
~~       PULL_NUMBER: '19'
~~       PULL_BASE_REF: main
~~       REPO_NAME: forge
~~       REPO_OWNER: openshift-psap
~~       PULL_BASE_SHA: b6ae08db216592eb5f72c896b7dbc486e845081f
~~       PULL_TITLE: '[fournos-launcher] Submit jobs to the psap-mgmt cluster'
~~       PULL_REFS: main:b6ae08db216592eb5f72c896b7dbc486e845081f,19:95cc14a1ec8f58b07db4ee74dddb8848b7ce9b3b
~~       PULL_HEAD_REF: launcher
~~     artifact_dir: /logs/artifacts/001__submit_and_wait
~~ CONTEXT:
~~     final_job_name: forge-llm_d-20260409-082618
~~     manifest_file: /logs/artifacts/001__submit_and_wait/src/forge-llm_d-20260409-082618-manifest.yaml
~~
~~ EXCEPTION: CalledProcessError
~~     Command 'oc apply -f /logs/artifacts/001__submit_and_wait/src/forge-llm_d-20260409-082618-manifest.yaml' returned non-zero exit status 1.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


[...]

• Execution logs

@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: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@projects/core/dsl/utils/k8s.py`:
- Around line 46-53: The current truncation and fallback for the sanitized name
can create duplicate names; change the logic around the sanitized variable so
truncation appends a deterministic short hash instead of blind slicing and the
empty-fallback uses a hashed suffix: compute a stable hash (e.g.,
sha1/hexdigest) of the original input, then when len(sanitized) > 63 produce a
name like sanitized[:(63-9)] + '-' + hash[:8] (ensure resulting last char is
alphanumeric and replace any non-alnum with 'x'), and when sanitized is empty
return 'default-' + hash[:8] (also ensure length<=63 and alphanumeric end).
Update the block that currently does if len(sanitized) > 63: ... and the return
sanitized or 'default' to implement this hashed-suffix strategy using the
variable sanitized and the original input used to build it.

In `@projects/fournos_launcher/toolbox/submit_and_wait/templates/job.yaml.j2`:
- Around line 13-14: The template currently injects preset with {{ args.args }}
which renders a Python list as a YAML string; change the expression to serialize
the list as JSON (same approach used for configOverrides) by using the tojson
filter on args.args so preset becomes a proper YAML/JSON array; update the
job.yaml.j2 template's preset line to use args.args | tojson (referencing the
preset key and args.args symbol and matching the existing configOverrides
usage).
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7722bf52-2939-4956-886b-b7cfad31cbcd

📥 Commits

Reviewing files that changed from the base of the PR and between 95cc14a and 83bf779.

📒 Files selected for processing (6)
  • projects/core/dsl/shell.py
  • projects/core/dsl/utils/__init__.py
  • projects/core/dsl/utils/k8s.py
  • projects/fournos_launcher/orchestration/config.yaml
  • projects/fournos_launcher/toolbox/submit_and_wait/main.py
  • projects/fournos_launcher/toolbox/submit_and_wait/templates/job.yaml.j2
✅ Files skipped from review due to trivial changes (3)
  • projects/core/dsl/utils/init.py
  • projects/core/dsl/shell.py
  • projects/fournos_launcher/orchestration/config.yaml

Comment on lines +46 to +53
if len(sanitized) > 63:
sanitized = sanitized[:63]
# Make sure it still ends with alphanumeric after truncation
if not sanitized[-1].isalnum():
sanitized = sanitized[:-1] + 'x'

return sanitized or 'default'

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

Avoid collision-prone truncation/fallback in sanitized names.

Current logic at Line 46 and Line 52 can produce duplicate names ([:63] truncation or 'default' fallback), which may cause job creation conflicts.

Suggested fix
+import hashlib
 import re
@@
-    # Truncate to 63 characters (K8s limit)
-    if len(sanitized) > 63:
-        sanitized = sanitized[:63]
-        # Make sure it still ends with alphanumeric after truncation
-        if not sanitized[-1].isalnum():
-            sanitized = sanitized[:-1] + 'x'
-
-    return sanitized or 'default'
+    # Keep uniqueness when truncating or recovering from empty names
+    if len(sanitized) > 63 or not sanitized:
+        suffix = hashlib.sha1(name.encode("utf-8")).hexdigest()[:8]
+        head = (sanitized or "job")[:63 - len(suffix) - 1]
+        head = re.sub(r'-+$', '', head) or "job"
+        sanitized = f"{head}-{suffix}"
+
+    if not sanitized[-1].isalnum():
+        sanitized = sanitized[:-1] + 'x'
+
+    return sanitized
📝 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
if len(sanitized) > 63:
sanitized = sanitized[:63]
# Make sure it still ends with alphanumeric after truncation
if not sanitized[-1].isalnum():
sanitized = sanitized[:-1] + 'x'
return sanitized or 'default'
# Keep uniqueness when truncating or recovering from empty names
if len(sanitized) > 63 or not sanitized:
suffix = hashlib.sha1(name.encode("utf-8")).hexdigest()[:8]
head = (sanitized or "job")[:63 - len(suffix) - 1]
head = re.sub(r'-+$', '', head) or "job"
sanitized = f"{head}-{suffix}"
if not sanitized[-1].isalnum():
sanitized = sanitized[:-1] + 'x'
return sanitized
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/core/dsl/utils/k8s.py` around lines 46 - 53, The current truncation
and fallback for the sanitized name can create duplicate names; change the logic
around the sanitized variable so truncation appends a deterministic short hash
instead of blind slicing and the empty-fallback uses a hashed suffix: compute a
stable hash (e.g., sha1/hexdigest) of the original input, then when
len(sanitized) > 63 produce a name like sanitized[:(63-9)] + '-' + hash[:8]
(ensure resulting last char is alphanumeric and replace any non-alnum with 'x'),
and when sanitized is empty return 'default-' + hash[:8] (also ensure length<=63
and alphanumeric end). Update the block that currently does if len(sanitized) >
63: ... and the return sanitized or 'default' to implement this hashed-suffix
strategy using the variable sanitized and the original input used to build it.

Comment on lines +13 to +14
preset: {{ args.args }}
configOverrides: {{ args.variables_overrides | tojson }}

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

🧩 Analysis chain

🏁 Script executed:

# First, let's examine the job.yaml.j2 file
cat -n "projects/fournos_launcher/toolbox/submit_and_wait/templates/job.yaml.j2"

Repository: openshift-psap/forge

Length of output: 626


🏁 Script executed:

# Search for references to this template and how args.args is constructed
rg "job\.yaml\.j2|args\.args" --type py --type yaml -B 2 -A 2 | head -100

Repository: openshift-psap/forge

Length of output: 2279


🏁 Script executed:

# Find related Python files that might populate args
fd "submit_and_wait" --type f | head -20

Repository: openshift-psap/forge

Length of output: 46


🏁 Script executed:

# Search for preset usage and any schema definitions
rg "preset" --type py --type yaml -B 2 -A 2 | head -80

Repository: openshift-psap/forge

Length of output: 5185


🏁 Script executed:

# Look for test files related to submit_and_wait
find . -path "*/test*" -name "*submit_and_wait*" -o -path "*/test*" -name "*job.yaml*" | head -20

Repository: openshift-psap/forge

Length of output: 46


🏁 Script executed:

# Let's test what Jinja2 renders for a Python list
python3 <<'EOF'
from jinja2 import Template

# Test default rendering of Python list
template = Template("{{ my_list }}")
result = template.render(my_list=['item1', 'item2', 'special"quote'])
print("Default rendering:", repr(result))

# Test with tojson filter
template_json = Template("{{ my_list | tojson }}")
result_json = template_json.render(my_list=['item1', 'item2', 'special"quote'])
print("With tojson filter:", repr(result_json))

# What this looks like in YAML context
yaml_test_default = f"""
preset: {result}
"""
print("\nYAML with default rendering:")
print(yaml_test_default)

yaml_test_json = f"""
preset: {result_json}
"""
print("YAML with tojson rendering:")
print(yaml_test_json)
EOF

Repository: openshift-psap/forge

Length of output: 337


🏁 Script executed:

# Search for Fournos schema or documentation
rg "FournosJob|preset" --type yaml --type python | grep -i "schema\|preset\|fournos" | head -40

Repository: openshift-psap/forge

Length of output: 94


🏁 Script executed:

# Look for any test files or example manifests
find . -name "*.yaml" -o -name "*.yml" | xargs grep -l "preset" 2>/dev/null | head -10

Repository: openshift-psap/forge

Length of output: 145


🏁 Script executed:

# Check for more context on how args.args is populated
rg "args\.args\s*=" --type py -B 3 -A 1 | head -60

Repository: openshift-psap/forge

Length of output: 46


Serialize preset safely before injecting into YAML.

At Line 13, {{ args.args }} renders a Python list as a string literal (e.g., ['item1', 'item2']), which YAML parses as a string rather than an array, causing a type mismatch. Use tojson to produce proper JSON syntax, matching the approach already used for configOverrides at Line 14.

Suggested fix
-    preset: {{ args.args }}
+    preset: {{ args.args | tojson }}
     configOverrides: {{ args.variables_overrides | tojson }}
📝 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
preset: {{ args.args }}
configOverrides: {{ args.variables_overrides | tojson }}
preset: {{ args.args | tojson }}
configOverrides: {{ args.variables_overrides | tojson }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/fournos_launcher/toolbox/submit_and_wait/templates/job.yaml.j2`
around lines 13 - 14, The template currently injects preset with {{ args.args }}
which renders a Python list as a YAML string; change the expression to serialize
the list as JSON (same approach used for configOverrides) by using the tojson
filter on args.args so preset becomes a proper YAML/JSON array; update the
job.yaml.j2 template's preset line to use args.args | tojson (referencing the
preset key and args.args symbol and matching the existing configOverrides
usage).

@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d hello world
/cluster cluster-1
/var something.is.wrong: false

@psap-forge-bot

psap-forge-bot Bot commented Apr 9, 2026

Copy link
Copy Markdown

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos llm_d hello world
/cluster cluster-1
/var something.is.wrong: false

• Failure indicator:

## /logs/artifacts/FAILURE 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~~ projects/fournos_launcher/toolbox/submit_and_wait/main.py:133
~~ TASK: submit_fournos_job: Submit the FOURNOS job
~~ ARTIFACT_DIR: /logs/artifacts/001__submit_and_wait
~~ LOG_FILE: /logs/artifacts/001__submit_and_wait/task.log
~~ ARGS:
~~     cluster_name: cluster-1
~~     project: llm_d
~~     args:
~~     - hello
~~     - world
~~     variables_overrides:
~~       something.is.wrong: 'false'
~~     job_name: ''
~~     namespace: psap-automation
~~     owner: FORGE/fournos-launcher
~~     display_name: Forge Job
~~     pipeline_name: fournos-run-only
~~     env:
~~       JOB_TYPE: presubmit
~~       JOB_NAME: pull-ci-openshift-psap-forge-main-fournos
~~       JOB_SPEC: '{"type":"presubmit","job":"pull-ci-openshift-psap-forge-main-fournos","buildid":"2042160637362049024","prowjobid":"5682a2c5-0bd6-41a9-bfa7-7313a316fd1c","refs":{"org":"openshift-psap","repo":"forge","repo_link":"https://github.com/openshift-psap/forge","base_ref":"main","base_sha":"b6ae08db216592eb5f72c896b7dbc486e845081f","base_link":"https://github.com/openshift-psap/forge/commit/b6ae08db216592eb5f72c896b7dbc486e845081f","pulls":[{"number":19,"author":"kpouget","sha":"83bf779321e92c68edf503a8e5a75d0f254b1ef8","title":"[fournos-launcher]
~~         Submit jobs to the psap-mgmt cluster","head_ref":"launcher","link":"https://github.com/openshift-psap/forge/pull/19","commit_link":"https://github.com/openshift-psap/forge/pull/19/commits/83bf779321e92c68edf503a8e5a75d0f254b1ef8","author_link":"https://github.com/kpouget"}]},"decoration_config":{"timeout":"23h0m0s","grace_period":"15s","utility_images":{"clonerefs":"us-docker.pkg.dev/k8s-infra-prow/images/clonerefs:v20260408-3bbc91829","initupload":"us-docker.pkg.dev/k8s-infra-prow/images/initupload:v20260408-3bbc91829","entrypoint":"us-docker.pkg.dev/k8s-infra-prow/images/entrypoint:v20260408-3bbc91829","sidecar":"us-docker.pkg.dev/k8s-infra-prow/images/sidecar:v20260408-3bbc91829"},"resources":{"clonerefs":{"limits":{"memory":"3Gi"},"requests":{"cpu":"100m","memory":"500Mi"}},"initupload":{"limits":{"memory":"200Mi"},"requests":{"cpu":"100m","memory":"50Mi"}},"place_entrypoint":{"limits":{"memory":"100Mi"},"requests":{"cpu":"100m","memory":"25Mi"}},"sidecar":{"limits":{"memory":"2Gi"},"requests":{"cpu":"100m","memory":"250Mi"}}},"gcs_configuration":{"bucket":"test-platform-results","path_strategy":"single","default_org":"openshift","default_repo":"origin","mediaTypes":{"log":"text/plain"},"compress_file_types":["txt","log","json","tar","html","yaml"]},"gcs_credentials_secret":"gce-sa-credentials-gcs-publisher","skip_cloning":true,"censor_secrets":true,"censoring_options":{"minimum_secret_length":6}}}'
~~       OPENSHIFT_CI: 'true'
~~       JOB_NAME_SAFE: fournos
~~       BUILD_ID: '2042160637362049024'
~~       PULL_PULL_SHA: 83bf779321e92c68edf503a8e5a75d0f254b1ef8
~~       PULL_NUMBER: '19'
~~       PULL_BASE_REF: main
~~       REPO_NAME: forge
~~       REPO_OWNER: openshift-psap
~~       PULL_BASE_SHA: b6ae08db216592eb5f72c896b7dbc486e845081f
~~       PULL_TITLE: '[fournos-launcher] Submit jobs to the psap-mgmt cluster'
~~       PULL_REFS: main:b6ae08db216592eb5f72c896b7dbc486e845081f,19:83bf779321e92c68edf503a8e5a75d0f254b1ef8
~~       PULL_HEAD_REF: launcher
~~     artifact_dir: /logs/artifacts/001__submit_and_wait
~~ CONTEXT:
~~     final_job_name: forge-llm-d-20260409-084034
~~     manifest_file: /logs/artifacts/001__submit_and_wait/src/forge-llm-d-20260409-084034-manifest.yaml
~~
~~ EXCEPTION: CalledProcessError
~~     Command 'oc apply -f /logs/artifacts/001__submit_and_wait/src/forge-llm-d-20260409-084034-manifest.yaml' returned non-zero exit status 1.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


[...]

• Execution logs

@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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@projects/core/dsl/toolbox.py`:
- Around line 115-118: The CalledProcessError handling in the generator assumes
e.original_exception.args[0] is a message string; change the condition in the
branch that checks isinstance(e.original_exception,
subprocess.CalledProcessError) to also verify that e.original_exception.args is
truthy and that e.original_exception.args[0] is a non-empty string (e.g.,
isinstance(...args[0], str) and args[0].strip()). If that check passes, yield
the args[0] message as before; otherwise fall back to yielding a stringified
version of the exception (e.g., str(e.original_exception)) so integer return
codes do not render as the message. Ensure you reference e.original_exception
and subprocess.CalledProcessError in the updated condition.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 29031f3b-c8c3-4d5d-95ff-5ee37a043f4a

📥 Commits

Reviewing files that changed from the base of the PR and between 83bf779 and 2f956c5.

📒 Files selected for processing (2)
  • projects/core/dsl/toolbox.py
  • projects/fournos_launcher/toolbox/submit_and_wait/main.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • projects/fournos_launcher/toolbox/submit_and_wait/main.py

Comment on lines +115 to +118
if isinstance(e.original_exception, subprocess.CalledProcessError) and e.original_exception.args:
yield f"~~ {e.original_exception.args[0]}"
else:
yield f"~~ {e.original_exception}"

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify all construction paths for CalledProcessError and where .args is overridden.
# Expected result: any path without string args[0] can trigger low-quality error rendering.
rg -nP --type=py -C3 '\bCalledProcessError\s*\('
rg -nP --type=py -C3 '\.args\s*='

Repository: openshift-psap/forge

Length of output: 1455


🏁 Script executed:

#!/bin/bash
# 1. Search for all CalledProcessError instantiations
echo "=== CalledProcessError instantiations ==="
rg -nP --type=py 'CalledProcessError\s*\(' -A2

echo ""
echo "=== All .args assignments ==="
rg -nP --type=py '\.args\s*=' -B2 -A2

echo ""
echo "=== Context around toolbox.py lines 114-120 to see the full error handling ==="
sed -n '110,125p' projects/core/dsl/toolbox.py

Repository: openshift-psap/forge

Length of output: 1629


🏁 Script executed:

#!/bin/bash
python3 <<'EOF'
import subprocess

# Simulate what happens in runner.py:67
try:
    raise subprocess.CalledProcessError(1, "test_command", "stdout_output", "stderr_output")
except subprocess.CalledProcessError as e:
    print("CalledProcessError created directly (runner.py style):")
    print(f"  .args = {e.args}")
    print(f"  .args[0] = {e.args[0]}")
    print(f"  type(args[0]) = {type(e.args[0])}")
    print()

# Simulate what happens in shell.py:106-107
try:
    error = subprocess.CalledProcessError(1, "test_command", "stdout_output", "stderr_output")
    error.args = ("Enhanced error message here",)
    raise error
except subprocess.CalledProcessError as e:
    print("CalledProcessError with .args override (shell.py style):")
    print(f"  .args = {e.args}")
    print(f"  .args[0] = {e.args[0]}")
    print(f"  type(args[0]) = {type(e.args[0])}")
EOF

Repository: openshift-psap/forge

Length of output: 403


🏁 Script executed:

#!/bin/bash
# View the shell.py error message construction
sed -n '95,110p' projects/core/dsl/shell.py

Repository: openshift-psap/forge

Length of output: 720


Harden CalledProcessError message extraction to prevent rendering integer return codes.

The current code assumes args[0] is always a message string, but when CalledProcessError is raised directly (as in runner.py), args[0] is the integer return code. This produces output like ~~ 1 instead of an error message. The check should verify args[0] is both a string and non-empty before using it.

Proposed patch
-    if isinstance(e.original_exception, subprocess.CalledProcessError) and e.original_exception.args:
-        yield f"~~     {e.original_exception.args[0]}"
+    if (
+        isinstance(e.original_exception, subprocess.CalledProcessError)
+        and e.original_exception.args
+        and isinstance(e.original_exception.args[0], str)
+        and e.original_exception.args[0].strip()
+    ):
+        yield f"~~     {e.original_exception.args[0]}"
     else:
         yield f"~~     {e.original_exception}"
📝 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
if isinstance(e.original_exception, subprocess.CalledProcessError) and e.original_exception.args:
yield f"~~ {e.original_exception.args[0]}"
else:
yield f"~~ {e.original_exception}"
if (
isinstance(e.original_exception, subprocess.CalledProcessError)
and e.original_exception.args
and isinstance(e.original_exception.args[0], str)
and e.original_exception.args[0].strip()
):
yield f"~~ {e.original_exception.args[0]}"
else:
yield f"~~ {e.original_exception}"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/core/dsl/toolbox.py` around lines 115 - 118, The CalledProcessError
handling in the generator assumes e.original_exception.args[0] is a message
string; change the condition in the branch that checks
isinstance(e.original_exception, subprocess.CalledProcessError) to also verify
that e.original_exception.args is truthy and that e.original_exception.args[0]
is a non-empty string (e.g., isinstance(...args[0], str) and args[0].strip()).
If that check passes, yield the args[0] message as before; otherwise fall back
to yielding a stringified version of the exception (e.g.,
str(e.original_exception)) so integer return codes do not render as the message.
Ensure you reference e.original_exception and subprocess.CalledProcessError in
the updated condition.

@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d hello world
/cluster cluster-1
/var something.is.wrong: false

@psap-forge-bot

psap-forge-bot Bot commented Apr 9, 2026

Copy link
Copy Markdown

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos llm_d hello world
/cluster cluster-1
/var something.is.wrong: false

• Failure indicator:

## /logs/artifacts/FAILURE 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~~ projects/fournos_launcher/toolbox/submit_and_wait/main.py:133
~~ TASK: submit_fournos_job: Submit the FOURNOS job
~~ ARTIFACT_DIR: /logs/artifacts/001__submit_and_wait
~~ LOG_FILE: /logs/artifacts/001__submit_and_wait/task.log
~~ ARGS:
~~     cluster_name: cluster-1
~~     project: llm_d
~~     args:
~~     - hello
~~     - world
~~     variables_overrides:
~~       something.is.wrong: 'false'
~~     job_name: ''
~~     namespace: psap-automation
~~     owner: FORGE/fournos-launcher
~~     display_name: Forge Job
~~     pipeline_name: fournos-run-only
~~     env:
~~       JOB_TYPE: presubmit
~~       JOB_NAME: pull-ci-openshift-psap-forge-main-fournos
~~       JOB_SPEC: '{"type":"presubmit","job":"pull-ci-openshift-psap-forge-main-fournos","buildid":"2042165432474931200","prowjobid":"edd847b8-ad50-4715-a372-17484e6272e6","refs":{"org":"openshift-psap","repo":"forge","repo_link":"https://github.com/openshift-psap/forge","base_ref":"main","base_sha":"b6ae08db216592eb5f72c896b7dbc486e845081f","base_link":"https://github.com/openshift-psap/forge/commit/b6ae08db216592eb5f72c896b7dbc486e845081f","pulls":[{"number":19,"author":"kpouget","sha":"2f58395a8101a2d13b4794d96462faf37ed688f5","title":"[fournos-launcher]
~~         Submit jobs to the psap-mgmt cluster","head_ref":"launcher","link":"https://github.com/openshift-psap/forge/pull/19","commit_link":"https://github.com/openshift-psap/forge/pull/19/commits/2f58395a8101a2d13b4794d96462faf37ed688f5","author_link":"https://github.com/kpouget"}]},"decoration_config":{"timeout":"23h0m0s","grace_period":"15s","utility_images":{"clonerefs":"us-docker.pkg.dev/k8s-infra-prow/images/clonerefs:v20260408-3bbc91829","initupload":"us-docker.pkg.dev/k8s-infra-prow/images/initupload:v20260408-3bbc91829","entrypoint":"us-docker.pkg.dev/k8s-infra-prow/images/entrypoint:v20260408-3bbc91829","sidecar":"us-docker.pkg.dev/k8s-infra-prow/images/sidecar:v20260408-3bbc91829"},"resources":{"clonerefs":{"limits":{"memory":"3Gi"},"requests":{"cpu":"100m","memory":"500Mi"}},"initupload":{"limits":{"memory":"200Mi"},"requests":{"cpu":"100m","memory":"50Mi"}},"place_entrypoint":{"limits":{"memory":"100Mi"},"requests":{"cpu":"100m","memory":"25Mi"}},"sidecar":{"limits":{"memory":"2Gi"},"requests":{"cpu":"100m","memory":"250Mi"}}},"gcs_configuration":{"bucket":"test-platform-results","path_strategy":"single","default_org":"openshift","default_repo":"origin","mediaTypes":{"log":"text/plain"},"compress_file_types":["txt","log","json","tar","html","yaml"]},"gcs_credentials_secret":"gce-sa-credentials-gcs-publisher","skip_cloning":true,"censor_secrets":true,"censoring_options":{"minimum_secret_length":6}}}'
~~       OPENSHIFT_CI: 'true'
~~       JOB_NAME_SAFE: fournos
~~       BUILD_ID: '2042165432474931200'
~~       PULL_PULL_SHA: 2f58395a8101a2d13b4794d96462faf37ed688f5
~~       PULL_NUMBER: '19'
~~       PULL_BASE_REF: main
~~       REPO_NAME: forge
~~       REPO_OWNER: openshift-psap
~~       PULL_BASE_SHA: b6ae08db216592eb5f72c896b7dbc486e845081f
~~       PULL_TITLE: '[fournos-launcher] Submit jobs to the psap-mgmt cluster'
~~       PULL_REFS: main:b6ae08db216592eb5f72c896b7dbc486e845081f,19:2f58395a8101a2d13b4794d96462faf37ed688f5
~~       PULL_HEAD_REF: launcher
~~     artifact_dir: /logs/artifacts/001__submit_and_wait
~~ CONTEXT:
~~     final_job_name: forge-llm-d-20260409-085952
~~     manifest_file: /logs/artifacts/001__submit_and_wait/src/forge-llm-d-20260409-085952-manifest.yaml
~~
~~ EXCEPTION: CalledProcessError
~~     Command failed with exit code 1: oc apply -f /logs/artifacts/001__submit_and_wait/src/forge-llm-d-20260409-085952-manifest.yaml
STDERR: The FournosJob "forge-llm-d-20260409-085952" is invalid: spec.forge.configOverrides: Invalid value: "string": spec.forge.configOverrides in body must be of type object: "string"
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


[...]

• Execution logs

@kpouget
kpouget force-pushed the launcher branch 2 times, most recently from 4ee1180 to 05d0825 Compare April 9, 2026 09:04
@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d hello world
/cluster cluster-1
/var something.is.wrong: false

@psap-forge-bot

psap-forge-bot Bot commented Apr 9, 2026

Copy link
Copy Markdown

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos llm_d hello world
/cluster cluster-1
/var something.is.wrong: false

• Failure indicator:

## /logs/artifacts/FAILURE 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~~ projects/fournos_launcher/toolbox/submit_and_wait/main.py:143
~~ TASK: wait_for_job_completion: Wait for FOURNOS job to complete
~~ ARTIFACT_DIR: /logs/artifacts/001__submit_and_wait
~~ LOG_FILE: /logs/artifacts/001__submit_and_wait/task.log
~~ ARGS:
~~     cluster_name: cluster-1
~~     project: llm_d
~~     args:
~~     - hello
~~     - world
~~     variables_overrides:
~~       something.is.wrong: 'false'
~~     job_name: ''
~~     namespace: psap-automation
~~     owner: FORGE/fournos-launcher
~~     display_name: Forge Job
~~     pipeline_name: forge-test-only
~~     env:
~~       JOB_TYPE: presubmit
~~       JOB_NAME: pull-ci-openshift-psap-forge-main-fournos
~~       JOB_SPEC: '{"type":"presubmit","job":"pull-ci-openshift-psap-forge-main-fournos","buildid":"2042166751805837312","prowjobid":"9ce6dcf6-bac3-4b7b-8e23-bfc7f4a0d51e","refs":{"org":"openshift-psap","repo":"forge","repo_link":"https://github.com/openshift-psap/forge","base_ref":"main","base_sha":"b6ae08db216592eb5f72c896b7dbc486e845081f","base_link":"https://github.com/openshift-psap/forge/commit/b6ae08db216592eb5f72c896b7dbc486e845081f","pulls":[{"number":19,"author":"kpouget","sha":"05d082583b60a0b1e6503d861fe6abfb5800c13a","title":"[fournos-launcher]
~~         Submit jobs to the psap-mgmt cluster","head_ref":"launcher","link":"https://github.com/openshift-psap/forge/pull/19","commit_link":"https://github.com/openshift-psap/forge/pull/19/commits/05d082583b60a0b1e6503d861fe6abfb5800c13a","author_link":"https://github.com/kpouget"}]},"decoration_config":{"timeout":"23h0m0s","grace_period":"15s","utility_images":{"clonerefs":"us-docker.pkg.dev/k8s-infra-prow/images/clonerefs:v20260408-3bbc91829","initupload":"us-docker.pkg.dev/k8s-infra-prow/images/initupload:v20260408-3bbc91829","entrypoint":"us-docker.pkg.dev/k8s-infra-prow/images/entrypoint:v20260408-3bbc91829","sidecar":"us-docker.pkg.dev/k8s-infra-prow/images/sidecar:v20260408-3bbc91829"},"resources":{"clonerefs":{"limits":{"memory":"3Gi"},"requests":{"cpu":"100m","memory":"500Mi"}},"initupload":{"limits":{"memory":"200Mi"},"requests":{"cpu":"100m","memory":"50Mi"}},"place_entrypoint":{"limits":{"memory":"100Mi"},"requests":{"cpu":"100m","memory":"25Mi"}},"sidecar":{"limits":{"memory":"2Gi"},"requests":{"cpu":"100m","memory":"250Mi"}}},"gcs_configuration":{"bucket":"test-platform-results","path_strategy":"single","default_org":"openshift","default_repo":"origin","mediaTypes":{"log":"text/plain"},"compress_file_types":["txt","log","json","tar","html","yaml"]},"gcs_credentials_secret":"gce-sa-credentials-gcs-publisher","skip_cloning":true,"censor_secrets":true,"censoring_options":{"minimum_secret_length":6}}}'
~~       OPENSHIFT_CI: 'true'
~~       JOB_NAME_SAFE: fournos
~~       BUILD_ID: '2042166751805837312'
~~       PULL_PULL_SHA: 05d082583b60a0b1e6503d861fe6abfb5800c13a
~~       PULL_NUMBER: '19'
~~       PULL_BASE_REF: main
~~       REPO_NAME: forge
~~       REPO_OWNER: openshift-psap
~~       PULL_BASE_SHA: b6ae08db216592eb5f72c896b7dbc486e845081f
~~       PULL_TITLE: '[fournos-launcher] Submit jobs to the psap-mgmt cluster'
~~       PULL_REFS: main:b6ae08db216592eb5f72c896b7dbc486e845081f,19:05d082583b60a0b1e6503d861fe6abfb5800c13a
~~       PULL_HEAD_REF: launcher
~~     artifact_dir: /logs/artifacts/001__submit_and_wait
~~ CONTEXT:
~~     final_job_name: forge-llm-d-20260409-090509
~~     manifest_file: /logs/artifacts/001__submit_and_wait/src/forge-llm-d-20260409-090509-manifest.yaml
~~
~~ EXCEPTION: RuntimeError
~~     Unknown job status: Admitted
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


[...]

• Execution logs

@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test jump-ci llm_d cks
/cluster cks
/only test
/var prepare.namespace.name: kpouget-dev

1 similar comment
@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test jump-ci llm_d cks
/cluster cks
/only test
/var prepare.namespace.name: kpouget-dev

@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: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@projects/fournos_launcher/toolbox/submit_and_wait/main.py`:
- Around line 104-107: The auto-generated name can lose the timestamp when
sanitize_k8s_name truncates a long raw_name; update the logic that builds
raw_name so it truncates args.project to reserve space for the "-{timestamp}"
suffix (and the "forge-" prefix) before calling sanitize_k8s_name, i.e., compute
a maxProjectLen = MAX_K8S_NAME_LEN - len("forge-") - len("-") - len(timestamp)
and use args.project[:maxProjectLen] when composing raw_name so
ctx.final_job_name = sanitize_k8s_name(raw_name) always preserves the timestamp.

In `@projects/jump_ci/toolbox/jump_ci_prepare_step/tasks/main.yml`:
- Around line 58-65: Create the missing directory before writing
variable_overrides.yaml: add an Ansible task that ensures the directory "{{
step_artifact_dir }}/artifacts/000__ci_metadata" exists (use
ansible.builtin.file or file with state: directory and proper mode/owner) and
place it before the here-doc that writes to "{{ step_artifact_dir
}}/artifacts/000__ci_metadata/variable_overrides.yaml"; this guarantees the path
for the subsequent ansible.posix.synchronize task copying to "{{
artifact_extra_logs_dir }}/000__ci_metadata/variable_overrides.yaml" will
succeed.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4d4955f4-47a1-4a9f-84f2-5a4c76eae290

📥 Commits

Reviewing files that changed from the base of the PR and between 2f956c5 and e8212a9.

📒 Files selected for processing (9)
  • projects/core/dsl/toolbox.py
  • projects/core/dsl/utils/__init__.py
  • projects/core/dsl/utils/k8s.py
  • projects/fournos_launcher/orchestration/config.yaml
  • projects/fournos_launcher/toolbox/submit_and_wait/main.py
  • projects/fournos_launcher/toolbox/submit_and_wait/templates/job.yaml.j2
  • projects/jump_ci/testing/test.py
  • projects/jump_ci/toolbox/jump_ci_prepare_step/tasks/main.yml
  • projects/legacy/library/config.py
✅ Files skipped from review due to trivial changes (1)
  • projects/core/dsl/utils/init.py
🚧 Files skipped from review as they are similar to previous changes (4)
  • projects/core/dsl/toolbox.py
  • projects/fournos_launcher/toolbox/submit_and_wait/templates/job.yaml.j2
  • projects/fournos_launcher/orchestration/config.yaml
  • projects/core/dsl/utils/k8s.py

Comment thread projects/fournos_launcher/toolbox/submit_and_wait/main.py
Comment thread projects/jump_ci/toolbox/jump_ci_prepare_step/tasks/main.yml Outdated
@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test jump-ci llm_d cks
/cluster cks
/only test
/var prepare.namespace.name: kpouget-dev

@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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@projects/jump_ci/toolbox/jump_ci_prepare_step/tasks/main.yml`:
- Around line 65-66: The synchronize task copies to "{{ artifact_extra_logs_dir
}}/000__ci_metadata/variable_overrides.yaml" but the parent directory
"000__ci_metadata" may not exist; add an ansible.builtin.file task before the
synchronize step to ensure the destination directory exists (create "{{
artifact_extra_logs_dir }}/000__ci_metadata" with state: directory,
recurse/owner/mode as appropriate) so the synchronize targeting
variable_overrides.yaml succeeds; reference the variables
artifact_extra_logs_dir and step_artifact_dir to locate where to insert the new
file task.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 578045c5-261b-44e5-a0a6-36531437b869

📥 Commits

Reviewing files that changed from the base of the PR and between e8212a9 and 20fde84.

📒 Files selected for processing (3)
  • projects/jump_ci/testing/test.py
  • projects/jump_ci/toolbox/jump_ci_prepare_step/tasks/main.yml
  • projects/legacy/library/config.py
✅ Files skipped from review due to trivial changes (1)
  • projects/legacy/library/config.py

Comment thread projects/jump_ci/toolbox/jump_ci_prepare_step/tasks/main.yml Outdated
@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test jump-ci llm_d cks
/cluster cks
/only test
/var prepare.namespace.name: kpouget-dev

@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test jump-ci llm_d cks
/cluster cks
/only test
/var prepare.namespace.name: kpouget-dev

@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test jump-ci llm_d cks
/cluster cks
/only test
/var prepare.namespace.name: kpouget-dev

@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test jump-ci llm_d cks
/cluster cks
/only test
/var prepare.namespace.name: kpouget-dev

@psap-forge-bot

psap-forge-bot Bot commented Apr 9, 2026

Copy link
Copy Markdown

• Link to the test results.

• No reports index generated...

Test configuration:

/test jump-ci llm_d cks
/cluster cks
/only test
/var prepare.namespace.name: kpouget-dev

• Execution logs

@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

/test fournos llm_d cks
/cluster cluster-1
/var prepare.namespace.name: kpouget-dev

@psap-forge-bot

psap-forge-bot Bot commented Apr 9, 2026

Copy link
Copy Markdown

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos llm_d cks
/cluster cluster-1
/var prepare.namespace.name: kpouget-dev

• Failure indicator:

## /logs/artifacts/FAILURE 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~~ projects/fournos_launcher/toolbox/submit_and_wait/main.py:152
~~ TASK: wait_for_job_completion: Wait for FOURNOS job to complete
~~ ARTIFACT_DIR: /logs/artifacts/001__submit_and_wait
~~ LOG_FILE: /logs/artifacts/001__submit_and_wait/task.log
~~ ARGS:
~~     cluster_name: cluster-1
~~     project: llm_d
~~     args:
~~     - cks
~~     variables_overrides:
~~       prepare.namespace.name: kpouget-dev
~~     job_name: ''
~~     namespace: psap-automation
~~     owner: FORGE/fournos-launcher
~~     display_name: Forge Job
~~     pipeline_name: forge-test-only
~~     env:
~~       JOB_TYPE: presubmit
~~       JOB_NAME: pull-ci-openshift-psap-forge-main-fournos
~~       JOB_SPEC: '{"type":"presubmit","job":"pull-ci-openshift-psap-forge-main-fournos","buildid":"2042264010262319104","prowjobid":"7982c9da-e30f-4166-8038-9fca4befe950","refs":{"org":"openshift-psap","repo":"forge","repo_link":"https://github.com/openshift-psap/forge","base_ref":"main","base_sha":"b6ae08db216592eb5f72c896b7dbc486e845081f","base_link":"https://github.com/openshift-psap/forge/commit/b6ae08db216592eb5f72c896b7dbc486e845081f","pulls":[{"number":19,"author":"kpouget","sha":"a433f84591d000bd10a4471dec6716edf4c0ce31","title":"[fournos-launcher]
~~         Submit jobs to the psap-mgmt cluster","head_ref":"launcher","link":"https://github.com/openshift-psap/forge/pull/19","commit_link":"https://github.com/openshift-psap/forge/pull/19/commits/a433f84591d000bd10a4471dec6716edf4c0ce31","author_link":"https://github.com/kpouget"}]},"decoration_config":{"timeout":"23h0m0s","grace_period":"15s","utility_images":{"clonerefs":"us-docker.pkg.dev/k8s-infra-prow/images/clonerefs:v20260408-3bbc91829","initupload":"us-docker.pkg.dev/k8s-infra-prow/images/initupload:v20260408-3bbc91829","entrypoint":"us-docker.pkg.dev/k8s-infra-prow/images/entrypoint:v20260408-3bbc91829","sidecar":"us-docker.pkg.dev/k8s-infra-prow/images/sidecar:v20260408-3bbc91829"},"resources":{"clonerefs":{"limits":{"memory":"3Gi"},"requests":{"cpu":"100m","memory":"500Mi"}},"initupload":{"limits":{"memory":"200Mi"},"requests":{"cpu":"100m","memory":"50Mi"}},"place_entrypoint":{"limits":{"memory":"100Mi"},"requests":{"cpu":"100m","memory":"25Mi"}},"sidecar":{"limits":{"memory":"2Gi"},"requests":{"cpu":"100m","memory":"250Mi"}}},"gcs_configuration":{"bucket":"test-platform-results","path_strategy":"single","default_org":"openshift","default_repo":"origin","mediaTypes":{"log":"text/plain"},"compress_file_types":["txt","log","json","tar","html","yaml"]},"gcs_credentials_secret":"gce-sa-credentials-gcs-publisher","skip_cloning":true,"censor_secrets":true,"censoring_options":{"minimum_secret_length":6}}}'
~~       OPENSHIFT_CI: 'true'
~~       JOB_NAME_SAFE: fournos
~~       BUILD_ID: '2042264010262319104'
~~       PULL_PULL_SHA: a433f84591d000bd10a4471dec6716edf4c0ce31
~~       PULL_NUMBER: '19'
~~       PULL_BASE_REF: main
~~       REPO_NAME: forge
~~       REPO_OWNER: openshift-psap
~~       PULL_BASE_SHA: b6ae08db216592eb5f72c896b7dbc486e845081f
~~       PULL_TITLE: '[fournos-launcher] Submit jobs to the psap-mgmt cluster'
~~       PULL_REFS: main:b6ae08db216592eb5f72c896b7dbc486e845081f,19:a433f84591d000bd10a4471dec6716edf4c0ce31
~~       PULL_HEAD_REF: launcher
~~     artifact_dir: /logs/artifacts/001__submit_and_wait
~~ CONTEXT:
~~     final_job_name: forge-llm-d-20260409-153119
~~     manifest_file: /logs/artifacts/001__submit_and_wait/src/forge-llm-d-20260409-153119-manifest.yaml
~~
~~ EXCEPTION: RuntimeError
~~     Job forge-llm-d-20260409-153119 failed: Tasks Completed: 1 (Failed: 1, Cancelled 0), Skipped: 0
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


[...]

• Execution logs

@openshift-psap openshift-psap deleted a comment from psap-forge-bot Bot Apr 9, 2026
@openshift-psap openshift-psap deleted a comment from openshift-ci Bot Apr 9, 2026
@kpouget

kpouget commented Apr 9, 2026

Copy link
Copy Markdown
Contributor Author

ok, good enough, I merge this 👍🏻

@kpouget
kpouget merged commit ec30b74 into openshift-psap:main Apr 9, 2026
4 of 6 checks passed
@kpouget
kpouget deleted the launcher branch April 9, 2026 15:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant