def test_execute_in_new_terminal_for_unknown_platform( self, mocks, printing, unknown_platform, mocker): subject = TerminalExecutor(self.mock_executor) result = subject.execute_in_new_terminal('the command') assert self.mock_print.mock_calls == [ mocker.call( '\tThis TNT command is not yet supported on the current platform (unknown)' ) ] assert self.mock_executor.execute_sync.call_count == 0 assert result is None
def test_execute_in_new_terminal_for_mac_os(self, mocks, mac_os, copyfile, mocker): from mock import patch, mock_open with patch("__builtin__.open", mock_open(), create=True) as mock_file, patch('os.chmod') as mock_chmod: subject = TerminalExecutor(self.mock_executor) self.mock_executor.execute_sync.return_value = 'executed' result = subject.execute_in_new_terminal('the command') self.mock_copyfile.assert_called_with('./tnt_wrapper.sh', '/tmp/tnt_wrapper.sh') mock_file.assert_called_with("/tmp/tnt_terminal.sh", 'w') assert mock_chmod.mock_calls == [ mocker.call('/tmp/tnt_wrapper.sh', 0755), mocker.call('/tmp/tnt_terminal.sh', 0755) ] self.mock_executor.execute_sync.assert_called_with([ 'open', '-n', '-a', 'iTerm', '--args', '/tmp/tnt_terminal.sh' ]) assert result == 'executed'
def test_execute_in_new_terminal_for_linux(self, mocks, linux, copyfile, mocker): from mock import patch, mock_open with patch("__builtin__.open", mock_open(), create=True) as mock_file, patch('os.chmod') as mock_chmod: self.mock_executor.execute_sync.return_value = 'executed' subject = TerminalExecutor(self.mock_executor) result = subject.execute_in_new_terminal('the command') self.mock_copyfile.assert_called_with('./tnt_wrapper.sh', '/tmp/tnt_wrapper.sh') mock_file.assert_called_with("/tmp/tnt_terminal.sh", 'w') assert mock_chmod.mock_calls == [ mocker.call('/tmp/tnt_wrapper.sh', 0755), mocker.call('/tmp/tnt_terminal.sh', 0755) ] self.mock_executor.execute_sync.assert_called_with([ 'gnome-terminal', '--geometry', '180x24+0+0', '-e', '/tmp/tnt_terminal.sh' ]) assert result == 'executed'
def __init__(self, name, ip_fn): self.get_ip = ip_fn self.name = name self.executor = Executor() self.terminal_executor = TerminalExecutor(self.executor)
class NodeDockerCommands(NodeCommands): def __init__(self, name, ip_fn): self.get_ip = ip_fn self.name = name self.executor = Executor() self.terminal_executor = TerminalExecutor(self.executor) def start(self, node_args): if self._exists(): self._docker_destroy() return self._docker_run_node(node_args) def stop(self): return self.executor.execute_sync(["docker", "stop", "-t0", self.name]) def cat_logs(self): command = ["docker", "exec", "-it", self.name, "cat", "/tmp/SubstratumNode_rCURRENT.log"] return self.executor.execute_async(command) def retrieve_logs(self, destination): args = [ "docker", "cp", "%s:%s" % (self.name, SUBSTRATUM_NODE_LOG), destination, ] return self.executor.execute_sync(args) def update(self, binary): print("Binaries are volume-mapped for Docker-based Nodes; no update is required.") return 0 def tail(self): command = "\"{0}({1})\" docker exec -it {0} tail -f -n 250 /tmp/SubstratumNode_rCURRENT.log".format(self.name, self.get_ip(), self.name) return self.terminal_executor.execute_in_new_terminal(command) def shell(self): command = "\"{0}({1})\" docker exec -it {0} bash".format(self.name, self.get_ip()) return self.terminal_executor.execute_in_new_terminal(command) def delete_logs(self): pass def _docker_run_node(self, node_args): volume = "%s/binaries/:/node_root/node" % os.getcwd() command = [ "docker", "run", "--detach", "--ip", self.get_ip(), "--dns", "127.0.0.1", "--name", self.name, "--hostname", self.name, "--net", "test_net", "--volume", volume, "test_net_tools", "/node_root/node/SubstratumNode", "--dns-servers", node_args["dns-servers"].split(' ')[1], "--log-level", node_args["log-level"].split(' ')[1], "--data-directory", node_args["data-directory"].split(' ')[1], "--ip", self.get_ip(), "--earning-wallet", Node.earning_wallet(self.get_ip()), "--consuming-private-key", Node.consuming_private_key(self.get_ip()), ] if "additional-args" in node_args: additional_args = node_args["additional-args"].split(' ') command.extend(additional_args) return self.executor.execute_sync(command) def _docker_destroy(self): command = [ "docker", "rm", "-f", self.name ] return self.executor.execute_sync(command) def _exists(self): command = [ "docker", "ps", "--all", "-q", "-f name=%s" % self.name, ] p = self.executor.execute_async(command) idx = p.expect(['[0-9a-fA-F]+', pexpect.EOF], timeout=None) return True if idx == 0 else False
class NodeSshCommands(cmd.NodeCommands): def __init__(self, ip_fn): self.get_ip = ip_fn self.executor = Executor() self.terminal_executor = TerminalExecutor(self.executor) def start(self, node_args): command = [ "sudo ./SubstratumNode", "--dns-servers", node_args["dns-servers"].split(' ')[1], "--log-level", node_args["log-level"].split(' ')[1], "--data-directory", node_args["data-directory"].split(' ')[1], "--ip", node_args["ip"].split(' ')[1], "--earning-wallet", node_args["earning-wallet"].split(' ')[1], "--consuming-private-key", node_args["consuming-private-key"].split(' ')[1], ] if "additional-args" in node_args: additional_args = node_args["additional-args"].split(' ') command.extend(additional_args) command.extend([">", "/dev/null", "2>&1", "&"]) return self.executor.execute_sync(self._wrap_with_ssh(command)) def stop(self): return self.executor.execute_sync( self._wrap_with_ssh([cmd.STOP_COMMAND])) def cat_logs(self): return self.executor.execute_async( self._wrap_with_ssh([cmd.CAT_LOGS_COMMAND])) def delete_logs(self): return self.executor.execute_sync( self._wrap_with_ssh([cmd.DELETE_LOGS_COMMAND])) def retrieve_logs(self, destination): source = "%s@%s:%s" % (tnt_config.INSTANCE_USER, self.get_ip(), cmd.SUBSTRATUM_NODE_LOG) return self.executor.execute_sync( self._wrap_with_scp(source, destination)) def update(self, binary): destination = "%s@%s:%s" % (tnt_config.INSTANCE_USER, self.get_ip(), binary) return self.executor.execute_sync( self._wrap_with_scp(os.path.join('binaries', binary), destination)) def tail(self): return self._execute_in_new_terminal([cmd.TAIL_LOGS_COMMAND]) def shell(self): return self._execute_in_new_terminal([]) def _execute_in_new_terminal(self, command_list): command = self._list_to_string(self._wrap_with_ssh(command_list)) title = "%s" % self.get_ip() wrapper_command = "{0} {1}".format(title, command) return self.terminal_executor.execute_in_new_terminal(wrapper_command) def _list_to_string(self, command_list): seperator = ' ' return seperator.join(command_list) def _wrap_with_ssh(self, command_list): return wrap_with_ssh(tnt_config.INSTANCE_USER, self.get_ip(), command_list) def _wrap_with_scp(self, source, destination): args = ["scp", "-oStrictHostKeyChecking=no", source, destination] return args
class NodeSshCommands(cmd.NodeCommands): def __init__(self, ip_fn): self.get_ip = ip_fn self.executor = Executor() self.terminal_executor = TerminalExecutor(self.executor) def start(self, args_map, irrelevant): sorted_keys = sorted(args_map.keys()) command = reduce( lambda sofar, key: sofar + ["--%s" % key, args_map[key]], sorted_keys, ["sudo ./MASQNode"]) command.extend([">", "/dev/null", "2>&1", "&"]) return self.executor.execute_sync(self._wrap_with_ssh(command)) def stop(self): return self.executor.execute_sync( self._wrap_with_ssh([cmd.STOP_COMMAND])) def cat_logs(self): return self.executor.execute_async( self._wrap_with_ssh([cmd.CAT_LOGS_COMMAND])) def delete_logs(self): return self.executor.execute_sync( self._wrap_with_ssh([cmd.DELETE_LOGS_COMMAND])) def retrieve_logs(self, destination): source = "%s@%s:%s" % (tnt_config.INSTANCE_USER, self.get_ip(), cmd.MASQ_NODE_LOG) return self.executor.execute_sync( self._wrap_with_scp(source, destination)) def update(self, binary, binaries_version): destination = "%s@%s:%s" % (tnt_config.INSTANCE_USER, self.get_ip(), binary) binary_path = os.path.join('binaries', binary) if binaries_version is not None: binary_path = os.path.join('binaries', binaries_version, binary) return self.executor.execute_sync( self._wrap_with_scp(binary_path, destination)) def tail(self): return self._execute_in_new_terminal([cmd.TAIL_LOGS_COMMAND]) def shell(self): return self._execute_in_new_terminal([]) def _execute_in_new_terminal(self, command_list): command = self._list_to_string(self._wrap_with_ssh(command_list)) title = "%s" % self.get_ip() wrapper_command = "{0} {1}".format(title, command) return self.terminal_executor.execute_in_new_terminal(wrapper_command) def _list_to_string(self, command_list): separator = ' ' return separator.join(command_list) def _wrap_with_ssh(self, command_list): return wrap_with_ssh(tnt_config.INSTANCE_USER, self.get_ip(), command_list) def _wrap_with_scp(self, source, destination): args = ["scp", "-oStrictHostKeyChecking=no", source, destination] return args
class NodeDockerCommands(NodeCommands): def __init__(self, name, ip_fn): self.get_ip = ip_fn self.name = name self.executor = Executor() self.terminal_executor = TerminalExecutor(self.executor) def start(self, args_map, binaries_version): if self._exists(): self._docker_destroy() return self._docker_run_node(args_map, binaries_version) def stop(self): return self.executor.execute_sync(["docker", "stop", "-t0", self.name]) def cat_logs(self): command = [ "docker", "exec", "-it", self.name, "cat", "/tmp/MASQNode_rCURRENT.log" ] return self.executor.execute_async(command) def retrieve_logs(self, destination): args = [ "docker", "cp", "%s:%s" % (self.name, MASQ_NODE_LOG), destination, ] return self.executor.execute_sync(args) def update(self, binary, irrelevant): print( "Binaries are volume-mapped for Docker-based Nodes; no update is required." ) return 0 def tail(self): command = "\"{0}({1})\" docker exec -it {0} tail -f -n 250 /tmp/MASQNode_rCURRENT.log".format( self.name, self.get_ip(), self.name) return self.terminal_executor.execute_in_new_terminal(command) def shell(self): command = "\"{0}({1})\" docker exec -it {0} bash".format( self.name, self.get_ip()) return self.terminal_executor.execute_in_new_terminal(command) def delete_logs(self): pass def _docker_run_node(self, args_map, binaries_version): volume = "%s/binaries/:/node_root/node" % os.getcwd() if binaries_version is not None: volume = "%s/binaries/%s/:/node_root/node" % (os.getcwd(), binaries_version) command_prefix = [ "docker", "run", "--detach", "--ip", self.get_ip(), "--dns", "127.0.0.1", "--name", self.name, "--hostname", self.name, "--net", "test_net", "--volume", volume, "test_net_tools", "/node_root/node/MASQNode" ] sorted_keys = sorted(args_map.keys()) command = reduce( lambda sofar, key: sofar + ["--%s" % key, args_map[key]], sorted_keys, command_prefix) return self.executor.execute_sync(command) def _docker_destroy(self): command = ["docker", "rm", "-f", self.name] return self.executor.execute_sync(command) def _exists(self): command = [ "docker", "ps", "--all", "-q", "-f name=%s" % self.name, ] p = self.executor.execute_async(command) idx = p.expect(['[0-9a-fA-F]+', pexpect.EOF], timeout=None) return True if idx == 0 else False