Repository: ambari Updated Branches: refs/heads/branch-2.5 4fb628cf4 -> 8635714c1
AMBARI-19585. Client config tags may not be saved by agent (Attila Doroszlai via magyari_sandor) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/8635714c Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/8635714c Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/8635714c Branch: refs/heads/branch-2.5 Commit: 8635714c159803383ddc3559542b3445f4608212 Parents: 4fb628c Author: Attila Doroszlai <[email protected]> Authored: Wed Jan 18 16:42:44 2017 +0100 Committer: Sandor Magyari <[email protected]> Committed: Wed Jan 18 16:50:06 2017 +0100 ---------------------------------------------------------------------- .../src/main/python/ambari_agent/Controller.py | 20 +++++++-- .../test/python/ambari_agent/TestActionQueue.py | 43 ++++++++++++++++++++ .../test/python/ambari_agent/TestController.py | 20 +++++---- 3 files changed, 72 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/8635714c/ambari-agent/src/main/python/ambari_agent/Controller.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/ambari_agent/Controller.py b/ambari-agent/src/main/python/ambari_agent/Controller.py index 09ab1e6..09f15de 100644 --- a/ambari-agent/src/main/python/ambari_agent/Controller.py +++ b/ambari-agent/src/main/python/ambari_agent/Controller.py @@ -246,6 +246,8 @@ class Controller(threading.Thread): else: """Only add to the queue if not empty list """ logger.info("Adding %s commands. Heartbeat id = %s", len(commands), self.responseId) + if 'clusterName' in commands[0].keys(): + self.updateComponents(commands[0]['clusterName']) self.actionQueue.put(commands) def addToStatusQueue(self, commands): @@ -253,7 +255,7 @@ class Controller(threading.Thread): logger.debug("No status commands received from %s", self.serverHostname) else: logger.info("Adding %s status commands. Heartbeat id = %s", len(commands), self.responseId) - if not LiveStatus.SERVICES: + if 'clusterName' in commands[0].keys(): self.updateComponents(commands[0]['clusterName']) self.recovery_manager.process_status_commands(commands) self.actionQueue.put_status(commands) @@ -568,19 +570,29 @@ class Controller(threading.Thread): def updateComponents(self, cluster_name): + if LiveStatus.SERVICES: + return + logger.debug("Updating components map of cluster " + cluster_name) # May throw IOError on server connection error response = self.sendRequest(self.componentsUrl + cluster_name, None) logger.debug("Response from %s was %s", self.serverHostname, str(response)) + services, client_components, server_components = [], [], [] for service, components in response['components'].items(): - LiveStatus.SERVICES.append(service) + services.append(service) for component, category in components.items(): + service_component = {"serviceName": service, "componentName": component} if category == 'CLIENT': - LiveStatus.CLIENT_COMPONENTS.append({"serviceName": service, "componentName": component}) + client_components.append(service_component) else: - LiveStatus.COMPONENTS.append({"serviceName": service, "componentName": component}) + server_components.append(service_component) + + LiveStatus.SERVICES = services + LiveStatus.CLIENT_COMPONENTS = client_components + LiveStatus.COMPONENTS = server_components + logger.debug("Components map updated") logger.debug("LiveStatus.SERVICES" + str(LiveStatus.SERVICES)) logger.debug("LiveStatus.CLIENT_COMPONENTS" + str(LiveStatus.CLIENT_COMPONENTS)) http://git-wip-us.apache.org/repos/asf/ambari/blob/8635714c/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py b/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py index d4f5436..9fefefb 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py +++ b/ambari-agent/src/test/python/ambari_agent/TestActionQueue.py @@ -930,6 +930,49 @@ class TestActionQueue(TestCase): self.assertTrue(write_actual_component_mock.called) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) + @patch.object(ActualConfigHandler, "write_actual_component") + @patch.object(CustomServiceOrchestrator, "runCommand") + @patch("CommandStatusDict.CommandStatusDict") + @patch.object(ActionQueue, "status_update_callback") + def test_store_config_tags_on_install_client_command(self, status_update_callback_mock, + command_status_dict_mock, + cso_runCommand_mock, write_actual_component_mock): + + custom_service_orchestrator_execution_result_dict = { + 'stdout': 'out', + 'stderr': 'stderr', + 'structuredOut' : '', + 'exitcode' : 0 + } + cso_runCommand_mock.return_value = custom_service_orchestrator_execution_result_dict + + tez_client_install_command = { + 'commandType': 'EXECUTION_COMMAND', + 'role': u'TEZ_CLIENT', + 'roleCommand': u'INSTALL', + 'commandId': '1-1', + 'taskId': 9, + 'clusterName': u'cc', + 'serviceName': u'TEZ', + 'configurations': {'global' : {}}, + 'configurationTags': {'global' : { 'tag': 'v123' }}, + 'hostLevelParams': {} + } + LiveStatus.CLIENT_COMPONENTS = ({'serviceName': 'TEZ', 'componentName': 'TEZ_CLIENT'}, ) + + config = AmbariConfig() + tempdir = tempfile.gettempdir() + config.set('agent', 'prefix', tempdir) + config.set('agent', 'cache_dir', "/var/lib/ambari-agent/cache") + config.set('agent', 'tolerate_download_failures', "true") + dummy_controller = MagicMock() + actionQueue = ActionQueue(config, dummy_controller) + actionQueue.execute_command(tez_client_install_command) + + # Configuration tags should be updated on install client command + self.assertTrue(write_actual_component_mock.called) + + @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch.object(ActionQueue, "status_update_callback") @patch.object(ActionQueue, "execute_command") @patch.object(LiveStatus, "build") http://git-wip-us.apache.org/repos/asf/ambari/blob/8635714c/ambari-agent/src/test/python/ambari_agent/TestController.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/test/python/ambari_agent/TestController.py b/ambari-agent/src/test/python/ambari_agent/TestController.py index b47af03..663e215 100644 --- a/ambari-agent/src/test/python/ambari_agent/TestController.py +++ b/ambari-agent/src/test/python/ambari_agent/TestController.py @@ -148,13 +148,19 @@ class TestController(unittest.TestCase): @patch("pprint.pformat") def test_addToQueue(self, pformatMock): - actionQueue = MagicMock() + updateComponents = Mock() self.controller.actionQueue = actionQueue + self.controller.updateComponents = updateComponents + self.controller.addToQueue(None) self.assertFalse(actionQueue.put.called) - self.controller.addToQueue("cmd") + self.assertFalse(updateComponents.called) + + commands = ambari_simplejson.loads('[{"clusterName":"dummy_cluster"}]') + self.controller.addToQueue(commands) self.assertTrue(actionQueue.put.called) + self.assertTrue(updateComponents.called) @patch("pprint.pformat") @@ -169,19 +175,19 @@ class TestController(unittest.TestCase): process_status_commands = MagicMock(name="process_status_commands") self.controller.recovery_manager.process_status_commands = process_status_commands - updateComponents = Mock() - self.controller.updateComponents = updateComponents + sendRequest = MagicMock(return_value={'components':{}}) + self.controller.sendRequest = sendRequest self.controller.addToStatusQueue(None) self.assertFalse(actionQueue.put_status.called) - self.assertFalse(updateComponents.called) + self.assertFalse(sendRequest.called) self.controller.addToStatusQueue(commands) self.assertTrue(actionQueue.put_status.called) - self.assertFalse(updateComponents.called) + self.assertFalse(sendRequest.called) LiveStatus_mock.SERVICES = [] LiveStatus_mock.CLIENT_COMPONENTS = [] LiveStatus_mock.COMPONENTS = [] self.controller.addToStatusQueue(commands) - self.assertTrue(updateComponents.called) + self.assertTrue(sendRequest.called) self.assertTrue(actionQueue.put_status.called) self.assertTrue(process_status_commands.called)
