improved coretk gui alerts to display alert text when selected, fixed merged code for adding a check to cleanup interfaces, updated session.exceptions to use enums directly

This commit is contained in:
Blake Harnden 2019-12-20 10:51:52 -08:00
parent c0c23190d1
commit 513eaf2b76
8 changed files with 50 additions and 60 deletions

View file

@ -145,7 +145,7 @@ def handle_exception_event(event):
""" """
return core_pb2.ExceptionEvent( return core_pb2.ExceptionEvent(
node_id=event.node, node_id=event.node,
level=event.level, level=event.level.value,
source=event.source, source=event.source,
date=event.date, date=event.date,
text=event.text, text=event.text,

View file

@ -299,7 +299,7 @@ class CoreHandler(socketserver.BaseRequestHandler):
[ [
(ExceptionTlvs.NODE, exception_data.node), (ExceptionTlvs.NODE, exception_data.node),
(ExceptionTlvs.SESSION, exception_data.session), (ExceptionTlvs.SESSION, exception_data.session),
(ExceptionTlvs.LEVEL, exception_data.level), (ExceptionTlvs.LEVEL, exception_data.level.value),
(ExceptionTlvs.SOURCE, exception_data.source), (ExceptionTlvs.SOURCE, exception_data.source),
(ExceptionTlvs.DATE, exception_data.date), (ExceptionTlvs.DATE, exception_data.date),
(ExceptionTlvs.TEXT, exception_data.text), (ExceptionTlvs.TEXT, exception_data.text),

View file

@ -1411,13 +1411,12 @@ class Session:
""" """
Generate and broadcast an exception event. Generate and broadcast an exception event.
:param str level: exception level :param core.emulator.enumerations.ExceptionLevel level: exception level
:param str source: source name :param str source: source name
:param int node_id: node related to exception :param int node_id: node related to exception
:param str text: exception message :param str text: exception message
:return: nothing :return: nothing
""" """
exception_data = ExceptionData( exception_data = ExceptionData(
node=node_id, node=node_id,
session=str(self.id), session=str(self.id),
@ -1426,7 +1425,6 @@ class Session:
date=time.ctime(), date=time.ctime(),
text=text, text=text,
) )
self.broadcast_exception(exception_data) self.broadcast_exception(exception_data)
def instantiate(self): def instantiate(self):

View file

@ -167,7 +167,7 @@ class CoreClient:
elif event.HasField("config_event"): elif event.HasField("config_event"):
logging.info("config event: %s", event) logging.info("config event: %s", event)
elif event.HasField("exception_event"): elif event.HasField("exception_event"):
self.handle_exception_event(event.exception_event) self.handle_exception_event(event)
else: else:
logging.info("unhandled event: %s", event) logging.info("unhandled event: %s", event)
@ -204,7 +204,7 @@ class CoreClient:
def handle_throughputs(self, event): def handle_throughputs(self, event):
if event.session_id != self.session_id: if event.session_id != self.session_id:
logging.warn( logging.warning(
"ignoring throughput event session(%s) current(%s)", "ignoring throughput event session(%s) current(%s)",
event.session_id, event.session_id,
self.session_id, self.session_id,

View file

@ -4,9 +4,7 @@ check engine light
import tkinter as tk import tkinter as tk
from tkinter import ttk from tkinter import ttk
from grpc import RpcError from core.api.grpc.core_pb2 import ExceptionLevel
from core.api.grpc import core_pb2
from core.gui.dialogs.dialog import Dialog from core.gui.dialogs.dialog import Dialog
from core.gui.themes import PADX, PADY from core.gui.themes import PADX, PADY
from core.gui.widgets import CodeText from core.gui.widgets import CodeText
@ -18,6 +16,7 @@ class AlertsDialog(Dialog):
self.app = app self.app = app
self.tree = None self.tree = None
self.codetext = None self.codetext = None
self.alarm_map = {}
self.draw() self.draw()
def draw(self): def draw(self):
@ -48,25 +47,31 @@ class AlertsDialog(Dialog):
self.tree.bind("<<TreeviewSelect>>", self.click_select) self.tree.bind("<<TreeviewSelect>>", self.click_select)
for alarm in self.app.statusbar.core_alarms: for alarm in self.app.statusbar.core_alarms:
level = self.get_level(alarm.level) exception = alarm.exception_event
self.tree.insert( level_name = ExceptionLevel.Enum.Name(exception.level)
insert_id = self.tree.insert(
"", "",
tk.END, tk.END,
text=str(alarm.date), text=exception.date,
values=( values=(
alarm.date, exception.date,
level + " (%s)" % alarm.level, level_name,
alarm.session_id, alarm.session_id,
alarm.node_id, exception.node_id,
alarm.source, exception.source,
), ),
tags=(level,), tags=(level_name,),
) )
self.alarm_map[insert_id] = alarm
self.tree.tag_configure("ERROR", background="#ff6666") error_name = ExceptionLevel.Enum.Name(ExceptionLevel.ERROR)
self.tree.tag_configure("FATAL", background="#d9d9d9") self.tree.tag_configure(error_name, background="#ff6666")
self.tree.tag_configure("WARNING", background="#ffff99") fatal_name = ExceptionLevel.Enum.Name(ExceptionLevel.FATAL)
self.tree.tag_configure("NOTICE", background="#85e085") self.tree.tag_configure(fatal_name, background="#d9d9d9")
warning_name = ExceptionLevel.Enum.Name(ExceptionLevel.WARNING)
self.tree.tag_configure(warning_name, background="#ffff99")
notice_name = ExceptionLevel.Enum.Name(ExceptionLevel.NOTICE)
self.tree.tag_configure(notice_name, background="#85e085")
yscrollbar = ttk.Scrollbar(frame, orient="vertical", command=self.tree.yview) yscrollbar = ttk.Scrollbar(frame, orient="vertical", command=self.tree.yview)
yscrollbar.grid(row=0, column=1, sticky="ns") yscrollbar.grid(row=0, column=1, sticky="ns")
@ -105,40 +110,13 @@ class AlertsDialog(Dialog):
dialog = DaemonLog(self, self.app) dialog = DaemonLog(self, self.app)
dialog.show() dialog.show()
def get_level(self, level):
if level == core_pb2.ExceptionLevel.ERROR:
return "ERROR"
if level == core_pb2.ExceptionLevel.FATAL:
return "FATAL"
if level == core_pb2.ExceptionLevel.WARNING:
return "WARNING"
if level == core_pb2.ExceptionLevel.NOTICE:
return "NOTICE"
def click_select(self, event): def click_select(self, event):
current = self.tree.selection() current = self.tree.selection()[0]
values = self.tree.item(current)["values"] alarm = self.alarm_map[current]
time = values[0] self.codetext.text.config(state=tk.NORMAL)
level = values[1]
session_id = values[2]
node_id = values[3]
source = values[4]
text = "DATE: %s\nLEVEL: %s\nNODE: %s (%s)\nSESSION: %s\nSOURCE: %s\n\n" % (
time,
level,
node_id,
self.app.core.canvas_nodes[node_id].core_node.name,
session_id,
source,
)
try:
sid = self.app.core.session_id
self.app.core.client.get_node(sid, node_id)
text = text + "node created"
except RpcError:
text = text + "node not created"
self.codetext.text.delete("1.0", "end") self.codetext.text.delete("1.0", "end")
self.codetext.text.insert("1.0", text) self.codetext.text.insert("1.0", alarm.exception_event.text)
self.codetext.text.config(state=tk.DISABLED)
class DaemonLog(Dialog): class DaemonLog(Dialog):

View file

@ -127,7 +127,8 @@ class LinuxNetClient:
:return: nothing :return: nothing
""" """
self.run( self.run(
f"[ -e /sys/class/net/{device} ] && {IP_BIN} -6 address flush dev {device} || true" f"[ -e /sys/class/net/{device} ] && {IP_BIN} -6 address flush dev {device} || true",
shell=True,
) )
def device_mac(self, device, mac): def device_mac(self, device, mac):

View file

@ -14,7 +14,7 @@ import time
from core import utils from core import utils
from core.constants import which from core.constants import which
from core.emulator.data import FileData from core.emulator.data import FileData
from core.emulator.enumerations import MessageFlags, RegisterTlvs from core.emulator.enumerations import ExceptionLevels, MessageFlags, RegisterTlvs
from core.errors import CoreCommandError from core.errors import CoreCommandError
@ -628,7 +628,13 @@ class CoreServices:
for args in service.shutdown: for args in service.shutdown:
try: try:
node.cmd(args) node.cmd(args)
except CoreCommandError: except CoreCommandError as e:
self.session.exception(
ExceptionLevels.ERROR,
"services",
node.id,
f"error stopping service {service.name}: {e.stderr}",
)
logging.exception("error running stop command %s", args) logging.exception("error running stop command %s", args)
status = -1 status = -1
return status return status

View file

@ -1101,19 +1101,26 @@ class TestGrpc:
client = CoreGrpcClient() client = CoreGrpcClient()
session = grpc_server.coreemu.create_session() session = grpc_server.coreemu.create_session()
queue = Queue() queue = Queue()
exception_level = ExceptionLevels.FATAL
source = "test"
node_id = None
text = "exception message"
def handle_event(event_data): def handle_event(event_data):
assert event_data.session_id == session.id assert event_data.session_id == session.id
assert event_data.HasField("exception_event") assert event_data.HasField("exception_event")
exception_event = event_data.exception_event
assert exception_event.level == exception_level.value
assert exception_event.node_id == 0
assert exception_event.source == source
assert exception_event.text == text
queue.put(event_data) queue.put(event_data)
# then # then
with client.context_connect(): with client.context_connect():
client.events(session.id, handle_event) client.events(session.id, handle_event)
time.sleep(0.1) time.sleep(0.1)
session.exception( session.exception(exception_level, source, node_id, text)
ExceptionLevels.FATAL.value, "test", None, "exception message"
)
# then # then
queue.get(timeout=5) queue.get(timeout=5)