Merge "Add compiled internal_config.proto and user_config.proto and a script to generate them."
diff --git a/internal/proto/internal_config_pb2.py b/internal/proto/internal_config_pb2.py
new file mode 100644
index 0000000..1fcb955
--- /dev/null
+++ b/internal/proto/internal_config_pb2.py
@@ -0,0 +1,466 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: internal_config.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='internal_config.proto',
+  package='acloud.internal.proto',
+  syntax='proto2',
+  serialized_pb=_b('\n\x15internal_config.proto\x12\x15\x61\x63loud.internal.proto\"\xef\x01\n\x11\x44\x65\x66\x61ultUserConfig\x12\x14\n\x0cmachine_type\x18\x01 \x01(\t\x12\x0f\n\x07network\x18\x02 \x01(\t\x12\x1f\n\x17\x65xtra_data_disk_size_gb\x18\x03 \x01(\x05\x12Y\n\x11metadata_variable\x18\x04 \x03(\x0b\x32>.acloud.internal.proto.DefaultUserConfig.MetadataVariableEntry\x1a\x37\n\x15MetadataVariableEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xee\x07\n\x0eInternalConfig\x12\x41\n\x0f\x64\x65\x66\x61ult_usr_cfg\x18\x01 \x01(\x0b\x32(.acloud.internal.proto.DefaultUserConfig\x12]\n\x15\x64\x65vice_resolution_map\x18\x02 \x03(\x0b\x32>.acloud.internal.proto.InternalConfig.DeviceResolutionMapEntry\x12n\n\x1e\x64\x65vice_default_orientation_map\x18\x03 \x03(\x0b\x32\x46.acloud.internal.proto.InternalConfig.DeviceDefaultOrientationMapEntry\x12\x18\n\x10min_machine_size\x18\x04 \x01(\t\x12\x17\n\x0f\x64isk_image_name\x18\x05 \x01(\t\x12\x1c\n\x14\x64isk_image_mime_type\x18\x06 \x01(\t\x12\x1c\n\x14\x64isk_image_extension\x18\x07 \x01(\t\x12\x1b\n\x13\x64isk_raw_image_name\x18\x08 \x01(\t\x12 \n\x18\x64isk_raw_image_extension\x18\t \x01(\t\x12&\n\x1e\x64\x65\x66\x61ult_extra_data_disk_device\x18\n \x01(\t\x12]\n\x15precreated_data_image\x18\x0b \x03(\x0b\x32>.acloud.internal.proto.InternalConfig.PrecreatedDataImageEntry\x12j\n\x1dvalid_branch_and_min_build_id\x18\x0c \x03(\x0b\x32\x43.acloud.internal.proto.InternalConfig.ValidBranchAndMinBuildIdEntry\x12\x18\n\x10\x63reds_cache_file\x18\r \x01(\t\x12\x12\n\nuser_agent\x18\x0e \x01(\t\x1a:\n\x18\x44\x65viceResolutionMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x42\n DeviceDefaultOrientationMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a:\n\x18PrecreatedDataImageEntry\x12\x0b\n\x03key\x18\x01 \x01(\x05\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a?\n\x1dValidBranchAndMinBuildIdEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01')
+)
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+
+
+_DEFAULTUSERCONFIG_METADATAVARIABLEENTRY = _descriptor.Descriptor(
+  name='MetadataVariableEntry',
+  full_name='acloud.internal.proto.DefaultUserConfig.MetadataVariableEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='acloud.internal.proto.DefaultUserConfig.MetadataVariableEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='acloud.internal.proto.DefaultUserConfig.MetadataVariableEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=233,
+  serialized_end=288,
+)
+
+_DEFAULTUSERCONFIG = _descriptor.Descriptor(
+  name='DefaultUserConfig',
+  full_name='acloud.internal.proto.DefaultUserConfig',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='machine_type', full_name='acloud.internal.proto.DefaultUserConfig.machine_type', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='network', full_name='acloud.internal.proto.DefaultUserConfig.network', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='extra_data_disk_size_gb', full_name='acloud.internal.proto.DefaultUserConfig.extra_data_disk_size_gb', index=2,
+      number=3, 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='metadata_variable', full_name='acloud.internal.proto.DefaultUserConfig.metadata_variable', index=3,
+      number=4, type=11, cpp_type=10, 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=[
+  ],
+  nested_types=[_DEFAULTUSERCONFIG_METADATAVARIABLEENTRY, ],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=49,
+  serialized_end=288,
+)
+
+
+_INTERNALCONFIG_DEVICERESOLUTIONMAPENTRY = _descriptor.Descriptor(
+  name='DeviceResolutionMapEntry',
+  full_name='acloud.internal.proto.InternalConfig.DeviceResolutionMapEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='acloud.internal.proto.InternalConfig.DeviceResolutionMapEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='acloud.internal.proto.InternalConfig.DeviceResolutionMapEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1046,
+  serialized_end=1104,
+)
+
+_INTERNALCONFIG_DEVICEDEFAULTORIENTATIONMAPENTRY = _descriptor.Descriptor(
+  name='DeviceDefaultOrientationMapEntry',
+  full_name='acloud.internal.proto.InternalConfig.DeviceDefaultOrientationMapEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='acloud.internal.proto.InternalConfig.DeviceDefaultOrientationMapEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='acloud.internal.proto.InternalConfig.DeviceDefaultOrientationMapEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1106,
+  serialized_end=1172,
+)
+
+_INTERNALCONFIG_PRECREATEDDATAIMAGEENTRY = _descriptor.Descriptor(
+  name='PrecreatedDataImageEntry',
+  full_name='acloud.internal.proto.InternalConfig.PrecreatedDataImageEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='acloud.internal.proto.InternalConfig.PrecreatedDataImageEntry.key', index=0,
+      number=1, 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='value', full_name='acloud.internal.proto.InternalConfig.PrecreatedDataImageEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1174,
+  serialized_end=1232,
+)
+
+_INTERNALCONFIG_VALIDBRANCHANDMINBUILDIDENTRY = _descriptor.Descriptor(
+  name='ValidBranchAndMinBuildIdEntry',
+  full_name='acloud.internal.proto.InternalConfig.ValidBranchAndMinBuildIdEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='acloud.internal.proto.InternalConfig.ValidBranchAndMinBuildIdEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='acloud.internal.proto.InternalConfig.ValidBranchAndMinBuildIdEntry.value', index=1,
+      number=2, 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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1234,
+  serialized_end=1297,
+)
+
+_INTERNALCONFIG = _descriptor.Descriptor(
+  name='InternalConfig',
+  full_name='acloud.internal.proto.InternalConfig',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='default_usr_cfg', full_name='acloud.internal.proto.InternalConfig.default_usr_cfg', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='device_resolution_map', full_name='acloud.internal.proto.InternalConfig.device_resolution_map', index=1,
+      number=2, type=11, cpp_type=10, 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_default_orientation_map', full_name='acloud.internal.proto.InternalConfig.device_default_orientation_map', index=2,
+      number=3, type=11, cpp_type=10, 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='min_machine_size', full_name='acloud.internal.proto.InternalConfig.min_machine_size', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='disk_image_name', full_name='acloud.internal.proto.InternalConfig.disk_image_name', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='disk_image_mime_type', full_name='acloud.internal.proto.InternalConfig.disk_image_mime_type', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='disk_image_extension', full_name='acloud.internal.proto.InternalConfig.disk_image_extension', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='disk_raw_image_name', full_name='acloud.internal.proto.InternalConfig.disk_raw_image_name', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='disk_raw_image_extension', full_name='acloud.internal.proto.InternalConfig.disk_raw_image_extension', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='default_extra_data_disk_device', full_name='acloud.internal.proto.InternalConfig.default_extra_data_disk_device', index=9,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='precreated_data_image', full_name='acloud.internal.proto.InternalConfig.precreated_data_image', index=10,
+      number=11, type=11, cpp_type=10, 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='valid_branch_and_min_build_id', full_name='acloud.internal.proto.InternalConfig.valid_branch_and_min_build_id', index=11,
+      number=12, type=11, cpp_type=10, 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='creds_cache_file', full_name='acloud.internal.proto.InternalConfig.creds_cache_file', index=12,
+      number=13, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='user_agent', full_name='acloud.internal.proto.InternalConfig.user_agent', index=13,
+      number=14, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[_INTERNALCONFIG_DEVICERESOLUTIONMAPENTRY, _INTERNALCONFIG_DEVICEDEFAULTORIENTATIONMAPENTRY, _INTERNALCONFIG_PRECREATEDDATAIMAGEENTRY, _INTERNALCONFIG_VALIDBRANCHANDMINBUILDIDENTRY, ],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=291,
+  serialized_end=1297,
+)
+
+_DEFAULTUSERCONFIG_METADATAVARIABLEENTRY.containing_type = _DEFAULTUSERCONFIG
+_DEFAULTUSERCONFIG.fields_by_name['metadata_variable'].message_type = _DEFAULTUSERCONFIG_METADATAVARIABLEENTRY
+_INTERNALCONFIG_DEVICERESOLUTIONMAPENTRY.containing_type = _INTERNALCONFIG
+_INTERNALCONFIG_DEVICEDEFAULTORIENTATIONMAPENTRY.containing_type = _INTERNALCONFIG
+_INTERNALCONFIG_PRECREATEDDATAIMAGEENTRY.containing_type = _INTERNALCONFIG
+_INTERNALCONFIG_VALIDBRANCHANDMINBUILDIDENTRY.containing_type = _INTERNALCONFIG
+_INTERNALCONFIG.fields_by_name['default_usr_cfg'].message_type = _DEFAULTUSERCONFIG
+_INTERNALCONFIG.fields_by_name['device_resolution_map'].message_type = _INTERNALCONFIG_DEVICERESOLUTIONMAPENTRY
+_INTERNALCONFIG.fields_by_name['device_default_orientation_map'].message_type = _INTERNALCONFIG_DEVICEDEFAULTORIENTATIONMAPENTRY
+_INTERNALCONFIG.fields_by_name['precreated_data_image'].message_type = _INTERNALCONFIG_PRECREATEDDATAIMAGEENTRY
+_INTERNALCONFIG.fields_by_name['valid_branch_and_min_build_id'].message_type = _INTERNALCONFIG_VALIDBRANCHANDMINBUILDIDENTRY
+DESCRIPTOR.message_types_by_name['DefaultUserConfig'] = _DEFAULTUSERCONFIG
+DESCRIPTOR.message_types_by_name['InternalConfig'] = _INTERNALCONFIG
+
+DefaultUserConfig = _reflection.GeneratedProtocolMessageType('DefaultUserConfig', (_message.Message,), dict(
+
+  MetadataVariableEntry = _reflection.GeneratedProtocolMessageType('MetadataVariableEntry', (_message.Message,), dict(
+    DESCRIPTOR = _DEFAULTUSERCONFIG_METADATAVARIABLEENTRY,
+    __module__ = 'internal_config_pb2'
+    # @@protoc_insertion_point(class_scope:acloud.internal.proto.DefaultUserConfig.MetadataVariableEntry)
+    ))
+  ,
+  DESCRIPTOR = _DEFAULTUSERCONFIG,
+  __module__ = 'internal_config_pb2'
+  # @@protoc_insertion_point(class_scope:acloud.internal.proto.DefaultUserConfig)
+  ))
+_sym_db.RegisterMessage(DefaultUserConfig)
+_sym_db.RegisterMessage(DefaultUserConfig.MetadataVariableEntry)
+
+InternalConfig = _reflection.GeneratedProtocolMessageType('InternalConfig', (_message.Message,), dict(
+
+  DeviceResolutionMapEntry = _reflection.GeneratedProtocolMessageType('DeviceResolutionMapEntry', (_message.Message,), dict(
+    DESCRIPTOR = _INTERNALCONFIG_DEVICERESOLUTIONMAPENTRY,
+    __module__ = 'internal_config_pb2'
+    # @@protoc_insertion_point(class_scope:acloud.internal.proto.InternalConfig.DeviceResolutionMapEntry)
+    ))
+  ,
+
+  DeviceDefaultOrientationMapEntry = _reflection.GeneratedProtocolMessageType('DeviceDefaultOrientationMapEntry', (_message.Message,), dict(
+    DESCRIPTOR = _INTERNALCONFIG_DEVICEDEFAULTORIENTATIONMAPENTRY,
+    __module__ = 'internal_config_pb2'
+    # @@protoc_insertion_point(class_scope:acloud.internal.proto.InternalConfig.DeviceDefaultOrientationMapEntry)
+    ))
+  ,
+
+  PrecreatedDataImageEntry = _reflection.GeneratedProtocolMessageType('PrecreatedDataImageEntry', (_message.Message,), dict(
+    DESCRIPTOR = _INTERNALCONFIG_PRECREATEDDATAIMAGEENTRY,
+    __module__ = 'internal_config_pb2'
+    # @@protoc_insertion_point(class_scope:acloud.internal.proto.InternalConfig.PrecreatedDataImageEntry)
+    ))
+  ,
+
+  ValidBranchAndMinBuildIdEntry = _reflection.GeneratedProtocolMessageType('ValidBranchAndMinBuildIdEntry', (_message.Message,), dict(
+    DESCRIPTOR = _INTERNALCONFIG_VALIDBRANCHANDMINBUILDIDENTRY,
+    __module__ = 'internal_config_pb2'
+    # @@protoc_insertion_point(class_scope:acloud.internal.proto.InternalConfig.ValidBranchAndMinBuildIdEntry)
+    ))
+  ,
+  DESCRIPTOR = _INTERNALCONFIG,
+  __module__ = 'internal_config_pb2'
+  # @@protoc_insertion_point(class_scope:acloud.internal.proto.InternalConfig)
+  ))
+_sym_db.RegisterMessage(InternalConfig)
+_sym_db.RegisterMessage(InternalConfig.DeviceResolutionMapEntry)
+_sym_db.RegisterMessage(InternalConfig.DeviceDefaultOrientationMapEntry)
+_sym_db.RegisterMessage(InternalConfig.PrecreatedDataImageEntry)
+_sym_db.RegisterMessage(InternalConfig.ValidBranchAndMinBuildIdEntry)
+
+
+_DEFAULTUSERCONFIG_METADATAVARIABLEENTRY.has_options = True
+_DEFAULTUSERCONFIG_METADATAVARIABLEENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+_INTERNALCONFIG_DEVICERESOLUTIONMAPENTRY.has_options = True
+_INTERNALCONFIG_DEVICERESOLUTIONMAPENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+_INTERNALCONFIG_DEVICEDEFAULTORIENTATIONMAPENTRY.has_options = True
+_INTERNALCONFIG_DEVICEDEFAULTORIENTATIONMAPENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+_INTERNALCONFIG_PRECREATEDDATAIMAGEENTRY.has_options = True
+_INTERNALCONFIG_PRECREATEDDATAIMAGEENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+_INTERNALCONFIG_VALIDBRANCHANDMINBUILDIDENTRY.has_options = True
+_INTERNALCONFIG_VALIDBRANCHANDMINBUILDIDENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+# @@protoc_insertion_point(module_scope)
diff --git a/internal/proto/user_config_pb2.py b/internal/proto/user_config_pb2.py
new file mode 100644
index 0000000..1e69cf3
--- /dev/null
+++ b/internal/proto/user_config_pb2.py
@@ -0,0 +1,209 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: user_config.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='user_config.proto',
+  package='acloud.internal.proto',
+  syntax='proto2',
+  serialized_pb=_b('\n\x11user_config.proto\x12\x15\x61\x63loud.internal.proto\"\xd6\x03\n\nUserConfig\x12\x1c\n\x14service_account_name\x18\x01 \x01(\t\x12(\n service_account_private_key_path\x18\x02 \x01(\t\x12\x0f\n\x07project\x18\x03 \x01(\t\x12\x0c\n\x04zone\x18\x04 \x01(\t\x12\x14\n\x0cmachine_type\x18\x05 \x01(\t\x12\x0f\n\x07network\x18\x06 \x01(\t\x12\x1c\n\x14ssh_private_key_path\x18\x07 \x01(\t\x12\x1b\n\x13storage_bucket_name\x18\x08 \x01(\t\x12\x13\n\x0borientation\x18\t \x01(\t\x12\x12\n\nresolution\x18\n \x01(\t\x12\x1f\n\x17\x65xtra_data_disk_size_gb\x18\x0b \x01(\x05\x12R\n\x11metadata_variable\x18\x0c \x03(\x0b\x32\x37.acloud.internal.proto.UserConfig.MetadataVariableEntry\x12\x11\n\tclient_id\x18\r \x01(\t\x12\x15\n\rclient_secret\x18\x0e \x01(\t\x1a\x37\n\x15MetadataVariableEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01')
+)
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+
+
+_USERCONFIG_METADATAVARIABLEENTRY = _descriptor.Descriptor(
+  name='MetadataVariableEntry',
+  full_name='acloud.internal.proto.UserConfig.MetadataVariableEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='acloud.internal.proto.UserConfig.MetadataVariableEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='acloud.internal.proto.UserConfig.MetadataVariableEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=460,
+  serialized_end=515,
+)
+
+_USERCONFIG = _descriptor.Descriptor(
+  name='UserConfig',
+  full_name='acloud.internal.proto.UserConfig',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='service_account_name', full_name='acloud.internal.proto.UserConfig.service_account_name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='service_account_private_key_path', full_name='acloud.internal.proto.UserConfig.service_account_private_key_path', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='project', full_name='acloud.internal.proto.UserConfig.project', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='zone', full_name='acloud.internal.proto.UserConfig.zone', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='machine_type', full_name='acloud.internal.proto.UserConfig.machine_type', index=4,
+      number=5, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='network', full_name='acloud.internal.proto.UserConfig.network', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='ssh_private_key_path', full_name='acloud.internal.proto.UserConfig.ssh_private_key_path', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='storage_bucket_name', full_name='acloud.internal.proto.UserConfig.storage_bucket_name', index=7,
+      number=8, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='orientation', full_name='acloud.internal.proto.UserConfig.orientation', index=8,
+      number=9, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='resolution', full_name='acloud.internal.proto.UserConfig.resolution', index=9,
+      number=10, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='extra_data_disk_size_gb', full_name='acloud.internal.proto.UserConfig.extra_data_disk_size_gb', index=10,
+      number=11, 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='metadata_variable', full_name='acloud.internal.proto.UserConfig.metadata_variable', index=11,
+      number=12, type=11, cpp_type=10, 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='client_id', full_name='acloud.internal.proto.UserConfig.client_id', index=12,
+      number=13, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='client_secret', full_name='acloud.internal.proto.UserConfig.client_secret', index=13,
+      number=14, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[_USERCONFIG_METADATAVARIABLEENTRY, ],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=45,
+  serialized_end=515,
+)
+
+_USERCONFIG_METADATAVARIABLEENTRY.containing_type = _USERCONFIG
+_USERCONFIG.fields_by_name['metadata_variable'].message_type = _USERCONFIG_METADATAVARIABLEENTRY
+DESCRIPTOR.message_types_by_name['UserConfig'] = _USERCONFIG
+
+UserConfig = _reflection.GeneratedProtocolMessageType('UserConfig', (_message.Message,), dict(
+
+  MetadataVariableEntry = _reflection.GeneratedProtocolMessageType('MetadataVariableEntry', (_message.Message,), dict(
+    DESCRIPTOR = _USERCONFIG_METADATAVARIABLEENTRY,
+    __module__ = 'user_config_pb2'
+    # @@protoc_insertion_point(class_scope:acloud.internal.proto.UserConfig.MetadataVariableEntry)
+    ))
+  ,
+  DESCRIPTOR = _USERCONFIG,
+  __module__ = 'user_config_pb2'
+  # @@protoc_insertion_point(class_scope:acloud.internal.proto.UserConfig)
+  ))
+_sym_db.RegisterMessage(UserConfig)
+_sym_db.RegisterMessage(UserConfig.MetadataVariableEntry)
+
+
+_USERCONFIG_METADATAVARIABLEENTRY.has_options = True
+_USERCONFIG_METADATAVARIABLEENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+# @@protoc_insertion_point(module_scope)
diff --git a/regen_proto.sh b/regen_proto.sh
new file mode 100644
index 0000000..9a38eab
--- /dev/null
+++ b/regen_proto.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+## Compiles proto files to .py files
+## Note that proto version 3.0.0 is needed for successful compilation.
+protoc -I=internal/proto --python_out=internal/proto internal/proto/internal_config.proto
+protoc -I=internal/proto --python_out=internal/proto internal/proto/user_config.proto