VOL-4805

This script is an inital attempt at capturing and documenting testing
resources for interactive and programatic retrieval.  Command line
arguments and eventual filesystem based detection will hints for a
suite of tests to run to evaluate VOLTHA code changes.

make check: run python unit tests

usage:
  % flog.py --help
  % flog.py --usage
  % flog.py --type regression
  % flog.py --attr olt

Recreate patch: start over
  o approval given by: daf & torsten
  o a cycle of squashing roaches reported by lint checking resulted
    in multiple conflicting patches in gerrit.  Abandon the mess and
    submit a clean patch.
  o Only delta introduced is using the updated standard copyright notice.
  o git merge to get branch and master back in sync.

Change-Id: I24292f2b72d134879939f43a84b31ab153d10fa9
diff --git a/scripts/flog.py b/scripts/flog.py
new file mode 100755
index 0000000..9fb5fd3
--- /dev/null
+++ b/scripts/flog.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+'''This script is an aggregate for testing resources.'''
+
+# -----------------------------------------------------------------------
+# Copyright 2022 Open Networking Foundation (ONF) and the ONF Contributors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+
+##-------------------##
+##---]  IMPORTS  [---##
+##-------------------##
+import sys
+import pprint
+
+from flog.main        import utils           as main_utils
+from flog.main        import argparse        as main_getopt
+
+# from flog.meta        import onos
+from flog.meta        import voltha
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+def process():
+    '''Perform actions based on command line args.'''
+
+    argv  = main_getopt.get_argv()
+    debug = argv['debug']
+    trace = argv['trace']
+
+    todos = [] 
+
+    ## -----------------------------
+    ## Accumulate tests by attribute
+    ## -----------------------------
+    for attr in argv['attr']:
+        if debug:
+            print('** ATTR: %s' % attr)
+        todos += voltha.Utils().get([attr])
+
+    ## ------------------------
+    ## Accumulate tests by type
+    ## ------------------------
+    for test_type in argv['type']:
+        if debug:
+            print('** TYPE: %s' % test_type)
+        todos += voltha.Utils().get([test_type])
+
+    ## ---------------------------------------
+    ## Append an explicit list of tests to run
+    ## ---------------------------------------
+    for incl in argv['incl']:
+        if debug:
+            print('** INCL: %s' % incl)
+        todos += [incl]
+
+    ## -------------------------------------
+    ## Filter results by substring or config
+    ## -------------------------------------
+    # if len(argv['excl']) > 1:
+    #    for excl in argv['excl']:
+    #        if any([excl in val for val in todos]):
+    #            continue
+    #        
+
+    todos = list(set(todos)) # unique
+
+    # -------------------------------------
+    # Err on the side of testing everything
+    # -------------------------------------
+    if len(todos) == 0: 
+        todos += voltha.Utils().get(['all'])
+       
+    for todo in todos:
+        print(todo)
+
+    return
+
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+def main(argv_raw):
+    '''Here we go.'''
+
+    main_getopt.getopts(argv_raw)
+    process()
+    sys.exit(0)
+
+##----------------##
+##---]  MAIN  [---##
+##----------------##
+if __name__ == "__main__":
+    main(sys.argv[1:]) # NOSONAR
+
+# [EOF]