From 8522e525b25c76b51f998dd7d25d156c63d49a98 Mon Sep 17 00:00:00 2001 From: qiaofeng1227 <76487013@qq.com> Date: Fri, 14 Apr 2023 08:41:43 +0000 Subject: [PATCH] appmanage --- appmanage/api/exception/command_exception.py | 6 +- appmanage/api/service/manage.py | 80 +++++++++----------- appmanage/api/utils/shell_execute.py | 7 +- appmanage/api/v1/routers/apps.py | 11 ++- 4 files changed, 48 insertions(+), 56 deletions(-) diff --git a/appmanage/api/exception/command_exception.py b/appmanage/api/exception/command_exception.py index 9e9b4ffc..99240633 100644 --- a/appmanage/api/exception/command_exception.py +++ b/appmanage/api/exception/command_exception.py @@ -1,3 +1,5 @@ class CommandException(Exception): - def __init__(self, message): - self.message = message \ No newline at end of file + def __init__(self, code, message, detail): + self.code = code + self.message = message + self.detail = detail \ No newline at end of file diff --git a/appmanage/api/service/manage.py b/appmanage/api/service/manage.py index 29121cf8..955db905 100644 --- a/appmanage/api/service/manage.py +++ b/appmanage/api/service/manage.py @@ -18,8 +18,8 @@ from api.model.status_reason import StatusReason from api.utils.common_log import myLogger from redis import Redis from rq import Queue, Worker, Connection -from rq.registry import StartedJobRegistry, FinishedJobRegistry, DeferredJobRegistry, FailedJobRegistry, \ - ScheduledJobRegistry +from rq.registry import StartedJobRegistry, FinishedJobRegistry, DeferredJobRegistry, FailedJobRegistry, ScheduledJobRegistry +from api.exception.command_exception import CommandException # 指定 Redis 容器的主机名和端口 redis_conn = Redis(host='websoft9-redis', port=6379) @@ -27,7 +27,6 @@ redis_conn = Redis(host='websoft9-redis', port=6379) # 使用指定的 Redis 连接创建 RQ 队列 q = Queue(connection=redis_conn) - # 获取所有app的信息 def get_my_app(): # get all info @@ -186,7 +185,7 @@ def uninstall_app(app_id, delete_image, delete_data): def check_app(app_name, customer_name, app_version): - message = " " + message = "" code = None app_id = app_name + "-" + customer_name if app_name == None: @@ -215,55 +214,46 @@ def check_app(app_name, customer_name, app_version): message = "Repeat installation: " + customer_name return code, message -def prepare_app(app_name, customer_app_name): +def prepare_app(app_name, customer_name): + library_path = "/data/library/apps/" + app_name - install_path = "/data/apps/" + customer_app_name - message = " " - code = const.RETURN_SUCCESS - output = shell_execute.execute_command_output_all("cp -r " + library_path + " " + install_path) - if int(output["code"]) != 0: - message = "creating" + customer_app_name + "directory failed!" - code = const.RETURN_FAIL - return code, message + install_path = "/data/apps/" + customer_name + shell_execute.execute_command_output_all("cp -r " + library_path + " " + install_path) +def install_app_delay(app_name, customer_name, app_version): + + job_id = app_name + "_" + customer_name -def install_app_delay(app_name, customer_app_name, app_version): try: - code, message = check_app(app_name, customer_app_name, app_version) - if code == const.RETURN_SUCCESS: - code, message = prepare_app(app_name, customer_app_name) - if code == const.RETURN_SUCCESS: - myLogger.info_logger("start job=" + customer_app_name) - # modify env - env_path = "/data/apps/" + customer_app_name + "/.env" - docker.modify_env(env_path, 'APP_NAME', customer_app_name) - docker.modify_env(env_path, "APP_VERSION", app_version) - # check port - docker.check_app_compose(env_path) - cmd = "cd /data/apps/" + customer_app_name + " && sudo docker compose pull && sudo docker compose up -d" - output = shell_execute.execute_command_output_all(cmd) - myLogger.info_logger("install output") - myLogger.info_logger(output["code"]) - myLogger.info_logger(output["result"]) - if int(output["code"]) != 0 or "error" in output["result"] or "fail" in output["result"]: - raise Exception("installfailed!") - else: - return "success" - else: - raise Exception("prepare_app failed") + code, message = check_app(app_name, customer_name, app_version) + if code == None: + + prepare_app(app_name, customer_name) + + myLogger.info_logger("start JobID=" + job_id) + # modify env + env_path = "/data/apps/" + customer_name + "/.env" + docker.modify_env(env_path, 'APP_NAME', customer_name) + docker.modify_env(env_path, "APP_VERSION", app_version) + # check port + docker.check_app_compose(env_path) + + cmd = "cd /data/apps/" + customer_name + " && sudo docker compose pull && sudo docker compose up -d" + output = shell_execute.execute_command_output_all(cmd) + myLogger.info_logger("-------Install result--------") + myLogger.info_logger(output["code"]) + myLogger.info_logger(output["result"]) else: - raise Exception("resource check failed") + raise CommandException(code,message,"") + except CommandException as ce: + uninstall_app(job_id) + raise CommandException(ce.code,ce.message,ce.detail) except Exception as e: - myLogger.info_logger(customer_app_name + "install failed!") + myLogger.info_logger(customer_name + "install failed!") myLogger.error_logger(e) - job_id = app_name + "_" + customer_app_name - try: - uninstall_app(job_id) - except Exception as e: - myLogger.error_logger(e) - raise Exception(e) - + uninstall_app(job_id) + raise CommandException(const.ERROR_SERVER_SYSTEM,"system original error",str(e)) def if_app_exits(app_id): app_name = app_id.split('_')[1] diff --git a/appmanage/api/utils/shell_execute.py b/appmanage/api/utils/shell_execute.py index 39f8e86c..c95e51a5 100644 --- a/appmanage/api/utils/shell_execute.py +++ b/appmanage/api/utils/shell_execute.py @@ -2,6 +2,7 @@ import os, io, sys, platform, shutil, time, subprocess, json, datetime from api.utils.common_log import myLogger from api.exception.command_exception import CommandException +from api.utils import const def execute_command_output(cmd_str): print(cmd_str) @@ -10,7 +11,7 @@ def execute_command_output(cmd_str): return out_str # cmd_str: 执行的command命令 times:如果不成功的重复次数 -def execute_command_output_all(cmd_str, max_time = 3): +def execute_command_output_all(cmd_str, max_time = 2): myLogger.info_logger("Start to execute cmd: " + cmd_str) execute_time = 0 @@ -22,8 +23,8 @@ def execute_command_output_all(cmd_str, max_time = 3): return {"code": "0", "result": process.stdout,} else: execute_time = execute_time + 1 - if execute_time > 3: - raise CommandException(process.stdout) + if execute_time > 2: + raise CommandException(const.ERROR_SERVER_COMMAND,"Docker returns the original error",process.stdout) def convert_command(cmd_str): convert_cmd = "" diff --git a/appmanage/api/v1/routers/apps.py b/appmanage/api/v1/routers/apps.py index e19b1c16..6cb190fa 100644 --- a/appmanage/api/v1/routers/apps.py +++ b/appmanage/api/v1/routers/apps.py @@ -74,20 +74,20 @@ def list_my_apps(request: Request): @router.api_route("/AppInstall", methods=["GET", "POST"], summary="安装APP", response_description=rd_two, response_model=Response) def AppInstall(request: Request, app_name: Optional[str] = Query(default=None, description="应用名"), - customer_app_name: Optional[str] = Query(default=None, description="应用自定义名字"), + customer_name: Optional[str] = Query(default=None, description="应用自定义名字"), app_version: Optional[str] = Query(default=None, description="应用版本")): try: myLogger.info_logger("Receive request: /AppInstall") get_headers(request) - ret = manage.install_app(app_name, customer_app_name, app_version) + ret = manage.install_app(app_name, customer_name, app_version) except CommandException as ce: ret = {} - ret['ResponseData']['AppID'] = app_name + "_" + customer_app_name - ret['Error']=manage.get_error_info(const.ERROR_SERVER_COMMAND,"Docker returns the original error",str(ce)) + ret['ResponseData']['AppID'] = app_name + "_" + customer_name + ret['Error']=manage.get_error_info(ce.code,ce.message,ce.detail) except Exception as e: ret = {} - ret['ResponseData']['AppID'] = app_name + "_" + customer_app_name + ret['ResponseData']['AppID'] = app_name + "_" + customer_name ret['Error']=manage.get_error_info(const.ERROR_SERVER_SYSTEM,"system original error",str(e)) return JSONResponse(content=ret) @@ -99,7 +99,6 @@ def start_app(app_id: Optional[str] = Query(default=None, description="应用ID" ret = manage.start_app(app_id) return JSONResponse(content=ret) - @router.api_route("/AppStop", methods=["GET", "POST"], summary="停止APP", response_description=rd_two, response_model=Response) def stop_app(app_id: Optional[str] = Query(default=None, description="应用ID")):