Fix module name matching for abbreviated ocp_resources modules - #5975
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
🔗 Linked repositories identifiedCodeRabbit considers these linked repositories for cross-repo context during reviews:
📝 WalkthroughWalkthroughThe resource lookup utility now resolves resources directly from related objects by scanning specified ChangesRelated resource lookup
Estimated code review effort: 3 (Moderate) | ~20 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 6✅ Passed checks (6 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
|
Report bugs in Issues Welcome! 🎉This pull request will be automatically processed with the following features: 🔄 Automatic Actions
📋 Available CommandsPR Status Management
Review & Approval
Testing & Validation
Container Operations
Cherry-pick Operations
Branch Management
Label Management
✅ Merge RequirementsThis PR will be automatically approved when the following conditions are met:
📊 Review ProcessApprovers and ReviewersApprovers:
Reviewers:
Available Labels
AI Features
Security Checks
💡 Tips
📌 Additional InformationCustom Commands:
For more information, please refer to the project documentation or contact the maintainers. |
|
/build-and-push-container |
|
/build-and-push-container |
|
New container for quay.io/openshift-cnv/openshift-virtualization-tests:pr-5975 published |
|
/verified All tests passed for PR #5975. Execution details |
|
New container for quay.io/openshift-cnv/openshift-virtualization-tests:pr-5975 published |
Test execution plan request detailsCRITICAL: You MUST post an inline review comment on the first changed line of the first file. As an expert software testing engineer, analyze all modified files in this PR and create a targeted test execution plan. Analysis Requirements:
Output rules: Your deliverable: Test Execution Plan
Use these formats:
Real test commands (MANDATORY when changes affect session/runtime code): When the affected code runs at session/collection time (conftest fixtures, pytest plugins,
Example output for a session-startup fix: Guidelines:
Hardware-Related Checks (SR-IOV, GPU, DPDK): When PR modifies fixtures for hardware-specific resources:
CRITICAL WORKFLOW COMPLETION RULES: When responding to this test execution plan request, you MUST follow these rules EXACTLY:
ABSOLUTE PROHIBITIONS (violating these creates empty/meaningless reviews):
Remember: The pull request review is visible to users. Additional comments are redundant noise. CRITICAL — Verification rules for smoke and gating decisions: |
|
/verified All tests passed for PR #5975. Execution details |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="RedHatQE/openshift-virtualization-tests"
pr=5975
echo '=== PR metadata ==='
gh pr view "$pr" --repo "$repo" --json baseRefName,headRefName,files --jq '{baseRefName, headRefName, files: [.files[].path]}'
echo '=== Changed files and zero-context diff ==='
git diff --find-renames --unified=0 "origin/$(gh pr view "$pr" --repo "$repo" --json baseRefName --jq .baseRefName)...HEAD"
echo '=== Repository status and recent commit diff ==='
git status --short
git diff --find-renames --unified=0 HEAD~1..HEAD || trueLength of output: 1133 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="RedHatQE/openshift-virtualization-tests"
pr=5975
echo '=== PR file patch and changed-line data ==='
gh api "repos/$repo/pulls/$pr/files?per_page=100" \
--jq '.[] | {filename, status, previous_filename, additions, deletions, patch}'
echo '=== Changed utility outline ==='
ast-grep outline tests/install_upgrade_operators/utils.py --items all --view expanded
echo '=== get_ocp_resource_module_name definition and same-file callers ==='
rg -n -C 8 '\b(get_ocp_resource_module_name|resource_factory)\b' tests/install_upgrade_operators/utils.py || true
echo '=== Direct imports/calls in tests and conftest files ==='
rg -n -C 4 --glob '*.py' \
'from tests\.install_upgrade_operators\.utils import.*\bget_ocp_resource_module_name\b|import tests\.install_upgrade_operators\.utils|\bget_ocp_resource_module_name\s*\(' \
tests || true
echo '=== Smoke and gating marker files ==='
rg -l --glob '*.py' '`@pytest`\.mark\.smoke' tests || true
echo '-- gating --'
rg -l --glob '*.py' '`@pytest`\.mark\.gating' tests || true
echo '=== Relevant conftest files ==='
fd --type f --glob 'conftest.py' tests | sortLength of output: 14835 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== Wrapper imports and calls ==='
rg -n -C 5 --glob '*.py' \
'\b(get_resource_from_module_name|get_ocp_resource_module_name)\b' tests \
|| true
echo '=== Importers and calls of the install/upgrade utils module ==='
rg -n -C 5 --glob '*.py' \
'(from tests\.install_upgrade_operators\.utils import|import tests\.install_upgrade_operators\.utils|from \.\.?utils import)' \
tests/install_upgrade_operators \
|| true
echo '=== Relevant wrapper implementation ==='
sed -n '210,300p' tests/install_upgrade_operators/utils.py
echo '=== Install/upgrade conftest call graph candidates ==='
rg -n -C 6 --glob 'conftest.py' \
'\b(get_resource_from_module_name|get_ocp_resource_module_name)\b|tests\.install_upgrade_operators\.utils' \
tests \
|| true
echo '=== Parent conftest checks for all smoke-marked files ==='
while IFS= read -r smoke_file; do
echo "-- $smoke_file"
dir="$(dirname "$smoke_file")"
while [ "$dir" != "." ]; do
if [ -f "$dir/conftest.py" ]; then
matches="$(rg -n -C 2 '\b(get_resource_from_module_name|get_ocp_resource_module_name)\b|tests\.install_upgrade_operators\.utils' "$dir/conftest.py" || true)"
if [ -n "$matches" ]; then
printf '%s\n' "$matches"
fi
fi
dir="$(dirname "$dir")"
done
done < <(rg -l --glob '*.py' '`@pytest`\.mark\.smoke' tests)
echo '=== Markers and test definitions in affected candidate files ==='
rg -n -C 3 --glob '*.py' \
'`@pytest`\.mark\.(smoke|gating)|^\s*(async\s+)?def test_|^\s*class Test' \
tests/install_upgrade_operators \
|| trueLength of output: 30241 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== Direct and dynamic consumers of ocp_resource_by_name ==='
rg -n -C 6 --glob '*.py' \
'\bocp_resource_by_name\b|getfixturevalue\(\s*["'\'']ocp_resource_by_name["'\'']\s*\)' \
tests || true
echo '=== Fixture implementation and adjacent fixture dependencies ==='
sed -n '220,270p' tests/install_upgrade_operators/conftest.py
echo '=== Candidate test markers, definitions, and fixture arguments ==='
rg -n -C 4 --glob '*.py' \
'`@pytest`\.mark\.(smoke|gating)|^\s*(async\s+)?def test_.*\bocp_resource_by_name\b|^\s*class Test' \
tests/install_upgrade_operators || true
echo '=== All smoke test parent conftest files: affected-symbol check ==='
for f in $(rg -l --glob '*.py' '`@pytest`\.mark\.smoke' tests); do
echo "-- $f"
d="$(dirname "$f")"
while :; do
if [ -f "$d/conftest.py" ]; then
rg -n -C 2 '\b(get_resource_from_module_name|get_ocp_resource_module_name|ocp_resource_by_name)\b' "$d/conftest.py" || true
fi
[ "$d" = "tests" ] && break
d="$(dirname "$d")"
done
done
echo '=== All gating test parent conftest files: affected-symbol check ==='
for f in $(rg -l --glob '*.py' '`@pytest`\.mark\.gating' tests); do
d="$(dirname "$f")"
while :; do
if [ -f "$d/conftest.py" ] && rg -q '\b(get_resource_from_module_name|get_ocp_resource_module_name|ocp_resource_by_name)\b' "$d/conftest.py"; then
echo "-- $f via $d/conftest.py"
rg -n -C 2 '\b(get_resource_from_module_name|get_ocp_resource_module_name|ocp_resource_by_name)\b' "$d/conftest.py"
fi
[ "$d" = "tests" ] && break
d="$(dirname "$d")"
done
doneLength of output: 77947 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== Relationship-label test and its parametrization ==='
sed -n '1,150p' tests/install_upgrade_operators/relationship_labels/test_relationship_labels.py
echo '=== Strict-reconciliation related-object test and its parametrization ==='
sed -n '1,120p' tests/install_upgrade_operators/strict_reconciliation/test_hco_related_objects.py
echo '=== Related-object fixture matrix and submodule list ==='
rg -n -C 8 --glob '*.py' \
'\b(ocp_resources_submodule_list|cnv_related_object_matrix__function__|hco_status_related_objects)\b' \
tests/install_upgrade_operators tests/conftest.py || true
echo '=== MutatingWebhookConfiguration parameter references ==='
rg -n -C 4 --glob '*.py' \
'\b(MutatingWebhookConfiguration|mutating_webhook_config)\b' \
tests || trueLength of output: 22374 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== Matrix fixture and parametrization hook ==='
rg -n -C 12 --glob '*.py' \
'\bcnv_related_object_matrix__function__\b|def pytest_generate_tests\b|related.object.matrix' \
. || true
echo '=== All related-object constants and abbreviated-module entries ==='
rg -n -i -C 8 --glob '*.py' \
'mutating.?webhook|related.objects|related_object' \
tests/install_upgrade_operators/constants.py tests/conftest.py tests/install_upgrade_operators/conftest.py 2>/dev/null || true
echo '=== Current PR review state and review API schema sample ==='
gh api "repos/RedHatQE/openshift-virtualization-tests/pulls/5975/reviews?per_page=10" \
--jq '.[] | {user: .user.login, state, body, id}' || trueLength of output: 13549 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="RedHatQE/openshift-virtualization-tests"
pr=5975
head_sha="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq .headRefOid)"
body=$(cat <<'EOF'
## Test Execution Plan
- **Run smoke tests: False** — No smoke-marked test requests the non-autouse `ocp_resource_by_name` fixture.
- **Run gating tests: True** — `tests/install_upgrade_operators/relationship_labels/test_relationship_labels.py::TestRelationshipLabels::test_verify_relationship_labels_hco_components` (gating) → `ocp_resource_by_name` → `get_resource_from_module_name` → `get_ocp_resource_module_name`.
**Affected tests to run**
- `tests/install_upgrade_operators/relationship_labels/test_relationship_labels.py::TestRelationshipLabels::test_verify_relationship_labels_hco_components` (gating)
- `tests/install_upgrade_operators/strict_reconciliation/test_hco_related_objects.py::TestRelatedObjects::test_hco_related_objects`
**Real tests (cluster required)**
Error path (abbreviated `ocp_resources` module):
`pytest tests/install_upgrade_operators/relationship_labels/test_relationship_labels.py::TestRelationshipLabels::test_verify_relationship_labels_hco_components -o log_cli=true`
Expected: every HCO related-object matrix entry resolves to its `ocp_resources` class. An abbreviated module name resolves by its class `kind`.
Happy path (normal module-name match):
`pytest tests/install_upgrade_operators/strict_reconciliation/test_hco_related_objects.py::TestRelatedObjects::test_hco_related_objects -o log_cli=true`
Expected: related objects resolve and label reconciliation completes.
EOF
)
gh api --method POST "repos/$repo/pulls/$pr/comments" \
-f body="$body" \
-f commit_id="$head_sha" \
-f path="tests/install_upgrade_operators/utils.py" \
-F line=228 \
-f side="RIGHT" \
--jq '{id, path, line, side}'Length of output: 2119 You are interacting with an AI system. |
|
/build-and-push-container |
|
New container for quay.io/openshift-cnv/openshift-virtualization-tests:pr-5975 published |
Replace get_ocp_resource_module_name, get_resource, and get_resource_from_module_name with a single get_resource_from_related_object function. Instead of string-matching module names against kind, it imports each module and checks if the class kind attribute matches. Fixes MutatingWebhookConfiguration lookup failure where the module name (mutating_webhook_config) doesn't match the kind when underscores are stripped (mutatingwebhookconfig != mutatingwebhookconfiguration). Signed-off-by: Ohad <orevah@redhat.com> assisted by: claude code claude-opus-4-6
091f611 to
2be85be
Compare
|
Clean rebase detected — no code changes compared to previous head ( |
|
/verified All tests passed for PR #5975. Execution details |
Test execution plan request detailsCRITICAL: You MUST post an inline review comment on the first changed line of the first file. As an expert software testing engineer, analyze all modified files in this PR and create a targeted test execution plan. Analysis Requirements:
Output rules: Your deliverable: Test Execution Plan
Use these formats:
Real test commands (MANDATORY when changes affect session/runtime code): When the affected code runs at session/collection time (conftest fixtures, pytest plugins,
Example output for a session-startup fix: Guidelines:
Hardware-Related Checks (SR-IOV, GPU, DPDK): When PR modifies fixtures for hardware-specific resources:
CRITICAL WORKFLOW COMPLETION RULES: When responding to this test execution plan request, you MUST follow these rules EXACTLY:
ABSOLUTE PROHIBITIONS (violating these creates empty/meaningless reviews):
Remember: The pull request review is visible to users. Additional comments are redundant noise. CRITICAL — Verification rules for smoke and gating decisions: |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="RedHatQE/openshift-virtualization-tests"
pr="5975"
echo '=== PR metadata and changed files ==='
gh pr view "$pr" --repo "$repo" --json headRefOid,baseRefName,files \
--jq '{headRefOid, baseRefName, files: [.files[] | {path, additions, deletions}]}'
echo '=== Current PR diff ==='
base="$(gh pr view "$pr" --repo "$repo" --json baseRefName --jq .baseRefName)"
git diff --find-renames --unified=20 "origin/$base...HEAD" -- \
tests/install_upgrade_operators/conftest.py \
tests/install_upgrade_operators/utils.py
echo '=== First changed line anchors ==='
gh api "repos/$repo/pulls/$pr/files?per_page=100" \
--jq '.[] | {filename, patch}'
echo '=== Changed-file outlines ==='
ast-grep outline tests/install_upgrade_operators/conftest.py --items all --view expanded
ast-grep outline tests/install_upgrade_operators/utils.py --items all --view expanded
echo '=== Changed helper and fixture call sites ==='
rg -n -C 6 --glob '*.py' \
'\b(get_resource_from_related_object|get_resource_from_module_name|get_ocp_resource_module_name|ocp_resource_by_name)\b' \
tests
echo '=== Marker declarations and affected-test definitions ==='
rg -n -C 3 --glob '*.py' \
'`@pytest`\.mark\.(smoke|gating)|^\s*(async\s+)?def test_|^\s*class Test' \
tests/install_upgrade_operators/relationship_labels/test_relationship_labels.py \
tests/install_upgrade_operators/strict_reconciliation/test_hco_related_objects.py
echo '=== Smoke and gating files ==='
rg -l --glob '*.py' '`@pytest`\.mark\.smoke' tests | sort
echo '-- gating --'
rg -l --glob '*.py' '`@pytest`\.mark\.gating' tests | sort
echo '=== Parent conftest references for smoke and gating tests ==='
for marker in smoke gating; do
while IFS= read -r test_file; do
dir="$(dirname "$test_file")"
while :; do
if [ -f "$dir/conftest.py" ]; then
matches="$(rg -n -C 2 '\b(get_resource_from_related_object|get_resource_from_module_name|get_ocp_resource_module_name|ocp_resource_by_name)\b' "$dir/conftest.py" || true)"
if [ -n "$matches" ]; then
echo "-- $marker: $test_file via $dir/conftest.py"
printf '%s\n' "$matches"
fi
fi
[ "$dir" = "tests" ] && break
dir="$(dirname "$dir")"
done
done < <(rg -l --glob '*.py' "`@pytest`\\.mark\\.$marker" tests)
doneLength of output: 2454 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="RedHatQE/openshift-virtualization-tests"
pr="5975"
api="repos/$repo"
head_sha="$(gh pr view "$pr" --repo "$repo" --json headRefOid --jq .headRefOid)"
echo "=== Head SHA ==="
printf '%s\n' "$head_sha"
echo '=== Changed files and patches ==='
gh api "$api/pulls/$pr/files?per_page=100" \
--jq '.[] | {filename, additions, deletions, patch}'
echo '=== Relevant current files ==='
for path in \
tests/install_upgrade_operators/conftest.py \
tests/install_upgrade_operators/utils.py \
tests/install_upgrade_operators/relationship_labels/test_relationship_labels.py \
tests/install_upgrade_operators/strict_reconciliation/test_hco_related_objects.py \
tests/conftest.py \
tests/install_upgrade_operators/constants.py
do
echo "--- $path"
gh api -H 'Accept: application/vnd.github.raw+json' \
"$api/contents/$path?ref=$head_sha" || true
done
echo '=== Python test tree ==='
gh api "$api/git/trees/$head_sha?recursive=1" \
--jq '.tree[] | select(.type == "blob" and (.path | startswith("tests/")) and (.path | endswith(".py"))) | .path' \
> /tmp/test_paths.txt
echo '=== Candidate marker and fixture consumers ==='
while IFS= read -r path; do
content="$(gh api -H 'Accept: application/vnd.github.raw+json' "$api/contents/$path?ref=$head_sha")"
if grep -Eq '`@pytest`\.mark\.(smoke|gating)|\bocp_resource_by_name\b|\bget_resource_from_related_object\b' <<<"$content"; then
echo "--- $path"
grep -nE -C 3 '`@pytest`\.mark\.(smoke|gating)|\bocp_resource_by_name\b|\bget_resource_from_related_object\b|^\s*(async\s+)?def test_|^\s*class Test' <<<"$content" || true
fi
done < /tmp/test_paths.txtLength of output: 1740
You are interacting with an AI system. |
|
/approve |
|
Successfully removed PR tag: quay.io/openshift-cnv/openshift-virtualization-tests:pr-5975. |
|
New container for quay.io/openshift-cnv/openshift-virtualization-tests:latest published |
What this PR does / why we need it:
Add import-based fallback to get_ocp_resource_module_name when the exact string match fails. Some ocp_resources modules use abbreviated names (e.g. mutating_webhook_config for MutatingWebhookConfiguration). The fallback imports the module and checks if any class has a matching kind attribute.
assisted by: claude code claude-opus-4-6
Which issue(s) this PR fixes:
Special notes for reviewer:
jira-ticket:
Summary by CodeRabbit