|
@@ -20,26 +20,135 @@ Ambari Agent
|
|
|
|
|
|
"""
|
|
|
|
|
|
-import os, sys
|
|
|
+import os, sys, subprocess
|
|
|
from resource_management import *
|
|
|
|
|
|
|
|
|
+CHECK_JAVA_HOME = "java_home_check"
|
|
|
+CHECK_DB_CONNECTION = "db_connection_check"
|
|
|
+
|
|
|
+DB_NAME_MYSQL = "mysql"
|
|
|
+DB_NAME_ORACLE = "oracle"
|
|
|
+DB_NAME_POSTGRESQL = "postgresql"
|
|
|
+
|
|
|
+JDBC_DRIVER_MYSQL = "com.mysql.jdbc.Driver"
|
|
|
+JDBC_DRIVER_ORACLE = "oracle.jdbc.driver.OracleDriver"
|
|
|
+JDBC_DRIVER_POSTGRESQL = "org.postgresql.Driver"
|
|
|
+
|
|
|
+
|
|
|
class CheckHost(Script):
|
|
|
def actionexecute(self, env):
|
|
|
config = Script.get_config()
|
|
|
|
|
|
- java_home = config['hostLevelParams']['java_home']
|
|
|
+ #print "CONFIG: " + str(config)
|
|
|
+
|
|
|
+ check_execute_list = config['commandParams']['check_execute_list']
|
|
|
+ structured_output = {}
|
|
|
+
|
|
|
+ if CHECK_JAVA_HOME in check_execute_list:
|
|
|
+ java_home_check_structured_output = execute_java_home_available_check(config)
|
|
|
+ structured_output[CHECK_JAVA_HOME] = java_home_check_structured_output
|
|
|
+
|
|
|
+ if CHECK_DB_CONNECTION in check_execute_list:
|
|
|
+ db_connection_check_structured_output = execute_db_connection_check(config)
|
|
|
+ structured_output[CHECK_DB_CONNECTION] = db_connection_check_structured_output
|
|
|
+
|
|
|
+ self.put_structured_out(structured_output)
|
|
|
+
|
|
|
+
|
|
|
+def execute_java_home_available_check(config):
|
|
|
+ print "Java home check started."
|
|
|
+ java64_home = config['hostLevelParams']['java_home']
|
|
|
+
|
|
|
+ if not os.path.isfile(os.path.join(java64_home, "bin", "java")):
|
|
|
+ print "Java home doesn't exist!"
|
|
|
+ java_home_check_structured_output = {"exit_code" : "1", "message": "Java home doesn't exist!"}
|
|
|
+ else:
|
|
|
+ print "Java home exists!"
|
|
|
+ java_home_check_structured_output = {"exit_code" : "0", "message": "Java home exists!"}
|
|
|
+
|
|
|
+ return java_home_check_structured_output
|
|
|
+
|
|
|
+
|
|
|
+def execute_db_connection_check(config):
|
|
|
+ print "DB connection check started."
|
|
|
+
|
|
|
+ # initialize needed data
|
|
|
+
|
|
|
+ ambari_server_hostname = config['clusterHostInfo']['ambari_server_host']
|
|
|
+ check_db_connection_jar_name = "DBConnectionVerification.jar"
|
|
|
+ jdk_location = config['hostLevelParams']['jdk_location']
|
|
|
+ java64_home = config['hostLevelParams']['java_home']
|
|
|
+ db_name = config['commandParams']['db_name']
|
|
|
+
|
|
|
+ if db_name == DB_NAME_MYSQL:
|
|
|
+ jdbc_url = config['hostLevelParams']['mysql_jdbc_url']
|
|
|
+ jdbc_driver = JDBC_DRIVER_MYSQL
|
|
|
+ elif db_name == DB_NAME_ORACLE:
|
|
|
+ jdbc_url = config['hostLevelParams']['oracle_jdbc_url']
|
|
|
+ jdbc_driver = JDBC_DRIVER_ORACLE
|
|
|
+ elif db_name == DB_NAME_POSTGRESQL:
|
|
|
+ jdbc_url = config['hostLevelParams']['postgresql_jdbc_url']
|
|
|
+ jdbc_driver = JDBC_DRIVER_POSTGRESQL
|
|
|
+
|
|
|
+ path, jdbc_name = os.path.split(jdbc_url)
|
|
|
+ db_connection_url = config['commandParams']['db_connection_url']
|
|
|
+ user_name = config['commandParams']['user_name']
|
|
|
+ user_passwd = config['commandParams']['user_passwd']
|
|
|
+
|
|
|
+ environment = { "no_proxy": format("{ambari_server_hostname}") }
|
|
|
+
|
|
|
+ # download DBConnectionVerification.jar from ambari-server resources
|
|
|
+
|
|
|
+
|
|
|
+ try:
|
|
|
+ cmd = format("/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf "
|
|
|
+ "--retry 5 {jdk_location}{check_db_connection_jar_name} "
|
|
|
+ "-o {check_db_connection_jar_name}'")
|
|
|
+ Execute(cmd, not_if=format("[ -f /usr/lib/ambari-agent/{check_db_connection_jar_name}]"), environment = environment)
|
|
|
+ except Exception, e:
|
|
|
+ message = "Error downloading DBConnectionVerification.jar from Ambari Server resources. Check network access to " \
|
|
|
+ "Ambari Server.\n" + str(e)
|
|
|
+ print message
|
|
|
+ db_connection_check_structured_output = {"exit_code" : "1", "message": message}
|
|
|
+ return db_connection_check_structured_output
|
|
|
+
|
|
|
+ # download jdbc driver from ambari-server resources
|
|
|
+
|
|
|
+ try:
|
|
|
+ cmd = format("/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf "
|
|
|
+ "--retry 5 {jdbc_url} -o {jdbc_name}'")
|
|
|
+ Execute(cmd, not_if=format("[ -f /usr/lib/ambari-agent/{jdbc_name}]"), environment = environment)
|
|
|
+ except Exception, e:
|
|
|
+ message = "Error downloading JDBC connector from Ambari Server resources. Check network access to " \
|
|
|
+ "Ambari Server.\n" + str(e)
|
|
|
+ print message
|
|
|
+ db_connection_check_structured_output = {"exit_code" : "1", "message": message}
|
|
|
+ return db_connection_check_structured_output
|
|
|
+
|
|
|
+
|
|
|
+ # try to connect to db
|
|
|
+
|
|
|
+ db_connection_check_command = format("{java64_home}/bin/java -cp /usr/lib/ambari-agent/{check_db_connection_jar_name}:" \
|
|
|
+ "/usr/lib/ambari-agent/{jdbc_name} org.apache.ambari.server.DBConnectionVerification {db_connection_url} " \
|
|
|
+ "{user_name} {user_passwd!p} {jdbc_driver}")
|
|
|
|
|
|
- if not os.path.isfile(os.path.join(java_home, "bin", "java")):
|
|
|
- print "Java home not exists"
|
|
|
- sys.exit(1)
|
|
|
+ process = subprocess.Popen(db_connection_check_command,
|
|
|
+ stdout=subprocess.PIPE,
|
|
|
+ stdin=subprocess.PIPE,
|
|
|
+ stderr=subprocess.PIPE,
|
|
|
+ shell=True)
|
|
|
+ (stdoutdata, stderrdata) = process.communicate()
|
|
|
+ print "INFO stdoutdata: " + stdoutdata
|
|
|
+ print "INFO stderrdata: " + stderrdata
|
|
|
+ print "INFO returncode: " + str(process.returncode)
|
|
|
|
|
|
- print "Java home exists"
|
|
|
- structured_output_example = {
|
|
|
- 'result': 'Host check completed.'
|
|
|
- }
|
|
|
+ if process.returncode == 0:
|
|
|
+ db_connection_check_structured_output = {"exit_code" : "0", "message": "DB connection check completed successfully!" }
|
|
|
+ else:
|
|
|
+ db_connection_check_structured_output = {"exit_code" : "1", "message": stdoutdata }
|
|
|
|
|
|
- self.put_structured_out(structured_output_example)
|
|
|
+ return db_connection_check_structured_output
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|