[sdk] Add property sdk_subbuilders to schedule subbuilds

Part of a soft-transition to use fuchsia/build.py as
sdk_subbuilders. This property will become mandatory once
the transition is complete.

Bug: 37259

Change-Id: I47f067fe5f6550bcd76ceeda1b80c4f9a1145e3e
diff --git a/recipes/sdk.expected/global_ci.json b/recipes/sdk.expected/global_ci.json
index ad25c49..e81cab1 100644
--- a/recipes/sdk.expected/global_ci.json
+++ b/recipes/sdk.expected/global_ci.json
@@ -8,7 +8,7 @@
     ],
     "infra_step": true,
     "name": "schedule sdk builds",
-    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"###global-integration-bucket###\", \"builder\": \"sdk-core-subbuild-arm64-linux\", \"project\": \"project\"}, \"experimental\": \"NO\", \"fields\": \"builder,createTime,createdBy,critical,endTime,id,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"fuchsia.googlesource.com\", \"id\": \"c22471f4e3f842ae18dd9adec82ed9eb78ed1127\", \"project\": \"topaz\", \"ref\": \"refs/heads/master\"}, \"properties\": {\"sdk_id\": \"8945511751514863184\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"tags\": [{\"key\": \"user_agent\", \"value\": \"recipe\"}]}}, {\"scheduleBuild\": {\"builder\": {\"bucket\": \"###global-integration-bucket###\", \"builder\": \"sdk-core-subbuild-x64-linux\", \"project\": \"project\"}, \"experimental\": \"NO\", \"fields\": \"builder,createTime,createdBy,critical,endTime,id,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"fuchsia.googlesource.com\", \"id\": \"c22471f4e3f842ae18dd9adec82ed9eb78ed1127\", \"project\": \"topaz\", \"ref\": \"refs/heads/master\"}, \"properties\": {\"sdk_id\": \"8945511751514863184\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-00000000133a\", \"tags\": [{\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
+    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"###global-integration-bucket###\", \"builder\": \"core.arm64-linux-sdk-subbuild\", \"project\": \"project\"}, \"experimental\": \"NO\", \"fields\": \"builder,createTime,createdBy,critical,endTime,id,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"fuchsia.googlesource.com\", \"id\": \"c22471f4e3f842ae18dd9adec82ed9eb78ed1127\", \"project\": \"topaz\", \"ref\": \"refs/heads/master\"}, \"properties\": {\"sdk_id\": \"8945511751514863184\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"tags\": [{\"key\": \"user_agent\", \"value\": \"recipe\"}]}}, {\"scheduleBuild\": {\"builder\": {\"bucket\": \"###global-integration-bucket###\", \"builder\": \"core.x64-linux-sdk-subbuild\", \"project\": \"project\"}, \"experimental\": \"NO\", \"fields\": \"builder,createTime,createdBy,critical,endTime,id,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"fuchsia.googlesource.com\", \"id\": \"c22471f4e3f842ae18dd9adec82ed9eb78ed1127\", \"project\": \"topaz\", \"ref\": \"refs/heads/master\"}, \"properties\": {\"sdk_id\": \"8945511751514863184\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-00000000133a\", \"tags\": [{\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"responses\": [@@@",
@@ -16,7 +16,7 @@
       "@@@STEP_LOG_LINE@json.output@      \"scheduleBuild\": {@@@",
       "@@@STEP_LOG_LINE@json.output@        \"builder\": {@@@",
       "@@@STEP_LOG_LINE@json.output@          \"bucket\": \"###global-integration-bucket###\", @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"sdk-core-subbuild-arm64-linux\", @@@",
+      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"core.arm64-linux-sdk-subbuild\", @@@",
       "@@@STEP_LOG_LINE@json.output@          \"project\": \"project\"@@@",
       "@@@STEP_LOG_LINE@json.output@        }, @@@",
       "@@@STEP_LOG_LINE@json.output@        \"id\": \"8922054662172514000\"@@@",
@@ -26,7 +26,7 @@
       "@@@STEP_LOG_LINE@json.output@      \"scheduleBuild\": {@@@",
       "@@@STEP_LOG_LINE@json.output@        \"builder\": {@@@",
       "@@@STEP_LOG_LINE@json.output@          \"bucket\": \"###global-integration-bucket###\", @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"sdk-core-subbuild-x64-linux\", @@@",
+      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"core.x64-linux-sdk-subbuild\", @@@",
       "@@@STEP_LOG_LINE@json.output@          \"project\": \"project\"@@@",
       "@@@STEP_LOG_LINE@json.output@        }, @@@",
       "@@@STEP_LOG_LINE@json.output@        \"id\": \"8922054662172514001\"@@@",
@@ -41,7 +41,7 @@
       "@@@STEP_LOG_LINE@request@      \"scheduleBuild\": {@@@",
       "@@@STEP_LOG_LINE@request@        \"builder\": {@@@",
       "@@@STEP_LOG_LINE@request@          \"bucket\": \"###global-integration-bucket###\", @@@",
-      "@@@STEP_LOG_LINE@request@          \"builder\": \"sdk-core-subbuild-arm64-linux\", @@@",
+      "@@@STEP_LOG_LINE@request@          \"builder\": \"core.arm64-linux-sdk-subbuild\", @@@",
       "@@@STEP_LOG_LINE@request@          \"project\": \"project\"@@@",
       "@@@STEP_LOG_LINE@request@        }, @@@",
       "@@@STEP_LOG_LINE@request@        \"experimental\": \"NO\", @@@",
@@ -68,7 +68,7 @@
       "@@@STEP_LOG_LINE@request@      \"scheduleBuild\": {@@@",
       "@@@STEP_LOG_LINE@request@        \"builder\": {@@@",
       "@@@STEP_LOG_LINE@request@          \"bucket\": \"###global-integration-bucket###\", @@@",
-      "@@@STEP_LOG_LINE@request@          \"builder\": \"sdk-core-subbuild-x64-linux\", @@@",
+      "@@@STEP_LOG_LINE@request@          \"builder\": \"core.x64-linux-sdk-subbuild\", @@@",
       "@@@STEP_LOG_LINE@request@          \"project\": \"project\"@@@",
       "@@@STEP_LOG_LINE@request@        }, @@@",
       "@@@STEP_LOG_LINE@request@        \"experimental\": \"NO\", @@@",
@@ -533,8 +533,8 @@
     "infra_step": true,
     "name": "get_sdk_paths",
     "~followup_annotations": [
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/fuchsia/archives/sdk-core-subbuild-arm64-linux/core.tar.gz@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/fuchsia/archives/sdk-core-subbuild-x64-linux/core.tar.gz@@@",
+      "@@@STEP_LOG_LINE@glob@[START_DIR]/fuchsia/archives/core.arm64-linux-sdk-subbuild/core.tar.gz@@@",
+      "@@@STEP_LOG_LINE@glob@[START_DIR]/fuchsia/archives/core.x64-linux-sdk-subbuild/core.tar.gz@@@",
       "@@@STEP_LOG_END@glob@@@"
     ]
   },
@@ -546,7 +546,7 @@
       "--json-output",
       "/path/to/tmp/json",
       "move",
-      "[START_DIR]/fuchsia/archives/sdk-core-subbuild-arm64-linux/core.tar.gz",
+      "[START_DIR]/fuchsia/archives/core.arm64-linux-sdk-subbuild/core.tar.gz",
       "[CLEANUP]/merged_sdk_archive.tar.gz"
     ],
     "infra_step": true,
@@ -558,13 +558,13 @@
       "-u",
       "[START_DIR]/fuchsia/scripts/sdk/merger/merge.py",
       "--first-archive",
-      "[START_DIR]/fuchsia/archives/sdk-core-subbuild-x64-linux/core.tar.gz",
+      "[START_DIR]/fuchsia/archives/core.x64-linux-sdk-subbuild/core.tar.gz",
       "--second-archive",
       "[CLEANUP]/merged_sdk_archive.tar.gz",
       "--output-archive",
       "[CLEANUP]/merged_sdk_archive.tar.gz"
     ],
-    "name": "merge [START_DIR]/fuchsia/archives/sdk-core-subbuild-x64-linux/core.tar.gz"
+    "name": "merge [START_DIR]/fuchsia/archives/core.x64-linux-sdk-subbuild/core.tar.gz"
   },
   {
     "cmd": [
diff --git a/recipes/sdk.expected/release_ci.json b/recipes/sdk.expected/release_ci.json
index 50f1de3..cfd9c66 100644
--- a/recipes/sdk.expected/release_ci.json
+++ b/recipes/sdk.expected/release_ci.json
@@ -8,7 +8,7 @@
     ],
     "infra_step": true,
     "name": "schedule sdk builds",
-    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"###global-integration-bucket###\", \"builder\": \"sdk-core-subbuild-arm64-linux\", \"project\": \"project\"}, \"experimental\": \"NO\", \"fields\": \"builder,createTime,createdBy,critical,endTime,id,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"fuchsia.googlesource.com\", \"id\": \"c22471f4e3f842ae18dd9adec82ed9eb78ed1127\", \"project\": \"topaz\", \"ref\": \"refs/heads/release\"}, \"properties\": {\"sdk_id\": \"8945511751514863184\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"tags\": [{\"key\": \"user_agent\", \"value\": \"recipe\"}]}}, {\"scheduleBuild\": {\"builder\": {\"bucket\": \"###global-integration-bucket###\", \"builder\": \"sdk-core-subbuild-x64-linux\", \"project\": \"project\"}, \"experimental\": \"NO\", \"fields\": \"builder,createTime,createdBy,critical,endTime,id,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"fuchsia.googlesource.com\", \"id\": \"c22471f4e3f842ae18dd9adec82ed9eb78ed1127\", \"project\": \"topaz\", \"ref\": \"refs/heads/release\"}, \"properties\": {\"sdk_id\": \"8945511751514863184\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-00000000133a\", \"tags\": [{\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
+    "stdin": "{\"requests\": [{\"scheduleBuild\": {\"builder\": {\"bucket\": \"###global-integration-bucket###\", \"builder\": \"core.arm64-linux-sdk-subbuild\", \"project\": \"project\"}, \"experimental\": \"NO\", \"fields\": \"builder,createTime,createdBy,critical,endTime,id,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"fuchsia.googlesource.com\", \"id\": \"c22471f4e3f842ae18dd9adec82ed9eb78ed1127\", \"project\": \"topaz\", \"ref\": \"refs/heads/release\"}, \"properties\": {\"sdk_id\": \"8945511751514863184\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-000000001337\", \"tags\": [{\"key\": \"user_agent\", \"value\": \"recipe\"}]}}, {\"scheduleBuild\": {\"builder\": {\"bucket\": \"###global-integration-bucket###\", \"builder\": \"core.x64-linux-sdk-subbuild\", \"project\": \"project\"}, \"experimental\": \"NO\", \"fields\": \"builder,createTime,createdBy,critical,endTime,id,input,number,output,startTime,status,updateTime\", \"gitilesCommit\": {\"host\": \"fuchsia.googlesource.com\", \"id\": \"c22471f4e3f842ae18dd9adec82ed9eb78ed1127\", \"project\": \"topaz\", \"ref\": \"refs/heads/release\"}, \"properties\": {\"sdk_id\": \"8945511751514863184\"}, \"requestId\": \"8945511751514863184-00000000-0000-0000-0000-00000000133a\", \"tags\": [{\"key\": \"user_agent\", \"value\": \"recipe\"}]}}]}",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"responses\": [@@@",
@@ -16,7 +16,7 @@
       "@@@STEP_LOG_LINE@json.output@      \"scheduleBuild\": {@@@",
       "@@@STEP_LOG_LINE@json.output@        \"builder\": {@@@",
       "@@@STEP_LOG_LINE@json.output@          \"bucket\": \"###global-integration-bucket###\", @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"sdk-core-subbuild-arm64-linux\", @@@",
+      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"core.arm64-linux-sdk-subbuild\", @@@",
       "@@@STEP_LOG_LINE@json.output@          \"project\": \"project\"@@@",
       "@@@STEP_LOG_LINE@json.output@        }, @@@",
       "@@@STEP_LOG_LINE@json.output@        \"id\": \"8922054662172514000\"@@@",
@@ -26,7 +26,7 @@
       "@@@STEP_LOG_LINE@json.output@      \"scheduleBuild\": {@@@",
       "@@@STEP_LOG_LINE@json.output@        \"builder\": {@@@",
       "@@@STEP_LOG_LINE@json.output@          \"bucket\": \"###global-integration-bucket###\", @@@",
-      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"sdk-core-subbuild-x64-linux\", @@@",
+      "@@@STEP_LOG_LINE@json.output@          \"builder\": \"core.x64-linux-sdk-subbuild\", @@@",
       "@@@STEP_LOG_LINE@json.output@          \"project\": \"project\"@@@",
       "@@@STEP_LOG_LINE@json.output@        }, @@@",
       "@@@STEP_LOG_LINE@json.output@        \"id\": \"8922054662172514001\"@@@",
@@ -41,7 +41,7 @@
       "@@@STEP_LOG_LINE@request@      \"scheduleBuild\": {@@@",
       "@@@STEP_LOG_LINE@request@        \"builder\": {@@@",
       "@@@STEP_LOG_LINE@request@          \"bucket\": \"###global-integration-bucket###\", @@@",
-      "@@@STEP_LOG_LINE@request@          \"builder\": \"sdk-core-subbuild-arm64-linux\", @@@",
+      "@@@STEP_LOG_LINE@request@          \"builder\": \"core.arm64-linux-sdk-subbuild\", @@@",
       "@@@STEP_LOG_LINE@request@          \"project\": \"project\"@@@",
       "@@@STEP_LOG_LINE@request@        }, @@@",
       "@@@STEP_LOG_LINE@request@        \"experimental\": \"NO\", @@@",
@@ -68,7 +68,7 @@
       "@@@STEP_LOG_LINE@request@      \"scheduleBuild\": {@@@",
       "@@@STEP_LOG_LINE@request@        \"builder\": {@@@",
       "@@@STEP_LOG_LINE@request@          \"bucket\": \"###global-integration-bucket###\", @@@",
-      "@@@STEP_LOG_LINE@request@          \"builder\": \"sdk-core-subbuild-x64-linux\", @@@",
+      "@@@STEP_LOG_LINE@request@          \"builder\": \"core.x64-linux-sdk-subbuild\", @@@",
       "@@@STEP_LOG_LINE@request@          \"project\": \"project\"@@@",
       "@@@STEP_LOG_LINE@request@        }, @@@",
       "@@@STEP_LOG_LINE@request@        \"experimental\": \"NO\", @@@",
@@ -657,8 +657,8 @@
     "infra_step": true,
     "name": "get_sdk_paths",
     "~followup_annotations": [
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/fuchsia/archives/sdk-core-subbuild-arm64-linux/core.tar.gz@@@",
-      "@@@STEP_LOG_LINE@glob@[START_DIR]/fuchsia/archives/sdk-core-subbuild-x64-linux/core.tar.gz@@@",
+      "@@@STEP_LOG_LINE@glob@[START_DIR]/fuchsia/archives/core.arm64-linux-sdk-subbuild/core.tar.gz@@@",
+      "@@@STEP_LOG_LINE@glob@[START_DIR]/fuchsia/archives/core.x64-linux-sdk-subbuild/core.tar.gz@@@",
       "@@@STEP_LOG_END@glob@@@"
     ]
   },
@@ -670,7 +670,7 @@
       "--json-output",
       "/path/to/tmp/json",
       "move",
-      "[START_DIR]/fuchsia/archives/sdk-core-subbuild-arm64-linux/core.tar.gz",
+      "[START_DIR]/fuchsia/archives/core.arm64-linux-sdk-subbuild/core.tar.gz",
       "[CLEANUP]/merged_sdk_archive.tar.gz"
     ],
     "infra_step": true,
@@ -682,13 +682,13 @@
       "-u",
       "[START_DIR]/fuchsia/scripts/sdk/merger/merge.py",
       "--first-archive",
-      "[START_DIR]/fuchsia/archives/sdk-core-subbuild-x64-linux/core.tar.gz",
+      "[START_DIR]/fuchsia/archives/core.x64-linux-sdk-subbuild/core.tar.gz",
       "--second-archive",
       "[CLEANUP]/merged_sdk_archive.tar.gz",
       "--output-archive",
       "[CLEANUP]/merged_sdk_archive.tar.gz"
     ],
-    "name": "merge [START_DIR]/fuchsia/archives/sdk-core-subbuild-x64-linux/core.tar.gz"
+    "name": "merge [START_DIR]/fuchsia/archives/core.x64-linux-sdk-subbuild/core.tar.gz"
   },
   {
     "cmd": [
diff --git a/recipes/sdk.py b/recipes/sdk.py
index 4c7e0a4..e419f0f 100644
--- a/recipes/sdk.py
+++ b/recipes/sdk.py
@@ -73,6 +73,15 @@
             kind=str,
             help='The CIPD package root for upload.',
             default='fuchsia'),
+    'subbuilders':
+        Property(
+            kind=List(basestring),
+            help='SDK subbuilders used to generate SDK archives.',
+            # TODO(fxb/40777): Make this required. This is optional for a
+            # soft-transition away from sdk_subbuild.py to fuchsia/build.py.
+            # If this property is set, use these fuchsia/build.py subbuilders
+            # instead of the default sdk_subbuild.py.
+            default=()),
     'companion_images':
         Property(
             kind=List(dict),
@@ -145,7 +154,7 @@
 
 
 def RunSteps(api, manifest, remote, checkout_snapshot, gcs_bucket, sdk_name,
-             cipd_root, companion_images, publish_branch, sdk_id):
+             cipd_root, subbuilders, companion_images, publish_branch, sdk_id):
   build = api.buildbucket.build
 
   revision = build.input.gitiles_commit.id
@@ -157,10 +166,16 @@
   properties = {'sdk_id': sdk_id}
 
   sdk_schedule_reqs = []
-  builder_names = [
-      'sdk-%s-subbuild-%s-%s' % (sdk_name, target, api.platform.name)
-      for target in TARGETS
-  ]
+
+  # TODO (fxb/40777): Make this unconditionally use subbuilders.
+  if not subbuilders:
+    builder_names = [
+        'sdk-%s-subbuild-%s-%s' % (sdk_name, target, api.platform.name)
+        for target in TARGETS
+    ]
+  else:
+    builder_names = subbuilders
+
   for builder_name in builder_names:
     sdk_schedule_reqs.append(
         api.buildbucket.schedule_request(
@@ -469,6 +484,12 @@
 
   revision = api.jiri.example_revision
 
+  # TODO(fxb/40777): Make this a default property.
+  subbuilders_properties = api.properties(subbuilders=[
+      'core.arm64-linux-sdk-subbuild',
+      'core.x64-linux-sdk-subbuild',
+  ])
+
   topaz_properties = api.properties(
       project='integration',
       manifest='fuchsia/topaz/topaz',
@@ -588,12 +609,12 @@
          api.properties(
              companion_images=companion_images,
              publish_branch=publish_branch,
-         ) + failed_describe)
+         ) + failed_describe + subbuilders_properties)
   yield (api.test('release_ci') + topaz_release_ci + ci_subbuilds +
          ci_image_builds + api.properties(
              companion_images=companion_images,
              publish_branch=publish_branch,
-         ) + describe + release_versions)
+         ) + describe + subbuilders_properties + release_versions)
   yield (api.test('local_ci_build_failure') + topaz_global_ci +
          ci_subbuilds_failure)
   yield (api.test('local_ci_infra_failure') + topaz_global_ci +