-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Table refresh with ntie #87
Changes from 32 commits
cdce887
b62e237
fd66f41
e8001e5
b9aa649
e26220b
b6efd1c
b397fa7
3fd1dd9
9b86829
174feb0
ddfd3d7
904ce38
16f513b
cb58703
f649e3b
072462c
f3230fc
d0e6be1
9f4ea40
b652a24
e060c77
1c8ee7e
2c2725a
fe38ddf
06778fb
9111cbd
1ddfc0b
8f98df0
059329e
dd22052
d4b69b2
0bbb74e
70f726c
b0dbecd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,7 +17,7 @@ | |
from datetime import datetime, timezone | ||
|
||
from werkzeug.exceptions import BadRequest | ||
from zinolib.controllers.zino1 import Zino1EventManager, RetryError, EventClosedError | ||
from zinolib.controllers.zino1 import Zino1EventManager, RetryError, EventClosedError, UpdateHandler | ||
from zinolib.event_types import Event, AdmState, PortState, BFDState, ReachabilityState, LogEntry, HistoryEntry | ||
from zinolib.compat import StrEnum | ||
from zinolib.ritz import NotConnectedError, AuthenticationError | ||
|
@@ -55,6 +55,10 @@ def auth_handler(username, password): | |
current_app.logger.info('Authenticated in Zino %s', current_app.event_manager.is_authenticated) | ||
|
||
if current_app.event_manager.is_authenticated: # is zino authenticated | ||
current_app.updater = UpdateHandler(current_app.event_manager) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I haven't followed zinolib, but was this functionality recently added to zinolib? In that case, you might want to change the version requirement for the zinolib dependency? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fixed |
||
current_app.updater.connect() | ||
current_app.logger.debug('UpdateHandler %s', current_app.updater) | ||
|
||
current_app.logger.debug('User is Zino authenticated %s', current_app.event_manager.is_authenticated) | ||
current_app.logger.debug('HOWITZ CONFIG %s', current_app.howitz_config) | ||
login_user(user, remember=True) | ||
|
@@ -63,6 +67,7 @@ def auth_handler(username, password): | |
session["expanded_events"] = {} | ||
session["errors"] = {} | ||
session["not_connected_counter"] = 0 | ||
session["event_ids"] = [] | ||
return user | ||
|
||
raise AuthenticationError('Unexpected error on Zino authentication') | ||
|
@@ -79,12 +84,20 @@ def logout_handler(): | |
session.pop('selected_events', []) | ||
session.pop('errors', {}) | ||
session.pop('not_connected_counter', 0) | ||
session.pop('event_ids', []) | ||
current_app.logger.info("Logged out successfully.") | ||
|
||
|
||
def get_current_events(): | ||
try: | ||
current_app.event_manager.get_events() | ||
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError when fetching current events %s', retryErr) | ||
try: | ||
current_app.event_manager.get_events() | ||
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError when fetching current events after retry, %s', retryErr) | ||
raise | ||
except NotConnectedError as notConnErr: | ||
if session["not_connected_counter"] > 1: # This error is not intermittent - increase counter and handle | ||
current_app.logger.exception('Recurrent NotConnectedError %s', notConnErr) | ||
|
@@ -104,47 +117,71 @@ def get_current_events(): | |
events[k].updated, | ||
), reverse=True)} | ||
|
||
# Save current events' IDs | ||
session["event_ids"] = list(events_sorted.keys()) | ||
session.modified = True | ||
|
||
table_events = [] | ||
for c in events_sorted.values(): | ||
table_events.append(create_table_event(c)) | ||
table_events.append(create_table_event(c, expanded=str(c.id) in session["expanded_events"], | ||
selected=str(c.id) in session["selected_events"])) | ||
|
||
current_app.logger.debug('TABLE EVENTS %s', table_events[0]) | ||
|
||
return table_events | ||
|
||
|
||
def poll_current_events(): | ||
try: | ||
current_app.event_manager.get_events() | ||
except NotConnectedError as notConnErr: | ||
if session["not_connected_counter"] > 1: # This error is not intermittent - increase counter and handle | ||
current_app.logger.exception('Recurrent NotConnectedError %s', notConnErr) | ||
session["not_connected_counter"] += 1 | ||
raise | ||
else: # This error is intermittent - increase counter and retry | ||
current_app.logger.exception('Intermittent NotConnectedError %s', notConnErr) | ||
session["not_connected_counter"] += 1 | ||
current_app.event_manager.get_events() | ||
pass | ||
|
||
events = current_app.event_manager.events | ||
def update_events(): | ||
updated_ids = set() | ||
|
||
events_sorted = {k: events[k] for k in sorted(events, | ||
key=lambda k: ( | ||
0 if events[k].adm_state == AdmState.IGNORED else 1, | ||
events[k].updated, | ||
), reverse=True)} | ||
while True: | ||
try: | ||
updated = current_app.updater.get_event_update() | ||
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError when NTIE refreshing current events %s', retryErr) | ||
try: | ||
updated = current_app.updater.get_event_update() | ||
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError when NTIE refreshing current events after retry, %s', retryErr) | ||
raise | ||
if not updated: | ||
break | ||
updated_ids.add(updated) | ||
|
||
return updated_ids | ||
|
||
|
||
def refresh_current_events(): | ||
event_ids = update_events() | ||
current_app.logger.debug('UPDATED EVENT IDS %s', event_ids) | ||
|
||
removed_events = [] | ||
modified_events = [] | ||
added_events = [] | ||
removed = current_app.event_manager.removed_ids | ||
existing = session["event_ids"] | ||
for i in event_ids: | ||
if i in removed: | ||
removed_events.append(i) | ||
existing.remove(i) | ||
elif i not in existing: | ||
c = current_app.event_manager.create_event_from_id(int(i)) | ||
added_events.append(create_table_event(c, expanded=False, selected=False)) | ||
existing.insert(0, int(i)) | ||
else: | ||
c = current_app.event_manager.create_event_from_id(int(i)) | ||
modified_events.append(create_table_event(c, | ||
expanded=str(c.id) in session["expanded_events"], | ||
selected=str(c.id) in session["selected_events"])) | ||
|
||
poll_events = [] | ||
for c in events_sorted.values(): | ||
poll_events.append(create_polled_event(create_table_event(c), expanded=str(c.id) in session["expanded_events"], | ||
selected=str(c.id) in session["selected_events"])) | ||
session["event_ids"] = existing | ||
session.modified = True | ||
|
||
return poll_events | ||
return removed_events, modified_events, added_events | ||
|
||
|
||
# todo remove all use of helpers from curitz | ||
def create_table_event(event): | ||
def create_table_event(event, expanded=False, selected=False): | ||
common = {} | ||
|
||
try: | ||
|
@@ -164,23 +201,18 @@ def create_table_event(event): | |
raise | ||
|
||
common.update(vars(event)) | ||
|
||
return common | ||
|
||
|
||
def create_polled_event(table_event, expanded=False, selected=False): | ||
poll_event = { | ||
"event": table_event | ||
table_event = { | ||
"event": common | ||
} | ||
if expanded: | ||
poll_event["event_attr"], poll_event["event_logs"], poll_event["event_history"], poll_event["event_msgs"] = ( | ||
get_event_details(int(table_event["id"]))) | ||
poll_event["expanded"] = expanded | ||
table_event["event_attr"], table_event["event_logs"], table_event["event_history"], table_event["event_msgs"] = ( | ||
get_event_details(int(event.id))) | ||
table_event["expanded"] = expanded | ||
|
||
if selected: | ||
poll_event["selected"] = selected | ||
table_event["selected"] = selected | ||
|
||
return poll_event | ||
return table_event | ||
|
||
|
||
# fixme implementation copied from curitz | ||
|
@@ -208,7 +240,11 @@ def get_event_attributes(id, res_format=dict): | |
event = current_app.event_manager.create_event_from_id(int(id)) | ||
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError when fetching event attributes %s', retryErr) | ||
raise | ||
try: | ||
event = current_app.event_manager.create_event_from_id(int(id)) | ||
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError when fetching event attributes after retry, %s', retryErr) | ||
raise | ||
|
||
event_dict = vars(event) | ||
attr_list = [f"{k}:{v}" for k, v in event_dict.items()] | ||
|
@@ -250,7 +286,12 @@ def get_event_details(id): | |
format_dt_event_attrs(event_attr) | ||
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError when fetching event details %s', retryErr) | ||
raise | ||
try: | ||
event_attr = vars(current_app.event_manager.create_event_from_id(int(id))) | ||
format_dt_event_attrs(event_attr) | ||
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError when fetching event details after retry, %s', retryErr) | ||
raise | ||
|
||
event_logs = current_app.event_manager.get_log_for_id(int(id)) | ||
event_history = current_app.event_manager.get_history_for_id(int(id)) | ||
|
@@ -275,7 +316,8 @@ def footer(): | |
elif not tz == DEFAULT_TIMEZONE: # Fall back to default if invalid value is provided | ||
tz = f"{DEFAULT_TIMEZONE} (default)" | ||
|
||
return render_template('/components/footer/footer-info.html', poll_interval=current_app.howitz_config["poll_interval"], | ||
return render_template('/components/footer/footer-info.html', | ||
refresh_interval=current_app.howitz_config["refresh_interval"], | ||
timezone=tz) | ||
|
||
|
||
|
@@ -328,7 +370,7 @@ def auth(): | |
@main.route('/events-table.html') | ||
def events_table(): | ||
return render_template('/components/table/events-table.html', | ||
poll_interval=current_app.howitz_config["poll_interval"]) | ||
refresh_interval=current_app.howitz_config["refresh_interval"]) | ||
|
||
|
||
@main.route('/get_events') | ||
|
@@ -338,11 +380,12 @@ def get_events(): | |
return render_template('/components/table/event-rows.html', event_list=table_events) | ||
|
||
|
||
@main.route('/poll_events') | ||
def poll_events(): | ||
poll_events_list = poll_current_events() | ||
@main.route('/refresh_events') | ||
def refresh_events(): | ||
removed_events, modified_events, added_events = refresh_current_events() | ||
|
||
return render_template('/components/poll/poll-rows.html', poll_event_list=poll_events_list) | ||
return render_template('/responses/updated-rows.html', modified_event_list=modified_events, | ||
removed_event_list=removed_events, added_event_list=added_events) | ||
|
||
|
||
@main.route('/events/<event_id>/expand_row', methods=["GET"]) | ||
|
@@ -367,7 +410,7 @@ def expand_event_row(event_id): | |
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError on row expand after retry, %s', retryErr) | ||
raise | ||
event = create_table_event(eventobj) | ||
event = create_table_event(eventobj)["event"] | ||
|
||
return render_template('/components/row/expanded-row.html', event=event, id=event_id, event_attr=event_attr, | ||
event_logs=event_logs, | ||
|
@@ -396,7 +439,7 @@ def collapse_event_row(event_id): | |
except RetryError as retryErr: # Intermittent error in Zino | ||
current_app.logger.exception('RetryError on row collapse %s', retryErr) | ||
raise | ||
event = create_table_event(eventobj) | ||
event = create_table_event(eventobj)["event"] | ||
|
||
return render_template('/responses/collapse-row.html', event=event, id=event_id, | ||
is_selected=str(event_id) in selected_events) | ||
|
@@ -425,7 +468,7 @@ def update_event_status(event_id): | |
add_history_res = current_app.event_manager.add_history_entry_for_id(event_id, new_history) | ||
|
||
event_attr, event_logs, event_history, event_msgs = get_event_details(event_id) | ||
event = create_table_event(current_app.event_manager.create_event_from_id(event_id)) | ||
event = create_table_event(current_app.event_manager.create_event_from_id(event_id))["event"] | ||
|
||
return render_template('/responses/update-event-response.html', event=event, id=event_id, event_attr=event_attr, | ||
event_logs=event_logs, | ||
|
@@ -466,8 +509,8 @@ def bulk_update_events_status(): | |
current_app.logger.debug("SELECTED EVENTS %s", session["selected_events"]) | ||
|
||
# Rerender whole events table | ||
poll_events_list = poll_current_events() # Calling poll events method is needed to preserve info about which events are expanded | ||
return render_template('/responses/bulk-update-events-status.html', poll_event_list=poll_events_list) | ||
event_list = get_current_events() | ||
return render_template('/responses/bulk-update-events-status.html', event_list=event_list) | ||
|
||
|
||
@main.route('/show_update_status_modal', methods=['GET']) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Something is weird with this.
pyproject.toml
sayszinolib>=1.1.0
, so why is zinolib1.0.4
in the frozen requirements list?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Because we forgot to update it probably.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With
zinolib==1.0.4
I can't even get Howitz to run, with1.1.0
this NTIE PR seems to work just fine for me :)