use serde::{Deserialize, Serialize};
use std::fmt;
#[cfg(feature = "cloud-engine-host")]
use super::CloudEngineSourceRequest;
#[cfg(all(feature = "cloud-engine-host", feature = "subnet-catalog-host"))]
use crate::subnet_catalog::{
CacheDisposition, CatalogAssurance, ClassificationSource, GeographicScope, SubnetKind,
SubnetSpecialization,
};
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct CloudEngineReportContext {
pub schema_version: u32,
pub network: String,
pub authority: String,
pub engine_canister_id: String,
pub fetched_at: String,
pub source_endpoint: String,
pub fetched_by: String,
pub certified: bool,
pub point_in_time_guaranteed: bool,
pub query_call_count: usize,
}
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct CloudEngineOperatorReport {
#[serde(flatten)]
pub context: CloudEngineReportContext,
pub subnet_id: String,
pub operator_binding_present: bool,
pub operator_canister_id: Option<String>,
pub engine_owner: Option<String>,
pub platform_admin: Option<String>,
pub caffeine_enabled: Option<bool>,
pub claimed_domain_count: Option<usize>,
pub claimed_domains: Option<Vec<String>>,
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Deserialize, Serialize)]
pub enum CloudEngineNodeType {
#[serde(rename = "type4.1")]
Type4_1,
#[serde(rename = "type4.2")]
Type4_2,
#[serde(rename = "type4.3")]
Type4_3,
#[serde(rename = "type4.4")]
Type4_4,
#[serde(rename = "type4.5")]
Type4_5,
}
impl CloudEngineNodeType {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Type4_1 => "type4.1",
Self::Type4_2 => "type4.2",
Self::Type4_3 => "type4.3",
Self::Type4_4 => "type4.4",
Self::Type4_5 => "type4.5",
}
}
}
impl fmt::Display for CloudEngineNodeType {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct CloudEnginePriceRow {
pub key: String,
pub node_type: CloudEngineNodeType,
pub data_center_id: Option<String>,
pub provider_id: Option<String>,
pub net_cycles_per_month: String,
pub gross_cycles_per_month: String,
pub updated_at_unix_nanos: i64,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct CloudEnginePricesReport {
#[serde(flatten)]
pub context: CloudEngineReportContext,
pub network_fee: f64,
pub price_count: usize,
pub prices: Vec<CloudEnginePriceRow>,
}
#[cfg(all(feature = "cloud-engine-host", feature = "subnet-catalog-host"))]
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum CloudEngineOperatorLookupStatus {
Resolved,
Absent,
Failed,
}
#[cfg(all(feature = "cloud-engine-host", feature = "subnet-catalog-host"))]
impl CloudEngineOperatorLookupStatus {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Resolved => "resolved",
Self::Absent => "absent",
Self::Failed => "failed",
}
}
}
#[cfg(all(feature = "cloud-engine-host", feature = "subnet-catalog-host"))]
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct CloudEngineListRow {
pub subnet_id: String,
pub subnet_label: String,
pub subnet_label_source: ClassificationSource,
pub registry_subnet_type: i32,
pub subnet_kind: SubnetKind,
pub subnet_kind_source: ClassificationSource,
pub subnet_specialization: SubnetSpecialization,
pub subnet_specialization_source: ClassificationSource,
pub geographic_scope: GeographicScope,
pub geographic_scope_source: ClassificationSource,
pub node_count: Option<u32>,
pub charges_apply_by_default: bool,
pub range_count: usize,
pub operator_lookup_status: CloudEngineOperatorLookupStatus,
pub operator_canister_id: Option<String>,
pub operator_lookup_error: Option<String>,
}
#[cfg(all(feature = "cloud-engine-host", feature = "subnet-catalog-host"))]
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct CloudEngineListReport {
pub schema_version: u32,
pub network: String,
pub registry_authority: String,
pub registry_canister_id: String,
pub registry_version: u64,
pub registry_assurance: CatalogAssurance,
pub registry_source_endpoints: Vec<String>,
pub registry_agreement_digest: Option<String>,
pub registry_query_call_count: u64,
pub catalog_path: String,
pub catalog_schema_version: u32,
pub catalog_digest: String,
pub catalog_cache_disposition: CacheDisposition,
pub catalog_fetched_at: String,
pub catalog_stale: bool,
pub catalog_stale_reason: String,
pub catalog_collector_version: String,
pub classification_schema_version: u32,
pub classification_policy_digest: String,
pub resolver_backend: String,
pub resolver_schema_version: u32,
pub control_plane_authority: String,
pub control_plane_canister_id: String,
pub control_plane_source_endpoint: String,
pub control_plane_fetched_at: String,
pub control_plane_fetched_by: String,
pub control_plane_certified: bool,
pub control_plane_point_in_time_guaranteed: bool,
pub control_plane_lookup_attempt_count: usize,
pub registry_cloud_engine_subnet_count: usize,
pub operator_binding_count: usize,
pub missing_operator_binding_count: usize,
pub operator_lookup_failure_count: usize,
pub cloud_engines: Vec<CloudEngineListRow>,
}
#[cfg(feature = "cloud-engine-host")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CloudEngineOperatorSourceData {
pub source: CloudEngineSourceRequest,
pub subnet_id: String,
pub operator_canister_id: Option<String>,
pub engine_owner: Option<String>,
pub platform_admin: Option<String>,
pub caffeine_enabled: Option<bool>,
pub claimed_domains: Option<Vec<String>>,
pub query_call_count: usize,
}
#[cfg(feature = "cloud-engine-host")]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct CloudEngineOperatorBindingSourceData {
pub source: CloudEngineSourceRequest,
pub subnet_id: String,
pub operator_canister_id: Option<String>,
pub query_call_count: usize,
}
#[cfg(feature = "cloud-engine-host")]
#[derive(Clone, Debug, PartialEq)]
pub struct CloudEnginePricesSourceData {
pub source: CloudEngineSourceRequest,
pub network_fee: f64,
pub prices: Vec<CloudEnginePriceRow>,
pub query_call_count: usize,
}