summaryrefslogtreecommitdiffstats
path: root/src/vpp-api/python/vpp_papi/vpp_papi.py
diff options
context:
space:
mode:
authorMaxime Peim <mpeim@cisco.com>2023-11-14 15:26:41 +0100
committerDave Wallace <dwallacelf@gmail.com>2024-01-18 20:14:54 +0000
commit77caeb1b193404e76beb27a1aa81321e8eb1cf1f (patch)
treebffb3aa51d53f96ad45a55d337f262260c191461 /src/vpp-api/python/vpp_papi/vpp_papi.py
parent87241fefd94423cdc50cfe6b1b54fec955b5f0d3 (diff)
tests: preload api files
When sanity test is not done, API files are not loaded until the first test case is run. Hence, it is not possible to use enums, etc. outside of a test class. By preloading API files before running any tests, it prevents its issue. Type: fix Change-Id: I8730150374e6c5f8d6933ec037811372ac2a8da0 Signed-off-by: Maxime Peim <mpeim@cisco.com>
Diffstat (limited to 'src/vpp-api/python/vpp_papi/vpp_papi.py')
-rw-r--r--src/vpp-api/python/vpp_papi/vpp_papi.py68
1 files changed, 39 insertions, 29 deletions
diff --git a/src/vpp-api/python/vpp_papi/vpp_papi.py b/src/vpp-api/python/vpp_papi/vpp_papi.py
index a9edfed81be..5c089647e59 100644
--- a/src/vpp-api/python/vpp_papi/vpp_papi.py
+++ b/src/vpp-api/python/vpp_papi/vpp_papi.py
@@ -281,16 +281,15 @@ class VPPApiJSONFiles:
@classmethod
def process_json_file(self, apidef_file):
- api = json.load(apidef_file)
- return self._process_json(api)
+ return self._process_json(apidef_file.read())
@classmethod
def process_json_str(self, json_str):
- api = json.loads(json_str)
- return self._process_json(api)
+ return self._process_json(json_str)
@staticmethod
- def _process_json(api): # -> Tuple[Dict, Dict]
+ def _process_json(json_str): # -> Tuple[Dict, Dict]
+ api = json.loads(json_str)
types = {}
services = {}
messages = {}
@@ -380,6 +379,30 @@ class VPPApiJSONFiles:
pass
return messages, services
+ @staticmethod
+ def load_api(apifiles=None, apidir=None):
+ messages = {}
+ services = {}
+ if not apifiles:
+ # Pick up API definitions from default directory
+ try:
+ if isinstance(apidir, list):
+ apifiles = []
+ for d in apidir:
+ apifiles += VPPApiJSONFiles.find_api_files(d)
+ else:
+ apifiles = VPPApiJSONFiles.find_api_files(apidir)
+ except (RuntimeError, VPPApiError):
+ raise VPPRuntimeError
+
+ for file in apifiles:
+ with open(file) as apidef_file:
+ m, s = VPPApiJSONFiles.process_json_file(apidef_file)
+ messages.update(m)
+ services.update(s)
+
+ return apifiles, messages, services
+
class VPPApiClient:
"""VPP interface.
@@ -394,7 +417,6 @@ class VPPApiClient:
these messages in a background thread.
"""
- apidir = None
VPPApiError = VPPApiError
VPPRuntimeError = VPPRuntimeError
VPPValueError = VPPValueError
@@ -405,6 +427,7 @@ class VPPApiClient:
self,
*,
apifiles=None,
+ apidir=None,
testmode=False,
async_thread=True,
logger=None,
@@ -439,6 +462,7 @@ class VPPApiClient:
self.id_msgdef = []
self.header = VPPType("header", [["u16", "msgid"], ["u32", "client_index"]])
self.apifiles = []
+ self.apidir = apidir
self.event_callback = None
self.message_queue = queue.Queue()
self.read_timeout = read_timeout
@@ -449,29 +473,15 @@ class VPPApiClient:
self._apifiles = apifiles
self.stats = {}
- if not apifiles:
- # Pick up API definitions from default directory
- try:
- if isinstance(self.apidir, list):
- apifiles = []
- for d in self.apidir:
- apifiles += VPPApiJSONFiles.find_api_files(d)
- else:
- apifiles = VPPApiJSONFiles.find_api_files(self.apidir)
- except (RuntimeError, VPPApiError):
- # In test mode we don't care that we can't find the API files
- if testmode:
- apifiles = []
- else:
- raise VPPRuntimeError
-
- for file in apifiles:
- with open(file) as apidef_file:
- m, s = VPPApiJSONFiles.process_json_file(apidef_file)
- self.messages.update(m)
- self.services.update(s)
-
- self.apifiles = apifiles
+ try:
+ self.apifiles, self.messages, self.services = VPPApiJSONFiles.load_api(
+ apifiles, apidir
+ )
+ except VPPRuntimeError as e:
+ if testmode:
+ self.apifiles = []
+ else:
+ raise e
# Basic sanity check
if len(self.messages) == 0 and not testmode: