Skip to main content

fakecloud_cloudtrail/
state.rs

1//! Account-partitioned, serializable state for AWS CloudTrail's
2//! (`cloudtrail`) control plane.
3//!
4//! Every CloudTrail resource is stored as an already-output-valid JSON object
5//! (`serde_json::Value`) keyed by its name or ARN. Storing the wire shape
6//! directly keeps nested configuration objects (event selectors, destinations,
7//! import sources) round-tripping verbatim and guarantees the `Get`/`Describe`
8//! responses echo exactly what was persisted.
9
10use std::collections::BTreeMap;
11use std::sync::Arc;
12
13use parking_lot::RwLock;
14use serde::{Deserialize, Serialize};
15use serde_json::Value;
16
17use fakecloud_core::multi_account::{AccountState, MultiAccountState};
18
19pub const CLOUDTRAIL_SNAPSHOT_SCHEMA_VERSION: u32 = 1;
20
21/// Per-account CloudTrail state.
22#[derive(Debug, Clone, Default, Serialize, Deserialize)]
23pub struct CloudTrailData {
24    /// Trails keyed by trail `Name`, holding the trail's describe object.
25    #[serde(default)]
26    pub trails: BTreeMap<String, Value>,
27    /// Per-trail logging flag keyed by trail `Name`. `CreateTrail` leaves this
28    /// `false` until `StartLogging` (AWS semantics).
29    #[serde(default)]
30    pub trail_logging: BTreeMap<String, bool>,
31    /// Per-trail status timestamps keyed by trail `Name` (start/stop logging
32    /// times populated by `StartLogging`/`StopLogging`).
33    #[serde(default)]
34    pub trail_status: BTreeMap<String, Value>,
35    /// Per-trail event selectors keyed by trail `Name`
36    /// (`{EventSelectors, AdvancedEventSelectors}`).
37    #[serde(default)]
38    pub event_selectors: BTreeMap<String, Value>,
39    /// Per-trail insight selectors keyed by trail `Name`.
40    #[serde(default)]
41    pub insight_selectors: BTreeMap<String, Value>,
42    /// Event data stores keyed by `EventDataStoreArn`.
43    #[serde(default)]
44    pub event_data_stores: BTreeMap<String, Value>,
45    /// Channels keyed by `ChannelArn`.
46    #[serde(default)]
47    pub channels: BTreeMap<String, Value>,
48    /// Imports keyed by `ImportId`.
49    #[serde(default)]
50    pub imports: BTreeMap<String, Value>,
51    /// CloudTrail Lake queries keyed by `QueryId`.
52    #[serde(default)]
53    pub queries: BTreeMap<String, Value>,
54    /// Dashboards keyed by `DashboardArn`.
55    #[serde(default)]
56    pub dashboards: BTreeMap<String, Value>,
57    /// Resource-based policies keyed by `ResourceArn`.
58    #[serde(default)]
59    pub resource_policies: BTreeMap<String, String>,
60    /// Organization delegated admins keyed by account id.
61    #[serde(default)]
62    pub delegated_admins: BTreeMap<String, Value>,
63    /// Event configuration keyed by trail/EDS ARN.
64    #[serde(default)]
65    pub event_configurations: BTreeMap<String, Value>,
66    /// Resource tags keyed by resource id/ARN -> (key -> value).
67    #[serde(default)]
68    pub tags: BTreeMap<String, BTreeMap<String, String>>,
69}
70
71impl AccountState for CloudTrailData {
72    fn new_for_account(_account_id: &str, _region: &str, _endpoint: &str) -> Self {
73        Self::default()
74    }
75}
76
77pub type SharedCloudTrailState = Arc<RwLock<MultiAccountState<CloudTrailData>>>;
78
79#[derive(Debug, Serialize, Deserialize)]
80pub struct CloudTrailSnapshot {
81    pub schema_version: u32,
82    pub accounts: MultiAccountState<CloudTrailData>,
83}