Skip to main content

assurance_runtime/
certification.rs

1use crate::error::{
2    require_non_empty, require_non_empty_slice, AssuranceValidationError, AssuranceValidationResult,
3};
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
8#[serde(rename_all = "snake_case")]
9pub enum CertificationStatusV1 {
10    AdvisoryUntilAdmitted,
11    Admitted,
12    Revoked,
13}
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
16#[serde(rename_all = "snake_case")]
17pub enum RecertificationTriggerKindV1 {
18    SloBreach,
19    Incident,
20    ControlGap,
21}
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
24pub struct FieldMonitoringPlanV1 {
25    pub schema_version: String,
26    pub field_monitoring_plan_id: String,
27    pub deployment_profile_id: String,
28    pub monitors: Vec<String>,
29    pub sampling_window: String,
30    pub alert_routes: Vec<String>,
31    pub recertification_triggers: Vec<String>,
32}
33
34impl FieldMonitoringPlanV1 {
35    #[allow(clippy::too_many_arguments)]
36    pub fn new(
37        field_monitoring_plan_id: impl Into<String>,
38        deployment_profile_id: impl Into<String>,
39        monitors: Vec<String>,
40        sampling_window: impl Into<String>,
41        alert_routes: Vec<String>,
42        recertification_triggers: Vec<String>,
43    ) -> Result<Self, AssuranceValidationError> {
44        let value = Self {
45            schema_version: "FieldMonitoringPlanV1".to_string(),
46            field_monitoring_plan_id: field_monitoring_plan_id.into(),
47            deployment_profile_id: deployment_profile_id.into(),
48            monitors,
49            sampling_window: sampling_window.into(),
50            alert_routes,
51            recertification_triggers,
52        };
53        value.validate()?;
54        Ok(value)
55    }
56
57    pub fn validate(&self) -> AssuranceValidationResult {
58        require_non_empty(&self.field_monitoring_plan_id, "field_monitoring_plan_id")?;
59        require_non_empty(&self.deployment_profile_id, "deployment_profile_id")?;
60        require_non_empty_slice(&self.monitors, "monitors")?;
61        require_non_empty(&self.sampling_window, "sampling_window")?;
62        require_non_empty_slice(&self.alert_routes, "alert_routes")?;
63        Ok(())
64    }
65}
66
67#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
68pub struct CertificationBundleV1 {
69    pub schema_version: String,
70    pub certification_bundle_id: String,
71    pub deployment_profile_id: String,
72    pub assurance_case_id: String,
73    pub release_readiness_decision_id: String,
74    pub issued_by: Vec<String>,
75    pub issued_at: String,
76    pub status: CertificationStatusV1,
77}
78
79impl CertificationBundleV1 {
80    #[allow(clippy::too_many_arguments)]
81    pub fn new(
82        certification_bundle_id: impl Into<String>,
83        deployment_profile_id: impl Into<String>,
84        assurance_case_id: impl Into<String>,
85        release_readiness_decision_id: impl Into<String>,
86        issued_by: Vec<String>,
87        issued_at: impl Into<String>,
88        status: CertificationStatusV1,
89    ) -> Result<Self, AssuranceValidationError> {
90        let value = Self {
91            schema_version: "CertificationBundleV1".to_string(),
92            certification_bundle_id: certification_bundle_id.into(),
93            deployment_profile_id: deployment_profile_id.into(),
94            assurance_case_id: assurance_case_id.into(),
95            release_readiness_decision_id: release_readiness_decision_id.into(),
96            issued_by,
97            issued_at: issued_at.into(),
98            status,
99        };
100        value.validate()?;
101        Ok(value)
102    }
103
104    pub fn validate(&self) -> AssuranceValidationResult {
105        require_non_empty(&self.certification_bundle_id, "certification_bundle_id")?;
106        require_non_empty(&self.deployment_profile_id, "deployment_profile_id")?;
107        require_non_empty(&self.assurance_case_id, "assurance_case_id")?;
108        require_non_empty(
109            &self.release_readiness_decision_id,
110            "release_readiness_decision_id",
111        )?;
112        require_non_empty_slice(&self.issued_by, "issued_by")?;
113        require_non_empty(&self.issued_at, "issued_at")?;
114        Ok(())
115    }
116}
117
118#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
119pub struct RecertificationTriggerV1 {
120    pub schema_version: String,
121    pub recertification_trigger_id: String,
122    pub deployment_profile_id: String,
123    pub trigger_kind: RecertificationTriggerKindV1,
124    pub triggered_at: String,
125    pub required_action: String,
126}
127
128impl RecertificationTriggerV1 {
129    #[allow(clippy::too_many_arguments)]
130    pub fn new(
131        recertification_trigger_id: impl Into<String>,
132        deployment_profile_id: impl Into<String>,
133        trigger_kind: RecertificationTriggerKindV1,
134        triggered_at: impl Into<String>,
135        required_action: impl Into<String>,
136    ) -> Result<Self, AssuranceValidationError> {
137        let value = Self {
138            schema_version: "RecertificationTriggerV1".to_string(),
139            recertification_trigger_id: recertification_trigger_id.into(),
140            deployment_profile_id: deployment_profile_id.into(),
141            trigger_kind,
142            triggered_at: triggered_at.into(),
143            required_action: required_action.into(),
144        };
145        value.validate()?;
146        Ok(value)
147    }
148
149    pub fn validate(&self) -> AssuranceValidationResult {
150        require_non_empty(
151            &self.recertification_trigger_id,
152            "recertification_trigger_id",
153        )?;
154        require_non_empty(&self.deployment_profile_id, "deployment_profile_id")?;
155        require_non_empty(&self.triggered_at, "triggered_at")?;
156        require_non_empty(&self.required_action, "required_action")?;
157        Ok(())
158    }
159}