#!/usr/bin/python -B
# coding=UTF-8

import sys
import log
import os
import copy
from optparse import OptionParser

import util
util.install_sigint_handler()
(homedir,logdir) = util.get_required_env()

parser = OptionParser(usage="%prog [-w [WAIT_TIME]]" + util.CLIENT_OPTIONS_USAGE,
                      description=u"Stops a cluster.",
			version="%prog [V2.8.00]")
util.add_client_options(parser)
parser.add_option("-w", "--wait", action='callback', callback=\
					util.optional_arg(0), dest="wait_time",default=None,
                  help=u"wait for completion of stopping a cluster")
(options, args) = parser.parse_args()

if options.username is None:
	print u"AF0001: Specify a user name and a password. (-u USER/PASS)"
	sys.exit(2)
if options.wait_time is not None:
	try:
		wait_time = int(options.wait_time)
	except ValueError:
		print u"AF0002: Specify the correct number of seconds to wait. (-w WAIT_TIME)"
		sys.exit(2)

log = log.logger(__file__, log.DEBUG)
log.info("%s start." % (__file__))
tmpoptions = copy.deepcopy(options)
tmpoptions.password = "***"
log.info(tmpoptions)

e = 0
nodestat = util.get_nodestat(options, log)
if nodestat != "ACTIVE":
	e = 1
	if nodestat is not None:
		if nodestat == "INACTIVE":
			print u"AF0101: Node is not joined."
			log.error("AF0101: Node is not joined. (status="+nodestat+")")
			e = 3
		else:
			print u"AF0102: Confirm node status."
			log.error("AF0102: Confirm node status (status="+nodestat+")")
	else:
		log.error("AF0106: Failed to stop cluster.")
	sys.exit(e)

c = util.is_active_cluster(options, log)
if c is None:
	print u"AF0103: Confirm node status."
	log.error("AF0103: Faild to retrieve the node status.")
	sys.exit(1)
elif not c:
	print u"AF0104: Cluster is not started."
	log.error("AF0104: Cluster is not started.")
	sys.exit(3)

(options.server,options.port) = util.get_master_addr(options,log)
if options.server is None:
	print u"AF0105: Failed to get master node address"
	log.info("AF0105: Getting address failed.")
	sys.exit(1)

log.info("request stop cluster (master="+options.server+":"+str(options.port)+")")
method = "POST"
path = "/cluster/stop"
data = {}
(res, code) = util.request_rest(method, path, data, options, log)

if options.wait_time is not None:
	sleep_time = 0
	while nodestat != "INACTIVE":
		util.wait_one_sec()
		sleep_time += 1
		nodestat = util.get_nodestat(options, log)
		if nodestat is None:
			e = 1
			break
		if sleep_time == wait_time:
			e = 2
			break
	util.wait_error_case(e,log,u"\nStopped cluster")
	log.info("%s end." % (__file__))
	sys.exit(e)

if code != 200:
	log.error("AF0107: Failed to stop cluster.")
	sys.exit(1)

log.info("%s end." % (__file__))

