pipedash-plugin-buildkite 0.1.1

Buildkite plugin for Pipedash
Documentation
use std::collections::HashMap;

use chrono::Utc;
use pipedash_plugin_api::{
    BuildAgent,
    PipelineStatus,
};

use crate::types;

pub(crate) fn map_build_state(state: &str) -> PipelineStatus {
    match state {
        "passed" => PipelineStatus::Success,
        "failed" => PipelineStatus::Failed,
        "running" | "started" => PipelineStatus::Running,
        "scheduled" | "creating" | "waiting" => PipelineStatus::Pending,
        "canceled" | "canceling" => PipelineStatus::Cancelled,
        "skipped" | "not_run" => PipelineStatus::Skipped,
        "blocked" => PipelineStatus::Pending,
        _ => PipelineStatus::Pending,
    }
}

pub(crate) fn map_agent(agent: types::Agent) -> BuildAgent {
    let status = if agent.connected {
        if agent.job.is_some() {
            "busy".to_string()
        } else {
            "idle".to_string()
        }
    } else {
        "disconnected".to_string()
    };

    let mut metadata = HashMap::new();
    metadata.insert("ip_address".to_string(), agent.ip_address);
    metadata.insert("version".to_string(), agent.version);

    BuildAgent {
        id: agent.id,
        name: agent.name,
        hostname: agent.hostname,
        status,
        job_id: agent.job.map(|j| j.id),
        last_seen: Utc::now(),
        metadata,
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_map_build_state() {
        assert_eq!(map_build_state("passed"), PipelineStatus::Success);
        assert_eq!(map_build_state("failed"), PipelineStatus::Failed);
        assert_eq!(map_build_state("running"), PipelineStatus::Running);
        assert_eq!(map_build_state("canceled"), PipelineStatus::Cancelled);
        assert_eq!(map_build_state("skipped"), PipelineStatus::Skipped);
        assert_eq!(map_build_state("unknown"), PipelineStatus::Pending);
    }
}