implemented watcher and rerun logic
This commit is contained in:
+35
-14
@@ -3,11 +3,11 @@ import re
|
||||
import threading
|
||||
|
||||
try:
|
||||
import smbclient
|
||||
import smbclient # type: ignore[import-not-found]
|
||||
except ModuleNotFoundError:
|
||||
smbclient = None
|
||||
|
||||
from db import DEVICE_DUT, DEVICE_REF, mark_tests_completed
|
||||
from db import DEVICE_DUT, DEVICE_REF, mark_tests_completed, mark_overdue_as_rerun
|
||||
|
||||
_SMB_SESSIONS = set()
|
||||
_SCAN_STATE_LOCK = threading.Lock()
|
||||
@@ -15,6 +15,29 @@ _ACTIVE_SCAN_COUNT = 0
|
||||
_RESULT_TEST_ID_PATTERN = re.compile(r"(?:COE|P2P|P3P)(?:RX|TX)?[A-Z]{2}\d{3}", re.IGNORECASE)
|
||||
|
||||
|
||||
def _normalize_smb_credentials(smb_credentials=None):
|
||||
username = ""
|
||||
password = ""
|
||||
domain = ""
|
||||
|
||||
if smb_credentials:
|
||||
username = str(smb_credentials.get("username", "")).strip()
|
||||
password = str(smb_credentials.get("password", ""))
|
||||
domain = str(smb_credentials.get("domain", "")).strip()
|
||||
|
||||
if not username:
|
||||
username = os.getenv("SMB_USERNAME", "").strip()
|
||||
if not password:
|
||||
password = os.getenv("SMB_PASSWORD", "")
|
||||
if not domain:
|
||||
domain = os.getenv("SMB_DOMAIN", "").strip()
|
||||
|
||||
if username and domain and "\\" not in username and "@" not in username:
|
||||
username = f"{domain}\\{username}"
|
||||
|
||||
return username, password
|
||||
|
||||
|
||||
def _extract_test_id_from_result_dir_name(dir_name):
|
||||
if not dir_name:
|
||||
return None
|
||||
@@ -171,7 +194,7 @@ def _extract_unc_server(path):
|
||||
return rest.split("\\", 1)[0] if rest else None
|
||||
|
||||
|
||||
def _register_smb_session_if_needed(path):
|
||||
def _register_smb_session_if_needed(path, smb_credentials=None):
|
||||
if not _is_unc_path(path):
|
||||
return
|
||||
|
||||
@@ -182,12 +205,7 @@ def _register_smb_session_if_needed(path):
|
||||
if not server or server in _SMB_SESSIONS:
|
||||
return
|
||||
|
||||
username = os.getenv("SMB_USERNAME", "").strip()
|
||||
password = os.getenv("SMB_PASSWORD", "")
|
||||
domain = os.getenv("SMB_DOMAIN", "").strip()
|
||||
|
||||
if username and domain and "\\" not in username and "@" not in username:
|
||||
username = f"{domain}\\{username}"
|
||||
username, password = _normalize_smb_credentials(smb_credentials)
|
||||
|
||||
if username:
|
||||
smbclient.register_session(server, username=username, password=password)
|
||||
@@ -197,17 +215,17 @@ def _register_smb_session_if_needed(path):
|
||||
_SMB_SESSIONS.add(server)
|
||||
|
||||
|
||||
def _iter_dir_entries(path):
|
||||
def _iter_dir_entries(path, smb_credentials=None):
|
||||
path = _normalize_input_path(path)
|
||||
if _is_unc_path(path):
|
||||
if smbclient is None:
|
||||
raise ModuleNotFoundError("smbclient is required to scan UNC result paths")
|
||||
_register_smb_session_if_needed(path)
|
||||
_register_smb_session_if_needed(path, smb_credentials=smb_credentials)
|
||||
return list(smbclient.scandir(path))
|
||||
return list(os.scandir(path))
|
||||
|
||||
|
||||
def scan_results(results_dir_dut, results_dir_ref):
|
||||
def scan_results(results_dir_dut, results_dir_ref, smb_credentials=None):
|
||||
results_dir_dut = _normalize_input_path(results_dir_dut)
|
||||
results_dir_ref = _normalize_input_path(results_dir_ref)
|
||||
|
||||
@@ -217,7 +235,7 @@ def scan_results(results_dir_dut, results_dir_ref):
|
||||
try:
|
||||
dut_entries = [
|
||||
entry.name
|
||||
for entry in _iter_dir_entries(results_dir_dut)
|
||||
for entry in _iter_dir_entries(results_dir_dut, smb_credentials=smb_credentials)
|
||||
if entry.is_dir()
|
||||
]
|
||||
except OSError as exc:
|
||||
@@ -229,7 +247,7 @@ def scan_results(results_dir_dut, results_dir_ref):
|
||||
try:
|
||||
ref_entries = [
|
||||
entry.name
|
||||
for entry in _iter_dir_entries(results_dir_ref)
|
||||
for entry in _iter_dir_entries(results_dir_ref, smb_credentials=smb_credentials)
|
||||
if entry.is_dir()
|
||||
]
|
||||
except OSError as exc:
|
||||
@@ -259,4 +277,7 @@ def scan_results(results_dir_dut, results_dir_ref):
|
||||
print(f"[scanner] skipped {len(unmatched_entries)} result dir(s) with no recognizable test id")
|
||||
|
||||
mark_tests_completed(completed_batch)
|
||||
newly_rerun = mark_overdue_as_rerun()
|
||||
if newly_rerun:
|
||||
print(f"[scanner] {newly_rerun} test(s) marked as rerun-required (scheduled but not completed)")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user