Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement passthrough mod #2

Merged
merged 32 commits into from
Feb 8, 2019
Merged
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
8e9ef2c
passthrough implementation
bparli Jan 14, 2019
67fa75e
connection tracker size
bparli Jan 19, 2019
0821472
backend failures and RST replies
bparli Jan 21, 2019
4906fc5
fix update status bug
bparli Jan 23, 2019
72711a0
update stats page
bparli Jan 24, 2019
e4519d4
limit conn tracker lock
bparli Jan 25, 2019
ce96344
perf and dsr
bparli Jan 27, 2019
bfe5d2a
use multiple transmitters
bparli Jan 27, 2019
aed1ec8
test perf improvements
bparli Jan 27, 2019
83f788c
dsr testing
bparli Jan 30, 2019
a19074b
use to_owned for ethernetpacket
bparli Jan 30, 2019
f648537
update stats counters only every so often
bparli Jan 31, 2019
0fd1168
add unit tests passthrough backend
bparli Feb 1, 2019
bae92d5
add tx thread and channel
bparli Feb 2, 2019
ef6275a
unit tests and re-use tcp_header
bparli Feb 4, 2019
4c4d9a3
unit tests
bparli Feb 4, 2019
898334f
unit tests
bparli Feb 5, 2019
473499d
re-use tcp packet
bparli Feb 5, 2019
47efd00
perf tweaks
bparli Feb 6, 2019
141aa29
perf tweaks
bparli Feb 6, 2019
4818f5f
perf tweaks
bparli Feb 6, 2019
fe6c394
some clean up
bparli Feb 6, 2019
af8cb38
make port mapper a rw lock
bparli Feb 6, 2019
6fd7f22
improve health checking
bparli Feb 7, 2019
d78a16c
more perf tweaking
bparli Feb 8, 2019
87739c4
fix tests
bparli Feb 8, 2019
cf39025
bump version
bparli Feb 8, 2019
036c8f5
fix cmd line opts
bparli Feb 8, 2019
84bf410
Update README.md
bparli Feb 8, 2019
4d66145
update samples
bparli Feb 8, 2019
0c96373
update readme with samples
bparli Feb 8, 2019
394cc18
extra spaces
bparli Feb 8, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add unit tests passthrough backend
  • Loading branch information
bparli committed Feb 1, 2019
commit 0fd1168e99fd7a5df6770b6c256b0c0c50c7467e
89 changes: 51 additions & 38 deletions src/passthrough/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -182,80 +182,93 @@ mod tests {
use std::str::FromStr;
use std::net::TcpListener;
use std::{thread, time};
use std::process::Command;

#[test]
fn test_new_servers() {
fn test_new_servers_pt() {
thread::spawn( ||{
let listener = TcpListener::bind("127.0.0.1:8070").unwrap();
let listener = TcpListener::bind("127.0.0.1:9070").unwrap();
match listener.accept() {
Ok((_socket, _addr)) => {},
Err(_e) => {},
}
});

let one_sec = time::Duration::from_secs(1);
thread::sleep(one_sec);
let two_sec = time::Duration::from_secs(2);
thread::sleep(two_sec);

let mut test_servers = HashMap::new();
test_servers.insert(FromStr::from_str("127.0.0.1:8070").unwrap(), None);
test_servers.insert(FromStr::from_str("127.0.0.1:8071").unwrap(), Some(100));

let test_pool = ServerPool::new_servers(test_servers);
test_servers.insert(FromStr::from_str("127.0.0.1:9070").unwrap(), None);
test_servers.insert(FromStr::from_str("127.0.0.1:9071").unwrap(), Some(100));

let mut test_pool = ServerPool::new_servers(test_servers);
let test_srv = test_pool.servers_map.get(&FromStr::from_str("127.0.0.1:9071").unwrap()).unwrap();
assert_eq!(*test_srv, false);

// test scheduling from hashring
let test_node = test_pool.ring.get_node("Dummy-tuple".to_string()).unwrap();
assert_eq!(test_node.port, 9070);
}

#[test]
fn test_backend() {
fn test_backend_get_server_pt() {
// setup iptables for passthrough mode (iptables -t raw -A PREROUTING -p tcp --dport 3000 -j DROP)
let iptables = Command::new("/sbin/iptables")
.args(&["-t", "raw", "-A", "PREROUTING", "-p", "tcp", "--dport", "3000", "-j", "DROP"])
.status()
.unwrap();
assert!(iptables.success());

thread::spawn( ||{
let listener = TcpListener::bind("127.0.0.1:8090").unwrap();
let listener = TcpListener::bind("127.0.0.1:9090").unwrap();
match listener.accept() {
Ok((_socket, _addr)) => {},
Err(_e) => {},
}
});

let one_sec = time::Duration::from_secs(1);
thread::sleep(one_sec);
let two_sec = time::Duration::from_secs(2);
thread::sleep(two_sec);

let mut test_servers = HashMap::new();
test_servers.insert(FromStr::from_str("127.0.0.1:8090").unwrap(), None);
test_servers.insert(FromStr::from_str("127.0.0.1:8091").unwrap(), Some(100));
test_servers.insert(FromStr::from_str("127.0.0.1:9090").unwrap(), None);
test_servers.insert(FromStr::from_str("127.0.0.1:9091").unwrap(), Some(100));

let test_bck = Backend::new("test".to_string(), test_servers, 1000);
assert_eq!(test_bck.health_check_interval, 1000);
assert_eq!(*test_bck.servers_map.read().unwrap().get(&SocketAddr::new("127.0.0.1".parse().unwrap(), 9090)).unwrap(), true);
assert_eq!(*test_bck.servers_map.read().unwrap().get(&SocketAddr::new("127.0.0.1".parse().unwrap(), 9091)).unwrap(), false);
assert_eq!(test_bck.get_server("127.0.0.1".parse().unwrap(), 32000, "127.0.0.1".parse().unwrap(), 33000).unwrap().port, 9090);

let mut test_updates = HashMap::new();
test_updates.insert(FromStr::from_str("127.0.0.1:8091").unwrap(), true);
test_updates.insert(FromStr::from_str("127.0.0.1:9090").unwrap(), false);
test_updates.insert(FromStr::from_str("127.0.0.1:9091").unwrap(), true);
test_bck.update_backends_health(&test_updates);

//let test_pool = test_bck.servers.read().unwrap();
}

#[test]
fn test_get_server() {
thread::spawn( ||{
let listener = TcpListener::bind("127.0.0.1:8082").unwrap();
match listener.accept() {
Ok((_socket, _addr)) => {},
Err(_e) => {},
}
});

let one_sec = time::Duration::from_secs(1);
thread::sleep(one_sec);

let mut test_servers = HashMap::new();
test_servers.insert(FromStr::from_str("127.0.0.1:8082").unwrap(), Some(20));
let test_bck = Arc::new(Backend::new("test".to_string(), test_servers, 1000));
assert_eq!(*test_bck.servers_map.read().unwrap().get(&SocketAddr::new("127.0.0.1".parse().unwrap(), 9091)).unwrap(), true);
assert_eq!(test_bck.get_server("127.0.0.1".parse().unwrap(), 32000, "127.0.0.1".parse().unwrap(), 33000).unwrap().port, 9091);

let mut test_updates = HashMap::new();
test_updates.insert(FromStr::from_str("127.0.0.1:9090").unwrap(), false);
test_updates.insert(FromStr::from_str("127.0.0.1:9091").unwrap(), false);
test_bck.update_backends_health(&test_updates);
match test_bck.get_server("127.0.0.1".parse().unwrap(), 32000, "127.0.0.1".parse().unwrap(), 33000) {
Some(_) => assert!(false),
None => assert!(true),
}

// Flush iptables
let iptables = Command::new("/sbin/iptables")
.args(&["-t", "raw", "-F"])
.status()
.unwrap();
assert!(iptables.success());
}

#[test]
fn test_health_checker() {
fn test_health_checker_pt() {
let mut test_servers = HashMap::new();
let test_addr = FromStr::from_str("127.0.0.1:8089").unwrap();
let test_addr = FromStr::from_str("127.0.0.1:9089").unwrap();
test_servers.insert(test_addr, None);

// nothing listening on 127.0.0.1:8080 yet so should be marked as unhealthy
Expand All @@ -266,7 +279,7 @@ mod tests {

// start listening on 127.0.0.1:8089 so next health checks will mark as healthy
thread::spawn( ||{
let listener = TcpListener::bind("127.0.0.1:8089").unwrap();
let listener = TcpListener::bind("127.0.0.1:9089").unwrap();
match listener.accept() {
Ok((_socket, _addr)) => {},
Err(_e) => {},
Expand All @@ -285,7 +298,7 @@ mod tests {
assert_eq!(resp.backend, "dummy".to_string());
match resp.servers {
Some(srvs) => {
assert!(srvs.get("127.0.0.1:8089").unwrap());
assert!(srvs.get("127.0.0.1:9089").unwrap());
}
None => assert!(false),
}
Expand Down