from charmhelpers.contrib.openstack.neutron import neutron_plugin_attribute
from copy import deepcopy
from charmhelpers.contrib.openstack import templating
from collections import OrderedDict
from charmhelpers.contrib.openstack.utils import (
        os_release,
)
import neutron_ovs_context

NOVA_CONF_DIR = "/etc/nova"
NEUTRON_CONF_DIR = "/etc/neutron"
NEUTRON_CONF = "%s/neutron.conf" % NEUTRON_CONF_DIR
ML2_CONF = '%s/plugins/ml2/ml2_conf.ini' % NEUTRON_CONF_DIR
NEUTRON_DEFAULT = '/etc/default/neutron-server'

BASE_RESOURCE_MAP = OrderedDict([
    (ML2_CONF, {
        'services': ['neutron-plugin-openvswitch-agent'],
        'contexts': [neutron_ovs_context.OVSPluginContext()],
    }),
])
TEMPLATES = 'templates/'
NEUTRON_SERVICE_PLUGINS=['neutron.services.l3_router.l3_router_plugin.L3RouterPlugin',
                         'neutron.services.firewall.fwaas_plugin.FirewallPlugin',
                         'neutron.services.loadbalancer.plugin.LoadBalancerPlugin',
                         'neutron.services.vpn.plugin.VPNDriverPlugin',
                         'neutron.services.metering.metering_plugin.MeteringPlugin']
NEUTRON_SETTINGS = {
        "neutron": {
            NEUTRON_CONF: {
                "sections": {
                    "DEFAULT": [
                        ('core_plugin', 'neutron.plugins.ml2.plugin.Ml2Plugin'),
                        ('service_plugins', ','.join(NEUTRON_SERVICE_PLUGINS)),
                    ],
                    "COMMENT": [
                        ('comment1', 'Warning: some settings controlled by subordinate neutron-openvswitch'),
                    ]
                } 
            },
            NEUTRON_DEFAULT: {
                "sections": {
                    "DEFAULT": [
                        ('NEUTRON_PLUGIN_CONFIG', ML2_CONF),
                    ],
                    "COMMENT": [
                        ('comment1', 'Warning: some settings controlled by subordinate neutron-openvswitch'),
                    ]
                } 
            }
        }
}

def determine_packages():
    ovs_pkgs = []
    pkgs = neutron_plugin_attribute('ovs', 'packages',
                                    'neutron')
    for pkg in pkgs:
        ovs_pkgs.extend(pkg)

    return set(ovs_pkgs)

def register_configs(release=None):
    release = release or os_release('neutron-common')
    configs = templating.OSConfigRenderer(templates_dir=TEMPLATES,
                                          openstack_release=release)
    for cfg, rscs in resource_map().iteritems():
        configs.register(cfg, rscs['contexts'])
    return configs

def resource_map():
    '''
    Dynamically generate a map of resources that will be managed for a single
    hook execution.
    '''
    resource_map = deepcopy(BASE_RESOURCE_MAP)
    return resource_map

def restart_map():
    '''
    Constructs a restart map based on charm config settings and relation
    state.
    '''
    return {k: v['services'] for k, v in resource_map().iteritems()}