Add SNMP profile mapping and fix asset cleanup
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.auth.dependencies import get_current_user, require_role
|
||||
from app.db.session import get_db
|
||||
from app.models import Asset, User
|
||||
from app.models import Asset, Incident, Monitor, User
|
||||
from app.schemas.core import AssetCreate, AssetRead, AssetUpdate
|
||||
|
||||
router = APIRouter(prefix="/assets", tags=["assets"])
|
||||
@@ -86,5 +88,26 @@ def delete_asset(
|
||||
asset = db.get(Asset, asset_id)
|
||||
if asset is None:
|
||||
raise HTTPException(status_code=404, detail="Asset not found")
|
||||
|
||||
attached_monitors = db.scalars(select(Monitor).where(Monitor.asset_id == asset.id)).all()
|
||||
attached_monitor_ids = [monitor.id for monitor in attached_monitors]
|
||||
now = datetime.now(UTC)
|
||||
|
||||
if attached_monitor_ids:
|
||||
monitor_incidents = db.scalars(select(Incident).where(Incident.monitor_id.in_(attached_monitor_ids))).all()
|
||||
for incident in monitor_incidents:
|
||||
if incident.status == "open":
|
||||
incident.status = "resolved"
|
||||
incident.resolved_at = now
|
||||
incident.details = {**(incident.details or {}), "recovery_message": "Asset was deleted"}
|
||||
incident.monitor_id = None
|
||||
|
||||
asset_incidents = db.scalars(select(Incident).where(Incident.asset_id == asset.id)).all()
|
||||
for incident in asset_incidents:
|
||||
incident.asset_id = None
|
||||
|
||||
for monitor in attached_monitors:
|
||||
db.delete(monitor)
|
||||
|
||||
db.delete(asset)
|
||||
db.commit()
|
||||
|
||||
@@ -65,6 +65,9 @@ def _discovery_to_read(credential_profile_id: int, discovered: DiscoveredSnmpDev
|
||||
return SnmpDiscoveryRead(
|
||||
host=discovered.host,
|
||||
credential_profile_id=credential_profile_id,
|
||||
profile_key=discovered.profile_key,
|
||||
profile_name=discovered.profile_name,
|
||||
capabilities=discovered.capabilities,
|
||||
device_name=discovered.device_name,
|
||||
description=discovered.description,
|
||||
uptime_seconds=discovered.uptime_seconds,
|
||||
@@ -74,15 +77,27 @@ def _discovery_to_read(credential_profile_id: int, discovered: DiscoveredSnmpDev
|
||||
|
||||
|
||||
def _monitorable_items(discovered: DiscoveredSnmpDevice) -> list[SnmpDiscoveryItemRead]:
|
||||
items = [
|
||||
SnmpDiscoveryItemRead(
|
||||
item_id="device.uptime",
|
||||
item_type="device_uptime",
|
||||
group="Device Health",
|
||||
label="Device uptime",
|
||||
unit="seconds",
|
||||
items = []
|
||||
if discovered.uptime_seconds is not None:
|
||||
items.append(
|
||||
SnmpDiscoveryItemRead(
|
||||
item_id="device.uptime",
|
||||
item_type="device_uptime",
|
||||
group="Device Health",
|
||||
label="Device uptime",
|
||||
unit="seconds",
|
||||
)
|
||||
)
|
||||
]
|
||||
items.extend(
|
||||
SnmpDiscoveryItemRead(
|
||||
item_id=item.item_id,
|
||||
item_type=item.item_type,
|
||||
group=item.group,
|
||||
label=item.label,
|
||||
unit=item.unit,
|
||||
)
|
||||
for item in discovered.health_items
|
||||
)
|
||||
for interface in discovered.interfaces:
|
||||
group = f"Interface {interface.name}"
|
||||
item_prefix = f"interface.{interface.index}"
|
||||
|
||||
Reference in New Issue
Block a user