Repository: ambari Updated Branches: refs/heads/branch-2.2 34cc05b81 -> 7fec92272
AMBARI-15249: PXF service check failure does not tell why it fails. (Goutam Tadi via mithmatt) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7fec9227 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7fec9227 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7fec9227 Branch: refs/heads/branch-2.2 Commit: 7fec922720990452525ebdcbed9a2a49fff03599 Parents: 34cc05b Author: Matt <[email protected]> Authored: Sat Mar 5 19:38:17 2016 -0800 Committer: Matt <[email protected]> Committed: Sat Mar 5 19:38:17 2016 -0800 ---------------------------------------------------------------------- .../PXF/3.0.0/package/scripts/service_check.py | 192 +++++++++++-------- 1 file changed, 114 insertions(+), 78 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/7fec9227/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py index 6f60661..40e6d6f 100644 --- a/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py +++ b/ambari-server/src/main/resources/common-services/PXF/3.0.0/package/scripts/service_check.py @@ -17,6 +17,7 @@ limitations under the License. """ import json import os +import sys from resource_management.libraries.script import Script from resource_management.core.exceptions import Fail @@ -30,11 +31,16 @@ from resource_management.libraries.functions.default import default from pxf_utils import makeHTTPCall, runLocalCmd import pxf_constants +GP_PROFILE= "X-GP-profile" +GP_DATA_DIR = "X-GP-DATA-DIR" + class PXFServiceCheck(Script): """ Runs a set of simple PXF tests to verify if the service has been setup correctly """ pxf_version = None + gp_profile = "X-GP-profile" + gp_data_dir = "X-GP-DATA-DIR" base_url = "http://" + pxf_constants.service_check_hostname + ":" + str(pxf_constants.PXF_PORT) + "/pxf/" commonPXFHeaders = { "X-GP-SEGMENT-COUNT": "1", @@ -53,27 +59,35 @@ class PXFServiceCheck(Script): Runs the service check for PXF """ import params + self.total_tests = 0 + self.checks_failed = 0 Logger.info("Starting PXF service checks") - try: - # Get delegation token if security is enabled - if params.security_enabled: - token = self.__get_delegation_token(params.hdfs_user, params.hdfs_user_keytab, - params.hdfs_principal_name, params.kinit_path_local) - self.commonPXFHeaders.update({"X-GP-TOKEN": token}) - - self.pxf_version = self.__get_pxf_protocol_version() - self.run_hdfs_tests() - if params.is_hbase_installed: - self.run_hbase_tests() - if params.is_hive_installed: - self.run_hive_tests() - except Exception, ex: - Logger.error("Exception received during service check execution:\n{0}".format(ex)) - Logger.error("PXF service check failed.") - raise + # Get delegation token if security is enabled + if params.security_enabled: + self.total_tests +=1 + token = self.__get_delegation_token(params.hdfs_user, params.hdfs_user_keytab, + params.hdfs_principal_name, params.kinit_path_local) + self.commonPXFHeaders.update({"X-GP-TOKEN": token}) + + self.total_tests +=1 + self.pxf_version = self.__get_pxf_protocol_version() + + self.total_tests +=1 + self.run_hdfs_tests() + if params.is_hbase_installed: + self.total_tests +=1 + self.run_hbase_tests() + if params.is_hive_installed: + self.total_tests +=1 + self.run_hive_tests() + + if self.checks_failed: + Logger.error("***FAILURE*** - {0} out of {1} tests failed.".format(self.checks_failed,self.total_tests)) + sys.exit(1) Logger.info("Service check completed successfully") + def __get_pxf_protocol_version(self): """ Gets the pxf protocol version number @@ -83,16 +97,18 @@ class PXFServiceCheck(Script): response = makeHTTPCall(url) Logger.info(response) # Sample response: 'PXF protocol version v14' - if response: - import re - # Extract the v14 from the output - match = re.search('.*(v\d*).*', response) - if match: - return match.group(1) + if not response: + error_msg = "Fetch PXF version: Could not get response from \nurl = {0}".format(url) + Logger.error(error_msg) - msg = "Unable to determine PXF version" - Logger.error(msg) - raise Fail(msg) + import re + # Extract the v14 from the output + match = re.search('.*(v\d*).*', response) + if match: + return match.group(1) + + error_msg = "Fetch PXF Version: Could not find version in \nresponse ={0} \nurl = {1}".format(response, url) + Logger.error(error_msg) def __check_pxf_read(self, headers): """ @@ -104,10 +120,8 @@ class PXFServiceCheck(Script): if not "PXFFragments" in response: Logger.error("Unable to find PXFFragments in the response. Response received from the server:\n{0}".format(response)) raise - except: - msg = "PXF data read failed" - Logger.error(msg) - raise Fail(msg) + except Exception, ex: + raise Fail("PXF data read failed: {0}".format(ex)) Logger.info("PXF data read successful") @@ -124,10 +138,9 @@ class PXFServiceCheck(Script): if json_response['Token'] and json_response['Token']['urlString']: return json_response['Token']['urlString'] - msg = "Unable to get delegation token" - Logger.error(msg) - raise Fail(msg) - + error_msg = "Get Token: Unable to get kerberos delegation token from webhdfs: \nurl = {0}, user = {1}, keytab = {2}, principal = {3}, kinit-path = {4} \nresponse = {5}".format(url, user, keytab, principal, kinit_path, json_response) + Logger.error(error_msg) + self.checks_failed += 1 # HDFS Routines def run_hdfs_tests(self): @@ -135,12 +148,17 @@ class PXFServiceCheck(Script): Runs a set of PXF HDFS checks """ Logger.info("Running PXF HDFS service checks") - self.__check_if_client_exists("Hadoop-HDFS") - self.__cleanup_hdfs_data() try: + self.__check_if_client_exists("Hadoop-HDFS") + self.__cleanup_hdfs_data() self.__write_hdfs_data() self.__check_pxf_hdfs_read() self.__check_pxf_hdfs_write() + + except Exception, ex: + self.checks_failed += 1 + Logger.error("HDFS test Failed: Exception occurred in HDFS test: {0}".format(ex)) + finally: self.__cleanup_hdfs_data() @@ -149,18 +167,21 @@ class PXFServiceCheck(Script): Writes some test HDFS data for the tests """ Logger.info("Writing temporary HDFS test data") - import params - params.HdfsResource(pxf_constants.pxf_hdfs_test_dir, - type="directory", - action="create_on_execute", - mode=0777 - ) - params.HdfsResource(pxf_constants.pxf_hdfs_read_test_file, - type="file", - source="/etc/passwd", - action="create_on_execute" - ) - params.HdfsResource(None, action="execute") + try: + import params + params.HdfsResource(pxf_constants.pxf_hdfs_test_dir, + type="directory", + action="create_on_execute", + mode=0777 + ) + params.HdfsResource(pxf_constants.pxf_hdfs_read_test_file, + type="file", + source="/etc/passwd", + action="create_on_execute" + ) + params.HdfsResource(None, action="execute") + except Exception, ex: + raise Fail("HDFS Write: Exception occurred when writing to hdfs: {0} ".format(ex)) def __check_pxf_hdfs_read(self): """ @@ -168,8 +189,8 @@ class PXFServiceCheck(Script): """ Logger.info("Testing PXF HDFS read") headers = { - "X-GP-DATA-DIR": pxf_constants.pxf_hdfs_test_dir, - "X-GP-profile": "HdfsTextSimple", + GP_DATA_DIR: pxf_constants.pxf_hdfs_test_dir, + GP_PROFILE: "HdfsTextSimple", } headers.update(self.commonPXFHeaders) self.__check_pxf_read(headers) @@ -196,12 +217,11 @@ class PXFServiceCheck(Script): try: response = makeHTTPCall(url, headers, body) if not "wrote" in response: - Logger.error("Unable to confirm write from the response") - raise + error_msg = "PXF HDFS data write: Could not find write in response : \nurl = {0} \nresponse = {1}".format(url, response) + raise Fail(error_msg) except: - msg = "PXF HDFS data write test failed" - Logger.error(msg) - raise Fail(msg) + error_msg = "PXF HDFS data write test failed with url= {0}".format(url) + raise Fail(error_msg) def __cleanup_hdfs_data(self): """ @@ -233,6 +253,11 @@ class PXFServiceCheck(Script): message = "Creating temporary HBase smoke test table with data" self.__run_hbase_script(pxf_constants.hbase_populate_data_script, kinit_cmd, message) self.__check_pxf_hbase_read() + + except Exception, ex: + self.checks_failed += 1 + Logger.error("HBASE test Failed: Exception occurred in HBASE test: {0}".format(ex)) + finally: message = "Cleaning up HBase smoke test table" self.__run_hbase_script(pxf_constants.hbase_cleanup_data_script, kinit_cmd, message) @@ -241,21 +266,25 @@ class PXFServiceCheck(Script): """ Create file holding hbase commands """ - import params - hbase_populate_data_cmds = "disable '{0}'\n" \ - "drop '{0}'\n" \ - "create '{0}', 'cf'\n" \ - "put '{0}', 'row1', 'cf:a', 'value1'\n" \ - "put '{0}', 'row1', 'cf:b', 'value2'".format(pxf_constants.pxf_hbase_test_table) + try: + import params + hbase_populate_data_cmds = "disable '{0}'\n" \ + "drop '{0}'\n" \ + "create '{0}', 'cf'\n" \ + "put '{0}', 'row1', 'cf:a', 'value1'\n" \ + "put '{0}', 'row1', 'cf:b', 'value2'".format(pxf_constants.pxf_hbase_test_table) - File("{0}".format(os.path.join(params.exec_tmp_dir, pxf_constants.hbase_populate_data_script)), - content=InlineTemplate("{0}".format(hbase_populate_data_cmds))) + File("{0}".format(os.path.join(params.exec_tmp_dir, pxf_constants.hbase_populate_data_script)), + content=InlineTemplate("{0}".format(hbase_populate_data_cmds))) - hbase_cleanup_data_cmds = "disable '{0}'\n" \ - "drop '{0}'".format(pxf_constants.pxf_hbase_test_table) + hbase_cleanup_data_cmds = "disable '{0}'\n" \ + "drop '{0}'".format(pxf_constants.pxf_hbase_test_table) - File("{0}".format(os.path.join(params.exec_tmp_dir, pxf_constants.hbase_cleanup_data_script)), - content=InlineTemplate("{0}".format(hbase_cleanup_data_cmds))) + File("{0}".format(os.path.join(params.exec_tmp_dir, pxf_constants.hbase_cleanup_data_script)), + content=InlineTemplate("{0}".format(hbase_cleanup_data_cmds))) + + except Exception, ex: + raise Fail("Create HBASE Script: Could not create hbase_scripts: {0}".format(ex)) def __run_hbase_script(self, script, kinit_cmd, message): """ @@ -271,9 +300,9 @@ class PXFServiceCheck(Script): Checks reading HBase data through PXF """ Logger.info("Testing PXF HBase data read") - headers = { - "X-GP-DATA-DIR": pxf_constants.pxf_hbase_test_table, - "X-GP-profile": "HBase", + headers = { + GP_DATA_DIR: pxf_constants.pxf_hbase_test_table, + GP_PROFILE: "HBase", } headers.update(self.commonPXFHeaders) self.__check_pxf_read(headers) @@ -314,6 +343,11 @@ class PXFServiceCheck(Script): try: self.__write_hive_data(beeline_conn_cmd) self.__check_pxf_hive_read() + + except Exception, ex: + self.checks_failed += 1 + Logger.error("HIVE test Failed: Exception occurred in HIVE test: {0}".format(ex)) + finally: self.__cleanup_hive_data(beeline_conn_cmd) @@ -321,10 +355,14 @@ class PXFServiceCheck(Script): """ Creates a temporary Hive table for the service checks """ - import params - Logger.info("Creating temporary Hive smoke test table with data") - cmd = "{0} -f {1}".format(beeline_conn_cmd, os.path.join(params.exec_tmp_dir, pxf_constants.hive_populate_data_script)) - Execute(cmd, logoutput=True, user=params.hdfs_user) + try: + import params + Logger.info("Creating temporary Hive smoke test table with data") + cmd = "{0} -f {1}".format(beeline_conn_cmd, os.path.join(params.exec_tmp_dir, pxf_constants.hive_populate_data_script)) + Execute(cmd, logoutput=True, user=params.hdfs_user) + + except Exception, ex: + raise Fail("HIVE write: Could not write hive data: {0} \n command = {1}".format(ex, cmd)) def __check_pxf_hive_read(self): """ @@ -332,8 +370,8 @@ class PXFServiceCheck(Script): """ Logger.info("Testing PXF Hive data read") headers = { - "X-GP-DATA-DIR": pxf_constants.pxf_hive_test_table, - "X-GP-profile": "Hive", + GP_DATA_DIR: pxf_constants.pxf_hive_test_table, + GP_PROFILE: "Hive", } headers.update(self.commonPXFHeaders) self.__check_pxf_read(headers) @@ -361,9 +399,7 @@ class PXFServiceCheck(Script): Logger.info("Checking if " + serviceName + " client libraries exist") if not self.__package_exists(serviceName): error_msg = serviceName + " client libraries do not exist on the PXF node" - Logger.error(error_msg) raise Fail(error_msg) - if __name__ == "__main__": PXFServiceCheck().execute()
