def set_rhsm_release(): """Set the RHSM release to the target RHEL 8 minor version.""" info = next(api.consume(TargetRHSMInfo), None) if info and info.release: rhsm.set_release(mounting.NotIsolatedActions(base_dir='/'), info.release) else: api.current_logger().debug('Skipping setting the RHSM release due to the use of LEAPP_DEVEL_SKIP_RHSM.')
def get_parsed_repofiles(context=mounting.NotIsolatedActions(base_dir='/')): """ Scan all repositories on the system. Repositories are scanned under repository directories (as reported by dnf) of the given context. By default the context is the host system. ATTENTION: Do not forget to ensure the redhat.repo file is regenerated by RHSM when used. :param context: An instance of a mounting.IsolatedActions class :type context: mounting.IsolatedActions class :rtype: List(RepositoryFile) """ repofiles = [] cmd = ['find', '-L'] + get_repodirs() + [ '-maxdepth', '1', '-type', 'f', '-name', '*.repo' ] repofiles_paths = context.call(cmd, split=True)['stdout'] for repofile_path in repofiles_paths: repofile = parse_repofile(context.full_path(repofile_path)) # we want full path in cotext, not the real full path repofile.file = repofile_path repofiles.append(repofile) return repofiles
def perform_transaction_install(target_userspace_info, storage_info, used_repos, tasks, plugin_info): """ Performs the actual installation with the DNF rhel-upgrade plugin using the target userspace """ # These bind mounts are performed by systemd-nspawn --bind parameters bind_mounts = [ '/:/installroot', '/dev:/installroot/dev', '/proc:/installroot/proc', '/run/udev:/installroot/run/udev', ] if get_target_major_version() == '8': bind_mounts.append('/sys:/installroot/sys') else: # the target major version is RHEL 9+ # we are bindmounting host's "/sys" to the intermediate "/hostsys" # in the upgrade initramdisk to avoid cgroups tree layout clash bind_mounts.append('/hostsys:/installroot/sys') already_mounted = {entry.split(':')[0] for entry in bind_mounts} for entry in storage_info.fstab: mp = entry.fs_file if not os.path.isdir(mp): continue if mp not in already_mounted: bind_mounts.append('{}:{}'.format(mp, os.path.join('/installroot', mp.lstrip('/')))) if os.path.ismount('/boot'): bind_mounts.append('/boot:/installroot/boot') if os.path.ismount('/boot/efi'): bind_mounts.append('/boot/efi:/installroot/boot/efi') with _prepare_transaction(used_repos=used_repos, target_userspace_info=target_userspace_info, binds=bind_mounts ) as (context, target_repoids, _unused): # the below nsenter command is important as we need to enter sysvipc namespace on the host so we can # communicate with udev cmd_prefix = ['nsenter', '--ipc=/installroot/proc/1/ns/ipc'] # we have to ensure the leapp packages will stay untouched # Note: this is the most probably duplicate action - it should be already # set like that, however seatbelt is a good thing. dnfconfig.exclude_leapp_rpms(context) if get_target_major_version() == '9': _rebuild_rpm_db(context, root='/installroot') _transaction( context=context, stage='upgrade', target_repoids=target_repoids, plugin_info=plugin_info, tasks=tasks, cmd_prefix=cmd_prefix ) # we have to ensure the leapp packages will stay untouched even after the # upgrade is fully finished (it cannot be done before the upgarde # on the host as the config-manager plugin is available since rhel-8) dnfconfig.exclude_leapp_rpms(mounting.NotIsolatedActions(base_dir='/'))
def set_rhsm_release(): """Set the RHSM release to the target RHEL 8 minor version.""" info = next(api.consume(TargetRHSMInfo), None) if info and info.release: try: rhsm.set_release(mounting.NotIsolatedActions(base_dir='/'), info.release) except CalledProcessError as err: api.current_logger().warning('Unable to set the {0} release through subscription-manager. When using dnf,' ' content of the latest RHEL 8 minor version will be downloaded.\n{1}' .format(info.release, str(err))) else: api.current_logger().debug('Skipping setting the RHSM release due to the use of LEAPP_DEVEL_SKIP_RHSM.')
def set_rhsm_release(): """Set the RHSM release to the target RHEL minor version.""" if rhsm.skip_rhsm(): api.current_logger().debug( 'Skipping setting the RHSM release due to --no-rhsm or environment variables.' ) return if config.get_product_type('target') != 'ga': api.current_logger().debug( 'Skipping setting the RHSM release as target product is set to beta/htb' ) return target_version = api.current_actor().configuration.version.target try: rhsm.set_release(mounting.NotIsolatedActions(base_dir='/'), target_version) except CalledProcessError as err: api.current_logger().warning( 'Unable to set the {0} release through subscription-manager. When using dnf,' ' content of the latest RHEL {1} minor version will be downloaded.\n{2}' .format(target_version, get_target_major_version(), str(err)))
def apply_yum_workaround(context=None): """ Applies a workaround on the system to allow the upgrade to succeed for yum/dnf. """ yum_script_path = api.get_tool_path('handleyumconfig') if not yum_script_path: raise StopActorExecutionError( message='Failed to find mandatory script to apply', details=reinstall_leapp_repository_hint() ) cmd = ['/bin/bash', '-c', yum_script_path] try: context = context or mounting.NotIsolatedActions(base_dir='/') context.call(cmd) except OSError as e: raise StopActorExecutionError( message='Failed to exceute script to apply yum adjustment. Message: {}'.format(str(e)) ) except CalledProcessError as e: raise StopActorExecutionError( message='Failed to apply yum adjustment. Message: {}'.format(str(e)) )
def process(): info = next(api.consume(TargetRHSMInfo), None) if info and info.release: rhsm.set_release(mounting.NotIsolatedActions(base_dir='/'), info.release)