contrib/automation/hgautomation/__init__.py
author Gregory Szorc <gregory.szorc@gmail.com>
Mon, 14 Oct 2019 21:21:58 -0700
changeset 43234 c09e8ac3f61f
parent 43076 2372284d9457
permissions -rw-r--r--
automation: schedule an EC2Launch run on next boot Without this, launching EC2 instances constructed from the AMI won't go through the normal EC2 instance launch machinery. This missing machinery does important things like set up network routes to use the instance metadata service and process any UserData. Since EC2Launch now runs on subsequent boots and UserData is processed, we needed to make setting of UserData conditional on bootstrapping mode. Differential Revision: https://phab.mercurial-scm.org/D7113

# __init__.py - High-level automation interfaces
#
# Copyright 2019 Gregory Szorc <gregory.szorc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

# no-check-code because Python 3 native.

import pathlib
import secrets

from .aws import AWSConnection


class HGAutomation:
    """High-level interface for Mercurial automation.

    Holds global state, provides access to other primitives, etc.
    """

    def __init__(self, state_path: pathlib.Path):
        self.state_path = state_path

        state_path.mkdir(exist_ok=True)

    def default_password(self):
        """Obtain the default password to use for remote machines.

        A new password will be generated if one is not stored.
        """
        p = self.state_path / 'default-password'

        try:
            with p.open('r', encoding='ascii') as fh:
                data = fh.read().strip()

                if data:
                    return data

        except FileNotFoundError:
            pass

        password = secrets.token_urlsafe(24)

        with p.open('w', encoding='ascii') as fh:
            fh.write(password)
            fh.write('\n')

        p.chmod(0o0600)

        return password

    def aws_connection(self, region: str, ensure_ec2_state: bool = True):
        """Obtain an AWSConnection instance bound to a specific region."""

        return AWSConnection(self, region, ensure_ec2_state=ensure_ec2_state)