#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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 time
import subprocess
import os

from cluster_information import *

class ClusterActions:
    def __init__(self, cluster_xml_file):
        self.ci = ClusterInformation(cluster_xml_file)

    def deploy_cluster(self, base_folder):
        pass

    def deploy(self, push_folder):
        push_folder_path = os.path.dirname(push_folder)
        push_folder_name = os.path.basename(push_folder)
        tar_file = push_folder_name + ".tar.gz"

        # Make sure zip does not already exist.
        remove_command = "rm " + tar_file
        subprocess.call(remove_command, shell=True)
        time.sleep(2)
        
        # TODO Consider using python command instead of os.system.
        print "Creating a zip file to push out."
        # Change to root directory so you do not copy the directory you are in.
        tar_command = "cd /tmp; tar -zcf " + tar_file + " -C " + push_folder_path + " " + push_folder_name
        subprocess.call(tar_command, shell=True)
        move_command = "mv /tmp/" + tar_file + " ."
        subprocess.call(move_command, shell=True)

        # Cluster Controller
        machine = self.ci.get_master_node_machine()
        self.deploy_machine(machine, tar_file)
        # Node Controllers
        for machine in self.ci.get_node_machine_list():
            self.deploy_machine(machine, tar_file)

        print "Remove the push zip file."
        remove_command = "rm " + tar_file
        subprocess.call(remove_command, shell=True)
        
    def start(self):
        machine = self.ci.get_master_node_machine()
        self.start_cc(machine)
        time.sleep(5)
        self.start_all_ncs()
    
    def stop_cluster(self):
        machine = self.ci.get_master_node_machine()
        self.stop_cc_and_all_ncs(machine)
    
    def stop(self):
        self.stop_all_ncs()
        time.sleep(2)
        machine = self.ci.get_master_node_machine()
        self.stop_cc(machine)

    def start_all_ncs(self):
        cc = self.ci.get_master_node_machine()
        for machine in self.ci.get_node_machine_list():
            self.start_nc(machine, cc)
    
    def stop_all_ncs(self):
        for machine in self.ci.get_node_machine_list():
            self.stop_nc(machine)

    # --------------------------------------------------------------------------
    # Machine Specific Functions
    # --------------------------------------------------------------------------
    def deploy_machine(self, machine, tar_file):
        print "Deploy Controller."
        print "  " + machine.get_id() + " " + machine.get_ip()
        
        # Push the information out to each server.    
        print "  - Add new file."
        remove_tar_command = "rm " + tar_file + ""
        self.run_remote_command(machine.get_username(), machine.get_id(), remove_tar_command)
        copy_command = "scp " + tar_file + " " + machine.get_username() + "@" + machine.get_id() + ":"
        subprocess.call(copy_command, shell=True)
        
        print "  - Expand new file."
        base_folder = tar_file.split('.')[0]
        remove_folder_command = "rm -rf " + base_folder + ""
        self.run_remote_command(machine.get_username(), machine.get_id(), remove_folder_command)
        unpack_command = "tar -zxf " + tar_file + ""
        self.run_remote_command(machine.get_username(), machine.get_id(), unpack_command)
        # Make the bin files executable.
        chmod_command = "chmod u+x " + base_folder + "/target/appassembler/bin/vxq*"
        self.run_remote_command(machine.get_username(), machine.get_id(), chmod_command)
        chmod_command = "chmod u+x " + base_folder + "/target/appassembler/bin/*.sh"
        self.run_remote_command(machine.get_username(), machine.get_id(), chmod_command)
        
        print "  - Server clean up."
        self.run_remote_command(machine.get_username(), machine.get_id(), remove_tar_command)
        
    
    def start_cc(self, machine):
        print "Start Cluster Controller."
        print "  " + machine.get_id() + " " + machine.get_client_ip() + ":" + machine.get_client_port()
        command = "./vxquery-server/target/appassembler/bin/startcc.sh " + machine.get_client_ip() + " \"" + machine.get_client_port() + "\" \"" + machine.get_java_opts() + "\""
        self.run_remote_command(machine.get_username(), machine.get_id(), command)
    
    def start_nc(self, machine, cc):
        print "Start Node Controller."
        print "  " + machine.get_id() + " " + machine.get_ip()
        command = "./vxquery-server/target/appassembler/bin/startnc.sh " + machine.get_id() + " " + machine.get_ip() + " " + cc.get_client_ip() + " \"" + cc.get_client_port() + "\" \"" + machine.get_java_opts() + "\" \"" + self.ci.get_index_directory() + "\""
        self.run_remote_command(machine.get_username(), machine.get_id(), command)

    def stop_cc_and_all_ncs(self, machine):
        print "Stop Cluster and Node Controllers."
        print "  " + machine.get_id() + " " + machine.get_client_ip() + ":" + machine.get_client_port()
        command = "./vxquery-server/target/appassembler/bin/stopcluster.sh " + machine.get_client_ip() + " \"" + machine.get_client_port() + "\" \"" + machine.get_java_opts() + "\""
        self.run_remote_command(machine.get_username(), machine.get_id(), command)
    
    def stop_cc(self, machine):
        print "Stop Cluster Controller."
        print "  " + machine.get_id() + " " + machine.get_ip()
        command = "./vxquery-server/target/appassembler/bin/stopcc.sh " + machine.get_username()
        self.run_remote_command(machine.get_username(), machine.get_id(), command)
    
    def stop_nc(self, machine):
        print "Stop Node Controller."
        print "  " + machine.get_id() + " " + machine.get_ip()
        command = "./vxquery-server/target/appassembler/bin/stopnc.sh " + machine.get_username()
        self.run_remote_command(machine.get_username(), machine.get_id(), command)
        
    def run_remote_command(self, username, host, command):
        remote_command = "ssh -x " + username + "@" + host + " '" + command + "' "
#         print remote_command
        os.system(remote_command)

