Source code for mac_maker.jobs.bases
"""Job base classes for the Mac Maker."""
import abc
import sys
import click
from ..ansible_controller.inventory import InventoryFile
from ..ansible_controller.runner import AnsibleRunner
from ..utilities.precheck import PrecheckExtractor, TypePrecheckFileData
from ..utilities.spec import JobSpecExtractor
from ..utilities.state import TypeState
from ..utilities.sudo import SUDO
from ..utilities.validation.precheck import PrecheckConfigValidator
[docs]class SimpleJobBase(abc.ABC):
"""Job base class for the Mac Maker, that doesn't require provisioning."""
[docs] @abc.abstractmethod
def invoke(self) -> None:
"""Invoke a simple Job that doesn't require provisioning."""
raise NotImplementedError # nocover
[docs]class ProvisionerJobBase(abc.ABC):
"""Job base class for the Mac Maker, with Ansible provisioning."""
def __init__(self) -> None:
self.jobspec_extractor = JobSpecExtractor()
self.precheck_extractor = PrecheckExtractor()
[docs] @abc.abstractmethod
def get_precheck_content(self) -> TypePrecheckFileData:
"""Extract the Profile's Precheck file contents."""
raise NotImplementedError # nocover
[docs] @abc.abstractmethod
def get_state(self) -> TypeState:
"""Assemble and return a runtime state object."""
raise NotImplementedError # nocover
[docs] def precheck(self, notes: bool = True) -> None:
"""Precheck the Profile for validity and environment variable content.
:param notes: A boolean indicating whether to display the Precheck notes.
"""
precheck_data = self.get_precheck_content()
validator = PrecheckConfigValidator(precheck_data['env'])
validator.validate_config()
results = validator.validate_environment()
if not results['is_valid']:
for violation in results['violations']:
click.echo(violation)
sys.exit(1)
if notes:
click.echo(precheck_data['notes'])
[docs] def provision(self) -> None:
"""Begin provisioning with Ansible."""
loaded_state = self.get_state()
sudo = SUDO()
sudo.prompt_for_sudo()
inventory = InventoryFile(loaded_state)
inventory.write_inventory_file()
ansible_job = AnsibleRunner(loaded_state)
ansible_job.start()