Skip to content

Commit f0ef0d5

Browse files
instance start: return the actual error on fail
Set the response body when InstanceStart fails to the error received from the VMM. Also, set the status code to 500 (Internal Server Error) or 400 (Bad Request) depending on error type. Signed-off-by: Andreea Florescu <[email protected]>
1 parent 1d009ad commit f0ef0d5

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

api_server/src/request/mod.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ pub enum Error {
108108
DriveOperationFailed(DriveError),
109109
GuestCIDAlreadyInUse,
110110
GuestMacAddressInUse,
111-
InstanceStartFailed,
111+
InstanceStartFailed(ErrorType, String),
112112
InvalidPayload,
113113
MicroVMAlreadyRunning,
114114
OpenTap(TapError),
@@ -118,6 +118,12 @@ pub enum Error {
118118
UpdateNotImplemented,
119119
}
120120

121+
#[derive(Debug)]
122+
pub enum ErrorType {
123+
UserError,
124+
InternalError,
125+
}
126+
121127
impl GenerateResponse for Error {
122128
fn generate_response(&self) -> hyper::Response {
123129
use self::Error::*;
@@ -131,10 +137,14 @@ impl GenerateResponse for Error {
131137
StatusCode::BadRequest,
132138
json_fault_message("The specified guest MAC address is already in use."),
133139
),
134-
InstanceStartFailed => json_response(
135-
StatusCode::InternalServerError,
136-
json_fault_message("The microVM failed to start."),
137-
),
140+
InstanceStartFailed(ref error_type, ref error_msg) => {
141+
let status_code = match error_type {
142+
ErrorType::InternalError => StatusCode::InternalServerError,
143+
ErrorType::UserError => StatusCode::BadRequest,
144+
};
145+
146+
json_response(status_code, json_fault_message(error_msg))
147+
}
138148
InvalidPayload => json_response(
139149
StatusCode::BadRequest,
140150
json_fault_message("The request payload is invalid."),
@@ -295,9 +305,14 @@ mod tests {
295305
ret = Error::GuestMacAddressInUse.generate_response();
296306
assert_eq!(ret.status(), StatusCode::BadRequest);
297307

298-
ret = Error::InstanceStartFailed.generate_response();
308+
ret = Error::InstanceStartFailed(ErrorType::InternalError, "Dummy error".to_string())
309+
.generate_response();
299310
assert_eq!(ret.status(), StatusCode::InternalServerError);
300311

312+
ret = Error::InstanceStartFailed(ErrorType::UserError, "Dummy error".to_string())
313+
.generate_response();
314+
assert_eq!(ret.status(), StatusCode::BadRequest);
315+
301316
ret = Error::InvalidPayload.generate_response();
302317
assert_eq!(ret.status(), StatusCode::BadRequest);
303318

vmm/src/lib.rs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ use api_server::request::machine_configuration::{
5454
};
5555
use api_server::request::net::NetworkInterfaceBody;
5656
use api_server::request::{
57-
Error as SyncError, GenerateResponse, OkStatus as SyncOkStatus, SyncOutcomeSender, SyncRequest,
57+
Error as SyncError, ErrorType, GenerateResponse, OkStatus as SyncOkStatus, SyncOutcomeSender,
58+
SyncRequest,
5859
};
5960
use data_model::vm::{
6061
description_into_implementation as rate_limiter_description_into_implementation,
@@ -1304,10 +1305,19 @@ impl Vmm {
13041305
.send(Box::new(SyncOkStatus::NoContent))
13051306
.map_err(|_| ())
13061307
.expect("one-shot channel closed"),
1307-
Err(_) => sender
1308-
.send(Box::new(SyncError::InstanceStartFailed))
1309-
.map_err(|_| ())
1310-
.expect("one-shot channel closed"),
1308+
Err(e) => {
1309+
let err_type = match e {
1310+
Error::User(_) => ErrorType::UserError,
1311+
Error::Internal(_) => ErrorType::InternalError,
1312+
};
1313+
1314+
sender
1315+
.send(Box::new(SyncError::InstanceStartFailed(
1316+
err_type,
1317+
format!("Failed to start microVM. {:?}", e),
1318+
))).map_err(|_| ())
1319+
.expect("one-shot channel closed")
1320+
}
13111321
};
13121322
}
13131323

0 commit comments

Comments
 (0)