use std::collections::BTreeMap;
use std::sync::Arc;
use parking_lot::RwLock;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use fakecloud_core::multi_account::{AccountState, MultiAccountState};
pub const EFS_SNAPSHOT_SCHEMA_VERSION: u32 = 1;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct EfsData {
#[serde(default)]
pub file_systems: BTreeMap<String, Value>,
#[serde(default)]
pub mount_targets: BTreeMap<String, Value>,
#[serde(default)]
pub mount_target_security_groups: BTreeMap<String, Vec<String>>,
#[serde(default)]
pub access_points: BTreeMap<String, Value>,
#[serde(default)]
pub lifecycle_configs: BTreeMap<String, Value>,
#[serde(default)]
pub backup_policies: BTreeMap<String, String>,
#[serde(default)]
pub file_system_policies: BTreeMap<String, String>,
#[serde(default)]
pub replications: BTreeMap<String, Value>,
#[serde(default)]
pub tags: BTreeMap<String, BTreeMap<String, String>>,
#[serde(default)]
pub resource_id_preference: Option<String>,
}
impl EfsData {
pub fn reconcile_lifecycle(&mut self) -> bool {
let mut changed = false;
for map in [
&mut self.file_systems,
&mut self.mount_targets,
&mut self.access_points,
] {
for v in map.values_mut() {
if let Some(obj) = v.as_object_mut() {
if obj.get("LifeCycleState").and_then(Value::as_str) == Some("creating") {
obj.insert("LifeCycleState".into(), Value::String("available".into()));
changed = true;
}
}
}
}
changed
}
}
impl AccountState for EfsData {
fn new_for_account(_account_id: &str, _region: &str, _endpoint: &str) -> Self {
Self::default()
}
}
pub type SharedEfsState = Arc<RwLock<MultiAccountState<EfsData>>>;
#[derive(Debug, Serialize, Deserialize)]
pub struct EfsSnapshot {
pub schema_version: u32,
pub accounts: MultiAccountState<EfsData>,
}