# Copyright 2018 Red Hat
#
# 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 logging

from nodepool import zk

from nodepool.driver.openshift.handler import OpenshiftLauncher
from nodepool.driver.openshift.handler import OpenshiftNodeRequestHandler


class OpenshiftPodLauncher(OpenshiftLauncher):
    def _launchLabel(self):
        self.log.debug("Creating resource")
        pod_name = "%s-%s" % (self.label.name, self.node.id)
        project = self.handler.pool.name
        self.handler.manager.createPod(project, pod_name, self.label)
        self.node.external_id = "%s-%s" % (project, pod_name)
        self.node.interface_ip = pod_name
        self.zk.storeNode(self.node)

        self.handler.manager.waitForPod(project, pod_name)

        self.node.state = zk.READY
        self.node.python_path = self.label.python_path
        # NOTE: resource access token may be encrypted here
        k8s = self.handler.manager.k8s_client
        self.node.connection_port = {
            'pod': pod_name,
            'namespace': project,
            'host': k8s.api_client.configuration.host,
            'ca_crt': self.handler.manager.ca_crt,
            'skiptls': not k8s.api_client.configuration.verify_ssl,
            'token': self.handler.manager.token,
            'user': 'zuul-worker',
        }
        self.node.connection_type = "kubectl"
        self.zk.storeNode(self.node)
        self.log.info("Pod %s is ready" % self.node.external_id)


class OpenshiftPodRequestHandler(OpenshiftNodeRequestHandler):
    log = logging.getLogger("nodepool.driver.openshiftpods."
                            "OpenshiftPodRequestHandler")

    def hasRemainingQuota(self, node_types):
        if len(self.manager.listNodes()) + 1 > self.provider.max_pods:
            return False
        return True

    def launch(self, node):
        label = self.pool.labels[node.type[0]]
        thd = OpenshiftPodLauncher(self, node, self.provider, label)
        thd.start()
        self._threads.append(thd)
