You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by yu...@apache.org on 2014/12/19 22:51:56 UTC
[7/7] ambari git commit: Revert "AMBARI-8373 Refactor the
OS-dependent Ambari Server Windows components"
Revert "AMBARI-8373 Refactor the OS-dependent Ambari Server Windows components"
This reverts commit 2914d681dacc675a0a4a379fd20066cfd415e8b8.
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/fad56746
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/fad56746
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/fad56746
Branch: refs/heads/trunk
Commit: fad56746f7a6181c883fa0b0ba8e58f137dfde52
Parents: 613bdd7
Author: Yusaku Sako <yu...@hortonworks.com>
Authored: Fri Dec 19 13:51:22 2014 -0800
Committer: Yusaku Sako <yu...@hortonworks.com>
Committed: Fri Dec 19 13:51:22 2014 -0800
----------------------------------------------------------------------
.../src/main/python/ambari_agent/HostInfo.py | 42 -
.../src/main/python/ambari_commons/firewall.py | 93 +-
.../main/python/ambari_commons/inet_utils.py | 17 +-
.../python/ambari_commons/os_family_impl.py | 35 +-
.../src/main/python/ambari_commons/os_linux.py | 13 +-
.../src/main/python/ambari_commons/os_utils.py | 20 +-
.../main/python/ambari_commons/os_windows.py | 147 +-
.../core/providers/windows/system.py | 4 +-
.../functions/get_unique_id_and_date.py | 33 +-
ambari-server/conf/unix/ambari.properties | 17 +-
ambari-server/conf/windows/ambari.properties | 15 +-
.../src/main/python/ambari-server-windows.py | 78 +-
ambari-server/src/main/python/ambari-server.py | 1272 +++++++-
.../python/ambari_server/dbConfiguration.py | 318 +-
.../ambari_server/dbConfiguration_linux.py | 1189 ++++---
.../ambari_server/dbConfiguration_windows.py | 242 +-
.../src/main/python/ambari_server/properties.py | 15 +-
.../python/ambari_server/resourceFilesKeeper.py | 4 +-
.../python/ambari_server/serverConfiguration.py | 277 +-
.../ambari_server/serverConfiguration_linux.py | 67 +
.../serverConfiguration_windows.py | 98 +
.../main/python/ambari_server/serverSetup.py | 1038 ++----
.../python/ambari_server/serverSetup_linux.py | 795 +++++
.../python/ambari_server/serverSetup_windows.py | 313 ++
.../main/python/ambari_server/setupSecurity.py | 111 +-
.../src/main/python/ambari_server/userInput.py | 2 +-
.../custom_actions/scripts/check_host.py | 24 +-
.../src/test/python/TestAmbariServer.py | 3066 ++++++++----------
.../test/python/custom_actions/TestCheckHost.py | 14 +-
29 files changed, 5210 insertions(+), 4149 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-agent/src/main/python/ambari_agent/HostInfo.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/HostInfo.py b/ambari-agent/src/main/python/ambari_agent/HostInfo.py
index 5789160..a99a85d 100644
--- a/ambari-agent/src/main/python/ambari_agent/HostInfo.py
+++ b/ambari-agent/src/main/python/ambari_agent/HostInfo.py
@@ -113,48 +113,6 @@ class HostInfo(object):
pass
return False
- def getTransparentHugePage(self):
- """
- Base declaration. The derived classes are supposed to override it and provide OS-specific implementations.
- :return:
- """
- pass
-
- def checkUsers(self, users, results):
- """
- Base declaration. The derived classes are supposed to override it and provide OS-specific implementations.
- :return:
- """
- pass
-
- def checkIptables(self):
- """
- Base declaration. The derived classes are supposed to override it and provide OS-specific implementations.
- :return:
- """
- pass
-
- def javaProcs(self, list):
- """
- Base declaration. The derived classes are supposed to override it and provide OS-specific implementations.
- :return:
- """
- pass
-
- def getServiceStatus(self, serivce_name):
- """
- Base declaration. The derived classes are supposed to override it and provide OS-specific implementations.
- :return:
- """
- pass
-
- def register(self, dict, componentsMapped=True, commandsInProgress=True):
- """
- Base declaration. The derived classes are supposed to override it and provide OS-specific implementations.
- :return:
- """
- pass
-
@OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT)
class HostInfoLinux(HostInfo):
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-common/src/main/python/ambari_commons/firewall.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/ambari_commons/firewall.py b/ambari-common/src/main/python/ambari_commons/firewall.py
index 448d24e..b73cc0c 100644
--- a/ambari-common/src/main/python/ambari_commons/firewall.py
+++ b/ambari-common/src/main/python/ambari_commons/firewall.py
@@ -21,8 +21,6 @@ limitations under the License.
import subprocess
import shlex
from ambari_commons import OSCheck, OSConst
-from ambari_commons.logging_utils import print_warning_msg
-from ambari_commons.os_family_impl import OsFamilyImpl
class Firewall(object):
@@ -33,16 +31,6 @@ class Firewall(object):
self.OS_FAMILY = OSCheck.get_os_family()
def getFirewallObject(self):
- pass
-
-@OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY)
-class FirewallWindows(Firewall):
- def getFirewallObject(self):
- return WindowsFirewallChecks()
-
-@OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT)
-class FirewallLinux(Firewall):
- def getFirewallObject(self):
if self.OS_TYPE == OSConst.OS_UBUNTU:
return UbuntuFirewallChecks()
elif self.OS_TYPE == OSConst.OS_FEDORA and int(self.OS_VERSION) >= 18:
@@ -61,31 +49,23 @@ class FirewallChecks(object):
self.returncode = None
self.stdoutdata = None
self.stderrdata = None
- # stdout message
- self.MESSAGE_CHECK_FIREWALL = 'Checking iptables...'
def get_command(self):
return "%s %s %s" % (self.SERVICE_CMD, self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD)
- def check_result(self):
+ def check_result(self, retcode, out, err):
result = False
- if self.returncode == 3:
+ if retcode == 3:
result = False
- elif self.returncode == 0:
- if "Table: filter" in self.stdoutdata:
+ elif retcode == 0:
+ if "Table: filter" in out:
result = True
return result
- def run_command(self):
- retcode, out, err = self.run_os_command(self.get_command())
- self.returncode = retcode
- self.stdoutdata = out
- self.stderrdata = err
-
def check_iptables(self):
try:
- self.run_command()
- return self.check_result()
+ retcode, out, err = self.run_os_command(self.get_command())
+ return self.check_result(retcode, out, err)
except OSError:
return False
@@ -96,7 +76,11 @@ class FirewallChecks(object):
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
(stdoutdata, stderrdata) = process.communicate()
- return process.returncode, stdoutdata, stderrdata
+ self.returncode = process.returncode
+ self.stdoutdata = stdoutdata
+ self.stderrdata = stderrdata
+ return self.returncode, self.stdoutdata, self.stderrdata
+
class UbuntuFirewallChecks(FirewallChecks):
@@ -107,13 +91,13 @@ class UbuntuFirewallChecks(FirewallChecks):
def get_command(self):
return "%s %s" % (self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD)
- def check_result(self):
+ def check_result(self, retcode, out, err):
# On ubuntu, the status command returns 0 whether running or not
result = False
- if self.returncode == 0:
- if "Status: inactive" in self.stdoutdata:
+ if retcode == 0:
+ if "Status: inactive" in out:
result = False
- elif "Status: active" in self.stdoutdata:
+ elif "Status: active" in out:
result = True
return result
@@ -124,10 +108,10 @@ class Fedora18FirewallChecks(FirewallChecks):
def get_command(self):
return "systemctl is-active %s" % (self.FIREWALL_SERVICE_NAME)
- def check_result(self):
+ def check_result(self, retcode, out, err):
result = False
- if self.returncode == 0:
- if "active" in self.stdoutdata:
+ if retcode == 0:
+ if "active" in out:
result = True
return result
@@ -139,44 +123,11 @@ class SuseFirewallChecks(FirewallChecks):
def get_command(self):
return "%s %s" % (self.FIREWALL_SERVICE_NAME, self.SERVICE_SUBCMD)
- def check_result(self):
+ def check_result(self, retcode, out, err):
result = False
- if self.returncode == 0:
- if "SuSEfirewall2 not active" in self.stdoutdata:
+ if retcode == 0:
+ if "SuSEfirewall2 not active" in out:
result = False
- elif "### iptables" in self.stdoutdata:
+ elif "### iptables" in out:
result = True
return result
-
-
-class WindowsFirewallChecks(FirewallChecks):
- def __init__(self):
- super(WindowsFirewallChecks, self).__init__()
- self.MESSAGE_CHECK_FIREWALL = 'Checking firewall status...'
-
- def run_command(self):
- from ambari_commons.os_windows import run_powershell_script, CHECK_FIREWALL_SCRIPT
-
- retcode, out, err = run_powershell_script(CHECK_FIREWALL_SCRIPT)
- self.returncode = retcode
- self.stdoutdata = out
- self.stderrdata = err
-
- def check_result(self):
- if self.returncode != 0:
- print_warning_msg("Unable to check firewall status:{0}".format(self.stderrdata))
- return False
- profiles_status = [i for i in self.stdoutdata.split("\n") if not i == ""]
- if "1" in profiles_status:
- enabled_profiles = []
- if profiles_status[0] == "1":
- enabled_profiles.append("DomainProfile")
- if profiles_status[1] == "1":
- enabled_profiles.append("StandardProfile")
- if profiles_status[2] == "1":
- enabled_profiles.append("PublicProfile")
- print_warning_msg(
- "Following firewall profiles are enabled:{0}. Make sure that the firewall is properly configured.".format(
- ",".join(enabled_profiles)))
- return False
- return True
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-common/src/main/python/ambari_commons/inet_utils.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/ambari_commons/inet_utils.py b/ambari-common/src/main/python/ambari_commons/inet_utils.py
index 804c63f..2a54cb6 100644
--- a/ambari-common/src/main/python/ambari_commons/inet_utils.py
+++ b/ambari-common/src/main/python/ambari_commons/inet_utils.py
@@ -22,9 +22,8 @@ import os
import sys
import urllib2
-from ambari_commons.exceptions import FatalException
-from ambari_commons.logging_utils import print_info_msg, print_warning_msg
-
+from exceptions import *
+from logging_utils import *
def download_file(link, destination, chunk_size=16 * 1024):
print_info_msg("Downloading {0} to {1}".format(link, destination))
@@ -35,10 +34,6 @@ def download_file(link, destination, chunk_size=16 * 1024):
force_download_file(link, destination, chunk_size)
-def download_progress_stub(file_name, downloaded_size, blockSize, totalSize):
- #Facilitates mocking. Normally, the callback used by force_download_file eludes the mocks.
- download_progress(file_name, downloaded_size, blockSize, totalSize)
-
def download_progress(file_name, downloaded_size, blockSize, totalSize):
percent = int(downloaded_size * 100 / totalSize)
status = "\r" + file_name
@@ -61,7 +56,7 @@ def find_range_components(meta):
if len(range_comp1) > 1:
range_comp2 = range_comp1[0].split(' ') #split away the "bytes" prefix
if len(range_comp2) == 0:
- raise FatalException(12, 'Malformed Content-Range response header: "{0}".' % hdr_range)
+ raise FatalException(12, 'Malformed Content-Range response header: "{}".' % hdr_range)
range_comp3 = range_comp2[1].split('-')
seek_pos = int(range_comp3[0])
if range_comp1[1] != '*': #'*' == unknown length
@@ -77,12 +72,12 @@ def find_range_components(meta):
return (file_size, seek_pos)
-def force_download_file(link, destination, chunk_size = 16 * 1024, progress_func = download_progress_stub):
+def force_download_file(link, destination, chunk_size = 16 * 1024, progress_func = download_progress):
request = urllib2.Request(link)
if os.path.exists(destination) and not os.path.isfile(destination):
#Directory specified as target? Must be a mistake. Bail out, don't assume anything.
- err = 'Download target {0} is a directory.' % destination
+ err = 'Download target {} is a directory.' % destination
raise FatalException(1, err)
(dest_path, file_name) = os.path.split(destination)
@@ -143,7 +138,7 @@ def force_download_file(link, destination, chunk_size = 16 * 1024, progress_func
downloaded_size = os.stat(temp_dest).st_size
if downloaded_size != file_size:
- err = 'Size of downloaded file {0} is {0} bytes, it is probably damaged or incomplete' % (destination, downloaded_size)
+ err = 'Size of downloaded file {} is {} bytes, it is probably damaged or incomplete' % (destination, downloaded_size)
raise FatalException(1, err)
# when download is complete -> mv temp_dest destination
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-common/src/main/python/ambari_commons/os_family_impl.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/ambari_commons/os_family_impl.py b/ambari-common/src/main/python/ambari_commons/os_family_impl.py
index d70d942..f8a3379 100644
--- a/ambari-common/src/main/python/ambari_commons/os_family_impl.py
+++ b/ambari-common/src/main/python/ambari_commons/os_family_impl.py
@@ -17,15 +17,15 @@ limitations under the License.
'''
import types
-from ambari_commons import OSCheck
+from os_check import OSCheck
class OsFamilyImpl(object):
"""
- Base class for os dependent factory. Usage::
+ Base class for os depended factory. Usage::
class BaseFoo(object): pass
- @OsFamilyImpl("windows")
+ @Factory("windows")
class OsFoo(object):pass
print BaseFoo()# OsFoo
@@ -62,32 +62,3 @@ class OsFamilyImpl(object):
base_cls.__new__ = types.MethodType(new, base_cls)
return cls
-
-class OsFamilyFuncImpl(object):
- """
- Base class for os dependent function. Usage::
-
- @OSFamilyFuncImpl("windows")
- def os_foo(...):pass
-
- """
- _func_impls = {}
-
- def _createFunctionInstance(self, func):
- self._func_impls[func.__module__ + "." + func.__name__ + "." + self.os_const] = func
-
- def thunk(*args, **kwargs):
- fn_id_base = func.__module__ + "." + func.__name__
- fn_id = fn_id_base + "." + OSCheck.get_os_family()
- if fn_id not in self._func_impls:
- fn_id = fn_id_base + "." + OsFamilyImpl.DEFAULT
-
- fn = self._func_impls[fn_id]
- return fn(*args, **kwargs)
- return thunk
-
- def __init__(self, os_family):
- self.os_const = os_family
-
- def __call__(self, func):
- return self._createFunctionInstance(func)
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-common/src/main/python/ambari_commons/os_linux.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/ambari_commons/os_linux.py b/ambari-common/src/main/python/ambari_commons/os_linux.py
index eca3c5d..38f3fb9 100644
--- a/ambari-common/src/main/python/ambari_commons/os_linux.py
+++ b/ambari-common/src/main/python/ambari_commons/os_linux.py
@@ -24,7 +24,7 @@ import pwd
import shlex
import subprocess
-from ambari_commons.logging_utils import print_info_msg, print_warning_msg
+from logging_utils import *
NR_CHMOD_CMD = 'chmod {0} {1} {2}'
@@ -33,15 +33,14 @@ NR_CHOWN_CMD = 'chown {0} {1} {2}'
ULIMIT_CMD = "ulimit -n"
-def os_run_os_command(cmd, env=None):
+def run_os_command(cmd):
print_info_msg('about to run command: ' + str(cmd))
if type(cmd) == str:
cmd = shlex.split(cmd)
process = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
- stderr=subprocess.PIPE,
- env=env
+ stderr=subprocess.PIPE
)
(stdoutdata, stderrdata) = process.communicate()
return process.returncode, stdoutdata, stderrdata
@@ -65,17 +64,17 @@ def os_set_file_permissions(file, mod, recursive, user):
else:
params = ""
command = NR_CHMOD_CMD.format(params, mod, file)
- retcode, out, err = os_run_os_command(command)
+ retcode, out, err = run_os_command(command)
if retcode != 0:
print_warning_msg(WARN_MSG.format(command, file, err))
command = NR_CHOWN_CMD.format(params, user, file)
- retcode, out, err = os_run_os_command(command)
+ retcode, out, err = run_os_command(command)
if retcode != 0:
print_warning_msg(WARN_MSG.format(command, file, err))
def os_set_open_files_limit(maxOpenFiles):
command = "%s %s" % (ULIMIT_CMD, str(maxOpenFiles))
- os_run_os_command(command)
+ run_os_command(command)
def os_getpass(prompt):
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-common/src/main/python/ambari_commons/os_utils.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/ambari_commons/os_utils.py b/ambari-common/src/main/python/ambari_commons/os_utils.py
index 6e2c1d2..3f4819d 100644
--- a/ambari-common/src/main/python/ambari_commons/os_utils.py
+++ b/ambari-common/src/main/python/ambari_commons/os_utils.py
@@ -18,23 +18,20 @@ See the License for the specific language governing permissions and
limitations under the License.
'''
-import os
import shutil
import string
+import os
-from ambari_commons import OSCheck
+from os_check import *
if OSCheck.is_windows_family():
- from ambari_commons.os_windows import os_change_owner, os_getpass, os_is_root, os_run_os_command, \
- os_set_open_files_limit, os_set_file_permissions
+ from os_windows import *
else:
# MacOS not supported
- from ambari_commons.os_linux import os_change_owner, os_getpass, os_is_root, os_run_os_command, \
- os_set_open_files_limit, os_set_file_permissions
- pass
+ from os_linux import *
-from ambari_commons.exceptions import FatalException
-from ambari_commons.logging_utils import print_info_msg, print_warning_msg
+from logging_utils import *
+from exceptions import FatalException
def is_valid_filepath(filepath):
@@ -91,9 +88,6 @@ def set_file_permissions(file, mod, user, recursive):
else:
print_info_msg("File %s does not exist" % file)
-def run_os_command(cmd, env=None):
- return os_run_os_command(cmd, env)
-
def is_root():
return os_is_root()
@@ -114,4 +108,4 @@ def find_in_path(file):
full_path = os.path.join(dir, file)
if os.path.exists(full_path):
return full_path
- raise Exception("File {} not found in PATH".format(file))
+ raise Exception("File {} not found in PATH".format(file))
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-common/src/main/python/ambari_commons/os_windows.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/ambari_commons/os_windows.py b/ambari-common/src/main/python/ambari_commons/os_windows.py
index 0cc4ea2..2fb98e4 100644
--- a/ambari-common/src/main/python/ambari_commons/os_windows.py
+++ b/ambari-common/src/main/python/ambari_commons/os_windows.py
@@ -17,35 +17,41 @@ 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 getpass
import os
-import random
+import getpass
import shlex
import subprocess
import sys
-import tempfile
import time
+import win32api
+import win32event
+import win32service
+import win32con
+import win32serviceutil
+import wmi
+import random
import string
import ctypes
+from win32security import *
+from win32api import *
+from winerror import ERROR_INVALID_HANDLE
+from win32process import GetExitCodeProcess, STARTF_USESTDHANDLES, STARTUPINFO, CreateProcessAsUser
+from win32event import WaitForSingleObject, INFINITE
import msvcrt
+import tempfile
+from win32event import *
+from win32api import CloseHandle
-import pywintypes
-import winerror
-import win32api
-import win32con
-import win32event
-import win32net
-import win32netcon
-import win32process
-import win32security
-import win32service
-import win32serviceutil
-import wmi
+from ambari_commons.exceptions import *
+from logging_utils import *
-from ambari_commons.exceptions import FatalException
-from ambari_commons.logging_utils import print_info_msg, print_warning_msg
+from win32security import LsaOpenPolicy, POLICY_CREATE_ACCOUNT, POLICY_LOOKUP_NAMES, LookupAccountName, \
+ LsaAddAccountRights, LsaRemoveAccountRights, SE_SERVICE_LOGON_NAME
+from win32net import NetUserAdd
+from win32netcon import USER_PRIV_USER, UF_NORMAL_ACCOUNT, UF_SCRIPT
+import pywintypes
SERVICE_STATUS_UNKNOWN = "unknown"
SERVICE_STATUS_STARTING = "starting"
@@ -71,17 +77,17 @@ class OSVERSIONINFOEXW(ctypes.Structure):
('wReserved', ctypes.c_byte)]
def get_windows_version():
- """
- Gets the OS major and minor versions. Returns a tuple of
- (OS_MAJOR, OS_MINOR).
- """
- os_version = OSVERSIONINFOEXW()
- os_version.dwOSVersionInfoSize = ctypes.sizeof(os_version)
- retcode = ctypes.windll.Ntdll.RtlGetVersion(ctypes.byref(os_version))
- if retcode != 0:
- raise Exception("Failed to get OS version")
-
- return os_version.dwMajorVersion, os_version.dwMinorVersion, os_version.dwBuildNumber
+ """
+ Get's the OS major and minor versions. Returns a tuple of
+ (OS_MAJOR, OS_MINOR).
+ """
+ os_version = OSVERSIONINFOEXW()
+ os_version.dwOSVersionInfoSize = ctypes.sizeof(os_version)
+ retcode = ctypes.windll.Ntdll.RtlGetVersion(ctypes.byref(os_version))
+ if retcode != 0:
+ raise Exception("Failed to get OS version")
+
+ return os_version.dwMajorVersion, os_version.dwMinorVersion, os_version.dwBuildNumber
CHECK_FIREWALL_SCRIPT = """[string]$CName = $env:computername
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$computer)
@@ -110,25 +116,25 @@ def _get_files_output(out, err):
def _safe_duplicate_handle(h):
try:
- h = win32api.DuplicateHandle(win32process.GetCurrentProcess(),
- h,
- win32process.GetCurrentProcess(),
- 0,
- True,
- win32con.DUPLICATE_SAME_ACCESS)
+ h = DuplicateHandle(GetCurrentProcess(),
+ h,
+ GetCurrentProcess(),
+ 0,
+ True,
+ win32con.DUPLICATE_SAME_ACCESS)
return True, h
except Exception as exc:
- if exc.winerror == winerror.ERROR_INVALID_HANDLE:
+ if exc.winerror == ERROR_INVALID_HANDLE:
return True, None
return False, None
def run_os_command_impersonated(cmd, user, password, domain='.'):
- si = win32process.STARTUPINFO()
+ si = STARTUPINFO()
out_handle, err_handle, out_file, err_file = _create_tmp_files()
- ok, si.hStdInput = _safe_duplicate_handle(win32api.GetStdHandle(win32api.STD_INPUT_HANDLE))
+ ok, si.hStdInput = _safe_duplicate_handle(GetStdHandle(STD_INPUT_HANDLE))
if not ok:
raise Exception("Unable to create StdInput for child process")
@@ -139,29 +145,27 @@ def run_os_command_impersonated(cmd, user, password, domain='.'):
if not ok:
raise Exception("Unable to create StdErr for child process")
- si.dwFlags = win32process.STARTF_USESTDHANDLES
+ si.dwFlags = STARTF_USESTDHANDLES
si.lpDesktop = ""
- user_token = win32security.LogonUser(user, domain, password,
- win32con.LOGON32_LOGON_SERVICE, win32con.LOGON32_PROVIDER_DEFAULT)
- primary_token = win32security.DuplicateTokenEx(user_token,
- win32security.SecurityImpersonation, 0, win32security.TokenPrimary)
- info = win32process.CreateProcessAsUser(primary_token, None, cmd, None, None, 1, 0, None, None, si)
+ user_token = LogonUser(user, domain, password, win32con.LOGON32_LOGON_SERVICE, win32con.LOGON32_PROVIDER_DEFAULT)
+ primary_token = DuplicateTokenEx(user_token, SecurityImpersonation, 0, TokenPrimary)
+ info = CreateProcessAsUser(primary_token, None, cmd, None, None, 1, 0, None, None, si)
hProcess, hThread, dwProcessId, dwThreadId = info
hThread.Close()
try:
- win32event.WaitForSingleObject(hProcess, win32event.INFINITE)
+ WaitForSingleObject(hProcess, INFINITE)
except KeyboardInterrupt:
pass
out, err = _get_files_output(out_file, err_file)
- exitcode = win32process.GetExitCodeProcess(hProcess)
+ exitcode = GetExitCodeProcess(hProcess)
return exitcode, out, err
-def os_run_os_command(cmd, env=None):
+def run_os_command(cmd, env=None):
if isinstance(cmd,basestring):
cmd = cmd.replace("\\", "\\\\")
cmd = shlex.split(cmd)
@@ -182,13 +186,13 @@ def run_powershell_script(script_content):
script_file = open(os.path.join(tmp_dir,random_filename+".ps1"),"w")
script_file.write(script_content)
script_file.close()
- result = os_run_os_command("powershell -ExecutionPolicy unrestricted -File {0}".format(script_file.name))
+ result = run_os_command("powershell -ExecutionPolicy unrestricted -File {0}".format(script_file.name))
os.remove(script_file.name)
return result
def os_change_owner(filePath, user):
cmd = ['icacls', filePath, '/setowner', user]
- retcode, outdata, errdata = os_run_os_command(cmd)
+ retcode, outdata, errdata = run_os_command(cmd)
return retcode
def os_is_root():
@@ -196,10 +200,9 @@ def os_is_root():
Checks whether the current user is a member of the Administrators group
Returns True if yes, otherwise False
'''
- retcode, out, err = os_run_os_command(WHOAMI_GROUPS)
+ retcode, out, err = run_os_command(WHOAMI_GROUPS)
if retcode != 0:
- err_msg = "Unable to check the current user's group memberships. " \
- "Command {0} returned exit code {1} with message: {2}".format(WHOAMI_GROUPS, retcode, err)
+ err_msg = "Unable to check the current user's group memberships. Command {0} returned exit code {1} with message: {2}".format(WHOAMI_GROUPS, retcode, err)
print_warning_msg(err_msg)
raise FatalException(retcode, err_msg)
@@ -218,20 +221,20 @@ def os_set_file_permissions(file, mod, recursive, user):
#else:
# params = ""
#command = NR_CHMOD_CMD.format(params, mod, file)
- #retcode, out, err = os_run_os_command(command)
+ #retcode, out, err = run_os_command(command)
#if retcode != 0:
# print_warning_msg(WARN_MSG.format(command, file, err))
#command = NR_CHOWN_CMD.format(params, user, file)
- #retcode, out, err = os_run_os_command(command)
+ #retcode, out, err = run_os_command(command)
#if retcode != 0:
# print_warning_msg(WARN_MSG.format(command, file, err))
# rights = mod
# acls_remove_cmd = "icacls {0} /remove {1}".format(file, user)
- # retcode, out, err = os_run_os_command(acls_remove_cmd)
+ # retcode, out, err = run_os_command(acls_remove_cmd)
# if retcode == 0:
# acls_modify_cmd = "icacls {0} /grant {1}:{2}".format(file, user, rights)
- # retcode, out, err = os_run_os_command(acls_modify_cmd)
+ # retcode, out, err = run_os_command(acls_modify_cmd)
return retcode
@@ -245,6 +248,8 @@ def os_getpass(prompt, stream=None):
if sys.stdin is not sys.__stdin__:
return getpass.fallback_getpass(prompt, stream)
+ import msvcrt
+
for c in prompt:
msvcrt.putch(c)
@@ -482,8 +487,7 @@ class WinService(win32serviceutil.ServiceFramework):
def _StopOrWaitForChildProcessToFinish(self, childProcess):
#Wait for the child process to finish or for the stop event to be signaled
- if(win32event.WAIT_OBJECT_0 == win32event.WaitForMultipleObjects([self._heventSvcStop, childProcess._handle],
- False, win32event.INFINITE)):
+ if(win32event.WAIT_OBJECT_0 == win32event.WaitForMultipleObjects([self._heventSvcStop, childProcess._handle], False, win32event.INFINITE)):
# The OS only detaches the child process when the master process exits.
# We must kill it manually.
try:
@@ -499,24 +503,24 @@ class WinService(win32serviceutil.ServiceFramework):
class SystemWideLock(object):
def __init__(self, name):
- self._mutex = win32event.CreateMutex(None, 0, name)
+ self._mutex = CreateMutex(None, 0, name)
def lock(self, timeout=0):
- result = win32event.WaitForSingleObject(self._mutex, timeout)
- if result in [win32event.WAIT_TIMEOUT, win32event.WAIT_ABANDONED, win32event.WAIT_FAILED]:
+ result = WaitForSingleObject(self._mutex, timeout)
+ if result in [WAIT_TIMEOUT, WAIT_ABANDONED, WAIT_FAILED]:
return False
- elif result == win32event.WAIT_OBJECT_0:
+ elif result == WAIT_OBJECT_0:
return True
def unlock(self):
try:
- win32event.ReleaseMutex(self._mutex)
+ ReleaseMutex(self._mutex)
return True
except:
return False
def __del__(self):
- win32api.CloseHandle(self._mutex)
+ CloseHandle(self._mutex)
class UserHelper(object):
ACTION_OK = 0
@@ -524,18 +528,17 @@ class UserHelper(object):
ACTION_FAILED = -1
def __init__(self):
- self._policy = win32security.LsaOpenPolicy(None,
- win32security.POLICY_CREATE_ACCOUNT | win32security.POLICY_LOOKUP_NAMES)
+ self._policy = LsaOpenPolicy(None, POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES)
def create_user(self, name, password, comment="Ambari user"):
user_info = {}
user_info['name'] = name
user_info['password'] = password
- user_info['priv'] = win32netcon.USER_PRIV_USER
+ user_info['priv'] = USER_PRIV_USER
user_info['comment'] = comment
- user_info['flags'] = win32netcon.UF_NORMAL_ACCOUNT | win32netcon.UF_SCRIPT
+ user_info['flags'] = UF_NORMAL_ACCOUNT | UF_SCRIPT
try:
- win32net.NetUserAdd(None, 1, user_info)
+ NetUserAdd(None, 1, user_info)
except pywintypes.error as e:
if e.winerror == 2224:
return UserHelper.USER_EXISTS, e.strerror
@@ -545,16 +548,16 @@ class UserHelper(object):
def add_user_privilege(self, name, privilege):
try:
- acc_sid = win32security.LookupAccountName(None, name)[0]
- win32security.LsaAddAccountRights(self._policy, acc_sid, (privilege,))
+ acc_sid = LookupAccountName(None, name)[0]
+ LsaAddAccountRights(self._policy, acc_sid, (privilege,))
except pywintypes.error as e:
return UserHelper.ACTION_FAILED, e.strerror
return UserHelper.ACTION_OK, "Privilege added."
def remove_user_privilege(self, name, privilege):
try:
- acc_sid = win32security.LookupAccountName(None, name)[0]
- win32security.LsaRemoveAccountRights(self._policy, acc_sid, 0, (privilege,))
+ acc_sid = LookupAccountName(None, name)[0]
+ LsaRemoveAccountRights(self._policy, acc_sid, 0, (privilege,))
except pywintypes.error as e:
return UserHelper.ACTION_FAILED, e.strerror
return UserHelper.ACTION_OK, "Privilege removed."
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-common/src/main/python/resource_management/core/providers/windows/system.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/core/providers/windows/system.py b/ambari-common/src/main/python/resource_management/core/providers/windows/system.py
index dac44ec..e7a98fc 100644
--- a/ambari-common/src/main/python/resource_management/core/providers/windows/system.py
+++ b/ambari-common/src/main/python/resource_management/core/providers/windows/system.py
@@ -140,7 +140,7 @@ def QueryPrivilegeState(hToken, priv):
for (id, attr) in privList:
if id == privId:
privState = attr
- Logger.debug('Privilege state: {0}={1} ({2}) Enabled={3}'.format(privId, priv, LookupPrivilegeDisplayName(None, priv), privState))
+ Logger.debug('Privilege state: {}={} ({}) Enabled={}'.format(privId, priv, LookupPrivilegeDisplayName(None, priv), privState))
return privState
# Execute command. As windows hdp stack heavily relies on proper environment it is better to reload fresh environment
@@ -182,7 +182,7 @@ def _call_command(command, logoutput=False, cwd=None, env=None, wait_for_finish=
if not ok:
raise Exception("Unable to create StdErr for child process")
- Logger.debug("Redirecting stdout to '{0}', stderr to '{1}'".format(out_file.name, err_file.name))
+ Logger.debug("Redirecting stdout to '{}', stderr to '{}'".format(out_file.name, err_file.name))
si.dwFlags = win32con.STARTF_USESTDHANDLES
si.lpDesktop = ""
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py b/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py
index 3f8e983..afc82bb 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/get_unique_id_and_date.py
@@ -23,30 +23,17 @@ Ambari Agent
__all__ = ["get_unique_id_and_date"]
import datetime
from resource_management.core import shell
-from ambari_commons import os_check, OSConst
-from ambari_commons.os_family_impl import OsFamilyImpl, OsFamilyFuncImpl
-
-
-@OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY)
-def get_volume_serial_number():
- from ambari_commons.os_windows import os_run_os_command
-
- id = ""
- code, out, err = os_run_os_command("cmd /c vol C:")
- for line in out.splitlines():
- if line.startswith(" Volume Serial Number is"):
- id = line[25:]
-
- return id
-
-@OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT)
-def get_volume_serial_number():
- out = shell.checked_call("hostid")[1].split('\n')[-1] # bugfix: take the lastline (stdin is not tty part cut)
- id = out.strip()
- return id
-
+from ambari_commons import os_check
def get_unique_id_and_date():
- id = get_volume_serial_number()
+ if os_check.OSCheck.is_windows_family():
+ from ambari_commons.os_windows import run_os_command
+ code, out, err = run_os_command("cmd /c vol C:")
+ for line in out.splitlines():
+ if line.startswith(" Volume Serial Number is"):
+ id = line[25:]
+ else:
+ out = shell.checked_call("hostid")[1].split('\n')[-1] # bugfix: take the lastline (stdin is not tty part cut)
+ id = out.strip()
now = datetime.datetime.now()
date = now.strftime("%M%d%y")
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-server/conf/unix/ambari.properties
----------------------------------------------------------------------
diff --git a/ambari-server/conf/unix/ambari.properties b/ambari-server/conf/unix/ambari.properties
index 84c96a3..e29a6e2 100644
--- a/ambari-server/conf/unix/ambari.properties
+++ b/ambari-server/conf/unix/ambari.properties
@@ -22,23 +22,10 @@ security.server.keys_dir = /var/lib/ambari-server/keys
resources.dir = /var/lib/ambari-server/resources
shared.resources.dir = /usr/lib/ambari-server/lib/ambari_commons/resources
custom.action.definitions = /var/lib/ambari-server/resources/custom_action_definitions
-
-java.releases=jdk1.6,jdk1.7
-jdk1.6.desc=Oracle JDK 1.6
jdk1.6.url=http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-6u31-linux-x64.bin
-jdk1.6.dest-file=jdk-6u31-linux-x64.bin
-jdk1.6.jcpol-url=http://public-repo-1.hortonworks.com/ARTIFACTS/jce_policy-6.zip
-jdk1.6.jcpol-file=jce_policy-6.zip
-jdk1.6.home=/usr/jdk64/
-jdk1.6.re=Creating (jdk.*)/jre
-jdk1.7.desc=Oracle JDK 1.7
+jce_policy1.6.url=http://public-repo-1.hortonworks.com/ARTIFACTS/jce_policy-6.zip
jdk1.7.url=http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-7u67-linux-x64.tar.gz
-jdk1.7.dest-file=jdk-7u67-linux-x64.tar.gz
-jdk1.7.jcpol-url=http://public-repo-1.hortonworks.com/ARTIFACTS/UnlimitedJCEPolicyJDK7.zip
-jdk1.7.jcpol-file=UnlimitedJCEPolicyJDK7.zip
-jdk1.7.home=/usr/jdk64/
-jdk1.7.re=(jdk.*)/jre
-
+jce_policy1.7.url=http://public-repo-1.hortonworks.com/ARTIFACTS/UnlimitedJCEPolicyJDK7.zip
metadata.path=/var/lib/ambari-server/resources/stacks
common.services.path=/var/lib/ambari-server/resources/common-services
server.version.file=/var/lib/ambari-server/resources/version
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-server/conf/windows/ambari.properties
----------------------------------------------------------------------
diff --git a/ambari-server/conf/windows/ambari.properties b/ambari-server/conf/windows/ambari.properties
index 434e42a..3982bb9 100644
--- a/ambari-server/conf/windows/ambari.properties
+++ b/ambari-server/conf/windows/ambari.properties
@@ -23,14 +23,13 @@ custom.action.definitions=resources\\custom_action_definitions
#Comma-separated list of JDK versions
#java.releases=jdk1.8.20,jdk1.6.31
-java.releases=jdk1.7
-jdk1.7.desc=Oracle JDK 1.7
-jdk1.7.url=http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-7u67-windows-x64.exe
-jdk1.7.dest-file=jdk-7u67-windows-x64.exe
-jdk1.7.jcpol-url=http://public-repo-1.hortonworks.com/ARTIFACTS/UnlimitedJCEPolicyJDK7.zip
-jdk1.7.jcpol-file=UnlimitedJCEPolicyJDK7.zip
-jdk1.7.home=C:\\jdk1.7.0_67
-jdk1.7.re=(jdk.*)/jre
+java.releases=jdk1.7.67
+jdk1.7.67.desc=Oracle JDK 1.7.67
+jdk1.7.67.url=http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-7u67-windows-x64.exe
+jdk1.7.67.dest-file=jdk-7u67-windows-x64.exe
+jdk1.7.67.jcpol-url=http://public-repo-1.hortonworks.com/ARTIFACTS/UnlimitedJCEPolicyJDK7.zip
+jdk1.7.67.jcpol-file=UnlimitedJCEPolicyJDK7.zip
+jdk1.7.67.home=C:\\jdk1.7.0_67
metadata.path=resources\\stacks
common.services.path=resources\\common-services
http://git-wip-us.apache.org/repos/asf/ambari/blob/fad56746/ambari-server/src/main/python/ambari-server-windows.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari-server-windows.py b/ambari-server/src/main/python/ambari-server-windows.py
index 8940972..6c4f894 100644
--- a/ambari-server/src/main/python/ambari-server-windows.py
+++ b/ambari-server/src/main/python/ambari-server-windows.py
@@ -19,27 +19,20 @@ limitations under the License.
'''
import optparse
-import os
-import subprocess
-import sys
-
-from ambari_commons.ambari_service import AmbariService
-from ambari_commons.exceptions import NonFatalException, FatalException
-from ambari_commons.logging_utils import print_error_msg, print_info_msg, print_warning_msg
-from ambari_commons.os_utils import remove_file, set_open_files_limit
+
+from ambari_commons.ambari_service import AmbariService, ENV_PYTHON_PATH
+from ambari_commons.logging_utils import *
+from ambari_commons.os_utils import remove_file
from ambari_commons.os_windows import SvcStatusCallback
-from ambari_server.dbConfiguration import DBMSConfigFactory
+from ambari_server import utils
+from ambari_server.dbConfiguration import DBMSConfig
from ambari_server.resourceFilesKeeper import ResourceFilesKeeper, KeeperException
-from ambari_server.serverConfiguration import find_jdk, get_ambari_properties, get_value_from_properties, \
- get_full_ambari_classpath, configDefaults, VERBOSE_OUTPUT_KEY, DEBUG_MODE_KEY, SUSPEND_START_MODE_KEY, \
- SERVER_OUT_FILE_KEY, RESOURCES_DIR_PROPERTY, RESOURCES_DIR_DEFAULT, STACK_LOCATION_KEY, STACK_LOCATION_DEFAULT
-from ambari_server.serverSetup import setup, reset, is_server_running, upgrade, SERVICE_PASSWORD_KEY, SERVICE_USERNAME_KEY
-from ambari_server.setupActions import SETUP_ACTION, START_ACTION, PSTART_ACTION, STOP_ACTION, RESET_ACTION, \
- STATUS_ACTION, UPGRADE_ACTION, UPGRADE_STACK_ACTION, LDAP_SETUP_ACTION, SETUP_SECURITY_ACTION, ACTION_REQUIRE_RESTART
-from ambari_server.setupSecurity import setup_ambari_krb5_jaas, setup_https, setup_ldap, setup_master_key
-from ambari_server.userInput import get_validated_string_input
-from ambari_server.utils import check_reverse_lookup, save_pid
+from ambari_server.serverConfiguration import *
+from ambari_server.serverSetup import setup, reset, is_server_running, upgrade
+from ambari_server.setupActions import *
+from ambari_server.setupSecurity import *
+from ambari_server.serverSetup_windows import SERVICE_PASSWORD_KEY, SERVICE_USERNAME_KEY
# debug settings
SERVER_START_DEBUG = False
@@ -49,6 +42,11 @@ SUSPEND_START_MODE = False
ambari_provider_module_option = ""
ambari_provider_module = os.environ.get('AMBARI_PROVIDER_MODULE')
+#Common setup or upgrade message
+SETUP_OR_UPGRADE_MSG = "- If this is a new setup, then run the \"ambari-server setup\" command to create the user\n" \
+"- If this is an upgrade of an existing setup, run the \"ambari-server upgrade\" command.\n" \
+"Refer to the Ambari documentation for more information on setup and upgrade."
+
AMBARI_SERVER_DIE_MSG = "Ambari Server java process died with exitcode {0}. Check {1} for more information."
if ambari_provider_module is not None:
@@ -112,7 +110,7 @@ class AmbariServerService(AmbariService):
if not self._StopOrWaitForChildProcessToFinish(childProc):
return
- pid_file_path = os.path.join(configDefaults.PID_DIR, PID_NAME)
+ pid_file_path = PID_DIR + os.sep + PID_NAME
remove_file(pid_file_path)
pass
@@ -124,7 +122,7 @@ class AmbariServerService(AmbariService):
outFilePath = properties[SERVER_OUT_FILE_KEY]
if (outFilePath is None or outFilePath == ""):
- outFilePath = configDefaults.SERVER_OUT_FILE
+ outFilePath = SERVER_OUT_FILE
self._RedirectOutputStreamsToFile(outFilePath)
pass
@@ -159,7 +157,7 @@ def start(options):
childProc.wait()
- pid_file_path = os.path.join(configDefaults.PID_DIR, PID_NAME)
+ pid_file_path = PID_DIR + os.sep + PID_NAME
remove_file(pid_file_path)
#
@@ -201,7 +199,7 @@ def server_process_main(options, scmStatus=None):
except AttributeError:
pass
- if not check_reverse_lookup():
+ if not utils.check_reverse_lookup():
print_warning_msg("The hostname was not found in the reverse DNS lookup. "
"This may result in incorrect behavior. "
"Please check the DNS setup and fix the issue.")
@@ -210,11 +208,12 @@ def server_process_main(options, scmStatus=None):
print_info_msg("Ambari Server is not running...")
+ conf_dir = get_conf_dir()
jdk_path = find_jdk()
if jdk_path is None:
err = "No JDK found, please run the \"ambari-server setup\" " \
"command to install a JDK automatically or install any " \
- "JDK manually to " + configDefaults.JDK_INSTALL_DIR
+ "JDK manually to " + JDK_INSTALL_DIR
raise FatalException(1, err)
# Preparations
@@ -237,15 +236,17 @@ def server_process_main(options, scmStatus=None):
if scmStatus is not None:
scmStatus.reportStartPending()
- conf_dir = get_full_ambari_classpath()
+ conf_dir = os.path.abspath(conf_dir) + os.pathsep + get_ambari_classpath()
+ if conf_dir.find(' ') != -1:
+ conf_dir = '"' + conf_dir + '"'
- java_exe = os.path.join(jdk_path, configDefaults.JAVA_EXE_SUBPATH)
- pidfile = os.path.join(configDefaults.PID_DIR, PID_NAME)
+ java_exe = jdk_path + os.sep + JAVA_EXE_SUBPATH
+ pidfile = PID_DIR + os.sep + PID_NAME
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(conf_dir, suspend_mode)
- if not os.path.exists(configDefaults.PID_DIR):
- os.makedirs(configDefaults.PID_DIR, 0755)
+ if not os.path.exists(PID_DIR):
+ os.makedirs(PID_DIR, 0755)
set_open_files_limit(get_ulimit_open_files());
@@ -263,18 +264,18 @@ def server_process_main(options, scmStatus=None):
if pidJava <= 0:
procJava.terminate()
exitcode = procJava.returncode
- exitfile = os.path.join(configDefaults.PID_DIR, EXITCODE_NAME)
- save_pid(exitcode, exitfile)
+ exitfile = os.path.join(PID_DIR, EXITCODE_NAME)
+ utils.save_pid(exitcode, exitfile)
if scmStatus is not None:
scmStatus.reportStopPending()
- raise FatalException(-1, AMBARI_SERVER_DIE_MSG.format(exitcode, configDefaults.SERVER_OUT_FILE))
+ raise FatalException(-1, AMBARI_SERVER_DIE_MSG.format(exitcode, SERVER_OUT_FILE))
else:
- save_pid(pidJava, pidfile)
- print "Server PID at: "+ pidfile
- print "Server out at: "+ configDefaults.SERVER_OUT_FILE
- print "Server log at: "+ configDefaults.SERVER_LOG_FILE
+ utils.save_pid(pidJava, pidfile)
+ print "Server PID at: "+pidfile
+ print "Server out at: "+SERVER_OUT_FILE
+ print "Server log at: "+SERVER_LOG_FILE
if scmStatus is not None:
scmStatus.reportStarted()
@@ -288,15 +289,13 @@ def server_process_main(options, scmStatus=None):
#Wait until the status is 'started' or a configured timeout elapses
#If the timeout has been reached, bail out with exception
def ensure_dbms_is_running(options, properties, scmStatus):
- factory = DBMSConfigFactory()
-
- dbms = factory.create(options, properties, "Ambari")
+ dbms = DBMSConfig.create(options, properties, "Ambari")
if not dbms._is_jdbc_driver_installed(properties):
raise FatalException(-1, "JDBC driver is not installed. Run ambari-server setup and try again.")
dbms.ensure_dbms_is_running(options, properties, scmStatus)
- dbms2 = factory.create(options, properties, "Metrics")
+ dbms2 = DBMSConfig.create(options, properties, "Metrics")
if dbms2.database_host.lower() != dbms.database_host.lower():
dbms2.ensure_dbms_is_running(options, properties, scmStatus)
pass
@@ -500,7 +499,6 @@ def main():
#perform checks
options.warnings = []
- options.exit_message = None
options.must_set_database_options = False
if are_cmd_line_db_args_blank(options):