# pylint: disable=W0613

# Copyright (C) 2019 The Android Open Source Project
#
# 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.path

import pytest

from kubernetes import client

import utils

GERRIT_STARTUP_TIMEOUT = 240


@pytest.fixture(scope="session")
def gerrit_deployment_factory(
    request,
    repository_root,
    test_cluster,
    docker_tag,
    gerrit_image,
    gitgc_image,
    gerrit_init_image,
):
    def install_chart(chart_opts, wait=True):
        chart_path = os.path.join(repository_root, "helm-charts", "gerrit")
        chart_name = "gerrit-" + utils.create_random_string()
        namespace_name = utils.create_random_string()
        test_cluster.create_namespace(namespace_name)

        core_v1 = client.CoreV1Api()
        core_v1.create_namespaced_persistent_volume_claim(
            namespace_name,
            body=client.V1PersistentVolumeClaim(
                kind="PersistentVolumeClaim",
                api_version="v1",
                metadata=client.V1ObjectMeta(name="repo-storage"),
                spec=client.V1PersistentVolumeClaimSpec(
                    access_modes=["ReadWriteMany"],
                    storage_class_name="shared-storage",
                    resources=client.V1ResourceRequirements(
                        requests={"storage": "1Gi"}
                    ),
                ),
            ),
        )

        chart_opts["gitRepositoryStorage.externalPVC.use"] = "false"
        chart_opts["gitRepositoryStorage.externalPVC.name"] = "repo-storage"
        chart_opts["gitGC.logging.persistence.enabled"] = "false"

        test_cluster.helm.install(
            chart_path,
            chart_name,
            set_values=chart_opts,
            fail_on_err=True,
            namespace=namespace_name,
            wait=wait,
        )

        return {"chart": chart_path, "name": chart_name, "namespace": namespace_name}

    return install_chart


@pytest.fixture(scope="module")
def gerrit_deployment(request, docker_tag, test_cluster, gerrit_deployment_factory):
    chart_opts = {
        "images.registry.name": request.config.getoption("--registry"),
        "images.version": docker_tag,
        "ingress.enabled": True,
        "ingress.host": "primary.%s" % request.config.getoption("--ingress-url"),
    }
    chart = gerrit_deployment_factory(chart_opts)

    yield chart

    test_cluster.helm.delete(chart["name"], namespace=chart["namespace"])
    test_cluster.delete_namespace(chart["namespace"])


@pytest.fixture(scope="module")
def gerrit_ready_deployment(gerrit_deployment):

    pod_labels = "app=gerrit,release=%s" % gerrit_deployment["name"]
    finished_in_time = utils.wait_for_pod_readiness(
        pod_labels, timeout=GERRIT_STARTUP_TIMEOUT
    )

    if not finished_in_time:
        raise utils.TimeOutException(
            "Gerrit pod was not ready in time (%d s)." % GERRIT_STARTUP_TIMEOUT
        )

    yield finished_in_time
