feat: add command handling support to Nginx message handler
This commit is contained in:
@@ -3,14 +3,18 @@ use std::sync::Arc;
|
||||
use dashmap::DashMap;
|
||||
use nxmesh_proto::{
|
||||
ConfigUpdate, ConfigUpdateResult,
|
||||
agent_message::Payload::ConfigUpdateResult as ConfigUpdateResultPayload,
|
||||
agent_message::Payload::ConfigUpdateResult as ConfigUpdateResultPayload, command::Command,
|
||||
command_result,
|
||||
};
|
||||
use tracing::warn;
|
||||
|
||||
use crate::{
|
||||
config::settings::NginxSettings,
|
||||
service::{
|
||||
master_handler::{MasterHandler, MessageResult, handlers::OnConfigUpdateHandler},
|
||||
master_handler::{
|
||||
MasterHandler, MessageResult,
|
||||
handlers::{OnCommandHandler, OnConfigUpdateHandler},
|
||||
},
|
||||
nginx_handler::{command_handler::CommandHandler, fs_handler::FsHandler},
|
||||
},
|
||||
};
|
||||
@@ -23,6 +27,7 @@ events {}
|
||||
pub trait NginxMasterMessageHandler: Send + Sync + 'static
|
||||
//
|
||||
+ OnConfigUpdateHandler
|
||||
+ OnCommandHandler
|
||||
{}
|
||||
|
||||
pub struct NginxMasterMessageHandlerImpl {
|
||||
@@ -119,3 +124,51 @@ impl OnConfigUpdateHandler for NginxMasterMessageHandlerImpl {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl OnCommandHandler for NginxMasterMessageHandlerImpl {
|
||||
async fn on_command(
|
||||
&self,
|
||||
agent_id: &str,
|
||||
timestamp: i64,
|
||||
message_id: &str,
|
||||
command: Command,
|
||||
) -> MessageResult<()> {
|
||||
// execute the command
|
||||
let mut agent_message = nxmesh_proto::AgentMessage {
|
||||
agent_id: agent_id.to_string(),
|
||||
timestamp,
|
||||
message_id: message_id.to_string(),
|
||||
payload: None,
|
||||
};
|
||||
let result: command_result::Result = match command {
|
||||
// TODO: should use the previous config path
|
||||
Command::Reload(_) => {
|
||||
let result = self.command_handler.reload(None).await;
|
||||
command_result::Result::ReloadResult(nxmesh_proto::ReloadResult {
|
||||
success: result.is_ok(),
|
||||
error_message: result.err().map(|e| e.to_string()).unwrap_or_default(),
|
||||
})
|
||||
}
|
||||
Command::Test(_) => {
|
||||
let result = self.command_handler.validate(None).await;
|
||||
command_result::Result::TestResult(nxmesh_proto::TestResult {
|
||||
success: result.is_ok(),
|
||||
error_message: result.err().map(|e| e.to_string()).unwrap_or_default(),
|
||||
})
|
||||
}
|
||||
};
|
||||
// Reply the master to confirm the command execution is successful, and return the command output
|
||||
agent_message.payload = Some(nxmesh_proto::agent_message::Payload::CommandResult(
|
||||
nxmesh_proto::CommandResult {
|
||||
result: Some(result),
|
||||
},
|
||||
));
|
||||
|
||||
self.master_handler
|
||||
.send_message_to_master(agent_message)
|
||||
.await?;
|
||||
//
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user