Пример #1
0
    def test_preserve_fds(self):
        test_file = open("/tmp/test1", "w+")
        test_fd = test_file.fileno()

        # Test preservation of PMI_FD inside the container
        host_environment = os.environ.copy()
        host_environment["PMI_FD"] = str(test_fd)

        util.pull_image_if_necessary(is_centralized_repository=False,
                                     image=self._IMAGE_NAME)

        command = ["bash", "-c", "echo fd-preservation-test >&${PMI_FD}"]
        sarus_options = ["--mount=type=bind,source=/tmp,destination=/tmp"]

        util.run_command_in_container(is_centralized_repository=False,
                                      image=self._IMAGE_NAME,
                                      command=command,
                                      options_of_run_command=sarus_options,
                                      env=host_environment,
                                      pass_fds=(test_fd, ))

        try:
            test_file.seek(0)
            self.assertEqual(test_file.readline()[:-1], "fd-preservation-test")
        finally:
            test_file.close()
Пример #2
0
 def _run_sarus(self):
     util.generate_ssh_keys()
     util.remove_image_if_necessary(is_centralized_repository=False, image=self._IMAGE_NAME)
     util.pull_image_if_necessary(is_centralized_repository=False, image=self._IMAGE_NAME)
     util.run_command_in_container(is_centralized_repository=False,
                                   image=self._IMAGE_NAME,
                                   command=["true"])
Пример #3
0
    def test_process_identity(self):
        host_uid = os.getuid()
        host_gid = os.getgid()
        host_supplementary_gids = set(os.getgroups())

        # Retrieve ids from container
        util.pull_image_if_necessary(is_centralized_repository=False,
                                     image=self._IMAGE_NAME)

        output = util.run_command_in_container(is_centralized_repository=False,
                                               image=self._IMAGE_NAME,
                                               command=["id", "-u"])
        container_uid = int(output[0])

        output = util.run_command_in_container(is_centralized_repository=False,
                                               image=self._IMAGE_NAME,
                                               command=["id", "-g"])
        container_gid = int(output[0])

        output = util.run_command_in_container(is_centralized_repository=False,
                                               image=self._IMAGE_NAME,
                                               command=["id", "-G"])
        container_supplementary_gids = {
            int(group)
            for group in output[0].split()
        }

        # Checks
        self.assertEqual(host_uid, container_uid)
        self.assertEqual(host_gid, container_gid)
        self.assertEqual(host_supplementary_gids, container_supplementary_gids)
Пример #4
0
 def test_image_with_symlink_over_directory(self):
     util.remove_image_if_necessary(is_centralized_repository=False, image=self._IMAGE_NAME)
     util.pull_image_if_necessary(is_centralized_repository=False, image=self._IMAGE_NAME)
     output = util.run_command_in_container(is_centralized_repository=False,
                                            image=self._IMAGE_NAME,
                                            command=["ls", "/usr/local/test".encode('utf-8')])
     assert output[0] == "file"
     output = util.run_command_in_container(is_centralized_repository=False,
                                            image=self._IMAGE_NAME,
                                            command=["realpath", "/usr/local/test".encode('utf-8')])
     assert output[0] == "/opt/test"
Пример #5
0
 def _files_exist_in_container(self, file_paths, sarus_options):
     check_script = self.__class__.CHECK_TEMPLATE.format(files=" ".join(['"{}"'.format(fpath) for fpath in file_paths]))
     command = ["bash", "-c"] + [check_script]
     out = util.run_command_in_container(is_centralized_repository=False,
                                                image=self.__class__.container_image,
                                                command=command,
                                                options_of_run_command=sarus_options)
     return out == ["PASS"]
Пример #6
0
 def _get_command_output_in_container(self, command):
     options = []
     if self._mpi_command_line_option:
         options.append("--mpi")
     return util.run_command_in_container(is_centralized_repository=False,
                                                 image=self._container_image,
                                                 command=command,
                                                 options_of_run_command=options)
Пример #7
0
    def test_entrypoint_with_option_arguments(self):
        util.pull_image_if_necessary(is_centralized_repository=True, image="alpine:3.8")

        out = util.run_command_in_container(is_centralized_repository=False,
                                    image="alpine:3.8",
                                    command=["--option", "arg"],
                                    options_of_run_command=["--entrypoint=echo"])
        self.assertEqual(out, ["--option arg"])
Пример #8
0
    def _get_hashes_of_host_libs_in_container(self):
        output = util.run_command_in_container( is_centralized_repository=False,
                                                image=self._container_image,
                                                command=["mount"])
        libs = []
        for line in output:
            if re.search(r".* on .*lib.*\.so(\.[0-9]+)* .*", line):
                lib = re.sub(r".* on (.*lib.*\.so(\.[0-9]+)*) .*", r"\1", line)
                libs.append(lib)

        hashes = set()
        for lib in libs:
            output = util.run_command_in_container( is_centralized_repository=False,
                                                    image=self._container_image,
                                                    command=["md5sum", lib])
            hashes.add(output[0].split()[0])

        return hashes
 def test_image_with_non_ascii_characters(self):
     util.pull_image_if_necessary(is_centralized_repository=False,
                                  image=self._IMAGE_NAME)
     output = util.run_command_in_container(is_centralized_repository=False,
                                            image=self._IMAGE_NAME,
                                            command=["ls", "/földèr"])
     # the command's output might also contain escape sequences (e.g. color codes), let's ignore
     # the escape characters and let's just check that the output contains the expected string
     self.assertTrue(output[0].find("filé") != -1)
     self.assertTrue(output[1].find("ファイル") != -1)
Пример #10
0
    def test_workdir(self):
        util.pull_image_if_necessary(is_centralized_repository=True, image="alpine:3.8")

        # default workdir
        out = util.run_command_in_container(is_centralized_repository=False,
                                    image="alpine:3.8",
                                    command=["pwd"],
                                    options_of_run_command=None)
        self.assertEqual(out, ["/"])
        # custom workdir
        out = util.run_command_in_container(is_centralized_repository=False,
                                    image="alpine:3.8",
                                    command=["pwd"],
                                    options_of_run_command=["--workdir=/etc"])
        self.assertEqual(out, ["/etc"])
        # custom non-exising workdir (sarus automatically creates it)
        out = util.run_command_in_container(is_centralized_repository=False,
                                    image="alpine:3.8",
                                    command=["pwd"],
                                    options_of_run_command=["--workdir=/non-exising-dir-2931"])
        self.assertEqual(out, ["/non-exising-dir-2931"])
Пример #11
0
 def test_image_with_max_path_length(self):
     util.pull_image_if_necessary(is_centralized_repository=False,
                                  image=self._IMAGE_NAME)
     util.run_command_in_container(is_centralized_repository=False,
                                   image=self._IMAGE_NAME,
                                   command=["touch", "/file"])
     util.run_command_in_container(is_centralized_repository=False,
                                   image=self._IMAGE_NAME,
                                   command=["touch", "/etc/file"])
     util.run_command_in_container(is_centralized_repository=False,
                                   image=self._IMAGE_NAME,
                                   command=["touch", "/bin/file"])
     util.run_command_in_container(is_centralized_repository=False,
                                   image=self._IMAGE_NAME,
                                   command=["touch", "/sbin/file"])
Пример #12
0
    def _run_ps_in_container(self, with_init_process):
        util.pull_image_if_necessary(is_centralized_repository=False, image="alpine:3.8")
        if with_init_process:
            options = ["--init"]
        else:
            options = []
        out = util.run_command_in_container(is_centralized_repository=False,
                                            image="alpine:3.8",
                                            command=["ps", "-o", "pid,comm"],
                                            options_of_run_command=options)
        processes = []
        for line in out[1:]:
            pid, comm = line.split()
            processes.append({"pid": int(pid), "comm": comm})

        processes.sort(key = lambda process: process["pid"]) # sort by pid in ascending order

        return processes
Пример #13
0
    def test_environment_variables(self):
        util.pull_image_if_necessary(is_centralized_repository=False, image=self._IMAGE_NAME)

        host_environment = os.environ.copy()
        host_environment["HOST_ENV_VARIABLE"] = "host_env_variable_value"
        host_environment["HOST_ENV_VAR"] = "host_env_var_value"

        command=["bash", "-c", "echo $IMAGE_ENV_VARIABLE; echo $IMAGE_ENV_VAR; echo $HOST_ENV_VARIABLE; echo $HOST_ENV_VAR"]

        output = util.run_command_in_container( is_centralized_repository=False,
                                                image=self._IMAGE_NAME,
                                                command=command,
                                                environment=host_environment)

        self.assertEqual(output[0], "image_env_variable_value")
        self.assertEqual(output[1], "image_env_var_value")
        self.assertEqual(output[2], "host_env_variable_value")
        self.assertEqual(output[3], "host_env_var_value")