import time from framework.core.base_api import BaseAPI from framework.config.settings import Config from framework.core.logger import get_logger from framework.models.result import StepResult logger = get_logger("CloudDesktopService") class CloudDesktopService(BaseAPI): def __init__(self): super().__init__(Config.BASE_URL, Config.AUTH_TOKEN, Config.COOKIE) def create_desktop(self, name, charge_type="PostPaid", image_id=None): """创建云桌面""" image_id = image_id or Config.CloudDesktop.POST_IMAGE_ID body = { "name": name, "sku_id": Config.CloudDesktop.SKU_ID, "system_disk_size": Config.CloudDesktop.DISK_SIZE, "image_id": image_id, "specification_id": Config.CloudDesktop.SPEC_ID, "sub_path": "", "timer_id": Config.CloudDesktop.TIMER_ID, "charge_type": charge_type, } if charge_type == "PrePaid": body["price_policy_id"] = Config.CloudDesktop.PRICE_POLICY_ID headers = self.get_common_headers("/cloud-desktop") headers["content-type"] = "application/json" data = self.request("POST", "/api/artificerApi/desktops", headers=headers, json=body) desktop_id = data.get("data", {}).get("desktop_id") or data.get("desktop_id") return desktop_id def create_boilerplate_desktop(self, name): """创建样本工程专用云桌面""" return self.create_desktop(name, charge_type="PostPaid", image_id=Config.CloudDesktop.BP_IMAGE_ID) def stop_desktop(self, desktop_id): """关机""" return self.request("GET", f"/api/artificerApi/desktops/{desktop_id}/stop") def start_desktop(self, desktop_id): """开机""" params = {"desktop_id": desktop_id} headers = self.get_common_headers("/cloud-desktop") headers["content-length"] = "0" return self.request("POST", "/api/artificerApi/desktops/start", params=params, headers=headers) def delete_desktop(self, desktop_id): """删除""" params = {"desktop_id": desktop_id} return self.request("DELETE", "/api/desktopManagerApi/api/v1/desktops/delete", params=params) def switch_to_prepaid(self, desktop_id): """按量转包月""" body = {"desktop_id": desktop_id, "price_policy_id": Config.CloudDesktop.PRICE_POLICY_ID} return self.request("POST", "/api/artificerApi/desktops/switch_to_prepaid", json=body) def cancel_auto_renew(self, desktop_id): """包月转按量 (取消续费)""" params = {"desktop_id": desktop_id} headers = self.get_common_headers("/cloud-desktop") headers["content-length"] = "0" return self.request("POST", "/api/artificerApi/desktops/cancel_auto_renew", params=params, headers=headers) def run_lifecycle_test(self, desktop_name, flow_type="postpaid_to_prepaid", progress_callback=None): """运行完整生命周期验证流""" results = [] desktop_id = None def _log(msg): logger.info(msg) if progress_callback: progress_callback(msg) try: # 1. 创建 charge_type = "PrePaid" if flow_type == "prepaid_to_postpaid" else "PostPaid" image_id = Config.CloudDesktop.PRE_IMAGE_ID if flow_type == "prepaid_to_postpaid" else Config.CloudDesktop.POST_IMAGE_ID _log(f"Step 1: 创建 ({charge_type})") t0 = time.time() desktop_id = self.create_desktop(desktop_name, charge_type=charge_type, image_id=image_id) results.append(StepResult("创建云桌面", True, "成功", time.time()-t0)) time.sleep(Config.WAIT['create']) # 2. 关机 _log("Step 2: 关机") t0 = time.time() self.stop_desktop(desktop_id) results.append(StepResult("关机云桌面", True, "成功", time.time()-t0)) time.sleep(Config.WAIT['stop']) # 3. 开机 _log("Step 3: 开机") t0 = time.time() self.start_desktop(desktop_id) results.append(StepResult("开机云桌面", True, "成功", time.time()-t0)) time.sleep(Config.WAIT['start']) # 4. 转换 if flow_type == "prepaid_to_postpaid": _log("Step 4: 包月转按量") t0 = time.time() self.cancel_auto_renew(desktop_id) results.append(StepResult("包月转按量", True, "成功", time.time()-t0)) time.sleep(Config.WAIT['switch']) _log("Step 5: 最终关机") t0 = time.time() self.stop_desktop(desktop_id) results.append(StepResult("关机云桌面", True, "成功", time.time()-t0)) else: _log("Step 4: 按量转包月") t0 = time.time() self.switch_to_prepaid(desktop_id) results.append(StepResult("按量转包月", True, "成功", time.time()-t0)) time.sleep(Config.WAIT['switch']) _log("Step 5: 删除") t0 = time.time() self.delete_desktop(desktop_id) results.append(StepResult("删除云桌面", True, "成功", time.time()-t0)) except Exception as e: logger.error(f"Flow failed: {e}") results.append(StepResult("执行中止", False, str(e))) return results, desktop_id or "N/A"