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/main/argparse.py b/scripts/flog/main/argparse.py
new file mode 100644
index 0000000..01cdc4b
--- /dev/null
+++ b/scripts/flog/main/argparse.py
@@ -0,0 +1,181 @@
+# -*- python -*-
+'''A module for parsing script command line arguments.
+
+..seealso: https://docs.python.org/3/library/argparse.html##
+'''
+
+# -----------------------------------------------------------------------
+# 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  [---##
+##-------------------##
+ARGV      = None
+namespace = None
+
+##-------------------##
+##---]  IMPORTS  [---##
+##-------------------##
+import argparse
+
+from flog.main        import utils              as main_utils
+from flog.main        import help            as main_help
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+def get_argv():
+    """Retrieve parsed command line switches.
+
+    ..pre: getopts() was called earlier.
+
+    :return: Parsed command line argument storage
+    :rtype : dict
+    """
+
+    global ARGV
+    global namespace
+
+    if ARGV is None:
+        # Normalize argspace/namespace into a getopt/dictionary
+        # Program wide syntax edits needed: args['foo'] => args.foo
+        arg_dict = {}
+        for arg in vars(namespace):
+            arg_dict[arg] = getattr(namespace, arg)
+        ARGV = arg_dict
+
+    return ARGV
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+def getopts(argv, debug=None) -> None:
+    """Parse command line args, check options and pack into a hashmap
+
+    :param argv: values passed on the command line
+    :param debug: optional flag to enable debug mode
+
+    :return: Digested command line arguments
+    :rtype : dict
+
+    :raises  ValueError
+
+    .. versionadded:: 1.0
+    """
+
+    global namespace
+
+    iam = main_utils.iam()
+
+    if debug is None:
+        debug = False
+
+    parser = argparse.ArgumentParser\
+             (
+                 description = '''Report test dependencies based on selection criteria.'''
+                 # epilog = 'extra-help-text'
+             )
+
+    ## -----------------------------------------------------------------------
+    ## [TEST: categories]
+    ## -----------------------------------------------------------------------
+    parser.add_argument('--attr',
+                        action  = 'append',
+                        default = [],
+                        choices=\
+                        [
+                            'olt',   # optical line termination
+                            #
+                            'onu',   # optical network unit
+                            #
+                            'epon',
+                            'pon',   # passive optical network
+                            'gpon',  # gigabit-pon
+                            'xpon',
+                        ],
+                        help = 'Enable testing by attribute',
+                    )
+
+    ## -----------------------------------------------------------------------
+    ## [TEST:types]
+    ## -----------------------------------------------------------------------
+    parser.add_argument('--type',
+                        action  = 'append',
+                        default = [],
+                        choices=\
+                        [
+                            'burnin',       # profile, stress testing
+                            'integration',  # trigger inter-dependencies
+                            'oink',         # kitchen sink testing
+                            'regression',   # have we broken the renaissance ?
+                            'scale',        #
+                            'system',       #
+                            'smoke',        # quick: 60s > [n]
+                            'standalone',   # dependency-less tests
+                            'suite',        #
+                            'unit',         # module/api/narrow focus.
+                        ],
+                        help = 'Enable testing by category',
+                    )
+
+    ## -----------------------------------------------------------------------
+    ## [FILTER]
+    ## -----------------------------------------------------------------------
+    parser.add_argument('--excl',
+                        action  = 'append',
+                        default = [],
+                        help    = 'FILTER: Probe resources to exclude',
+                    )
+    parser.add_argument('--incl',
+                        action  = 'append',
+                        default = [],
+                        help    = 'FILTER: Probe resources to include',
+                    )
+
+    ## -----------------------------------------------------------------------
+    ## [MODES]
+    ## -----------------------------------------------------------------------
+    parser.add_argument('--debug',
+                        action  = 'store_true',
+                        default = False,
+                        help    = 'Enable debug mode',
+                        )
+
+    parser.add_argument('--trace',
+                        action  = 'append',
+                        default = [],
+                        help    = 'Enable python debugging to trace a named resource.',
+                    )
+
+    parser.add_argument('--usage',
+                        action  = 'store_true',
+                        default = False,
+                        help    = 'Show usage examples',
+                        )
+    
+    parser.add_argument('--version', action='version', version='%(prog)s 1.0')
+
+
+    namespace = parser.parse_args()
+
+    # --------------------------------------------------------------
+    # [TODO] update --usage to accept a value, display context help.
+    # --------------------------------------------------------------
+    if namespace.usage:
+        main_help.usage()
+
+    return
+
+# [EOF]
+