Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion simplyblock_cli/scripts/cli-wrapper.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import logging
import sys
import traceback

from simplyblock_cli.clibase import CLIWrapperBase, range_type, regex_type, size_type
from simplyblock_cli.clibase import CLIWrapperBase, range_type, size_type
from simplyblock_core import utils

class CLIWrapper(CLIWrapperBase):
Expand Down
73 changes: 69 additions & 4 deletions simplyblock_core/services/lvol_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,57 @@
from simplyblock_core.models.lvol_model import LVol
from simplyblock_core.controllers import health_controller, lvol_events, tasks_controller, lvol_controller
from simplyblock_core.models.nvme_device import NVMeDevice
from simplyblock_core.models.snapshot import SnapShot
from simplyblock_core.models.storage_node import StorageNode
from simplyblock_core.rpc_client import RPCClient

logger = utils.get_logger(__name__)

utils.init_sentry_sdk(__name__)


def create_lvol_for_deletion(bdev_uuid, bdev_alias, snode):
lvol = LVol()
lvol.lvol_name = bdev_uuid
lvol.pool_uuid = db.get_pools(snode.cluster_id)[0].uuid
lvol.ha_type = "ha"
lvol.uuid = bdev_uuid
lvol.lvol_bdev = bdev_alias.split("/")[1]
lvol.nqn = bdev_uuid
lvol.nodes = [snode.get_id(), snode.secondary_node_id]
lvol.lvol_type = 'lvol'
lvol.hostname = snode.hostname
lvol.node_id = snode.get_id()
lvol.lvs_name = snode.lvstore
lvol.subsys_port = snode.lvol_subsys_port
lvol.top_bdev = f"{lvol.lvs_name}/{lvol.lvol_bdev}"
lvol.base_bdev = lvol.top_bdev
lvol.lvol_uuid = bdev_uuid
lvol.status = LVol.STATUS_IN_DELETION
lvol.deleted = True
lvol.bdev_stack = [{
"type": "bdev_lvol",
"name": lvol.lvol_bdev,
"params": {
"name": lvol.lvol_bdev,
"lvs_name": lvol.lvs_name,
"lvol_priority_class": 0}}]
lvol.write_to_db()


def create_snapshot_for_deletion(bdev_uuid, bdev_alias, snode):
snap = SnapShot()
snap.uuid = bdev_uuid
snap.snap_uuid = bdev_uuid
snap.pool_uuid = db.get_pools(snode.cluster_id)[0].uuid
snap.cluster_id = snode.cluster_id
snap.snap_name = bdev_uuid
snap.snap_bdev = bdev_alias
snap.status = SnapShot.STATUS_IN_DELETION
snap.deleted = True
snap.write_to_db()


def set_lvol_status(lvol, status):
if lvol.status != status:
lvol = db.get_lvol_by_id(lvol.get_id())
Expand Down Expand Up @@ -160,6 +204,7 @@ def process_lvol_delete_try_again(lvol):


def check_node(snode):
node_bdevs = []
node_bdev_names = []
node_lvols_nqns = {}
sec_node_bdev_names = {}
Expand Down Expand Up @@ -193,8 +238,10 @@ def check_node(snode):
if ret:
for sub in ret:
sec_node_lvols_nqns[sub['nqn']] = sub

known_bdev_names = []
for lvol in db.get_lvols_by_node_id(snode.get_id()):
if lvol.lvol_uuid:
known_bdev_names.append(lvol.lvol_uuid)

if lvol.status == LVol.STATUS_IN_CREATION:
continue
Expand Down Expand Up @@ -330,12 +377,30 @@ def check_node(snode):
if passed:
set_lvol_status(lvol, LVol.STATUS_ONLINE)

if snode.lvstore_status == "ready":
for snap in db.get_snapshots_by_node_id(snode.get_id()):
if snap.snap_uuid:
known_bdev_names.append(snap.snap_uuid)

for snap in db.get_snapshots_by_node_id(snode.get_id()):
present = health_controller.check_bdev(snap.snap_bdev, bdev_names=node_bdev_names)
present = health_controller.check_bdev(snap.snap_bdev, bdev_names=node_bdev_names)
if snode.lvstore_status == "ready":
set_snapshot_health_check(snap, present)

if node_bdevs:
for bdev in node_bdevs:
if bdev["product_name"] == "Logical Volume":
bdev_uuid = bdev["uuid"]
bdev_alias = bdev["aliases"][0]
is_snapshot = bdev["driver_specific"]["lvol"]["snapshot"]
if bdev_uuid not in known_bdev_names:
try:
if is_snapshot:
logger.info(f"Snapshot: {bdev_uuid} not found in fdb, will be deleted")
create_snapshot_for_deletion(bdev_uuid, bdev_alias, snode)
else:
logger.info(f"LVol: {bdev_uuid} not found in fdb, will be deleted")
create_lvol_for_deletion(bdev_uuid, bdev_alias, snode)
except Exception as e:
logger.exception(e)


# get DB controller
Expand Down
Loading