예제 #1
0
def test_get_active_alerts() -> None:
    # given
    create_response_payload = """
    [
        {
            "alarm_id": 82867908,
            "row_type": "Alarm",
            "alarm_state": "ALARM",
            "alert_id": 15094,
            "mitigation_id": null,
            "threshold_id": 76518,
            "alert_key": "443",
            "alert_dimension": "Port_dst",
            "alert_metric": [
                "bits"
            ],
            "alert_value": 2270.4,
            "alert_value2nd": 0,
            "alert_value3rd": 0,
            "alert_match_count": 5,
            "alert_baseline": 769,
            "alert_severity": "minor",
            "baseline_used": 15,
            "learning_mode": 0,
            "debug_mode": 0,
            "alarm_start": "2021-01-19T13:50:00.000Z",
            "alarm_end": "0000-00-00 00:00:00",
            "alarm_last_comment": null,
            "mit_alert_id": 0,
            "mit_alert_ip": "",
            "mit_threshold_id": 0,
            "mit_method_id": 0,
            "args": "",
            "id": 0,
            "policy_id": 15094,
            "policy_name": "test_policy1",
            "alert_key_lookup": "443"
        }
    ]"""
    connector = StubAPIConnector(create_response_payload, HTTPStatus.OK)
    alerting_api = AlertingAPI(connector)

    # when
    start_time = datetime(2020, 10, 15, 22, 15, 0)
    end_time = datetime(2021, 1, 20, 9, 15, 0)

    alarms = alerting_api.get_active_alerts(start_time, end_time)

    # then
    assert connector.last_url_path == (
        "/alerts-active/alarms?startTime=2020-10-15T22:15:00&"
        "endTime=2021-01-20T09:15:00&filterBy=None&filterVal=None&"
        "showMitigations=1&showAlarms=1&showMatches=0&learningMode=0")
    assert connector.last_method == APICallMethods.GET
    assert connector.last_payload is None

    assert len(alarms) == 1
    assert alarms[0].alarm_id == 82867908
    assert alarms[0].alarm_start == datetime(2021, 1, 19, 13, 50, 0, 0)
    assert alarms[0].alarm_end is None
예제 #2
0
def test_create_manual_mitigation_success() -> None:
    # given
    create_response_payload = """
    {
        "response": {
            "result": "OK"
        }
    }"""
    connector = StubAPIConnector(create_response_payload, HTTPStatus.OK)
    alerting_api = AlertingAPI(connector)

    # when
    manual_mitigation = ManualMitigation("192.168.1.0/24", "comment", "1234",
                                         "12345", "20")
    created = alerting_api.create_manual_mitigation(manual_mitigation)

    # then
    assert connector.last_url_path == "/alerts/manual-mitigate"
    assert connector.last_method == APICallMethods.POST
    assert connector.last_payload is not None
    assert connector.last_payload["ipCidr"] == "192.168.1.0/24"
    assert connector.last_payload["comment"] == "comment"
    assert connector.last_payload["platformID"] == "1234"
    assert connector.last_payload["methodID"] == "12345"
    assert connector.last_payload["minutesBeforeAutoStop"] == "20"

    assert created is True
def test_query_sql_success() -> None:
    # given
    sql_query = """
        SELECT i_start_time,
        round(sum(in_pkts)/(3600)/1000) AS f_sum_in_pkts,
        round(sum(in_bytes)/(3600)/1000)*8 AS f_sum_in_bytes
        FROM all_devices
        WHERE ctimestamp > 3660 AND ctimestamp < 60
        GROUP by i_start_time
        ORDER by i_start_time DESC
        LIMIT 1000;"""
    query_response_payload = """
    {
        "rows": [
            {
                "f_sum_in_bytes": 10,
                "f_sum_in_pkts": 20,
                "i_start_time": "2021-01-25T11:39:00Z"
            },
            {
                "f_sum_in_bytes": 50,
                "f_sum_in_pkts": 60,
                "i_start_time": "2021-01-25T11:38:00Z"
            },
            {
                "f_sum_in_bytes": 80,
                "f_sum_in_pkts": 90,
                "i_start_time": "2021-01-25T11:37:00Z"
            }
        ]
    }"""

    # when
    connector = StubAPIConnector(query_response_payload, HTTPStatus.OK)
    query_api = QueryAPI(connector)
    query = SQLQuery(query=sql_query)
    result = query_api.sql(query=query)

    # then request properly formed
    assert connector.last_url_path == "/query/sql"
    assert connector.last_method == APICallMethods.POST
    assert connector.last_payload is not None
    assert connector.last_payload["query"] == sql_query

    # and response properly parsed
    assert len(result.rows) == 3
    assert result.rows[0]["f_sum_in_bytes"] == 10
    assert result.rows[0]["f_sum_in_pkts"] == 20
    assert result.rows[0]["i_start_time"] == "2021-01-25T11:39:00Z"
    assert result.rows[1]["f_sum_in_bytes"] == 50
    assert result.rows[1]["f_sum_in_pkts"] == 60
    assert result.rows[1]["i_start_time"] == "2021-01-25T11:38:00Z"
    assert result.rows[2]["f_sum_in_bytes"] == 80
    assert result.rows[2]["f_sum_in_pkts"] == 90
    assert result.rows[2]["i_start_time"] == "2021-01-25T11:37:00Z"
예제 #4
0
def test_get_all_custom_applications_success() -> None:
    # given
    get_response_payload = """
    [
        {
            "id": 42,
            "company_id": "74333",
            "user_id": "144319",
            "name": "apitest-customapp-1",
            "description": "TESTING CUSTOM APPS 1",
            "ip_range": "192.168.0.1,192.168.0.2",
            "protocol": "6,17",
            "port": "9001,9002,9003",
            "asn": "asn1,asn2,asn3",
            "cdate": "2020-12-11T07:07:20.968Z",
            "edate": "2020-12-11T07:07:20.968Z"
        },
        {
            "id": 43,
            "company_id": "74333",
            "user_id": "144319",
            "name": "apitest-customapp-2",
            "description": "TESTING CUSTOM APPS 2",
            "ip_range": "192.168.0.3,192.168.0.4",
            "protocol": "6,17",
            "port": "9011,9012,9013",
            "asn": "asn4,asn5,asn6",
            "cdate": "2020-12-11T07:08:20.968Z",
            "edate": "2020-12-11T07:08:20.968Z"
        }
    ]"""
    connector = StubAPIConnector(get_response_payload, HTTPStatus.OK)
    custom_applications_api = CustomApplicationsAPI(connector)

    # when
    apps = custom_applications_api.get_all()

    # then request properly formed
    assert connector.last_url_path == "/customApplications"
    assert connector.last_method == APICallMethods.GET
    assert connector.last_payload is None

    # and response properly parsed
    assert len(apps) == 2
    assert apps[1].id == ID(43)
    assert apps[1].company_id == ID(74333)
    assert apps[1].user_id == ID(144319)
    assert apps[1].name == "apitest-customapp-2"
    assert apps[1].description == "TESTING CUSTOM APPS 2"
    assert apps[1].ip_range == "192.168.0.3,192.168.0.4"
    assert apps[1].protocol == "6,17"
    assert apps[1].port == "9011,9012,9013"
    assert apps[1].asn == "asn4,asn5,asn6"
    assert apps[1].created_date == "2020-12-11T07:08:20.968Z"
    assert apps[1].updated_date == "2020-12-11T07:08:20.968Z"
def test_query_url_success() -> None:
    # given
    unquoted_response = "https://portal.kentik.com/portal/#Charts/shortUrl/e0d24b3cc8dfe41f9093668e531cbe96"
    query_response_payload = f'"{unquoted_response}"'  # actual response is url in quotation marks
    connector = StubAPIConnector(query_response_payload, HTTPStatus.OK)
    query_api = QueryAPI(connector)

    # when
    query = Query(
        viz_type=ChartViewType.stackedArea,
        dimension=[DimensionType.Traffic],
        cidr=32,
        cidr6=128,
        metric=MetricType.bytes,
        topx=8,
        depth=75,
        fastData=FastDataType.auto,
        outsort="avg_bits_per_sec",
        lookback_seconds=3600,
        hostname_lookup=True,
        device_name=[],
        all_selected=True,
        descriptor="",
    )
    query_item = QueryArrayItem(query=query, bucket="Left +Y Axis")
    query_object = QueryObject(queries=[query_item])
    result = query_api.url(query_object)

    # then request properly formed
    assert connector.last_url_path == "/query/url"
    assert connector.last_method == APICallMethods.POST
    assert connector.last_payload is not None
    assert len(connector.last_payload["queries"]) == 1
    assert connector.last_payload["queries"][0]["bucket"] == "Left +Y Axis"
    query0 = connector.last_payload["queries"][0]["query"]
    assert query0["viz_type"] == "stackedArea"
    assert len(query0["dimension"]) == 1
    assert query0["dimension"][0] == "Traffic"
    assert query0["cidr"] == 32
    assert query0["cidr6"] == 128
    assert query0["metric"] == "bytes"
    assert query0["topx"] == 8
    assert query0["depth"] == 75
    assert query0["fastData"] == "Auto"
    assert query0["outsort"] == "avg_bits_per_sec"
    assert query0["lookback_seconds"] == 3600
    assert query0["hostname_lookup"] == True
    assert query0["device_name"] == []
    assert query0["all_selected"] == True
    assert "filters_obj" not in query0
    assert query0["descriptor"] == ""

    # and response properly parsed
    assert result.url == unquoted_response
예제 #6
0
def test_update_custom_application_success() -> None:
    # given
    update_response_payload = """
    {
        "id": 207,
        "company_id": "74333",
        "user_id": "144319",
        "name": "apitest-customapp-one",
        "description": "TESTING CUSTOM APPS",
        "ip_range": "192.168.5.1,192.168.5.2",
        "protocol": "6,17",
        "port": "9011,9012,9013",
        "asn": "asn1,asn2,asn3",
        "cdate": "2020-12-11T07:07:20.968Z",
        "edate": "2020-12-11T07:07:20.968Z"
    }"""
    connector = StubAPIConnector(update_response_payload, HTTPStatus.OK)
    custom_applications_api = CustomApplicationsAPI(connector)

    # when
    app_id = ID(207)
    app = CustomApplication(
        id=app_id,
        name="apitest-customapp-one",
        description="TESTING CUSTOM APPS",
        ip_range="192.168.5.1,192.168.5.2",
        port="9011,9012,9013",
    )
    updated = custom_applications_api.update(app)

    # then request properly formed
    assert connector.last_url_path == f"/customApplications/{app_id}"
    assert connector.last_method == APICallMethods.PUT
    assert connector.last_payload is not None
    assert connector.last_payload["name"] == "apitest-customapp-one"
    assert connector.last_payload["description"] == "TESTING CUSTOM APPS"
    assert connector.last_payload["ip_range"] == "192.168.5.1,192.168.5.2"
    assert connector.last_payload["port"] == "9011,9012,9013"
    assert "protocol" not in connector.last_payload
    assert "asn" not in connector.last_payload

    # and response properly parsed
    assert updated.name == "apitest-customapp-one"
    assert updated.description == "TESTING CUSTOM APPS"
    assert updated.ip_range == "192.168.5.1,192.168.5.2"
    assert updated.protocol == "6,17"
    assert updated.port == "9011,9012,9013"
    assert updated.asn == "asn1,asn2,asn3"
    assert updated.id == ID(207)
    assert updated.user_id == ID(144319)
    assert updated.company_id == ID(74333)
    assert updated.created_date == "2020-12-11T07:07:20.968Z"
    assert updated.updated_date == "2020-12-11T07:07:20.968Z"
예제 #7
0
def test_create_custom_application_success() -> None:
    # given
    create_response_payload = """
    {
        "name": "apitest-customapp-1",
        "description": "Testing custom application api",
        "ip_range": "192.168.0.1,192.168.0.2",
        "protocol": "6,17",
        "port": "9001,9002,9003",
        "asn": "asn1,asn2,asn3",
        "id": 207,
        "user_id": "144319",
        "company_id": "74333"
    }"""
    connector = StubAPIConnector(create_response_payload, HTTPStatus.OK)
    custom_applications_api = CustomApplicationsAPI(connector)

    # when
    app = CustomApplication(
        name="apitest-customapp-1",
        description="Testing custom application api",
        ip_range="192.168.0.1,192.168.0.2",
        protocol="6,17",
        port="9001,9002,9003",
        asn="asn1,asn2,asn3",
    )
    created = custom_applications_api.create(app)

    # then request properly formed
    assert connector.last_url_path == "/customApplications"
    assert connector.last_method == APICallMethods.POST
    assert connector.last_payload is not None
    assert connector.last_payload["name"] == "apitest-customapp-1"
    assert connector.last_payload[
        "description"] == "Testing custom application api"
    assert connector.last_payload["ip_range"] == "192.168.0.1,192.168.0.2"
    assert connector.last_payload["protocol"] == "6,17"
    assert connector.last_payload["port"] == "9001,9002,9003"
    assert connector.last_payload["asn"] == "asn1,asn2,asn3"

    # and response properly parsed
    assert created.name == "apitest-customapp-1"
    assert created.description == "Testing custom application api"
    assert created.ip_range == "192.168.0.1,192.168.0.2"
    assert created.protocol == "6,17"
    assert created.port == "9001,9002,9003"
    assert created.asn == "asn1,asn2,asn3"
    assert created.id == ID(207)
    assert created.user_id == ID(144319)
    assert created.company_id == ID(74333)
def test_delete_tag_success() -> None:
    # given
    delete_response_payload = ""  # deleting tag responds with empty body
    connector = StubAPIConnector(delete_response_payload,
                                 HTTPStatus.NO_CONTENT)
    tags_api = TagsAPI(connector)

    # when
    tag_id = ID(42)
    delete_successful = tags_api.delete(tag_id)

    # then request properly formed
    assert connector.last_url_path == f"/tag/{tag_id}"
    assert connector.last_method == APICallMethods.DELETE
    assert connector.last_payload is None

    # then response properly parsed
    assert delete_successful
def test_delete_custom_dimension_success() -> None:
    # given
    delete_response_payload = ""  # deleting custom dimension responds with empty body
    connector = StubAPIConnector(delete_response_payload,
                                 HTTPStatus.NO_CONTENT)
    custom_dimensions_api = CustomDimensionsAPI(connector)

    # when
    dimension_id = ID(42)
    delete_successful = custom_dimensions_api.delete(dimension_id)

    # then request properly formed
    assert connector.last_url_path == f"/customdimension/{dimension_id}"
    assert connector.last_method == APICallMethods.DELETE
    assert connector.last_payload is None

    # then response properly parsed
    assert delete_successful
def test_create_custom_dimension_success() -> None:
    # given
    create_response_payload = """
    {
        "customDimension": {
            "id": 42,
            "name": "c_testapi_dimension_1",
            "display_name": "dimension_display_name",
            "type": "string",
            "company_id": "74333",
            "populators": []
        }
    }"""
    connector = StubAPIConnector(create_response_payload, HTTPStatus.OK)
    custom_dimensions_api = CustomDimensionsAPI(connector)

    # when
    dimension = CustomDimension(
        name="c_testapi_dimension_1",
        display_name="dimension_display_name",
        type="string",
    )
    created = custom_dimensions_api.create(dimension)

    # then request properly formed
    assert connector.last_url_path == "/customdimension"
    assert connector.last_method == APICallMethods.POST
    assert connector.last_payload is not None
    assert connector.last_payload["name"] == "c_testapi_dimension_1"
    assert connector.last_payload["display_name"] == "dimension_display_name"
    assert connector.last_payload["type"] == "string"

    # and response properly parsed
    assert created.id == ID(42)
    assert created.name == "c_testapi_dimension_1"
    assert created.display_name == "dimension_display_name"
    assert created.type == "string"
    assert created.company_id == ID(74333)
    assert created.populators is not None
    assert len(created.populators) == 0
예제 #11
0
def test_get_tag_success() -> None:
    # given
    get_response_payload = """
    {
        "tag": {
            "id": 42,
            "flow_tag": "APITEST-TAG-1",
            "device_name": "192.168.5.100,device1",
            "interface_name": "interface1,interface2",
            "addr": "192.168.0.1/32,192.168.0.2/32",
            "addr_count": 2,
            "port": "9000,9001",
            "tcp_flags": "7",
            "protocol": "6,17",
            "asn": "101,102,103",
            "nexthop": "192.168.7.1/32,192.168.7.2/32",
            "nexthop_asn": "51,52,53",
            "bgp_aspath": "201,202,203",
            "bgp_community": "301,302,303",
            "user": "******",
            "created_date": "2020-12-10T11:53:48.752418Z",
            "updated_date": "2020-12-10T11:53:48.752418Z",
            "company_id": "74333",
            "device_type": "router,switch",
            "site": "site1,site2",
            "lasthop_as_name": "as1,as2,as3",
            "nexthop_as_name": "as51,as52,as53",
            "mac": "FF:FF:FF:FF:FF:FE,FF:FF:FF:FF:FF:FF",
            "mac_count": 2,
            "country": "ES,IT",
            "edited_by": "*****@*****.**",
            "vlans": "4001,4002,4003"
        }
    }"""
    connector = StubAPIConnector(get_response_payload, HTTPStatus.OK)
    tags_api = TagsAPI(connector)

    # when
    tag_id = ID(42)
    tag = tags_api.get(tag_id)

    # then request properly formed
    assert connector.last_url_path == f"/tag/{tag_id}"
    assert connector.last_method == APICallMethods.GET
    assert connector.last_payload is None

    # and response properly parsed
    assert tag.flow_tag == "APITEST-TAG-1"
    assert tag.device_name == "192.168.5.100,device1"
    assert tag.interface_name == "interface1,interface2"
    assert tag.addr == "192.168.0.1/32,192.168.0.2/32"
    assert tag.port == "9000,9001"
    assert tag.tcp_flags == "7"
    assert tag.protocol == "6,17"
    assert tag.asn == "101,102,103"
    assert tag.nexthop == "192.168.7.1/32,192.168.7.2/32"
    assert tag.nexthop_asn == "51,52,53"
    assert tag.bgp_aspath == "201,202,203"
    assert tag.bgp_community == "301,302,303"
    assert tag.device_type == "router,switch"
    assert tag.site == "site1,site2"
    assert tag.lasthop_as_name == "as1,as2,as3"
    assert tag.nexthop_as_name == "as51,as52,as53"
    assert tag.mac == "FF:FF:FF:FF:FF:FE,FF:FF:FF:FF:FF:FF"
    assert tag.country == "ES,IT"
    assert tag.vlans == "4001,4002,4003"
    assert tag.id == ID(42)
    assert tag.company_id == ID(74333)
    assert tag.addr_count == 2
    assert tag.user_id == ID(144319)
    assert tag.mac_count == 2
    assert tag.edited_by == "*****@*****.**"
    assert tag.created_date == "2020-12-10T11:53:48.752418Z"
    assert tag.updated_date == "2020-12-10T11:53:48.752418Z"
def test_update_populator_success() -> None:
    # given
    update_response_payload = """
    {
        "populator": {
            "id": 1510862280,
            "dimension_id": 24001,
            "value": "testapi-dimension-value-3",
            "direction": "SRC",
            "interface_name": "interface3",
            "addr_count": 0,
            "tcp_flags": "12",
            "protocol": "17",
            "user": "******",
            "created_date": "2020-12-15T07:55:23.911095Z",
            "updated_date": "2020-12-15T10:50:22.35787Z",
            "company_id": "74333",
            "device_type": "device-type3",
            "site": "site3",
            "mac_count": 0
        }
    }"""
    connector = StubAPIConnector(update_response_payload, HTTPStatus.OK)
    custom_dimensions_api = CustomDimensionsAPI(connector)

    # when
    populator_id = ID(1510862280)
    dimension_id = ID(24001)
    populator = Populator(
        id=populator_id,
        dimension_id=dimension_id,
        value="testapi-dimension-value-3",
        direction=Populator.Direction.SRC,
        interface_name="interface3",
        tcp_flags="12",
        protocol="17",
        device_type="device-type3",
        site="site3",
    )
    updated = custom_dimensions_api.populators.update(populator)

    # then request properly formed
    assert connector.last_url_path == f"/customdimension/{dimension_id}/populator/{populator_id}"
    assert connector.last_method == APICallMethods.PUT
    assert connector.last_payload is not None
    assert "populator" in connector.last_payload
    assert connector.last_payload["populator"][
        "value"] == "testapi-dimension-value-3"
    assert connector.last_payload["populator"]["direction"] == "SRC"
    assert connector.last_payload["populator"]["device_type"] == "device-type3"
    assert connector.last_payload["populator"]["site"] == "site3"
    assert connector.last_payload["populator"][
        "interface_name"] == "interface3"
    assert connector.last_payload["populator"]["tcp_flags"] == "12"
    assert connector.last_payload["populator"]["protocol"] == "17"
    assert "device_name" not in connector.last_payload["populator"]
    assert "addr" not in connector.last_payload["populator"]
    assert "port" not in connector.last_payload["populator"]
    assert "asn" not in connector.last_payload["populator"]
    assert "lasthop_as_name" not in connector.last_payload["populator"]
    assert "nexthop_asn" not in connector.last_payload["populator"]
    assert "nexthop_as_name" not in connector.last_payload["populator"]
    assert "nexthop" not in connector.last_payload["populator"]
    assert "bgp_aspath" not in connector.last_payload["populator"]
    assert "bgp_community" not in connector.last_payload["populator"]
    assert "mac" not in connector.last_payload["populator"]
    assert "country" not in connector.last_payload["populator"]
    assert "vlans" not in connector.last_payload["populator"]

    # and response properly parsed
    assert updated.id == ID(1510862280)
    assert updated.dimension_id == ID(24001)
    assert updated.value == "testapi-dimension-value-3"
    assert updated.direction == Populator.Direction.SRC
    assert updated.interface_name == "interface3"
    assert updated.addr_count == 0
    assert updated.tcp_flags == "12"
    assert updated.protocol == "17"
    assert updated.user == "144319"
    assert updated.created_date == "2020-12-15T07:55:23.911095Z"
    assert updated.updated_date == "2020-12-15T10:50:22.35787Z"
    assert updated.company_id == ID(74333)
    assert updated.device_type == "device-type3"
    assert updated.site == "site3"
    assert updated.mac_count == 0
def test_get_custom_dimension_success() -> None:
    # given
    get_response_payload = """
    {
        "customDimension": {
            "id": 42,
            "name": "c_testapi_dimension_1",
            "display_name": "dimension_display_name",
            "type": "string",
            "company_id": "74333",
            "populators": [
                {
                    "id": 1510871096,
                    "dimension_id": 24001,
                    "value": "testapi-dimension-value-1",
                    "direction": "DST",
                    "device_name": "128.0.0.100,device1",
                    "interface_name": "interface1,interface2",
                    "addr": "128.0.0.1/32,128.0.0.2/32",
                    "addr_count": 2,
                    "port": "1001,1002",
                    "tcp_flags": "160",
                    "protocol": "6,17",
                    "asn": "101,102",
                    "nexthop_asn": "201,202",
                    "nexthop": "128.0.200.1/32,128.0.200.2/32",
                    "bgp_aspath": "3001,3002",
                    "bgp_community": "401:499,501:599",
                    "user": "******",
                    "created_date": "2020-12-15T08:32:19.503788Z",
                    "updated_date": "2020-12-15T08:32:19.503788Z",
                    "company_id": "74333",
                    "device_type": "device-type1",
                    "site": "site1,site2,site3",
                    "lasthop_as_name": "asn101,asn102",
                    "nexthop_as_name": "asn201,asn202",
                    "mac": "FF:FF:FF:FF:FF:FA,FF:FF:FF:FF:FF:FF",
                    "mac_count": 2,
                    "country": "NL,SE",
                    "vlans": "2001,2002"
                },
                {
                    "id": 1510862280,
                    "dimension_id": 24001,
                    "value": "testapi-dimension-value-3",
                    "direction": "SRC",
                    "addr_count": 0,
                    "user": "******",
                    "created_date": "2020-12-15T07:55:23.911095Z",
                    "updated_date": "2020-12-15T11:11:30.300681Z",
                    "company_id": "74333",
                    "site": "site3",
                    "mac_count": 0
                }
            ]
        }
    }"""
    connector = StubAPIConnector(get_response_payload, HTTPStatus.OK)
    custom_dimensions_api = CustomDimensionsAPI(connector)

    # when
    dimension_id = ID(42)
    dimension = custom_dimensions_api.get(dimension_id)

    # then request properly formed
    assert connector.last_url_path == f"/customdimension/{dimension_id}"
    assert connector.last_method == APICallMethods.GET
    assert connector.last_payload is None

    # and response properly parsed
    assert dimension.id == ID(42)
    assert dimension.name == "c_testapi_dimension_1"
    assert dimension.display_name == "dimension_display_name"
    assert dimension.type == "string"
    assert dimension.company_id == ID(74333)
    assert dimension.populators is not None
    assert len(dimension.populators) == 2
    assert dimension.populators[1].id == ID(1510862280)
    assert dimension.populators[1].dimension_id == ID(24001)
    assert dimension.populators[1].value == "testapi-dimension-value-3"
    assert dimension.populators[1].direction == Populator.Direction.SRC
    assert dimension.populators[1].addr_count == 0
    assert dimension.populators[1].user == "144319"
    assert dimension.populators[
        1].created_date == "2020-12-15T07:55:23.911095Z"
    assert dimension.populators[
        1].updated_date == "2020-12-15T11:11:30.300681Z"
    assert dimension.populators[1].company_id == ID(74333)
    assert dimension.populators[1].site == "site3"
    assert dimension.populators[1].mac_count == 0
def test_create_populator_success() -> None:
    # given
    create_response_payload = """
    {
        "populator": {
            "dimension_id": 24001,
            "value": "testapi-dimension-value-1",
            "direction": "DST",
            "device_name": "128.0.0.100,device1",
            "interface_name": "interface1,interface2",
            "addr": "128.0.0.1/32,128.0.0.2/32",
            "port": "1001,1002",
            "tcp_flags": "160",
            "protocol": "6,17",
            "asn": "101,102",
            "nexthop_asn": "201,202",
            "nexthop": "128.0.200.1/32,128.0.200.2/32",
            "bgp_aspath": "3001,3002",
            "bgp_community": "401:499,501:599",
            "device_type": "device-type1",
            "site": "site1,site2,site3",
            "lasthop_as_name": "asn101,asn102",
            "nexthop_as_name": "asn201,asn202",
            "mac": "FF:FF:FF:FF:FF:FA,FF:FF:FF:FF:FF:FF",
            "country": "NL,SE",
            "vlans": "2001,2002",
            "id": 1510862280,
            "company_id": "74333",
            "user": "******",
            "mac_count": 2,
            "addr_count": 2,
            "created_date": "2020-12-15T07:55:23.911095Z",
            "updated_date": "2020-12-15T07:55:23.911095Z"
        }
    }"""
    connector = StubAPIConnector(create_response_payload, HTTPStatus.OK)
    custom_dimensions_api = CustomDimensionsAPI(connector)

    # when
    dimension_id = ID(24001)
    populator = Populator(
        dimension_id=dimension_id,
        value="testapi-dimension-value-1",
        direction=Populator.Direction.DST,
        device_name="device1,128.0.0.100",
        interface_name="interface1,interface2",
        addr="128.0.0.1/32,128.0.0.2/32",
        port="1001,1002",
        tcp_flags="160",
        protocol="6,17",
        asn="101,102",
        nexthop_asn="201,202",
        nexthop="128.0.200.1/32,128.0.200.2/32",
        bgp_aspath="3001,3002",
        bgp_community="401:499,501:599",
        device_type="device-type1",
        site="site1,site2,site3",
        lasthop_as_name="asn101,asn102",
        nexthop_as_name="asn201,asn202",
        mac="FF:FF:FF:FF:FF:FA,FF:FF:FF:FF:FF:FF",
        country="NL,SE",
        vlans="2001,2002",
    )
    created = custom_dimensions_api.populators.create(populator)

    # then request properly formed
    assert connector.last_url_path == f"/customdimension/{dimension_id}/populator"
    assert connector.last_method == APICallMethods.POST
    assert connector.last_payload is not None
    assert "populator" in connector.last_payload
    assert connector.last_payload["populator"][
        "value"] == "testapi-dimension-value-1"
    assert connector.last_payload["populator"]["direction"] == "DST"
    assert connector.last_payload["populator"][
        "device_name"] == "device1,128.0.0.100"
    assert connector.last_payload["populator"]["device_type"] == "device-type1"
    assert connector.last_payload["populator"]["site"] == "site1,site2,site3"
    assert connector.last_payload["populator"][
        "interface_name"] == "interface1,interface2"
    assert connector.last_payload["populator"][
        "addr"] == "128.0.0.1/32,128.0.0.2/32"
    assert connector.last_payload["populator"]["port"] == "1001,1002"
    assert connector.last_payload["populator"]["tcp_flags"] == "160"
    assert connector.last_payload["populator"]["protocol"] == "6,17"
    assert connector.last_payload["populator"]["asn"] == "101,102"
    assert connector.last_payload["populator"][
        "lasthop_as_name"] == "asn101,asn102"
    assert connector.last_payload["populator"]["nexthop_asn"] == "201,202"
    assert connector.last_payload["populator"][
        "nexthop_as_name"] == "asn201,asn202"
    assert connector.last_payload["populator"][
        "nexthop"] == "128.0.200.1/32,128.0.200.2/32"
    assert connector.last_payload["populator"]["bgp_aspath"] == "3001,3002"
    assert connector.last_payload["populator"][
        "bgp_community"] == "401:499,501:599"
    assert connector.last_payload["populator"][
        "mac"] == "FF:FF:FF:FF:FF:FA,FF:FF:FF:FF:FF:FF"
    assert connector.last_payload["populator"]["country"] == "NL,SE"
    assert connector.last_payload["populator"]["vlans"] == "2001,2002"

    # and response properly parsed
    assert created.dimension_id == ID(24001)
    assert created.value == "testapi-dimension-value-1"
    assert created.direction == Populator.Direction.DST
    assert created.device_name == "128.0.0.100,device1"
    assert created.interface_name == "interface1,interface2"
    assert created.addr == "128.0.0.1/32,128.0.0.2/32"
    assert created.port == "1001,1002"
    assert created.tcp_flags == "160"
    assert created.protocol == "6,17"
    assert created.asn == "101,102"
    assert created.nexthop_asn == "201,202"
    assert created.nexthop == "128.0.200.1/32,128.0.200.2/32"
    assert created.bgp_aspath == "3001,3002"
    assert created.bgp_community == "401:499,501:599"
    assert created.device_type == "device-type1"
    assert created.site == "site1,site2,site3"
    assert created.lasthop_as_name == "asn101,asn102"
    assert created.nexthop_as_name == "asn201,asn202"
    assert created.mac == "FF:FF:FF:FF:FF:FA,FF:FF:FF:FF:FF:FF"
    assert created.country == "NL,SE"
    assert created.vlans == "2001,2002"
    assert created.id == ID(1510862280)
    assert created.company_id == ID(74333)
    assert created.user == "144319"
    assert created.mac_count == 2
    assert created.addr_count == 2
    assert created.created_date == "2020-12-15T07:55:23.911095Z"
    assert created.updated_date == "2020-12-15T07:55:23.911095Z"
def test_get_all_custom_dimensions_success() -> None:
    # given
    get_response_payload = """
    {
        "customDimensions": [
            {
                "id": 42,
                "name": "c_testapi_dimension_1",
                "display_name": "dimension_display_name1",
                "type": "string",
                "populators": [],
                "company_id": "74333"
            },
            {
                "id": 43,
                "name": "c_testapi_dimension_2",
                "display_name": "dimension_display_name2",
                "type": "uint32",
                "company_id": "74334",
                "populators": [
                    {
                        "id": 1510862280,
                        "dimension_id": 24001,
                        "value": "testapi-dimension-value-3",
                        "device_type": "device-type3",
                        "direction": "SRC",
                        "interface_name": "interface3",
                        "addr_count": 0,
                        "user": "******",
                        "created_date": "2020-12-15T07:55:23.911095Z",
                        "updated_date": "2020-12-15T10:50:22.35787Z",
                        "company_id": "74333",
                        "site": "site3",
                        "mac_count": 0
                    }
                ]
            }
        ]
    }"""
    connector = StubAPIConnector(get_response_payload, HTTPStatus.OK)
    custom_dimensions_api = CustomDimensionsAPI(connector)

    # when
    dimensions = custom_dimensions_api.get_all()

    # then request properly formed
    assert connector.last_url_path == "/customdimensions"
    assert connector.last_method == APICallMethods.GET
    assert connector.last_payload is None

    # and response properly parsed
    assert len(dimensions) == 2
    assert dimensions[1].id == ID(43)
    assert dimensions[1].name == "c_testapi_dimension_2"
    assert dimensions[1].display_name == "dimension_display_name2"
    assert dimensions[1].type == "uint32"
    assert dimensions[1].company_id == ID(74334)
    assert dimensions[1].populators is not None
    assert len(dimensions[1].populators) == 1
    assert dimensions[1].populators[0].id == ID(1510862280)
    assert dimensions[1].populators[0].dimension_id == ID(24001)
    assert dimensions[1].populators[0].value == "testapi-dimension-value-3"
    assert dimensions[1].populators[0].direction == Populator.Direction.SRC
    assert dimensions[1].populators[0].interface_name == "interface3"
    assert dimensions[1].populators[0].addr_count == 0
    assert dimensions[1].populators[0].user == "144319"
    assert dimensions[1].populators[
        0].created_date == "2020-12-15T07:55:23.911095Z"
    assert dimensions[1].populators[
        0].updated_date == "2020-12-15T10:50:22.35787Z"
    assert dimensions[1].populators[0].company_id == ID(74333)
    assert dimensions[1].populators[0].device_type == "device-type3"
    assert dimensions[1].populators[0].site == "site3"
    assert dimensions[1].populators[0].mac_count == 0
def test_query_chart_success() -> None:
    # given
    query_response_payload = """{"dataUri": "data:image/png;base64,ImageDataEncodedBase64=="}"""
    connector = StubAPIConnector(query_response_payload, HTTPStatus.OK)
    query_api = QueryAPI(connector)

    # when
    agg1 = Aggregate(name="avg_bits_per_sec",
                     column="f_sum_both_bytes",
                     fn=AggregateFunctionType.average,
                     raw=True)
    agg2 = Aggregate(name="p95th_bits_per_sec",
                     column="f_sum_both_bytes",
                     fn=AggregateFunctionType.percentile,
                     rank=95)
    agg3 = Aggregate(name="max_bits_per_sec",
                     column="f_sum_both_bytes",
                     fn=AggregateFunctionType.max)
    filter_ = Filter(filterField="dst_as", operator="=", filterValue="")
    filter_group = FilterGroups(connector="All", not_=False, filters=[filter_])
    filters = Filters(connector="", filterGroups=[filter_group])
    query = Query(
        viz_type=ChartViewType.stackedArea,
        show_overlay=False,
        overlay_day=-7,
        sync_axes=False,
        query_title="title",
        dimension=[DimensionType.Traffic],
        cidr=32,
        cidr6=128,
        metric=MetricType.bytes,
        topx=8,
        depth=75,
        fastData=FastDataType.auto,
        outsort="avg_bits_per_sec",
        lookback_seconds=0,
        starting_time="2020-10-20 10:15:00",
        ending_time="2020-10-21 10:15:00",
        hostname_lookup=False,
        device_name=["dev1", "dev2"],
        all_selected=False,
        filters_obj=filters,
        saved_filters=[],
        matrixBy=[
            DimensionType.src_geo_city.value, DimensionType.dst_geo_city.value
        ],
        pps_threshold=1,
        time_format=TimeFormat.local,
        descriptor="descriptor",
        aggregates=[agg1, agg2, agg3],
    )
    query_item = QueryArrayItem(query=query,
                                bucket="Left +Y Axis",
                                isOverlay=False)
    query_object = QueryObject(queries=[query_item], imageType=ImageType.png)
    result = query_api.chart(query_object)

    # then request properly formed
    assert connector.last_url_path == "/query/topXchart"
    assert connector.last_method == APICallMethods.POST
    assert connector.last_payload is not None
    assert len(connector.last_payload["queries"]) == 1
    assert connector.last_payload["queries"][0]["bucket"] == "Left +Y Axis"
    query0 = connector.last_payload["queries"][0]["query"]
    assert query0["viz_type"] == "stackedArea"
    assert query0["show_overlay"] == False
    assert query0["overlay_day"] == -7
    assert query0["sync_axes"] == False
    assert query0["query_title"] == "title"
    assert len(query0["dimension"]) == 1
    assert query0["dimension"][0] == "Traffic"
    assert query0["cidr"] == 32
    assert query0["cidr6"] == 128
    assert query0["metric"] == "bytes"
    assert query0["topx"] == 8
    assert query0["depth"] == 75
    assert query0["fastData"] == "Auto"
    assert query0["outsort"] == "avg_bits_per_sec"
    assert query0["lookback_seconds"] == 0
    assert query0["starting_time"] == "2020-10-20 10:15:00"
    assert query0["ending_time"] == "2020-10-21 10:15:00"
    assert query0["hostname_lookup"] == False
    assert query0["device_name"] == ["dev1", "dev2"]
    assert query0["all_selected"] == False
    assert len(query0["filters_obj"]["filterGroups"]) == 1
    assert query0["filters_obj"]["filterGroups"][0]["connector"] == "All"
    assert query0["filters_obj"]["filterGroups"][0]["not"] == False
    assert len(query0["filters_obj"]["filterGroups"][0]["filters"]) == 1
    assert query0["filters_obj"]["filterGroups"][0]["filters"][0][
        "filterField"] == "dst_as"
    assert query0["filters_obj"]["filterGroups"][0]["filters"][0][
        "operator"] == "="
    assert query0["filters_obj"]["filterGroups"][0]["filters"][0][
        "filterValue"] == ""
    assert query0["saved_filters"] == []
    assert query0["matrixBy"] == ["src_geo_city", "dst_geo_city"]
    assert query0["pps_threshold"] == 1
    assert query0["time_format"] == "Local"
    assert query0["descriptor"] == "descriptor"
    assert len(query0["aggregates"]) == 3
    assert query0["aggregates"][0]["name"] == "avg_bits_per_sec"
    assert query0["aggregates"][0]["column"] == "f_sum_both_bytes"
    assert query0["aggregates"][0]["fn"] == "average"
    assert query0["aggregates"][0]["raw"] == True
    assert query0["aggregates"][1]["name"] == "p95th_bits_per_sec"
    assert query0["aggregates"][1]["column"] == "f_sum_both_bytes"
    assert query0["aggregates"][1]["fn"] == "percentile"
    assert query0["aggregates"][1]["rank"] == 95
    assert query0["aggregates"][2]["name"] == "max_bits_per_sec"
    assert query0["aggregates"][2]["column"] == "f_sum_both_bytes"
    assert query0["aggregates"][2]["fn"] == "max"

    # and response properly parsed
    assert result.image_type == ImageType.png
    assert result.image_data == b'"f\xa0x6\xadhI\xdc\xa1\xd7\x9d\x05\xab\x1e\xeb'
예제 #17
0
def test_get_all_tags_success() -> None:
    # given
    get_response_payload = """
    {
        "tags": [
            {
                "id": 42,
                "flow_tag": "APITEST-TAG-1",
                "device_name": "device1",
                "interface_name": "interface1",
                "addr": "192.168.0.1/32,192.168.0.2/32",
                "addr_count": 2,
                "port": "9000",
                "tcp_flags": "7",
                "protocol": "12",
                "asn": "101,102,103",
                "nexthop": "192.168.7.1/32,192.168.7.2/32",
                "nexthop_asn": "51,52,53",
                "bgp_aspath": "201,202,203",
                "bgp_community": "301,302,303",
                "user": "******",
                "created_date": "2020-12-10T11:39:44.233335Z",
                "updated_date": "2020-12-10T11:39:44.233335Z",
                "company_id": "74333",
                "device_type": "router",
                "site": "site1",
                "lasthop_as_name": "as1,as2,as3",
                "nexthop_as_name": "as51,as52,as53",
                "mac": "FF:FF:FF:FF:FF:FE,FF:FF:FF:FF:FF:FF",
                "mac_count": 2,
                "country": "ES,IT",
                "edited_by": "*****@*****.**",
                "vlans": "4001,4002,4003"
            },
            {
                "id": 43,
                "flow_tag": "APITEST-TAG-2",
                "device_name": "device2",
                "interface_name": "interface1",
                "addr": "192.168.2.1/32,192.168.2.2/32",
                "addr_count": 2,
                "port": "9002",
                "tcp_flags": "2",
                "protocol": "2",
                "asn": "101,102,103",
                "nexthop": "192.168.7.1/32,192.168.7.2/32",
                "nexthop_asn": "51,52,53",
                "bgp_aspath": "201,202,203",
                "bgp_community": "301,302,303",
                "user": "******",
                "created_date": "2020-12-10T11:39:44.233335Z",
                "updated_date": "2020-12-10T11:39:44.233335Z",
                "company_id": "74333",
                "device_type": "router",
                "site": "site1",
                "lasthop_as_name": "as1,as2,as3",
                "nexthop_as_name": "as51,as52,as53",
                "mac": "FF:FF:FF:FF:FF:FE,FF:FF:FF:FF:FF:FF",
                "mac_count": 2,
                "country": "ES,IT",
                "edited_by": "*****@*****.**",
                "vlans": "4001,4002,4003"
            }
        ]
    }"""
    connector = StubAPIConnector(get_response_payload, HTTPStatus.OK)
    tags_api = TagsAPI(connector)

    # when
    tags = tags_api.get_all()

    # then request properly formed
    assert connector.last_url_path == "/tags"
    assert connector.last_method == APICallMethods.GET
    assert connector.last_payload is None

    # and response properly parsed
    assert len(tags) == 2
def test_query_data_success() -> None:
    # given
    query_response_payload = """
    {
        "results": [
            {
                "bucket": "Left +Y Axis",
                "data": [
                    {
                        "key": "Total",
                        "avg_bits_per_sec": 19738.220765027323,
                        "p95th_bits_per_sec": 22745.466666666667,
                        "max_bits_per_sec": 25902.533333333333,
                        "name": "Total",
                        "timeSeries": {
                            "both_bits_per_sec": {
                                "flow": [
                                    [
                                        1608538980000,
                                        20751.333333333332,
                                        60
                                    ],
                                    [
                                        1608539040000,
                                        16364.133333333333,
                                        60
                                    ],
                                    [
                                        1608539100000,
                                        19316.933333333334,
                                        60
                                    ]
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }"""
    connector = StubAPIConnector(query_response_payload, HTTPStatus.OK)
    query_api = QueryAPI(connector)

    # when
    agg1 = Aggregate(name="avg_bits_per_sec",
                     column="f_sum_both_bytes",
                     fn=AggregateFunctionType.average,
                     raw=True)
    agg2 = Aggregate(name="p95th_bits_per_sec",
                     column="f_sum_both_bytes",
                     fn=AggregateFunctionType.percentile,
                     rank=95)
    agg3 = Aggregate(name="max_bits_per_sec",
                     column="f_sum_both_bytes",
                     fn=AggregateFunctionType.max)
    query = Query(
        dimension=[DimensionType.Traffic],
        cidr=32,
        cidr6=128,
        metric=MetricType.bytes,
        topx=8,
        depth=75,
        fastData=FastDataType.auto,
        outsort="avg_bits_per_sec",
        lookback_seconds=3600,
        hostname_lookup=True,
        all_selected=True,
        aggregates=[agg1, agg2, agg3],
    )
    query_item = QueryArrayItem(query=query, bucket="Left +Y Axis")
    query_object = QueryObject(queries=[query_item])
    result = query_api.data(query_object)

    # then request properly formed
    assert connector.last_url_path == "/query/topXdata"
    assert connector.last_method == APICallMethods.POST
    assert connector.last_payload is not None
    assert len(connector.last_payload["queries"]) == 1
    assert connector.last_payload["queries"][0]["bucket"] == "Left +Y Axis"
    query0 = connector.last_payload["queries"][0]["query"]
    assert len(query0["dimension"]) == 1
    assert query0["dimension"][0] == "Traffic"
    assert query0["cidr"] == 32
    assert query0["cidr6"] == 128
    assert query0["metric"] == "bytes"
    assert query0["topx"] == 8
    assert query0["depth"] == 75
    assert query0["fastData"] == "Auto"
    assert query0["outsort"] == "avg_bits_per_sec"
    assert query0["lookback_seconds"] == 3600
    assert query0["hostname_lookup"] == True
    assert query0["device_name"] == []
    assert query0["all_selected"] == True
    assert query0["descriptor"] == ""
    assert len(query0["aggregates"]) == 3
    assert query0["aggregates"][0]["name"] == "avg_bits_per_sec"
    assert query0["aggregates"][0]["column"] == "f_sum_both_bytes"
    assert query0["aggregates"][0]["fn"] == "average"
    assert query0["aggregates"][0]["raw"] == True
    assert query0["aggregates"][1]["name"] == "p95th_bits_per_sec"
    assert query0["aggregates"][1]["column"] == "f_sum_both_bytes"
    assert query0["aggregates"][1]["fn"] == "percentile"
    assert query0["aggregates"][1]["rank"] == 95
    assert query0["aggregates"][2]["name"] == "max_bits_per_sec"
    assert query0["aggregates"][2]["column"] == "f_sum_both_bytes"
    assert query0["aggregates"][2]["fn"] == "max"

    # and response properly parsed
    assert len(result.results) == 1
    assert result.results[0]["bucket"] == "Left +Y Axis"
    assert result.results[0]["data"] is not None
예제 #19
0
def test_create_tag_success() -> None:
    # given
    create_response_payload = """
    {
        "tag": {
            "id": 42,
            "flow_tag": "APITEST-TAG-1",
            "device_name": "192.168.5.100,device1",
            "interface_name": "interface1,interface2",
            "addr": "192.168.0.1/32,192.168.0.2/32",
            "addr_count": 2,
            "port": "9000,9001",
            "tcp_flags": "7",
            "protocol": "6,17",
            "asn": "101,102,103",
            "nexthop": "192.168.7.1/32,192.168.7.2/32",
            "nexthop_asn": "51,52,53",
            "bgp_aspath": "201,202,203",
            "bgp_community": "301,302,303",
            "user": "******",
            "created_date": "2020-12-10T11:53:48.752418Z",
            "updated_date": "2020-12-10T11:53:48.752418Z",
            "company_id": "74333",
            "device_type": "router,switch",
            "site": "site1,site2",
            "lasthop_as_name": "as1,as2,as3",
            "nexthop_as_name": "as51,as52,as53",
            "mac": "FF:FF:FF:FF:FF:FE,FF:FF:FF:FF:FF:FF",
            "mac_count": 2,
            "country": "ES,IT",
            "edited_by": "*****@*****.**",
            "vlans": "4001,4002,4003"
        }
    }"""
    connector = StubAPIConnector(create_response_payload, HTTPStatus.CREATED)
    tags_api = TagsAPI(connector)

    # when
    tag = Tag(
        flow_tag="APITEST-TAG-1",
        device_name="device1,192.168.5.100",
        device_type="router,switch",
        site="site1,site2",
        interface_name="interface1,interface2",
        addr="192.168.0.1,192.168.0.2",
        port="9000,9001",
        tcp_flags="7",
        protocol="6,17",
        asn="101,102,103",
        lasthop_as_name="as1,as2,as3",
        nexthop_asn="51,52,53",
        nexthop_as_name="as51,as52,as53",
        nexthop="192.168.7.1,192.168.7.2",
        bgp_aspath="201,202,203",
        bgp_community="301,302,303",
        mac="FF:FF:FF:FF:FF:FE,FF:FF:FF:FF:FF:FF",
        country="ES,IT",
        vlans="4001,4002,4003",
    )
    created = tags_api.create(tag)

    # then request properly formed
    assert connector.last_url_path == "/tag"
    assert connector.last_method == APICallMethods.POST
    assert connector.last_payload is not None
    assert "tag" in connector.last_payload
    assert connector.last_payload["tag"]["flow_tag"] == "APITEST-TAG-1"
    assert connector.last_payload["tag"][
        "device_name"] == "device1,192.168.5.100"
    assert connector.last_payload["tag"]["device_type"] == "router,switch"
    assert connector.last_payload["tag"]["site"] == "site1,site2"
    assert connector.last_payload["tag"][
        "interface_name"] == "interface1,interface2"
    assert connector.last_payload["tag"]["addr"] == "192.168.0.1,192.168.0.2"
    assert connector.last_payload["tag"]["port"] == "9000,9001"
    assert connector.last_payload["tag"]["tcp_flags"] == "7"
    assert connector.last_payload["tag"]["protocol"] == "6,17"
    assert connector.last_payload["tag"]["asn"] == "101,102,103"
    assert connector.last_payload["tag"]["lasthop_as_name"] == "as1,as2,as3"
    assert connector.last_payload["tag"]["nexthop_asn"] == "51,52,53"
    assert connector.last_payload["tag"]["nexthop_as_name"] == "as51,as52,as53"
    assert connector.last_payload["tag"][
        "nexthop"] == "192.168.7.1,192.168.7.2"
    assert connector.last_payload["tag"]["bgp_aspath"] == "201,202,203"
    assert connector.last_payload["tag"]["bgp_community"] == "301,302,303"
    assert connector.last_payload["tag"][
        "mac"] == "FF:FF:FF:FF:FF:FE,FF:FF:FF:FF:FF:FF"
    assert connector.last_payload["tag"]["country"] == "ES,IT"
    assert connector.last_payload["tag"]["vlans"] == "4001,4002,4003"

    # and response properly parsed
    assert created.flow_tag == "APITEST-TAG-1"
    assert created.device_name == "192.168.5.100,device1"
    assert created.interface_name == "interface1,interface2"
    assert created.addr == "192.168.0.1/32,192.168.0.2/32"
    assert created.port == "9000,9001"
    assert created.tcp_flags == "7"
    assert created.protocol == "6,17"
    assert created.asn == "101,102,103"
    assert created.nexthop == "192.168.7.1/32,192.168.7.2/32"
    assert created.nexthop_asn == "51,52,53"
    assert created.bgp_aspath == "201,202,203"
    assert created.bgp_community == "301,302,303"
    assert created.device_type == "router,switch"
    assert created.site == "site1,site2"
    assert created.lasthop_as_name == "as1,as2,as3"
    assert created.nexthop_as_name == "as51,as52,as53"
    assert created.mac == "FF:FF:FF:FF:FF:FE,FF:FF:FF:FF:FF:FF"
    assert created.country == "ES,IT"
    assert created.vlans == "4001,4002,4003"
    assert created.id == ID(42)
    assert created.company_id == ID(74333)
    assert created.addr_count == 2
    assert created.user_id == ID(144319)
    assert created.mac_count == 2
    assert created.edited_by == "*****@*****.**"
    assert created.created_date == "2020-12-10T11:53:48.752418Z"
    assert created.updated_date == "2020-12-10T11:53:48.752418Z"
예제 #20
0
def connector():
    return StubAPIConnector()