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'
Example #4
0
 def __init__(self, name, ip_fn):
     self.get_ip = ip_fn
     self.name = name
     self.executor = Executor()
     self.terminal_executor = TerminalExecutor(self.executor)
Example #5
0
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
Example #6
0
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
Example #7
0
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