Skip to content

Commit c849704

Browse files
add optional ingestion quota to tenant metadata (#1691)
* add optional ingestion quota to tenant metadata * clippy fix
1 parent 5a959be commit c849704

3 files changed

Lines changed: 39 additions & 2 deletions

File tree

src/storage/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ pub use localfs::FSConfig;
9393
pub use object_storage::{ObjectStorage, ObjectStorageProvider};
9494
pub use s3::S3Config;
9595
pub use store_metadata::{
96-
StorageMetadata, put_remote_metadata, put_staging_metadata, resolve_parseable_metadata,
96+
IngestionQuota, IngestionQuotaType, QuotaPeriod, StorageMetadata, put_remote_metadata,
97+
put_staging_metadata, resolve_parseable_metadata,
9798
};
9899

99100
// metadata file names in a Stream prefix

src/storage/store_metadata.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,28 @@ pub struct StaticStorageMetadata {
5252
}
5353

5454
// Type for serialization and deserialization
55+
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
56+
#[serde(rename_all = "camelCase")]
57+
pub struct IngestionQuota {
58+
#[serde(rename = "type")]
59+
pub quota_type: IngestionQuotaType,
60+
pub limit: u64,
61+
}
62+
63+
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
64+
#[serde(rename_all = "camelCase")]
65+
pub enum IngestionQuotaType {
66+
SizeBytes,
67+
EventCount,
68+
}
69+
70+
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
71+
pub enum QuotaPeriod {
72+
Monthly,
73+
Yearly,
74+
Lifetime,
75+
}
76+
5577
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
5678
pub struct StorageMetadata {
5779
pub version: String,
@@ -79,6 +101,10 @@ pub struct StorageMetadata {
79101
#[serde(default, skip_serializing_if = "Option::is_none")]
80102
pub plan: Option<String>,
81103
#[serde(default, skip_serializing_if = "Option::is_none")]
104+
pub ingestion_quota: Option<IngestionQuota>,
105+
#[serde(default, skip_serializing_if = "Option::is_none")]
106+
pub quota_period: Option<QuotaPeriod>,
107+
#[serde(default, skip_serializing_if = "Option::is_none")]
82108
pub owner: Option<String>,
83109
}
84110

@@ -102,6 +128,8 @@ impl Default for StorageMetadata {
102128
start_date: None,
103129
end_date: None,
104130
plan: None,
131+
ingestion_quota: None,
132+
quota_period: None,
105133
owner: None,
106134
}
107135
}

src/tenants/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ use itertools::Itertools;
2323
use once_cell::sync::Lazy;
2424
use serde::{Deserialize, Serialize};
2525

26-
use crate::{rbac::role::Action, storage::StorageMetadata};
26+
use crate::{
27+
rbac::role::Action,
28+
storage::{IngestionQuota, QuotaPeriod, StorageMetadata},
29+
};
2730

2831
pub static TENANT_METADATA: Lazy<Arc<TenantMetadata>> =
2932
Lazy::new(|| Arc::new(TenantMetadata::default()));
@@ -63,19 +66,24 @@ impl TenantMetadata {
6366
self.tenants.get(tenant_id).map(|t| t.meta.clone())
6467
}
6568

69+
#[allow(clippy::too_many_arguments)]
6670
pub fn update_tenant_meta(
6771
&self,
6872
tenant_id: &str,
6973
customer_name: Option<String>,
7074
start_date: Option<String>,
7175
end_date: Option<String>,
7276
plan: Option<String>,
77+
ingestion_quota: Option<IngestionQuota>,
78+
quota_period: Option<QuotaPeriod>,
7379
) -> bool {
7480
if let Some(mut tenant) = self.tenants.get_mut(tenant_id) {
7581
tenant.meta.customer_name = customer_name;
7682
tenant.meta.start_date = start_date;
7783
tenant.meta.end_date = end_date;
7884
tenant.meta.plan = plan;
85+
tenant.meta.ingestion_quota = ingestion_quota;
86+
tenant.meta.quota_period = quota_period;
7987
true
8088
} else {
8189
false

0 commit comments

Comments
 (0)