#!/usr/bin/env python


#
#    Copyright (c) 2016-2017 Nest Labs, Inc.
#    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.
#

#
#    @file
#       Implements WeaveHeartbeat class that tests Weave Heartbeat among Weave Nodes.
#

import os
import sys
import time

from happy.ReturnMsg import ReturnMsg
from happy.Utils import *
from happy.HappyNode import HappyNode
from happy.HappyNetwork import HappyNetwork

from plugin.WeaveTest import WeaveTest


options = {}
options["client"] = None
options["server"] = None
options["count"] = None
options["quiet"] = False
options["tap"] = None
options["use_persistent_storage"] = True


def option():
    return options.copy()


class WeaveHeartbeat(HappyNode, HappyNetwork, WeaveTest):
    """
    weave-heartbeat [-h --help] [-q --quiet] [-o --origin <NAME>] [-s --server <NAME>]
           [-c --count <NUMBER>] [-p --tap <TAP_INTERFACE>]

    return:
        int  number of heartbeats

    """
    def __init__(self, opts = options):
        HappyNode.__init__(self)
        HappyNetwork.__init__(self)
        WeaveTest.__init__(self)

        self.quiet = opts["quiet"]
        self.count = opts["count"]
        self.client = opts["client"]
        self.server = opts["server"]
        self.tap = opts["tap"]

        self.no_service = False

        self.server_process_tag = "WEAVE-HEARTBEAT-SERVER"
        self.client_process_tag = "WEAVE-HEARTBEAT-CLIENT"
        self.use_persistent_storage = opts["use_persistent_storage"]

        self.client_node_id = None
        self.server_node_id = None


    def __pre_check(self):
        # Check if Weave Heartbeat client node is given.
        if self.client == None:
            emsg = "Missing name or address of the Weave Heartbeat client node."
            self.logger.error("[localhost] WeaveHeartbeat: %s" % (emsg))
            sys.exit(1)

        # Check if Weave Heartbeat server node is given.
        if self.server == None:
            emsg = "Missing name or address of the Weave Heartbeat server node."
            self.logger.error("[localhost] WeaveHeartbeat: %s" % (emsg))
            sys.exit(1)

        # Make sure that fabric was created
        if self.getFabricId() == None:
            emsg = "Weave Fabric has not been created yet."
            self.logger.error("[localhost] WeaveHeartbeat: %s" % (emsg))
            sys.exit(1)

        if self.count != None and self.count.isdigit():
            self.count = int(float(self.count))
        else:
            self.count = 1

        # Check if Weave Heartbeat client node exists.
        if self._nodeExists(self.client):
            self.client_node_id = self.client

        # Check if Weave Heartbeat server node exists.
        if self._nodeExists(self.server):
            self.server_node_id = self.server

        # Check if client is provided in a form of IP address
        if self.isIpAddress(self.client):
            self.client_node_id = self.getNodeIdFromAddress(self.client)

        # Check if server is provided in a form of IP address
        if self.isIpAddress(self.server):
            self.no_service = True
            self.server_ip = self.server
            self.server_weave_id = self.IPv6toWeaveId(self.server)
        else:
            # Check if server is a true clound service instance
            if self.getNodeType(self.server) == self.node_type_service:
                self.no_service = True

        if self.client_node_id == None:
            emsg = "Unknown identity of the client node."
            self.logger.error("[localhost] WeaveHeartbeat: %s" % (emsg))
            sys.exit(1)

        if not self.no_service and self.server_node_id == None:
            emsg = "Unknown identity of the server node."
            self.logger.error("[localhost] WeaveHeartbeat: %s" % (emsg))
            sys.exit(1)

        if self.getNodeType(self.client_node_id) == "service":
            self.client_ip = self.getServiceWeaveIPAddress("Heartbeat", self.client_node_id)
            self.client_weave_id = self.getServiceWeaveID("Heartbeat", self.client_node_id)
        else:
            self.client_ip = self.getNodeWeaveIPAddress(self.client_node_id)
            self.client_weave_id = self.getWeaveNodeID(self.client_node_id)

        if self.getNodeType(self.server_node_id) == "service":
            self.server_ip = self.getServiceWeaveIPAddress("Heartbeat", self.server_node_id)
            self.server_weave_id = self.getServiceWeaveID("Heartbeat", self.server_node_id)
        else:
            if not self.no_service:
                self.server_ip = self.getNodeWeaveIPAddress(self.server_node_id)
                self.server_weave_id = self.getWeaveNodeID(self.server_node_id)

        # Check if all unknowns were found

        if self.client_ip == None:
            emsg = "Could not find IP address of the client node."
            self.logger.error("[localhost] WeaveHeartbeat: %s" % (emsg))
            sys.exit(1)

        if self.server_ip == None:
            emsg = "Could not find IP address of the server node."
            self.logger.error("[localhost] WeaveHeartbeat: %s" % (emsg))
            sys.exit(1)

        if self.client_weave_id == None:
            emsg = "Could not find Weave node ID of the client node."
            self.logger.error("[localhost] WeaveHeartbeat: %s" % (emsg))
            sys.exit(1)

        if not self.no_service and self.server_weave_id == None:
            emsg = "Could not find Weave node ID of the server node."
            self.logger.error("[localhost] WeaveHeartbeat: %s" % (emsg))
            sys.exit(1)


    def __process_results(self, output):
        heartbeat_num = 0

        for line in output.split("\n"):
            if not "Heartbeat " in line:
                continue
            
            heartbeat_num += 1

        if self.quiet == False:
            print "weave-heartbeat from node %s (%s) to node %s (%s) : " % \
                (self.client_node_id, self.client_ip,
                 self.server_node_id, self.server_ip),
                 
            print hgreen("%d heartbeats" % (heartbeat_num))
            
        return (heartbeat_num, output)
    

    def __start_server_side(self):
        if self.no_service:
            return

        cmd = self.getWeaveHeartbeatPath()
        if not cmd:
            return

        if self.tap:
            cmd += " --interface " + self.tap

        self.start_simple_weave_server(cmd, self.server_ip,
             self.server_node_id, self.server_process_tag, use_persistent_storage=self.use_persistent_storage)


    def __start_client_side(self):
        cmd = self.getWeaveHeartbeatPath()
        if not cmd:
            return
    
        cmd += " --count " + str(self.count)

        if self.tap:
            cmd += " --interface " + self.tap

        self.start_simple_weave_client(cmd, self.client_ip,
            self.server_ip, self.server_weave_id,
            self.client_node_id, self.client_process_tag, use_persistent_storage=self.use_persistent_storage)


    def __wait_for_client(self):
        self.wait_for_test_to_end(self.client_node_id, self.client_process_tag)


    def __stop_server_side(self):
        if self.no_service:
            return

        self.stop_weave_process(self.server_node_id, self.server_process_tag)


    def run(self):
        self.__pre_check()

        self.__start_server_side()

        emsg = "WeaveHeartbeat %s should be running." % (self.server_process_tag)
        self.logger.debug("[%s] WeaveHeartbeat: %s" % (self.server_node_id, emsg))

        self.__start_client_side()

        self.__wait_for_client()

        client_output_value, client_output_data = \
            self.get_test_output(self.client_node_id, self.client_process_tag, True)
        client_strace_value, client_strace_data = \
            self.get_test_strace(self.client_node_id, self.client_process_tag, True)


        if self.no_service:
            server_output_data = ""
            server_strace_data = ""
        else:
            self.__stop_server_side()
            server_output_value, server_output_data = \
                self.get_test_output(self.server_node_id, self.server_process_tag, True)
            server_strace_value, server_strace_data = \
                self.get_test_strace(self.server_node_id, self.server_process_tag, True)

        cnt, results = self.__process_results(client_output_data)

        data = {}
        data["client_output"] = client_output_data
        data["client_strace"] = client_strace_data
        data["server_output"] = server_output_data
        data["server_strace"] = server_strace_data

        return ReturnMsg(cnt, data)

