Repository: incubator-slider Updated Branches: refs/heads/feature/SLIDER-1107_AM_config_generation 40c451e29 -> 41de54d76
SLIDER-1063 duplicated port allocation when slider.allowed.ports is set (kyungwan nam via gourksaha) Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/4b7d5c83 Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/4b7d5c83 Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/4b7d5c83 Branch: refs/heads/feature/SLIDER-1107_AM_config_generation Commit: 4b7d5c832ddfbaf00fe538281b61b0aea174a7e0 Parents: 1b833e5 Author: Gour Saha <gourks...@apache.org> Authored: Sat May 7 08:09:29 2016 -0700 Committer: Gour Saha <gourks...@apache.org> Committed: Sat May 7 08:09:29 2016 -0700 ---------------------------------------------------------------------- .../python/agent/CustomServiceOrchestrator.py | 10 ++++-- .../agent/TestCustomServiceOrchestrator.py | 32 ++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/4b7d5c83/slider-agent/src/main/python/agent/CustomServiceOrchestrator.py ---------------------------------------------------------------------- diff --git a/slider-agent/src/main/python/agent/CustomServiceOrchestrator.py b/slider-agent/src/main/python/agent/CustomServiceOrchestrator.py index b40a8b5..13c978b 100644 --- a/slider-agent/src/main/python/agent/CustomServiceOrchestrator.py +++ b/slider-agent/src/main/python/agent/CustomServiceOrchestrator.py @@ -63,6 +63,8 @@ class CustomServiceOrchestrator(): self.stored_command = {} self.allocated_ports = {} self.log_folders = {} + + self.allocated_ports_set = set() # Clean up old status command files if any try: os.unlink(self.status_commands_stdout) @@ -300,7 +302,6 @@ class CustomServiceOrchestrator(): allocated_for_any = ".ALLOCATED_PORT}" port_allocation_req = allocated_for_this_component_format.format(component) - allowed_ports = self.get_allowed_ports(command) if 'configurations' in command: for key in command['configurations']: if len(command['configurations'][key]) > 0: @@ -311,7 +312,7 @@ class CustomServiceOrchestrator(): value = value.replace("${AGENT_LOG_ROOT}", self.config.getLogPath()) if port_allocation_req in value: - value = self.allocate_ports(value, port_allocation_req, allowed_ports) + value = self.allocate_ports(value, port_allocation_req, self.get_allowed_ports(command)) allocated_ports[key + "." + k] = value elif allocated_for_any in value: ## All unallocated ports should be set to 0 @@ -413,6 +414,10 @@ class CustomServiceOrchestrator(): value = value.replace(replaced_pattern, str(port), 1) logger.info("Allocated port " + str(port) + " for " + replaced_pattern) index = value.find(port_req_pattern) + + if allowed_ports != None: + allowed_ports.remove(port) + self.allocated_ports_set.add(port) pass return value pass @@ -488,6 +493,7 @@ class CustomServiceOrchestrator(): except: # not an int and not a range... invalid.add(i) + selection = selection - self.allocated_ports_set selection = random.sample(selection, min (len(selection), num_values)) # Report invalid tokens before returning valid selection logger.info("Allowed port values: " + str(selection)) http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/4b7d5c83/slider-agent/src/test/python/agent/TestCustomServiceOrchestrator.py ---------------------------------------------------------------------- diff --git a/slider-agent/src/test/python/agent/TestCustomServiceOrchestrator.py b/slider-agent/src/test/python/agent/TestCustomServiceOrchestrator.py index aaef3f9..a6fa054 100644 --- a/slider-agent/src/test/python/agent/TestCustomServiceOrchestrator.py +++ b/slider-agent/src/test/python/agent/TestCustomServiceOrchestrator.py @@ -674,6 +674,38 @@ class TestCustomServiceOrchestrator(TestCase): self.assertTrue(set(allowed_ports).issubset(port_range_full_list)) + def test_finalize_command_when_set_allowed_ports(self): + dummy_controller = MagicMock() + tempdir = tempfile.gettempdir() + tempWorkDir = tempdir + "W" + config = MagicMock() + config.get.return_value = "something" + config.getResolvedPath.return_value = tempdir + config.getWorkRootPath.return_value = tempWorkDir + config.getLogPath.return_value = tempdir + + allowed_ports = "6700-6701" + allowed_ports_full_list = [6700, 6701] + + orchestrator = CustomServiceOrchestrator(config, dummy_controller, self.agentToggleLogger) + command = {} + command['componentName'] = "HBASE_MASTER" + command['configurations'] = {} + command['configurations']['global'] = {} + command['configurations']['global']['slider.allowed.ports'] = allowed_ports + command['configurations']['hbase-site'] = {} + command['configurations']['hbase-site']['work_root'] = "${AGENT_WORK_ROOT}" + command['configurations']['hbase-site']['a_port'] = "${HBASE_MASTER.ALLOCATED_PORT}" + command['configurations']['hbase-site']['b_port'] = "${HBASE_MASTER.ALLOCATED_PORT}" + + orchestrator.finalize_command(command, False, {}) + a_port = int(command['configurations']['hbase-site']['a_port']) + b_port = int(command['configurations']['hbase-site']['b_port']) + + self.assertTrue((a_port in allowed_ports_full_list) and (b_port in allowed_ports_full_list)) + self.assertTrue(a_port != b_port) + + def tearDown(self): # enable stdout sys.stdout = sys.__stdout__