bisect-kit: Remove the `common.init()` function

To remove the `common.init()` function, this CL makes following changes
1. Let configure be lazy-loaded
2. Load plugins when importing the `bisect_kit` module

BUG=b:254006099
TEST=./run_formatters.sh && ./run_tests.sh

Change-Id: I357a1ec89301e4260b342f8ccc7022bc4dc803be
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/bisect-kit/+/4273069
Reviewed-by: MD Nayeem Jahan Rafi <njrafi@chromium.org>
Tested-by: Ace Wu <acewu@chromium.org>
Commit-Queue: Ace Wu <acewu@chromium.org>
diff --git a/bisect_kit/__init__.py b/bisect_kit/__init__.py
index 13c4705..7e12bf7 100644
--- a/bisect_kit/__init__.py
+++ b/bisect_kit/__init__.py
@@ -5,8 +5,12 @@
 import pathlib
 import sys
 
+from bisect_kit import configure
+
 
 BISECT_KIT_ROOT = pathlib.Path(__file__).resolve().parent.parent
 
 # grpc, buildbucket protobuf modules
 sys.path.append(str(BISECT_KIT_ROOT / 'third_party'))
+
+configure.load_plugins(configure.load_config().iter_plugins())
diff --git a/bisect_kit/bisector_cli.py b/bisect_kit/bisector_cli.py
index 04a3cb8..c9659b7 100644
--- a/bisect_kit/bisector_cli.py
+++ b/bisect_kit/bisector_cli.py
@@ -1470,7 +1470,6 @@
               'prog': Program name; optional.
             }
         """
-        common.init()
         parser = self.create_argument_parser(kwargs.get('prog'))
         opts = parser.parse_args(args or None)
         common.config_logging(opts)
diff --git a/bisect_kit/bisector_cli_test.py b/bisect_kit/bisector_cli_test.py
index 862a4d1..0a368ec 100644
--- a/bisect_kit/bisector_cli_test.py
+++ b/bisect_kit/bisector_cli_test.py
@@ -11,7 +11,6 @@
 
 from bisect_kit import bisector_cli
 from bisect_kit import cli
-from bisect_kit import common
 from bisect_kit import core
 from bisect_kit import errors
 from bisect_kit import testing
@@ -471,7 +470,6 @@
             bisector.main('view')
 
     def test_current_status(self):
-        common.init()
         bisector = bisector_cli.BisectorCommandLine(DummyDomain)
         result = bisector.current_status()
         self.assertEqual(result.get('inited'), False)
diff --git a/bisect_kit/common.py b/bisect_kit/common.py
index 105ba15..5565594 100644
--- a/bisect_kit/common.py
+++ b/bisect_kit/common.py
@@ -162,8 +162,3 @@
 def under_luci_context():
     """Returns True if current process is under a luci auth context."""
     return bool(os.getenv('LUCI_CONTEXT'))
-
-
-def init():
-    config = configure.load_config()
-    configure.load_plugins(config.iter_plugins())
diff --git a/bisect_kit/common_test.py b/bisect_kit/common_test.py
index f2492b5..cba03fe 100644
--- a/bisect_kit/common_test.py
+++ b/bisect_kit/common_test.py
@@ -32,7 +32,6 @@
         'bisect_kit.common.config_logging.configured', False, create=True
     )
     def test_logging(self):
-        common.init()
         parents = [common.create_common_argument_parser()]
         parser = argparse.ArgumentParser(parents=parents)
         opts = parser.parse_args(['--log_file', self.log_file])
diff --git a/bisect_kit/configure.py b/bisect_kit/configure.py
index 33c792a..b35df6d 100644
--- a/bisect_kit/configure.py
+++ b/bisect_kit/configure.py
@@ -148,8 +148,8 @@
             raise ValueError(f'Config file "{config}" not found')
         return config
 
-    for path in [pathlib.Path.cwd(), pathlib.Path(args[0]).parent]:
-        fullpath = path / DEFAULT_CONFIG_FILENAME
+    for search_path in [pathlib.Path.cwd(), pathlib.Path(args[0]).parent]:
+        fullpath = search_path / DEFAULT_CONFIG_FILENAME
         if fullpath.exists():
             return fullpath
 
@@ -173,8 +173,8 @@
     Returns:
       Configuration value.
     """
-    assert root
-    value = root.get_option(name)
+    config = load_config()
+    value = config.get_option(name)
     if value is not None:
         return value
 
diff --git a/bisect_kit/diagnoser_cros.py b/bisect_kit/diagnoser_cros.py
index e97299e..79bcc01 100644
--- a/bisect_kit/diagnoser_cros.py
+++ b/bisect_kit/diagnoser_cros.py
@@ -1038,7 +1038,6 @@
     """Diagnose command line interface."""
 
     def __init__(self):
-        common.init()
         self.argument_parser = self.create_argument_parser()
         self.states = None
 
diff --git a/cros_helper.py b/cros_helper.py
index f436da4..a60314c 100755
--- a/cros_helper.py
+++ b/cros_helper.py
@@ -645,7 +645,6 @@
 
 @cli.fatal_error_handler
 def main():
-    common.init()
     parents = [common.create_session_optional_parser()]
     parser = argparse.ArgumentParser()
     cli.patching_argparser_exit(parser)
diff --git a/eval_cros_autotest.py b/eval_cros_autotest.py
index 6d28ba6..9f1675b 100755
--- a/eval_cros_autotest.py
+++ b/eval_cros_autotest.py
@@ -432,7 +432,6 @@
 
 
 def step_main(args: typing.Optional[tuple[str]]) -> core.StepResult:
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/eval_cros_os_looping_localbuild.py b/eval_cros_os_looping_localbuild.py
index 438ed6b..741f33d 100755
--- a/eval_cros_os_looping_localbuild.py
+++ b/eval_cros_os_looping_localbuild.py
@@ -46,7 +46,6 @@
 
 @cli.fatal_error_handler
 def main(args=None):
-    common.init()
     opts = switch_cros_localbuild.parse_args(args)
     common.config_logging(opts)
 
diff --git a/eval_cros_os_looping_prebuilt.py b/eval_cros_os_looping_prebuilt.py
index 1befa69..cce97a5 100755
--- a/eval_cros_os_looping_prebuilt.py
+++ b/eval_cros_os_looping_prebuilt.py
@@ -46,7 +46,6 @@
 
 @cli.fatal_error_handler
 def main(args=None):
-    common.init()
     opts = switch_cros_prebuilt.parse_args(args)
     common.config_logging(opts)
 
diff --git a/eval_cros_tast.py b/eval_cros_tast.py
index a7d650d..2580a3d 100755
--- a/eval_cros_tast.py
+++ b/eval_cros_tast.py
@@ -300,7 +300,6 @@
 
 
 def step_main(args: 'typing.Optional[tuple[str]]') -> core.StepResult:
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/runner.py b/runner.py
index 3762408..6f1e79f 100755
--- a/runner.py
+++ b/runner.py
@@ -306,7 +306,6 @@
 
 
 def main(args=None):
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/runner_test.py b/runner_test.py
index cc8aea8..1bc89ad 100644
--- a/runner_test.py
+++ b/runner_test.py
@@ -8,7 +8,6 @@
 import unittest
 from unittest import mock
 
-from bisect_kit import common
 from bisect_kit import configure
 import runner
 
@@ -106,7 +105,6 @@
         )
 
     def test_run_once_returncode(self):
-        common.init()
         parser = runner.create_argument_parser()
         opts = parser.parse_args(['--new', '--returncode=0', 'true'])
         self.assertEqual(runner.run_once(opts), runner.NEW)
@@ -125,7 +123,6 @@
         self.assertEqual(runner.run_once(opts), runner.FATAL)
 
     def test_run_once_output(self):
-        common.init()
         parser = runner.create_argument_parser()
         opts = parser.parse_args(['--old', '--output', 'OLD', 'echo', 'OLD'])
         self.assertEqual(runner.run_once(opts), runner.OLD)
@@ -157,7 +154,6 @@
         self.assertEqual(runner.run_once(opts), runner.SKIP)
 
     def test_run_once_timeout(self):
-        common.init()
         parser = runner.create_argument_parser()
         opts = parser.parse_args(['--new', '--timeout=0.1', 'sleep', '0.11'])
         self.assertEqual(runner.run_once(opts), runner.NEW)
@@ -166,7 +162,6 @@
         self.assertEqual(runner.run_once(opts), runner.OLD)
 
     def test_run_once_terminate_output(self):
-        common.init()
         parser = runner.create_argument_parser()
         opts = parser.parse_args(
             [
diff --git a/setup_cros_bisect.py b/setup_cros_bisect.py
index dd64586..b98b504 100755
--- a/setup_cros_bisect.py
+++ b/setup_cros_bisect.py
@@ -826,7 +826,6 @@
 
 
 def main():
-    common.init()
     parser = create_parser()
     opts = parser.parse_args()
     common.config_logging(opts)
diff --git a/switch_arc_localbuild.py b/switch_arc_localbuild.py
index 9dee529..f77d1bf 100755
--- a/switch_arc_localbuild.py
+++ b/switch_arc_localbuild.py
@@ -114,7 +114,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]):
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/switch_arc_prebuilt.py b/switch_arc_prebuilt.py
index 29f2176..502a809 100755
--- a/switch_arc_prebuilt.py
+++ b/switch_arc_prebuilt.py
@@ -65,7 +65,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]):
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/switch_autotest_prebuilt.py b/switch_autotest_prebuilt.py
index 67f3155..719ffc2 100755
--- a/switch_autotest_prebuilt.py
+++ b/switch_autotest_prebuilt.py
@@ -168,7 +168,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]):
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/switch_cros_cr_localbuild_internal.py b/switch_cros_cr_localbuild_internal.py
index cb7996d..a1321c4 100755
--- a/switch_cros_cr_localbuild_internal.py
+++ b/switch_cros_cr_localbuild_internal.py
@@ -168,7 +168,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]):
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/switch_cros_cr_localbuild_master.py b/switch_cros_cr_localbuild_master.py
index 6b3082b..cbe6f49 100755
--- a/switch_cros_cr_localbuild_master.py
+++ b/switch_cros_cr_localbuild_master.py
@@ -134,7 +134,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]):
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/switch_cros_localbuild.py b/switch_cros_localbuild.py
index eb51193..d12618d 100755
--- a/switch_cros_localbuild.py
+++ b/switch_cros_localbuild.py
@@ -346,7 +346,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]):
-    common.init()
     opts = parse_args(args)
     common.config_logging(opts)
     inner_main(opts)
diff --git a/switch_cros_localbuild_buildbucket.py b/switch_cros_localbuild_buildbucket.py
index bb52b64..148a26f 100755
--- a/switch_cros_localbuild_buildbucket.py
+++ b/switch_cros_localbuild_buildbucket.py
@@ -490,7 +490,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]) -> core.StepResult:
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/switch_cros_prebuilt.py b/switch_cros_prebuilt.py
index 888e622..93fb29d 100755
--- a/switch_cros_prebuilt.py
+++ b/switch_cros_prebuilt.py
@@ -136,7 +136,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]):
-    common.init()
     opts = parse_args(args)
     common.config_logging(opts)
     inner_main(opts)
diff --git a/switch_git.py b/switch_git.py
index 402b247..6c7fd2f 100755
--- a/switch_git.py
+++ b/switch_git.py
@@ -51,7 +51,6 @@
 
 @cli.fatal_error_handler
 def main(args=None):
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/switch_lacros_prebuilt.py b/switch_lacros_prebuilt.py
index fc7e656..629bb73 100755
--- a/switch_lacros_prebuilt.py
+++ b/switch_lacros_prebuilt.py
@@ -69,7 +69,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]):
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)
diff --git a/switch_tast_prebuilt.py b/switch_tast_prebuilt.py
index 593905c..6cf341b 100755
--- a/switch_tast_prebuilt.py
+++ b/switch_tast_prebuilt.py
@@ -108,7 +108,6 @@
 
 
 def switch_main(args: typing.Optional[tuple[str]]):
-    common.init()
     parser = create_argument_parser()
     opts = parser.parse_args(args)
     common.config_logging(opts)