Browse Source

AMBARI-5998. Custom action tasks response returns invalid json string in structured_out attribute.(vbrodetskyi)

Vitaly Brodetskyi 11 years ago
parent
commit
03a458c0c4

+ 2 - 1
ambari-agent/src/main/python/ambari_agent/ActionQueue.py

@@ -24,6 +24,7 @@ import traceback
 import threading
 import threading
 import pprint
 import pprint
 import os
 import os
+import json
 
 
 from LiveStatus import LiveStatus
 from LiveStatus import LiveStatus
 from shell import shellRunner
 from shell import shellRunner
@@ -187,7 +188,7 @@ class ActionQueue(threading.Thread):
       roleResult['customCommand'] = command['hostLevelParams']['custom_command']
       roleResult['customCommand'] = command['hostLevelParams']['custom_command']
 
 
     if 'structuredOut' in commandresult:
     if 'structuredOut' in commandresult:
-      roleResult['structuredOut'] = str(commandresult['structuredOut'])
+      roleResult['structuredOut'] = str(json.dumps(commandresult['structuredOut']))
     else:
     else:
       roleResult['structuredOut'] = ''
       roleResult['structuredOut'] = ''
     # let ambari know that configuration tags were applied
     # let ambari know that configuration tags were applied

+ 14 - 15
ambari-agent/src/test/python/ambari_agent/TestActionQueue.py

@@ -23,7 +23,7 @@ from unittest import TestCase
 from ambari_agent.LiveStatus import LiveStatus
 from ambari_agent.LiveStatus import LiveStatus
 from ambari_agent.ActionQueue import ActionQueue
 from ambari_agent.ActionQueue import ActionQueue
 from ambari_agent.AmbariConfig import AmbariConfig
 from ambari_agent.AmbariConfig import AmbariConfig
-import os, errno, time, pprint, tempfile, threading
+import os, errno, time, pprint, tempfile, threading, json
 import StringIO
 import StringIO
 import sys
 import sys
 from threading import Thread
 from threading import Thread
@@ -294,13 +294,13 @@ class TestActionQueue(TestCase):
                 'stderr': 'stderr',
                 'stderr': 'stderr',
                 'stdout': 'out',
                 'stdout': 'out',
                 'clusterName': u'cc',
                 'clusterName': u'cc',
-                'configurationTags': {'global': {'tag': 'v1'}},
+                'structuredOut': '""',
                 'roleCommand': u'INSTALL',
                 'roleCommand': u'INSTALL',
                 'serviceName': u'HDFS',
                 'serviceName': u'HDFS',
                 'role': u'DATANODE',
                 'role': u'DATANODE',
                 'actionId': '1-1',
                 'actionId': '1-1',
                 'taskId': 3,
                 'taskId': 3,
-                'structuredOut' : '',
+                'configurationTags': {'global': {'tag': 'v1'}},
                 'exitCode': 0}
                 'exitCode': 0}
     self.assertEqual(len(report['reports']), 1)
     self.assertEqual(len(report['reports']), 1)
     self.assertEqual(report['reports'][0], expected)
     self.assertEqual(report['reports'][0], expected)
@@ -333,12 +333,12 @@ class TestActionQueue(TestCase):
                 'stderr': 'stderr',
                 'stderr': 'stderr',
                 'stdout': 'out',
                 'stdout': 'out',
                 'clusterName': u'cc',
                 'clusterName': u'cc',
+                'structuredOut': '""',
                 'roleCommand': u'INSTALL',
                 'roleCommand': u'INSTALL',
                 'serviceName': u'HDFS',
                 'serviceName': u'HDFS',
                 'role': u'DATANODE',
                 'role': u'DATANODE',
                 'actionId': '1-1',
                 'actionId': '1-1',
                 'taskId': 3,
                 'taskId': 3,
-                'structuredOut' : '',
                 'exitCode': 13}
                 'exitCode': 13}
     self.assertEqual(len(report['reports']), 1)
     self.assertEqual(len(report['reports']), 1)
     self.assertEqual(report['reports'][0], expected)
     self.assertEqual(report['reports'][0], expected)
@@ -365,12 +365,12 @@ class TestActionQueue(TestCase):
                 'stderr': 'stderr',
                 'stderr': 'stderr',
                 'stdout': 'out',
                 'stdout': 'out',
                 'clusterName': 'clusterName',
                 'clusterName': 'clusterName',
+                'structuredOut': '""',
                 'roleCommand': 'UPGRADE',
                 'roleCommand': 'UPGRADE',
                 'serviceName': 'serviceName',
                 'serviceName': 'serviceName',
                 'role': 'role',
                 'role': 'role',
                 'actionId': 17,
                 'actionId': 17,
                 'taskId': 'taskId',
                 'taskId': 'taskId',
-                'structuredOut' : '',
                 'exitCode': 0}
                 'exitCode': 0}
     self.assertEqual(len(report['reports']), 1)
     self.assertEqual(len(report['reports']), 1)
     self.assertEqual(report['reports'][0], expected)
     self.assertEqual(report['reports'][0], expected)
@@ -403,20 +403,19 @@ class TestActionQueue(TestCase):
     actionQueue = ActionQueue(config, dummy_controller)
     actionQueue = ActionQueue(config, dummy_controller)
     actionQueue.execute_command(self.datanode_restart_command)
     actionQueue.execute_command(self.datanode_restart_command)
     report = actionQueue.result()
     report = actionQueue.result()
-    expected = {'actionId': '1-1',
+    expected = {'status': 'COMPLETED',
+                'configurationTags': {'global': {'tag': 'v123'}},
+                'stderr': 'stderr',
+                'stdout': 'out',
                 'clusterName': u'cc',
                 'clusterName': u'cc',
-                'configurationTags': {'global' : { 'tag': 'v123' }},
-                'exitCode': 0,
-                'role': u'DATANODE',
+                'structuredOut': '""',
                 'roleCommand': u'CUSTOM_COMMAND',
                 'roleCommand': u'CUSTOM_COMMAND',
                 'serviceName': u'HDFS',
                 'serviceName': u'HDFS',
-                'status': 'COMPLETED',
+                'role': u'DATANODE',
+                'actionId': '1-1',
+                'taskId': 9,
                 'customCommand': 'RESTART',
                 'customCommand': 'RESTART',
-                'stderr': 'stderr',
-                'stdout': 'out',
-                'structuredOut': '',
-                'taskId': 9
-    }
+                'exitCode': 0}
     # Agent caches configurationTags if custom_command RESTART completed
     # Agent caches configurationTags if custom_command RESTART completed
     self.assertEqual(len(report['reports']), 1)
     self.assertEqual(len(report['reports']), 1)
     self.assertEqual(expected, report['reports'][0])
     self.assertEqual(expected, report['reports'][0])

+ 1 - 1
ambari-server/src/main/resources/custom_actions/check_host.py

@@ -189,7 +189,7 @@ class CheckHost(Script):
       Execute(cmd, not_if=format("[ -f /usr/lib/ambari-agent/{jdbc_name}]"), environment = environment)
       Execute(cmd, not_if=format("[ -f /usr/lib/ambari-agent/{jdbc_name}]"), environment = environment)
     except Exception, e:
     except Exception, e:
       message = "Error downloading JDBC connector from Ambari Server resources. Confirm you ran ambari-server setup to " \
       message = "Error downloading JDBC connector from Ambari Server resources. Confirm you ran ambari-server setup to " \
-                "install JDBC connector. Use \"ambari-server --help\" for more information. Check network access to " \
+                "install JDBC connector. Use \"ambari-server setup --help\" for more information. Check network access to " \
                 "Ambari Server.\n" + str(e)
                 "Ambari Server.\n" + str(e)
       print message
       print message
       db_connection_check_structured_output = {"exit_code" : "1", "message": message}
       db_connection_check_structured_output = {"exit_code" : "1", "message": message}

+ 1 - 1
ambari-server/src/test/python/TestCheckHost.py

@@ -105,7 +105,7 @@ class TestCheckHost(TestCase):
 
 
     self.assertEquals(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': 'Error downloading JDBC ' \
     self.assertEquals(structured_out_mock.call_args[0][0], {'db_connection_check': {'message': 'Error downloading JDBC ' \
                               'connector from Ambari Server resources. Confirm you ran ambari-server setup to ' \
                               'connector from Ambari Server resources. Confirm you ran ambari-server setup to ' \
-                              'install JDBC connector. Use "ambari-server --help" for more information. Check ' \
+                              'install JDBC connector. Use "ambari-server setup --help" for more information. Check ' \
                               'network access to Ambari Server.\ntest exception', 'exit_code': '1'}})
                               'network access to Ambari Server.\ntest exception', 'exit_code': '1'}})
     self.assertEquals(format_mock.call_args_list[4][0][0], "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf " \
     self.assertEquals(format_mock.call_args_list[4][0][0], "/bin/sh -c 'cd /usr/lib/ambari-agent/ && curl -kf " \
                                                             "--retry 5 {jdbc_url} -o {jdbc_name}'")
                                                             "--retry 5 {jdbc_url} -o {jdbc_name}'")