130 lines
5.5 KiB
Python
130 lines
5.5 KiB
Python
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"
|