Source code for spicerack.debmonitor

"""Debmonitor module."""
import logging

import requests

from wmflib.requests import http_session

from spicerack.exceptions import SpicerackError


logger = logging.getLogger(__name__)


[docs]class DebmonitorError(SpicerackError): """Custom exception class for errors of the Debmonitor class."""
[docs]class Debmonitor: """Class to interact with a Debmonitor website.""" def __init__(self, host: str, cert: str, key: str, dry_run: bool = True) -> None: """Initialize the instance. Arguments: host (str): the hostname of the Debmonitor server (without protocol). cert (str): the path to the TLS certificate to use to authenticate on Debmonitor. key (str): the path to the TLS key to use to authenticate on Debmonitor. dry_run (bool, optional): whether this is a DRY-RUN. """ self._base_url: str = 'https://{host}'.format(host=host) self._cert = cert self._key = key self._dry_run = dry_run self._http_session = http_session('.'.join((self.__module__, self.__class__.__name__)))
[docs] def host_delete(self, hostname: str) -> None: """Remove a host and all its packages from Debmonitor. Arguments: host (str): the FQDN of the host to remove from Debmonitor. Raises: spicerack.debmonitor.DebmonitorError: on failure to delete. It doesn't raise if the host is already absent in Debmonitor. """ if self._dry_run: logger.debug('Skip removing host %s from Debmonitor in DRY-RUN', hostname) return url = '{base}/hosts/{host}'.format(base=self._base_url, host=hostname) response = self._http_session.delete(url, cert=(self._cert, self._key)) if response.status_code == requests.codes['no_content']: logger.info('Removed host %s from Debmonitor', hostname) elif response.status_code == requests.codes['not_found']: logger.info('Host %s already missing on Debmonitor', hostname) else: raise DebmonitorError('Unable to remove host {host} from Debmonitor, got: {code} {msg}'.format( host=hostname, code=response.status_code, msg=response.reason))