Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 766eea72 authored by Kelvin Zhang's avatar Kelvin Zhang
Browse files

Handle caremap for partial OTAs

When generating a partial OTA, filter care_map.pb to include only the
partial partitions, then generate OTA.

Test: Generate a partial OTA, make sure care map is included.

Change-Id: I0eaa12772eb1d06a57451e64f70689d3183f0115
parent 041770b5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -162,6 +162,7 @@ python_defaults {
        "releasetools_common",
        "releasetools_verity_utils",
        "apex_manifest",
        "care_map_proto_py",
    ],
    required: [
        "brillo_update_payload",
+132 −0
Original line number Diff line number Diff line
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: bootable/recovery/update_verifier/care_map.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
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor.FileDescriptor(
  name='bootable/recovery/update_verifier/care_map.proto',
  package='recovery_update_verifier',
  syntax='proto3',
  serialized_options=_b('H\003'),
  serialized_pb=_b('\n0bootable/recovery/update_verifier/care_map.proto\x12\x18recovery_update_verifier\"\x9e\x01\n\x07\x43\x61reMap\x12\x43\n\npartitions\x18\x01 \x03(\x0b\x32/.recovery_update_verifier.CareMap.PartitionInfo\x1aN\n\rPartitionInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06ranges\x18\x02 \x01(\t\x12\n\n\x02id\x18\x03 \x01(\t\x12\x13\n\x0b\x66ingerprint\x18\x04 \x01(\tB\x02H\x03\x62\x06proto3')
)




_CAREMAP_PARTITIONINFO = _descriptor.Descriptor(
  name='PartitionInfo',
  full_name='recovery_update_verifier.CareMap.PartitionInfo',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='name', full_name='recovery_update_verifier.CareMap.PartitionInfo.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,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='ranges', full_name='recovery_update_verifier.CareMap.PartitionInfo.ranges', 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,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='id', full_name='recovery_update_verifier.CareMap.PartitionInfo.id', 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,
      serialized_options=None, file=DESCRIPTOR),
    _descriptor.FieldDescriptor(
      name='fingerprint', full_name='recovery_update_verifier.CareMap.PartitionInfo.fingerprint', 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,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=159,
  serialized_end=237,
)

_CAREMAP = _descriptor.Descriptor(
  name='CareMap',
  full_name='recovery_update_verifier.CareMap',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='partitions', full_name='recovery_update_verifier.CareMap.partitions', index=0,
      number=1, 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,
      serialized_options=None, file=DESCRIPTOR),
  ],
  extensions=[
  ],
  nested_types=[_CAREMAP_PARTITIONINFO, ],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=79,
  serialized_end=237,
)

_CAREMAP_PARTITIONINFO.containing_type = _CAREMAP
_CAREMAP.fields_by_name['partitions'].message_type = _CAREMAP_PARTITIONINFO
DESCRIPTOR.message_types_by_name['CareMap'] = _CAREMAP
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

CareMap = _reflection.GeneratedProtocolMessageType('CareMap', (_message.Message,), {

  'PartitionInfo' : _reflection.GeneratedProtocolMessageType('PartitionInfo', (_message.Message,), {
    'DESCRIPTOR' : _CAREMAP_PARTITIONINFO,
    '__module__' : 'bootable.recovery.update_verifier.care_map_pb2'
    # @@protoc_insertion_point(class_scope:recovery_update_verifier.CareMap.PartitionInfo)
    })
  ,
  'DESCRIPTOR' : _CAREMAP,
  '__module__' : 'bootable.recovery.update_verifier.care_map_pb2'
  # @@protoc_insertion_point(class_scope:recovery_update_verifier.CareMap)
  })
_sym_db.RegisterMessage(CareMap)
_sym_db.RegisterMessage(CareMap.PartitionInfo)


DESCRIPTOR._options = None
# @@protoc_insertion_point(module_scope)
+3 −0
Original line number Diff line number Diff line
@@ -276,6 +276,9 @@ def Run(args, verbose=None, **kwargs):
    args = args[:]
    args[0] = FindHostToolPath(args[0])

  if verbose is None:
    verbose = OPTIONS.verbose

  # Don't log any if caller explicitly says so.
  if verbose:
    logger.info("  Running: \"%s\"", " ".join(args))
+14 −1
Original line number Diff line number Diff line
@@ -237,6 +237,7 @@ import subprocess
import sys
import zipfile

import care_map_pb2
import common
import ota_utils
from ota_utils import (UNZIP_PATTERN, FinalizeMetadata, GetPackageMetadata,
@@ -832,6 +833,17 @@ def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions):
  with zipfile.ZipFile(input_file, allowZip64=True) as input_zip:
    common.ZipWriteStr(partial_target_zip, 'META/ab_partitions.txt',
                       '\n'.join(ab_partitions))
    CARE_MAP_ENTRY = "META/care_map.pb"
    if CARE_MAP_ENTRY in input_zip.namelist():
      caremap = care_map_pb2.CareMap()
      caremap.ParseFromString(input_zip.read(CARE_MAP_ENTRY))
      filtered = [
          part for part in caremap.partitions if part.name in ab_partitions]
      del caremap.partitions[:]
      caremap.partitions.extend(filtered)
      common.ZipWriteStr(partial_target_zip, CARE_MAP_ENTRY,
                         caremap.SerializeToString())

    for info_file in ['META/misc_info.txt', DYNAMIC_PARTITION_INFO]:
      if info_file not in input_zip.namelist():
        logger.warning('Cannot find %s in input zipfile', info_file)
@@ -841,7 +853,8 @@ def GetTargetFilesZipForPartialUpdates(input_file, ab_partitions):
          content, lambda p: p in ab_partitions)
      common.ZipWriteStr(partial_target_zip, info_file, modified_info)

    # TODO(xunchang) handle 'META/care_map.pb', 'META/postinstall_config.txt'
    # TODO(xunchang) handle META/postinstall_config.txt'

  common.ZipClose(partial_target_zip)

  return partial_target_file