From ad188af0ba7d31ab075f81ed3ce3140a7cd0ccd8 Mon Sep 17 00:00:00 2001 From: Jed Reynolds Date: Fri, 1 Oct 2021 15:23:35 -0700 Subject: [PATCH] run_cv_scenario.py: adds more timing and refresh logic Use the refresh() method between loading databases to force updates of text blobs, DUTs and profiles. Look for last-updated times so as to not wait overly long for text blobs to update. Adds more cv sync calls to make sure that CV has gotten refreshed. Signed-off-by: Jed Reynolds --- py-scripts/run_cv_scenario.py | 107 ++++++++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 11 deletions(-) diff --git a/py-scripts/run_cv_scenario.py b/py-scripts/run_cv_scenario.py index 5e931b6a..d87345fd 100755 --- a/py-scripts/run_cv_scenario.py +++ b/py-scripts/run_cv_scenario.py @@ -1,12 +1,13 @@ #!/usr/bin/env python3 # This script will set the LANforge to a BLANK database then it will load the specified database # and start a graphical report -import sys -import os -import importlib import argparse -from time import sleep +import importlib +import os import pprint +import sys +import time +from time import sleep if sys.version_info[0] != 3: print("This script requires Python 3") @@ -38,6 +39,7 @@ class RunCvScenario(LFCliBase): self.test_profile = test_scenario_ self.localrealm = Realm(lfclient_host=lfhost, lfclient_port=lfport, debug_=debug_) self.report_name = None + self.load_timeout_sec = 2 * 60 def get_report_file_name(self): return self.report_name @@ -50,7 +52,8 @@ class RunCvScenario(LFCliBase): "clean_chambers": "yes" } self.json_post("/cli-json/load", data) - sleep(1) + self.refresh() + port_counter = 0; attempts = 6 while (attempts > 0) and (port_counter > 0): @@ -79,25 +82,107 @@ class RunCvScenario(LFCliBase): "clean_chambers": "yes" } self.json_post("/cli-json/load", data) - sleep(1) + self.refresh() self._pass("Loaded scenario %s" % self.lanforge_db, True) return True + def refresh(self): + events_response = self.json_get("/events/last") + if "event" not in events_response: + raise ValueError("Unable to find last event") + if "id" not in events_response["event"]: + pprint.pprint(events_response["event"]) + raise ValueError("bad event format") + previous_event_id = events_response["event"]["id"] + + # check for scenario (db) load message + begin_time: int = round(time.time() * 1000) + load_completed = False + while not load_completed: + if time.time() > (begin_time + self.load_timeout_sec): + print("Unable to load database within %d sec" % self.load_timeout_sec) + exit(1) + events_response = self.json_get("/events/since/%s" % previous_event_id) + if "events" not in events_response: + pprint.pprint(("events response", events_response)) + raise ValueError("incorrect events response") + for event_o in events_response["events"]: + if load_completed: + break + for (key, record) in event_o.items(): + if "event description" not in record: + continue + if not record["event description"]: + continue + if record["event description"].startswith("LOAD COMPLETED at "): + print("load completed: %s " % record["event description"]) + load_completed = True + break + if not load_completed: + sleep(1) + + blobs_last_updated = begin_time + status_response = self.json_get("/") + if "text_records_last_updated_ms" in status_response: + blobs_last_updated = int(status_response["text_records_last_updated_ms"]) + #print("*** blobs updated at %d" % blobs_last_updated) + else: + begin_time = round(time.time() * 1000) + print("no text_records_last_updated_ms, using %d " % begin_time) + # next we will want to sync our text blobs up + self.json_post("/cli-json/show_text_blob", { + "type": "ALL", + "name": "ALL" + }) + + load_completed = False + while not load_completed: + sleep(1) + if time.time() > (begin_time + (6 * 1000)): + print("waited %d sec for text blobs to update" % self.load_timeout_sec) + load_completed = True + break + status_response = self.json_get("/") + if "text_records_last_updated_ms" in status_response: + updated = int(status_response["text_records_last_updated_ms"]) + print(", , , , , , , , , updated at %d" % updated) + if updated > blobs_last_updated: + load_completed = True + break + else: + pprint.pprint(status_response) + self.json_post("/cli-json/show_text_blob", { + "type": "ALL", + "name": "ALL" + }) + delta: int = (time.time() * 1000) - begin_time + print("blobs loaded in %d ms" % delta) + + # next show duts + self.json_post("/cli-json/show_dut", {"name": "ALL"}) + self.json_post("/cli-json/show_profile", {"name": "ALL"}) + self.json_post("/cli-json/show_traffic_profile", {"name": "ALL"}) + sleep(5) + + def start(self, debug_=False): # /gui_cli takes commands keyed on 'cmd', so we create an array of commands commands = [ + "cv sync", + "sleep 4", "cv apply '%s'" % self.cv_scenario, + "sleep 4", "cv build", "sleep 4", "cv is_built", "cv sync", - "sleep 2", + "sleep 4", "cv create '%s' 'test_ref' 'true'" % self.cv_test, - "sleep 2", - "cv load test_ref '%s'" % self.test_profile, - "sleep 1", - "cv click test_ref 'Auto Save Report'", "sleep 5", + "cv load test_ref '%s'" % self.test_profile, + "sleep 5", + "cv click test_ref 'Auto Save Report'", + "sleep 1", "cv click test_ref Start", "sleep 60", "cv get test_ref 'Report Location:'",