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", | ||||
|  "reqwest", | ||||
|  "serde", | ||||
|  "serde_yaml", | ||||
|  "sha2", | ||||
| ] | ||||
| 
 | ||||
| @ -1039,6 +1040,19 @@ dependencies = [ | ||||
|  "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]] | ||||
| name = "sha2" | ||||
| version = "0.10.8" | ||||
| @ -1265,6 +1279,12 @@ version = "1.0.14" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "unsafe-libyaml" | ||||
| version = "0.2.11" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "untrusted" | ||||
| version = "0.9.0" | ||||
|  | ||||
| @ -9,4 +9,5 @@ cidr = { version = "0.3.0", features = ["serde"] } | ||||
| rand = "0.8.5" | ||||
| reqwest = { version = "0.12.9", features = ["blocking"] } | ||||
| serde = { version = "1.0.215", features = ["derive"] } | ||||
| serde_yaml = "0.9.34" | ||||
| sha2 = "0.10.8" | ||||
|  | ||||
| @ -1,30 +1,31 @@ | ||||
| #![allow(dead_code)] | ||||
| use cidr::Ipv4Cidr; | ||||
| use cidr::Ipv6Cidr; | ||||
| use core::net::Ipv4Addr; | ||||
| use core::net::Ipv6Addr; | ||||
| 
 | ||||
| use cidr::{Ipv4Cidr, Ipv6Cidr}; | ||||
| use serde::Deserialize; | ||||
| use std::collections::HashSet; | ||||
| use std::net::{Ipv4Addr, Ipv6Addr}; | ||||
| use std::ops::Range; | ||||
| 
 | ||||
| #[derive(Deserialize, Debug)] | ||||
| pub struct Volume { | ||||
|     path: String, | ||||
|     // maximum allowed storage in GB
 | ||||
|     max_reservation: u64, | ||||
| } | ||||
| 
 | ||||
| #[derive(Deserialize, Debug)] | ||||
| pub struct IPv4Range { | ||||
|     pub subnet: Ipv4Cidr, | ||||
|     pub gateway: Ipv4Addr, | ||||
|     pub reserved_addrs: HashSet<Ipv4Addr>, | ||||
| } | ||||
| 
 | ||||
| #[derive(Deserialize, Debug)] | ||||
| pub struct IPv6Range { | ||||
|     pub subnet: Ipv6Cidr, | ||||
|     pub gateway: Ipv6Addr, | ||||
|     pub reserved_addrs: HashSet<Ipv6Addr>, | ||||
| } | ||||
| 
 | ||||
| #[derive(Deserialize, Debug)] | ||||
| pub struct Interface { | ||||
|     pub driver: InterfaceType, | ||||
|     pub device: String, | ||||
| @ -32,19 +33,60 @@ pub struct Interface { | ||||
|     pub ipv6: Vec<IPv6Range>, | ||||
| } | ||||
| 
 | ||||
| // TODO: create mechanic to autodetect interface type
 | ||||
| #[derive(Deserialize, Debug)] | ||||
| pub enum InterfaceType { | ||||
|     MACVTAP, | ||||
|     IPVTAP, | ||||
|     Bridge, | ||||
| } | ||||
| 
 | ||||
| #[derive(Deserialize, Debug)] | ||||
| pub struct Config { | ||||
|     pub max_cores_per_vm: usize, | ||||
|     pub max_vcpu_reservation: usize, | ||||
|     pub max_mem_reservation: usize, | ||||
|     pub network_interfaces: Vec<Interface>, | ||||
|     pub volumes: Vec<Volume>, | ||||
|     #[serde(with = "range_format")] | ||||
|     pub public_port_range: Range<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 tcontract; | ||||
| 
 | ||||
| fn main() { | ||||
|     println!("Hello, world!"); | ||||
| use crate::config::Config; | ||||
| 
 | ||||
| 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_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