def load_ocp_version_config_file(self, ocp_upgrade_version): """ Loads config file to the ocs-ci config with upgrade version Args: ocp_upgrade_version (str): version to be upgraded """ version = Version.coerce(ocp_upgrade_version) short_ocp_upgrade_version = ".".join([str(version.major), str(version.minor)]) version_before_upgrade = parse_version( config.DEPLOYMENT.get("installer_version") ) version_post_upgrade = parse_version(ocp_upgrade_version) version_change = version_post_upgrade > version_before_upgrade if version_change: version_config_file = os.path.join( constants.OCP_VERSION_CONF_DIR, f"ocp-{short_ocp_upgrade_version}-config.yaml", ) logger.debug(f"config file to be loaded: {version_config_file}") load_config_file(version_config_file) else: logger.info( f"Upgrade version {version_post_upgrade} is not higher than old version:" f" {version_before_upgrade}, new config file will not be loaded" )
def load_version_config_file(self, upgrade_version): """ Loads config file to the ocs-ci config with upgrade version Args: upgrade_version: (str): version to be upgraded """ live_deployment = config.DEPLOYMENT["live_deployment"] upgrade_in_same_source = config.UPGRADE.get( "upgrade_in_current_source", False) version_change = self.get_parsed_versions( )[1] > self.get_parsed_versions()[0] # When upgrading to internal build of same version, we usually deploy from GAed (live) version. # In this case, we need to reload config to get internal must-gather image back to default. reload_config = (not version_change and live_deployment and not upgrade_in_same_source) if version_change or reload_config: version_config_file = os.path.join(constants.OCS_VERSION_CONF_DIR, f"ocs-{upgrade_version}.yaml") log.info( f"Reloading config file for OCS/ODF version: {upgrade_version}." ) load_config_file(version_config_file) else: log.info( f"Upgrade version {upgrade_version} is not higher than old version:" f" {self.version_before_upgrade}, config file will not be loaded" ) # For IBM ROKS cloud, there is no possibility to use internal build of must gather image. # If we are not testing the live upgrade, then we will need to change images to the upsream. ibm_cloud_platform = config.ENV_DATA[ "platform"] == constants.IBMCLOUD_PLATFORM use_upstream_mg_image = ibm_cloud_platform and not upgrade_in_same_source if (live_deployment and upgrade_in_same_source) or (ibm_cloud_platform and not use_upstream_mg_image): update_live_must_gather_image() elif use_upstream_mg_image: config.REPORTING[ "ocs_must_gather_image"] = MUST_GATHER_UPSTREAM_IMAGE config.REPORTING[ "ocs_must_gather_latest_tag"] = MUST_GATHER_UPSTREAM_TAG else: must_gather_image = config.REPORTING[ "default_ocs_must_gather_image"] must_gather_tag = config.REPORTING[ "default_ocs_must_gather_latest_tag"] log.info( f"Reloading to default must gather image: {must_gather_image}:{must_gather_tag}" ) config.REPORTING["ocs_must_gather_image"] = must_gather_image config.REPORTING["ocs_must_gather_latest_tag"] = must_gather_tag
def load_version_config_file(self, upgrade_version): """ Loads config file to the ocs-ci config with upgrade version Args: upgrade_version: (str): version to be upgraded """ live_deployment = config.DEPLOYMENT["live_deployment"] upgrade_in_same_source = config.UPGRADE.get( "upgrade_in_current_source", False) version_change = self.get_parsed_versions( )[1] > self.get_parsed_versions()[0] # When upgrading to internal build of same version, we usually deploy from GAed (live) version. # In this case, we need to reload config to get internal must-gather image back to default. reload_config = (not version_change and live_deployment and not upgrade_in_same_source) if version_change or reload_config: version_config_file = os.path.join(constants.OCS_VERSION_CONF_DIR, f"ocs-{upgrade_version}.yaml") log.info( f"Reloading config file for OCS/ODF version: {upgrade_version}." ) load_config_file(version_config_file) else: log.info( f"Upgrade version {upgrade_version} is not higher than old version:" f" {self.version_before_upgrade}, config file will not be loaded" ) overwrite_must_gather_image = config.REPORTING[ "overwrite_must_gather_image"] if live_deployment and upgrade_in_same_source and overwrite_must_gather_image: update_live_must_gather_image() else: if overwrite_must_gather_image: must_gather_image = config.REPORTING[ "default_ocs_must_gather_image"] must_gather_tag = config.REPORTING[ "default_ocs_must_gather_latest_tag"] log.info( f"Reloading to default must gather image: {must_gather_image}:{must_gather_tag}" ) config.REPORTING["ocs_must_gather_image"] = must_gather_image config.REPORTING[ "ocs_must_gather_latest_tag"] = must_gather_tag
def load_version_config_file(self, upgrade_version): """ Loads config file to the ocs-ci config with upgrade version Args: upgrade_version: (str): version to be upgraded """ version_change = self.get_parsed_versions()[1] > self.get_parsed_versions()[0] if version_change: version_config_file = os.path.join( constants.CONF_DIR, 'ocs_version', f'ocs-{upgrade_version}.yaml' ) load_config_file(version_config_file) else: log.info(f"Upgrade version {upgrade_version} is not higher than old version:" f" {self.version_before_upgrade}, config file will not be loaded")
def process_cluster_cli_params(config): """ Process cluster related cli parameters Args: config (pytest.config): Pytest config object Raises: ClusterPathNotProvidedError: If a cluster path is missing ClusterNameNotProvidedError: If a cluster name is missing ClusterNameLengthError: If a cluster name is too short or too long """ suffix = ocsci_config.cur_index + 1 if ocsci_config.multicluster else "" cluster_path = get_cli_param(config, f"cluster_path{suffix}") if not cluster_path: raise ClusterPathNotProvidedError() cluster_path = os.path.expanduser(cluster_path) if not os.path.exists(cluster_path): os.makedirs(cluster_path) # Importing here cause once the function is invoked we have already config # loaded, so this is OK to import once you sure that config is loaded. from ocs_ci.ocs.openshift_ops import OCP OCP.set_kubeconfig( os.path.join(cluster_path, ocsci_config.RUN["kubeconfig_location"]) ) ocsci_config.RUN["kubeconfig"] = os.path.join( cluster_path, ocsci_config.RUN["kubeconfig_location"] ) cluster_name = get_cli_param(config, f"cluster_name{suffix}") ocsci_config.RUN["cli_params"]["teardown"] = get_cli_param( config, "teardown", default=False ) ocsci_config.RUN["cli_params"]["deploy"] = get_cli_param( config, "deploy", default=False ) live_deployment = get_cli_param( config, "live_deploy", default=False ) or ocsci_config.DEPLOYMENT.get("live_deployment", False) ocsci_config.DEPLOYMENT["live_deployment"] = live_deployment if live_deployment: update_live_must_gather_image() io_in_bg = get_cli_param(config, "io_in_bg") if io_in_bg: ocsci_config.RUN["io_in_bg"] = True io_load = get_cli_param(config, "io_load") if io_load: ocsci_config.RUN["io_load"] = io_load log_utilization = get_cli_param(config, "log_cluster_utilization") if log_utilization: ocsci_config.RUN["log_utilization"] = True upgrade_ocs_version = get_cli_param(config, "upgrade_ocs_version") if upgrade_ocs_version: ocsci_config.UPGRADE["upgrade_ocs_version"] = upgrade_ocs_version ocs_registry_image = get_cli_param(config, f"ocs_registry_image{suffix}") if ocs_registry_image: ocsci_config.DEPLOYMENT["ocs_registry_image"] = ocs_registry_image upgrade_ocs_registry_image = get_cli_param(config, "upgrade_ocs_registry_image") if upgrade_ocs_registry_image: ocsci_config.UPGRADE["upgrade_ocs_registry_image"] = upgrade_ocs_registry_image ocsci_config.ENV_DATA["cluster_name"] = cluster_name ocsci_config.ENV_DATA["cluster_path"] = cluster_path get_cli_param(config, "collect-logs") if ocsci_config.RUN.get("cli_params").get("deploy"): if not cluster_name: raise ClusterNameNotProvidedError() if ( len(cluster_name) < CLUSTER_NAME_MIN_CHARACTERS or len(cluster_name) > CLUSTER_NAME_MAX_CHARACTERS ): raise ClusterNameLengthError(cluster_name) elif not cluster_name: try: ocsci_config.ENV_DATA["cluster_name"] = get_cluster_name(cluster_path) except FileNotFoundError: raise ClusterNameNotProvidedError() if get_cli_param(config, "email") and not get_cli_param(config, "--html"): pytest.exit("--html option must be provided to send email reports") get_cli_param(config, "squad_analysis") get_cli_param(config, "-m") osd_size = get_cli_param(config, "--osd-size") if osd_size: ocsci_config.ENV_DATA["device_size"] = osd_size ocp_version = get_cli_param(config, "--ocp-version") if ocp_version: version_config_file = f"ocp-{ocp_version}-config.yaml" version_config_file_path = os.path.join( OCP_VERSION_CONF_DIR, version_config_file ) load_config_file(version_config_file_path) upgrade_ocp_version = get_cli_param(config, "--upgrade-ocp-version") if upgrade_ocp_version: version_config_file = f"ocp-{upgrade_ocp_version}-upgrade.yaml" version_config_file_path = os.path.join( OCP_VERSION_CONF_DIR, version_config_file ) load_config_file(version_config_file_path) upgrade_ocp_image = get_cli_param(config, "--upgrade-ocp-image") if upgrade_ocp_image: ocp_image = upgrade_ocp_image.rsplit(":", 1) ocsci_config.UPGRADE["ocp_upgrade_path"] = ocp_image[0] ocsci_config.UPGRADE["ocp_upgrade_version"] = ocp_image[1] ocp_installer_version = get_cli_param(config, "--ocp-installer-version") if ocp_installer_version: ocsci_config.DEPLOYMENT["installer_version"] = ocp_installer_version ocsci_config.RUN["client_version"] = ocp_installer_version csv_change = get_cli_param(config, "--csv-change") if csv_change: csv_change = csv_change.split("::") ocsci_config.DEPLOYMENT["csv_change_from"] = csv_change[0] ocsci_config.DEPLOYMENT["csv_change_to"] = csv_change[1] collect_logs_on_success_run = get_cli_param(config, "collect_logs_on_success_run") if collect_logs_on_success_run: ocsci_config.REPORTING["collect_logs_on_success_run"] = True get_cli_param(config, "dev_mode") ceph_debug = get_cli_param(config, "ceph_debug") if ceph_debug: ocsci_config.DEPLOYMENT["ceph_debug"] = True skip_download_client = get_cli_param(config, "skip_download_client") if skip_download_client: ocsci_config.DEPLOYMENT["skip_download_client"] = True re_trigger_failed_tests = get_cli_param(config, "--re-trigger-failed-tests") if re_trigger_failed_tests: ocsci_config.RUN["re_trigger_failed_tests"] = os.path.expanduser( re_trigger_failed_tests )
def process_cluster_cli_params(config): """ Process cluster related cli parameters Args: config (pytest.config): Pytest config object Raises: ClusterPathNotProvidedError: If a cluster path is missing ClusterNameNotProvidedError: If a cluster name is missing ClusterNameLengthError: If a cluster name is too short or too long """ cluster_path = get_cli_param(config, 'cluster_path') if not cluster_path: raise ClusterPathNotProvidedError() cluster_path = os.path.expanduser(cluster_path) if not os.path.exists(cluster_path): os.makedirs(cluster_path) # Importing here cause once the function is invoked we have already config # loaded, so this is OK to import once you sure that config is loaded. from ocs_ci.ocs.openshift_ops import OCP OCP.set_kubeconfig( os.path.join(cluster_path, ocsci_config.RUN['kubeconfig_location'])) cluster_name = get_cli_param(config, 'cluster_name') ocsci_config.RUN['cli_params']['teardown'] = get_cli_param(config, "teardown", default=False) ocsci_config.RUN['cli_params']['deploy'] = get_cli_param(config, "deploy", default=False) live_deployment = get_cli_param(config, "live_deploy", default=False) ocsci_config.DEPLOYMENT['live_deployment'] = live_deployment or ( ocsci_config.DEPLOYMENT.get('live_deployment', False)) io_in_bg = get_cli_param(config, 'io_in_bg') if io_in_bg: ocsci_config.RUN['io_in_bg'] = True io_load = get_cli_param(config, 'io_load') if io_load: ocsci_config.RUN['io_load'] = io_load log_utilization = get_cli_param(config, 'log_cluster_utilization') if log_utilization: ocsci_config.RUN['log_utilization'] = True upgrade_ocs_version = get_cli_param(config, "upgrade_ocs_version") if upgrade_ocs_version: ocsci_config.UPGRADE['upgrade_ocs_version'] = upgrade_ocs_version ocs_registry_image = get_cli_param(config, "ocs_registry_image") if ocs_registry_image: ocsci_config.DEPLOYMENT['ocs_registry_image'] = ocs_registry_image upgrade_ocs_registry_image = get_cli_param(config, "upgrade_ocs_registry_image") if upgrade_ocs_registry_image: ocsci_config.UPGRADE[ 'upgrade_ocs_registry_image'] = upgrade_ocs_registry_image ocsci_config.ENV_DATA['cluster_name'] = cluster_name ocsci_config.ENV_DATA['cluster_path'] = cluster_path get_cli_param(config, 'collect-logs') if ocsci_config.RUN.get("cli_params").get("deploy"): if not cluster_name: raise ClusterNameNotProvidedError() if (len(cluster_name) < CLUSTER_NAME_MIN_CHARACTERS or len(cluster_name) > CLUSTER_NAME_MAX_CHARACTERS): raise ClusterNameLengthError(cluster_name) elif not cluster_name: try: ocsci_config.ENV_DATA['cluster_name'] = get_cluster_name( cluster_path) except FileNotFoundError: raise ClusterNameNotProvidedError() if get_cli_param(config, 'email') and not get_cli_param(config, '--html'): pytest.exit("--html option must be provided to send email reports") get_cli_param(config, 'squad_analysis') get_cli_param(config, '-m') osd_size = get_cli_param(config, '--osd-size') if osd_size: ocsci_config.ENV_DATA['device_size'] = osd_size ocp_version = get_cli_param(config, '--ocp-version') if ocp_version: version_config_file = f"ocp-{ocp_version}-config.yaml" version_config_file_path = os.path.join(OCP_VERSION_CONF_DIR, version_config_file) load_config_file(version_config_file_path) ocp_installer_version = get_cli_param(config, '--ocp-installer-version') if ocp_installer_version: ocsci_config.DEPLOYMENT['installer_version'] = ocp_installer_version ocsci_config.RUN['client_version'] = ocp_installer_version csv_change = get_cli_param(config, '--csv-change') if csv_change: csv_change = csv_change.split("::") ocsci_config.DEPLOYMENT['csv_change_from'] = csv_change[0] ocsci_config.DEPLOYMENT['csv_change_to'] = csv_change[1] collect_logs_on_success_run = get_cli_param(config, 'collect_logs_on_success_run') if collect_logs_on_success_run: ocsci_config.REPORTING['collect_logs_on_success_run'] = True
def test_upgrade(): ceph_cluster = CephCluster() with CephHealthMonitor(ceph_cluster): namespace = config.ENV_DATA['cluster_namespace'] version_before_upgrade = config.ENV_DATA.get("ocs_version") upgrade_version = config.UPGRADE.get("upgrade_ocs_version", version_before_upgrade) ocs_registry_image = config.UPGRADE.get('upgrade_ocs_registry_image') if ocs_registry_image: upgrade_version = get_ocs_version_from_image(ocs_registry_image) parsed_version_before_upgrade = parse_version(version_before_upgrade) parsed_upgrade_version = parse_version(upgrade_version) assert parsed_upgrade_version >= parsed_version_before_upgrade, ( f"Version you would like to upgrade to: {upgrade_version} " f"is not higher or equal to the version you currently running: " f"{version_before_upgrade}") operator_selector = get_selector_for_ocs_operator() package_manifest = PackageManifest( resource_name=OCS_OPERATOR_NAME, selector=operator_selector, ) channel = config.DEPLOYMENT.get('ocs_csv_channel') csv_name_pre_upgrade = package_manifest.get_current_csv(channel) log.info(f"CSV name before upgrade is: {csv_name_pre_upgrade}") csv_pre_upgrade = CSV(resource_name=csv_name_pre_upgrade, namespace=namespace) pre_upgrade_images = get_images(csv_pre_upgrade.get()) version_change = parsed_upgrade_version > parsed_version_before_upgrade if version_change: version_config_file = os.path.join(constants.CONF_DIR, 'ocs_version', f'ocs-{upgrade_version}.yaml') load_config_file(version_config_file) ocs_catalog = CatalogSource( resource_name=constants.OPERATOR_CATALOG_SOURCE_NAME, namespace=constants.MARKETPLACE_NAMESPACE, ) upgrade_in_current_source = config.UPGRADE.get( 'upgrade_in_current_source', False) if not upgrade_in_current_source: if not ocs_catalog.is_exist() and not upgrade_in_current_source: log.info("OCS catalog source doesn't exist. Creating new one.") create_catalog_source(ocs_registry_image, ignore_upgrade=True) image_url = ocs_catalog.get_image_url() image_tag = ocs_catalog.get_image_name() log.info(f"Current image is: {image_url}, tag: {image_tag}") if ocs_registry_image: image_url, new_image_tag = ocs_registry_image.split(':') elif (config.UPGRADE.get('upgrade_to_latest', True) or version_change): new_image_tag = get_latest_ds_olm_tag() else: new_image_tag = get_next_version_available_for_upgrade( image_tag) cs_data = deepcopy(ocs_catalog.data) image_for_upgrade = ':'.join([image_url, new_image_tag]) log.info(f"Image: {image_for_upgrade} will be used for upgrade.") cs_data['spec']['image'] = image_for_upgrade with NamedTemporaryFile() as cs_yaml: dump_data_to_temp_yaml(cs_data, cs_yaml.name) ocs_catalog.apply(cs_yaml.name) # Wait for the new package manifest for upgrade. operator_selector = get_selector_for_ocs_operator() package_manifest = PackageManifest( resource_name=OCS_OPERATOR_NAME, selector=operator_selector, ) package_manifest.wait_for_resource() channel = config.DEPLOYMENT.get('ocs_csv_channel') if not channel: channel = package_manifest.get_default_channel() # update subscription subscription = OCP( resource_name=constants.OCS_SUBSCRIPTION, kind='subscription', namespace=config.ENV_DATA['cluster_namespace'], ) current_ocs_source = subscription.data['spec']['source'] log.info(f"Current OCS subscription source: {current_ocs_source}") ocs_source = current_ocs_source if upgrade_in_current_source else ( constants.OPERATOR_CATALOG_SOURCE_NAME) patch_subscription_cmd = ( f'oc patch subscription {constants.OCS_SUBSCRIPTION} ' f'-n {namespace} --type merge -p \'{{"spec":{{"channel": ' f'"{channel}", "source": "{ocs_source}"}}}}\'') run_cmd(patch_subscription_cmd) subscription_plan_approval = config.DEPLOYMENT.get( 'subscription_plan_approval') if subscription_plan_approval == 'Manual': wait_for_install_plan_and_approve(namespace) attempts = 145 for attempt in range(1, attempts + 1): log.info(f"Attempt {attempt}/{attempts} to check CSV upgraded.") csv_name_post_upgrade = package_manifest.get_current_csv(channel) if csv_name_post_upgrade == csv_name_pre_upgrade: log.info(f"CSV is still: {csv_name_post_upgrade}") sleep(5) else: log.info(f"CSV now upgraded to: {csv_name_post_upgrade}") break if attempts == attempt: raise TimeoutException("No new CSV found after upgrade!") csv_post_upgrade = CSV(resource_name=csv_name_post_upgrade, namespace=namespace) log.info( f"Waiting for CSV {csv_name_post_upgrade} to be in succeeded state" ) if version_before_upgrade == '4.2' and upgrade_version == '4.3': log.info("Force creating Ceph toolbox after upgrade 4.2 -> 4.3") setup_ceph_toolbox(force_setup=True) osd_count = get_osd_count() csv_post_upgrade.wait_for_phase("Succeeded", timeout=200 * osd_count) post_upgrade_images = get_images(csv_post_upgrade.get()) old_images, _, _ = get_upgrade_image_info(pre_upgrade_images, post_upgrade_images) verify_image_versions(old_images, parsed_upgrade_version) ocs_install_verification( timeout=600, skip_osd_distribution_check=True, ocs_registry_image=ocs_registry_image, post_upgrade_verification=True, )