icinga2_api/api/query/monitoring_objects/
service.rs

1//! Icinga2 services
2//!
3//! [Official Documentation](https://icinga.com/docs/icinga-2/latest/doc/09-object-types/#service)
4
5crate::types::query::query_with_joins!(
6    ListServices,
7    ListServicesBuilder,
8    monitoring_objects,
9    service,
10    IcingaService,
11    IcingaServiceJoinTypes,
12    IcingaServiceJoins,
13    IcingaObjectType::Service,
14    "v1/objects/services"
15);
16
17#[cfg(test)]
18mod test {
19    use super::*;
20    use std::{collections::BTreeMap, error::Error};
21    use tracing_test::traced_test;
22
23    use crate::{
24        api::blocking::Icinga2,
25        types::{
26            enums::object_type::IcingaObjectType,
27            filter::IcingaFilter,
28            join_types::{service::IcingaServiceJoinTypes, IcingaJoins},
29            metadata::IcingaMetadataType,
30        },
31    };
32
33    #[traced_test]
34    #[test]
35    fn test_services() -> Result<(), Box<dyn Error>> {
36        dotenvy::dotenv()?;
37        let icinga2 = Icinga2::from_config_file(std::path::Path::new(&std::env::var(
38            "ICINGA_TEST_INSTANCE_CONFIG",
39        )?))?;
40        let api_endpoint = ListServices::builder()
41            .joins(IcingaJoins::AllJoins)
42            .meta([IcingaMetadataType::UsedBy, IcingaMetadataType::Location])
43            .build()?;
44        let _: ResultsWrapper<QueryResultObjectWithJoins<IcingaService, IcingaServiceJoins>> =
45            icinga2.rest(api_endpoint)?;
46        Ok(())
47    }
48
49    #[traced_test]
50    #[test]
51    fn test_services_partial_host_join() -> Result<(), Box<dyn Error>> {
52        dotenvy::dotenv()?;
53        let icinga2 = Icinga2::from_config_file(std::path::Path::new(&std::env::var(
54            "ICINGA_TEST_INSTANCE_CONFIG",
55        )?))?;
56        let mut partial = BTreeMap::new();
57        partial.insert(IcingaServiceJoinTypes::Host, vec!["name"]);
58        let api_endpoint = ListServices::builder()
59            .joins(IcingaJoins::SpecificJoins {
60                full: vec![],
61                partial,
62            })
63            .meta([IcingaMetadataType::UsedBy, IcingaMetadataType::Location])
64            .build()?;
65        let _: ResultsWrapper<QueryResultObjectWithJoins<IcingaService, IcingaServiceJoins>> =
66            icinga2.rest(api_endpoint)?;
67        Ok(())
68    }
69
70    #[traced_test]
71    #[test]
72    fn test_services_filtered() -> Result<(), Box<dyn Error>> {
73        dotenvy::dotenv()?;
74        let icinga2 = Icinga2::from_config_file(std::path::Path::new(&std::env::var(
75            "ICINGA_TEST_INSTANCE_CONFIG",
76        )?))?;
77        let api_endpoint = ListServices::builder()
78            .filter(IcingaFilter {
79                object_type: IcingaObjectType::Service,
80                filter: "service.state == ServiceUnknown && service.vars.serviceSeverity == filter_severity".to_string(),
81                filter_vars: BTreeMap::from([("filter_severity".to_string(), serde_json::json!("imminent"))]),
82            })
83            .build()?;
84        let _: ResultsWrapper<QueryResultObjectWithJoins<IcingaService, IcingaServiceJoins>> =
85            icinga2.rest(api_endpoint)?;
86        Ok(())
87    }
88}