ACM and Submariner Auto-Configuration
Summary
This document describes the automatic configuration mechanism for ACM and Submariner deployment in the ocs-ci test framework. The implementation eliminates manual version configuration by automatically determining component version based on the OpenShift Container Platform (OCP) version.
Related Changes:
Repository |
Link |
|---|---|
GitHub PR |
|
GitLab MR |
Main Commit: d29e833fe — Auto-configure ACM and Submariner based on OCP version
Backported to: release-4.16 through release-4.21
Problem
Prior to this change, ACM and Submariner configuration required manual specification of these values:
acm_hub_unreleased— Boolean flag for ACM release statusRELEASED_OR_UNRELEASED_ACM — String value (“released”or”unreleased”`)UPSTREAM_OR_DOWNSTREAM_SUBMARINER— String value ("Upstream"or"Downstream")submariner_source— String value ("Downstream")submariner_release_type - String value (
"released"or"unreleased")
These values were hardcoded in multiple OCP version-specific configuration files, causing:
Configuration inconsistencies across test runs
Maintenance overhead every time a new OCP version was introduced
Risk of version mismatches between OCP and its components
Solution
Architecture
The solution introduces a version mapping system with two components:
Centralized Version Mappings — Static dictionaries in
ocs_ci/ocs/defaults.pymapping OCP versions to component release statusAuto-Configuration Functions — Runtime logic in
ocs_ci/utility/utils.pythat reads these mappings duringpytestinitialization
Version Mappings
File: ocs_ci/ocs/defaults.py
ocp_to_acm_unreleased_mapping = {
"4.14": False,
"4.15": False,
"4.16": False,
"4.17": False,
"4.18": False,
"4.19": False,
"4.20": False,
"4.21": False,
"4.22": True,
"4.23": True,
}
ocp_to_submariner_unreleased_mapping = {
"4.14": False,
"4.15": False,
"4.16": False,
"4.17": False,
"4.18": False,
"4.19": False,
"4.20": False,
"4.21": False,
"4.22": False,
"4.23": True,
}
Mapping semantics:
False= Released / GA versionTrue= Unreleased / development versionUnmapped versions default to
True(conservative fallback)
NOTE: In Future, maintainers will only need to create MR changing these values True to False based on the GA’ed versions. E.g 4.23 has to be False once they GA the ACM and Submariner Versions used.
Auto-Configuration Functions
File: ocs_ci/utility/utils.py
auto_configure_acm()
Configures config.ENV_DATA["acm_hub_unreleased"] based on OCP version.
Execution order:
Skip if
acm_hub_unreleasedis already set (user override respected)Retrieve OCP version via
get_semantic_ocp_version_from_config()Look up version in
ocp_to_acm_unreleased_mappingDefault to
Trueif version is not foundSet config value and log the decision
auto_configure_submariner()
Configures config.ENV_DATA["submariner_release_type"] and submariner_source.
Execution order:
Set
submariner_sourceto"downstream"if not already setSkip if
submariner_release_typeis already set (user override respected)Retrieve OCP version via
get_semantic_ocp_version_from_config()Look up version in
ocp_to_submariner_unreleased_mappingDefault to
Trueif version is not foundConvert boolean to string:
True→"unreleased",False→"released"Set config value and log the decision
Integration Point
File: ocs_ci/framework/pytest_customization/ocscilib.py
def pytest_configure(config):
# ... existing initialization ...
if not (config.getoption("--help") or config.getoption("collectonly")):
process_cluster_cli_params(config)
auto_configure_acm() # ACM configuration
auto_configure_submariner() # Submariner configuration
# ... deployment configuration loading ...
Both functions execute after CLI parameter processing and before deployment configuration loading, ensuring the values are available for the entire test session.
Configuration Templates Added
Two new YAML config files support released deployments:
conf/ocsci/acm_hub_released_deploy.yaml
ENV_DATA:
deploy_acm_hub_cluster: true
skip_ocs_deployment: true
acm_hub_unreleased: false
conf/ocsci/submariner_downstream_released.yaml
ENV_DATA:
submariner_source: "downstream"
submariner_release_type: "released"
submariner_channel: ""
subctl_version: "subctl-rhel9:v0.23"
Hardcoded Values Removed
File |
Removed Keys |
|---|---|
|
|
|
|
|
|
Configuration Flow
Test Start
│
▼
pytest_configure()
│
▼
process_cluster_cli_params()
│
▼
auto_configure_acm()
├─ User override set? → Skip
├─ Get OCP version
├─ Lookup ocp_to_acm_unreleased_mapping
└─ Set config.ENV_DATA["acm_hub_unreleased"] + log
│
▼
auto_configure_submariner()
├─ Set default source = "downstream"
├─ User override set? → Skip
├─ Get OCP version
├─ Lookup ocp_to_submariner_unreleased_mapping
└─ Set config.ENV_DATA["submariner_release_type"] + log
│
▼
Load deployment configs
│
▼
Deploy clusters → Execute tests
Usage
Default Behavior
No configuration required. The system automatically detects OCP version and sets the correct values.
Example log output:
INFO: OCP 4.21 → ACM: RELEASED
INFO: OCP 4.21 → Submariner: RELEASED
User Overrides
Explicit values in config files are always respected and skip auto-configuration.
ENV_DATA:
acm_hub_unreleased: true
submariner_release_type: "unreleased"
Log output:
INFO: ACM explicitly configured: acm_hub_unreleased=True
INFO: Submariner explicitly configured: release_type=unreleased
Unknown OCP Versions
Unmapped versions default to unreleased as a safe fallback.
INFO: OCP 4.25 not in mapping → ACM: UNRELEASED (safe default)
INFO: OCP 4.25 not in mapping → Submariner: UNRELEASED (safe default)
Testing Matrix
OCP Version |
ACM Status |
Submariner Status |
Source |
|---|---|---|---|
4.14 – 4.21 |
Released |
Released |
Auto-configured |
4.22 |
Unreleased |
Released |
Auto-configured |
4.23+ |
Unreleased |
Unreleased |
Auto-configured |
Unknown |
Unreleased |
Unreleased |
Default fallback |
Any |
User-specified |
User-specified |
Explicit override |
Maintenance
Adding a New OCP Version
Update both mappings in ocs_ci/ocs/defaults.py:
ocp_to_acm_unreleased_mapping = {
# ... existing entries ...
"4.24": True, # Initially unreleased
}
ocp_to_submariner_unreleased_mapping = {
# ... existing entries ...
"4.24": True, # Initially unreleased
}
No changes required in any OCP version-specific config files.
Marking a Version as Released (GA)
Change the mapping value to False when the component reaches GA:
ocp_to_acm_unreleased_mapping = {
# ... existing entries ...
"4.23": False, # Updated when ACM 2.x GA'd
}
Troubleshooting
Auto-configuration not applied
Verify no explicit override exists in config files or CLI
Check pytest init logs for auto-configuration messages
Confirm
pytest_configure()is executing
Wrong component version used
Check logs for the detected OCP version
Confirm the correct mapping entry in
ocs_ci/ocs/defaults.pyUpdate mapping if value is incorrect for the given OCP version
Unmapped OCP version
Log will show:
"not in mapping → UNRELEASED (safe default)"Add the OCP version to both mappings in
defaults.pywith the correctTrue/FalsevalueSubmit a PR with the mapping update
Author: Deepanjan Acharya — July 2026