@@ -221,12 +221,14 @@ pub fn get_resource_request_for_universal_vm(
221
221
}
222
222
223
223
pub fn allocate_resources ( farm : & Farm , req : & ResourceRequest ) -> FarmResult < ResourceGroup > {
224
- let group_name = & req. group_name ;
225
- let mut res_group = ResourceGroup :: new ( group_name. clone ( ) ) ;
224
+ let group_name = req. group_name . clone ( ) ;
225
+ // Create VMs in parallel via Farm.
226
+ let mut threads = vec ! [ ] ;
226
227
for vm_config in req. vm_configs . iter ( ) {
227
- let name = vm_config. name . clone ( ) ;
228
+ let farm_cloned = farm. clone ( ) ;
229
+ let vm_name = vm_config. name . clone ( ) ;
228
230
let create_vm_request = CreateVmRequest :: new (
229
- name . clone ( ) ,
231
+ vm_name . clone ( ) ,
230
232
VmType :: Production ,
231
233
vm_config. vcpus ,
232
234
vm_config. memory_kibibytes ,
@@ -240,13 +242,25 @@ pub fn allocate_resources(farm: &Farm, req: &ResourceRequest) -> FarmResult<Reso
240
242
vm_config. vm_allocation . clone ( ) ,
241
243
vm_config. required_host_features . clone ( ) ,
242
244
) ;
243
-
244
- let created_vm = farm. create_vm ( group_name, create_vm_request) ?;
245
+ let group_name = group_name. clone ( ) ;
246
+ // Spin up another thread
247
+ threads. push ( std:: thread:: spawn ( move || {
248
+ (
249
+ vm_name,
250
+ farm_cloned. create_vm ( & group_name, create_vm_request) ,
251
+ )
252
+ } ) ) ;
253
+ }
254
+ let mut res_group = ResourceGroup :: new ( group_name. clone ( ) ) ;
255
+ for thread in threads {
256
+ let ( vm_name, created_vm) = thread
257
+ . join ( )
258
+ . expect ( "Couldn't join on the associated thread" ) ;
245
259
res_group. add_vm ( AllocatedVm {
246
- name,
260
+ name : vm_name ,
247
261
group_name : group_name. clone ( ) ,
248
- ipv6 : created_vm. ipv6 ,
249
- } ) ;
262
+ ipv6 : created_vm? . ipv6 ,
263
+ } )
250
264
}
251
265
Ok ( res_group)
252
266
}
0 commit comments