# Copyright 2015
# All Rights Reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.


import os

from tempest import config
from tempest.test_discover import plugins

from neutron_tempest_plugin import config as neutron_config


class NeutronTempestPlugin(plugins.TempestPlugin):
    def load_tests(self):
        base_path = os.path.split(os.path.dirname(
            os.path.abspath(__file__)))[0]
        test_dir = "neutron_tempest_plugin"
        full_test_dir = os.path.join(base_path, test_dir)
        return full_test_dir, base_path

    def register_opts(self, conf):
        config.register_opt_group(conf, neutron_config.neutron_group,
                                  neutron_config.NeutronPluginOptions)
        config.register_opt_group(conf, neutron_config.bgpvpn_group,
                                  neutron_config.BgpvpnGroup)
        config.register_opt_group(conf, neutron_config.fwaas_group,
                                  neutron_config.FwaasGroup)
        config.register_opt_group(conf, neutron_config.taas_group,
                                  neutron_config.TaasGroup)
        config.register_opt_group(conf, neutron_config.dynamic_routing_group,
                                  neutron_config.DynamicRoutingGroup)
        config.register_opt_group(conf, neutron_config.dns_feature_group,
                                  neutron_config.DnsFeatureGroup)

    def get_opt_lists(self):
        return [
            (neutron_config.neutron_group.name,
             neutron_config.NeutronPluginOptions),
            (neutron_config.bgpvpn_group.name,
             neutron_config.BgpvpnGroup),
            (neutron_config.fwaas_group.name,
             neutron_config.FwaasGroup),
            (neutron_config.taas_group.name,
             neutron_config.TaasGroup),
            (neutron_config.dynamic_routing_group.name,
             neutron_config.DynamicRoutingGroup),
            (neutron_config.dns_feature_group.name,
             neutron_config.DnsFeatureGroup)
        ]
