#!/usr/bin/python
##############################################################################
# Copyright (c) 2016 ZTE Coreporation and others.
# hu.zhijiang@zte.com.cn
# lu.yao135@zte.com.cn
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
import yaml


def init(file):
    with open(file) as fd:
        return yaml.safe_load(fd)


def networkdecorator(func):
    def wrapter(s, seq):
        network_list = s.get('networks', [])
        result = {}
        for network in network_list:
            s = func(s, seq, network)
            if not s:
                continue
            result.update(s)
        if len(result) == 0:
            return ""
        else:
            return result
    return wrapter


def hostdecorator(func):
    def wrapter(s, seq):
        host_list = s.get('hosts', [])
        result = {}
        for host in host_list:
            s = func(s, seq, host)
            if not s:
                continue
            result.update(s)
        if len(result) == 0:
            return ""
        else:
            return result
    return wrapter


def decorator(func):
    def wrapter(s, seq):
        host_list = s.get('hosts', [])
        result = []
        for host in host_list:
            s = func(s, seq, host)
            if not s:
                continue
            result.append(s)
        if len(result) == 0:
            return ""
        else:
            return result
    return wrapter


@networkdecorator
def network(s, seq, network=None):
    net_plane = network.get('name', '')
    network.pop('name')
    map = {}
    map[net_plane] = network
    return map


@hostdecorator
def interface(s, seq, host=None):
    hostname = host.get('name', '')
    interface = host.get('interface', '')[0]
    map = {}
    map[hostname] = interface
    return map


@hostdecorator
def role(s, seq, host=None):
    hostname = host.get('name', '')
    role = host.get('roles', '')
    map = {}
    map[hostname] = role
    return map


@decorator
def host(s, seq, host=None):
    hostip = host.get('ip', [])
    passwd = host.get('password', [])
    map = {}
    map = {'ip': hostip, 'passwd': passwd}
    return map


def network_config_parse(s, dha_file):
    network_map = network(s, ',')
    vip = s.get('internal_vip')
    return network_map, vip


def dha_config_parse(s, dha_file):
    host_interface_map = interface(s, ',')
    host_role_map = role(s, ',')
    host_ip_passwd_map = host(s, ',')
    return host_interface_map, host_role_map, host_ip_passwd_map


def config(dha_file, network_file):
    data = init(dha_file)
    host_interface_map, host_role_map, host_ip_passwd_map = \
        dha_config_parse(data, dha_file)
    data = init(network_file)
    network_map, vip = network_config_parse(data, network_file)
    return host_interface_map, host_role_map, \
        host_ip_passwd_map, network_map, vip