vmm: api: Allow to delete non-booted VMs

The action of "vm.delete" should not report errors on non-booted
VMs. This patch also revised the "docs/api.md" to reflect the right
'Prerequisites' of different API actions, e.g. on "vm.delete" and
"vm.boot".

Fixes: #1110

Signed-off-by: Bo Chen <chen.bo@intel.com>
This commit is contained in:
Bo Chen 2020-06-08 13:41:35 -07:00 committed by Rob Bradford
parent 313883f6e4
commit 625bab69bd
2 changed files with 8 additions and 7 deletions

View File

@ -81,8 +81,8 @@ Shut the VMM down | `/vmm.shutdown` | N/A | N/A
Action | Endpoint | Request Body | Response Body | Prerequisites Action | Endpoint | Request Body | Response Body | Prerequisites
-----------------------------------|---------------------|---------------------------|-------------------|--------------------------- -----------------------------------|---------------------|---------------------------|-------------------|---------------------------
Create the VM | `/vm.create` | `/schemas/VmConfig` | N/A | The VM is not created yet Create the VM | `/vm.create` | `/schemas/VmConfig` | N/A | The VM is not created yet
Delete the VM | `/vm.delete` | N/A | N/A | The VM is created but not booted Delete the VM | `/vm.delete` | N/A | N/A | N/A
Boot the VM | `/vm.boot` | N/A | N/A | The VM is created Boot the VM | `/vm.boot` | N/A | N/A | The VM is created but not booted
Shut the VM down | `/vm.shutdown` | N/A | N/A | The VM is booted Shut the VM down | `/vm.shutdown` | N/A | N/A | The VM is booted
Reboot the VM | `/vm.reboot` | N/A | N/A | The VM is booted Reboot the VM | `/vm.reboot` | N/A | N/A | The VM is booted
Pause the VM | `/vm.pause` | N/A | N/A | The VM is booted Pause the VM | `/vm.pause` | N/A | N/A | The VM is booted
@ -274,7 +274,7 @@ are received and processed by the VMM control loop.
In order for the VMM control loop to respond to any internal API command, it In order for the VMM control loop to respond to any internal API command, it
must be able to send a response back to the MPSC sender. For that purpose, all must be able to send a response back to the MPSC sender. For that purpose, all
internal API command payload carry the [Sender](https://doc.rust-lang.org/std/sync/mpsc/struct.Sender.html) internal API command payload carry the [Sender](https://doc.rust-lang.org/std/sync/mpsc/struct.Sender.html)
end of an [MPSC](https://doc.rust-lang.org/std/sync/mpsc/) channel. end of an [MPSC](https://doc.rust-lang.org/std/sync/mpsc/) channel.
The sender of any internal API command is therefore responsible for: The sender of any internal API command is therefore responsible for:
@ -354,7 +354,7 @@ APIs work together, let's look at a complete VM creation flow, from the
} else { } else {
Err(ApiError::VmAlreadyCreated) Err(ApiError::VmAlreadyCreated)
}; };
sender.send(response).map_err(Error::ApiResponseSend)?; sender.send(response).map_err(Error::ApiResponseSend)?;
} }
``` ```
@ -375,4 +375,3 @@ APIs work together, let's look at a complete VM creation flow, from the
user. This is abstracted by the user. This is abstracted by the
[micro_http](https://github.com/firecracker-microvm/firecracker/tree/master/src/micro_http) [micro_http](https://github.com/firecracker-microvm/firecracker/tree/master/src/micro_http)
crate. crate.

View File

@ -424,8 +424,10 @@ impl Vmm {
return Ok(()); return Ok(());
} }
// First we try to shut the current VM down. // If a VM is booted, we first try to shut it down.
self.vm_shutdown()?; if self.vm.is_some() {
self.vm_shutdown()?;
}
self.vm_config = None; self.vm_config = None;