Ejemplo n.º 1
0
def test_detect_multiple_conflicts():
    """Check if conflicts detection works in subsequent calls"""
    rib = EmulatedRIB()
    conflicts = detect_conflicts("collector", [RIB], opener=dict_opener, rib=rib)
    try:
        conflicts.next()
    except StopIteration:
        pass
    conflicts = detect_conflicts("collector", [UPDATE], opener=dict_opener, rib=rib)
    conflict = conflicts.next()
    assert conflict == EXPECTED
    try:
        conflicts.next()
        raise Exception("Should find only one conflict")
    except StopIteration:
        pass
Ejemplo n.º 2
0
def test_detect_multiple_conflicts():
    """Check if conflicts detection works in subsequent calls"""
    rib = EmulatedRIB()
    conflicts = detect_conflicts("collector", [RIB], opener=dict_opener, rib=rib)
    try:
        conflicts.next()
    except StopIteration:
        pass
    conflicts = detect_conflicts("collector", [UPDATE], opener=dict_opener, rib=rib)
    conflict = conflicts.next()
    assert conflict == EXPECTED
    try:
        conflicts.next()
        raise Exception("Should find only one conflict")
    except StopIteration:
        pass
Ejemplo n.º 3
0
def test_detect_conflicts_rib_withdraw_update():
    """Check if conflicts detection works with withdrawals"""
    conflicts = detect_conflicts("collector", [RIB, WITHDRAW, UPDATE], opener=dict_opener)
    try:
        conflicts.next()
        raise Exception("Should not find any conflict")
    except StopIteration:
        pass
Ejemplo n.º 4
0
def test_detect_conflicts_boundary_2():
    """Check if conflicts detection fails on a file with partial data"""
    try:
        conflicts = detect_conflicts("collector", [{"type": "table_dump_v2"}], opener=dict_opener)
        conflicts.next()
        raise Exception("Should not find any conflict")
    except StopIteration:
        pass
Ejemplo n.º 5
0
def test_detect_conflicts_boundary_1():
    """Check if conflicts detection fails on empty file list"""
    try:
        conflicts = detect_conflicts("collector", [])
        conflicts.next()
        raise Exception("Should raise an exception on empty file list")
    except ValueError as error:
        assert error.message == "no bviews were loaded"
Ejemplo n.º 6
0
def test_detect_conflicts_rib_withdraw_update():
    """Check if conflicts detection works with withdrawals"""
    conflicts = detect_conflicts("collector", [RIB, WITHDRAW, UPDATE], opener=dict_opener)
    try:
        conflicts.next()
        raise Exception("Should not find any conflict")
    except StopIteration:
        pass
Ejemplo n.º 7
0
def test_detect_conflicts_boundary_2():
    """Check if conflicts detection fails on a file with partial data"""
    try:
        conflicts = detect_conflicts("collector", [{"type": "table_dump_v2"}], opener=dict_opener)
        conflicts.next()
        raise Exception("Should not find any conflict")
    except StopIteration:
        pass
Ejemplo n.º 8
0
def test_detect_conflicts_boundary_1():
    """Check if conflicts detection fails on empty file list"""
    try:
        conflicts = detect_conflicts("collector", [])
        conflicts.next()
        raise Exception("Should raise an exception on empty file list")
    except ValueError as error:
        assert error.message == "no bviews were loaded"
Ejemplo n.º 9
0
def test_detect_conflicts_rib_update():
    """Check if conflicts detection works for a conflict between rib and update files"""
    conflicts = detect_conflicts("collector", [RIB, UPDATE], opener=dict_opener)
    conflict = conflicts.next()
    assert conflict == EXPECTED
    try:
        conflicts.next()
        raise Exception("Should find only one conflict")
    except StopIteration:
        pass
Ejemplo n.º 10
0
def test_detect_conflicts_rib_update():
    """Check if conflicts detection works for a conflict between rib and update files"""
    conflicts = detect_conflicts("collector", [RIB, UPDATE], opener=dict_opener)
    conflict = conflicts.next()
    assert conflict == EXPECTED
    try:
        conflicts.next()
        raise Exception("Should find only one conflict")
    except StopIteration:
        pass
Ejemplo n.º 11
0
def test_detect_conflicts_rib_only():
    """Check if conflicts detection works for a conflict within rib file"""
    rib1 = RIB
    rib2 = {
        "entries": [{
            "peer_ip": "22.44.66.88",
            "peer_as": 99999.0,
            "originated_timestamp": 1451605511.0,
            "as_path": "22 333 4444 66666"
        }],
        "type": "table_dump_v2",
        "timestamp": 1451605511.0,
        "prefix": "1.2.3.0/24"
    }
    conflicts = detect_conflicts("collector", [rib1, rib2], opener=dict_opener)
    conflict = conflicts.next()
    expected = {
        'timestamp': 1451601234.0,
        'collector': 'collector',
        'peer_as': 99999,
        'peer_ip': "11.33.55.77",
        'announce': {
            'type': 'F',
            'prefix': '1.2.3.0/24',
            'asn': 55555,
            'as_path': '22 333 4444 55555'
        },
        'conflict_with': {
            'asn': 66666,
            'prefix': '1.2.3.0/24'
        },
        'asn': 66666
    }
    assert conflict == expected
    expected = {
        'timestamp': 1451605511.0,
        'collector': 'collector',
        'peer_as': 99999,
        'peer_ip': "22.44.66.88",
        'announce': {
            'type': 'F',
            'prefix': '1.2.3.0/24',
            'asn': 66666,
            'as_path': '22 333 4444 66666'
        },
        'conflict_with': {
            'asn': 55555,
            'prefix': '1.2.3.0/24'
        },
        'asn': 55555
    }
    conflict = conflicts.next()
    assert conflict == expected
Ejemplo n.º 12
0
def test_detect_conflicts_rib_only():
    """Check if conflicts detection works for a conflict within rib file"""
    rib1 = RIB
    rib2 = {
        "entries": [{
            "peer_ip": "22.44.66.88",
            "peer_as": 99999.0,
            "originated_timestamp": 1451605511.0,
            "as_path": "22 333 4444 66666"
        }],
        "type": "table_dump_v2",
        "timestamp": 1451605511.0,
        "prefix": "1.2.3.0/24"
    }
    conflicts = detect_conflicts("collector", [rib1, rib2], opener=dict_opener)
    conflict = conflicts.next()
    expected = {
        'timestamp': 1451601234.0,
        'collector': 'collector',
        'peer_as': 99999,
        'peer_ip': "11.33.55.77",
        'announce': {
            'type': 'F',
            'prefix': '1.2.3.0/24',
            'asn': 55555,
            'as_path': '22 333 4444 55555'
        },
        'conflict_with': {
            'asn': 66666,
            'prefix': '1.2.3.0/24'
        },
        'asn': 66666
    }
    assert conflict == expected
    expected = {
        'timestamp': 1451605511.0,
        'collector': 'collector',
        'peer_as': 99999,
        'peer_ip': "22.44.66.88",
        'announce': {
            'type': 'F',
            'prefix': '1.2.3.0/24',
            'asn': 66666,
            'as_path': '22 333 4444 66666'
        },
        'conflict_with': {
            'asn': 55555,
            'prefix': '1.2.3.0/24'
        },
        'asn': 55555
    }
    conflict = conflicts.next()
    assert conflict == expected
Ejemplo n.º 13
0
        offset, = consumer.get_partition_offsets("conflicts", PARTITIONS[args.collector], -1, 1)
        consumer.set_topic_partitions({("conflicts", PARTITIONS[args.collector]): offset - 1})
        last_message = next(iter(consumer))
        last_data = json.loads(last_message.value)
        last_ts = last_data["timestamp"]
        logger.info("last detected event was at offset %s timestamp %s", offset, last_ts)
    else:
        last_ts = args.from_timestamp

    logger.info("detecting conflicts newer than %s", datetime.utcfromtimestamp(last_ts))

    start_http_server(4240 + PARTITIONS[args.collector])

    client = KafkaClient(args.our_servers.split(","))
    stats = defaultdict(int)
    for msg in detect_conflicts(**kwargs):
        ts = msg.get("timestamp", 0)
        if last_ts is not None and ts <= last_ts:
            continue

        events_latency.labels(args.collector, str(msg["peer_as"])).set((datetime.utcnow() - datetime.utcfromtimestamp(ts)).seconds)

        for enrich_func in funcs:
            enrich_func(msg)

        filter_out = False
        # skip these events that are probably legitimate
        if "valid" in msg:
            validated.labels(args.collector).inc()
            filter_out = True
        if "relation" in msg: