From 2958dffb2807e1cae01fc22754f6da4314ebf7a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20He=C4=8Dko?= Date: Thu, 26 May 2022 11:30:23 +0200 Subject: [PATCH 36/39] Handle 7 to 8 IPUs on Google Cloud (#897) * Handle upgrades on google cloud * Fix "switch" typo Co-authored-by: Irina Gulina Co-authored-by: Michal Hecko Co-authored-by: Michal Reznik (mreznik) Co-authored-by: Irina Gulina --- .../common/actors/cloud/checkrhui/actor.py | 28 +++++++++++++++++-- .../libraries/peseventsscanner_repomap.py | 15 +++++----- .../actors/redhatsignedrpmscanner/actor.py | 19 ++++++------- .../libraries/setuptargetrepos_repomap.py | 15 +++++----- repos/system_upgrade/common/libraries/rhui.py | 24 ++++++++++++++++ .../common/models/repositoriesmap.py | 9 +++--- 6 files changed, 78 insertions(+), 32 deletions(-) diff --git a/repos/system_upgrade/common/actors/cloud/checkrhui/actor.py b/repos/system_upgrade/common/actors/cloud/checkrhui/actor.py index df055f94..552cde54 100644 --- a/repos/system_upgrade/common/actors/cloud/checkrhui/actor.py +++ b/repos/system_upgrade/common/actors/cloud/checkrhui/actor.py @@ -1,14 +1,19 @@ +import os + from leapp import reporting from leapp.actors import Actor from leapp.libraries.common import rhsm, rhui from leapp.libraries.common.rpms import has_package +from leapp.libraries.stdlib import api from leapp.models import ( + CopyFile, DNFPluginTask, InstalledRPM, KernelCmdlineArg, RequiredTargetUserspacePackages, RHUIInfo, - RpmTransactionTasks + RpmTransactionTasks, + TargetUserSpacePreupgradeTasks ) from leapp.reporting import create_report, Report from leapp.tags import FactsPhaseTag, IPUWorkflowTag @@ -28,6 +33,8 @@ class CheckRHUI(Actor): RequiredTargetUserspacePackages, Report, DNFPluginTask, RpmTransactionTasks, + TargetUserSpacePreupgradeTasks, + CopyFile, ) tags = (FactsPhaseTag, IPUWorkflowTag) @@ -44,6 +51,16 @@ class CheckRHUI(Actor): is_azure_sap = True provider = 'azure-sap' info = rhui.RHUI_CLOUD_MAP[upg_path]['azure-sap'] + + if provider.startswith('google'): + rhui_dir = api.get_common_folder_path('rhui') + repofile = os.path.join(rhui_dir, provider, 'leapp-{}.repo'.format(provider)) + api.produce( + TargetUserSpacePreupgradeTasks( + copy_files=[CopyFile(src=repofile, dst='/etc/yum.repos.d/leapp-google-copied.repo')] + ) + ) + if not rhsm.skip_rhsm(): create_report([ reporting.Title('Upgrade initiated with RHSM on public cloud with RHUI infrastructure'), @@ -56,7 +73,9 @@ class CheckRHUI(Actor): reporting.Tags([reporting.Tags.PUBLIC_CLOUD]), ]) return - # AWS RHUI package is provided and signed by RH but the Azure one not + + # When upgrading with RHUI we cannot switch certs and let RHSM provide us repos for target OS content. + # Instead, Leapp's provider-specific package containing target OS certs and repos has to be installed. if not has_package(InstalledRPM, info['leapp_pkg']): create_report([ reporting.Title('Package "{}" is missing'.format(info['leapp_pkg'])), @@ -71,12 +90,15 @@ class CheckRHUI(Actor): reporting.Remediation(commands=[['yum', 'install', '-y', info['leapp_pkg']]]) ]) return + # there are several "variants" related to the *AWS* provider (aws, aws-sap) if provider.startswith('aws'): # We have to disable Amazon-id plugin in the initramdisk phase as the network # is down at the time self.produce(DNFPluginTask(name='amazon-id', disable_in=['upgrade'])) - # if RHEL7 and RHEL8 packages differ, we cannot rely on simply updating them + + # If source OS and target OS packages differ we must remove the source pkg, and install the target pkg. + # If the packages do not differ, it is sufficient to upgrade them during the upgrade if info['src_pkg'] != info['target_pkg']: self.produce(RpmTransactionTasks(to_install=[info['target_pkg']])) self.produce(RpmTransactionTasks(to_remove=[info['src_pkg']])) diff --git a/repos/system_upgrade/common/actors/peseventsscanner/libraries/peseventsscanner_repomap.py b/repos/system_upgrade/common/actors/peseventsscanner/libraries/peseventsscanner_repomap.py index 22892e4b..567e8475 100644 --- a/repos/system_upgrade/common/actors/peseventsscanner/libraries/peseventsscanner_repomap.py +++ b/repos/system_upgrade/common/actors/peseventsscanner/libraries/peseventsscanner_repomap.py @@ -50,13 +50,14 @@ class RepoMapDataHandler(object): # will be used instead self.prio_channel = get_target_product_channel(default=None) - # Cloud provider might have multiple variants: aws: (aws, aws-sap-es4), azure: (azure, azure-sap) - if cloud_provider.startswith('aws'): - self.cloud_provider = 'aws' - elif cloud_provider.startswith('azure'): - self.cloud_provider = 'azure' - else: - self.cloud_provider = cloud_provider + self.cloud_provider = cloud_provider + + # Cloud provider might have multiple variants, e.g, aws: (aws, aws-sap-es4) - normalize it + cloud_providers = ('aws', 'azure', 'google') + for provider in cloud_providers: + if cloud_provider.startswith(provider): + self.cloud_provider = provider + break def set_default_channels(self, default_channels): """ diff --git a/repos/system_upgrade/common/actors/redhatsignedrpmscanner/actor.py b/repos/system_upgrade/common/actors/redhatsignedrpmscanner/actor.py index 01f6df38..ce6d9985 100644 --- a/repos/system_upgrade/common/actors/redhatsignedrpmscanner/actor.py +++ b/repos/system_upgrade/common/actors/redhatsignedrpmscanner/actor.py @@ -54,15 +54,14 @@ class RedHatSignedRpmScanner(Actor): """Whitelist the katello package.""" return pkg.name.startswith('katello-ca-consumer') - def is_azure_pkg(pkg): - """Whitelist Azure config package.""" - upg_path = rhui.get_upg_path() - - src_pkg = rhui.RHUI_CLOUD_MAP[upg_path].get('azure', {}).get('src_pkg') - src_pkg_sap = rhui.RHUI_CLOUD_MAP[upg_path].get('azure-sap', {}).get('src_pkg') - target_pkg = rhui.RHUI_CLOUD_MAP[upg_path].get('azure', {}).get('target_pkg') - target_pkg_sap = rhui.RHUI_CLOUD_MAP[upg_path].get('azure-sap', {}).get('target_pkg') - return pkg.name in [src_pkg, src_pkg_sap, target_pkg, target_pkg_sap] + upg_path = rhui.get_upg_path() + whitelisted_cloud_flavours = ('azure', 'azure-sap', 'google', 'google-sap') + whitelisted_cloud_pkgs = { + rhui.RHUI_CLOUD_MAP[upg_path].get(flavour, {}).get('src_pkg') for flavour in whitelisted_cloud_flavours + } + whitelisted_cloud_pkgs.update( + rhui.RHUI_CLOUD_MAP[upg_path].get(flavour, {}).get('target_pkg') for flavour in whitelisted_cloud_flavours + ) for rpm_pkgs in self.consume(InstalledRPM): for pkg in rpm_pkgs.items: @@ -71,7 +70,7 @@ class RedHatSignedRpmScanner(Actor): has_rhsig(pkg), is_gpg_pubkey(pkg), has_katello_prefix(pkg), - is_azure_pkg(pkg), + pkg.name in whitelisted_cloud_pkgs, ] ): signed_pkgs.items.append(pkg) diff --git a/repos/system_upgrade/common/actors/setuptargetrepos/libraries/setuptargetrepos_repomap.py b/repos/system_upgrade/common/actors/setuptargetrepos/libraries/setuptargetrepos_repomap.py index 22892e4b..567e8475 100644 --- a/repos/system_upgrade/common/actors/setuptargetrepos/libraries/setuptargetrepos_repomap.py +++ b/repos/system_upgrade/common/actors/setuptargetrepos/libraries/setuptargetrepos_repomap.py @@ -50,13 +50,14 @@ class RepoMapDataHandler(object): # will be used instead self.prio_channel = get_target_product_channel(default=None) - # Cloud provider might have multiple variants: aws: (aws, aws-sap-es4), azure: (azure, azure-sap) - if cloud_provider.startswith('aws'): - self.cloud_provider = 'aws' - elif cloud_provider.startswith('azure'): - self.cloud_provider = 'azure' - else: - self.cloud_provider = cloud_provider + self.cloud_provider = cloud_provider + + # Cloud provider might have multiple variants, e.g, aws: (aws, aws-sap-es4) - normalize it + cloud_providers = ('aws', 'azure', 'google') + for provider in cloud_providers: + if cloud_provider.startswith(provider): + self.cloud_provider = provider + break def set_default_channels(self, default_channels): """ diff --git a/repos/system_upgrade/common/libraries/rhui.py b/repos/system_upgrade/common/libraries/rhui.py index 3d355ff6..194aad98 100644 --- a/repos/system_upgrade/common/libraries/rhui.py +++ b/repos/system_upgrade/common/libraries/rhui.py @@ -78,6 +78,30 @@ RHUI_CLOUD_MAP = { ('leapp-azure-sap.repo', YUM_REPOS_PATH) ], }, + 'google': { + 'src_pkg': 'google-rhui-client-rhel7', + 'target_pkg': 'google-rhui-client-rhel8', + 'leapp_pkg': 'leapp-rhui-google', + 'leapp_pkg_repo': 'leapp-google.repo', + 'files_map': [ + ('content.crt', RHUI_PKI_PRODUCT_DIR), + ('ca.crt', RHUI_PKI_DIR), + ('key.pem', RHUI_PKI_DIR), + ('leapp-google.repo', YUM_REPOS_PATH) + ], + }, + 'google-sap': { + 'src_pkg': 'google-rhui-client-rhel79-sap', + 'target_pkg': 'google-rhui-client-rhel8-sap', + 'leapp_pkg': 'leapp-rhui-google-sap', + 'leapp_pkg_repo': 'leapp-google-sap.repo', + 'files_map': [ + ('content.crt', RHUI_PKI_PRODUCT_DIR), + ('ca.crt', RHUI_PKI_DIR), + ('key.pem', RHUI_PKI_DIR), + ('leapp-google-sap.repo', YUM_REPOS_PATH) + ], + }, }, '8to9': { 'aws': { diff --git a/repos/system_upgrade/common/models/repositoriesmap.py b/repos/system_upgrade/common/models/repositoriesmap.py index c1873333..824c4557 100644 --- a/repos/system_upgrade/common/models/repositoriesmap.py +++ b/repos/system_upgrade/common/models/repositoriesmap.py @@ -1,4 +1,4 @@ -from leapp.models import Model, fields +from leapp.models import fields, Model from leapp.topics import TransactionTopic @@ -71,12 +71,11 @@ class PESIDRepositoryEntry(Model): purposes. The other channels indicate premium repositories. """ - rhui = fields.StringEnum(['', 'aws', 'azure']) + rhui = fields.StringEnum(['', 'aws', 'azure', 'google']) """ - Indicate whether the repository is deliver for RHUI and which one. + Specifies what cloud provider (RHUI) is the repository specific to. - For non-rhui systems: empty string - For AWS or Azure: 'aws' / 'azure' + Empty string denotes that the repository is not specific to any cloud provider. """ -- 2.35.3