WIP: server: ???

This commit is contained in:
Paul Campbell 2024-06-19 07:03:17 +01:00
parent bc338d7703
commit 2851059fd6
3 changed files with 51 additions and 23 deletions

View file

@ -8,7 +8,7 @@ use git_next_config::{
self as config, ForgeAlias, ForgeConfig, GitDir, RepoAlias, ServerRepoConfig, self as config, ForgeAlias, ForgeConfig, GitDir, RepoAlias, ServerRepoConfig,
}; };
use git_next_git::{Generation, RepoDetails, Repository}; use git_next_git::{Generation, RepoDetails, Repository};
use git_next_repo_actor::{CloneRepo, RepoActor}; use git_next_repo_actor as repo_actor;
use kxio::{fs::FileSystem, network::Network}; use kxio::{fs::FileSystem, network::Network};
use tracing::{error, info, warn}; use tracing::{error, info, warn};
@ -39,6 +39,7 @@ pub struct Server {
fs: FileSystem, fs: FileSystem,
net: Network, net: Network,
repo: Repository, repo: Repository,
sleep_duration: std::time::Duration,
} }
impl Actor for Server { impl Actor for Server {
type Context = Context<Self>; type Context = Context<Self>;
@ -100,13 +101,19 @@ impl Handler<ServerConfig> for Server {
// Forge Actors // Forge Actors
for (forge_alias, forge_config) in server_config.forges() { for (forge_alias, forge_config) in server_config.forges() {
self.create_forge_repos(forge_config, forge_alias.clone(), server_storage, webhook) self.create_forge_repos(
.into_iter() forge_config,
.map(|a| self.start_actor(a)) forge_alias.clone(),
.map(|(repo_alias, addr)| { server_storage,
AddWebhookRecipient::new(forge_alias.clone(), repo_alias, addr.recipient()) webhook,
}) self.sleep_duration,
.for_each(|msg| webhook_router.do_send(msg)); )
.into_iter()
.map(|a| self.start_actor(a))
.map(|(repo_alias, addr)| {
AddWebhookRecipient::new(forge_alias.clone(), repo_alias, addr.recipient())
})
.for_each(|msg| webhook_router.do_send(msg));
} }
let webhook = WebhookActor::new(socket_addr, webhook_router.recipient()).start(); let webhook = WebhookActor::new(socket_addr, webhook_router.recipient()).start();
@ -114,7 +121,12 @@ impl Handler<ServerConfig> for Server {
} }
} }
impl Server { impl Server {
pub fn new(fs: FileSystem, net: Network, repo: Repository) -> Self { pub fn new(
fs: FileSystem,
net: Network,
repo: Repository,
sleep_duration: std::time::Duration,
) -> Self {
let generation = Generation::new(); let generation = Generation::new();
Self { Self {
generation, generation,
@ -122,6 +134,7 @@ impl Server {
fs, fs,
net, net,
repo, repo,
sleep_duration,
} }
} }
fn create_forge_data_directories( fn create_forge_data_directories(
@ -151,14 +164,21 @@ impl Server {
forge_name: ForgeAlias, forge_name: ForgeAlias,
server_storage: &ServerStorage, server_storage: &ServerStorage,
webhook: &Webhook, webhook: &Webhook,
) -> Vec<(ForgeAlias, RepoAlias, RepoActor)> { sleep_duration: std::time::Duration,
) -> Vec<(ForgeAlias, RepoAlias, repo_actor::RepoActor)> {
let span = let span =
tracing::info_span!("create_forge_repos", name = %forge_name, config = %forge_config); tracing::info_span!("create_forge_repos", name = %forge_name, config = %forge_config);
let _guard = span.enter(); let _guard = span.enter();
info!("Creating Forge"); info!("Creating Forge");
let mut repos = vec![]; let mut repos = vec![];
let creator = self.create_actor(forge_name, forge_config.clone(), server_storage, webhook); let creator = self.create_actor(
forge_name,
forge_config.clone(),
server_storage,
webhook,
sleep_duration,
);
for (repo_alias, server_repo_config) in forge_config.repos() { for (repo_alias, server_repo_config) in forge_config.repos() {
let forge_repo = creator((repo_alias, server_repo_config)); let forge_repo = creator((repo_alias, server_repo_config));
info!( info!(
@ -176,7 +196,9 @@ impl Server {
forge_config: ForgeConfig, forge_config: ForgeConfig,
server_storage: &ServerStorage, server_storage: &ServerStorage,
webhook: &Webhook, webhook: &Webhook,
) -> impl Fn((RepoAlias, &ServerRepoConfig)) -> (ForgeAlias, RepoAlias, RepoActor) { sleep_duration: std::time::Duration,
) -> impl Fn((RepoAlias, &ServerRepoConfig)) -> (ForgeAlias, RepoAlias, repo_actor::RepoActor)
{
let server_storage = server_storage.clone(); let server_storage = server_storage.clone();
let webhook = webhook.clone(); let webhook = webhook.clone();
let net = self.net.clone(); let net = self.net.clone();
@ -208,12 +230,13 @@ impl Server {
gitdir, gitdir,
); );
info!("Starting Repo Actor"); info!("Starting Repo Actor");
let actor = RepoActor::new( let actor = repo_actor::RepoActor::new(
repo_details, repo_details,
webhook.clone(), webhook.clone(),
generation, generation,
net.clone(), net.clone(),
repo.clone(), repo.clone(),
sleep_duration,
); );
(forge_name.clone(), repo_alias, actor) (forge_name.clone(), repo_alias, actor)
} }
@ -221,13 +244,13 @@ impl Server {
fn start_actor( fn start_actor(
&self, &self,
actor: (ForgeAlias, RepoAlias, RepoActor), actor: (ForgeAlias, RepoAlias, repo_actor::RepoActor),
) -> (RepoAlias, Addr<RepoActor>) { ) -> (RepoAlias, Addr<repo_actor::RepoActor>) {
let (forge_name, repo_alias, actor) = actor; let (forge_name, repo_alias, actor) = actor;
let span = tracing::info_span!("start_actor", forge = %forge_name, repo = %repo_alias); let span = tracing::info_span!("start_actor", forge = %forge_name, repo = %repo_alias);
let _guard = span.enter(); let _guard = span.enter();
let addr = actor.start(); let addr = actor.start();
addr.do_send(CloneRepo); addr.do_send(repo_actor::messages::CloneRepo);
info!("Started"); info!("Started");
(repo_alias, addr) (repo_alias, addr)
} }

View file

@ -18,7 +18,7 @@ fn test_repo_config_load() -> Result<()> {
[options] [options]
"#; "#;
let config = RepoConfig::load(toml)?; let config = RepoConfig::parse(toml)?;
assert_eq!( assert_eq!(
config, config,

View file

@ -1,19 +1,18 @@
//
mod actors; mod actors;
mod config; mod config;
//
use actix::prelude::*; use actix::prelude::*;
use git_next_git::Repository;
use kxio::{fs::FileSystem, network::Network}; use kxio::{fs::FileSystem, network::Network};
use std::path::PathBuf; use std::path::PathBuf;
use tracing::{error, info, level_filters::LevelFilter}; use tracing::{error, info, level_filters::LevelFilter};
use crate::actors::{ use crate::actors::{
file_watcher::{self, FileUpdated}, file_watcher::{self, FileUpdated},
server::Server, server::Server,
}; };
use git_next_git::Repository;
pub fn init(fs: FileSystem) { pub fn init(fs: FileSystem) {
let file_name = "git-next-server.toml"; let file_name = "git-next-server.toml";
@ -37,11 +36,16 @@ pub fn init(fs: FileSystem) {
} }
} }
pub async fn start(fs: FileSystem, net: Network, repo: Repository) { pub async fn start(
fs: FileSystem,
net: Network,
repo: Repository,
sleep_duration: std::time::Duration,
) {
init_logging(); init_logging();
info!("Starting Server..."); info!("Starting Server...");
let server = Server::new(fs.clone(), net.clone(), repo).start(); let server = Server::new(fs.clone(), net.clone(), repo, sleep_duration).start();
server.do_send(FileUpdated); server.do_send(FileUpdated);
info!("Starting File Watcher..."); info!("Starting File Watcher...");
@ -58,6 +62,7 @@ pub async fn start(fs: FileSystem, net: Network, repo: Repository) {
info!("Server running - Press Ctrl-C to stop..."); info!("Server running - Press Ctrl-C to stop...");
let _ = actix_rt::signal::ctrl_c().await; let _ = actix_rt::signal::ctrl_c().await;
info!("Ctrl-C received, shutting down..."); info!("Ctrl-C received, shutting down...");
// TODO: (#94) perform a controlled shutdown of server and file watcher
} }
pub fn init_logging() { pub fn init_logging() {