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()
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"])
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)
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"
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"]
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)
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"])
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)
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"])
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"])
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
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")