增加update_server_record端点用于更新云服务器相关信息
This commit is contained in:
parent
d26bd67dd6
commit
27b7132503
@ -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_ids(JSON字符串格式)
|
||||||
|
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)}
|
||||||
@ -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",
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user