wamonite/packermate

View on GitHub
packermate/provisioner.py

Summary

Maintainability
A
45 mins
Test Coverage
# -*- coding: utf-8 -*-

from __future__ import print_function, unicode_literals
from .target import TargetParameter, parse_parameters
import json
from .exception import PackermateException


__all__ = ['parse_provisioners', 'ProvisionerException']


class ProvisionerException(PackermateException):
    pass


def parse_provisioners(provisioner_list, config, packer_config):
    if not isinstance(provisioner_list, list):
        raise ProvisionerException('Provisioners must be a list')

    def to_expanded_json(val):
        val_expanded = config.expand_parameters(val)
        return json.dumps(val_expanded, indent = None)

    value_definition_lookup = {
        'file': (
            TargetParameter('source'),
            TargetParameter('destination'),
            TargetParameter('direction', required = False),
        ),
        'shell': (
            TargetParameter('inline', value_type = list, required = False),
            TargetParameter('script', required = False),
            TargetParameter('scripts', value_type = list, required = False),
            TargetParameter('execute_command', required = False, default = '(( shell_command ))'),
            TargetParameter('environment_vars', value_type = list, required = False),
        ),
        'shell-local': (
            TargetParameter('command'),
            TargetParameter('execute_command', value_type = list, required = False, default = ["/bin/sh", "-c", "{{.Command}}"]),
        ),
        'ansible-local': (
            TargetParameter('playbook_file'),
            TargetParameter('playbook_dir', required = False),
            TargetParameter('command', required = False),
            TargetParameter('extra_arguments', value_type = list, required = False),
            TargetParameter('extra_vars', value_type = dict, required = False, func = to_expanded_json),
        ),
    }
    value_parse_lookup = {
        'ansible-local': parse_provisioner_ansible_local,
    }

    for provisioner_lookup in provisioner_list:
        provisioner_type = provisioner_lookup.get('type')
        if provisioner_type in value_definition_lookup:
            provisioner_output = {
                'type': provisioner_type,
            }
            parse_parameters(
                value_definition_lookup[provisioner_type],
                config,
                provisioner_output,
                config_lookup = provisioner_lookup,
            )

            value_parse_func = value_parse_lookup.get(provisioner_type)
            if callable(value_parse_func):
                value_parse_func(provisioner_output)

            packer_config.add_provisioner(provisioner_output)

        else:
            raise ProvisionerException("Unknown provisioner type: {}".format(provisioner_type))


def parse_provisioner_ansible_local(provisioner_values):
    extra_vars = provisioner_values.get('extra_vars')
    if extra_vars:
        extra_arguments_list = provisioner_values.setdefault('extra_arguments', [])
        extra_arguments_list.append("-e '{}'".format(extra_vars))

        del(provisioner_values['extra_vars'])