Skip to content

Commit

Permalink
Make factory default device also mark neighbors as unsync, and rollba…
Browse files Browse the repository at this point in the history
…ck if unsuccessful in deleting from database. Do logging with job_id
  • Loading branch information
indy-independence committed Aug 21, 2023
1 parent a8aa089 commit bd269d1
Showing 1 changed file with 28 additions and 13 deletions.
41 changes: 28 additions & 13 deletions src/cnaas_nms/devicehandler/erase.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,26 @@
from typing import Optional

Check warning on line 1 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L1

Added line #L1 was not covered by tests

from nornir_netmiko.tasks import netmiko_send_command
from nornir_utils.plugins.functions import print_result
from sqlalchemy.exc import IntegrityError

Check warning on line 5 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L5

Added line #L5 was not covered by tests

import cnaas_nms.devicehandler.nornir_helper
from cnaas_nms.db.device import Device, DeviceState, DeviceType
from cnaas_nms.db.session import sqla_session
from cnaas_nms.devicehandler.nornir_helper import NornirJobResult
from cnaas_nms.devicehandler.sync_history import add_sync_event

Check warning on line 11 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L11

Added line #L11 was not covered by tests
from cnaas_nms.scheduler.wrapper import job_wrapper
from cnaas_nms.tools.log import get_logger

logger = get_logger()


def device_erase_task(task, hostname: str) -> str:
def device_erase_task(task, hostname: str, job_id: int) -> str:
logger = get_logger()

Check warning on line 17 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L16-L17

Added lines #L16 - L17 were not covered by tests
try:
res = task.run(netmiko_send_command, command_string="enable", expect_string=".*#", name="Enable")

task.run(netmiko_send_command, command_string="enable", expect_string=".*#", name="Enable")

Check warning on line 19 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L19

Added line #L19 was not covered by tests
res = task.run(netmiko_send_command, command_string="write erase now", expect_string=".*#", name="Write rase")
print_result(res)
except Exception as e:
logger.info("Failed to factory default device {}, reason: {}".format(task.host.name, e))
logger.exception("Failed to factory default device {}, reason: {}".format(task.host.name, e))

Check warning on line 23 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L23

Added line #L23 was not covered by tests
raise Exception("Factory default device")

# Remove cnaas device certificates if they are found
Expand Down Expand Up @@ -48,8 +50,8 @@ def device_erase_task(task, hostname: str) -> str:


@job_wrapper
def device_erase(device_id: int = None, job_id: int = None) -> NornirJobResult:

def device_erase(device_id: int = None, job_id: int = None, scheduled_by: Optional[str] = None) -> NornirJobResult:
logger = get_logger()

Check warning on line 54 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L53-L54

Added lines #L53 - L54 were not covered by tests
with sqla_session() as session:
dev: Device = session.query(Device).filter(Device.id == device_id).one_or_none()
if dev:
Expand All @@ -69,13 +71,13 @@ def device_erase(device_id: int = None, job_id: int = None) -> NornirJobResult:
nr_filtered = nr.filter(name=hostname)

device_list = list(nr_filtered.inventory.hosts.keys())
logger.info("Device selected: {}".format(device_list))
logger.info("Device selected for factory default: {}".format(device_list))

Check warning on line 74 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L74

Added line #L74 was not covered by tests

try:
nrresult = nr_filtered.run(task=device_erase_task, hostname=hostname)
nrresult = nr_filtered.run(task=device_erase_task, hostname=hostname, job_id=job_id)

Check warning on line 77 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L77

Added line #L77 was not covered by tests
print_result(nrresult)
except Exception as e:
logger.exception("Exception while erasing device: {}".format(str(e)))
logger.exception("Exception while doing factory default of device: {}".format(str(e)))

Check warning on line 80 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L80

Added line #L80 was not covered by tests
return NornirJobResult(nrresult=nrresult)

failed_hosts = list(nrresult.failed_hosts.keys())
Expand All @@ -88,7 +90,20 @@ def device_erase(device_id: int = None, job_id: int = None) -> NornirJobResult:
if failed_hosts == []:
with sqla_session() as session:
dev: Device = session.query(Device).filter(Device.id == device_id).one_or_none()
session.delete(dev)
session.commit()
try:
for nei in dev.get_neighbors(session):
nei.synchronized = False
add_sync_event(nei.hostname, "neighbor_deleted", scheduled_by)
except Exception as e:
logger.warning("Could not mark neighbor as unsync after deleting {}: {}".format(dev.hostname, e))
try:
session.delete(dev)
session.commit()
except IntegrityError as e:
session.rollback()
logger.exception("Could not delete device because existing references: {}".format(e))
except Exception as e:
session.rollback()
logger.exception("Could not delete device: {}".format(e))

Check warning on line 107 in src/cnaas_nms/devicehandler/erase.py

View check run for this annotation

Codecov / codecov/patch

src/cnaas_nms/devicehandler/erase.py#L93-L107

Added lines #L93 - L107 were not covered by tests

return NornirJobResult(nrresult=nrresult)

0 comments on commit bd269d1

Please sign in to comment.