Skip to main content

fakecloud_cloudfront/
state.rs

1//! In-memory state for CloudFront resources.
2
3use std::collections::HashMap;
4use std::sync::Arc;
5
6use chrono::{DateTime, Utc};
7use parking_lot::RwLock;
8use serde::{Deserialize, Serialize};
9
10use crate::extras::{StoredAnycastIpList, StoredResourcePolicy, StoredTrustStore, StoredVpcOrigin};
11use crate::extras2::StoredConnectionGroup;
12use crate::fle::{
13    StoredFieldLevelEncryption, StoredFieldLevelEncryptionProfile, StoredRealtimeLogConfig,
14};
15use crate::functions::{
16    StoredFunction, StoredKeyGroup, StoredKeyValueStore, StoredMonitoringSubscription,
17    StoredOriginAccessIdentity, StoredPublicKey,
18};
19use crate::model::{DistributionConfig, InvalidationBatch};
20use crate::policies::{
21    StoredCachePolicy, StoredContinuousDeploymentPolicy, StoredOriginAccessControl,
22    StoredOriginRequestPolicy, StoredResponseHeadersPolicy,
23};
24use crate::streaming::StoredStreamingDistribution;
25
26pub type SharedCloudFrontState = Arc<RwLock<CloudFrontAccounts>>;
27
28#[derive(Debug, Default, Serialize, Deserialize)]
29pub struct CloudFrontAccounts {
30    pub accounts: HashMap<String, AccountState>,
31}
32
33impl CloudFrontAccounts {
34    pub fn new() -> Self {
35        Self::default()
36    }
37
38    pub fn account_count(&self) -> usize {
39        self.accounts.len()
40    }
41
42    pub fn entry(&mut self, account_id: &str) -> &mut AccountState {
43        self.accounts.entry(account_id.to_string()).or_default()
44    }
45
46    pub fn get(&self, account_id: &str) -> Option<&AccountState> {
47        self.accounts.get(account_id)
48    }
49}
50
51#[derive(Debug, Default, Serialize, Deserialize)]
52pub struct AccountState {
53    pub distributions: HashMap<String, StoredDistribution>,
54    pub invalidations: HashMap<String, StoredInvalidation>,
55    /// Tags keyed by ARN.
56    pub tags: HashMap<String, Vec<Tag>>,
57    pub origin_access_controls: HashMap<String, StoredOriginAccessControl>,
58    pub cache_policies: HashMap<String, StoredCachePolicy>,
59    pub origin_request_policies: HashMap<String, StoredOriginRequestPolicy>,
60    pub response_headers_policies: HashMap<String, StoredResponseHeadersPolicy>,
61    pub continuous_deployment_policies: HashMap<String, StoredContinuousDeploymentPolicy>,
62    pub functions: HashMap<String, StoredFunction>,
63    pub public_keys: HashMap<String, StoredPublicKey>,
64    pub key_groups: HashMap<String, StoredKeyGroup>,
65    pub key_value_stores: HashMap<String, StoredKeyValueStore>,
66    pub origin_access_identities: HashMap<String, StoredOriginAccessIdentity>,
67    /// Per-distribution monitoring subscription, keyed by distribution id.
68    pub monitoring_subscriptions: HashMap<String, StoredMonitoringSubscription>,
69    pub streaming_distributions: HashMap<String, StoredStreamingDistribution>,
70    pub field_level_encryptions: HashMap<String, StoredFieldLevelEncryption>,
71    pub field_level_encryption_profiles: HashMap<String, StoredFieldLevelEncryptionProfile>,
72    /// Realtime log configs keyed by ARN.
73    pub realtime_log_configs: HashMap<String, StoredRealtimeLogConfig>,
74    pub vpc_origins: HashMap<String, StoredVpcOrigin>,
75    pub anycast_ip_lists: HashMap<String, StoredAnycastIpList>,
76    pub trust_stores: HashMap<String, StoredTrustStore>,
77    /// Resource policies keyed by resource ARN.
78    pub resource_policies: HashMap<String, StoredResourcePolicy>,
79    pub connection_groups: HashMap<String, StoredConnectionGroup>,
80}
81
82impl CloudFrontAccounts {
83    /// Pre-seed the AWS-managed Cache, Origin Request, and Response
84    /// Headers policies into the default account so callers that look
85    /// them up by their well-known IDs (Terraform, CDK) get the same
86    /// shape they get against AWS. The IDs and names mirror the AWS
87    /// console output verbatim — the easiest way to keep tests source
88    /// of truth.
89    pub fn seed_managed_policies(&mut self, account_id: &str) {
90        let account = self.entry(account_id);
91        crate::policies::seed_managed(account);
92    }
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct StoredDistribution {
97    pub id: String,
98    pub arn: String,
99    pub status: String,
100    pub last_modified_time: DateTime<Utc>,
101    pub domain_name: String,
102    pub in_progress_invalidation_batches: u32,
103    pub etag: String,
104    pub config: DistributionConfig,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108pub struct StoredInvalidation {
109    pub id: String,
110    pub distribution_id: String,
111    pub status: String,
112    pub create_time: DateTime<Utc>,
113    pub batch: InvalidationBatch,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
117pub struct Tag {
118    pub key: String,
119    pub value: Option<String>,
120}