增加update_server_record端点用于更新云服务器相关信息

This commit is contained in:
jingrow 2025-07-28 15:39:13 +08:00
parent d26bd67dd6
commit 27b7132503
3 changed files with 141 additions and 30 deletions

View File

@ -1,6 +1,9 @@
import jingrow import jingrow
import os import os
import sys import sys
import json
import random
from datetime import datetime
from typing import Dict, Any from typing import Dict, Any
from alibabacloud_swas_open20200601.client import Client as SWAS_OPEN20200601Client from alibabacloud_swas_open20200601.client import Client as SWAS_OPEN20200601Client
@ -10,6 +13,8 @@ from alibabacloud_swas_open20200601 import models as swas__open20200601_models
from alibabacloud_tea_util import models as util_models from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient from alibabacloud_tea_util.client import Client as UtilClient
from jcloud.utils import get_current_team
class AliyunLightServerManager: class AliyunLightServerManager:
"""阿里云轻量应用服务器管理器""" """阿里云轻量应用服务器管理器"""
@ -337,6 +342,27 @@ class AliyunLightServerManager:
jingrow.log_error("删除密钥对失败", f"删除实例 {instance_id} 密钥对 {key_pair_name} 时发生错误: {str(e)}") jingrow.log_error("删除密钥对失败", f"删除实例 {instance_id} 密钥对 {key_pair_name} 时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '密钥对删除失败'} return {'success': False, 'error': str(e), 'message': '密钥对删除失败'}
def get_instance_details(self, instance_ids, region_id='cn-shanghai'):
"""获取实例详细信息(支持批量查询)"""
client = self._get_client(region_id)
try:
# 如果instance_ids是列表转换为JSON字符串
if isinstance(instance_ids, list):
instance_ids_str = json.dumps(instance_ids)
else:
instance_ids_str = instance_ids
request = swas__open20200601_models.ListInstancesRequest(
region_id=region_id,
instance_ids=instance_ids_str
)
runtime = util_models.RuntimeOptions()
response = client.list_instances_with_options(request, runtime)
return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '获取实例详细信息成功'}
except Exception as e:
jingrow.log_error("获取实例详细信息失败", f"获取实例详细信息时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '获取实例详细信息失败'}
# 全局管理器实例 # 全局管理器实例
_aliyun_manager = None _aliyun_manager = None
@ -440,6 +466,11 @@ def delete_aliyun_instance_key_pair(instance_id, key_pair_name, region_id='cn-sh
manager = _get_manager() manager = _get_manager()
return manager.delete_instance_key_pair(instance_id, key_pair_name, region_id) return manager.delete_instance_key_pair(instance_id, key_pair_name, region_id)
@jingrow.whitelist()
def get_aliyun_instance_details(instance_ids, region_id='cn-shanghai'):
"""获取实例详细信息(支持批量查询)"""
manager = _get_manager()
return manager.get_instance_details(instance_ids, region_id)
# 服务器订单和创建相关 # 服务器订单和创建相关
@ -456,7 +487,6 @@ def create_server_order(**kwargs):
if not plan_id or not image_id: if not plan_id or not image_id:
jingrow.throw("缺少必要参数") jingrow.throw("缺少必要参数")
from jcloud.utils import get_current_team
team = get_current_team(True) team = get_current_team(True)
# 获取套餐价格 # 获取套餐价格
@ -474,8 +504,6 @@ def create_server_order(**kwargs):
total_amount = monthly_price * period total_amount = monthly_price * period
# 生成订单号 # 生成订单号
from datetime import datetime
import random
order_id = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3] + ''.join(random.choices('0123456789', k=6)) order_id = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3] + ''.join(random.choices('0123456789', k=6))
# 创建订单记录 # 创建订单记录
@ -498,7 +526,7 @@ def create_server_order(**kwargs):
"order_id": order_id, "order_id": order_id,
"status": "Pending", "status": "Pending",
"region": region_id, "region": region_id,
"system_image": image_id, "image_id": image_id,
"end_date": jingrow.utils.add_months(jingrow.utils.nowdate(), period), "end_date": jingrow.utils.add_months(jingrow.utils.nowdate(), period),
"title": f"{region_id} - {selected_plan.get('core')}核/{selected_plan.get('memory')}GB", "title": f"{region_id} - {selected_plan.get('core')}核/{selected_plan.get('memory')}GB",
"planid": plan_id, "planid": plan_id,
@ -532,7 +560,7 @@ def create_aliyun_server(order_name):
# 从服务器记录中获取配置信息 # 从服务器记录中获取配置信息
region_id = server.region or 'cn-shanghai' region_id = server.region or 'cn-shanghai'
image_id = server.system_image or 'e9363571cf2444aba422b17470285465' image_id = server.image_id or 'e9363571cf2444aba422b17470285465'
plan_id = server.planid or 'swas.s.c2m1s30b1.linux' plan_id = server.planid or 'swas.s.c2m1s30b1.linux'
period = server.period or 1 period = server.period or 1
@ -549,8 +577,7 @@ def create_aliyun_server(order_name):
instance_id = result['data']['instance_ids'][0] instance_id = result['data']['instance_ids'][0]
# 更新服务器记录状态 # 更新服务器记录状态
server.status = "Active" server.status = "Running"
server.running_status = "运行中"
server.instance_id = instance_id server.instance_id = instance_id
server.save(ignore_permissions=True) server.save(ignore_permissions=True)
@ -605,4 +632,90 @@ def create_server_key_pair(instance_id):
except Exception as e: except Exception as e:
jingrow.log_error("创建密钥对失败", f"实例 {instance_id}: {str(e)}") jingrow.log_error("创建密钥对失败", f"实例 {instance_id}: {str(e)}")
return {"success": False, "message": str(e)}
@jingrow.whitelist()
def update_server_record(instance_ids):
"""根据阿里云实例信息更新Jsite Server记录"""
try:
# 解析instance_idsJSON字符串格式
if isinstance(instance_ids, str):
instance_ids = json.loads(instance_ids)
# 获取第一个实例ID
instance_id = instance_ids[0]
# 查找对应的Jsite Server记录获取region_id
server = jingrow.get_pg("Jsite Server", {"instance_id": instance_id})
if not server:
jingrow.log_error("更新服务器信息失败", f"找不到实例ID为 {instance_id} 的Jsite Server记录")
return {"success": False, "message": f"找不到实例ID为 {instance_id} 的Jsite Server记录"}
region_id = server.region or 'cn-shanghai'
# 获取阿里云实例详细信息
instance_details = get_aliyun_instance_details(instance_ids, region_id)
if not instance_details or not instance_details.get('success'):
error_msg = f"获取阿里云实例信息失败: {instance_details.get('message', '未知错误')}"
jingrow.log_error("更新服务器信息失败", error_msg)
return {"success": False, "message": error_msg}
# 解析实例信息
instances = instance_details.get('data', {}).get('instances', [])
if not instances:
jingrow.log_error("更新服务器信息失败", "未找到实例信息")
return {"success": False, "message": "未找到实例信息"}
instance_info = instances[0] # 取第一个实例
# 更新public_ip
public_ip = instance_info.get('public_ip_address')
if public_ip:
server.public_ip = public_ip
# 更新end_date从expired_time转换
expired_time = instance_info.get('expired_time')
if expired_time:
try:
expired_datetime = datetime.fromisoformat(expired_time.replace('Z', '+00:00'))
server.end_date = expired_datetime.strftime('%Y-%m-%d %H:%M:%S')
except Exception as e:
jingrow.log_error("时间格式转换失败", f"转换expired_time {expired_time} 时发生错误: {str(e)}")
# 更新其他相关信息
server.status = instance_info.get('status', '')
# 更新系统信息
image_info = instance_info.get('image', {})
if image_info:
image_name = image_info.get('image_name', '')
image_version = image_info.get('image_version', '')
server.system = f"{image_name} {image_version}".strip()
# 更新资源规格信息
resource_spec = instance_info.get('resource_spec', {})
if resource_spec:
server.cpu = resource_spec.get('cpu')
server.memory = resource_spec.get('memory')
server.disk_size = resource_spec.get('disk_size')
server.bandwidth = resource_spec.get('bandwidth')
# 保存更新
server.save(ignore_permissions=True)
jingrow.db.commit()
return {
"success": True,
"message": "服务器信息更新成功",
"updated_fields": {
"public_ip": public_ip,
"end_date": server.end_date,
"status": server.status,
"system": server.system
}
}
except Exception as e:
jingrow.log_error("更新服务器信息失败", f"更新服务器信息时发生错误: {str(e)}")
return {"success": False, "message": str(e)} return {"success": False, "message": str(e)}

View File

@ -15,14 +15,14 @@
"cpu", "cpu",
"disk_size", "disk_size",
"region", "region",
"system_image", "image_id",
"planid", "planid",
"column_break_aliyun", "column_break_aliyun",
"end_date", "end_date",
"memory", "memory",
"bandwidth", "bandwidth",
"public_ip", "public_ip",
"running_status", "system",
"period", "period",
"ssh_section", "ssh_section",
"ssh_user", "ssh_user",
@ -38,7 +38,7 @@
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 1, "in_standard_filter": 1,
"label": "状态", "label": "状态",
"options": "Pending\nInstalling\nActive\nBroken\nArchived", "options": "Pending\nStarting\nRunning\nStopping\nStopped\nResetting\nUpgrading\nDisabled",
"read_only": 1 "read_only": 1
}, },
{ {
@ -92,7 +92,7 @@
}, },
{ {
"fieldname": "end_date", "fieldname": "end_date",
"fieldtype": "Date", "fieldtype": "Datetime",
"in_list_view": 1, "in_list_view": 1,
"label": "到期时间", "label": "到期时间",
"read_only": 1 "read_only": 1
@ -137,20 +137,6 @@
"label": "硬盘容量GB", "label": "硬盘容量GB",
"read_only": 1 "read_only": 1
}, },
{
"fieldname": "system_image",
"fieldtype": "Data",
"label": "系统镜像"
},
{
"fetch_from": "virtual_machine.public_ip_address",
"fieldname": "running_status",
"fieldtype": "Select",
"in_list_view": 1,
"label": "运行状态",
"options": "\n运行中\n已停机",
"read_only": 1
},
{ {
"fieldname": "order_id", "fieldname": "order_id",
"fieldtype": "Data", "fieldtype": "Data",
@ -182,11 +168,23 @@
"in_list_view": 1, "in_list_view": 1,
"label": "公网IP", "label": "公网IP",
"read_only": 1 "read_only": 1
},
{
"fieldname": "image_id",
"fieldtype": "Data",
"label": "镜像ID",
"read_only": 1
},
{
"fieldname": "system",
"fieldtype": "Data",
"label": "系统",
"read_only": 1
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
"modified": "2025-07-28 13:48:36.022662", "modified": "2025-07-28 15:36:38.598173",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Jcloud", "module": "Jcloud",
"name": "Jsite Server", "name": "Jsite Server",

View File

@ -17,7 +17,8 @@ class JsiteServer(Document):
bandwidth: DF.Data | None bandwidth: DF.Data | None
cpu: DF.Data | None cpu: DF.Data | None
disk_size: DF.Data | None disk_size: DF.Data | None
end_date: DF.Date | None end_date: DF.Datetime | None
image_id: DF.Data | None
instance_id: DF.Data | None instance_id: DF.Data | None
memory: DF.Data | None memory: DF.Data | None
order_id: DF.Data | None order_id: DF.Data | None
@ -26,11 +27,10 @@ class JsiteServer(Document):
private_key: DF.Text | None private_key: DF.Text | None
public_ip: DF.Data | None public_ip: DF.Data | None
region: DF.Data | None region: DF.Data | None
running_status: DF.Literal["", "\u8fd0\u884c\u4e2d", "\u5df2\u505c\u673a"]
ssh_port: DF.Int ssh_port: DF.Int
ssh_user: DF.Data | None ssh_user: DF.Data | None
status: DF.Literal["Pending", "Installing", "Active", "Broken", "Archived"] status: DF.Literal["Pending", "Starting", "Running", "Stopping", "Stopped", "Resetting", "Upgrading", "Disabled"]
system_image: DF.Data | None system: DF.Data | None
team: DF.Link | None team: DF.Link | None
title: DF.Data | None title: DF.Data | None
# end: auto-generated types # end: auto-generated types