diff --git a/simplyblock_core/controllers/backup_controller.py b/simplyblock_core/controllers/backup_controller.py index 3b7e9e9be..f47b73bbd 100644 --- a/simplyblock_core/controllers/backup_controller.py +++ b/simplyblock_core/controllers/backup_controller.py @@ -1,11 +1,9 @@ # coding=utf-8 -import json import logging import re import time import uuid -from simplyblock_core import constants, utils from simplyblock_core.controllers import backup_events, tasks_controller from simplyblock_core.db_controller import DBController from simplyblock_core.models.backup import Backup, BackupPolicy, BackupPolicyAttachment @@ -168,7 +166,7 @@ def restore_backup(backup_id, node_id, lvol_name, cluster_id=None): """Restore a backup chain into a new lvol. Returns (task_id_or_status, error_message).""" try: - backup = db_controller.get_backup_by_id(backup_id) + _ = db_controller.get_backup_by_id(backup_id) except KeyError as e: return None, str(e) diff --git a/simplyblock_core/controllers/lvol_controller.py b/simplyblock_core/controllers/lvol_controller.py index 85e6c0310..8d313887e 100644 --- a/simplyblock_core/controllers/lvol_controller.py +++ b/simplyblock_core/controllers/lvol_controller.py @@ -1236,7 +1236,6 @@ def list_lvols(is_json, cluster_id, pool_id_or_name, all=False): data = [] # Build set of lvol UUIDs with active migrations (single DB scan) - from simplyblock_core.controllers import migration_controller migrating_lvols = set() for m in db_controller.get_migrations(cluster_id): if m.is_active(): diff --git a/simplyblock_core/controllers/migration_controller.py b/simplyblock_core/controllers/migration_controller.py index fcb73d6e0..073c7c54f 100644 --- a/simplyblock_core/controllers/migration_controller.py +++ b/simplyblock_core/controllers/migration_controller.py @@ -385,7 +385,7 @@ def get_snaps_to_delete_on_target(migration): preexisting = set(migration.snaps_preexisting_on_target) # Rule 2: protect snaps referenced by other target lvols - protected = set() + protected: set[str] = set() target_lvols = db.get_lvols_by_node_id(migration.target_node_id) for lvol in target_lvols: if lvol.uuid == migration.lvol_id: @@ -454,7 +454,6 @@ def apply_migration_to_db(migration): logger.error(f"apply_migration_to_db: target node not found: {e}") return False - old_lvstore = lvol.lvs_name lvol.node_id = tgt_node.get_id() lvol.hostname = tgt_node.hostname lvol.lvs_name = tgt_node.lvstore diff --git a/simplyblock_core/controllers/snapshot_controller.py b/simplyblock_core/controllers/snapshot_controller.py index d371959e1..6d0448cce 100644 --- a/simplyblock_core/controllers/snapshot_controller.py +++ b/simplyblock_core/controllers/snapshot_controller.py @@ -253,7 +253,6 @@ def list(node_id=None): snaps = sorted(snaps, key=lambda snap: snap.created_at) # Build set of lvol UUIDs with active migrations (single DB scan) - from simplyblock_core.controllers import migration_controller migrating_lvols = set() for m in db_controller.get_migrations(): if m.is_active(): diff --git a/simplyblock_core/models/backup.py b/simplyblock_core/models/backup.py index 5d4c9ab58..24edf8a7e 100644 --- a/simplyblock_core/models/backup.py +++ b/simplyblock_core/models/backup.py @@ -1,6 +1,5 @@ # coding=utf-8 import datetime -from typing import List from simplyblock_core.models.base_model import BaseModel diff --git a/simplyblock_core/services/lvol_monitor.py b/simplyblock_core/services/lvol_monitor.py index 09e091eb9..66ea9462a 100644 --- a/simplyblock_core/services/lvol_monitor.py +++ b/simplyblock_core/services/lvol_monitor.py @@ -131,7 +131,6 @@ def process_lvol_delete_finish(lvol): non_leader_nodes.append(db.get_storage_node_by_id(node_id)) except KeyError: pass - sec_node = non_leader_nodes[0] if non_leader_nodes else None # 3-1 async delete lvol bdev from primary primary_node = db.get_storage_node_by_id(leader_node.get_id()) diff --git a/simplyblock_core/services/tasks_runner_lvol_migration.py b/simplyblock_core/services/tasks_runner_lvol_migration.py index 2df1c6e97..82a370577 100644 --- a/simplyblock_core/services/tasks_runner_lvol_migration.py +++ b/simplyblock_core/services/tasks_runner_lvol_migration.py @@ -85,7 +85,6 @@ the 3-second service-loop gap between phases. """ -import logging import time from simplyblock_core import db_controller as db_mod, utils, constants @@ -569,7 +568,7 @@ def _handle_snap_copy(migration, src_node, tgt_node, src_rpc, tgt_rpc): return False, True, _WAIT break # one check is enough - transfers = [] + transfers: list[dict] = [] for snap_uuid in unprocessed: snap_index = plan.index(snap_uuid) try: @@ -1513,7 +1512,8 @@ def task_runner(task): # Advance to next phase and continue immediately in the same invocation. # This avoids the 3-second sleep between phase transitions (e.g. the gap # between the last snapshot completing and LVOL_MIGRATE starting). - migration.phase = next_phase + if next_phase: + migration.phase = next_phase migration.current_job_id = "" migration.write_to_db(db.kv_store) task.write_to_db(db.kv_store) diff --git a/simplyblock_web/api/v2/backup.py b/simplyblock_web/api/v2/backup.py index 81034169a..913b7e4ae 100644 --- a/simplyblock_web/api/v2/backup.py +++ b/simplyblock_web/api/v2/backup.py @@ -1,5 +1,4 @@ from typing import List, Optional -from uuid import UUID from fastapi import APIRouter, HTTPException, Response from pydantic import BaseModel diff --git a/simplyblock_web/api/v2/migration.py b/simplyblock_web/api/v2/migration.py index 42527d990..09ec50fe6 100644 --- a/simplyblock_web/api/v2/migration.py +++ b/simplyblock_web/api/v2/migration.py @@ -1,6 +1,6 @@ -from typing import List, Optional, TYPE_CHECKING +from typing import List, TYPE_CHECKING -from fastapi import APIRouter, HTTPException, Response +from fastapi import APIRouter, HTTPException from pydantic import BaseModel if TYPE_CHECKING: diff --git a/tests/migration/conftest.py b/tests/migration/conftest.py index 5a5fb1b8a..9674c152b 100644 --- a/tests/migration/conftest.py +++ b/tests/migration/conftest.py @@ -17,12 +17,11 @@ import uuid as _uuid_mod import pytest -from simplyblock_core.models.job_schedule import JobSchedule from simplyblock_core.models.lvol_migration import LVolMigration from tests.migration.mock_rpc_server import MockRpcServer from tests.migration.topology_loader import ( - TestContext, load_topology, load_topology_file, + TestContext, load_topology, set_cluster_status, set_node_status, set_lvol_status, set_snap_status, ) diff --git a/tests/migration/db_setup.py b/tests/migration/db_setup.py index c42a59773..51da82f7d 100644 --- a/tests/migration/db_setup.py +++ b/tests/migration/db_setup.py @@ -25,7 +25,7 @@ import time import uuid as _uuid_mod from dataclasses import dataclass, field -from typing import Dict, List, Optional +from typing import Dict, List from simplyblock_core.db_controller import DBController from simplyblock_core.models.hublvol import HubLVol diff --git a/tests/migration/mock_rpc_server.py b/tests/migration/mock_rpc_server.py index 4202c4f35..cf911c1a0 100644 --- a/tests/migration/mock_rpc_server.py +++ b/tests/migration/mock_rpc_server.py @@ -23,7 +23,6 @@ import json import logging -import math import random import threading import time diff --git a/tests/migration/test_complex_tree.py b/tests/migration/test_complex_tree.py index 4bb64b25f..a5b8182a8 100644 --- a/tests/migration/test_complex_tree.py +++ b/tests/migration/test_complex_tree.py @@ -31,8 +31,6 @@ """ import time -import threading -import pytest from simplyblock_core.controllers import migration_controller, lvol_controller, snapshot_controller from simplyblock_core.models.lvol_migration import LVolMigration @@ -392,7 +390,7 @@ def test_create_delete_independent_lvol_during_migration( _seed_lvol(mock_src_server, new_lvol, ctx.node("src")) # Delete the independent lvol l_ind (not involved in any migration) - result = lvol_controller.delete_lvol(ctx.lvol_uuid("l_ind")) + _ = lvol_controller.delete_lvol(ctx.lvol_uuid("l_ind")) # Must not be blocked by the l3 migration # (may fail for RPC reasons but not for migration protection) diff --git a/tests/migration/test_ctl.py b/tests/migration/test_ctl.py index bcf820dcd..c502da30f 100644 --- a/tests/migration/test_ctl.py +++ b/tests/migration/test_ctl.py @@ -36,7 +36,6 @@ from simplyblock_core.db_controller import DBController from simplyblock_core.models.cluster import Cluster -from simplyblock_core.models.lvol_migration import LVolMigration from simplyblock_core.models.storage_node import StorageNode from tests.migration.topology_loader import ( diff --git a/tests/migration/test_migration_flow.py b/tests/migration/test_migration_flow.py index 10c8721d8..377bcbcb7 100644 --- a/tests/migration/test_migration_flow.py +++ b/tests/migration/test_migration_flow.py @@ -23,8 +23,8 @@ from simplyblock_core.models.lvol_migration import LVolMigration from simplyblock_core.models.storage_node import StorageNode -from tests.migration.conftest import run_migration_task, set_node_status, set_cluster_status -from tests.migration.topology_loader import load_topology, TestContext +from tests.migration.conftest import run_migration_task, set_node_status +from tests.migration.topology_loader import TestContext # Lazily initialised so the module can be imported without FDB installed. _db_instance = None @@ -135,7 +135,6 @@ def test_single_snap_migration_completes(self, topology_two_node, mock_src_server, mock_tgt_server): """Happy path: one snapshot on the source → successful full migration.""" ctx = topology_two_node - src_node = ctx.node("src") tgt_node = ctx.node("tgt") lvol = ctx.lvol("l1") @@ -163,7 +162,6 @@ def test_migration_no_target_subsystem_reuse(self, custom_topology, When two lvols share the same NQN subsystem, the second migration must re-use the existing subsystem on the target rather than creating a new one. """ - shared_nqn = "nqn.2023-02.io.simplyblock:shared-grp" spec = { "cluster": {}, "nodes": [ @@ -187,7 +185,6 @@ def test_migration_no_target_subsystem_reuse(self, custom_topology, ], } ctx = custom_topology(spec) - src_node = ctx.node("src") tgt_node = ctx.node("tgt") _seed_all(mock_src_server, ctx, "src") @@ -526,7 +523,6 @@ def test_lvol_registered_and_exposed_on_secondary( _seed_all(mock_src_server, ctx, "src") lvol = ctx.lvol("l1") - snap = ctx.snap("s1") mig_id, err = migration_controller.start_migration(lvol.uuid, tgt_node.uuid) assert err is None diff --git a/tests/migration/test_scalability.py b/tests/migration/test_scalability.py index 57f889891..51d2d3b33 100644 --- a/tests/migration/test_scalability.py +++ b/tests/migration/test_scalability.py @@ -394,8 +394,8 @@ def test_migration_throughput(self, scale_topology): vols_per_sec = 20 / elapsed snaps_per_sec = total_snaps / elapsed - print(f"\n--- Scalability throughput ---") - print(f" Volumes migrated: 20") + print("\n--- Scalability throughput ---") + print(" Volumes migrated: 20") print(f" Snapshots migrated: {total_snaps}") print(f" Elapsed: {elapsed:.1f}s") print(f" Volumes/sec: {vols_per_sec:.2f}") @@ -545,7 +545,7 @@ def test_large_volume_migration(self, large_vol_topology, mock_tgt_server): assert snap.snap_bdev.startswith(tgt.lvstore + "/"), ( f"snap {snap_uuid} snap_bdev not updated: {snap.snap_bdev}") - print(f"\n--- Large volume migration ---") + print("\n--- Large volume migration ---") print(f" Snapshots: {NUM_LARGE_SNAPS}") print(f" Snaps migrated: {len(m.snaps_migrated)}") print(f" Elapsed: {elapsed:.1f}s") diff --git a/tests/migration/test_unit_controller.py b/tests/migration/test_unit_controller.py index fa8ed7a6e..da45727b7 100644 --- a/tests/migration/test_unit_controller.py +++ b/tests/migration/test_unit_controller.py @@ -7,8 +7,7 @@ import time import unittest -from types import SimpleNamespace -from unittest.mock import MagicMock, patch, call +from unittest.mock import MagicMock, patch from simplyblock_core.models.lvol_migration import LVolMigration from simplyblock_core.models.lvol_model import LVol diff --git a/tests/migration/topology_loader.py b/tests/migration/topology_loader.py index 8dad1002e..1773983a4 100644 --- a/tests/migration/topology_loader.py +++ b/tests/migration/topology_loader.py @@ -86,12 +86,10 @@ """ import json -import os import time import uuid as _uuid_mod -from typing import Any, Dict, List, Optional +from typing import Any, Dict, Optional -from simplyblock_core import constants from simplyblock_core.models.hublvol import HubLVol from simplyblock_core.models.iface import IFace from simplyblock_core.models.lvol_model import LVol diff --git a/tests/test_backup.py b/tests/test_backup.py index 2bc4605fb..7dba29713 100644 --- a/tests/test_backup.py +++ b/tests/test_backup.py @@ -19,7 +19,7 @@ """ import unittest -from unittest.mock import MagicMock, patch, call +from unittest.mock import MagicMock, patch import time from simplyblock_core.models.backup import Backup, BackupPolicy, BackupPolicyAttachment @@ -28,7 +28,6 @@ from simplyblock_core.models.storage_node import StorageNode from simplyblock_core.models.snapshot import SnapShot from simplyblock_core.models.lvol_model import LVol -from simplyblock_core.models.pool import Pool # --------------------------------------------------------------------------- diff --git a/tests/test_dual_fault_tolerance.py b/tests/test_dual_fault_tolerance.py index 7754b8de2..0867e80c5 100644 --- a/tests/test_dual_fault_tolerance.py +++ b/tests/test_dual_fault_tolerance.py @@ -18,8 +18,7 @@ """ import unittest -from types import SimpleNamespace -from unittest.mock import MagicMock, patch, PropertyMock +from unittest.mock import MagicMock, patch from simplyblock_core.models.cluster import Cluster from simplyblock_core.models.lvol_model import LVol @@ -652,8 +651,8 @@ def test_both_set_prefers_secondary_1(self): def test_explicit_primary_node_id_overrides(self): """When primary_node_id is passed explicitly, it should be used.""" - sec = _node("sec", lvstore_stack_secondary_1="primary-A", - lvstore_stack_secondary_2="primary-B") + _ = _node("sec", lvstore_stack_secondary_1="primary-A", + lvstore_stack_secondary_2="primary-B") explicit = "primary-B" primary_ref = explicit # simulating the function logic assert primary_ref == "primary-B" diff --git a/tests/test_dual_ft_e2e.py b/tests/test_dual_ft_e2e.py index 5dfb4be31..3794fb65c 100644 --- a/tests/test_dual_ft_e2e.py +++ b/tests/test_dual_ft_e2e.py @@ -21,14 +21,14 @@ import time import uuid as _uuid_mod from http.server import BaseHTTPRequestHandler, HTTPServer -from typing import Any, Dict, List, Optional -from unittest.mock import MagicMock, patch +from typing import Dict, List +from unittest.mock import patch import pytest from simplyblock_core.models.cluster import Cluster from simplyblock_core.models.iface import IFace -from simplyblock_core.models.nvme_device import NVMeDevice, JMDevice +from simplyblock_core.models.nvme_device import NVMeDevice from simplyblock_core.models.storage_node import StorageNode from simplyblock_core.models.stats import ClusterStatObject @@ -957,11 +957,6 @@ def test_recreate_lvstore_on_sec_both_secondaries(self, cluster_env): # Get all secondaries all_nodes = db.get_storage_nodes_by_cluster_id(cl.uuid) secondaries = [n for n in all_nodes if n.is_secondary_node] - primaries = [n for n in all_nodes if not n.is_secondary_node] - - # Track which subsystem_create calls happen (for min_cntlid verification) - subsystem_calls = [] - original_subsystem_create = None # Pick a secondary that has lvstore_stack_secondary_1 set target_sec = None @@ -1000,7 +995,7 @@ def test_recreate_lvstore_secondary_2_min_cntlid(self, cluster_env): Verify that recreate_lvstore_on_sec uses min_cntlid=2000 for secondary_2 and min_cntlid=1000 for secondary_1. """ - from simplyblock_core import cluster_ops, storage_node_ops + from simplyblock_core import cluster_ops from simplyblock_core.db_controller import DBController env = cluster_env @@ -1317,7 +1312,7 @@ def _seed_secondary_for_health_check(env, primary, sec_node_id, db): def _find_server_for_node(env, node): """Find the mock server index for a given node by matching rpc_port.""" - offset = _worker_port_offset() + _ = _worker_port_offset() for i, srv in enumerate(env['servers']): if srv.port == node.rpc_port: return i diff --git a/tests/test_nvmeof_security.py b/tests/test_nvmeof_security.py index bcb463202..696330228 100644 --- a/tests/test_nvmeof_security.py +++ b/tests/test_nvmeof_security.py @@ -16,8 +16,9 @@ """ import unittest -from unittest.mock import MagicMock, patch, PropertyMock +from unittest.mock import MagicMock, patch +import simplyblock_core.controllers.lvol_controller as lvol_ctl from simplyblock_core import constants from simplyblock_core.models.cluster import Cluster from simplyblock_core.models.lvol_model import LVol @@ -332,7 +333,6 @@ def test_multiple_hosts_each_get_unique_keys(self): # add_host_to_lvol / remove_host_from_lvol # --------------------------------------------------------------------------- -import simplyblock_core.controllers.lvol_controller as lvol_ctl def _mock_db_for_host_ops(lvol, node, cluster): diff --git a/tests/test_nvmeof_security_e2e.py b/tests/test_nvmeof_security_e2e.py index a5a48d354..13913a8a3 100644 --- a/tests/test_nvmeof_security_e2e.py +++ b/tests/test_nvmeof_security_e2e.py @@ -14,11 +14,10 @@ import json import random -import time import unittest import uuid as _uuid_mod -from tests.migration.mock_rpc_server import MockRpcServer, NodeState +from tests.migration.mock_rpc_server import MockRpcServer # --------------------------------------------------------------------------- @@ -566,7 +565,7 @@ class TestGetHostSecret(unittest.TestCase): """Test the get_host_secret controller function via mocking.""" def test_get_secret_success(self): - from unittest.mock import patch, MagicMock + from unittest.mock import patch from simplyblock_core.models.lvol_model import LVol from simplyblock_core.controllers import lvol_controller diff --git a/tests/test_port_allocation.py b/tests/test_port_allocation.py index 7aef4b15c..e4f2273a3 100644 --- a/tests/test_port_allocation.py +++ b/tests/test_port_allocation.py @@ -18,8 +18,7 @@ """ import unittest -from types import SimpleNamespace -from unittest.mock import MagicMock, patch, PropertyMock +from unittest.mock import patch from simplyblock_core.models.cluster import Cluster from simplyblock_core.models.storage_node import StorageNode @@ -583,7 +582,7 @@ def test_lvstore_ports_differ_from_hublvol_ports(self, mock_db_cls, mock_config) _node("n2", lvol_subsys_port=4423, nvmf_port=4424, hublvol_port=4425), ] mock_db_cls.return_value.get_storage_nodes_by_cluster_id.return_value = nodes - all_ports = _get_all_nvmf_ports("c1") + _ = _get_all_nvmf_ports("c1") # Each port type for each node is distinct lvol_ports = {4420, 4423} @@ -706,8 +705,7 @@ class TestEndToEndAllocationScenario(unittest.TestCase): @patch("simplyblock_core.utils._get_cluster_port_config", return_value=(4420, 8080, 50001)) @patch("simplyblock_core.db_controller.DBController") def test_four_nodes_two_hosts(self, mock_db_cls, mock_config): - from simplyblock_core.utils import get_next_nvmf_port, get_next_rpc_port, get_next_fw_port - from simplyblock_core.utils import _get_all_nvmf_ports + from simplyblock_core.utils import get_next_rpc_port, get_next_fw_port # Simulate progressive node creation nodes = []