Skip to content

[Skeleton] Rework to be more exhaustive#26

Merged
kpouget merged 7 commits intoopenshift-psap:mainfrom
kpouget:skeleton
Apr 14, 2026
Merged

[Skeleton] Rework to be more exhaustive#26
kpouget merged 7 commits intoopenshift-psap:mainfrom
kpouget:skeleton

Conversation

@kpouget
Copy link
Copy Markdown
Contributor

@kpouget kpouget commented Apr 14, 2026

Summary by CodeRabbit

  • New Features

    • New CLI with preset-driven configuration and three phases: prepare, test, cleanup (repeatable --presets).
    • Added cluster-info toolbox that collects node info and writes artifacts.
    • New presets (including deep-testing) to enable advanced runtime profiles.
    • Vault init supports optional flexible (non-strict) validation.
  • Bug Fixes / Behavior

    • Configuration updates now replace existing artifact config files during copy.
  • Documentation

    • Expanded README with examples, presets, and CLI/orchestration guidance.
  • Chores

    • Minor module docstring updates.

@openshift-ci
Copy link
Copy Markdown

openshift-ci bot commented Apr 14, 2026

[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 avasilevskii 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
Copy link
Copy Markdown

coderabbitai bot commented Apr 14, 2026

📝 Walkthrough

Walkthrough

execute_tasks() now returns the shared context with artifact_dir set; config reload now unlinks and recopies artifact config; vault init gains a strict validation flag; a new skeleton project is added with CLI, presets, orchestration, and a cluster-info toolbox integrating vault and oc calls.

Changes

Cohort / File(s) Summary
Core DSL Runtime
projects/core/dsl/runtime.py
execute_tasks() now returns the shared_context on success and sets shared_context.__dict__['artifact_dir'] = args.artifact_dir before cleanup.
Core Library - Config
projects/core/library/config.py
__get_config_path() no longer early-returns when artifact config exists; it unlinks the existing ARTIFACT_DIR/config.yaml and copies the source config file over it.
Core Library - Vault
projects/core/library/vault.py
Added strict: bool = True parameter to _filter_and_validate_vaults(...) and init(...); validation now returns True on success and either raises or logs+returns False when validation fails depending on strict.
CLI Safety Decorators
projects/core/library/ci.py, projects/core/library/cli.py
Both modules now use functools.wraps() for their wrapper decorators instead of manually assigning metadata; behavior unchanged otherwise.
LLM-D Docstring
projects/llm_d/orchestration/cli.py
Module docstring updated from "LLM-D Project CI Operations" to "LLM-D Project CLI Operations."
Skeleton — Orchestration & CLI
projects/skeleton/orchestration/cli.py, projects/skeleton/orchestration/config.yaml, projects/skeleton/orchestration/prepare_skeleton.py, projects/skeleton/orchestration/test_skeleton.py
New Click CLI with --presets and prepare/test/cleanup subcommands; test_skeleton.init() gains strict_vault_validation and initializes vaults; test() implements vault retrieval, config inspection, optional early exit, and invokes the cluster_info toolbox; prepare/cleanup log and handle errors.
Skeleton — Presets
projects/skeleton/orchestration/presets.d/presets.yaml, projects/skeleton/orchestration/presets.d/deep_testing.yaml
Added two presets: one generic multiple-use preset enabling cluster info and extra properties, and a deep_testing preset with expanded property ranges.
Skeleton — Toolbox
projects/skeleton/toolbox/cluster_info/main.py
New toolbox run(output_format) that builds a task pipeline (format normalization, artifacts dir creation, oc whoami and oc get nodes) and returns results; module exposes main via toolbox.create_toolbox_main(run).
Skeleton Docs
projects/skeleton/README.md
Large documentation expansion: setup, presets, CLI examples, toolbox usage, quick-start, and CI/dev guidance.

Sequence Diagrams

sequenceDiagram
    participant User
    participant CLI as Skeleton CLI
    participant Config as Config System
    participant Vault as Vault System
    participant Presets as Preset Engine

    User->>CLI: run ./cli.py test --presets=deep_testing
    CLI->>Config: init(config, vault validation=false)
    CLI->>Presets: apply preset "deep_testing"
    Presets->>Config: merge preset into project config
    CLI->>Vault: vault.init(vaults, strict=False)
    CLI->>Config: config.get_config("skeleton")
    CLI->>Vault: vault.get_vault_content_path(...)
    Vault-->>CLI: file path or None
    CLI->>User: logs, then invokes cluster_info toolbox if enabled
Loading
sequenceDiagram
    participant Test as test_skeleton.test()
    participant Toolbox as cluster_info.run()
    participant Shell as oc shell

    Test->>Toolbox: cluster_info(output_format="text")
    Toolbox->>Shell: oc whoami -> write current_user.txt
    Shell-->>Toolbox: stdout
    Toolbox->>Shell: oc get nodes --output text -> write cluster_nodes.txt
    Shell-->>Toolbox: stdout
    Toolbox-->>Test: result with cluster_nodes_dest
    Test->>Test: evaluate result -> return exit code
Loading

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly Related PRs

  • PR #17: Modifies projects/core/dsl/runtime.py::execute_tasks() with related return/cleanup/logging changes.
  • PR #18: Introduces shared task-context plumbing in runtime that aligns with this PR's use of returning/mutating shared_context.
  • PR #6: Related changes to projects/core/library/config.py::__get_config_path() behavior and config file handling.

Poem

🐰 I hopped through tasks and set the art'fact trail,
Vaults checked their secrets with a gentle tail,
Presets twirled in YAML light,
CLI called tools that ran through night,
Now context returns — a rabbit's happy tale! 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 65.38% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title '[Skeleton] Rework to be more exhaustive' accurately describes the main change—a comprehensive rework of the skeleton project to include CLI tooling, orchestration, presets, and expanded documentation.

✏️ 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.

@kpouget
Copy link
Copy Markdown
Contributor Author

kpouget commented Apr 14, 2026

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster cluster-1
/var skeleton.namespace: kpouget-dev

@topsail-bot
Copy link
Copy Markdown

topsail-bot bot commented Apr 14, 2026

🔴 Test of 'fournos_launcher submit' failed after 00 hours 00 minutes 28 seconds 🔴

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster cluster-1
/var skeleton.namespace: kpouget-dev

Failure indicator:

## /logs/artifacts/FAILURE 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~~ projects/fournos_launcher/toolbox/submit_and_wait/main.py:161
~~ 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: skeleton
~~     args:
~~     - collect_cluster_info
~~     - deep_testing
~~     - side_testing
~~     variables_overrides:
~~       skeleton.namespace: 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":"2044069054192291840","prowjobid":"8f750176-305f-400a-9aab-5f47f329b8b4","refs":{"org":"openshift-psap","repo":"forge","repo_link":"https://github.com/openshift-psap/forge","base_ref":"main","base_sha":"5bbc721fcf7988fd2c7494e2fee0f37d812d39c5","base_link":"https://github.com/openshift-psap/forge/commit/5bbc721fcf7988fd2c7494e2fee0f37d812d39c5","pulls":[{"number":26,"author":"kpouget","sha":"4f7ea474ddb02ae4f8b8e271069dcb341a4587ae","title":"[Skeleton]
~~         Rework to be more exhaustive","head_ref":"skeleton","link":"https://github.com/openshift-psap/forge/pull/26","commit_link":"https://github.com/openshift-psap/forge/pull/26/commits/4f7ea474ddb02ae4f8b8e271069dcb341a4587ae","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: '2044069054192291840'
~~       PULL_PULL_SHA: 4f7ea474ddb02ae4f8b8e271069dcb341a4587ae
~~       PULL_NUMBER: '26'
~~       PULL_BASE_REF: main
~~       REPO_NAME: forge
~~       REPO_OWNER: openshift-psap
~~       PULL_BASE_SHA: 5bbc721fcf7988fd2c7494e2fee0f37d812d39c5
~~       PULL_TITLE: '[Skeleton] Rework to be more exhaustive'
~~       PULL_REFS: main:5bbc721fcf7988fd2c7494e2fee0f37d812d39c5,26:4f7ea474ddb02ae4f8b8e271069dcb341a4587ae
~~       PULL_HEAD_REF: skeleton
~~     status_dest: /logs/artifacts
~~     artifact_dir: /logs/artifacts/001__submit_and_wait
~~ CONTEXT:
~~     final_job_name: forge-skeleton-20260414-150357
~~     manifest_file: /logs/artifacts/001__submit_and_wait/src/forge-skeleton-20260414-150357-manifest.yaml
~~
~~ EXCEPTION: RuntimeError
~~     Job forge-skeleton-20260414-150357 failed: Tasks Completed: 1 (Failed: 1, Cancelled 0), Skipped: 0
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


[...]

Execution logs

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 6

Caution

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

⚠️ Outside diff range comments (1)
projects/core/library/vault.py (1)

370-391: ⚠️ Potential issue | 🟠 Major

Unhandled breaking change for projects/fournos_launcher/orchestration/submit.py.

The strict=True default will cause vault.init(config.project.get_config("vaults")) in submit.py to perform strict validation, raising RuntimeError on validation failures. This differs from the previous behavior. Meanwhile, projects/skeleton/orchestration/test_skeleton.py explicitly passes the strict parameter, indicating the maintainers are aware of controlling this behavior.

Either update submit.py to explicitly pass strict=False if non-strict validation is required, or ensure the vaults configuration will pass strict validation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/core/library/vault.py` around lines 370 - 391, The init signature
defaulting strict=True changes behavior causing RuntimeError when existing
callers relied on non-strict validation; update the caller that invokes
vault.init(config.project.get_config("vaults")) to explicitly pass strict=False
(i.e., call init(..., strict=False)) so it preserves previous non-strict
behavior, or alternatively change the init default back to strict=False; locate
the Vault init function and its use sites (references to init and
_filter_and_validate_vaults / VaultManager) and apply the explicit strict=False
at the submit call if you want minimal, localized change.
🧹 Nitpick comments (7)
projects/llm_d/orchestration/cli.py (1)

3-3: Align CLI wording across docstrings for consistency.

Line 3 says “CLI Operations,” but Line 20 still says “CI Operations.” If this rename is intentional, update the main() docstring too so click --help text stays consistent.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/llm_d/orchestration/cli.py` at line 3, Docstring wording is
inconsistent: the module header reads "CLI Operations" but the main() docstring
still says "CI Operations", causing misleading help text; update the main()
function's docstring (the docstring inside function main) to use "CLI
Operations" (or the intended term) so click --help and other introspection show
consistent wording across the module.
projects/skeleton/orchestration/prepare_skeleton.py (3)

2-2: Remove unused import.

The os module is imported but not used anywhere in this file.

♻️ Proposed fix
 import logging
-import os
 import pathlib
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/orchestration/prepare_skeleton.py` at line 2, Remove the
unused top-level import of the os module by deleting the "import os" statement
(the unused symbol is the os import) from prepare_skeleton.py so there are no
unused imports left in that module.

12-13: Redundant Path() wrapper and inconsistent logger usage.

  1. config.project.config_path is already a Path object (see Config.__init__), so the pathlib.Path() wrapper is unnecessary.
  2. Line 13 uses logging.info() but the module defines logger at line 6.
♻️ Proposed fix
-        config_file_content = pathlib.Path(config.project.config_path).read_text()
-        logging.info(f"Configuration file: {config_file_content}")
+        config_file_content = config.project.config_path.read_text()
+        logger.info(f"Configuration file: {config_file_content}")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/orchestration/prepare_skeleton.py` around lines 12 - 13,
The code unnecessarily wraps an existing Path in pathlib.Path and uses the wrong
logger; replace the Path wrapping by calling read_text() directly on
config.project.config_path (e.g. set config_file_content =
config.project.config_path.read_text()) and change the logging call to use the
module-level logger (logger.info(...)) so the message is emitted through the
configured logger; update the reference to the config_file_content variable
accordingly.

26-31: Unnecessary exception handling in cleanup().

The try block contains only logger.info() calls, which won't raise exceptions. The exception handler is unreachable dead code. Either remove the try/except structure or add actual cleanup logic that could fail.

♻️ Proposed fix (if no real cleanup needed)
 def cleanup():
     logger.info("=== Skeleton Project Cleanup Phase ===")
     logger.info("Demonstrating basic cleanup operations")
-
-    try:
-        logger.info("✅ Cleanup phase completed successfully")
-        return 0
-    except Exception as e:
-        logger.error(f"❌ Error during cleanup phase: {e}")
-        return 1
+    logger.info("✅ Cleanup phase completed successfully")
+    return 0
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/orchestration/prepare_skeleton.py` around lines 26 - 31,
The try/except around the final logger.info in the cleanup() code is dead —
remove the unnecessary try/except block and simply call logger.info("✅ Cleanup
phase completed successfully") followed by return 0, and delete the
corresponding except that logs via logger.error; alternatively, if there is
actual cleanup work to perform, move those operations into the cleanup()
function before the logger.info and keep the try/except around the real cleanup
steps so that logger.error(...) (and return 1) only run on genuine errors.
projects/skeleton/orchestration/cli.py (1)

23-24: Unused context object setup.

ctx.ensure_object(types.SimpleNamespace) creates a context object, but ctx.obj is never accessed in any subcommand. Either remove this line and the types import, or document the intended use.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/orchestration/cli.py` around lines 23 - 24, Remove the
unused click context object setup: delete the call to
ctx.ensure_object(types.SimpleNamespace) and the unused types import (or
alternatively add documentation and actual usage where ctx.obj is read),
ensuring no subcommand references ctx.obj; confirm that
test_skeleton.init(strict_vault_validation=False) remains unchanged and that no
runtime behavior depends on the removed context object.
projects/core/library/vault.py (2)

370-370: Use explicit Optional type hint.

Per PEP 484, using None as default value requires an explicit Optional type. Static analysis flagged this as RUF013.

♻️ Proposed fix
-def init(vaults: List[str] = None, strict: bool = True):
+def init(vaults: Optional[List[str]] = None, strict: bool = True):
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/core/library/vault.py` at line 370, The function signature for init
currently uses a None default without an Optional type; update the signature of
init(vaults: List[str] = None, strict: bool = True) to use Optional[List[str]]
for the vaults parameter (e.g., init(vaults: Optional[List[str]] = None, strict:
bool = True)) and add the necessary Optional import from typing at the top of
the module so static analysis no longer flags RUF013; keep the existing behavior
of init and the strict parameter unchanged.

324-324: Docstring is misleading.

The docstring says "Don't raise exception if the vault validation fails" but when strict=True (the default), it does raise. Consider rewording to clarify the behavior:

-        strict: Don't raise exception if the vault validation fails
+        strict: If True, raise RuntimeError when validation fails; if False, log warning and return False
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/core/library/vault.py` at line 324, The function/method docstring
for the routine that accepts the strict parameter is misleading: update the
docstring for the method that defines strict (the function/method with parameter
named strict) to accurately state that strict=True (the default) will raise an
exception on vault validation failure, while strict=False will suppress the
exception and return a failure indicator (or False); mention the default value
and the exact behavior for both True and False so callers aren’t confused.
🤖 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/library/vault.py`:
- Line 360: The call uses the root logging API (logging.warning(msg)) instead of
the module-level logger instance; replace that call with the module logger
(logger.warning(msg)) so it is consistent with the rest of the module (the
logger variable defined as logger); ensure any message formatting stays the same
and no other calls in the file switch to the root logger.

In `@projects/skeleton/orchestration/cli.py`:
- Around line 39-45: The safe_cli_command decorator in
projects/core/library/cli.py currently manually assigns attributes and breaks
signature preservation needed by Click (e.g., for `@click.pass_context` used on
functions like prepare); update safe_cli_command to import functools and wrap
the inner wrapper with `@functools.wraps`(command_func) (preserving the existing
wrapper implementation and behavior) so inspect.signature() sees the original
function signature; do not change decorator order (keep `@click.pass_context`
closest to the target function).

In `@projects/skeleton/orchestration/test_skeleton.py`:
- Line 53: The user-facing warning string is a typo: update the logger.warning
call in test_skeleton.py (the logger.warning(...) invocation) to a clear,
grammatically correct message such as "⚠️ Gathering cluster information to
generate the cluster node file" so logs are readable and not confusing.
- Around line 45-49: The call to cluster_info() inside test() can raise
exceptions before the falsy check, so wrap the
cluster_info(output_format="text") invocation in a try/except that catches
Exception, logs the exception (including the exception object/traceback) and
returns 1; keep the existing falsy check and logger.warning path, and ensure
test() always returns an int exit code (return 1 on exception or falsy result,
return 0 on success).

In `@projects/skeleton/README.md`:
- Around line 35-49: Add a language tag (e.g., text) to the two fenced code
blocks in the README: the directory tree block (the block containing "skeleton/
├── orchestration/ ... toolbox/") and the artifacts block (the block starting
with "$ARTIFACT_DIR/artifacts/"). Edit the opening triple-backtick of each block
to include the language identifier so they read ```text rather than ```, leaving
the content inside unchanged; this will satisfy markdownlint MD040 and improve
rendering consistency.

In `@projects/skeleton/toolbox/cluster_info/main.py`:
- Around line 45-49: The setup_directories function currently creates a relative
"artifacts" folder in the CWD; change it to create the artifacts directory under
args.artifact_dir (i.e., args.artifact_dir / "artifacts") so it matches
subsequent writes; ensure you build the full path from args.artifact_dir, call
mkdir with parents=True/ exist_ok=True (or the equivalent shell.mkdir on that
absolute/joined path), and update the return message if desired so it reflects
the actual created path; locate this change in setup_directories and reference
args.artifact_dir and "artifacts".

---

Outside diff comments:
In `@projects/core/library/vault.py`:
- Around line 370-391: The init signature defaulting strict=True changes
behavior causing RuntimeError when existing callers relied on non-strict
validation; update the caller that invokes
vault.init(config.project.get_config("vaults")) to explicitly pass strict=False
(i.e., call init(..., strict=False)) so it preserves previous non-strict
behavior, or alternatively change the init default back to strict=False; locate
the Vault init function and its use sites (references to init and
_filter_and_validate_vaults / VaultManager) and apply the explicit strict=False
at the submit call if you want minimal, localized change.

---

Nitpick comments:
In `@projects/core/library/vault.py`:
- Line 370: The function signature for init currently uses a None default
without an Optional type; update the signature of init(vaults: List[str] = None,
strict: bool = True) to use Optional[List[str]] for the vaults parameter (e.g.,
init(vaults: Optional[List[str]] = None, strict: bool = True)) and add the
necessary Optional import from typing at the top of the module so static
analysis no longer flags RUF013; keep the existing behavior of init and the
strict parameter unchanged.
- Line 324: The function/method docstring for the routine that accepts the
strict parameter is misleading: update the docstring for the method that defines
strict (the function/method with parameter named strict) to accurately state
that strict=True (the default) will raise an exception on vault validation
failure, while strict=False will suppress the exception and return a failure
indicator (or False); mention the default value and the exact behavior for both
True and False so callers aren’t confused.

In `@projects/llm_d/orchestration/cli.py`:
- Line 3: Docstring wording is inconsistent: the module header reads "CLI
Operations" but the main() docstring still says "CI Operations", causing
misleading help text; update the main() function's docstring (the docstring
inside function main) to use "CLI Operations" (or the intended term) so click
--help and other introspection show consistent wording across the module.

In `@projects/skeleton/orchestration/cli.py`:
- Around line 23-24: Remove the unused click context object setup: delete the
call to ctx.ensure_object(types.SimpleNamespace) and the unused types import (or
alternatively add documentation and actual usage where ctx.obj is read),
ensuring no subcommand references ctx.obj; confirm that
test_skeleton.init(strict_vault_validation=False) remains unchanged and that no
runtime behavior depends on the removed context object.

In `@projects/skeleton/orchestration/prepare_skeleton.py`:
- Line 2: Remove the unused top-level import of the os module by deleting the
"import os" statement (the unused symbol is the os import) from
prepare_skeleton.py so there are no unused imports left in that module.
- Around line 12-13: The code unnecessarily wraps an existing Path in
pathlib.Path and uses the wrong logger; replace the Path wrapping by calling
read_text() directly on config.project.config_path (e.g. set config_file_content
= config.project.config_path.read_text()) and change the logging call to use the
module-level logger (logger.info(...)) so the message is emitted through the
configured logger; update the reference to the config_file_content variable
accordingly.
- Around line 26-31: The try/except around the final logger.info in the
cleanup() code is dead — remove the unnecessary try/except block and simply call
logger.info("✅ Cleanup phase completed successfully") followed by return 0, and
delete the corresponding except that logs via logger.error; alternatively, if
there is actual cleanup work to perform, move those operations into the
cleanup() function before the logger.info and keep the try/except around the
real cleanup steps so that logger.error(...) (and return 1) only run on genuine
errors.
🪄 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: 0a57be2c-175e-40a0-8ebe-d6564ccfb46d

📥 Commits

Reviewing files that changed from the base of the PR and between 5bbc721 and 4f7ea47.

📒 Files selected for processing (12)
  • projects/core/dsl/runtime.py
  • projects/core/library/config.py
  • projects/core/library/vault.py
  • projects/llm_d/orchestration/cli.py
  • projects/skeleton/README.md
  • projects/skeleton/orchestration/cli.py
  • projects/skeleton/orchestration/config.yaml
  • projects/skeleton/orchestration/prepare_skeleton.py
  • projects/skeleton/orchestration/presets.d/deep_testing.yaml
  • projects/skeleton/orchestration/presets.d/presets.yaml
  • projects/skeleton/orchestration/test_skeleton.py
  • projects/skeleton/toolbox/cluster_info/main.py

Comment thread projects/core/library/vault.py Outdated
Comment thread projects/skeleton/orchestration/cli.py
Comment thread projects/skeleton/orchestration/test_skeleton.py
Comment thread projects/skeleton/orchestration/test_skeleton.py Outdated
Comment thread projects/skeleton/README.md
Comment thread projects/skeleton/toolbox/cluster_info/main.py
@kpouget
Copy link
Copy Markdown
Contributor Author

kpouget commented Apr 14, 2026

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster cluster-1
/var skeleton.namespace: kpouget-dev

@topsail-bot
Copy link
Copy Markdown

topsail-bot bot commented Apr 14, 2026

🔴 Test of 'fournos_launcher submit' failed after 00 hours 00 minutes 38 seconds 🔴

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster cluster-1
/var skeleton.namespace: kpouget-dev

Failure indicator:

## /logs/artifacts/FAILURE 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~~ projects/fournos_launcher/toolbox/submit_and_wait/main.py:161
~~ 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: skeleton
~~     args:
~~     - collect_cluster_info
~~     - deep_testing
~~     - side_testing
~~     variables_overrides:
~~       skeleton.namespace: 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":"2044085611551264768","prowjobid":"93bc3353-b596-47db-aa31-3215606722bf","refs":{"org":"openshift-psap","repo":"forge","repo_link":"https://github.com/openshift-psap/forge","base_ref":"main","base_sha":"5bbc721fcf7988fd2c7494e2fee0f37d812d39c5","base_link":"https://github.com/openshift-psap/forge/commit/5bbc721fcf7988fd2c7494e2fee0f37d812d39c5","pulls":[{"number":26,"author":"kpouget","sha":"54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6","title":"[Skeleton]
~~         Rework to be more exhaustive","head_ref":"skeleton","link":"https://github.com/openshift-psap/forge/pull/26","commit_link":"https://github.com/openshift-psap/forge/pull/26/commits/54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6","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: '2044085611551264768'
~~       PULL_PULL_SHA: 54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6
~~       PULL_NUMBER: '26'
~~       PULL_BASE_REF: main
~~       REPO_NAME: forge
~~       REPO_OWNER: openshift-psap
~~       PULL_BASE_SHA: 5bbc721fcf7988fd2c7494e2fee0f37d812d39c5
~~       PULL_TITLE: '[Skeleton] Rework to be more exhaustive'
~~       PULL_REFS: main:5bbc721fcf7988fd2c7494e2fee0f37d812d39c5,26:54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6
~~       PULL_HEAD_REF: skeleton
~~     status_dest: /logs/artifacts
~~     artifact_dir: /logs/artifacts/001__submit_and_wait
~~ CONTEXT:
~~     final_job_name: forge-skeleton-20260414-161001
~~     manifest_file: /logs/artifacts/001__submit_and_wait/src/forge-skeleton-20260414-161001-manifest.yaml
~~
~~ EXCEPTION: RuntimeError
~~     Job forge-skeleton-20260414-161001 failed: Tasks Completed: 1 (Failed: 1, Cancelled 0), Skipped: 0
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


[...]

Execution logs

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (6)
projects/skeleton/orchestration/test_skeleton.py (2)

45-49: Consider wrapping cluster_info() in try/except for consistent exit code handling.

If cluster_info() raises an exception (e.g., toolbox execution failure, subprocess error), the function will propagate the exception rather than returning the expected exit code 1. This could affect CI pipeline behavior.

♻️ Proposed fix
     # Demonstrate calling a toolbox from orchestration
     logger.info("Running cluster information toolbox...")
 
-    result = cluster_info(output_format="text")
-
-    if not result:
+    try:
+        result = cluster_info(output_format="text")
+    except Exception as exc:
+        logger.warning(f"⚠️ Cluster information gathering failed: {exc}")
+        return 1
+
+    if not result:
         logger.warning("⚠️ Cluster information gathering didn't work")
         return 1
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/orchestration/test_skeleton.py` around lines 45 - 49, Wrap
the call to cluster_info(output_format="text") in a try/except block so
exceptions are converted into the same exit code path: call cluster_info inside
try, assign to result, and in except Exception as e use logger.warning (or
logger.exception) to include the exception details and then return 1; keep the
existing post-call check of result to return 1 on falsy results so both error
cases produce the same exit code behavior.

25-30: del client_id has no effect.

client_id is a Path object returned from vault.get_vault_content_path(). Using del only removes the local variable binding—it doesn't delete the underlying file or have any side effect. If the intent is to clear the reference for GC, it's unnecessary in this scope since the function continues shortly after.

♻️ Proposed fix - remove the no-op del statement
     else:
         logger.warning(f"`client_id` secret available. Size: {client_id.stat().st_size}b")
-        del client_id
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/orchestration/test_skeleton.py` around lines 25 - 30, The
`del client_id` at the end of the block is a no-op for file removal and only
removes the local binding; remove this statement to avoid misleading intent.
Update the code that calls `vault.get_vault_content_path(...)` (the `client_id`
variable) by deleting the `del client_id` line and leave the existing logger
handling (`logger.warning(...)`, `client_id.stat().st_size`) unchanged.
projects/skeleton/orchestration/prepare_skeleton.py (3)

2-4: Remove unused imports.

os, env, and run are imported but never used in this module.

♻️ Proposed fix
 import logging
-import os
 import pathlib
-from projects.core.library import env, run, config
+from projects.core.library import config
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/orchestration/prepare_skeleton.py` around lines 2 - 4,
Remove unused imports in prepare_skeleton.py: delete the top-level import of os
and the unused names env and run from the from-projects.core.library import,
leaving only pathlib and the used config import; update the import line to only
bring in pathlib and config (and remove any now-empty import statements) and
then run lint/tests to verify there are no remaining unused-import warnings.

22-31: Unreachable exception handler in cleanup().

The try block only contains logger.info() calls, which won't raise exceptions under normal conditions. This makes the except block dead code.

♻️ Proposed fix - simplify by removing unnecessary try/except
 def cleanup():
     logger.info("=== Skeleton Project Cleanup Phase ===")
     logger.info("Demonstrating basic cleanup operations")
-
-    try:
-        logger.info("✅ Cleanup phase completed successfully")
-        return 0
-    except Exception as e:
-        logger.error(f"❌ Error during cleanup phase: {e}")
-        return 1
+    logger.info("✅ Cleanup phase completed successfully")
+    return 0
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/orchestration/prepare_skeleton.py` around lines 22 - 31,
The try/except in cleanup() is redundant because the try only wraps logger.info
calls; remove the try/except and simplify the function to log the start and
completion messages and return 0 on success, keeping the existing
logger.info("=== Skeleton Project Cleanup Phase ==="),
logger.info("Demonstrating basic cleanup operations"), and logger.info("✅
Cleanup phase completed successfully") calls and delete the logger.error branch
(or keep an outer-level exception only if you later add operations that can
fail).

11-16: config.project.config_path is already a Path object.

Based on the Config class constructor in projects/core/library/config.py (lines 45-63), config_path is stored as a pathlib.Path. Wrapping it again with pathlib.Path() is redundant.

♻️ Proposed fix
     try:
-        config_file_content = pathlib.Path(config.project.config_path).read_text()
+        config_file_content = config.project.config_path.read_text()
         logging.info(f"Configuration file: {config_file_content}")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/orchestration/prepare_skeleton.py` around lines 11 - 16,
The code redundantly wraps an already-pathlib.Path attribute; in
prepare_skeleton.py replace the
pathlib.Path(config.project.config_path).read_text() call with a direct call on
the Path object (use config.project.config_path.read_text()) so
config_file_content is read from the existing Path without re-wrapping; update
the log that uses config_file_content and keep the surrounding logger.info("✅
Prepare phase completed successfully") and return 0 as-is.
projects/core/library/vault.py (1)

370-370: Use explicit Optional for nullable parameter type hint.

Per PEP 484, implicit Optional via = None default is prohibited. The static analysis tool correctly flags this.

♻️ Proposed fix
-def init(vaults: List[str] = None, strict: bool = True):
+def init(vaults: Optional[List[str]] = None, strict: bool = True):
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/core/library/vault.py` at line 370, The signature for init currently
uses a nullable default without an explicit Optional: change the parameter type
hint for vaults in the init function from List[str] = None to
Optional[List[str]] = None and add the corresponding typing import (from typing
import Optional) so static checkers accept the nullable parameter; ensure no
other references rely on the old annotation name change.
🤖 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/skeleton/README.md`:
- Around line 242-244: Remove the orphaned command and stray closing fence
introduced after the sentence about FORGE — specifically delete the bare "
./run_ci skeleton ci --help" line and the unmatched "```" so the README resumes
properly (ensure the "Creating Your Own Project" heading and subsequent fenced
code blocks remain intact); locate the text near the "Creating Your Own Project"
section and the sentence mentioning FORGE to find and remove these orphaned
lines.

---

Nitpick comments:
In `@projects/core/library/vault.py`:
- Line 370: The signature for init currently uses a nullable default without an
explicit Optional: change the parameter type hint for vaults in the init
function from List[str] = None to Optional[List[str]] = None and add the
corresponding typing import (from typing import Optional) so static checkers
accept the nullable parameter; ensure no other references rely on the old
annotation name change.

In `@projects/skeleton/orchestration/prepare_skeleton.py`:
- Around line 2-4: Remove unused imports in prepare_skeleton.py: delete the
top-level import of os and the unused names env and run from the
from-projects.core.library import, leaving only pathlib and the used config
import; update the import line to only bring in pathlib and config (and remove
any now-empty import statements) and then run lint/tests to verify there are no
remaining unused-import warnings.
- Around line 22-31: The try/except in cleanup() is redundant because the try
only wraps logger.info calls; remove the try/except and simplify the function to
log the start and completion messages and return 0 on success, keeping the
existing logger.info("=== Skeleton Project Cleanup Phase ==="),
logger.info("Demonstrating basic cleanup operations"), and logger.info("✅
Cleanup phase completed successfully") calls and delete the logger.error branch
(or keep an outer-level exception only if you later add operations that can
fail).
- Around line 11-16: The code redundantly wraps an already-pathlib.Path
attribute; in prepare_skeleton.py replace the
pathlib.Path(config.project.config_path).read_text() call with a direct call on
the Path object (use config.project.config_path.read_text()) so
config_file_content is read from the existing Path without re-wrapping; update
the log that uses config_file_content and keep the surrounding logger.info("✅
Prepare phase completed successfully") and return 0 as-is.

In `@projects/skeleton/orchestration/test_skeleton.py`:
- Around line 45-49: Wrap the call to cluster_info(output_format="text") in a
try/except block so exceptions are converted into the same exit code path: call
cluster_info inside try, assign to result, and in except Exception as e use
logger.warning (or logger.exception) to include the exception details and then
return 1; keep the existing post-call check of result to return 1 on falsy
results so both error cases produce the same exit code behavior.
- Around line 25-30: The `del client_id` at the end of the block is a no-op for
file removal and only removes the local binding; remove this statement to avoid
misleading intent. Update the code that calls
`vault.get_vault_content_path(...)` (the `client_id` variable) by deleting the
`del client_id` line and leave the existing logger handling
(`logger.warning(...)`, `client_id.stat().st_size`) unchanged.
🪄 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: 9e1711e8-33b3-4028-9488-425aed610b8e

📥 Commits

Reviewing files that changed from the base of the PR and between 4f7ea47 and 54b8ecf.

📒 Files selected for processing (14)
  • projects/core/library/ci.py
  • projects/core/library/cli.py
  • projects/core/library/config.py
  • projects/core/library/vault.py
  • projects/llm_d/orchestration/cli.py
  • projects/skeleton/README.md
  • projects/skeleton/orchestration/ci.py
  • projects/skeleton/orchestration/cli.py
  • projects/skeleton/orchestration/config.yaml
  • projects/skeleton/orchestration/prepare_skeleton.py
  • projects/skeleton/orchestration/presets.d/deep_testing.yaml
  • projects/skeleton/orchestration/presets.d/presets.yaml
  • projects/skeleton/orchestration/test_skeleton.py
  • projects/skeleton/toolbox/cluster_info/main.py
✅ Files skipped from review due to trivial changes (6)
  • projects/core/library/config.py
  • projects/llm_d/orchestration/cli.py
  • projects/skeleton/orchestration/config.yaml
  • projects/skeleton/orchestration/presets.d/presets.yaml
  • projects/skeleton/orchestration/presets.d/deep_testing.yaml
  • projects/skeleton/orchestration/cli.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • projects/skeleton/toolbox/cluster_info/main.py

Comment on lines +242 to 244
This project demonstrates that FORGE provides a **complete, production-ready framework** for building observable, configurable, and maintainable test harnesses.
./run_ci skeleton ci --help
```
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

Malformed content: orphaned text and closing fence.

Line 242 appears to be a trailing sentence from the new content, followed by a bare command (line 243) and an orphaned closing fence (line 244). This looks like a merge/editing artifact that should be cleaned up.

♻️ Proposed fix - remove orphaned lines
 This project demonstrates that FORGE provides a **complete, production-ready framework** for building observable, configurable, and maintainable test harnesses.
-./run_ci skeleton ci --help
-```
 
 ## Creating Your Own Project
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)

[warning] 244-244: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/skeleton/README.md` around lines 242 - 244, Remove the orphaned
command and stray closing fence introduced after the sentence about FORGE —
specifically delete the bare " ./run_ci skeleton ci --help" line and the
unmatched "```" so the README resumes properly (ensure the "Creating Your Own
Project" heading and subsequent fenced code blocks remain intact); locate the
text near the "Creating Your Own Project" section and the sentence mentioning
FORGE to find and remove these orphaned lines.

@kpouget
Copy link
Copy Markdown
Contributor Author

kpouget commented Apr 14, 2026

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster psap-mgmt
/var skeleton.namespace: kpouget-dev

@topsail-bot
Copy link
Copy Markdown

topsail-bot bot commented Apr 14, 2026

🔴 Test of 'fournos_launcher submit' failed after 00 hours 00 minutes 06 seconds 🔴

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster psap-mgmt
/var skeleton.namespace: kpouget-dev

Failure indicator:

## /logs/artifacts/FAILURE 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~~ projects/fournos_launcher/toolbox/submit_and_wait/main.py:161
~~ 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: psap-mgmt
~~     project: skeleton
~~     args:
~~     - collect_cluster_info
~~     - deep_testing
~~     - side_testing
~~     variables_overrides:
~~       skeleton.namespace: 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":"2044103120446820352","prowjobid":"b12ed7dd-8a1c-40a6-9d66-92d582995d1d","refs":{"org":"openshift-psap","repo":"forge","repo_link":"https://github.com/openshift-psap/forge","base_ref":"main","base_sha":"5bbc721fcf7988fd2c7494e2fee0f37d812d39c5","base_link":"https://github.com/openshift-psap/forge/commit/5bbc721fcf7988fd2c7494e2fee0f37d812d39c5","pulls":[{"number":26,"author":"kpouget","sha":"54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6","title":"[Skeleton]
~~         Rework to be more exhaustive","head_ref":"skeleton","link":"https://github.com/openshift-psap/forge/pull/26","commit_link":"https://github.com/openshift-psap/forge/pull/26/commits/54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6","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: '2044103120446820352'
~~       PULL_PULL_SHA: 54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6
~~       PULL_NUMBER: '26'
~~       PULL_BASE_REF: main
~~       REPO_NAME: forge
~~       REPO_OWNER: openshift-psap
~~       PULL_BASE_SHA: 5bbc721fcf7988fd2c7494e2fee0f37d812d39c5
~~       PULL_TITLE: '[Skeleton] Rework to be more exhaustive'
~~       PULL_REFS: main:5bbc721fcf7988fd2c7494e2fee0f37d812d39c5,26:54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6
~~       PULL_HEAD_REF: skeleton
~~     status_dest: /logs/artifacts
~~     artifact_dir: /logs/artifacts/001__submit_and_wait
~~ CONTEXT:
~~     final_job_name: forge-skeleton-20260414-171949
~~     manifest_file: /logs/artifacts/001__submit_and_wait/src/forge-skeleton-20260414-171949-manifest.yaml
~~
~~ EXCEPTION: RuntimeError
~~     Job forge-skeleton-20260414-171949 failed: Cluster 'psap-mgmt' not found
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


[...]

Execution logs

@kpouget
Copy link
Copy Markdown
Contributor Author

kpouget commented Apr 14, 2026

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster psap-mgmt
/var skeleton.namespace: kpouget-dev

@topsail-bot
Copy link
Copy Markdown

topsail-bot bot commented Apr 14, 2026

🔴 Test of 'fournos_launcher submit' failed after 00 hours 00 minutes 06 seconds 🔴

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster psap-mgmt
/var skeleton.namespace: kpouget-dev

Failure indicator:

## /logs/artifacts/FAILURE 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
~~ projects/fournos_launcher/toolbox/submit_and_wait/main.py:161
~~ 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: psap-mgmt
~~     project: skeleton
~~     args:
~~     - collect_cluster_info
~~     - deep_testing
~~     - side_testing
~~     variables_overrides:
~~       skeleton.namespace: 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":"2044104829327904768","prowjobid":"3e9d0359-d841-4f5a-83d1-d5e97e6bb860","refs":{"org":"openshift-psap","repo":"forge","repo_link":"https://github.com/openshift-psap/forge","base_ref":"main","base_sha":"5bbc721fcf7988fd2c7494e2fee0f37d812d39c5","base_link":"https://github.com/openshift-psap/forge/commit/5bbc721fcf7988fd2c7494e2fee0f37d812d39c5","pulls":[{"number":26,"author":"kpouget","sha":"54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6","title":"[Skeleton]
~~         Rework to be more exhaustive","head_ref":"skeleton","link":"https://github.com/openshift-psap/forge/pull/26","commit_link":"https://github.com/openshift-psap/forge/pull/26/commits/54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6","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: '2044104829327904768'
~~       PULL_PULL_SHA: 54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6
~~       PULL_NUMBER: '26'
~~       PULL_BASE_REF: main
~~       REPO_NAME: forge
~~       REPO_OWNER: openshift-psap
~~       PULL_BASE_SHA: 5bbc721fcf7988fd2c7494e2fee0f37d812d39c5
~~       PULL_TITLE: '[Skeleton] Rework to be more exhaustive'
~~       PULL_REFS: main:5bbc721fcf7988fd2c7494e2fee0f37d812d39c5,26:54b8ecf2bbdd9ab57dfc8fa13aca962b976a6ca6
~~       PULL_HEAD_REF: skeleton
~~     status_dest: /logs/artifacts
~~     artifact_dir: /logs/artifacts/001__submit_and_wait
~~ CONTEXT:
~~     final_job_name: forge-skeleton-20260414-172622
~~     manifest_file: /logs/artifacts/001__submit_and_wait/src/forge-skeleton-20260414-172622-manifest.yaml
~~
~~ EXCEPTION: RuntimeError
~~     Job forge-skeleton-20260414-172622 failed: Cluster 'psap-mgmt' not found
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


[...]

Execution logs

@kpouget
Copy link
Copy Markdown
Contributor Author

kpouget commented Apr 14, 2026

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster psap-mgmt
/var skeleton.namespace: kpouget-dev

@topsail-bot
Copy link
Copy Markdown

topsail-bot bot commented Apr 14, 2026

🟢 Test of 'fournos_launcher submit' succeeded after 00 hours 00 minutes 32 seconds 🟢

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster psap-mgmt
/var skeleton.namespace: kpouget-dev

Execution logs

@kpouget
Copy link
Copy Markdown
Contributor Author

kpouget commented Apr 14, 2026

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster psap-mgmt
/var skeleton.namespace: kpouget-dev
/var fournos.job.pipeline_name: forge-full

@topsail-bot
Copy link
Copy Markdown

topsail-bot bot commented Apr 14, 2026

🟢 Test of 'fournos_launcher submit' succeeded after 00 hours 00 minutes 51 seconds 🟢

• Link to the test results.

• No reports index generated...

Test configuration:

/test fournos skeleton collect_cluster_info deep_testing side_testing
/cluster psap-mgmt
/var skeleton.namespace: kpouget-dev
/var fournos.job.pipeline_name: forge-full

Execution logs

@kpouget kpouget merged commit 9026197 into openshift-psap:main Apr 14, 2026
4 of 5 checks passed
@kpouget kpouget deleted the skeleton branch April 14, 2026 18:48
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