Source code for watchmaker.workers.yum

# -*- coding: utf-8 -*-
"""Watchmaker yum worker."""
from __future__ import (
    absolute_import,
    division,
    print_function,
    unicode_literals,
    with_statement,
)

import distro
import six

import watchmaker.utils
from watchmaker.exceptions import WatchmakerError
from watchmaker.managers.platform_manager import LinuxPlatformManager
from watchmaker.workers.base import WorkerBase


[docs] class Yum(WorkerBase, LinuxPlatformManager): """ Install yum repos. Args: repo_map: (:obj:`list`) List of dictionaries containing a map of yum repo files to systems. (*Default*: ``[]``) """ SUPPORTED_DISTS = { 'almalinux': 'almalinux', 'amazon': 'amazon', 'centos': 'centos', 'oracle': 'oracle', 'rhel': 'redhat', 'rocky': 'rocky' } def __init__(self, *args, **kwargs): # Pop arguments used by Yum self.yumrepomap = kwargs.pop('repo_map', None) or [] # Init inherited classes super(Yum, self).__init__(*args, **kwargs) self.dist_info = self.get_dist_info() def _get_amazon_el_version(self, version): # All amzn linux distros currently available use el6-based packages. # When/if amzn linux switches a distro to el7, rethink this. self.log.debug('Amazon Linux, version=%s', version) return '6'
[docs] def get_dist_info(self): """Validate the Linux distro and return info about the distribution.""" dist = self.get_mapped_dist_name() version = distro.version()[0] el_version = None # Determine el_version if dist == 'amazon': el_version = self._get_amazon_el_version(version) else: el_version = distro.version()[0] if el_version is None: msg = ( 'Unsupported OS version! dist = {0}, version = {1}.' .format(dist, version) ) self.log.critical(msg) raise WatchmakerError(msg) dist_info = { 'dist': dist, 'el_version': el_version } self.log.debug('dist_info=%s', dist_info) return dist_info
[docs] def get_mapped_dist_name(self): """Return a normalized dist-name value.""" # Error if 'dist' is not found in SUPPORTED_DISTS try: return self.SUPPORTED_DISTS[distro.id()] except KeyError: # Release not supported, exit with error msg = ( 'Unsupported OS distribution. OS must be one of: {0}' .format(', '.join(self.SUPPORTED_DISTS.keys())) ) self.log.critical(msg) raise WatchmakerError(msg)
def _validate_config(self): """Validate the config is properly formed.""" if not self.yumrepomap: self.log.warning('`yumrepomap` did not exist or was empty.') elif not isinstance(self.yumrepomap, list): msg = '`yumrepomap` must be a list!' self.log.critical(msg) raise WatchmakerError(msg) def _validate_repo(self, repo): """Check if a repo is applicable to this system.""" # Check if this repo applies to this system's dist and el_version. # repo['dist'] must match this system's dist or the keyword 'all' # repo['el_version'] is optional, but if present then it must match # this system's el_version. dist = self.dist_info['dist'] el_version = self.dist_info['el_version'] repo_dists = repo['dist'] if isinstance(repo_dists, six.string_types): # ensure repo_dist is a list repo_dists = [repo_dists] # is repo dist applicable to this system? check_dist = bool(set(repo_dists).intersection([dist, 'all'])) # is repo el_version applicable to this system? check_el_version = ( 'el_version' in repo and str(repo['el_version']) == str(el_version) ) # return True if all checks pass, otherwise False return check_dist and check_el_version
[docs] def before_install(self): """Validate configuration before starting install.""" pass
[docs] def install(self): """Install yum repos defined in config file.""" self._validate_config() for repo in self.yumrepomap: if self._validate_repo(repo): # Download the yum repo definition to /etc/yum.repos.d/ self.log.info('Installing repo: %s', repo['url']) url = repo['url'] repofile = '/etc/yum.repos.d/{0}'.format( watchmaker.utils.basename_from_uri(url)) self.retrieve_file(url, repofile) else: self.log.debug( 'Skipped repo because it is not valid for this system: ' 'dist_info=%s', self.dist_info ) self.log.debug('Skipped repo=%s', repo)