From 3106ab238d8c55938399ea35ec9f4e4ca3c9fa54 Mon Sep 17 00:00:00 2001 From: oviner Date: Mon, 17 Jun 2024 15:00:34 +0300 Subject: [PATCH] Version details for all DR components Signed-off-by: oviner --- ocs_ci/framework/__init__.py | 27 ++++++++ ocs_ci/ocs/constants.py | 1 + ocs_ci/ocs/resources/ocs.py | 46 +++++++++++++- ocs_ci/ocs/utils.py | 11 ++++ ocs_ci/utility/utils.py | 6 +- ocs_ci/utility/version.py | 119 +++++++++++++++++++++++++++++++++++ tests/conftest.py | 54 ++++++++++++++++ 7 files changed, 260 insertions(+), 4 deletions(-) diff --git a/ocs_ci/framework/__init__.py b/ocs_ci/framework/__init__.py index 18e73ffbf34..4e61f85c14f 100644 --- a/ocs_ci/framework/__init__.py +++ b/ocs_ci/framework/__init__.py @@ -451,6 +451,33 @@ def switch_to_cluster_by_cluster_type(self, cluster_type, num_of_cluster=0): self.get_cluster_type_indices_list(cluster_type)[num_of_cluster] ) + class RunWithConfigContext(object): + def __init__(self, config_index): + self.original_config_index = config.cur_index + self.config_index = config_index + + def __enter__(self): + config.switch_ctx(self.config_index) + return self + + def __exit__(self, exc_type, exc_value, exc_traceback): + config.switch_ctx(self.original_config_index) + + class RunWithAcmConfigContext(RunWithConfigContext): + def __init__(self): + from ocs_ci.ocs.utils import get_all_acm_indexes + + acm_index = get_all_acm_indexes()[0] + super().__init__(acm_index) + + class RunWithPrimaryConfigContext(RunWithConfigContext): + def __init__(self): + from ocs_ci.ocs.utils import get_primary_cluster_config + + primary_config = get_primary_cluster_config() + primary_index = primary_config.MULTICLUSTER.get("multicluster_index") + super().__init__(primary_index) + config = MultiClusterConfig() diff --git a/ocs_ci/ocs/constants.py b/ocs_ci/ocs/constants.py index ed110225f83..35904779fc1 100644 --- a/ocs_ci/ocs/constants.py +++ b/ocs_ci/ocs/constants.py @@ -249,6 +249,7 @@ TEST_FILES_BUCKET = "ocsci-test-files" ROOK_REPOSITORY = "https://github.com/rook/rook.git" OPENSHIFT_STORAGE_NAMESPACE = "openshift-storage" +OPENSHIFT_NAMESPACE = "openshift" OPENSHIFT_STORAGE_CLIENT_NAMESPACE = "openshift-storage-client" OPENSHIFT_STORAGE_EXTENDED_NAMESPACE = "openshift-storage-extended" OPENSHIFT_STORAGE_CLIENT_NAMESPACE = "openshift-storage-client" diff --git a/ocs_ci/ocs/resources/ocs.py b/ocs_ci/ocs/resources/ocs.py index aff3600ce5e..ef60fb26caf 100644 --- a/ocs_ci/ocs/resources/ocs.py +++ b/ocs_ci/ocs/resources/ocs.py @@ -17,7 +17,15 @@ from ocs_ci.ocs.exceptions import CSVNotFound from ocs_ci.utility import templating, utils from ocs_ci.utility.version import get_semantic_ocs_version_from_config, VERSION_4_9 - +from ocs_ci.utility.version import ( + get_dr_hub_operator_version, + get_ocp_dr_cluster_operator_version, + get_odf_multicluster_orchestrator_version, + get_ocp_gitops_operator_version, + get_submariner_operator_version, + get_volsync_operator_version, +) +from ocs_ci.utility.utils import get_oadp_version, get_acm_version log = logging.getLogger(__name__) @@ -205,6 +213,42 @@ def get_version_info(namespace=None): csv_name = package_manifest.get_current_csv(channel) csv_pre = CSV(resource_name=csv_name, namespace=namespace) info = get_images(csv_pre.get()) + from ocs_ci.ocs.utils import is_dr_scenario + + if is_dr_scenario(): + with config.RunWithAcmConfigContext(): + acm_operator_version = get_acm_version() + if acm_operator_version: + info["acm_version"] = acm_operator_version + ocp_dr_hub_operator_version = get_dr_hub_operator_version() + if ocp_dr_hub_operator_version: + info["dr_hub_version"] = ocp_dr_hub_operator_version + odf_multicluster_orchestrator_version = ( + get_odf_multicluster_orchestrator_version() + ) + if odf_multicluster_orchestrator_version: + info[ + "odf_multicluster_orchestrator_version" + ] = odf_multicluster_orchestrator_version + gitops_operator_version = get_ocp_gitops_operator_version() + if gitops_operator_version: + info["gitops_version"] = gitops_operator_version + with config.RunWithPrimaryConfigContext(): + oadp_operator_version = get_oadp_version() + if oadp_operator_version: + info["oadp_version"] = oadp_operator_version + ocp_dr_cluster_operator_version = get_ocp_dr_cluster_operator_version() + if ocp_dr_cluster_operator_version: + info["ocp_dr_cluster_version"] = ocp_dr_cluster_operator_version + gitops_operator_version = get_ocp_gitops_operator_version() + if gitops_operator_version: + info["gitops_version"] = gitops_operator_version + volsync_operator_version = get_volsync_operator_version() + if volsync_operator_version: + info["volsync_version"] = volsync_operator_version + submariner_operator_version = get_submariner_operator_version() + if submariner_operator_version: + info["submariner_version"] = submariner_operator_version return info diff --git a/ocs_ci/ocs/utils.py b/ocs_ci/ocs/utils.py index 3aa380d64a5..8ae455ae545 100644 --- a/ocs_ci/ocs/utils.py +++ b/ocs_ci/ocs/utils.py @@ -1681,3 +1681,14 @@ def collect_pod_container_rpm_package(dir_name): go_log_file_name = f"{package_log_dir_path}/{pod_obj.name}-{container_name}-go-version.log" with open(go_log_file_name, "w") as f: f.write(go_output) + + +def is_dr_scenario(): + """ + Check if it is RDR or MDR setup + + Returns: + bool: return True if it is rdr or mdr setup otherwise False + + """ + return ocsci_config.MULTICLUSTER["multicluster_mode"] in ("metro-dr", "regional-dr") diff --git a/ocs_ci/utility/utils.py b/ocs_ci/utility/utils.py index 605f9e2feb9..bfd5a473208 100644 --- a/ocs_ci/utility/utils.py +++ b/ocs_ci/utility/utils.py @@ -4824,7 +4824,7 @@ def add_time_report_to_email(session, soup): summary_tag.insert_after(time_div) -def get_oadp_version(namespace=constants.ACM_HUB_BACKUP_NAMESPACE): +def get_oadp_version(namespace=constants.OADP_NAMESPACE): """ Returns: str: returns version string @@ -4839,7 +4839,7 @@ def get_oadp_version(namespace=constants.ACM_HUB_BACKUP_NAMESPACE): return csv["spec"]["version"] -def get_acm_version(): +def get_acm_version(namespace=constants.ACM_HUB_NAMESPACE): """ Get ACM version from CSV @@ -4850,7 +4850,7 @@ def get_acm_version(): from ocs_ci.ocs.resources.csv import get_csvs_start_with_prefix csv_list = get_csvs_start_with_prefix( - "advanced-cluster-management", namespace=constants.ACM_HUB_NAMESPACE + "advanced-cluster-management", namespace=namespace ) for csv in csv_list: if "advanced-cluster-management" in csv["metadata"]["name"]: diff --git a/ocs_ci/utility/version.py b/ocs_ci/utility/version.py index 93093504a49..d48f783a02d 100644 --- a/ocs_ci/utility/version.py +++ b/ocs_ci/utility/version.py @@ -9,6 +9,7 @@ from ocs_ci.framework import config from ocs_ci.ocs import defaults from ocs_ci.ocs.exceptions import WrongVersionExpression +from ocs_ci.ocs import constants def get_semantic_version( @@ -172,3 +173,121 @@ def get_previous_version(version, count=1): new_minor = version.minor - count previous_version = f"{version.major}.{new_minor}" return previous_version + + +def get_dr_hub_operator_version(namespace=constants.OPENSHIFT_NAMESPACE): + """ + Get DR Hub Operator Version + + Returns: + str: returns version string + + """ + # Importing here to avoid circular dependency + from ocs_ci.ocs.resources.csv import get_csvs_start_with_prefix + + csv_list = get_csvs_start_with_prefix( + constants.ACM_ODR_HUB_OPERATOR_RESOURCE, namespace=namespace + ) + for csv in csv_list: + if constants.ACM_ODR_HUB_OPERATOR_RESOURCE in csv["metadata"]["name"]: + # extract version string + return csv["spec"]["version"] + + +def get_ocp_dr_cluster_operator_version(namespace=constants.OPENSHIFT_NAMESPACE): + """ + Get DR Hub Operator Version + + Returns: + str: returns version string + + """ + # Importing here to avoid circular dependency + from ocs_ci.ocs.resources.csv import get_csvs_start_with_prefix + + csv_list = get_csvs_start_with_prefix("odr-cluster-operator", namespace=namespace) + for csv in csv_list: + if "odr-cluster-operator" in csv["metadata"]["name"]: + # extract version string + return csv["spec"]["version"] + + +def get_odf_multicluster_orchestrator_version(namespace=constants.ACM_HUB_NAMESPACE): + """ + Get ODF Multicluster Orchestrator Version + + Returns: + str: returns version string + + """ + # Importing here to avoid circular dependency + from ocs_ci.ocs.resources.csv import get_csvs_start_with_prefix + + csv_list = get_csvs_start_with_prefix( + constants.ACM_ODF_MULTICLUSTER_ORCHESTRATOR_RESOURCE, + namespace=namespace, + ) + for csv in csv_list: + if ( + constants.ACM_ODF_MULTICLUSTER_ORCHESTRATOR_RESOURCE + in csv["metadata"]["name"] + ): + # extract version string + return csv["spec"]["version"] + + +def get_ocp_gitops_operator_version(namespace=constants.OPENSHIFT_NAMESPACE): + """ + Get OCP Gitops Operator Version + + Returns: + str: returns version string + + """ + # Importing here to avoid circular dependency + from ocs_ci.ocs.resources.csv import get_csvs_start_with_prefix + + csv_list = get_csvs_start_with_prefix( + "openshift-gitops-operator", namespace=namespace + ) + for csv in csv_list: + if "openshift-gitops-operator" in csv["metadata"]["name"]: + # extract version string + return csv["spec"]["version"] + + +def get_submariner_operator_version(namespace=constants.SUBMARINER_OPERATOR_NAMESPACE): + """ + Get Submariner Operator Version + + Returns: + str: returns version string + + """ + # Importing here to avoid circular dependency + from ocs_ci.ocs.resources.csv import get_csvs_start_with_prefix + + csv_list = get_csvs_start_with_prefix("submariner", namespace=namespace) + for csv in csv_list: + if "submariner" in csv["metadata"]["name"]: + # extract version string + return csv["spec"]["version"] + + +def get_volsync_operator_version(namespace=constants.SUBMARINER_OPERATOR_NAMESPACE): + """ + Get VolSync Operator Version + + Returns: + str: returns version string + + """ + # Importing here to avoid circular dependency + from ocs_ci.ocs.resources.csv import get_csvs_start_with_prefix + + csv_list = get_csvs_start_with_prefix("volsync", namespace=namespace) + for csv in csv_list: + if "volsync" in csv["metadata"]["name"]: + # extract version string + return csv["spec"]["version"] diff --git a/tests/conftest.py b/tests/conftest.py index ce8cbf64a7d..6540b5ffca6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -65,6 +65,7 @@ setup_ceph_toolbox, collect_ocs_logs, collect_pod_container_rpm_package, + is_dr_scenario, ) from ocs_ci.ocs.resources.deployment import Deployment from ocs_ci.ocs.resources.job import get_job_obj @@ -146,6 +147,8 @@ skipif_ui_not_support, run_cmd, ceph_health_check_multi_storagecluster_external, + get_oadp_version, + get_acm_version, ) from ocs_ci.helpers import helpers, dr_helpers from ocs_ci.helpers.helpers import ( @@ -171,6 +174,14 @@ ) from ocs_ci.ocs.longevity import start_app_workload from ocs_ci.utility.decorators import switch_to_default_cluster_index_at_last +from ocs_ci.utility.version import ( + get_dr_hub_operator_version, + get_ocp_dr_cluster_operator_version, + get_odf_multicluster_orchestrator_version, + get_ocp_gitops_operator_version, + get_submariner_operator_version, + get_volsync_operator_version, +) log = logging.getLogger(__name__) @@ -1592,6 +1603,49 @@ def additional_testsuite_properties(record_testsuite_property, pytestconfig): # add markers as separated property markers = ocsci_config.RUN["cli_params"].get("-m", "").replace(" ", "-") record_testsuite_property("rp_markers", markers) + if is_dr_scenario(): + with ocsci_config.RunWithAcmConfigContext(): + acm_operator_version = get_acm_version() + if acm_operator_version: + record_testsuite_property("rp_acm_version", acm_operator_version) + ocp_dr_hub_operator_version = get_dr_hub_operator_version() + if ocp_dr_hub_operator_version: + record_testsuite_property( + "rp_dr_hub_version", ocp_dr_hub_operator_version + ) + odf_multicluster_orchestrator_version = ( + get_odf_multicluster_orchestrator_version() + ) + if odf_multicluster_orchestrator_version: + record_testsuite_property( + "rp_odf_multicluster_orchestrator_version", + odf_multicluster_orchestrator_version, + ) + gitops_operator_version = get_ocp_gitops_operator_version() + if gitops_operator_version: + record_testsuite_property("rp_gitops_version", gitops_operator_version) + with ocsci_config.RunWithPrimaryConfigContext(): + oadp_operator_version = get_oadp_version() + if oadp_operator_version: + record_testsuite_property("rp_oadp_version", oadp_operator_version) + ocp_dr_cluster_operator_version = get_ocp_dr_cluster_operator_version() + if ocp_dr_cluster_operator_version: + record_testsuite_property( + "rp_ocp_dr_cluster_version", ocp_dr_cluster_operator_version + ) + gitops_operator_version = get_ocp_gitops_operator_version() + if gitops_operator_version: + record_testsuite_property("rp_gitops_version", gitops_operator_version) + volsync_operator_version = get_volsync_operator_version() + if volsync_operator_version: + record_testsuite_property( + "rp_volsync_version", volsync_operator_version + ) + submariner_operator_version = get_submariner_operator_version() + if submariner_operator_version: + record_testsuite_property( + "rp_submariner_version", submariner_operator_version + ) @pytest.fixture(scope="session")