Merge pie-platform-release to aosp-master - DO NOT MERGE

Change-Id: Ia8f24c88b83b64a08353ab7fc52cc3409aee8e96
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/__init__.py
diff --git a/configs/global/Android.mk b/configs/global/Android.mk
index b1aa1e3..aba3244 100644
--- a/configs/global/Android.mk
+++ b/configs/global/Android.mk
@@ -14,15 +14,15 @@
 
 LOCAL_PATH := $(call my-dir)
 
-include $(CLEAR_VARS)
+vti-global-config-prod-zip :=
+vti-global-config-test-zip :=
 
-.PHONY: vti-global-config
-
+dirs := $(strip \
+  $(wildcard test/vti/test_serving/configs/global/prod) \
+  $(wildcard vendor/google_vts/configs/global/prod))
+ifdef dirs
 vti-global-config-prod-zip := $(HOST_OUT)/vti-global-config/vti-global-config-prod.zip
-vti-global-config-test-zip := $(HOST_OUT)/vti-global-config/vti-global-config-test.zip
-
-.PHONY: $(vti-global-config-prod-zip)
-$(vti-global-config-prod-zip): $(SOONG_ZIP)
+$(vti-global-config-prod-zip): $(SOONG_ZIP) $(call find-files-in-subdirs,.,"*.*_config", $(dirs))
 	@echo "build vti config package: $@"
 	$(hide) mkdir -p $(dir $@)
 	$(hide) rm -f $@
@@ -31,9 +31,14 @@
 	$(hide) $(SOONG_ZIP) -d -o $@ -C test/vti/test_serving/configs/global -l $@.list \
 	    -C vendor/google_vts/configs/global -l $@.list.vendor
 	$(hide) rm -f $@.list $@.list.vendor
+endif
 
-.PHONY: $(vti-global-config-test-zip)
-$(vti-global-config-test-zip): $(SOONG_ZIP)
+dirs := $(strip \
+    $(wildcard test/vti/test_serving/configs/global/test) \
+    $(wildcard vendor/google_vts/configs/global/test))
+ifdef dirs
+vti-global-config-test-zip := $(HOST_OUT)/vti-global-config/vti-global-config-test.zip
+$(vti-global-config-test-zip): $(SOONG_ZIP) $(call find-files-in-subdirs,.,"*.*_config", $(dirs))
 	@echo "build vti config package: $@"
 	$(hide) mkdir -p $(dir $@)
 	$(hide) rm -f $@
@@ -42,12 +47,17 @@
 	$(hide) $(SOONG_ZIP) -d -o $@ -C test/vti/test_serving/configs/global -l $@.list \
 	    -C vendor/google_vts/configs/global -l $@.list.vendor
 	$(hide) rm -f $@.list $@.list.vendor
+endif
 
+.PHONY: vti-global-config
 vti-global-config: $(vti-global-config-prod-zip) $(vti-global-config-test-zip)
 $(call dist-for-goals, vti-global-config, $(vti-global-config-prod-zip) $(vti-global-config-test-zip))
 
+.PHONY: vti-config
 vti-config: vti-global-config
 
+.PHONY: vti
 vti: vti-config
 
+.PHONY: vts
 vts: vti-config
diff --git a/proto/GreenBuildScheduleConfigMessage_pb2.py b/proto/GreenBuildScheduleConfigMessage_pb2.py
index 22c777c..a001a7a 100644
--- a/proto/GreenBuildScheduleConfigMessage_pb2.py
+++ b/proto/GreenBuildScheduleConfigMessage_pb2.py
@@ -1,19 +1,27 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: GreenBuildScheduleConfigMessage.proto
 
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
 from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
+_sym_db = _symbol_database.Default()
+
 
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='GreenBuildScheduleConfigMessage.proto',
   package='android.test.lab',
-  serialized_pb='\n%GreenBuildScheduleConfigMessage.proto\x12\x10\x61ndroid.test.lab\"\xfa\x01\n\x1fGreenBuildScheduleConfigMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x10\n\x08schedule\x18\x02 \x01(\x0c\x12\x10\n\x08priority\x18\x03 \x01(\x0c\x12\x12\n\ngsi_branch\x18\x0b \x01(\x0c\x12\x1a\n\x12gsi_pab_account_id\x18\x0c \x01(\x0c\x12\x13\n\x0btest_branch\x18\x15 \x01(\x0c\x12\x1b\n\x13test_pab_account_id\x18\x16 \x01(\x0c\x12\x43\n\x04test\x18\x1f \x03(\x0b\x32\x35.android.test.lab.GreenBuildTestScheduleConfigMessage\"\xd0\x01\n#GreenBuildTestScheduleConfigMessage\x12\x11\n\ttest_name\x18\x01 \x01(\x0c\x12\x19\n\x11test_build_target\x18\x0b \x01(\x0c\x12\x15\n\rdevice_branch\x18\x15 \x01(\x0c\x12\x1d\n\x15\x64\x65vice_pab_account_id\x18\x16 \x01(\x0c\x12\x45\n\x04test\x18\x1f \x03(\x0b\x32\x37.android.test.lab.GreenBuildDeviceScheduleConfigMessage\"\xb4\x01\n%GreenBuildDeviceScheduleConfigMessage\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\x0c\x12\x0e\n\x06shards\x18\x0b \x01(\x05\x12\x15\n\rdevice_branch\x18\x15 \x01(\x0c\x12\x1b\n\x13\x64\x65vice_build_target\x18\x16 \x01(\x0c\x12\x1d\n\x15\x64\x65vice_pab_account_id\x18\x17 \x01(\x0c\x12\x18\n\x10gsi_build_target\x18\x1f \x01(\x0c')
+  syntax='proto2',
+  serialized_pb=_b('\n%GreenBuildScheduleConfigMessage.proto\x12\x10\x61ndroid.test.lab\"\xfa\x01\n\x1fGreenBuildScheduleConfigMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\x10\n\x08schedule\x18\x02 \x01(\x0c\x12\x10\n\x08priority\x18\x03 \x01(\x0c\x12\x12\n\ngsi_branch\x18\x0b \x01(\x0c\x12\x1a\n\x12gsi_pab_account_id\x18\x0c \x01(\x0c\x12\x13\n\x0btest_branch\x18\x15 \x01(\x0c\x12\x1b\n\x13test_pab_account_id\x18\x16 \x01(\x0c\x12\x43\n\x04test\x18\x1f \x03(\x0b\x32\x35.android.test.lab.GreenBuildTestScheduleConfigMessage\"\xd2\x01\n#GreenBuildTestScheduleConfigMessage\x12\x11\n\ttest_name\x18\x01 \x01(\x0c\x12\x19\n\x11test_build_target\x18\x0b \x01(\x0c\x12\x15\n\rdevice_branch\x18\x15 \x01(\x0c\x12\x1d\n\x15\x64\x65vice_pab_account_id\x18\x16 \x01(\x0c\x12G\n\x06\x64\x65vice\x18\x1f \x03(\x0b\x32\x37.android.test.lab.GreenBuildDeviceScheduleConfigMessage\"\xb4\x01\n%GreenBuildDeviceScheduleConfigMessage\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\x0c\x12\x0e\n\x06shards\x18\x0b \x01(\x05\x12\x15\n\rdevice_branch\x18\x15 \x01(\x0c\x12\x1b\n\x13\x64\x65vice_build_target\x18\x16 \x01(\x0c\x12\x1d\n\x15\x64\x65vice_pab_account_id\x18\x17 \x01(\x0c\x12\x18\n\x10gsi_build_target\x18\x1f \x01(\x0c')
+)
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 
 
@@ -28,49 +36,49 @@
     _descriptor.FieldDescriptor(
       name='name', full_name='android.test.lab.GreenBuildScheduleConfigMessage.name', index=0,
       number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='schedule', full_name='android.test.lab.GreenBuildScheduleConfigMessage.schedule', index=1,
       number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='priority', full_name='android.test.lab.GreenBuildScheduleConfigMessage.priority', index=2,
       number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='gsi_branch', full_name='android.test.lab.GreenBuildScheduleConfigMessage.gsi_branch', index=3,
       number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='gsi_pab_account_id', full_name='android.test.lab.GreenBuildScheduleConfigMessage.gsi_pab_account_id', index=4,
       number=12, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='test_branch', full_name='android.test.lab.GreenBuildScheduleConfigMessage.test_branch', index=5,
       number=21, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='test_pab_account_id', full_name='android.test.lab.GreenBuildScheduleConfigMessage.test_pab_account_id', index=6,
       number=22, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
@@ -89,7 +97,10 @@
   ],
   options=None,
   is_extendable=False,
+  syntax='proto2',
   extension_ranges=[],
+  oneofs=[
+  ],
   serialized_start=60,
   serialized_end=310,
 )
@@ -105,33 +116,33 @@
     _descriptor.FieldDescriptor(
       name='test_name', full_name='android.test.lab.GreenBuildTestScheduleConfigMessage.test_name', index=0,
       number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='test_build_target', full_name='android.test.lab.GreenBuildTestScheduleConfigMessage.test_build_target', index=1,
       number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='device_branch', full_name='android.test.lab.GreenBuildTestScheduleConfigMessage.device_branch', index=2,
       number=21, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='device_pab_account_id', full_name='android.test.lab.GreenBuildTestScheduleConfigMessage.device_pab_account_id', index=3,
       number=22, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='test', full_name='android.test.lab.GreenBuildTestScheduleConfigMessage.test', index=4,
+      name='device', full_name='android.test.lab.GreenBuildTestScheduleConfigMessage.device', index=4,
       number=31, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -145,9 +156,12 @@
   ],
   options=None,
   is_extendable=False,
+  syntax='proto2',
   extension_ranges=[],
+  oneofs=[
+  ],
   serialized_start=313,
-  serialized_end=521,
+  serialized_end=523,
 )
 
 
@@ -161,7 +175,7 @@
     _descriptor.FieldDescriptor(
       name='device', full_name='android.test.lab.GreenBuildDeviceScheduleConfigMessage.device', index=0,
       number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
@@ -175,28 +189,28 @@
     _descriptor.FieldDescriptor(
       name='device_branch', full_name='android.test.lab.GreenBuildDeviceScheduleConfigMessage.device_branch', index=2,
       number=21, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='device_build_target', full_name='android.test.lab.GreenBuildDeviceScheduleConfigMessage.device_build_target', index=3,
       number=22, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='device_pab_account_id', full_name='android.test.lab.GreenBuildDeviceScheduleConfigMessage.device_pab_account_id', index=4,
       number=23, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='gsi_build_target', full_name='android.test.lab.GreenBuildDeviceScheduleConfigMessage.gsi_build_target', index=5,
       number=31, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
@@ -208,34 +222,40 @@
   ],
   options=None,
   is_extendable=False,
+  syntax='proto2',
   extension_ranges=[],
-  serialized_start=524,
-  serialized_end=704,
+  oneofs=[
+  ],
+  serialized_start=526,
+  serialized_end=706,
 )
 
 _GREENBUILDSCHEDULECONFIGMESSAGE.fields_by_name['test'].message_type = _GREENBUILDTESTSCHEDULECONFIGMESSAGE
-_GREENBUILDTESTSCHEDULECONFIGMESSAGE.fields_by_name['test'].message_type = _GREENBUILDDEVICESCHEDULECONFIGMESSAGE
+_GREENBUILDTESTSCHEDULECONFIGMESSAGE.fields_by_name['device'].message_type = _GREENBUILDDEVICESCHEDULECONFIGMESSAGE
 DESCRIPTOR.message_types_by_name['GreenBuildScheduleConfigMessage'] = _GREENBUILDSCHEDULECONFIGMESSAGE
 DESCRIPTOR.message_types_by_name['GreenBuildTestScheduleConfigMessage'] = _GREENBUILDTESTSCHEDULECONFIGMESSAGE
 DESCRIPTOR.message_types_by_name['GreenBuildDeviceScheduleConfigMessage'] = _GREENBUILDDEVICESCHEDULECONFIGMESSAGE
 
-class GreenBuildScheduleConfigMessage(_message.Message):
-  __metaclass__ = _reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _GREENBUILDSCHEDULECONFIGMESSAGE
-
+GreenBuildScheduleConfigMessage = _reflection.GeneratedProtocolMessageType('GreenBuildScheduleConfigMessage', (_message.Message,), dict(
+  DESCRIPTOR = _GREENBUILDSCHEDULECONFIGMESSAGE,
+  __module__ = 'GreenBuildScheduleConfigMessage_pb2'
   # @@protoc_insertion_point(class_scope:android.test.lab.GreenBuildScheduleConfigMessage)
+  ))
+_sym_db.RegisterMessage(GreenBuildScheduleConfigMessage)
 
-class GreenBuildTestScheduleConfigMessage(_message.Message):
-  __metaclass__ = _reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _GREENBUILDTESTSCHEDULECONFIGMESSAGE
-
+GreenBuildTestScheduleConfigMessage = _reflection.GeneratedProtocolMessageType('GreenBuildTestScheduleConfigMessage', (_message.Message,), dict(
+  DESCRIPTOR = _GREENBUILDTESTSCHEDULECONFIGMESSAGE,
+  __module__ = 'GreenBuildScheduleConfigMessage_pb2'
   # @@protoc_insertion_point(class_scope:android.test.lab.GreenBuildTestScheduleConfigMessage)
+  ))
+_sym_db.RegisterMessage(GreenBuildTestScheduleConfigMessage)
 
-class GreenBuildDeviceScheduleConfigMessage(_message.Message):
-  __metaclass__ = _reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _GREENBUILDDEVICESCHEDULECONFIGMESSAGE
-
+GreenBuildDeviceScheduleConfigMessage = _reflection.GeneratedProtocolMessageType('GreenBuildDeviceScheduleConfigMessage', (_message.Message,), dict(
+  DESCRIPTOR = _GREENBUILDDEVICESCHEDULECONFIGMESSAGE,
+  __module__ = 'GreenBuildScheduleConfigMessage_pb2'
   # @@protoc_insertion_point(class_scope:android.test.lab.GreenBuildDeviceScheduleConfigMessage)
+  ))
+_sym_db.RegisterMessage(GreenBuildDeviceScheduleConfigMessage)
 
 
 # @@protoc_insertion_point(module_scope)
diff --git a/proto/TestLabConfigMessage.proto b/proto/TestLabConfigMessage.proto
index ed001b6..2324ead 100644
--- a/proto/TestLabConfigMessage.proto
+++ b/proto/TestLabConfigMessage.proto
@@ -21,6 +21,7 @@
   // Lab name where format is labtype-location-instance (e.g., vtslab-mtv32-main).
   optional bytes name = 1;
   optional bytes owner = 2;
+  repeated bytes admin = 3;
 
   // For the IP address.
   repeated HostConfigMessage host = 11;
@@ -35,6 +36,9 @@
   optional bytes script = 3;
   optional bytes setup_script = 4;
 
+  // list of equipment installed on this host.
+  repeated bytes host_equipment = 5;
+
   repeated DeviceConfigMessage device = 11;
 }
 
@@ -48,5 +52,8 @@
 
   // device product type (e.g., taimen or walleye).
   optional bytes product = 11;
+
+  // list of equipment installed on this device.
+  repeated bytes device_equipment = 21;
 }
 
diff --git a/proto/TestLabConfigMessage_pb2.py b/proto/TestLabConfigMessage_pb2.py
index d91116a..eb1799c 100644
--- a/proto/TestLabConfigMessage_pb2.py
+++ b/proto/TestLabConfigMessage_pb2.py
@@ -1,19 +1,27 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: TestLabConfigMessage.proto
 
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
 from google.protobuf import descriptor_pb2
 # @@protoc_insertion_point(imports)
 
+_sym_db = _symbol_database.Default()
+
 
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
   name='TestLabConfigMessage.proto',
   package='android.test.lab',
-  serialized_pb='\n\x1aTestLabConfigMessage.proto\x12\x10\x61ndroid.test.lab\"b\n\x10LabConfigMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\r\n\x05owner\x18\x02 \x01(\x0c\x12\x31\n\x04host\x18\x0b \x03(\x0b\x32#.android.test.lab.HostConfigMessage\"\x8e\x01\n\x11HostConfigMessage\x12\x10\n\x08hostname\x18\x01 \x01(\x0c\x12\n\n\x02ip\x18\x02 \x01(\x0c\x12\x0e\n\x06script\x18\x03 \x01(\x0c\x12\x14\n\x0csetup_script\x18\x04 \x01(\x0c\x12\x35\n\x06\x64\x65vice\x18\x0b \x03(\x0b\x32%.android.test.lab.DeviceConfigMessage\"E\n\x13\x44\x65viceConfigMessage\x12\x0e\n\x06serial\x18\x01 \x01(\x0c\x12\r\n\x05index\x18\x02 \x01(\x05\x12\x0f\n\x07product\x18\x0b \x01(\x0c')
+  syntax='proto2',
+  serialized_pb=_b('\n\x1aTestLabConfigMessage.proto\x12\x10\x61ndroid.test.lab\"q\n\x10LabConfigMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12\r\n\x05owner\x18\x02 \x01(\x0c\x12\r\n\x05\x61\x64min\x18\x03 \x03(\x0c\x12\x31\n\x04host\x18\x0b \x03(\x0b\x32#.android.test.lab.HostConfigMessage\"\xa6\x01\n\x11HostConfigMessage\x12\x10\n\x08hostname\x18\x01 \x01(\x0c\x12\n\n\x02ip\x18\x02 \x01(\x0c\x12\x0e\n\x06script\x18\x03 \x01(\x0c\x12\x14\n\x0csetup_script\x18\x04 \x01(\x0c\x12\x16\n\x0ehost_equipment\x18\x05 \x03(\x0c\x12\x35\n\x06\x64\x65vice\x18\x0b \x03(\x0b\x32%.android.test.lab.DeviceConfigMessage\"_\n\x13\x44\x65viceConfigMessage\x12\x0e\n\x06serial\x18\x01 \x01(\x0c\x12\r\n\x05index\x18\x02 \x01(\x05\x12\x0f\n\x07product\x18\x0b \x01(\x0c\x12\x18\n\x10\x64\x65vice_equipment\x18\x15 \x03(\x0c')
+)
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 
 
@@ -28,19 +36,26 @@
     _descriptor.FieldDescriptor(
       name='name', full_name='android.test.lab.LabConfigMessage.name', index=0,
       number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='owner', full_name='android.test.lab.LabConfigMessage.owner', index=1,
       number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='host', full_name='android.test.lab.LabConfigMessage.host', index=2,
+      name='admin', full_name='android.test.lab.LabConfigMessage.admin', index=2,
+      number=3, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='host', full_name='android.test.lab.LabConfigMessage.host', index=3,
       number=11, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -54,9 +69,12 @@
   ],
   options=None,
   is_extendable=False,
+  syntax='proto2',
   extension_ranges=[],
+  oneofs=[
+  ],
   serialized_start=48,
-  serialized_end=146,
+  serialized_end=161,
 )
 
 
@@ -70,33 +88,40 @@
     _descriptor.FieldDescriptor(
       name='hostname', full_name='android.test.lab.HostConfigMessage.hostname', index=0,
       number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='ip', full_name='android.test.lab.HostConfigMessage.ip', index=1,
       number=2, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='script', full_name='android.test.lab.HostConfigMessage.script', index=2,
       number=3, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
       name='setup_script', full_name='android.test.lab.HostConfigMessage.setup_script', index=3,
       number=4, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='device', full_name='android.test.lab.HostConfigMessage.device', index=4,
+      name='host_equipment', full_name='android.test.lab.HostConfigMessage.host_equipment', index=4,
+      number=5, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='device', full_name='android.test.lab.HostConfigMessage.device', index=5,
       number=11, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -110,9 +135,12 @@
   ],
   options=None,
   is_extendable=False,
+  syntax='proto2',
   extension_ranges=[],
-  serialized_start=149,
-  serialized_end=291,
+  oneofs=[
+  ],
+  serialized_start=164,
+  serialized_end=330,
 )
 
 
@@ -126,7 +154,7 @@
     _descriptor.FieldDescriptor(
       name='serial', full_name='android.test.lab.DeviceConfigMessage.serial', index=0,
       number=1, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
@@ -140,7 +168,14 @@
     _descriptor.FieldDescriptor(
       name='product', full_name='android.test.lab.DeviceConfigMessage.product', index=2,
       number=11, type=12, cpp_type=9, label=1,
-      has_default_value=False, default_value="",
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='device_equipment', full_name='android.test.lab.DeviceConfigMessage.device_equipment', index=3,
+      number=21, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
@@ -152,9 +187,12 @@
   ],
   options=None,
   is_extendable=False,
+  syntax='proto2',
   extension_ranges=[],
-  serialized_start=293,
-  serialized_end=362,
+  oneofs=[
+  ],
+  serialized_start=332,
+  serialized_end=427,
 )
 
 _LABCONFIGMESSAGE.fields_by_name['host'].message_type = _HOSTCONFIGMESSAGE
@@ -163,23 +201,26 @@
 DESCRIPTOR.message_types_by_name['HostConfigMessage'] = _HOSTCONFIGMESSAGE
 DESCRIPTOR.message_types_by_name['DeviceConfigMessage'] = _DEVICECONFIGMESSAGE
 
-class LabConfigMessage(_message.Message):
-  __metaclass__ = _reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _LABCONFIGMESSAGE
-
+LabConfigMessage = _reflection.GeneratedProtocolMessageType('LabConfigMessage', (_message.Message,), dict(
+  DESCRIPTOR = _LABCONFIGMESSAGE,
+  __module__ = 'TestLabConfigMessage_pb2'
   # @@protoc_insertion_point(class_scope:android.test.lab.LabConfigMessage)
+  ))
+_sym_db.RegisterMessage(LabConfigMessage)
 
-class HostConfigMessage(_message.Message):
-  __metaclass__ = _reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _HOSTCONFIGMESSAGE
-
+HostConfigMessage = _reflection.GeneratedProtocolMessageType('HostConfigMessage', (_message.Message,), dict(
+  DESCRIPTOR = _HOSTCONFIGMESSAGE,
+  __module__ = 'TestLabConfigMessage_pb2'
   # @@protoc_insertion_point(class_scope:android.test.lab.HostConfigMessage)
+  ))
+_sym_db.RegisterMessage(HostConfigMessage)
 
-class DeviceConfigMessage(_message.Message):
-  __metaclass__ = _reflection.GeneratedProtocolMessageType
-  DESCRIPTOR = _DEVICECONFIGMESSAGE
-
+DeviceConfigMessage = _reflection.GeneratedProtocolMessageType('DeviceConfigMessage', (_message.Message,), dict(
+  DESCRIPTOR = _DEVICECONFIGMESSAGE,
+  __module__ = 'TestLabConfigMessage_pb2'
   # @@protoc_insertion_point(class_scope:android.test.lab.DeviceConfigMessage)
+  ))
+_sym_db.RegisterMessage(DeviceConfigMessage)
 
 
 # @@protoc_insertion_point(module_scope)
diff --git a/proto/TestScheduleConfigMessage.proto b/proto/TestScheduleConfigMessage.proto
index 218f3ff..c2f7991 100644
--- a/proto/TestScheduleConfigMessage.proto
+++ b/proto/TestScheduleConfigMessage.proto
@@ -44,6 +44,15 @@
   // build target name (e.g., aosp_taimen-userdebug)
   optional bytes name = 1;
 
+  // whether to use signed build.
+  optional bool require_signed_device_build = 2;
+
+  // whether the build target has bootloader.img
+  optional bool has_bootloader_img = 3 [default = true];
+
+  // whether the build target has radio.img
+  optional bool has_radio_img = 4 [default = true];
+
   repeated TestScheduleConfigMessage test_schedule = 11;
 }
 
@@ -63,6 +72,12 @@
   // number of shards (-1 for auto selection?)
   optional int32 shards = 5;
 
+  // required host-side equipment.
+  repeated bytes required_host_equipment = 6;
+
+  // required device-side equipment such as a SIM card.
+  repeated bytes required_device_equipment = 7;
+
   optional bytes param = 11;
 
   // GSI storage type (e.g., PAB or GCS)
@@ -77,6 +92,10 @@
   // if GSI (General System Image) is used, GSI PAB account ID.
   optional bytes gsi_pab_account_id = 23;
 
+  // if GSI (General System Image) is used, the version of a vendor.img
+  // to use GSI with (e.g., 8.1.0).
+  optional bytes gsi_vendor_version = 25;
+
   // Test package's storage type (e.g., PAB or GCS)
   optional BuildStorageType test_storage_type = 34 [default = BUILD_STORAGE_TYPE_PAB];
 
@@ -89,6 +108,24 @@
   // PAB account ID for test package.
   optional bytes test_pab_account_id = 33;
 
-  // number of retry count
+  // number of retry count.
   optional int32 retry_count = 41;
+
+  // whether to disable this schedule.
+  optional bool disable = 51 [default = false];
+
+  // Base GCS url for the repack command.
+  optional bytes image_package_repo_base = 61;
+
+  // the GCS url where test results are uploaded
+  repeated bytes report_bucket = 71;
+
+  // the ID of the spreadsheet where test results are uploaded
+  repeated bytes report_spreadsheet_id = 72;
+
+  // the GCS url where the latest test result is uploaded
+  repeated bytes report_persistent_url = 73;
+
+  // the GCS url where the reference result is.
+  repeated bytes report_reference_url = 74;
 }
diff --git a/proto/TestScheduleConfigMessage_pb2.py b/proto/TestScheduleConfigMessage_pb2.py
index b1c5012..46dafac 100644
--- a/proto/TestScheduleConfigMessage_pb2.py
+++ b/proto/TestScheduleConfigMessage_pb2.py
@@ -1,5 +1,5 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: TestScheduleConfigMessage.proto
+# source: vti/test_serving/proto/TestScheduleConfigMessage.proto
 
 import sys
 _b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
@@ -17,10 +17,10 @@
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
-  name='TestScheduleConfigMessage.proto',
+  name='vti/test_serving/proto/TestScheduleConfigMessage.proto',
   package='android.test.lab',
   syntax='proto2',
-  serialized_pb=_b('\n\x1fTestScheduleConfigMessage.proto\x12\x10\x61ndroid.test.lab\"\xe4\x01\n\x15ScheduleConfigMessage\x12\x17\n\x0fmanifest_branch\x18\x01 \x01(\x0c\x12\x16\n\x0epab_account_id\x18\x02 \x01(\x0c\x12V\n\x12\x62uild_storage_type\x18\x03 \x01(\x0e\x32\".android.test.lab.BuildStorageType:\x16\x42UILD_STORAGE_TYPE_PAB\x12\x42\n\x0c\x62uild_target\x18\x0b \x03(\x0b\x32,.android.test.lab.BuildScheduleConfigMessage\"\x93\x01\n\x1a\x42uildScheduleConfigMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12#\n\x1brequire_signed_device_build\x18\x02 \x01(\x08\x12\x42\n\rtest_schedule\x18\x0b \x03(\x0b\x32+.android.test.lab.TestScheduleConfigMessage\"\xf0\x03\n\x19TestScheduleConfigMessage\x12\x11\n\ttest_name\x18\x01 \x01(\x0c\x12\x0e\n\x06period\x18\x02 \x01(\x05\x12\x10\n\x08priority\x18\x03 \x01(\x0c\x12\x0e\n\x06\x64\x65vice\x18\x04 \x03(\x0c\x12\x0e\n\x06shards\x18\x05 \x01(\x05\x12\r\n\x05param\x18\x0b \x01(\x0c\x12T\n\x10gsi_storage_type\x18\x18 \x01(\x0e\x32\".android.test.lab.BuildStorageType:\x16\x42UILD_STORAGE_TYPE_PAB\x12\x12\n\ngsi_branch\x18\x15 \x01(\x0c\x12\x18\n\x10gsi_build_target\x18\x16 \x01(\x0c\x12\x1a\n\x12gsi_pab_account_id\x18\x17 \x01(\x0c\x12U\n\x11test_storage_type\x18\" \x01(\x0e\x32\".android.test.lab.BuildStorageType:\x16\x42UILD_STORAGE_TYPE_PAB\x12\x13\n\x0btest_branch\x18\x1f \x01(\x0c\x12\x19\n\x11test_build_target\x18  \x01(\x0c\x12\x1b\n\x13test_pab_account_id\x18! \x01(\x0c\x12\x13\n\x0bretry_count\x18) \x01(\x05\x12\x16\n\x07\x64isable\x18\x33 \x01(\x08:\x05\x66\x61lse*j\n\x10\x42uildStorageType\x12\x1e\n\x1aUNKNOWN_BUILD_STORAGE_TYPE\x10\x00\x12\x1a\n\x16\x42UILD_STORAGE_TYPE_PAB\x10\x01\x12\x1a\n\x16\x42UILD_STORAGE_TYPE_GCS\x10\x02')
+  serialized_pb=_b('\n6vti/test_serving/proto/TestScheduleConfigMessage.proto\x12\x10\x61ndroid.test.lab\"\xe4\x01\n\x15ScheduleConfigMessage\x12\x17\n\x0fmanifest_branch\x18\x01 \x01(\x0c\x12\x16\n\x0epab_account_id\x18\x02 \x01(\x0c\x12V\n\x12\x62uild_storage_type\x18\x03 \x01(\x0e\x32\".android.test.lab.BuildStorageType:\x16\x42UILD_STORAGE_TYPE_PAB\x12\x42\n\x0c\x62uild_target\x18\x0b \x03(\x0b\x32,.android.test.lab.BuildScheduleConfigMessage\"\xd2\x01\n\x1a\x42uildScheduleConfigMessage\x12\x0c\n\x04name\x18\x01 \x01(\x0c\x12#\n\x1brequire_signed_device_build\x18\x02 \x01(\x08\x12 \n\x12has_bootloader_img\x18\x03 \x01(\x08:\x04true\x12\x1b\n\rhas_radio_img\x18\x04 \x01(\x08:\x04true\x12\x42\n\rtest_schedule\x18\x0b \x03(\x0b\x32+.android.test.lab.TestScheduleConfigMessage\"\xe4\x05\n\x19TestScheduleConfigMessage\x12\x11\n\ttest_name\x18\x01 \x01(\x0c\x12\x0e\n\x06period\x18\x02 \x01(\x05\x12\x10\n\x08priority\x18\x03 \x01(\x0c\x12\x0e\n\x06\x64\x65vice\x18\x04 \x03(\x0c\x12\x0e\n\x06shards\x18\x05 \x01(\x05\x12\x1f\n\x17required_host_equipment\x18\x06 \x03(\x0c\x12!\n\x19required_device_equipment\x18\x07 \x03(\x0c\x12\r\n\x05param\x18\x0b \x01(\x0c\x12T\n\x10gsi_storage_type\x18\x18 \x01(\x0e\x32\".android.test.lab.BuildStorageType:\x16\x42UILD_STORAGE_TYPE_PAB\x12\x12\n\ngsi_branch\x18\x15 \x01(\x0c\x12\x18\n\x10gsi_build_target\x18\x16 \x01(\x0c\x12\x1a\n\x12gsi_pab_account_id\x18\x17 \x01(\x0c\x12\x1a\n\x12gsi_vendor_version\x18\x19 \x01(\x0c\x12U\n\x11test_storage_type\x18\" \x01(\x0e\x32\".android.test.lab.BuildStorageType:\x16\x42UILD_STORAGE_TYPE_PAB\x12\x13\n\x0btest_branch\x18\x1f \x01(\x0c\x12\x19\n\x11test_build_target\x18  \x01(\x0c\x12\x1b\n\x13test_pab_account_id\x18! \x01(\x0c\x12\x13\n\x0bretry_count\x18) \x01(\x05\x12\x16\n\x07\x64isable\x18\x33 \x01(\x08:\x05\x66\x61lse\x12\x1f\n\x17image_package_repo_base\x18= \x01(\x0c\x12\x15\n\rreport_bucket\x18G \x03(\x0c\x12\x1d\n\x15report_spreadsheet_id\x18H \x03(\x0c\x12\x1d\n\x15report_persistent_url\x18I \x03(\x0c\x12\x1c\n\x14report_reference_url\x18J \x03(\x0c*j\n\x10\x42uildStorageType\x12\x1e\n\x1aUNKNOWN_BUILD_STORAGE_TYPE\x10\x00\x12\x1a\n\x16\x42UILD_STORAGE_TYPE_PAB\x10\x01\x12\x1a\n\x16\x42UILD_STORAGE_TYPE_GCS\x10\x02')
 )
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -45,8 +45,8 @@
   ],
   containing_type=None,
   options=None,
-  serialized_start=933,
-  serialized_end=1039,
+  serialized_start=1263,
+  serialized_end=1369,
 )
 _sym_db.RegisterEnumDescriptor(_BUILDSTORAGETYPE)
 
@@ -104,8 +104,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=54,
-  serialized_end=282,
+  serialized_start=77,
+  serialized_end=305,
 )
 
 
@@ -124,7 +124,28 @@
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='test_schedule', full_name='android.test.lab.BuildScheduleConfigMessage.test_schedule', index=1,
+      name='require_signed_device_build', full_name='android.test.lab.BuildScheduleConfigMessage.require_signed_device_build', index=1,
+      number=2, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='has_bootloader_img', full_name='android.test.lab.BuildScheduleConfigMessage.has_bootloader_img', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=True,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='has_radio_img', full_name='android.test.lab.BuildScheduleConfigMessage.has_radio_img', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=True,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='test_schedule', full_name='android.test.lab.BuildScheduleConfigMessage.test_schedule', index=4,
       number=11, type=11, cpp_type=10, label=3,
       has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
@@ -142,8 +163,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=284,
-  serialized_end=394,
+  serialized_start=308,
+  serialized_end=518,
 )
 
 
@@ -190,82 +211,138 @@
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='param', full_name='android.test.lab.TestScheduleConfigMessage.param', index=5,
+      name='required_host_equipment', full_name='android.test.lab.TestScheduleConfigMessage.required_host_equipment', index=5,
+      number=6, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='required_device_equipment', full_name='android.test.lab.TestScheduleConfigMessage.required_device_equipment', index=6,
+      number=7, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='param', full_name='android.test.lab.TestScheduleConfigMessage.param', index=7,
       number=11, type=12, cpp_type=9, label=1,
       has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='gsi_storage_type', full_name='android.test.lab.TestScheduleConfigMessage.gsi_storage_type', index=6,
+      name='gsi_storage_type', full_name='android.test.lab.TestScheduleConfigMessage.gsi_storage_type', index=8,
       number=24, type=14, cpp_type=8, label=1,
       has_default_value=True, default_value=1,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='gsi_branch', full_name='android.test.lab.TestScheduleConfigMessage.gsi_branch', index=7,
+      name='gsi_branch', full_name='android.test.lab.TestScheduleConfigMessage.gsi_branch', index=9,
       number=21, type=12, cpp_type=9, label=1,
       has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='gsi_build_target', full_name='android.test.lab.TestScheduleConfigMessage.gsi_build_target', index=8,
+      name='gsi_build_target', full_name='android.test.lab.TestScheduleConfigMessage.gsi_build_target', index=10,
       number=22, type=12, cpp_type=9, label=1,
       has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='gsi_pab_account_id', full_name='android.test.lab.TestScheduleConfigMessage.gsi_pab_account_id', index=9,
+      name='gsi_pab_account_id', full_name='android.test.lab.TestScheduleConfigMessage.gsi_pab_account_id', index=11,
       number=23, type=12, cpp_type=9, label=1,
       has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='test_storage_type', full_name='android.test.lab.TestScheduleConfigMessage.test_storage_type', index=10,
+      name='gsi_vendor_version', full_name='android.test.lab.TestScheduleConfigMessage.gsi_vendor_version', index=12,
+      number=25, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='test_storage_type', full_name='android.test.lab.TestScheduleConfigMessage.test_storage_type', index=13,
       number=34, type=14, cpp_type=8, label=1,
       has_default_value=True, default_value=1,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='test_branch', full_name='android.test.lab.TestScheduleConfigMessage.test_branch', index=11,
+      name='test_branch', full_name='android.test.lab.TestScheduleConfigMessage.test_branch', index=14,
       number=31, type=12, cpp_type=9, label=1,
       has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='test_build_target', full_name='android.test.lab.TestScheduleConfigMessage.test_build_target', index=12,
+      name='test_build_target', full_name='android.test.lab.TestScheduleConfigMessage.test_build_target', index=15,
       number=32, type=12, cpp_type=9, label=1,
       has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='test_pab_account_id', full_name='android.test.lab.TestScheduleConfigMessage.test_pab_account_id', index=13,
+      name='test_pab_account_id', full_name='android.test.lab.TestScheduleConfigMessage.test_pab_account_id', index=16,
       number=33, type=12, cpp_type=9, label=1,
       has_default_value=False, default_value=_b(""),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='retry_count', full_name='android.test.lab.TestScheduleConfigMessage.retry_count', index=14,
+      name='retry_count', full_name='android.test.lab.TestScheduleConfigMessage.retry_count', index=17,
       number=41, type=5, cpp_type=1, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
     _descriptor.FieldDescriptor(
-      name='disable', full_name='android.test.lab.TestScheduleConfigMessage.disable', index=15,
+      name='disable', full_name='android.test.lab.TestScheduleConfigMessage.disable', index=18,
       number=51, type=8, cpp_type=7, label=1,
       has_default_value=True, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       options=None),
+    _descriptor.FieldDescriptor(
+      name='image_package_repo_base', full_name='android.test.lab.TestScheduleConfigMessage.image_package_repo_base', index=19,
+      number=61, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='report_bucket', full_name='android.test.lab.TestScheduleConfigMessage.report_bucket', index=20,
+      number=71, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='report_spreadsheet_id', full_name='android.test.lab.TestScheduleConfigMessage.report_spreadsheet_id', index=21,
+      number=72, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='report_persistent_url', full_name='android.test.lab.TestScheduleConfigMessage.report_persistent_url', index=22,
+      number=73, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='report_reference_url', full_name='android.test.lab.TestScheduleConfigMessage.report_reference_url', index=23,
+      number=74, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
   ],
   extensions=[
   ],
@@ -278,8 +355,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=435,
-  serialized_end=931,
+  serialized_start=521,
+  serialized_end=1261,
 )
 
 _SCHEDULECONFIGMESSAGE.fields_by_name['build_storage_type'].enum_type = _BUILDSTORAGETYPE
@@ -294,21 +371,21 @@
 
 ScheduleConfigMessage = _reflection.GeneratedProtocolMessageType('ScheduleConfigMessage', (_message.Message,), dict(
   DESCRIPTOR = _SCHEDULECONFIGMESSAGE,
-  __module__ = 'TestScheduleConfigMessage_pb2'
+  __module__ = 'vti.test_serving.proto.TestScheduleConfigMessage_pb2'
   # @@protoc_insertion_point(class_scope:android.test.lab.ScheduleConfigMessage)
   ))
 _sym_db.RegisterMessage(ScheduleConfigMessage)
 
 BuildScheduleConfigMessage = _reflection.GeneratedProtocolMessageType('BuildScheduleConfigMessage', (_message.Message,), dict(
   DESCRIPTOR = _BUILDSCHEDULECONFIGMESSAGE,
-  __module__ = 'TestScheduleConfigMessage_pb2'
+  __module__ = 'vti.test_serving.proto.TestScheduleConfigMessage_pb2'
   # @@protoc_insertion_point(class_scope:android.test.lab.BuildScheduleConfigMessage)
   ))
 _sym_db.RegisterMessage(BuildScheduleConfigMessage)
 
 TestScheduleConfigMessage = _reflection.GeneratedProtocolMessageType('TestScheduleConfigMessage', (_message.Message,), dict(
   DESCRIPTOR = _TESTSCHEDULECONFIGMESSAGE,
-  __module__ = 'TestScheduleConfigMessage_pb2'
+  __module__ = 'vti.test_serving.proto.TestScheduleConfigMessage_pb2'
   # @@protoc_insertion_point(class_scope:android.test.lab.TestScheduleConfigMessage)
   ))
 _sym_db.RegisterMessage(TestScheduleConfigMessage)
diff --git a/script/build-python.sh b/script/build-python.sh
index e9d7e1d..f8d2fb0 100755
--- a/script/build-python.sh
+++ b/script/build-python.sh
@@ -15,11 +15,11 @@
 # limitations under the License.
 
 # Modifies any import statements (to remove subdir path)
-pushd ${ANDROID_BUILD_TOP}/test/vti/test_serving
+pushd ${ANDROID_BUILD_TOP}/test
 
-protoc -I=proto --python_out=proto proto/TestLabConfigMessage.proto
-protoc -I=proto --python_out=proto proto/TestScheduleConfigMessage.proto
-protoc -I=proto --python_out=proto proto/GreenBuildScheduleConfigMessage.proto
+protoc -I=. --python_out=. ./vti/test_serving/proto/TestLabConfigMessage.proto
+protoc -I=. --python_out=. ./vti/test_serving/proto/TestScheduleConfigMessage.proto
+protoc -I=. --python_out=. ./vti/test_serving/proto/GreenBuildScheduleConfigMessage.proto
 
 # Compiles all the python source codes.
 python -m compileall .