示例#1
0
    def testDiscoverRequiredDeltasBuildToBuild(self):
        """Test _DiscoverRequiredDeltasBuildToBuild"""
        paygen = self._GetPaygenBuildInstance()

        # Test the empty case.
        results = paygen._DiscoverRequiredDeltasBuildToBuild([], [])
        self.assertItemsEqual(results, [])

        # Fully populated prev and current.
        results = paygen._DiscoverRequiredDeltasBuildToBuild(
            [self.prev_test_image], [self.test_image])
        self.assertItemsEqual(results, [
            gspaths.Payload(src_image=self.prev_test_image,
                            tgt_image=self.test_image),
        ])

        # Mismatch MP, PreMP
        results = paygen._DiscoverRequiredDeltasBuildToBuild(
            [self.prev_premp_image], [self.basic_image])
        self.assertItemsEqual(results, [])

        # It's totally legal for a build to be signed for both PreMP and MP at the
        # same time. If that happens we generate:
        # MP -> MP, PreMP -> PreMP, test -> test.
        results = paygen._DiscoverRequiredDeltasBuildToBuild(
            [self.prev_image, self.prev_premp_image, self.prev_test_image],
            [self.basic_image, self.premp_image, self.test_image])
        self.assertItemsEqual(results, [
            gspaths.Payload(src_image=self.prev_image,
                            tgt_image=self.basic_image),
            gspaths.Payload(src_image=self.prev_premp_image,
                            tgt_image=self.premp_image),
            gspaths.Payload(src_image=self.prev_test_image,
                            tgt_image=self.test_image),
        ])
示例#2
0
    def setUp(self):
        self.old_image = gspaths.Image(
            channel='dev-channel',
            board='x86-alex',
            version='1620.0.0',
            key='mp-v3',
            uri=('gs://chromeos-releases-test/dev-channel/x86-alex/1620.0.0/'
                 'chromeos_1620.0.0_x86-alex_recovery_dev-channel_mp-v3.bin'))

        self.old_base_image = gspaths.Image(
            channel='dev-channel',
            board='x86-alex',
            version='1620.0.0',
            key='mp-v3',
            image_type='base',
            uri=('gs://chromeos-releases-test/dev-channel/x86-alex/1620.0.0/'
                 'chromeos_1620.0.0_x86-alex_base_dev-channel_mp-v3.bin'))

        self.new_image = gspaths.Image(
            channel='dev-channel',
            board='x86-alex',
            version='4171.0.0',
            key='mp-v3',
            uri=('gs://chromeos-releases-test/dev-channel/x86-alex/4171.0.0/'
                 'chromeos_4171.0.0_x86-alex_recovery_dev-channel_mp-v3.bin'))

        self.old_test_image = gspaths.UnsignedImageArchive(
            channel='dev-channel',
            board='x86-alex',
            version='1620.0.0',
            uri=('gs://chromeos-releases-test/dev-channel/x86-alex/1620.0.0/'
                 'chromeos_1620.0.0_x86-alex_recovery_dev-channel_test.bin'))

        self.new_test_image = gspaths.Image(
            channel='dev-channel',
            board='x86-alex',
            version='4171.0.0',
            uri=('gs://chromeos-releases-test/dev-channel/x86-alex/4171.0.0/'
                 'chromeos_4171.0.0_x86-alex_recovery_dev-channel_test.bin'))

        self.full_payload = gspaths.Payload(tgt_image=self.old_base_image,
                                            src_image=None,
                                            uri='gs://full_old_foo/boo')

        self.delta_payload = gspaths.Payload(tgt_image=self.new_image,
                                             src_image=self.old_image,
                                             uri='gs://delta_new_old/boo')

        self.full_test_payload = gspaths.Payload(
            tgt_image=self.old_test_image,
            src_image=None,
            uri='gs://full_old_foo/boo-test')

        self.delta_test_payload = gspaths.Payload(
            tgt_image=self.new_test_image,
            src_image=self.old_test_image,
            uri='gs://delta_new_old/boo-test')
示例#3
0
  def __init__(self,
               tgt_image=None,
               src_image=None,
               dest_bucket=None,
               verify=True,
               keyset=None,
               upload=True):
    """Init method, sets up all the paths and configuration.

    Args:
      tgt_image (UnsignedImage or SignedImage): Proto for destination image.
      src_image (UnsignedImage or SignedImage or None): Proto for source image.
      dest_bucket (str): Destination bucket to place the final artifacts in.
      verify (bool): If delta is made, verify the integrity of the payload.
      keyset (str): The key to sign the image with.
      upload (bool): Whether the payload generation results should be uploaded.
    """

    # Set when we call GeneratePayload on this object.
    self.paygen = None
    self.tgt_image = tgt_image
    self.src_image = src_image
    self.dest_bucket = dest_bucket
    self.verify = verify
    self.keyset = keyset
    self.upload = upload
    self.delta_type = 'delta' if self.src_image else 'full'
    self.image_type = _ImageTypeToStr(tgt_image.image_type)

    # This block ensures that we have paths to the correct perm of images.
    if self.delta_type == 'delta':
      if isinstance(self.tgt_image, payload_pb2.UnsignedImage):
        tgt_image_path = _GenUnsignedGSPath(self.tgt_image, self.image_type)
        src_image_path = _GenUnsignedGSPath(self.src_image, self.image_type)

      elif isinstance(self.tgt_image, payload_pb2.SignedImage):
        tgt_image_path = _GenSignedGSPath(self.tgt_image, self.image_type)
        src_image_path = _GenSignedGSPath(self.src_image, self.image_type)

    elif self.delta_type == 'full':
      tgt_image_path = _GenUnsignedGSPath(self.tgt_image, self.image_type)
      src_image_path = None

    # Set your output location.
    if self.upload:
      payload_build = deepcopy(tgt_image_path.build)
      payload_build.bucket = dest_bucket
      payload_output_uri = gspaths.ChromeosReleases.PayloadUri(
          build=payload_build,
          random_str=None,
          key=self.keyset,
          src_version=src_image_path.build.version if src_image else None,
      )
    else:
      payload_output_uri = None

    self.payload = gspaths.Payload(
        tgt_image=tgt_image_path, src_image=src_image_path,
        uri=payload_output_uri)
示例#4
0
    def testCanaryPrempMismatch(self):
        """Handle the canary payloads and testss."""
        target_build = gspaths.Build(bucket='crt',
                                     channel='canary-channel',
                                     board='auron-yuna',
                                     version='9999.0.0')
        prev_build = gspaths.Build(bucket='crt',
                                   channel='canary-channel',
                                   board='auron-yuna',
                                   version='9756.0.0')

        # Create our images.
        mp_image = self.addSignedImage(target_build)
        test_image = self.addTestImage(target_build)
        _prev_premp_image = self.addSignedImage(prev_build, key='premp')
        prev_test_image = self.addTestImage(prev_build)

        # Run the test.
        paygen = self._GetPaygenBuildInstance(target_build)
        payloads, tests = paygen._DiscoverRequiredPayloads()

        # Define the expected payloads. Test delta from prev, but no signed ones.
        mp_full = gspaths.Payload(tgt_image=mp_image, uri=mock.ANY)
        test_full = gspaths.Payload(tgt_image=test_image, uri=mock.ANY)
        n2n_delta = gspaths.Payload(tgt_image=test_image,
                                    src_image=test_image,
                                    uri=mock.ANY)
        test_delta = gspaths.Payload(tgt_image=test_image,
                                     src_image=prev_test_image,
                                     uri=mock.ANY)

        # Verify the results.
        self.assertItemsEqual(payloads, [
            mp_full,
            test_full,
            n2n_delta,
            test_delta,
        ])

        self.assertItemsEqual(tests, [
            paygen_build_lib.PayloadTest(test_full, 'canary-channel',
                                         '9999.0.0'),
            paygen_build_lib.PayloadTest(n2n_delta),
            paygen_build_lib.PayloadTest(test_delta),
        ])
示例#5
0
    def setUp(self):
        self.maxDiff = None

        self.prev_build = gspaths.Build(bucket='crt',
                                        channel='foo-channel',
                                        board='foo-board',
                                        version='1.0.0')

        self.prev_image = gspaths.Image(key='mp', **self.prev_build)
        self.prev_premp_image = gspaths.Image(key='premp', **self.prev_build)
        self.prev_test_image = gspaths.UnsignedImageArchive(image_type='test',
                                                            **self.prev_build)

        self.target_build = gspaths.Build(bucket='crt',
                                          channel='foo-channel',
                                          board='foo-board',
                                          version='1.2.3')

        # Create an additional 'special' image like NPO that isn't NPO,
        # and keyed with a weird key. It should match none of the filters.
        self.special_image = gspaths.Image(bucket='crt',
                                           channel='foo-channel',
                                           board='foo-board',
                                           version='1.2.3',
                                           key='foo-key',
                                           image_channel='special-channel')

        self.basic_image = gspaths.Image(key='mp-v2', **self.target_build)
        self.premp_image = gspaths.Image(key='premp', **self.target_build)
        self.test_image = gspaths.UnsignedImageArchive(image_type='test',
                                                       **self.target_build)

        self.mp_full_payload = gspaths.Payload(tgt_image=self.basic_image)
        self.test_full_payload = gspaths.Payload(tgt_image=self.test_image)
        self.mp_delta_payload = gspaths.Payload(tgt_image=self.basic_image,
                                                src_image=self.prev_image)
        self.test_delta_payload = gspaths.Payload(
            tgt_image=self.test_image, src_image=self.prev_test_image)

        self.full_payload_test = paygen_build_lib.PayloadTest(
            self.test_full_payload, self.target_build.channel,
            self.target_build.version)
        self.delta_payload_test = paygen_build_lib.PayloadTest(
            self.test_delta_payload)
  def testDefaultPayloadUri(self):
    """Test paygen_payload_lib.DefaultPayloadUri."""

    # Test a Full Payload
    result = paygen_payload_lib.DefaultPayloadUri(self.full_payload,
                                                  random_str='abc123')
    self.assertEqual(
        result,
        'gs://chromeos-releases/dev-channel/x86-alex/1620.0.0/payloads/'
        'chromeos_1620.0.0_x86-alex_dev-channel_full_mp-v3.bin-abc123.signed')

    # Test a Delta Payload
    result = paygen_payload_lib.DefaultPayloadUri(self.delta_payload,
                                                  random_str='abc123')
    self.assertEqual(
        result,
        'gs://chromeos-releases/dev-channel/x86-alex/4171.0.0/payloads/'
        'chromeos_1620.0.0-4171.0.0_x86-alex_dev-channel_delta_mp-v3.bin-'
        'abc123.signed')

    # Test an N Plus One Delta Payload
    result = paygen_payload_lib.DefaultPayloadUri(self.nplusone_payload,
                                                  random_str='abc123')
    self.assertEqual(
        result,
        'gs://chromeos-releases/dev-channel/x86-alex/4171.0.0/payloads/'
        'chromeos_4171.0.0-4171.0.1_x86-alex_nplusone-channel_delta_mp-v3.bin-'
        'abc123.signed')

    # Test changing channel, board, and keys
    src_image = gspaths.Image(
        channel='dev-channel',
        board='x86-alex',
        version='3588.0.0',
        key='premp')
    tgt_image = gspaths.Image(
        channel='stable-channel',
        board='x86-alex-he',
        version='3590.0.0',
        key='mp-v3')
    payload = gspaths.Payload(src_image=src_image, tgt_image=tgt_image)

    result = paygen_payload_lib.DefaultPayloadUri(payload,
                                                  random_str='abc123')
    self.assertEqual(
        result,
        'gs://chromeos-releases/stable-channel/x86-alex-he/3590.0.0/payloads/'
        'chromeos_3588.0.0-3590.0.0_x86-alex-he_stable-channel_delta_mp-v3.bin-'
        'abc123.signed')
示例#7
0
    def _EndToEndIntegrationTest(self, tgt_image, src_image, sign):
        """Helper test function for validating end to end payload generation."""
        output_uri = os.path.join(self.tempdir, 'expected_payload_out')
        output_metadata_uri = output_uri + '.metadata-signature'
        output_metadata_json = output_uri + '.json'

        payload = gspaths.Payload(tgt_image=tgt_image,
                                  src_image=src_image,
                                  uri=output_uri)

        paygen_payload_lib.CreateAndUploadPayload(payload=payload, sign=sign)

        self.assertExists(output_uri)
        self.assertEqual(os.path.exists(output_metadata_uri), sign)
        self.assertExists(output_metadata_json)
示例#8
0
    def testFillInPayloadUri(self):
        """Test filling in the payload URI of a gspaths.Payload object."""
        # Assert that it doesn't change if already present.
        pre_uri = self.full_payload.uri
        paygen_payload_lib.FillInPayloadUri(self.full_payload,
                                            random_str='abc123')
        self.assertEqual(self.full_payload.uri, pre_uri)

        # Test that it does change if not present.
        payload = gspaths.Payload(tgt_image=self.old_image)
        paygen_payload_lib.FillInPayloadUri(payload, random_str='abc123')
        self.assertEqual(
            payload.uri,
            'gs://chromeos-releases/dev-channel/x86-alex/1620.0.0/payloads/'
            'chromeos_1620.0.0_x86-alex_dev-channel_full_mp-v3.bin-abc123.signed'
        )
  def _EndToEndIntegrationTest(self, tgt_image, src_image, sign):
    """Helper test function for validating end to end payload generation."""
    output_uri = os.path.join(self.tempdir, 'expected_payload_out')
    output_metadata_uri = output_uri + '.metadata-signature'
    output_metadata_json = output_uri + '.json'

    payload = gspaths.Payload(tgt_image=tgt_image,
                              src_image=src_image,
                              uri=output_uri)

    paygen_payload_lib.CreateAndUploadPayload(
        payload=payload,
        cache=self.cache,
        work_dir=self.tempdir,
        au_generator_uri=gspaths.ChromeosReleases.GeneratorUri(
            payload.tgt_image.channel, payload.tgt_image.board, '7587.0.0'),
        sign=sign)

    self.assertTrue(os.path.exists(output_uri))
    self.assertEqual(os.path.exists(output_metadata_uri), sign)
    self.assertTrue(os.path.exists(output_metadata_json))
def GenerateUpdatePayload(tgt_image,
                          payload,
                          src_image=None,
                          work_dir=None,
                          private_key=None,
                          check=None,
                          out_metadata_hash_file=None):
    """Generates output payload and verifies its integrity if needed.

  Args:
    tgt_image: The path (or uri) to the image.
    payload: The path (or uri) to the output payload
    src_image: The path (or uri) to the source image. If passed, a delta payload
        is generated.
    work_dir: A working directory inside the chroot. The None, caller has the
        responsibility to cleanup this directory after this function returns.
    private_key: The private key to sign the payload.
    check: If True, it will check the integrity of the generated payload.
    out_metadata_hash_file: The output metadata hash file.
  """
    tgt_image = gspaths.Image(uri=tgt_image)
    src_image = gspaths.Image(uri=src_image) if src_image else None
    payload = gspaths.Payload(tgt_image=tgt_image,
                              src_image=src_image,
                              uri=payload)
    with chroot_util.TempDirInChroot() as temp_dir:
        work_dir = work_dir if work_dir is not None else temp_dir
        paygen = PaygenPayload(payload,
                               work_dir,
                               sign=private_key is not None,
                               verify=check,
                               private_key=private_key)
        paygen.Run()

        # TODO(ahassani): These are basically a hack because devserver is still need
        # the metadata hash file to sign it. But signing logic has been moved to
        # paygen and in the future this is not needed anymore.
        if out_metadata_hash_file:
            shutil.copy(paygen.metadata_hash_file, out_metadata_hash_file)
示例#11
0
    def _DiscoverRequiredDLCDeltasBuildToBuild(self, source_images, images):
        """Find the DLC deltas to generate between two builds.

    One DLC (a unique DLC ID) has at most one source image/target image.

    Args:
      source_images: All DLC images associated with the source build.
      images: All DLC images associated with the target build.

    Returns:
      A list of gspaths.Payload objects.
    """
        results = []

        for source_image in source_images:
            for image in images:
                if (source_image.dlc_id == image.dlc_id
                        and source_image.dlc_package == image.dlc_package):
                    results.append(
                        gspaths.Payload(tgt_image=image,
                                        src_image=source_image))

        return results
示例#12
0
    def _DiscoverRequiredDeltasBuildToBuild(self, source_images, images):
        """Find the deltas to generate between two builds.

    We should generate deltas all combinations of:
      Test image -> Test image
      PreMP signed image -> PreMP signed image
      MP signed image -> MP signed image.

    Any given build should have exactly one test image, and zero or one of each
    signed type.

    Args:
      source_images: All images associated with the source build.
      images: All images associated with the target build.

    Returns:
      A list of gspaths.Payload objects.
    """
        results = []

        for f in (_FilterForMp, _FilterForPremp, _FilterForTest):
            filtered_source = f(source_images)
            filtered_target = f(images)

            if filtered_source and filtered_target:
                assert len(
                    filtered_source) == 1, 'Unexpected: %s.' % filtered_source
                assert len(
                    filtered_target) == 1, 'Unexpected: %s.' % filtered_target

                # A delta from each previous image to current image.
                results.append(
                    gspaths.Payload(tgt_image=filtered_target[0],
                                    src_image=filtered_source[0]))

        return results
示例#13
0
    def _DiscoverRequiredPayloads(self):
        """Find the payload definitions for the current build.

    This method finds the images for the current build, and for all builds we
    need deltas from, and decides exactly what payloads are needed.

    Returns:
      [<gspaths.Payload>...], [<PayloadTest>...]

      The list of payloads does NOT have URLs populated, and has not
      been tested for existence. delta payloads are NOT present if we are
      skipping them.

    Raises:
      BuildNotReady: If the current build doesn't seem to have all of it's
          images available yet. This commonly happens because the signer hasn't
          finished signing the current build.
      BuildCorrupt: If current or previous builds have unexpected images.
      ImageMissing: Raised if expected images are missing for previous builds.
    """
        payloads = []
        payload_tests = []

        try:
            # When discovering the images for our current build, they might not be
            # discoverable right away (GS eventual consistency). So, we retry.
            images = self._DiscoverSignedImages(self._build)
            test_image = self._DiscoverTestImage(self._build)
            dlc_module_images = self._DiscoverDLCImages(self._build)

        except ImageMissing as e:
            # If the main build doesn't have the final build images, then it's
            # not ready.
            logging.info(e)
            raise BuildNotReady()

        _LogList('Images found', images + [test_image] + dlc_module_images)

        # Add full payloads for PreMP and MP (as needed).
        for i in images:
            payloads.append(gspaths.Payload(tgt_image=i))

        # Add full DLC payloads.
        for dlc_module_image in dlc_module_images:
            payloads.append(gspaths.Payload(tgt_image=dlc_module_image))

        # Add full test payload, and N2N test for it.
        full_test_payload = gspaths.Payload(tgt_image=test_image)
        payloads.append(full_test_payload)
        payload_tests.append(
            PayloadTest(full_test_payload, self._build.channel,
                        self._build.version))

        # Add n2n test delta.
        if not self._skip_delta_payloads:
            n2n_payload = gspaths.Payload(tgt_image=test_image,
                                          src_image=test_image)
            payloads.append(n2n_payload)
            payload_tests.append(PayloadTest(n2n_payload))

        # Add in the payloads GE wants us to generate.
        for source in self.GetPaygenJson(self._build.board,
                                         self._build.channel):
            source_build = gspaths.Build(version=source['chrome_os_version'],
                                         board=self._build.board,
                                         channel=self._build.channel,
                                         bucket=self._build.bucket)

            # Extract the source values we care about.
            logging.info('Considering: %s %s', source['delta_type'],
                         source_build)

            if not source['generate_delta'] and not source[
                    'full_payload_tests']:
                logging.warning('Skipping. No payloads or tests requested.')
                continue

            if not gspaths.VersionGreater(self._build.version,
                                          source_build.version):
                logging.warning('Skipping. Newer than current build.')
                continue

            source_images = self._DiscoverSignedImages(source_build)
            source_test_image = self._DiscoverTestImage(source_build)
            source_dlc_module_images = self._DiscoverDLCImages(source_build)

            _LogList('Images found (source)',
                     (source_images + [source_test_image] +
                      source_dlc_module_images))

            applicable_models = source.get('applicable_models', None)
            if not self._skip_delta_payloads and source['generate_delta']:
                # Generate the signed deltas.
                payloads.extend(
                    self._DiscoverRequiredDeltasBuildToBuild(
                        source_images, images + [test_image]))

                # Generate DLC deltas.
                payloads.extend(
                    self._DiscoverRequiredDLCDeltasBuildToBuild(
                        source_dlc_module_images, dlc_module_images))

                # Generate the test delta.
                test_payload = gspaths.Payload(tgt_image=test_image,
                                               src_image=source_test_image)
                payloads.append(test_payload)

                if source['delta_payload_tests']:
                    payload_tests.append(
                        PayloadTest(test_payload,
                                    payload_type=source['delta_type'],
                                    applicable_models=applicable_models))

            if source['full_payload_tests']:
                # Test the full payload against this source version.
                payload_tests.append(
                    PayloadTest(full_test_payload,
                                source_build.channel,
                                source_build.version,
                                payload_type=source['delta_type'],
                                applicable_models=applicable_models))

        for p in payloads:
            p.build = self._payload_build
            _FillInPayloadUri(p)

        for t in payload_tests:
            t.payload.build = self._payload_build
            _FillInPayloadUri(t.payload)

        return payloads, payload_tests
示例#14
0
    def testStable(self):
        """Handle the canary payloads and testss."""
        target_build = gspaths.Build(bucket='crt',
                                     channel='stable-channel',
                                     board='auron-yuna',
                                     version='9999.0.0')
        build_8530 = gspaths.Build(bucket='crt',
                                   channel='stable-channel',
                                   board='auron-yuna',
                                   version='8530.96.0')
        build_8743 = gspaths.Build(bucket='crt',
                                   channel='stable-channel',
                                   board='auron-yuna',
                                   version='8743.85.0')
        build_8872 = gspaths.Build(bucket='crt',
                                   channel='stable-channel',
                                   board='auron-yuna',
                                   version='8872.76.0')
        build_9000 = gspaths.Build(bucket='crt',
                                   channel='stable-channel',
                                   board='auron-yuna',
                                   version='9000.91.0')
        build_9202 = gspaths.Build(bucket='crt',
                                   channel='stable-channel',
                                   board='auron-yuna',
                                   version='9202.64.0')
        build_9334 = gspaths.Build(bucket='crt',
                                   channel='stable-channel',
                                   board='auron-yuna',
                                   version='9334.72.0')
        build_9460 = gspaths.Build(bucket='crt',
                                   channel='stable-channel',
                                   board='auron-yuna',
                                   version='9460.60.0')
        build_9460_67 = gspaths.Build(bucket='crt',
                                      channel='stable-channel',
                                      board='auron-yuna',
                                      version='9460.67.0')

        # Create our images, ignore FSI 6457.83.0, 7390.68.0
        mp_image = self.addSignedImage(target_build)
        test_image = self.addTestImage(target_build)

        image_8530 = self.addSignedImage(build_8530)
        test_image_8530 = self.addTestImage(build_8530)

        image_8743 = self.addSignedImage(build_8743)
        test_image_8743 = self.addTestImage(build_8743)

        image_8872 = self.addSignedImage(build_8872)
        test_image_8872 = self.addTestImage(build_8872)

        image_9000 = self.addSignedImage(build_9000)
        test_image_9000 = self.addTestImage(build_9000)

        image_9202 = self.addSignedImage(build_9202)
        test_image_9202 = self.addTestImage(build_9202)

        image_9334 = self.addSignedImage(build_9334)
        test_image_9334 = self.addTestImage(build_9334)

        image_9460 = self.addSignedImage(build_9460)
        test_image_9460 = self.addTestImage(build_9460)

        image_9460_67 = self.addSignedImage(build_9460_67)
        test_image_9460_67 = self.addTestImage(build_9460_67)

        # Run the test.
        paygen = self._GetPaygenBuildInstance(target_build)
        payloads, tests = paygen._DiscoverRequiredPayloads()

        # Define the expected payloads. Test delta from prev, but no signed ones.
        mp_full = gspaths.Payload(tgt_image=mp_image, uri=mock.ANY)
        test_full = gspaths.Payload(tgt_image=test_image, uri=mock.ANY)
        n2n_delta = gspaths.Payload(tgt_image=test_image,
                                    src_image=test_image,
                                    uri=mock.ANY)

        mp_delta_8530 = gspaths.Payload(tgt_image=mp_image,
                                        src_image=image_8530,
                                        uri=mock.ANY)
        test_delta_8530 = gspaths.Payload(tgt_image=test_image,
                                          src_image=test_image_8530,
                                          uri=mock.ANY)
        mp_delta_8743 = gspaths.Payload(tgt_image=mp_image,
                                        src_image=image_8743,
                                        uri=mock.ANY)
        test_delta_8743 = gspaths.Payload(tgt_image=test_image,
                                          src_image=test_image_8743,
                                          uri=mock.ANY)
        mp_delta_8872 = gspaths.Payload(tgt_image=mp_image,
                                        src_image=image_8872,
                                        uri=mock.ANY)
        test_delta_8872 = gspaths.Payload(tgt_image=test_image,
                                          src_image=test_image_8872,
                                          uri=mock.ANY)
        mp_delta_9000 = gspaths.Payload(tgt_image=mp_image,
                                        src_image=image_9000,
                                        uri=mock.ANY)
        test_delta_9000 = gspaths.Payload(tgt_image=test_image,
                                          src_image=test_image_9000,
                                          uri=mock.ANY)
        mp_delta_9202 = gspaths.Payload(tgt_image=mp_image,
                                        src_image=image_9202,
                                        uri=mock.ANY)
        test_delta_9202 = gspaths.Payload(tgt_image=test_image,
                                          src_image=test_image_9202,
                                          uri=mock.ANY)
        mp_delta_9334 = gspaths.Payload(tgt_image=mp_image,
                                        src_image=image_9334,
                                        uri=mock.ANY)
        test_delta_9334 = gspaths.Payload(tgt_image=test_image,
                                          src_image=test_image_9334,
                                          uri=mock.ANY)
        mp_delta_9460 = gspaths.Payload(tgt_image=mp_image,
                                        src_image=image_9460,
                                        uri=mock.ANY)
        test_delta_9460 = gspaths.Payload(tgt_image=test_image,
                                          src_image=test_image_9460,
                                          uri=mock.ANY)
        mp_delta_9460_67 = gspaths.Payload(tgt_image=mp_image,
                                           src_image=image_9460_67,
                                           uri=mock.ANY)
        test_delta_9460_67 = gspaths.Payload(tgt_image=test_image,
                                             src_image=test_image_9460_67,
                                             uri=mock.ANY)

        # Verify the results.
        self.assertItemsEqual(payloads, [
            mp_full,
            test_full,
            n2n_delta,
            mp_delta_8530,
            test_delta_8530,
            mp_delta_8743,
            test_delta_8743,
            mp_delta_8872,
            test_delta_8872,
            mp_delta_9000,
            test_delta_9000,
            mp_delta_9202,
            test_delta_9202,
            mp_delta_9334,
            test_delta_9334,
            mp_delta_9460,
            test_delta_9460,
            mp_delta_9460_67,
            test_delta_9460_67,
        ])

        self.assertItemsEqual(
            tests,
            [
                paygen_build_lib.PayloadTest(test_full, 'stable-channel',
                                             '9999.0.0'),
                paygen_build_lib.PayloadTest(test_full, 'stable-channel',
                                             '8530.96.0'),
                paygen_build_lib.PayloadTest(n2n_delta),
                paygen_build_lib.PayloadTest(test_delta_8530),
                paygen_build_lib.PayloadTest(test_delta_8743),
                paygen_build_lib.PayloadTest(test_delta_8872),
                paygen_build_lib.PayloadTest(test_delta_9000),
                paygen_build_lib.PayloadTest(test_delta_9202),
                paygen_build_lib.PayloadTest(test_delta_9334),
                paygen_build_lib.PayloadTest(test_delta_9460),
                # test_image_9460_67 had test turned off in json.
            ])
示例#15
0
    def testCanaryEverything(self):
        """Handle the canary payloads and tests."""
        # Make our random strings deterministic for testing.
        self.PatchObject(gspaths, '_RandomString', return_value='<random>')

        target_build = gspaths.Build(bucket='crt',
                                     channel='canary-channel',
                                     board='auron-yuna',
                                     version='9999.0.0')
        prev_build = gspaths.Build(bucket='crt',
                                   channel='canary-channel',
                                   board='auron-yuna',
                                   version='9756.0.0')

        # Create our images.
        premp_image = self.addSignedImage(target_build, key='premp')
        mp_image = self.addSignedImage(target_build)
        test_image = self.addTestImage(target_build)
        prev_premp_image = self.addSignedImage(prev_build, key='premp')
        prev_mp_image = self.addSignedImage(prev_build)
        prev_test_image = self.addTestImage(prev_build)

        # Run the test.
        paygen = self._GetPaygenBuildInstance(target_build)
        payloads, tests = paygen._DiscoverRequiredPayloads()

        # pylint: disable=line-too-long
        # Define the expected payloads, including URLs.
        mp_full = gspaths.Payload(
            tgt_image=mp_image,
            uri=
            'gs://crt/canary-channel/auron-yuna/9999.0.0/payloads/chromeos_9999.0.0_auron-yuna_canary-channel_full_mp.bin-<random>.signed'
        )
        premp_full = gspaths.Payload(
            tgt_image=premp_image,
            uri=
            'gs://crt/canary-channel/auron-yuna/9999.0.0/payloads/chromeos_9999.0.0_auron-yuna_canary-channel_full_premp.bin-<random>.signed'
        )
        test_full = gspaths.Payload(
            tgt_image=test_image,
            uri=
            'gs://crt/canary-channel/auron-yuna/9999.0.0/payloads/chromeos_9999.0.0_auron-yuna_canary-channel_full_test.bin-<random>'
        )
        n2n_delta = gspaths.Payload(
            tgt_image=test_image,
            src_image=test_image,
            uri=
            'gs://crt/canary-channel/auron-yuna/9999.0.0/payloads/chromeos_9999.0.0-9999.0.0_auron-yuna_canary-channel_delta_test.bin-<random>'
        )
        mp_delta = gspaths.Payload(
            tgt_image=mp_image,
            src_image=prev_mp_image,
            uri=
            'gs://crt/canary-channel/auron-yuna/9999.0.0/payloads/chromeos_9756.0.0-9999.0.0_auron-yuna_canary-channel_delta_mp.bin-<random>.signed'
        )
        premp_delta = gspaths.Payload(
            tgt_image=premp_image,
            src_image=prev_premp_image,
            uri=
            'gs://crt/canary-channel/auron-yuna/9999.0.0/payloads/chromeos_9756.0.0-9999.0.0_auron-yuna_canary-channel_delta_premp.bin-<random>.signed'
        )
        test_delta = gspaths.Payload(
            tgt_image=test_image,
            src_image=prev_test_image,
            uri=
            'gs://crt/canary-channel/auron-yuna/9999.0.0/payloads/chromeos_9756.0.0-9999.0.0_auron-yuna_canary-channel_delta_test.bin-<random>'
        )

        # Verify the results.
        self.assertItemsEqual(payloads, [
            mp_full,
            premp_full,
            test_full,
            n2n_delta,
            mp_delta,
            premp_delta,
            test_delta,
        ])

        self.assertItemsEqual(tests, [
            paygen_build_lib.PayloadTest(test_full, 'canary-channel',
                                         '9999.0.0'),
            paygen_build_lib.PayloadTest(n2n_delta),
            paygen_build_lib.PayloadTest(test_delta),
        ])
示例#16
0
    def setUp(self):
        self.old_build = gspaths.Build(channel='dev-channel',
                                       board='x86-alex',
                                       version='1620.0.0',
                                       bucket='chromeos-releases')

        self.old_image = gspaths.Image(
            build=self.old_build,
            key='mp-v3',
            uri=('gs://chromeos-releases/dev-channel/x86-alex/1620.0.0/'
                 'chromeos_1620.0.0_x86-alex_recovery_dev-channel_mp-v3.bin'))

        self.old_base_image = gspaths.Image(
            build=self.old_build,
            key='mp-v3',
            image_type='base',
            uri=('gs://chromeos-releases/dev-channel/x86-alex/1620.0.0/'
                 'chromeos_1620.0.0_x86-alex_base_dev-channel_mp-v3.bin'))

        self.new_build = gspaths.Build(channel='dev-channel',
                                       board='x86-alex',
                                       version='4171.0.0',
                                       bucket='chromeos-releases')

        self.new_image = gspaths.Image(
            build=self.new_build,
            key='mp-v3',
            uri=('gs://chromeos-releases/dev-channel/x86-alex/4171.0.0/'
                 'chromeos_4171.0.0_x86-alex_recovery_dev-channel_mp-v3.bin'))

        self.new_dlc_image = gspaths.DLCImage(
            build=self.new_build,
            key='dlc',
            dlc_id='dummy-dlc',
            dlc_package='dummy-package',
            uri=('gs://chromeos-releases/dev-channel/x86-alex/4171.0.0/dlc/'
                 'dummy-dlc/dummy-package/dlc.img'))

        self.old_dlc_image = gspaths.DLCImage(
            build=self.old_build,
            key='dlc',
            dlc_id='dummy-dlc',
            dlc_package='dummy-package',
            uri=('gs://chromeos-releases/dev-channel/x86-alex/1620.0.0/dlc/'
                 'dummy-dlc/dummy-package/dlc.img'))

        self.old_test_image = gspaths.UnsignedImageArchive(
            build=self.old_build,
            uri=('gs://chromeos-releases/dev-channel/x86-alex/1620.0.0/'
                 'chromeos_1620.0.0_x86-alex_recovery_dev-channel_test.bin'))

        self.new_test_image = gspaths.Image(
            build=self.new_build,
            uri=('gs://chromeos-releases/dev-channel/x86-alex/4171.0.0/'
                 'chromeos_4171.0.0_x86-alex_recovery_dev-channel_test.bin'))

        self.full_payload = gspaths.Payload(tgt_image=self.old_base_image,
                                            src_image=None,
                                            uri='gs://full_old_foo/boo')

        self.full_dlc_payload = gspaths.Payload(tgt_image=self.new_dlc_image,
                                                src_image=None,
                                                uri='gs://full_old_foo/boo')

        self.delta_payload = gspaths.Payload(tgt_image=self.new_image,
                                             src_image=self.old_image,
                                             uri='gs://delta_new_old/boo')

        self.delta_dlc_payload = gspaths.Payload(tgt_image=self.new_dlc_image,
                                                 src_image=self.old_dlc_image,
                                                 uri='gs://full_old_foo/boo')

        self.full_test_payload = gspaths.Payload(
            tgt_image=self.old_test_image,
            src_image=None,
            uri='gs://full_old_foo/boo-test')

        self.delta_test_payload = gspaths.Payload(
            tgt_image=self.new_test_image,
            src_image=self.old_test_image,
            uri='gs://delta_new_old/boo-test')