blob: 8ce160711cc0d7ad815192f592b4b1dbcad2784c [file] [log] [blame]
#!/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)