#
#    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 re
import testtools
from unittest import mock

from tests import hook_kubelet


class HookKubeletTest(testtools.TestCase):

    config = {
        "id": "a50ae8dd-b0c4-407f-8732-3571b3a0f28b",
        "group": "kubelet",
        "inputs": [],
        "name": "20_apache_deployment",
        "outputs": [],
        "options": {},
        "config": {
            "version": "v1beta2",
            "volumes": [{
                "name": "mariadb-data"
            }],
            "containers": [{
                "image": "kollaglue/fedora-rdo-rabbitmq",
                "name": "rabbitmq",
                "ports": [{
                    "containerPort": 5672,
                    "hostPort": 5672}]
            }, {
                "image": "kollaglue/fedora-rdo-heat-engine",
                "name": "heat-engine",
                "env": [{
                    "name": "AUTH_ENCRYPTION_KEY",
                    "value": "Vegu95l2jwkucD9RSYAoFpRbUlh0PGF7"}]
            }, {
                "image": "kollaglue/fedora-rdo-heat-engine",
                "name": "heat-engine2",
                "env": [{
                    "name": "AUTH_ENCRYPTION_KEY",
                    "value": "Vegu95l2jwkucD9RSYAoFpRbUlh0PGF7"}]
            }]
        }
    }

    def setUp(self):
        super(HookKubeletTest, self).setUp()
        docker = mock.MagicMock()
        self.docker_client = mock.MagicMock()
        docker.Client.return_value = self.docker_client
        self.docker_client.version.return_value = {
            'ApiVersion': '1.3.0'
        }
        hook_kubelet.docker = docker

    def test_id_to_pod_name_part(self):
        self.assertEqual(
            'fc9070b3ba4e4f2',
            hook_kubelet.id_to_pod_name_part(
                'fc9070b3-ba4e-4f22-b732-5ffdcdb40b74'))

    def test_container_pattern(self):
        pattern = hook_kubelet.container_pattern(
            'fc9070b3-ba4e-4f22-b732-5ffdcdb40b74', 'mariadb')
        self.assertEqual(
            '^/k8s_mariadb\\.[0-9a-z]{8}_fc9070b3ba4e4f2', pattern)

        pat = re.compile(pattern)

        self.assertIsNotNone(pat.match(
            '/k8s_mariadb.dac8ccce_fc9070b3ba4e4f2'
            'uv6pejpu5nqbmrqoungurhtob5gvt.default.'
            'file_2c8cf9fc94674e8buv6pejpu5nqbmrqoungurhtob5gvt_dcd1e1d9'))
        self.assertIsNotNone(pat.match(
            '/k8s_mariadb.dac8ccce_fc9070b3ba4e4f2a'))

        self.assertIsNone(pat.match(
            'k8s_mariadb.dac8ccce_fc9070b3ba4e4f2a'))
        self.assertIsNone(pat.match(
            '/k8s_mysqldb.dac8ccce_fc9070b3ba4e4f2a'))
        self.assertIsNone(pat.match(
            '/k8s_mariadb.dac8ccc_fc9070b3ba4e4f2a'))
        self.assertIsNone(pat.match(
            '/k8s_mariadb.dac8ccce_gc9070b3ba4e4f22a'))

    def test_required_images(self):
        self.assertEqual(
            set([
                'kollaglue/fedora-rdo-heat-engine',
                'kollaglue/fedora-rdo-rabbitmq']),
            hook_kubelet.required_images(self.config))

        self.assertEqual(
            set(), hook_kubelet.required_images({'config': {}}))

    def test_required_container_patterns(self):
        patterns = hook_kubelet.required_container_patterns(self.config)
        self.assertEqual({
            'heat-engine': '^/k8s_heat-engine\\.[0-9a-z]{8}_a50ae8ddb0c4407',
            'heat-engine2': '^/k8s_heat-engine2\\.[0-9a-z]{8}_a50ae8ddb0c4407',
            'rabbitmq': '^/k8s_rabbitmq\\.[0-9a-z]{8}_a50ae8ddb0c4407'
        }, patterns)
