Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"name": "edge-ocp-ci",
"source": "./plugins/edge-ocp-ci",
"description": "Edge OCP Payload Monitor — monitor OpenShift nightly payloads for edge topology (SNO/TNA/TNF) failures with AI-enriched analysis",
"version": "1.0.2"
"version": "1.2.0"
},
{
"name": "edge-scrum",
Expand Down Expand Up @@ -88,7 +88,7 @@
"name": "pr-review",
"source": "./plugins/pr-review",
"description": "PR lifecycle toolkit — vet findings, triage CodeRabbit reviews, filter noise, and autonomous yolo-agent for CI monitoring and auto-fixes",
"version": "2.0.1"
"version": "2.1.0"
},
{
"name": "skills-review",
Expand Down
83 changes: 82 additions & 1 deletion payload-monitor/payload_monitor/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from datetime import datetime, timezone
from pathlib import Path

import requests
import click

from .analyzer import analyze
Expand Down Expand Up @@ -90,15 +91,95 @@ def _collect_jobs_by_type(report: MonitorReport, job_type: JobType) -> list[dict
help="Number of payloads to analyze per stream (1-10, default 5)")
@click.option("--merge-analysis", "merge_analysis_path", type=click.Path(exists=True), default=None,
help="Merge analysis JSON into an existing HTML report (or into --from-json data)")
@click.option("--pr-payload-url", type=str, default=None,
help="Triage a PR payload run (e.g., https://pr-payload-tests.ci.openshift.org/runs/ci/...)")
@click.option("--pr", "pr_ref", type=str, default=None,
help="PR reference for triage (e.g., 'openshift/origin#31276' or full URL)")
@click.option("--format", "output_format", type=click.Choice(["markdown", "json"]),
default="markdown", help="Output format for PR triage (default: markdown)")
@click.option("--discover", is_flag=True, default=False,
help="Discover which payload jobs match the PR's changed files (use with --pr)")
def main(
versions, output_path, from_json, export_json,
open_browser, verbose, skip_prow, skip_sippy, with_timing,
payloads, merge_analysis_path,
payloads, merge_analysis_path, pr_payload_url, pr_ref, output_format,
discover,
):
"""Edge OCP Payload Monitor — monitor OpenShift nightly payloads for edge topology failures."""
_setup_logging(verbose)
logger = logging.getLogger("payload_monitor")

# --- PR payload job discovery mode ---
if discover:
if not pr_ref:
logger.error("--pr is required when using --discover")
raise SystemExit(1)

from .collectors.payload_job_discovery import (
discover_payload_jobs,
find_release_repo,
format_discovery_json,
format_discovery_markdown,
)
from .collectors.pr_payload import fetch_pr_changed_files

release_repo = find_release_repo()
if not release_repo:
logger.error("Cannot find openshift/release repo. Set RELEASE_REPO_DIR or clone it locally.")
raise SystemExit(1)

changed_files = fetch_pr_changed_files(pr_ref)
if not changed_files:
logger.error(f"No changed files found for {pr_ref}")
raise SystemExit(1)

result = discover_payload_jobs(pr_ref, changed_files, release_repo)

if output_format == "json":
print(format_discovery_json(result))
else:
print(format_discovery_markdown(result))
if result.error:
raise SystemExit(1)
return
Comment thread
lucaconsalvi marked this conversation as resolved.

# --- PR payload triage mode ---
if pr_payload_url:
if not pr_ref:
logger.error("--pr is required when using --pr-payload-url")
raise SystemExit(1)

from .collectors.pr_payload import (
build_triage_result,
classify_failures,
fetch_pr_changed_files,
fetch_pr_diff,
fetch_pr_payload_run,
format_triage_json,
format_triage_markdown,
)

try:
jobs = fetch_pr_payload_run(pr_payload_url)
except requests.RequestException as exc:
click.echo(f"Error fetching payload page: {exc}", err=True)
raise SystemExit(1) from exc
if not jobs:
logger.error("No jobs found at the provided URL")
raise SystemExit(1)
Comment thread
coderabbitai[bot] marked this conversation as resolved.

pr_files = fetch_pr_changed_files(pr_ref)
diff_content = fetch_pr_diff(pr_ref)
verdicts = classify_failures(jobs, pr_files, diff_content)
result = build_triage_result(pr_payload_url, pr_ref, jobs)
result.verdicts = verdicts

if output_format == "json":
print(format_triage_json(result))
else:
print(format_triage_markdown(result))
return

Comment thread
lucaconsalvi marked this conversation as resolved.
# Build config
config = Config()
if payloads is not None:
Expand Down
Loading