added mechanic to get random ports
This commit is contained in:
		
							parent
							
								
									b905c96261
								
							
						
					
					
						commit
						57801c725d
					
				
							
								
								
									
										37
									
								
								src/state.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										37
									
								
								src/state.rs
									
									
									
									
									
								
							| @ -38,6 +38,27 @@ pub struct Resources { | ||||
| } | ||||
| 
 | ||||
| impl Resources { | ||||
|     // TODO: improve this to error out if ports are not available
 | ||||
|     // be careful with loops
 | ||||
|     // server must provide number of ports in the contract or fail
 | ||||
|     fn reserve_ports(&mut self, mut nr: u16, config: &Config) -> Vec<u16> { | ||||
|         use rand::Rng; | ||||
|         if nr > config.max_ports_per_vm { | ||||
|             nr = config.max_ports_per_vm; | ||||
|         } | ||||
|         let mut published_ports = Vec::new(); | ||||
|         for _ in 0..nr { | ||||
|             for _ in 0..5 { | ||||
|                 let port = rand::thread_rng().gen_range(config.public_port_range.clone()); | ||||
|                 if self.used_ports.insert(port) { | ||||
|                     published_ports.push(port); | ||||
|                 } | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         Vec::new() | ||||
|     } | ||||
| 
 | ||||
|     fn reserve_vm_if(&mut self) -> String { | ||||
|         use rand::{distributions::Alphanumeric, Rng}; | ||||
|         loop { | ||||
| @ -74,8 +95,8 @@ impl Resources { | ||||
|                             }, | ||||
|                         }; | ||||
|                         let mut ips = Vec::new(); | ||||
|                         let mask = range | ||||
|                             .subnet | ||||
|                         let mask = ip | ||||
|                             .network() | ||||
|                             .to_string() | ||||
|                             .split('/') | ||||
|                             .next() | ||||
| @ -115,8 +136,8 @@ impl Resources { | ||||
|                             }, | ||||
|                         }; | ||||
|                         let mut ips = Vec::new(); | ||||
|                         let mask = range | ||||
|                             .subnet | ||||
|                         let mask = ip | ||||
|                             .network() | ||||
|                             .to_string() | ||||
|                             .split('/') | ||||
|                             .next() | ||||
| @ -183,6 +204,12 @@ pub struct VMNIC { | ||||
|     ips: Vec<IPConfig>, | ||||
| } | ||||
| 
 | ||||
| impl VMNIC { | ||||
|     fn new() -> VMNIC { | ||||
|         todo!("implement this here to improve code elegance of resource reservation"); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub struct VM { | ||||
|     uuid: String, | ||||
|     hostname: String, | ||||
| @ -267,7 +294,7 @@ impl VM { | ||||
|                     } else { | ||||
|                         vm_nics.push(vmnic); | ||||
|                     } | ||||
|                 }, | ||||
|                 } | ||||
|                 None => return Err(VMCreationErrors::IPv4NotAvailable), | ||||
|             } | ||||
|         } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user