Repository: demisto/content
Pull request #40002: Edl add reduce logs
Author: login: almog2296
Labels: name: docs-approved
name: ready-for-pipeline-running
description: Whether the pr is ready for running the whole pipeline, including testing on SAAS machines
Created: 2025-05-19T12:35:07Z | Merged: 2025-05-21T09:37:06Z

## Status
- [x] In Progress
- [ ] Ready
- [ ] In Hold - (Reason for hold)

## Related Issues
fixes: [link to the issue](https://jira-dc.paloaltonetworks.com/browse/CIAC-13441)

## Description
Adding a button for extensive logging

## Must have
- [ ] Tests
- [ ] Documentation 



Diff:
diff --git a/Packs/EDL/Integrations/EDL/EDL.py b/Packs/EDL/Integrations/EDL/EDL.py
index c21434fe2a47..83a3fa7a5d49 100644
--- a/Packs/EDL/Integrations/EDL/EDL.py
+++ b/Packs/EDL/Integrations/EDL/EDL.py
@@ -84,6 +84,8 @@
 
 INCREASE_LIMIT = 1.1
 
+EXTENSIVE_LOGGING: bool = False
+
 
 class IndicatorAction(Enum):
     ADDED = "Added"
@@ -96,9 +98,11 @@ class IndicatorAction(Enum):
 
 def debug_function(func):
     def wrapper(*args, **kwargs):
-        demisto.debug(f"edl: Entering function {func.__name__}")
+        if EXTENSIVE_LOGGING:
+            demisto.debug(f"edl: Entering function {func.__name__}")
         results = func(*args, **kwargs)
-        demisto.debug(f"edl: Exiting function {func.__name__}")
+        if EXTENSIVE_LOGGING:
+            demisto.debug(f"edl: Exiting function {func.__name__}")
         return results
 
     return wrapper
@@ -281,14 +285,17 @@ def log_iocs_file_data(formatted_indicators: str, max_length: int = 100) -> None
 @debug_function
 def create_new_edl(request_args: RequestArguments) -> tuple[str, int, dict]:
     """
-    Get indicators from the server using IndicatorsSearcher and format them.
+    Retrieves indicators using the IndicatorsSearcher and formats them according to the request arguments.
+    Applies optional cleanup (invalid removal, IP collapsing) and collects statistics on the changes.
 
-    Parameters:
-        request_args: Request arguments
+    Args:
+        request_args (RequestArguments): User-defined settings for formatting, filtering, and pagination.
 
     Returns:
-        tuple[str, int]: A tuple of formatted indicators to display in EDL's response (str),
-            and the number of original indicators received from the server before formatting (int).
+        tuple[str, int, dict]:
+            - str: A formatted string of indicators, ready to be returned in an EDL (one per line).
+            - int: The number of original indicators fetched before formatting.
+            - dict: Logging statistics about actions taken on indicators (added, dropped, modified).
     """
     limit = request_args.offset + request_args.limit
     offset = request_args.offset
@@ -317,12 +324,15 @@ def create_new_edl(request_args: RequestArguments) -> tuple[str, int, dict]:
                 iocs_set.add(line)
                 formatted_indicators += line
 
+        demisto.debug(f"Finished formatting ioc. Count after collapse: {len(iocs_set)}")
+
     else:
         new_iocs_file, original_indicators_count = get_indicators_to_format(indicator_searcher, request_args)
         new_iocs_file.seek(0)
         formatted_indicators = new_iocs_file.read()
     new_iocs_file.close()
-    log_iocs_file_data(formatted_indicators)
+    if EXTENSIVE_LOGGING:
+        log_iocs_file_data(formatted_indicators)
     return formatted_indicators, original_indicators_count, new_log_stats
 
 
@@ -355,34 +365,35 @@ def get_indicators_to_format(indicator_searcher: IndicatorsSearcher, request_arg
     """
     f = tempfile.TemporaryFile(mode="w+t")
     list_fields = replace_field_name_to_output_format(request_args.fields_to_present)
-    headers_was_writen = False
+    headers_was_written = False
     files_by_category = {}  # type:Dict
     ioc_counter = 0
     try:
         for ioc_res in indicator_searcher:
             fetched_iocs = ioc_res.get("iocs") or []
             for ioc in fetched_iocs:
-                # demisto.debug(f"Parsing the following indicator: {ioc.get('value')}")
+                if EXTENSIVE_LOGGING:
+                    demisto.debug(f"Parsing the following indicator: {ioc.get('value')}")
 
                 ioc_counter += 1
                 if request_args.out_format == FORMAT_PROXYSG:
                     files_by_category = create_proxysg_out_format(ioc, files_by_category, request_args)
 
                 elif request_args.out_format == FORMAT_MWG:
-                    f.write(create_mwg_out_format(ioc, request_args, headers_was_writen))
-                    headers_was_writen = True
+                    f.write(create_mwg_out_format(ioc, request_args, headers_was_written))
+                    headers_was_written = True
 
                 elif request_args.out_format == FORMAT_JSON:
-                    f.write(create_json_out_format(list_fields, ioc, request_args, headers_was_writen))
-                    headers_was_writen = True
+                    f.write(create_json_out_format(list_fields, ioc, request_args, headers_was_written))
+                    headers_was_written = True
 
                 elif request_args.out_format == FORMAT_TEXT:
                     # save only the value and type of each indicator
                     f.write(str(json.dumps({"value": ioc.get("value"), "indicator_type": ioc.get("indicator_type")})) + "\n")
 
                 elif request_args.out_format == FORMAT_CSV:
-                    f.write(create_csv_out_format(headers_was_writen, list_fields, ioc, request_args))
-                    headers_was_writen = True
+                    f.write(create_csv_out_format(headers_was_written, list_fields, ioc, request_args))
+                    headers_was_written = True
                 if ioc_counter >= indicator_searcher.limit:
                     break
 
@@ -394,7 +405,6 @@ def get_indicators_to_format(indicator_searcher: IndicatorsSearcher, request_arg
             # NG + XSIAM can recover from a shutdown
             if version.get("platform") == "x2" or is_demisto_version_ge("8"):
                 raise SystemExit("Encountered issue in Elastic Search query. Restarting container and trying again.")
-
     demisto.debug(f"Completed IOC search & format, found {ioc_counter} IOCs.")
     if request_args.out_format == FORMAT_JSON:
         f.write("]")
@@ -725,7 +735,7 @@ def log_indicator_line(raw_indicator: str, indicator: str, action: str, reason:
 
 
 def store_log_data(request_args: RequestArguments, created: datetime, log_stats: dict) -> None:
-    """Add the header to the log string.
+    """Finalizes and writes the full EDL log file by adding a summary header and appending logged indicator actions.
 
     Args:
         request_args (RequestArguments): The request args, they will be added to the header.
@@ -762,17 +772,31 @@ def store_log_data(request_args: RequestArguments, created: datetime, log_stats:
 @debug_function
 def create_text_out_format(iocs: IO, request_args: RequestArguments) -> tuple[Union[IO, IO[str]], dict]:
     """
-    Create a list in new file of formatted_indicators, and log the modifications.
-     * IP / CIDR:
-         1) if collapse_ips, collapse IPs/CIDRs
-     * URL:
-        1) if drop_invalids, drop invalids (length > 254 or has invalid chars)
-        2) if port_stripping, strip ports
-        3) if protocol_stripping, strip protocols
-        4) if url_truncate, truncate urls
-    * Other indicator types:
-        1) if drop_invalids, drop invalids (has invalid chars)
-        2) if port_stripping, strip ports
+    Formats a stream of indicators (IOCs) into a standardized text output and logs processing actions.
+    Args:
+        iocs (IO): A file-like object with JSON lines, each representing an indicator with "value" and "indicator_type".
+        request_args (RequestArguments): An object containing formatting preferences such as from the following categories:
+            * IP / CIDR:
+                1) if collapse_ips, collapse IPs/CIDRs
+            * URL:
+                1) if drop_invalids, drop invalids (length > 254 or has invalid chars)
+                2) if port_stripping, strip ports
+                3) if protocol_stripping, strip protocols
+                4) if url_truncate, truncate urls
+            * Other indicator types:
+                1) if drop_invalids, drop invalids (has invalid chars)
+                2) if port_stripping, strip ports
+    Returns:
+        tuple:
+            - A temporary file-like object containing the formatted indicators, one per line.
+            - A dictionary with statistics about dropped, added, and modified indicators.
+
+    Behavior:
+        - Skips indicators missing a value or non-ASCII (if configured).
+        - For URLs/domains: applies cleaning (strip protocol/port, truncate) and filtering (length, invalid chars).
+        - For IPs/CIDRs: can collapse into ranges or drop if too large.
+        - Wildcard domains and TLDs are handled according to config.
+        - All actions (add, drop, modify) are logged and counted in the result.
     """
     enforce_ascii = argToBoolean(demisto.params().get("enforce_ascii", False))
     ipv4_formatted_indicators = set()
@@ -923,7 +947,7 @@ def create_text_out_format(iocs: IO, request_args: RequestArguments) -> tuple[Un
                     reason="Found new IPv6.",
                     log_stats=log_stats,
                 )
-
+    # Log on the logs files all the modification of the indicators
     return formatted_indicators, log_stats
 
 
@@ -1006,7 +1030,8 @@ def get_edl_on_demand() -> tuple[str, int]:
             demisto.debug(f"edl: Error in writing to file: {e!s}")
             raise e
 
-        demisto.debug("edl: Finished writing EDL data to cache")
+        if EXTENSIVE_LOGGING:
+            demisto.debug("edl: Finished writing EDL data to cache")
         set_integration_context(ctx)
 
     else:
@@ -1019,8 +1044,7 @@ def get_edl_on_demand() -> tuple[str, int]:
         except Exception as e:
             demisto.debug(f"edl: Error reading cache file: {e!s}")
             raise e
-
-    demisto.debug("edl: Finished reading EDL data from cache")
+        demisto.debug("edl: Finished reading EDL data from cache")
 
     return edl_data, EDL_ON_DEMAND_CACHE_ORIGINAL_SIZE
 
@@ -1069,7 +1093,8 @@ def authenticate_app(params: dict, request_headers: Any) -> Optional[Response]:
     credentials = params.get("credentials", {})
     username: str = credentials.get("identifier", "")
     password: str = credentials.get("password", "")
-
+    if EXTENSIVE_LOGGING:
+        demisto.debug("Attempting authentication for incoming request.")
     if username and password:
         headers: dict = cast(dict[Any, Any], request_headers)
         if not validate_basic_authentication(headers, username, password):
@@ -1093,6 +1118,8 @@ def get_edl_log_file() -> str:
     if os.path.exists(EDL_FULL_LOG_PATH):
         demisto.debug("found log file")
         if os.path.getsize(EDL_FULL_LOG_PATH) > MAX_DISPLAY_LOG_FILE_SIZE:
+            if EXTENSIVE_LOGGING:
+                demisto.debug("EDL log file too large to display")
             return LARGE_LOG_DISPLAY_MSG
 
         with open(EDL_FULL_LOG_PATH) as log_file:
@@ -1131,12 +1158,18 @@ def route_edl() -> Response:
     """
     params = demisto.params()
     cache_refresh_rate: str = params.get("cache_refresh_rate")
+    if EXTENSIVE_LOGGING:
+        demisto.debug("edl: Starting EDL route handler")
     auth_resp = authenticate_app(params, request.headers)
     if auth_resp:
         return auth_resp
-
+    if EXTENSIVE_LOGGING:
+        demisto.debug("edl: authentication successful")
     request_args = get_request_args(request.args, params)
     on_demand = params.get("on_demand")
+    if EXTENSIVE_LOGGING:
+        demisto.debug(f"{'Using' if on_demand else 'Not using'} on-demand cache to serve EDL.")
+
     created = datetime.now(timezone.utc)
     if on_demand:
         edl_data, original_indicators_count = get_edl_on_demand()
@@ -1159,6 +1192,8 @@ def route_edl() -> Response:
         edl_data = prepare_response_data(
             data=edl_data, append_str=params.get("append_string"), prepend_str=params.get("prepend_string")
         )
+    if EXTENSIVE_LOGGING:
+        demisto.debug(f"Final EDL size: {len(edl_data)} characters, {edl_size} lines")
 
     mimetype = get_outbound_mimetype(request_args)
     max_age = ceil((datetime.now() - dateparser.parse(cache_refresh_rate)).total_seconds())  # type: ignore[operator]
@@ -1183,13 +1218,21 @@ def route_edl() -> Response:
 
 @APP.route("/log_download", methods=["GET"])
 def log_download() -> Response:
-    params = demisto.params()
+    """Flask route to download the full EDL log file as a zip.
+    The log file zipped is located at EDL_FULL_LOG_PATH.
 
+    Return:
+        Response: A Flask Response object that sends a ZIP file containing the full log.
+    """
+    params = demisto.params()
+    demisto.debug("edl: Starting EDL route/log_download handler")
     auth_resp = authenticate_app(params, request.headers)
+    if EXTENSIVE_LOGGING:
+        demisto.debug("edl: authentication successful")
     if auth_resp:
         return auth_resp
 
-    demisto.debug("Getting log file to show")
+    demisto.debug("edl: Getting log file to show")
 
     created = datetime.now(timezone.utc)
 
@@ -1204,16 +1247,24 @@ def log_download() -> Response:
 
 @APP.route("/log", methods=["GET"])
 def route_edl_log() -> Response:
-    """Show the edl indicators log on '/log' API request."""
+    """
+    Flask route to serve the EDL indicators log via HTTP.
+
+    Returns:
+        Response: A Flask Response containing either:
+            - The log contents as plain text (with optional prepend/append formatting), or
+            - A ZIP file download containing the log, if the log is too large to display.
+    """
     params = demisto.params()
 
     cache_refresh_rate: str = params.get("cache_refresh_rate")
+    demisto.debug("edl: Starting EDL route/log handler")
     auth_resp = authenticate_app(params, request.headers)
+    if EXTENSIVE_LOGGING:
+        demisto.debug("edl: authentication successful")
     if auth_resp:
         return auth_resp
 
-    demisto.debug("Getting log file to show")
-
     edl_data_log = get_edl_log_file() or "# Empty"
     request_args = get_request_args(request.args, params)
     created = datetime.now(timezone.utc)
@@ -1281,6 +1332,8 @@ def get_request_args(request_args: dict, params: dict) -> RequestArguments:
     Returns:
         RequestArguments instance with processed arguments
     """
+    if EXTENSIVE_LOGGING:
+        demisto.debug("Parsing EDL request args...")
     limit = try_parse_integer(request_args.get("n", params.get("edl_size") or 10000), EDL_LIMIT_ERR_MSG)
     offset = try_parse_integer(request_args.get("s", 0), EDL_OFFSET_ERR_MSG)
     out_format = request_args.get("v", params.get("format", FORMAT_TEXT))
@@ -1355,6 +1408,16 @@ def get_request_args(request_args: dict, params: dict) -> RequestArguments:
         )
         limit = min(limit, MAX_LIST_SIZE_WITH_URL_QUERY)
 
+    demisto.debug(
+        f"RequestArguments resolved:\n"
+        f"limit={limit}, offset={offset}, format={out_format}, query='{query}', "
+        f"mwg_type={mwg_type}, collapse_ips={collapse_ips}, drop_invalids={drop_invalids}, "
+        f"strip_port={strip_port}, strip_protocol={strip_protocol}, "
+        f"url_truncate={url_truncate}, maximum_cidr_size={maximum_cidr_size}, no_wildcard_tld={no_wildcard_tld}, "
+        f"fields_to_present={fields_to_present}, category_default={category_default}, "
+        f"category_attribute={category_attribute}, csv_text={csv_text}, comment_if_empty={add_comment_if_empty}"
+    )
+
     return RequestArguments(
         query,
         out_format,
@@ -1409,7 +1472,7 @@ def test_module(_: dict, params: dict):
 @debug_function
 def update_edl_command(args: dict, params: dict):
     """
-    Updates the context to update the EDL values on demand the next time it runs
+    Updates the context to update the EDL values on demand the next time it runs.
     """
     on_demand = params.get("on_demand")
     if not on_demand:
@@ -1543,11 +1606,11 @@ def check_platform_and_version(params: dict) -> bool:
     return platform in ["xsoar", "xsoar_hosted"] and not is_demisto_version_ge("8.0.0") and not params.get("longRunningPort")
 
 
-def main():
+def main():  # pragma: no cover
     """
     Main
     """
-    global PAGE_SIZE
+    global PAGE_SIZE, EXTENSIVE_LOGGING
     params = demisto.params()
     try:
         PAGE_SIZE = max(1, int(params.get("page_size") or PAGE_SIZE))
@@ -1556,6 +1619,9 @@ def main():
     credentials = params.get("credentials") if params.get("credentials") else {}
     username: str = credentials.get("identifier", "")
     password: str = credentials.get("password", "")
+
+    EXTENSIVE_LOGGING = params.get("extensive_logging", False)
+
     if (username and not password) or (password and not username):
         err_msg: str = "If using credentials, both username and password should be provided."
         demisto.debug(err_msg)
@@ -1570,6 +1636,8 @@ def main():
             raise DemistoException("Please specify a Listen Port, in the integration configuration")
 
         initialize_edl_context(params)
+        if EXTENSIVE_LOGGING:
+            demisto.debug("EDL context initialized.")
         if command == "long-running-execution":
             run_long_running(params)
         elif command in commands:
diff --git a/Packs/EDL/Integrations/EDL/EDL.yml b/Packs/EDL/Integrations/EDL/EDL.yml
index cc034928546c..18d0f4ad6dc6 100644
--- a/Packs/EDL/Integrations/EDL/EDL.yml
+++ b/Packs/EDL/Integrations/EDL/EDL.yml
@@ -261,6 +261,14 @@ configuration:
   section: Collect
   advanced: true
   required: false
+- display: Extensive Logging
+  name: extensive_logging
+  type: 8
+  additionalinfo: This parameter will write additional data to the logs and should only be used when you are directed to by XSOAR support.
+  section: Connect
+  advanced: true
+  required: false
+  defaultvalue: 'false'
 description: Use the Generic Export Indicators Service integration to provide an endpoint with a list of indicators as a service for the system indicators.
 display: Generic Export Indicators Service
 name: EDL
@@ -431,7 +439,7 @@ script:
       - 'False'
       - 'True'
     description: Updates values stored in the List (only available On-Demand).
-  dockerimage: demisto/flask-nginx:1.0.0.2027021
+  dockerimage: demisto/flask-nginx:1.0.0.3194255
   longRunning: true
   longRunningPort: true
   script: '-'
diff --git a/Packs/EDL/Integrations/EDL/EDL_test.py b/Packs/EDL/Integrations/EDL/EDL_test.py
index 78ea80b34ab9..fe683c840302 100644
--- a/Packs/EDL/Integrations/EDL/EDL_test.py
+++ b/Packs/EDL/Integrations/EDL/EDL_test.py
@@ -9,7 +9,20 @@
 
 import demistomock as demisto
 import pytest
-from EDL import DONT_COLLAPSE, check_platform_and_version, datetime, get_indicators_to_format, initialize_edl_context, timezone
+from EDL import (
+    DONT_COLLAPSE,
+    check_platform_and_version,
+    datetime,
+    get_indicators_to_format,
+    initialize_edl_context,
+    timezone,
+    RequestArguments,
+    FORMAT_TEXT,
+    FORMAT_CSV,
+    FORMAT_JSON,
+    FORMAT_MWG,
+    FORMAT_PROXYSG,
+)
 from freezegun import freeze_time
 
 IOC_RES_LEN = 38
@@ -1404,3 +1417,25 @@ def test_store_log_data(mocker, wip_exist):
     request_args = edl.RequestArguments()
     edl.store_log_data(request_args, datetime.now(), {})
     assert Path(edl.EDL_FULL_LOG_PATH).exists() == wip_exist
+
+
+@pytest.mark.parametrize(
+    "out_format, fields_to_present, expected",
+    [
+        # Case 1: use_legacy_query returns ""
+        (FORMAT_TEXT, "use_legacy_query", ""),
+        # Case 2: FORMAT_CSV with 'all' returns ""
+        (FORMAT_CSV, "all", ""),
+        # Case 3: FORMAT_JSON with 'value' replaced to 'name'
+        (FORMAT_JSON, "value,type", "name,type"),
+        # Case 4: FORMAT_MWG with no fields_to_present
+        (FORMAT_MWG, "", RequestArguments.FILTER_FIELDS_ON_FORMAT_MWG),
+        # Case 5: FORMAT_PROXYSG with no fields_to_present
+        (FORMAT_PROXYSG, "", RequestArguments.FILTER_FIELDS_ON_FORMAT_PROXYSG),
+        # Case 6: Unknown format fallback to FILTER_FIELDS_ON_FORMAT_TEXT
+        ("unknown_format", "", RequestArguments.FILTER_FIELDS_ON_FORMAT_TEXT),
+    ],
+)
+def test_get_fields_to_present(out_format, fields_to_present, expected):
+    args = RequestArguments(out_format=out_format, fields_to_present=fields_to_present)
+    assert args.fields_to_present == expected
diff --git a/Packs/EDL/ReleaseNotes/3_3_13.md b/Packs/EDL/ReleaseNotes/3_3_13.md
new file mode 100644
index 000000000000..5c30c715eb4c
--- /dev/null
+++ b/Packs/EDL/ReleaseNotes/3_3_13.md
@@ -0,0 +1,7 @@
+
+#### Integrations
+
+##### Generic Export Indicators Service
+
+- Updated the Docker image to: *demisto/flask-nginx:1.0.0.3194255*.
+- Added support for **Extensive Logging** parameter. This parameter will write additional data to the logs and should only be used when you are directed to by XSOAR support.
diff --git a/Packs/EDL/pack_metadata.json b/Packs/EDL/pack_metadata.json
index 251b2c3635b2..44276c634094 100644
--- a/Packs/EDL/pack_metadata.json
+++ b/Packs/EDL/pack_metadata.json
@@ -2,7 +2,7 @@
     "name": "Generic Export Indicators Service",
     "description": "Use this pack to generate a list based on your Threat Intel Library, and export it to ANY other product in your network, such as your firewall, agent or SIEM. This pack is built for ongoing distribution of indicators from XSOAR to other products in the network, by creating an endpoint with a list of indicators that can be pulled by external vendors.",
     "support": "xsoar",
-    "currentVersion": "3.3.12",
+    "currentVersion": "3.3.13",
     "author": "Cortex XSOAR",
     "url": "https://www.paloaltonetworks.com/cortex",
     "email": "",


Reviews:
user: login: Shellyber
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-19T14:01:24Z
user: login: MLainer1
body: Great work! 🚀 
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-20T06:27:48Z
user: login: Shellyber
body: Great work. Looking goor for my part
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-20T10:35:33Z

Review comments:
diff_hunk: @@ -0,0 +1,7 @@
+
+#### Integrations
+
+##### Generic Export Indicators Service
+
+- Updated the Docker image to: *demisto/flask-nginx:1.0.0.3194255*.
+- Added support for **Extensive Logging** parameter that this parameter will write additional data to the logs and should only be used when you are directed to by xsoar support.
path: Packs/EDL/ReleaseNotes/3_3_13.md
user: login: Shellyber
body: ```suggestion
- Added support for **Extensive Logging** parameter. This parameter will write additional data to the logs and should only be used when you are directed to by XSOAR support.
```
created_at: 2025-05-19T14:01:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1019,8 +1049,8 @@ def get_edl_on_demand() -> tuple[str, int]:
         except Exception as e:
             demisto.debug(f"edl: Error reading cache file: {e!s}")
             raise e
-
-    demisto.debug("edl: Finished reading EDL data from cache")
+        if EXTENSIVE_LOGGING:
+            demisto.debug("edl: Finished reading EDL data from cache")
path: Packs/EDL/Integrations/EDL/EDL.py
user: login: MLainer1
body: I think this can be part of the main logs
created_at: 2025-05-20T06:25:25Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-19T12:41:57Z
body: <!-- Pytest Coverage Comment: pre-commit -->
<a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/README.md"><img alt="Coverage" src="https://img.shields.io/badge/Coverage-78%25-yellow.svg" /></a><details><summary>Coverage Report </summary><table><tr><th>File</th><th>Stmts</th><th>Miss</th><th>Cover</th><th>Missing</th></tr><tbody><tr><td colspan="5"><b>Packs/EDL/Integrations/EDL</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py">EDL.py</a></td><td>810</td><td>174</td><td>78%</td><td><a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L102">102</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L105">105</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L266">266</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L278-L280">278&ndash;280</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L282">282</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L311">311</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L335">335</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L376">376</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L400-L401">400&ndash;401</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L403-L404">403&ndash;404</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L406-L407">406&ndash;407</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L471">471</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L524-L525">524&ndash;525</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L566-L571">566&ndash;571</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L713">713</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L812">812</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L979">979</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L982">982</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L998-L1000">998&ndash;1000</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1029-L1031">1029&ndash;1031</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1034">1034</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1044-L1046">1044&ndash;1046</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1093-L1103">1093&ndash;1103</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1112">1112</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1122">1122</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1159-L1171">1159&ndash;1171</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1173-L1175">1173&ndash;1175</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1177-L1178">1177&ndash;1178</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1180-L1182">1180&ndash;1182</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1184-L1185">1184&ndash;1185</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1187-L1188">1187&ndash;1188</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1191-L1192">1191&ndash;1192</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1195-L1196">1195&ndash;1196</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1198-L1199">1198&ndash;1199</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1201">1201</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1209">1209</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1211-L1212">1211&ndash;1212</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1214">1214</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1216">1216</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1227-L1233">1227&ndash;1233</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1235">1235</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1237">1237</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1239-L1245">1239&ndash;1245</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1264">1264</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1266">1266</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1284">1284</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1336">1336</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1359">1359</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1362">1362</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1365">1365</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1371">1371</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1385">1385</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1388">1388</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1391">1391</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1394">1394</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1398">1398</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1402">1402</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1451-L1459">1451&ndash;1459</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1461-L1469">1461&ndash;1469</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1477-L1496">1477&ndash;1496</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1498-L1499">1498&ndash;1499</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1504">1504</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1506">1506</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1526-L1529">1526&ndash;1529</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1531-L1532">1531&ndash;1532</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1534-L1535">1534&ndash;1535</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1537-L1538">1537&ndash;1538</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1540">1540</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1564">1564</a>, <a href="https://github.com/demisto/content/blob/773ce35a178a048c212cdf0e626d21319a0a6432/Packs/EDL/Integrations/EDL/EDL.py#L1568">1568</a></td></tr><tr><td><b>TOTAL</b></td><td><b>810</b></td><td><b>174</b></td><td><b>78%</b></td><td>&nbsp;</td></tr></tbody></table></details>

| Tests | Skipped | Failures | Errors | Time |
| ----- | ------- | -------- | -------- | ------------------ |
| 64 | 0 :zzz: | 0 :x: | 0 :fire: | 4.113s :stopwatch: |

author_association: NONE
user: login: content-bot
created_at: 2025-05-20T12:46:42Z
body: Validate summary

Verdict: PR can be force merged from validate perspective? ✅
author_association: CONTRIBUTOR