summaryrefslogtreecommitdiff
path: root/scripts/update_payload/checker.py
diff options
context:
space:
mode:
authorAllie Wood <alliewood@chromium.org>2015-02-26 14:28:19 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-02-27 07:08:02 +0000
commit7cf9f13f2715d0a033c6300a244b40302d8eb7b7 (patch)
treedbeb852fd4e2b49de94a039e9a0245daa506712c /scripts/update_payload/checker.py
parentf5c4f3e2a6e7c93e5b4c09272091f23a935fab86 (diff)
update_payload: Move minor version checks to CheckOperation.
Various small fixes. Move checks for operation and minor version compatibility to CheckOperation. BUG=none TEST=`./checker_unittest.py` and running paycheck on payloads. Change-Id: I6abd0ec200c1d4d885b09dfb84ee7e6cfad4172c Reviewed-on: https://chromium-review.googlesource.com/254345 Reviewed-by: Allie Wood <alliewood@chromium.org> Commit-Queue: Allie Wood <alliewood@chromium.org> Trybot-Ready: Allie Wood <alliewood@chromium.org> Tested-by: Allie Wood <alliewood@chromium.org>
Diffstat (limited to 'scripts/update_payload/checker.py')
-rw-r--r--scripts/update_payload/checker.py89
1 files changed, 37 insertions, 52 deletions
diff --git a/scripts/update_payload/checker.py b/scripts/update_payload/checker.py
index 0bc62ad2..48b18e66 100644
--- a/scripts/update_payload/checker.py
+++ b/scripts/update_payload/checker.py
@@ -494,6 +494,34 @@ class PayloadChecker(object):
'%s (%d) <= (num %sblocks - 1 (%d)) * block_size (%d).' %
(length_name, length, block_name or '', num_blocks - 1, block_size))
+ def _CheckMinorVersion(self, report, minor_version, payload_type):
+ """Checks that the minor version matches the payload type.
+
+ Args:
+ report: The report object to add to.
+ minor_version: The minor version of the payload.
+ payload_type: The type of payload (full or delta).
+
+ Raises:
+ error.PayloadError if any of the checks fails.
+ """
+ report.AddField('minor version', minor_version)
+
+ if minor_version == 0:
+ # Minor version 0 implies a full payload.
+ if payload_type != _TYPE_FULL:
+ raise error.PayloadError(
+ 'Minor version 0 not compatible with payload type: %s.'
+ % payload_type)
+ elif minor_version in (1, 2):
+ # Minor version 1 or 2 implies a delta payload.
+ if payload_type != _TYPE_DELTA:
+ raise error.PayloadError(
+ 'Minor version %d not compatible with payload type: %s.'
+ % (minor_version, payload_type))
+ else:
+ raise error.PayloadError('Unsupported minor version: %d' % minor_version)
+
def _CheckManifest(self, report, rootfs_part_size=0, kernel_part_size=0):
"""Checks the payload manifest.
@@ -802,7 +830,6 @@ class PayloadChecker(object):
"""Specific checks for SOURCE_COPY.
Args:
- op: The operation object from the manifest.
data_offset: The offset of a data blob for the operation.
total_src_blocks: Total number of blocks in src_extents.
total_dst_blocks: Total number of blocks in dst_extents.
@@ -908,22 +935,23 @@ class PayloadChecker(object):
(op_name, data_offset, prev_data_offset))
# Type-specific checks.
+ minor_version = self.payload.manifest.minor_version
if op.type in (common.OpType.REPLACE, common.OpType.REPLACE_BZ):
self._CheckReplaceOperation(op, data_length, total_dst_blocks, op_name)
- elif self.payload_type == _TYPE_FULL:
- raise error.PayloadError('%s: non-REPLACE operation in a full payload.' %
- op_name)
- elif op.type == common.OpType.MOVE:
+ elif op.type == common.OpType.MOVE and minor_version == 1:
self._CheckMoveOperation(op, data_offset, total_src_blocks,
total_dst_blocks, op_name)
- elif op.type in (common.OpType.BSDIFF, common.OpType.SOURCE_BSDIFF):
+ elif op.type == common.OpType.BSDIFF and minor_version == 1:
self._CheckBsdiffOperation(data_length, total_dst_blocks, op_name)
- elif op.type == common.OpType.SOURCE_COPY:
+ elif op.type == common.OpType.SOURCE_COPY and minor_version == 2:
self._CheckSourceCopyOperation(data_offset, total_src_blocks,
total_dst_blocks, op_name)
+ elif op.type == common.OpType.SOURCE_BSDIFF and minor_version == 2:
+ self._CheckBsdiffOperation(data_length, total_dst_blocks, op_name)
else:
- assert False, 'cannot get here'
-
+ raise error.PayloadError(
+ 'Operation %s (type %d) not allowed in minor version %d' %
+ (op_name, op.type, minor_version))
return data_length if data_length is not None else 0
def _SizeToNumBlocks(self, size):
@@ -1056,19 +1084,6 @@ class PayloadChecker(object):
'%s: not all blocks written exactly once during full update.' %
base_name)
- # Check: SOURCE_COPY and SOURCE_BSDIFF ops shouldn't be in minor version 1.
- if (self.payload.manifest.minor_version == 1 and
- (op_counts[common.OpType.SOURCE_COPY] or
- op_counts[common.OpType.SOURCE_BSDIFF])):
- raise error.PayloadError(
- 'SOURCE_COPY/SOURCE_BSDIFF not allowed with minor version 1.')
-
- # Check: MOVE and BSDIFF ops shouldn't be in minor version 2.
- if (self.payload.manifest.minor_version == 2 and
- (op_counts[common.OpType.MOVE] or op_counts[common.OpType.BSDIFF])):
- raise error.PayloadError(
- 'MOVE/BSDIFF not allowed with minor version 2.')
-
return total_data_used
def _CheckSignatures(self, report, pubkey_file_name):
@@ -1122,36 +1137,6 @@ class PayloadChecker(object):
raise error.PayloadError('Unknown signature version (%d).' %
sig.version)
- def _CheckMinorVersion(self, report, minor_version, payload_type):
- """Checks that the minor version matches the payload type.
-
- Args:
- report: The report object to add to.
- minor_version: The minor version of the payload.
- payload_type: The type of payload (full or delta).
-
- Raises:
- error.PayloadError if any of the checks fails.
- """
- report.AddField('minor version', minor_version)
-
- # Minor version 0 implies a full payload.
- if minor_version == 0:
- if payload_type != _TYPE_FULL:
- raise error.PayloadError(
- 'Minor version 0 not compatible with payload type: %s.'
- % payload_type)
-
- # Minor version 1 or 2 implies a delta payload.
- elif minor_version == 1 or minor_version == 2:
- if payload_type != _TYPE_DELTA:
- raise error.PayloadError(
- 'Minor version %d not compatible with payload type: %s.'
- % (minor_version, payload_type))
-
- else:
- raise error.PayloadError('Unsupported minor version: %d' % minor_version)
-
def Run(self, pubkey_file_name=None, metadata_sig_file=None,
rootfs_part_size=0, kernel_part_size=0, report_out_file=None):
"""Checker entry point, invoking all checks.