CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
194 lines
7.4 KiB
Python
194 lines
7.4 KiB
Python
# Copyright Advanced Micro Devices, Inc.
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
from pathlib import Path
|
|
import os
|
|
import sys
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
sys.path.insert(0, os.fspath(Path(__file__).parent.parent))
|
|
import fetch_package_targets
|
|
|
|
from workflow_utils import WORKFLOWS_DIR, get_choice_options, load_workflow
|
|
|
|
|
|
class FetchPackageTargetsTest(unittest.TestCase):
|
|
def test_amdgpu_families_accepted_by_choice_workflows(self):
|
|
"""Checks workflow choice lists against fetch_package_targets outputs.
|
|
|
|
fetch_package_targets.py produces amdgpu_family values that get
|
|
dispatched to workflows. Those workflow inputs can either use
|
|
"type: choice" or "type: string". If they use "type: choice", this tests
|
|
that the choices are valid:
|
|
|
|
1. Check that every amdgpu_family from the matrix is in every workflow's
|
|
choice list. If a produced value isn't in the target's choice list,
|
|
GitHub rejects the dispatch.
|
|
See https://github.com/ROCm/TheRock/issues/3634.
|
|
2. Check that the workflow choice list does not contain any extra
|
|
families. While not an error, extra families may indicate an
|
|
incomplete migration.
|
|
"""
|
|
# Collect all amdgpu_family values the matrix can produce.
|
|
produced_families = set()
|
|
for platform in ("linux", "windows"):
|
|
targets = fetch_package_targets.determine_package_targets(
|
|
{"AMDGPU_FAMILIES": None, "THEROCK_PACKAGE_PLATFORM": platform}
|
|
)
|
|
for t in targets:
|
|
produced_families.add(t["amdgpu_family"])
|
|
|
|
self.assertGreater(len(produced_families), 0)
|
|
|
|
# Find all workflows with amdgpu_family as type: choice and check.
|
|
choice_workflows = {}
|
|
for workflow_path in sorted(WORKFLOWS_DIR.glob("*.yml")):
|
|
workflow = load_workflow(workflow_path)
|
|
options = get_choice_options(workflow, "amdgpu_family")
|
|
if options is not None:
|
|
choice_workflows[workflow_path.name] = options
|
|
|
|
self.assertGreater(
|
|
len(choice_workflows),
|
|
0,
|
|
"No workflows found with amdgpu_family as type: choice - "
|
|
"was the input renamed?",
|
|
)
|
|
|
|
errors = []
|
|
for workflow_name, options in choice_workflows.items():
|
|
# Test for missing families
|
|
missing_families = produced_families - set(options)
|
|
if missing_families:
|
|
errors.append(
|
|
f"{workflow_name} is missing amdgpu_family options "
|
|
f"that fetch_package_targets can produce: {sorted(missing_families)}"
|
|
)
|
|
# Test for extra families
|
|
extra_families = set(options) - produced_families
|
|
if extra_families:
|
|
errors.append(
|
|
f"{workflow_name} has extra amdgpu_family options not listed in fetch_package_targets: {sorted(extra_families)} "
|
|
)
|
|
|
|
if errors:
|
|
self.fail("\n".join(errors))
|
|
|
|
def test_linux_single_family(self):
|
|
args = {
|
|
"AMDGPU_FAMILIES": "gfx94x",
|
|
"THEROCK_PACKAGE_PLATFORM": "linux",
|
|
}
|
|
targets = fetch_package_targets.determine_package_targets(args)
|
|
|
|
self.assertEqual(len(targets), 1)
|
|
|
|
def test_linux_multiple_families(self):
|
|
# Note the punctuation that gets stripped and x that gets changed to X.
|
|
args = {
|
|
"AMDGPU_FAMILIES": "gfx94x ,; gfx110x",
|
|
"THEROCK_PACKAGE_PLATFORM": "linux",
|
|
}
|
|
targets = fetch_package_targets.determine_package_targets(args)
|
|
|
|
self.assertGreater(
|
|
len(targets),
|
|
1,
|
|
)
|
|
|
|
def test_linux_no_families(self):
|
|
args = {
|
|
"AMDGPU_FAMILIES": None,
|
|
"THEROCK_PACKAGE_PLATFORM": "linux",
|
|
}
|
|
targets = fetch_package_targets.determine_package_targets(args)
|
|
|
|
self.assertTrue(all("amdgpu_family" in t for t in targets))
|
|
# Standard targets have suffixes and may use X for a family.
|
|
self.assertTrue(any("gfx94X-dcgpu" == t["amdgpu_family"] for t in targets))
|
|
self.assertTrue(any("gfx110X-all" == t["amdgpu_family"] for t in targets))
|
|
|
|
def test_windows_single_family(self):
|
|
args = {
|
|
"AMDGPU_FAMILIES": "gfx120x",
|
|
"THEROCK_PACKAGE_PLATFORM": "linux",
|
|
}
|
|
targets = fetch_package_targets.determine_package_targets(args)
|
|
|
|
self.assertEqual(len(targets), 1)
|
|
|
|
def test_windows_no_families(self):
|
|
args = {
|
|
"AMDGPU_FAMILIES": None,
|
|
"THEROCK_PACKAGE_PLATFORM": "windows",
|
|
}
|
|
targets = fetch_package_targets.determine_package_targets(args)
|
|
|
|
self.assertTrue(all("amdgpu_family" in t for t in targets))
|
|
# dcgpu targets are Linux only.
|
|
self.assertFalse(any("gfx94X-dcgpu" == t["amdgpu_family"] for t in targets))
|
|
self.assertTrue(any("gfx110X-all" == t["amdgpu_family"] for t in targets))
|
|
self.assertTrue(any("gfx120X-all" == t["amdgpu_family"] for t in targets))
|
|
|
|
def test_gfx94x_multi_label_selects_first_when_random_low(self):
|
|
"""When random() is low, first label should be selected."""
|
|
args = {
|
|
"AMDGPU_FAMILIES": "gfx94x",
|
|
"THEROCK_PACKAGE_PLATFORM": "linux",
|
|
}
|
|
|
|
# Mock random.random() to return 0.05 (< 0.1 first weight)
|
|
with patch("random.random", return_value=0.05):
|
|
targets = fetch_package_targets.determine_package_targets(args)
|
|
|
|
self.assertEqual(len(targets), 1)
|
|
self.assertEqual(targets[0]["test_machine"], "linux-gfx942-1gpu-ccs-ossci-rocm")
|
|
|
|
def test_gfx94x_multi_label_selects_second_when_random_medium(self):
|
|
"""When random() is in second range, second label should be selected."""
|
|
args = {
|
|
"AMDGPU_FAMILIES": "gfx94x",
|
|
"THEROCK_PACKAGE_PLATFORM": "linux",
|
|
}
|
|
|
|
# Mock random.random() to return 0.5 (>= 0.1, < 0.9)
|
|
with patch("random.random", return_value=0.5):
|
|
targets = fetch_package_targets.determine_package_targets(args)
|
|
|
|
self.assertEqual(len(targets), 1)
|
|
self.assertEqual(
|
|
targets[0]["test_machine"], "linux-gfx942-1gpu-ccs-csp-ossci-rocm"
|
|
)
|
|
|
|
def test_gfx94x_multi_label_selects_third_when_random_high(self):
|
|
"""When random() is high, third label should be selected."""
|
|
args = {
|
|
"AMDGPU_FAMILIES": "gfx94x",
|
|
"THEROCK_PACKAGE_PLATFORM": "linux",
|
|
}
|
|
|
|
# Mock random.random() to return 0.95 (>= 0.9)
|
|
with patch("random.random", return_value=0.95):
|
|
targets = fetch_package_targets.determine_package_targets(args)
|
|
|
|
self.assertEqual(len(targets), 1)
|
|
self.assertEqual(targets[0]["test_machine"], "linux-gfx942-1gpu-ossci-rocm")
|
|
|
|
def test_families_without_multi_label_use_primary(self):
|
|
"""Families without multi-label config should use primary label."""
|
|
args = {
|
|
"AMDGPU_FAMILIES": "gfx110x",
|
|
"THEROCK_PACKAGE_PLATFORM": "linux",
|
|
}
|
|
|
|
# Run multiple times to ensure consistency
|
|
for _ in range(5):
|
|
targets = fetch_package_targets.determine_package_targets(args)
|
|
self.assertEqual(len(targets), 1)
|
|
self.assertEqual(targets[0]["test_machine"], "linux-gfx110X-gpu-rocm")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|