Change in osmo-gsm-tester[master]: config: suites_dir and scenarios_dir are now a list of paths

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

pespin gerrit-no-reply at lists.osmocom.org
Mon May 25 11:27:36 UTC 2020


pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18446 )


Change subject: config: suites_dir and scenarios_dir are now a list of paths
......................................................................

config: suites_dir and scenarios_dir are now a list of paths

This allows inheriting suites or scenarios from eg. sysmocom/ dir, while
still allowing to apply new suites and scenarios on top.

Change-Id: Icecdae32d400a6b6da2ebf167c1c795f7a74ae96
---
M doc/examples/2g_osmocom/main.conf
M doc/examples/4g_srsLTE/main.conf
M doc/manuals/chapters/config.adoc
M selftest/resource_test/conf/paths.conf
M selftest/resource_test/resource_test.ok
M selftest/scenario_test/paths.conf
M selftest/scenario_test/scenario_test.ok
M selftest/suite_test/paths.conf
M selftest/suite_test/suite_test.ok
R selftest/suite_test/suitedirA/empty_dir/.unrelated_file
R selftest/suite_test/suitedirA/test_suite/hello_world.py
R selftest/suite_test/suitedirA/test_suite/mo_mt_sms.py
R selftest/suite_test/suitedirA/test_suite/mo_sms.py
R selftest/suite_test/suitedirA/test_suite/suite.conf
R selftest/suite_test/suitedirA/test_suite/test_error.py
R selftest/suite_test/suitedirA/test_suite/test_fail.py
R selftest/suite_test/suitedirA/test_suite/test_fail_raise.py
R selftest/suite_test/suitedirA/test_suite/test_suite_params.py
A selftest/suite_test/suitedirB/suiteB/suite.conf
A selftest/suite_test/suitedirB/suiteB/test_success.py
M src/osmo_gsm_tester/core/config.py
M src/osmo_gsm_tester/core/scenario.py
M src/osmo_gsm_tester/core/suite.py
M sysmocom/main.conf
M sysmocom/ttcn3/main.conf
25 files changed, 92 insertions(+), 51 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-gsm-tester refs/changes/46/18446/1

diff --git a/doc/examples/2g_osmocom/main.conf b/doc/examples/2g_osmocom/main.conf
index b810519..290b672 100644
--- a/doc/examples/2g_osmocom/main.conf
+++ b/doc/examples/2g_osmocom/main.conf
@@ -1,5 +1,5 @@
 state_dir: '/var/tmp/osmo-gsm-tester/state'
-suites_dir: './suites'
+suites_dir: ['./suites']
 scenarios_dir: './scenarios'
 default_suites_conf_path: './default-suites.conf'
 defaults_conf_path: './defaults.conf'
diff --git a/doc/examples/4g_srsLTE/main.conf b/doc/examples/4g_srsLTE/main.conf
index b810519..290b672 100644
--- a/doc/examples/4g_srsLTE/main.conf
+++ b/doc/examples/4g_srsLTE/main.conf
@@ -1,5 +1,5 @@
 state_dir: '/var/tmp/osmo-gsm-tester/state'
-suites_dir: './suites'
+suites_dir: ['./suites']
 scenarios_dir: './scenarios'
 default_suites_conf_path: './default-suites.conf'
 defaults_conf_path: './defaults.conf'
diff --git a/doc/manuals/chapters/config.adoc b/doc/manuals/chapters/config.adoc
index 17cf825..18ff55d 100644
--- a/doc/manuals/chapters/config.adoc
+++ b/doc/manuals/chapters/config.adoc
@@ -26,13 +26,19 @@
 {app-name} expects to find the following configuration settings in 'main.conf':
 
 - 'state_dir': Path to <<state_dir,state_dir>> directory
-- 'suites_dir': Path to <<suites_dir,suites_dir>> directory
 - 'trial_dir': Path to <<trials,trial>> directory to test against (overridden by cmdline argument)
-- 'scenarios_dir': Path to <<scenarios_dir,scenarios_dir>> directory (optional)
+- 'suites_dir': List of paths to <<suites_dir,suites_dir>> directories.
+- 'scenarios_dir': List of paths to <<scenarios_dir,scenarios_dir>> directories (optional)
 - 'default_suites_conf_path': Path to <<default_suites_conf,default-suites.conf>> file (optional)
 - 'defaults_conf_path': Path to <<defaults_conf,defaults.conf>> file (optional)
 - 'resource_conf_path': Path to <<resource_conf,resources.conf>> file (optional)
 
+Configuration settings holding a list of paths, such as 'suites_dir' or
+'scenarios_dir', are used to look up for paths in regular list of order, meaning
+first paths in list take preference over last ones. As a result, if a suite
+named 'A' is found in several paths, the one on the first path in the list will
+be used.
+
 These are described in detail in the following sections. If no value is provided
 for a given setting, sane default paths are used: For 'state_dir',
 '/var/tmp/osmo-gsm-tester/state/' is used. All other files and directories are
@@ -45,8 +51,8 @@
 .Sample main.conf file:
 ----
 state_dir: '/var/tmp/osmo-gsm-tester/state'
-suites_dir: '/usr/local/src/osmo-gsm-tester/suites'
-scenarios_dir: './scenarios'
+suites_dir: [ '/usr/local/src/osmo-gsm-tester/suites' ]
+scenarios_dir: [ './scenarios' ]
 trial_dir: './trial'
 default_suites_conf_path: './default-suites.conf'
 defaults_conf_path: './defaults.conf'
diff --git a/selftest/resource_test/conf/paths.conf b/selftest/resource_test/conf/paths.conf
index 0b2d035..3280a12 100644
--- a/selftest/resource_test/conf/paths.conf
+++ b/selftest/resource_test/conf/paths.conf
@@ -1,2 +1,2 @@
 state_dir: ./test_work/state_dir
-suites_dir: ./suite_test
+suites_dir: ['./suite_test']
diff --git a/selftest/resource_test/resource_test.ok b/selftest/resource_test/resource_test.ok
index 0ad760e..91acaaf 100644
--- a/selftest/resource_test/resource_test.ok
+++ b/selftest/resource_test/resource_test.ok
@@ -14,9 +14,9 @@
 {'default_suites_conf_path': '[PATH]/selftest/resource_test/conf/default-suites.conf',
  'defaults_conf_path': '[PATH]/selftest/resource_test/conf/defaults.conf',
  'resource_conf_path': '[PATH]/selftest/resource_test/conf/resources.conf',
- 'scenarios_dir': '[PATH]/selftest/resource_test/conf/scenarios',
+ 'scenarios_dir': ['[PATH]/selftest/resource_test/conf/scenarios'],
  'state_dir': '[PATH]/selftest/resource_test/conf/test_work/state_dir',
- 'suites_dir': '[PATH]/selftest/resource_test/conf/suite_test',
+ 'suites_dir': ['[PATH]/selftest/resource_test/conf/suite_test'],
  'trial_dir': '[PATH]/selftest/resource_test/conf/trial'}
 *** all resources:
 {'arfcn': [{'_hash': 'e620569450f8259b3f0212ec19c285dd07df063c',
diff --git a/selftest/scenario_test/paths.conf b/selftest/scenario_test/paths.conf
index c7df5ac..11e59bf 100644
--- a/selftest/scenario_test/paths.conf
+++ b/selftest/scenario_test/paths.conf
@@ -1,3 +1,3 @@
 state_dir: ./test_work/state_dir
-suites_dir: .
-scenarios_dir: .
+suites_dir: ['.']
+scenarios_dir: ['.']
diff --git a/selftest/scenario_test/scenario_test.ok b/selftest/scenario_test/scenario_test.ok
index e845f4c..06db4f4 100644
--- a/selftest/scenario_test/scenario_test.ok
+++ b/selftest/scenario_test/scenario_test.ok
@@ -3,9 +3,9 @@
 {'default_suites_conf_path': '[PATH]/selftest/scenario_test/default-suites.conf',
  'defaults_conf_path': '[PATH]/selftest/scenario_test/defaults.conf',
  'resource_conf_path': '[PATH]/selftest/scenario_test/resources.conf',
- 'scenarios_dir': '[PATH]/selftest/scenario_test',
+ 'scenarios_dir': ['[PATH]/selftest/scenario_test'],
  'state_dir': '[PATH]/selftest/scenario_test/test_work/state_dir',
- 'suites_dir': '[PATH]/selftest/scenario_test',
+ 'suites_dir': ['[PATH]/selftest/scenario_test'],
  'trial_dir': '[PATH]/selftest/scenario_test/trial'}
 scenario_case_01.conf
 {'anotherlist': ['4', '0'],
@@ -19,11 +19,11 @@
  'somelist': [{'somelistitem': 'firststring'},
               {'somelistitem': 'secondstring'},
               {'somelistitem': 'thirdstring'}]}
-OK: expected RuntimeError: No such scenario file: '[PATH]/selftest/scenario_test/scenario_case_01 at .conf' (nor scenario_case_01 at .conf)
+OK: expected RuntimeError: No such scenario file 'scenario_case_01 at .conf' (nor scenario_case_01 at .conf) in [[PATH]/selftest/scenario_test]
 OK: expected ValueError
 OK: expected ValueError
-OK: expected RuntimeError: No such scenario file: '[PATH]/selftest/scenario_test/scenario_case_03.conf'
-OK: expected RuntimeError: No such scenario file: '[PATH]/selftest/scenario_test/scenario_case_03.conf'
+OK: expected RuntimeError: No such scenario file scenario_case_03.conf in [[PATH]/selftest/scenario_test]
+OK: expected RuntimeError: No such scenario file scenario_case_03.conf in [[PATH]/selftest/scenario_test]
 tst scenario_case_03 at heyho,1,yes.conf: DBG: {param_dict={param1='heyho', param2='1', param3='yes'}}
 scenario_case_03 at heyho,1,yes.conf
 {'anotherlist': ['1', '0'],
diff --git a/selftest/suite_test/paths.conf b/selftest/suite_test/paths.conf
index 2b0a274..a2f9124 100644
--- a/selftest/suite_test/paths.conf
+++ b/selftest/suite_test/paths.conf
@@ -1,2 +1,2 @@
 state_dir: ./test_work/state_dir
-suites_dir: .
+suites_dir: ['suitedirA', 'suitedirB']
diff --git a/selftest/suite_test/suite_test.ok b/selftest/suite_test/suite_test.ok
index d55317b..fee07d0 100644
--- a/selftest/suite_test/suite_test.ok
+++ b/selftest/suite_test/suite_test.ok
@@ -4,14 +4,15 @@
 {'default_suites_conf_path': '[PATH]/selftest/suite_test/default-suites.conf',
  'defaults_conf_path': '[PATH]/selftest/suite_test/defaults.conf',
  'resource_conf_path': '[PATH]/selftest/suite_test/resources.conf',
- 'scenarios_dir': '[PATH]/selftest/suite_test/scenarios',
+ 'scenarios_dir': ['[PATH]/selftest/suite_test/scenarios'],
  'state_dir': '[PATH]/selftest/suite_test/test_work/state_dir',
- 'suites_dir': '[PATH]/selftest/suite_test',
+ 'suites_dir': ['[PATH]/selftest/suite_test/suitedirA',
+                '[PATH]/selftest/suite_test/suitedirB'],
  'trial_dir': '[PATH]/selftest/suite_test/trial'}
---- -: ERR: RuntimeError: Suite not found: 'does_not_exist' in [PATH]/selftest/suite_test
+--- -: ERR: RuntimeError: Suite not found: 'does_not_exist' in [[PATH]/selftest/suite_test/suitedirA, [PATH]/selftest/suite_test/suitedirB]
 - no suite.conf
 cnf empty_dir: DBG: reading suite.conf
-cnf [PATH]/selftest/suite_test/empty_dir/suite.conf: ERR: FileNotFoundError: [Errno 2] No such file or directory: '[PATH]/selftest/suite_test/empty_dir/suite.conf'  [empty_dir↪[PATH]/selftest/suite_test/empty_dir/suite.conf]
+cnf [PATH]/selftest/suite_test/suitedirA/empty_dir/suite.conf: ERR: FileNotFoundError: [Errno 2] No such file or directory: '[PATH]/selftest/suite_test/suitedirA/empty_dir/suite.conf'  [empty_dir↪[PATH]/selftest/suite_test/suitedirA/empty_dir/suite.conf]
 - valid suite dir
 cnf test_suite: DBG: reading suite.conf
 defaults:
diff --git a/selftest/suite_test/empty_dir/.unrelated_file b/selftest/suite_test/suitedirA/empty_dir/.unrelated_file
similarity index 100%
rename from selftest/suite_test/empty_dir/.unrelated_file
rename to selftest/suite_test/suitedirA/empty_dir/.unrelated_file
diff --git a/selftest/suite_test/test_suite/hello_world.py b/selftest/suite_test/suitedirA/test_suite/hello_world.py
similarity index 100%
rename from selftest/suite_test/test_suite/hello_world.py
rename to selftest/suite_test/suitedirA/test_suite/hello_world.py
diff --git a/selftest/suite_test/test_suite/mo_mt_sms.py b/selftest/suite_test/suitedirA/test_suite/mo_mt_sms.py
similarity index 100%
rename from selftest/suite_test/test_suite/mo_mt_sms.py
rename to selftest/suite_test/suitedirA/test_suite/mo_mt_sms.py
diff --git a/selftest/suite_test/test_suite/mo_sms.py b/selftest/suite_test/suitedirA/test_suite/mo_sms.py
similarity index 100%
rename from selftest/suite_test/test_suite/mo_sms.py
rename to selftest/suite_test/suitedirA/test_suite/mo_sms.py
diff --git a/selftest/suite_test/test_suite/suite.conf b/selftest/suite_test/suitedirA/test_suite/suite.conf
similarity index 100%
rename from selftest/suite_test/test_suite/suite.conf
rename to selftest/suite_test/suitedirA/test_suite/suite.conf
diff --git a/selftest/suite_test/test_suite/test_error.py b/selftest/suite_test/suitedirA/test_suite/test_error.py
similarity index 100%
rename from selftest/suite_test/test_suite/test_error.py
rename to selftest/suite_test/suitedirA/test_suite/test_error.py
diff --git a/selftest/suite_test/test_suite/test_fail.py b/selftest/suite_test/suitedirA/test_suite/test_fail.py
similarity index 100%
rename from selftest/suite_test/test_suite/test_fail.py
rename to selftest/suite_test/suitedirA/test_suite/test_fail.py
diff --git a/selftest/suite_test/test_suite/test_fail_raise.py b/selftest/suite_test/suitedirA/test_suite/test_fail_raise.py
similarity index 100%
rename from selftest/suite_test/test_suite/test_fail_raise.py
rename to selftest/suite_test/suitedirA/test_suite/test_fail_raise.py
diff --git a/selftest/suite_test/test_suite/test_suite_params.py b/selftest/suite_test/suitedirA/test_suite/test_suite_params.py
similarity index 100%
rename from selftest/suite_test/test_suite/test_suite_params.py
rename to selftest/suite_test/suitedirA/test_suite/test_suite_params.py
diff --git a/selftest/suite_test/suitedirB/suiteB/suite.conf b/selftest/suite_test/suitedirB/suiteB/suite.conf
new file mode 100644
index 0000000..3645cd9
--- /dev/null
+++ b/selftest/suite_test/suitedirB/suiteB/suite.conf
@@ -0,0 +1,4 @@
+resources:
+
+defaults:
+  timeout: 60s
diff --git a/selftest/suite_test/suitedirB/suiteB/test_success.py b/selftest/suite_test/suitedirB/suiteB/test_success.py
new file mode 100755
index 0000000..97bb915
--- /dev/null
+++ b/selftest/suite_test/suitedirB/suiteB/test_success.py
@@ -0,0 +1,5 @@
+#!/usr/bin/env python3
+from osmo_gsm_tester.testenv import *
+
+print('I am %r / %r' % (tenv.suite().name(), test.name()))
+
diff --git a/src/osmo_gsm_tester/core/config.py b/src/osmo_gsm_tester/core/config.py
index 9380cca..398e8ba 100644
--- a/src/osmo_gsm_tester/core/config.py
+++ b/src/osmo_gsm_tester/core/config.py
@@ -71,8 +71,8 @@
 CFG_RESOURCES_CONF = 'resource_conf_path'
 MAIN_CONFIG_SCHEMA = {
         CFG_STATE_DIR: schema.STR,
-        CFG_SUITES_DIR: schema.STR,
-        CFG_SCENARIOS_DIR: schema.STR,
+        CFG_SUITES_DIR + '[]': schema.STR,
+        CFG_SCENARIOS_DIR + '[]': schema.STR,
         CFG_TRIAL_DIR: schema.STR,
         CFG_DEFAULT_SUITES_CONF: schema.STR,
         CFG_DEFAULTS_CONF: schema.STR,
@@ -80,8 +80,8 @@
     }
 
 DF_CFG_STATE_DIR = '/var/tmp/osmo-gsm-tester/state/'
-DF_CFG_SUITES_DIR = './suites'
-DF_CFG_SCENARIOS_DIR = './scenarios'
+DF_CFG_SUITES_DIR = ['./suites']
+DF_CFG_SCENARIOS_DIR = ['./scenarios']
 DF_CFG_TRIAL_DIR = './trial'
 DF_CFG_DEFAULT_SUITES_CONF = './default-suites.conf'
 DF_CFG_DEFAULTS_CONF = './defaults.conf'
@@ -122,11 +122,16 @@
         MAIN_CONFIG_PATH = _find_main_config_path()
     return MAIN_CONFIG_PATH
 
-def main_config_path_to_abspath(path):
+def main_config_path_to_abspath(val):
     'Relative files in main config are relative towards the config file, not towards $CWD'
-    if not path.startswith(os.pathsep):
-        return os.path.realpath(os.path.join(os.path.dirname(_get_main_config_path()), path))
-    return path
+    # If val is a list of paths, recurse to translate its paths.
+    if isinstance(val, list):
+        for i in range(len(val)):
+            val[i] = main_config_path_to_abspath(val[i])
+        return val
+    if not val.startswith(os.pathsep):
+        return os.path.realpath(os.path.join(os.path.dirname(_get_main_config_path()), val))
+    return val
 
 def _get_main_config():
     global MAIN_CONFIG
@@ -169,11 +174,11 @@
 def get_state_dir():
     return Dir(get_main_config_value(CFG_STATE_DIR))
 
-def get_suites_dir():
-    return Dir(get_main_config_value(CFG_SUITES_DIR))
+def get_suites_dirs():
+    return [Dir(d) for d in get_main_config_value(CFG_SUITES_DIR)]
 
-def get_scenarios_dir():
-    return Dir(get_main_config_value(CFG_SCENARIOS_DIR))
+def get_scenarios_dirs():
+    return [Dir(d) for d in get_main_config_value(CFG_SCENARIOS_DIR)]
 
 DEFAULTS_CONF = None
 def get_defaults(for_kind):
diff --git a/src/osmo_gsm_tester/core/scenario.py b/src/osmo_gsm_tester/core/scenario.py
index efa045b..83ce490 100644
--- a/src/osmo_gsm_tester/core/scenario.py
+++ b/src/osmo_gsm_tester/core/scenario.py
@@ -88,25 +88,41 @@
         self.update(conf)
 
 def get_scenario(name, validation_schema=None):
-    scenarios_dir = config.get_scenarios_dir()
+    found = False
+    path = None
+    param_list = []
     if not name.endswith('.conf'):
         name = name + '.conf'
     is_parametrized_file = '@' in name
-    param_list = []
-    path = scenarios_dir.child(name)
     if not is_parametrized_file:
-        if not os.path.isfile(path):
-            raise RuntimeError('No such scenario file: %r' % path)
+        scenarios_dirs = config.get_scenarios_dirs()
+        for d in scenarios_dirs:
+            path = d.child(name)
+            if  os.path.isfile(path):
+                found = True
+                break
+        if not found:
+            raise RuntimeError('No such scenario file %s in %r' % (name, scenarios_dirs))
         sc = Scenario(name, path)
     else: # parametrized scenario:
         # Allow first matching complete matching names (eg: scenario at param1,param2.conf),
         # this allows setting specific content in different files for specific values.
-        if not os.path.isfile(path):
+        scenarios_dirs = config.get_scenarios_dirs()
+        for d in scenarios_dirs:
+            path = d.child(name)
+            if os.path.isfile(path):
+                found = True
+                break
+        if not found:
             # get "scenario at .conf" from "scenario at param1,param2.conf":
-            prefix_name = name[:name.index("@")+1] + '.conf'
-            path = scenarios_dir.child(prefix_name)
-            if not os.path.isfile(path):
-                raise RuntimeError('No such scenario file: %r (nor %s)' % (path, name))
+            for d in scenarios_dirs:
+                prefix_name = name[:name.index("@")+1] + '.conf'
+                path = d.child(prefix_name)
+                if os.path.isfile(path):
+                    found = True
+                    break
+        if not found:
+            raise RuntimeError('No such scenario file %r (nor %s) in %r' % (name, prefix_name, scenarios_dirs))
         # At this point, we have existing file path. Let's now scrap the parameter(s):
         # get param1,param2 str from scenario at param1,param2.conf
         param_list_str = name.split('@', 1)[1][:-len('.conf')]
diff --git a/src/osmo_gsm_tester/core/suite.py b/src/osmo_gsm_tester/core/suite.py
index a6eaca2..c55c5e9 100644
--- a/src/osmo_gsm_tester/core/suite.py
+++ b/src/osmo_gsm_tester/core/suite.py
@@ -232,12 +232,16 @@
     if suite is not None:
         return suite
 
-    suites_dir = config.get_suites_dir()
-    suite_dir = suites_dir.child(suite_name)
-    if not suites_dir.exists(suite_name):
-        raise RuntimeError('Suite not found: %r in %r' % (suite_name, suites_dir))
-    if not suites_dir.isdir(suite_name):
-        raise RuntimeError('Suite name found, but not a directory: %r' % (suite_dir))
+    suites_dirs = config.get_suites_dirs()
+    suite_dir = None
+    found = False
+    for d in suites_dirs:
+        suite_dir = d.child(suite_name)
+        if d.exists(suite_name) and d.isdir(suite_name):
+            found = True
+            break
+    if not found:
+        raise RuntimeError('Suite not found: %r in %r' % (suite_name, suites_dirs))
 
     suite_def = SuiteDefinition(suite_dir)
     loaded_suite_definitions[suite_name] = suite_def
diff --git a/sysmocom/main.conf b/sysmocom/main.conf
index b810519..290b672 100644
--- a/sysmocom/main.conf
+++ b/sysmocom/main.conf
@@ -1,5 +1,5 @@
 state_dir: '/var/tmp/osmo-gsm-tester/state'
-suites_dir: './suites'
+suites_dir: ['./suites']
 scenarios_dir: './scenarios'
 default_suites_conf_path: './default-suites.conf'
 defaults_conf_path: './defaults.conf'
diff --git a/sysmocom/ttcn3/main.conf b/sysmocom/ttcn3/main.conf
index 9f38b4e..c58cad6 100644
--- a/sysmocom/ttcn3/main.conf
+++ b/sysmocom/ttcn3/main.conf
@@ -1,5 +1,5 @@
 state_dir: '/var/tmp/osmo-gsm-tester/state'
-suites_dir: './suites'
+suites_dir: ['./suites']
 scenarios_dir: './scenarios'
 default_suites_conf_path: './default-suites.conf'
 defaults_conf_path: '../defaults.conf'

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-gsm-tester/+/18446
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-gsm-tester
Gerrit-Branch: master
Gerrit-Change-Id: Icecdae32d400a6b6da2ebf167c1c795f7a74ae96
Gerrit-Change-Number: 18446
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200525/28476d31/attachment.htm>


More information about the gerrit-log mailing list