from __future__ import annotations from app.services.ops_action_executor_core import STRUCTURED_ACTIONS _LOCAL_RUNTIME_ONLY_ACTIONS = { "runtime.push_sync", "runtime.pull_tasks", } _REMOTE_AGENT_ONLY_ACTIONS = { "delivery.queue.flush", "delivery.queue.replay", "delivery.queue.discard", } _LOCAL_RUNTIME_ACTIONS = set(STRUCTURED_ACTIONS) | _LOCAL_RUNTIME_ONLY_ACTIONS | {"deploy.release"} _SSH_ACTIONS = set(STRUCTURED_ACTIONS) | {"deploy.release"} _REMOTE_AGENT_ACTIONS = set(STRUCTURED_ACTIONS) | _REMOTE_AGENT_ONLY_ACTIONS | {"deploy.release"} _CONTROL_PLANE_ACTIONS = { "node.bootstrap", } def supports_local_runtime_action(action: str) -> bool: return str(action or "").strip() in _LOCAL_RUNTIME_ACTIONS def supports_ssh_action(action: str) -> bool: return str(action or "").strip() in _SSH_ACTIONS def supports_remote_agent_action(action: str) -> bool: return str(action or "").strip() in _REMOTE_AGENT_ACTIONS def supports_control_plane_action(action: str) -> bool: return str(action or "").strip() in _CONTROL_PLANE_ACTIONS def validate_action_execution_mode( action: str, execution_mode: str, *, target_node_code: str = "", current_node_code: str = "", ) -> tuple[bool, str]: normalized_action = str(action or "").strip() normalized_mode = str(execution_mode or "remote-agent").strip() or "remote-agent" normalized_target_node_code = str(target_node_code or "").strip() normalized_current_node_code = str(current_node_code or "").strip() if normalized_mode == "local-runtime": if not supports_local_runtime_action(normalized_action): return False, f"{normalized_action} 当前不支持 local-runtime 执行方式。" if ( normalized_target_node_code and normalized_current_node_code and normalized_target_node_code != normalized_current_node_code ): return False, "local-runtime 仅支持当前控制面本机节点。" return True, "" if normalized_mode == "control-plane": if not supports_control_plane_action(normalized_action): return False, f"{normalized_action} 当前不支持 control-plane 执行方式。" return True, "" if normalized_mode == "ssh": if not supports_ssh_action(normalized_action): return False, f"{normalized_action} 当前不支持 ssh 执行方式。" return True, "" if normalized_mode == "remote-agent": if not supports_remote_agent_action(normalized_action): return False, f"{normalized_action} 当前不支持 remote-agent 执行方式。" return True, "" return False, f"未知执行方式: {normalized_mode}"