ambari-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fba...@apache.org
Subject [1/2] ambari git commit: AMBARI-8770 [WinGA] Add windows server assembly for AMS
Date Mon, 29 Dec 2014 20:41:01 GMT
Repository: ambari
Updated Branches:
  refs/heads/trunk e7303b1ce -> 19e972cf9


http://git-wip-us.apache.org/repos/asf/ambari/blob/19e972cf/ambari-metrics/ambari-metrics-timelineservice/src/main/python/amc_service.py
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/python/amc_service.py
b/ambari-metrics/ambari-metrics-timelineservice/src/main/python/amc_service.py
new file mode 100644
index 0000000..b901e5c
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/python/amc_service.py
@@ -0,0 +1,174 @@
+#!/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
+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"
+
+  AmbariService._AdjustServiceVersion()
+
+  # 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_hdp_service_soft_dependencies():
+  ret = WinServiceController.EnsureServiceIsStarted(EMBEDDED_HBASE_MASTER_SERVICE)
+  if ret != 0:
+    err = 'ERROR: Cannot start service "{0}". Error = {1}'.format(EMBEDDED_HBASE_MASTER_SERVICE,
ret)
+    raise FatalException(1, err)

http://git-wip-us.apache.org/repos/asf/ambari/blob/19e972cf/ambari-metrics/ambari-metrics-timelineservice/src/main/python/embedded_hbase_service.py
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/python/embedded_hbase_service.py
b/ambari-metrics/ambari-metrics-timelineservice/src/main/python/embedded_hbase_service.py
new file mode 100644
index 0000000..a699774
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/python/embedded_hbase_service.py
@@ -0,0 +1,201 @@
+#!/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 os
+import win32service
+import win32api
+from win32serviceutil import RemoveService, SmartOpenService
+import winerror
+
+from ambari_commons.xml_utils import ConvertToXml
+from ambari_metrics_collector.serviceConfiguration import EMBEDDED_HBASE_MASTER_SERVICE,
EMBEDDED_HBASE_SUBDIR, \
+  find_jdk, get_java_exe_path, build_jvm_args
+
+MASTER_JVM_ARGS = '{0} ' \
+  '"-XX:+UseConcMarkSweepGC" "-Djava.net.preferIPv4Stack=true" ' \
+  '-Dhadoop.home.dir="{1}" -Dhbase.log.dir="{2}" -Dhbase.log.file={3} -Dhbase.home.dir="{1}"
-Dhbase.id.str="{4}" ' \
+  '-Dhbase.root.logger="INFO,DRFA" -Dhbase.security.logger="INFO,RFAS" ' \
+  '-classpath "{5}" org.apache.hadoop.hbase.master.HMaster start'
+
+#-Xmx1000m "-XX:+UseConcMarkSweepGC" "-Djava.net.preferIPv4Stack=true"
+# -Dhbase.log.dir="C:\test\ambari-metrics-timelineservice-0.1.0-SNAPSHOT\hbase\logs" -Dhbase.log.file="hbase.log"
-Dhbase.home.dir="C:\test\ambari-metrics-timelineservice-0.1.0-SNAPSHOT\hbase" -Dhbase.id.str="Administrator"
+# -XX:OnOutOfMemoryError="taskkill /F /PID p" -Dhbase.root.logger="INFO,console" -Dhbase.security.logger="INFO,DRFAS"
+# -classpath "C:\test\ambari-metrics-timelineservice-0.1.0-SNAPSHOT\hbase\conf;C:\jdk1.7.0_67\lib\tools.jar;C:\test\ambari-metrics-timelineservice-0.1.0-SNAPSHOT\hbase;C:\test\ambari-metrics-timelineservice-0.1.0-SNAPSHOT\hbase\lib\*"
+# org.apache.hadoop.hbase.master.HMaster start
+def _build_master_java_args(username = None):
+  hbase_home_dir = os.path.abspath(EMBEDDED_HBASE_SUBDIR)
+  hbase_log_dir = os.path.join(os.sep, "var", "log", EMBEDDED_HBASE_MASTER_SERVICE)
+  hbase_log_file = "hbase.log"
+  hbase_user_id = username if username else "SYSTEM"
+
+  if not os.path.exists(hbase_log_dir):
+    os.makedirs(hbase_log_dir)
+
+  java_class_path = os.path.join(hbase_home_dir, "conf")
+  java_class_path += os.pathsep + os.path.join(find_jdk(), "lib", "tools.jar")
+  java_class_path += os.pathsep + hbase_home_dir
+  java_class_path += os.pathsep + os.path.join(hbase_home_dir, "lib", "*")
+
+  args = MASTER_JVM_ARGS.format(build_jvm_args(), hbase_home_dir, hbase_log_dir, hbase_log_file,
hbase_user_id, java_class_path)
+
+  return args
+
+
+def _get_config_file_path():
+  config_file_path = os.path.join(os.getcwd(), EMBEDDED_HBASE_SUBDIR, "bin", EMBEDDED_HBASE_MASTER_SERVICE
+ ".xml")
+  return config_file_path
+
+class EmbeddedHBaseService:
+  _svc_name_ = EMBEDDED_HBASE_MASTER_SERVICE
+  _svc_display_name_ = "Apache Ambari Metrics " + EMBEDDED_HBASE_MASTER_SERVICE
+  _exe_name_ = os.path.join(EMBEDDED_HBASE_SUBDIR, "bin", EMBEDDED_HBASE_MASTER_SERVICE +
".exe")
+
+  @classmethod
+  def _get_start_type(cls, startupMode):
+    if startupMode == "auto":
+      startType = win32service.SERVICE_AUTO_START
+    elif startupMode == "disabled":
+      startType = win32service.SERVICE_DISABLED
+    else:
+      startType = win32service.SERVICE_DEMAND_START
+    return startType
+
+  @classmethod
+  def Install(cls, startupMode = "auto", username = None, password = None):
+    print "Installing service %s" % (cls._svc_name_)
+
+    # Configure master.xml, which drives the java subprocess
+    java_path = get_java_exe_path()
+    java_args = _build_master_java_args(username)
+
+    config_file_path = _get_config_file_path()
+
+    xmlFileContents = _MasterXml()
+    xmlFileContents.service.id = EMBEDDED_HBASE_MASTER_SERVICE
+    xmlFileContents.service.name = EMBEDDED_HBASE_MASTER_SERVICE
+    xmlFileContents.service.description = "This service runs " + EMBEDDED_HBASE_MASTER_SERVICE
+    xmlFileContents.service.executable = java_path
+    xmlFileContents.service.arguments = java_args
+
+    xmlFile = open(config_file_path, "w")
+    xmlFile.write( str(xmlFileContents) )
+    xmlFile.close()
+
+    startType = cls._get_start_type(startupMode)
+    serviceType = win32service.SERVICE_WIN32_OWN_PROCESS
+    errorControl = win32service.SERVICE_ERROR_NORMAL
+
+    commandLine = os.path.abspath(cls._exe_name_)
+    hscm = win32service.OpenSCManager(None,None,win32service.SC_MANAGER_ALL_ACCESS)
+    try:
+      try:
+        hs = win32service.CreateService(hscm,
+                                        cls._svc_name_,
+                                        cls._svc_display_name_,
+                                        win32service.SERVICE_ALL_ACCESS,         # desired
access
+                                        serviceType,        # service type
+                                        startType,
+                                        errorControl,       # error control type
+                                        commandLine,
+                                        None,
+                                        0,
+                                        None,
+                                        username,
+                                        password)
+        print "Service installed"
+        win32service.CloseServiceHandle(hs)
+      finally:
+        win32service.CloseServiceHandle(hscm)
+    except win32service.error, exc:
+      if exc.winerror==winerror.ERROR_SERVICE_EXISTS:
+        cls.Update(username, password)
+      else:
+        print "Error installing service: %s (%d)" % (exc.strerror, exc.winerror)
+        err = exc.winerror
+    except ValueError, msg: # Can be raised by custom option handler.
+      print "Error installing service: %s" % str(msg)
+      err = -1
+      # xxx - maybe I should remove after _any_ failed install - however,
+      # xxx - it may be useful to help debug to leave the service as it failed.
+      # xxx - We really _must_ remove as per the comments above...
+      # As we failed here, remove the service, so the next installation
+      # attempt works.
+      try:
+        RemoveService(cls._svc_name_)
+      except win32api.error:
+        print "Warning - could not remove the partially installed service."
+
+  @classmethod
+  def Update(cls, startupMode = "auto", username = None, password = None):
+    # Handle the default arguments.
+    if startupMode is None:
+      startType = win32service.SERVICE_NO_CHANGE
+    else:
+      startType = cls._get_start_type(startupMode)
+
+    hscm = win32service.OpenSCManager(None,None,win32service.SC_MANAGER_ALL_ACCESS)
+    serviceType = win32service.SERVICE_WIN32_OWN_PROCESS
+
+    commandLine = os.path.abspath(cls._exe_name_)
+
+    try:
+      hs = SmartOpenService(hscm, cls._svc_name_, win32service.SERVICE_ALL_ACCESS)
+      try:
+        win32service.ChangeServiceConfig(hs,
+                                         serviceType,  # service type
+                                         startType,
+                                         win32service.SERVICE_NO_CHANGE,       # error control
type
+                                         commandLine,
+                                         None,
+                                         0,
+                                         None,
+                                         username,
+                                         password,
+                                         cls._svc_display_name_)
+        print "Service updated"
+      finally:
+        win32service.CloseServiceHandle(hs)
+    finally:
+      win32service.CloseServiceHandle(hscm)
+
+class _MasterXml(ConvertToXml):
+  service = ""  #Service entity
+
+  def __init__(self):
+    self.service = _ServiceXml()
+
+  def __str__(self):
+    result = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+    result += str(self.service)
+    return result
+
+class _ServiceXml(ConvertToXml):
+  def __init__(self):
+    self.id = ""
+    self.name = ""
+    self.description = ""
+    self.executable = ""
+    self.arguments = ""
+
+  def __str__(self):
+    result = "<service>\n"
+    result += self.attributesToXml()
+    result += "</service>"
+    return result

http://git-wip-us.apache.org/repos/asf/ambari/blob/19e972cf/ambari-metrics/ambari-metrics-timelineservice/src/main/python/main.py
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-timelineservice/src/main/python/main.py b/ambari-metrics/ambari-metrics-timelineservice/src/main/python/main.py
new file mode 100644
index 0000000..172861e
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-timelineservice/src/main/python/main.py
@@ -0,0 +1,214 @@
+#!/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 os
+import subprocess
+import sys
+
+from ambari_commons.exceptions import FatalException, NonFatalException
+from ambari_commons.logging_utils import print_info_msg, print_warning_msg, print_error_msg
+from ambari_metrics_collector.serviceConfiguration import get_java_exe_path, get_java_cp,
build_jvm_args, \
+  SETUP_ACTION, START_ACTION, STOP_ACTION, RESTART_ACTION, STATUS_ACTION, PID_DIR, EXITCODE_OUT_FILE,
\
+  SERVER_OUT_FILE, PID_OUT_FILE, SERVER_LOG_FILE
+
+
+# debug settings
+SERVER_START_DEBUG = False
+SUSPEND_START_MODE = False
+
+AMS_ENV_CMD = "ams-env.cmd"
+
+SERVER_START_CMD = \
+  "-cp {0} {1} " + \
+  "-Djava.net.preferIPv4Stack=true " \
+  "-Dproc_timelineserver " + \
+  "org.apache.hadoop.yarn.server.applicationhistoryservice.ApplicationHistoryServer"
+SERVER_START_CMD_DEBUG = \
+  "-cp {0} {1} " + \
+  "-Djava.net.preferIPv4Stack=true " \
+  "-Dproc_timelineserver " + \
+  " -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend={2} " + \
+  "org.apache.hadoop.yarn.server.applicationhistoryservice.ApplicationHistoryServer"
+
+AMC_DIE_MSG = "Ambari Metrics Collector java process died with exitcode {0}. Check {1} for
more information."
+
+
+def save_pid(pid, pidfile):
+  """
+    Save pid to pidfile.
+  """
+  try:
+    pfile = open(pidfile, "w")
+    pfile.write("%s\n" % pid)
+  except IOError:
+    pass
+  finally:
+    try:
+      pfile.close()
+    except:
+      pass
+
+
+def exec_ams_env_cmd(options):
+  ams_env_cmd = os.path.join(options.conf_dir, AMS_ENV_CMD)
+  if os.path.exists(ams_env_cmd):
+    cmds = ["cmd.exe", "/C", ams_env_cmd]
+    procAms = subprocess.Popen(cmds, env=os.environ)
+    out, err = procAms.communicate()
+    if err is not None and err is not "":
+      print_warning_msg(AMS_ENV_CMD + " error output: " + err)
+    if out is not None and out is not "":
+      print_info_msg(AMS_ENV_CMD + " output: " + out)
+  else:
+    err = 'ERROR: Cannot execute "{0}"'.format(ams_env_cmd)
+    raise FatalException(1, err)
+
+
+def server_process_main(options, scmStatus=None):
+  if scmStatus is not None:
+    scmStatus.reportStartPending()
+
+  # debug mode
+  try:
+    global DEBUG_MODE
+    DEBUG_MODE = options.debug
+  except AttributeError:
+    pass
+
+  # stop Java process at startup?
+  try:
+    global SUSPEND_START_MODE
+    SUSPEND_START_MODE = options.suspend_start
+  except AttributeError:
+    pass
+
+  #options.conf_dir <= --config
+  if not os.path.isdir(options.conf_dir):
+    err = 'ERROR: Cannot find configuration directory "{0}"'.format(options.conf_dir)
+    raise FatalException(1, err)
+
+  #execute ams-env.cmd
+  exec_ams_env_cmd(options)
+
+  #Ensure the 3 Hadoop services required are started on the local machine
+  if not options.no_embedded_hbase:
+    from amc_service import ensure_hdp_service_soft_dependencies
+    ensure_hdp_service_soft_dependencies()
+
+  if scmStatus is not None:
+    scmStatus.reportStartPending()
+
+  java_exe = get_java_exe_path()
+  java_class_path = get_java_cp()
+  java_heap_max = build_jvm_args()
+  command_base = SERVER_START_CMD_DEBUG if (DEBUG_MODE or SERVER_START_DEBUG) else SERVER_START_CMD
+  suspend_mode = 'y' if SUSPEND_START_MODE else 'n'
+  command = command_base.format(java_class_path, java_heap_max, suspend_mode)
+  if not os.path.exists(PID_DIR):
+    os.makedirs(PID_DIR, 0755)
+
+  #Ignore the requirement to run as root. In Windows, by default the child process inherits
the security context
+  # and the environment from the parent process.
+  param_list = java_exe + " " + command
+
+  print_info_msg("Running server: " + str(param_list))
+  procJava = subprocess.Popen(param_list, env=os.environ)
+
+  #wait for server process for SERVER_START_TIMEOUT seconds
+  print "Waiting for server start..."
+
+  pidJava = procJava.pid
+  if pidJava <= 0:
+    procJava.terminate()
+    exitcode = procJava.returncode
+    save_pid(exitcode, EXITCODE_OUT_FILE)
+
+    if scmStatus is not None:
+      scmStatus.reportStopPending()
+
+    raise FatalException(-1, AMC_DIE_MSG.format(exitcode, SERVER_OUT_FILE))
+  else:
+    save_pid(pidJava, PID_OUT_FILE)
+    print "Server PID at: " + PID_OUT_FILE
+    print "Server out at: " + SERVER_OUT_FILE
+    print "Server log at: " + SERVER_LOG_FILE
+
+  if scmStatus is not None:
+    scmStatus.reportStarted()
+
+  return procJava
+
+def main():
+  from amc_service import init_options_parser, init_service_debug, setup, start, stop, svcstatus
+
+  parser = init_options_parser()
+  (options, args) = parser.parse_args()
+
+  options.warnings = []
+  options.exit_message = None
+
+  init_service_debug(options)
+
+  if len(args) == 0:
+    print parser.print_help()
+    parser.error("No action entered")
+
+  action = args[0]
+
+  try:
+    if action == SETUP_ACTION:
+      setup(options)
+    elif action == START_ACTION:
+      start(options)
+    elif action == STOP_ACTION:
+      stop()
+    elif action == RESTART_ACTION:
+      stop()
+      start(options)
+    elif action == STATUS_ACTION:
+      svcstatus(options)
+    else:
+      parser.error("Invalid action")
+
+    if options.warnings:
+      for warning in options.warnings:
+        print_warning_msg(warning)
+        pass
+      options.exit_message = "Ambari Metrics Collector '%s' completed with warnings." % action
+      pass
+  except FatalException as e:
+    if e.reason is not None:
+      print_error_msg("Exiting with exit code {0}. \nREASON: {1}".format(e.code, e.reason))
+    sys.exit(e.code)
+  except NonFatalException as e:
+    options.exit_message = "Ambari Metrics Collector '%s' completed with warnings." % action
+    if e.reason is not None:
+      print_warning_msg(e.reason)
+
+  if options.exit_message is not None:
+    print options.exit_message
+
+
+if __name__ == "__main__":
+  try:
+    main()
+  except (KeyboardInterrupt, EOFError):
+    print("\nAborting ... Keyboard Interrupt.")
+    sys.exit(1)

http://git-wip-us.apache.org/repos/asf/ambari/blob/19e972cf/ambari-metrics/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-metrics/pom.xml b/ambari-metrics/pom.xml
index da7fc14..d99cc82 100644
--- a/ambari-metrics/pom.xml
+++ b/ambari-metrics/pom.xml
@@ -57,6 +57,33 @@
   <build>
     <plugins>
       <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <version>1.8</version>
+        <executions>
+          <execution>
+            <id>parse-version</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>parse-version</goal>
+            </goals>
+          </execution>
+          <execution>
+            <id>regex-property</id>
+            <goals>
+              <goal>regex-property</goal>
+            </goals>
+            <configuration>
+              <name>ambariVersion</name>
+              <value>${project.version}</value>
+              <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)(\.|-).*</regex>
+              <replacement>$1.$2.$3</replacement>
+              <failIfNoMatch>false</failIfNoMatch>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <configuration>
           <descriptors>

http://git-wip-us.apache.org/repos/asf/ambari/blob/19e972cf/ambari-server/src/main/python/ambari-server-state/Entities.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari-server-state/Entities.py b/ambari-server/src/main/python/ambari-server-state/Entities.py
index 379c95f..b9f61c3 100644
--- a/ambari-server/src/main/python/ambari-server-state/Entities.py
+++ b/ambari-server/src/main/python/ambari-server-state/Entities.py
@@ -1,5 +1,3 @@
-import inspect
-
 # 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
@@ -16,20 +14,7 @@ import inspect
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-class ConvertToXml:
-  "Template class, allow to output fields in xml format"
-  def getField(self):
-    return [name for name, obj in inspect.getmembers(self)
-            if not name.startswith("__") and not inspect.isroutine(obj)]
-
-  def attributesToXml(self):
-    result = ""
-    listOfAttr = self.getField()
-    for attrName in listOfAttr:
-      result += "<" + attrName + ">"
-      result += str(getattr(self, attrName))
-      result += "</" + attrName + ">"
-    return result
+from ambari_commons.xml_utils import ConvertToXml
 
 
 class Configurations(ConvertToXml):

http://git-wip-us.apache.org/repos/asf/ambari/blob/19e972cf/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index af4fc01..d33828b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -179,6 +179,8 @@
             <exclude>derby.log</exclude>
             <exclude>CHANGES.txt</exclude>
             <exclude>pass.txt</exclude>
+            <exclude>ambari-metrics/ambari-metrics-host-monitoring/conf/unix/metric_groups.conf</exclude>
+            <exclude>ambari-metrics/ambari-metrics-host-monitoring/conf/windows/metric_groups.conf</exclude>
             <exclude>contrib/addons/test/dataServices/jmx/data/cluster_configuration.json.nohbase</exclude>
             <exclude>contrib/ambari-scom/msi/src/GUI_Ambari.sln</exclude>
             <exclude>version</exclude>


Mime
View raw message