增加删除密钥对api端点及功能

This commit is contained in:
jingrow 2025-07-28 20:59:36 +08:00
parent a59ab5f8a3
commit caefb4a408
3 changed files with 103 additions and 34 deletions

View File

@ -4,6 +4,7 @@ import sys
import json import json
import random import random
import time import time
import uuid
from datetime import datetime from datetime import datetime
from typing import Dict, Any from typing import Dict, Any
@ -330,37 +331,53 @@ 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 list_instance_key_pairs(self, instance_id, region_id='cn-shanghai'):
"""获取实例的密钥对列表"""
client = self._get_client(region_id)
try:
request = swas__open20200601_models.ListInstanceKeyPairsRequest(
region_id=region_id,
instance_id=instance_id
)
runtime = util_models.RuntimeOptions()
response = client.list_instance_key_pairs_with_options(request, runtime)
return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '获取密钥对列表成功'}
except Exception as e:
jingrow.log_error("获取密钥对列表失败", f"获取实例 {instance_id} 密钥对列表时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '获取密钥对列表失败'}
def delete_instance_key_pair(self, instance_id, key_pair_name, region_id='cn-shanghai'):
"""删除实例的密钥对""" def delete_instance_key_pair(self, instance_id, region_id='cn-shanghai'):
"""解绑实例的密钥对"""
client = self._get_client(region_id) client = self._get_client(region_id)
try: try:
request = swas__open20200601_models.DeleteInstanceKeyPairRequest( request = swas__open20200601_models.DeleteInstanceKeyPairRequest(
region_id=region_id, region_id=region_id,
instance_id=instance_id, instance_id=instance_id
key_pair_name=key_pair_name
) )
runtime = util_models.RuntimeOptions() runtime = util_models.RuntimeOptions()
response = client.delete_instance_key_pair_with_options(request, runtime) response = client.delete_instance_key_pair_with_options(request, runtime)
return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '密钥对解绑成功'}
except Exception as e:
jingrow.log_error("解绑密钥对失败", f"解绑实例 {instance_id} 密钥对时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '密钥对解绑失败'}
def delete_key_pairs(self, key_pair_names, region_id='cn-shanghai'):
"""删除密钥对"""
client = self._get_client(region_id)
try:
request = swas__open20200601_models.DeleteKeyPairsRequest(
region_id=region_id,
key_pair_names=key_pair_names
)
runtime = util_models.RuntimeOptions()
response = client.delete_key_pairs_with_options(request, runtime)
return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '密钥对删除成功'} return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '密钥对删除成功'}
except Exception as e: except Exception as e:
jingrow.log_error("删除密钥对失败", f"删除实例 {instance_id} 密钥对 {key_pair_name} 时发生错误: {str(e)}") jingrow.log_error("删除密钥对失败", f"删除密钥对 {key_pair_names} 时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '密钥对删除失败'} return {'success': False, 'error': str(e), 'message': '密钥对删除失败'}
def get_instance_key_pair(self, instance_id, region_id='cn-shanghai'):
"""获取实例的密钥对详细信息"""
client = self._get_client(region_id)
try:
request = swas__open20200601_models.DescribeInstanceKeyPairRequest(
region_id=region_id,
instance_id=instance_id
)
runtime = util_models.RuntimeOptions()
response = client.describe_instance_key_pair_with_options(request, runtime)
return {'success': True, 'data': self._convert_response_to_dict(response.body), 'message': '获取密钥对详细信息成功'}
except Exception as e:
jingrow.log_error("获取密钥对详细信息失败", f"获取实例 {instance_id} 密钥对详细信息时发生错误: {str(e)}")
return {'success': False, 'error': str(e), 'message': '获取密钥对详细信息失败'}
def get_instance_details(self, instance_ids, region_id='cn-shanghai'): def get_instance_details(self, instance_ids, region_id='cn-shanghai'):
"""获取实例详细信息(支持批量查询)""" """获取实例详细信息(支持批量查询)"""
client = self._get_client(region_id) client = self._get_client(region_id)
@ -604,17 +621,53 @@ def create_aliyun_instance_key_pair(instance_id, key_pair_name, region_id='cn-sh
manager = _get_manager() manager = _get_manager()
return manager.create_instance_key_pair(instance_id, key_pair_name, region_id) return manager.create_instance_key_pair(instance_id, key_pair_name, region_id)
@jingrow.whitelist()
def list_aliyun_instance_key_pairs(instance_id, region_id='cn-shanghai'):
"""获取实例的密钥对列表"""
manager = _get_manager()
return manager.list_instance_key_pairs(instance_id, region_id)
@jingrow.whitelist() @jingrow.whitelist()
def delete_aliyun_instance_key_pair(instance_id, key_pair_name, region_id='cn-shanghai'): def delete_aliyun_instance_key_pair(instance_id):
"""删除实例的密钥对""" """解绑并删除实例的密钥对"""
try:
# 1. 查找对应的Jsite Server记录获取key_pair_name和region_id
server = jingrow.get_pg("Jsite Server", {"instance_id": instance_id})
if not server:
return {"success": False, "message": "找不到对应的服务器记录"}
key_pair_name = server.key_pair_name
region_id = server.region
if not key_pair_name:
return {"success": True, "message": "实例没有关联的密钥对"}
manager = _get_manager()
# 2. 解绑实例的密钥对
unbind_result = manager.delete_instance_key_pair(instance_id, region_id)
if not unbind_result or not unbind_result.get('success'):
return {"success": False, "message": f"解绑密钥对失败: {unbind_result.get('message', '未知错误')}"}
# 3. 删除密钥对
delete_result = manager.delete_key_pairs([key_pair_name], region_id)
if not delete_result or not delete_result.get('success'):
return {"success": False, "message": f"删除密钥对失败: {delete_result.get('message', '未知错误')}"}
# 4. 清除服务器记录中的密钥对信息
server.key_pair_name = None
server.private_key = None
server.save(ignore_permissions=True)
jingrow.db.commit()
return {"success": True, "message": "密钥对解绑并删除成功"}
except Exception as e:
jingrow.log_error("删除实例密钥对失败", f"删除实例 {instance_id} 密钥对时发生错误: {str(e)}")
return {"success": False, "message": str(e)}
@jingrow.whitelist()
def get_aliyun_instance_key_pair(instance_id, region_id='cn-shanghai'):
"""获取实例的密钥对详细信息"""
manager = _get_manager() manager = _get_manager()
return manager.delete_instance_key_pair(instance_id, key_pair_name, region_id) return manager.get_instance_key_pair(instance_id, region_id)
@jingrow.whitelist() @jingrow.whitelist()
def get_aliyun_instance_details(instance_ids, region_id='cn-shanghai'): def get_aliyun_instance_details(instance_ids, region_id='cn-shanghai'):
@ -753,15 +806,22 @@ def create_server_key_pair(instance_id):
jingrow.log_error("找不到对应的服务器记录") jingrow.log_error("找不到对应的服务器记录")
region_id = server.region region_id = server.region
key_pair_name = f"{region_id}-{instance_id[:8]}" uuid_suffix = str(uuid.uuid4())[:4]
key_pair_name = f"{region_id}-{instance_id[:8]}-{uuid_suffix}"
# 调用阿里云API创建密钥对 # 直接调用管理器方法创建密钥对
key_pair_result = create_aliyun_instance_key_pair(instance_id, key_pair_name, region_id) manager = _get_manager()
key_pair_result = manager.create_instance_key_pair(instance_id, key_pair_name, region_id)
# 添加调试日志
jingrow.log_error("密钥对创建调试", f"完整的key_pair_result: {key_pair_result}")
if not key_pair_result or not key_pair_result.get('success'): if not key_pair_result or not key_pair_result.get('success'):
jingrow.log_error(f"密钥对创建失败: {key_pair_result.get('message', '未知错误')}") error_msg = key_pair_result.get('message', '未知错误') if key_pair_result else '返回结果为空'
jingrow.log_error(f"密钥对创建失败: {error_msg}")
return {"success": False, "message": f"密钥对创建失败: {error_msg}"}
# 获取私钥 # 获取私钥 - 直接访问data字段
key_pair_data = key_pair_result.get('data', {}) key_pair_data = key_pair_result.get('data', {})
private_key = key_pair_data.get('private_key') private_key = key_pair_data.get('private_key')
@ -770,6 +830,7 @@ def create_server_key_pair(instance_id):
server.key_pair_name = key_pair_name server.key_pair_name = key_pair_name
server.private_key = private_key server.private_key = private_key
server.save(ignore_permissions=True) server.save(ignore_permissions=True)
jingrow.db.commit()
return { return {
"success": True, "success": True,
@ -778,7 +839,8 @@ def create_server_key_pair(instance_id):
"private_key": private_key "private_key": private_key
} }
else: else:
jingrow.log_error("密钥对创建成功但未获取到私钥") jingrow.log_error("密钥对创建成功但未获取到私钥", f"完整的key_pair_result: {key_pair_result}")
return {"success": False, "message": "密钥对创建成功但未获取到私钥"}
except Exception as e: except Exception as e:
jingrow.log_error("创建密钥对失败", f"实例 {instance_id}: {str(e)}") jingrow.log_error("创建密钥对失败", f"实例 {instance_id}: {str(e)}")

View File

@ -29,6 +29,7 @@
"ssh_port", "ssh_port",
"password", "password",
"column_break_20", "column_break_20",
"key_pair_name",
"private_key" "private_key"
], ],
"fields": [ "fields": [
@ -187,11 +188,16 @@
"fieldname": "password", "fieldname": "password",
"fieldtype": "Password", "fieldtype": "Password",
"label": "服务器密码" "label": "服务器密码"
},
{
"fieldname": "key_pair_name",
"fieldtype": "Data",
"label": "密钥对名称"
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
"modified": "2025-07-28 17:53:25.476573", "modified": "2025-07-28 20:45:29.493153",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Jcloud", "module": "Jcloud",
"name": "Jsite Server", "name": "Jsite Server",

View File

@ -20,6 +20,7 @@ class JsiteServer(Document):
end_date: DF.Datetime | None end_date: DF.Datetime | None
image_id: DF.Data | None image_id: DF.Data | None
instance_id: DF.Data | None instance_id: DF.Data | None
key_pair_name: DF.Data | None
memory: DF.Data | None memory: DF.Data | None
order_id: DF.Data | None order_id: DF.Data | None
password: DF.Password | None password: DF.Password | None