Asimily Insight
Integrate Asimily Insight to ingest security anomalies, CVEs, and leverage detailed asset data for streamlined incident investigation.
Network Security · Asimily Insight
Details
| ID | Asimily Insight |
|---|---|
| Provider | Asimily |
| Category | Network Security |
| From Version | 6.10.0 |
| Docker Image | demisto/python3:3.12.13.10116658 |
README
Integrate Asimily Insight to ingest security anomalies, CVEs, and leverage detailed asset data for streamlined incident investigation.
Asimily Insight delivers comprehensive IoT/OT security and management by providing deep asset visibility, automated vulnerability prioritization, and actionable mitigation strategies aligned with MITRE ATT&CK. It analyzes device communication, calculates holistic risk scores, and enables targeted network segmentation. The platform detects anomalies, simplifies policy management, and automates forensic packet capture. Beyond security, Asimily optimizes asset utilization, tracks operational usage, and manages configuration drift. Its Risk Simulator improves efficiency, and centralized data streamlines IT/OT convergence while identifying unmanaged devices.
This integration utilizes the Asimily Insight RESTful APIs to provide seamless access to comprehensive device data. Users can retrieve detailed information on IT, medical, and security parameters, as well as view known vulnerabilities (CVEs), detect asset anomalies, and maintain synchronized data—either on a regular schedule or on demand.
What does this pack do?
- On-Demand Asset Retrieval: Query Asimily Insight for detailed device information using search parameters, such as IP address, MAC address, facility, or device ID.
- Anomaly Alert Synchronization: Regularly sync alerts generated by Asimily Insight to ensure up-to-date visibility into device-related security and operational events.
- Vulnerability (CVE) Synchronization: Periodically retrieve and update known device vulnerabilities detected by Asimily Insight to support informed risk management and mitigation.
- Incident Creation in Cortex XSOAR: All synced data—whether alerts, or vulnerabilities is automatically converted into incidents within the Cortex XSOAR platform for streamlined investigation and response workflows. Asset info can be automatically queried and stored by using Playbook to call the
asimily-get-asset-detailscommand.
Configure Asimily Insight on Cortex XSOAR
- Navigate to Settings > Integrations > Servers & Services.
- Search for Asimily Insight.
-
Click Add instance to create and configure a new integration instance.
Parameter Description Required/Default Type Name XSOAR Integration Instance Name True String Asimily Portal URL This will be in the following format: https://customer-portal.asimily.com.True String API User Name The Asimily Insight API username True String Password The password of the Asimily Insight API user True String Trust any certificate (not secure) Default False Boolean Use system proxy settings Default False Boolean Device Family Filter for Fetch Operation Fetch incidents only for assets with selected device families in fetch-incidents “All” Multi-Select Device Tags Filter for Fetch Operation Fetch incidents only for assets with selected device tags in fetch-incidents “All” Multi-Select Fetch Anomaly Alerts If fetch anomalies incidents in fetch-incidents Default False Boolean Fetch Anomaly Criticality Fetch anomaly incidents only for anomalies with selected criticality “High Only” Single-Select Fetch Device CVEs If fetch CVEs incidents in fetch-incidents Default False Boolean Fetch CVE Score Fetch CVEs incidents only for CVEs with selected scores “High Only” Single-Select Incidents Fetch Interval The default 5-minute fetch interval can be adjusted based on observed fetch duration to optimize data freshness and system load. 5 Number Fetches incidents If Fetch incidents False Boolean - Click Test to validate the URL, API username, API password and connection.
Resetting the “Last Run” Timestamp
If you modify any of the fetch filters (Fetch Anomaly Alerts, Fetch Device CVEs, Device Family Filter, Device Tags Filter, Fetch Anomaly Criticality, Fetch CVE Score), this means there may be new devices included to fetch incidents or there will be new incidents included for existing devices. It is strongly recommended to Reset the “last run” timestamp.
To reset:
- Go to the integration instance configuration.
- Navigate to Collect > Advanced Settings.
- Click Reset the “last run” timestamp.
- Click Reset Now.
This ensures that incidents related to newly included devices and updated filters are correctly fetched.

Configure Pre-Process Rules
The integration pulls in assets information, anomaly alerts, CVEs from Asimily Insight based on its updates or upon query, creating the need for a preprocessing rule that drops the incoming incident if it’s a duplication.
Follow the guidelines below to configure the preprocessing rule.
- Navigate to Settings > Object Setup > Incidents > Pre-Process Rules.
- Click +New Rule on the top right corner.
- Name the rule appropriately (e.g. Asimily Incident Dedup).
- In the Conditions for Incoming Incident section, enter:
- Type - Includes - Asimily
- In the Action section, select Run a script.
- In the Choose a script section, pick from the drop-down list:
- PreProcessAsimilyDedup
The configuration of the preprocessing rule is optional, but highly recommended to avoid duplication.

The integration includes a preprocessing script (PreProcessAsimilyDedup) that will drop the incoming incident if it’s a duplicate. It will search all past incidents with all status.
Alternative rule settings can be:
- In the Action section, select Drop and update.
- In the Update section, enter
- Link to - Oldest incident - Created within the last - Your desired timeframe
- DbotMirrorId - Is identical (Incoming Incident) - to incoming incident
Commands
You can run these commands from the Cortex XSOAR CLI, as part of an automation, or within a playbook.
Upon successful execution, a DBot message will appear in the War Room with execution details.
If asset data, anomaly alerts, or CVE information is retrieved, corresponding incidents will be automatically created with appropriate incident types.
asimily-get-asset-details
Fetch assets details from Asimily Insight. You can add argument filters.
Base Command
asimily-get-asset-details
Input
| Argument | Description | Required | Support List |
|---|---|---|---|
| mac_addr | The MAC Address of Asimily Asset | Optional | No |
| ip_addr | The IP Address of Asimily Asset | Optional | No |
| facility | The Facility of Asimily Asset | Optional | No |
| asimily_device_id | Asimily Insight given ID for devices | Optional | No |
| limit | Maximum amount of items to fetch. | Optional | No |
Context Output
Fetched
${fetch_limit}out of${device_count}assets matching search. Asset fetch count is limited to avoid server overload.
| Path | Type | Description |
|---|---|---|
| AsimilyInsight.Asset.asimilydeviceid | number | Asimily Device ID |
| AsimilyInsight.Asset.asimilydeviceipv4address | unknown | Asimily Device IP Address |
| AsimilyInsight.Asset.asimilydevicemacaddress | string | Asimily Device MAC Address |
| AsimilyInsight.Asset.asimilydeviceipv6address | unknown | Asimily Device IPV6 Address |
| AsimilyInsight.Asset.asimilydevicemanufacturer | string | Asimily Device Manufacturer |
| AsimilyInsight.Asset.asimilydevicemodel | string | Asimily Device Model |
| AsimilyInsight.Asset.asimilydeviceos | string | Asimily Device OS |
| AsimilyInsight.Asset.asimilydeviceosversion | string | Asimily Device OS Version |
| AsimilyInsight.Asset.asimilydevicetype | string | Asimily Device Type |
| AsimilyInsight.Asset.asimilydevicefamilies | unknown | Asimily Device Families |
| AsimilyInsight.Asset.asimilydeviceserialnumber | string | Asimily Device Serial Number |
| AsimilyInsight.Asset.asimilydevicedepartment | string | Asimily Device Department |
| AsimilyInsight.Asset.asimilydevicefacility | string | Asimily Device Facility |
| AsimilyInsight.Asset.asimilydevicehardwarearchitecture | string | Asimily Device Hardware Architecture |
| AsimilyInsight.Asset.asimilydevicehostname | string | Asimily Device Host Name |
| AsimilyInsight.Asset.asimilydevicelocation | string | Asimily Device Location |
| AsimilyInsight.Asset.asimilydeviceregion | string | Asimily Device Region |
| AsimilyInsight.Asset.asimilydevicesoftwareverison | string | Asimily Device Software Verison |
| AsimilyInsight.Asset.asimilydeviceifstoreephi | boolean | Asimily Device If Store Ephi |
| AsimilyInsight.Asset.asimilydeviceiftransmitephi | boolean | Asimily Device If Transmit Ephi |
| AsimilyInsight.Asset.asimilydeviceriskscore | number | Asimily Device Risk Score |
| AsimilyInsight.Asset.asimilydevicelikelihood | number | Asimily Device Likelihood |
| AsimilyInsight.Asset.asimilydeviceimpact | number | Asimily Device Impact |
| AsimilyInsight.Asset.asimilydeviceaverageutilizationpercent | number | Asimily Device Average Utilization Percent |
| AsimilyInsight.Asset.asimilydeviceuptime | number | Asimily Device Up Time |
| AsimilyInsight.Asset.asimilydeviceisconnected | boolean | Asimily Device Is Connected |
| AsimilyInsight.Asset.asimilydeviceiscurrentlyinuse | boolean | Asimily Device Is Currently In Use |
| AsimilyInsight.Asset.asimilydeviceisnetworkingdevice | boolean | ‘Asimily Device Is Networking Device ‘ |
| AsimilyInsight.Asset.asimilydeviceiswireless | boolean | Asimily Device Is Wireless |
| AsimilyInsight.Asset.asimilydeviceclass | string | Asimily Device Class |
| AsimilyInsight.Asset.asimilydevicemanagedby | string | Asimily Device Managed By |
| AsimilyInsight.Asset.asimilydeviceanomalypresent | boolean | Asimily Device Anomaly Present |
| AsimilyInsight.Asset.asimilydevicemds2 | string | Asimily Device MDS2 |
| AsimilyInsight.Asset.asimilydevicecmmsid | string | Asimily Device CMMS ID |
| AsimilyInsight.Asset.asimilydevicelastdiscoveredtime | date | Asimily Device Last Discovered Time |
| AsimilyInsight.Asset.asimilydevicetag | unknown | Asimily Device Tag |
| AsimilyInsight.Asset.asimilydevicemasterfamily | string | Asimily Device Master Family |
| AsimilyInsight.Asset.asimilydevicediscoverysource | string | Asimily Device Discovery Source |
| AsimilyInsight.Asset.asimilydeviceapplications | unknown | Asimily Device Applications |
| AsimilyInsight.Asset.asimilydeviceurl | string | Asimily Device URL |
| AsimilyInsight.Asset.asimilydeviceifusingendpointsecurity | boolean | Asimily Device If Using Endpoint Security |
asimily-get-asset-anomalies
Fetch anomaly alerts from Asimily Insight. You can add argument filters.
Base Command
asimily-get-asset-anomalies
Input
| Argument Name | Description | Required | Support List |
|---|---|---|---|
| mac_addr | The MAC Address of Asimily Asset | Optional | No |
| ip_addr | The IP Address of Asimily Asset | Optional | No |
| asimily_device_id | Asimily Insight given ID for devices | Optional | No |
| device_family | Optional | Yes | |
| device_tag | Optional | Yes | |
| criticality | Anomaly Alert Criticality Filter. Options: High Only, Medium and High, All | Optional | No |
| limit | Maximum amount of items to fetch. (Fetch will stop after device anomalies reached the limit) | Optional | No |
Context Output
Fetched
${fetch_count}anomalies for${fetch_device_count}devices matching search.
${pending_device_count}devices matching search is not fetched. Fetch count is limited to avoid server overload.
| Path | Type | Description |
|---|---|---|
| AsimilyInsight.Anomaly.asimilyanomalyname | string | Asimily Anomaly Name |
| AsimilyInsight.Anomaly.asimilyanomalycriticality | string | Asimily Anomaly Criticality |
| AsimilyInsight.Anomaly.asimilyanomalyearliesttriggertime | date | Asimily Anomaly Earliest Trigger Time |
| AsimilyInsight.Anomaly.asimilyanomalylasttriggertime | date | Asimily Anomaly Last Trigger Time |
| AsimilyInsight.Anomaly.asimilyanomalyalertid | string | Asimily Anomaly Alert ID |
| AsimilyInsight.Anomaly.asimilyanomalyurls | unknown | Asimily Anomaly URLs |
| AsimilyInsight.Anomaly.asimilyanomalyisfixed | boolean | Asimily Anomaly Is Fixed |
| AsimilyInsight.Anomaly.asimilyanomalyfixby | string | Asimily Anomaly Fix By |
| AsimilyInsight.Anomaly.asimilyanomalycriticalityscore | number | Asimily Anomaly Criticality Score |
| AsimilyInsight.Anomaly.asimilyanomalymitretactic | string | Asimily Anomaly Mitre Tactic |
| AsimilyInsight.Anomaly.asimilyanomalymitretechnique | string | Asimily Anomaly Mitre Technique |
| AsimilyInsight.Anomaly.asimilyanomalycategory | string | Asimily Anomaly Category |
| AsimilyInsight.Anomaly.asimilyanomalydescription | string | Asimily Anomaly Description |
| AsimilyInsight.Anomaly.asimilyanomalycustomeranomalyid | string | Asimily Anomaly Customer Anomaly ID. Unique anomaly type identifier assigned by Asimily for a specific customer. This ID can be used in future operations such as invoking anomaly fix actions. |
| AsimilyInsight.Anomaly.asimilydeviceid | number | Asimily Device ID |
| AsimilyInsight.Anomaly.asimilydevicemacaddress | string | Asimily Device MAC Address |
| AsimilyInsight.Anomaly.asimilydeviceipv4address | string | Asimily Device IPV4 Address |
| AsimilyInsight.Anomaly.asimilydevicehostname | string | Asimily Device Host Name |
| AsimilyInsight.Anomaly.asimilydevicetype | string | Asimily Device Type |
| AsimilyInsight.Anomaly.asimilydevicemodel | string | Asimily Device Model |
| AsimilyInsight.Anomaly.asimilydeviceos | string | Asimily Device OS |
| AsimilyInsight.Anomaly.asimilydevicemanufacturer | string | Asimily Device Manufacturer |
| AsimilyInsight.Anomaly.asimilydevicefamilies | unknown | Asimily Device Families |
asimily-get-asset-vulnerabilities
Fetch device CVEs from Asimily Insight. You can add argument filters.
Base Command
asimily-get-asset-vulnerabilities
Input
| Argument Name | Description | Required | Support List |
|---|---|---|---|
| mac_addr | The MAC Address of Asimily Asset | Optional | No |
| ip_addr | The IP Address of Asimily Asset | Optional | No |
| asimily_device_id | Asimily Insight given ID for devices | Optional | No |
| device_family | Optional | Yes | |
| device_tag | Optional | Yes | |
| cve_score | CVE Score Filter. Options: High Only, Medium and High, All (Score limit: High=7.5, Medium=3.5) | Optional | No |
| limit | Maximum amount of items to fetch. (Fetch will stop after device CVEs reached the limit) | Optional | No |
Context Output
Fetched
${fetch_count}CVEs for${fetch_device_count}devices matching search.
${pending_device_count}devices matching search is not fetched. Fetch count is limited to avoid server overload.
| Path | Type | Description |
|---|---|---|
| AsimilyInsight.CVE.asimilycvename | string | Asimily CVE Name |
| AsimilyInsight.CVE.asimilycvecwetype | string | Asimily CVE CWE Type |
| AsimilyInsight.CVE.asimilycveentitytype | string | Asimily CVE Entity Type |
| AsimilyInsight.CVE.asimilycveentityname | string | Asimily CVE Entity Name |
| AsimilyInsight.CVE.asimilycvescore | number | Asimily CVE Score |
| AsimilyInsight.CVE.asimilycvecvss3basescore | number | Asimily CVE CVSS 3 Base Score |
| AsimilyInsight.CVE.asimilycvedescripttion | string | Asimily CVE Descripttion |
| AsimilyInsight.CVE.asimilycveisfixed | boolean | Asimily CVE Is Fixed |
| AsimilyInsight.CVE.asimilycvefixedby | string | Asimily CVE Fixed By |
| AsimilyInsight.CVE.asimilycveoempatched | boolean | Asimily CVE OEM Patched |
| AsimilyInsight.CVE.asimilycveismuted | boolean | Asimily CVE Is Muted |
| AsimilyInsight.CVE.asimilycveexploitableinwild | boolean | Asimily CVE Exploitable In Wild |
| AsimilyInsight.CVE.asimilycvepublisheddate | date | Asimily CVE Published Date |
| AsimilyInsight.CVE.asimilycveopendate | date | Asimily CVE Open Date |
| AsimilyInsight.CVE.asimilycvefixeddate | date | Asimily CVE Fixed Date |
| AsimilyInsight.CVE.asimilydeviceid | number | Asimily Device ID |
| AsimilyInsight.CVE.asimilydevicemacaddress | string | Asimily Device MAC Address |
| AsimilyInsight.CVE.asimilydeviceipv4address | string | Asimily Device IPV4 Address |
| AsimilyInsight.CVE.asimilydevicehostname | string | Asimily Device Host Name |
| AsimilyInsight.CVE.asimilydevicetype | string | Asimily Device Type |
| AsimilyInsight.CVE.asimilydevicemodel | string | Asimily Device Model |
| AsimilyInsight.CVE.asimilydeviceos | string | Asimily Device OS |
| AsimilyInsight.CVE.asimilydevicemanufacturer | string | Asimily Device Manufacturer |
| AsimilyInsight.CVE.asimilydevicefamilies | string | Asimily Device Families |
Additional Information
Incident Search
- System searchable fields:
macaddress,devicelocalip,devicemodel,hostnames,deviceid - Asimily Insight Custom searchable fields:
asimilyanomalyname,asimilycvename
Incident Name
- For
Asimily Anomalyincident, name will beanomalyname|hostname|ip|mac - For
Asimily CVEincident, name will becvename|hostname|ip|mac
Incident Criticality Mapping
- XSOAR incidents have 4 levels of criticality:
- Informational (0)
- Low (1)
- Medium (2)
- High (3)
- Critical (4)
- Asimily Anomaly Alerts have 3 levels of criticality (Low/Medium/High). When creating incidents, we populate the incident criticality using the respective anomaly alert criticality.
- Asimily Asset CVEs have Asimily Calculated CVE score (Range: 0-10). When creating incidents, we populate the incident criticality using the respective CVE scores.
- Low (CVE score: < 3.5)
- Medium (CVE score: < 7.5)
- High (CVE score: < 10)
Default Playbook
To enrich incidents with corresponding asset information, we’ve published a default playbook for two custom incident types. This playbook calls asimily-get-asset-details to retrieve asset information and stores it in Context Data (under Asimily > Asset).
We’ve also added a section to custom incident layouts to display this information.
Users can modify this playbook or create similar ones. We recommend using the device ID or MAC address as a unique identifier when querying asset details.
Configuration parameters
url— Asimily Portal URL (required)asimilycred— API User Name (required)isFetch— Fetch incidentsinsecure— Trust any certificate (not secure)proxy— Use system proxy settingsfetchonlydevicefamilies— Device Family Filter for Fetch Operation (required)fetchonlydevicetags— Device Tags Filter for Fetch Operation (required)iffetchanomalies— Fetch Anomaly Alertsfetchanomalycriticality— Fetch Anomaly Criticality (required)iffetchcves— Fetch Device CVEsfetchcvescore— Fetch CVE Score (required)incidentFetchInterval— Incidents Fetch Intervalmax_fetch— Max Incidentsfirst_fetch— First Fetch Time IntervalincidentType— Incident type
Commands (3)
-
asimily-get-asset-anomaliesFetch Asimily Anomalies.
-
asimily-get-asset-detailsFetch Asimily Asset information.
-
asimily-get-asset-vulnerabilitiesFetch Asimily CVEs.
import pytest @pytest.fixture(autouse=True) def patch_missing_modules(mocker): mocker.patch.dict("sys.modules", {"DemistoClassApiModule": mocker.MagicMock()}) @pytest.fixture def mock_params(): return { "url": "test_url", "asimilycred": {"identifier": "user", "password": "pass"}, "insecure": False, "proxy": False, "iffetchanomalies": True, "iffetchcves": True, "isFetch": True, } @pytest.fixture def mock_context_data(): return {"asimilydeviceid": "12345", "asimilydevicemacaddress": "00:11:22:33:44:55", "asimilydeviceipv4address": "192.168.1.1"} def test_get_asset_details_command(mocker, mock_params): mocker.patch("AsimilyInsight.demisto.command", return_value="asimily-get-asset-details") mocker.patch("AsimilyInsight.demisto.args", return_value={"limit": "1"}) mocker.patch("AsimilyInsight.demisto.params", return_value=mock_params) mocker.patch("AsimilyInsight.Client.get_asset_applications_by_mac_addr", return_value=["App1"]) mocker.patch( "AsimilyInsight.Client.force_get_asset_details", return_value=(1, [{"deviceID": "123", "macAddr": "00:11:22:33:44:55", "hostName": "host", "v4IpAddrs": ["1.2.3.4"]}]), ) mock_return = mocker.patch("AsimilyInsight.return_results") from AsimilyInsight import main main() result = mock_return.call_args[0][0] assert result.outputs_prefix == "AsimilyInsight.Asset" assert any("asimilydeviceid" in d for d in result.outputs) def test_get_asset_anomalies_command(mocker, mock_params): mocker.patch("AsimilyInsight.demisto.command", return_value="asimily-get-asset-anomalies") mocker.patch("AsimilyInsight.demisto.args", return_value={"limit": "1"}) mocker.patch("AsimilyInsight.demisto.params", return_value=mock_params) mocker.patch( "AsimilyInsight.Client.force_get_asset_anomalies", return_value=( 1, [{"deviceId": "1", "anomalies": [{"anomaly": "AnomalyX", "alertId": "123", "domainDeviceOrIpDevice": "domain.com"}]}], ), ) mock_return = mocker.patch("AsimilyInsight.return_results") from AsimilyInsight import main main() assert mock_return.call_args[0][0].outputs_prefix == "AsimilyInsight.Anomaly" def test_get_asset_vulnerabilities_command(mocker, mock_params): mocker.patch("AsimilyInsight.demisto.command", return_value="asimily-get-asset-vulnerabilities") mocker.patch("AsimilyInsight.demisto.args", return_value={"limit": "1"}) mocker.patch("AsimilyInsight.demisto.params", return_value=mock_params) mocker.patch( "AsimilyInsight.Client.force_get_asset_cves", return_value=(1, [{"deviceId": "1", "cves": [{"cveName": "CVE-123", "description": "desc"}]}]), ) mock_return = mocker.patch("AsimilyInsight.return_results") from AsimilyInsight import main main() assert mock_return.call_args[0][0].outputs_prefix == "AsimilyInsight.CVE" def test_fetch_incidents_command(mocker, mock_params): mocker.patch("AsimilyInsight.demisto.command", return_value="fetch-incidents") mocker.patch("AsimilyInsight.demisto.args", return_value={}) mocker.patch("AsimilyInsight.demisto.params", return_value=mock_params) mocker.patch("AsimilyInsight.demisto.getLastRun", return_value={}) mocker.patch("AsimilyInsight.demisto.setLastRun") mocker.patch("AsimilyInsight.demisto.incidents") mocker.patch( "AsimilyInsight.Client.force_get_asset_anomalies", return_value=(1, [{"deviceId": 1, "anomalies": [{"anomaly": "A", "alertId": "ID123"}]}]), ) mocker.patch( "AsimilyInsight.Client.force_get_asset_cves", return_value=(1, [{"deviceId": "1", "cves": [{"cveName": "CVE-123", "description": "desc"}]}]), ) from AsimilyInsight import main main() def test_get_asset_details_command_with_empty_response(mocker, mock_params): mocker.patch("AsimilyInsight.demisto.command", return_value="asimily-get-asset-details") mocker.patch("AsimilyInsight.demisto.args", return_value={}) mocker.patch("AsimilyInsight.demisto.params", return_value=mock_params) mocker.patch("AsimilyInsight.Client.force_get_asset_details", return_value=(0, [])) mock_return = mocker.patch("AsimilyInsight.return_results") from AsimilyInsight import main main() result = mock_return.call_args[0][0] assert "0 assets" in result.readable_output def test_http_request_mocking(mocker): from AsimilyInsight import Client mocker.patch( "AsimilyInsight.BaseClient._http_request", return_value={"content": [{"deviceId": "1"}], "totalPages": 1, "totalElements": 1}, ) client = Client(base_url="https://example.com", verify=False, auth=("user", "pass"), proxy=False) total, data = client.force_get_asset_details() assert total == 1 assert data[0]["deviceId"] == "1" def test_test_module_invalid_credentials(mocker, mock_params): mock_params["isFetch"] = False mocker.patch("AsimilyInsight.demisto.command", return_value="test-module") mocker.patch("AsimilyInsight.demisto.args", return_value={}) mocker.patch("AsimilyInsight.demisto.params", return_value=mock_params) mocker.patch("AsimilyInsight.Client.get_asset_details_call", return_value="loginStyle") mock_return = mocker.patch("AsimilyInsight.return_results") from AsimilyInsight import main main() assert "Authentication Error" in mock_return.call_args[0][0] def test_create_filter_json_basic_fields(mocker): mocker.patch("AsimilyInsight.argToList", side_effect=lambda x: [x]) mock_debug = mocker.patch("AsimilyInsight.print_debug_msg") from AsimilyInsight import create_filter_json input_dict = { "deviceFamily": "X-Ray", "deviceTag": "critical", "ipAddr": "10.0.0.1", "macAddr": "aa:bb:cc:dd:ee:ff", "deviceRangeId": 10, "cvesLastUpdatedSince": "2023-01-01", "anomaliesLastUpdatedSince": "2024-01-01", "limit": 100, } result = create_filter_json(input_dict) assert "filters" in result assert result["filters"]["deviceFamily"] == [{"operator": ":", "value": "X-Ray"}] assert "limit" not in result["filters"] mock_debug.assert_called() def test_create_filter_json_with_criticality(mocker): mocker.patch("AsimilyInsight.print_debug_msg") from AsimilyInsight import create_filter_json, ASIMILY_INSIGHT_FETCH_DEVICE_ANOMALIES_API input_dict = {"criticality": "High Only"} result = create_filter_json(input_dict, api=ASIMILY_INSIGHT_FETCH_DEVICE_ANOMALIES_API) assert "anomaliesCriticality" in result["filters"] def test_create_filter_json_invalid_criticality_and_cvescore_variants(mocker): from AsimilyInsight import ( create_filter_json, ASIMILY_INSIGHT_FETCH_DEVICE_ANOMALIES_API, ASIMILY_INSIGHT_FETCH_DEVICE_CVES_API, ) mock_debug = mocker.patch("AsimilyInsight.print_debug_msg") # Case 1: unsupported criticality value (string not in map) input_dict_unsupported = {"criticality": "InvalidCriticality"} result1 = create_filter_json(input_dict_unsupported, api=ASIMILY_INSIGHT_FETCH_DEVICE_ANOMALIES_API) assert result1 == {"filters": {}} mock_debug.assert_any_call("Unsupported criticality value InvalidCriticality") # Case 2: criticality as list (invalid type) input_dict_list_type = {"criticality": ["High Only"]} result2 = create_filter_json(input_dict_list_type, api=ASIMILY_INSIGHT_FETCH_DEVICE_ANOMALIES_API) assert result2 == {"filters": {}} mock_debug.assert_any_call("criticality must be a string, not a list") # Case 3: unsupported cveScore value (numeric) input_dict_bad_cve_score = {"cveScore": 99} result3 = create_filter_json(input_dict_bad_cve_score, api=ASIMILY_INSIGHT_FETCH_DEVICE_CVES_API) assert result3 == {"filters": {}} # No warning expected — it silently skips invalid values def test_create_filter_json_with_cve_score(mocker): mocker.patch("AsimilyInsight.print_debug_msg") from AsimilyInsight import create_filter_json, ASIMILY_INSIGHT_FETCH_DEVICE_CVES_API input_dict = {"cveScore": "Medium and High"} result = create_filter_json(input_dict, api=ASIMILY_INSIGHT_FETCH_DEVICE_CVES_API) assert result["filters"]["cveScore"] == [{"operator": "Gte", "value": 3.5}] def test_create_filter_json_all_limit_and_argtolist_behavior(mocker): from AsimilyInsight import create_filter_json, ASIMILY_INSIGHT_FETCH_DEVICE_CVES_API mock_argtolist = mocker.patch("AsimilyInsight.argToList", side_effect=lambda x: [x]) mock_debug = mocker.patch("AsimilyInsight.print_debug_msg") # Case 1: 'All' values and 'limit' should be skipped, even though argToList("All") is called input_dict_all_skipped = { "deviceTag": "All", "deviceFamily": "All", # triggers argToList("All") "cveScore": "All", "criticality": "All", "limit": 50, } result1 = create_filter_json(input_dict_all_skipped, api=ASIMILY_INSIGHT_FETCH_DEVICE_CVES_API) assert result1 == {"filters": {}} mock_debug.assert_called_with({"filters": {}}) # Both deviceFamily and deviceTag were "All", and both passed to argToList before skipping assert mock_argtolist.call_count == 2 mock_argtolist.assert_has_calls([mocker.call("All"), mocker.call("All")]) mock_argtolist.reset_mock() mock_debug.reset_mock() # Case 2: deviceFamily/deviceTag already lists — argToList should NOT be called input_dict_list = { "deviceFamily": ["X-Ray"], "deviceTag": ["critical"], "ipAddr": "10.0.0.1", "macAddr": ["aa:bb:cc"], } result2 = create_filter_json(input_dict_list) assert result2 == { "filters": { "deviceFamily": [{"operator": ":", "value": "X-Ray"}], "deviceTag": [{"operator": ":", "value": "critical"}], "ipAddr": [{"operator": ":", "value": "10.0.0.1"}], "macAddr": [{"operator": ":", "value": "aa:bb:cc"}], } } mock_argtolist.assert_not_called() mock_debug.assert_called_with(result2) mock_argtolist.reset_mock() mock_debug.reset_mock() # Case 3: deviceFamily/deviceTag as strings — argToList SHOULD be called input_dict_str = {"deviceFamily": "X-Ray", "deviceTag": "critical", "ipAddr": "192.168.0.1"} result3 = create_filter_json(input_dict_str) assert "deviceFamily" in result3["filters"] assert "deviceTag" in result3["filters"] assert result3["filters"]["ipAddr"] == [{"operator": ":", "value": "192.168.0.1"}] assert mock_argtolist.call_count == 2 mock_debug.assert_called_with(result3) def test_get_asset_applications_by_mac_addr_realistic_response(mocker): from AsimilyInsight import Client mock_response = [ { "macAddr": "aa:bb:cc:dd:ee:ff", "ipAddr": "10.0.0.1", "applications": [ {"application": "endpoint security", "version": "*"}, {"application": "Wireless_Access", "version": "*"}, ], } ] mocker.patch("AsimilyInsight.BaseClient._http_request", return_value=mock_response) mock_debug = mocker.patch("AsimilyInsight.print_debug_msg") client = Client(base_url="test_url", verify=False, auth=("user", "pass"), proxy=False) apps = client.get_asset_applications_by_mac_addr("dc:46:28:73:03:16") assert apps == ["endpoint security", "Wireless_Access"] mock_debug.assert_called_once_with("Fetching applications for device with mac dc:46:28:73:03:16") def test_get_asset_applications_by_mac_addr_empty_response(mocker): from AsimilyInsight import Client mocker.patch("AsimilyInsight.BaseClient._http_request", return_value=None) client = Client(base_url="test_url", verify=False, auth=("user", "pass"), proxy=False) apps = client.get_asset_applications_by_mac_addr("00:11:22:33:44:55") assert apps == [] def test_test_module_missing_anomaly_content(mocker, mock_params): from AsimilyInsight import test_module, Client mock_params["isFetch"] = True mock_params["iffetchanomalies"] = True mock_params["iffetchcves"] = False client = Client(base_url="test_url", verify=False, auth=("user", "pass"), proxy=False) mocker.patch.object(client, "get_asset_details_call", return_value="ok") mocker.patch.object(client, "get_asset_anomalies_call", return_value={"not_content": []}) result = test_module(client, mock_params) assert result == "Exception occured when validating fetch anomalies, no content in response." def test_test_module_missing_cves_content(mocker, mock_params): from AsimilyInsight import test_module, Client mock_params["isFetch"] = True mock_params["iffetchanomalies"] = False mock_params["iffetchcves"] = True client = Client(base_url="test_url", verify=False, auth=("user", "pass"), proxy=False) mocker.patch.object(client, "get_asset_details_call", return_value="ok") mocker.patch.object(client, "get_asset_cves_call", return_value={"something_else": []}) result = test_module(client, mock_params) assert result == "Exception occured when validating fetch cves, no content in response." def test_test_module_forbidden_exception(mocker, mock_params): from AsimilyInsight import test_module, Client, DemistoException mock_params["isFetch"] = False client = Client(base_url="test_url", verify=False, auth=("user", "pass"), proxy=False) mocker.patch.object(client, "get_asset_details_call", side_effect=DemistoException("403 Forbidden")) result = test_module(client, mock_params) assert result == "Authentication Error: The specified API username and password are not correct." def test_test_module_general_exception(mocker, mock_params): from AsimilyInsight import test_module, Client, DemistoException mock_params["isFetch"] = False client = Client(base_url="test_url", verify=False, auth=("user", "pass"), proxy=False) mocker.patch.object(client, "get_asset_details_call", side_effect=DemistoException("500 Internal Server Error")) result = test_module(client, mock_params) assert result.startswith("Exception occured: 500 Internal Server Error") def test_get_asset_cves_call(mocker): from AsimilyInsight import Client, ASIMILY_INSIGHT_FETCH_DEVICE_CVES_API, CVES_API_SORT_DEVICE_ID # Mock internals mock_create_filter = mocker.patch("AsimilyInsight.create_filter_json", return_value={"filters": {"dummy": "yes"}}) mock_add_cve_filter = mocker.patch("AsimilyInsight.add_non_fixed_cve_filter") mock_response = {"content": "test-cve-data"} mock_request = mocker.patch("AsimilyInsight.BaseClient._http_request", return_value=mock_response) client = Client(base_url="https://example.com", verify=False, auth=("user", "pass"), proxy=False) result = client.get_asset_cves_call(args={"macAddr": "aa:bb"}, page=3, size=50) # Assert actual output returned assert result == mock_response # Validate that filter creation and modifier were called mock_create_filter.assert_called_once_with({"macAddr": "aa:bb"}, ASIMILY_INSIGHT_FETCH_DEVICE_CVES_API) mock_add_cve_filter.assert_called_once_with({"filters": {"dummy": "yes"}}) # Validate HTTP call mock_request.assert_called_once_with( method="POST", url_suffix=ASIMILY_INSIGHT_FETCH_DEVICE_CVES_API, params={ "size": 50, "page": 3, "sort": CVES_API_SORT_DEVICE_ID, }, json_data={"filters": {"dummy": "yes"}}, retries=mocker.ANY, status_list_to_retry=mocker.ANY, backoff_factor=mocker.ANY, timeout=mocker.ANY, )