blob: a19fd11070f0d24894c8b46bdacf971fd0ef9468 [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 optparse
import os
import sys
from ambari_commons.ambari_service import AmbariService
from ambari_commons.exceptions import FatalException
from ambari_commons.os_utils import remove_file
from ambari_commons.os_windows import SvcStatusCallback, WinServiceController, SERVICE_STATUS_RUNNING
from ambari_metrics_collector.serviceConfiguration import get_properties, get_value_from_properties, DEBUG_MODE_KEY, \
SUSPEND_START_MODE_KEY, PID_OUT_FILE, SERVER_OUT_FILE_KEY, SERVER_OUT_FILE, SERVICE_USERNAME_KEY, SERVICE_PASSWORD_KEY, \
DEFAULT_CONF_DIR, EMBEDDED_HBASE_MASTER_SERVICE
from embedded_hbase_service import EmbeddedHBaseService
from main import server_process_main
class AMCollectorService(AmbariService):
AmbariService._svc_name_ = "AmbariMetricsCollector"
AmbariService._svc_display_name_ = "Ambari Metrics Collector"
AmbariService._svc_description_ = "Ambari Metrics Collector Service"
# Adds the necessary script dir(s) to the Python's modules path.
# Modify this as the deployed product's dir structure changes.
def _adjustPythonPath(self, current_dir):
python_path = os.path.join(current_dir, "sbin")
sys.path.insert(0, python_path)
pass
@classmethod
def Install(cls, startupMode = "auto", username = None, password = None, interactive = False,
perfMonIni = None, perfMonDll = None):
script_path = os.path.dirname(__file__.replace('/', os.sep))
classPath = os.path.join(script_path, cls.__module__) + "." + cls.__name__
return AmbariService.Install(classPath, startupMode, username, password, interactive,
perfMonIni, perfMonDll)
def SvcDoRun(self):
scmStatus = SvcStatusCallback(self)
properties = get_properties()
self.options.debug = get_value_from_properties(properties, DEBUG_MODE_KEY, self.options.debug)
self.options.suspend_start = get_value_from_properties(properties, SUSPEND_START_MODE_KEY, self.options.suspend_start)
self.redirect_output_streams()
childProc = server_process_main(self.options, scmStatus)
if not self._StopOrWaitForChildProcessToFinish(childProc):
return
remove_file(PID_OUT_FILE)
pass
def _InitOptionsParser(self):
return init_options_parser()
def redirect_output_streams(self):
properties = get_properties()
outFilePath = properties[SERVER_OUT_FILE_KEY]
if (outFilePath is None or outFilePath == ""):
outFilePath = SERVER_OUT_FILE
self._RedirectOutputStreamsToFile(outFilePath)
pass
def ctrlHandler(ctrlType):
AMCollectorService.DefCtrlCHandler()
return True
def svcsetup():
AMCollectorService.set_ctrl_c_handler(ctrlHandler)
# we don't save password between 'setup' runs, so we can't run Install every time. We run 'setup' only if user and
# password provided or if service not installed
if (SERVICE_USERNAME_KEY in os.environ and SERVICE_PASSWORD_KEY in os.environ):
EmbeddedHBaseService.Install(username=os.environ[SERVICE_USERNAME_KEY], password=os.environ[SERVICE_PASSWORD_KEY])
AMCollectorService.Install(username=os.environ[SERVICE_USERNAME_KEY], password=os.environ[SERVICE_PASSWORD_KEY])
else:
EmbeddedHBaseService.Install()
AMCollectorService.Install()
pass
#
# Starts the Ambari Metrics Collector. The server can start as a service or standalone process.
# args:
# options.is_process = True - start the server as a process. For now, there is no restrictions for the number of
# server instances that can run like this.
# options.is_process = False - start the server in normal mode, as a Windows service. If the Ambari Metrics Collector
# is not registered as a service, the function fails. By default, only one instance of the service can
# possibly run.
#
def start(options):
AMCollectorService.set_ctrl_c_handler(ctrlHandler)
if options.is_process:
#Run as a normal process. Invoke the ServiceMain directly.
childProc = server_process_main(options)
childProc.wait()
remove_file(PID_OUT_FILE)
else:
AMCollectorService.Start()
#
# Stops the Ambari Metrics Collector. Ineffective when the server is started as a standalone process.
#
def stop():
AMCollectorService.Stop()
#
# Prints the Ambari Metrics Collector service status.
#
def svcstatus(options):
options.exit_message = None
statusStr = AMCollectorService.QueryStatus()
print "Ambari Metrics Collector is " + statusStr
def setup(options):
svcsetup()
def init_options_parser():
parser = optparse.OptionParser(usage="usage: %prog action [options]", )
parser.add_option('--config', dest="conf_dir",
default=DEFAULT_CONF_DIR,
help="Configuration files directory")
parser.add_option('--debug', action="store_true", dest='debug', default=False,
help="Start ambari-metrics-collector in debug mode")
parser.add_option('--suspend-start', action="store_true", dest='suspend_start', default=False,
help="Freeze ambari-metrics-collector Java process at startup in debug mode")
parser.add_option('--process', action="store_true", dest='is_process', default=False,
help="Start ambari-metrics-collector as a process, not as a service")
parser.add_option('--noembedded', action="store_true", dest='no_embedded_hbase', default=False,
help="Don't attempt to start the HBASE services. Expect them to be already installed and running.")
# --help reserved for help
return parser
def init_service_debug(options):
if options.debug:
sys.frozen = 'windows_exe' # Fake py2exe so we can debug
def ensure_hadoop_service_soft_dependencies():
if SERVICE_STATUS_RUNNING != WinServiceController.QueryStatus(EMBEDDED_HBASE_MASTER_SERVICE):
err = 'ERROR: Service "{0}" was not started.'.format(EMBEDDED_HBASE_MASTER_SERVICE)
raise FatalException(1, err)