@mcp.tool()
def manage_instance_power(
provider: str,
instance_id: str,
action: str,
ip_confirmation: str = "",
name_confirmation: str = "",
operation_confirmation: str = ""
) -> Dict:
"""
通用的实例电源管理函数(支持所有云平台)
Args:
provider (str): 云服务提供商 ('digitalocean', 'vultr', 'alibaba')
instance_id (str): 实例ID
action (str): 操作类型 ('power_on', 'power_off', 'reboot', 'shutdown')
ip_confirmation (str): 确认IP地址
name_confirmation (str): 确认实例名称
operation_confirmation (str): 确认操作类型
Returns:
Dict: 操作结果
"""
provider_name = provider.lower()
# AWS不支持电源管理
if provider_name == 'aws':
return {
'error': 'AWS平台仅支持只读查询,不允许执行电源管理操作',
'provider': 'aws',
'suggestion': '如需管理AWS实例,请使用AWS控制台或CLI'
}
if provider_name not in ['digitalocean', 'vultr', 'alibaba']:
return {
'error': f'不支持的云服务提供商: {provider_name}',
'supported_providers': ['digitalocean', 'vultr', 'alibaba']
}
if action not in ['power_on', 'power_off', 'reboot', 'shutdown']:
return {
'error': f'不支持的操作类型: {action}',
'supported_actions': ['power_on', 'power_off', 'reboot', 'shutdown']
}
provider_obj = PROVIDERS[provider_name]
provider_info = get_cloud_provider_info(provider_name)
# 检查提供商是否可用
if not getattr(provider_obj, 'available', False):
error_msg = getattr(provider_obj, 'error', '提供商不可用')
return {
'error': f'{provider_info["name"]} 提供商不可用: {error_msg}',
'provider': provider_name
}
print(f"🎯 {provider_info['name']} 电源管理: {action} for {instance_id}")
try:
# 调用对应提供商的电源管理方法
if provider_name == 'digitalocean':
droplet_id = int(instance_id) if instance_id.isdigit() else None
if not droplet_id:
return {'error': 'DigitalOcean Droplet ID必须是数字'}
if action == 'power_on':
return provider_obj.power_on_droplet(droplet_id, ip_confirmation, name_confirmation, operation_confirmation)
elif action == 'power_off':
return provider_obj.power_off_droplet(droplet_id, ip_confirmation, name_confirmation, operation_confirmation)
elif action == 'reboot':
return provider_obj.reboot_droplet(droplet_id, ip_confirmation, name_confirmation, operation_confirmation)
elif action == 'shutdown':
return provider_obj.shutdown_droplet(droplet_id, ip_confirmation, name_confirmation, operation_confirmation)
elif provider_name == 'vultr':
if action == 'power_on':
return provider_obj.power_on_instance(instance_id, ip_confirmation, name_confirmation, operation_confirmation)
elif action == 'power_off':
return provider_obj.power_off_instance(instance_id, ip_confirmation, name_confirmation, operation_confirmation)
elif action == 'reboot':
return provider_obj.reboot_instance(instance_id, ip_confirmation, name_confirmation, operation_confirmation)
elif action == 'shutdown':
# Vultr可能不支持优雅关闭,使用强制关闭
return provider_obj.power_off_instance(instance_id, ip_confirmation, name_confirmation, operation_confirmation)
elif provider_name == 'alibaba':
if action == 'power_on':
return provider_obj.power_on_instance(instance_id, ip_confirmation, name_confirmation, operation_confirmation)
elif action == 'power_off':
return provider_obj.power_off_instance(instance_id, ip_confirmation, name_confirmation, operation_confirmation)
elif action == 'reboot':
return provider_obj.reboot_instance(instance_id, ip_confirmation, name_confirmation, operation_confirmation)
elif action == 'shutdown':
# 阿里云使用power_off作为关闭操作
return provider_obj.power_off_instance(instance_id, ip_confirmation, name_confirmation, operation_confirmation)
except Exception as e:
return {
'error': f'执行 {action} 操作时发生错误: {str(e)}',
'provider': provider_name,
'instance_id': instance_id,
'action': action
}