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/utils.py b/scripts/flog/main/utils.py
new file mode 100644
index 0000000..7fd2eeb
--- /dev/null
+++ b/scripts/flog/main/utils.py
@@ -0,0 +1,70 @@
+# -*- python -*-
+## -----------------------------------------------------------------------
+## Intent: This module contains general helper methods
+## -----------------------------------------------------------------------
+
+# -----------------------------------------------------------------------
+# 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  IMPORTS  [---##
+##-------------------##
+import sys
+import pprint
+
+## ---------------------------------------------------------------------------
+## ---------------------------------------------------------------------------
+def iam():
+    """Return name of a called method."""
+
+    func_name = sys._getframe(1).f_code.co_name # pylint: disable=protected-access
+    iam       = "%s::%s" % (__name__, func_name)
+    return iam
+
+## -----------------------------------------------------------------------
+## Intent: Display a message then exit with non-zero status.
+##   This method cannot be intercepted by try/except
+## -----------------------------------------------------------------------
+def error(msg, exit_with=None, fatal=None):
+    """Display a message then exit with non-zero status.
+
+    :param msg: Error mesage to display.
+    :type  msg: string
+
+    :param exit_with: Shell exit status.
+    :type  exit_with: int, optional (default=2)
+
+    :param fatal: When true raise an exception.
+    :type  fatal: bool (default=False)
+
+    """
+
+    if exit_with is None:
+        exit_with = 2
+
+    if fatal is None:
+        fatal = false
+
+    if msg:
+        if fatal:
+            raise Exception("ERROR: %s" % msg)
+        else:
+            print("")
+            print("ERROR: %s" % msg)
+
+    sys.exit(exit_with)
+
+# EOF