import logging import etcd logger = logging.getLogger(__name__) class EtcdCanceller(object): """ A class that sends a message to etcd to cancel a build """ def __init__(self, config): etcd_host = config.get('ETCD_HOST', '127.0.0.1') etcd_port = config.get('ETCD_PORT', 2379) etcd_ca_cert = config.get('ETCD_CA_CERT', None) etcd_auth = config.get('ETCD_CERT_AND_KEY', None) if etcd_auth is not None: etcd_auth = tuple(etcd_auth) etcd_protocol = 'http' if etcd_auth is None else 'https' logger.debug('Connecting to etcd on %s:%s', etcd_host, etcd_port) self._cancel_prefix = config.get('ETCD_CANCEL_PREFIX', 'cancel/') self._etcd_client = etcd.Client( host=etcd_host, port=etcd_port, cert=etcd_auth, ca_cert=etcd_ca_cert, protocol=etcd_protocol, read_timeout=5) def try_cancel_build(self, build_uuid): """ Writes etcd message to cancel build_uuid. """ logger.info("Cancelling build %s".format(build_uuid)) try: self._etcd_client.write("{}{}".format(self._cancel_prefix, build_uuid), build_uuid, ttl=60) return True except etcd.EtcdException: logger.exception("Failed to write to etcd client %s", build_uuid) return False