# Copyright 2015 Hewlett-Packard Development Company, L.P.
#
# 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.

from oslo_config import cfg
from oslo_config import fixture as oslo_fixture
from oslo_utils import uuidutils

from octavia.amphorae.backends.agent import agent_jinja_cfg
from octavia.common import constants
import octavia.tests.unit.base as base

AMP_ID = uuidutils.generate_uuid()


class AgentJinjaTestCase(base.TestCase):
    def setUp(self):
        super().setUp()

        self.conf = oslo_fixture.Config(cfg.CONF)
        self.conf.config(debug=False)
        self.conf.config(group="amphora_agent",
                         agent_server_ca='/etc/octavia/certs/client_ca.pem')
        self.conf.config(group="amphora_agent",
                         agent_server_cert='/etc/octavia/certs/server.pem')
        self.conf.config(group="amphora_agent",
                         agent_server_network_dir='/etc/network/interfaces.d/')
        self.conf.config(group='amphora_agent',
                         amphora_udp_driver='keepalived_lvs'),
        self.conf.config(group="haproxy_amphora",
                         base_cert_dir='/var/lib/octavia/certs')
        self.conf.config(group="haproxy_amphora", use_upstart='True')
        self.conf.config(group="haproxy_amphora", base_path='/var/lib/octavia')
        self.conf.config(group="haproxy_amphora", bind_host='0.0.0.0')
        self.conf.config(group="haproxy_amphora", bind_port=9443)
        self.conf.config(group="haproxy_amphora",
                         haproxy_cmd='/usr/sbin/haproxy')
        self.conf.config(group="haproxy_amphora", respawn_count=2)
        self.conf.config(group="haproxy_amphora", respawn_interval=2)
        self.conf.config(group="health_manager",
                         controller_ip_port_list=['192.0.2.10:5555'])
        self.conf.config(group="health_manager", heartbeat_interval=10)
        self.conf.config(group="health_manager", heartbeat_key='TEST')

    def test_build_agent_config(self):
        ajc = agent_jinja_cfg.AgentJinjaTemplater()
        # Test execution order could influence this with the test below
        self.conf.config(group='amphora_agent',
                         agent_server_network_file=None)
        self.conf.config(group="amphora_agent",
                         administrative_log_facility=1)
        self.conf.config(group="amphora_agent", user_log_facility=0)
        expected_config = ('\n[DEFAULT]\n'
                           'debug = False\n'
                           'use_syslog = True\n'
                           'syslog_log_facility = LOG_LOCAL1\n\n'
                           '[haproxy_amphora]\n'
                           'base_cert_dir = /var/lib/octavia/certs\n'
                           'base_path = /var/lib/octavia\n'
                           'bind_host = 0.0.0.0\n'
                           'bind_port = 9443\n'
                           'haproxy_cmd = /usr/sbin/haproxy\n'
                           'respawn_count = 2\n'
                           'respawn_interval = 2\n'
                           'use_upstart = True\n'
                           'user_log_facility = 0\n'
                           'administrative_log_facility = 1\n\n'
                           '[health_manager]\n'
                           'controller_ip_port_list = 192.0.2.10:5555\n'
                           'heartbeat_interval = 10\n'
                           'heartbeat_key = TEST\n\n'
                           '[amphora_agent]\n'
                           'agent_server_ca = '
                           '/etc/octavia/certs/client_ca.pem\n'
                           'agent_server_cert = '
                           '/etc/octavia/certs/server.pem\n'
                           'agent_server_network_dir = '
                           '/etc/network/interfaces.d/\n'
                           'agent_request_read_timeout = 180\n'
                           'amphora_id = ' + AMP_ID + '\n'
                           'amphora_udp_driver = keepalived_lvs\n'
                           'agent_tls_protocol = TLSv1.2\n\n'
                           '[controller_worker]\n'
                           'loadbalancer_topology = ' +
                           constants.TOPOLOGY_SINGLE)
        agent_cfg = ajc.build_agent_config(AMP_ID, constants.TOPOLOGY_SINGLE)
        self.assertEqual(expected_config, agent_cfg)

    def test_build_agent_config_with_interfaces_file(self):
        ajc = agent_jinja_cfg.AgentJinjaTemplater()
        self.conf.config(group="amphora_agent",
                         agent_server_network_file='/etc/network/interfaces')
        self.conf.config(group="haproxy_amphora", use_upstart='False')
        self.conf.config(group="amphora_agent",
                         administrative_log_facility=1)
        self.conf.config(group="amphora_agent", user_log_facility=0)
        expected_config = ('\n[DEFAULT]\n'
                           'debug = False\n'
                           'use_syslog = True\n'
                           'syslog_log_facility = LOG_LOCAL1\n\n'
                           '[haproxy_amphora]\n'
                           'base_cert_dir = /var/lib/octavia/certs\n'
                           'base_path = /var/lib/octavia\n'
                           'bind_host = 0.0.0.0\n'
                           'bind_port = 9443\n'
                           'haproxy_cmd = /usr/sbin/haproxy\n'
                           'respawn_count = 2\n'
                           'respawn_interval = 2\n'
                           'use_upstart = False\n'
                           'user_log_facility = 0\n'
                           'administrative_log_facility = 1\n\n'
                           '[health_manager]\n'
                           'controller_ip_port_list = 192.0.2.10:5555\n'
                           'heartbeat_interval = 10\n'
                           'heartbeat_key = TEST\n\n'
                           '[amphora_agent]\n'
                           'agent_server_ca = '
                           '/etc/octavia/certs/client_ca.pem\n'
                           'agent_server_cert = '
                           '/etc/octavia/certs/server.pem\n'
                           'agent_server_network_dir = '
                           '/etc/network/interfaces.d/\n'
                           'agent_server_network_file = '
                           '/etc/network/interfaces\n'
                           'agent_request_read_timeout = 180\n'
                           'amphora_id = ' + AMP_ID + '\n'
                           'amphora_udp_driver = keepalived_lvs\n'
                           'agent_tls_protocol = TLSv1.2\n\n'
                           '[controller_worker]\n'
                           'loadbalancer_topology = ' +
                           constants.TOPOLOGY_ACTIVE_STANDBY)
        agent_cfg = ajc.build_agent_config(AMP_ID,
                                           constants.TOPOLOGY_ACTIVE_STANDBY)
        self.assertEqual(expected_config, agent_cfg)

    def test_build_agent_config_with_new_udp_driver(self):
        ajc = agent_jinja_cfg.AgentJinjaTemplater()
        self.conf.config(group='amphora_agent',
                         agent_server_network_file=None)
        self.conf.config(group="amphora_agent",
                         amphora_udp_driver='new_udp_driver')
        self.conf.config(group="amphora_agent",
                         administrative_log_facility=1)
        self.conf.config(group="amphora_agent", user_log_facility=0)
        expected_config = ('\n[DEFAULT]\n'
                           'debug = False\n'
                           'use_syslog = True\n'
                           'syslog_log_facility = LOG_LOCAL1\n\n'
                           '[haproxy_amphora]\n'
                           'base_cert_dir = /var/lib/octavia/certs\n'
                           'base_path = /var/lib/octavia\n'
                           'bind_host = 0.0.0.0\n'
                           'bind_port = 9443\n'
                           'haproxy_cmd = /usr/sbin/haproxy\n'
                           'respawn_count = 2\n'
                           'respawn_interval = 2\n'
                           'use_upstart = True\n'
                           'user_log_facility = 0\n'
                           'administrative_log_facility = 1\n\n'
                           '[health_manager]\n'
                           'controller_ip_port_list = 192.0.2.10:5555\n'
                           'heartbeat_interval = 10\n'
                           'heartbeat_key = TEST\n\n'
                           '[amphora_agent]\n'
                           'agent_server_ca = '
                           '/etc/octavia/certs/client_ca.pem\n'
                           'agent_server_cert = '
                           '/etc/octavia/certs/server.pem\n'
                           'agent_server_network_dir = '
                           '/etc/network/interfaces.d/\n'
                           'agent_request_read_timeout = 180\n'
                           'amphora_id = ' + AMP_ID + '\n'
                           'amphora_udp_driver = new_udp_driver\n'
                           'agent_tls_protocol = TLSv1.2\n\n'
                           '[controller_worker]\n'
                           'loadbalancer_topology = ' +
                           constants.TOPOLOGY_SINGLE)
        agent_cfg = ajc.build_agent_config(AMP_ID, constants.TOPOLOGY_SINGLE)
        self.assertEqual(expected_config, agent_cfg)
