(self, request: VmConfiguration)
| 289 | |
| 290 | impl VmmRpc for RpcHandler { |
| 291 | async fn create_vm(self, request: VmConfiguration) -> Result<Id> { |
| 292 | let manifest = create_manifest_from_vm_config(request.clone(), &self.app.config.cvm)?; |
| 293 | let id = manifest.id.clone(); |
| 294 | let app_id = manifest.app_id.clone(); |
| 295 | let vm_work_dir = self.app.work_dir(&id); |
| 296 | vm_work_dir |
| 297 | .put_manifest(&manifest) |
| 298 | .context("Failed to write manifest")?; |
| 299 | let work_dir = self.prepare_work_dir(&id, &request, &app_id)?; |
| 300 | if let Err(err) = vm_work_dir.set_started(!request.stopped) { |
| 301 | warn!("Failed to set started: {}", err); |
| 302 | } |
| 303 | |
| 304 | let result = self |
| 305 | .app |
| 306 | .load_vm(&work_dir, &Default::default(), false) |
| 307 | .await |
| 308 | .context("Failed to load VM"); |
| 309 | let result = match result { |
| 310 | Ok(()) => { |
| 311 | if !request.stopped { |
| 312 | self.app.start_vm(&id).await |
| 313 | } else { |
| 314 | Ok(()) |
| 315 | } |
| 316 | } |
| 317 | Err(err) => Err(err), |
| 318 | }; |
| 319 | if let Err(err) = result { |
| 320 | if let Err(err) = fs::remove_dir_all(&work_dir) { |
| 321 | warn!("Failed to remove work dir: {}", err); |
| 322 | } |
| 323 | return Err(err); |
| 324 | } |
| 325 | |
| 326 | Ok(Id { id }) |
| 327 | } |
| 328 | |
| 329 | async fn start_vm(self, request: Id) -> Result<()> { |
| 330 | self.app |
nothing calls this directly
no test coverage detected