Implement federation self-test

This commit is contained in:
Lambda 2024-09-20 12:05:24 +00:00 committed by Benjamin Lee
parent 6022d56094
commit e14b7f28f2
No known key found for this signature in database
GPG key ID: FB9624E2885D55A4
4 changed files with 46 additions and 3 deletions

View file

@ -22,6 +22,7 @@ use ruma::api::{
error::{Error as RumaError, ErrorBody, ErrorKind},
uiaa::UiaaResponse,
},
federation::discovery::get_server_version,
IncomingRequest,
};
use tokio::{signal, task::JoinSet};
@ -38,7 +39,8 @@ use crate::{
api::{
client_server,
ruma_wrapper::{Ar, Ra},
server_server, well_known,
server_server::{self, AllowLoopbackRequests, LogRequestError},
well_known,
},
config::{self, Config, ListenComponent, ListenTransport},
database::KeyValueDatabase,
@ -98,6 +100,30 @@ pub(crate) async fn run(args: ServeArgs) -> Result<(), error::ServeCommand> {
Ok(())
}
#[tracing::instrument]
async fn federation_self_test() -> Result<()> {
let response = server_server::send_request(
&services().globals.config.server_name,
get_server_version::v1::Request {},
LogRequestError::Yes,
AllowLoopbackRequests::Yes,
)
.await?;
if !response
.server
.as_ref()
.is_some_and(|s| s.name.as_deref() == Some(env!("CARGO_PKG_NAME")))
{
error!(?response, "unexpected server version");
return Err(Error::BadConfig(
"Got unexpected version from our own version endpoint",
));
}
Ok(())
}
#[allow(clippy::too_many_lines)]
async fn run_server() -> Result<(), error::Serve> {
use error::Serve as Error;
@ -226,10 +252,17 @@ async fn run_server() -> Result<(), error::Serve> {
}
}
set_application_state(ApplicationState::Ready);
tokio::spawn(handle_signals(tls_config, handles));
if config.federation.enable && config.federation.self_test {
federation_self_test()
.await
.map_err(error::Serve::FederationSelfTestFailed)?;
debug!("Federation self-test completed successfully");
}
set_application_state(ApplicationState::Ready);
while let Some(result) = servers.join_next().await {
let (listen, result) =
result.expect("should be able to join server task");