cniguru 0.2.0

Troubleshooting tool for docker and kubernetes networking
use super::{parse_ip_link_or_addr_printout, VethIntf};

#[test]
fn test_parse_ip_link_printout_basic() {
    let s = r#"1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: vethc3cef48b@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default
    link/ether e6:93:28:78:39:99 brd ff:ff:ff:ff:ff:ff link-netnsid 0
3: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether c8:5b:76:72:53:46 brd ff:ff:ff:ff:ff:ff
4: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether e4:a7:a0:61:3d:3e brd ff:ff:ff:ff:ff:ff
9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 02:42:1b:7f:0d:5e brd ff:ff:ff:ff:ff:ff
11: wwp0s20f0u5c2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 02:1e:10:1f:00:00 brd ff:ff:ff:ff:ff:ff
12: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default
    link/ether da:1f:7a:e1:59:58 brd ff:ff:ff:ff:ff:ff
13: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 5a:02:70:6b:57:1e brd ff:ff:ff:ff:ff:ff
14: veth551a254e@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default
    link/ether 12:56:7d:9f:80:15 brd ff:ff:ff:ff:ff:ff link-netnsid 1"#;

    let exp = vec![
        VethIntf {
            name: "vethc3cef48b".into(),
            ifindex: 2,
            peer_ifindex: 3,
            bridge: Some("cni0".into()),
            mtu: 1450,
            mac_address: "e6:93:28:78:39:99".into(),
            ip_address: None,
        },
        VethIntf {
            name: "veth551a254e".into(),
            ifindex: 14,
            peer_ifindex: 3,
            bridge: Some("cni0".into()),
            mtu: 1450,
            mac_address: "12:56:7d:9f:80:15".into(),
            ip_address: None,
        },
    ];

    let got = parse_ip_link_or_addr_printout(s).unwrap();

    assert_eq!(exp, got);
}

#[test]
fn test_parse_ip_link_printout_multus() {
    let s = r#"610: veth987c7292@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master bla-bla-int0 state UP mode DEFAULT group default
    link/ether 46:ed:60:c6:e9:73 brd ff:ff:ff:ff:ff:ff link-netnsid 6"#;

    let exp = vec![VethIntf {
        name: "veth987c7292".into(),
        ifindex: 610,
        peer_ifindex: 5,
        bridge: Some("bla-bla-int0".into()),
        mtu: 1500,
        mac_address: "46:ed:60:c6:e9:73".into(),
        ip_address: None,
    }];

    let got = parse_ip_link_or_addr_printout(s).unwrap();

    assert_eq!(exp, got);
}

#[test]
fn test_parse_ip_addr_printout_multus() {
    let s = r#"1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if545: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc noqueue state UP group default
    link/ether 0a:58:0a:f4:00:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.244.0.216/24 scope global eth0
       valid_lft forever preferred_lft forever
5: net0@if546: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 0a:58:15:17:5f:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 21.23.95.1/25 scope global net0
       valid_lft forever preferred_lft forever
7: net1@if547: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 0a:58:15:17:60:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 21.23.96.1/25 scope global net1
       valid_lft forever preferred_lft forever
9: net2@if548: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 0a:58:15:17:61:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 21.23.97.1/25 scope global net2
       valid_lft forever preferred_lft forever"#;

    let exp = vec![
        VethIntf {
            name: "eth0".into(),
            ifindex: 3,
            peer_ifindex: 545,
            bridge: None,
            mtu: 1460,
            mac_address: "0a:58:0a:f4:00:d8".into(),
            ip_address: Some("10.244.0.216/24".into()),
        },
        VethIntf {
            name: "net0".into(),
            ifindex: 5,
            peer_ifindex: 546,
            bridge: None,
            mtu: 1500,
            mac_address: "0a:58:15:17:5f:01".into(),
            ip_address: Some("21.23.95.1/25".into()),
        },
        VethIntf {
            name: "net1".into(),
            ifindex: 7,
            peer_ifindex: 547,
            bridge: None,
            mtu: 1500,
            mac_address: "0a:58:15:17:60:01".into(),
            ip_address: Some("21.23.96.1/25".into()),
        },
        VethIntf {
            name: "net2".into(),
            ifindex: 9,
            peer_ifindex: 548,
            bridge: None,
            mtu: 1500,
            mac_address: "0a:58:15:17:61:01".into(),
            ip_address: Some("21.23.97.1/25".into()),
        },
    ];

    let got = parse_ip_link_or_addr_printout(s).unwrap();

    assert_eq!(exp, got);
}