from bundlewrap.metadata import metadata_to_json

deps = {
    'pkg_apt:docker-ce',
    'pkg_apt:docker-ce-cli',
}

directories['/opt/docker-engine'] = {
    'purge': True,
}
directories['/var/opt/docker-engine'] = {}

files['/etc/docker/daemon.json'] = {
    'content': metadata_to_json(node.metadata.get('docker-engine/config')),
    'triggers': {
        'svc_systemd:docker:restart',
    },
    # install config before installing packages to ensure the config is
    # applied to the first start as well
    'before': deps,
}

svc_systemd['docker'] = {
    'needs': deps,
}

files['/usr/local/share/icinga/plugins/check_docker_container'] = {
    'mode': '0755',
}

actions['docker_create_nondefault_network'] = {
    # <https://docs.docker.com/engine/network/#dns-services>
    # By default, containers inherit the DNS settings as defined in the
    # /etc/resolv.conf configuration file. Containers that attach to the
    # default bridge network receive a copy of this file. Containers that
    # attach to a custom network use Docker's embedded DNS server. The embedded
    # DNS server forwards external DNS lookups to the DNS servers configured on
    # the host.
    'command': 'docker network create aaarghhh',
    'unless': 'docker network ls | grep -q -F aaarghhh',
    'needs': {
        'svc_systemd:docker',
    },
}

for app, config in node.metadata.get('docker-engine/containers', {}).items():
    volumes = config.get('volumes', {})
    user = config.get('user', f'docker-{app}')

    files[f'/opt/docker-engine/{app}'] = {
        'source': 'docker-wrapper',
        'content_type': 'mako',
        'context': {
            'command': config.get('command'),
            'environment': config.get('environment', {}),
            'image': config['image'],
            'name': app,
            'ports': config.get('ports', {}),
            'timezone': node.metadata.get('timezone'),
            'user': user,
            'volumes': volumes,
        },
        'mode': '0755',
        'triggers': {
            f'svc_systemd:docker-{app}:restart',
        },
    }

    users[user] = {
        'groups': {
            'docker',
        },
        'after': {
            'action:docker_create_nondefault_network',
            'svc_systemd:docker',
        },
    }
    if user == f'docker-{app}':
        users[user]['home'] = f'/var/opt/docker-engine/{app}'

    files[f'/usr/local/lib/systemd/system/docker-{app}.service'] = {
        'source': 'docker-wrapper.service',
        'content_type': 'mako',
        'context': {
            'name': app,
            'requires': {
                *set(config.get('requires', set())),
                'docker.service',
            }
        },
        'triggers': {
            'action:systemd-reload',
            f'svc_systemd:docker-{app}:restart',
        },
    }

    svc_systemd[f'docker-{app}'] = {
        'needs': {
            *deps,
            f'file:/opt/docker-engine/{app}',
            f'file:/usr/local/lib/systemd/system/docker-{app}.service',
            f'user:{user}',
            'svc_systemd:docker',
            *set(config.get('needs', set())),
        },
    }

    for volume in volumes:
        if not volume.startswith('/'):
            volume = f'/var/opt/docker-engine/{app}/{volume}'

        directories[volume] = {
            'owner': user,
            'group': user,
            'needed_by': {
                f'svc_systemd:docker-{app}',
            },
            # don't do anything if the directory exists, docker images
            # mangle owners
            'unless': f'test -d {volume}',
        }