Skip to content

Commit fa74be2

Browse files
rlobilloclaude
andcommitted
[IUO] Migrate install and EUS upgrade paths to Konflux IDMS
CNV operator builds migrated from Brew to Konflux, so the install and EUS upgrade test paths need Konflux IDMS instead of the legacy ICSP/IDMS generated via `oc adm catalog mirror`. This change consolidates Konflux IDMS helpers (apply_konflux_idms, idms_has_all_mirrors) into tests/install_upgrade_operators/utils.py, removes the legacy ICSP fixtures from both install and EUS upgrade conftest files, and replaces them with new Konflux-based fixtures: - Install path: installed_konflux_idms (product_install/conftest.py) - EUS upgrade path: eus_updated_konflux_idms (product_upgrade/conftest.py) Follows up on PR #4061 which fixed the upgrade path only. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 5fcf118 commit fa74be2

4 files changed

Lines changed: 109 additions & 145 deletions

File tree

tests/install_upgrade_operators/product_install/conftest.py

Lines changed: 27 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,27 @@
55
from ocp_resources.cluster_service_version import ClusterServiceVersion
66
from ocp_resources.hostpath_provisioner import HostPathProvisioner
77
from ocp_resources.hyperconverged import HyperConverged
8+
from ocp_resources.image_digest_mirror_set import ImageDigestMirrorSet
89
from ocp_resources.installplan import InstallPlan
910
from ocp_resources.persistent_volume import PersistentVolume
1011
from ocp_resources.storage_class import StorageClass
12+
from packaging.version import Version
1113
from pytest_testconfig import py_config
1214
from timeout_sampler import TimeoutSampler
1315

1416
from tests.install_upgrade_operators.product_install.constants import (
1517
HCO_NOT_INSTALLED_ALERT,
16-
OPENSHIFT_VIRTUALIZATION,
18+
)
19+
from tests.install_upgrade_operators.utils import (
20+
KONFLUX_IDMS_NAME,
21+
KONFLUX_MIRROR_BASE_URL,
22+
apply_konflux_idms,
23+
idms_has_all_mirrors,
1724
)
1825
from utilities.constants import (
19-
BREW_REGISTERY_SOURCE,
2026
CRITICAL_STR,
2127
HCO_CATALOG_SOURCE,
2228
HCO_SUBSCRIPTION,
23-
ICSP_FILE,
24-
IDMS_FILE,
2529
INFO_STR,
2630
PENDING_STR,
2731
PRODUCTION_CATALOG_SOURCE,
@@ -39,17 +43,12 @@
3943
)
4044
from utilities.operator import (
4145
create_catalog_source,
42-
create_icsp_idms_from_file,
4346
create_operator,
4447
create_operator_group,
4548
create_subscription,
46-
generate_icsp_idms_file,
4749
get_hco_csv_name_by_version,
4850
get_install_plan_from_subscription,
49-
get_mcp_updating_transition_times,
5051
wait_for_catalogsource_ready,
51-
wait_for_mcp_update_end,
52-
wait_for_mcp_update_start,
5352
)
5453
from utilities.storage import (
5554
HppCsiStorageClass,
@@ -65,54 +64,32 @@
6564

6665

6766
@pytest.fixture(scope="module")
68-
def hyperconverged_directory(tmpdir_factory, is_production_source):
69-
if is_production_source:
70-
yield
71-
else:
72-
yield tmpdir_factory.mktemp(f"{OPENSHIFT_VIRTUALIZATION}-folder")
73-
74-
75-
@pytest.fixture(scope="module")
76-
def generated_hyperconverged_icsp_idms(
67+
def installed_konflux_idms(
7768
is_production_source,
78-
is_idms_cluster,
79-
hyperconverged_directory,
80-
generated_pulled_secret,
81-
cnv_image_url,
69+
cnv_version_to_install_info,
70+
nodes,
71+
machine_config_pools,
72+
machine_config_pools_conditions_scope_module,
8273
):
8374
if is_production_source:
84-
LOGGER.info("This is installation from production source, icsp update is not needed.")
75+
LOGGER.info("Production source install, IDMS update not needed.")
8576
return
86-
folder_name = f"{hyperconverged_directory}/{OPENSHIFT_VIRTUALIZATION}-manifest"
87-
LOGGER.info(f"Create CNV ICSP/IDMS file {ICSP_FILE}/{IDMS_FILE} in {hyperconverged_directory}")
88-
mirror_cmd = (
89-
f"oc adm catalog mirror {cnv_image_url} {BREW_REGISTERY_SOURCE} --manifests-only"
90-
f" --to-manifests {folder_name} --registry-config={generated_pulled_secret}"
91-
)
9277

93-
return generate_icsp_idms_file(folder_name=folder_name, command=mirror_cmd, is_idms_file=is_idms_cluster)
78+
version = Version(version=cnv_version_to_install_info["version"])
79+
required_mirrors = [f"{KONFLUX_MIRROR_BASE_URL}/v{version.major}-{version.minor}"]
9480

95-
96-
@pytest.fixture(scope="module")
97-
def updated_icsp_hyperconverged(
98-
is_production_source,
99-
generated_hyperconverged_icsp_idms,
100-
machine_config_pools,
101-
machine_config_pools_conditions_scope_module,
102-
):
103-
initial_updating_transition_times = get_mcp_updating_transition_times(
104-
mcp_conditions=machine_config_pools_conditions_scope_module
105-
)
106-
if is_production_source:
107-
LOGGER.info("This is installation from production source, icsp/idms update is not needed.")
81+
idms = ImageDigestMirrorSet(name=KONFLUX_IDMS_NAME)
82+
if idms.exists and idms_has_all_mirrors(idms=idms, required_mirrors=required_mirrors):
83+
LOGGER.info(f"IDMS {KONFLUX_IDMS_NAME} already contains required mirrors.")
10884
return
109-
create_icsp_idms_from_file(file_path=generated_hyperconverged_icsp_idms)
110-
LOGGER.info("Wait for MCP update after ICSP/IDMS modification.")
111-
wait_for_mcp_update_start(
112-
machine_config_pools_list=machine_config_pools,
113-
initial_transition_times=initial_updating_transition_times,
85+
86+
apply_konflux_idms(
87+
idms=idms,
88+
required_mirrors=required_mirrors,
89+
machine_config_pools=machine_config_pools,
90+
mcp_conditions=machine_config_pools_conditions_scope_module,
91+
nodes=nodes,
11492
)
115-
wait_for_mcp_update_end(machine_config_pools_list=machine_config_pools)
11693

11794

11895
@pytest.fixture(scope="module")
@@ -206,7 +183,7 @@ def cnv_install_plan_installed(
206183
def installed_openshift_virtualization(
207184
admin_client,
208185
disabled_default_sources_in_operatorhub_scope_module,
209-
updated_icsp_hyperconverged,
186+
installed_konflux_idms,
210187
hyperconverged_catalog_source,
211188
created_cnv_namespace,
212189
created_cnv_operator_group,

tests/install_upgrade_operators/product_upgrade/conftest.py

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212

1313
from tests.install_upgrade_operators.constants import WORKLOAD_UPDATE_STRATEGY_KEY_NAME, WORKLOADUPDATEMETHODS
1414
from tests.install_upgrade_operators.product_upgrade.utils import (
15-
KONFLUX_IDMS_NAME,
16-
KONFLUX_MIRROR_BASE_URL,
17-
apply_konflux_idms,
1815
approve_cnv_upgrade_install_plan,
1916
extract_ocp_version_from_ocp_image,
2017
get_alerts_fired_during_upgrade,
@@ -23,7 +20,6 @@
2320
get_nodes_labels,
2421
get_nodes_taints,
2522
get_shortest_upgrade_path,
26-
idms_has_all_mirrors,
2723
perform_cnv_upgrade,
2824
run_ocp_upgrade_command,
2925
set_workload_update_methods_hco,
@@ -34,7 +30,13 @@
3430
wait_for_odf_update,
3531
wait_for_pods_replacement_by_type,
3632
)
37-
from tests.install_upgrade_operators.utils import wait_for_operator_condition
33+
from tests.install_upgrade_operators.utils import (
34+
KONFLUX_IDMS_NAME,
35+
KONFLUX_MIRROR_BASE_URL,
36+
apply_konflux_idms,
37+
idms_has_all_mirrors,
38+
wait_for_operator_condition,
39+
)
3840
from tests.upgrade_params import EUS
3941
from utilities.constants import (
4042
HCO_CATALOG_SOURCE,
@@ -53,8 +55,6 @@
5355
get_subscription,
5456
)
5557
from utilities.operator import (
56-
apply_icsp_idms,
57-
get_generated_icsp_idms,
5858
get_machine_config_pool_by_name,
5959
get_machine_config_pools_conditions,
6060
update_image_in_catalog_source,
@@ -360,7 +360,7 @@ def eus_paused_worker_mcp(
360360
workers,
361361
worker_machine_config_pools,
362362
worker_machine_config_pools_conditions,
363-
eus_applied_all_icsp,
363+
eus_updated_konflux_idms,
364364
):
365365
LOGGER.info("Pausing worker MCP updates before starting EUS upgrade.")
366366
update_mcp_paused_spec(mcp=worker_machine_config_pools)
@@ -407,44 +407,31 @@ def eus_unpaused_workload_update(
407407

408408

409409
@pytest.fixture(scope="module")
410-
def created_eus_icsps(
411-
pull_secret_directory,
412-
generated_pulled_secret,
413-
cnv_registry_source,
410+
def eus_updated_konflux_idms(
414411
eus_cnv_upgrade_path,
415-
is_idms_cluster,
416-
):
417-
icsp_files = []
418-
for entry in eus_cnv_upgrade_path:
419-
for version in eus_cnv_upgrade_path[entry]:
420-
icsp_file = get_generated_icsp_idms(
421-
image_url=eus_cnv_upgrade_path[entry][version],
422-
registry_source=cnv_registry_source["source_map"],
423-
generated_pulled_secret=generated_pulled_secret,
424-
pull_secret_directory=pull_secret_directory,
425-
is_idms_cluster=is_idms_cluster,
426-
cnv_version=version,
427-
)
428-
icsp_files.append(icsp_file)
429-
LOGGER.info(f"EUS ICSP Files created: {icsp_files}")
430-
return icsp_files
431-
432-
433-
@pytest.fixture(scope="module")
434-
def eus_applied_all_icsp(
435412
nodes,
436-
generated_pulled_secret,
437413
machine_config_pools,
438414
machine_config_pools_conditions_scope_module,
439-
created_eus_icsps,
440-
is_idms_cluster,
441415
):
442-
apply_icsp_idms(
443-
file_paths=created_eus_icsps,
416+
required_mirrors = []
417+
for phase in eus_cnv_upgrade_path:
418+
for version in eus_cnv_upgrade_path[phase]:
419+
ver = Version(version=version)
420+
mirror = f"{KONFLUX_MIRROR_BASE_URL}/v{ver.major}-{ver.minor}"
421+
if mirror not in required_mirrors:
422+
required_mirrors.append(mirror)
423+
424+
idms = ImageDigestMirrorSet(name=KONFLUX_IDMS_NAME)
425+
if idms.exists and idms_has_all_mirrors(idms=idms, required_mirrors=required_mirrors):
426+
LOGGER.info(f"IDMS {KONFLUX_IDMS_NAME} already has all EUS mirrors.")
427+
return
428+
429+
apply_konflux_idms(
430+
idms=idms,
431+
required_mirrors=required_mirrors,
444432
machine_config_pools=machine_config_pools,
445433
mcp_conditions=machine_config_pools_conditions_scope_module,
446434
nodes=nodes,
447-
is_idms_file=is_idms_cluster,
448435
)
449436

450437

tests/install_upgrade_operators/product_upgrade/utils.py

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@
1313
from ocp_resources.cluster_service_version import ClusterServiceVersion
1414
from ocp_resources.cluster_version import ClusterVersion
1515
from ocp_resources.hyperconverged import HyperConverged
16-
from ocp_resources.image_digest_mirror_set import ImageDigestMirrorSet
1716
from ocp_resources.kubevirt import KubeVirt
1817
from ocp_resources.machine_config_pool import MachineConfigPool
1918
from ocp_resources.namespace import Namespace
20-
from ocp_resources.node import Node
2119
from ocp_resources.resource import Resource, ResourceEditor
2220
from packaging.version import Version
2321
from pyhelper_utils.shell import run_command
@@ -61,9 +59,6 @@
6159

6260
LOGGER = logging.getLogger(__name__)
6361
TIER_2_PODS_TYPE = "tier-2"
64-
KONFLUX_IDMS_NAME = "zz-cnv-icsp-fallback"
65-
KONFLUX_MIRROR_BASE_URL = "quay.io/openshift-virtualization/konflux-builds"
66-
KONFLUX_IDMS_SOURCE = "registry.redhat.io/container-native-virtualization"
6762

6863
# list of whitelisted alerts
6964
WHITELIST_ALERTS_UPGRADE_LIST = ["OutdatedVirtualMachineInstanceWorkloads"]
@@ -718,54 +713,3 @@ def _get_updated_odf_csv(_target_version: str, _admin_client: DynamicClient) ->
718713
if not sample:
719714
return
720715
LOGGER.info(f"Following odf csvs are not updated: {','.join(sample)}")
721-
722-
723-
def apply_konflux_idms(
724-
idms: ImageDigestMirrorSet,
725-
required_mirrors: list[str],
726-
machine_config_pools: list[MachineConfigPool],
727-
mcp_conditions: dict[str, list[dict[str, str]]],
728-
nodes: list[Node],
729-
) -> None:
730-
"""Creates or patches the Konflux IDMS with the required mirror entries.
731-
732-
Args:
733-
idms: The Konflux IDMS resource to create or patch.
734-
required_mirrors: Konflux mirror URLs to set on the IDMS.
735-
machine_config_pools: Active machine config pools to pause/wait.
736-
mcp_conditions: Initial MCP conditions for tracking update progress.
737-
nodes: Cluster nodes to verify readiness after MCP update.
738-
"""
739-
image_digest_mirrors = [{"source": KONFLUX_IDMS_SOURCE, "mirrors": required_mirrors}]
740-
741-
LOGGER.info("Pausing MCP updates while modifying IDMS.")
742-
with ResourceEditor(patches={mcp: {"spec": {"paused": True}} for mcp in machine_config_pools}):
743-
if idms.exists:
744-
LOGGER.info(f"Patching IDMS {KONFLUX_IDMS_NAME} with mirrors: {required_mirrors}")
745-
ResourceEditor(patches={idms: {"spec": {"imageDigestMirrors": image_digest_mirrors}}}).update()
746-
else:
747-
LOGGER.info(f"Creating IDMS {KONFLUX_IDMS_NAME} with mirrors: {required_mirrors}")
748-
ImageDigestMirrorSet(
749-
name=KONFLUX_IDMS_NAME,
750-
image_digest_mirrors=image_digest_mirrors,
751-
teardown=False,
752-
).deploy(wait=True)
753-
754-
LOGGER.info("Wait for MCP update after IDMS modification.")
755-
wait_for_mcp_update_completion(
756-
machine_config_pools_list=machine_config_pools,
757-
initial_mcp_conditions=mcp_conditions,
758-
nodes=nodes,
759-
)
760-
761-
762-
def idms_has_all_mirrors(idms: ImageDigestMirrorSet, required_mirrors: list[str]) -> bool:
763-
"""Returns True if the IDMS already contains all required Konflux mirror entries."""
764-
source_entry = next(
765-
(entry for entry in idms.instance.spec.imageDigestMirrors if entry["source"] == KONFLUX_IDMS_SOURCE),
766-
None,
767-
)
768-
if not source_entry:
769-
return False
770-
existing_urls = {str(mirror) for mirror in source_entry["mirrors"]}
771-
return all(mirror in existing_urls for mirror in required_mirrors)

0 commit comments

Comments
 (0)