in nfm-controller/src/events/host_stats_provider.rs [304:420]
fn test_get_host_stats() {
// Set our command expectations.
let mut fake_runner = FakeCommandRunner::new();
fake_runner.add_expectation(
"ethtool",
&["-S", "eth1"],
Ok(Output {
status: ExitStatus::from_raw(0),
stdout: format!(ethtool_template!(), 5, 6, 9, 7, 8, 10)
.as_bytes()
.to_vec(),
stderr: vec![],
}),
);
fake_runner.add_expectation(
"ethtool",
&["-S", "eth2"],
Ok(Output {
status: ExitStatus::from_raw(0),
stdout: format!(ethtool_template!(), 55, 66, 99, 77, 88, 1010)
.as_bytes()
.to_vec(),
stderr: vec![],
}),
);
// Build what we expect should be loaded.
let device1 = NetworkDevice {
interface_id: "id1".to_string(),
device_name: "eth1".to_string(),
};
let device2 = NetworkDevice {
interface_id: "id2".to_string(),
device_name: "eth2".to_string(),
};
let expected_stats1 = NetworkInterfaceStats {
bw_in_allowance_exceeded: 5,
bw_out_allowance_exceeded: 6,
conntrack_allowance_exceeded: 7,
linklocal_allowance_exceeded: 8,
pps_allowance_exceeded: 9,
conntrack_allowance_available: 10,
};
let expected_stats2 = NetworkInterfaceStats {
bw_in_allowance_exceeded: 55,
bw_out_allowance_exceeded: 66,
conntrack_allowance_exceeded: 77,
linklocal_allowance_exceeded: 88,
pps_allowance_exceeded: 99,
conntrack_allowance_available: 1010,
};
// Do work.
let mut host_stats_provider = HostStatsProviderImpl {
network_interface_stats: HashMap::new(),
command_runner: Box::new(fake_runner.clone()),
};
host_stats_provider.set_network_devices(&[device1.clone(), device2.clone()]);
// Validate stats initially loaded.
let mut expected_internal_stats = HashMap::<NetworkDevice, NetworkInterfaceStats>::new();
expected_internal_stats.insert(device1, expected_stats1);
expected_internal_stats.insert(device2, expected_stats2);
assert_eq!(
host_stats_provider.network_interface_stats,
expected_internal_stats
);
// Mimic an error for eth1 and the linklocal value changed for eth2.
fake_runner.add_expectation(
"ethtool",
&["-S", "eth1"],
Err(std::io::Error::new(
std::io::ErrorKind::TimedOut,
"fake-error",
)),
);
fake_runner.add_expectation(
"ethtool",
&["-S", "eth2"],
Ok(Output {
status: ExitStatus::from_raw(0),
stdout: format!(ethtool_template!(), 55, 66, 99, 77, 89, 1010)
.as_bytes()
.to_vec(),
stderr: vec![],
}),
);
let mut expected_stats = HostStats {
interface_stats: vec![
// eth1 values show no change after command failure.
GroupedInterfaceStats {
interface_id: "id1".to_string(),
stats: NetworkInterfaceStats {
conntrack_allowance_available: 10,
..Default::default()
},
},
// eth2 values represent the diff on command success.
GroupedInterfaceStats {
interface_id: "id2".to_string(),
stats: NetworkInterfaceStats {
linklocal_allowance_exceeded: 1,
conntrack_allowance_available: 1010,
..Default::default()
},
},
],
};
// Do work again, and validate.
assert_eq!(
host_stats_provider.get_stats().interface_stats.sort(),
expected_stats.interface_stats.sort()
);
assert!(fake_runner.expectations.lock().unwrap().is_empty());
}