yaml configs for daemon
This commit is contained in:
parent
b0cf13ddfb
commit
ec962197ff
20
Cargo.lock
generated
20
Cargo.lock
generated
@ -157,6 +157,7 @@ dependencies = [
|
|||||||
"rand",
|
"rand",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
|
"serde_yaml",
|
||||||
"sha2",
|
"sha2",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -1039,6 +1040,19 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_yaml"
|
||||||
|
version = "0.9.34+deprecated"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap",
|
||||||
|
"itoa",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
"unsafe-libyaml",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sha2"
|
name = "sha2"
|
||||||
version = "0.10.8"
|
version = "0.10.8"
|
||||||
@ -1265,6 +1279,12 @@ version = "1.0.14"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unsafe-libyaml"
|
||||||
|
version = "0.2.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "untrusted"
|
name = "untrusted"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
|
@ -9,4 +9,5 @@ cidr = { version = "0.3.0", features = ["serde"] }
|
|||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
reqwest = { version = "0.12.9", features = ["blocking"] }
|
reqwest = { version = "0.12.9", features = ["blocking"] }
|
||||||
serde = { version = "1.0.215", features = ["derive"] }
|
serde = { version = "1.0.215", features = ["derive"] }
|
||||||
|
serde_yaml = "0.9.34"
|
||||||
sha2 = "0.10.8"
|
sha2 = "0.10.8"
|
||||||
|
@ -1,30 +1,31 @@
|
|||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
use cidr::Ipv4Cidr;
|
use cidr::{Ipv4Cidr, Ipv6Cidr};
|
||||||
use cidr::Ipv6Cidr;
|
use serde::Deserialize;
|
||||||
use core::net::Ipv4Addr;
|
|
||||||
use core::net::Ipv6Addr;
|
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
use std::net::{Ipv4Addr, Ipv6Addr};
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct Volume {
|
pub struct Volume {
|
||||||
path: String,
|
path: String,
|
||||||
// maximum allowed storage in GB
|
|
||||||
max_reservation: u64,
|
max_reservation: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct IPv4Range {
|
pub struct IPv4Range {
|
||||||
pub subnet: Ipv4Cidr,
|
pub subnet: Ipv4Cidr,
|
||||||
pub gateway: Ipv4Addr,
|
pub gateway: Ipv4Addr,
|
||||||
pub reserved_addrs: HashSet<Ipv4Addr>,
|
pub reserved_addrs: HashSet<Ipv4Addr>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct IPv6Range {
|
pub struct IPv6Range {
|
||||||
pub subnet: Ipv6Cidr,
|
pub subnet: Ipv6Cidr,
|
||||||
pub gateway: Ipv6Addr,
|
pub gateway: Ipv6Addr,
|
||||||
pub reserved_addrs: HashSet<Ipv6Addr>,
|
pub reserved_addrs: HashSet<Ipv6Addr>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct Interface {
|
pub struct Interface {
|
||||||
pub driver: InterfaceType,
|
pub driver: InterfaceType,
|
||||||
pub device: String,
|
pub device: String,
|
||||||
@ -32,19 +33,60 @@ pub struct Interface {
|
|||||||
pub ipv6: Vec<IPv6Range>,
|
pub ipv6: Vec<IPv6Range>,
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: create mechanic to autodetect interface type
|
#[derive(Deserialize, Debug)]
|
||||||
pub enum InterfaceType {
|
pub enum InterfaceType {
|
||||||
MACVTAP,
|
MACVTAP,
|
||||||
IPVTAP,
|
IPVTAP,
|
||||||
Bridge,
|
Bridge,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
pub max_cores_per_vm: usize,
|
pub max_cores_per_vm: usize,
|
||||||
pub max_vcpu_reservation: usize,
|
pub max_vcpu_reservation: usize,
|
||||||
pub max_mem_reservation: usize,
|
pub max_mem_reservation: usize,
|
||||||
pub network_interfaces: Vec<Interface>,
|
pub network_interfaces: Vec<Interface>,
|
||||||
pub volumes: Vec<Volume>,
|
pub volumes: Vec<Volume>,
|
||||||
|
#[serde(with = "range_format")]
|
||||||
pub public_port_range: Range<u16>,
|
pub public_port_range: Range<u16>,
|
||||||
pub max_ports_per_vm: u16,
|
pub max_ports_per_vm: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod range_format {
|
||||||
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
|
use std::ops::Range;
|
||||||
|
|
||||||
|
pub fn serialize<S>(range: &Range<u16>, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
let range_repr = RangeRepr {
|
||||||
|
start: range.start,
|
||||||
|
end: range.end,
|
||||||
|
};
|
||||||
|
range_repr.serialize(serializer)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deserialize<'de, D>(deserializer: D) -> Result<Range<u16>, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let range_repr = RangeRepr::deserialize(deserializer)?;
|
||||||
|
Ok(range_repr.start..range_repr.end)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
struct RangeRepr {
|
||||||
|
start: u16,
|
||||||
|
end: u16,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Config {
|
||||||
|
pub fn from_file(path: &str) -> Result<Self, Box<dyn std::error::Error>> {
|
||||||
|
let content = std::fs::read_to_string(path)?;
|
||||||
|
let config: Config = serde_yaml::from_str(&content)?;
|
||||||
|
Ok(config)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
16
src/main.rs
16
src/main.rs
@ -3,6 +3,18 @@ mod state;
|
|||||||
mod constants;
|
mod constants;
|
||||||
mod tcontract;
|
mod tcontract;
|
||||||
|
|
||||||
fn main() {
|
use crate::config::Config;
|
||||||
println!("Hello, world!");
|
|
||||||
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let config = Config::from_file("test_data/config1.yaml")?;
|
||||||
|
println!("{:#?}", config);
|
||||||
|
let config = Config::from_file("test_data/config2.yaml")?;
|
||||||
|
println!("{:#?}", config);
|
||||||
|
let config = Config::from_file("test_data/config3.yaml")?;
|
||||||
|
println!("{:#?}", config);
|
||||||
|
let config = Config::from_file("test_data/config4.yaml")?;
|
||||||
|
println!("{:#?}", config);
|
||||||
|
let config = Config::from_file("test_data/config5.yaml")?;
|
||||||
|
println!("{:#?}", config);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -22,3 +22,4 @@ pub struct ResourceAllocation {
|
|||||||
pub public_ipv4: Option<String>,
|
pub public_ipv4: Option<String>,
|
||||||
pub public_ipv6: Option<String>,
|
pub public_ipv6: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
25
test_data/config1.yaml
Normal file
25
test_data/config1.yaml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
max_cores_per_vm: 4
|
||||||
|
max_vcpu_reservation: 8
|
||||||
|
max_mem_reservation: 16384
|
||||||
|
network_interfaces:
|
||||||
|
- driver: "MACVTAP"
|
||||||
|
device: "eth0"
|
||||||
|
ipv4:
|
||||||
|
- subnet: "192.168.1.0/24"
|
||||||
|
gateway: "192.168.1.1"
|
||||||
|
reserved_addrs:
|
||||||
|
- "192.168.1.100"
|
||||||
|
- "192.168.1.101"
|
||||||
|
ipv6:
|
||||||
|
- subnet: "2001:db8::/32"
|
||||||
|
gateway: "2001:db8::1"
|
||||||
|
reserved_addrs:
|
||||||
|
- "2001:db8::1234"
|
||||||
|
- "2001:db8::5678"
|
||||||
|
volumes:
|
||||||
|
- path: "/mnt/storage"
|
||||||
|
max_reservation: 200
|
||||||
|
public_port_range:
|
||||||
|
start: 8000
|
||||||
|
end: 9000
|
||||||
|
max_ports_per_vm: 5
|
39
test_data/config2.yaml
Normal file
39
test_data/config2.yaml
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
max_cores_per_vm: 16
|
||||||
|
max_vcpu_reservation: 32
|
||||||
|
max_mem_reservation: 65536
|
||||||
|
network_interfaces:
|
||||||
|
- driver: "Bridge"
|
||||||
|
device: "br0"
|
||||||
|
ipv4:
|
||||||
|
- subnet: "10.0.0.0/16"
|
||||||
|
gateway: "10.0.0.1"
|
||||||
|
reserved_addrs:
|
||||||
|
- "10.0.0.100"
|
||||||
|
- "10.0.0.101"
|
||||||
|
- "10.0.0.102"
|
||||||
|
ipv6:
|
||||||
|
- subnet: "fd00::/48"
|
||||||
|
gateway: "fd00::1"
|
||||||
|
reserved_addrs:
|
||||||
|
- "fd00::1000"
|
||||||
|
- driver: "IPVTAP"
|
||||||
|
device: "tap1"
|
||||||
|
ipv4:
|
||||||
|
- subnet: "172.16.0.0/20"
|
||||||
|
gateway: "172.16.0.1"
|
||||||
|
reserved_addrs:
|
||||||
|
- "172.16.0.10"
|
||||||
|
- "172.16.0.11"
|
||||||
|
ipv6: []
|
||||||
|
volumes:
|
||||||
|
- path: "/data/volume1"
|
||||||
|
max_reservation: 500
|
||||||
|
- path: "/data/volume2"
|
||||||
|
max_reservation: 1000
|
||||||
|
- path: "/backup"
|
||||||
|
max_reservation: 2000
|
||||||
|
public_port_range:
|
||||||
|
start: 10000
|
||||||
|
end: 11000
|
||||||
|
max_ports_per_vm: 20
|
||||||
|
|
20
test_data/config3.yaml
Normal file
20
test_data/config3.yaml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
max_cores_per_vm: 12
|
||||||
|
max_vcpu_reservation: 24
|
||||||
|
max_mem_reservation: 49152
|
||||||
|
network_interfaces:
|
||||||
|
- driver: "IPVTAP"
|
||||||
|
device: "tap0"
|
||||||
|
ipv4: []
|
||||||
|
ipv6:
|
||||||
|
- subnet: "2001:db8:abcd:1234::/64"
|
||||||
|
gateway: "2001:db8:abcd:1234::1"
|
||||||
|
reserved_addrs:
|
||||||
|
- "2001:db8:abcd:1234::dead"
|
||||||
|
- "2001:db8:abcd:1234::beef"
|
||||||
|
volumes:
|
||||||
|
- path: "/ipv6/volume"
|
||||||
|
max_reservation: 600
|
||||||
|
public_port_range:
|
||||||
|
start: 15000
|
||||||
|
end: 16000
|
||||||
|
max_ports_per_vm: 10
|
19
test_data/config4.yaml
Normal file
19
test_data/config4.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
max_cores_per_vm: 2
|
||||||
|
max_vcpu_reservation: 4
|
||||||
|
max_mem_reservation: 8192
|
||||||
|
network_interfaces:
|
||||||
|
- driver: "MACVTAP"
|
||||||
|
device: "eth0"
|
||||||
|
ipv4:
|
||||||
|
- subnet: "192.168.0.0/24"
|
||||||
|
gateway: "192.168.0.1"
|
||||||
|
reserved_addrs: []
|
||||||
|
ipv6: []
|
||||||
|
volumes:
|
||||||
|
- path: "/minimal/volume"
|
||||||
|
max_reservation: 100
|
||||||
|
public_port_range:
|
||||||
|
start: 5000
|
||||||
|
end: 5100
|
||||||
|
max_ports_per_vm: 3
|
||||||
|
|
22
test_data/config5.yaml
Normal file
22
test_data/config5.yaml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
max_cores_per_vm: 8
|
||||||
|
max_vcpu_reservation: 16
|
||||||
|
max_mem_reservation: 32768
|
||||||
|
network_interfaces:
|
||||||
|
- driver: "Bridge"
|
||||||
|
device: "br1"
|
||||||
|
ipv4:
|
||||||
|
- subnet: "192.168.100.0/24"
|
||||||
|
gateway: "192.168.100.1"
|
||||||
|
reserved_addrs: []
|
||||||
|
ipv6:
|
||||||
|
- subnet: "2001:abcd::/48"
|
||||||
|
gateway: "2001:abcd::1"
|
||||||
|
reserved_addrs: []
|
||||||
|
volumes:
|
||||||
|
- path: "/network/volume"
|
||||||
|
max_reservation: 750
|
||||||
|
public_port_range:
|
||||||
|
start: 6000
|
||||||
|
end: 7000
|
||||||
|
max_ports_per_vm: 8
|
||||||
|
|
Loading…
Reference in New Issue
Block a user