Skip to content

Commit 80a739a

Browse files
committed
thiserror derive for more error enums
Signed-off-by: Egor Lazarchuk <[email protected]>
1 parent 4e32d02 commit 80a739a

File tree

3 files changed

+38
-75
lines changed

3 files changed

+38
-75
lines changed

src/devices/src/virtio/net/mod.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,25 @@ pub enum NetQueue {
3131
Tx,
3232
}
3333

34-
#[derive(Debug)]
34+
#[derive(Debug, thiserror::Error)]
3535
pub enum Error {
36-
/// Open tap device failed.
36+
/// Open tap device failed
37+
#[error("Open tap device failed: {0}")]
3738
TapOpen(TapError),
38-
/// Setting tap interface offload flags failed.
39+
/// Setting tap interface offload flags failed
40+
#[error("Setting tap interface offload flags failed: {0}")]
3941
TapSetOffload(TapError),
40-
/// Setting vnet header size failed.
42+
/// Setting vnet header size failed
43+
#[error("Setting vnet header size failed: {0}")]
4144
TapSetVnetHdrSize(TapError),
42-
/// Enabling tap interface failed.
43-
TapEnable(TapError),
44-
/// EventFd error.
45+
/// EventFd error
46+
#[error("EventFd error: {0}")]
4547
EventFd(io::Error),
46-
/// IO error.
48+
/// IO error
49+
#[error("IO error: {0}")]
4750
IO(io::Error),
48-
/// The VNET header is missing from the frame.
51+
/// The VNET header is missing from the frame
52+
#[error("The VNET header is missing from the frame")]
4953
VnetHeaderMissing,
5054
}
5155

src/vmm/src/vmm_config/net.rs

Lines changed: 24 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
use std::convert::TryInto;
55
use std::ops::Deref;
6+
use std::result;
67
use std::sync::{Arc, Mutex};
7-
use std::{fmt, result};
88

99
use devices::virtio::net::TapError;
1010
use devices::virtio::Net;
@@ -61,43 +61,23 @@ pub struct NetworkInterfaceUpdateConfig {
6161
}
6262

6363
/// Errors associated with `NetworkInterfaceConfig`.
64-
#[derive(Debug, derive_more::From)]
64+
#[derive(Debug, thiserror::Error)]
6565
pub enum NetworkInterfaceError {
66-
/// Could not create Network Device.
67-
CreateNetworkDevice(devices::virtio::net::Error),
68-
/// Failed to create a `RateLimiter` object.
69-
CreateRateLimiter(std::io::Error),
70-
/// The MAC address is already in use.
66+
/// Could not create Network Device
67+
#[error("Could not create Network Device: {0}")]
68+
CreateNetworkDevice(#[from] devices::virtio::net::Error),
69+
/// Failed to create a `RateLimiter` object
70+
#[error("Failed to create a `RateLimiter` object: {0}")]
71+
CreateRateLimiter(#[from] std::io::Error),
72+
/// The MAC address is already in use
73+
#[error("The MAC address is already in use: {0}")]
7174
GuestMacAddressInUse(String),
72-
/// Error during interface update (patch).
73-
DeviceUpdate(VmmError),
74-
/// Cannot open/create tap device.
75-
OpenTap(TapError),
76-
}
77-
78-
impl fmt::Display for NetworkInterfaceError {
79-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
80-
use self::NetworkInterfaceError::*;
81-
match self {
82-
CreateNetworkDevice(err) => write!(f, "Could not create Network Device: {:?}", err),
83-
CreateRateLimiter(err) => write!(f, "Cannot create RateLimiter: {}", err),
84-
GuestMacAddressInUse(mac_addr) => {
85-
write!(f, "The guest MAC address {mac_addr} is already in use.")
86-
}
87-
DeviceUpdate(err) => write!(f, "Error during interface update (patch): {}", err),
88-
OpenTap(err) => {
89-
// We are propagating the Tap Error. This error can contain
90-
// imbricated quotes which would result in an invalid json.
91-
let mut tap_err = format!("{:?}", err);
92-
tap_err = tap_err.replace('\"', "");
93-
94-
write!(
95-
f,
96-
"Cannot open TAP device. Invalid name/permissions. {tap_err}",
97-
)
98-
}
99-
}
100-
}
75+
/// Error during interface update (patch)
76+
#[error("Error during interface update (patch): {0}")]
77+
DeviceUpdate(#[from] VmmError),
78+
/// Cannot open/create tap device
79+
#[error("Cannot open/create tap device: {0}")]
80+
OpenTap(#[from] TapError),
10181
}
10282

10383
type Result<T> = result::Result<T, NetworkInterfaceError>;
@@ -172,11 +152,13 @@ impl NetBuilder {
172152
let rx_rate_limiter = cfg
173153
.rx_rate_limiter
174154
.map(super::RateLimiterConfig::try_into)
175-
.transpose()?;
155+
.transpose()
156+
.map_err(NetworkInterfaceError::CreateRateLimiter)?;
176157
let tx_rate_limiter = cfg
177158
.tx_rate_limiter
178159
.map(super::RateLimiterConfig::try_into)
179-
.transpose()?;
160+
.transpose()
161+
.map_err(NetworkInterfaceError::CreateRateLimiter)?;
180162

181163
// Create and return the Net device
182164
devices::virtio::net::Net::new_with_tap(
@@ -285,10 +267,10 @@ mod tests {
285267
let guest_mac_2 = "01:23:45:67:89:0b";
286268

287269
let netif_2 = create_netif(id_2, host_dev_name_2, guest_mac_1);
288-
let expected_error = format!("The guest MAC address {} is already in use.", guest_mac_1);
270+
let expected_error = NetworkInterfaceError::GuestMacAddressInUse(guest_mac_1.into());
289271
assert_eq!(
290272
net_builder.build(netif_2).err().unwrap().to_string(),
291-
expected_error
273+
expected_error.to_string()
292274
);
293275
assert_eq!(net_builder.net_devices.len(), 1);
294276

@@ -313,10 +295,10 @@ mod tests {
313295
// Error Cases for UPDATE
314296
// Error Case: Update netif_2 mac using the same mac as netif_1.
315297
let netif_2 = create_netif(id_2, host_dev_name_2, guest_mac_1);
316-
let expected_error = format!("The guest MAC address {} is already in use.", guest_mac_1);
298+
let expected_error = NetworkInterfaceError::GuestMacAddressInUse(guest_mac_1.into());
317299
assert_eq!(
318300
net_builder.build(netif_2).err().unwrap().to_string(),
319-
expected_error
301+
expected_error.to_string()
320302
);
321303

322304
// Error Case: Update netif_2 dev_host_name using the same dev_host_name as netif_1.
@@ -333,27 +315,6 @@ mod tests {
333315
);
334316
}
335317

336-
#[test]
337-
fn test_error_display() {
338-
// FIXME: use macro
339-
let err = NetworkInterfaceError::CreateNetworkDevice(devices::virtio::net::Error::TapOpen(
340-
TapError::InvalidIfname,
341-
));
342-
let _ = format!("{}{:?}", err, err);
343-
let err = NetworkInterfaceError::CreateRateLimiter(std::io::Error::from_raw_os_error(0));
344-
let _ = format!("{}{:?}", err, err);
345-
let _ = format!(
346-
"{}{:?}",
347-
NetworkInterfaceError::DeviceUpdate(VmmError::VcpuExit),
348-
NetworkInterfaceError::DeviceUpdate(VmmError::VcpuExit)
349-
);
350-
let _ = format!(
351-
"{}{:?}",
352-
NetworkInterfaceError::OpenTap(TapError::InvalidIfname),
353-
NetworkInterfaceError::OpenTap(TapError::InvalidIfname)
354-
);
355-
}
356-
357318
#[test]
358319
fn test_net_config() {
359320
let net_id = "id";

tests/integration_tests/functional/test_api.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,7 @@ def test_net_api_put_update_pre_boot(test_microvm_with_api):
253253
iface_id="2", host_dev_name=second_if_name, guest_mac=guest_mac
254254
)
255255
assert test_microvm.api_session.is_status_bad_request(response.status_code)
256-
assert (
257-
"The guest MAC address {} is already in use.".format(guest_mac) in response.text
258-
)
256+
assert f"The MAC address is already in use: {guest_mac}" in response.text
259257

260258
# Updates to a network interface with an available MAC are allowed.
261259
response = test_microvm.network.put(

0 commit comments

Comments
 (0)