cbuildbot: start framework for builders being in sep modules

The current cbuildbot entry point encodes all of the various builder logic
and has been growing out of hand.  Start a framework where cbuildbot is a
runner and the config controls what builder module actually gets run.

This will make it easier to add arbitrary builder types in the future --
just drop in a new builder module and update the config to refer to it.

BUG=brillo:134, chromium:299943
TEST=`./cbuildbot/run_tests` passes
TEST=precq doesn't blow up

Change-Id: Iab75fcec1749fdc3460b213ff60af94d05591bad
Reviewed-on: https://chromium-review.googlesource.com/246353
Trybot-Ready: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: David James <davidjames@chromium.org>
Reviewed-by: Aviv Keshet <akeshet@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
diff --git a/scripts/cbuildbot.py b/scripts/cbuildbot.py
index 3aac2e4..ecf69de 100644
--- a/scripts/cbuildbot.py
+++ b/scripts/cbuildbot.py
@@ -24,6 +24,7 @@
 import tempfile
 
 from chromite.cbuildbot import afdo
+from chromite.cbuildbot import builders
 from chromite.cbuildbot import cbuildbot_config
 from chromite.cbuildbot import cbuildbot_run
 from chromite.cbuildbot import constants
@@ -934,10 +935,19 @@
     builder_run = cbuildbot_run.BuilderRun(options, build_config, manager)
     if metadata_dump_dict:
       builder_run.attrs.metadata.UpdateWithDict(metadata_dump_dict)
-    if _IsDistributedBuilder(options, chrome_rev, build_config):
-      builder_cls = DistributedBuilder
+
+    builder_cls_name = builder_run.config.builder_class_name
+    if builder_cls_name is None:
+      if _IsDistributedBuilder(options, chrome_rev, build_config):
+        builder_cls = DistributedBuilder
+      else:
+        builder_cls = SimpleBuilder
     else:
-      builder_cls = SimpleBuilder
+      builder_cls = builders.GetBuilderCls(builder_cls_name)
+    if builder_cls is None:
+      cros_build_lib.Die('config %s uses an unknown builder_class_name: %s',
+                         build_config.name, builder_cls_name)
+
     builder = builder_cls(builder_run)
     if not builder.Run():
       sys.exit(1)