Radish alpha
r
rad:zwTxygwuz5LDGBq255RA2CbNGrz8
Radicle CI broker
Radicle
Git
feat: check that all adapters in triggers are defined
Merged liw opened 11 months ago
3 files changed +44 -3 94089393 5f203cd2
modified src/config.rs
@@ -54,7 +54,21 @@ impl Config {
    pub fn load(filename: &Path) -> Result<Self, ConfigError> {
        let config =
            std::fs::read(filename).map_err(|e| ConfigError::ReadConfig(filename.into(), e))?;
-
        serde_yml::from_slice(&config).map_err(|e| ConfigError::ParseConfig(filename.into(), e))
+
        let config: Config = serde_yml::from_slice(&config)
+
            .map_err(|e| ConfigError::ParseConfig(filename.into(), e))?;
+
        config.check()?;
+
        Ok(config)
+
    }
+

+
    fn check(&self) -> Result<(), ConfigError> {
+
        if let Some(triggers) = &self.triggers {
+
            for trigger in triggers.iter() {
+
                if !self.adapters.contains_key(&trigger.adapter) {
+
                    return Err(ConfigError::UnknownAdapter(trigger.adapter.clone()));
+
                }
+
            }
+
        }
+
        Ok(())
    }

    pub fn report_dir(&self) -> Option<&Path> {
@@ -160,6 +174,10 @@ pub enum ConfigError {
    /// No default adapter.
    #[error("the default adapter is not defined in the configuration")]
    NoDefaultAdapter,
+

+
    /// Unknown adapter.
+
    #[error("'triggers' refers to adapter that hasn't been defined: {0}")]
+
    UnknownAdapter(String),
}

#[cfg(test)]
modified src/logger.rs
@@ -159,6 +159,8 @@ enum Id {
    QueueProcRemoveEvent,
    QueueProcStart,
    QueueProcTrigger,
+
    QueueProcProcessorResult,
+
    QueueProcWorkerResult,

    TimeoutLineReceiverCheckChild,
    TimeoutLineReceiverChildDisconnected,
@@ -513,6 +515,24 @@ pub fn queueproc_processing_event(event: &CiEvent) {
    );
}

+
pub fn queueproc_worker_thread_result(result: Result<(), &QueueError>) {
+
    debug!(
+
        msg_id = ?Id::QueueProcWorkerResult,
+
        kind = %Kind::GotEvent,
+
        ?result,
+
        "worker thread result"
+
    );
+
}
+

+
pub fn queueproc_processor_thread_result(result: Result<(), &QueueError>) {
+
    debug!(
+
        msg_id = ?Id::QueueProcProcessorResult,
+
        kind = %Kind::GotEvent,
+
        ?result,
+
        "processor thread result"
+
    );
+
}
+

pub fn queueproc_trigger(result: &Result<Request, QueueError>) {
    info!(
        msg_id = ?Id::QueueProcTrigger,
modified src/queueproc.rs
@@ -172,7 +172,8 @@ impl QueueProcessor {
            // Wait for worker threads to terminate. This closes all
            // sender ends for results channel.
            for proc in self.processors {
-
                proc.join().ok();
+
                let result = proc.join();
+
                logger::queueproc_processor_thread_result(result.as_ref().map(|_| ()));
            }

            // Wait for results processing thread to terminate.
@@ -364,7 +365,9 @@ impl EventProcessor {
    }

    fn process_picked_event(&self, picked: Picked) {
-
        if let Some(adapters) = self.matching_adapters(picked.qe.event()).ok().flatten() {
+
        let res = self.matching_adapters(picked.qe.event());
+
        logger::queueproc_worker_thread_result(res.as_ref().map(|_| ()));
+
        if let Ok(Some(adapters)) = res {
            for adapter in adapters {
                self.run_adapter(&picked.qe, &adapter).ok();
            }