mirror of
				https://github.com/Telecominfraproject/wlan-lanforge-scripts.git
				synced 2025-11-04 04:38:02 +00:00 
			
		
		
		
	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 <jed@bitratchet.com>
This commit is contained in:
		@@ -1,12 +1,13 @@
 | 
				
			|||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
# This script will set the LANforge to a BLANK database then it will load the specified database
 | 
					# This script will set the LANforge to a BLANK database then it will load the specified database
 | 
				
			||||||
# and start a graphical report
 | 
					# and start a graphical report
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import os
 | 
					 | 
				
			||||||
import importlib
 | 
					 | 
				
			||||||
import argparse
 | 
					import argparse
 | 
				
			||||||
from time import sleep
 | 
					import importlib
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
import pprint
 | 
					import pprint
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					from time import sleep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if sys.version_info[0] != 3:
 | 
					if sys.version_info[0] != 3:
 | 
				
			||||||
    print("This script requires Python 3")
 | 
					    print("This script requires Python 3")
 | 
				
			||||||
@@ -38,6 +39,7 @@ class RunCvScenario(LFCliBase):
 | 
				
			|||||||
        self.test_profile = test_scenario_
 | 
					        self.test_profile = test_scenario_
 | 
				
			||||||
        self.localrealm = Realm(lfclient_host=lfhost, lfclient_port=lfport, debug_=debug_)
 | 
					        self.localrealm = Realm(lfclient_host=lfhost, lfclient_port=lfport, debug_=debug_)
 | 
				
			||||||
        self.report_name = None
 | 
					        self.report_name = None
 | 
				
			||||||
 | 
					        self.load_timeout_sec = 2 * 60
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_report_file_name(self):
 | 
					    def get_report_file_name(self):
 | 
				
			||||||
        return self.report_name
 | 
					        return self.report_name
 | 
				
			||||||
@@ -50,7 +52,8 @@ class RunCvScenario(LFCliBase):
 | 
				
			|||||||
            "clean_chambers": "yes"
 | 
					            "clean_chambers": "yes"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        self.json_post("/cli-json/load", data)
 | 
					        self.json_post("/cli-json/load", data)
 | 
				
			||||||
        sleep(1)
 | 
					        self.refresh()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        port_counter = 0;
 | 
					        port_counter = 0;
 | 
				
			||||||
        attempts = 6
 | 
					        attempts = 6
 | 
				
			||||||
        while (attempts > 0) and (port_counter > 0):
 | 
					        while (attempts > 0) and (port_counter > 0):
 | 
				
			||||||
@@ -79,25 +82,107 @@ class RunCvScenario(LFCliBase):
 | 
				
			|||||||
            "clean_chambers": "yes"
 | 
					            "clean_chambers": "yes"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        self.json_post("/cli-json/load", data)
 | 
					        self.json_post("/cli-json/load", data)
 | 
				
			||||||
        sleep(1)
 | 
					        self.refresh()
 | 
				
			||||||
        self._pass("Loaded scenario %s" % self.lanforge_db, True)
 | 
					        self._pass("Loaded scenario %s" % self.lanforge_db, True)
 | 
				
			||||||
        return 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):
 | 
					    def start(self, debug_=False):
 | 
				
			||||||
        # /gui_cli takes commands keyed on 'cmd', so we create an array of commands
 | 
					        # /gui_cli takes commands keyed on 'cmd', so we create an array of commands
 | 
				
			||||||
        commands = [
 | 
					        commands = [
 | 
				
			||||||
 | 
					            "cv sync",
 | 
				
			||||||
 | 
					            "sleep 4",
 | 
				
			||||||
            "cv apply '%s'" % self.cv_scenario,
 | 
					            "cv apply '%s'" % self.cv_scenario,
 | 
				
			||||||
 | 
					            "sleep 4",
 | 
				
			||||||
            "cv build",
 | 
					            "cv build",
 | 
				
			||||||
            "sleep 4",
 | 
					            "sleep 4",
 | 
				
			||||||
            "cv is_built",
 | 
					            "cv is_built",
 | 
				
			||||||
            "cv sync",
 | 
					            "cv sync",
 | 
				
			||||||
            "sleep 2",
 | 
					            "sleep 4",
 | 
				
			||||||
            "cv create '%s' 'test_ref' 'true'" % self.cv_test,
 | 
					            "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",
 | 
					            "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",
 | 
					            "cv click test_ref Start",
 | 
				
			||||||
            "sleep 60",
 | 
					            "sleep 60",
 | 
				
			||||||
            "cv get test_ref 'Report Location:'",
 | 
					            "cv get test_ref 'Report Location:'",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user