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
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"
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
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"
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
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'
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
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"
def connector(): return StubAPIConnector()