use crate::chain::Address;
use crate::item_hash::ItemHash;
use memsizes::MiB;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FunctionTriggers {
pub http: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub persistent: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum NetworkProtocol {
#[serde(rename = "tcp")]
Tcp,
#[serde(rename = "udp")]
Udp,
}
fn default_tcp() -> NetworkProtocol {
NetworkProtocol::Tcp
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Port(u16);
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PublishedPort {
#[serde(default = "default_tcp")]
protocol: NetworkProtocol,
port: Port,
}
fn default_vcpus() -> u32 {
1
}
fn default_memory() -> MiB {
MiB::from(128)
}
fn default_seconds() -> u32 {
1
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MachineResources {
#[serde(default = "default_vcpus")]
pub vcpus: u32,
#[serde(default = "default_memory")]
pub memory: MiB,
#[serde(default = "default_seconds")]
pub seconds: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub published_ports: Option<Vec<PublishedPort>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Architecture {
#[serde(rename = "x86_64")]
X86_64,
#[serde(rename = "arm64")]
Arm64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Vendor {
#[serde(rename = "AuthenticAMD")]
Amd,
#[serde(rename = "GenuineIntel")]
Intel,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CpuFeature(String);
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CpuProperties {
pub architecture: Architecture,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vendor: Option<Vendor>,
pub features: Vec<CpuFeature>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum GpuDeviceClass {
#[serde(rename = "0300")]
VgaCompatibleController,
#[serde(rename = "0302")]
_3DController,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GpuProperties {
pub vendor: String,
pub device_name: String,
pub device_class: GpuDeviceClass,
pub device_id: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum Hypervisor {
#[serde(rename = "firecracker")]
Firecracker,
#[serde(rename = "qemu")]
Qemu,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FunctionEnvironment {
#[serde(default)]
pub reproducible: bool,
#[serde(default)]
pub internet: bool,
#[serde(default)]
pub aleph_api: bool,
#[serde(default)]
pub shared_cache: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum AmdSevPolicy {
NoDebug = 0b1,
NoKeySharing = 0b10,
SevEs = 0b100,
NoSend = 0b1000,
Domain = 0b10000,
Sev = 0b100000,
}
fn default_amd_sev_policy() -> u32 {
AmdSevPolicy::NoDebug as u32
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TrustedExecutionEnvironment {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub firmware: Option<ItemHash>,
#[serde(default = "default_amd_sev_policy")]
pub policy: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InstanceEnvironment {
#[serde(default)]
pub internet: bool,
#[serde(default)]
pub aleph_api: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hypervisor: Option<Hypervisor>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trusted_execution: Option<TrustedExecutionEnvironment>,
#[serde(default)]
pub reproducible: bool,
#[serde(default)]
pub shared_cache: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NodeRequirements {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub owner: Option<Address>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub address_regex: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub node_hash: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub terms_and_conditions: Option<ItemHash>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct HostRequirements {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cpu: Option<CpuProperties>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub node: Option<NodeRequirements>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub gpu: Option<Vec<GpuProperties>>,
}