diff --git a/common/devkit_utils/docker_utils.py b/common/devkit_utils/docker_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..2c217c777bba1b9f31227c0fc3c04c3f28cfdd59 --- /dev/null +++ b/common/devkit_utils/docker_utils.py @@ -0,0 +1,40 @@ +import logging +import os.path + +from devkit_utils import shell_tools + + +def get_docker_id(docker_path: str): + paths_name = docker_path.strip().split("/") + if len(paths_name) >= 3: + return paths_name[2] + else: + raise Exception("can not found docker id") + + +def is_docker_process(pid): + cgroup_file = f'/proc/{pid}/cgroup' + if not os.path.exists(cgroup_file): + return False, None + with open(cgroup_file, "r", encoding="utf-8") as file: + cgroup_infos = file.readlines() + for line in cgroup_infos: + fields = line.split(":") + if len(fields) >= 3 and str(fields[1]) == "devices" and str(fields[2]).startswith("/docker"): + return True, get_docker_id(fields[2]) + return False, None + + +def create_dir_in_docker(docker_id, target_dir, mode=755): + outcome = shell_tools.exec_shell(f"docker exec {docker_id} mkdir -p {target_dir}", is_shell=True) + logging.info(outcome) + outcome = shell_tools.exec_shell(f"docker exec {docker_id} chmod {mode} {target_dir}", is_shell=True) + logging.info(outcome) + + +def copy_to_docker(docker_id, origin_file, target_dir): + file_name = os.path.basename(origin_file) + outcome = shell_tools.exec_shell(f"docker cp {origin_file} {docker_id}:{target_dir}", is_shell=True) + logging.info(outcome) + outcome = shell_tools.exec_shell(f"docker exec {docker_id} chmod 755 {target_dir}/{file_name}", is_shell=True) + logging.info(outcome) diff --git a/component/DevKitTester/devkit_tester_agent/bin/flight_records_sample.py b/component/DevKitTester/devkit_tester_agent/bin/flight_records_sample.py index 4d8355d78bee3a9f279dffec40fe53a9097864ed..40ee1d735df05ae3a986c68eb27e58c0ea5fab16 100644 --- a/component/DevKitTester/devkit_tester_agent/bin/flight_records_sample.py +++ b/component/DevKitTester/devkit_tester_agent/bin/flight_records_sample.py @@ -7,7 +7,7 @@ import time import psutil -from devkit_utils import shell_tools, file_utils +from devkit_utils import shell_tools, file_utils, docker_utils from devkit_utils.error_coce import ErrorCodeEnum from devkit_utils.log_config import config_log_ini from devkit_utils.pyinstaller_utils import PyInstallerUtils @@ -16,10 +16,13 @@ ROOT_PATH = os.path.dirname(os.path.dirname(__file__)) class TargetProcess: - def __init__(self, pid, name): + def __init__(self, pid, name, is_docker=False, docker_id=None): self.pid = pid self.name = name self.jfr_name = None + self.is_docker = is_docker + self.docker_id = docker_id + self.jfr_path = None class FlightRecordsFactory: @@ -47,6 +50,7 @@ class FlightRecordsFactory: file_utils.create_dir(self.dir_to_storage_jfr) self.jcmd_path = None self.user_is_root = False + self.is_docker = False def start_sample(self): try: @@ -82,6 +86,7 @@ class FlightRecordsFactory: logging.info("check has stopped recorder") while not self.__check_has_stopped_recorder_by_root() and (datetime.datetime.now() - before).seconds < 30: time.sleep(1) + self.__copy_to_host() else: logging.exception(f"The target application {self.apps} cannot be found or Operation not permitted") @@ -98,6 +103,7 @@ class FlightRecordsFactory: logging.info("check has stopped recorder") while not self.__check_has_stopped_recorder() and (datetime.datetime.now() - before).seconds < 30: time.sleep(1) + self.__copy_to_host() else: logging.exception(f"The target application {self.apps} cannot be found or Operation not permitted") @@ -126,7 +132,11 @@ class FlightRecordsFactory: logging.info("app:%s to pid %s", app, outcome) pids = outcome.out.split() for pid in pids: - self.pids.append(TargetProcess(pid, app)) + is_docker, docker_id = docker_utils.is_docker_process(pid) + if is_docker: + self.pids.append(TargetProcess(pid, app, is_docker, docker_id)) + else: + self.pids.append(TargetProcess(pid, app)) def __check_jcmd(self): commander_to_check = "which jcmd" @@ -146,8 +156,13 @@ class FlightRecordsFactory: def __start_recorder_by_root(self): logging.info(PyInstallerUtils.get_env()) - logging.info(os.environ) for target in self.pids: + if target.is_docker: + docker_utils.create_dir_in_docker(target.docker_id, self.tmp_dir, mode=777) + docker_utils.create_dir_in_docker(target.docker_id, self.tmp_config_dir, mode=777) + docker_utils.create_dir_in_docker(target.docker_id, self.tmp_data_dir, mode=777) + docker_utils.copy_to_docker(target.docker_id, self.temporary_settings_path, + self.tmp_config_dir) jfr_path = self.__jfr_name(target.name, target.pid) username = psutil.Process(int(target.pid)).username() command = (f"su - {username} -c '" @@ -157,6 +172,7 @@ class FlightRecordsFactory: outcome = shell_tools.exec_shell(command, is_shell=True) logging.info(outcome) if outcome.return_code == 0: + target.jfr_path = jfr_path self.jfr_paths.append(jfr_path) self.pids_to_start_recording.append(target) # 移动到data目录下 @@ -165,6 +181,12 @@ class FlightRecordsFactory: def __start_recorder(self): for target in self.pids: + if target.is_docker: + docker_utils.create_dir_in_docker(target.docker_id, self.tmp_dir, mode=777) + docker_utils.create_dir_in_docker(target.docker_id, self.tmp_config_dir, mode=777) + docker_utils.create_dir_in_docker(target.docker_id, self.tmp_data_dir, mode=777) + docker_utils.copy_to_docker(target.docker_id, self.temporary_settings_path, + self.tmp_config_dir) jfr_path = self.__jfr_name(target.name, target.pid) command = (f"jcmd {target.pid} JFR.start settings={self.temporary_settings_path} duration={self.duration}s" f" name={self.RECORD_NAME} filename={jfr_path}") @@ -172,6 +194,7 @@ class FlightRecordsFactory: outcome = shell_tools.exec_shell(command, is_shell=True) logging.info(outcome) if outcome.return_code == 0: + target.jfr_path = jfr_path self.jfr_paths.append(jfr_path) self.pids_to_start_recording.append(target) # 移动到data目录下 @@ -218,6 +241,16 @@ class FlightRecordsFactory: self.pids_to_stop_recording.clear() return False + def __copy_to_host(self): + for target in self.pids_to_start_recording: + if target.is_docker: + outcome = shell_tools.exec_shell(f"docker cp {target.docker_id}:{target.jfr_path} {target.jfr_path}", + is_shell=True) + logging.info(outcome) + outcome = shell_tools.exec_shell(f"docker exec {target.docker_id} rm -rf {self.tmp_dir}", + is_shell=True) + logging.info(outcome) + def __jfr_name(self, app, pid): return os.path.join(self.tmp_data_dir, f"{app}_PID_{pid}_Time_{self.now_date}.jfr") diff --git a/tools/download_and_deploy/src/download/download_config.py b/tools/download_and_deploy/src/download/download_config.py index 190ac25b826a10230340a46040105aeb6b7e054b..57a3c1f558eee4ef4704e4699bc5d99c7242df8c 100644 --- a/tools/download_and_deploy/src/download/download_config.py +++ b/tools/download_and_deploy/src/download/download_config.py @@ -28,7 +28,7 @@ CompatibilityTesting = { DevKitTester = { "component_name": "DevKitTester", "file": "https://gitee.com/openeuler/devkit-pipeline/releases/download/v1.0.2-beta/devkit_tester.tar.gz", - "file_size": "36151864", + "file_size": "36153017", } A_FOT = {